pax_global_header00006660000000000000000000000064134716362370014526gustar00rootroot0000000000000052 comment=d6551421485a1efd742e0753594d679a4bc61118 CorsixTH-0.63/000077500000000000000000000000001347163623700131615ustar00rootroot00000000000000CorsixTH-0.63/.gitattributes000066400000000000000000000101021347163623700160460ustar00rootroot00000000000000* text=auto !eol AnimView/AnimView.ico -text AnimView/Icon.icns -text CorsixTH/Bitmap/aux_ui.dat -text svneol=unset#unset CorsixTH/Bitmap/aux_ui.tab -text CorsixTH/Bitmap/bootstrap_font.bmp -text CorsixTH/Bitmap/bootstrap_font.dat -text svneol=unset#application/octet-stream CorsixTH/Bitmap/bootstrap_font.pal -text CorsixTH/Bitmap/bootstrap_font.tab -text CorsixTH/Bitmap/build_room_dialog_close.bmp -text CorsixTH/Bitmap/flag_buildable.bmp -text CorsixTH/Bitmap/flag_hospital.bmp -text CorsixTH/Bitmap/flag_passable.bmp -text CorsixTH/Bitmap/flag_travel_east.bmp -text CorsixTH/Bitmap/flag_travel_north.bmp -text CorsixTH/Bitmap/flag_travel_south.bmp -text CorsixTH/Bitmap/flag_travel_west.bmp -text CorsixTH/Bitmap/fullscreen_border_bottom.bmp -text CorsixTH/Bitmap/fullscreen_border_bottomleft.bmp -text CorsixTH/Bitmap/fullscreen_border_bottomright.bmp -text CorsixTH/Bitmap/fullscreen_border_left.bmp -text CorsixTH/Bitmap/fullscreen_border_right.bmp -text CorsixTH/Bitmap/fullscreen_border_top.bmp -text CorsixTH/Bitmap/fullscreen_border_topleft.bmp -text CorsixTH/Bitmap/fullscreen_border_topright.bmp -text CorsixTH/Bitmap/mainmenu1080.bmp -text CorsixTH/Bitmap/mainmenu1080.dat -text svneol=unset#application/octet-stream CorsixTH/Bitmap/mainmenu1080.pal -text CorsixTH/Bitmap/map_cell_outline.bmp -text CorsixTH/Bitmap/map_cell_outline_east.bmp -text CorsixTH/Bitmap/map_cell_outline_north.bmp -text CorsixTH/Bitmap/map_cell_outline_south.bmp -text CorsixTH/Bitmap/map_cell_outline_west.bmp -text CorsixTH/Bitmap/tree_collapsed.bmp -text CorsixTH/Bitmap/tree_ctrl.dat -text CorsixTH/Bitmap/tree_ctrl.pal -text CorsixTH/Bitmap/tree_ctrl.tab -text CorsixTH/Bitmap/tree_expanded.bmp -text CorsixTH/Bitmap/tree_leaf.bmp -text CorsixTH/Bitmap/tree_level.bmp -text CorsixTH/CorsixTH.ico -text CorsixTH/Icon.icns -text CorsixTH/Levels/Example.map -text CorsixTH/Levels/avatar.map -text CorsixTH/Levels/confined_v5.map -text CorsixTH/Levels/finisham.map -text CorsixTH/Levels/original08.level -text CorsixTH/Lua/dialogs/resizables/customise.lua -text CorsixTH/Lua/dialogs/resizables/folder_settings.lua -text CorsixTH/Lua/dialogs/resizables/update.lua -text CorsixTH/Lua/languages/hungarian.lua -text CorsixTH/Lua/languages/korean.lua -text CorsixTH/RequiredResources.txt -text CorsixTH/__MACOSX/SDLMain/._SDLMain.m -text LDocGen/output/corner_right.gif -text LDocGen/output/logo.png -text LPEG/lpeg-128.gif -text LevelEdit/.classpath -text LevelEdit/.project -text LevelEdit/.settings/org.eclipse.jdt.core.prefs -text LevelEdit/MiGLayout-License.txt -text LevelEdit/README.txt -text LevelEdit/miglayout-4.0-swing.jar -text LevelEdit/src/com/corsixth/leveledit/Disease.java -text LevelEdit/src/com/corsixth/leveledit/Emergency.java -text LevelEdit/src/com/corsixth/leveledit/FileChooser.java -text LevelEdit/src/com/corsixth/leveledit/Gui.java -text LevelEdit/src/com/corsixth/leveledit/Main.java -text LevelEdit/src/com/corsixth/leveledit/Menu.java -text LevelEdit/src/com/corsixth/leveledit/Population.java -text LevelEdit/src/com/corsixth/leveledit/Quake.java -text LevelEdit/src/com/corsixth/leveledit/ReaderWriter.java -text LevelEdit/src/com/corsixth/leveledit/StaffLevels.java -text LevelEdit/src/com/corsixth/leveledit/StartStaff.java -text LevelEdit/src/com/corsixth/leveledit/TabAwards.java -text LevelEdit/src/com/corsixth/leveledit/TabBar.java -text LevelEdit/src/com/corsixth/leveledit/TabDiseases.java -text LevelEdit/src/com/corsixth/leveledit/TabEarthquakes.java -text LevelEdit/src/com/corsixth/leveledit/TabEmergencies.java -text LevelEdit/src/com/corsixth/leveledit/TabGeneral.java -text LevelEdit/src/com/corsixth/leveledit/TabGoals.java -text LevelEdit/src/com/corsixth/leveledit/TabObjects.java -text LevelEdit/src/com/corsixth/leveledit/TabPopulation.java -text LevelEdit/src/com/corsixth/leveledit/TabStaff.java -text LevelEdit/src/com/corsixth/leveledit/VarManipulator.java -text LevelEdit/src/icon128.png -text LevelEdit/src/icon16.png -text LevelEdit/src/icon24.png -text LevelEdit/src/icon256.png -text LevelEdit/src/icon32.png -text LevelEdit/src/icon48.png -text LevelEdit/src/icon64.png -text WindowsInstaller/welcome.bmp -text CorsixTH-0.63/.github/000077500000000000000000000000001347163623700145215ustar00rootroot00000000000000CorsixTH-0.63/.github/ISSUE_TEMPLATE.md000066400000000000000000000024401347163623700172260ustar00rootroot00000000000000#### Describe the issue #### Steps to Reproduce 1. *Load save game attached to this ticket* 2. 3. #### Save Game *It is often useful for us if you have a save game from shortly before the issue occurs that can be used to recreate the problem. Sometimes a save that shows the issue happening may be useful as well. As GitHub currently only supports uploading of images, you will have to upload your your savegames to an another source such as [Google Drive](https://drive.google.com), [Dropbox](https://dropbox.com), or [SkyDrive/OneDrive](https://onedrive.live.com). Add the link to the file to your issue and make the file(s) public, so we can access your gamelog or savegame. The most important thing is to not remove these files after you uploaded them!* #### Expected Behavior #### System Information **CorsixTH Version:** *e.g. 0.50 or 7d886f35ca* **Operating System:** *e.g. Windows 10* **Theme Hospital Version:** *CD, GOG.com, Origin, or Demo* #### Gamelog.txt *For information about where to find gamelog.txt see: https://github.com/CorsixTH/CorsixTH/wiki/Frequently-Asked-Questions#where-do-i-find-the-configuration-or-the-gamelog-file* ``` Paste gamelog.txt output here ``` ### Additional Info *Paste any screen shots or other additional information that might help illustrate the problem.* CorsixTH-0.63/.gitignore000066400000000000000000000035061347163623700151550ustar00rootroot00000000000000CorsixTH/Src/config.h CorsixTH/config.txt /DataRaw /Debug /LuaJIT /Makefile /SDL /SDL_mixer-1.2.8 /PrecompiledDeps /doc # For CorsixTH directory and Windows *.dll *.exe Thumbs.db # This is for the CMake-generated XCode project and output /build/ *.xcodeproj/ Debug/ Release/ MinSizeRel/ RelWithDebInfo/ # Ignore the folder where libraries are pre-compiled vcpkg/ # Build folders /build*/ # OSX metadata .DS_Store !LevelEdit/src/com/corsixth/leveledit/*.xcodeproj !LevelEdit/src/com/corsixth/leveledit/Debug !LevelEdit/src/com/corsixth/leveledit/Release !LevelEdit/src/com/corsixth/leveledit/MinSizeRel !LevelEdit/src/com/corsixth/leveledit/RelWithDebInfo !LevelEdit/src/com/corsixth/leveledit/.DS_Store !LevelEdit/src/com/corsixth/*.xcodeproj !LevelEdit/src/com/corsixth/Debug !LevelEdit/src/com/corsixth/Release !LevelEdit/src/com/corsixth/MinSizeRel !LevelEdit/src/com/corsixth/RelWithDebInfo !LevelEdit/src/com/corsixth/.DS_Store !LevelEdit/src/com/*.xcodeproj !LevelEdit/src/com/Debug !LevelEdit/src/com/Release !LevelEdit/src/com/MinSizeRel !LevelEdit/src/com/RelWithDebInfo !LevelEdit/src/com/.DS_Store # For files generated by compiling a Visual Studio Express 2013 project *.opensdf *.sdf *.suo *.aps # For the LevelEdit project *.class LevelEdit/bin/ # Debugging related files CorsixTH/Lua/debug_script.lua CorsixTH/Lua/debugger.lua mobdebug.lua # For AnimView output VSPR-0.xml *export.log # CMake related files CMakeDoxyfile.in CMakeDoxygenDefaults.cmake cmake_install.cmake CMakeCache.txt CMakeFiles Makefile CMakeScripts/ # This is for the CMake-generated Visual Studio project *.vcxproj *.vcxproj.user *.vcxproj.filters CorsixTH_Top_Level.sln CorsixTH/CorsixTH.sln # Eclipse related files .buildpath .project .settings/ # VS Code files .project/ .cproject/ .vscode/ .cproject # Default build path CorsixTH/CorsixTH CorsixTH/corsix-th CorsixTH-0.63/.luacheckrc000066400000000000000000000312061347163623700152700ustar00rootroot00000000000000--[[ Copyright (c) 2016 Albert "AlbertH" Hofkamp 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. --]] self = false globals = { -- Globals "_A", "_S", "corsixth", "action_queue_leave_bench", "class", "compare_tables", "destrict", "flag_clear", "flag_isset", "flag_set", "flag_toggle", "lfs", "list_to_set", "loadfile_envcall", "loadstring_envcall", "permanent", "print_table", "rangeMapLookup", "rnc", "strict_declare_global", "table_length", "unpermanent", "values", "serialize","array_join","shallow_clone", -- Game classes "AIHospital", "AnimationManager", "App", "Audio", "CallsDispatcher", "ChildClass", "Command", "Door", "DrawFlags", "DummyRootNode", "Entity", "EntityMap", "Epidemic", "FileSystem", "FileTreeNode", "FilteredFileTreeNode", "GameUI", "Graphics", "GrimReaper", "Hospital", "Humanoid", "HumanoidRawWalk", "Inspector", "LoadGame", "LoadGameFile", "Litter", "Machine", "Map", "MoviePlayer", "NoRealClass", "Object", "ParentClass", "Patient", "Plant", "Queue", "ResearchDepartment", "Room", "SaveGame", "SaveGameFile", "Staff", "StaffProfile", "StaffRoom", "Strings", "SwingDoor", "TheApp", "TreeControl", "Vip", "Window", "World", "Date", "Doctor", "Handyman", "Nurse", "Receptionist", -- UI "UI", "UIAdviser", "UIAnnualReport", "UIAudio", "UIBankManager", "UIBottomPanel", "UIBuildRoom", "UICallsDispatcher", "UICasebook", "UICheats", "UIChooseFont", "UIConfirmDialog", "UICustomCampaign", "UICustomGame", "UICustomise", "UIDirectoryBrowser", "UIDropdown", "UIEditRoom", "UIFax", "UIFileBrowser", "UIFolder", "UIFullscreen", "UIFurnishCorridor", "UIGraphs", "UIHireStaff" ,"UIInformation", "UIJukebox", "UILoadGame", "UILoadMap", "UILuaConsole", "UIMachine", "UIMakeDebugPatient", "UIMainMenu", "UIMapEditor", "UIMenuBar", "UIMenuList", "UIMessage", "UINewGame", "UIOptions", "UIPatient", "UIPlaceObjects", "UIPlaceStaff", "UIPolicy", "UIProgressReport", "UIQueue", "UIQueuePopup", "UIResizable", "UIResearch", "UIResolution", "UISaveGame", "UISaveMap", "UIStaff", "UIStaffManagement", "UIStaffRise", "UITipOfTheDay", "UITownMap", "UIUpdate", "UIWatch", "UIHotkeyAssign", "UIScrollSpeed", "UIShiftScrollSpeed", "UIZoomSpeed", "UIHotkeyAssign_Panels", "UIHotkeyAssign_storeRecallPos", -- Actions "AnswerCallAction", "CallCheckPointAction", "CheckWatchAction", "DieAction", "FallingAction", "GetUpAction", "HumanoidAction", "IdleAction", "IdleSpawnAction", "KnockDoorAction", "MeanderAction", "MultiUseObjectAction", "OnGroundAction", "PeeAction", "PickupAction", "QueueAction", "SeekReceptionAction", "SeekRoomAction", "SeekStaffRoomAction", "SeekToiletsAction", "ShakeFistAction", "SpawnAction", "StaffReceptionAction", "SweepFloorAction", "TapFootAction", "UseObjectAction", "UseScreenAction", "UseStaffRoomAction", "VaccinateAction", "VipGoToNextRoomAction", "VomitAction", "WalkAction", "YawnAction", -- Math extensions "math.n_random", "math.round", "math.randomdump", -- Unit Tests "assertion_matches" } -- Set standard globals std = "lua51+lua52+lua53+luajit" files["CorsixTH/Luatest"] = {std = "+busted"} codes = true -- Show warning codes max_line_length = false -- No maximum line length -- Exclude files and directories exclude_files = {"CorsixTH/Bitmap", "CorsixTH/Lua/api_version.lua", "LDocGen"} --! Helper function to add an ignore for a filename to 'files'. --!param filename (str) Name of the file to add an ignore. --!param value Ignore value to add. local function add_ignore(filename, value) ignores = files[filename] if not ignores then files[filename].ignore = {value} else ignores[#ignores + 1] = value files[filename].ignore = ignores end end -- For languages, ignore -- W111: setting non-standard global variable XYZ -- W112: mutating non-standard global variable XYZ -- W113: accessing undefined variable XYZ -- W314: value assigned to field XYZ is unused for _, lng in ipairs({"brazilian_portuguese", "czech", "danish", "developer", "dutch", "english", "finnish", "french", "german", "hungarian", "iberic_portuguese", "italian", "korean", "norwegian", "original_strings", "polish", "russian", "simplified_chinese", "spanish", "swedish", "traditional_chinese"}) do local filename = "CorsixTH/Lua/languages/" .. lng .. ".lua" add_ignore(filename, "111") add_ignore(filename, "112") add_ignore(filename, "113") add_ignore(filename, "314") end -- Ignore unused functions of save game compatibility add_ignore("CorsixTH/Lua/app.lua", "app_confirm_quit_stub") add_ignore("CorsixTH/Lua/dialogs/bottom_panel.lua", "stub") add_ignore("CorsixTH/Lua/dialogs/fullscreen/research_policy.lua", "adjust") add_ignore("CorsixTH/Lua/dialogs/fullscreen/research_policy.lua", "less_stub") add_ignore("CorsixTH/Lua/dialogs/fullscreen/research_policy.lua", "more_stub") add_ignore("CorsixTH/Lua/dialogs/resizables/options.lua", "language_button") add_ignore("CorsixTH/Lua/dialogs/resizables/options.lua", "width_textbox_reset") add_ignore("CorsixTH/Lua/dialogs/resizables/options.lua", "height_textbox_reset") add_ignore("CorsixTH/Lua/entities/machine.lua", "callbackNewRoom") add_ignore("CorsixTH/Lua/entities/machine.lua", "repair_loop_callback") add_ignore("CorsixTH/Lua/entities/humanoids/patient.lua", "callbackNewRoom") add_ignore("CorsixTH/Lua/entities/humanoids/staff.lua", "callbackNewRoom") add_ignore("CorsixTH/Lua/humanoid_actions/vip_go_to_next_room.lua", "action_vip_go_to_next_room_end") add_ignore("CorsixTH/Lua/rooms/operating_theatre.lua", "after_use") add_ignore("CorsixTH/Lua/rooms/operating_theatre.lua", "wait_for_ready") -- W111: setting non-standard global variable XYZ -- W113: accessing undefined variable XYZ -- W121: setting read-only global variable XYZ -- W122: mutating read-only global variable XYZ -- W211: unused variable XYZ -- W212: unused argument XYZ -- W231: variable XYZ is never accessed -- W542: empty if branch add_ignore("CorsixTH/CorsixTH.lua", "121") add_ignore("CorsixTH/Lua/app.lua", "122") add_ignore("CorsixTH/Lua/app.lua", "212") add_ignore("CorsixTH/Lua/calls_dispatcher.lua", "212") add_ignore("CorsixTH/Lua/dialogs/bottom_panel.lua", "212") add_ignore("CorsixTH/Lua/dialogs/confirm_dialog.lua", "212") add_ignore("CorsixTH/Lua/dialogs/edit_room.lua", "113") -- accessing hasBit and bitOr utility.lua functions add_ignore("CorsixTH/Lua/dialogs/edit_room.lua", "212") add_ignore("CorsixTH/Lua/dialogs/edit_room.lua", "542") add_ignore("CorsixTH/Lua/dialogs/fullscreen.lua", "212") add_ignore("CorsixTH/Lua/dialogs/fullscreen/bank_manager.lua", "212") add_ignore("CorsixTH/Lua/dialogs/fullscreen/graphs.lua", "212") add_ignore("CorsixTH/Lua/dialogs/fullscreen/hospital_policy.lua", "212") add_ignore("CorsixTH/Lua/dialogs/fullscreen/research_policy.lua", "212") add_ignore("CorsixTH/Lua/dialogs/fullscreen/staff_management.lua", "212") add_ignore("CorsixTH/Lua/dialogs/furnish_corridor.lua", "212") add_ignore("CorsixTH/Lua/dialogs/grim_reaper.lua", "212") add_ignore("CorsixTH/Lua/dialogs/hire_staff.lua", "212") add_ignore("CorsixTH/Lua/dialogs/information.lua", "212") add_ignore("CorsixTH/Lua/dialogs/jukebox.lua", "212") add_ignore("CorsixTH/Lua/dialogs/menu.lua", "212") add_ignore("CorsixTH/Lua/dialogs/message.lua", "212") add_ignore("CorsixTH/Lua/dialogs/place_objects.lua", "542") add_ignore("CorsixTH/Lua/dialogs/queue_dialog.lua", "212") add_ignore("CorsixTH/Lua/dialogs/resizables/customise.lua", "212") add_ignore("CorsixTH/Lua/dialogs/resizables/directory_browser.lua", "212") add_ignore("CorsixTH/Lua/dialogs/resizables/dropdown.lua", "212") add_ignore("CorsixTH/Lua/dialogs/resizables/file_browser.lua", "212") add_ignore("CorsixTH/Lua/dialogs/resizables/lua_console.lua", "111") add_ignore("CorsixTH/Lua/dialogs/resizables/main_menu.lua", "212") add_ignore("CorsixTH/Lua/dialogs/resizables/map_editor.lua", "542") add_ignore("CorsixTH/Lua/dialogs/resizables/menu_list_dialog.lua", "212") add_ignore("CorsixTH/Lua/dialogs/resizables/options.lua", "212") add_ignore("CorsixTH/Lua/dialogs/staff_rise.lua", "212") add_ignore("CorsixTH/Lua/dialogs/staff_rise.lua", "542") add_ignore("CorsixTH/Lua/dialogs/tree_ctrl.lua", "212") add_ignore("CorsixTH/Lua/entities/humanoid.lua", "212") add_ignore("CorsixTH/Lua/entities/machine.lua", "212") add_ignore("CorsixTH/Lua/entities/object.lua", "212") add_ignore("CorsixTH/Lua/entities/humanoids/grim_reaper.lua", "212") add_ignore("CorsixTH/Lua/entities/humanoids/inspector.lua", "212") add_ignore("CorsixTH/Lua/entities/humanoids/patient.lua", "212") add_ignore("CorsixTH/Lua/entities/humanoids/patient.lua", "542") add_ignore("CorsixTH/Lua/entities/humanoids/staff.lua", "212") add_ignore("CorsixTH/Lua/entities/humanoids/vip.lua", "212") add_ignore("CorsixTH/Lua/entity.lua", "212") add_ignore("CorsixTH/Lua/epidemic.lua", "212") add_ignore("CorsixTH/Lua/filesystem.lua", "212") add_ignore("CorsixTH/Lua/game_ui.lua", "212") add_ignore("CorsixTH/Lua/graphics.lua", "542") add_ignore("CorsixTH/Lua/hospital.lua", "212") add_ignore("CorsixTH/Lua/humanoid_action.lua", "212") add_ignore("CorsixTH/Lua/humanoid_actions/idle.lua", "212") add_ignore("CorsixTH/Lua/humanoid_actions/multi_use_object.lua", "212") add_ignore("CorsixTH/Lua/humanoid_actions/pickup.lua", "212") add_ignore("CorsixTH/Lua/humanoid_actions/seek_reception.lua", "212") add_ignore("CorsixTH/Lua/humanoid_actions/seek_reception.lua", "542") add_ignore("CorsixTH/Lua/humanoid_actions/seek_room.lua", "212") add_ignore("CorsixTH/Lua/humanoid_actions/staff_reception.lua", "113") -- ReceptionDesk does exist add_ignore("CorsixTH/Lua/humanoid_actions/use_object.lua", "542") add_ignore("CorsixTH/Lua/humanoid_actions/vaccinate.lua", "212") add_ignore("CorsixTH/Lua/humanoid_actions/vip_go_to_next_room.lua", "212") add_ignore("CorsixTH/Lua/map.lua", "212") add_ignore("CorsixTH/Lua/map.lua", "542") add_ignore("CorsixTH/Lua/movie_player.lua", "542") add_ignore("CorsixTH/Lua/objects/analyser.lua", "212") add_ignore("CorsixTH/Lua/objects/door.lua", "212") add_ignore("CorsixTH/Lua/objects/litter.lua", "212") add_ignore("CorsixTH/Lua/objects/machines/operating_table.lua", "542") add_ignore("CorsixTH/Lua/persistance.lua", "231") -- th_getupvalue assignments in lua5.2/5.3 code add_ignore("CorsixTH/Lua/research_department.lua", "212") add_ignore("CorsixTH/Lua/room.lua", "212") add_ignore("CorsixTH/Lua/rooms/cardiogram.lua", "212") add_ignore("CorsixTH/Lua/rooms/general_diag.lua", "212") add_ignore("CorsixTH/Lua/rooms/psych.lua", "212") add_ignore("CorsixTH/Lua/rooms/research.lua", "212") add_ignore("CorsixTH/Lua/rooms/scanner_room.lua", "212") add_ignore("CorsixTH/Lua/rooms/staff_room.lua", "212") add_ignore("CorsixTH/Lua/rooms/staff_room.lua", "542") add_ignore("CorsixTH/Lua/rooms/ward.lua", "212") add_ignore("CorsixTH/Lua/sprite_viewer.lua", "212") add_ignore("CorsixTH/Lua/strict.lua", "212") add_ignore("CorsixTH/Lua/strings.lua", "212") add_ignore("CorsixTH/Lua/strings.lua", "122") add_ignore("CorsixTH/Lua/ui.lua", "111") -- _ is set in debug code add_ignore("CorsixTH/Lua/ui.lua", "212") add_ignore("CorsixTH/Lua/utility.lua", "111") -- defining hasBit and bitOr add_ignore("CorsixTH/Lua/utility.lua", "121") add_ignore("CorsixTH/Lua/window.lua", "212") add_ignore("CorsixTH/Lua/window.lua", "542") add_ignore("CorsixTH/Lua/world.lua", "212") add_ignore("CorsixTH/Lua/world.lua", "542") add_ignore("CorsixTH/Luatest/non_strict.lua", "212") CorsixTH-0.63/.travis.yml000066400000000000000000000055651347163623700153050ustar00rootroot00000000000000sudo: false dist: xenial language: cpp compiler: gcc addons: apt: sources: packages: - libssl-dev - luarocks - doxygen - sshpass - ant before_install: - luarocks --local install --server=http://luarocks.org luasec OPENSSL_DIR=/usr OPENSSL_LIBDIR=/usr/lib/x86_64-linux-gnu/ # Required for LDocGen - luarocks --local install lpeg - luarocks --local install luafilesystem - luarocks --local install luasocket - luarocks --local install luacheck 0.19.1 # Required for lua unit tests - luarocks --local install busted - git clone --depth=1 https://github.com/CorsixTH/deps.git $HOME/deps - mkdir libs - pushd libs - mkdir $TRAVIS_BUILD_DIR/LevelEdit/bin - popd install: - CMAKE_INCLUDE_PATH=$HOME/deps/gnu-linux-x64 - CMAKE_LIBRARY_PATH=$HOME/deps/gnu-linux-x64/lib - cd $TRAVIS_BUILD_DIR # Create unix makefiles - cp $HOME/deps/travisci/cmake/FindFreetype.cmake CMake/FindFreetype.cmake - cmake -DLUA_PROGRAM_PATH=`which lua` -DWITH_AUDIO=ON -DWITH_MOVIES=ON -DWITH_LUAJIT=OFF -DCMAKE_INCLUDE_PATH="$CMAKE_INCLUDE_PATH;$CMAKE_INCLUDE_PATH/SDL2" -DCMAKE_LIBRARY_PATH="$CMAKE_LIBRARY_PATH" -DLUA_LIBRARY="$CMAKE_LIBRARY_PATH/liblua.so" -Bfresh -H. --debug-output before_script: # Don't ask for confirmation when using scp - echo -e "Host armedpineapple.co.uk\n\tStrictHostKeyChecking no\n" >> ~/.ssh/config - echo -e "Host server2.armedpineapple.co.uk\n\tStrictHostKeyChecking no\n" >> ~/.ssh/config - cd fresh script: # Check if there are trailing whitespaces. - ${TRAVIS_BUILD_DIR}/scripts/check_trailing_whitespaces.py $TRAVIS_BUILD_DIR # Check for incorrectly encoded language files. - ${TRAVIS_BUILD_DIR}/scripts/check_language_files_not_BOM.py $TRAVIS_BUILD_DIR/CorsixTH/Lua/languages # Check if there are lua classes with invalid/improper declarations. - ${TRAVIS_BUILD_DIR}/scripts/check_lua_classes.py # Build CorsixTH - make VERBOSE=1 # Validate lua files - find $TRAVIS_BUILD_DIR -path $TRAVIS_BUILD_DIR/CorsixTH/Lua/languages -prune -o -name '*.lua' -print0 | xargs -0 luac -p -- - cd $TRAVIS_BUILD_DIR - /home/travis/.luarocks/bin/luacheck -q . # Run lua unit tests - cd $TRAVIS_BUILD_DIR/CorsixTH/Luatest - eval `luarocks --local path` - LUA_PATH="../Lua/?.lua;$LUA_PATH" /home/travis/.luarocks/bin/busted # Build LevelEdit - cd $TRAVIS_BUILD_DIR/LevelEdit && ant dist # Build documentation - cd ${TRAVIS_BUILD_DIR}/fresh && make doc after_success: # Upload new docs - if [ $TRAVIS_REPO_SLUG == "CorsixTH/CorsixTH" -a $TRAVIS_BRANCH == "master" ]; then sshpass -p "$SCP_PASS" scp -r -v -P12349 $TRAVIS_BUILD_DIR/fresh/doc/* cthbuilder@server2.armedpineapple.co.uk:/home/cthbuilder/docs/; fi; env: global: secure: "mPtzSeDJKVeUu6KHJEbmHa91O+QK2XM0advYdr+13yr83w3C7cGFFjWgqzirsFUHVqPgdtSJIkom0DIxX7JtRoBZmt/xon+zfLq+Q4aSkJoYezWBqp2gavS8o1kSjtW7XuIuq995yjWvn7nehyoTYkKNtz/EzX5ZIVZ/iX73iyo=" CorsixTH-0.63/AnimView/000077500000000000000000000000001347163623700147005ustar00rootroot00000000000000CorsixTH-0.63/AnimView/AnimView.ico000066400000000000000000004274771347163623700171400ustar00rootroot00000000000000 9v (@@ (Bר00 %   O! h*PNG  IHDR\rf IDATxy$]ygU})nI !$akekck,6c áX` HhhPKRKjUխ;2~=wYU ʲ"~R{L)DR~\^3Lۭ2;nɔaX!L`qV2L#.Ja.v]BIEߖ+:Ʈ&aOO[$!zovnn^Tf[jZ62Wg[@PI!DR^ 74aZ?_W@{s!+5nHft -ﴁ[b`@! ˟ M0_&'D,FzyXǧ>;K%gcFfRY*ULӊ3 wi?t 4Ic@YFp~"n!nEem=)-ӑĆATffBEݕe0 }1["ntLږTk& [2&>!Rʭp; @P߀wqeVvBqc7F,I)MC0 R8@!lA 48w^F컠;Gj6U,yOpQFFGw4._!t4m965780%/Ԫ71 Ÿ?U9~x=Pnpň7^{H?ӧOa={ZbB=]oeyFlَc||/cػoc{L&I>ih\T1GI eIRrDT\.{ilf!7զ C MDPkY&[bK};|QB %HK"K&!hkk]ۆi8QŒq05D3|l߃,yCxEX{%@PY!022R?ebzgfw𥔬¥ol\.ϑI13Rwthk*R9E(-Kqcf)psvi[|FG'?YxG*+++~@P0޽NRa~힁;.L7nd/ß'qNQ\J3;3ttvjJ2ҮoFqndfuPZ!vD|GFr|OOw6~6$=1 n?D]-<_n bL&K&;ҎDRT&FAT%*]gxd~}e?oĉG#70[gvfMTĞ޾ȲR!ⶵzspBl6G6ʈJZGJ;|TG>r\9(j%,mW&Kb{u@n` В<&!\\.-XJ9%Ht^{f2Zk.uvvV]ڹ 0 2LDuƬڻ0i&=$ChLIIx0"y`DX{eNVIwÇɵo=SG xĉE 'vhٙf?\6wS$-j5LWb|!Ў!<A[{;m1K Drlokf0 hwO={9<{wB7R7p{ۡ\6Ա]83*}#<@]/ndR4N;+jUҝ&-a .<?C=KN2[~nnVT;;l.eG-/%I0+F{%6Cnh=OqQ7Ng23::M*J`σITJ;[pFwř*&֯ۯ;a+|\6ZvɝR6ut'8A'!}R7$E ͒f,q:+aǤkfT `oyٟcl|\.͛7us7u&7qcI&''X]YQq&@PPo\4|w).7_}RYfgfavfZe%L.3ʈ1k^J8TIv#%Ș%]=+]%নr`'e|;;G.#ctimmɉLMN01qI&3=5XL0i@[tƭ|Gngm*5JQ ǃCg'^Z/GGgHx8u԰V+W,nrV$=W/*mL6YlSEfaLD^zG &`YK%.,i_;u%a T* PPYl0MӎQ'jQPXSiJMk2FP*I}p"V{hk\|h![kRjs{@+viqߥbf u޷X_T 2/E({*XŗId+IRziv iڠ e3PzPzn+l{>v2K7Q[p]B8݇[G8%HRv!_)Av+U!N eJ(0$I]q.qA6~JCg_ cJ3h #Xx#}%څd.͠P1(4-QR1+# 3 aWljo(]߰Pw۴D@u23X l&9}ˊ*_?S&_١ɉ`ħjt X)cIym=IRIǀp4mH '9U6hVoJ},וJLp <@i/I-\FqZHMv2eˠ:Mmԑ=R詩I?'fhh!t>tFѶ#0IT*i(| D X6zM+!޸ǎ=thDɊ ~ a<\80@ H(TA(7)HD340kzm tC=/w>L+ nbzjɉLN\guuQ e⤿JGFKZŅgga~9瘝K^YY]T.ȽԞ4 T/[6_'aVxKa޽RFu6)lTSժ9#W,C@JM,MPA1 C* 6v`hKѫa , ik({li~z؏s!?0@@X]]e5&'&8|O%*@cj^SKq{~mԶM+Wx«vU. ^x>aoM5bC`-M~YRT)S{EeG`8;3|OX)Hڌ %.@*g| MooqRvArʧ#|`Ll_\)s}rLѣ~?]4=t4 P(pϽq{~˲v7̈́s)[̿S 'j3Jsq;u&o)Qߧ{#ޗ#}0C%gMXyZ:T.Uyp#G}*(: V .ۖ~PAHoE@i)WPM.CDD$rIg, Q7M ajbQ::4~5f~Hz!J򮓖@ ```0] iD e)s&hz!jmM>& P,W)Wj0 wysҙFOu<⠀@I8 6VyK\ƴ,$-յut]M]x!lܽIs%ṛH'02z.veGTu5%#D ϣ\.ƥ|05;5b[ADr:hrp=~J`$kCCsɡ\jvpvfg@BRQHt:L!Qn gKԞ).in,q!z`qxɍehsL\MMݱ(v0xTGp8& RhӡTM iw5Q a '>lwL<$qa[VQGpo^MfrElJ߶K-y34 >m3~ιYƴ,8Gr n{W;5*^{Ҏ@B^@?w~>)l.m-?k+;5 <ݽ5$6#K힛(J\bvafCqJ F I;J+ !t o~y_D]~J j"cWIS`ףaMЮ.*@gOݶ;j2R`I;&v܍\ҴD{JT/Qop-|kC2<4`KW١]\\ d(;mB <|@UK`W'&B@cwS-,ڌ@"q!U|20duo,18ПNzQ {Ⓡ"XZZ[n$AOǎbn`muH]76'eW6>+ܓ2F{7!)R{ OHSȨk0`r58zmmllmQTI9t22W3 6XXH xAK]%]s'|3ӣ$%&&_\Ca})D𤽭ut'+ KW߫pK|].NwYZAVƢlV xBP`ۇ] [n.kA5 ^:>pUP`2cdIf86݉YPD C`R}*^` [$Lڥ ^xGG"?L ߨ[@`n;[V2KJ_z_zK3>s#G?0@_?=u IDAT={0 #"ڰ6yJqAKcV|?/yשTQ޽?U2s|Y²$6Q?)҂d(sڳ5h+Ѝ:7rV9j;@8A<@ db顷V 7lUߑciDAxEcʑ>wFxZ@*Sڿ_yJ@Pi:Z^^O>7|2J룯4ԮhGgVf"ۡr36>nk {22:L6e;-_N݌ACV|u6 @V}1 1Mp 2ZU }mUT-i{ʤ;| lmfƒ}ADc|?zP\ZLrZa;`jza;,:dTlv-dv4Mn,.rcqq[u] J`܎2׮^+ ۈ2gɒ_i!?v:3osq`f/QZ J Kۣ $]}Փ})ulij#)AW})(aϡG`&]1>@+H] >xD bkTG\69# !UA;2HY0 9&C]yDF}W/Z* 62Dz,b~78٤ĊZ"c^w@71f; 4J]$Rs$b'$nr, 7n3}Si[ܮdi,C v SW1{Fi^EԇImී u@CLjyI336{ Jw0R(Jb~}|Mp4`hN?߁aEP=8>d;4Ocaeh* ?.YruGʕ 7n݄`A'dߖ13wV\ O L~&uλr:m{Q_NU`4Fovk++b贒|RAAɾ3oK|g,׌ûRw68pDZpur^=mXkӶh7MFSZ,s^ADRg{*kԇREϜG\l[( #yr뇁EfC _:8OڇiR}L*⺰+ҶOB9}nZPƦ,7G꜁pXy@zyw$.sB *Q}}gҎҪ~|A; |7L NC-9e&pE4Mz7I^Slיyqqh_ocfȾ?OyDuTȨTU ݵ}`@z jK`<<&)g2Ƚ8bY] hj jw?wCu BfNb|3 4Cxe/hML&}L[ @m<tvuՕX&t7>s{昛eȪ%Y*A/dߝCt|"c0vkNÅ>xEO4m?I f7(]]mL]2W*?Nj4$B@@}"T2Ⲡ-оAZɩO}sU7(-C}|Cl BZj_~%3Q梫ZW0I}֒R +ܺ4't^Q7be~3Pfw7F_<@Mfm0a)ҋkE{o>l KhqڂJFP4iIeh?3 )8tM&7ȼ/G6DYxaxXsMR}D [284H[[T7<&pC[^,6H:ma-EM43P6HD6N%gD VRG 0?..&(\.3=5/7|{!_HC@> ؊ݺuSiph|Sn{{#oݺs/pxOo? !2Noo/= s>S|Jy2FA ԦkT_,S;WŘ2 }}ttt`rYjAONÞ`9dCc3~^yTR=Wev~WTkLBr99#G'^}S?Y^=m+,6 V=*K{G{}/'tf1KZ&3+v4B)|ObH;h7h7%_.r卫 q667< E*dɑ>0`[5̅+U+bNAP?l= s7˒=Sv蒡gIuGꤸ Hu';wL1<4H0nIBN۟Fh h4`=- ?rض/~~ `ϛaHˈw+sRD~Qd,7,7:CU Wv@rU"n ew{jUn.5&I(C<1+ˠ @н[FɋHq}3 nT#@"C@/0}\s`Qiw6w= Xp+ӛɛCnh- ƻ2iVż;Q |տU̯ NvƗ7;.gO/lnnAuBZ%JF[[;}yҩR)-n\BkE,39^' N &kA).}]*`d|Z3[ 66 xP-bNHMiuuFZhlnL0~XXX s4;, KzlcH2۝ӄ.nHr7k-e ˑg?{`sc%N@m9r+NaIU j۱cBxL>KXvO0gA0+~8k/262Z͌13ͪ59»}w ]jz@ ga|!333o~#:p&҆FiJ#2,2/.υ4Yk{AFE2+FGt*\.&ֈE)r>Ð) R* jp S}S-6(PPIF`za> yf^tf m7ookOo/y8vw$Ԧ{Q_UETH Qvqp聋`Lz懈rxf+ՄNఽt\09;{ո>qiF1>hn{A xjL(^4"}'yj}ؾa0sڼRK/OF}lxn{0L 9[q $ 'Njgy/| &,}Q' gӓ:K-tR>,/-.$} 1dJ{́,[3o2>6 >=І航$ܐ` Z:E}8]RtfM.b$!@Zw <Ãs?SyN:ٳp=9{zaH9V`;LIoo'`l|ol|HRJ~eĐ Ό}h&"e*5Ii,X7̔oMri_(U#$^pAg{!^wf.~C",w+}{IJ$rsř}J bIfAd90ؾvO>-xEƆ|&T*x9^hQz]%{Qj|S{u|Sٗ|q_G2ڤDڭYDVNI򂅩%B:%!g$2WMyPe<qg Kf&'euM$Z\X`qa'x$OAP> :.$ږp;M=IT,rW._ҖW7 i,jSu_V+CFǠœ:2`y0]ޕҞ(ޢʭvPm[Ex>JE6"8\΀5e@C&vHJ +++\Rz"Vlˁ)/H*)QN-C漰:SpVW j .a D`tBn[LȈ EC{gCCg-BUI(vE`!iA5ïn٦nUqr }N C4_R~]Qikcg Eby S.0㟼L@P4 H˂4IUB8$V~Rxp< e7jPīFjոݿdÚW5N\vd7ҧ[ (I3\6[ %)e*sNyV85^'D 5*MnXR"S!8 ݳD{+&T0@7gc\-@J=دh۔p^o=6|^ "{E$Q0+tnO+P /c:'J/%Y{zGBbM SfH4"cui45!c*}=zMhZv?dbD/Hqf  ҿYPX^jl9djv%UIl M|stySo.$ d] LP&WCJzDuN"5&aJA dYep(42:ܑe?ݎPm9tͤa/v}"wW&ck.> %V {靁#6Ay:g^k_js@>92OG[>^SÇ{wB !Zn'Q*efl {NRZ$X[|59<*($kvK 5HϒR 2"Z.:Hs!Pǒ C>J'4}FӜHUiJ ac}rPF(c.m[inlM*5U)^aFzɓT1+qo*&]jbbc ^<`sc"= pûjt9ÈGtڨa7*6Glo?4kkkLO3;3 33̰W5 H Aێ lۡzKtΎvU%BͤR tQ,YEqfsi+e ƣ4dPJ!6犪rR=pPKr&GjbúKlpx e,Ir,cqgNa@:WWWlP2MOM5J"c{.z@ ?3O008H*¬X^^fyy7ϥ%Yq9^}eVCE]jocw3KY* 5g:{&X-T%$|0B&%-;.`"i Hq}=揀L== ǙvA\MI:bdt={"45 ҝHUPPӑv* 2/;}+ mT#ZzeLʧimKJɵWyTux*C0<8`_o *Izl6}?}?|Gc57yXG-; 겖ei`Ϝi}!Q~w>.Muq=潅nЖei?[\R6*Ia~- XV{ʖN`O^VqƔIiE$-kkD௥}oM0G085f-yiB@OOOr; R>t5Rs[S󆆇9Z'}ͷ} Gk`}d(Ƕ,.rGoHi!:Cϫ \>v=9ܐ%<r9qcÃRR vlk4Wi_[_6@m (({w.SpPByn,SX%̷WiPc'YP̪Ws#K5!l{6U6D^6/Iwwv020@[YWmh8'VO%af}źo1`7%ӕ!(jIf^\gFL&þantk+K}y_x{LKBzRso)'&{,g:4Rv;RM9 qM myF%=vjSq ?O:;;it%ѠaihTjh#PK٬sCJIZ%ڻt1Hi[>NLXlTɶ]T|N$ 0 M]szB\Pl6p?RQYԹQ.B9?O0M3k4qzCFn-Pۍ]`}}8ժ3qOL:j64yN$۷6 nbφGX3&"BH)Ƈ8vNi!\/`hY3f!_VL.nFiW|=r8@h$xgꖕRR.eݑLUNOBG:Qv1& IDATp|o+Aʙw>Wr|R68;HqZk:g"/HXo00KO=\ ~HOOpi{~=Ƒc8tpgZH#9Rv~Rٸ=_˗?e||o`D=sl4qYXr@@_iYYY߀xA#Ҟ=8H">nI0$lLpDgގ 6k5  `=Q^%5mhi 4HJɅW_«xiao=8#c22:0l+;59 Vl,Ym >dr:fdt0loH MtIVQ8mA17!Å/a$P7%ll H ؒzzaMFmSOoA_y[6*pwXhd[nQ+#o*kE*"̣92g0"訢XxFa`(+*Rﶥ0PƯ闑=a]r zC Hb Ar66*:pK4aU'Nqfm)+&z[ܛV‡@A@U=ECS^S^g8l ڍ*(D c]:cIM# ǫ5|X͂Zdrn.GgY0Jtww-Ze `If` RoI{{Fl{ cðj_@-9^wU3܆_).DwV3ɱDNACY7jX1m\`emͭ"i$/u*S+^]lnW0Pb͢#=GeB`|B\,w9:3@+4ȕ<5ƀ4~M$}8|WgwQA&e}0F ̧jȋcYPUcbvB=2 ͊88ۣ9r K4 $iߖqUdzoBqA9g¡. ŧAP @OLiAmHw+pR1w(H?D4@nNA̫5Xy? U6 )uoÇq\#DsFTknnRl xoϐ}SfD9GU)bD +vn2z ^L0E/{ođݠ[Fq80wûkP217K_BEi 4[oZ\3-Ս-a0L}[T_:T\شS PK6f'<5FBPF ez?a}j-vZ,&W:Q)0ޖo!`8KVXbd>"1Zf&J?9OonviJ]qL`&᯾w^噙ifazj_TTa;v@dޕ'?35O\jな ZsɟԯG8_<a 8X"Sb$^%,ʥ  z\"B0 ;*p`H\ZZbzrIdzzI6  ,-qQ<`0ݺyifvb ^s! ;dNd!㜄!&ry_p6lu/(@}:3\fz)d KZUAvіnZx@Zs|+:,/pLK@:T72"SS|s?ٟ%?^x|n={/~a"PљZ )ED+={>%x }_K!RLf -o@?5_uCDON~=6rIc5@ (E ^8 CsvE\G<8_zW^~9lOOmƦVRk&+{*Ri{jGU>9ёŸ=N*wޤ ^o]& -3El8оGM2)>π 7 "Ö8T3͍G,3M"x0<|H"Gayuy1QT@2R>G!J LaϜomi~9-̙mINtE8@0xZP !6T8L2p<WO RN6WU ߿TÌ>1$m!|Sqe~; xjno4r5NZ_8  Xr̀ kCJ]̭@-ոֹ43_+eiP=QN|/ޟ+ L!`at j"y#W{Z l$ }whkG6c`Yas,CC?α9zXS>mMjtގ 4?UW9zy1N9ég8p`ӞjD:*}Ye;|:6ݙ|خ(OFЂ(@@P9SP), m3WT@14]զ'Fe P_?ork.d[ŋ\xѻnS:s06>8ڷ/^[Tڛlp_D PJhOݎ! @3]kv6y vP2+ާze0(եy`IǿIGxUƘ1` p jT2X"}oͣlϾSڟ)M#{sC{; eRsc#t yMR_RF)۰ fӿu|"-j($U c_# 2f8s,/>IsS3w_!S.(:[V;?bET~Jgc7Ϲ<79ye^7ihh ut*Ek睾 B{7F8^J^ښaʯsRgvXW)I?0g0~j;P{Xޢrݠ|DHGgU lT*6逳Dh] <+A$A%napd;vO&ss\{2>w~Hgs3_${2Kڣټ_Y.B(tCB-`Brjモ= 8z)[f2P!hkj&AYdnUR0@8θd \ B/I%.HXxUfdf\*C>Af}c>*^'%`2jFuI^̱,r`઀l(ÅlA u&EN` 3 ĶW=M&![T8qmȪ@p1^2>xk?6 XNCWWSSlo ]YgTϽ8u7a!VU6!d~qKE/X)).k3hpBȍ J `uuO>ECCe+$ X,ǹw.&|yR"M.@f;,H*a(Qe4\ˀtռ{ьNynuZ]A;hos )%KKLMMNj=bzjIsnn4w`\EJ@wY{\?g,33uMNN2W"}=mmQV|D\un*l+ꦖ`!`w{Wzi=jY2tm)˔^><覽Y* r\ClePFs p6FaFa@/Gl2˪Q1 σxG +{pbui74=t~w y2333Pdjj&'Gx#| Z0;gWZ癳g|mZZZ;x%._f,\Gr/Me`;T%Ұ]rU!P4@)U&UGQў& k<NNK/G`vfvrNڢX*Q. rNδ1U8~; |zGxyV븿 \`>|B1c d21:: +P(>HGfG: g G> >O X,goܿw/\.GWWwg >dս !h*[Yn*NBK%If*=߀#4e_R) YZg8<'8<>Jt&4 JݔJ% vI50WGABR:?*LC-,X׳Qh5744p)'$w|G,`@JfΟ?6r9S/)G֥KT^-S9U&ݟVྕXDϚ=81- %Ȣth*IIe ֖LSf# ,~nHaoYZ_˳Ωg)䗗Y^Y&u,hNP+# ǝJ;?B)OMmLp2鴓wpGFE) '8Q|agϞ#h(a6$}t6Ns̳!3Wi ;Lf)RT6 R]}<dX9u33L޻C{gMdh]uhkkcl;S!%K^O9( Rz 2aпxG3S[*\;6ۀuD_o_uyVGGG>wIqv ]Nv`ox%I;;3 Kۤ( ^BfrQ^{-x*狤'LF]+l.1W ޞmp交O$ m;1?ryy7xӧM98J7]sJ3u7oޠrBXs8+L& rʃ 9RQ^Vm}@=?TA 0A\2Y:nB<%%CcsVow|uAUua ZzꦧeJ/Id@6+f() س^42ߓc6|ȳ>[o y7hjjbggr=<0|hT "YCoQFޠFDb9Riɕr|?rCFU3„ɓ475*RHP*C,F )cp;ߍP݀:&)zZV`\6sӦG W|(BL;* (}'ےΎv?yޞT bSc#.PF Ȟh#0,̉'avnu4x'NR,xկs-JKdTO:mVL HWxo2rm Օ6;*$BFGC6MCP&&5Wc̹hC%9 ! IDAT2J%_X.sut3Jd&Vk>i(BLߚLYP\J q_qQ,7*@CCy #{j)$9GmݼJ&9|x& KKK.A 6ϸ߿L ?_Gq.dG[xcd2)nu36.Jx率x:՜ߛvvگt++tvuZ7EYe4{=~pJo=׈3 YR?%J_+!(B[[+O*sqO v,M?|˫lLop=(lT*$hoUxnVE:淿%4hFAkC+{ ޽~7fie2OeIu2UF^!b 3#h<+,ݖ-,Ϟ+4Jq^)@@^x|oqEFjj _jh\ 0=;K2 t xfN <[V;eĤ2pڔ-riLԭ D &͑9C̑ZnSd (\Yhav;be;@tMTl.Ǔ.2<8Ļ׮RJg2e_&t*olkmؑ#|5(/ K/K/ q觷~{k2W %~*+_2_S {iN>g8q###"5W凹\>61{q c (deeo|@k p650<2Li7]H|w~-s hll<|2hJ2׋ ӵ4 SZ| >} &QqiG}YҘ;!%d|ߌdҜ?{A._+۔'K'+eM\_Q <4迉 :DgGg34@+[dey9)@&.7NXP|^{fc̅T*>xG0Biqٚۦ"4dRf()c_qg9 h;w #P_Ʒʭ"}_Di 0,Vo~wnsI} Mz4 )ѿ;ĉa?Je3{L4Pg/@AB!!P=6Z0ٜ~T*RS'N;U(4}|dZtwuq8]It&xMB)p/y1v`;^;YYYI޺S&ρ= KB;tsf/sz+ly=5~lI䄉 [J M\m PAKs3O?$s\u '%\0{LS).?Ocoޮ}z8CcWY^^f5Oto\jmm9;qBM{*?]^P*"N[S?n31z i*|@/WuBI/%|BwE M裏{s}ppN&0<8[7YxkP t}}:!Y&J9qlkkܹskWW_K޽t)ȭ*CezB~of9f!m:MG޹}wpuܿkV@NjF0wىH=dҥFH ;p_V˲#|:H1SS'jHsSO]h:5YͳֲNOw7=U|jT8r#,񘲭O<'?Yfgf@v VvK%SO9R0ΪDKK Οljw>@g l&pm auFmyP=]J[Sy^pb dHO겒re:뻔2 -JL Tb{'pq!JY7RHcCUN#r4{8 UZԓw?0p1OJ "u {`ltA Q9f|>X&c٪.O +4S #x#oG>>q._I+MA7 XBŞAX VC'zP) b0PonA:#=J!ˌLډ dZ3jUz>`܊kY?I޽4 [L*B? ut(e[.:yޟ+4>D"j UNt cEoښ/>'ix0;DR8R&ܾTF~VMh᠖00Fȋ- /[>t݆UMSL?b) \ !\gk5:HғYJa XiQGVR]kk\} W߽r455hPzLK\+LҗÍ׹q/͍G*BVzR6T=UZ?̏ ܨ}5&*tg$BBPV;GbM>cz$() | =эt&8j7W๫!yWU0:*4tȊ7;z{5*;FA&;w1KjژyGLh4ޠӀ^r 2>V%#@(sG3`|=lmo2W wgHjMS4/ lc:i>!>2<obA'bzN %`=mJSJ2VZj^LpgOI*%hmm^KK+T @Lb\G0y*9[e\-k)^#׹J ~.EreOzJT>81Kt`o8޸L("&bn w殒684:ʥ+Wؙ,PyL+$pwW.//#1Q $Le ʎoJ)`RWww,U u;8Ng@ xHS3, 3Аr.]J^2铙jު\5#is2(J= F>uޟ{U};oA9 vq8h-@v\C^l%7˨:\6Sy;+Ӑ j܊Gc0= 9q( \ܣvtP-Bv7 } 譤B` &APS_[`v} 6dиyP|NAL4JVr]26<@oz;ƿp[WKrj Q \D{v0HXܮ@t)@m$R|3z`m~4W H+\nH$I3:2py4 ZT+ICp1Y\\`iq)XdnW__@n+u9,it`@Eɠ~Ç+ijzl$bSuJ4+V\Ӏ꧔ X q㞛 ѣR9\tvv/MKKCJVyY\XdqaEέLOMe: $nqqΎ6'o]$ ~Y__gmu5s#MNִQ@{ PVi47Um{.WdUA Y.[Q/1wعeeHGR.ɏ`ή.:|l[ܾy[7;oU^) UL{VL&?_zI-g{۷osMqׯ?moR1Q8P,CrQ/mwo*~4-A% RL0|OKRD2υ'+%\x /:Jg,` PhZGZ$*toljy;?Q'6U, of̱:a{{:Mȯ{w/ۿ[۴z$y>' 'ħR)VC|S:-IAaРKSO=KNgrKK+e5 hy^I)# CGaB::;~/f;8qA+O?N:*bAjPGDB 4OWrWålmmN p4-zh"F!#Gj*_m.qUu"PѵkZ^(jUoG'K-(4L_- ;$[-4AI[o]@yLl[-zt_{m^B =;?CrMJg~Ǭ & zЩYSyT ψ^, ?ӻt@lnnlfA`)w𙙙zlJ^?DT<}BX>֢ہq)=//&xKUźtjzϵ:О߻R4ƫz)A #1D+W;y)MVVW]R]:#{/ӫ1'x8'OiDu„$5IR)G\~߹ KR 02:\#1<:Bf;1@KF(<*.(?7'4N322¨muc.Rk>!7CV>N3BUЌ{Lq) QMVV"uXG-!9\02 fgx⻺0BOOK1VTPQ>"Բ?=5MŦJÇy!МJ޾~:::( R}գh\PZ8 = lnmtp?)g@L NO_E{ f)U$-,».'W3 X:z0 sC"\ ^2ϫt9:ߎV> =\٢CR Q /JdԯVG9.ٹS`~i/| @2?b3C~98N&f}cu66Xp>7ɯw.wnߎ 8p?EB2 @TT*HcNVPwea"@8m_[Eyi: 1#]@T]1(;k%R ʩӧ}a hHinumn߼[o)<~S h eiGhjjBAOC===.ܻ{۷LW.7_}5"JAK)sM>D@$AjLR,"m]ӭ/ <%oiwdu3Z'_f~9.]MSO]|[;a>LO~CN9*lr}a0,`:' 3gT| ÇNT.m*=˟D7: T:EJS 7ɯ!z0-2R'TૂGs3Z+.Ur.I+ vJ8皿4gC˂x ջT~& > WI1 .18p'JqEg2OWc6K0p3n "WD}M*U@,R4&༩\X^u#akx_(!x`pP;Ra{k+2ުk?"L(xV_FHs-m:m ll[K Ϙ45yg{zu`h 9oܽbTEM]R&+dJgoxt$v]2 ^ CuOރ^,4OZ]LO GkKOxF$5.] 7Al6Kooot!wn<__7;{{s* YZUg^tWc]Q^ W8y +e.h.[K4BA{4R*`ttGF% Ţw'A$|+A/yLRQafqӻtwʲ3^7nQ WҪKHHyk/^p765144аu 142]4RV*QիuMh?oimyB?wtv222# ?O__?}}]<- )Y^[5!0Q`y5OWG͍N'. .mݽ[w9s!GifXYz6>ERkkkBHSsLRHPX(YDm}uc k.`S/ȳ^56p;D }xR&;&u~C/i 6`)%+++$ΛJbpx$p\.S,(vϝsjTdc{[TNtڛ[թeb]Y5rfr~TcJ8ݚ+9z9k=Z"{2 Lf`&@ة 3j- ԆyЄmf#u*+8Ay &{sk  >E*Apf9zℹRyA$~,lVm|X by^[omQ7 V7jLjZPRJ!)JnJ _m؍n` #ǎkbj>+ [{8#AVD&tn߽c.mwKo$SB%@$6@1󵷮<j,:8"L8LN=b~aoJ'~)SჇL>xԣ@ad(;z |~;2KssL3==[7or> Uz"!z}7or ^) m5Xڤ5C(J ȇ̥~9w+0 f-0_bv&܃`aw2|Җfetlԗg}}Ko[o[oɵ+W#y@b J޿ǵ9XY0 .#YZ[;T` /ּ%`ẋ/}=Rfsdt's?s? _ hHkDap D@>'a.X-iM 9q8BR)_uC}6% qA6vu.@Xuו3=TCCG aiyD(ǁcOM-$0i~Yop58z@ڤeW8=42  JS3ئ-`ѵǛgg;r.2ܬԟǓW߰ہe`o/n >k\8_udf2h6ij>2+ĺyqB5.I,!x ލӘHWo+j6syo5[)PVS`==ǀDIELDtQHx83hh/S]9~9;>P*mڍ%VĠk 0.J)re" C HRtu=R@ hijæLk,1;tjޏiiw&`;E*GV9u -la"s1VtfJ IBQ`\NczkG铧! B+"UA71_) '"0qXi滗.vߘ|ڃb A(L?߻ѿqP}q:Y_6 AUZiNoyi qW ,^*c ʗr]r)Te , t2H3?L=O@?˒jyp~DM"LB-*tlfgf\| Ξ?3g8}@lu;mV@+jޡaXX\ރ,][Bica=h֦ qմ8e#'4>390<Kܻs{wN?4};BrTG_?]T>O--8y[HO`FJ›uttp<Ç9<>Ctvvȯhr2m`SF}}Y0pぁh^i c &M3U`2mqIOGM҆V*17;} -.:Ky/;9t0CCJl6]+^~mM&<ƹ38qSS,-/`ʝ "'=֒XÐ{!1~s@àQ<zڤvަP(bR4Jӓ4ݐֹvR:vlr 9q l\ClƿomAsEX:lMZ`ff]#V;k1ASCM qA6ԓzEǯ(9YCi@_@*>B@p "?G_kX=2w!  Š=jjj}oJ5Ba<A zBaCekp&|C[Ê@`頍U;=_R“X/VG= `ǽу;mqGxn!Nm,Xm`95ECD5J_iC`dJ(șsge{{<~u5V͓A~?|?>-177,ssUZgm_rsBC:nуD+p*B#C[, x=xP2%j)OW/O|,PK%Wzɇ<|d^'I0YžF%33c|b~GWͱ07ozq7npDktlF. vEH@MI6&y~ SWr9rk Cu L>x)r̥/΋_{к`yɋRF!J駟_%l}C ꤳN:aBJ"wڕկkJl6V-|i׃*t@8I1z`-D㣔L~~~7+4=Lu Ϳˡbo iiqQ]jb%@?jʈc_7 /' "蛮/$" m{r]S6u766vsm@v 9~}ʕ??tFzXA^ZZZb% n2enQw7AW8Hwǝ A pvyZ, f|`}JEgg+g17~O?i^ZZ}G9?1|ht:\)$UMږT@wЃGBQS bnhapuEof%ϫ3*JlK!JE|3җKU"p`yy|jQ Λod2WO`)\A$61f9w4wuuO[oqT~L042CG*0 hJ_\wwTf8X!"'OHzK "kRL.X˯ո%=Mtuwk Gbzo]g>aR~#Pd*.tԩgyF>3 㹟ϧBw,=}}tvvp5OB;i=pب0h+U골;ܴ"Lud\MInqq8Yǥf_ە}slmm)l6Hh5R6>iz;TK x}'.#W,Um =¿:"_/z 6Q)eb\* L^K (n4qV ݶ7(_*F}k+e튂vWj,ߛ|M+k|f~Hp.@\^>d2B.p hrRʔ@z uxx DRJ;a/V*_ۮ"YA,hmLNF@ ޡRKk3=ړ,,,333W_} }N)j`)[FFW\AiIm #RJDB>DA>DA>DA>DA>DA>DA>DB?DB?DB?DB?DB?D6273-4@@@JK+++􃃃*&-A>DZX[rpt #84;84<84<95<95<95<85;85;85;85<85<85<96<96<96=96=96=:7=:7=:7>:7>:7>;8>;8>;8>;8?;8><9><9><9><8><8><8><9>=9>=9>=9>=9>A=CA=CA=CA=CA=CB>DB>DB>DA>DA>DA>DA>DA>DB?DB?DB?DB?DB?DC@EC@EC@EC@EC@ED@FD@FD@F;7>"#  B?D ;8>;8?;8?;8?<9?<9?<9?<9@<9@=:@=:@=:@=:A=:A>;A>;A>;A>;B>;A>;A?DA>DA>DA>DA>DA>DA>DA>DB?DB?DB?DB?DB?DC@EC@EC@EC@EC@ED@FD@FD@FD@FD@FEAGEAGEAFDAGDAGA>C*$+HDJgch@:AAAAmko;8><9?<:?<:?<:@<:@<:@>;A>;A>;A>;B>;A?DA>DA>DA>DA>DA>DA>DA>DB?DB?DB?DB?DB?DB@EC@EC@EC@EC@ED@FD@FD@FD@FD@FD@FEAGEAGDAGDAGDAGEBFEBFEBFEBGEBGEBGFCGFCG plq}y} ///wtx74;=;@=;A=;@=;@>;A>;A>;A?DA>DA>DA>DA>DA>DA>DA>DB?DB?DB?DB?DB?DB?DB@EB@EB@EB@EB@EC@FC@FC@FC@FC@FDAGDAGEAFDAGDAGDAGEBFEBFEBGEBGEBGFCGFCGFCHFCHFCHGCHGCHGCHGDHGDH$&|W.+1vtx416>;A>;A?C@>CA>DA>DA>DA>DA>DA>DB?DB?DB?DB?DB?DB@EB@EB@EB@EB@EC@FC@FC@FC@FC@FC@FDAGDAGDAGDAGDAGEBFEBFEBFEBGEBGFCGFCGFBGFCHFCHGCHGCHGCHGDHGDHGDHGDIGDIGDHHCIHCIGDIGDI*$,xty|y};;;GDJc`d2.4/,2@=B@=B?=B?=B@>C@>C@>C@>C@>C@>C@>C@>CA?DA?DA?DA?DA?DA?DB@EB@EB@EB@EB@EC@FC@FC@FC@FC@FDAGDAGDAFDAGDAGDAGEBFEBFEBGEBGEBGFCGFCGFCHFCHFCHFCHFCHFCHFDHFDHFDIFDIFDIGCIHCIHCIGDIGDIHDIHDIHDIHEIHEIIEJIEJ/*1pmq|dafIIIa_c306QNS:7=$ '+(.@>C@>C@>C@>C@>CA?DA?DA?DA?DA?DB@EB@EB@EB@DB@DC@EC@EC@EC@EC@EC@ECAFDAGDAGDAGDAGEBFEBFEBFEBGEBGFCGFCGFBGFCHFCHFCHFCHFCHFDHFDHFDHFDIFDIGCIGCIGCIGDIGDIGDIHDIHDIHEIHEIHEIIEJIEJIEJIFJIFJJFKJFKJFKJGK618?:A}jfkE@F"$NIOIIIzx|'#)A?DA?DA?DB@EB@EB@DB@DB@DC@EC@EC@EC@EC@ECAFCAFCAECAFCAFDBFDBFDBFDBGDBGDBGECGECGFCHFCHFCHFCHFCHFCHFDHFDHFDIFDIFDIGCIGCIGCIGDIGDIHDIHDIHDIHEIHEIIEJIEJIEJIFJIFJIFJIFKIFKIGKIGKIGKJGKJGKJGKKHLKHLLHK=8=618III"%C@EC@EC@EC@EC@EC@ECAFCAFCAFCAFCAFDBFDBFDBFDBGDBGECGECGEBGECHECHFCGFCGFCGFDGFDGFDGFDHFDHGCHGCIGCIGDIGDIGDIHDIHDIHEIHEIHEIIEJIEJIFJIFJIFJIFKIFKIFKIGKIGKIGKJGKJGKJHLJHLJHLKHKKHKKILKILKILLHLLHLLHLC?D!"III CAECAFCAFDBFDBFDBFDBGDBGDBGECGECGECHECHECHFCGFCGFDGFDGFDGFDHFDHFDHGCHGCHGCHFDHFDHA?C96:/.0!&"         "&#,,,425?6- "'#<9:@+&.(#+IIIECI64:#LILLILLILKJLKJLKJLLJMLJMLKMLKMLKMMKNMKNMLNMLNMLNJHK &jjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjb khm|linPLR2.5IIIHFILKMLKMMKNMKNMKNMLNMLNNLONLONLONMONMONMOOLPOLPOMO@??bjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjj- III!:9=NLONLONLONMONMOOLPOLPOLPOMOOMNOMNPMOPMOOMOOMOOMOPNP#$#1jjjjjjjjjjjjjjjjjjjjjjjjjjjjjjVIII428#!(MLNNMNNMNOMOOMOPMOOMOOMOPNPPNPPNPPNPPNPKILEBE=;>638-*/ Tjjjjjjjjjjjjjjjjjjjjjjjjjjjjh  ! IIINLR(%+IGIPNPPNPPNPLKLEDF=<@6590.2)&,"%gjjjjjjjjjjjjjjjjjjjjjjjjjjjF"!#"&$ (&#*($,)%-)%,)%,*&-'$+ wtxIIIihl(&,DCHXW[dbgnmqyx|qpt$" &  9jjjjjjjjjjjjjjjjjjjjjjjjjje )%,)%-)%,)%,*&-*&-*&-*&.*&.*'.*'.*'.*'/*&-_]aIIIcbg Yjjjjjjjjjjjjjjjjjjjjjjjjj6 )&.)&.)&.*'.*'.*'.*'/*'/+(/+(/+(/,)0,(0+(0,)0"% @=C`]bywz;8>GDJIIImlp75;hjjjjjjjjjjjjjjjjjjjjjjj] #!()'/*(/*(/*(/+)0+(0*(0,)0,)0-*0-*0-*0-)1-)0-)0'#+95;a_c0-3IIILKP328 @jjjjjjjjjjjjjjjjjjjjjjj(+)0+)0+)0,*0,*0,)1,)0,)0-*1-*1-*1-*2.*2.*2/+2/+2*'.!$III" "$!&#!(%#*&$,'%,'%,$")_jjjjjjjjjjjjjjjjjjjjjQ*'-,)0-*1-*1-*1-*2-*2.+2.+2.+2.+3.+3.+3.,3.,3.,3.,4/+2III"jimRRV88= "# &" '%#*&$,'%,'%,'%-'%,'%,(&-(&-(&-(&.(&.(&.%ijjjjjjjjjjjjjjjjjjjg.+2.+2.+2.+3.+3.,3.,3.,3.,4.,4.,4/-4/-4/-4/-4/-40.40.4geiIII66;%&$,'%,'%,'%,'%,(&-(&-(&-(&.(&.(&.)'.)'.)'.)'/)'/)'/*(/*(/*)0  GjjjjjjjjjjjjjjjjjjjC .,3.,3.,4.,4.,4/-4/-4/-4/-4/-40.40.40.40.50.50.51/51/51.6"EBHusw]Z_DAG,(/IIIRQV &'&,'&,'&-(&.)'.)'.)'.)'.)'/)'/*(/*(/*(/*)0*(0)(0*)0*)0*)0+*0+*0(&-bjjjjjjjjjjjjjjjjjd$#(/-4/-40.40.40.40.50.50.51/51/51/51.61.61.62/62/62/72/72/7!%~IIImlp('-('.('.('.)(.)(.*)/*(/)(0*)0*)0*)0+*0+*0+*0+)0+)0+)0,*1,*1,*2,*2,*2!+jjjjjjjjjjjjjjjjj30.50.51/51/51.61.61.62/62/62/62/72/72/7307307307208208317317$")igkIII!*(/)(/))/))/))/**0**0*)0*)/*)/+*0+*0,*1,*2,*2,*2-+2-+2-+2-+3-+3.,3.,3.,3  Mjjjjjjjjjjjjjjj[ +)01/61/61/71/72/7308307307208208208317317317318318428428428429)&-PNSIII!*)/*)/*)/+*0+*0+*1+*1+*1,+1,+1,+1,+2,+2,+2-,2-,2.,4.,4.,4.-4.-4.-4.-4.-4%$*ejjjjjjjjjjjjji&20720720820831731731721821831842842842842942942953953953:53:53:.*296))///4//4/.5/.5/.50/50/50/50/60/6107106106107107107217217217218218218327327327..3$vuuuuttsrqp?!64:64;64;64;75;75;75;75<75<75<76<76<76<76=76=87=86=86=87>87>87>87>87>87>$|{~IIIUUYqqt'&,0/60/60/6107106106107107107217217217218218327327327228228228338338338339339439 pyxxwwvuuts-*(.75<75<76<76<76<76=76=76=86=86=87>87>87>87>87>87>98=98=98=:8>:7>:7>:8>:8>$"(xwzIIIqptQQUzz}bbfIIN117##*00711711721721821821832732722822822833833833833933933943943943943:43:43:54:54:a|{{zzyxwvu/-,287=86=86=87>87>87>87>87>87>98=98=:8>:7>:7>:8>:8>:8>:8?:8?:8?;9?;9?;9?:9@('.97=#rquIII!!&22722722822822833833833833933943943943943:43:43:54:54:54:54;54;54;65;65;65;65;  l~}}|||{zyxH77=88=88=98=:8>:7>:7>:8>:8>:8>:8?:8?;9?;9?;9?:9@:9@:9@;:@;:@;:@;:A;:A;:A-,2~}a`dECI(&-ZX]JJJ#33933933933933933933:33:44:44:44:54;54;54;65;65;65;65;65;65;76;76;76;76<76<65:y~}||{g 43898>98>98>98>:9>:9>;9?:9@:9@;:@;:@;:@;:A;:A;:A<;A<;A<;A<;@<;@<;@=;A=;A328B@FJJJ 33:44:44:44:44;44;44;55;55;55;55;55;66;66;66;76<76<76<86<86<77=77=77=77=66<;~|v0/4;:?;:?;:?;:@;:@;:@<;@<;@<;@<;@<;@=;A=;A=;A==D>87>87>88>88>98>88>  (@f      ~|))-<;A<;A<;A==B>=B>=B>=C>=C>=C?>D?>D?>C?>C?>C@>D!KKK==B%>>D``d.-576=76=87=87=87=88>87>87>88>88>88>88>88>88>99>99>99>99?99?::?  w            $1%%(>=B>=B>=B>=C>=C>=C?>C?>C?>C?>C?>C?>C@>D@>D??D??D??D??C@?D@?D" &&%+DCHcaftswlkobaf" &KKKYY^__d+*187>88>88>98>88>88>98>98>98>98?98?98?:9?::?::?::@::@;;@;;@;;@  z              )= $#?>C?>C?>C?>C@>D@>D@>D??D??D??D??C??C??C@@D@?D@@D@@D@@DA?EA?E'%+'%+KKKttxqqu('.98>98?98?98?:9?:9?:9?:9@:9@:9@;:@;:@;:@;:@;:@;:@<:A<;A<! ;;A<=C>=C>=C>=C>=C>=C?=D?=D !        =TBAFBAFBBFCBFCBFCBFCBFCBFCBFCBFAAE!%" "!#DCGCCGDDHDDHDDHDDH?>B{{~xx{";:?LLL<=D>=D>>D>>D?>D?>C?>C?>C@?D #      CQCBFCBFCBFCCGCCGCCGDCGCCGDDH//29H,+.ECHECHEDIEDIEDIEDH!qqt[[_105$#(LLL%%+88>==C==C>=D>=D>=D>>D>>D>>C>>C>>C??D??D?>D??D??D??D@?E@?E??E $          KICCGDDHDDHDDHDDHDDHDDH;:>#^mi+?>AFDHFDHFEIFEIGEI"LLL@@E339>>C>>C>>C??D?>C! ::?@?E@?E@?E@@E@@E@@E@@E@@E@@EAAFAAF !         SBDCHDCHDDIDDIEDIBBF !"IsrolcFFIFFIFFIFFJFFJ#"(LLLXY]//4??D@?E@?E??E((+$B88>C i K226AAFBAFBAFBAFBBGBBGBBG              e2  FDIFEIBAE\|zwtrolj.@?DGGJGGJHGK//4LLL *+0`ae%%+AAFAAFAAF !#* U  004CCHCCHCCHCCHCCH                n+ GEJ//1A~|yvtqnkdIHKHHKHHK76;438TTXutw{z}LLL $BAFBBG<<@ t   a!  226DDIEDIDDI        9 "1!+:*)O   y#)t  }{xuroljM..0JILJIL==A$``d+*0a`dLLL 228BCGBCG2        g$ 336EDI       j-6-&&&***)((IHF6420    Y    |yvtqnjj/CCEKJMEEH::?BAFGFKLLL 89>BBF78;  ~           m'      &###DC@+*)VSQ21. L    j      }{xtroljdKJMJJM@@EKKP-,1LLL !!!lmp016==B;              sB     G/-+}xtsryur444c`Z&         |yvtpmjjK445LKM$66;MMQLLL !!! & !'efj*+1'(+                       1 TRMyxt%%%rpk.-,qoj%         }zwurnkji( IHK&%*LLL !!!68=&',$ D                      9 //.;:7CA@444xtp)         ~|xusoljj_ &%&'&,rrv||a`dEDI*)/LLL !!!NPT                       i ()'NMLzyvHGE%$#a`]2           |zvtqmjjj>!LLL !!!ghlN                         #@?;$$# eec$)#            }{wurnkjjgvuyMMM !!!                         ++((('@?=# \              ~|xusoljjjT\[`MMM!!!!!!% Y                          L   C                |zvtpmjjjj.AAFMMM!!!!!!/06ijn                                         }zwtqmjjjjZ ..5BBHVV[jjnqqu('-MMM!!!!!!DFJ e                                       ~{xtrnkjjj_KKP{{??EMMM!!!!!!FGL*                                          |xurokjhDMMM!!!!!!"./5EUEp                                     |yvsol^$ MMM!!!!!!57< 2                                     |zvtnA$ MMM!!!!!!QSXcdhGIM)+1 $ s                                         }zwb)) % 'ttx%qquMMM!!!!!!nos 4                                 }xD+( !!(!!(!!(#CCHmmqSSX88>$WW\MMM !!!  I                                 j5-   '!")!"(!"(!"( !'<                 |zvspljjjj7 LLL6:>_                 / :               |yusoljjjd!LLLSUY *                  2 6                 ~|xurnkjjj5# %'-fgkLLLnqt$JMQfilMUN T                      '""".                ~{wuqnjjjb)$(*+,2-/4RTXdeivwz{|KMQLLLRUY&                   l !!!=             }zwtpmjjj2& 349006tux#%+238KKKUX\ ;                  .##$""""""- v           |yvspljj`&#'(45;45;^_c KKKGKO#,# n                       X""#   """ # c          ~|xurokjj0(46<57<57< fgkKKK "                   *  J   t6###2       }{wuqnjj_#$&)68=68=68<#efiKKK#gjmNRV-26 K                      !!)        l$   i      |zvtpmjj-)68=78=78=68> #(|~TUY*,2KKK6:>                       P           YI    ~|xurolj]$%)79>79?79?79?%(. #({|KKKRVY /                                  < 6      }zwuqnjj,*  8:@8:?9;@9;@9;@+.2acfJJJoruf                 VB                 (W     |yvsplj]+,0:<@:<@:<@:<@:<@139FHMJJJ                 Y 3                  U }{wtrokj*+;=A;=A;=A;=A<=B<=B79>,.4JJJ"49=PSWF             | 7>                 +.1R|yvtpmj[136;=A<=B<=B<=B<=B<>C<>CJJJHMQmps6:>              A,?                )!9<@/14Py{xtrolj(*<>B<>B<>B=?C=?C=?C=?C=?C!"%+CEJbdh/27IIIknq +         Z+) !#=               1+9;>;=A;=A/14IrtqmjZ79<=?C>@D>@D>@D>@D>@D>AD>AD!&FHLrtwIII %a      {,,1487:>-048              9<469<>B<>B<>B<>B=?C136Ajlj&!>AD>AD>AD>AD>AD?BD?BD?BD?AE$'+rtwIII7;@    ?%)(*-8;?8;?8;?9<@3             =N"=?C=?C=?C>@D>@D>@D>@D>@D358;R9<@9<@:=A:=A:=@035/             =R!=@D>AD>AD>AD>AD>AD?BD?BD?BD?AE56:#'&@BFABFABFABFACFACFACFACGACGACF238adg]_cIIInruDIMx|~^beDHL(.2 L$ 1479=@:=A:=A:=A:=A:=A:=A57;*            <U ?BD?AE?AE?AE@BE@BE@BF@BF@BFABFABFABF=?B78;ACGACGACGBCGBCGBCGBDFBDFCDGCDGCDG8;>EHLy{}PSW'*/CFJIII'),:=A:=A:=A:=A;>B;>B;>B;>B;>B;>B'           ?S@BFABFABFABF@CF@CF@CF@CG@CGACGACGACGBDFBDFBDFCDGCDGCDGCEGCEGDEHDEHDEHDFHDFH@AE*-2III8<@;>B;>B;>B;>B;>B;>BBD>BD>BD>AE>AE>AE?BE?BE*        JC%CFHCFHCFHDEIDEIDFIDFIDFIEFIEFIEFIEGJEGJFGJFGJFGJFHJFHJGHJGHJGHJGHJGHJGHJGIKGIK!%)III!%&-0@EHY]a9>B).1>BD>BD>AE>AE?BE?BE?AE?BF?BF@BF@BF@BF@CF@CF*         N= (EFIEFIEFIEGJEGJEGJFGJFGJFHJFHJFHJGHJGHJGHJGHJGHJFIKFIKFIKGIKGIKGIKGJKGJKHJLHJL'+/III6@IJMIJMIKMIKMIKMJKMJKMJLMJLMJLMKLNKLNKLNKMMKMMLMNLMNLMNLMNLMNMNOMNOMNOMNOHKK"'[_b.37+/3III8=Az}EIM>BDDFHDFHDGIDGIDGIEGIEGIEGIEHJEHJFHJFHJFHJFHJFHJFHJFIKFIKGIKGIKGIKGJKGJKGJKHJLHJLHJLHJLHJLIJMIJMIKMIKMIKMJKMJKMJKMJLMJLMJLNJLNJLNJMNJMMJMMKMNKMNKMNKMNLMNMNOMNOMNOMNOMNOMNOHJL@CE9<>147%)-@DH37;III{~ux{Y]a?CG#(-9=@EHJEHJEHJFHJFHJFHJFHJFHJFIKFIKFIKFIKFIKFJKFJJFJJGJKHJLHJLHJLHJLIJMIJMIJMIKMIKMJKMJKMJKMJLMJLMJLMJLNJLNJLNJMMJMMKMNKMNKMNKMNKMNLNOLNOLNOLNOLNOLNOJKLBDE:=?268*/1#'* $knpJNR+04III   37:FHKFHKFHKFIKFIKFIKFJJFJJFJJGJKGJKGJKGJKGJKHJLHJLHKLHKLHKLIKMIKMJKMJLMJLMJLNJLNJLNJMNJMMJMMKMNKMNKMNKMNKMNLNOLNOLNOLNOLNOJMMCEG<>@47:,/3$(, %,,,W!%      -04FIJGIKGIKGIKGJKGJKHJLHJLHJLHKLHKLIKMIKMIKMILMILMILMJLNJLNJMNJMMJMMKMNKMNKMNKMNKMNLNOLNOLNOLNOLNOKMNDGI<@B58;-13%*-"& 9996<@          #(+HJLHKLHKLHKLIKMIKMIKMILMILMJLNJLNJLNJMNJMMJMMKMNKMNKMMKMMKMMLNNLNNLNNLNNLNNFHI>AB69<.34'+.$'!xz}RWZ              GIKILMJLNJLNJMNJMMJMMKLNKLNKLNKLMKLMLMNLMNLMNLNNLNNGJJ>BC7;047(-0!%*" !##!FIM7222􉉉񿿿5:>vx{-14279036)-/!&)" "$ % % %!&!&!&!&!'!'!'!%5:>OSVilo+04!$' #$$ % % % %!&!&!&!'!'!'!'"("("("("(!&%*/Z^a TH   IIIIIIIIIIIIIIIIIIIIIIIIIII   {?(@ p     j878  "# " "!"!"!"!#! #! #! #" #" #" #" $"!$"!$"!$" #"!$#!$@DA>DA>DB>DB?DB?DC?EC?EC@E*%, g\\\^\`96<;8><9?<9?=:@=:A>;A>;A>;A>;A?DA>DA>CA>DB?DC?EC?EC?EC@ED@FDAFDAFDAFEAFEBGEBG0+20+2{x|=7>lhl"%ZW\GDJ97<>;A>DA>DA>DA>DB?DB?DB?EB?EC@EC@EC@FCAFDAFDAFDAFDBGEBGEBGFCGFBHFCHGCHGCHGDI628JFLb^cTOUeEEE97=74:igkHEJ'#)639@>C@>CA>CA>CA?DA?DA?DB?DB@EB@ECAFCAFDAFDAFDBGDBGEBGECGFBHFBHFCHFCHGDIGDHGDIGDIHEIHEIIEJIEJIFJ=9?83:sot4/6<7> pUUUSQV305B@EB@EB@ECAECAFCAEDAFDBFDBFDBFECGEBGECGFCHFCHGDIGDIGDIGDIHEIHEJHEJHEJIFJIFKJGKJGKJGKJGKKHLKHLEAF%' pWWWmko.,1DBFDBFECGEBGEBGECGFCHFDHFDHFDHGDH;==$9%< ? > < ; ; : 8 877$1$?+4Tgjjjjjjjjjjjb> + :>:NKNOLOOLOHEH!$>9@TPVkhltqv pXXX$!(HFJHFJHFJIGKIGJIGKIGK>>?8^jjjjjjjjjjjjjjjjM3PNPQNPKHJ+'-!pYYYzx|"JHKJHKJHLKILKILKILLJMB@C#8jjjjjjjjjjjjjjjj&$''#) "|#&p[[[#!'#KILLJMMKMMKNMKNMKNNLNNLO9793jjjjjjjjjjjjjjjX ,(/YU[JFL/*2rosp\\\#!':8#$" '$"*&%,'&-(&-(&.)'.)'."!'3jjjjjjjjj_.+3.,3/,3/,3/-4/-40.50.50.5qosOLQpaaa%$*('-('.)'/*(/*(/*(/*)0+)0+*1+*1Vjjjjjjjj,-+20.50.51.51/61/62/62/7207207"pbbb*)0*)0**0+*0+*0+*1,+1-+3-+3-,3.,3,*1 ijjjjjjR 1/7107207307318418429429429529"&pcccDDH:9>,+2-,2-,2-,2--3.-3.-3..4/.4/.4/.50/6"!%<onmlji$ 32942942942943:53:53:54:64;64;74;'$+75;SQVomq=;Ayw{pccc##)uuxXW[,,2/.4/.50/50/50/50060/6106107217217217 + utsrpY"%%54:64;64;64;65;75<76<76<76<86=87=+)0ECHomqa_dpddd@@DCCH--2**1106107217217217328328328328439439439!rzxwuK0/576<76<86=87=97>97>98>98>98>:8?:9?0/587=edhIGLpeee[Z_))/22833933933944:44:54:54:65;65;65;66<-~~|{g" 98>98>:9?:9?:9?;9@;9@;:@<:@<:@<:@65;KJO3281.4peeewvz&&,44:55;55;55;66<66<66<66<87=87=438!A|0*105;:@<;@<;@<;A=;A=88>88>99>99>99?+o    E==B>=B>=C>>C?>C?>C@>D@?D!$+)0'%,pggg %98>98?98?98?:9?:9@:9@::@;;@;;@ C        K & ?>C?>C??C@?D@?D@?DA@DA@EA@EA@E %phhh{{ !::@::@;:A<;A<;A<;A<sswWW\;;A%<C?>C?>C M   d8BBFBBFCBGCBG>=B1*??CDCHEDH-,1nnq|{NNR piii%&,::@>>C>>D*,.>=C??D??D@?E@@E@@E O   {*DCHDDHCCG#/$<kW FEIFEI438qpt piii?@E66<@@E+0-Q : +==BAAFAAFBAG Q        EDI9:< 0 cxsm8457GGJ;:>ZY] piiiVV[238nor127BAG 8 = ,?>CDCH S    v Nb   4N{upi $ GFJBBECCHedhmlpBAF pjjjmmq<=B,-2)4+ p     E 1 R   e474PNM552M  B   ~ysmY*JIL")(- pjjjEFK'(- ?          &4$UTQyxwECB8D5    {uoj3@?A"``c pjjj % {           $7"GFExvrUUS25:ORUIOM b          $ Z       |vpji#,# "(@AF-/467<phhhRUY#',%S$            D" L        {tnj>*249#pgggnqt d           w ) 4>'  H    yslh&0,57<pfffNRU5:>#          c 9    g %!   }wqj< % 79>79>#rtw{|gim?AF!peee@          h        MZ  {uog.339;@9;@ #(peee+04 }      v  f        F / V~xsl:!;=B;=B<=B&).peeeJOR16:+    =  h       N $&),01 /Otpf368=?C=?C=@C-/4 &WY]wy|138dfjpddd$TX[KPS [  F$7:>! `      Z 7 :=@=?C=?C/33 ,E7?AD?AD?BE@BE46:>AEacfKMQpccc5:?49=gjnAFJ! $ P'359:=A:=A+.1 Y     ^ 8 >AD>AD>AD?BE@BE155%9;>ACFACGBCFBCF;=A048;>B149pbbbRVZ!%(! 288;>B;?B;?B;?C69= Q   a+@CF@CFACGACFBDGBDGBDGCEHCEHDEHDEHDFIDEH!paaamqt %*<@C=@D=@D=@D=AD>AD>BE O    e!BEHCEHCEHDFIDFIDFIEFIEGIEGIEGJFHJGHJGHK p```39@!%|~ %)dNNN).227;>ADFHJFHJFIKFIKGIKGIKGJKHJLHKLIKLIKMIKMJLMJLMJLNKMNKMNKMNKMNLNOGIJ?BD7:=/36',/ $(!+/3psu]`cBFI"'+fik!%   7:=HJLHJLHKLIKMIKMILMJLMJMNJMMKMMKMNKNNGJK@CE9<>147)-0!&*#MPTddd5;?   $(# "&JLMKLMKMNKMNIKLADE9:? #41641752752852853853964964964975:74985:95:A>DA>DB>DB?DB?DC?EC@ED@FDAFDAF!729VQWtpt%&0)1,]]]nlp!$=;A>;A>DA>DA>DB?DB?EB?EC@EC@FCAFDAFEAFEBGEBGFCGFBHFCHGCH$&B=CMHN---jhlTQV2/5@>CA>CA?DA?DB?DB@EB@ECAEDAFDAFDBGEBGECGFBHFCHFCHGDIGDIGDIHEIHEJIEJIFJJFK+&,-(/daf*%,@@@  @>CCAFDAFDBFDBFECGEBGECGFCHFDH@>B.6.!8"#7%&6(+6+.5/262==>JGKKHLKHLKHLLIM1-3@@@ 317'%+NLQrpt~|=;@FDHFDHGDHGEIHEIHEI+9+.8IdjjigfdV=7LILNKNOLO1-3#&;7>QNSLGM@@@ NLQ97!$628@@@.-3mlpUjjjjjjjj4+(/+)0,)0,*1-*1.*2 QNSPMS"@@@ggj.-2# &"!(%#*'%-(&.)'. ) ijjjjjjS &$.+3.,3/,3/-4/-40.5 $+)/;7=@@@""!(('.)(.*(/*)0+)0+*1,*1'&-:jjjjji 0 0.51.51/62/62/7207307$!(@@@76;! &>=BTSWXW[('-+*1,+1,+2-,2-,2--3/-4/.5#[kjjjF,+021831832942952953:63:)&-,)0539@@@RRV'&-..4/.4/.50/50/50/6106107106: trpn954:64;64;64;65;75<76<76<.,3}@@@nnrUUYjjm%%+11721721722832832843943944:7{zwu=86=87=97>98>98>:8?:9?:9?429zy}nmq@@@##)44:44:44:44:55;65;66<76<216 A | . +./:9?;:?<:@<:@<;A=;A=;A;9?VUZAAA328SSX65; &65<76=77=88=88>88>99> 3#O   177:==B>=C>>C?>D@>D$*(.?=CAAA#98?99?:9?:9@::@;:@;;A;      E(-+??C@?D@?DA@DA@EA@EAAE$utx;9?(&,BBBLLR;;A;;A<=C>   X!5$BAFBAFBBF6:9.:1CBGDCG%$)MLQ=>C136>>C?>D??D@?EA   \8!DDHA@E6R>::=FEI+*/)(.CCC78=349@@F88=;;?K J 5!??DBAGD    c4 ,9- E vuk.GGJ226! %CCCOOT449;   Q 9!E  #c -7,#9 v - pxq[&3'::=CCC ggk*,- a     b   13/NMJY  |tl=<;>xx|CCC ~ <         ,0*ONM[[Xd  wog&217*)/^^bCCC !#) k        f!*Y(     zqjCDCHCCC /06Q        *      |tjY88>**0((/CCC # `       '      }sA OOT88>CCC $ C     %       m/&!"( !!'FFK%%,CCC !' # [    %      \ $#$+$%+$CCC ;=Bpru!,   '     ~G&"&'.'(.!"(VW[yy|CCCVY] ' |    ,       Y / $'+&&-qruCCCtvy  B  0       ~ulL0EFKMNR-.3WW[CCC* h     6 w     |uki!;=BCCC!"b       , B      {sjD3! &^`d&(.!#(BBB {         q '/1%Q   ypi$149 &9;@LNRBBB;?D#(3       Z'}    ; % ~vm@/79>#%+%bdgQSW,/4BBB#'Y     | 4      zN {sh9;?:BLPT#    E H        5Kso<,=?C=?C137027Y[_xz}ceh@@@UY]wz}A P$%-)46: C      ;8:==?C:=@3A>@C?BE@BE8:>ikn@@@qtw.37EIM$(" # .9A;>B H   8;>@@BE@BF@CF?AE?@BBDGCDGCEHABFNPToqtTWZ(,0ORV@@@!&AFHJFHJGHKGIKGIKHIKHJLIJLIKL!GJM_aduxz(,0!%@@@w{}AEGBEGBEHCFIDFID Y U R MIEA+BDFIKLIKMJKMJLMKLNKMNKMNLMN;>@:>BNQU@@@^beLPS%+/@CEEHJFHJFIKFIKGIKGJKHJLIKLIKMIKMJLMJLNKMNKMNKMNEGH=@B59;.25'*.#' }_be"&+::: *fff"'   8;>HKLIKMIKMJLMJMNKMMKMNEHI>AC6:BF789 (  122@@@@@@111( @ &&&6MMMFCH0)13-4506;6EC>ED?ED?FE?FEAFEAFFAGGBGGBGGBGGCHHCHHCIHDIB;B2*12*13+23+2geguuusssbbbrLLLxtx,'.@;B@;BADC?DD?DD@EE@FEAFFAGGBGGBGHCH@:@/&.;2:___ttt?:A<7= !*$+C?DC?ED@EEAGEAFFBGFCGGCHFAG>>>6:6464C@CKFKKGKICH&%mglTNT$#uuuwww!#A) '!(B;Bvvvxxx96<}{~/.1 #(#*!# 9    F# %-'/'#)2]-a\a*"+vvvyyyLJOLF#""&A     G'#).Syr\DPDvvvyyydch .   N .E  'T&/9.@ Q > }vn=vvvzzz~xy{k     n   <;:BA? z   zri ( vvv{{{H         /0.@>>TUQ ~   |ulPUXUvvv{{{k         `! k    woj1vvv|||4m3      *      yqi3vvv|||`         +      {a*(5)vvv}}}B    *     M * CCE306vvv~~~PQU$i# (    <:D:!vvv~~~\]a'   (      yCvvv~~~stwWZ[ L     )    |V"F"!vvv~~~NbPb  &     {sjLMXMvvv~~~HoG       &      zqjF$A&vvv}}}6h6      v  >    xoi(WY\vvv}}}k      C'HE(B }umF,EEKvvv|||UtU       3 A    O$ {  {si"#(,,2vvv||| I      @ L      ~ D vwoBViVvvv{{{.>3 z  h* [      *+/1$ A fj?@E "(vvv{{{lps= s , 038.16 T    6:<@;=A;=A#0' , >@E\^a!vvvzzznssJUKX]^"&6:>7;? V   ->AD>AD@BE@BE<>B%)-/27vvvyyy   ";>B;?B ]   %BEHCEHDFIEFIEGIsuxvvvxxx4;??BF?CFY     zGIKGIKHJLIKLJKM\_bSWZY\_vvvvvv07;Z_c AEGDGJ'C*J G E!!B#$?%(;*-8/7::BEF@37:+03#),!%%*/WWW&&&6MMMuuuyyyyyyzzz3:DC?ED@EEAFFBFGBGGCHHCIIDIJEI0(/ojowqv󘘘'")?:@507B?DGCHHDI2@2VZ \ ] \5NJNOKN'')!):29`Z__\aRNTA>BLHLMIM&I%     @606.)/IBIURW74:628*&,?;@859@ R $% D$!%4-4srv3X4G "<    V%#):gp#O#4.5!% f  S ? h5<4%J! kV ub$9j:      5AH?  zoH q       -p*   }si(D)II     7   ua2ee v    7   S*`_c]da<};   5    BdqeOLQKLQ1  7   s ? 549V_Z)j( 9    wW9x  7    ujBfe      |#7   ~sf 5f     T9 x 6 C {p>    c O     n" gwg%A&xy|{{~ @  : g     & 148C^6*40"abfDJK#O#%@'+/348< `    : =?C=@C=?B&GINHMQ$( ,05:>B f    2BDGCEHDFI*.27:?),1,04]be).2@CF W smf]W)HJLIKLIKM%),X[^)-2txz,37#)-FIKCGHEGHDGI@CE:>@379+/2#)+!%.37SRRDU{mr,UEeFuOws-\He-<1x`7I fLW)&)_L',.jRvV+ 2g*)')Y_kOJ`=1Wi״eB$2^X^+@R|ۭ]G6ADVPM@BGy^+"+0:(YOսO <ηs5%!%# TEy`*9 1<7/NbiU 5Mjc/   ;K~\4 @I_A  PD^'  XDj,4 aFd/*  'fMW(,+21/kSvV!%'+$-Z`kP )4Xj׵fD+@V}ۭ^I7D %CJz`.$&#.6B+\Ss8mkNZWYU^JMXWXXXXXXXXXWXJil32 K 4  4;ycA0+% 4W"1v ( ,DAC?;95-'"$? ɯXX<14!?@>?9A\ƭ:C'(<61 659;8>+"ȰAoB1/8:..6<_6-ȰQ%T & /9ps9Ȳ    6^Ȳn% &+,mɴX  ^%ɵo ɶ`M  gɷ@6~7  &4A ɸ66LS2ɺb |:ȹ1" `Ⱥ^<9` /uȺ" " # *-3ȹ(//;$ '/#5 ȸgL9344  $=5#@uȵR_R5+/4 $5258"7s!ȳ4 *,--,- 012/5!#1ʭ]0!*'*(-   +/,/,57ɬ>T#&%%&'  -),+,)Qʧ)J ##& "(&(&ebgˣ  %#(,>uʤp!93/,   ɣY|)*C:D#   PǡEV!@3;$  2E> Ȫ% 16:7/)%)-9;=( )ǼHۧ&/646469;<;+95@q2|m1t%(,++,,++*-001335,k8FoI   4;yb@. *#1U 1t%)B@B<952//+%  "< ɯVV:-1IVPLH3;><>8@Zƭ8@% 69,y>,9796<(Ȱ?lB 3'$/s}F12)-3:]4*ȰN1C2;Q/(8nq5ȲecYf3dsmQ!1[ȲoI_FkEMugc4))kɴXzt-{n`R\"ɵmp_{rgWɶ^KIV}o?$ eɷ<3{- O^~) " 0>ɸ23 .]}g0 IP/ɺ`Є`zsdDz7ȹ#=Z=yj`R ^Ⱥ[:z@G^qfb#%sȻ Gm;?fNx:lqj?#,0ȹ"./)'Fl&,GM'0ȸeI4'5*Df,5-$;r(ȵO\O1'+(5sv|T!10043}pȳ1%'*#+mq_$*,+*0,ʭZ-&"%$&'^jL!+'+&03ʬ;Q! $7aWZ&"&%&&%Mʧ%G!WZW^D$# b^ dˢ} H^W[W], !':rʤm 7// /]VZYX[O ɣVy%'@8A-Q_YZXZWb2LǡAR<06->OUWXXVS=2B9Ȫ! -2134.-023036;##ǼDڦ!*1/0034323561<n,}m.s!$('(('())+- ..0'h4AnJ 4  5;ya=+ ("  .S1q!'A=@<860(":ɯST7,0<=<<6?Xƭ5= "71,  21574;&Ȱ;k= +*   35**19[1(ȰL   ^ #+4mp4Ȳ    0YȲj    !%'jɴT Z ɵk \   ɶ\H    dɷ;1{2     />ɸ11  X  IP/ɺ^  z7Ⱥ, !   ^ȻZ8 ;h  ,sȻ "  ()0ȹ#,+8 $, !3ȸeI4//0  !93 =sȵO\O1&*/  "1/255~qȳ1%(()(* ,-.+1 .ʭZ-&#&$)(+)+(14ʬ#('#)BVmV TD% )@A @<962,&"*ہf3 t9;<;==?@ ?;850*%  A N߂ X <:;::;;<;<>?@ >;74/)$UTv߂ D "<9:;;<<=<<=>??@A >:74/)$  k| 09J0"&;89:9889:;::;=>?@ =:63.(#$ QmV?*ܐ ͼ~N*+;89;>?>?@?><=>?@)=963-("ýP ܑ B9 0:7898;/ !""#%&(*+,./025<=<=>?@ A>6+րbݑ J>28677896<"  7<;<=<$=@< =Uߐ S2 4678896<   5;:;<=";@, /E -pe6 767785;   5:99:;"=;>1$DQf|+ >X ,Fcz 73445674:  59:<:=0  OD !645545639689:9<*e 0 %312245376898;%} )8575124343766789898;  $ &5413323426 75676775687879  ZH7'  -521323  745 66459938667"886qW@) & [ȴ^* 240122/  634 553486$8576%7682 >ʟ#-#n    %31.3+ 624 2375# -645$6580O- >&V -3/  0231274"  7354#547,]ٽ&PA   " "443!   (624$36& < f/V{     22!    423#26"/Mtz   %7N_8"$"   $5132215          23  )  403220    .12-/q      3/01*   AV CmM?+    4 +0.1' VyZE( TB ΰp      )1,0#t  k0 #   2 )..   ! 1   &/-  9d  3 (. wymܰ      ( - 0Ot= " "   $  2p   DW     XC     q/    4  -+  =RC5'   4   * ٸw^G" 2ӽD  0 ('$%:  Y! , &'$%$ :M% v  8 #&"#$%"M:  6m {" 5!$!!##!$ *'IV 1v   $! !"!$# 9Tp ]C   0A^5    # "!"  v/    ! !    ! &     %     ?-3( :|hP=*  N JƶbL" 9k "  D i MT q 4  ~ bB %  J  {2 (I  @ \  #:yU   @ &?ZsA  +=Q^R      ,   (  +   !.Y   = $)I1ee   Pz   Ei2 &5P5& gc ήyaE&  3q2roP'  ( )0ͺoY# UAܽ@+ %c4~H  EA$s  Edq// :H#E5 2A $y 2}c/= 2 $.$= 5 ?;)q#{P29/ .:> "@   ;;9|^ /* k 54:-;;4;  n0# /=;6 $AbzAA-DYmZ7571 ,;9576; " /?1  >7=2 R݀ ,  7549 ,:945774:  289;#  8:9<- f܀ -v"63536,974466574:  3:76<3 *;89;(|݀*]&5243401952355455639 0 498969<*   <797:# ݀H   *5231244334528  47 876;9  8*7: 7\NA3  1 anV;%,31243417  46 7756;1 /97896ıZ܀  < /323417  5567647:24867(5iS&5]12315  5456546766572S 5ڀ( NH 2/012315  635455645658/P!E܀* G71.//01204  6243434+5547*& Vr3Je!0-../01/3  51434636&&8MfN jY "=B$/,./0.3  5132374436!   D   &/,-.0' !412325 ؀0(-,- ../20* )212  ؀ )+,-,./ 122/012 0 ۀ )*+,-.+0 1--./012,DV@5& 'ڀ  vhV: *()*+,-+00,0/0D103*"ǻ{Z%6 _؏ *()*++,*. 0,.-./00/2' GP!Fۀ(k )'()*+),  0+.-./.1# V= V׀%S  ('()(+"  ,-.-/  T0i׀ ?"&%&'()*(,  .*,-,."m ~ف&-'@Upp #&%&'('+!  )*+,- &;Jlb ځ  "$%&&')   ,'*+,*    ـ "##$%&'%)  &)*+,'. "#$%$  +')*)+%$ր"!""#$%$(  ")'()(*" 3׀րi  !"!"!"#$"%   (&'()*NI>3(  Dր"O PsU;! !" '%'&'(') JȽR W؁%; I  !#!$  $%&( } mـՀ#+ q  '#$$%&&  Հ 9e   $#$##$%$  Ձ"?N     #!"#$##$$%!Yi ׃' *;Of,  $!"$  0?=?#"փ~   *7973-(#  !" 2Ճ'e 1B?@@A @=:62,("!    CׄO "@<= ?@@ABAD5   UӃ< -?<=>=:?    kӃ) 2>;<=>?><@:Sy/ Bօ#K  #>_͑ (:78 7:=>>?=@! #/AG Sӄ8 +967876:<4*    (:@;<=<@"   iӄ'/85678$769;<;4,&  )19??<:<;= ӄ06456656788768;<<;;954322110/136:==>=:88;;:;<<: ӄ 144566567679:;:998778:;;:;<6  ӄ + 3456656787889889:9<3VfTK>+ !Յ"rMոgH(5234567898;0 ?ije/ӆ"XZ҂ "412345676787:+ R) Aֆ"2E%4023456787:& fַ# RӅ%q2s5 *4123234565644567:! Rڴ g҅"? ޾  u'-+-..--./0145456768<\  ք"bY;#3DWlH!48789:;:23232343 ,7J( ̈́$b -6456776788794 &cCC;EDDCDFIJKJFEFCI5($&$%$$%$$%#%  |s= b   ȁȅȁɂƁÁć žΖ  #+')((*(+ 'k4 !   aTLv%m}<!'&! &?SlT TD% '9M]q! *;<<;841-'!      !gCڂۃ   +@:;<=?@ ?;851+% 'ہf3 q 899;:99::;<>??@ >:63/)# ? N߂ V   ;8:9::;:;=>? =:63-'"STv߂ B  ;7:9::99:;;<;;<=>?@ =952-'" i|. 6G-  $:78987899:<=>?@ <952,&!$ N~kS<'ܐͻ|L')96789<=>?@?>=;;:;<=>@*?<851+%¼Nܑ@8 -856769.  "%&()+049:;:;<=>@ =5 (ր` ݑ H</6456673<=i[]XVSPLID>83.+'$!4:9::9::;<;:%;*  ,C *oc3529_|~~}|{zyxwvtsqrmuX%,.;789%::9::=/!BNdz( <W +Da~x 523417h~|zxxrzX(--96789 :8<.NB 4123417l}|{yxr|X*-,95678 9:8<(c/  !0-1/12215q~}|{u~V+,,84567 887:" | %7413/0100103t}}wU-*,624566569   "!11-/01zyU0&-52343125445657  >WE4$ % %2/-/..0,zT4#/534312870434"553oT=& & Ydz\' R+2-../(|T5!.2 330284 5243#4/<ɞ!  )Ll Zx:00*1#~T6 /1121.1723 )523 25-Lځ* ;'S +a)'/.!R5*00-/62"K]d/2#325) Zټ" MR? sK"&M, 031 !MhfZZO$4021$04$ 9c), TwAu= ) D!2/ PomcaaY^5/0#/3 +Jrx})"5L]7d/).8! #Tuujghea\\R"2-0//.2  Q ^S 1 #Z{{qnolheb_Y^:+./ X .^Kd'\wtusolifd`\ZU%1,/.., Z  v)/i- W}z|yuspmkgea^X^>(.--.) +o H:xh9v|yvtqolifc^[YW)/+,-& =zT@jK=)l=R (z}{wurpmjgd`]X^B$-*-# SwWB$ Q? ͯobV{$ \zJ!<~|yvspnkhdb][XY)-(, rh- (SK 47( .l}zwtroliec^\W^@#++  .tPu* >p}{xurpmjfd_\ZYX%*)   6[@PXO~|yvspmkgea\[V_= *uwkݫ%QP |zwtqnlhdb]ZYYX'-Lq9   '2` +}zwtroliec^ZZV_:  /ne+\,~{xurpljfc_[YYXZAU  A2Z4~|yvspmjgd`\Y[W\;  U@ u2V:}zvtpmkgd`]ZWX_R  n,  PPQ@}zwtqnkhfb[X^X5)':OA3$'QND}zwtqnlic`b[:$ ضu\D  /ҼAWMKK}zwtrpjfjdA$# !7  W-RHU}{xvplpmK""7J ! toTEZ}{wrvuW$ " J73 j x" ,C[}{x|b, !$ &# E!S-sr(A]}|q8  $5Qm Z@  ,>[1  H"?`{B s+   :$<c|}d3     +s$;e}z{l@ &   b%:h}zuvtR*  %   L09j}zxsptc9 <) < $7zeL9% 6zr8m}zvtqlmkK& GŴ}_I6h *^r7o~|xvspnjejZ2f IQrQQ6q~{xuspmjgbaaE" }_?! y6u}{wurolifd_Y^W3  y.$GKs2n}zwtqolifc^\WY^J Y6vN#7~|yvtqnkhdb^ZOTa$ !;Wp<  ':N[NY0wF~{xuspmjgea]YZX]F =  1@%X}zwtroljfc`\YYXY  '"  W2@4 ]g~|yvtqnlifc_[ZW^7  : 7w')K4 je&}{xuspmkgea][X[P   Mw UV\"Im s~|zwtqoljfd`\ZW^!%  1M2"dy`άv^B" [ 9u2utU'c}{xvspnlhec^\W\C), ̸lV~R=ۻ<  * B_h)e5Ne~|zwtromjgda][XW@ p}Ban ,+ uR ]"AI)Dv|}~~zwusqnlifc_]W^-1> w |.z`*; 4O .Wc&1';f(^xzwtromjgeb_Z\H<9&o}xM.4+fK (7>Xe(#'gz& 0mustqnkifda]YX :76y[ + h108$zB &98.7Yneir- *Fwxnomjgeb_Y^./993 >_w=>\ )AVk}W 202/Vs9 &96/109Zl."&@+ Zwmijfca[\G;5;/O݀ _ 20/6f0 '85/034/8\g-%(65: 0gpddc^[W676:* d܀ _t 1/0/1'73./2212/7\~c.((923:0 Fje^Z^-*7668$ z݀Y "1.0.0+-61-.10 1.6]8|^/'(73415:$ "Vb^G84647  ݀D  %0-./.+.0/X1.4_zX0')512430755S 535537 3YK>0- ^kR7 '.,-/.-./0-4_~xS3#*512 3019,,435 2ðX܀ 8 )- ./,2_~|}wN2,31232/47-132)31fP ! 1Y+,-.+1`~~}|zzt~J/-212104213.P1ڀ) KE-**+,-.+1b~~ }|{zwxr{F,.10101201214+ MB܀( C4 +)*++*+,-+1]y~}}|{zyxwuvq{B(./01)03& " Ro/Ga+()**+ ,*1\||{|{ zzxwvvussmt:!./06/2!!4JcJ gU  9?*')* ,)/'Wg|zyxwvvutsrqrny:/,.-./.1 ( ~@ !('(()*+$ $owuvuutssrqpok`X" .,-. -0 ؀,   #('()*/,',yqtsrrqpopkr9 %-,-   ؀  $&'()(''*+ [uoqpoonmmjj/--*+,- * ۀ  $%&'(()*%-BwkpmmlklgnN .(()*+,-' @R<0! "ڀsfS7 &%&'(%-5thlkjjhidm<-'+*)*+C*-%ǺxW  2 \؍ $#$%&&'$+;qfjhggefak7/'*)*-" CLBۀ'h $#$##$%$) Ilcfecd_g= ,%(), R9R׀%O #"#$%$']eddcbb`_\`L &'()(+ Q, f׀ <  "!"#$!( +g^b__^]]\\X\*#&'('*j|ف&* #=Rnm! !"!% T^\]\\[[ZYZW]D$%&'"7Gi^ ځ  !" %7`W[YZV] )"%&$+  !"%[WZYZX\I $##$%&"/     F]XZYZV^% ' #$##$%$&  ր# (^WZYZX[M #!"#$##%  .׀րf   TZYZV_.$"!"#$JE9.$@ր L MpR8=^WZYX#! !""# FǼNS؁%8 F #^WZYZW^? !" { kـՀ#' n  SZYZW] " Հ 6a=^WZYX[N Ձ" ;J$]WZYZV_2Ue׃'%7Kb|'  SZYXY  ,;9;փ{ '5650*$>^WZY ZW]C  -Ճb/A>>?@@?@>;740*$#^WZYZW^#  ?ׄJ >9; <=>?@A?C2RZYX[N  QӃ7 *<9<;<<;8?6_WZYZV_0  gӃ$ /;89:;;<9C$ VYV  ,^UG:( Ӄ$Ư~dA1:789; SZY ZV_3 ȶ1 Ӄ# =ǧ( 498 96=)=A_WZY&ZW^7 "  -XӃ! N6 78 95>&n72]W[ZY%ZW^)"F=<74+>N Մs Z܀, 8467 680 0\^ZWVWYZYZ"XV8`N?:=>??>?C ,Ն$[16365659/4R^_]YWVVWWYZY)XWWVVX[_bL!@:=;;:>8Ov) =օ#H :\~̐ #5345479* 7JV]`_^\ZYYX0WWXXYZ[]^_`\P@$!<9::;;<:>*89:9=  eӄ"*41232345216996-& "+4<>96898; ~ӄ ,32'3223421126898872--,++*)((*-037:;;=;8557986 ӄ.0012 34310011245678 7765443345767893  ӄ& /012321212344556656769/QbPF9%Յ"o IԷcD$ 0-/01233234345648+ :IJa *ӆ"XV }Ҁ /,-./0123223437& N# <ֆ"2A  !/,-./012326! bֶ NӅ q2sЀ0 %/,--./010010122112212314 Nڳc҅"? ޽}s "(&(''()*+,0123237Wք!bYμ.@SiC.233223454564-./01. '2E#̈́$b (1/01234/ &cBC:EDDCDFIJKIFEFCI5$ " !""! !   |s= b   ȁȅǁɂłÁć žΖ     #+')((*(+ &k4 !    aTLv"l|: $$   "=PiR TD% "6IZn~  &9::962/+$        gCڂۃ     (?899:;<=> :62.'!      %ہf3 n  68989:;<= <841,%      < N߂ R   :78989:;==> ;740+%      PTv߂ ?   95767899:9:<=> ;730*$    g| * 2D*  !845567656678788:;<=> :63/)# $  L|iQ:%  ܐ ̺zI# &7345667:;<=<;9989:;<>):73/)# Lܑ=4+52347- !#$&()+,-.0389:989;<=>>??<3  &ր^ ݑD8 -313437 4989:9989$:=9 8Q ߐ M,.2123426 38789:#;7<' )@(l` 12306  2766789!8<.  ?Mbx&9S &A]{u 1.012/4   25678 97;,    K >   0.//./01.3   2456786:&   a *    /+--/./-2   23456:    z    "2/0/,-./-1   2134434345648        ".-+-.,0    20123322423435    !TC1   '.++-,-    2/10010154031 mR;# &VƲY#   +-*+,,*  0.0//00//32"5132$34/9ɝ  '$i   !-+(,%   2-/-.20! )101$214+ J(9P  (,)    --.--1/ 2/10"/2' Xټ L;      0/. %1-/$.2! 8b( Pw     ,-  /-.#-1  *Hpw|  2IZ2    $    0,/..-0            -,-/         /+-,,*        )+,'  )m         ,)*+$  <Q =hH:&       ('+)," RvV@"  O< ̮l          ,,'+ qg*     &%') ,     &)'  3e        $$' tv hڰ      '' +Jp7        -l      @S          U>     %  m*   * '&8M>/!     - # ضt[C   ,һ?    3  !  6U   3  6I r      $  I62iw   $ %" EQ+r     $ 5Pm Z>*_w>? (@Uj|W 313. )651327    .;>=<<=;?  jӃ&  1=:;<==>,! &"1[Ӄ! P8 9:7=#!"G@?:7. AQ  Մt \܀.:689:3A=@ABC@! BF /Ն$] 3 85878 998;1#$C=?>>=@:Qx- @օ$I  <]͐&7576787:;/%>=>>?<@  !.?ERӄ6  )6356 78669;4* (9@;<=<@!   hӄ$-63456$5579::3-'   )18>>;9;<;> ӄ.4345665469: 844322110/136:=;9889:9:;;9 ӄ034544567789:98789::9:;5  ӄ(23455656567898;2TdSI<) Յ"q LշeF& 30123456767898;/ =ijd.ӆ"XY ~ҁ  1.0123443456787:)Q' ?ֆ"2D #0-/001234567769%eַ!RӅ q2sЀ3 '1./0011012343456648! Qڴ f҅"? ޽ t %+)*+*+,-./3434547;Z  ք#bYͽ!1CVlF1545665567887899812 +6I( ̈́$b ,523456572 &cCC;EDDCEGIKJFEFCI5&"$#$#$""#$ |s= bt8mk@2&>>???????????????@@@?????????@@@@@@@@@@@@@@@@@@@@@@@@>D9(FE8 Cs%??@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@>;Ci3F eic08PNG  IHDR\rf$iCCPICC Profile8UoT>oR? XGůUS[IJ*$:7鶪O{7@Hkk?<kktq݋m6nƶد-mR;`zv x#=\% oYRڱ#&?>ҹЪn_;j;$}*}+(}'}/LtY"$].9⦅%{_a݊]hk5'SN{<_ t jM{-4%TńtY۟R6#v\喊x:'HO3^&0::m,L%3:qVE t]~Iv6Wٯ) |ʸ2]G4(6w‹$"AEv m[D;Vh[}چN|3HS:KtxU'D;77;_"e?Yqxl+@IDATxfuVsl &Ah eD[y,򐔏sL˔h("fvr3=[uWv"Uu[{_577ukVou]һ_LTVӼ`9Kai]%n3*'U"W%ts݅+5L:O:}/|ggf4k6J9}ٜMV?}`ʰ ?_|K<,ۿUs7pj=ʢ{?**Nqz0]^{m,[ʤ_f^r9؜lڴm۶mW#C:sTwOOkFu0cC?zz7B&bBtdkҫi/|[/O To!ە(M〷cC 4.ɦp0&)su!3m&&&pv7`k> ' ]0=nWύONɦ܆Qnۨ@? :000k׮{wj|ı,V/R~g?}!F7[ݚu"@Z SXm`D.X9Xfs VֽZfk UE1e+MB egX.}7@Ni(m CՐvNE73=B_ԩri|^x?_ֽ+{Ձ?2Y@SB7oTr )Ҷ?| *U>eڵ1;9asdT,JђW9  :4Z4 0يqH Dʬ.?PEHHe!!5'<EamݲUO|b;)1$fbcqQ %~Ф ʟmʧS9|HIc} ^HU ?B";;:Zr9,-؊.6Ss+FTx-[(7ܶ:mtcl۾C︟Q]ǟT@+~~~i߉Rw;zX24"-='5Ro)r@!v-rVDSZ\7 \*ƅc aY&5P^ጂu|DA;wJ-UV UHG4MNpH)Jq'N.n,&<+Q2(OBKJe(Z]eA 2ڕϣ!s-v_ hrw/tuSs+V qckvrrR&CK%GU)D_;)ҖrD:SҜkS4x]|Ba֡$Q`)c 7#7Ys>Z@lS&e)psh+8CQj=`6Oo)E`20ZoXMƞ~i ?V2P{ dNaۥ+N_ʏgl5bkTY J \ކkZD3d x (t'hILq_ =[ jlݖ-86#Yo \nmrl )#Eqa PY*UD+^XU֣bDpAhZ D( %4e\-r(ߔ :@ 0tCVNփe7e~)c>w>YzYwYw9wywyGݩӧdabʱ`-FIOwp_|a,]' ^ǎuq8q>uҝA_rsEUp֔&x^uƁ%cO_T D B3Ă[.>Ы3LE:N3෰'oKC!?43T9"[_m%Fŋ݁Ç^uc$fΜ9QY5LH*;KxuK4Xw"q/<{pO<{簷j [Iu$ l%I!b oʹP)0eDh)2bLrR"G@,r˂"UM$rB$/ENL_AQ")p,Խo{?X{itϽ|?t_W%]PEbrY҉y@s){9pƝx7ur_Z}eryׂB F/mr<-y5zq(2,ȳTN`\0 򲠂L^6]ÔϩT(=PA,_ sKܕ˗y9N 4k:bZ2JnNp:UNxiűH>w`}?[/N/7Y!KD/TBH3O>FGCWmLfTyR ǭ3a$ p1m¡TNɥ|O] "hR@l),OX={y]E#+/E-v;Z;u%`X:.˥Z3PuZAtRޔ׵6S\se+*kbs_"!}|;yapa˔#N2M[G0Ĺ6e~,9~y{ IqTuh֮kPL*"K\uP O SBSeCeVZF16κ2\CmظJL4#DT2 "]u"/ P45Aˈt)=BAB:n3V r_ǙGxyWac量0dln 2< n̫uKp {Шy="Ȧ(""ohxB0)4'pz[ ]Eˡ /fҩtT픿,x'xsaɼ|wory^9f? gT`!%3_ex-i;vq6YYvOdզ1"/a>/] I?Ghu:@Xhs8xӇnZxgA [gkB]HZ eb*GC ,h6(ԹQ?4_#@-.:w\]VƳ;uK%EJ/!#[ g>Ҽ >{! Sb7I1ߍ\[/M^JJE #~q1/!1N@]<FdyYt gXHC xkư'l iɓ  BP(l6R&>,g9Y~$_rmZ IIJu^vRrg~>wݯswjg_x fnӷ4D@2A,R2.Sțt!Hp<%g,HK`G&s4I 3g<Øe`7mF.&qE>dȓz)u!Vx:q 0f^=WCTN]X:lwuG'8ĭ;5s&wz饗?s6lsGFF޽7={:1UuUwkD8*8Qt$œ,*{2D`HLl%%TQ)7~D P || Egm 9|$P.Jk0uHތE@TGA@>MQ9zHz {|VJYvɖHHԽrٮ_yR:]nwk3gO[Z+,} \ `N--ʞ,Iշ*֓p0Dx{Y<(5@:%3N ẀD!o ^vF-b1XYPi 3u}'T}`/q|\2Q|pb\Vie%FۈJ`UddeQVxTRVR|2c0r1H?(ܫHW)h@,m("6ZQP<^+v#|\DpS::ju'3Jԡ_;O|CxeI ))e4T95]w7AG|%|S#\2S,R*#\!e*a4v\]т @ S=4my2yD,3` ۠VAdes2S4;U|;t`ey5iEU%s!aP+~9HL.dA/k~ țH]NX/Û$nPQy" JfF"#J+n>Ub]A(e!/ D (d5uo}f Ybӕo'r^ˢW"|1ZI,/0%,vq 22J 13`,앿K"5 EG y,o^IpT4Au["PB伃+}d v4PBDGL<$Gal FC. S*1kS>3 شZBb)T (T a2OL5znIu={Mi. .HM7oqc_rϡop az''ݡ#r۶lr  Ψh5I6'dJg*\H*ɀi>i#R# =x*Ѐ#ˈX^,}iM3-C$jYitwEEz=}ۈM_+$THLCKeGZ exv4zDl߄¶3wVҕĈ\ڥslY9׮Lf#6R(I= Ma nbҌ3GD*b ܽ oA!ڏ4؍Z6\^xu;ɏ< |[BsIV"DB2ه=B|23 JL%gN8#.-t4 {k@c^b0\=;r{ŗgZ̎ /.>FtA˴qϵ-*f͚YӍ*>Wy4MK'M vLo n%ڕ%"fAꨜ )7 /pTo^7)78f^n: ;v WY9>\F N!ʣp (@M~ăƠ:`!t ,"=ϋzF@ %5C!]QOĂ 0'/M%{w{Q,̀u34gC7=Vԯb3OW|^E1B kLȷ(sRIuB4ƙ)*ފױS4fTީkO< luHJ[5Sn ` Ix4kkzczؑqwam!Kӏ?!o.NSԩްk# Gc@@@h!gxI45Fshوpn 7k4g/cd5(>Z{6cMDȸ/̓ߍ!vѦ5ƣO@nnܖ'/A2uƁsWcb-6_.xבvdR FU~TXyrO;` a 9(OvV7Cn;M7q7]܅E.75-Xn (#ȕmH厅 ,C܋4)M!&sqDGUQ!%@Ri 07 ̾Xzc!78_>2ux.n/f_l2@: y]?.\$dI39 ?yUR9tr&T)BXvʟ}#UeZ x4W~@(&p|k7^c!xc+Qۃa^ NB ׍]@Ak`p;q]iD~!Ӎ<&:mQD_ g8Q )"_U .~bk `i}k+Ȥ~pY-˦; ==nՎ!tf30o򾛩P!elm nAW;H¸CV0v fB`^=jxιV"K} MQs K/,Zzxh-SBt07Z+A0ԕ3[f <; [pR /E֗;p=kb_s CQXv  P)VH+APb#,.#M 91F2~yJ?᱈C^l,cf|]h4!؃VQk{i̝9wm9{WR^AZ@!sj,vY{vqgQ ~9rplC3g)Bz_`?}R{Fnv;v\I<ț76IFs.L;vT,ƟQEB5&lk_C9-t#`Ra g0ۗ~ f=F4b@ɥUQXǵLTc1?(>WTBn¾U|OėOIk uhG d1" '@V@/NfS*Gⴜ>o8!%IM{~>JJznwǝwi|ss㗓[_'6S9d BnOG*f/ȥ7֯_/G-C \ΝȞ\{jjT6mٞi1njgzG oƧG ",H&F8AO*P)>A±`t xm;E\y1rI#qy e4}U6 @ɫ[CWWh.gϣ7>B}754(ܛ-<d p- c.M`sqjY[|)r/8'|R.KOqXC~=._x/[ʰ8uJ"$WYK|M99&y켞}2~kB穿^;cCq׽RգUV[5Z LL[ Ȁkق)7ydAp0<[t B az L:v<ޟo~ [r% +Q (gM#ՙAz+T%=O![̇.c+ YL+ &-~dl%qP0n<+5N9[ 5])ARBåN"t-T,!(Bꔿ'MObMީdSsPNqJS|Qٍa/סl* L 2`Aڄ> EϭuNLJS]3 GLgg8/h4& ?,'Ҙ@4Lbat[v+ ;|LPJNä́WfD+#S7f,{ ӏVy<{,ڎ)3 6΀@h zI+d,NӴT~y2~ <[% ǁ?[ 5>? HR~[b (ud`>HrN >nh )77FLοVTr|)H RGM%[\h~@̏,Z~=h`e,ƖIc\e_/ZW|ހC 08rmL싴h+` ]OĻ]N]U&OʩEoŴE:D)!scgRVZ.DTE>h}pϺnnOp} |~"xNK955hDOZc/ARt+=o1%]d]v4}nU问 ua!#>H$KiLV@`N""EJuER75\su--(+a U:ϟܠeZ _v?/䬂GA!V8E\A I#v)J$yc4|cn<t]h%``elhơ\p!`PA'V:x;K;)7[oI\̃E[更L+e#8Hp [\ݪK'/cz7h(M@5 [qU Y'r(?>x޲81:h8si3Ġ8 Od(bGUŏG>'e(703n }2x,?ΩN3^`L!!`-&Dz msn&Z'n/Vm;]ס8p( (;fGx#9 !c uazLA}7dq%c@3Ő7% UlgQ.,,2ZиMѸW xVJ!` ⪂b$W+1^8P0yǏn;ќݖ>_ )-i2L/NF'(>)/yezê?a 7DK!`sN8&uF`Pc26ӓe'V[JbU9S``T1r%)˩#Ef⬀lh a 㥌4Mj 4M8kMnVcwY7lI }\,&1AF@YhYǁAm]`ui7q<U|c^7vXE&ABԓhdb LV}*=}^^ͷ+ βPٗYul;eu^@+ eʟu4%!q/gK!Q~IRB@#_D"^QXZ{ƩD/\ez͜9 JiUy@, GD g{z!)`ıgc_r3i>D[a;w+07T&J[%_占e}Vԋzd)D<3ߣq(H"w ń֡9}h-]wauA/"WRTBr~ `r[}#)^(;"gc=OD#ʓXQ<{߷Y|+e (/(t',]~tUw ZG^ 8~V>^WBӭxB>-EF&_}.Mr6tXBe8{[t+ߊ"`YtTG/qL y:-7餰lŠq)OAj/]Z{8F,fU8=0휺VPmCwJ:𞸓-]waZ{ [NK\kx Tz/DG]՞ַI~t;v:q ?{?dy@@AS1 cZ+ <LBH e*wcgݪuněe7e7}j |.fn0Uΐ!frXĹOX;pk1X>{s*"~+Y LDYXf2?a(825 ot,xHYH1QRN%DK F!&8EJ Vr#%0Umw|pZ+uڭ6WI~+_jd1EJ8 ı okT,ïWXGOe^.Dqx#{[r_S<'So]U{.S)~ T.E|>7<.NFn*aIpshtCߋ0r]}`N!`a?#αqƝ5n`5#.]&&ed50[z *"c8GZR%2[|`TOWADcQIwr ("m5䓺K}uO>|gWc1.kTYO3Rƫx.y|O)8QGK4}?*׃>+Ɇޣ%!_U~P>)bxiZwatwbm;}֬X#oi1=41.=ӆ0 tý<Ԕ:s?5ìcx`sފ!7jηN¬F낛;UApqF(x4/ PlAţ֋,T:WzƒF߿wb@ `gSgֵ ;Nsr{Wr53I^ h1tRũ.M5M7i?qsa# P#/2ҷTT <ȠW^}Kn?@s}LnF3+/]qS1>Ap1v]\Ә®Z7 gæQ7wx9!i|+cqLЪaiz 'i #!yI>t6t=X`@ ]rĸoD 4=.I5Z+fBvjwp03ӇrLST<फK9'qU/\)CoCIYϘCGGc$y !0)kݘs_c;ulʭl c~vg_sۜg|tt!mph,-Fky|TfWumĨ)Fz^iEK* x "hP< :C&|B\<5@q0Qcgh; wuԅtxG.X5oTkN|W2*ʹ Nں4olC,~m6lLӱU>kDYCY hLExW+`]h |i]x좻zvԭ¸P:ʋK>ħ2M׽]Կ}HlLWiBWqWUBZ,"߀39kqx*-q;O|mjb?hLE*qxa2 :+6Uyf) 26x)LC:?Ґ>pʛ :nzʹ|ZGa" @"d堯II+d\oi5ⅸ:zY#xq]@?^S `+k_IZ(7Sj.;s+{UGESb(8icʣ {:֬^Kǭ%Hn @ Ht/(U*P:Z_^O[R7[+өk(L*?˸²4,[~Zv d:  ԃ(Z@P8a!%&D<[`>/nU',Ep{'F#5  ["&ݒ)P^Io A F*ʼn%̆% ,P/2"q?gY@CNVJP B})]kB+K'qį hh _0πt@]TEJXK;؍C Ni^!W혜h+@֊% BQIiq:MB>u~5 ;+ʏ˨1ZORF6 ~G'?C*AZ|; mVGۂ'ic0YʼnLsZxo+vV:eWż >?\Yêա5pչǧ9ѩsGD"xAA&P:iR63;-FxAk 2_mQ,rxʻ To|51'ӢؐhK刌d9Dkf'199o Se(l5K 'Kh V)'+5C1@o+J`> k-8qGy6\*clYtR[<F>GD OaDx9:~Gx\xSoe6Q ~=Vқzr* PoF:_swM0pԛ>>k oq0L=0V$| JTd.`2 ۫jhJ:/7iӂτ444t:xZn (/2"8c'3V8ªx{hh؇݄O[z{e)*)<"$UaDO][Wf ýF%{tf' b9+O03LDq?s0&Ǒi8o՘)"WPukW7?X!l.!#G׵{q9s"}6s[]y-nXχ Ò~ur< =}IT,*GfZ3wxqT ]rՍ!wS4񍭐 V8Ɂ:᫨"KIy6hsrt5ZD`~{ Nަz?iex)^dqc@[|)S<񸉦>0@?͆UOpVVj4kfM{o`)j֭x;WSd's?{wx-,b yyVIt>o/:~?vvyKyao=˶vegEo@_X>ϝ^5c4sBF-xW}_t 1 ]:;~xTu^nd8bUAJU ܏Eӿ|^DWbqolQ74Q}|"<7?$Oԇ{C-F"W9xHRR#c>{o .se!;#?# K/wp (|]2Ǝ5 ŗVBXxDSk}3DsW|Uù2VNdc "܄:sH]r)rv(]@D"UVd~V}V~/g`4> 2]8KW8Otcr4Fذf@7(]uV+!H}7VN:[mrp!Sne#pX%_63venE`A]qNkn` @_ЩR @XС-##{[9i`CH160ƾt3XDhRvjM9tDV/o B[UقsI'=wu}-}Q׹3A-7PCS|NRXe<3W|wl73ixFtҞ yZ2(?` fkvrL\LU'ngEg!"TQ`%DD{b @nQE*8ŴG. - ĺ8O n>c8lDTgI|j |r"˸w:*DD$.qa҄0f~[cnٙLy?.N{R _}@[>T}fږa>o*%=V`j}y`3>f6)ң$9^};a|o ]`c8eQG[&+_ 57`OθaY_@—`GHQP鎃a$A >FFFݯzm;ppug2v@yçǪtF3vb3=q/|c$TN޵޳ٳqDU~ ׿&;3&Tpv=deSǾ(x\糸k\g ^ϔՓxj+CI )NY9 ]NJ,&*4X*SKsn;qdғ ;&MG: vDEǭe'Tpm'g؇߁Oz5hGJ͕i Ih1 a6_p\ŗsc)}ߕ+Mg˃_ ڲuK0;Lׄu)ymM=OKɩAc[-`>x>kgGg`M򿣛+qJ`;wR2Q$UVK:@ӗ`Tɰ# |0lȋBKғҥ^qRxB.F2#(n(JO*BY'\`X' /)[+މ.Kn;c9=˅ck0@]JUm_Zl`|`݂ @vOjd|Pq=!CWWoO"񙊶#% 3g8)\}60 FFUΤ = wxZ]oR489>-A@m=v`i8S>yXu<2Et-f KZ5,ܲ\ pޅ 85pSM)> ϿmP PנEZR"*R1 P&7_V?7}¢%4- X޹ lW:t J<2hL`l`- A?WU(fJ<[v Kb<%^W~s˻ @2#ưx}E p!<\|) ׿U(>Ҹ¯/eKqr!ئk\XRlF?zߖub䗺4FV*g* &ⴡM=%GK݂LNtΡKB <ބqMi %g @0@[_}ӲS:2 }}n~׻1G|5\ Q\ GGpG%?ުv B`Le㭋i4N$> t (LeH3ow=;z8 أя.!| v PP_D,X}S4+t)`#}c6\3).^:1J?@ϟhU9sݾCSlaD&b(|Zk\:/ cr .@?J `|*;!g@VQ<.caKLL͏26 ٲz8q>wt faqN09a"9n]p}u:xH:~ǎĉ%lNiQrtDLHUx|?}[)w5Rgau|2` PQOwp/ >xV ~Q#?!h#a6'8aI>HOY_V2[s]8JeaCZҳ҅{IB7W2ly4iܖWY'uQz754d]8 Wr1ec|saQۆyf(zC?'g?ٖnTw=mܴW '> ]=P~4@%raJUk RH@,mDy)cuJga 6(C,4n1kMJѪp`eq >#+ChDn3 ?(E$`b'š&qŧo۰4,erGT>T Rኧy”Y,<ZO+Nx Sr) 9׿ ݁5h ~-!g >6f{dޒ>nsx۴ʰUJ&F(u{uq2>cqb \ pP,!)Aք |I<+H,8 |, 6{gȖ|XD`)b z)I ibУ Qf G"Z7o:Mn 3}M| emظb4i o <ȖoA2X0Oxu FXk\e =tr0&!c|ZBUMQ0Vҥ܇86_ kzZ,MWx@R Pk]T0/9L3FfxzBS|F&F4µ< 6Ӱl oDk~4G|h6n*3 ȱr3 ~ pT>5~]Gg_5пK,IL$b)- r( /yHҚ(). >9J N%`;v.Ojd-|+_qs{KRIi;_~kn]\Am mƊt)Jb!*eIŠU ?f| lm2/ˡc z[@.bm=)/BC^/ǠzN (P;r_y \ǏaKxOddfP ʫ]PGK 71>xYI/\Uta fÂru E(kl&ה.ȗ6t1Ď_zAaÆC+3 shþpbq̓0pQJh/| 6JJ4GRZ$Rŷ>‹@qjùtsҙt~:k~4sj?ټ|O 24aK`a%_q,̄{ [ƟCU0NL'o\N_3\Qg @rihԕơd!~(yaZZ sD7%H1M90W?hMOie@GşxG}'s?bBSukz{#ABi~`Űg>S\H' aI4Si&g\nAr]~nۺl0wxeєqi п7i@(O]n$Ľj@4؄r i9+2]9O}; @l]mg<ΈR~e_ǡ}n% fWID _LE&x$L %b4H~ 2y3]0qgYL>`'ߝɺ}$^V춱ky pqM<>vH<.ZBo $o^ (- #~FPf3f?Cν7Cهw6{en7J=nscnvlFIܒ `_q,aQ!tֹEdXLO48mbo ᡡdc_aS\}6kXAUrm@JFCz-Bj O[|sWlun|}ٱج(4z\Բߜ۹s;s8Yc#&ⱜT2FbH` fӊgQ8QMXpB\~=9]G=x)UJŊcGoA*7DV0n4yKP(֤t M߮$ E_[i;>ڂJ߇qU ~?Ё?w;w]h ҩq~!"O)~H$ib$'G}o&i7I=ɨcӿ n*97rg7Oo>2u#`, $/}I4]*3*# ŋ<7*SȃNyWX8Ϻ3 ~:7M,2W?/&o+X~ .u Ϻ?|8ǔVvt9@mKȟ$_GZN`p$$\`8"Aǰ:eTs!-0/vIqZ˹U,*{U.L[3.p|jAK4T W2t!Á6"I ba!<{A}ͺurv0N{^{][?V=ή[a-Uwǧi+W!k 3DsE /YjA!1)([Ra]򠩉!T犿&pa)m]0P؂Z93(Av\M:rN_rq[x_T=N$+aڨh.)[,8֭wxKHSS<ۆAB.~ݛ3Cl i+˩7 *C6xQ`G.NA?±QE,E>L OWP˗kl~ć~RuvZ182rK'_Bq?qOeȌʳBKE\L }O߼7߻>}sn^wQ,7HKqVأC7zI@C9R}՚u0h611!s<Ƈe PLPZ%>뒩7 8W?V2R?UGmg݋&0q/wUV*X/{'~B. o} ?&{ {ğu}N5V9 Rͭ#̀ ɏKic6NS/AoS|Td|<9S\2DG+ g=U4݋&FCa6*=b41ex;(kP},)nOWzz jfDpB9[oϟ6} adm1=T,!B$E|Jy )CJ;6xyy4^۠4b*zp"Qx仞s8uX|K ˧xba[;[Mܜc=ڗ1KJwbOU5`,۟+)pFch0NUGaXq["*SRrwJ J0N.;8 *3ܝPwRKųCcpeyCwjp[ cn/d[̅@=2Օ NCx݋yi 6n][צU?3h_#@PUo&6 $~L+( @DXvZsڻo{Tz:Y  6߬oʛp}b:t57:W|fYp H  { BX./5~}8r?Ϭ۰~CU̠UpPtb 8{>ZWe @V(st<.)uMK|KyS8nc先_y~g>L QOxOLZ 4ܝxc} Kqݏ |3QMޜˡdWj @M/X~YoI8L5}C!mo I;]-/N_:2OohC h]S~Lꊚ@|n% 8 t&3܂1 TS|ndJ|cPruzi_Wǫ$$k>g#g? |ooM8ǔԵuhr8I!MF$W?86ByUz%dSW-xOT;?s&T@cqNNͻ#8w.7(t^B+J}NܢVҀ8K=5cGa2 +; l@xf [+?V%:FWcվIi2ȷ~Ӷ<X]Rmf >˛a"yڱ]Ƅy~;=1O i~,5%ʹN'ҵkVW;Qf&Ǟ| O*$ 'ƿ.!ܖ93uoV{q|oV݊ϟľ.A'|$oOf:hh Sytˍ{jGt#?˵\xk)TI %puQh.n㗛uOhj}bOi˺:צr;vB)AX,18}DM]+ci!<]0P֬\]mD'+:ĮA)DyA5> sƟΤto%N@(ϨK4 c?Pرv`l?m8_yɧšJ]hA3(u @'k'DNR~Nqs֐c-S|ӫ2t];k85vAQhxb$Vح(d=% RŤ|'|{rFtƉSZɟ<D0li1 õ8} w 8uޭ`odx7Fdo\ϐe T .Se! 7=yel9Q _`9NE8Ț14% 5&Bwi;zZR;M%採'(2}o; ;Y3odYm"ZI!-KJseZ{;3̲I^]CR{t6sW=lİ#òe𓀒@08}fczy)>k5#w& Kz0S!N%vuwJX4j‰g5 ! $p96z{:F2'D+dء4> 9ʥWg7K<~28gs<mPg+WSb6a^}붭n^mǧNt*oG|:q{0خa04ܖ^?;|/㤍աGU?x;QvU5?~I!tƥD3s70,Q(]|;!l!|3!O,"J eZpwa|=R  @XoNVN],<|3}j>9T#8IޡL,xHiϘP(5ki95T~.cWcK{oذ^:x)mn~8 hԷ,agEqjtثeƱ[L7`eqX\f2S@-? , wXU߁w6zw7n =Y2P.xBI I4x-;b`d9I#m PF[ǖ01sTS'}},+|&h°_IE7$HMtNҏӼ/_.'/&{ٙNqW/.g(y&(K:hMןGL fF9ǾwZpת𖻋4`lhr.w;,)tF%F"QM(;I=m@F&v3qW~U8`ʏ,hSk׮맫s07Po0)CFBGZYKB $ƋsoppЭ&{쩟ǷumgQgs!]P*u.VI4 %CT*H 6z[jɰa+:jK6סM%a<W2 u=̋:Ov ,S&$W+e$rBӊBr +-3ͧσ1I$}vuprI&/ ; lFta &9iS,Jqn/ e @) C 3cUZ.(B KYBe.ķ0C7=֧[?iz 7wP)7=x$(=@Q$Lz$ H% G*i  /x/}#uBwZzVq0X=}:0z?j{h:X!/? &UqSr 8Hv &֩19f8XO;zPsi@]Q](}R Ux,WX鰱W) A0\xy`\"Ӣyܼ@%\Octpçِ` #Bp)H5^zZlU bB4+#Ʋ) y؀)4Zi[ΜEF |fA{|}a6D+56it۱,fR4mD>}l+\3qm"?`y5Q_hgv锔X 7*Bn2趉16D3LR\bu㩬¬?(?Zүjup/YѼv,f]!qUJ|pjV #61 *t&ASv)3#)lޕeLa d06q> 2T{\DքG@7c)t_}Zu32peQ ˿?GʯqCzK_{?_qu/Gyf|_qs KV@39ǡ(xpC84\qò #GcG, Y$ = qL$&_.XF{vm "-LfyҮ9$4 $ٰx]C@F> \7ĵ>g~Ou>t`5 1,{gٸֱ2,İj>F 6v`#o{$iDfy7~Ӑ 2yh(mxh\diT= )(Ki4K37Ϯ8_"O|"( w`N%LlR坃9拵{E_@Q9w yjƃTQrwDl=XӉhfD xy:ck 뢂>Whؘ{y6{9aP aUѯ5K&~yPraz*`ƎRq#.o(LCI"f[EPc\EmqHذ^)פ ax!{u,hm#`㳣Bg @Bg"Ro9rִ n\NUI0H(,qr4#+G0r\Tn8sHx0:o@v@OYՕ>'%+CPK ֦%ΣsR_O>)셥E,{ 'ߔ\vP! (͐H"="T8NەArH0'4IJo'+7 { Ca A"f~r@ŕ8>@$u"0k>_4QXdjl~ق׫oV':?c ;k,ӒKoWF sAc:C0 sN[.<h_Gx"u蕇3d5H-Z dsQmt x3/7%4>RG x' <1K"2u ֽP:2cq' 61izɉ^ːw+<#`ll5ֺu ^?Gt=es7S U\X-39?LoGѣ#>al? !"<ڑ-`؆(x#ReQP(t3( B ĔY^Rx*ƟOdӕ8|Afa.V{v@ڒƧ/@F aNet!>~4hdHLLi4f z1df<6vB8TzuUM_n}eZ=[70rh] =PP5~;ĞyO9]1pR74@׃#˦47Ve\1lgX>Fld7#ҝ~p-H> +q .#6@/]F:*7tKF*WEDrHlD۵:|j }6hG}a"v: `YrT}?o oF]R<ڌ!qnP;,vSp56y!W>z1[E`y !x4N5X%+S,*=q=>s 8 i-u8mGLZ3'8HA  zFlw-[I@m[[]~&RRX9]jO${.bU t XPթ -7o` ~].#!R>?o-7! t % 8h}"u580l=2L8㾓7,:mr6eo\\|y'p5Y^db)+ y|'ѩ1y:Hj<Ⱦee5&>UZqw80ӖKOO :g>O S@I2y5AVn ?$&9wmĕyQE(W </aHr^ˉ'˗/h{umcyDU6:k4f3R"'&<-/77psS)۬҅¥e tUUؼq.—KOӘřzwĭN_N#q5R.}__#sm+p+glm=FPQ69/aWcؠ;r|B#Sm)T8UԓN(ztg/ʯT;wi}/_/Wjuˌo!\m1!zYHb!]6[^咬d*N\ &i!lX0 -'~7Y6i]̼rv,h/\Jgy9FX+c-eA-p޻∓ҖBӺMx 7en͜:"kip<&7OPCB p]C`қ p3X);M/+ד "1l][l<{sn[fiJxmwG.F D1 .~AOq['>쏚 aĦ [3JÉQ5Ѱ+iy jli{3WP<1Wnߠ X52J)>}Z.,^iJxQ@xuų/c;QZ+ ;UoP)(0JyL4.()g#pMjI}۞bn1Tf{b`d?qN yjajp.^<fANԚ ;eP p d ( ,[tM9}4N~s'e~9 -җm:IF mo{g}t ҥ"Q ymi5}Kxe렄.Յ̛bzʃlD<\wMls>Oe.'e~hp΍KqN-vARDԏ$]Ԃ|Xdx"cOrDo| owފ}ѩjnT.nV_[_7 "2x&S>-şOPgjwbK10@؜KW/;[m3)qmVB v$X7xxdrwd(̑^xY^7nj<ݻGdv1,ӆNIr]Ke)-PBKr'ilGEN<#m*wnkVoXkk9<űR+ (ο U-ΰNo6h90.kxsaLcq~3?Vh\Z7>8=RCh| ב(e,zufުwhkq_/S(aZd,^Ks,^s診N8 yȳʟS׉oq,qy54XV>)ekފnsitf!8lM~-MTEfL  k֑0ge\j4Xt+Ukܧ|` @`\ф8ؽss\ +Aeh3rCC@ IOQ<5(Tahհg~o8C0V̥ZVފ0gRuk[iKiT[H˨&NGI9<\2`y? G W~55T8aBZ;E!( 8#.Kk#$NS Ð|O~?oގOelPy=)2@@PK\|@5i[Dpܯ; Jo~:+M_@)z)n[]P~MgF*0Mq)ft| 4VLCz)7j*t xj\WGo\gZw3RΖԅGI ]:!,T&y֋yKyLIKrjhg\ԉp6%O>oGaz|x  'Pp=oD%<|gpKaB^MĜs!\S `A{@|tJuϾT^l׵JLoO7ş QW7GWեPɫFӯea[z0h75\ɎKC/!Xž٢{1k]._Z#zW uQL$w[,l|uzʿ[zٔb8RαL@,)t +, SWfϫmxNy-3(!%D([z,@c~(g$ ROS<{KOu<¹p+׿Ͳ]~j$M&D,` ^uLη3H R&C4m--2n^4j!9(:m;pǟaw#C0L䠹\}4ɤ.\MfXS5k֭sJjr8hf]PܽgwDr\4ZWغWՃ y 3P,u 5;Zs ̢w6Yaeqe}?zp/ P4vJc*l\!|'-T娔h,_"Zjνg>]/nJ݀/_R]Hw\zwuԯ[~HVP1mʫUQK/aeT6v ܥ n_MN!fh wwUq|Y1CȽq`ʁu+}? ,u7f_:o6pZlʬ+54eYh///BJ6G¡Gɥӿת@lk甗/\zGLl!yr`}(maI"T~r~@@MSaaR$7њ ߇ft|!~iLy +0E'2z`O{1G]7^R@I#;5" lvL7~Mi2abm mw8Yޱ+-|Wlxgج[8mƫX|gqNn!F3>!8CAuO떳Z4b,kT8QU_PTQ<0PY| =' 8OMLNۼ>C.hffХOS'Oe>m:ZR-x[zs-"xgQ@'Q]Cd*>6 R pMm? ٌxu*R؉m-MiX2LmSJm q4R=ԓ9piK› ȋ 0k n>1(>d<%Z-RlřFg(uΩ-Z(73J@ܝ~eZ#q mذ1oqWL6̽WvPJJ(!+ʈҜ^9ǝ~(]W-TSdSUhF.^:u| n#Tk,}"7 wq݅[{Aγb6՜[|mԆK~` O#NRcs?FK nqEyC1K] do^A`oC.dZ3t1pf0ECrK+gZcl=l)F 4`}1i { ҦvfLt⅋-= UR\.Ϝ9cpۘ4MעC!`K<\Ml3wl`LqOo:,[": _zY=|=} xӖMA֔Zt9.N]qJpd4Tx K*Lb̦2v6ܷ_]6+M˯n7K>7K?a =Uu~BW̆’Aj TVBpB~q#.%VʷmoxFts 66x-ha ڥlWqZuKw寋|LrQXRpN`+pk52w w61_7!ܳgȕۤv|cz n8YƄi38mҡ>v\4Ү0spu-NeOm*Pv^rިwMv=oKP:GW[7-CS (kX6 .|K٭KJ^/TY6LX3f4`7&&qX}2a~7nXmƾvҲcI;8B35;Keig_כ׿Cp'm_bՊ"3pw!TB8p_/qm_8m({L `@J+t<l)8.܃c=G>?kE+%ꛞQp[ׇF9t NSB  ݹ5^-[?d(S R04ՃsBˮga99#]˓*.>E]J_2Kw#B9ż67% عC#^+PdfQ@A o=؎ 0&^7iӟa0bħϪeق56Mh \tP)Vr͚d'M}W_y )r f8G{p]lN֎B `b qԣ[9"N-X|՗7y֧_d ˇ6H)ad\|H osqyR~ݘTJR"ss\坺$i5ѥe{PF^HnJ38[If bb yޤ?W~PuX^` @fmhӌR@aQ^V AUzWۊ^c k_TC:+Ϟ?W]Ŏ2KekoS%6?/ugp[xD&#S>q%*_շKU!zCG3"JJy'Oۿi!!}d˥[ Oص 8_pdߖ*L ӥs|W#T r{>k 8 "7$ar_[+0lMNOV0OQ:56341s'212Lpp2~pvN/W4mk}ٔs}sr~؏Eb6V,/ xT546PC曛OP'LAn, Ђ>;?Qt0>];PYx,a%fUںWwտ!O弆>'p> @{dX +i3|csgmܸ Kz(l+"Y!Loq+uVeCd)0 aLd $6c{ۏ r3#V7𙳾:14UoܮN9]we߬e*Xin ]*̳*{w3~3Xlaspi0KVmъSj8NŰ(Oe#XɊGD49oLAI}B\:zNcZ0?dAFG85^?q:Pm,ya,;r?Nf'mL>2!{6 t?{t/.o^V+'d*u$u- f |FޓKmh}J|)(:w) g(?:9Obrb#}r7M=O;Z=ݎ~ދs߁8@ر GJˉ*N.Na#9]녯xUp4r=ӫq}cCdsX* C0&4Zx:: f!6Sw9l7 xgmf& #KtU~vFqO-PWg/b"ƍhgeT|۸sS0Qh9ndR?8vZ-^\;GT$B}GߪQ3C I:%nRfYULG4lQaH'_dw=j+ulo[nmZȫu%%T\hX8+ O90؝qW\>O>]?Luo{񷿽z'Vp_|) eeI_܉_JZ`حզM[׮T..0?0.m &sXt(( 멲Ru%@P@lBo{/gϜ~9_@6cn˶i9}"V9i.s/XFKUS勱jEUK0:|\w~W0W4zjll Jx_;y!%L%v1Rjh0h&|R9` muL~#u,ūٙBZˑ~K ^#7@Ti/՘j ڦ;-YG0p|S.uȑ, 5<-9khT";._49ã?G`>msp;T+}x*6kqdhhSeJ[d@QMJv;0vڳ{Z[7[nWSc }W0# ䷲\,xD1Ox/̡l|693r͚5ծw\/8BQ9e?No^LF4gӊ V.lqhG+Qs;PqA?8"pd0105*;`!hoܼoTNߪ&80N2~"e@`ou/CxwѨGNvpvWG?Ц#&t,`$2i?$6IZ_XJog©SI@J{?m9 ߕBy 4\%Gs_ԅz uRSo"Ɓ`>g.k3ӭ+fRI R<.㽿.!&FyjY&ZLyaΦe=#%]+uHg!nے!5wU;~qqP%Q(9ȯS \Tr]S:ẁxRr(=(:c:+͔(>+*:5يbdԨe14Xi]d1( Ce8qWp; @khƗ%V6KKe KC%pu!{ 4u=g\de#aBf@BDO'QgQ&K| nJ`7XR TV}AȢ,U'UfNFGU7ӑH@&jO|Àw+O~hZ1 5<  fficۨKeqB H J8ڴU kfʣ'V2OS'9ۺ }g>kW9\X/Yfcʱ9#= :_6Xn2ۤhcҐD{rwShS!0x\L\C @rb`]gƳ{ʒ:y Л<N''Emxc݆Xƅn 1XJhi#[\F92sНܫ!8E9[?7Mq|wO^}G~jDSHJrV#da)x& $}6iNxf}9.8Ńk=yҵtQɘpܞBZ_FaquRs@榠ٔ<~0x!(x{ߣ,M[6U@uyO^|u7`iB \dZ\E̐<2Go>J+ׄdr q15&#Y &z0 " PFKyXWf"<}mͷ>un_"[ Kϝ;ljݪs:K\9`soV;\Zό?AW);As*\gL"jĔ)]^]?&Gp`s̀`!ww\cy_YHRR`ďDzNwt> '^Z\N ?d8 \rtbx_ckɩjtCN6lz*~*5UhIDAT9~q4m4;7r* W P… J4HsNNSR`A ;;Vr)=J Z"B!u|]p6ŭJQͱkjh5QKSMVnH+nDތ Hht+9wLձz7@b UhM`|>,&;?36 z+K"w8e/| 1OY ζ[: &6=7b' ]WYH{~ 4a2\KYfuZH_-)8'YG].Srƈ 9/p@3T00u7QH\&1G"33LXILOF+Y~%裏V?8F&-y酗串\ ?HǾO}S}^``~ 4ØO~?ac1( Og?q׭8,c\ݻTƺlV =0`IDm"5PcKiAQ&ޭ4q$ĢG"ܽ2j$_**r%y@f$O]L3Ɓt!)!:77>~znڴڻwo x{ϗ֭͘;?84P}󿙲ˆ// tJ}'qmr_Uۿ}Jl=k-8xvV n2In  al̷;[ʑʼ.@ z(af<"!d D&" wP`[׸MW4Uګq`n&;)LLQJּ׌8EWɱŻr@/n*y@_엾%_O0Vn| SD!8~Q~3< gϝ9h "*u{j9ڙZZr+YLEgqBL |:/eTt 7pt/~R¯*ϧ$߅=K@/ Coq*ݓȎT͡v+Mx{\<@o` DͥIǫ)SVb,%Htruv2r0$ ek7/Yq }{Y%;S~ W'? ek8ۜS`.>r4b\GKTEtAmob!~zeQ\=CoeyjMVZQ;vlQCCsXA;I>~:u4D|0|橁yV~/&^[R]CSk˜Z }[|zͷ yؖ(~un\ '?No-ϛ^m_kxg<\G"R=Gq!IENDB`icnV C CorsixTH-0.63/AnimView/app.cpp000066400000000000000000000027241347163623700161710ustar00rootroot00000000000000/* Copyright (c) 2009 Peter "Corsix" Cawley 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. */ #include "app.h" #include "frmMain.h" #include "frmSprites.h" IMPLEMENT_APP(ThemeHospitalAnimViewApp) bool ThemeHospitalAnimViewApp::OnInit() { wxTopLevelWindow *pForm; if(::wxMessageBox(L"Launch animation viewer? (No -> sprite viewer)", L"AnimView", wxYES_NO) == wxYES) pForm = new frmMain; else pForm = new frmSprites; pForm->Show(true); SetTopWindow(pForm); return true; } CorsixTH-0.63/AnimView/app.h000066400000000000000000000030421347163623700156300ustar00rootroot00000000000000/* Copyright (c) 2009 Peter "Corsix" Cawley 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. */ #pragma once // For compilers that support precompilation, includes "wx/wx.h". #include "wx/wxprec.h" #ifdef __BORLANDC__ #pragma hdrstop #endif // for all others, include the necessary headers (this file is usually all you // need because it includes almost all "standard" wxWidgets headers) #ifndef WX_PRECOMP #include "wx/wx.h" #endif // ---------------------------- class ThemeHospitalAnimViewApp : public wxApp { virtual bool OnInit(); }; DECLARE_APP(ThemeHospitalAnimViewApp) CorsixTH-0.63/AnimView/backdrop.h000066400000000000000000000205671347163623700166500ustar00rootroot00000000000000/* XPM */ static const char *const backdrop_xpm[] = { "126 64 12 1", "f c #695D7D", "c c #6D6D6D", ". c #797979", "j c #3561CA", "i c #797196", "d c #8275A2", "b c #867DAA", "e c Gray51", "a c #8E8E8E", "g c #A29A9E", "h c #AAAAAA", " c None", " .. .. ", " abcccd abcccd ", " abccccccce abccccccce ", " abcfcfcfcfcfcb abcfcfcfcfcfcb ", " agacccccfcfcfcccag agacccccfcfcfcccag ", " eahhhabfcfcfcfcfbahhha eahhhabfcfcfcfcfbahhha ", " eahhhhhhhabfffffbahhhhhhha eahhhhhhhabfffffbahhhhhhha ", " iahhhhhhhhhhha.f.ahhhhhhhhhhha iahhhhhhhhhhha.f.ahhhhhhhhhhha ", " ...hhhhhhhhhhhhh...hhhhhhhhhhhhh.. ...hhhhhhhhhhhhh...hhhhhhhhhhhhh.. ", " abcccdahhhhhhhhhadcccdahhhhhhhhhabcccd abcccdahhhhhhhhhadcccdahhhhhhhhhabcccd ", " abccccccceahhhhhaeccccccceahhhhhabccccccce abccccccceahhhhhaeccccccceahhhhhabccccccce ", " abcfcfcfcfcfcbahgbcfcfcfcfcfcbahabcfcfcfcfcfcb abcfcfcfcfcfcbahgbcfcfcfcfcfcbahabcfcfcfcfcfcb ", " agacccccfcfcfcccagacccccfcfcfcccagacccccfcfcfcccag agacccccfcfcfcccagacccccfcfcfcccagacccccfcfcfcccag ", " eahhhabfcfcfcfcfbahhhabfcfcfcfcfeahhhabfcfcfcfcfbahhha eahhhabfcfcfcfcfbahhhabfcfcfcfcfeahhhabfcfcfcfcfbahhha ", " eahhhhhhhabfffffbahhhhhhhabfffffeahhhhhhhabfffffbahhhhhhha eahhhhhhhabfffffbahhhhhhhabfffffeahhhhhhhabfffffbahhhhhhha ", "iahhhhhhhhhhha.f.ahhhhhhhhhhha.fiahhhhhhhhhhha.f.ahhhhhhhhhhha iahhhhhhhhhhha.f.ahhhhhhhhhhha.fiahhhhhhhhhhha.f.ahhhhhhhhhhha", ".hhhhhhhhhhhhh...hhhhhhhhhhhhh...hhhhhhhhhhhhh...hhhhhhhhhhhhhjj.hhhhhhhhhhhhh...hhhhhhhhhhhhh...hhhhhhhhhhhhh...hhhhhhhhhhhhh", " ahhhhhhhhhadcccdahhhhhhhhhabcccdahhhhhhhhhadcccdahhhhhhhhhjjccjjahhhhhhhhhadcccdahhhhhhhhhabcccdahhhhhhhhhadcccdahhhhhhhhh ", " ahhhhhaeccccccceahhhhhabccccccceahhhhhaeccccccceahhhhhjjccccccjjahhhhhaeccccccceahhhhhabccccccceahhhhhaeccccccceahhhhh ", " ahgbcfcfcfcfcfcbahabcfcfcfcfcfcbahgbcfcfcfcfcfcbahjjcfcfcfcfcfjjahgbcfcfcfcfcfcbahabcfcfcfcfcfcbahgbcfcfcfcfcfcbah ", " acccccfcfcfcccagacccccfcfcfcccagacccccfcfcfcccjjacccccfcfcfcccjjacccccfcfcfcccagacccccfcfcfcccagacccccfcfcfccc ", " bfcfcfcfcfeahhhabfcfcfcfcfbahhhabfcfcfcfcfjjhhhabfcfcfcfcfbahhjjbfcfcfcfcfeahhhabfcfcfcfcfbahhhabfcfcfcfcf ", " bfffffeahhhhhhhabfffffbahhhhhhhabfffffjjhhhhhhhabfffffbahhhhhhjjbfffffeahhhhhhhabfffffbahhhhhhhabfffff ", " .fiahhhhhhhhhhha.f.ahhhhhhhhhhha.fjjhhhhhhhhhhha.f.ahhhhhhhhhhjj.fiahhhhhhhhhhha.f.ahhhhhhhhhhha.f ", " .hhhhhhhhhhhhh...hhhhhhhhhhhhhjj.hhhhhhhhhhhhh...hhhhhhhhhhhhhjj.hhhhhhhhhhhhh...hhhhhhhhhhhhh ", " ahhhhhhhhhadcccdahhhhhhhhhjjcccdahhhhhhhhhadcccdahhhhhhhhhabccjjahhhhhhhhhadcccdahhhhhhhhh ", " ahhhhhaeccccccceahhhhhjjccccccceahhhhhaeccccccceahhhhhabccccccjjahhhhhaeccccccceahhhhh ", " ahgbcfcfcfcfcfcbahjjcfcfcfcfcfcbahgbcfcfcfcfcfcbahabcfcfcfcfcfjjahgbcfcfcfcfcfcbah ", " acccccfcfcfcccjjacccccfcfcfcccagacccccfcfcfcccagacccccfcfcfcccjjacccccfcfcfccc ", " bfcfcfcfcfjjhhhabfcfcfcfcfbahhhabfcfcfcfcfeahhhabfcfcfcfcfbahhjjbfcfcfcfcf ", " bfffffjjhhhhhhhabfffffbahhhhhhhabfffffeahhhhhhhabfffffbahhhhhhjjbfffff ", " .fjjhhhhhhhhhhha.f.ahhhhhhhhhhha.fiahhhhhhhhhhha.f.ahhhhhhhhhhjj.f ", " ..jjhhhhhhhhhhhh...hhhhhhhhhhhhh...hhhhhhhhhhhhh...hhhhhhhhhhhjj.. ", " abcccdjjhhhhhhhhadcccdahhhhhhhhhabcccdahhhhhhhhhadcccdahhhhhhhjjabcccd ", " abcccccccejjhhhhaeccccccceahhhhhabccccccceahhhhhaeccccccceahhhjjabccccccce ", " abcfcfcfcfcfcbjjgbcfcfcfcfcfcbahabcfcfcfcfcfcbahgbcfcfcfcfcfcbjjabcfcfcfcfcfcb ", " agacccccfcfcfcccagjjccccfcfcfcccagacccccfcfcfcccagacccccfcfcfcjjagacccccfcfcfcccag ", " eahhhabfcfcfcfcfbahhhajjcfcfcfcfeahhhabfcfcfcfcfbahhhabfcfcfcfjjeahhhabfcfcfcfcfbahhha ", " eahhhhhhhabfffffbahhhhhhhajjffffeahhhhhhhabfffffbahhhhhhhabfffjjeahhhhhhhabfffffbahhhhhhha ", " iahhhhhhhhhhha.f.ahhhhhhhhhhhajjiahhhhhhhhhhha.f.ahhhhhhhhhhhajjiahhhhhhhhhhha.f.ahhhhhhhhhhha ", " ...hhhhhhhhhhhhh...hhhhhhhhhhhhh..jjhhhhhhhhhhhh...hhhhhhhhhhhjj...hhhhhhhhhhhhh...hhhhhhhhhhhhh.. ", " abcccdahhhhhhhhhadcccdahhhhhhhhhabcccdjjhhhhhhhhadcccdahhhhhhhjjabcccdahhhhhhhhhadcccdahhhhhhhhhabcccd ", " abccccccceahhhhhaeccccccceahhhhhabcccccccejjhhhhaeccccccceahhhjjabccccccceahhhhhaeccccccceahhhhhabccccccce ", " abcfcfcfcfcfcbahgbcfcfcfcfcfcbahabcfcfcfcfcfcbjjgbcfcfcfcfcfcbjjabcfcfcfcfcfcbahgbcfcfcfcfcfcbahabcfcfcfcfcfcb ", " agacccccfcfcfcccagacccccfcfcfcccagacccccfcfcfcccagjjccccfcfcfcjjagacccccfcfcfcccagacccccfcfcfcccagacccccfcfcfcccag ", " eahhhabfcfcfcfcfbahhhabfcfcfcfcfeahhhabfcfcfcfcfbahhhajjcfcfcfjjeahhhabfcfcfcfcfbahhhabfcfcfcfcfeahhhabfcfcfcfcfbahhha ", " eahhhhhhhabfffffbahhhhhhhabfffffeahhhhhhhabfffffbahhhhhhhajjffjjeahhhhhhhabfffffbahhhhhhhabfffffeahhhhhhhabfffffbahhhhhhha ", "iahhhhhhhhhhha.f.ahhhhhhhhhhha.fiahhhhhhhhhhha.f.ahhhhhhhhhhhajjiahhhhhhhhhhha.f.ahhhhhhhhhhha.fiahhhhhhhhhhha.f.ahhhhhhhhhhha", ".hhhhhhhhhhhhh...hhhhhhhhhhhhh...hhhhhhhhhhhhh...hhhhhhhhhhhhh .hhhhhhhhhhhhh...hhhhhhhhhhhhh...hhhhhhhhhhhhh...hhhhhhhhhhhhh", " ahhhhhhhhhadcccdahhhhhhhhhabcccdahhhhhhhhhadcccdahhhhhhhhh ahhhhhhhhhadcccdahhhhhhhhhabcccdahhhhhhhhhadcccdahhhhhhhhh ", " ahhhhhaeccccccceahhhhhabccccccceahhhhhaeccccccceahhhhh ahhhhhaeccccccceahhhhhabccccccceahhhhhaeccccccceahhhhh ", " ahgbcfcfcfcfcfcbahabcfcfcfcfcfcbahgbcfcfcfcfcfcbah ahgbcfcfcfcfcfcbahabcfcfcfcfcfcbahgbcfcfcfcfcfcbah ", " acccccfcfcfcccagacccccfcfcfcccagacccccfcfcfccc acccccfcfcfcccagacccccfcfcfcccagacccccfcfcfccc ", " bfcfcfcfcfeahhhabfcfcfcfcfbahhhabfcfcfcfcf bfcfcfcfcfeahhhabfcfcfcfcfbahhhabfcfcfcfcf ", " bfffffeahhhhhhhabfffffbahhhhhhhabfffff bfffffeahhhhhhhabfffffbahhhhhhhabfffff ", " .fiahhhhhhhhhhha.f.ahhhhhhhhhhha.f .fiahhhhhhhhhhha.f.ahhhhhhhhhhha.f ", " .hhhhhhhhhhhhh...hhhhhhhhhhhhh .hhhhhhhhhhhhh...hhhhhhhhhhhhh ", " ahhhhhhhhhadcccdahhhhhhhhh ahhhhhhhhhadcccdahhhhhhhhh ", " ahhhhhaeccccccceahhhhh ahhhhhaeccccccceahhhhh ", " ahgbcfcfcfcfcfcbah ahgbcfcfcfcfcfcbah ", " acccccfcfcfccc acccccfcfcfccc ", " bfcfcfcfcf bfcfcfcfcf ", " bfffff bfffff ", " .f .f " }; CorsixTH-0.63/AnimView/frmMain.cpp000066400000000000000000000733021347163623700170020ustar00rootroot00000000000000/* Copyright (c) 2009 Peter "Corsix" Cawley 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. */ #include "frmMain.h" #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "backdrop.h" BEGIN_EVENT_TABLE(frmMain, wxFrame) EVT_BUTTON(ID_LOAD , frmMain::_onLoad) EVT_BUTTON(ID_BROWSE , frmMain::_onBrowse) EVT_BUTTON(ID_FIRST_ANIM, frmMain::_onFirstAnim) EVT_BUTTON(ID_PREV_ANIM , frmMain::_onPrevAnim) EVT_BUTTON(ID_NEXT_ANIM , frmMain::_onNextAnim) EVT_BUTTON(ID_LAST_ANIM , frmMain::_onLastAnim) EVT_BUTTON(ID_PREV_FRAME, frmMain::_onPrevFrame) EVT_BUTTON(ID_NEXT_FRAME, frmMain::_onNextFrame) EVT_BUTTON(ID_PLAY_PAUSE, frmMain::_onPlayPause) EVT_BUTTON(ID_SEARCH_LAYER_ID, frmMain::_onSearchLayerId) EVT_BUTTON(ID_SEARCH_FRAME, frmMain::_onSearchFrame) EVT_BUTTON(ID_SEARCH_SOUND, frmMain::_onSearchSoundIndex) EVT_LISTBOX(ID_SEARCH_RESULTS, frmMain::_onGotoSearchResult) EVT_RADIOBUTTON(ID_GHOST_0, frmMain::_onGhostFileChange) EVT_RADIOBUTTON(ID_GHOST_1, frmMain::_onGhostFileChange) EVT_RADIOBUTTON(ID_GHOST_2, frmMain::_onGhostFileChange) EVT_RADIOBUTTON(ID_GHOST_3, frmMain::_onGhostFileChange) EVT_SPINCTRL(wxID_ANY, frmMain::_onGhostIndexChange) EVT_TEXT(ID_ANIM_INDEX, frmMain::_onAnimChar) EVT_TIMER(ID_TIMER_ANIMATE, frmMain::_onTimer) EVT_CHECKBOX(ID_DRAW_MOOD, frmMain::_onToggleDrawMood) EVT_CHECKBOX(ID_DRAW_COORDINATES, frmMain::_onToggleDrawCoordinates) END_EVENT_TABLE() frmMain::frmMain() : wxFrame(NULL, wxID_ANY, L"Theme Hospital Animation Viewer") { wxSizer* pMainSizer = new wxBoxSizer(wxHORIZONTAL); wxSizer* pSidebarSizer = new wxBoxSizer(wxVERTICAL); #define def wxDefaultPosition, wxDefaultSize wxStaticBoxSizer *pThemeHospital = new wxStaticBoxSizer(wxHORIZONTAL, this, L"Theme Hospital"); pThemeHospital->Add(new wxStaticText(this, wxID_ANY, L"Directory:"), 0, wxALIGN_CENTER_VERTICAL | wxALL, 1); pThemeHospital->Add(m_txtTHPath = new wxTextCtrl(this, wxID_ANY, L"", def, wxTE_CENTRE), 1, wxALIGN_CENTER_VERTICAL | wxALL, 1); pThemeHospital->Add(new wxButton(this, ID_BROWSE, L"Browse..."), 0, wxALIGN_CENTER_VERTICAL | wxALL, 1); pThemeHospital->Add(new wxButton(this, ID_LOAD, L"Load"), 0, wxALIGN_CENTER_VERTICAL | wxALL, 1); pSidebarSizer->Add(pThemeHospital, 0, wxEXPAND | wxALL, 0); wxStaticBoxSizer *pPalette = new wxStaticBoxSizer(wxVERTICAL, this, L"Palette"); wxBoxSizer *pPaletteTop = new wxBoxSizer(wxHORIZONTAL); pPaletteTop->Add(new wxRadioButton(this, ID_GHOST_0, L"Standard"), 1); pPaletteTop->Add(new wxRadioButton(this, ID_GHOST_1, L"Ghost 1"), 1); pPaletteTop->Add(new wxRadioButton(this, ID_GHOST_2, L"Ghost 2"), 1); pPaletteTop->Add(new wxRadioButton(this, ID_GHOST_3, L"Ghost 66"), 1); m_iGhostFile = 0; m_iGhostIndex = 0; pPalette->Add(pPaletteTop, 0, wxEXPAND | wxALL, 1); pPalette->Add(new wxSpinCtrl(this, wxID_ANY, wxEmptyString, def, wxSP_ARROW_KEYS | wxSP_WRAP, 0, 255), 0, wxALIGN_CENTER | wxALL, 1); pSidebarSizer->Add(pPalette, 0, wxEXPAND | wxALL, 0); wxStaticBoxSizer *pAnimation = new wxStaticBoxSizer(wxHORIZONTAL, this, L"Animation"); pAnimation->Add(new wxButton(this, ID_FIRST_ANIM, L"<<", def, wxBU_EXACTFIT), 0, wxALIGN_CENTER_VERTICAL | wxALL, 1); pAnimation->Add(new wxButton(this, ID_PREV_ANIM, L"<", def, wxBU_EXACTFIT), 0, wxALIGN_CENTER_VERTICAL | wxALL, 1); pAnimation->Add(m_txtAnimIndex = new wxTextCtrl(this, ID_ANIM_INDEX, L"0", def, wxTE_CENTRE), 1, wxALIGN_CENTER_VERTICAL | wxALL, 1); pAnimation->Add(new wxStaticText(this, wxID_ANY, L"of"), 0, wxALIGN_CENTER_VERTICAL | wxALL, 1); pAnimation->Add(m_txtAnimCount = new wxTextCtrl(this, wxID_ANY, L"?", def, wxTE_CENTRE | wxTE_READONLY), 1, wxALIGN_CENTER_VERTICAL | wxALL, 1); pAnimation->Add(new wxButton(this, ID_NEXT_ANIM, L">", def, wxBU_EXACTFIT), 0, wxALIGN_CENTER_VERTICAL | wxALL, 1); pAnimation->Add(new wxButton(this, ID_LAST_ANIM, L">>", def, wxBU_EXACTFIT), 0, wxALIGN_CENTER_VERTICAL | wxALL, 1); pSidebarSizer->Add(pAnimation, 0, wxEXPAND | wxALL, 0); wxStaticBoxSizer *pFrame = new wxStaticBoxSizer(wxHORIZONTAL, this, L"Frame"); pFrame->Add(new wxButton(this, ID_PREV_FRAME, L"<", def, wxBU_EXACTFIT), 0, wxALIGN_CENTER_VERTICAL | wxALL, 1); pFrame->Add(m_txtFrameIndex = new wxTextCtrl(this, wxID_ANY, L"0", def, wxTE_CENTRE), 1, wxALIGN_CENTER_VERTICAL | wxALL, 1); pFrame->Add(new wxStaticText(this, wxID_ANY, L"of", def, wxALIGN_CENTRE), 0, wxALIGN_CENTER_VERTICAL | wxALL, 1); pFrame->Add(m_txtFrameCount = new wxTextCtrl(this, wxID_ANY, L"?", def, wxTE_CENTRE | wxTE_READONLY), 1, wxALIGN_CENTER_VERTICAL | wxALL, 1); pFrame->Add(new wxButton(this, ID_NEXT_FRAME, L">", def, wxBU_EXACTFIT), 0, wxALIGN_CENTER_VERTICAL | wxALL, 1); pFrame->Add(m_btnPlayPause = new wxButton(this, ID_PLAY_PAUSE, L"Pause"), 1, wxALIGN_CENTER_VERTICAL | wxALL, 1); m_bPlayingAnimation = true; //m_bPlayingAnimation = false; pSidebarSizer->Add(pFrame, 0, wxEXPAND | wxALL, 0); #define ID(layer, id) (ID_LAYER_CHECKS + (layer) * 25 + (id)) wxStaticBoxSizer *pLayer0 = new wxStaticBoxSizer(wxHORIZONTAL, this, L"Layer 0 (Patient Head)"); pLayer0->Add(new wxCheckBox(this, ID(0, 0), L"0"), 0, wxALIGN_CENTER | wxALL, 1); pLayer0->Add(new wxCheckBox(this, ID(0, 2), L"2"), 0, wxALIGN_CENTER | wxALL, 1); pLayer0->Add(new wxCheckBox(this, ID(0, 4), L"4"), 0, wxALIGN_CENTER | wxALL, 1); pLayer0->Add(new wxCheckBox(this, ID(0, 6), L"6"), 0, wxALIGN_CENTER | wxALL, 1); pLayer0->Add(new wxCheckBox(this, ID(0, 8), L"8"), 0, wxALIGN_CENTER | wxALL, 1); pLayer0->Add(new wxCheckBox(this, ID(0, 10), L"10"), 0, wxALIGN_CENTER | wxALL, 1); pLayer0->Add(new wxCheckBox(this, ID(0, 12), L"12"), 0, wxALIGN_CENTER | wxALL, 1); pLayer0->Add(new wxCheckBox(this, ID(0, 14), L"14"), 0, wxALIGN_CENTER | wxALL, 1); pLayer0->Add(new wxCheckBox(this, ID(0, 16), L"16"), 0, wxALIGN_CENTER | wxALL, 1); pLayer0->Add(new wxCheckBox(this, ID(0, 18), L"18"), 0, wxALIGN_CENTER | wxALL, 1); pLayer0->Add(new wxCheckBox(this, ID(0, 20), L"20"), 0, wxALIGN_CENTER | wxALL, 1); pLayer0->Add(new wxCheckBox(this, ID(0, 22), L"22"), 0, wxALIGN_CENTER | wxALL, 1); pSidebarSizer->Add(pLayer0, 0, wxEXPAND | wxALL, 0); wxStaticBoxSizer *pLayer1 = new wxStaticBoxSizer(wxHORIZONTAL, this, L"Layer 1 (Patient Clothes)"); pLayer1->Add(new wxCheckBox(this, ID(1, 0), L"0"), 0, wxALIGN_CENTER | wxALL, 1); pLayer1->Add(new wxCheckBox(this, ID(1, 2), L"2 (A)"), 0, wxALIGN_CENTER | wxALL, 1); pLayer1->Add(new wxCheckBox(this, ID(1, 4), L"4 (B)"), 0, wxALIGN_CENTER | wxALL, 1); pLayer1->Add(new wxCheckBox(this, ID(1, 6), L"6 (C)"), 0, wxALIGN_CENTER | wxALL, 1); pLayer1->Add(new wxCheckBox(this, ID(1, 8), L"8"), 0, wxALIGN_CENTER | wxALL, 1); pLayer1->Add(new wxCheckBox(this, ID(1, 10), L"10"), 0, wxALIGN_CENTER | wxALL, 1); pSidebarSizer->Add(pLayer1, 0, wxEXPAND | wxALL, 0); wxStaticBoxSizer *pLayer2 = new wxStaticBoxSizer(wxHORIZONTAL, this, L"Layer 2 (Bandages / Patient Accessory)"); pLayer2->Add(new wxCheckBox(this, ID(2, 2), L"2 (Head / Alt Shoes)"), 0, wxALIGN_CENTER | wxALL, 1); pLayer2->Add(new wxCheckBox(this, ID(2, 4), L"4 (Arm / Hat)"), 0, wxALIGN_CENTER | wxALL, 1); pLayer2->Add(new wxCheckBox(this, ID(2, 6), L"6"), 0, wxALIGN_CENTER | wxALL, 1); pSidebarSizer->Add(pLayer2, 0, wxEXPAND | wxALL, 0); wxStaticBoxSizer *pLayer3 = new wxStaticBoxSizer(wxHORIZONTAL, this, L"Layer 3 (Bandages / Colour)"); pLayer3->Add(new wxCheckBox(this, ID(3, 0), L"0"), 0, wxALIGN_CENTER | wxALL, 1); pLayer3->Add(new wxCheckBox(this, ID(3, 2), L"2 (? / Yellow)"), 0, wxALIGN_CENTER | wxALL, 1); pLayer3->Add(new wxCheckBox(this, ID(3, 4), L"4 (L Foot / Blue)"), 0, wxALIGN_CENTER | wxALL, 1); pLayer3->Add(new wxCheckBox(this, ID(3, 6), L"6 (? / White)"), 0, wxALIGN_CENTER | wxALL, 1); pLayer3->Add(new wxCheckBox(this, ID(3, 8), L"8 (R Arm)"), 0, wxALIGN_CENTER | wxALL, 1); pLayer3->Add(new wxCheckBox(this, ID(3, 10), L"10 (R Foot)"), 0, wxALIGN_CENTER | wxALL, 1); pSidebarSizer->Add(pLayer3, 0, wxEXPAND | wxALL, 0); wxStaticBoxSizer *pLayer4 = new wxStaticBoxSizer(wxHORIZONTAL, this, L"Layer 4 (Bandages / Repair)"); pLayer4->Add(new wxCheckBox(this, ID(4, 0), L"0"), 0, wxALIGN_CENTER | wxALL, 1); pLayer4->Add(new wxCheckBox(this, ID(4, 2), L"2 (Head / Repair)"), 0, wxALIGN_CENTER | wxALL, 1); pLayer4->Add(new wxCheckBox(this, ID(4, 4), L"4 (L Root)"), 0, wxALIGN_CENTER | wxALL, 1); pLayer4->Add(new wxCheckBox(this, ID(4, 6), L"6"), 0, wxALIGN_CENTER | wxALL, 1); pLayer4->Add(new wxCheckBox(this, ID(4, 8), L"8 (R Arm)"), 0, wxALIGN_CENTER | wxALL, 1); pLayer4->Add(new wxCheckBox(this, ID(4, 10), L"10 (R Foot)"), 0, wxALIGN_CENTER | wxALL, 1); pSidebarSizer->Add(pLayer4, 0, wxEXPAND | wxALL, 0); wxStaticBoxSizer *pLayer5 = new wxStaticBoxSizer(wxHORIZONTAL, this, L"Layer 5 (Staff Head)"); pLayer5->Add(new wxCheckBox(this, ID(5, 0), L"0"), 0, wxALIGN_CENTER | wxALL, 1); pLayer5->Add(new wxCheckBox(this, ID(5, 2), L"2 (W1)"), 0, wxALIGN_CENTER | wxALL, 1); pLayer5->Add(new wxCheckBox(this, ID(5, 4), L"4 (B1)"), 0, wxALIGN_CENTER | wxALL, 1); pLayer5->Add(new wxCheckBox(this, ID(5, 6), L"6 (W2)"), 0, wxALIGN_CENTER | wxALL, 1); pLayer5->Add(new wxCheckBox(this, ID(5, 8), L"8 (B2)"), 0, wxALIGN_CENTER | wxALL, 1); pLayer5->Add(new wxCheckBox(this, ID(5, 10), L"10"), 0, wxALIGN_CENTER | wxALL, 1); pSidebarSizer->Add(pLayer5, 0, wxEXPAND | wxALL, 0); wxStaticBoxSizer *pLayer10 = new wxStaticBoxSizer(wxHORIZONTAL, this, L"Layer 10 (Wall Colour / Smoke)"); pLayer10->Add(new wxCheckBox(this, ID(10, 2), L"2 (Yellow / Smoke)"), 0, wxALIGN_CENTER | wxALL, 1); pLayer10->Add(new wxCheckBox(this, ID(10, 4), L"4 (Blue)"), 0, wxALIGN_CENTER | wxALL, 1); pLayer10->Add(new wxCheckBox(this, ID(10, 6), L"6 (White)"), 0, wxALIGN_CENTER | wxALL, 1); pSidebarSizer->Add(pLayer10, 0, wxEXPAND | wxALL, 0); wxStaticBoxSizer *pLayer11 = new wxStaticBoxSizer(wxHORIZONTAL, this, L"Layer 11 (Wall Colour / Smoke / Screen)"); pLayer11->Add(new wxCheckBox(this, ID(11, 2), L"2 (Yellow / Smoke / On)"), 0, wxALIGN_CENTER | wxALL, 1); pLayer11->Add(new wxCheckBox(this, ID(11, 4), L"4 (Blue)"), 0, wxALIGN_CENTER | wxALL, 1); pLayer11->Add(new wxCheckBox(this, ID(11, 6), L"6 (Green)"), 0, wxALIGN_CENTER | wxALL, 1); pSidebarSizer->Add(pLayer11, 0, wxEXPAND | wxALL, 0); wxStaticBoxSizer *pLayer12 = new wxStaticBoxSizer(wxHORIZONTAL, this, L"Layer 12 (Smoke)"); pLayer12->Add(new wxCheckBox(this, ID(12, 2), L"2 (Smoke)"), 0, wxALIGN_CENTER | wxALL, 1); pSidebarSizer->Add(pLayer12, 0, wxEXPAND | wxALL, 0); wxStaticBoxSizer *pMoodOverlay = new wxStaticBoxSizer(wxVERTICAL, this, L"Overlays"); pMoodOverlay->Add(new wxCheckBox(this, ID_DRAW_MOOD, L"Draw mood overlay"), 0, wxEXPAND | wxALL, 1); wxBoxSizer *pMoodRow = new wxBoxSizer(wxHORIZONTAL); pMoodRow->Add(new wxStaticText(this, wxID_ANY, L"Marker position (click to move it):"), 0, wxEXPAND | wxRIGHT, 2); pMoodRow->Add(m_txtMoodPosition[0] = new wxTextCtrl(this, wxID_ANY, L"{0, 0}"), 1, wxEXPAND | wxRIGHT, 1); pMoodRow->Add(m_txtMoodPosition[1] = new wxTextCtrl(this, wxID_ANY, L"{0, 0, \"px\"}"), 1, wxEXPAND); pMoodOverlay->Add(pMoodRow, 1, wxEXPAND | wxALL, 2); pMoodOverlay->Add(new wxCheckBox(this, ID_DRAW_COORDINATES, L"Draw tile coodinates"), 0, wxEXPAND | wxALL, 0); pSidebarSizer->Add(pMoodOverlay, 0, wxEXPAND | wxALL, 0); m_bDrawMood = false; m_bDrawCoordinates = false; m_iMoodDrawX = 0; m_iMoodDrawY = 0; for(int iLayer = 0; iLayer < 13; ++iLayer) { wxCheckBox *pCheck = wxDynamicCast(FindWindow(ID(iLayer, 0)), wxCheckBox); if(pCheck != NULL) { pCheck->SetValue(true); m_mskLayers.set(iLayer, 0); } } Connect(ID(0, 0), ID(12, 24), wxEVT_COMMAND_CHECKBOX_CLICKED, (wxObjectEventFunction)&frmMain::_onToggleMask); #undef ID wxStaticBoxSizer *pSearch = new wxStaticBoxSizer(wxVERTICAL, this, L"Search"); wxBoxSizer *pSearchButtons = new wxBoxSizer(wxHORIZONTAL); pSearchButtons->Add(new wxButton(this, ID_SEARCH_LAYER_ID, L"Layer/ID"), 0, wxALL, 1); pSearchButtons->Add(new wxButton(this, ID_SEARCH_FRAME, L"Frame"), 0, wxALL, 1); pSearchButtons->Add(new wxButton(this, ID_SEARCH_SOUND, L"Sound"), 0, wxALL, 1); pSearch->Add(pSearchButtons, 0); pSearch->Add(m_lstSearchResults = new wxListBox(this, ID_SEARCH_RESULTS), 1, wxEXPAND | wxALL, 1); wxStaticBoxSizer *pFrameFlags = new wxStaticBoxSizer(wxHORIZONTAL, this, L"Frame Flags"); wxBoxSizer *pFlags1 = new wxBoxSizer(wxVERTICAL); pFlags1->Add(m_txtFrameFlags[0] = new wxTextCtrl(this, wxID_ANY), 0, wxEXPAND | wxALL, 2); pFlags1->Add(m_chkFrameFlags[0] = new wxCheckBox(this, wxID_ANY, L"2^0"), 0, wxEXPAND | wxALL, 2); pFlags1->Add(m_chkFrameFlags[1] = new wxCheckBox(this, wxID_ANY, L"2^1"), 0, wxEXPAND | wxALL, 2); pFlags1->Add(m_chkFrameFlags[2] = new wxCheckBox(this, wxID_ANY, L"2^2"), 0, wxEXPAND | wxALL, 2); pFlags1->Add(m_chkFrameFlags[3] = new wxCheckBox(this, wxID_ANY, L"2^3"), 0, wxEXPAND | wxALL, 2); pFlags1->Add(m_chkFrameFlags[4] = new wxCheckBox(this, wxID_ANY, L"2^4"), 0, wxEXPAND | wxALL, 2); pFlags1->Add(m_chkFrameFlags[5] = new wxCheckBox(this, wxID_ANY, L"2^5"), 0, wxEXPAND | wxALL, 2); pFlags1->Add(m_chkFrameFlags[6] = new wxCheckBox(this, wxID_ANY, L"2^6"), 0, wxEXPAND | wxALL, 2); pFlags1->Add(m_chkFrameFlags[7] = new wxCheckBox(this, wxID_ANY, L"2^7"), 0, wxEXPAND | wxALL, 2); pFrameFlags->Add(pFlags1, 1, wxEXPAND); wxBoxSizer *pFlags2 = new wxBoxSizer(wxVERTICAL); pFlags2->Add(m_txtFrameFlags[1] = new wxTextCtrl(this, wxID_ANY), 0, wxEXPAND | wxALL, 2); pFlags2->Add(m_chkFrameFlags[8] = new wxCheckBox(this, wxID_ANY, L"2^8 (Animation Start)"), 0, wxEXPAND | wxALL, 2); pFlags2->Add(m_chkFrameFlags[9] = new wxCheckBox(this, wxID_ANY, L"2^9"), 0, wxEXPAND | wxALL, 2); pFlags2->Add(m_chkFrameFlags[10] = new wxCheckBox(this, wxID_ANY, L"2^10"), 0, wxEXPAND | wxALL, 2); pFlags2->Add(m_chkFrameFlags[11] = new wxCheckBox(this, wxID_ANY, L"2^11"), 0, wxEXPAND | wxALL, 2); pFlags2->Add(m_chkFrameFlags[12] = new wxCheckBox(this, wxID_ANY, L"2^12"), 0, wxEXPAND | wxALL, 2); pFlags2->Add(m_chkFrameFlags[13] = new wxCheckBox(this, wxID_ANY, L"2^13"), 0, wxEXPAND | wxALL, 2); pFlags2->Add(m_chkFrameFlags[14] = new wxCheckBox(this, wxID_ANY, L"2^14"), 0, wxEXPAND | wxALL, 2); pFlags2->Add(m_chkFrameFlags[15] = new wxCheckBox(this, wxID_ANY, L"2^15"), 0, wxEXPAND | wxALL, 2); pFrameFlags->Add(pFlags2, 1, wxEXPAND); pMainSizer->Add(pSidebarSizer, 0, wxEXPAND | wxALL, 2); wxSizer* pRightHandSizer = new wxBoxSizer(wxVERTICAL); pRightHandSizer->AddSpacer(1); pRightHandSizer->Add(m_panFrame = new wxPanel(this, wxID_ANY, def, wxBORDER_SIMPLE), 0, wxEXPAND | wxALL, 2); m_panFrame->Connect(wxEVT_PAINT, (wxObjectEventFunction)&frmMain::_onPanelPaint, NULL, this); m_panFrame->Connect(wxEVT_LEFT_UP, (wxObjectEventFunction)&frmMain::_onPanelClick, NULL, this); m_panFrame->SetMinSize(m_panFrame->ClientToWindowSize(wxSize(402, 402))); pRightHandSizer->AddSpacer(1); pRightHandSizer->Add(pSearch, 1, wxEXPAND | wxALL, 0); pRightHandSizer->Add(pFrameFlags, 0, wxEXPAND | wxALL, 0); pMainSizer->Add(pRightHandSizer, 1, wxEXPAND | wxALL, 0); SetBackgroundColour(m_btnPlayPause->GetBackgroundColour()); SetSizer(pMainSizer); SetMinSize(ClientToWindowSize(pMainSizer->CalcMin())); SetSize(GetMinSize()); load(); m_tmrAnimate.SetOwner(this, ID_TIMER_ANIMATE); m_tmrAnimate.Start(100); } void frmMain::_onBrowse(wxCommandEvent& WXUNUSED(evt)) { m_txtTHPath->SetValue(::wxDirSelector(L"Choose Theme Hospital root folder", m_txtTHPath->GetValue(), 0, wxDefaultPosition, this)); } void frmMain::_onLoad(wxCommandEvent& WXUNUSED(evt)) { ::wxInitAllImageHandlers(); load(); } void frmMain::load() { wxBusyCursor oBusy; wxString sPath = m_txtTHPath->GetValue(); if(sPath.IsEmpty()) return; if(sPath.Mid(sPath.Len() - 1) != wxFileName::GetPathSeparator()) { sPath += wxFileName::GetPathSeparator(); } if(!wxFileName::DirExists(sPath)) { ::wxMessageBox(L"Theme Hospital path non-existant", L"Load Animations", wxOK | wxICON_ERROR, this); return; } sPath = _getCaseSensitivePath(L"DATA", sPath); sPath += wxFileName::GetPathSeparator(); wxString aPath = _getCaseSensitivePath(L"VSPR-0", sPath); aPath += wxFileName::GetPathSeparator(); m_oAnims.setSpritePath(aPath); if(!m_oAnims.loadAnimationFile(_getCaseSensitivePath(L"VSTART-1.ANI", sPath)) ||!m_oAnims.loadFrameFile(_getCaseSensitivePath(L"VFRA-1.ANI", sPath)) ||!m_oAnims.loadListFile(_getCaseSensitivePath(L"VLIST-1.ANI", sPath)) ||!m_oAnims.loadElementFile(_getCaseSensitivePath(L"VELE-1.ANI", sPath)) ||!m_oAnims.loadTableFile(_getCaseSensitivePath(L"VSPR-0.TAB", sPath)) ||!m_oAnims.loadSpriteFile(_getCaseSensitivePath(L"VSPR-0.DAT", sPath)) ||!m_oAnims.loadPaletteFile(_getCaseSensitivePath(L"MPALETTE.DAT", sPath)) ||!m_oAnims.loadGhostFile(_getCaseSensitivePath(L"../QDATA/GHOST1.DAT", sPath), 1) ||!m_oAnims.loadGhostFile(_getCaseSensitivePath(L"../QDATA/GHOST2.DAT", sPath), 2) ||!m_oAnims.loadGhostFile(_getCaseSensitivePath(L"../QDATA/GHOST66.DAT", sPath), 3)) { ::wxMessageBox(L"Cannot load one or more data files", L"Load Animations", wxOK | wxICON_ERROR, this); } m_oAnims.markDuplicates(); m_txtAnimCount->SetValue(wxString::Format(L"%u", (int)m_oAnims.getAnimationCount())); m_imgBackground.Create(400, 400); { unsigned char* pData = m_imgBackground.GetData(); unsigned char cPrimary = 0xFF; unsigned char cSecondary = 0xE0; for(int y = 0; y < 400; ++y) { for(int x = 0; x < 400; x += 8) { memset(pData, cPrimary , 4 * 3); pData += 4 * 3; memset(pData, cSecondary, 4 * 3); pData += 4 * 3; } if(y % 4 == 3) { cPrimary ^= cSecondary; cSecondary ^= cPrimary; cPrimary ^= cSecondary; } } wxBitmap bmpBackdrop(backdrop_xpm); wxBitmap bmpBackground(m_imgBackground); { wxMemoryDC dcBlit; dcBlit.SelectObject(bmpBackground); dcBlit.DrawBitmap(bmpBackdrop, 78, 170, true); } m_imgBackground = bmpBackground.ConvertToImage(); } _onAnimChange(0); } void frmMain::_onToggleMask(wxCommandEvent& evt) { int iID = evt.GetId() - ID_LAYER_CHECKS; int iLayer = iID / 25; iID %= 25; if(evt.IsChecked()) m_mskLayers.set(iLayer, iID); else m_mskLayers.clear(iLayer, iID); m_panFrame->Refresh(false); } frmMain::~frmMain() { } void frmMain::_onFirstAnim(wxCommandEvent& evt) { if(m_iCurrentAnim > 0) _onAnimChange(0); } void frmMain::_onPrevAnim(wxCommandEvent& evt) { size_t iAnim = m_iCurrentAnim; while(iAnim > 0) { --iAnim; if(!m_oAnims.isAnimationDuplicate(iAnim)) { _onAnimChange(iAnim); break; } } } void frmMain::_onNextAnim(wxCommandEvent& evt) { size_t iAnim = m_iCurrentAnim + 1; while(iAnim < m_oAnims.getAnimationCount()) { if(!m_oAnims.isAnimationDuplicate(iAnim)) { _onAnimChange(iAnim); break; } iAnim++; } } void frmMain::_onLastAnim(wxCommandEvent& evt) { if(m_iCurrentAnim < m_oAnims.getAnimationCount() - 1) _onAnimChange(m_oAnims.getAnimationCount() - 1); } void frmMain::_onAnimChar(wxCommandEvent& evt) { long iAnim; if(evt.GetString().ToLong(&iAnim)) { if(iAnim >= 0 && iAnim < (long)m_oAnims.getAnimationCount()) { _onAnimChange((size_t)iAnim); } } } void frmMain::_onGhostFileChange(wxCommandEvent& evt) { m_iGhostFile = evt.GetId() - ID_GHOST_0; m_oAnims.setGhost(m_iGhostFile, m_iGhostIndex); m_panFrame->Refresh(false); } void frmMain::_onGhostIndexChange(wxSpinEvent& evt) { m_iGhostIndex = evt.GetPosition(); m_oAnims.setGhost(m_iGhostFile, m_iGhostIndex); m_panFrame->Refresh(false); } void frmMain::_onAnimChange(size_t iIndex) { m_iCurrentAnim = iIndex; m_txtAnimIndex->ChangeValue(wxString::Format(L"%u", (int)iIndex)); m_iCurrentFrame = 0; THLayerMask oMask; m_oAnims.getAnimationMask(iIndex, oMask); for(int iLayer = 0; iLayer < 13; ++iLayer) { for(int iId = 0; iId < 32; ++iId) { wxCheckBox *pCheck = wxDynamicCast(FindWindow(ID_LAYER_CHECKS + iLayer * 25 + iId), wxCheckBox); if(pCheck) { pCheck->Enable(oMask.isSet(iLayer, iId)); } } } m_panFrame->Refresh(false); m_txtFrameIndex->SetValue(wxString::Format(L"0")); m_txtFrameCount->SetValue(wxString::Format(L"%u", (int)m_oAnims.getFrameCount(iIndex))); } void frmMain::_onPlayPause(wxCommandEvent& evt) { m_bPlayingAnimation = !m_bPlayingAnimation; if(m_bPlayingAnimation) m_btnPlayPause->SetLabel(L"Pause"); else m_btnPlayPause->SetLabel(L"Play"); } void frmMain::_onPrevFrame(wxCommandEvent& evt) { if(m_oAnims.getAnimationCount() == 0) return; if(m_iCurrentFrame == 0) m_iCurrentFrame = m_oAnims.getFrameCount(m_iCurrentAnim) - 1; else m_iCurrentFrame = (m_iCurrentFrame - 1) % m_oAnims.getFrameCount(m_iCurrentAnim); m_txtFrameIndex->SetValue(wxString::Format(L"%u", m_iCurrentFrame)); m_panFrame->Refresh(false); } void frmMain::_onNextFrame(wxCommandEvent& evt) { if(m_oAnims.getAnimationCount() == 0) return; m_iCurrentFrame = (m_iCurrentFrame + 1) % m_oAnims.getFrameCount(m_iCurrentAnim); m_txtFrameIndex->SetValue(wxString::Format(L"%u", m_iCurrentFrame)); m_panFrame->Refresh(false); } void frmMain::_onTimer(wxTimerEvent& evt) { if(m_bPlayingAnimation) { if(m_oAnims.getAnimationCount() == 0) return; m_iCurrentFrame = (m_iCurrentFrame + 1) % m_oAnims.getFrameCount(m_iCurrentAnim); m_txtFrameIndex->SetValue(wxString::Format(L"%u", (int)m_iCurrentFrame)); m_panFrame->Refresh(false); } } void frmMain::_onToggleDrawMood(wxCommandEvent& evt) { m_bDrawMood = evt.IsChecked(); m_panFrame->Refresh(false); } void frmMain::_onToggleDrawCoordinates(wxCommandEvent& evt) { m_bDrawCoordinates = evt.IsChecked(); m_panFrame->Refresh(false); } void frmMain::_onPanelPaint(wxPaintEvent& evt) { wxPaintDC DC(m_panFrame); wxImage imgCanvas(400, 400, false); if(m_imgBackground.IsOk()) { memcpy(imgCanvas.GetData(), m_imgBackground.GetData(), 400 * 400 * 3); } else { memset(imgCanvas.GetData(), 0xFF, 400 * 400 * 3); } if(!imgCanvas.HasAlpha()) { imgCanvas.InitAlpha(); } for(int iX = 0; iX < 400; ++iX) { for(int iY = 0; iY < 400; ++iY) { //set completely opaque imgCanvas.SetAlpha(iX,iY,(unsigned char)255); } } wxSize oSize; m_oAnims.drawFrame(imgCanvas, m_iCurrentAnim, m_iCurrentFrame, &m_mskLayers, oSize); if(m_bDrawMood) { m_oAnims.drawFrame(imgCanvas, 4048, 0, &m_mskLayers, oSize, m_iMoodDrawX - 1, m_iMoodDrawY - 80); } th_frame_t *pFrame = m_oAnims.getFrameStruct(m_iCurrentAnim, m_iCurrentFrame); uint16_t iFlags = 0; if(pFrame) { iFlags = pFrame->flags; } int iFlags1 = (int)(iFlags & 0xFF); int iFlags2 = (int)(iFlags >> 8); m_txtFrameFlags[0]->SetValue(wxString::Format(L"0x%02x (%03i)", iFlags1, iFlags1)); m_txtFrameFlags[1]->SetValue(wxString::Format(L"0x%02x00 (256 * %03i)", iFlags2, iFlags2)); for(int i = 0; i < 16; ++i) m_chkFrameFlags[i]->SetValue((iFlags & (1 << i)) != 0); wxBitmap bmpCanvas(imgCanvas); DC.DrawBitmap(bmpCanvas, 1, 1, false); // Draw relative tile coordinates if (m_bDrawCoordinates) { for (int i = -1; i <= 1; ++i) { for (int j = -1; j <= 1; ++j) { _drawCoordinates(DC, i, j); } } } } void frmMain::_onPanelClick(wxMouseEvent& evt) { m_iMoodDrawX = evt.GetX() - 143; m_iMoodDrawY = evt.GetY() - 203; { double fX = (double)m_iMoodDrawX; double fY = (double)m_iMoodDrawY; fY = fY / 32.0; fX = fX / 64.0; fY -= fX; fX *= 2.0; fX += fY; m_txtMoodPosition[0]->SetValue(wxString::Format(L"{%.2f, %.2f}", fX, fY)); } m_txtMoodPosition[1]->SetValue(wxString::Format(L"{%i, %i, \"px\"}", m_iMoodDrawX, m_iMoodDrawY)); if(m_bDrawMood) m_panFrame->Refresh(false); } void frmMain::_onSearchLayerId(wxCommandEvent& evt) { int iLayer = ::wxGetNumberFromUser(L"Enter the layer number to search in (0 - 12)", L"Layer:", L"Search for Layer / ID Combo", 0, 0, 13, this); if(iLayer == -1) return; int iID = ::wxGetNumberFromUser(L"Enter the ID number to search for (0 - 24)", L"ID:", L"Search for Layer / ID Combo", 0, 0, 24, this); if(iID == -1) return; m_lstSearchResults->Clear(); wxBusyCursor oBusy; for(size_t i = 0; i < m_oAnims.getAnimationCount(); ++i) { if(m_oAnims.isAnimationDuplicate(i)) continue; THLayerMask mskAnim; m_oAnims.getAnimationMask(i, mskAnim); if(mskAnim.isSet(iLayer, iID)) { m_lstSearchResults->Append(wxString::Format(L"%i", (int)i)); } } } void frmMain::_onSearchFrame(wxCommandEvent& evt) { int iFrame = ::wxGetNumberFromUser(L"Enter the frame number to search for.", L"Frame:", L"Search for frame", 0, 0, 20000, this); if(iFrame == -1) return; m_lstSearchResults->Clear(); wxBusyCursor oBusy; for(size_t i = 0; i < m_oAnims.getAnimationCount(); ++i) { if(m_oAnims.isAnimationDuplicate(i)) continue; if(m_oAnims.doesAnimationIncludeFrame(i, iFrame)) { m_lstSearchResults->Append(wxString::Format(L"%i", (int)i)); } } } void frmMain::_onSearchSoundIndex(wxCommandEvent& evt) { int iFrame = ::wxGetNumberFromUser(L"Enter the sound index to search for.", L"Sound index:", L"Search for sound", 0, 0, 256, this); if(iFrame == -1) return; m_lstSearchResults->Clear(); wxBusyCursor oBusy; for(size_t i = 0; i < m_oAnims.getAnimationCount(); ++i) { if(m_oAnims.isAnimationDuplicate(i)) continue; size_t iCount = m_oAnims.getFrameCount(i); for(size_t j = 0; j < iCount; ++j) { if((m_oAnims.getFrameStruct(i, j)->flags & 0xFF) == iFrame) { m_lstSearchResults->Append(wxString::Format(L"%i", (int)i)); break; } } } } void frmMain::_onGotoSearchResult(wxCommandEvent& evt) { long iAnim; evt.GetString().ToLong(&iAnim); _onAnimChange(iAnim); } void frmMain::_drawCoordinates(wxPaintDC& DC, int i, int j) { int x = 122; // tile (0, 0) text start x-coordinate int y = 226; // tile (0, 0) text start y-coordinate wxString s; s.Printf(_T("(%2d,%2d)"), i, j); DC.DrawText(s, 32 * (i - j) + x, 16 * (i + j - 2) + y); } wxString frmMain::_getCaseSensitivePath(const wxString& sInsensitivePathPart, const wxString& sPath) { bool found; bool cont; if(!wxFileName::IsCaseSensitive()) { return sPath + sInsensitivePathPart; } wxString retStr(sPath); wxStringTokenizer pathTokenizer(sInsensitivePathPart, wxFileName::GetPathSeparator()); while(pathTokenizer.HasMoreTokens()) { wxDir dir(retStr); if(!dir.IsOpened()) { break; } wxString pathPart = pathTokenizer.GetNextToken(); wxString realName; cont = dir.GetFirst(&realName, wxEmptyString, wxDIR_DIRS|wxDIR_FILES|wxDIR_HIDDEN|wxDIR_DOTDOT); found = false; while(cont) { if(realName.Upper() == pathPart.Upper()) { if(retStr.Last() != wxFileName::GetPathSeparator()) { retStr += wxFileName::GetPathSeparator(); } retStr += realName; found = true; break; } cont = dir.GetNext(&realName); } if(!found) { retStr += wxFileName::GetPathSeparator(); retStr += pathPart; break; } } while(pathTokenizer.HasMoreTokens()) { wxString pathPart = pathTokenizer.GetNextToken(); if(retStr.Last() != wxFileName::GetPathSeparator()) { retStr += wxFileName::GetPathSeparator(); } retStr += pathPart; } return retStr; } CorsixTH-0.63/AnimView/frmMain.h000066400000000000000000000102061347163623700164410ustar00rootroot00000000000000/* Copyright (c) 2009 Peter "Corsix" Cawley 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. */ #pragma once #include #include #include #include #include #include #include #include #include #include #include "th.h" //#include class frmMain : public wxFrame { public: frmMain(); ~frmMain(); enum { ID_FIRST_ANIM = wxID_HIGHEST + 1, ID_PREV_ANIM, ID_ANIM_INDEX, ID_NEXT_ANIM, ID_LAST_ANIM, ID_PREV_FRAME, ID_NEXT_FRAME, ID_PLAY_PAUSE, ID_TIMER_ANIMATE, ID_SEARCH_LAYER_ID, ID_SEARCH_FRAME, ID_SEARCH_SOUND, ID_SEARCH_RESULTS, ID_GHOST_0, ID_GHOST_1, ID_GHOST_2, ID_GHOST_3, ID_LOAD, ID_BROWSE, ID_EXPORT, ID_DRAW_MOOD, ID_DRAW_COORDINATES, ID_LAYER_CHECKS, // Must be last ID }; void load(); void export_png(); void exportSpritesPage(bool bComplex, wxString sPath, wxString sFilename, wxString spPath=L"", wxString sPalette=L"MPALETTE.DAT"); //std::vector<_sprite_t> m_vSprites; protected: void _onLoad(wxCommandEvent& evt); void _onBrowse(wxCommandEvent& evt); void _onExport(wxCommandEvent& evt); void _onFirstAnim(wxCommandEvent& evt); void _onPrevAnim(wxCommandEvent& evt); void _onNextAnim(wxCommandEvent& evt); void _onLastAnim(wxCommandEvent& evt); void _onPrevFrame(wxCommandEvent& evt); void _onNextFrame(wxCommandEvent& evt); void _onPlayPause(wxCommandEvent& evt); void _onToggleMask(wxCommandEvent& evt); void _onToggleDrawMood(wxCommandEvent& evt); void _onToggleDrawCoordinates(wxCommandEvent& evt); void _onSearchLayerId(wxCommandEvent& evt); void _onSearchFrame(wxCommandEvent& evt); void _onSearchSoundIndex(wxCommandEvent& evt); void _onGotoSearchResult(wxCommandEvent& evt); void _onAnimChar(wxCommandEvent& evt); void _onGhostFileChange(wxCommandEvent& evt); void _onGhostIndexChange(wxSpinEvent& evt); void _onPanelPaint(wxPaintEvent& evt); void _onPanelClick(wxMouseEvent& evt); void _onTimer(wxTimerEvent& evt); void _onAnimChange(size_t iIndex); void _drawCoordinates(wxPaintDC& DC, int i, int j); wxString _getCaseSensitivePath(const wxString& sInsensitivePathPart, const wxString& sPath); THAnimations m_oAnims; THLayerMask m_mskLayers; wxImage m_imgBackground; wxTimer m_tmrAnimate; size_t m_iCurrentAnim; size_t m_iCurrentFrame; int m_iGhostFile; int m_iGhostIndex; int m_iMoodDrawX; int m_iMoodDrawY; bool m_bPlayingAnimation; bool m_bDrawMood; bool m_bDrawCoordinates; wxButton* m_btnPlayPause; wxButton* m_btnExport; wxTextCtrl* m_txtTHPath; wxTextCtrl* m_txtAnimIndex; wxTextCtrl* m_txtAnimCount; wxTextCtrl* m_txtFrameIndex; wxTextCtrl* m_txtFrameCount; wxTextCtrl* m_txtFrameFlags[2]; wxTextCtrl* m_txtMoodPosition[2]; wxCheckBox* m_chkFrameFlags[16]; wxListBox* m_lstSearchResults; wxPanel* m_panFrame; DECLARE_EVENT_TABLE(); }; CorsixTH-0.63/AnimView/frmSprites.cpp000066400000000000000000000176111347163623700175500ustar00rootroot00000000000000/* Copyright (c) 2009 Peter "Corsix" Cawley 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. */ #include "frmSprites.h" #include #include #include #include #include #include #include BEGIN_EVENT_TABLE(frmSprites, wxFrame) EVT_BUTTON(ID_LOAD, frmSprites::_onLoad) EVT_BUTTON(ID_BROWSE_TABLE, frmSprites::_onBrowseTable) EVT_BUTTON(ID_BROWSE_DATA, frmSprites::_onBrowseData) EVT_BUTTON(ID_BROWSE_PALETTE, frmSprites::_onBrowsePalette) EVT_BUTTON(ID_LOAD_COMPLEX, frmSprites::_onLoadComplex) EVT_BUTTON(ID_NEXT, frmSprites::_onNext) END_EVENT_TABLE() frmSprites::frmSprites() : wxFrame(NULL, wxID_ANY, L"Theme Hospital Sprite Viewer") { wxBoxSizer *pMainSizer = new wxBoxSizer(wxVERTICAL); wxStaticBoxSizer *pFiles = new wxStaticBoxSizer(wxVERTICAL, this, L"Files"); wxFlexGridSizer *pFilesGrid = new wxFlexGridSizer(4, 3, 2, 1); pFilesGrid->AddGrowableCol(1, 1); pFilesGrid->Add(new wxStaticText(this, wxID_ANY, L"Table:"), 0, wxALIGN_CENTER_VERTICAL | wxALIGN_RIGHT); pFilesGrid->Add(m_txtTable = new wxTextCtrl(this, wxID_ANY, L"X:\\ThemeHospital\\hospital\\QData\\Font00V.tab"), 1, wxALIGN_CENTER_VERTICAL | wxEXPAND); pFilesGrid->Add(new wxButton(this, ID_BROWSE_TABLE, L"Browse..."), 0, wxALIGN_CENTER_VERTICAL); pFilesGrid->Add(new wxStaticText(this, wxID_ANY, L"Data:"), 0, wxALIGN_CENTER_VERTICAL | wxALIGN_RIGHT); pFilesGrid->Add(m_txtData = new wxTextCtrl(this, wxID_ANY, L""), 1, wxALIGN_CENTER_VERTICAL | wxEXPAND); pFilesGrid->Add(new wxButton(this, ID_BROWSE_DATA, L"Browse..."), 0, wxALIGN_CENTER_VERTICAL); pFilesGrid->Add(new wxStaticText(this, wxID_ANY, L"Palette:"), 0, wxALIGN_CENTER_VERTICAL | wxALIGN_RIGHT); pFilesGrid->Add(m_txtPalette = new wxTextCtrl(this, wxID_ANY, L"X:\\ThemeHospital\\hospital\\Data\\MPalette.dat"), 1, wxALIGN_CENTER_VERTICAL | wxEXPAND); pFilesGrid->Add(new wxButton(this, ID_BROWSE_PALETTE, L"Browse..."), 0, wxALIGN_CENTER_VERTICAL); pFiles->Add(pFilesGrid, 0, wxEXPAND | wxALL, 1); wxButton *pTmp; pFiles->Add(pTmp = new wxButton(this, ID_LOAD, L"Load Simple"), 0, wxALIGN_CENTER | wxALL, 1); pFiles->Add(pTmp = new wxButton(this, ID_LOAD_COMPLEX, L"Load Complex"), 0, wxALIGN_CENTER | wxALL, 1); pFiles->Add(pTmp = new wxButton(this, ID_NEXT, L"Next"), 0, wxALIGN_CENTER | wxALL, 1); SetBackgroundColour(pTmp->GetBackgroundColour()); pMainSizer->Add(pFiles, 0, wxEXPAND | wxALL, 2); wxStaticBoxSizer *pSprites = new wxStaticBoxSizer(wxVERTICAL, this, L"Sprites"); pSprites->Add(m_panFrame = new MyVScrolled(this), 1, wxEXPAND); pMainSizer->Add(pSprites, 1, wxEXPAND | wxALL, 2); m_panFrame->Connect(wxEVT_PAINT, (wxObjectEventFunction)&frmSprites::_onPanelPaint, NULL, this); SetSizer(pMainSizer); load(true); } frmSprites::~frmSprites() { } void frmSprites::_onLoad(wxCommandEvent& evt) { load(false); } void frmSprites::_onLoadComplex(wxCommandEvent& evt) { load(true); } void frmSprites::_onNext(wxCommandEvent& evt) { wxString s = m_txtTable->GetValue(); while(true) { const wxChar* sc = s.c_str(); for(size_t i = s.Length(); i > 0;) { --i; if('0' <= sc[i] && sc[i] <= '9') { s.SetChar(i, sc[i] + 1); if(sc[i] > '9') { s.SetChar(i, '0'); if(sc[i - 1] == '9') { s.SetChar(i - 1, '0'); return; } s.SetChar(i - 1, sc[i - 1] + 1); } break; } } if(::wxFileExists(s)) { m_txtTable->SetValue(s); return; } } } void frmSprites::load(bool bComplex) { if(!m_oAnims.loadTableFile(m_txtTable->GetValue()) ||!m_oAnims.loadSpriteFile(m_txtData->GetValue().IsEmpty() ? m_txtTable->GetValue().BeforeLast('.')+L".DAT" : m_txtData->GetValue()) ||!m_oAnims.loadPaletteFile(m_txtPalette->GetValue())) { ::wxMessageBox(L"Cannot load files"); return; } m_vSprites.clear(); for(size_t i = 0; i < m_oAnims.getSpriteCount(); ++i) { _sprite_t oSprite; Bitmap* pSpriteBitmap = m_oAnims.getSpriteBitmap(i, bComplex); oSprite.caption = wxString::Format(L"#%i (%ix%i)", (int)i, pSpriteBitmap->getWidth(), pSpriteBitmap->getHeight()); if(pSpriteBitmap->getWidth() * pSpriteBitmap->getHeight() > 0) { wxImage imgSprite(pSpriteBitmap->getWidth(), pSpriteBitmap->getHeight(), false); pSpriteBitmap->blit(imgSprite, 0, 0, NULL, m_oAnims.getPalette(), 0x8000); oSprite.bitmap = wxBitmap(imgSprite); } m_vSprites.push_back(oSprite); } m_panFrame->Refresh(); } void frmSprites::_onPanelPaint(wxPaintEvent& evt) { wxPaintDC dc(m_panFrame); int iAvailableWidth, iAvailableHeight; m_panFrame->GetClientSize(&iAvailableWidth, &iAvailableHeight); int iX = 0; int iTallest = 0; int iTotal = 0; int iY = -m_panFrame->GetVisibleRowsBegin(); for(std::vector<_sprite_t>::iterator itr = m_vSprites.begin(), itrEnd = m_vSprites.end(); itr != itrEnd; ++itr) { wxSize szLabel = dc.GetTextExtent(itr->caption); int iWidth = wxMax(szLabel.GetWidth(), itr->bitmap.IsOk() ? itr->bitmap.GetWidth() : 0); int iHeight = (itr->bitmap.IsOk() ? itr->bitmap.GetHeight() : 0) + szLabel.GetHeight() + 2; if(iWidth + iX > iAvailableWidth) { iY += iTallest; iTotal += iTallest; iX = iTallest = 0; } if (iY + iHeight >= 0 && iY < iAvailableHeight) { dc.DrawText(itr->caption, iX, iY); if(itr->bitmap.IsOk()) dc.DrawBitmap(itr->bitmap, iX, iY + szLabel.GetHeight() + 1); } iTallest = wxMax(iTallest, iHeight); iX += iWidth + 2; } iTotal += iTallest; // Add last row too. // Update the row count if it doesn't match. if (iTotal != m_panFrame->iMyCount) { m_panFrame->iMyCount = iTotal; m_panFrame->SetRowCount(iTotal); } } void frmSprites::_onBrowseTable(wxCommandEvent& WXUNUSED(evt)) { m_txtTable->SetValue(::wxFileSelector(L"Select location of Font00V.tab (DATA)", m_txtTable->GetValue(),L"Font00V.tab",L"tab",L"Tab files (*.tab)|*.[tT][aA][bB]" ,0, this)); } void frmSprites::_onBrowseData(wxCommandEvent& WXUNUSED(evt)) { m_txtData->SetValue(::wxFileSelector(L"Choose Theme Hospital data file", m_txtData->GetValue(),L"",L"dat",L"Dat files (*.dat)|*.[dD][aA][tT]", 0, this)); } void frmSprites::_onBrowsePalette(wxCommandEvent& WXUNUSED(evt)) { m_txtPalette->SetValue(::wxFileSelector(L"Select location of MPalette.dat (QDATA)", m_txtPalette->GetValue(),L"MPalette.dat",L"dat",L"Dat or Pal files (*.dat, *.pal)|*.[dD][aA][tT];*.[pP][aA][lL]", 0, this)); } CorsixTH-0.63/AnimView/frmSprites.h000066400000000000000000000050731347163623700172140ustar00rootroot00000000000000/* Copyright (c) 2009 Peter "Corsix" Cawley 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. */ #pragma once #include #include #include #include #include #include #include #include #include #include "th.h" #include static const int ROW_COUNT = 1000; // Derived class to add scrollbars to the window. class MyVScrolled : public wxVScrolledWindow { public: MyVScrolled(wxWindow *parent) : wxVScrolledWindow(parent, wxID_ANY) { iMyCount = ROW_COUNT; } wxCoord OnGetRowHeight(size_t row) const { return 1; } wxCoord EstimateTotalHeight() const { return iMyCount; } int iMyCount; }; class frmSprites : public wxFrame { public: frmSprites(); ~frmSprites(); enum { ID_LOAD = wxID_HIGHEST + 1, ID_BROWSE_TABLE, ID_BROWSE_DATA, ID_BROWSE_PALETTE, ID_LOAD_COMPLEX, ID_NEXT, }; void load(bool bComplex); protected: struct _sprite_t { wxBitmap bitmap; wxString caption; }; void _onNext(wxCommandEvent& evt); void _onLoad(wxCommandEvent& evt); void _onLoadComplex(wxCommandEvent& evt); void _onPanelPaint(wxPaintEvent& evt); void _onBrowseData(wxCommandEvent& evt); void _onBrowsePalette(wxCommandEvent& evt); void _onBrowseTable(wxCommandEvent& evt); std::vector<_sprite_t> m_vSprites; THAnimations m_oAnims; wxTextCtrl* m_txtTable; wxTextCtrl* m_txtData; wxTextCtrl* m_txtPalette; MyVScrolled* m_panFrame; DECLARE_EVENT_TABLE(); }; CorsixTH-0.63/AnimView/th.cpp000066400000000000000000000410011347163623700160130ustar00rootroot00000000000000/* Copyright (c) 2009 Peter "Corsix" Cawley 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. */ #include "th.h" #include "../common/rnc.h" #include #include #include #include #include #include #include #include static const unsigned char palette_upscale_map[0x40] = { 0x00, 0x04, 0x08, 0x0C, 0x10, 0x14, 0x18, 0x1C, 0x20, 0x24, 0x28, 0x2D, 0x31, 0x35, 0x39, 0x3D, 0x41, 0x45, 0x49, 0x4D, 0x51, 0x55, 0x59, 0x5D, 0x61, 0x65, 0x69, 0x6D, 0x71, 0x75, 0x79, 0x7D, 0x82, 0x86, 0x8A, 0x8E, 0x92, 0x96, 0x9A, 0x9E, 0xA2, 0xA6, 0xAA, 0xAE, 0xB2, 0xB6, 0xBA, 0xBE, 0xC2, 0xC6, 0xCA, 0xCE, 0xD2, 0xD7, 0xDB, 0xDF, 0xE3, 0xE7, 0xEB, 0xEF, 0xF3, 0xF7, 0xFB, 0xFF, }; class ChunkRenderer { public: ChunkRenderer(int width, int height, unsigned char *buffer = NULL) { m_data = buffer ? buffer : new unsigned char[width * height]; m_ptr = m_data; m_end = m_data + width * height; m_x = 0; m_y = 0; m_width = width; m_height = height; m_skip_eol = false; } ~ChunkRenderer() { delete[] m_data; } bool isDone() const { return m_ptr == m_end; } unsigned char* takeData() { unsigned char *buffer = m_data; m_data = 0; return buffer; } const unsigned char* getData() const { return m_data; } void chunkFillToEndOfLine(unsigned char value) { if(m_x != 0 || !m_skip_eol) { chunkFill(m_width - m_x, value); } m_skip_eol = false; } void chunkFinish(unsigned char value) { chunkFill(m_end - m_ptr, value); } void chunkFill(int npixels, unsigned char value) { _fixNpixels(npixels); if(npixels > 0) { memset(m_ptr, value, npixels); _incrementPosition(npixels); } } void chunkCopy(int npixels, const unsigned char* data) { _fixNpixels(npixels); if(npixels > 0) { memcpy(m_ptr, data, npixels); _incrementPosition(npixels); } } protected: inline void _fixNpixels(int& npixels) const { if(m_ptr + npixels > m_end) { npixels = m_end - m_ptr; } } inline void _incrementPosition(int npixels) { m_ptr += npixels; m_x += npixels; m_y += m_x / m_width; m_x = m_x % m_width; m_skip_eol = true; } unsigned char *m_data, *m_ptr, *m_end; int m_x, m_y, m_width, m_height; bool m_skip_eol; }; static void decode_chunks(ChunkRenderer& renderer, const unsigned char* data, int datalen, unsigned char transparent) { while(!renderer.isDone() && datalen > 0) { unsigned char b = *data; --datalen; ++data; if(b == 0) { renderer.chunkFillToEndOfLine(transparent); } else if(b < 0x80) { int amt = b; if(datalen < amt) amt = datalen; renderer.chunkCopy(amt, data); data += amt; datalen -= amt; } else { renderer.chunkFill(0x100 - b, transparent); } } renderer.chunkFinish(transparent); } static void decode_chunks_complex(ChunkRenderer& renderer, const unsigned char* data, int datalen, unsigned char transparent) { while(!renderer.isDone() && datalen > 0) { unsigned char b = *data; --datalen; ++data; if(b == 0) { renderer.chunkFillToEndOfLine(transparent); } else if(b < 0x40) { int amt = b; if(datalen < amt) amt = datalen; renderer.chunkCopy(amt, data); data += amt; datalen -= amt; } else if((b & 0xC0) == 0x80) { renderer.chunkFill(b - 0x80, transparent); } else { int amt; unsigned char colour = 0; if(b == 0xFF) { if(datalen < 2) { break; } amt = (int)data[0]; colour = data[1]; data += 2; datalen -= 2; } else { amt = b - 60 - (b & 0x80) / 2; if(datalen > 0) { colour = *data; ++data; --datalen; } } renderer.chunkFill(amt, colour); } } renderer.chunkFinish(transparent); } THLayerMask::THLayerMask() { clear(); } void THLayerMask::clear() { for(int i = 0; i < 13; ++i) m_iMask[i] = 0; } THAnimations::THAnimations() { anims = std::vector(); frames = std::vector(); elementList = std::vector(); elements = std::vector(); sprites = std::vector(); spriteBitmaps = std::vector(); chunks = std::vector(); colours = std::vector(); ghostMaps = std::array(); for(int iMap = 0; iMap < 256 * 4; ++iMap) { for(int iCol = 0; iCol < 256; ++iCol) { ghostMaps[iMap * 256 + iCol] = iCol; } } m_iGhostMapOffset = 0; } THAnimations::~THAnimations() { } bool THAnimations::isAnimationDuplicate(size_t iAnimation) { if(iAnimation < anims.size()) return anims.at(iAnimation).unknown == 1; else return true; } size_t THAnimations::markDuplicates() { size_t iNonDuplicateCount = 0; std::set seen; for(th_anim_t& anim : anims) { uint16_t iFrame = anim.frame; uint16_t iFirstFrame = iFrame; do { if(seen.find(iFrame) != seen.end()) { anim.unknown = 1; } else { seen.insert(iFrame); } iFrame = frames.at(iFrame).next; } while(iFrame != iFirstFrame); if(anim.unknown == 0) { ++iNonDuplicateCount; } } return iNonDuplicateCount; } bool THAnimations::loadFrameFile(wxString sFilename) { if(!loadVector(frames, sFilename)) return false; /* 256 is a common flag - could be x-flip. The lower byte can also take non-zero values - could be ghost palette indices. */ return true; } bool THAnimations::loadTableFile(wxString sFilename) { spriteBitmaps.clear(); if(!loadVector(sprites, sFilename)) return false; spriteBitmaps.resize(sprites.size()); return true; } bool THAnimations::loadPaletteFile(wxString sFilename) { if (!loadVector(colours, sFilename)) return false; for (th_colour_t& colour : colours) { colour.r = palette_upscale_map[colour.r & 0x3F]; colour.g = palette_upscale_map[colour.g & 0x3F]; colour.b = palette_upscale_map[colour.b & 0x3F]; } return true; } bool THAnimations::loadGhostFile(wxString sFilename, int iIndex) { if(iIndex < 0 || iIndex >= 4) return false; std::vector data; if (!loadVector(data, sFilename)) return false; if (data.size() != 256 * 256) { return false; } std::copy(data.begin(), data.end(), ghostMaps.begin() + iIndex * 256 * 256); return true; } void THAnimations::setGhost(int iFile, int iIndex) { m_iGhostMapOffset = iFile * 256 * 256 + iIndex * 256; } size_t THAnimations::getAnimationCount() { return anims.size(); } size_t THAnimations::getSpriteCount() { return sprites.size(); } void THAnimations::setSpritePath(wxString aPath) { m_sSpritePath = aPath; } void THAnimations::getAnimationMask(size_t iAnimation, THLayerMask& mskLayers) { mskLayers.clear(); if(iAnimation >= anims.size()) return; uint16_t iFrameIndex = anims.at(iAnimation).frame; if(iFrameIndex >= frames.size()) return; uint16_t iFirstFrameIndex = iFrameIndex; do { th_frame_t* pFrame = &(frames.at(iFrameIndex)); uint32_t iListIndex = pFrame->list_index; th_element_t* pElement; while((pElement = _getElement(iListIndex++))) { mskLayers.set(pElement->flags >> 4, pElement->layerid); } iFrameIndex = frames.at(iFrameIndex).next; } while(iFrameIndex < frames.size() && iFrameIndex != iFirstFrameIndex); } size_t THAnimations::getFrameCount(size_t iAnimation) { if(iAnimation >= anims.size()) return 0; size_t iCount = 0; uint16_t iFirstFrame = anims.at(iAnimation).frame; if(iFirstFrame < frames.size()) { ++iCount; uint16_t iFrame = frames.at(iFirstFrame).next; while(iFrame != iFirstFrame && iFrame < frames.size() && iCount < 1024) { ++iCount; iFrame = frames.at(iFrame).next; } } return iCount; } bool THAnimations::doesAnimationIncludeFrame(size_t iAnimation, size_t iFrame) { if(iAnimation >= anims.size() || iFrame >= frames.size()) return 0; uint16_t iFirstFrame = anims.at(iAnimation).frame; uint16_t iFrameNow = iFirstFrame; do { if(iFrameNow >= frames.size()) break; if(iFrame == iFrameNow) return true; iFrameNow = frames.at(iFrameNow).next; } while(iFrameNow != iFirstFrame); return false; } Bitmap* THAnimations::getSpriteBitmap(size_t iSprite, bool bComplex) { if(iSprite >= sprites.size()) return nullptr; if (!spriteBitmaps.at(iSprite).IsOk()) { wxString spriteFile = m_sSpritePath + wxString::Format(L"a%04ue.png", (int)iSprite); th_sprite_t* pSprite = &(sprites.at(iSprite)); ChunkRenderer oRenderer(pSprite->width, pSprite->height); (bComplex ? decode_chunks_complex : decode_chunks)(oRenderer, (const unsigned char*)chunks.data() + pSprite->offset, chunks.size() - pSprite->offset, 0xFF); spriteBitmaps[iSprite].create(pSprite->width, pSprite->height, oRenderer.getData()); } return &(spriteBitmaps.at(iSprite)); } th_frame_t* THAnimations::getFrameStruct(size_t iAnimation, size_t iFrame) { if(iAnimation >= anims.size()) return 0; uint16_t iFrameIndex = anims.at(iAnimation).frame; while(iFrame--) { iFrameIndex = frames.at(iFrameIndex).next; } return &(frames.at(iFrameIndex)); } void THAnimations::drawFrame(wxImage& imgCanvas, size_t iAnimation, size_t iFrame, const THLayerMask* pMask, wxSize& size, int iXOffset, int iYOffset) { if(iAnimation >= anims.size()) return; uint16_t iFrameIndex = anims.at(iAnimation).frame; while(iFrame--) { iFrameIndex = frames.at(iFrameIndex).next; } th_frame_t* pFrame = &(frames.at(iFrameIndex)); th_element_t* pElement; uint32_t iListIndex = pFrame->list_index; int iFarX = 0; int iFarY = 0; while((pElement = _getElement(iListIndex++))) { if(pMask != NULL && !pMask->isSet(pElement->flags >> 4, pElement->layerid)) continue; uint16_t iSpriteIndex = pElement->table_position / sizeof(th_sprite_t); th_sprite_t* pSprite = &(sprites.at(iSpriteIndex)); int iRight = pElement->offx + pSprite->width; int iBottom = pElement->offy + pSprite->height; if(iRight > iFarX) iFarX = iRight; if(iBottom > iFarY) iFarY = iBottom; getSpriteBitmap(iSpriteIndex)->blit(imgCanvas, pElement->offx + iXOffset, pElement->offy + iYOffset, ghostMaps.data() + m_iGhostMapOffset, colours.data(), pElement->flags & 0xF); } size.x = iFarX; size.y = iFarY; } th_element_t* THAnimations::_getElement(uint32_t iListIndex) { if(iListIndex >= elementList.size()) return nullptr; uint16_t iElementIndex = elementList.at(iListIndex); if(iElementIndex >= elements.size()) return nullptr; return &(elements.at(iElementIndex)); } unsigned char* THAnimations::Decompress(unsigned char* pData, size_t& iLength) { unsigned long outlen = rnc_output_size(pData); unsigned char* outbuf = new unsigned char[outlen]; if (rnc_input_size(pData) != iLength) { throw std::length_error("rnc data does not match the expected length"); } if(rnc_unpack(pData, outbuf) == rnc_status::ok) { delete[] pData; iLength = outlen; return outbuf; } else { delete[] pData; delete[] outbuf; iLength = 0; return nullptr; } } Bitmap::Bitmap() : m_iWidth(0), m_iHeight(0), m_pData(nullptr) { } Bitmap::~Bitmap() { delete[] m_pData; } void Bitmap::create(int iWidth, int iHeight) { delete[] m_pData; m_pData = new uint8_t[iWidth * iHeight]; m_iWidth = iWidth; m_iHeight = iHeight; memset(m_pData, 0xFF, iWidth * iHeight); } void Bitmap::create(int iWidth, int iHeight, const uint8_t* pData) { delete[] m_pData; m_pData = new uint8_t[iWidth * iHeight]; m_iWidth = iWidth; m_iHeight = iHeight; memcpy(m_pData, pData, iWidth * iHeight); } void Bitmap::blit(Bitmap& bmpCanvas, int iX, int iY, int iFlags) const { for(int y = 0; y < m_iHeight; ++y) { for(int x = 0; x < m_iWidth; ++x) { uint8_t src = pixel(x, y); if(src == 0xFF) continue; int iDstX = iX + x; int iDstY = iY + y; if(iFlags & 0x2) iDstY = iY + m_iHeight - 1 - y; if(iFlags & 0x1) iDstX = iX + m_iWidth - 1 - x; bmpCanvas.pixel(iDstX, iDstY) = src; } } } static inline void _merge(th_colour_t& dst, const th_colour_t& src) { dst.r = (uint8_t)(((unsigned int)dst.r + (unsigned int)src.r)/2); dst.g = (uint8_t)(((unsigned int)dst.g + (unsigned int)src.g)/2); dst.b = (uint8_t)(((unsigned int)dst.b + (unsigned int)src.b)/2); } void Bitmap::blit(wxImage& imgCanvas, int iX, int iY, const unsigned char* pColourTranslate, const th_colour_t* pPalette, int iFlags) const { if(m_iHeight == 0 || m_iWidth == 0) return; th_colour_t* pCanvas = (th_colour_t*)imgCanvas.GetData(); int iCanvasWidth = imgCanvas.GetWidth(); if(m_iHeight > 256 || m_iWidth > 256) { return; } for(int y = 0; y < m_iHeight; ++y) { for(int x = 0; x < m_iWidth; ++x) { uint8_t src = pixel(x, y); if(src == 0xFF && (iFlags & 0x8000) == 0) continue; if(pColourTranslate != NULL) { src = pColourTranslate[src]; if(src == 0xFF && (iFlags & 0x8000) == 0) continue; } int iDstX = iX + x; int iDstY = iY + y; if(iFlags & 0x2) iDstY = iY + m_iHeight - 1 - y; if(iFlags & 0x1) iDstX = iX + m_iWidth - 1 - x; th_colour_t srcc = pPalette[src]; if(iFlags & 0xC) { th_colour_t dstc = pCanvas[iDstY * iCanvasWidth + iDstX]; switch(iFlags & 0xC) { case 0x8: _merge(srcc, dstc); // fall-through case 0x4: _merge(srcc, dstc); break; } } pCanvas[iDstY * iCanvasWidth + iDstX] = srcc; if(imgCanvas.HasAlpha()) { //set completely opaque imgCanvas.SetAlpha(iDstX,iDstY,(unsigned char)255); } } } } CorsixTH-0.63/AnimView/th.h000066400000000000000000000156701347163623700154750ustar00rootroot00000000000000/* Copyright (c) 2009 Peter "Corsix" Cawley 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. */ /* Note that this file contains similar functionality to th.h / th_gfx.h from the main CorsixTH project. It is reimplemented rather than reused for good reasons: 1) Animations need to be rendered onto a wxWidgets canvas rather than onto an SDL or DirectX canvas. 2) Modifications and experimentation can be performed on this version before being implemented on the game copy, resulting in better code when the game version is implemented. 3) Simplicity rather than speed is the aim of this copy, so it will render slower than the game copy, but will be easier to understand and make changes to. */ #pragma once #include #include #include #include #include #include #include #pragma pack(push) #pragma pack(1) struct th_anim_t { uint16_t frame; uint16_t unknown; }; struct th_frame_t { uint32_t list_index; uint8_t width; uint8_t height; uint16_t flags; uint16_t next; }; struct th_element_t { uint16_t table_position; uint8_t offx; uint8_t offy; uint8_t flags; uint8_t layerid; }; struct th_sprite_t { uint32_t offset; uint8_t width; uint8_t height; }; struct th_colour_t { uint8_t r; uint8_t g; uint8_t b; }; #pragma pack(pop) class THLayerMask { public: THLayerMask(); inline void set(int iLayer, int iID) { if(0 <= iLayer && iLayer < 13 && 0 <= iID && iID < 32) m_iMask[iLayer] |= (1 << iID); } void clear(); inline void clear(int iLayer, int iID) { if(0 <= iLayer && iLayer < 13 && 0 <= iID && iID < 32) m_iMask[iLayer] &= ~(1 << iID); } inline bool isSet(int iLayer, int iID) const { if(0 <= iLayer && iLayer < 13 && 0 <= iID && iID < 32) return (m_iMask[iLayer] & (1 << iID)) != 0; else return false; } inline bool isSet(int iLayer) const { if(0 <= iLayer && iLayer < 13) for(int iId = 0; iId < 32; ++iId) { if((m_iMask[iLayer] & (1 << iId)) != 0) return true; } return false; } protected: uint32_t m_iMask[13]; }; class Bitmap { public: Bitmap(); ~Bitmap(); void create(int iWidth, int iHeight); void create(int iWidth, int iHeight, const uint8_t* pData); inline uint8_t pixel(int iX, int iY) const {return m_pData[iY * m_iWidth + iX];} inline uint8_t& pixel(int iX, int iY) {return m_pData[iY * m_iWidth + iX];} int getWidth() const {return m_iWidth;} int getHeight() const {return m_iHeight;} void blit(Bitmap& bmpCanvas, int iX, int iY, int iFlags = 0) const; void blit(wxImage& imgCanvas, int iX, int iY, const unsigned char* pColourTranslate, const th_colour_t* pPalette, int iFlags = 0) const; bool IsOk() {return m_pData != nullptr;} protected: int m_iWidth; int m_iHeight; uint8_t* m_pData; }; class THAnimations { public: THAnimations(); ~THAnimations(); bool loadAnimationFile(wxString sFilename) { return loadVector(anims, sFilename); } bool loadFrameFile(wxString sFilename); bool loadListFile(wxString sFilename) { return loadVector(elementList, sFilename); } bool loadElementFile(wxString sFilename) { return loadVector(elements, sFilename); } bool loadTableFile(wxString sFilename); bool loadSpriteFile(wxString sFilename) { return loadVector(chunks, sFilename); } bool loadPaletteFile(wxString sFilename); bool loadGhostFile(wxString sFilename, int iIndex); size_t markDuplicates(); size_t getAnimationCount(); size_t getSpriteCount(); size_t getFrameCount(size_t iAnimation); uint16_t getUnknownField(size_t iAnimation) {return anims.at(iAnimation).unknown; } uint16_t getFrameField(size_t iAnimation) {return anims.at(iAnimation).frame; } th_frame_t* getFrameStruct(size_t iAnimation, size_t iFrame); bool isAnimationDuplicate(size_t iAnimation); bool doesAnimationIncludeFrame(size_t iAnimation, size_t iFrame); void getAnimationMask(size_t iAnimation, THLayerMask& mskLayers); void setSpritePath(wxString aPath); Bitmap* getSpriteBitmap(size_t iSprite, bool bComplex = false); th_colour_t* getPalette() { return colours.data(); } void setGhost(int iFile, int iIndex); void drawFrame(wxImage& imgCanvas, size_t iAnimation, size_t iFrame, const THLayerMask* pMask, wxSize& size, int iXOffset = 0, int iYOffset = 0); void copySpriteToCanvas(wxString spriteFile, int iSpriteIndex, wxImage& imgCanvas, int iX, int iY, int iFlags = 0); static unsigned char* Decompress(unsigned char* pData, size_t& iLength); protected: template bool loadVector(std::vector& vector, wxString sFilename) { vector.clear(); wxFile oFile(sFilename); if (!oFile.IsOpened()) return false; size_t iLen = oFile.Length(); unsigned char* pBuffer = new unsigned char[iLen]; oFile.Read(pBuffer, iLen); if(memcmp(pBuffer, "RNC\001", 4) == 0) { pBuffer = Decompress(pBuffer, iLen); if(!pBuffer) { return false; } } for (int offset = 0; offset < iLen; offset += sizeof(T)) { vector.push_back(*(reinterpret_cast(pBuffer + offset))); } return true; } th_element_t* _getElement(uint32_t iListIndex); std::vector anims; std::vector frames; std::vector elementList; std::vector elements; std::vector sprites; std::vector spriteBitmaps; std::vector chunks; std::vector colours; std::array ghostMaps; size_t m_iGhostMapOffset; wxString m_sSpritePath; }; CorsixTH-0.63/CMake/000077500000000000000000000000001347163623700141415ustar00rootroot00000000000000CorsixTH-0.63/CMake/CMakeFFmpegLibavMacros.cmake000066400000000000000000000055101347163623700213340ustar00rootroot00000000000000#------------------------------------------------------------------- # FindFFmpeg.cmake and FindLibAV.cmake are dependent on this file. # # Redistribution and use is allowed according to the terms of the BSD license. # For details see the accompanying COPYING-CMAKE-SCRIPTS file # #------------------------------------------------------------------- ### Macro: set_component_found # # Marks the given component as found if both *_LIBRARIES AND *_INCLUDE_DIRS is present. # macro(set_component_found _component ) if(${_component}_LIBRARIES AND ${_component}_INCLUDE_DIRS) # message(STATUS " - ${_component} found.") set(${_component}_FOUND TRUE) else() # message(STATUS " - ${_component} not found.") endif() endmacro() # ### Macro: find_component # # Finds each component's library file and include directory, and sets # *_LIBRARIES and *_INCLUDE_DIRS accordingly. Additionally detects each # component's version and sets *_VERSION_STRING. # macro(find_component _component _library _header _version) find_path(${_component}_INCLUDE_DIRS ${_header} PATH_SUFFIXES ffmpeg libav include ) find_library(${_component}_LIBRARIES NAMES ${_library} PATH_SUFFIXES lib ) if(${_component}_INCLUDE_DIRS AND EXISTS "${${_component}_INCLUDE_DIRS}/${_version}") file(STRINGS "${${_component}_INCLUDE_DIRS}/${_version}" ${_component}_VERSION_MAJOR_LINE REGEX "^#define[ \t]+LIB${_component}_VERSION_MAJOR[ \t]+[0-9]+$") file(STRINGS "${${_component}_INCLUDE_DIRS}/${_version}" ${_component}_VERSION_MINOR_LINE REGEX "^#define[ \t]+LIB${_component}_VERSION_MINOR[ \t]+[0-9]+$") file(STRINGS "${${_component}_INCLUDE_DIRS}/${_version}" ${_component}_VERSION_PATCH_LINE REGEX "^#define[ \t]+LIB${_component}_VERSION_MICRO[ \t]+[0-9]+$") string(REGEX REPLACE "^#define[ \t]+LIB${_component}_VERSION_MAJOR[ \t]+([0-9]+)$" "\\1" ${_component}_VERSION_MAJOR "${${_component}_VERSION_MAJOR_LINE}") string(REGEX REPLACE "^#define[ \t]+LIB${_component}_VERSION_MINOR[ \t]+([0-9]+)$" "\\1" ${_component}_VERSION_MINOR "${${_component}_VERSION_MINOR_LINE}") string(REGEX REPLACE "^#define[ \t]+LIB${_component}_VERSION_MICRO[ \t]+([0-9]+)$" "\\1" ${_component}_VERSION_PATCH "${${_component}_VERSION_PATCH_LINE}") set(${_component}_VERSION_STRING ${${_component}_VERSION_MAJOR}.${${_component}_VERSION_MINOR}.${${_component}_VERSION_PATCH}) unset(${_component}_VERSION_MAJOR_LINE) unset(${_component}_VERSION_MINOR_LINE) unset(${_component}_VERSION_PATCH_LINE) unset(${_component}_VERSION_MAJOR) unset(${_component}_VERSION_MINOR) unset(${_component}_VERSION_PATCH) endif() find_package_handle_standard_args(${_component} REQUIRED_VARS ${_component}_LIBRARIES ${_component}_INCLUDE_DIRS VERSION_VAR ${_component}_VERSION_STRING ) set_component_found(${_component}) endmacro() CorsixTH-0.63/CMake/COPYING-CMAKE-SCRIPTS000066400000000000000000000024561347163623700171460ustar00rootroot00000000000000Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: 1. Redistributions of source code must retain the copyright notice, this list of conditions and the following disclaimer. 2. Redistributions in binary form must reproduce the copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. 3. The name of the author may not be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. CorsixTH-0.63/CMake/CopyVcpkgLua.cmake000066400000000000000000000021321347163623700175100ustar00rootroot00000000000000# Add an extra step to copy LUA files from vcpkg add_custom_command(TARGET CorsixTH POST_BUILD COMMAND ${CMAKE_COMMAND} -E copy_directory "${VCPKG_INSTALLED_PATH}/share/lua" $ ) add_custom_command(TARGET CorsixTH POST_BUILD COMMAND ${CMAKE_COMMAND} -E remove $/COPYRIGHT ) add_custom_command(TARGET CorsixTH POST_BUILD COMMAND ${CMAKE_COMMAND} -E copy "${VCPKG_INSTALLED_PATH}/$<$:debug/>bin/lfs.dll" $/lfs.dll ) add_custom_command(TARGET CorsixTH POST_BUILD COMMAND ${CMAKE_COMMAND} -E copy "${VCPKG_INSTALLED_PATH}/$<$:debug/>bin/lpeg.dll" $/lpeg.dll ) add_custom_command(TARGET CorsixTH POST_BUILD COMMAND ${CMAKE_COMMAND} -E copy "${VCPKG_INSTALLED_PATH}/$<$:debug/>bin/mime/core.dll" $/mime/core.dll ) add_custom_command(TARGET CorsixTH POST_BUILD COMMAND ${CMAKE_COMMAND} -E copy "${VCPKG_INSTALLED_PATH}/$<$:debug/>bin/socket/core.dll" $/socket/core.dll ) CorsixTH-0.63/CMake/FindFFmpeg.cmake000066400000000000000000000072161347163623700171160ustar00rootroot00000000000000# vim: ts=2 sw=2 # - Try to find the required ffmpeg components(default: AVFORMAT, AVUTIL, AVCODEC) # # Once done this will define # FFMPEG_FOUND - System has the all required components. # FFMPEG_INCLUDE_DIRS - Include directory necessary for using the required components headers. # FFMPEG_LIBRARIES - Link these to use the required ffmpeg components. # # For each of the components it will additionally set. # - AVCODEC # - AVDEVICE # - AVFORMAT # - AVUTIL # - POSTPROCESS # - SWSCALE # - SWRESAMPLE # the following variables will be defined # _FOUND - System has # _INCLUDE_DIRS - Include directory necessary for using the headers # _LIBRARIES - Link these to use # _VERSION_STRING - The component's version # # Copyright (c) 2006, Matthias Kretz, # Copyright (c) 2008, Alexander Neundorf, # Copyright (c) 2011, Michael Jansen, # Copyright (c) 2013, Stephen Baker # Copyright (c) 2015, Alexander Bessman # # Redistribution and use is allowed according to the terms of the BSD license. # For details see the accompanying COPYING-CMAKE-SCRIPTS file. include(FindPackageHandleStandardArgs) include(${CMAKE_CURRENT_LIST_DIR}/CMakeFFmpegLibavMacros.cmake) # The default components were taken from a survey over other FindFFMPEG.cmake files if(NOT FFmpeg_FIND_COMPONENTS) set(FFmpeg_FIND_COMPONENTS AVCODEC AVFORMAT AVUTIL) endif() # Check for cached results. If there are skip the costly part. if(NOT FFMPEG_LIBRARIES) # Check for all possible component. find_component(AVCODEC avcodec libavcodec/avcodec.h libavcodec/version.h) find_component(AVFORMAT avformat libavformat/avformat.h libavformat/version.h) find_component(AVDEVICE avdevice libavdevice/avdevice.h libavdevice/version.h) find_component(AVUTIL avutil libavutil/avutil.h libavutil/version.h) find_component(SWSCALE swscale libswscale/swscale.h libswscale/version.h) find_component(POSTPROC postproc libpostproc/postprocess.h libpostproc/version.h) find_component(SWRESAMPLE swresample libswresample/swresample.h libswresample/version.h) # Check if the required components were found and add their stuff to the FFMPEG_* vars. foreach(_component ${FFmpeg_FIND_COMPONENTS}) if(${_component}_FOUND) # message(STATUS "Required component ${_component} present.") set(FFMPEG_LIBRARIES ${FFMPEG_LIBRARIES} ${${_component}_LIBRARIES}) list(APPEND FFMPEG_INCLUDE_DIRS ${${_component}_INCLUDE_DIRS}) else() # message(STATUS "Required component ${_component} missing.") endif() endforeach() # Build the include path with duplicates removed. if(FFMPEG_INCLUDE_DIRS) list(REMOVE_DUPLICATES FFMPEG_INCLUDE_DIRS) endif() # cache the vars. set(FFMPEG_INCLUDE_DIRS ${FFMPEG_INCLUDE_DIRS} CACHE STRING "The FFmpeg include directories." FORCE) set(FFMPEG_LIBRARIES ${FFMPEG_LIBRARIES} CACHE STRING "The FFmpeg libraries." FORCE) mark_as_advanced(FFMPEG_INCLUDE_DIRS FFMPEG_LIBRARIES) endif() # Now set the noncached _FOUND vars for the components. foreach(_component AVCODEC AVDEVICE AVFORMAT AVUTIL POSTPROCESS SWSCALE SWRESAMPLE) set_component_found(${_component}) endforeach() # Compile the list of required vars set(_FFmpeg_REQUIRED_VARS FFMPEG_LIBRARIES FFMPEG_INCLUDE_DIRS) foreach(_component ${FFmpeg_FIND_COMPONENTS}) list(APPEND _FFmpeg_REQUIRED_VARS ${_component}_LIBRARIES ${_component}_INCLUDE_DIRS) endforeach() # Give a nice error message if some of the required vars are missing. find_package_handle_standard_args(FFmpeg DEFAULT_MSG ${_FFmpeg_REQUIRED_VARS}) CorsixTH-0.63/CMake/FindLibAV.cmake000066400000000000000000000072061347163623700167060ustar00rootroot00000000000000# vim: ts=2 sw=2 # - Try to find the required libav components(default: AVFORMAT, AVUTIL, AVCODEC) # # Once done this will define # LIBAV_FOUND - System has the all required components. # LIBAV_INCLUDE_DIRS - Include directory necessary for using the required components headers. # LIBAV_LIBRARIES - Link these to use the required libav components. # # For each of the components it will additionally set. # - AVCODEC # - AVDEVICE # - AVFILTER # - AVFORMAT # - AVRESAMPLE # - AVUTIL # - SWSCALE # the following variables will be defined # _FOUND - System has # _INCLUDE_DIRS - Include directory necessary for using the headers # _LIBRARIES - Link these to use # _VERSION_STRING - The component's version # # Copyright (c) 2006, Matthias Kretz, # Copyright (c) 2008, Alexander Neundorf, # Copyright (c) 2011, Michael Jansen, # Copyright (c) 2013,2015 Stephen Baker # Copyright (c) 2015, Alexander Bessman # # Redistribution and use is allowed according to the terms of the BSD license. # For details see the accompanying COPYING-CMAKE-SCRIPTS file. include(FindPackageHandleStandardArgs) include(${CMAKE_CURRENT_LIST_DIR}/CMakeFFmpegLibavMacros.cmake) # The default components were taken from a survey over other FindLIBAV.cmake files if(NOT LibAV_FIND_COMPONENTS) set(LibAV_FIND_COMPONENTS AVCODEC AVFORMAT AVUTIL) endif() # Check for cached results. If there are skip the costly part. if(NOT LIBAV_LIBRARIES) # Check for all possible component. find_component(AVCODEC avcodec libavcodec/avcodec.h libavcodec/version.h) find_component(AVFORMAT avformat libavformat/avformat.h libavformat/version.h) find_component(AVDEVICE avdevice libavdevice/avdevice.h libavdevice/version.h) find_component(AVFILTER avfilter libavfilter/avfilter.h libavfilter/version.h) find_component(AVRESAMPLE avresample libavresample/avresample.h libavresample/version.h) find_component(AVUTIL avutil libavutil/avutil.h libavutil/version.h) find_component(SWSCALE swscale libswscale/swscale.h libswscale/version.h) # Check if the required components were found and add their stuff to the LIBAV_* vars. foreach(_component ${LibAV_FIND_COMPONENTS}) if(${_component}_FOUND) # message(STATUS "Required component ${_component} present.") set(LIBAV_LIBRARIES ${LIBAV_LIBRARIES} ${${_component}_LIBRARIES}) list(APPEND LIBAV_INCLUDE_DIRS ${${_component}_INCLUDE_DIRS}) else() # message(STATUS "Required component ${_component} missing.") endif() endforeach() # Build the include path with duplicates removed. if(LIBAV_INCLUDE_DIRS) list(REMOVE_DUPLICATES LIBAV_INCLUDE_DIRS) endif() # cache the vars. set(LIBAV_INCLUDE_DIRS ${LIBAV_INCLUDE_DIRS} CACHE STRING "The LibAV include directories." FORCE) set(LIBAV_LIBRARIES ${LIBAV_LIBRARIES} CACHE STRING "The LibAV libraries." FORCE) mark_as_advanced(LIBAV_INCLUDE_DIRS LIBAV_LIBRARIES) endif() # Now set the noncached _FOUND vars for the components. foreach(_component AVCODEC AVDEVICE AVFILTER AVFORMAT AVRESAMPLE AVUTIL SWSCALE) set_component_found(${_component}) endforeach() # Compile the list of required vars set(_LibAV_REQUIRED_VARS LIBAV_LIBRARIES LIBAV_INCLUDE_DIRS) foreach(_component ${LibAV_FIND_COMPONENTS}) list(APPEND _LibAV_REQUIRED_VARS ${_component}_LIBRARIES ${_component}_INCLUDE_DIRS) endforeach() # Give a nice error message if some of the required vars are missing. find_package_handle_standard_args(LibAV DEFAULT_MSG ${_LibAV_REQUIRED_VARS}) CorsixTH-0.63/CMake/FindSDL2.cmake000066400000000000000000000141341347163623700164530ustar00rootroot00000000000000# - Locate SDL2 library # This module defines # SDL_LIBRARY, the name of the library to link against # SDL_FOUND, if false, do not try to link to SDL # SDL_INCLUDE_DIR, where to find SDL.h # SDL_VERSION_STRING, human-readable string containing the version of SDL # # This module responds to the the flag: # SDL_BUILDING_LIBRARY # If this is defined, then no SDL_main will be linked in because # only applications need main(). # Otherwise, it is assumed you are building an application and this # module will attempt to locate and set the the proper link flags # as part of the returned SDL_LIBRARY variable. # # Don't forget to include SDL_main.h and SDLmain.m your project for the # OS X framework based version. (Other versions link to -lSDLmain which # this module will try to find on your behalf.) Also for OS X, this # module will automatically add the -framework Cocoa on your behalf. # # # Additional Note: If you see an empty SDL_LIBRARY_TEMP in your configuration # and no SDL_LIBRARY, it means CMake did not find your SDL library # (SDL2.dll, libSDL2.so, SDL2.framework, etc). # Set SDL_LIBRARY_TEMP to point to your SDL library, and configure again. # Similarly, if you see an empty SDLMAIN_LIBRARY, you should set this value # as appropriate. These values are used to generate the final SDL_LIBRARY # variable, but when these values are unset, SDL_LIBRARY does not get created. # # # $SDLDIR is an environment variable that would # correspond to the ./configure --prefix=$SDLDIR # used in building SDL. # l.e.galup 9-20-02 #============================================================================= # Copyright 2003-2009 Kitware, Inc. # Copyright 2012 Benjamin Eikel # # Distributed under the OSI-approved BSD License (the "License"); # see accompanying file Copyright.txt for details. # # This software is distributed WITHOUT ANY WARRANTY; without even the # implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. # See the License for more information. #============================================================================= # (To distribute this file outside of CMake, substitute the full # License text for the above reference.) find_path(SDL_INCLUDE_DIR SDL.h HINTS ENV SDLDIR PATH_SUFFIXES include/SDL2 include ) find_library(SDL_LIBRARY_TEMP NAMES SDL2 HINTS ENV SDLDIR PATH_SUFFIXES lib ) if(NOT SDL_BUILDING_LIBRARY) if(NOT ${SDL_INCLUDE_DIR} MATCHES ".framework") # Non-OS X framework versions expect you to also dynamically link to # SDL2main. This is mainly for Windows and OS X. Other (Unix) platforms # seem to provide SDL2main for compatibility even though they don't # necessarily need it. find_library(SDLMAIN_LIBRARY NAMES SDL2main HINTS ENV SDLDIR PATH_SUFFIXES lib PATHS /sw /opt/local /opt/csw /opt ) endif() endif() # SDL may require threads on your system. # The Apple build may not need an explicit flag because one of the # frameworks may already provide it. # But for non-OSX systems, I will use the CMake Threads package. if(NOT APPLE) find_package(Threads) endif() # MinGW needs an additional library, mwindows # It's total link flags should look like -lmingw32 -lSDL2main -lSDL2 -lmwindows # (Actually on second look, I think it only needs one of the m* libraries.) if(MINGW) set(MINGW32_LIBRARY mingw32 CACHE STRING "mwindows for MinGW") endif() if(SDL_LIBRARY_TEMP) # For SDL2main if(SDLMAIN_LIBRARY AND NOT SDL_BUILDING_LIBRARY) list(FIND SDL_LIBRARY_TEMP "${SDLMAIN_LIBRARY}" _SDL_MAIN_INDEX) if(_SDL_MAIN_INDEX EQUAL -1) set(SDL_LIBRARY_TEMP "${SDLMAIN_LIBRARY}" ${SDL_LIBRARY_TEMP}) endif() unset(_SDL_MAIN_INDEX) endif() # For OS X, SDL uses Cocoa as a backend so it must link to Cocoa. # CMake doesn't display the -framework Cocoa string in the UI even # though it actually is there if I modify a pre-used variable. # I think it has something to do with the CACHE STRING. # So I use a temporary variable until the end so I can set the # "real" variable in one-shot. if(APPLE) set(SDL_LIBRARY_TEMP ${SDL_LIBRARY_TEMP} "-framework Cocoa") endif() # For threads, as mentioned Apple doesn't need this. # In fact, there seems to be a problem if I used the Threads package # and try using this line, so I'm just skipping it entirely for OS X. if(NOT APPLE) set(SDL_LIBRARY_TEMP ${SDL_LIBRARY_TEMP} ${CMAKE_THREAD_LIBS_INIT}) endif() # For MinGW library if(MINGW) set(SDL_LIBRARY_TEMP ${MINGW32_LIBRARY} ${SDL_LIBRARY_TEMP}) endif() # Set the final string here so the GUI reflects the final state. set(SDL_LIBRARY ${SDL_LIBRARY_TEMP} CACHE STRING "Where the SDL Library can be found") # Set the temp variable to INTERNAL so it is not seen in the CMake GUI set(SDL_LIBRARY_TEMP "${SDL_LIBRARY_TEMP}" CACHE INTERNAL "") endif() if(SDL_INCLUDE_DIR AND EXISTS "${SDL_INCLUDE_DIR}/SDL_version.h") file(STRINGS "${SDL_INCLUDE_DIR}/SDL_version.h" SDL_VERSION_MAJOR_LINE REGEX "^#define[ \t]+SDL_MAJOR_VERSION[ \t]+[0-9]+$") file(STRINGS "${SDL_INCLUDE_DIR}/SDL_version.h" SDL_VERSION_MINOR_LINE REGEX "^#define[ \t]+SDL_MINOR_VERSION[ \t]+[0-9]+$") file(STRINGS "${SDL_INCLUDE_DIR}/SDL_version.h" SDL_VERSION_PATCH_LINE REGEX "^#define[ \t]+SDL_PATCHLEVEL[ \t]+[0-9]+$") string(REGEX REPLACE "^#define[ \t]+SDL_MAJOR_VERSION[ \t]+([0-9]+)$" "\\1" SDL_VERSION_MAJOR "${SDL_VERSION_MAJOR_LINE}") string(REGEX REPLACE "^#define[ \t]+SDL_MINOR_VERSION[ \t]+([0-9]+)$" "\\1" SDL_VERSION_MINOR "${SDL_VERSION_MINOR_LINE}") string(REGEX REPLACE "^#define[ \t]+SDL_PATCHLEVEL[ \t]+([0-9]+)$" "\\1" SDL_VERSION_PATCH "${SDL_VERSION_PATCH_LINE}") set(SDL_VERSION_STRING ${SDL_VERSION_MAJOR}.${SDL_VERSION_MINOR}.${SDL_VERSION_PATCH}) unset(SDL_VERSION_MAJOR_LINE) unset(SDL_VERSION_MINOR_LINE) unset(SDL_VERSION_PATCH_LINE) unset(SDL_VERSION_MAJOR) unset(SDL_VERSION_MINOR) unset(SDL_VERSION_PATCH) endif() #include(${CMAKE_CURRENT_LIST_DIR}/FindPackageHandleStandardArgs.cmake) include(FindPackageHandleStandardArgs) find_package_handle_standard_args(SDL REQUIRED_VARS SDL_LIBRARY SDL_INCLUDE_DIR VERSION_VAR SDL_VERSION_STRING ) CorsixTH-0.63/CMake/FindSDL2_mixer.cmake000066400000000000000000000074411347163623700176620ustar00rootroot00000000000000# - Locate SDL_mixer library # This module defines: # SDL_MIXER_LIBRARIES, the name of the library to link against # SDL_MIXER_INCLUDE_DIRS, where to find the headers # SDL_MIXER_FOUND, if false, do not try to link against # SDL_MIXER_VERSION_STRING - human-readable string containing the version of SDL_mixer # # For backward compatibility the following variables are also set: # SDLMIXER_LIBRARY (same value as SDL_MIXER_LIBRARIES) # SDLMIXER_INCLUDE_DIR (same value as SDL_MIXER_INCLUDE_DIRS) # SDLMIXER_FOUND (same value as SDL_MIXER_FOUND) # # $SDLDIR is an environment variable that would # correspond to the ./configure --prefix=$SDLDIR # used in building SDL. # # Created by Eric Wing. This was influenced by the FindSDL.cmake # module, but with modifications to recognize OS X frameworks and # additional Unix paths (FreeBSD, etc). #============================================================================= # Copyright 2005-2009 Kitware, Inc. # Copyright 2012 Benjamin Eikel # # Distributed under the OSI-approved BSD License (the "License"); # see accompanying file Copyright.txt for details. # # This software is distributed WITHOUT ANY WARRANTY; without even the # implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. # See the License for more information. #============================================================================= # (To distribute this file outside of CMake, substitute the full # License text for the above reference.) if(NOT SDL_MIXER_INCLUDE_DIR AND SDLMIXER_INCLUDE_DIR) set(SDL_MIXER_INCLUDE_DIR ${SDLMIXER_INCLUDE_DIR} CACHE PATH "directory cache entry initialized from old variable name") endif() find_path(SDL_MIXER_INCLUDE_DIR SDL_mixer.h HINTS ENV SDLMIXERDIR ENV SDLDIR PATH_SUFFIXES include/SDL2 include ) if(NOT SDL_MIXER_LIBRARY AND SDLMIXER_LIBRARY) set(SDL_MIXER_LIBRARY ${SDLMIXER_LIBRARY} CACHE FILEPATH "file cache entry initialized from old variable name") endif() find_library(SDL_MIXER_LIBRARY NAMES SDL2_mixer HINTS ENV SDLMIXERDIR ENV SDLDIR PATH_SUFFIXES lib ) if(SDL_MIXER_INCLUDE_DIR AND EXISTS "${SDL_MIXER_INCLUDE_DIR}/SDL_mixer.h") file(STRINGS "${SDL_MIXER_INCLUDE_DIR}/SDL_mixer.h" SDL_MIXER_VERSION_MAJOR_LINE REGEX "^#define[ \t]+SDL_MIXER_MAJOR_VERSION[ \t]+[0-9]+$") file(STRINGS "${SDL_MIXER_INCLUDE_DIR}/SDL_mixer.h" SDL_MIXER_VERSION_MINOR_LINE REGEX "^#define[ \t]+SDL_MIXER_MINOR_VERSION[ \t]+[0-9]+$") file(STRINGS "${SDL_MIXER_INCLUDE_DIR}/SDL_mixer.h" SDL_MIXER_VERSION_PATCH_LINE REGEX "^#define[ \t]+SDL_MIXER_PATCHLEVEL[ \t]+[0-9]+$") string(REGEX REPLACE "^#define[ \t]+SDL_MIXER_MAJOR_VERSION[ \t]+([0-9]+)$" "\\1" SDL_MIXER_VERSION_MAJOR "${SDL_MIXER_VERSION_MAJOR_LINE}") string(REGEX REPLACE "^#define[ \t]+SDL_MIXER_MINOR_VERSION[ \t]+([0-9]+)$" "\\1" SDL_MIXER_VERSION_MINOR "${SDL_MIXER_VERSION_MINOR_LINE}") string(REGEX REPLACE "^#define[ \t]+SDL_MIXER_PATCHLEVEL[ \t]+([0-9]+)$" "\\1" SDL_MIXER_VERSION_PATCH "${SDL_MIXER_VERSION_PATCH_LINE}") set(SDL_MIXER_VERSION_STRING ${SDL_MIXER_VERSION_MAJOR}.${SDL_MIXER_VERSION_MINOR}.${SDL_MIXER_VERSION_PATCH}) unset(SDL_MIXER_VERSION_MAJOR_LINE) unset(SDL_MIXER_VERSION_MINOR_LINE) unset(SDL_MIXER_VERSION_PATCH_LINE) unset(SDL_MIXER_VERSION_MAJOR) unset(SDL_MIXER_VERSION_MINOR) unset(SDL_MIXER_VERSION_PATCH) endif() set(SDL_MIXER_LIBRARIES ${SDL_MIXER_LIBRARY}) set(SDL_MIXER_INCLUDE_DIRS ${SDL_MIXER_INCLUDE_DIR}) #include(${CMAKE_CURRENT_LIST_DIR}/FindPackageHandleStandardArgs.cmake) include(FindPackageHandleStandardArgs) find_package_handle_standard_args(SDL_mixer REQUIRED_VARS SDL_MIXER_LIBRARIES SDL_MIXER_INCLUDE_DIRS VERSION_VAR SDL_MIXER_VERSION_STRING ) # for backward compatibility set(SDLMIXER_LIBRARY ${SDL_MIXER_LIBRARIES}) set(SDLMIXER_INCLUDE_DIR ${SDL_MIXER_INCLUDE_DIRS}) set(SDLMIXER_FOUND ${SDL_MIXER_FOUND}) CorsixTH-0.63/CMake/FindVLD.cmake000066400000000000000000000020431347163623700163700ustar00rootroot00000000000000## Try to find Visual Leak Debugger library (VDL) ## http://vld.codeplex.com ## ## Sets the following variables: ## VLD_FOUND ## VLD_INCLUDE_DIR ## VLD_LIBRARY ## ## Stephen E. Baker 2014 set(VLD_FOUND FALSE) if(${CMAKE_SIZEOF_VOID_P} MATCHES 8) set (VLD_LIB_SUBDIRS lib/Win64 lib) else() set (VLD_LIB_SUBDIRS lib/Win32 lib) endif() set(PROG_FILES_X86_ENV "PROGRAMFILES(X86)") set(PROG_FILES_ENV "PROGRAMFILES") find_path(VLD_INCLUDE_DIR vld.h HINTS ENV VLD_HOME PATH_SUFFIXES include PATHS "$ENV{${PROG_FILES_X86_ENV}}/Visual Leak Detector" "$ENV{${PROG_FILES_ENV}}/Visual Leak Detector" ) find_library(VLD_LIBRARY NAMES vld HINTS ENV VLD_HOME PATH_SUFFIXES ${VLD_LIB_SUBDIRS} PATHS "$ENV{${PROG_FILES_X86_ENV}}/Visual Leak Detector" "$ENV{${PROG_FILES_ENV}}/Visual Leak Detector" ) if(VLD_INCLUDE_DIR AND VLD_LIBRARY) set(VLD_FOUND TRUE) endif() include(FindPackageHandleStandardArgs) find_package_handle_standard_args(VLD DEFAULT_MSG VLD_LIBRARY VLD_INCLUDE_DIR) mark_as_advanced( VLD_INCLUDE_DIR VLD_LIBRARY ) CorsixTH-0.63/CMake/GenerateDoc.cmake000066400000000000000000000076471347163623700173410ustar00rootroot00000000000000# Find doxygen. find_package(Doxygen) # Generate build targets and the doc/index.html file. if(DOXYGEN_FOUND OR LUA_PROGRAM_FOUND) add_custom_target(doc) else() message("Cannot locate Doxygen or lua, 'doc' target is not available") endif() # Add sub-targets of the 'doc' target. if(DOXYGEN_FOUND) configure_file(${CMAKE_CURRENT_SOURCE_DIR}/DoxyGen/animview.doxygen.in ${CMAKE_CURRENT_BINARY_DIR}/DoxyGen/animview.doxygen @ONLY) add_custom_target(doc_animview ${DOXYGEN_EXECUTABLE} ${CMAKE_CURRENT_BINARY_DIR}/DoxyGen/animview.doxygen WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/doc COMMENT "Generating API documentation for AnimView" VERBATIM ) add_dependencies(doc doc_animview) configure_file(${CMAKE_CURRENT_SOURCE_DIR}/DoxyGen/leveledit.doxygen.in ${CMAKE_CURRENT_BINARY_DIR}/DoxyGen/leveledit.doxygen @ONLY) add_custom_target(doc_leveledit ${DOXYGEN_EXECUTABLE} ${CMAKE_CURRENT_BINARY_DIR}/DoxyGen/leveledit.doxygen WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/doc COMMENT "Generating API documentation for LevelEdit" VERBATIM ) add_dependencies(doc doc_leveledit) configure_file(${CMAKE_CURRENT_SOURCE_DIR}/DoxyGen/corsixth_engine.doxygen.in ${CMAKE_CURRENT_BINARY_DIR}/DoxyGen/corsixth_engine.doxygen @ONLY) add_custom_target(doc_corsixth_engine ${DOXYGEN_EXECUTABLE} ${CMAKE_CURRENT_BINARY_DIR}/DoxyGen/corsixth_engine.doxygen WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/doc COMMENT "Generating API documentation for corsixth_engine" VERBATIM ) add_dependencies(doc doc_corsixth_engine) endif() if(LUA_PROGRAM_FOUND) add_custom_target(doc_corsixth_lua ${LUA_PROGRAM_PATH} ${CMAKE_CURRENT_SOURCE_DIR}/LDocGen/main.lua COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_CURRENT_SOURCE_DIR}/LDocGen/output/corner_right.gif ${CMAKE_CURRENT_BINARY_DIR}/doc/corsixth_lua COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_CURRENT_SOURCE_DIR}/LDocGen/output/logo.png ${CMAKE_CURRENT_BINARY_DIR}/doc/corsixth_lua COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_CURRENT_SOURCE_DIR}/LDocGen/output/main.css ${CMAKE_CURRENT_BINARY_DIR}/doc/corsixth_lua WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/doc COMMENT "Generating API documentation for corsixth_lua" VERBATIM ) add_dependencies(doc doc_corsixth_lua) endif() # Generate doc/index.html file. if(DOXYGEN_FOUND OR LUA_PROGRAM_FOUND) file(WRITE ${CMAKE_CURRENT_BINARY_DIR}/doc/index.html "\n") file(APPEND ${CMAKE_CURRENT_BINARY_DIR}/doc/index.html "CorsixTH source code documentation\n") file(APPEND ${CMAKE_CURRENT_BINARY_DIR}/doc/index.html "\n") file(APPEND ${CMAKE_CURRENT_BINARY_DIR}/doc/index.html "

CorsixTH main program source code documentation

\n") file(APPEND ${CMAKE_CURRENT_BINARY_DIR}/doc/index.html "
\n") file(APPEND ${CMAKE_CURRENT_BINARY_DIR}/doc/index.html "

CorsixTH helper programs source code documentation

\n") file(APPEND ${CMAKE_CURRENT_BINARY_DIR}/doc/index.html "
    \n") file(APPEND ${CMAKE_CURRENT_BINARY_DIR}/doc/index.html "
  • Animation viewer documentation\n") file(APPEND ${CMAKE_CURRENT_BINARY_DIR}/doc/index.html "
  • Level editor documentation\n") endif() if(DOXYGEN_FOUND OR LUA_PROGRAM_FOUND) file(APPEND ${CMAKE_CURRENT_BINARY_DIR}/doc/index.html "
\n") file(APPEND ${CMAKE_CURRENT_BINARY_DIR}/doc/index.html "\n") file(APPEND ${CMAKE_CURRENT_BINARY_DIR}/doc/index.html "\n") endif() CorsixTH-0.63/CMake/PrecompiledDeps.cmake000066400000000000000000000077171347163623700202360ustar00rootroot00000000000000# Copyright (c) 2017 David Fairbrother # # 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. # Clones and sets any dependencies up include(ExternalProject) # Inform CMake about the external project set(_DEPS_PROJECT_NAME PrecompiledDependencies) # Place files into ./precompiled_deps folder set(PRECOMPILED_DEPS_BASE_DIR ${PROJECT_SOURCE_DIR}/PrecompiledDeps CACHE PATH "Destination for pre-built dependencies") set(_DEPS_GIT_URL "https://github.com/CorsixTH/deps.git") # Select the optimal dependencies commit regardless where master is. set(_DEPS_GIT_SHA "a23eb28bb8998b93215eccf805ee5462d75a57f2") ExternalProject_Add(${_DEPS_PROJECT_NAME} PREFIX ${PRECOMPILED_DEPS_BASE_DIR} GIT_REPOSITORY ${_DEPS_GIT_URL} GIT_TAG ${_DEPS_GIT_SHA} # As the deps are already build we can skip these CONFIGURE_COMMAND "" BUILD_COMMAND "" INSTALL_COMMAND "" TEST_COMMAND "" ) unset(_DEPS_GIT_URL) unset(_DEPS_GIT_SHA) # Make sure the final make file / solution does not attempt to build # the dependencies target set_target_properties(${_DEPS_PROJECT_NAME} PROPERTIES EXCLUDE_FROM_ALL 1 EXCLUDE_FROM_DEFAULT_BUILD 1 ) set(_DEPS_TMP_PATH ${PRECOMPILED_DEPS_BASE_DIR}/tmp) set(_DEPS_MODULES_TEMPLATE_NAME ${_DEPS_TMP_PATH}/${_DEPS_PROJECT_NAME}) # Clone if we don't have the deps if(NOT EXISTS ${PRECOMPILED_DEPS_BASE_DIR}/src/${_DEPS_PROJECT_NAME}/.git) message(STATUS "Getting Precompiled Dependencies...") execute_process(COMMAND ${CMAKE_COMMAND} ARGS -P ${_DEPS_MODULES_TEMPLATE_NAME}-gitclone.cmake RESULT_VARIABLE return_value ) if(return_value) message(FATAL_ERROR "Failed to clone precompiled dependencies.") endif() # Deps exist, check for updates and checkout the correct tag else() message(STATUS "Checking for Precompiled Dependency Updates...") execute_process(COMMAND ${CMAKE_COMMAND} ARGS -P ${_DEPS_MODULES_TEMPLATE_NAME}-gitupdate.cmake RESULT_VARIABLE return_value ) if(return_value) message(FATAL_ERROR "Failed to update precompiled dependencies.") endif() endif() # We can dispose of tmp and modules template name afterwards unset(_DEPS_TMP_PATH) unset(_DEPS_MODULES_TEMPLATE_NAME) # Determine the appropriate libs to use for this compiler if(UNIX AND CMAKE_COMPILER_IS_GNU) # We need user to choose which arch they are intending to compile for set(DEPS_ARCH "x86" CACHE STRING "Architecture of precompiled dependencies to use.") set_property(CACHE DEPS_ARCH PROPERTY STRINGS "x86" "x64" ) # Generate the folder to use set(_DEPS_FOLDER_NAME "gnu-linux-" + ${DEPS_ARCH}) else() message(FATAL_ERROR "Precompiled dependencies do not exist for this platform / compiler combination yet.") endif() set(_DEPS_PATH ${PRECOMPILED_DEPS_BASE_DIR}/src/${_DEPS_PROJECT_NAME}/${_DEPS_FOLDER_NAME}) # Update the prefix path - this refers to the base directory that find_xx # commands use. For example using find_include would automatically append # the 'include' subdirectory in. set(CMAKE_PREFIX_PATH ${_DEPS_PATH}) unset(_DEPS_FOLDER_NAME) unset(_DEPS_PATH) CorsixTH-0.63/CMake/VcpkgDeps.cmake000066400000000000000000000052371347163623700170400ustar00rootroot00000000000000# Copyright (c) 2017 David Fairbrother # # 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. set(VCPKG_COMMIT_SHA "1a9f008c2b532eac72ebe6e988574dc260bf7151") # Setup the various paths we are using set(_VCPKG_SCRIPT_NAME "build_vcpkg_deps.ps1") set(_SCRIPT_DIR ${CMAKE_SOURCE_DIR}/scripts) # By default place VCPKG into root folder set(VCPKG_PARENT_DIR ${CMAKE_SOURCE_DIR} CACHE PATH "Destination for vcpkg dependencies") # Determine the args to use if(VCPKG_TARGET_TRIPLET) set(_VCPKG_TARGET_TRIPLET ${VCPKG_TARGET_TRIPLET}) elseif(CMAKE_GENERATOR_PLATFORM MATCHES "^[Xx]64$" OR CMAKE_GENERATOR MATCHES "Win64$") set(_VCPKG_TARGET_TRIPLET "x64-windows") elseif(CMAKE_GENERATOR_PLATFORM MATCHES "^[Aa][Rr][Mm]$" OR CMAKE_GENERATOR MATCHES "ARM$") set(_VCPKG_TARGET_TRIPLET "arm-windows") else() set(_VCPKG_TARGET_TRIPLET "x86-windows") endif() set(_VCPKG_ARGS "-VcpkgTriplet " ${_VCPKG_TARGET_TRIPLET}) if(BUILD_ANIMVIEWER) string(CONCAT _VCPKG_ARGS ${_VCPKG_ARGS} " -BuildAnimView $True") else() string(CONCAT _VCPKG_ARGS ${_VCPKG_ARGS} " -BuildAnimView $False") endif() string(CONCAT _VCPKG_ARGS ${_VCPKG_ARGS} " -VcpkgCommitSha " ${VCPKG_COMMIT_SHA} " ") # Run the build script set(_SCRIPT_COMMAND powershell ${_SCRIPT_DIR}/${_VCPKG_SCRIPT_NAME}) execute_process(WORKING_DIRECTORY ${VCPKG_PARENT_DIR} COMMAND ${_SCRIPT_COMMAND} ${_VCPKG_ARGS} RESULT_VARIABLE err_val ) if(err_val) message(FATAL_ERROR "Failed to build vcpkg dependencies. " "\nIf this error persists try deleting the 'vcpkg' folder.\n") endif() set(VCPKG_INSTALLED_PATH ${VCPKG_PARENT_DIR}/vcpkg/installed/${_VCPKG_TARGET_TRIPLET}) set(CMAKE_TOOLCHAIN_FILE ${VCPKG_PARENT_DIR}/vcpkg/scripts/buildsystems/vcpkg.cmake) CorsixTH-0.63/CMakeLists.txt000066400000000000000000000101511347163623700157170ustar00rootroot00000000000000# Cmake File for CorsixTH # OPTIONS AVAILABLE: # At most, one of the following: # - WITH_SDL : Activate SDL Renderer (default) # Any of the following: # - WITH_AUDIO : Activate Sound (enabled by default) # - WITH_FREETYPE2 # - WITH_MOVIES : Activate movies (requires Sound) # - BUILD_ANIMVIEWER # - WITH_LUAJIT : Whether to use LuaJIT 2 instead of Lua51 (default is LuaJIT 2) # - WITH_LIBAV : Whether to use LibAV (as opposed to FFMEPG) when building movies # - WITH_VLD : Build with Visual Leak Detector (requires Visual Studio) cmake_minimum_required(VERSION 3.5) set(CMAKE_MODULE_PATH ${CMAKE_CURRENT_SOURCE_DIR}/CMake) if(CMAKE_GENERATOR MATCHES "^Visual Studio 14 2015" OR CMAKE_GENERATOR MATCHES "^Visual Studio 15 2017") option(USE_VCPKG_DEPS "Build vcpkg dependencies locally" OFF) endif() if(USE_VCPKG_DEPS) message("Note: Using locally built vcpkg dependencies.") include(VcpkgDeps) endif() project(CorsixTH_Top_Level) if(MINGW) set(CMAKE_EXE_LINKER_FLAGS "-static-libgcc -static-libstdc++") endif() include(CheckIncludeFiles) set(CORSIX_TH_DONE_TOP_LEVEL_CMAKE ON) # Dependency management if(UNIX AND CMAKE_COMPILER_IS_GNU) option(USE_PRECOMPILED_DEPS "Use Precompiled Dependencies" OFF) # Make *nix systems opt in endif() # Define our options option(USE_SOURCE_DATADIRS "Use the source directory for loading resources. Incompatible with the install target" OFF) option(WITH_SDL "Activate SDL Renderer" ON) # our default option option(WITH_AUDIO "Activate Sound" ON) # enabled by default option(WITH_MOVIES "Activate in game movies" ON) option(WITH_FREETYPE2 "Enhanced Font Support" ON) option(WITH_LUAJIT "Use LuaJIT instead of Lua" OFF) option(WITH_LIBAV "Use LibAV instead of FFmpeg" OFF) option(BUILD_ANIMVIEWER "Build the animation viewer as part of the build process" OFF) if(MSVC) option(WITH_VLD "Build with Visual Leak Detector for Visual Studio" OFF) endif() if(WITH_AUDIO) set(CORSIX_TH_USE_SDL_MIXER ON) message("Note: SDL audio is enabled (default)") else() set(CORSIX_TH_USE_SDL_MIXER OFF) message("Note: SDL audio is disabled") endif() if(WITH_MOVIES) if(WITH_AUDIO) if(WITH_LIBAV) set(CORSIX_TH_USE_FFMPEG OFF) set(CORSIX_TH_USE_LIBAV ON) message("Note: LibAV video is enabled") else() set(CORSIX_TH_USE_FFMPEG ON) set(CORSIX_TH_USE_LIBAV OFF) message("Note: FFMPEG video is enabled (default)") endif() else() set(CORSIX_TH_USE_FFMPEG OFF) set(CORSIX_TH_USE_LIBAV OFF) message("Note: FFMPEG video disabled since it requires SDL audio.") endif() else() set(CORSIX_TH_USE_FFMPEG OFF) set(CORSIX_TH_USE_LIBAV OFF) message("Note: FFMPEG video is disabled") endif() if(WITH_FREETYPE2) set(CORSIX_TH_USE_FREETYPE2 ON) message("Note: FreeType2 is enabled (default)") else() set(CORSIX_TH_USE_FREETYPE2 OFF) message("Note: FreeType2 is disabled") endif() if(MSVC) if(WITH_VLD) set(CORSIX_TH_USE_VLD ON) message("Note: Visual Leak Detector is enabled") else() set(CORSIX_TH_USE_VLD OFF) message("Note: Visual Leak Detector is disabled (default)") endif() else() set(CORSIX_TH_USE_VLD OFF) endif() # Get precompiled dependencies before running the various find modules if(USE_PRECOMPILED_DEPS) message("Note: Using precompiled dependencies.") include(PrecompiledDeps) endif() include(GNUInstallDirs) # Include individual projects message("") # We always build CorsixTH otherwise we would miss the generated header message("Building CorsixTH") add_subdirectory(CorsixTH) if(BUILD_ANIMVIEWER) message("Building AnimView") add_subdirectory(AnimView) endif() # Documentation generation, construct 'doc' target (or a message it is disabled). # Try to find 'lua' if(WITH_LUAJIT) set(LUA_PROGRAM_NAMES luajit-2.0.3 luajit) else() set(LUA_PROGRAM_NAMES lua53 lua5.3 lua-5.3 lua52 lua5.2 lua-5.2 lua51 lua5.1 lua-5.1 lua) endif() find_program(LUA_PROGRAM_PATH ${LUA_PROGRAM_NAMES} PATHS ENV LUA_DIR /opt /opt/local ~ ~/Library/Frameworks /Library/Frameworks ) if(LUA_PROGRAM_PATH) set(LUA_PROGRAM_FOUND TRUE) else() set(LUA_PROGRAM_FOUND FALSE) endif() include(GenerateDoc) CorsixTH-0.63/CONTRIBUTING.txt000066400000000000000000000074741347163623700156450ustar00rootroot00000000000000TELL OTHER DEVS WHAT YOU ARE WORKING ON When you start working on a fix/enhancement for an open issue please always post a comment in this issue's discussion to tell other devs that you have started working on it so that they won't waste any of their free time by working on their own fix/enhancement for it. If there isn't an open issue discussion for a bug fix/enhancement you want to work on please check that there isn't a closed discussion for it because a previous developer of it didn't finish their work which you could finish. And if there is no existing issue discussion for what you want to work on please open a new issue for it and tell other devs here that your going to/ have started working on it. SUGGESTION If you want to make a suggestion, please copy the following questions into your issue and answer them: What is it you would like in the game? What version of the product are you using? On what operating system? PULL REQUEST When providing a pull request ensure the description field describes the major changes from the request. If your pull request relates to any existing issues, include those issues in the description. e.g. "Fixes issue #1" CONTRIBUTING CODE: First Time 1. Ensure you have a GitHub account (https://github.com/signup/free) 2. Fork CorsixTH\CorsixTH (https://github.com/CorsixTH/CorsixTH/fork) 3. Ensure you have a git client. (http://desktop.github.com) 4. Clone your fork to your computer - If using github client, run Git Shell - git clone https://github.com/mygithubuser/CorsixTH.git 5. Add upstream remote - git remote add upstream https://github.com/CorsixTH/CorsixTH.git Every Time 6. Sync your master branch with the CorisxTH repository's master branch - git fetch upstream - git rebase upstream/master 7. Make sure no one is already working on the issue you want to work on. 8. Tell other developers that you've started/will start working on this issue by posting a comment in its existing issue discussion or if there's no existing discussion for it then please open a new issue discussion for it and tell other devs here that your working on it. 9. Create feature branch - git branch myfeature upstream/master 10. Checkout your feature branch - git checkout myfeature 11. Make your changes 12. Unittest continuously, see README.txt in CorsixTH/Luatest for more info 13. Review your changes - git diff (each file) - git add - git diff --check Check there's no white spaces. - git commit Write an informative commit message and save 14. Push your changes to your fork - git push origin myfeature 15. Create a pull request (https://github.com/mygithubuser/CorsixTH/compare/CorsixTH:master...myfeature) Now watch to see if your feature is accepted. Notes: Multiple commits: If your feature is very big, break it into subprojects and do a separate commit for every independent operation. This means doing step 10 several times as you go. You still only need to do one pull request at the end. Syncing with Upstream: If it takes a long time between when you start your feature and when you finish there might be other important changes other people are making to CorsixTH. It is a good idea to make sure your code will still operate correctly with the latest changes. To do this: - git fetch upstream - git rebase upstream/master What this does is downloads all the changes from CorsixTH\CorsixTH since you started, and pretends that all your changes were made after them. If there are conflicts, for example if someone else changed the same line in the same file that you did you will be asked to resolve those conflicts. If you follow these guidelines then you should be well on your way to producing good pull requests. If you need more help just ask the friendly people on corsix-th-dev@googlegroups.com or via IRC in #corsix-th on freenode. CorsixTH-0.63/CorsixTH/000077500000000000000000000000001347163623700146645ustar00rootroot00000000000000CorsixTH-0.63/CorsixTH/Bitmap/000077500000000000000000000000001347163623700161005ustar00rootroot00000000000000CorsixTH-0.63/CorsixTH/Bitmap/aux_ui.dat000066400000000000000000000111711347163623700200650ustar00rootroot00000000000000>7>>=6>>75345667>764567>76567@=6i67>76567B=>7j67>765i6=A=7N67D=>7l67>765i67>D=7G67C=>7p67>765l677>C=7A67D=>7r67>765o67>D=77E=7t67>765q67>J=>7v67>765t67E=>7y67>765s67G=7y67>765q67K=7w67>765p67D=7>D=7u67>765n67D=>7667>D=7s67>765m67C=>7B67>E=6p67>765l67B=>7F67>D=7o67>765k6=A=>7J67>D=6m67>765j67@=>7N67>B=6m67>765j67@=6Q6=A=6m67>765j67==>7R67>==>7n67>765k6>77T67>>7o67>76567>7677>>7>>>                                                           PPPAPPEPPIPPMPPQPPQPPMPPIPPEPPAPPPPPPAPPAPPAPPAPPPPPPPPPPAPPAPPAPPAPPPPPPPPAPPAPPAPPAPPPPPPAPPAPPAPPAPPPPPԼԸԆԴԊ԰ԎԬԒԪԒԬԎ԰ԊԴԆԸԼԿgi d 餤顡`駩\A]B@[C@\BcA@@                                     cccccccccghhfed d 顠c c                                         ?????-?????-                                  @@@@ @@dB`C`BdAehijgccccccccc                                        c d d@eghihɄf                                                                                            CorsixTH-0.63/CorsixTH/Bitmap/aux_ui.spec000066400000000000000000000021021347163623700202410ustar00rootroot00000000000000-- Bitmaps to create sprite sheet from sprites = {} sprites[ 1] = "build_room_dialog_close.bmp" sprites[ 2] = "map_cell_outline.bmp" sprites[ 3] = "flag_passable.bmp" sprites[ 4] = "flag_travel_north.bmp" sprites[ 5] = "flag_travel_east.bmp" sprites[ 6] = "flag_travel_south.bmp" sprites[ 7] = "flag_travel_west.bmp" sprites[ 8] = "flag_hospital.bmp" sprites[ 9] = "flag_buildable.bmp" sprites[10] = "fullscreen_border_topleft.bmp" sprites[11] = "fullscreen_border_top.bmp" sprites[12] = "fullscreen_border_topright.bmp" sprites[13] = "fullscreen_border_left.bmp" sprites[14] = "fullscreen_border_right.bmp" sprites[15] = "fullscreen_border_bottomleft.bmp" sprites[16] = "fullscreen_border_bottom.bmp" sprites[17] = "fullscreen_border_bottomright.bmp" sprites[18] = "map_cell_outline_north.bmp" sprites[19] = "map_cell_outline_east.bmp" sprites[20] = "map_cell_outline_south.bmp" sprites[21] = "map_cell_outline_west.bmp" -- Palette options palette = "from bitmap" -- Compression options complex = true rnc = false -- Output filenames output_tab = "aux_ui.tab" output_dat = "aux_ui.dat" CorsixTH-0.63/CorsixTH/Bitmap/aux_ui.tab000066400000000000000000000002041347163623700200560ustar00rootroot00000000000000@ @ C@ @ @ @ O@ @ 11(( L11d ( (@ 11E( i11w@ @ z@ @ CorsixTH-0.63/CorsixTH/Bitmap/bootstrap_font.bmp000066400000000000000000000612661347163623700216560ustar00rootroot00000000000000BMb6(^CorsixTH-0.63/CorsixTH/Bitmap/bootstrap_font.dat000066400000000000000000000115501347163623700216370ustar00rootroot00000000000000A DD+)CA@@A @ !@ @@ @@@ C@@  !AA@AA C@A@ @##  @ @   @"!#  AB@ @@ @B@@A @@ @@@A @  B B   BBB  CC@A@CC @  @ AAA#  A@&AA@@A BB@@@ A C  A @@@AA#@   @CorsixTH-0.63/CorsixTH/Bitmap/bootstrap_font.pal000066400000000000000000000014001347163623700216340ustar00rootroot00000000000000?????CorsixTH-0.63/CorsixTH/Bitmap/bootstrap_font.tab000066400000000000000000000025061347163623700216360ustar00rootroot00000000000000   G t      ; O V ` f |      1 R q        ) N q      4 X v     + P n      E m      / A K U p       8 C ]         4  G  e  }        2  >  ^  m       ,  K  m           :  Z  u       $  B  ^       7 _       : R l       = ^       5 L n     ' D g        @ R CorsixTH-0.63/CorsixTH/Bitmap/build_room_dialog_close.bmp000066400000000000000000000112161347163623700234400ustar00rootroot00000000000000BM6(X  ymyauYmMA(19E Q]m]]]QQQEEE===111 e}QQQiyaAEqQYam(E$a5}I}}q}i} a} Y}Q}M}myYi=U$A 1$=-yUAmYI 1($5$qqUiqUE}]MeYmeuq}}ƊזYm}qy]qMmA}quiia]YUEQ-]ʪ׮ƒ}uqyiu}]i--e-9m-Eu1Y}y $-1Ʀ9ʮ=ζE׾MUYaqye mu$-=IYeuUey$9$919E=]IuYiueeemmmyyy}}yamaQUa]aaYYaMM]ayU9A I$Q(Y-a1i5q]IaIiaYUIQAYA]5Q9U9YEa1MyQiam-IyIeMiYi5UQe]u1M9]UqҺ5Y]iAUI]A]YuQm]iƮQa9M}amAQaAyaeu9U}1Mu9 A1A(9AQ1Y1aYIaYyQayieUe>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>77777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777>>7666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666677>7656666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666667>76566666666666666666666666666666666666666666666666>776666666666666666666666667>>76666666666666666666666666666666666666666666666666667>76566666666666666666666666666666666666666666666667==>766666666666666666666667>==>7666666666666666666666666666666666666666666666666667>76566666666666666666666666666666666666666666666667====6666666666666666666666======666666666666666666666666666666666666666666666666667>76566666666666666666666666666666666666666666666667====>76666666666666666667>======666666666666666666666666666666666666666666666666667>76566666666666666666666666666666666666666666666666======>7666666666666667>========666666666666666666666666666666666666666666666666667>7656666666666666666666666666666666666666666666666667======>766666666667>========76666666666666666666666666666666666666666666666666667>76566666666666666666666666666666666666666666666666667=======>76666667>=========666666666666666666666666666666666666666666666666666667>765666666666666666666666666666666666666666666666666667========>7667>========766666666666666666666666666666666666666666666666666666667>76566666666666666666666666666666666666666666666666666667========7>========76666666666666666666666666666666666666666666666666666666667>765666666666666666666666666666666666666666666666666666667===============7666666666666666666666666666666666666666666666666666666666667>76566666666666666666666666666666666666666666666666666666667===========766666666666666666666666666666666666666666666666666666666666667>765666666666666666666666666666666666666666666666666666666667=========>766666666666666666666666666666666666666666666666666666666666667>765666666666666666666666666666666666666666666666666666667>==============>766666666666666666666666666666666666666666666666666666666667>7656666666666666666666666666666666666666666666666666667>========77=========7666666666666666666666666666666666666666666666666666666667>76566666666666666666666666666666666666666666666666677>=======7666667========>76666666666666666666666666666666666666666666666666666667>7656666666666666666666666666666666666666666666667>========7666666666667=======>766666666666666666666666666666666666666666666666666667>765666666666666666666666666666666666666666666666======76666666666666666667========>76666666666666666666666666666666666666666666666667>765666666666666666666666666666666666666666666666666666666666666666666666666667======>766666666666666666666666666666666666666666666667>7656666666666666666666666666666666666666666666666666666666666666666666666666666667====66666666666666666666666666666666666666666666667>7645666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666667>7534555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555667>>=6666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666>>>7777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777>CorsixTH-0.63/CorsixTH/Bitmap/flag_buildable.bmp000066400000000000000000000060661347163623700215240ustar00rootroot00000000000000BM6 6(@ ymyauYmMA(19E Q]m]]]QQQEEE===111 e}QQQiyaAEqQYam(E$a5}I}}q}i} a} Y}Q}M}myYi=U$A 1$=-yUAmYI 1($5$qqUiqUE}]MeYmeuq}}ƊזYm}qy]qMmA}quiia]YUEQ-]ʪ׮ƒ}uqyiu}]i--e-9m-Eu1Y}y $-1Ʀ9ʮ=ζE׾MUYaqye mu$-=IYeuUey$9$919E=]IuYiueeemmmyyy}}yamaQUa]aaYYaMM]ayU9A I$Q(Y-a1i5q]IaIiaYUIQAYA]5Q9U9YEa1MyQiam-IyIeMiYi5UQe]u1M9]UqҺ5Y]iAUI]A]YuQm]iƮQa9M}amAQaAyaeu9U}1Mu9 A1A(9AQ1Y1aYIaYyQayieUeCorsixTH-0.63/CorsixTH/Bitmap/flag_hospital.bmp000066400000000000000000000060661347163623700214240ustar00rootroot00000000000000BM6 6(@ ymyauYmMA(19E Q]m]]]QQQEEE===111 e}QQQiyaAEqQYam(E$a5}I}}q}i} a} Y}Q}M}myYi=U$A 1$=-yUAmYI 1($5$qqUiqUE}]MeYmeuq}}ƊזYm}qy]qMmA}quiia]YUEQ-]ʪ׮ƒ}uqyiu}]i--e-9m-Eu1Y}y $-1Ʀ9ʮ=ζE׾MUYaqye mu$-=IYeuUey$9$919E=]IuYiueeemmmyyy}}yamaQUa]aaYYaMM]ayU9A I$Q(Y-a1i5q]IaIiaYUIQAYA]5Q9U9YEa1MyQiam-IyIeMiYi5UQe]u1M9]UqҺ5Y]iAUI]A]YuQm]iƮQa9M}amAQaAyaeu9U}1Mu9 A1A(9AQ1Y1aYIaYyQayieUeCorsixTH-0.63/CorsixTH/Bitmap/flag_passable.bmp000066400000000000000000000060661347163623700213730ustar00rootroot00000000000000BM6 6(@ ymyauYmMA(19E Q]m]]]QQQEEE===111 e}QQQiyaAEqQYam(E$a5}I}}q}i} a} Y}Q}M}myYi=U$A 1$=-yUAmYI 1($5$qqUiqUE}]MeYmeuq}}ƊזYm}qy]qMmA}quiia]YUEQ-]ʪ׮ƒ}uqyiu}]i--e-9m-Eu1Y}y $-1Ʀ9ʮ=ζE׾MUYaqye mu$-=IYeuUey$9$919E=]IuYiueeemmmyyy}}yamaQUa]aaYYaMM]ayU9A I$Q(Y-a1i5q]IaIiaYUIQAYA]5Q9U9YEa1MyQiam-IyIeMiYi5UQe]u1M9]UqҺ5Y]iAUI]A]YuQm]iƮQa9M}amAQaAyaeu9U}1Mu9 A1A(9AQ1Y1aYIaYyQayieUePPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPCorsixTH-0.63/CorsixTH/Bitmap/flag_travel_east.bmp000066400000000000000000000060661347163623700221120ustar00rootroot00000000000000BM6 6(@ ymyauYmMA(19E Q]m]]]QQQEEE===111 e}QQQiyaAEqQYam(E$a5}I}}q}i} a} Y}Q}M}myYi=U$A 1$=-yUAmYI 1($5$qqUiqUE}]MeYmeuq}}ƊזYm}qy]qMmA}quiia]YUEQ-]ʪ׮ƒ}uqyiu}]i--e-9m-Eu1Y}y $-1Ʀ9ʮ=ζE׾MUYaqye mu$-=IYeuUey$9$919E=]IuYiueeemmmyyy}}yamaQUa]aaYYaMM]ayU9A I$Q(Y-a1i5q]IaIiaYUIQAYA]5Q9U9YEa1MyQiam-IyIeMiYi5UQe]u1M9]UqҺ5Y]iAUI]A]YuQm]iƮQa9M}amAQaAyaeu9U}1Mu9 A1A(9AQ1Y1aYIaYyQayieUePPPPPPPPPPPPPPPPPPPPPPPPPPPPPPCorsixTH-0.63/CorsixTH/Bitmap/flag_travel_north.bmp000066400000000000000000000060661347163623700223100ustar00rootroot00000000000000BM6 6(@ ymyauYmMA(19E Q]m]]]QQQEEE===111 e}QQQiyaAEqQYam(E$a5}I}}q}i} a} Y}Q}M}myYi=U$A 1$=-yUAmYI 1($5$qqUiqUE}]MeYmeuq}}ƊזYm}qy]qMmA}quiia]YUEQ-]ʪ׮ƒ}uqyiu}]i--e-9m-Eu1Y}y $-1Ʀ9ʮ=ζE׾MUYaqye mu$-=IYeuUey$9$919E=]IuYiueeemmmyyy}}yamaQUa]aaYYaMM]ayU9A I$Q(Y-a1i5q]IaIiaYUIQAYA]5Q9U9YEa1MyQiam-IyIeMiYi5UQe]u1M9]UqҺ5Y]iAUI]A]YuQm]iƮQa9M}amAQaAyaeu9U}1Mu9 A1A(9AQ1Y1aYIaYyQayieUePPPPPPPPPPPPPPPPPPPPPPPPPPPPPPCorsixTH-0.63/CorsixTH/Bitmap/flag_travel_south.bmp000066400000000000000000000060661347163623700223200ustar00rootroot00000000000000BM6 6(@ ymyauYmMA(19E Q]m]]]QQQEEE===111 e}QQQiyaAEqQYam(E$a5}I}}q}i} a} Y}Q}M}myYi=U$A 1$=-yUAmYI 1($5$qqUiqUE}]MeYmeuq}}ƊזYm}qy]qMmA}quiia]YUEQ-]ʪ׮ƒ}uqyiu}]i--e-9m-Eu1Y}y $-1Ʀ9ʮ=ζE׾MUYaqye mu$-=IYeuUey$9$919E=]IuYiueeemmmyyy}}yamaQUa]aaYYaMM]ayU9A I$Q(Y-a1i5q]IaIiaYUIQAYA]5Q9U9YEa1MyQiam-IyIeMiYi5UQe]u1M9]UqҺ5Y]iAUI]A]YuQm]iƮQa9M}amAQaAyaeu9U}1Mu9 A1A(9AQ1Y1aYIaYyQayieUePPPPPPPPPPPPPPPPPPPPPPPPPPPPPPCorsixTH-0.63/CorsixTH/Bitmap/flag_travel_west.bmp000066400000000000000000000060661347163623700221400ustar00rootroot00000000000000BM6 6(@ ymyauYmMA(19E Q]m]]]QQQEEE===111 e}QQQiyaAEqQYam(E$a5}I}}q}i} a} Y}Q}M}myYi=U$A 1$=-yUAmYI 1($5$qqUiqUE}]MeYmeuq}}ƊזYm}qy]qMmA}quiia]YUEQ-]ʪ׮ƒ}uqyiu}]i--e-9m-Eu1Y}y $-1Ʀ9ʮ=ζE׾MUYaqye mu$-=IYeuUey$9$919E=]IuYiueeemmmyyy}}yamaQUa]aaYYaMM]ayU9A I$Q(Y-a1i5q]IaIiaYUIQAYA]5Q9U9YEa1MyQiam-IyIeMiYi5UQe]u1M9]UqҺ5Y]iAUI]A]YuQm]iƮQa9M}amAQaAyaeu9U}1Mu9 A1A(9AQ1Y1aYIaYyQayieUePPPPPPPPPPPPPPPPPPPPPPPPPPPPPPCorsixTH-0.63/CorsixTH/Bitmap/fullscreen_border_bottom.bmp000066400000000000000000000026361347163623700236720ustar00rootroot00000000000000BM6(( h  ymyauYmMA(19E Q]m]]]QQQEEE===111 e}QQQiyaAEqQYam(E$a5}I}}q}i} a} Y}Q}M}myYi=U$A 1$=-yUAmYI 1($5$qqUiqUE}]MeYmeuq}}ƊזYm}qy]qMmA}quiia]YUEQ-]ʪ׮ƒ}uqyiu}]i--e-9m-Eu1Y}y $-1Ʀ9ʮ=ζE׾MUYaqye mu$-=IYeuUey$9$919E=]IuYiueeemmmyyy}}yamaQUa]aaYYaMM]ayU9A I$Q(Y-a1i5q]IaIiaYUIQAYA]5Q9U9YEa1MyQiam-IyIeMiYi5UQe]u1M9]UqҺ5Y]iAUI]A]YuQm]iƮQa9M}amAQaAyaeu9U}1Mu9 A1A(9AQ1Y1aYIaYyQayieUeCorsixTH-0.63/CorsixTH/Bitmap/fullscreen_border_bottomleft.bmp000066400000000000000000000070521347163623700245420ustar00rootroot00000000000000BM*6(11   ymyauYmMA(19E Q]m]]]QQQEEE===111 e}QQQiyaAEqQYam(E$a5}I}}q}i} a} Y}Q}M}myYi=U$A 1$=-yUAmYI 1($5$qqUiqUE}]MeYmeuq}}ƊזYm}qy]qMmA}quiia]YUEQ-]ʪ׮ƒ}uqyiu}]i--e-9m-Eu1Y}y $-1Ʀ9ʮ=ζE׾MUYaqye mu$-=IYeuUey$9$919E=]IuYiueeemmmyyy}}yamaQUa]aaYYaMM]ayU9A I$Q(Y-a1i5q]IaIiaYUIQAYA]5Q9U9YEa1MyQiam-IyIeMiYi5UQe]u1M9]UqҺ5Y]iAUI]A]YuQm]iƮQa9M}amAQaAyaeu9U}1Mu9 A1A(9AQ1Y1aYIaYyQayieUe梢CorsixTH-0.63/CorsixTH/Bitmap/fullscreen_border_bottomright.bmp000066400000000000000000000070521347163623700247250ustar00rootroot00000000000000BM*6(11   ymyauYmMA(19E Q]m]]]QQQEEE===111 e}QQQiyaAEqQYam(E$a5}I}}q}i} a} Y}Q}M}myYi=U$A 1$=-yUAmYI 1($5$qqUiqUE}]MeYmeuq}}ƊזYm}qy]qMmA}quiia]YUEQ-]ʪ׮ƒ}uqyiu}]i--e-9m-Eu1Y}y $-1Ʀ9ʮ=ζE׾MUYaqye mu$-=IYeuUey$9$919E=]IuYiueeemmmyyy}}yamaQUa]aaYYaMM]ayU9A I$Q(Y-a1i5q]IaIiaYUIQAYA]5Q9U9YEa1MyQiam-IyIeMiYi5UQe]u1M9]UqҺ5Y]iAUI]A]YuQm]iƮQa9M}amAQaAyaeu9U}1Mu9 A1A(9AQ1Y1aYIaYyQayieUeCorsixTH-0.63/CorsixTH/Bitmap/fullscreen_border_left.bmp000066400000000000000000000030261347163623700233120ustar00rootroot00000000000000BM6( (  ymyauYmMA(19E Q]m]]]QQQEEE===111 e}QQQiyaAEqQYam(E$a5}I}}q}i} a} Y}Q}M}myYi=U$A 1$=-yUAmYI 1($5$qqUiqUE}]MeYmeuq}}ƊזYm}qy]qMmA}quiia]YUEQ-]ʪ׮ƒ}uqyiu}]i--e-9m-Eu1Y}y $-1Ʀ9ʮ=ζE׾MUYaqye mu$-=IYeuUey$9$919E=]IuYiueeemmmyyy}}yamaQUa]aaYYaMM]ayU9A I$Q(Y-a1i5q]IaIiaYUIQAYA]5Q9U9YEa1MyQiam-IyIeMiYi5UQe]u1M9]UqҺ5Y]iAUI]A]YuQm]iƮQa9M}amAQaAyaeu9U}1Mu9 A1A(9AQ1Y1aYIaYyQayieUeCorsixTH-0.63/CorsixTH/Bitmap/fullscreen_border_right.bmp000066400000000000000000000030261347163623700234750ustar00rootroot00000000000000BM6( (  ymyauYmMA(19E Q]m]]]QQQEEE===111 e}QQQiyaAEqQYam(E$a5}I}}q}i} a} Y}Q}M}myYi=U$A 1$=-yUAmYI 1($5$qqUiqUE}]MeYmeuq}}ƊזYm}qy]qMmA}quiia]YUEQ-]ʪ׮ƒ}uqyiu}]i--e-9m-Eu1Y}y $-1Ʀ9ʮ=ζE׾MUYaqye mu$-=IYeuUey$9$919E=]IuYiueeemmmyyy}}yamaQUa]aaYYaMM]ayU9A I$Q(Y-a1i5q]IaIiaYUIQAYA]5Q9U9YEa1MyQiam-IyIeMiYi5UQe]u1M9]UqҺ5Y]iAUI]A]YuQm]iƮQa9M}amAQaAyaeu9U}1Mu9 A1A(9AQ1Y1aYIaYyQayieUeCorsixTH-0.63/CorsixTH/Bitmap/fullscreen_border_top.bmp000066400000000000000000000026361347163623700231700ustar00rootroot00000000000000BM6(( h  ymyauYmMA(19E Q]m]]]QQQEEE===111 e}QQQiyaAEqQYam(E$a5}I}}q}i} a} Y}Q}M}myYi=U$A 1$=-yUAmYI 1($5$qqUiqUE}]MeYmeuq}}ƊזYm}qy]qMmA}quiia]YUEQ-]ʪ׮ƒ}uqyiu}]i--e-9m-Eu1Y}y $-1Ʀ9ʮ=ζE׾MUYaqye mu$-=IYeuUey$9$919E=]IuYiueeemmmyyy}}yamaQUa]aaYYaMM]ayU9A I$Q(Y-a1i5q]IaIiaYUIQAYA]5Q9U9YEa1MyQiam-IyIeMiYi5UQe]u1M9]UqҺ5Y]iAUI]A]YuQm]iƮQa9M}amAQaAyaeu9U}1Mu9 A1A(9AQ1Y1aYIaYyQayieUeCorsixTH-0.63/CorsixTH/Bitmap/fullscreen_border_topleft.bmp000066400000000000000000000070521347163623700240400ustar00rootroot00000000000000BM*6(11   ymyauYmMA(19E Q]m]]]QQQEEE===111 e}QQQiyaAEqQYam(E$a5}I}}q}i} a} Y}Q}M}myYi=U$A 1$=-yUAmYI 1($5$qqUiqUE}]MeYmeuq}}ƊזYm}qy]qMmA}quiia]YUEQ-]ʪ׮ƒ}uqyiu}]i--e-9m-Eu1Y}y $-1Ʀ9ʮ=ζE׾MUYaqye mu$-=IYeuUey$9$919E=]IuYiueeemmmyyy}}yamaQUa]aaYYaMM]ayU9A I$Q(Y-a1i5q]IaIiaYUIQAYA]5Q9U9YEa1MyQiam-IyIeMiYi5UQe]u1M9]UqҺ5Y]iAUI]A]YuQm]iƮQa9M}amAQaAyaeu9U}1Mu9 A1A(9AQ1Y1aYIaYyQayieUe駩顡餤顡CorsixTH-0.63/CorsixTH/Bitmap/fullscreen_border_topright.bmp000066400000000000000000000070521347163623700242230ustar00rootroot00000000000000BM*6(11   ymyauYmMA(19E Q]m]]]QQQEEE===111 e}QQQiyaAEqQYam(E$a5}I}}q}i} a} Y}Q}M}myYi=U$A 1$=-yUAmYI 1($5$qqUiqUE}]MeYmeuq}}ƊזYm}qy]qMmA}quiia]YUEQ-]ʪ׮ƒ}uqyiu}]i--e-9m-Eu1Y}y $-1Ʀ9ʮ=ζE׾MUYaqye mu$-=IYeuUey$9$919E=]IuYiueeemmmyyy}}yamaQUa]aaYYaMM]ayU9A I$Q(Y-a1i5q]IaIiaYUIQAYA]5Q9U9YEa1MyQiam-IyIeMiYi5UQe]u1M9]UqҺ5Y]iAUI]A]YuQm]iƮQa9M}amAQaAyaeu9U}1Mu9 A1A(9AQ1Y1aYIaYyQayieUe顠CorsixTH-0.63/CorsixTH/Bitmap/lib_bmp.lua000066400000000000000000000077751347163623700202270ustar00rootroot00000000000000--[[ Copyright (c) 2010 Peter "Corsix" Cawley 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. --]] local io_open, table_concat, setmetatable, ipairs, string_reverse, string_char = io.open, table.concat, setmetatable, ipairs, string.reverse, string.char local math_floor = math.floor module "bmp" local mt = {__index = _M} -- Convert a little endian byte string into an integer local function LE(s) local value = 0 for n, i in ipairs{s:byte(1, #s)} do value = value + i * 256 ^ (n - 1) end return value end function open(filename) local file, err = io_open(filename, "rb") if not file then return nil, err end if file:read(2) ~= "BM" or not file:seek("cur", 8) then return nil, "Invalid header" end local bits_offset, header_size = LE(file:read(4)), LE(file:read(4)) if header_size ~= 40 then return nil, "Expected BITMAPINFOHEADER. Header size was " .. header_size end local width, height = LE(file:read(4)), LE(file:read(4)) local planes, bpp = LE(file:read(2)), LE(file:read(2)) if planes ~= 1 then return nil, "Expected single colour plane" end if bpp ~= 8 then return nil, "Expected 8 bit paletted image" end local compression = LE(file:read(4)) if compression ~= 0 then return nil, "Expected uncompressed image" end file:seek("cur", 12) local pal_size = LE(file:read(4)) if pal_size == 0 then pal_size = 2 ^ bpp end file:seek("cur", 4) local palette = {} for pal_idx = 1, pal_size do local bgr = file:read(3) file:seek("cur", 1) palette[pal_idx] = convertPal(bgr) end return setmetatable({ file = file, bits_offset = bits_offset, width = width, height = height, pal_size = pal_size, palette = table_concat(palette), }, mt) end function getPixel(bmp, x, y) local file, width = bmp.file, bmp.width if x < 0 or y < 0 or x >= width or y >= bmp.height then return nil, "Invalid pixel" end local stride = width + ((4 - (width % 4)) % 4) local offset = (bmp.height - 1 - y) * stride + x if not file:seek("set", bmp.bits_offset + offset) then return nil, "Invalid data offset" end return file:read(1) end function getPixels(bmp) local file, width = bmp.file, bmp.width if not file:seek("set", bmp.bits_offset) then return nil, "Invalid data offset" end local rows = {} local skip = (4 - (width % 4)) % 4 for y = bmp.height, 1, -1 do rows[y] = file:read(width) file:seek("cur", skip) end return table_concat(rows) end function getSubPixels(bmp, x, y, w, h) local file, width = bmp.file, bmp.width local stride = width + ((4 - (width % 4)) % 4) local offset = (bmp.height - y - h) * stride + x if not file:seek("set", bmp.bits_offset + offset) then return nil, "Invalid data offset" end local rows = {} local skip = stride - w for y = h, 1, -1 do rows[y] = file:read(w) file:seek("cur", skip) end return table_concat(rows) end function convertPal(data) return (data:gsub("...", string_reverse):gsub(".", function(c) return string_char(math_floor(c:byte() / 255 * 63 + 0.5)) end)) end CorsixTH-0.63/CorsixTH/Bitmap/lib_spritesheet.lua000066400000000000000000000101331347163623700217660ustar00rootroot00000000000000--[[ Copyright (c) 2010 Peter "Corsix" Cawley 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. --]] local io_open, assert, setmetatable, string_char, table_concat = io.open, assert, setmetatable, string.char, table.concat module "spritesheet" local mt = {__index = _M} function open(filename_tab, filename_dat, is_complex) return setmetatable({ tab = assert(io_open(filename_tab, "wb")), dat = assert(io_open(filename_dat, "wb")), encode = is_complex and encodeComplex or encodeSimple, }, mt) end function close(ss) ss.tab:close() ss.dat:close() return ss end function writeDummy(ss) ss.tab:write"\0\0\0\0\0\0" return ss end -- Convert an integer into a little endian byte string local function uint4(value) local b0, b1, b2, b3 b0 = value % 0x100 value = (value - b0) / 0x100 b1 = value % 0x100 value = (value - b1) / 0x100 b2 = value % 0x100 value = (value - b2) / 0x100 return string_char(b0, b1, b2, value) end function write(ss, width, height, pixels) ss.tab:write(uint4(ss.dat:seek())) ss.tab:write(string_char(width, height)) ss.dat:write(ss.encode(width, height, pixels)) return ss end function encodeSimple(width, height, data) error "TODO" end function encodeComplex(width, height, data) local result = {} local run_start = 1 local run_byte = false local prev = false local function flush_run(i) if run_byte == false then while i - run_start > 63 do result[#result + 1] = "\63" result[#result + 1] = data:sub(run_start, run_start + 62) run_start = run_start + 63 end if i ~= run_start then result[#result + 1] = string_char(i - run_start) result[#result + 1] = data:sub(run_start, i - 1) end else if run_byte == 0xFF then while i - run_start >= 63 do result[#result + 1] = "\191" run_start = run_start + 63 end if i ~= run_start then result[#result + 1] = string_char(i - run_start + 128) end else while i - run_start >= 255 do result[#result + 1] = "\255\255" result[#result + 1] = string_char(run_byte) run_start = run_start + 255 end if i ~= run_start then local d = i - run_start if 4 <= d and d <= 67 then result[#result + 1] = string_char(d + 60) result[#result + 1] = string_char(run_byte) elseif 68 <= d and d <= 130 then result[#result + 1] = string_char(d + 124) result[#result + 1] = string_char(run_byte) else result[#result + 1] = "\255" result[#result + 1] = string_char(d) result[#result + 1] = string_char(run_byte) end end end run_byte = false end run_start = i end for i = 2, #data, 1 do local byte = data:byte(i) if run_byte then if byte ~= run_byte then flush_run(i) end elseif byte == prev and i - run_start >= 4 and data:byte(i - 3) == byte and data:byte(i - 2) == byte then flush_run(i - 3) run_byte = byte end prev = byte end flush_run(#data + 1) return table_concat(result) end CorsixTH-0.63/CorsixTH/Bitmap/mainmenu1080.bmp000066400000000000000000077240661347163623700207500ustar00rootroot00000000000000BM66(8   " 1 &3 5 * 6$ ..$''';,!;2-)$3%<7777D) V3F*Q+K1U7e:b:{7@."N3 Y9!B;6Q?0a=#EEU J ceR D5C5P?P?%I4q!+b:2d:/r?hA vFkBrJ\@+CN?\D3Q_6hD'sL,xP.eJ8tN0lQ<{S2N#M%%G**T33X y33g66yWD.NFkS(kA1aN9rK4fQ{aDDEFXHQ]LJZWVWWjTGtZGt^PQiUz`LlmYzdUlr\ss^^bagggrnlh{exvfmsryyyN U)\)[6b/c+a;e=q^AdBkCpHlWnQr\tXnCvJ}L|P~Pn`uf{g|p~qw`/Gk~FZJ[Pa}iEM[RWlkvuwgkhurzwLNċV̑ZҖ]`ƙfٛaśtПrcɡlݠeȦyԤ}fnrq<<"U8fAADDbbKK^p$$r˜զŸȩԬΰӳȩѮֶ̲஀᳇ᶒɵԼǼпῠ¬ºǶмĩͷϱѼѲhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhhhhhhchchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhchhhhhhhhhhhhchhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhhhhhhchhhhhhhhhhhhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhchhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhhhhhhhhhhhhhchhhhhhhhhhhchhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhhhhhhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhhhhhhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhhhhhhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhchhhhhhhhhhhhhhhhhhhcccbXcXXXTTXTTTT0TchhhhhhchhhhhhhhhhhhhchhhhhhhhhhhhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhhhhhhhhhhhhhhchhhhhhhhhhhhhchhhhhhhhhhhhhhhhhhhchhhhhhhhhhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhhhhhhhhhhhhhhchhhhhhhhhhhhhchhhhhhhhhhhhhhhhhhhchhhhhhhhhhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhhhhhhhhhhhhhhchhhhhhhhhhhhhchhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhchhhhchhhhhhhhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhchhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhhhhhhhhhhhhhhhchhhhhchhhhhhhhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhchhhchhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhhhhhhhhhhhhhhchhhhhchhhhhhhhhhhhhhhhchhhhchhhhhhhhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhchhhhhhhhhhhhhhhhhhhhhhchhhhhhhhhhhhhhchhhhhhhchhhhhhhhhhhhhhhhhhhchhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhchhhhhhhhhchhhhhhhhhhhhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhhhhhhhhchhhhhhhhhhhhhhhchhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhhhhhhhhhcccccbXXXXTTXTTTTThhhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhdhhhchhhhhhhhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhhhhhhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhhhhhhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhhhhhhhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhchhchhhhhhhhhhhhhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhhhhhhhhchhhhhhhhhhhhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhhchhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhhhhhhhhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhhhchhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhhhhhhhchhhhhhhhhhhhhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhhhhhhhchhhhhhhhhhhhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhhhhhhhchhhhhhhhhhhhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhhhhhhhchhhhhhhhhhhhhhhhhchccccXXXXXTVTTT"ThhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhhdehhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhhhhhhhhchhhchhhhhhhhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhhhhhhhhchhhchhhhhhhhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhhhhhhhhchhhhhhhhhhhhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhhhhhhhhhhchhhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhhhchhhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhchhhhhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhchhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhhhhchhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhchhchhhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhhhhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhhhhhhchhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhhhchhhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhchhhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchccbXccXXXTTTTTTTTTTT"TTT:"ThhhhchhhhhhhhhhchhchhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhhhhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhchhhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhchhhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhchhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhchhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhchhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhchhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhchhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhdhhhhhchcccXXXXXTTTTT""TchhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhhhhchhhhchhhhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhhchhhhhhhhchhchhhhchhhhhhhhhhhchhhhhhhhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhhhhhhhhhhhhhhchhhhhhhhhchhchhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhchhhhhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhhhchhhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhhhhchhhhhhhhhhhhchhhhhhhhhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhhhchchcbXXXXTXXTTTTMTThhhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhchhhhhhhhhhchhhhhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhdhhhhhhhhhhchhhhhhhhhhhhchhhhhhhhhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhhhchhhhhhhhhhchhhhhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhchhhhhhhhhhhhhchhhhhhhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhchhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhhhhhhhhhchhchhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhhchhhhhhchhhhhhhhhhhhhchhhhhhhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhchhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhhhchhhhhhchhhhhhhhhhhhhhhhhhhhhhcccbccXXVXXTTTTTT"TThhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhchhhhhhchhhhhhhhhhhhhghhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhchhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhchhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhhhhdhhhhghhghhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhchchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhhhhhhhhchhhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhhhhchhchhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhchhhhhhhhhhhchhhhhhhchhhhhhchhhchhhhchhhhhhhhhhhhhhhhhhhhhhhchhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhchhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhchhhhhhhhhhccccbbXXXTTTT"TTT"TM"hhhhhhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhchhhhhhhhhhhchhhhhhhhhhhhhhchhhhhhhhhhhhhhchhhhhhhhhhhhhhhhhdhhhhhhchhhhhhhhhhhhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhchhhhhhhhhhhchhhhhhhchhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhchhhhhhhhhhhhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhchhhhhhhhhhhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhchhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhchhhhhhhhhhhhhhhhhhhhhchhhhhhhhhchhchhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhchhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhhhchhchhhhhhhhhhhhhhhhhhchhhhhhhhchhhhhhhhcccbbXXXXXTXTTT"T:hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhghhhhhhhhhhhhhhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhghhhhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhhchhhhhhhchhhhhhhhhhhhhhhhhhhhghhdhhhhdhhhhhhhhhhhhhghhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhghhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhhhhhhhhhhhhhhhchhhhhhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhhchhchhhhhhhhhhchhhhhhhhhhhhhchhhhhhhhhhhhhhhhhchhhhhhhhhchhhhchhhhhchhhhhhhhhhhhhhhhhhhhhhhchchhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhhchhchhhhhhhhhhchhhhhhhhhhhhhchhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhhhchhhhhhhhhhhhhhchhhhhhhhhhhhhhhhchhhhhhhhhhchhhhhhhhchhhhhhhhhhhhhchhhhhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhhhhhhhhhhchhhhhhhhhhhchhhhhhhhhchhhhhhhhhhhhchhhhhhhhhhhhhchhhchhhhhhhhhhhhhhhhhhhhhchhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhghchcXbbXXTTUTTTTchhhhhhhhhhhhhhhchhhhhhhhhhhhhhhhchhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhhhhhhhchhhhhhhhhhhchhhhhhhhhchhhhhhhhhhhhchhhhhhhhhhhhhchhhchhhhhhhhhhhhhhhhhhhhhchhhhhhhhhhhhhhhhhhhhchhhhhhhhhhhhhhhdhhdhhhhhhhhhhhhhchhhhhhhhhhchhhhhhhhhchhhhhhhhhhhhchhhhhhhhhhhhhchhhchhhhhhhhhhhhhhhhhhhhhchhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhhhhhhhhhdghhhhhhhhhhchhhhhhhhdhhchhhhhhhhhhchhhhhhhhhhhhhchhhchhhhhhhhhhhhhhhhhhhhhchchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhchhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhchhhhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhchhhhchhhhhhhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhhchhchhhhhhhhhhhhhhhhhhhhhhchhhhchhhhhhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhghhhhhhhhhchhhhhhhhhhhhhchchcccbbXXXTTTT:TTTchhhhhhhhhhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhdhhhhchhhhhhhhhchhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhhhhdhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhhhhchhehhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhhhhhhhhhhhhhchhchhhhhhhhhhhhhhhhhhchhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhchhhhhhhhchhhhchhhhhhhhhhhhhhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhdgcccXXXTXXXTTTTT:TTTTThhhhhhhhhhhhhhhhhhhhhchhdhhhhhhhhhhhchhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhdhhhhhhhhhhhhhhhhfhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhhchhhhhchhchdhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhchhdhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhdhhhchhhhhhhhhhdhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhchhhhchhhhchhhhhhhhhhhhhhhehhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhfghhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhghhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhhchhhhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhhhhhhchhhhhhhchhhhhhhhhhhhhhcccccbXXVXTTTTTT:TTchhhhhhhhhhhhhhhhhhhhhhhhghhhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhehhhhhhhhhhhhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhchhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhhhhhhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhchhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhghhhhhhhhhhchhccXbXbbXXTTTTTTTTThhhhhhhhhhhhhhhhhhhhchhhhhhhhhhhhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhchhhhhhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhghhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhchhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhhhchhhhchhhhchhhhhhhhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchghhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhchhhhhhhhhhchhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhghhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhhhhhhhhhhhhhhchhhhhhhhhhhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhchhhhhhhhhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhcccccbXXTTTXTTTTTThhhhhhhhhhhhchhhhhhhhhhhhhhhhhhchhhhhhhhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhchhhhhhhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhchhhhhhhhhhhhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhghhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhdhhhhchhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhchhhhhhhhhhhhhhhhhhhhchhhhhhhhghhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhghhhhhhhchhhhhhhhhhhhhhhhhchhhhhhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhghhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhhhhhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhchhhhhhhhhhhhhhhhhchhhhhhchhhhhhhhhhhhhhhhhhhhhhhhccccXXcXXXTTTTTTTThhchhhhhhhhhhhhhhhhhhhhghhhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhghhhhhhhhhhhhchhhhhhhhhhhhchchhhhhhhhhhhhhhhchhhhhhhhhhhhhhchhhhhhhhhhhhhchhhhhhhhhhhhchhhhhhhchhhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhghdhhhhhhhhhhgdhchhhhhhhhhhhhhhhchhhhhhchhhhhhhhhhhhhhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhchhhhhchhchhhhhhhhhhhhhhhhhhhhhhhchhhhhhhghhhhhhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhcccccXXXXXTTTTTTTchhhhhhhhhhhhhhhhhhhhhhfhhhhhhhchhhhhhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhhhhhhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhhhhchhhhhhhhhhhhhhhhghhhhhhhhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhdhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhhhdhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhfhhhhhhhhhhhhhhhhhhhhhhhhhcchcccXbXXTTTTT0"TTTchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhdhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhhhhhhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhdhhchhhhhhhhfhhhhhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhchhhhhhhhhhhghhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchcccXbbXXXXTTTTTTTTT:hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhghhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhghhhhhhhhhhhhhhchhhhhhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhdhhhhhhhhhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhghhhhhhhhchhhhhhdghhhhhhhhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhccccXXXXTUXT"TTT"TTchhhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhghhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhghhhhhhhhhhhghhhhhdhhhhhhhhhhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhhhhhhhhhhhhchhhhhhhhchhhhchhhhhhhhhhhhhhhhdhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhghhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhcccccbXXXXTTTTTTTThhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhghhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhhhhhhhhhhchhhhhhhhhhhhhhhhhhghhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhhhhhghhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhhhdhhhhhhhchhhhhchhdhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhccccccXbXXXXTTTTTTTTTTThhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhghhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhghhhhhhhhhhhchhhhhhedhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhcccXXXXXTTTT:TchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhghhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhccccccXXXTXTTTT:TT:ThhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhghhhhhhhghhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhcbccXXXXXXXTTTTTTTTThhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhcccccXXXXXTTTTTTThhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhccccccXXbXTXUTTTTT:TTThhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhfhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchccXXbXXTTTTTTTThhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhfhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhghhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhfhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh¹hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhcccbXXXVTTTTTTTThhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhghhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhcccccXXXXXXXTTTTTThhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhccccXbXXXXTTTTT:ThhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhfhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhcccccXXbXXTTT"TTTTTTThhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhfhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchcccccXXXXXXTTTTTTTThhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchcccXXXXTXTTTT"ThhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhfhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhccXcXXXXTTTTTTTTTTThhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhccccbbXXXXXXTTTTThhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhcccXccXXXTTTT:ThhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhùhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhcccdcXXXXTTTVTTTTTTTTThhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchccccXcXXTXTTTTTThhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhùhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh¹hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhccccXXXTXXXT"TTTTThhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchcccbbXXXXTTTTTT"TThhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhcccccccXXXTXTT:TTTTThhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchcccXXXXVTTTTTTTThhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh¹hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhùhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhùhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhccccXXbXXTTTTTTT""TTT"hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhccccXXXXXXXTT:TM"ThhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhùhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhùhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhccccXXbXXXTTTTT:T:TTM"hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchccccbbXTXXTTTTT"hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhùhhhhhhhhhhhhhùhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhcccccbXXXXXXTTTTTT:hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhcccbcXXXTVTTTTTTTTT::hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchcccbXXXXXTTTTTTTTThhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhcccccbbXXXXTXTTTTTTTThhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhcccXbbXXXTTTTTTThhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhdhhhhhhchhdhhhdhhhhhhhfhhhdhhhdhdhhhhcfhhhdhchdhhhfhdhhhhchhhchhhchhdhhhdhdhhhdhhhhhhchhchhgfhhhdhdhhhfhhhchhgfhhhdhhhhhdhhhhdhhhfhhhfhhhchhhhdhhdhhhhhdhhhfhhhchhhhchhhhfhchdhhhfhhhfhhhhhhhfhhhfhhhdhhhfhhhfhhhdhfhgfhhdhhhhhfhhhfhhhhhhdhhhchhchdhhhfhhhhhchhhchhhhhchhdhhhdhhhhhhhhhhhfhhhdhhhhhhcdhhhhchchhdhhhhhdhhchhhchhhchhdhhhdhhhhhdhhhfhhchhchhchhdhhhdhhhfhhhchhhdhhhdhhhhhhhhhdhhdhdhhhdhhhchhhdhhhhhdhhhfhhhdhhhchhfhhdhhhfhchdhhhhhfhhhhhhhhhfhhhdhdhhhfhhhdhhhhhfhhhchhgfhhhhhfhhhfhhhhhhchhhchhchdhhhchhhhhchhchhdhhhgfhhhdhhhhhhhdhhhfhhhfhhhdhhhhcfhhhhchchhdhhhfhhhhgfhhchhhchhhhfhhhhhdhhhfhhhhchhchhhdhhhdhhhfhhhdhhdhgfhhhfhhhhhhhhhdhhfhhhfhdhhhchhhchhhhhdhhhdhhhfhhhchhfhhdhhhhchchhfhhhdhdhhhfhhhdhdhhhhhhhfhdhhhhhhhfhhhdhhchhhhhhdhhhfhhhhhhchhhchhchdhhhdhhhhhchhchhhhhhchhhhdhhhhhhhhhhhhhhhfhhhdhhhhcdhhhhchchhdhdhdhhhhchhhchhhchhdhhhdhhhdhhhhhdhhdhhdhhchhdhhhfhhhfhhhchhhdhhhfhhhhhhhhhdhhhhdhhhhhchhdhhchhhhhdhfhdhhhfhhhchhhhchhhhhchchhdhhhfhhhfhhhdhhhfhhhfhhhdhhhfhhhfhhhdhhdhhdhfhhhhhfhhhhhhhhchhhchhchdhhhchhhhhchhchhhhhhchhfhhhdhfhhhdhhhdhhhdhhhdhhhhcdhhhhchchhdhhhdhhhchchhchhhchhfhhhfhhhdhhhfhhhhchhchhhdhhhdhhhdhgfhhchhchhhchchhhchdhhchgfhhhchhchchhhcchhdehchgfhhchhchhdhchhhchdhhchgfhhhhchgfhhhhchhchdhdhchhhhchchhchhchhhfhchhhhdhhhchhdhhfhhhdhdehchchgfhhhdhchhhdhdhhhfhhhchhhhcchhhfhchchhhdhhchhchfhhhchhfhhdhchchgfhchdhhdhhhchhhhdhdhhhhhhhhhhhcccXbbbXXTTTT"TTTcdhhgfhhhfhchchhhhhhhchhdghggfhchgfhhfhhchchchfhchhfhchcdhhchhchchdghchchchghchhhdhhchchdhhhchhchchdhchhhchchhfhchcchdhhgdghchhchddhhdhhhchchdhhhchdhfhhchhchhhchchgfhhhchchchdgcdhchchcdhhchhhchchghcgdhchgfhchchhchchcchchchhhchddhchchchchdhhchcchdhhchdgdhdhchdhhddhhchdhchhhchdhhchhchhhcchchchchchhfhchhhhchhhhchchhhhhhchchhchchhhhfhhcfhchhhchccdhfhchhhhcdhdhchdhdhchchchchfhhhhcfhchhchchchdhchchfhchdhchchhhgfhchcchhcfhfhdhfhchchhchXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXWXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXUXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXhhccccccbbXTXTXTTTM"T"XXXXXXXXXXXXXXXXXXXXXXXXXXX^XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXVXXXXXXXWXXXXTXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXVXXXXXXXXXXXXXXXXXXXXXXXXXXXVXXXXXXXXXXXXXXXXXXXXXXXVXXXXXXXXXXXTXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXbXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTWTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTWTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTTTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTWTXTXTXTXTXTXTXTXTXTTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTTXTXTTTTXTXTTXTTXTXTXTTXTXTTXTXTTXTTXTTXTTXTXTXTTXTTXTTXTXTTXTXTXTTXTTXTXTXTXTTXTTXTTXTXTTXTXTXTTXTXTTXTTXTXTTTXTTXTTXXchhccccXbXXXXTT"T"TTT""XTTXTXTXTXTXTXTTTTTXTTXTXTTTTXTXTTXTTXTTXTXTTXTTXTTXTTXTXTTXTTXTTXTXTTXTXTTXTTXTTVTXTXTTXTTXTTTXTXTTXTXTXTTXTXTTXTTVTXTTXTXTTXTTXTXTTXTXXTTXTXTTTTXTXTTXTXTTXTTXTTXTTTTTXTXTTXTTXTTXTTXTXTTXTTXTTXTXTTXTXTTXTTXTTXTXTXTTTXTTXTTXTXTTXTXTXTTXTXTTXTTXTXTTTXTTXTTXTXTTXTXTXTTXTXTTTXTXTTXTTXTTXTTXTTXTTTTTTTTTTTTTXTTTTTTXTTTTTTTXTTTTXTTTTTTTTTTTTTTTXTTTTTTTTTTTTTTXTTXTTTTTTTTTTTTTTTTTTTTTXTTXTTXTTTXTXTTTXTTXTTXTXTTXTTXTXTXTTTXTTXTTTXTXTTXTXTXTXTXTXTXTXTXTXXXXTXXTXTXTXTXTXXXXXXXXXXXXTXTXTXTXTXTXXXXXTXXTXXTXTXXTXTXTXXTXXXXXTXXTXTXTXXXTXTXTXTXTXWXXXXTXTXTXTXXTXTXXTXWXTXXTXXXXXTXTXTXTXTXTXUXTXTXTXXXTXTXTXXTXTXTXTXTXTXTXTXUXTXTXXXTXTXTXTXTXXTXTXTXTXTXXTXTXXXXXXXTXXTXXXTXTXXTXXXXTXTXTXTXTXWXTXXTXTXTXXTXXXXXTXTXTXXXTXTXXTXTXTXTXTXTXTXTXTXTXXXXXTXTXTXTXTXTXTXTXVXTXTXTXTXTXXXTXTXTXXTXVXTXXXXTXXTXTXXXXTXTXTXTXTXTXTXTXTXTXVXTXTXWXTXXXVXTXTXVXXXTXTXTXTXTXXTXTXXTXXXXXTXTXXXXXTXTXXTXTXXTXTXTXTXTXTXTXUXXXXXTXTXXXTXTXTXTXXXTXTXXXTXTXXTXTXTXTXTXTXXTXTXXTXXXXXTXXTXTXTXXXXXTXTXXXXTXTXTXXXXXTXTXTXTXTXXXXTXTXTXTXXTXUXTXTXTXTXTXTXWXTXTXTXTXTXTXTXUXTXTXTXTXVXTXTXXXXTXTXTXTXTXVXTXTXWXTXTXTXTXTXTXTXTXXXXXTXTXTXTXTXTXTXXXXTXTXTXXXXTXTXXTXTXUXXTXTXTXXXXXXXTXTXTXWXXXXXXXXXXXTXTXTXTXTXTXTXTXTXTXTXVXTXTXTXTXXTXXTXWXTXXTXXTXXTXTXTXTXTXXXTXTXTXVXTXTXTXTXTXTXTXTXTXXTXTXXTXXTXTXTXWXXXXXXXTXTXTXTXTXTXXXTXXXXXTXTXUXTXXXXTXTXTXXXXTXTXTXTXTXTXTXXTXXTXTXTXTXXTXTXTXTXTXTXTXTXTXTXTXTXXXXXTXTXTXXTXTXTXTXTXTXTXTXWXTXTXXXXXTXTXXTXTXXTXTXVXTXTXTXTXTXXXXXTXXXXXXXTXTXTXTXTXTXTXTXTXXTXVXTXXTXUXTXXXXTXTXVXTXTXTXWXXTXTXTXTXXXXXTXXXTXTXXXXXTXTXTXTXTXTXXXTXXTXTXXTXTXTXTXTXTXXXTXXTXTXTXXTXTXTXXXTXXTXXXXXXXXTXWXTXWXXTXXTXXTXVXTXTXTXXXXTXTXTXTXXXXXTXTXTXXTXTXTXTXTXTXTXVXXXTXTXTXTXXXTXTXTXTXVXTXTXTXTXTXTXTXXTXXTXTXXXTXXXXXXXXTXVXTXTXXXTXTXXTXTXTXTXXTXXTXXXXXTXXTXTXXTXXXTXTXTXXXXTXTXUXTXTXTXTXTXTXTXTXVXTXTXTXXXXXTXTXTXTXTXTXTXXXXhhhhhcccXcXXXXXTTTT"T"TTTTMXXXXTXTXTXTXTXTXXTXTXXXXTXTXTXXXXXTXTTXTXXVXTXTXTXTXTXXXXTXXXXXXVXXXXXXXTXXXXXXTXXXXXXXVTXTXXXTXTXTXXXTXTXXXXTXXXXXXXXXXXXXXXXXXXXXXXXXXTXXXXTXXXXXXXXXXXTXXXXXXXXXXXXXXTXXXXXVXXXXXXXXXVXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXTXXXXXXXXXXXXXXXXXXXXXXXXXTXXXXXXXXXXTXXXXTXXXTXXXTXXXXXXXXXXXXXXXXXXXXTXTXXXXXXXXXXTXXXTXXXXXXXXXXXXXXXXXXXXXXXWXXXXXXXXXXTXXXXTXXXXXXXXXXTXXXXXXXXXXXXTXXTXXXTXTXXXTXXTXXTXTXXTXXTXTXTXXXTTXTXTXTXTXXTXXXXXXXXXXXXXXXXXXTXXXXXXXXXXXXXXXTXXXTXXXTXXXXXXXXXXXXXXXTXXXXXXXXXXXXXXXXXXXXXVXTXXXXXXXXXXTXXXXXXXXXXXXXXTXXXXXXXXXXXXXXXXXXXXXXXXXXTXXXXXXXXXXXXXXXXXXXXXTXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXTXXXXXXXXXXXXXXXXXXXXXXXXXXXXTXXTXXXXXXTXXXXXXXXXTXXXXXXXXXXXXXXXXXXXXXXXXXTXTXXXXXXXTXXXXXXXXXXXXXXXXXXXXXXXXXXXXTXXXXXXXXXXXXXXXXXXXXXXXXXXXXXTXXXXXXXXXXXXXXXTXXXXXXXXXTXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXTXXXXXXXXTXXXXXXXXXXXXXXXXXXXXXTXXXXXXXTXXXXXXXXXXXXXXXXXXXXXXXXXXXXXTXXXXXTXXXXXXXXXTXXXXXTXXXXXXXXXXXXXXXXXXXXXXXXXXXXTXXXXXXXXXXXXTXXXXXXTXXXXXXXXXTXXXXXXXXXXXXTXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXTXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXTXXXXXXXXXXXXXXXXTXXXXXXXXTXXXXXXXXXXXXXXXXXXXXTXXTXXXXXXXXXXXTXXXTXTXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXTXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXTXXTXXXXXXXXXXXXXTXXXWXTXXXXXXXXXXTXXXXXXXXTXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXTXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXTXTXXXXXXXXXXXXXXXXXXXXXXXXXXXXTXVXXXTXXTXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXTXXXXXXXXXXXXXXXXXXXXXXXXXXTXXXTXXXXXXXTXXXXXXXXXXXXXTXXXXXXXXXXXXXXXXXXXXXTXXXVXXXXXXXXXXXXXTXXXXXXXTXXXTXXXXXXXXXXXXXXXXXXXXXXXXXXXTXXXXXXXXXXXTXXXXXXXXXXXXXXXXXXXXXXXXTXXXXXXXXXTXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXTXXXXXTXXTXXXXXXXXXTXXXXXXXXXXXXXXXXXXXXXXTXXXXXXXXXXXTXXXXXXXXTXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXWXTXXXXXXXXXXXXXXXXXTchhhhhhhhccccXXXXTXTTTMM"TT"WTXXXXXXXXXXXXXXXXXXXTXXXXXXXWXTXXXXXXXXTXXXXXXXXXXXXTXXVXTXVXTXXXTXXTXXXTXXTXXXTXXTXTXXXXXTXXXXXXXTXXXXXXTXXXTXTXTXXTXXTXXTXTXTXXTXXTXVXXTXWXTXTXTXTXXTXXXTXTXTXTXTXTXXXTXXTXXTXVXTXXTXXTXXTXXTXXTXTXXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXXWXTXXTXTXXTXXUXTXXTXTXWXTXWXTXXTXVXTXXWXTXWXTXWXTXWXTXXTXTXTXTXTXXTXXTXVXXXXXTXTXXTXXXXTXXXTXXTXXTXTXTXTXTXXTXXTXXTXTXTXXTXWXTXXWXTXWXTXXTXWXTXTXTXTXTXTXTXTXTXWXTXWXTXXTXXWXTXWXTXWXTXTXTXWXXTXXXXWXTXXTXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXVXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXVXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXchhhhchcccXXXXXXTTTT"TTTXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXbXXXXXXXXXXXXXXXXXXXXbXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXbXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXbXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXbXXbXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXbXXXXXXXXXXXXXXXXXXXXXXXXXXXbXXXXXXXbXXXXXXXXXXXXXXXXXXXbXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXbXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXbXXXXXXXXXXXXXXXXXXXXbXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXbXXXXXXXXXXXXXXXXXXXXXXXXXXbXXXXXXXXXXXXXXXXXXbXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXbXXXXXXXbXXXXXXXXXXXXXXXXXXXXXXXXbXXXXXXXXXXXXXXXXXXXXXXXXXXXbXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXbXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXbXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXbXXXXXXXXXXXXXXXXXXXXXXXXXXXbXXXXXXXXXbXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXbXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXbXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXbXXXXXXXXXXXXXXXXXXbXXXXXXXXXXXXXXXXXbXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXbXXXXXXXXXXXXXXXXXXXXXXXXXXXbXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXbXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXbXXXXXXXXXXXXXXXXXXXXbXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXhhhccccccXXXXVTTTT::TT"TXXXXXXXXXXXXXXXXXXXXbXXXXXXXXXXXXXXXXXXXbXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXbXXXXXXXXXXXXbXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXbXXbXbXXXXbXXXbXbXXXXXXXXXXbXXbXXXXbbXXXXXXbXXbXbXXXXXXXXXXXbXXXXbXXXXbXXXXXXbXXbbVXXbXbbXXbXbXXXXbXXXbXXXbXXXXXbXXbXXXbXbXXXXXXXXXbXXXbXXXbXXXXbXXXbXXXXbXXXbXXXbXXXXXXbXXbXXXXbXXXbXXXXXXXbXXXbXXXbXbXbXXXXXXXbXXXXbXXbXXXbXbXbXXXXXXXXbXXbXXbXbXXbXXXXbXXXbXXbXXbbXXXXXXXXbXXbXXbXXXbXbXXXbXXXbXXXXXbXXbXbXXXXXXXbXXbXXXbXbXXXXXbXXXbXXXXXXXXXXXXXXXbXbXXbXXXbXXbXXXXbXXXbXXXbXXbbXbXXbXXXXXbXbXXbXXbXXXXXbXXXbXXbXXXXXXXXXbXXXbXXXXbXXXbXXXbXXXXbXXXXXXXbXbXXbXXbXbXXbXXbXXXbXXXbXbXbXbXXXXbXbXXXXXXXXXXbXXXbXXbXXXXXbXbXXbXbXbXbXXXbXXXbXbXXbXXXXXXbXXbXbXXXXbXXXXbXXXbXXXbXXXbXXXXbXXbbXXXbXXXbXXXXXbXXbXXbXXXbXXXbXXXXbXXXXXXXXXXXXXXbXXbXbXXXbXXXbXXbXXXXXXXbXXXbXXXbXXXXbXXXXbXbXXXbXXXXbXbXbXbXbXXXbXXbXXXXbXXbXXXbXXbXXXbXbXXbXXbXXXXbXXbXXXXbXXXXXXXbXXXbXXXXbXXbXXXXXXXbXXXXbXXXXXXXXXXXbXbbXXXXbXXbXXbXXbXbXXbXbXXXbXbXbXXbXXXXXbXXbXXbXXXXbXXbXXbXXXbXbXXXXXbXbXXbXXbXXXXbXbXbXXXbXXXbXXXbXXXbXXXbXXbXXXXXXXXXbXXXXXbXXXbbXXbXbXXXXXbXXXXbXXbXbXXbXXXbXXbXXXXbXXXXXXbXXXXXXXXXXbXXbXbXXbXXbXbXXXXXbXXXXXbXbXXXXXXbXXXXbXbXbXbXXXXbXXbXbXXXXXXXbXXXXXbXXXXbXXbXXXXXXbXXXXXXXXbXbXXbXXbXXbXbXXbXXXXXXXbXXXbXXXXbXXXbXXXbXXbXXXXbXXXbXXXXXXbXbXXXXbXXXXXXbXXXbXXXbXXXXXbXbXXXXbXXXXbXbXXXbXXXXbXXXbXXbXXXXXXbXXbXXXXXXXbXXXXXXXXXbXXbXXXXXXbbXXbXXXbXbXXXXbXbXXbXXXXbXXXXbXbXbXXbXbXXXXXXXbXbXbXXbXXbXXbXXXXXbXXbXXXXXXXbXXbXbXXbXXbXXXbXXXbXXXXbXXbXbXXXXXXXXXXbXXXXbXXbXXXbXbXXbXXXbXXbXXbXXXXXXchhhcccccXcXXXXTTTTTTTTTXXXbXXbXbXbXXbXXXXbXXXXbXbbXXbXXXXbXXbXXXXXXbXXXXXbXXXXbXXbXbXXXXXXbXXXXXXbXXXbXXbXbXXXXXbXXXXbXXXXXXXbXXbXXXbXbXXXXXbXXXXbXXXXbXXXXXXXXbXXXXXXXXbXXbXXXbXbXbXXbXXbXXbXXXXbXXXbXXXXXXbXXXXbXXbXXXXbXXbXXXbXXXXXXXXXXXXbXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXbXXXXXXXXXXXXbXXXXXXXXXXXbXXXXXbXXXXXXXXXbXXXXXXXXXXbXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXbXXXbXXXXbXbXXbXXXbbXXbXXbXbXXXbXXbXXXXbXXXbXXXXXXXbXbXbXXXbXXXXXXXbXbXbXbXXXbXXXXXXbXbXXXXXXXXXXbXbXbXbXbXbXXXbXXXXXXXbXXXXXXbXbXXbXXbXbXXXXXbXXXbXbXXXbXbXbXbXbXbXXXXbXXbXXbXXbXXbXXbXXXXbXXXXXXXbXbXXXXbXXbXbXXXXXbXXXXbXbXXbXXXXXXbXbXbXbXXXXXXXXXbXXbXXXXXbXbXXXXXXbXXbXXbXXXXXXXXXXbXXbXbXbXbXXXbXXXXXXXXXXXXbXXbXXXXXXbXXXXbXbXXbXXXbXXbXbXXbXXbXXXXXXXbXXbXXXXXXbXXbXXXbXXXXXXXXXXXXXXbXXXXXXXbXXXbXXbXXbXXXXXbXXbXbXXXXXbXbXXbXXbXbXXbXbXXbXXbXXXXbXXXXXXbXXXbXXXbXXXXXXXXbXXXXXbXbXbbXbXXXXXXbXbXbXXXbXXXXXXXXbXbXXXXXXXXXXbXXXXXXbXXXXXXbXXbXbXXXXXXXXbXXXbXXXXXbXXbXbXbXbXXbXbXXXXXXXXXbXbXXXbXXXXXXXXXbXbXXXXXXbXXXXXbXXXbXbXbXbXXXbXXXXXXXbXXbXbXXXXbXXXXXXXXXXXXbXXXXXbXXbXXbXXXXXbXXXXXXXXXXbXbXXbXXXbXXXXbXXXbXXXbXXXXXXXbXXbXXbXXXXXXbXbXXXbXbXXbXXXbXXbXbXXXXXbXXbXXXXbXXXXbXXXbXXbXXXXXXXbXXXXXbXXbXXXXXXXXXXbXXXXXXXXXbXbXbXXbXXXXXXbXXXXbXXXbXXXXXXXbXbXXXbXXXXXXbXbXXXXXXXbXXXXXbXXbXbXXbXXXXXXXXbXXXbXXbXbXXbXXbXXXXXXbXbXbXXXXXbXXXbXXXbXXbXXXXXbXbXXbXbXXXXXbXXXXbXbXXbXbXXXbXXXbXXXXXbXXXXXbXXXXXXbXbXXbXXbXXXXbXXXXXbXXXXXXXXbXXXbXXbXXbXXbXbXXbXXXXbXbXXXbXbXXbXXXXXXXXXXXXXXXXXXXXXXXbXXXXXXbXbXXXXXXXXbXbXXbXXXXXXXXbXXbXbXXXXbXbXXbXXbXXXbXXXbXXbXbXXXXXXbXXXXXXXXXXXbXXXbXbXXbXXbXbXXXbXXXXXXXbXXbXXXbXXbXXbXXbXXXXbXbXXXXXXXbXXXbXXbXbXXXbXXbXXXXXXbXXbXXXXXbXXXXXXbXXXXXXXXXbXXXXXXXXXbXXXXXXXbXXXXXbXXXXXbXXXXXXXbXbXXbXbXXXXXXXXbXXbXbXbXXXbXXXbXXbXXXXXXXbXXbXXbXXbXXbXbXXchhhhhhhcccXbXXXXTTTTT"XbXXbXXXXbXXXXXbXXXbXXbXXXXXbXXbXXXXXXXXXXbXXXbXXXXXXXXXXXbXXXbXXbXbXXbXXXXbXbXXbXbXXXbXXXbXbXXXXXXbXXbXXXXXXbXXXXbXbXXbXXbXXbXbXXbXXbbXXXbXbXXbXXbXXbXXXXXXXXXbXXXXXXXbbXXXXXXXbXXbXXXXbXXbXXXbXXXXXXXXbXXbXXbXbXXbXXXXbXbXXbXXbXXbXXbXXXXbXXXXXXXXbXXbXXbXXbXXXXbXbXXXXXbXXXXXXbXbXbXbXbXbXXXbXXXXXXXXXXXXXXbXXXXXXXXXXXXXXXXXXXbXXXXXXXXXXXXXXXXXXXXXXXXXXXbXXXXXXXXXXXbXXbXXXXbXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXbXXbXXXbXXXXXXXXXXbbXbXbXbXXXXXXXXXXXbXXbXXXbXbXbXXbXXXXXXbXXXXXbXXXXXXXXXbXXbXXbXXXXXXbXXXbXXXXbXXXXXXbXbXbXbXXXbXXXXXbXXXbXXbXXbXXbXXbXbXXbXXXXXXXXXXXXXXXbXbXbXXXXXXXbXXXbXXXbXXXbXbXXXXXXXXXXXXbXXXXXbXXXbXXbbXXXXbXbXbXXXXXbXbXbXbXbXXXXbXXbXbXbXXXXXXXXXXXXbXXXXXXXXXXXXXXXXXXbXXXXXXbXbXbXbXXbXXbbXbXbXXXbXXXbXXbXXXbXXXbXbXbXXXXbXXcXXbXbXXXXXXXXXXXXbXXXXXXXXXXXbXXbXbXbXbXbXXXbXXXXXXXXbXXbXXXXbXXbXbXXbXXXXXXXXXXXbXXbXXXXbXXbXXXbXbXXbXXXXbXXXXXXXXXXXXXXXXXXbXXXbXXbXXXbXbXbXbXXbXXXbXXXbXbXbXXXXXXbXbXbXXXXXXXXXXXXbXXbXXbXXXXXbXXXbXbXXXXbXXXbXXXbXXXXXXXXXXXbXXXbXXXbXXbXXXbXXbXXXbXXXXXXXXXbXXXbXXbXXXXbXXXbXXXbXXXXXXXbXXbXXbXbXXXbXXXXXXXXXXXXXXXbXbXXXXXXXXXbXXXXbXXXbXXbXXXXXbXXbXXbXXXXXXbXXXXbXXXbXbXXXbXbXXbXXXXbXXXbXXXbXXXXbXXbXXXXXXXXXXXbXXbXXXXbXXXbXbXbXXXbXXXXbXXbXXXXXXbXXXXXXXXbXXXXbXXXXbXXXXXbXXXbXXbXbXXXXXbXXXXbXXXbXbXXbXXXbXXXbXXXbXXbXXXbXXXXbXXbXXXXXXXXXXXbXXbXXXXbXXXbXXbXbXXXXXXXXXXXbXXbXXbXXbXbXXXXXXXXXXXXXXbXXbXXXXXbXXbXbXbXXbXXbXbXXXbXXXXXXXXXXXbXXXXXbXXXXXbXXbXbXbXbbXbXbXbXXbXXbXXbXXXXbXXXXXXbXbXbXXbXbXbXXXXbXXbXXXXXXXXXXXXXXXXXXXXbXbXXXXXXXXXXXXbXbXXXbXXXbXXXbXXbXXbXbXXXXXbXbbXbXXXbbXXXbXXXbXXXbXXXbXXXbXXbXbXbXXXXXXXXbXXXXXXXXXXXXXXbXXXbXXXXbXbXbXXbXXXbXXXXXXXXXXXXbXXXXXbXbXXXXbXbXXXXbXXbXXXXbXXXXXXbXXbXbXXbXXXXbXXXbXbXbXXXbXXXbXXbXbXbXXXXbXbXbXXbXXXXXXXXbXXbXXbXbXXXbXXbXXXbXXXbXbXbXbXbbXXXXXXbXXXXXXbXbXXXXXbXXXXXXXbXXXXXXXbXbXXbXXXbXXbXbXbXXXbXXXXchhhhhcccccXXXXTTTTTT"TTTTXXXXbXXbXXbXbXXXXbXbXbXbXbXbXbXXXbXXbXXbXbXXbXXXXbXXXbXXXXXXXbXXXXXXXbXXXbXXXbXXbXXXbXXbXXXXXXXbXbXXXXXXbXXcXXbXbXXXXXXXXXXXXbXXXbXXbXXXbXbXXXXXXXXXXXXXbXXXbXXXXbXXbXXXXXXXbXXXXXXXXbXXXXXXbXbXXbXXbXXbXbXbXXbXXXbXXbXXXXXXXXXXXXXbXXXXXbXXXbXXbbXXbXbXXbXXXXXXbXXXXbXbXbXXXbXXXbXXXXXbXXXbXXbXXbXXbXXbXbXXbXXXXXXXXXXXbXXXbXbXXXXXXXXbXbXXbXbXbXbbXbXbXbXXXXXXXXbXbXbXbXXXXXXbXXXXbXbXXbXbXbXbXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXbXbXXXXXbXXXXXbXXbXXXXXXXXbXXXbXXXbXXXXbXbXbXXbXXXXXXXbXXXXXXXXbXXbXXbXbXbXbXbXbXXbXbXbXbXXbXXXbXbXbXbXbXbXbXbXXbXXXXXXXXbXXXXXXbXXbXXXXbXbXbXbXXXbXbXbXbXbXbXbXbXbXbXbXXXbXXXbXXXbXXXXbXXXXXXXbXXXXXbXbXXbXXbXbXXXbXXXXXXXXbXXbXbXXbXXbXXXXbXXXbXXXXXbXXbXXbXbXbXbXbXbXbXbXbXXXbXXbXXbXXXXXXXbXbXbXbXbXXXXbXXXbXXbXXXXbXXXXXXXbXXbXXXbXXXbXXXXXXXbXXbXXXbXXbXXXbXXXbXXbXXXXbXXbXXXXXXXXbXbXXXXXXXbXbXbXbXbXXbXXXXXbXbXXXXbXXXXbXXXbXbXbXXXbXXXbXXXbXXbXXXXXXXXbXXXXbXXXbXXXbXXbXbXbXbXbXXXbXbXbXbXXXbXXbXXbXXXbXXXXXXXbXXXXXXXXbXbXbXbXbXbXbXXbXXXXXbXXbXbXbXbXbXXXbXXXXXXbXXbXbXbXbXbXbXbXbXbXXbXXXbXbXXXbXbXbXXbXbXbXbXXXbXXXXXbXXXbXbXXXbXXbXXXbXXXXXXbXbXXbXXbXXbXbXbXbXXXbXXXXXXXbXXbXXbXbXXbXXXXXbXbXXbXbXXXbXbXbXbXXXXbXXXXXbXXbXXXbXXXbXXXbXXbXXXbXXXXXXXbXXXbXXXbXXXXXbXXXXXbXbXXXXX^XXXbXXbXXXXXXXXXXXXXXbXbXbXXbXbXbXXbXXXXXbXbXXbXbXbXbXbXbXbXXXXbXXXXXbXXbXXXbXXXbXXXbXXXbXXbXXXXbXXXbXbXXbXXbXXXbXXXXXXXbXXXXXXXXXXXbXXXXbXbXbXbXbXbXbXXbXXXbXXbXbXbXXbXbXXXbXXXbXXbXXXXbXXXXXbXbXbXbXXXbXXXXXbXXbXXXXXXXXXXbXbXbXbXbXXXbXXbXbXXbXXXXXXXXbXXXbXXbXXXXbXXXbXXbXbXXbXXXbXbXbXbXXXXXXbXbXbXbXXXXXXXbXXXbXXbXXbXXXXXbXXXXXbXbXbXbXbXbXbXbXbXbXbXXXbXXXbXXXbXXXXXbXXXbXXXXXXbXbXXXbXXXXXXXXXXXXXbXXbXXXbXXXXXXXXbXXXXXXbXXXXXXXbXXXXXbXXXXXXXXXXXXXbXXXXXXbXXbXbXbXXXbXbXbXbXbXbXXXbXXXbXXXXXXXXXXbXXbXXXXXXXXbXXXXXXXXXXXXXXbXbXXbXXXbXXXXbXbXXbXbXbXbXXbXbXbXXbXbXbXXbXbXbXbXbXXXXXXbXXbXbXXXbXbXXXXXX^hhhhhccXccXXXXXXTTT:TT:XXbXXbXbXbXXXbXbXXbXXXbXXbXXXbXXXXXXXXXbXXXXXXXXbXXbXXbXbXXbXXXbXXXXXXXbXXXbXXbXbXbXbXXXXbXXbXbXXbXXbXXXXXXXXbXXbXXXbXXXbXXXXXXXXXXXXXXXXXXXbXXbXXXbXXXXXXbXXXbXXXXXXbXbXbXXXbXXXXbXXXXbXbXbXXbXbXXXbXXXXbXXbXbXbXbXbXXXbXXXbXXXbXXXXbXXXXXXXbXXXXXbXXXbXbXbXbXbXXXbXXbXXbXbXbXbXbXbXbXbXbXbXXbXXXXXXXXbXXXXXXbXXbXXXXbXXbXbXXbXbXbXbXXbXXbXbXXXbXXXXXbXXXbXbXbXbXbXXXbXXXbXbXXXbXXXbXXbXbXXbXXbXbXbXbXbXXXbXXXbXXbXXbXbXbXXXbXXXXXXXbXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXbXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXbXXXXXbXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXbXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXbXXXXXXXXXXXXXXXXXXXXXXXXXXXXXbXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXbXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXchhhchccccccXXTXTTTTTTTTXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXbXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXbXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXchhchchcccXXXXXXVT"TTTTXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXcXc^cXdcXcXcXcXcXcXcXcXcXcXXcXcXcXcXcXcXcXcXcbc^cXcXcXcXcXcXcXcXcXcXcXcXcXcXcXcXcXcXcXcXcXccXcXcXccXcXcXcXcXcXccXccXcXcXcXcXXcXcXcXcXcXcXcXcXccXcXcXcXcXcXcXcXcXcXcXcXcXcXcXcXcXcXcXcXcXcXcXcXcXcXcXcXcXcXcXcXcXcXccXcXcXccXcXcXcXccXcXcXcXcXcXcXccXcXXXcXcXXcXcXcXcXcXcXcXcXcXccXcXcXcXcbcXcXcXcXcXcXcXcXcXcXcXcXcXcXcXcXcXcXcXcXcXcXcXcXcXccXcXcXcXcXcXccXcXcXcXccXcXcXcXcXcXcXccXcXcXcXcXXcXcXcXcXcXcXcXcXcXcXcXcXcXcXcXXcXcXcXcXcXcXcXcXcXcXcXcXcXcXcXcXcXcXcXcXcXcXcXcXcXcXcXcXcXcXcXcXcXcXcXccXcXcXcXcXcXcXccXcXcXcXcXcXcXcXccXcXcXcXc^ccXcXcXcXcXcXcXcXcXcXcXcXccXcXcXcXcXcXcXccXcXcXcXcXcXcXcXcXcXcXcXcXcXcXcXcXcXcXcXcXcXccXcXcXcXcXcXcXccXcXcXXcXXcXcXcXccXcXcXcXccXcXcXcXcXcXcXcXcXcXcXccXcXcXcXcXcXcXcXcXcXcXcXcXcXcXcXcXcXcXcXcXcXcXcXcXcXcXccXcXcXcXccXcXcXcXcXccXcXccXcXXcXcXXcXcXcXcXcXcXcXcXccXcXcXcXcXcXcXcXcXcXccXcXcXcXcXcXcXcXcXcXcXcXcXcXcXcXcXcXcXcXcXcXcXcXcXcXcXccXcXcXcXccXcXcXcXcXcXcXccXcXcXcXcXXcXcXcXcXcXcXcXcXcXcebcXcbc^cXcXcXcXcXcXc\dXcXcXcXcXcXcXc\cXcXcXcXcXcXcXcXcXcXcXcXcXcXXcXcXcXccXcXcXcXcXcXcXcXcXcXccXccXcXcXcXcXXcXcbcXcXcXcXcXcXcXccXcXcXcXcXcXcXccXcXcXcXccXcXcXcXcXcXcXcXcXcXcXcXcXcXcXcXcXcXcXcXcXcXcXcXcXccXcXcXcXcXcXcXcXcXcXcXccXcXcXcXcXXcXccXXcXfXcXcXcXcXcXcXcXcXcXcXcbcXcXcXcbcXcXcXcXcXcXcXcXccXcXcXcXcXcXcXcXcXcXcXcXcXcXcXcXcXcXccXcXcXcXcXcXcXcXcXcXcXccXcXcXcXcXcXccXcXccXcXcXcXcXcXcXcXcXcXc\cXcXcXcXcXcXcXcXcXcXcXcXcXcXcXcXcXcXcXcXcXcXcXcXccXcXcchhhhhhcccbXXXXXTTTTTTTTTcXcXcXcXcXccXcXcXccXcXcXcXcXcXccXccXcXcXcXcXXcXcXcXcXcXcXcXcXcXcXcXcXcXcXcXXcXcXcXcXcXcXcXcXcXcXcXcXcXcXcXcXcXcXcXcXcXcXcXcXccXcXcXcXcXcXcXcXcXcXcXcXcXcXcXcXcXcXccXcXcXcXcXXcXcXcXc\dXcXcXcXccXcXcXcXc^cXcXcXcXcXcXcXcXcXcXcXcXcXcXcXcXcXcXcXcXcXcXcXcXcXcXcXcXcXcXcbcXcXccXcXcXccXcXcXcXcXcXccXccXcXcXcXcXXcXcXcXcXcXcXcXcXcXccXcXcXcXcXcXcXcXcXcc^cXcXcXcXcXcXcXcXccXcXcXcXcXcXcXcXcXcXcXcXcXcXcXcXcXcXccXcXcXccXcXcXcXcXcXccXccXcXcXcXcXcXcXhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh¹hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhcccbXXXVXTTTTTTTT"hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhùhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhÍhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchccccbbXXXTTTTT:TTTM"Thhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh¹hh¹hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh¹hhhh¹h¹hhhhhh¹hhhhh¹h¹hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh¹hhhh¹hhhhhhhhhhhhhhhhhhhhhhhhhh¹hhhh¹hhhhhhhhùhhhhhhhhhhhcccccbbXXXTTTTTT"TTThhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhùhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh¹hhh¾h¹h¹hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh¹hh¹h¹¹hh¹¹¹¹¹hhhhhh¹h¹hhhcchc^XXXXXTXTTTThhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhMMM0-M0MLM0LM000-M-M0MLM-M-M-M0LM-M0-M0-M-M0LMMLM0-M00-M-M00-M0MLM-M000000000LM000MLM000-M000-M0000-M0-M-M000000-M0MLM000-M-M00000-M0-M00000000-M0000000000000000MM000-M00000M00-M00000-M00-M00000000000000000000M00000000000000M000000000000000-000000000000000-M00000MM0000M00M00000M000000000M00M00M000M000M00M00MM000MMM00M00M0M0000000000000M000000M00-M0000M00M0000-000M0000-00M0000Mchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh¹hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhX000M0M00M000-0--0000-M0000M0000-0000M000M0-000M00M0M0M00-M0000-M0-M0M0000MM0M0MM00-0000000000000M0-0M0000000M00000M0MhhhhhhhccXXbXTXXTTTTT"TT0M00000000MM0000M00000000M000MM00000000000000-000000000000000-M000000M000000000000000000000000-M0000-M000000-M00000000-M00000000000000000MM000-M00000M0-M-M000000000LM00MLM000-M000-M0000-M0-M-M000000-M0MLM000-M-M00000-M0-M0000000000-M-M00-M-M000000-M0-M0LMMLM-M-M00-M-M-M-M-M0MLM-M-M-M-M0MLM-MMLM0LM-M-M-MMLM-M-M-M-M0LM-M00LM00LMMLM0MLM,,,,                                                                 Thhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhc                                                                             MghhhccccXcbbXXXTTTTTTT:"                    ,,,,,,,                                                                                   0chhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhùhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhW                                                                                                  hhhhhhhcccbXXXXTXT""TTTTT                              ,  ,,,,,,,,,                                                            bhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhÍhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhc                                                                                 ghhhcccccXcXXXTVTTMTT                          ,,,,,,,,                                                                                        Mhhhhhhhhhhhhhhhhhhhhh¹hhhhhhhùhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhùhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhX                                                                                  MhhhhhhhcccbXXXXXTTT""TTTTTT                          ,,,,,,,,                                                              dhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh                                                                                   0hhhhcccccXcXXXXTXTTT:TT                    ,,,,,,,,,,,,                                                                            Xhhhhhhhhhhhhhhhhhùhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhc                                                                                        MhhhhhdccccccXXTXTTTTT""TT                           ,,,,,,,,                                                         MchhhhhhhhhhhhhhhhhhhhhhhhhhhÍhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhW                                                                              0ghhhhhcccXXXXXXTTTTTTMT:T"T                  ,,,,,,,,,,,,,                                                       chhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhùhhhhhhhd                                                                                                MghhhhhccccXXXXXXTTT"TT"MT""                    ,,,,,,,,,,,,,,,                                                                              XhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhX                                                                                     ghhhhgccccbXXXXXTTTT:"TT"M                         ,  ,,,,,,,,,,,                                                                            chhùhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh¹hhhhhhhhhhhhhhhhhhhhhhc-                                                                                   MhhhhdcccccbXXTXTTTTT:T                       ,,,,,,,                                                                            Xhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhc                                                                                      0hhhhhcccccXbXXXTTTTTTTTT                         ,,,,,,,,,,                                                                      XhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhùhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhùhhhhhhhhhhhhhhhhhhM                                                                           MchhhhcghcccXXXXXXTTTTTT"T                      ,,,,,,,,,,,,,,,,,,                                                            chhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhc                                                                                                   hhhchhcccbXXXXTTTVTTTTT                      ,,,,,,,,,,,,,,                                                                     bhhhhhhhhhhhhhhhhùhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh\                                                                                        MhhhhdhcccbXXXXXTTTTTTTTTTT"                        ,  ,,,,,,,,,,,                                                             Tdhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhc                                                                                    0ghhhchccbcbbXXTTTTTT:T                   ,,,,,,,,,,,,,,                                                                          chhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh¹hhhhhhhhhhhhh¹hhhhhhhhhhhhhhhhhhhX                                                                                              ghhhhgcccbcXXXVXTTT"TT                            ,, ,,,,,,,,,,,,,,                                                                       Xhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh                                                                                  hhhhcdcccbXXXXXXTTTTTT              ,,,,,,,,,,,,   ,                                                               chhhhhhhhhhhhhhhhhhhhùhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhd                                                                                                  MghhhcdccbXbXXXTTXTT:TTT                         , ,,,,,,,,,,,,,,  ,                                                                XhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhT                                                                                 ghhhchccbbXXXTTXTTTTT                 ,,,,,,,,,,,,,,,,, ,                                             Xhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhghhhhhhhhhhhhhhhhhhùhhhhhhhhhhhhhhhhhhhhhhc-                                                                                                  MhhchhcccccbbXXXVTT:TT:TTTT                   , ,, ,,,,,,,,,,,,,,,,,,,,                                        chhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhX                                                                                                          ghhhhhccbcXbXXTXTTTTTTT"                ,,,,,,,,,,,,,,                                     Xhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh                                                                                                  MghhhchcccbXXXXXXTTT"TTTT                  , ,,,,,,,,,,,,,,,                                XhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhX                                                                                                     hhhhhchccbbbXXXTTTT"TT:T                      ,,,,,,,,,,,, ,,,,                              chhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh¹hhhhhhhhhhhhhhhhhhhhhhhT                                                                                                 0ghhhhhcccbbXXXTXTTTTT               ,,,,,,,,,,,,,,,,,                             chhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhc                                                                                                           MghhhhccccbXbXXXTTXTTTTTTT                   ,,,,,,,,,,,,,,,,, ,                        MchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhùhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhW                                                                                               ghhhhchcccbXXXTXTTTTTTTT"                 ,,,,,,,,,,,,,,                             chhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhc                                                                                                     ghhhhhccccbXXXXXTTTTTT                 ,,,,,,,,,,,,,,,,,                              XhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhX                                                                                          0hhcdccbbcbXXXVTTTTTTT"                         ,,,,,,,,,,,,,  ,                    MdhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhM                                                                                        ghhhhcccccXXXXXTTTTT                     ,,,,,,,,,,,,,,,,, ,,                 FTTTXXXXXXXXXXXXXTFTXXXXXTXXXTF               chhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhùhhhhhc                                                                                          Mc¹hhhhhhgccccXXTXXTT"TT                  ,  ,,,,,,,,,,,,,,,,,,,,                   FTTFTTXXbXXXXbXXbXXXXXbXXbTFXbXXXXXXbTTXXXXXT           bhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhW                                                                                                         chhhccdccXXXXXTXTXTT                     ,,,,,,,,,,,,,,,,,,,,             ETXXXXTFETbXXXbXXXFTTXXbbbbXXXbXXbXbXbXXXXbXbXXXXTFE"bXXXXbXbXXbXTFTXXXXbXTTXX           0chhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh¹hhd                                                                                           MeùhhgcccccXXXXXXTT:TT"                 , ,,,,,,,,,,,,,,,,,,,,,,,,,       FFFFHEXbXXbXbXXXbXbXXXbbXXXXXFFTbXXXXXXXXXXXXbXXXXXXXXXbXXXXXXXbXbXbXXTTTTbXXXbXXXXXbXXXbTFEVXXXXXXXbTF"TTXXTTTTTT"FTbXXXXX         bhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhghhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhX                                                                                                          bhfghhbXcbXXXTTTTT      ,,,,,,,,,,,,,,,,,,,,,,,,,    XXXXXXXXXXXXbXXTFFTXbXbXXbXXbbXbXXXXbXXXXbXXXbbbXXbXbXXbXXXXXXbXbbXbXXbbbbXXXXXbXbXXXXXXXXXXXXXXbXXbXXXXXbXbXbXXXTF"bXbXXXXbXXXXbXbXbXXbXXXbXXXXXXbXbXXXXXXXX                Xhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhùhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhc                                                                                         0chhhhhchccccXXXXXTT          ,,,,,,,,,,,,,,,,,,,,,,,,,,            XXXXbXbXXXXXXbXbXXXXXbXXbXXbXbXXXXXbXbbXbXXXXXXXXXXXbXbXXXXbXbXXXbXXXXXXbXXXXXbXbbXbXbXXXXbbXXXXXXXXbXbXXXXXXXXXbXXbXXbXXbXXbXXXXTXXXbXXXXbXXXXXXbXbXXbXXbXXXbXbXbXbX        chhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhÍhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhc                                                                                                          chhhhhhcccccXcXXXTTTT           ,,,,,,,,,,,,,,,,,,,,,,,,,,,,  ,,,            XbXXXbXXXXXbXXbXXXbXbXbXXXbXXXXXbXXXXXXXXbXbXXXXXbXbXXXXbXXbXXbXbXXbXbXbXXXbXbXXXXXXXbXbXXXXXbbbXbXbXbXXXXXbbbXbXXbXXbXXbXXbXXXbXbXXXTTTXbXbXXXXXXXbbbXXXXXXbXXbXXXbXXXbXXXX               XhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhùhhhhhhhhhhhhhhhhhhhhhhhhhhM                                                                               0bchhhhccccXXXXXVTTTT                  ,, ,,,,,,,,,,,,,,,,,,,,,,,,,,, ,,,       XXXbXXbXbXXbXXbXXbXbXXXbXbXbXbXXXXbXXbXbXXbXXXXXXXbXbXbXXbXXbXXXXbXXbXXbXXbXbXXbcbXbXXbXbXbXXXXXXbXXXXXbXXbXXXXXbXXbXXbbXXbXXbXXXXXXXXXXXXXXXXXXXXbXXXXXbXbbXXbXbXbXbXbXXbXX      Thhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhc                                                                                               cghhhhhhccccccXXXXTTTT             ,,,,,,,,,,,,,,,,,,,,,,,,,,,,           XbXcXbXbXbXXbbXXbXXXXbXXbXXXbXXbXXbXXXXbXXbXbXXbXXXXXbXXbXXbXXbbXXXbXXbXXbXXXXbXXXXbXcXXXbXbbXbXbXXcbXbXXbXXXbXbXbXXXXXXXbXXbXXbXbXbXbbbbXbXbXbXXbXXXbXbXXXXXbXXXXXXXbXXbXXX                  chhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhùhhhhhhhhhhhhhhhhhhhhhhhhhhhhhùhhhhhhhhhhhhhhhhhhhhhhhhhhhhhW                                                                                                                XhhhhhhhchccccbXXXTTT                ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,        XXXXbXXXXXbXXXXbXbXbXXbXXbXXXbXXbXXbXbXXbXXbXXbXbXbXbXXbXXbXbXXXXbXXbXXbXXbXbXXbXbXXbXXbXXXXXXXbXXbXXXXbXbXXbXbXXXbXXbXbXXbXXbXXXXbXXXXXXXXbXXXbXbXXbXbXbXbXbXbXbbbbXbXXbXXX          bhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhc                                                                       bchhhhhhhccccXXXXTXXTTTT       ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,       XXbXXcXbXbXbXXbXXXXbXbXXbXbXbXbXXXXXbXbXXbXXXbXXXbXbXXbXXbXXcbXbbXbXXXbXbXXbXXbXcXbXXXcXcbXcbXbXXbXbbcXXbXXbXXXbXbXbXXbXXbXXbXXbXXXXbXbXbbXbXbXXbXXbXXXXXbXXcXbXXXXXXXXbXXXX                    Mchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhg¹hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhùhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhX                                                                                                                                    bhghhhhhhhhcccbXXXTTTTTT             ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,      XXXXbbbXbXXXbXXbbXbXXXXbXXXcXXXbXXbXbXXcXbXXcXbXXbXXcXbXcbXXbXXXXXXbXbXXXbXXcbXbXcXbXbXbXbXbXXXXbXXXXXbXXXbXbXbXXXXXbXXXbcXbcXXbXXbXcXXcXXXXcXbXXXbXbcXbXbXbXXXbXbXXbbbXbXbX           cghhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhM                                                      \chhhhhhfcccccXbXXXTTT ,,,,,,,,,,,,,,,,,,,,,,,,         XXbXXXXXXbXbXbXXXXbXbXbXXcbXbXcXbXXXcXXbXXcbXXXbXXXbXXcXXcXXcbXbbXXbXXbXbXbXXXXXcXbXXXbXXXXXcbXbXXXbXbXbXbXXXXbXbbXbXbbXXXXbXcXbXbXXbXbXXcbXXbXbXbXXXbXXcXXXcbXXbXbXXXXXXXXX                   Xhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhc                                              00UVV\^^^^^`^^^^^^^^^^`^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^`^^^^^^^^^^^^^^^^^^^^^^^^^`^^^^^^^^^^^^^^^^^^^^^^^^`^^^^^^`^^^^^^`^^^^^^^^^^^^^`^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^``^`^^^^^^^^^^^^^`^^^^^^^^^`^^^^^^^^^^^f›–_x_zdz__x^^^^^^^^^^^^^^^^^^^`^^`^^``````````^^`^`^^^^^^``^`^^^`````^````^```^^```^`^^^`^``^^`^^^``^^``^^^^^^^^^^^^^^^^^`^`^``^``^^^`^^^^^^^`^^^^^^^`^^`^`````^^``^^```^```^`^^^`^`^^^^`^^^`^^^`````^````````^``````^`^`^``^``^^````````````^`^``^^^``^`````````^`^```````e`````^\VUM000,,,,,,,,,,,,,,,,,,,,,,,,               XXXbXXbcXXbXXXbXXbXXXXbXXbcXcXbXbXbbXbcXXcXcXcbXbXXbXcXXbXcbXcXXXXbXbXbXXXcXbcXcXXcXbcXbXbcXbXXXbXbXbXXbXXcXXbXXXXXbXXXXbXcXcXbcXXXbXcXbXbcXcXXXXbXcbXcbXcXcXcbXXXXbXbXbXbcX             TchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhW                                   0T^ʝ`U0,,,,,,,,,K2,,,,,,,,,,,,,        XXbXXbXXbXcXbXbbXbXbcXbXcXXcXcXcXXXXXcXcbXcXcXcXXbXcbXcXXcXXcbXcbXXXbXXcbXXcXXcbXcXcXXcXXbXXbXcXbXXXXbXXcbXcXbXbXbXbXcbXcXcXcXcXbXbXcXcXcXXcXcbXbXXXXcXcXXcXcXXcbXbXbXcXXcXX              chhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhùhhhhhhhhhhhhhhhhhhhhhhfhhhhhhhhhhhhhh¹hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhd                                        0Vaʖf\M,,,,,,,LJNMM,,,,,,,,,,,,,,, ,      XXXXbXbXbXXbcXXXXXcXXXXXbXcbcXcXbXbbcXcXcXbXcXXbXbXXXXXcXXXcXXXbXXbXXXXbcXbXcXXcXXcXXXXXcXXcXXbXcXbXbXXbXXXXcXXXbXXcXXXXXbbcXcXcXXXbXcXcXcXbcXXbXXbXbXbXcbXcXXXbXXbXXXXcXbXX                  XdhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhX                                            \ʔ\0,,,,,,,0XcM,INͻM,,,,,,,,,,,,,,,,,,,,,,,,,,,,  ,          XcbXcXXXcXXcXcXcXcXcXcbcXXXcXcXXcXXXXcXcXcXXbXbXXcXXcXbXcXcXcXXXcXcXcbXcXcXcbcXXcXcXcbXcbXcbXcXcXXXXcXXXbXcXcXcXcXcXcXcbXXXcbcXcbXXXcXcXcXXbXbXcbXXXcXXXXXcXcbXXcXcXcbXbXcXX       0chhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhghhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh¹hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhd0                            Ufʓ\0,,,,,,,ccccc,,,,,,,,,,,,,,,,,,,,,,,,, ,       XXXcXcXcXbcXcXcXcXcXcXcXXbXcXbcXXbcXXcXcXcXXbXXcXXXcbcXXXbXcXXbcXcXcXcXXcXb@=XcXbcXcXcXXXcXXcXXcXcXcXcbcXXXcXcXcXcXccXXcXbcXXXcXXXcXXcXcXcXXXXcXcXXcXcXcXXcXXXXcXcXcXcXcXXcX               chhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhfhhhhhhhhhhhhhhhX                                ^f0,,,,,,,,,,0cccXccchh,,,,,,,,,,,,,,,,,       XXcXXcbXXcXccXccXcXcccXcXcXXXcbXXXXbcXcccXcXbXcXbccXcbcXXXcbXXXXbXcXcXcbXXcA$cXXcXcbccbcXcXcXccXcXbXcXcXXccXcccXcXccXccXXcXXbcXbXbbXXXcXcXcbXXXXXccXcXcXbcXbXbXXXXcbcXcXXcXX         ThhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhM                                  \ӝ^-,,,,XcXcXcXcch0,,,,,,,,,,,,,,,,,,,,,     XXXcXbcXcXcXcccXccYYYXcXcXbYXbXXbYYXXcXYdXbXcXXbcXYYcXXcbcYYXbXcXYYbXcXcXcb@$XYXcXcXYYYXYXYcXYXbcYYXXcXYcXb[bXccXYYcXXccXXXYXXXXXXYYcbYcccXXXYcXcXcYYcXXcXYYXYXcXcXcXXcXcXcX                     chhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhc                                       UӖ\,,,,,,,McXcXcXcXccJ,,,,,,,,,,,,,,,,,,,,,  XXcXXcXcXcXccXccY$$$@cXcX$@cXX$$>XA=XcXbXcXcX$@cXc$YbX@YXcXXXc@$@cX@$$@@$cb$Yc$@cA@Xc@A$cX$$cXcXcY$$@Xb@$Y$YXcXbY=XcbY$$XcY$cXcXcXcXcbXXcX          Xhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhùhhhhhhhhhhhhhh¹hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhW                                          0`ӓM,,,,,,cXXcXccXccchľg,,,,,,,,,,,,,,,,,     XcXcXccXXXcXccXX=@bcXY$@ccY$Xc@$YbXXc@$cXcXXXcXB$cX@$Yc@$Yb$$X@Yb@XcXcXc@$XcYXXYcX@@cXY@XbYXb@$XX@@@$cbYcY$XccccXYc@bX@XXYXYcXcXXbX$@bcYcX@Xc@bXcXcXbcXcXccX                Mhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhc                                :ӝ\,,,,,,,,,,XcXcXbbcXcchhh,,,,,,,,,,,,,,,,,,,,,,,,,, ,    XXcXcXXcXcXccXc@$cXXcbYXc@$Xb@$$YB$XcXcXcXX$YXcc$YXYXcXY$@ccX@Xcccc@ccc$YY$cbc$B@$cXX$$$$c@>Xc=@Y$XcX$$cXcXccY$@XY$$YYXcXY@cY$YX$@cbYXccXcXcXcXcXcX          XhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhùhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhX                                  Mӝ\-,,,,,,,cXcXXXcXcXcc,,,,,,,,,,,,,,,,,,,,,,,,,,,,       XcXcXccXcXcXccX@XXcXcX@X$Y@$c@cXXX@$YccXcXcY@cbcYY$XcXc$@$YXXc$@XcXcX@$bcYYXXcX$@@$ccY@ccYX@$cX$@@cX=$bcXcXccX@YccXYbc$@$@cXc=@Y$XXYcX>@c=@Xc@XcXcXXXcXcXcXX            XhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhghhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhM                                   UӞ\,,,,,,,,cXXcXcXXcXcXh,,,,,,,,,,,,,,,,,,    XXccXcXccXcXcXc$YccXcXc$@Y$cY$XX!@$$c@$=XcXcbY$$@B$$cYcXXc@XccX@$cXccc@$$@$=cX@$@$@$Yb$Yc$=@$@c@$=$Y$$YXB$@@cXccXc$=@YXc@$@@X$=YX$Xc=@c@$@@XXY$$$cXccXcXccXcccW            chhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh¹hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhc                                       UӞ\0,,cXXbcXbcXcXcb,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, , XbcXcccXcXccXcX=@cccXcX$A@YccYYcc@@YcX_@Y@YccXcYX@@YXcY$bcXc$@$YXcc@=ccccXYY@@YccXcY@@YY$$Yc@XcX@Y@ccYYY@YX=XcX@@YcXXXXcX@@XcXcY@@Xc@Y@@Y@cXX@ccY@@XcccX@@@$XcXccXcXccccXX        chhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhW                            UӞ\,,,,,,,,,,XXbXXcXXXbccKKKGKFM,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,  VcXcccXcXccXcXc@ccXcc@$XccccXccXccXccXccccccXccYccXccYXXcbY$@ccb$@ccccccXccccccccXcXcY@cX@XcccXccccXcXcc@@ccXccXccXcXccccXccXccXccXccccccXcccXccXccccccXYccXcXccccccccX             Whhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhghhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhd                                     0ӝU,,,,,,XXXXXXbcXcXcK GK,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, , XccccXccccccXcXc$@XcbY@ccccXccXcXccXccccXcXcccX@$YcXccc@$bY@$c@Yb@XccccXccXcccccccXcXccXcc=XcXccccXccccccXcXccXccXcXcccccXccXcXccXccccXcXcccXccXcccccXcXcY$XcccccccccccXX        0chhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhX                        0^f0,,,,,,,,,,,McXbXbbXXXchKKLJK\,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,D,,,,,, , XcccXcccXccccXccb$$$@cccXcccccccXcccccccccccXcc@$cccX$$XcX@$XcccXcccXccccccccXcXccccXcXcccccXcccXccccXcXcccXccccccXcccccccXcccccccccccXcccccXccXcXccYcccXccccccXccX            chhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhc                              :\-,,,,,,,,,,,XXXXXXXcXchc,,,,,,,,,,,,,,,,,,,,,DD,,,,,,,,,,  XcccccXcccccXcXcXcXYXccccccccXcccccccXcXccXcccXcXccYccXcccXXccccccXcccccccccccXcccccXccccXcccXccccccccXcccccXcXcXcccXccccccccXcccccccXcXccXcccXcXcccccXcccXcX$ccccXcccccccXX             Xhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhc                                  0ӖM,,,,,,,,,MbcXbXXXccT,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,DDDD,,,D,,,, , WcccccccccXcccccccXccccccccccccccXccXcccccccccXccccccccccccccccccXccccccccXccccccccccccXccccXcccccccccccccXcccccccXccccccccccccccXccXcccccccccXccccccccccccccccccXcccccccXcX         chhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhM                        \f0,,,,,,,,,0XXXXcXhRJRKM0L0M,,,,,,,,,,,,,,,,,,,,,,,,,,,,DDDDDDDD,,,,,,,XccccccccXcccXcccccXcccccccccccccccccXccXcccXccccccccccccXccXcccccccXcccXccXccccccccccccXccccccccccccccccXcccXcccccXcccccccccccccccccXccXcccXccccccccccccXccXcccccccXcccXccX           cdhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhghhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhc                                   0ӝM,,,,,,,,,,LXcbccRKRLM,-,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,DDD,DI,,DD,,,,    XcccccccccccccccXccccccccccccccccccccccXcccccXccccccccccXccXccccccccccccccXcccccccccccccccccccccccccccccccccccccXccccccccccccccccccccccXcccccXccccccccccXccXcccccccccccccccX                 MhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhW                        U\-,,,,,,,,,,-,,,,,,,,,,,,,,,,,,,,,,,,,,,,,DDDDDDD,DDD,,D,, ,XcccccccccccccccccccccccccccccccccccccXccXccccccccXcccccccXccXccccccccccXccXccXcccccccccccccccccccccccccccccccccccccccccccccccccccccccXccXccccccccXcccccccXccXccccccccccXccX              chhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhc                                     ^ʂ0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,DID,DDDD,D,,D,,,  XccXccXcccccccccccccccccccccccccccccccccccccccccXccccccccccccccccccccccccccccccccccccccXcccccccccccXccXcccccccccccccccccccccccccccccccccccccccccXcccccccccccccccccccccccccbX                   XhhhhhhghhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhùhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhX                           0fӖU,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,D,ID,DI,D,,,, XccccccccccccccccccccccccccccccccccccccccccccccccXcccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccXcccccccccccccccccccccccccW             MchhhhhhhhhhhhhhhhhhhghhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhM                      U\-,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,DDI,DDDD,DDDDD,DDDD,,,  WccccccccccccccccccccccccccccccccccccccccccccccccccccccccccXcccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccXcccccccccccccccX          chhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh¹hhhhhhhhhhhhhhhhhhhhhhc                                   \ʍ0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,DDDDIDIDD,DDDD,DDDD,,,,,XccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccX             WhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhW                       aזM,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,DDDDDIDD,DD,D,IDDDD,,,,,, XccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccX                   Mchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhc                       0fӝM,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,D,IDDDD,DDDDDDIDIDD,,,,,,,,XccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccgcccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccX             chhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhX               0ӝU,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,DD,D,DDID,,,,, XcccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccgccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccX                 Xhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhc0                         Mם\,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,DD,IIDD,,,,,,,XccccgccdccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccX            0ghhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhc               Uڝ\-,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,L,,,DIIIDID,,,XccccddcccccccW                XhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhM                       U`-,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,DD,IIDDD,,Xcchccccc cccccX               Thhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhc                V`-,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,L,,,DDIIID,,,,XcccccgcccccccchccccccccchcccdcccccccccccchccccccccccgccccccdcgccdccccccchccccccccdcccdccgccccccccdccccccccccccecccccccgcchcdgccccccccccccdcccccdcccchcccccchcdccccccccccccX         0chhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhùhhhhhhhhhhhhhhhhhhhhhhhW                 \լ`-,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,DDDI,,,,,XcchccdcgccccccccccccccchccchccchcccdccccccccccchccccdcccccgccdcgccccccccccccchcchccgcgccdcchcchccccgccgcdcgccccccccccgcdcccccccgcccdcccccccccccgccccccchccccccccdccccccchcX       chhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhc                      V٬}sppppppppppps}qqopppppppppppppq}q}}qwsssqs}qppsq}qpqpqppqqqpqq}}}pppppppqqp}}}qppp}qpppqqppqw}ppp}}popp}}pqsqpmp}}}}qpq}qq}}}qppq}}qppqsppppqppqps}}ppqpqwqpqpppppq}qpps}w}qpqppppqs}pmpqq}}qqpppqoopppoppsqq}qpps}}}}qp}qpsq}qpp}qqqppq}qqqqpppqqq}}}qpqqpq}}qppqpppqsqqpppoopqppoppqqpq}qppq}wooppqq}qppoppqpq}}qpppppq}qpp}pqps}}}ppppsqpqqqqpqppqqpqpppppsqqpqqspqw}}ppppqppp}}qqs}ppqpppps}spp}}qppqpppppspq}}}w}}pqq}qpopppppq}}ss}}qqpppswpq}}q}}qqppqqpqpppqqppq}}}pppqqpppq}sppssppnw}}}}qqppppq}pqpq}ppmq}qppp}}}}}ppqsq}}qpqw}}qppppppppppppqwqppppppopppppppp}qq}qqws}qqwsppqwq}qqpqppqqqqpqq}wopqppppsqp}}qppq}pqppqppqp}sppq}spppq}qqqqppmp}}}}qp}wqq}}qqpp}}}sqs}s^,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,D,,,,D,I,,,,,XccccccddcgchcccchccchcccgccchccccgcccccccccccccchccgccdcgcdcgcdcgcccchchccccccccccddccdccccccccchccccdccccccccchcccccdccgchccgcdcccccccdccccgcccchchccccchccchcgccccchccccX            MhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhX                      0٬}ssp??>===!!!!   !    !!!!!! !! !!!! !!! !!!==?lpwqqٞ\-,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,DDIIID,,,XcchccgcccdcccchcccccccchccdgccchcccdccccgccccchccccccdcccdccccccdccccccccchccchcgccccgcgcccccchcccchccgchcchcccccchchccgcccccdccccgcgccccgccccdgcccccchchccchccccdcccccchcX               XhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhM                  0Ӓqpj>=! !  !! !! !     !   =>lpqsٝ\,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,DD,D,D,,DIII,,,,,XcccdccdcgcchccccchcchcccdccchcccddcchcgcdcchccchcchccgcgcchcgcgccccchcchccchccccdccgcdccchchcccchcccdccccccchcchcccccccdcgdcgdcgcgfcdccdccgcgccchcchcccccchccccgccccchccccX       Xhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhc                     0՚sspC=  !   ! !>opqٝ\,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,D,DD,D,,DDIDDD,,,,,,,XcchccgccccdccchccccccccccgccccchcccdccccccgcccccccccdcdcccgcdcdcgccccccccccccchcccdccdcgcccccchcccchccgcchcccccccchcchccccccccccddccccgccgcdcccccccccchcchccchccdgcchccchcX         MchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhW                     0٬sp?=!    !      ! ! !   !!    Cps؝M,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,DD,DDDD,D,DIDD,,,,,,,,, XccccdcgcgcchcccchccchchccdcchcccccgcgcchccccchhchcccgcccgdcccgcdcgcchchcchchcccdcgcgcdcchcchcccchcccgcdcccchcchchccccccchcchccgcccchccchcdccchhchcchcccccchcccdcccccchccccX       chhhhhhhhhhhhh¹hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh                   fՒso>   !! !   !!    !=lqsםM,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,L,,DDD,DDDDDDIDD,,,,,,,,,XcchcccdcdcdccchchcchcccccccgccchccdccdchhchcchccchhcccgccccgcdcccdcccccccccccchccccdcgcccccccchcccchcccgcdccccccccchccchccdcccdcgcdccchcccgcdcccchhccchcccccchcdcchccccchcX     XhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhX                        a՚o?!  ! !     !   ! !!  !=pqӓ0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,DII,DDDDDD,,,,,,,XccchccgcdechcccccccchccchccchcccgccgccchccccccccccchccdcchcdcccgccchcchcchcchccgcgdcccchcchchccchccccgcdcchcchcchccchcccccgdcgcdccchccchcdccchccccchcccccchccccgccccchccccX      0chhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh¹hhhhhhg0                  V⬒p?   ! !!  ! !   $jf-,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,.,,,,,,,,,,,,,,,,,,,,,,,,,,,,DIDDDDIDDDD,,,D,,,,,,XcchccccccccccchcchccccchccchccchccdcchcccccchcchcchchccchcccdgcdcchcccccccccchccccccchccccdcccccccchcdcccgccccccccchccchcccccccdcgccchchcccchcchcchchchcchccchcccchccccchcX   Xhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhc                 0Ւ}sp? !      !    ! !! !!  ! !! !      !! !?p\,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,DDDDDDIIDID,,,,,,,,,,,,,,,,,XhcccchcchcchccccccchchcchcccchccdcgcdcccchchhcccchchgchcchcccccchccchcchchchcchcdcgdgchcchcchhchchcccccgdcgchchchcccchcchchcchcdcchcccccchchgccchcccccchcchccccchcchcchcccX          ThhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhùhhhhhhhhhhhhhhhhhhhhhhhhhhhhhM             檏so=!        !jsٝ\,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,DDDIID,,,,,,,XccchcccccccccchhccccccchcchcccccgcccgcchhchccchchcccccchccghcchcccchchccccccccchcccfccchccchcchccccchccccccdccccccchccchchcccgccgcccchccchhccchccchchccchcchcchcccchchchccX     0chhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhc                 a謒q?!    !       !!!!        !     =psד0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,DIIIID,,,,,,,,,,,,ThccchchchchhcccchccchchdcccchchccchccccccchcccccchchhcccchcgcccchchchchhdchchchchccchchcdchcchcchcchcchchchcchcchccchchccccchchccchcccchchcchcccchchccchccccccchchcchhhchcX,      Xhhhhhhhùhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh¹hhhhhhhhhhhhhhhhhhhhhW         Vْsl!      ! !!  !   >qf0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,DDDIIDL,,,,,,,,,,,,,,Xchchccchcccccchccchcccccc__chcchcccchchchchchchchchcghcccccchcgcdcchccgcccdchchchgcccccgccchcdcchchgcggcccccchgchccccccchcccccchccgchcchchchchchchchchchchcchcgcchcccchccX      Mhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhc0               M笒}p= !!!!       !  ! !!   ! !!  ?p\,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,DIIDDIII,,,,,,,,,,,,,Xhchhchccchcchchhhhchc_jjjC[hchhchchchchcx>_C_[hhchchcB_C_ccchcchccchccc_>jZC_hchccccj>>_chhB_C_Cdchgcch_C_>_hcchchcchj_C_chcchcdhc__YCcchchchdhdhcc_>_CcchcchchccccX  chhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh¹hhhhhhhhhhhhhhhhhhhhhX      0એq=      !  !=pٝ\,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,DDDIII,,,,,,,,,,,,,,,,,,,,Xccchcchchchcchchccc_jjj_chdhchch[jjj_hchchjhcdccccdchcc>jj>cchcc_j_ccc_j_cccch_jchchchcchcjhfchchchcBk_hchgchghchhcjhcchcccccchcW,XhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhM         aӢp=  !  ! ! !! !     !  !! !oד0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,.,,,,,,,,,,,,,.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,D,,IDDIIIIIDD,,,,,,,,,,,,,,,,,,,Wchchghchccchchhhhcj>ccchch_Cchch>chhhhccchch_jccch_Ychchj>chchcj_hchchcdhhcj>dhhchchhc__chchghdhghcf>jhchchhccchchX,Mhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhc      M謒}l! !      !!>q`-,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,.,.,,.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,DDDIIIIDIID,,L,,,,,,,,,,,,,Xhchchdhchccdhdccc>>[__[C>>chch_>>>jhhdjcchcchchchc>>>ChchZjZfhchc>__ccC>hccchchcchcjhchcchchcZcchchchdhdhg>jchchcchchchcX  , 0bhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhW       એq?  ! ! !    !       !       !! ! $o}ڝM,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,.,.,,.,,.L,,,,,,,,,,.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,D,DIIIIDDD,,,,,,,,,,,,,,,,,,,,,,,Xchchcchghcccghc>[chhchhch_C[hhcjcchcc_[eh>chchcchccchhB>[hchcj>chh_>Bhchch_cc_chchcchchdgf>>chchhdhgh_[hcchchdgghdhjhchchcchchcdXXhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh    \䚏p=   !    ! jsق-,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,L,,,,,,L,,,,,,,,,,,,,.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,DIIIDIIIIIIIDD,D,,,,,,,,,,,,,,,,Xhchchchdhgghchc_chchchchchch[>chdchBjgdcchccc>hd>fchchccchhhchBhcgchcChgd[_chchchB>h[hchchchchggh>jhchchgchcCj_hchcchchhdhg>hhchchccchdhXMchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhX             0䚏m  !          !!                ?}\-,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,.,.,L.,L,,,,,.,,,,,,,,,,.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,D,IIIIIIIIIIID,,,,,,,,,,,,,,,,,,,,,,,,XcdhcghdghdhchhY[hghdhhghchhdhchcghhhhhdhdhhchZ_h>hdhhcgchchdhgghghghh>dhh_Bhchchhc>>>hhchcdhgghdfdj>chghchhchB_cgdhghchchdhjchhhhchcdhdeX, XhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhcM    f٥o!        ! !      ?ٖM,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,.,L,,,,,,,,L,.,L,,,,,.,,,,,,.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,IIIIIIDIIIIDDDDII,,,,,,,,,,,,,,,,,,,,,,,,Xhchhchchdhghhc_hdhdhchdhhchgchhdhcccCghgghchhhc_c>fhcchhghhhghdhhfh_Chgd[Chghcchh[hchcchhdhdhghh>>hcdhdcchc__hhhchdhdhghd>hhccchgdhgghX Whhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhc           Vْ}?     !  ! !!!   !   !       !  ! !   ?e-,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,L,LL,,,L,L,.L,.,,,,,,.,,,,,,,,,,,.,.,,,.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,DIIIIIIIDIDDDIDDID,,,,,,,,,,,,,,,,XghcdhchdhgdhgC>ghgdghhdghchdcgdgdhhh_Bhdhdhchcdf>Bh>hdhdhdhchchchhc>cdhh_BchchchchC[hdhddghgghchdd>>ghhdhhhchC_dhchhcggghdh>chhchdhdhdhdX 0chhhfhùhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh¹hhhhhhhhhhhhhhhM        ْs?  !!    ?sٝU,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,L,L,,,L,L,,,,,,,,LL,,,,,,,.,,,.,,,,.,,,,,,,,,,,,,,,,,,,,.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,DIIIIIDDDDDDDDDDDID,,,,,,,,,,,,,,,,,,,Xdgdhdhhchhghdchdhhhdhghdhchghhhghccc_chghghghgh>Cg>hghghgdhhhhhh__hghc_Zhhhghghcc>>hhdhghhdhdhhhgh>>fdhghcchgY_hghdhghdhdhg>hhchdhgghdhgX,Xhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhc               ^٥?!!  !  !!    ! !    ! !  !!      ! =qד0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,.L,L,,.,,,L,L,.,L.,,.,,,L,,.,,.,,.,,,,,,,,,,,,L,,,,,,,,..,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,DDIDDIID,,DDD,DDD,D,,,,,,,,,,,,,,,,,,,,,,Xhgghgdgdhdhh_>hdgdgdghdhghchdhchdhhhhBhchgdghdhh>Bh_hdhdhghchchc>>[dhhdhh_Bhchdhdhh_cgghdgdgghhchdhj>ghchghhhc_chdghchghdhdf>chhghdhhdghdX,ThhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhX    0٥l     !     ?s\,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,L,LL.,,L,,,.,,,,L,.L,,,,,L,L,,,.,,L,,.,,,,,,,,,,,,,,,,.,,,,.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,D,DDDDDDDDD,,DD,DD,,,,,,,,,,,,,,,,,,Xedhdhhhghgdh_Zhhhghhdhghhdhghdhhgdhch>dhhhhhdhgc_dCghggdhdhghh]>_hhghchggccCghghghch>hfhghghdhchhhd>jhdhhhchchC_hhhdhhdhhghh>hhchdhchghdgW  chhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhc0      al !       !    ! !   !      !  !  !>}ٖ0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,L,L.LL,,,,.,L,.,,L,,L.,,L,L,L,.,,,,.,.,,,,,,,,,,,,.,,.,,,,,.,,,,,,.,,,L,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,D,DIID,,D,,,,,,D,,,,,,,,,,,,,,,,,,,,,,,,,,,XhhdghddghdgfZ[hchdhdghhdgdhdhghchghhh__chdhdggh>hh_ghdhghdhch>Zhdhdhhdhhh_Bhhdhdhh>[hchhdhghhdhdh>>dghchhhhhY__c__c__c__c_>chhgghghdhhhX,XhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhùhhhhhhhhhhhhhhX,  0⚎o   !  !       ?\,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,LLLLLL,,LLL,,LL,,.,L,,,,,,,,L,L,L,,,,,L,,,,,,,,,,,,,,.,,,,,,,,,.,,,,,,,.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,DDIIID,,,D,,,,,,,,,,,,,,,,,,,,,,,,,,,,,XddghdhghdhhhB$[hhhghghdhghghgdhdhghchhd_hdhghhCCgdChhhhdhghhB_hhdhchhchd$Zhggdhd[_hhhchgddhghhg>@hhdhhchhhBhhchdhhhgdhcX,MhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhM `謏q=! !!  !    !    !    !   !  ! ?ٓM,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,L,,,,,.,.,,,,,LLL,LL.,LLLL,,L,.L,LLLL,L,,,,.,L,L,,,L,,L.,,.,.,L,,.,,,,,,,,,,,,,,,,.,,,,,,,,,,,,,,.,,,,,,,,,,,,,,.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,DDD,,,,D,,,,,,,,,,,,,,,,,,,,,,,,WhghdghdggdghY_hhchdhhghdghdhgghdhhhhch_>___C$>ghh$$hchch__c_>[hhgh_BhhhhdhCgC>dhhdhhgdhdhf>>chghhhchhCchhghdhdghghX,chhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhùhhhhe ,  ,0Ӡp=!     !!  !j\,,,,,,,,,,,,,,,,,,,,,,.,,,,,,,,,.,,,,,,,,,,,,.,,,,,,.,..,LL,,NL,,.,L,,L,L,,,.L.,,,,.L,,,.,LL,,,,.,L,L,,L,,L,,,,,,,,,.,,,,,.,,,,,,,,,.,,,,,,,,,,,,L,,,,,,,,,,,,,,,,,.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,DDDDDD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,Xhhhhhhhhdhhh[Chhhhhchhdhdhgdhdhghdhhhhd_$$>fhch>@@hhhhhd@chdhcCghchh>$>hdh>_hhghhdhhgdh>>hhdhchhhc_hhhgdhdhhhdhT,,,, ,bhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhW ,,, ^ْq= !       !   !!        !   ! !  oٓ0,,,,,,,,,,,,,,,,,,,,,,,,,,.,,,,,,,,,,,,,,,,,,,,,,.,,.,,,,LLLLL,,L,,,L,,,LL,.,,,LLL,,LL,,,.L.L.L,,,LLLL,LL,,LL,,,,L,L,,,,,,,,,,,,,,L,,,,,,,,,,,,,L,,.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,D,DD,,,,,,,,,,,,,,,,,,,,,,,,,,,Thhhhghdhghhdg$>hhhhhhhghghhhhhhhhhghhchhh@$Bhhhhh@@hhchch@>hchh_Bhhhh_$_hhhcchdhhghhhhh@>hdhhhhhghZchhhhhhchhdhh>hchhghhghhghX,,Mdhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhg0,0}?   !   !   ! !=q\,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,.,.,,,,,.,,,L,L,L,,,N,L,NL.,L.L,L,LL,,.,L,,.LL,,LL,L.L.LL.,,,,,LLL,,LL,.,,,,,,,,.,,L,.,,,,,.,.,,,,,,,,,,,.,,.,.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,DDDDDDD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,Xhhhhhfghhdhhh8chdhhdhdhhhdhdhchchhhhhhhhhch_B_B__hhhchchBBB_hh[B$j@hhhhghgh[CYB_chhhghdZBY_hhhh[c_chhchhc_c[hhhhhhhdghh>@hhhhdhhdhB_hhchhhhhhghh>$hhhhhdhhdhhdX,,,,,,chhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh^,,, ,,,`蚏m     !!!   !   !    ! =ٓ-,,,,,,,,,,,,,,,,,,,.,,,,,.,.,,,,,,,,,,,.,.,,,,,,.,,,,,,,,L,,L,LL,,LLLLLLNLLL,L,,L,L,LL,,L.L.LL.L,.LL,LL,.,,L,L,,,,L,LL,,L,.,.,,,,,,,,,,,,,,,,,,,,,,,.,,.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,L,D,DD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,Xhhhhhhdhdhhhh_$Zhhhhghhhhhhhhhhhhhhhdhhchhhchhhhhghhhhhhhhhhhhhhhhchhhhhhdhhdhhhhdhdhdhghdhdhhhhhhhhhchhhhhhhhhhhhhhdhhhhh>hhghhhhhhC$[hhhhhhchhhdd@hdhhhhdhghhhX,,,,WhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhcM -ӏp$   ! !   !         !j\,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,.,,,,,,,,,,,,,,,,,,.,,,,.,L,.,,L,L,LL,LLLLLL,LLL,L,.LL,LL,LLLLLLLL.LLL,.LL,L,,L,L,L,,LLL,L,.,.,,L,,,,LL,,,L,,,,,,,,,.,L,,,.,,L,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,DIDDDDDDD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,Xhhhhhhgghghhhhchhhhhhhchhhghhhhhhhhghhhchhhhchhdhhchhhchhhhhhhhhhdhchhhghhhhchhghhgghhhghdhhhhhhhchhhchhhhhhhhhhhhhhhdhh>$$hdhhhhchgYchdhhhchhhhgh>hhhhhghgdhhhW,,,,Mchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhc^s=     !   !!     ! !     !!!o׍/,,,,,,,,,,,,,,,,,,,,,,,,,.,,,,,,,.,,,,,,,,,,,,,,,,,,,,.,,,,,,,,L,LLLLL,L.LLLLLLLL.L.,,L,LLLLLLLLLL,LLL.L,,L,,,LLL,,LLL,L,,,,,,,,,LLL,,L,.LL,,.,L,,L,,,,,,,,,,.,,.,,,,,,,,,,,,,,,,,,,,,.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,DDD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,XhhchhhhfhhhhC$$>gdhhhhdhhghhhhdhhhdhhhhhhchchhhhghhhchchhhhhhhhchchghhhhhchghhhhhhhhhhg$8hfhhhhhhhchhhhhhhhhdhhhghhhhg$hhhhhhhghY$[dhchhhhhchdh>$hhhhgfhdhhhhX,,,,,,chhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhM    , 笏l     !   !  =sP,,,,,,,,,,,,,,,,,,,,,,,,,,,,,L,.,,,,,,,,,,,,,,,,,,,,.,.,L.,,,,L,,LLLLLL,LLLLLLLL,LL,,L,L,LLLL.L,L,L.L.LL.LL,LL,LLLLL,,,,.,,,,,,.,L,,,LL,LL.,L.,,,L,.L,,,,,,,,,,,.,,L,,,,,,,,,.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,DDDDDDDDL,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,Xhhhhchhhhhhhhhh$hhhhhhhhdhdhhhhhhghhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhdhhhhhhchhhhC$Yhhhchhhhhhhhhhhhhghhhhhhhhhd>hhhhhchhhC$xhhhhhhhhhhhd@hhhhhhhhhhhhX,Whhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhc0      0Տq !        !     ! ! ! ! !         l`,,,,,,,,,,,L,,,,,,,,,,,,,,,,,,,,,,,L,,,,,,,,,.,,,,,,,,,,,L,,,,,.L,LNLLL,.LLLLLLLLL.L,LL,LLLLL.L,LL,LLLLL.LL,,,,,LLL.L,,L,,L,L,,L,L,.,LLL,LL,.LL,,L.,,L,L,,,,,,,,,,.,,,,,,,.,,,,,,,,,,,,,,,,.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,DDDDDD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,Whhhhhhhhhhhhhhhd$chhhfhhhhhhhghhhdhhhchhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhghhhhhhhhhhhhh_$Chhhhhhhhhhhhhhhhhhhhhdhhdhhhd@hhhhhhchhZ$[hhhhhhhhhhhh>$hhhhhhhhhhhhX,,,0chhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhW  , f}>!   !  !  !  !!$qٓM,,,,,,,,,,,,,,L,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,LL,.,,,,,,.,L.L.,LL,LLNLLLLLLLLLLLLLLLL.LLL,LLNLLL.,L,LLLLL.L,LL,LLLLLLLLLL.LL,,LL.,.,,,L,L.,,LL,,L,.,,,,,,,L,,,,.,.,,,,,,,,,,,L,,,,,,,,,,,,,,.,,,,,,,,,,,,,,,,,,,,,,,,,.,,,,,,,,,,,,,,,,,,,,,,,DDDDDDDDDD,L,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,Xhhhhhhhhhhhhh_$>hdhhhhhh_XhghdhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhB$>hhhhhhhhhhhhhhhhhhhhhhhhhhhdhh>$hhhhhhhhhB$chhhhhhhhhhhh@hhhhhhhhhhX,,,chhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhc0 ӏm!  ! !  !     !   !  !=\,.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,.,L,,,,.,,,L,,,,.LL.,.,,LLLL.L,LLLLLLLLLL,LLLLLLLLLLLLLLLLLLLL.L,,LL.LLL,LLLL..LLLL,.LL,,LLL,L.L,,LL,,,,,L,LLL,L,,L,,,,,,,,,,L.,,,,,,.,,,,,,.,,,.,..,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,DDDLD,L,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,Thhhhhhhhhhhhhhhh_!@Y_c_[@$@hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh@_@[>@$@>YZYZhhZ$_hhhhhhhhhhh$hhhhhhhhhhhhX,,,,,MhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhX Us=   !!!      ! !oٍ-,,,,,,,,,,L,,,,L,,,,,,,,,L,,,.,,,,,,,,,,.,L.,,.,.LL,,L,,.,L,.,LLL,,,LLL.LLLNNLLLLNLLLLNLLLNLLLLLNLL.LLLLL,LLLL,,LLLLLLLLLLLLLLL,,L.LLLL,LLLL.,,L,L,L,L,L,.,,,,.,,,L,.L,,LLL,,,,,LL,,L,,,,,,.,,,,,,,,,,,,,,,,.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,DDDDDDDDD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,Xhhhhhhhhhhhhhhhf>$$$[hhhghhhhhhhhhhhhhhhhhhhghhhhhhhhhhhhhhhhhhhhhhhhhhh$$$$hYchhhhhhhhhh>$hhhhhhhhhhX,,,,,,,LdhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhM ,謠?      !  !  !            =}ڗM,,,,,L,,,,,,,,,,,,,,,.,,,,,,,,,,,,,,,L,,L,L,,,,,LL,,,,,,,,LL,,,LLL,,LN.LLN,NLNLLLLLLLLLLLLLLLLLLLL.LLLLLNLLLLL,.LLLLLLLLL,LLLLL,LLLLLLL,,L,.L.L.L.,,LLL,,L,LL,,,,L.,,,L,L,L.,,LL,,L,,.,.,,,,,,,,,,,,.,,,,,,,,,,,,,,,,.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,.,,,,,,,,,DDIDDD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,Xhhhhhhhhhhhhh_$$$=hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh$$!$$$$hhY_hhhhhhhhhhh@$hhhhhhhX,,,bhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhg,0ْ}!!  !!  !!!   !    ! !! o\,,,.,,,,,,,,,,,L,,,,,,L,,,,,L,,,,L.,,,L,L,LL,,L.L,LL,L,LL,,L,LL,,L.,LNLLNLNLLLLLLLLLNLNLLLN,NLLLLLLLLLNLLL,LN,LLL.LLLLLLLLLL,LLL,LLLLL,LLLLL.L.LL.,,LLL.L,,L,.,,,L,,,LLL,.,,,L,LLL,L,,,,,L,,,,L,,.,,,,,,,L,.,,.,,,,,,.,,,,.,,,,,,,,,,,.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,DDDD,DDDDD,,L,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,Xhhhhhhhhhhhhhhhhhhh_@$$$$>YhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhZYYYYYBYCYZYZ_YYYYh_=@>hhhhhhhh=$hhhhhX,,,MghhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhW\謎?  !      ! ! !       !! =ڍ/,,,.,,L,,,,,.,,,,,,L,,.,L,,,,,,,,,,,L,L,,,,,.,LLL,L.,,,,L,,L,LL,L,,LLLLNLNLLNLNLLLLNNN,LLNNNLLL.NN,NLLLNLLLLLLLLLLLLLLLLLL,LLL,LL..LLLLLL,LLLLL.L,LLL.L,.LL,,LL,,L,.,,L,,L,,,.L,L,LL,L,,,.,,,..,L,L,.,,,,,,,,,,,,,.,,,,,,,..,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,D,DLL,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,Xhhhhhhhhhhhhhghh_c_hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhX,,,,,,,,chhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhgM,,q!      !!!      !        !o\,,,,,,,,,,.,,,,L,,.,.L,,,L,.,,,,L,,,L,.,,L,,,LL,L,LLLL,L,,,,,L.L.L,LNLNNNLNLLNLLNLLNLLNLNLLNLLLLLNNNN,LLLLLLLLLLLNLLLLL.LLL,LLLLLLL,LL.L,LLL,LLLLLLLLL.LLL,.,LLL.,,,.,,,.,.,LLL,,,L,LL,LL,.,L,,,L,,,,,,LL,.,,.,,L,,.,L,,,.,,,,,,,,,.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,L,,D,DDD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,XhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhX,,,,,,,,,,\hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhX,,,,,0謏?  !          !! =\L,,,,,,,,,.,,L,L,,L,L,,,L,,,,,LL,L,,,,,,,,L,LLL,,LL,LL,,LLLL,,L.LL,LNNLLNLLNLLNLLNLLNLLLLLNNLLLLLLLNLNLLLLLLL,LNLLLNLL.LLLLLLLL.LL.L,LLLLLLLLLLL,,LLL.LL.L,,LLL,.LL,L,LL,.,,.L,L,,,LL,,,L,,,,.,L,L,,LL,,.,,,.,.,,,.,,,,L,,.,,,,,,.,.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,L,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,XhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhX,,,,,,,MchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhgM,,,\q= !    !     !  !!     oٓL,,,,L,,,,,,L,,L,,,L,LLLL,,,,LL,,,,L,,LLL,,,LL,L,L,LLL,L.L,L,LLLLLLLNNLLNLLNLNLNLNLNLNNLNNLLLLLLNLLLNLNLLLLLLLNLLNLNLLLLLLLLLLLL.LL.L.L.LL,LLLLL.LLLLLL,LL,L.LL,LL.L,LL,L,,LLLL,,.L,L,LL,,LL,,,.LL,,LL,L.,,L,,L,,.,,L,L,,.,,,,,,,,,,.,L,,.,,,,L,,,,.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,D,,LL,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,XhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhX,,,,,,,,,,,,,,,chhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhc,,,,,,,,,,?!!    !  !      =sO,,,,,,,LL,,L,L,,.L,L,,L,L,,LLL,LL,,,LL,,,LLLLL,,,L,L,LLLLL..,LL.L,LLNLNNLLLNNLNLNNLLNNLLLLLLNLLNNLLNNNNNLLLLLLNNLNL.LLLLLLNLLL.L..LLL.NLLLLLLLLLLLLLLLLLL,LL.L.L.L,,LLLL,LLLL,L,.,L,,LLL,L,L.,L,,LL,,,,L,,,L,.,L,L,,.L,,,,,,,,.,.,,,.,.,,,,,.,,.,.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,L,LD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,XhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhX,,,,,,,,,,WhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhM,,,,q= !          !     ! !     !    !  ! m\,,,,,,L,L,L,L,.,,LL,L,,,L,LLL,L,,L,,LLLL,,LLL,L.,,LL,LLL..LL,,LL,LLNLNNNNLLNNNLNNLLNNLLLLLNLLLNLNLLLLNLLLLNNNNLLLLLLLLNLLLLLLLLLLL.LLLLLLLLLNLLLLLLLLLLLLLLLL.LLLL.LLLLL,LLL,LL,,L,LLL,,,LL,,,L,L.,,,LLL.,,LL,,.L,,.L,,,,,.,.,,L,.,,,,L,,,,L,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,LDD,D,DL,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,XhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhV,,,,,,,,,,,Mchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhc,,,,,0ٟo !   !  ! !    ! !  ! ?eLL,,L,L,L,L,L,,LL.,L,,L,,L,,,LLLLLLLLL,LLLLLL,,L,LLL,,LL.LLLL.LL.NNNLNNNNLNLNLLLNLLLLLNLLLLLLNNLNLNLNLLLLLNLLL,NLLLLNLLNLLLLLLLLL,LLLLLNLLLL,LLNLLLLLL,LLLLL,LLLLLLLL,LL,,LL,,L,,LL,L.LL,LL,L,,,LLL,,LL,,,LL,,L,,.,,.,,.,,.,.,L,L,.,,.,L,,L,,,,,,,,,,,,,,.,,,,,,,,,,,,,,L,,,,,,,,.,.,,,,,,LD,LL,DL,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,XhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhùhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhX,,,,,,,,,chhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhX,,,,,^誏?!   !!   !    ! !!     !9ٍOL,,,,,,,LLLL,,.L.LL,LLL,,LLLL,LLLLLLLL,,L,,LLL,L,,LL,LLLLLLL,LL,.LNNNNNNNLLNNNNLNNNLLLLLLLNLNLNLLNLLLLLLNLLLLLLLLNLLLLLNLLLLLLNLLLLNLLLLLLNLLLNLLLLLLLLLLLLLLLLL,LLL,LLLLLLL,LL,,LLL,LL.LLLL,LL,L,LL.L.LL,,LL,L,,L.,,,,,,.,.,,L,.,,,.,,,,,,L,,,,,L,,,,,L,.,,,,.,,,,,,,,,,,.,,,,,,,.,,,,,,,,,,,,LD,L,D,DL,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,XhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhX,,,,,,,,,,,,Xhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhc0,,,p9    ! ! !  !  ! !!!CR,,,LLLLL,L,LLL.L,L.,,LLLLLL,L,LLL,LLLLLLL,LLLLLLLLLLLLLLLLLLL.LLNNNLNLNNLLLNLNNNNLNNLNLLNNNNNNLNLLLLLLLLNNLLLNNLLLLLNLLNLLNLLLLLLLLL,NLN,LLNLNLNLL,LLLLLLLLLLL,LL.LLLLL,LL,,.LL,LLLLLLL,.LLL,,,LLLL,L,LL,L,L,LL.L,LL,L,,,.,,.L.,.,,.,,,,,L,,,LL,,,,.,,,.,,,,,,,,,L,,,L,,,,,L,,,,,.,,.,,,,,,,,,,,,L,,,,,,,.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,Xhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh¹hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhX,,,,,,,,,chhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhX,,Վj !!     !!  !    !         !!      !  !  ! 7\,,,,LLLL,,L,,LLLL.LLL,,LLLLL,,LLL,LLLLLLLLLLLLLLLLLLL,LLLL.LNNNNNNNLNNLLNNNNNNNNNNNNNLNLLLNNNNLLLLLLLNNNLNNNLNNLLNNLNNLNLNLLLLLNLLNLNLLLLNLLL,LLLLLNNLLLL,LLLLNLLLLLLLLLLLLL,LLLLLLL,LLL,L,L.,LLLL,,LL,,,LL.LLLLL.L,L,L,.,L..,,,,,,,,LLL,LLL,LL,,.,.L,.,L,,,,,,,,,,,L,,,,,,.,,,,,,,,,,,,,,,,,,.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,XhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhÄhhhW,,,,,,,,,,,,,,,,,,chhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhM,,,,,,Ms=  !!!!!!     !     peL,L,LL,LLL,LLLLL,LLLLLL,,DLLLLLLL,LLL,LLLLLLLLLN,LLLLLL.NLNNNNNNLNNLNNNNNNNLNLLNNNNLNNNNNNNNNLLNNNLNLNNLNNNNLLNLLLLNNLNLLLNLNLNNNLLLNNLNLNLL,NLLLNLLLLLLNNLL.L.LLNLL,LL,LLLLLLLL,,L.LLLLLLLLLLL,,LL,LLLLL,L,.L,LL.L,,LLLLL.LL,,,LL,,,,L,,LL,.,L,,,,LLL,,,,,L,,L,.,,,.,.,,,,,,L,,,L,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,Xhhhhhhhhhhhhhhhhhhhhhhhh¹hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhùhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhùhhhhhhhhhhhhùhhhX,,,,,,,,,,,,,,Mhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh,,,ap! !  !! !!! !!         !  ! !!       ?ڕP,,LLDMLL,LLLLLLLLLLNLLL,LNLLLLLLLLLLLLLL,LLLLLLLLLLLLLL.LNNNNNNLLNNNNLNLNNNLNNNNNNNNNNLNNNLNNNLNNLNNLNNLNNNLLNLNLNLNNNNLLNNLNLNLNLLLLLLNLNLLLLNNLLLLLNLLLNLLLLLLL,L,LLLLL,LLLLLLLLLLLLLLNLL,LLL,,LLLLL,,LLL,LLL,LLLL.,,L.L,L.,,.L,LL,LL,L,L,,,.,,.,LLL,,,.L,.L.LL,,.,,,.,.,.,,,,.,,,,,,,,.,,,,,,,,,,,,,,,,,,,,,,,L,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,XhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhX,,,,,,,,,,,,,,ghhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhW,ُm!  ! !!    !   ! =PLLLLLLLL,LLLLLLL,LLLNLLLLLLLLL,LLL,LL,LLLLNNLL,-LLELNNNNNNNLNNNNNLNNLNNNLLNNNNNNLLNNNNNNLLNLNNNLLNLLNNNLNNNLLLNLNLLLNLNNLNNLNLLLLLLNLNLLLNLNLLNLLLLLLNLLLLLLLLLLLNLLLLLLLLLLLNLLLLLLLLLLLL,LLLL,L,LL,LLL,LLLLLLL,,LLL.LL,,,L,LL,,,,,.LL,,LL,.,L,L.,,LL,.LL.,,.,,L,,,L,,,,L,.,,,L,,,,,L,,,,,,,,,,.,,,,,,,,,,.,,,,,,.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,XhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhX,,,,,,,Whhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhds= !  !!!! !!!! !! !!! !!!!! !         !!   !!! !  !!! =qeMRM\MRMMRMM\RMMRMR\RMRUMRMMMMMTMMRM\MMRMTRMMMMMMRMRMRMMMR\WMMRMMMNNNLLLNLNNNNNNLNNNNNLNNNNNNNLNNNNNNNLLNNLLNLNLLNNNNNNNLLLNNNNLLNLLLNNNLNLLLLNLNLNLLLNLNLLLLLLNLLLLLLLLLLLNLLNLLLLLLLNLLNLLL.LLLLLL,L,,L,LLLN,LL,LL,L,,LL.LLL,LLL,LLL,.LL,L,LL,LLL.,LLL,,,,L,L,,.,,,.LL,,L,,,,,.L,.,,L,L,,.,,,,L,,,,,,,,,,,.,L,,,,,,,.,,,,.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,L,,,,,,XhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhX,,,,,,,,"dhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhcXWXWXWXWWXWXWWWWWXWTWWWWMMMMMMMMMMMMTMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM0MM0M-M0T0LMT"L"--0M-000LMM00M-M00M0F0M0000M00F,Mq!  !!!  !! jhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhNLNNNNNNNNSNNNNNNNNLNNNNNNNNLNNNNNNLNLLNNLNNNLNNNNNLNLLNNLLNLLNNLLNNNNLLNLLNLLNNLLLNNNLNLNLLLLLLLNLLLLLLNLNLNLLNLLLLLLLNLLLLLLLL,LLLL.LLLLLLLLLLL,L.L.L.LLLLLLLLNLLL,,.L,L,L,,LLLLL,L,,LL.,,.,L,,,,.L,,,L,,LL,L,,,,L,L,L,,,,.,,,,LL,,.,,.,,,,,.,L,,,.,..,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,MM\XXWbb\XW\WWWWXWWWXXWWWXhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhX,,chhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhcccccccccccccccccccccccccccccccccccccccccccccccccccccccccco     !  !! !! !!!!!!! !           !! ! !!     !!!!!  !  !! =LNNLNNNNNNLNNNNLNNNNNNLNNLSNNNNNNLNNLLNNLNNNLNNNLNNLLNLNNLLNLNNLNNNNNLLNLLNNLLNLLNLLNNNLNLLLNLLLLNLNLLLLLLLLLLLNLLLLNLNLLLLLLLLL,LL,NLL,LLL,NLLLLNLLLLLLL,LLLL,L,,LL,,LL.,LN,LLL,LLL,,,LL,,L,L,,LLLLL,,L,,L,,,,.,.,,LLL,L,,L,L,,,L,,,,,,.L,L,,,,,,,,.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,MchhXhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhXWWXWXWWWWWMMMMMMMMMMMMMMMMMMMMMMMMMMM0M0MM-L-MTMM-M000M00000M-0M0M00,,,0,0XhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhՎj  !!!!   ! !     !!   =NNNNNNNLNNNNNNNNNNLNNNNNNNNNNNNNLNNLNNNNNNNNNNNLNNLLNNNNNLNNNLLNNNNNLNNLLNNNLNNLNNLLNNLLNNLLLNNLLLNLNLLNNNLLLLLLNLLLNLNNLLNLLLLLLL,LLLLL.LLLLLLLLL,LLLLLLLLL,LLL,LL,LLLLLL,,LLL,LL,,.LLLL,L.L,,LL.LL,L,L,,LL,,L,.L,L,L,,L.,,,,L,,,L,L,,,L,,,,,L,L,,,,,L.,.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,McXhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhXhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhs> !!  !!!! !!! !!!!!!!!   !!!!!!   !!!    !!  !   !!           !  ! =qNNNNNSNNNNNNNNNSNNNNNNSNNNNNNNNNNNNLNNNNNNLNNNNNNNNNNNNNNLNNNLNNNNNNNNLLNNNLNNLNNNLLLNLNNLLLNLNLLLNNNLLLLLLLLNLLNLLNLLNLNNLLLLNLLLLLLLLLLLLLLLLLLLLLLLLLLNLLLLLL.LL,LLLLLLLLLLLLLLLLLLLLL,,LL,LLLL.LLL,,,LL,LL,LLL,,,,LLL,,,,L.,,,LLL,.,.,.,,,,,L,,L,,,.,L,,,,.,,,,,.,,,,,,,,,.,,,,,,,L,,,,.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,cXXXXXWXXTXXWXXXXWXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXTXWXXXXTXWXTXWXTXXTXWXTXTXXXXXTXXXXTXXXTXWXTXXXTXXXTXUXXThhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhq9  !!!! ! ! !!    !o¾ľľNNNNNNNNNNNNSNNNNNNNNNNNSNNNSNNLNNLNNSNNNNNNNNNNNNNNNNNNLLNNNNNNLNNNNNLNNNLLNNNNNLNNNLNNLLNLNNNLLNNNLNLLNLLLLNNLNLLNLL,NLLNLNLLL,LLLLLLLLLLLLLLLLLLLLLLLNLLLNLL.LL,LLLNLLLLLLLLLLLLN,LLL,,LL.LLLLLLLLL,L,LL,L,LLL,LLL,LL,,L.LLL,,LLL.,,,.,,.,LL,L.,,L,,,,,LL,.,,,,,,,,,,,,.,,,,,.,,.,,,,.,,,L,,,,,,,,,.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,LccXccccccccccccccccXXXcXXXXbXXXbXXbXbXbXbXbXXXbXXXXbXXXXXXXXXXXXXXXXXXXbXbXXXXbXbXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXWXTXXXXTXXXTXXXXXXXTXXXTXXXXXXWXhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhq!!  !!  !!!!!   !! !!!   !!!!  !! !!!!  !!        !!  ! !      !!!!!    ! ?NNNNSNNSNNNNNNNNNNSNSNNNSNNNNNNNLNNNNNSNNNSNNNLSNNNNNNNNLLNNNNNNNNNNNNNNNNNNLNNLNNNNNNLLNNNNNNNNNNNLNNLLLNLNLLLNLLLLLNNLNLNLLLLLLNLNLLLN,LLLLNLNLLLNNLLLLLLLNLL.L,LLLLLLLLLNLL,LLL,LLLLL,,NLLLL,LLLLLLLLLLLL,LL,LLLL.,,,LLL..LLLL.,,,L,,,L,,L,,L,,L,.LL,L,,,,.,,,.LL,,L,,,,,.,,,,,,.,,,,,,,,,,,,,,.,,.,,,.,,,,,L,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,chXhhhhchchcchcccccXcXcXXXXcXXXcXXcXXXXcXXcXXXXcXXXcXXXXcXXcXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXTXXXXXXXTXXXTXXXcXhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhٟp!! !  !!!!!  ! !    ! ! !=NNSNNNNNNNSSNSSNNNNNNNNNNNSNNNNNLSNNNNNNNNNNNNNNNNNNNNLNNNNNNLNNNNNSNNNNNNLNLNNLNLNNLNNNNNNNLLNNNLLNNNLLNLNNLNNLLNLLNNLLNLNNLLNLNNNLLLNLLNLLLNLLLLNLLLLLLLNLNLLLLNLLLLNLLLLLNLLLLLLLLL,,LLLLL,LLL,LLLLLLLL,L,LL,L,LL,LLLL.LL,,LLL,,LL.,L,L,,LL,,,L,,,L.,.LL,,.,,L,L,,,.,,L,,,L,,,L,.,..,,L,.,,,,,,,,,,.,,,.,,,,,,,,,,,,,,,,,,,,,,,,,,,.,,,,,.,,,,,.,,,,,,,,,,,,,,,,,,,,WccXhchchccccccccccXccXcXcXXXcXXcXXcXXXXcXXXXcXXXcXXXXcXXcXcXXXXcXXcXXXcXcXXcXXcXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXThhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhsl!!      !!! !!!!!!!!!!!!! !!  !!!!  !!!    !     !!       !        !!      !=ľľNNSNNNNNNNNNNNNNNNNSNNNSNNNNNSNNNNNNNNNNNSSNNNNNSNNNNSNNNLNNNNLNNNNNNNLNNSNNLNNNLLNNNLLNNNNNNNNLLNLLNNNLLNNLLNNNNLNNNLLLLNLNNLNLLLLLLNLLLNLLLLNLLLNNNLLNLLLLNLLLL,LLLLLNLLNLLLNLLNLLNLLLLLLLLL,LL..L.LL,LLNL,LLL,,NLL,LLLLLLLLL,,L,LLLL,,LL,L..LL,L,,L,L,,L,LLL,L,.,.,.,,.,,.,L.,,L,L,.,,,,,,,,,,,,,,.,,,.,,,,,.,L,,L,.,,,,,.,,,,,,,.,,,,,,,,,,,.,,,,,,,,,,,,,,.,,,,,,,,,,,,,,,,,0chcccccccccXcXXXbXbXXXXXXXWXXWTXWXWXWXXXXXXXXWXXXXXXWXWXWXXWXWXWXXWXXWWXWXXWXWXWXXXXXXXWXWXXXXXXXXXWXXXXXXXXXXXXXXXXXXXXXXXXXXWXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh}? !!!!!! !!!!!  !!      !}NNNNNNNNNSNNNNNNSSNNNNNNNSNNNNNNNNNNSNSNNNNNSNNSNNNNNNNNNNNNNNLNNLNNNNNNNNNNNNLNNNNNLLNNNNNNLLLNLLNNNNNLLNLNNNNNLNLNLLLNNNNNLLNNLLLLLLLLLNLLLLLLLLLLNLLLLLNLL,LLNLLLNLLNLLLLLLNLLLLLNLLLLLLL.L,LLLLL,LLNLLLLLL,LLL,L,,LLLLLLL,,L,,,LLLL,,,,LLLLL,LL,,,,,L.LL,,L,,,,,.,L,L,.,,,,,.,,L,,L,,,...,,,L,,,,.,.,,,L,.,,,,,,,,,,,,,,,,,,,,,,,,L,.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,Thhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhs= ! !!    !!! ! !!!!  ! !!!! !!!! !!!!!!!!   !! !   !!  !   !!        !!    !!!!  ! !  qNSNNSNNSNNSNNNNNNNNNSNSNNNNNNNNNNNNNNNNNNSNNNNSNNNNNNNLNNNNNNNNLNNNNLNNNSNNNNNNNNNNNLLNNNNNSNLLNNNLNNNLLNNNNNNLLLNNNNLNLNNNNLLNLNLLNLNLNLLNLLLLNLNLLNLNLLLLLLLLLLLLL,LLLNN,LLNLLLNLLL,LLLLNLLLLL.LLLLLLLLLLLLNLLLLL.,,LLLLLLL,,LLL,LLL,,LLLL.L.,,LLLL,L,LL.L,,,LL,.,L,,,,,L,,,,L,L,.L,L,,,L,,,,,,,,,,,.,,L,,,,,.,.,,.,,,,,,.,,,,,,,,,,,,,,,,.,,,,.,,,,.,,.,,,,,,,,,,,,,,,,,,,,,,,,,,,,bľhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhq!!!!! !! !! !!!!!! !!!!!! !!     !  lNNNNSSSNNNNNSNSSSNNNSSNSSNNNNNNNNNSNNNNSNNNNNNNNNNLNNNNNNNNNNNNNNSNNNNNNNNSNNSNNLNNNNSNNNNNNNNNNNNNLLNNNNNNNLLNLNNLLLLNNNLLLLLNNLNNNNLNLNLLLLLNNNLLNNLNNLLLNLLLNLNLLLLNNLLLLLLLLLLLLLLLLLNLLLLLLLLLLLLL.LLLLNLNLLLLLLLLLLL,LLLLLLL,,LLLLLL.L,LL,LL,,,LLLL,L,,,..L,.LL,L,L,,L,.,L,,,LL,L.,,,L,,,L,L,,,LLL,L,.,,,,,,,,,.,,,,,,,,,,,,,,L,,,,,.,,.,,,,,,,.,,,,,,,,,,,,,.,,,,,,,,,,,,,,,,chhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhq    !!!!!  ! !!!!!!! @BY__x_ZB;!!!! ! !!!!!!!!!! @x˅[             !!           !    !        ! !!! !!! !mNSSSSSNNSNNNNNNNNNNSSSNSSNNNNSNNNNSNNSSNSNNNNNNNNNNSNNNNNNNNNNNNNNNNNNNNNNLNSNNNNLNNNNNNNLNNNSNNNLNLNNNNLLNNNNNNNNNLLNNLLNNNLNNNLLNNLNNLLLLNLNLLLNNNLNNLLLLNLLLLNNLLNNLNLLLLLLLLLLNLLLLLLNLLLLLLLLNLLNLLLLLLLLLLL,LL,LNLN,LLLLLLLLL,LLLL,,LL.LLLLLL,,LL,L.L,L,LLL.L.,LL,,,,.,,L,,LLL,LL,,,,L,.,,LL,,LL,L,,,,,,L,,,LL,,,,.L,.,,,,,.,L,,L,,,,,,.,,,,,.,,.,,,,,..,,,,,,,,,,,,,,,,,,,,,,,,,,,0\ľhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhq  ! ! !! !!!!!!!!!!!!!!Z̖Y!!!!!! !!    !Z!!!YYYZZZ[ZZ@ @__@! @YZYYZYZ_Y  @ZYZ[ZYZ[ZY! YZZZZ[ZZYZY!!   !_    ?NSNNSNSSSNSSNNNNNNNNSSNSSNNNNSNNNNSNNSNNNNNNNNNNNNSNNNNNNNSNNNNNNSNSNSNNNNNNNNNNNNNNNNSNNNSNNNNNNLNNNNLNLNLNNNNNNNLNNNNLNNNLNNNNNNLNNNLNNLLLLLLNLNLLNNLNLNLNLLNLNNLNNLNLNLLLNNLLLLNLLLLLLNNLLLLLNLLNLLNLL,LNLLLLLLLLLLLLLLNLLNLLL,LLLL,L,L.LLLLLLLL,LLL,LLLLLLLL.L.LLLLLL,.,L,,L,LL,LL,LLL,L,,L,LL,LL,.,,L,,LL.,L,L,,,,,,L,L,,,,,.,,.,,,,,,L,,,,,,,,,,.,,..,,,,,,,,,,,,,,,,,,,L,.,,,,,,,,,,,Lchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh¹q!!! !!!! !!!! !  !!!!!!!ZB! !! !!_; !_! !   @@  !  ;@! !!Y!   x ! !    _ ! !   ! !     =NNNSSSSSSNNSNNNNNNSNSSSSNSNSSNNSNNSSNNSNSNNNNNNNNNNNNNNNNNSNNNNNNNNNNNNNNNNLNNNNLNNNNNNSNSNNNSNNNLNNNLLNNNLNNNNNNNSNNLNNNNNNNNLLLNNNNNNLNNLLLLLNLLNNNNNLLNNLLNLLLNLLLNNLLLLLLNLLLLLNLLLLLNLLLLLLLLLLLLNLLLLLLLLLLLLLLLLNLLN,LNLL,L,LL.,NLL,L.LLLLLLLLLLLLLLLLL,,,LLLLLL,L,,.,,,,.,LLLL,L,LL,,L,,.L,.L,L,.,,,LL,,,,,,L,.,LL,.,,,L,,,,,,L,L,,,,,,,,,,,,,.,L,,,,.,,,,,,,,,,,,,,,,,,,.,,,,,,,,,,,,,0\ľľľhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhq!!!!!!!! !!!!!!! ! Y@!!!!!!;!_;Y ;@Z   ! ! _  !   ! 7}ľNNNSSSSSNNNSSNNNNNSSSSNSNNSSNNNNSNNSSNNNSNNNNNNNNSNNNSNNSSNNNSNNNSSNSNNNNNLNNNSNNNSNNNNNNNNNNLLNNNNNNNLNNLLNNNNNNNNNNNLNLLLNLNLNNNNNNLLNNLLLLNNNNNNNLNNNLNNLLLLNLLNLLNNNLNNLNNLLNLLNLNLLNLLLLNNL,NLLLLLLLLLLLLNNLLLNLNLLLLLNL,LLLLLLLLLLLL,LNLNLLLLLLL,L,,L,LLLLLLLL,L,.L,,.,LLLLLLL,,N,LLL,,,L,,.L,,L,L,,L,LL.,L,,L,L,,L,,,,LL.,L,,,L,,,,,,,L,L,,,L,L,,,,,L,,,,,,.,,,,,,,,,,,,.,,,,,,,,,,,MWhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhُj!!!!!! !!!!!!!!! !!!!!_!!   !!!!!![9!!Z9! YY  ;; @ !    ! ! ! !     !!!?SNNNSSSNNSNSSNSNNNSNSSSNNSNNSSNNNNNSSNNNSNSSNNNNNSNNSNNNNSNNSSNNNSNNNNNNNNNNNNNNNNNNSSNNNNNNNNNNNNNNNNNNNNNNNNNNNNNLNNNLNNNNNLNNNNLNNLLNNNNLLNNNNLNNNLNLNNNNNLLLNNNLNNLNLLNLNLLLNNLLLLLLNNLNNLLLNNLLNLLLLLLLLLNLNLNLNLLNLLLNLLLLL.LLL.L,LL...,LLLLLLLLL,LLLLL,LLLL,LL,,LLLL,,,LLLLLLL,L,L.LLL,,,LLL,LLLL,LL,L,,,LL,L,.,.LL,L.,L,L,,LL,,,,,L,.,.LL,L,L,,,L,.,,,,,,,,,,,,,,,,,,,,,,,.,,,,,,,,.,,\cľľľľhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhُ?!!! !!!!!!     !!! !!!!!!!!!!!! !!!!!!!!!!!; !!!!!  _!!!9; ;[!  ! _     !!!=SNNNSNNNSSNSSSNNNSSNSNNSNSSSNNNNNNSSNSNSNSNNNSSSNNNSNSSNNSSNNNSNNNNSNNNNNNNNNNSNNNNSNNSNNNNNNNNNLNNNLSNNNLNNNNNNNNNNNNNNNNNNNNLNLLLNNNNNNNLLNNNLNLLLNNNNNNLLLNLNNNNNNNNLNLLNNNNNLLLLNLNLNNNLLNLLLNNLLLLLLLLLNNLNNLNLNLNLLLLLLLLL.LLLLLNNLLLLLLLLLLLLLLLNLLLLLL,L,,LLN,LLLLL,LLL,L,L,LLLLLLL,.,LLLL,LLLL,L,,LLN,L,.,,.L,.LLL,,L.,,,L,L.,,,,,.LLLLL,LLL,,L,,,,,,,,,,,,,.,L,,,,.,,,L,,,,.,.,.,,Mbhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhs?!!!  !! !!!!!!!!!!!!!!!!!Z! [! ;@Y!!!!_  !  !      =qSSSNNNSNSSNSNNSNSNNNNSNNNNSNNSNNNNSNSSNNNNNSNSSNNNNNSNSSSNNSSNNSNNNNSNNNSSSSNNSNSNNNSNNSNNNNNLNNNNNNNNSNLNNNNNNNNNLNNNNNNNNNNNLNNNNLNNNNLNNLNLLLLLNLNLNNLLNLLLNNLNNLNNLNLNNLNNLLNLNNNLNNN,LNNNLLN,LLNNLLNLNNLLLNLNL,NLLNLLLNLLLLLLLLLLLL,LLLNLLLL,LLLLLLLLLLLL,LL.L,LLLL,LLLL,L,,,L,LLLL,,L,,,LLLLL,LL,L,LL,LL,,.,LLL,L.L,,L..,L.,.,LL,,L,L.,,,LLL,,L.,L,,LL,,,,.,L,,,,.,,,,L,,,,,,,,,.,,.,,M\hhhhhhhhhhhh&0++((++++(++(+++(++*(++++++++(++(+0(++(+*++(*(*+*(+++++*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++chhhhhhhhhhhhhhhhhhhhhhhӎ? ! !!!!!!!!!! !!!!!!!!  !!! [_ !!!!@!!!_! ;@!! ;@! !_ !     $qSNSNSNNNSNNSNNNSSNNNNSSSSNSSNNSNNNSNSNSSNSSNNNNNNNSSSSSSSNSSNNNNNNNNNNNNNSNSNNSNNNSNNNNNNNNSNNNLNLNNNNNLNNNNNNNNNNNNLNNLLNLNNNNNNNNNLNNNNLNNNNNLNNNLNNNNNLLNN,NLNNLLNNLLLLNN,NNNNNNNNLNNLLLLLNLLLLNNLNLNNNLNNNNLLLNLLLLNLLLNLNLL,LLNLLLLLLLLLLLLLNLL,.L,LL,.LLLLLLLL,LLLLLLLLLL,LLL,LLL,L,,LL,L,LL.LLLL,,,LL,LLLL.LLLLLL,,,,,L,,L,LL..,.L,.L.LLL,,L,,,,L,,,L,L,,,,,L,L,,,,.,,.,,,.,,,LMchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhgddfhhdhhddhhhhhdhhhhchhhdchhdhcgfhhdhghcdhchdhgcchchhcghchhchccdhchchcchccchchccccccchcccccchccccccccchcccccccccccccccccccccccccccccdccgfcccgcccccccdcccccXcc*0+3300<+30+30<+3000<0+000+0+30+30(30+300003000000+30+00+0+       +&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&+XcXcccccbcccccccccccccccccccccccchchcccchccccccccchcccccdccccccccchccccccccccccccccccccccccc?!!!!!!!   !!!!!   !! 9@ ! !![ ! [;@B__  !!      x  !   !!!schddhchhfhhhgddghhhghdhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhNSNNNSNSNNSSNNNSNNSNNSSSNNSNSNNNNSNSNSSNNSNNNSSSSNSSNSSSSSNNSSNNNSNSSNNNNSSSNNNNNNNNSNNNNNNNNSLNNNNNNNNNNLNNNNNNNNNNLNLNNNNNNNNNLNNNNNNSNLNNNNLNNNNNNLNLLLNLNNNLNNLNNNNLLNLNNNNNNLNNNNNNLNNNNLNLNNNLLLLNNLNNLNLLNLLNLLLLLNLLNLLLLNL,LLLLLLLLLNNLLLLLLLLLLLLL.NLLLLLLLLNLL,LLLLLLLLLL.LLL,,L,.L.LLLLLLLL.,L,LLLLLLL.LLLLLLL.L.,LL,LLL,,,L.LLLLL,,L,,L,,.,,.LL.L,,,L,,,,,,,,,.,L,L,L,,,,,Mc   +000+0+00030+03+003+00033+<03+03+03003+03+0(03+*0+00+0*+00+        +&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&+   s> !!!!!!!!!!!!!!!!!!!! !!!! !!! _!! !!!!!!!! !!!_!!!![!! _;B!_;!     _  ! =}SNSSSSNSSNSSSNSSNSSNNSSNSNNNNNSNNSSSSNSSSSNNNSSNSSNSNSNNSSNSNSSNSSSNNNSSSSSNNNSSNNNNSNSNSNNSSNNNNNSNNSNNNNNNNNNNNLNNNLNNNNLNNNNNNNNNSNNNLNNNNNNNNNNLNNNNNLNNLNNNNNNLNNNNLNLNNLNNNNNNNNLLNNNLLNNLLNNLLNNNNNNLNLNLLNLLNLLNLLNNNLLLLNNLLNNLLLLLLLLL.LLL,LLLLLLLLLLLLLLLLLLLLLNLL,LLLLLLLLLLLLLLLLLLLLL,LLLLLLL,N,,L.LLLLL,,LLLLL.L,LLL,,.LLLLL,L,L,,L,L,L,LL,L.L,,,,L.,,.L,L,,,,L,.,,,,,,,,LWd++30330*00+3000+300+30+00+00303000+300030+300000303(300********************************************************************************************************************************&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&+  ? !! !!!  !! !!!!–@!!!!! ƅ_[ZZZd_!! ;Y;@ Y  !_     !_  !  !    $qNSSNNSSNNSSNNSSSSNNNSSSSSSSSSNSSNSSNSSSSNSSNNSSNSSNNNNNNSNSNNNNNNSSSSNNSSSNNSSSNNNNSSNNNNNSNSNNNNNNNNSNSNNNNNLNNNNNNNNNSNNNLNNNNNNNNNNNNNNNNNNNNNNNNNNNLNNNNNNNNNNNNNNNLNNNNLNLNLLLNNNNNLLNNNLNNNNLNNNNNNNLNNNLNLLNNLLNLLLNNLLLLLNLLLNLLLLLLLLLLLLLLLLLNLLLLLLLLLLLLNLNLLLLLLLLL.LLLLLLLLLLLLLLLLLLLLLL,LLL.,LLLL,LLLL.L,,LLLLLLLL,LLLLLLL,LLL,LL,LL,,L,,,L.L,.,.L.,L.L,,,L,,,,,,,L,,,L,,Rc +000+00003+003+003+30+03+03+0+0+03+00*00+03+0*0+0(0+0+0*434344343O33433333433433333333333333333333333M333M333M333M330<0*03030:0033+03303+33+0<+00+0000003(0+00(0*0++0+++++++++++++++++*&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&+     ?!!!!!!!!!!!!  !! !!!!!!!! ! !! @ȁ@!!!!@x_!!! !!!Z!#_!_;!‚;@Y!  !!!!x      pNNSSSSSNSNSNNSNSSNSNNNNNNNSSNNSSNNSNNNNNSSNNNNSNSNNNNNSNSSNNNNNSSNSNSSNNNSSSNNNNSNNNNNNNNSNNSNNNNNNNNSNNNNSNSNNNNNNNNNNNNNSSNLNNNSNNNNNNNNNNNLLLNNNNNNNLNNNNLNNLNLNNNNNNNNLLNLNLLNLNNLNNNLLLNNNLNLNNLNLNNNLLNLNNNLNLLLLLNLNNNLLLLLLLLNLLLLLNNLLLLLLLNLLLLLNNLLLLLNNLLLLLNLLLL,,LLLLLLLLLLLL.LLLLLLLLLLLLLL,LL,L,L.,LLLL.LL,LLLL,L,LL,L,L.L,LLLL.L,L,,,,LL,LLL,L,,,,,,LL,,,LLLL.,Lch  +3030+0300030003000003003000300300030003000300303030+20*34344343434334334333333333333333333333333333333333333333M33M303*:40303330030+0000000+30+33+0<+30+300(30+0+0+*0++0+++++++++++++*&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&+  l  !! !!!  !!!  !!!!!!B!!!!!!!!;!!!!!!!!!!YY  [9!@; ![;;; ![  _;! _      =sSNSSSNSSNNSSSSNSNSNSSNSSNSSSNNSNSSSSNSNNNNSNNNNNNNNNNNSNNSNNSNNNNNSSNNNNSNSSNNNSSNNNNNNNNNSNNNNNNNNNNNSNNNNNNNSNNNNNNNNSNNNSNNNLNNNNNNNNLNNNNNNNNNNNNNLLNNNNNLNNNNNLNNNNLLLLLLNNNNNLNLNNNLNNNLLLLNNLNLNLNLNLLLNNLNNNNLLNLLNNLNLNLLLLNLLLNLLLLLLLLNLLNLLNLNLLNLLLLLNLLNLLLLLLNLLLLLLLLLL,LLLLLLLLLLL,LLLLL,,,,L,LLLLLL,LLL,LNL,L,,NLLL,L,LLLL,LLL.,LL.L,,,,LL.L,L,,.,L,,,,,.,\b    +003+03000000000000000000000000000000000000000000000000*43434434343O33433333433333333333333333333333333M333M333M3330<3M*0300Q0300303303+30+30003+0003+003+0*0*00*0*0++0+++++++++++++++*&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&+    s?! !!!!! !!!!!!!!! !!!!!!!!!!!!! !Z@!!!!!!!!!!!!Y!!!!!!!!!! !! !Z!!!_;_ ;;@ [!  ! d9!_   =}SSSNSNSSNNNNNSSSSSNSSNNNSNSSSSNSNNNNSNNSNNSSSSNNNNSNNNNNNSNSNSSSNNNNSNNSNNSSNNNNSSNSSNSNNNNNNSSSNNNNLNNNNNNNNNNNNSNNNNSNNNNNNNNNNNNSNSNNNNNNNNNLNNNNNLNNLNNNNNNNNNLNNNNNNNNNLLNLLLLLNNLNNNLNNNLLLNNNLLNNNLNNNLLLLNNLNLLNLLLLNNNNLLLLLLLNNLLLNLNLLNLLNLNLLLLLLLN,N,LLLLLLN,LLLLLLLLNLLLLL,LLLLLLLLLLLLLLLLLLLL,L,,,,,LL,LLLLLLL,,,LNLL,LLLLLLLL,,LLLLL,LL,LL,LLLL,,L,,,,,LL.,L,.Mc *00300++++++++++++++-++-+++-+-++-++++++++++++++++++++0+*3434434343434334334333343333333333333333333333333M333333333M3M3*303033030303003+300+0+300+30+0+300+0000*0(0+0++0++0++++++++++0*+0+&0&00&0++++++0++++0++0+++++0++++++0++&&&&&&+ ?! !! !!  !!! !!!!!!!!!!!!!! !_#  !!! !!!@@!!!YY!!!!!!!!  !_!!! Y!;;@!! @@ _! _   ! =qNSSSSSSSNSSSNSNSNSNNSNSNNSNSNNSNNSNSNNSNNNNNNSNNNSSSSSSSNNNNSNNNSNNNSSSNNNNNSNNSNNNNSNSSNNNSNNNNNNNNNNNNSNNSNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNLNNNLNNNNNNNNNNNLNLNNLLNNLNLNNNNNNNNLLNNNLLNNLLNNNNNLNLNLNNNLNNLLLLNLNNNLNLLLNLLLLLLNLNNLLLNLLNLLNLNLLLLLNLLLNLLNLLLLLLLLLLLLLLLLLLLLNLLLLLNLLLLLL,LLL,LLLLLLL,LLLLL,LLLL,,LL.,LLLLL,L,LLLLL,N.,,,,L.LLL,LL,,L,,,.,,L,LXc  TTT003+03+13343443434343433433334333Q333333333333333333333333333M333M33330*3M030M3030U00303030303003000303003030*00+0*0*0++0+++++++++++++1̛ƙƙƛÆƖȆ+&&&&&&+TTT   ӏ?!!!!!!!! !!!!!!!!! !!!!!!!!!!!!!!!!!!! !!!!_@!!!! !!!!!!!!@_!!!!!!;@ !! !! _ ![!!!!!_;@@! __!    x !_      !  !!qSSSSSSSSSSSSSNSNSSSNSSSSNSSSSNNNNNSNNSSNNSNSNSNNNSSSNNNSSSNSNNNNNNNSNNNSNNSNSSSSNNNNNNSNSSNNNNSNSNNNNNNSNSNNSNSNNSNNNNNNNNNNNNNNNNSSNNLNNNNNNNNNSNNNNNNNNNLNNNNNNNNNLLNLLLNNNNNLNNNNLLLNNNNLLNLNNNNNNNNNNNNNLNLNNLLLNLNNNNLLNNLNLLLLLLNNLLNLNLLLNNLLLLLLNLLNNLLLLNLNNLLLLLLLLLLNNLLNLLLLLLLLL,NLLLLLL.L,L,LLLLLLLLLL.L...LL,L,LLLLLLLLLLL,LLLL,.LL,,LLLLLL,,L.LLL.,.,LLLL,Mc TTTTT"0(30300+*34434343334333333033333P0333\03333333333333333333303330333333M3*303M3030303030030000000000000000000000000000+0+0+0++0++++++++++ęƙęęęě–+&&&&&&+TTT""  ?!! !  ! !!!! !!  !!!!  !! !!!!!!!_Z !!!!!! !!!!!! !!!Z_!!! !!!!!  !!! !!@@ _!!   ;;;_@ d!  !_    =qT::TT:TT:TT"SSSSSSSSSNSNSSSSSSSNSNNNSSSSSSNSNSSNSNNSSSNNNNSSNSNNNNNNNNNSNNNNNSNNNNNSSNNNNSNNNNNNNSSSNNNSNNSNNNNNSNNNNNNNNNLNNNNNNNNNNNNSNNNNNNNNNNNNNNNSNNNNNNNNNNLNLNNNLNNNNLNLLNNNNNNNNLLNNNNLNNLLNLNNNLLLNNLNNNNNNLNLLNNLLNLNLNLLNNNNLNLLLLNNLNLNLLNNLLLLLNLLLNLNLLNLLNNLLLLLLNNNLNLLLLLLLLLLLLLLLLNLLLLLL.LLLLNLLLLLLL,LLLLLLL,L,LLLL,,LLL,LNLLLL,L.,LL,,L,LLL,LLLLL,L,,,,L.L.L\hTTTTTT   """0003+0*133443***11***1*1*11+1+1+1*1+1*11+110*1+10*1+1+1+1+1*1+1*1+1**33*33**1+1+1+1*1*+0**1+1+*+1*10*1++1+1+1+1+1+1*0**+******+1*+++++*͙͙ÙƙęƙÙƖƖ&&&&&&+""TM"T  ?!!!!!!!! !!!!!!!!!!!! !! !!!!!! !!!!!Z!! !!!!!!!!!!!!!!![!! Y!!!!!!!!!!!!! !!Y! [!!!! ! ;;!@ ! !! !!!     x !!   !! !=}TTTTTTTTTT:TSSSSSSNSSSSSSSSSNSSSSNSNSNSSNNNSSSSNNNSSSNSNSNSNSSNNNSNNNNSSNNNNNSNNNNSNSNNNNNSNNSSNNNNSNSSSNSNSNNNSNNNNNNNNNNNNNSSNNNLNSNNNNNNNNNNNNNSLNSNLNNNLNNNNNNNNNNNNLNNLNNNNNNNNNNNNNLNLNNLLLLNNLLLNSNNSLNLNLNNLLLNLNNLNNNLNLNNLNNNLNLNNLNLNNLLLNLLLLLLLLNNNNLLLNLNLLNLLLLLLNNNLNNLLLLLLLLLNLLLLLLLLLLLLLLLLLLNLLLNLLLLLLLLL,LLL,.LLLNLLLLLLLLLL,,L,LL,L.L,LLLL,LLLLLLL.L,LMcT"TTT TT":"0*30300+*34434**33*03**++++++ęǖƖ™ŖƖę+&&&&&&+TTT  }?   ! !! !!!!!!!!!!!!!!! !!!!!!! !B_!! ! !!!! !!!!!!ZY!!!!!$ !  ! !Y[ _#!Y;@ Y !  !   _!!! =sTTTTTNSSSSSSSSSSSSSSSNSSNSSSSSSNSNSSNSSNNNSNSNSSSSSSSSNNSNNNNNNNNNSSSNNSNSNNNNNNNSSNNNSNNNSNNNNNSNSNNNNSNNNNNNNNNNNNSNNSNNSNNNNNSNNSNNNSNNSNNNNNNNNNNSNLNNLNNNNNNNNNNNSNNSNNNNNSNNNNNLNNNNLNNNLNNNNNNNLNNLNLNLLNNNNLNLLNNNLLNNNNNNLNLLNNLLLLLLLLLNLNLNLLLNLLLLLNNLNNNLLNLLNLLLNLLLLLLLLLLLLLL.L.LLLLNLNNLLLLLLLNLLLLLLLLLLLL.LLLLLNLLLLLLL,LLL,LLLLL.L,LLL,LL,LLLLL.LLMcT"TTTTTT"TTTT:000+03+*44344**3M*3M*ݭݭݭݭݭݭݭݭԨ10++++*r+&&&&&&+::"T  s? !!! !!!!!!!! !! !! !!!!!!!!!!!! !!!!!!!!!!9;!! !!!!!!!! !!! !!!!!@@!! !!! !!Y@  !! !!!Z!![9! !!!!! !; ;  ;@! ;Y _!!!! _          =q"TTT"TT"TTTTTTTSSSSSSSSNSNSSSSSSSSNSNNSNSNNNSNNNNNSSSNNSSSSSSSSSSSNNSSNSNSNSSNSSNNNNSNNSNNSNNNNNSSSNSNSNSSSNSSNNNNSNNNSNNNNNNNNSNNSNNNNNNNSNNNNNNNNNNNNNNNNNNLNNNNNNNSNNNNNSLSNNNNNNNNNNNNNNLNNLNNNNNNNNNNNNLNLLNNNNLNLLNNLLLLNNNLNLNNNNNLNNLNNLLNNLNNNLLLLLLLNNLNNLNLLNLLNLLLLLLLLNNLLLLLLLLLLLNLLLNLLLNLLNLNLLLLNLLLLNLLLLLLLLLLLLLLLLNLLL,L,LNLLLLLL,LLL,,LLLLLLLLLLLbcT:TT""TT0T "T:TT"00+3000+*43434**33*03*ݰݰݰݰݰݰݰݰݰݰݰ*+++++1+&&&&&&+TTT:T: s?   !!!! !!!!! !!!! ! !!!!!!!!!  !!!!!@!!!!!!!!!  !! !!!!!!! !!@!!!!!@! !!!! !!!Z!!_;!! !!B;;x_ x! _!  qT"MTTT"MTT"MTT"T"TTTSSSSSSNNSSSSSSSNNNSSSNSNSSSSNSSSNNSSNNSSSSSSNNNSNNSSSNSNNSNNNNNSSSSNNSNSSSNSSNNNSNSSNNNNSNSNSSNNSNSSNNNSSNNNNNNNNNNSNNNNNSNSNNNNNNNNNNNSNSNNNNNNNNNNNLNNNNNLNNNNNNNNNNNNNNNLNNNNNNNNNNLNNLLNNNNNNNNNNLNNNNNNNNNNNLLNNLLLNLNLNNLLNLNNLNLNNLLNLLNLLNLNLLLLNLLNLLLN,LNLLNLLNLNLLLNLLNLNLLLLLLLLLLLLLLNLLLLLLNLLLLLLLLLLLLLLL,LLLLLLLLLLLLLLMd""""TTTTT:TT: TTT+0303+++44443**33*33*ݭݭݭݭݭݭݰ1++0++*r&&&&&&&+TTs?!! !! !!!!!! !!!!!!!!!!! !!!!!! !!!!!!!!!!! !! !!!!! !!!!!!!!!!_@! !@_!!! ! !!!!!!!!#  !![!!!! !!!Y!;@ !@ ZB  !d!! x      ! !p"""SSSSSSSSSSSNNSSSSSNSSSSSNSNSSSSNNSSSSSNNSSSSNSSNNSSNNSSNSNSNSSNSNSNSNNSNNSNSNSNNNNNNSNSNNSSNSSNNSSNNNSNNNNSNNNNNNSNNNNNSNNSNNSSNNNNNSNNSNLNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNLNNNNLNNNNNLNNNLNNNNNNNLNNLNNNLNNNNNLNLNLNNNLNNNNLNNLNNNNLNNLLNLNNLNLLNNLNLLNNNLLNLNNNLNLNLLLNLLLLLLLLLLLLLLLLLLLNLLNLLNLLLLNLLLLLLLL.LLLLLLNLLLLLLLLLLL\g:TTTTT"TT0T:T"T"TTTTTTT(30000+*44434**33*331׭ǭ*0++++*ǭǙǙ+&&&&&&+TTTTTTTl !!!!!!!!!!!!!!!!!!! !! !!!!!!!!!!!! !!!!!!!Y!!! !  ! !!! !!!! !!!!! !! !!!!!!!!@  !!!!! !!!Z!!!_#!!Y!!!;;[_ !!_!  _    pTT"T:T:TTT"T:TTT"T:TTT"TT0T"T"MT"TSSSSSSSSSSSSSSSSSSSSSSSNSNSNSNSSSSNSNSSSSSNNSNSNNSNNNNNNNSNSSNNSSSNSSNSNNNSNSNNNSSNNSNNSNNNSSNNSNNNSNNNNNSNNNNSNNNNSNSSNNNNNSSNNNNNNNNNLNNNNNNNNNNNNNNNNNNNNNNNNNNNNSNNNNNLNNLNLNNLNNNNNLNNNNLNLNLNLNLNNNLNNNLLNLNNNLNLNNNNNNLNLNLNLLNLLLNLLLNLNNLNLNNLLLLNNNNLNLLNLNNLLLLLLLNLNLLLLLNLLLLLLLLLLLLLLNLNLLLLLNLLLLLLLLLLLLLLLLLLLLLMhT0"TT:TTTTTTTT TTTTTTT+003+3+*43443**3M*33*ݭݭݭݰݭݰݭ׭ݰǭ*+0*++*ǭǦǙrrr+&&&&&&+TTTTTT  C!!!!!!!!!!!!!!!!! ! !!!!!!!!!!!!!! !!!! !!!!!!!!! !!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!]!!!!!!!!!!! !!!@_ !!!![!!!!! !!!!Yϖ!! ;@ @;   x! ! _    !!qSSSSSSSSSSSNNSSSSSSSNNNSNSSSSSNSSNSNSSNSSNSSNSNSSNSNSSNSNNSSSSNNNSSSNSSNNNSNSNSNNNSNNNNSSNSNNNNNNNNNNNNNNNNNNNSNNNSSNNNNNNSSNNNNNNSNNNNNNNNNSSSNSSNSNNNNNNNNNNNNNNSNSNNNSNLNLNNNNNNLNNNNNNNNNNNNLLNNNNLNLNNLLNLLNNNLLNNNLNLNNNNLLLLNLLNLLLNLLLNLNNNNNLLLLNNNLNNLNNNLLLLLNLLLNNNLNNLNLNLNLNLLLLNLLNNNNLNLNN,LLLLLNLLLLLLLLNLLLLLL.MLchTTTTTTTTTTTTTTTTTTTTTTTTTT"++0000+*444431*33*M3*ݰ׭ݰݰݰݰ׭צ*0++0+*ǦǙ+&&&&&&+TTTTTTTTTT鬎?!!  !! !!! !!!!!!!!!!!! !!!!!!!!!!!!! !!!!!;!!! ! !!!!!! !!!!  !!!! !  !!!!!!!!!Y@!! !!!! !!! ! !!!Z !!_$!!;;@@! _! !   =sSSSSSSSSSSSSSSSNSSSSSSSSSSNSSSNSNSSSSNSSNSNSSNSSSNNSNSNSSSSSSSNSNNNSSNNNNSNNNNNSNNNNSNSSSSNNSNNNNNNNNNSSNNNNNNNSSNNNNNNNSSNNNNNNNNNNNNNNNSNNNSNSNNSNSNSNNNNNNNNNSNSNNNNNNNNNNNSNNNNNSNNNNNNNNNNNNNNNNNNNNLNNNNNNLNNLNNNNLLNNNLNLNLLLNNLNNLLNLNNNLLLLLLNLNNLLLLLLNLLLLLLNNLLNNLNNNNNNLLNNLLLLLNLLNNNLLNLLLLLN,NLLLLNNNLLLLLLLNLLL\gTTTTTTTTTTTTTTTTTTTTTTTTTT""TTTTTTTTTTT+0330++*44434**33*33*׭׭׭Ǩ0++0*+*ǰǙǙǙǙǙ+&&&&&&+TTTTTTTTTTTTӏ?!!!!!!  !!!! ! !! !!!!   !!! !!!! !! !!!!!!!!!!B@!! !!!!!!!!!!!!!!! ! ! !!!!   ! !!!!!_!!!!!!!!!!!!!;![;!!! !!!!!! !! ;@!9  !!_  ! !    ! =qTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTSSSSSSSSSSSSSSNSSSSSSSSSSSSNSSNSSSSSSNSSNSNSNNSSSSSNSNSSNSSSNNSSNNNSSNNNNNNNNSNSNSSSNNNNNNSNNSNNSNSNNNNNNSNNSNNNNNNNNNSNNNNNSNNNNSNSNNNNNNNNNNNSNSNNNNSNNNNNNNNSNNNNNSNNNNNNNNNNNNNNNNNNLNLLNLLLNNNLLLLLLNNLNNNNNLLNNLNNNNNLLNNLNLNNLNNLLNNNNLLNLLNLLNNLLLLNNNLLNNNNLLNNLLNLLLLNLNNLNLNLLLNLNLLNNNNLLLNLLNLLNLLLLLLLLMchTTTTTTTTTTTTTTTTTTTTTTT:TTTTTTTTTT:+0+300+*444441*33*33*לǭǞ*+0+0+*ǙǙǙǙǙ+&&&&&&&TTTTTTTTTT? !!!  ! !   ! ! !!!!  !!!!!!!!!!!!!! !!!!!!! !!!!!!!!_!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!! !!!!!!@!!!!!!!!!!!!! ! !Y_;! !! xd;@!_ !_!! _ =sTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTSSSSSSSSSSSSSNNNNNSNSNSNSSSNNSSNSNSSNNSNSNNSSNSNNNSSSSNNNNNNNSNSNSNNSSSSSNSNNNSNSNNNNNSSSSNNSNNNNNNSNNSNSSNNNSNSNNSNNNNNNNSNNNNNNNNNNNNSNNLNNNNNSNNNNNNNNSNNLNNNNNNNNNNNNNNNNNNNNLNNNLLNNLNNNLNNNNNNNNNLNNNLNNNNNLNNLNNNNLNLLLNLNNNNNNLNNNLNNNNNLNNLNNLLNLLNNLNNLLNNLLNNLLLLNLLNNNNLLLLNLLNLLNLLLLLchTT"TTTTTTTTTTTTTTTTTTT""""""""TTTTTTTTTTTTTTT:TT:TT:TT"TT+00303+*44444**03*33*ǭלǭǭǭǞ+0+0*0*ǦǙǙǙǙǙ+&&&&&&+T:T"TT"TT"TTTTTTTTTs?!! ! !!!!!! !!!!!! !!!!! !!!!!!!!!!!!!!!!!!!! !! Z!! !!!!!!!!!!!! !!!!!!!!!!!!!!!!!! !!!!@ !!!!!!!!!!!!!!!!!! !!!Yx!!! !_9 !!!!_! ;;!_!  !   _!!         =}TTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTSSSSNSSSSNSSSSSSSSSNSSNNNSNNSNSSSSNSNNNSNSNSSSNSSSNSNSNNSNNSNSNSSNSSNSNNSSNNNNSNNSSSNNNNNNNSSSNSNNNSSNSNNSSNNSNNSNNNNNNNNNNSNSNNNSNNNNNNNNNNSNNNSNSNNNNNNNNNNLNNNNNNNNSNNNNNNNNNNNLNNNNNNLNNNNNNNLNNNNNNNLNNLNNNNSNNLLLN,NLNNNNLNLLNNLNLLNNLNNLLNLLNLNLNLLLLNLNLLNNLNLLLLLLNNLLLNNLNLNLLLLNNLLLLMcT:T"TTTTTTTTTTTTTTTTTTTTTTTTTTTTTT""0"""""TTT"TTT TT"TTTTTTTTTTTTTTT"*00+00+*4444P1133*33+ל؜ללמ**0+0+*ǰǙǙ+&&&&&&+TTTTTTTTTTTTT"TTT"Ts>!!!!!!! !! !!!!!!!!!!!!!! !!!!!!!!!!! !!!!!!!!!!!!!! !!!!!! !!!!!!! !!!!!!!!!!! !! !!!!! !!9x! !!!! !!!!!!!!!!!!!!!!@!!  _!!!!;@Y   _; _! !  !=qTTTT"TTT"TTTT":T"T"T:T"T:T:T"TTTTT"TT"TTTTTT:TT"TT"T:T"TT":T"T:TSSNNSSNNSSSSSNSNNSSSNNSNSNSSSSSNSNNSSSSNNNSSNNNNSSNSNNNNSSNSNNNSSNNNSSSSSSNNSNSSSSNNSNSSSNNNNSNNSSSSNNSNNSSSNSNNSNSNSNNNNSSNNSNNNNNSNNNNNNNNNNNSNSNNNNNLNNSNNNNNNNNNNNNNLNNNNNNNSNNLNNNNLNNNLNNLNNNNNNNNNNNLNNNNNLNLNNNSNLLNLNLNNNNNLLNNLNNNNNNLNNNLNNLNLNNLNNLLNLLNNLNLNLLLLLNLNNLLLLLLLNNLNLLNLLLNLLLM\hTTTTTTTTT"TT:"TT"T"TT"T"TT"T"TT"T"T"T"T""T"T"T"T""TT""""""""""""":::"0"T::"T:T:T:T"TTXXXXXXXXXXXXXXXXXXX+03030*1P4444*133*331ǭǞǙ*0+0*0*ǦǙ+&&&&&&+XXXXXXXXXXXXXXXXXXX"T""T"T:T:T:"T"s>! !!!!!!!!!!! !!!!!!!!!!!  !!!!!!!! !!!!!!! !!!!!!!!!!ZZ!!!! ! !!!!!!!!!!!!!!!!!!!!! !!!  !! ! !!!!!!!ZZ!!!! !!!! !!!!!!!# _!!!!!!!! !!!!!!!;B!;;Y! ! ! !  !_ !      !qTTT"T:T"TTT"TTTTTTTTTTTTTTTTTT:"TTTTTT:TT"TTTTTTT:TTTTTTTTTTTTTTSSSSSSSSSSSSNSSSSSNSSSSNNSSSSNNSSNSNNSSNSSNNSSSSSNSNNSSNNNSSNSNSSSSSNSNNSSSNNNSSNNNNNNNSNNSNNSNNSNNSSSNSNSNSNNNNNNNNNNNNNNNSNNNNSNNNNSNNNNNNNNNSNNNNNNNNNSNNNNLNNNNSNNNNNNNNLNLNLNLNNNNNNNNNNNNNLNLLNNNNNLNNNNNLNLNNLNNNLNNNLNNLNNLNNNNNNNNNNLLNNLNNLNLLNNLNLLLNNNNNLNNNNLNNNLLNNLNNLLLNLNNLLL,LNbgXXXXXXTXXXTXXXXXVXVXXXXXXXXXXVXXVXXXVXVXWXXXXXXXXXVXXXXXXXXXXXXXXXXXXVXXXVXTXXXTXXXXXTXTXTXTXTXTXTXTXTXTXTXTXTXTTUTUTTTTTUTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTVTTTXTTVTTTXTVTTTTTTTTTTXXXXXXXXXXXXXXXXXXXX+*0000+1444431*33*331ǞǞלǞǞǞǞǙ*+0(0++ǦǙǙǙ+&&&&&&+XXXXXXXXXXXXXXXXXXXTTTTTTTTTTTTTTTTTTTTTXUTTVTXTTTXTVTTTVTTTXTTVTTTTVTTVTTTTVTTTTTTTTTTTTTTTTTUTT}?!!!!! !! !! !! !!!!!!!! !!!!!!!! !!!! ! !!!!!!!!!!!!!!!! !!!! !!!!!!!!!!!!!!!!!!!!!!! ! !!!!!  !!!!!!!_Y!!!!!!!!!!!!!!!!!!!!!!_!! !!!!! !!_!;@ @!9 !_!qXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXSSSSSSSSSSSSNSSSSSSSSSSSSSSSSSSSSNSNNNNSSNSSNNNSNSNSNNNSSNSNNSSNNSNNSNNSNNNNSSNSNSSNSNSNNNSNNNNSSSNNNSSSSNNNNNNNNNNNSNNNNNNNNSNSNNSNNNSNSSNNNNSNNNNNNNNNNNNNLNNNNNNSNNNNNNNNNNNNNLNNNNNNNNNNNNNNNNNNNNNNLNNLLNNNNLNNLNNNNNNLNLNNNLNNNNNNNLLLLLLLLLLNLLLNLLLLNNLLLNLLLNNNNLLNNNLNLLNLNLNNLNLLLLMcX\^X^X^X^X^X^X^X^bbX^X^X^XXbX^Xb^XXbX^bbYXXbVXV^VbXbXX^XXX^XXX^XXV^VXXX^XXX^VXVbXXVXVXVYXXVXXXXVXVXVXXXXXXXXXXXXXXXXVXXXXXXXXXXXXXXXXXXXXXXXXXTXXTXTXTXTXTXTXTXTTXTTTXTTXTTTTTTTTTTTTTTTTTKKKKKKKKKKKKKKK+003+<+134444**03*33*מǜǞǙ*0*0*0*ҦǙ+&&&&&&+KKKKKKKKKKKKKKTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTXTTTTTXTTTXTTTXTTXTXTTXTTXTXTTXTXTXTXTXTXTXTXXTXT?!!  !!!!!!!! !!!  !!!!!!!!!! !!!! !!!!!!!!!!!!! !!!!!!!!@@!!!!!!!!!!! !!!!!!!!!!!!!!!!!! !!!  !!!@!!!!!!!!!!!!!!!!!!!_!!![; !!!  !!! B#!!@; !!; !!! !x  ! pX^X^X^X^X^X^X^X^X^X^X^XXXXX^X^X^XXX^XX^X^X^X^XXXX^XXX^X^XXX^X^XXSSSSSSSSSSSSSSSSSNSSSSSSSSSSSSNSSNSSSSSNSSNSNSSSNNSSSSSSSSNSSSNSNNNNNSSNNNSNNSNNSSNNSNSSNNNNSNNNNSSNNNNNSNNNNNNNNNNNSNNNNNNNNSNSNNNNNNNSNNSNNSNSNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNSNSNNNNNNNNLNLLNNNNNNNNNNNLNNNNNLNNNLNNNLNNNNNNNNNLNNNNNLNLNLNNNNNNLLNNLNNNLLNNNNNLLLLNNLNLNNLNNNLLLNLNL\hKJKKKJJJJJJKJKJJKKKWKKJKJKKWKKKJKKWKJJJJJJWJJJWJJKWKJKJKKJJJJJJJJKJKJWKJKJKJKJKJKJKJKJKJJKJJKJJKJJJJJKJJHKJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJHJJJHJJHJJHJHJHHGJGHGGGFGFFFFFFEKKKKKKKKKKKKKKKKKKK+30000+*444441133*33+מǞמǞǞǞ*000+01ǜ&&&&&&&+KKKKKKKKKKKKKKKKKKDFFFFGFFFFGGGGGGGGHGHHGHGHGJGJHHJHJHJJHJJHJJJJJHJJJHJJJHJJJHJJJHJJJJJJJJJJJJJJJJJJJJJJJJJJ? !   !!!!!!!!!!!!!!!!  !!!!!!!!! !!!!! !!!!!!!!!!! !!!!!!!!!!!!!$!!!!!! !!!!!!!!! !!!!!!! !!!!! !!!!!!!!!!!!!!@!!!!!!!!!  !!!!!!!!!!!!!!Y !!_@!  !!  9__!;Y;!  ! ! 9qJKKJKKKKKKKKKKKKJKKKKJJKKKKKKJJKKKKKKKKKKKKKKKKKKKKKKSSSSSSSSSSSSSSSSSNSSSSSNSNNNSNSSNSSNSSNSSSNSSSNNNNNSSNSNSNSNNSNNNNSNSNNNSNNSSSNSSSSSNNNNNSNSNSSNNNSSNNNNNNNNNNNSNNSNSSNNNSNNNNNNNNNNNNNSNNNNNNSSNNNNNNNNNNNSNNNNNLNNNNLNNNNLLNNNNSNLNNNLNNNSNNNLNNLNNNNNNNNNNNNNNLLNNNLNNNSNLNNLNNNNLNNNNLNLNNLNNNNNNNLLNNLNLL,L,LMcKKKJJKJKKJJKKJJJJJKKJJKKKKKKJJJKKJJKJKKJKKKJJKJKJJKJWKJJKJKHJKJKJJKHKJJJJJKJJJJJWJJJKJJKJJJJJWKJKWJJJJKJJKJKJJJJJJKJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJHJJHJHJHJGHGHGGGGFFGFFFFFKKKKKKKKKKKKKKKKKKK+033+0*13444Q**33*33*ǜ*0*03(*rpM&&&&&&+KKKKKKKKKKKKKKKKKKEFFFFFFFGFGFGGGHGGHGJGHGJHHJGJHJHJHJJHJJJHJJHJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJ}?!! ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!;!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!   !!!!@!!!!!!  !!!!!!!!!!!!!!!!!!Z=!!!!_@ ! !!!!!Y!!@@! _        _ !      !=qKJJKKKKKJJJJKKKJJKJKKKKKKJKKKKKKKKKKKKKKKKKKKKKKKSSSSSSSSSSSSSSNSSSSNSSSSSSSNSSNSNSSNNSSSSSSNNSNSNSNSNSNSNNNSNNNNSSSNSNNNNNSNSSNNSSNNNNNSSSNSNNSSSNNSNNNSNNSNNNNNNNSSNNNSSNNNNNNNNSNNNNNNNNNSNNNNNNNNNNSSNNNNNNNNNNNLNLNNNNSNNLNNNNNNNNNNNLLNLNNLNNNLNSNNNNLNLLNNNNNNNNNNNNNNLNNLLNLLNLLLNNNNNLNNNNNNNNNNLLNLLNLcKKJJJJJKKKKKJJKJKJJJJKKWKKJJKJJJKJJJKJJKKJKJKKKKJJKJKKJKJKKJKJJKJJKJKJKJKJKJWKJKJKJJKJKJKJKJKJJJJKJJKJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJHJHJHJHGHGGGFGFFFFFEKKKKKKKKKKKKKKKKK+00400+*444421*33*301ݰݰݰݰݰݰݰݰݰݰ*000+0*+&&&&&&+KKKKKKKKKKKKKKKEFFFFFGFFFGFGGGGGGHGJGHGJGJHHJHJHJHJJHJJHJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJs?! !!!! !! !!!  !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!! !Z!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!! !!!! !!!@!!!!!!!!!!!!!!!!!!!!! !!!!!Z!!!!!!_B!!!!!!!!!!  !@!;;_! x! _   7pӷKJKJKKKKKJJKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKSSSSSSSSSSSSNSSSNSSSNSNSNSNSNNNSSSSNSNSNNSSNNSNNNSSSNNNNSNNNNNNSNNNSNNNNNNSSSNSNSSSSNSNNNSSNNNNSNNSNNSNSSNSSNSSNNSSSNNNSSNNNNSSNNNNNSNSNNNNSNNNNNSNNNNNNNNNNNNNNNNNNSNNSNNNNNNNSSNNNLLNNNNLNNNNLNNNNLNNLNNNNNNNNNNLNNNLNNNLLNLNNNNLNNNLNNNNNNNNNNNNNLNNNLNLMKKKKKKKKKKKJKWKKKKKJJKKKJKJJKJJJJKJJHKKJKJJHJJJKJJHJHJJJJJKWKJJJJJJWJKJKJJJJJKJJKJJJKJJJKJJKJJJJJJJJJJJJJJJKJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJHJHJJHJHHHHGJGGGGGGFFFGFFFFKKKKKKKKKKKKKKKKKKK+03000*1P44Q*103*331ݰ*03+0**ڭ԰+&&&&&&+KKKKKKKKKKKKKKKKKKEEFFFFFFGFGFGGGGGGHGHGJGHGJGHGJHJHJHJHJJJJHJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJs? !!!  !!!!!! !!! !!!! !! !!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!Z! !!!!!!!!!!!!!!!!$!!!!!! !!!!!!!!!!!! ! !! !!!@!! ! !!!!!!!!!!!!!  !! !Z! _Z!!!!_@@!!Z ! _! !!  sKKJJKKKKKJJKKJJJJJJJJKKKKKKKKKKKKKKKKKKKKKKKKKSSSSSSSSSSSSSSNNSSSSNSSSSSNSNSNSSSNSSSSSSSSSNNNSSSSSSNSNSNSSNNNSSNSNNNNSNSSNNSNSSNNSNNNNNNSNNNNNSNSNNNNNSNNSNNNNSNNNSNNNNNSNSNNNNNSNNSNSNNSNNNNNNNNNNNNNNNNNNSNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNSNLNNNNNNNNNNLLNNNNNLNNNNNNNLNNNNSLLNNNNN,NNLLNNKWKJKKWKKKJKKKKKKJKJKKWKJJJKKKKJKKJJJKKKKKKJJKKJJJJKKJKKJKKJKJJKHJJJKJJJJWJKJKJJJJJKJKJJKJJJJJKJKJKJKJKJKJJJJJJJJJJJKJKJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJHJHJHJHHGHGGGGFGFFFFFDKKKKKKKKKKKKKKKKKKK+3*030+1444431133*331*000+0*حذ+&&&&&&+KKKKKKKKKKKKKKKKKKFFFFFFFFFFGFGGGGHGHGHGJGHJGJHHJHJHJHJJJHJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJs>!!!! !!!!!!!!!!!!!!!! ! !!!! !!!!!!!!!!!!!!!!!!!!!!!!!!$ !!!!! !!!!!!@!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!  !!!!!!!!! !!!! !!!!!!@! !!!!!!!!!!!!!! !!!!!!_!!!__!!!!! !!! @!@;!_ _;   _ !qKKKJJJJJJKJKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKchhSSSSSSSSSSSSSSSSSSSSSSSSSSSSNSNSSNSSNSSSNSNSNNNSNNNSNSNNSSNSSNSNNSNNSSNSNNNNNSNSSNNNNNNSNSNNNNSNNSNNSNNNSNNSNSNNNSNNSNSSNNSNNSNNNNNSNSNNSNNNSSNNNNNSNNNNNNNNNSNNNLNNNSNLNNNNNNLNNNNNNNNNNNNNNNNNNNNNLLNNNNNNLNLNLLNNLNNLNNLNLNNNNNNLNNNLNKKKKJKKJKWKJJKKWKKJJKKKJJKJKKWKKKKKKJJJKWKKKKJJJKKJJKKJJKJJJKKJKJKKJKKJJKJJKJWJKJKJJJKJKJJJKJKJKJJKJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJHJHJHJHGJGGGGFGFFFFFFKKKKKKKKKKKKKKKK+03003+1344441133*33*ݰݰ*03+0+*԰׭حרҭǭǭǦ+&&&&&&+KKKKKKKKKKKKKKDFFFFFFFGFGGGGGGHGHGJGHGJHHHJHJHJHJHJJJJHJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJs?! !!!  !!! !!! !!!!!!!!!!!!!!!!!!!! !! ! !!!! !!!!!!!!!!!!!!! !!!@x!!!!!!!!!!!!!! !!!!!!!!!!!!!! !!!!!!!! ! !!!!!  !!!! !!!!!!x@!!!!!!!!!!!!!!! !!!!!  !  !!_x!!!!!!! !!! _Y! ;@Y  d!! _!   !qKKKKKKJKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKcccccSSSSSSSSSSSSSSSSSSSSSSNSNSSSNSSSSSSNSSSSNSSSNNSSSNSNSSSSSSSSNNSSSSSSNNSNSNSNSNSSNNSNSSNNNSSNSSNSSNNNNNNNNSNNSNSNNNNSNNNNNSNSNNNNNSNSNNNNNSNNSNNNNNSNSNNNNNNNNNNNNNNNNNNNNNNNNNNSNSNSNNNNNNSSNNNNNNNNNNNNNNNNNLNNNNSLLNNNLNNNNNLNLNNNLJKKJJKJKKJJKKKJKKJJJKJJJKKKKJJKKJKKKKKWKJJKJJKKKKKJKJKHKHJHJJJJKJKJKJJJJJKJWKJJKJKJKJJKJJJJJJJJKJJJJJJJJJJKJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJHJJJHJJJJJHJJHJHJGJGHGGGGFGFGFFFFFKKKKKKKKKKKKKKKKKKK+04030+14431*33*301ѭ*00300*ذѭͦ+&&&&&&+KKKKKKKKKKKKKKKKKKFFFFFFGFGFFGFGGGGGGHGGHGHGHGJGHHJHJHJHJJHJJHJJJHJJJHJJJHJJJHJJJHJJJHJJJJJJJJJJJJJJJJJJJJJJJJ}?!!!!! ! !!!!!!!!  !!!!!!!! !!! !!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!xY!!!!!!!!!!!!!!!!!!!!!!!!!!  !!!!!!!!!!!!!!!!!!!!!!!!!!!_Z !!!!!! !!!!!!!!!!!!!!!  !_!! !!!!x!!!;@Y#!  _!! ____xd_______________________ qKKJKKJKJKKJJKKKKKKKKJJKKKKKKKKKKKKKKKKKKKKKKKKKKKKKhcccchSSNSSSSSSSNSSSSSSSSSSSSSSSSSNSSSSSNSSNNSNNSSSNSSSNNNSSSNSSNSSNSNSNNNSNNNNNSNNSNSNNSNSSNSNNNSNNNNNNSSSNNSSSNNSNNNSSNNNNNNSNNNNNNSNSNNNNNNNNNNNNLNNSNNNNNNNNLNNSNNNSNNNSNSNNNNNNNNNNNNNNNNNNLNSNNNNNNNLNNNNLNNNNNNNNNLNKJKKJJJKKKJKKKKKKWKKJJKJKKJKKJJKKWKJJJJKKKKKKKKKKKJJJWKKKWKKJKJJJKJJKWJJJJJJKJKJKWJJJJKWJKJKJJJKWJJJKWKJKWJJJJKJKJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJHJJJJJJJJJJHJJHJHJHJHHJGHGGHGGFFFFFFDKKKKKKKKKKKKKKKKKKK+20003+134444*103*331ݰ*00*03*ڰѰͧ+&&&&&&+KKKKKKKKKKKKKKKKKKFFFFFFFFFGFGGGGGGHGHHGJGHHJGHJGJHJJHJHJJJJJHJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJ}?!!!! !!!! !!!! !!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!! !!!!!!!!@!!!! !!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!  !!!!!!! !!!!!!@x!! !!!!!!!!!!!!!!!!!!!!@!!! !!_;!!! !! !!!!Y! !@Y@   _!  !     !=qKKKKJKJKKJKKKKKKKKKKKKKKKKKKKKKKKKKKKJKKKKKKccccccSSSSSSSSSSNSNSSSNSSNNSSSSSSNSNSNSNNSNNSNSSSSNSSNNSNSNNNNSNNNNNSSNNSSNSNNNNSSNNSSSNNNSSSSNNSNNSNSSNNSNSNSNNNNSSNNNNNNNNNSNNSNNNNNNSNSNSSNSNNNNNSNNNNNNSNNNSNSNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNSNNNNNNNJJKKJJKJJKJJKJKKKJKKKJJKKKKKKKJKKKJKKKKJKKWKJKKKKJKJJJKKJJJKJKKKJJJJJJJJJJJJKJKJKJKJJJKJKJKJJJJKJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJHJHJGJGHGGGFGFFFFFFFKKKKKKKKKKKKKKKK+03*30+*444P1133*331ݰ*30000*ަͦ+&&&&&&+KKKKKKKKKKKKKKKFFFFFFFFFFGFGGGGHGHGHGJGJHJHHJHJHJHJHJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJs? !!!!!! !! !! ! !!  !!! !!!!!!!!! !! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!@!!!!!! !!! !!!!!!!!!!$!!!!!!Z!!!__!!!!!!!!!!!!Z!!!! !!!;@ Y_!    9qKKKJKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK\ccccccĻSSSSSSSSSSSSSSSNSNNSSSNNSNSNSSSSSSSNNNNSNSNNSNSNSSNNNNSNNSSSNNNSNSNNSNNNSSSNNNNSSNSNNSNNNNNSNNNNNSSSNNSSNNSSSSSSNSSSNNNNNNSSSSNSNNNNNNNSNNNSNNNNNNNNNNLNNLNNNNNNNNNNNSNNNNNNNLNNNSNNNNNNNNNNNKKKKKJKKKKJJJJJKKJJKWKKKWKKKKJKKKKWKKKWKJWKKJKJKJKJKJJJJKJJJJJJJJJJJJJJJJJKJJJKJJKJJJJJKJJJJJJJJJJKJKJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJHJJHJHJHJGHGHGGGGGFFGFFFDKKKKKKKKKKKKKKKKKKK+20300*1P4441133*33**0+03+*ݭѨͦ+&&&&&&+KKKKKKKKKKKKKKKKKKDFFFFFFGFFGFGGGGGGGHGHGHGJGJGHHJGJHJJHJHJHJJHJJJJJJJJJJJHJJJHJJJHJJJHJJJJJJJJJJJJJJJJJJJJJJ?!!!!!!!!!!!!! !!!!!! !!!!!!!!!!!!! !!!!!!!!!!!!!  !!!!!!!! !$!!!!!]!!!!!!!!= !!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!@!!!  !!!!!!! !!!!!!!!!!!!_Z! !!!!!_!!!!!!@!!;@_! !!  !  !! !  ! !qKKKKJJJKKJKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKQi5cccccccSSSSSSSSSSSNSSSSNSSSSSSSSSSSNSNSSSSSSSSSSNNSNNNNNSNNSSNSSSSSNNNSSSNSSSSNNSNNSNSSNNNNSSNSNSNSSNNNNNNNNSNNNNSNNNNNNNSSSSSNNSNNNNNSSNNNNNSNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNLNNNNNNNNNNNNSNNNNNNSNNKKKJKKWKJKJKKKKJKJKKKKKKKJKJKJKKJKKWKJKKKJKKJKKKJKJJJJKJJKKKKKJJKKKJKKJKJJKKJKJJJJKJJJJJJJJJJWJKJKJKJJKJKJJJJKJJJJJJKJJJJJKJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJHJHJHJHJGJGHGGGFGFFFFFEKKKKKKKKKKKKKKKKKKK+03020+144431*33*301ݰ*30000*԰Ѱͦ+&&&&&&+KKKKKKKKKKKKKKKKKKFFFFGFFFGFFGGGGGGGHGJGHGHGJHHJHJHJHJHJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJ?   !!!!!!!!!!!!!!!!!!!!!!!!! !!!! !!!!!!!!!! !!! !!!!!!!!!!!!!! ! !!!!!!!!!!!!!!@Y!!!!!!!!!!!!!!!!!!!!!!$!!!!!!! !!!!!!!!!!!! !!!!!$!!! !!!]!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!_B!!!!!!!Y!!9@ !;  ! !     pKKKJKKJKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKcccccSSSSSSSSNSSSSSSSNSNSSSSSSNNSSNNSSNSNSSNNNSSSNSNNSNNNSSNSSSSSSSNNNNSSSSNNNSNNNSSSNSSSNNSNNNSSSSSSSNSNSSSNSNNSNSNSNNSNNSNNSSSNNSSNNNSNNNNNNNNSSNNNSSNNNNNNNNNNNSLNSNSNSSNNNNKKKKJKKJJJKJKJJJKKKJJJKKJKKJJJJJKKJKJKKKJJKWKKKKKJJJJJKJJJJKKJJKJJJJWKJKJKJKJKJJKJKJKJKJJKJKJKJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJHJHJHJGHGGGGGFGFGFFFFKKKKKKKKKKKKKKKKK+20304+14444**33*331ݰ*00+3+*ϭްͦ+&&&&&&+KKKKKKKKKKKKKKKFFFFFFFGFGGGGGGHGHGJGHGJHHHJHHJHJHJJJHJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJ?!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!Z@!!$$!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!$!!!!!!!!!!!! !!!!!!!!!!!!!x!!!!!!!!!!!!! !!!!!!!!!!!!Y !!! !!_!!! !! !!B!!! !!!!@@!!Z!!!  _!      ! !9qKJKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKi6866QQ !!!!  ! !! !!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!z!!!!$!!!!!$!!!!!!!!$!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!$!!!!!!!!!!!!!!!!!!!!!!!@x!!!!!!!!!!!!!!!!!!!!$!!!!@!! !!! !!_@!!!!!Z !!!@@ ![;!!!!! !qKKKKKKKKKKKKJKKKKKKKKKKKKKKKKKKKKKKK6i6666i6i6ii6ii6i6iii6iiii6ii6i66ii6ii6i6i6i66i66i6ii66i6i6i6i6i6i6!!  !!!! !!!!!!!!!!!!! !!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!$!!!!!!!$!!!!!!!!!$!!!!!!!!!!!!!!!!!!$!!!!!!$!!=$!!!!!!!!!!!!!!!=!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!$!_!!!!!!!!!!$!!=!!!!!!!!=@!!!!!!!!!!_̂@!!! !!!!!!!Y!! !@@  ;[!    x; ! ! =qKKKKKKKKKKKKKKKKKKKKKKKK6iii666ii666ii6ii6666iii6i6iii6ii6666iii66i6ii66i6iiii66i6ii666i6i666ii666ii66i666ii66iiiiii6i6i66666Q666656iii8666666<6665i6EDDDDF,,,,, ,NQi658iOii666i666i6i6666iii6666i66i6iiii666i66666i66iN!!!! !!!!!!!! !! !!!!!!!!!!!!!!!!!!!!!$!!=$!!!!!!!!!!!!!!!$!!!!!!!!!!!!!!!!$!!!!!!$$$=!!!!!!!!!=!!!!!!$!!!!!=$!!!!==!!!!!!!!!!!!!!!!!!!!!!$!!!!!!$!$!$!!!!!!!@_!!!!!$!!!!!!!!!!@!!!!!!!!!!!xΖ@!!!@Y!!!!_!!!!@@!!_;_! _#   !pKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKiii6i66i66ii66i6i6iiiii6iii6666i6ii66iii6iii666i66ii66ii6i66i66i6iii66iiii6ii6ii6iiiiiii66iiiii6ii6iiii66iii6i6ii8iii6ii6ii6666i66666866j66628ii<<6660iiiN666666655S65Nii56N66SS666i>6iN<<5i6Q6<5i66Ni66i<6i>66i<6i6i666i66i6iii6QNiKJKKKKJJKJKJKJKKKKKKKKKKKKKKJKKKKKKJKKKKJKKJKKKJJKKJJJKKJJKKJJJKKWKKJJJJKJKJWKJKJKWKJKJJJJKJJJKJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJHJHJHJHJGHGGGGGFGFFFFFDKKKKKKKKKKKKKKKK+22202+1444110Q*331ݰ*00+00*ڰ̦ͦ+&&&&&&+KKKKKKKKKKKKKKKKDFFFFFFFFGGGGGGHGHGJGJGJHJGHJHJHJHJHJHJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJ?!!!!!!!!!!!!! !!!!!!!!  !!!!!!!!!!!! !!!!!!!!$!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!$!!!!!!!!@!!!!!!!$!!!!$!!!!!!$!!!!!!!!$!!$!!$!!=!!!$!=!!!!!!!!!!!!!!!!!!!!!!!!!!!!!ZZ=!!!!!=!!!!=!9$!!!!!! !!_@!!!!!!x@!;@ !@@!@Y!_!     ! !qKKKKKKKKKKKKKKKKKKKKK666i66ii6ii66i666ii6i66i6i6iiiii666ii66iiiii6i6ii6666i6ii6i66ii6i6iii666i6i66iiii66i66i66i66ii66iii6ii6i66i66iiiii6iiiii6iiii666ii66666i6666i6i666>6i66EGDDi666i6i6666ii66i6i66i86ii666i<66666i6656i66666ii6666i6666Q6666Ni6i6ii6i68i5iii6iii666i66i66iiiN68iiii86iiiii66ii6i6iiKKKJJKKKKKKKKKKKKKKKKKKKKKKKKKKJKJJJJKKKKKJKJKKJKKKJKKKKKJJKKKWKKKKJJJKWKKJKJKJHJJKJKJJKJKJJKJKJJJJJJJJJJKHKJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJHJJHJJHJHJGJGHGGGGFGFGFFFFFKKKKKKKKKKKKKKKKKKK+20220+14441143*O31*33030*ѭ԰Ц+&&&&&&+KKKKKKKKKKKKKKKKKKDFFFFFGFFFFGGGGGGGHGHGHGHGJHGJGJHJHJHJJHJJHJJJJJHJJJHJJJHJJJHJJJHJJJJJJJJJJJJJJJJJJJJJJJJJJl!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! $!!!!!!!!!$!!!!!!!!!!!!!!!!!!!!!!!!!!!$$!!!!!x@!!$!!$!!!$!!!!!!!$$!!!!!!!!!!!=!!==!!!!!!!!!!=$$$=$$!!!!!!!!!!$!!!!!!!!!!!xx@!!!!!=$!!=Z@!!!!!!!!!!!!!!x!!!!Ɩ ! !!!!!@B !!!!d! !Y !d! ! !!!qӷKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKii6i666i6iiiiiiii6i6i6i6iii66666i6ii66iii66i66ii66i666ii6i6ii66i6iii6i6ii66i6iii66666iiii6i666i666i666i66i6ii66ii6i6i6iiii6iiiii6i6ii666ii66ii6i6i66ii8EDDEi66i6i66i6666666ii66666=$!=!!!!$===$!!$==$!===!=!!$=====$=====>==>Cxx@======!!$!========$>>====$=!$!$====!$===$!=$=!$!!$$!$=$===$$!=====!!!=!=!!$==!!======!!$==!!=$$!!!$!$$!!$!!!!=$=!$!$=$$=$!$!!!==$!!!!$!$=!$=!!$!!!!=$!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!  !  !!!!!!! !!!!!!!!!!!! !!!!! !!! !!!   !   ! !!  !!!!!!!!!!   !!! !!!! !!  !!!!  ! ! $qӳKKKK6i66666666666666i6i666iii666666666ii6666666666i6i666i66i6i66ii666ii666i66i6i6i666666i666666i666666i66666666666666i6iiiii6666ii6i66ii6i6i &  & &  %& & %66iii66i6i66666i66ii6i6i6ii6i66i66666i66666i66ii6666666666i6666i666666666i666i66            66i66i6ii666i6666i6i666i666i6i66i666i6666ii6iiii666i6i66666i6666i6ii66i6ii6ii6i6666i6666i66i666i6i6i666666i66666i66i6i666i6i6iKKKKKKKKKKKKKKKKKKKKKJJKKWKJKKKJKJJJKJWKJJKHJKJJKJJJJJKJJKJJJJJJJJJJJJJJHJJJHJGHGGGGGFGFFFFFFKKKKKKKKKKKKKKKKKKK+2OOO2+1+*4*4**333301߰+&&&&&&+KKKKKKKKKKKKKKKKKKFFFFFFFGFFGFGGGGGGGHGHHGHGJGJHJHJHJHJHJJHJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJj!!==!!!!$!!!!$==!!!!!=$!!==!==$$!!!!$=!$$$$!==$!$$$!$!!$$$$$$==!!=$!$=$$$$!$$=!==$=====$$$$$!======$===$$=======9===!========$$====$!=======!$====!=!!=====!====]u==$=====$===!$==!$!=$====$!===$!=$=====!$!=!=====!!=$=$!===!!$!=$==$!==$!==$$!$=!$$$=$!$$$!$$!==$!$!==!!!=$!$$!!$=$!!!!!!=!=!!!$!!!!!!!!!=$!!!!!!!!!!!!!!!!!!!=!!!!!!!!!!!!!$!!!!!!!!$!!!!!!!!!!!!!!!!!!  !!!!! !!!! !!!!!!!!    !   =qӳKii6i6i6i66ii66i6ii6i66i66666666i6i6i6i6i6666666666iii6i66i6i6i66i6i66i6i6i66i666i66666i6iii6ii6ii66i6i66666666666666ii66ii666666666666i6% % % & & %& &  & % & & & & & & %(666666666666i66i666i6666i666666i6666666666666666666i6i66i66iiii66i66i6i66i66666         6i66i6666i6666i6666i6666i6i66i6i66i6666i66666666i66666iii6i6i66666i6666i6666666ii6i666i666i66i66i6i6i6666i6ii6i66666i6i66i666iKKKKKKKKKKKKKKKKKKKKKJKKKKKJKKKKKKKKKKKKKKJKJJKJKJJKJJJJKJJJKJJJJJJJJJJJJHJHJHHGJGGGGGFFFFFFFKKKKKKKKKKKKKKKKKK+OO2OO++1*4*44*1333331&&&&&&&+KKKKKKKKKKKKKKDFFFFFFFGFGGGGGHGHGJGHHHJGHHJHJHJHJHJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJsl==!!$!!===$!$$=!!!=!$===!$==$==$$$!!!!!===!!!!!$$!=!!!$!$=$==$===!=!$=!===!$!!!$=$=9!!$==========!$!!!$$======!$======!!$$=>A>==!=====!=====$$=!=====!!!=!==@x@===!!!$!=========!!$=!!!!!!=$$====!=$$=========!!=$=$!======!!$$!$==$!$$==$!=$$==!$====!!$$!!!$!!!!=$!==!$!$=!!!$!!!$=$!$=$!!!!!!$=!!==!$!$=!!$!!=$!!!$!!!=!!!!!!!$=$!$=!!!!!!!!!$!!!!!!!!!!!!!! !!!! !!!! !!!!!!!!!! !!!!!!!!  !!!       !! !      !pӳKKK66666666i666i6i6i6666666ii66ii6ii6666i66i6i66i6i6666666666666i6i66666ii66ii6i66666ii66i666i6666iii6i66666666666ii66i666i66i666i666i6ii6i(& & & & & &  % & % %66666666666666i6666666i6ii666i6666666666666i66666666666ii66666666ii6i6i66666666            666i666i666666666i666i6i6i66666i66i6i66i6666ii6i6i6666i6ii6i6i6iii6i6666iii6666666i66iii6i66i66i6i6i666666ii6ii6i66i666i666i666KKKKKKKKKKKKKKKKKKKKKKKKKKKJJKKJJKKKWKKWKKJKJKHHHKHJKJJJKJJJJJJJJJJJJJJJJJJJJJHJJHJGJGHGGGFGFGFFFFDKKKKKKKKKKKKKKKKKKK+OOOO2+11*4*3**333331ݰ+&&&&&&+KKKKKKKKKKKKKKKKKKFGFFGFFFFGFGGGGGGHGHGHGHGJHGJGHHJHJHJJJHJJHJJHJJJHJJJHJJJHJJJHJJJHJJJJJJJJJJJJJJJJJJJJJJJJs?==!!$$$!!$!!!!$!$!$$$!$!!!==!$!!=!==!=!=!==!==$!=!$=$$==!====!!==$=!==$$$==$==!!!==$$$=!===9===!$========$$==$!=======$=!=====$=====$=>=$=====$$====$$=======$=$===@zxC=!=========!===============$$=$>===!$===$$==!=!=====$=$====!$==$==$=!=$=$=!==$!==$!===!!$!$=$$$$$!=!==$!!=!!=$$=!$=$$=!!!=!!$$!=$!!!=!$$!!$$!!!$=!!$!!!!!!!!!!!!$!!!!!=$ !!!!!!!!!!!!!!!!!!!!!!!!  !!!! ! !!! !!!!!!!!!!  ! !   !!qKK66iii6iii6i6i66iii6i6ii6666iii6ii6i66666666i6i66i6iiiiii66i666i6i6i6i666ii6666i666666i6iiii6ii66i666i66666666666666666i6666i6i66i6666( % & & &%  & %& & % % &66666ii66iiii666i666666i6666i6666iii666666666ii6ii6666666666i6666666i66ii666i6         6i6666i66i666iii66i666666i6666i6i6i66i666i6666i6i66i6i6ii66i66666ii666666666i666ii6666i6i666i66666i6666i66i66i66666i6i6iii6i666KKKKKKKKKKKKKKJKKKKKKKJKKJKKKKKKKKKKKJJWKKJKJKJJJJJJJJJJKJKJJJKJJJKJJJJJJJJJJHJHJHHGGHGGGFGFFFFFFKKKKKKKKKKKKKKKKKKK+O2OOO+1**4*41*333331ݰ+&&&&&&+KKKKKKKKKKKKKKKKKKFDFGFFFFGGFGGGGGGHGHGHGJHHGJHJHJHJJHJHJJJJHJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJ?==!!$$$!!!$==!!$!!$=!!!$=$!!!!=$!$=!$!!!!$=$!!==!===!===!!$=!$$!$========!!$!====$======!$!!$$$==$!!!$=====$!$$$=$===!$==$==$!$$$$==!!======$$!====$=$====>>=========AAC_̖u@========$$==>====$!=============>===>====$!!==!===!!!$!$=====C=!!$!!==$!==$!!!===!!$!!!$!$=$=!!!!!===$=!!$$$!!==$!$==!!===!$!!!!!$==!!=!!!!$==!$!!$==$!!!!!=!$!!===!!$!!!!!$!!!!!!!!!!!$!!! !!! !!!   !!!!!!!!!!! !  !!! ! !        ! !!  !!qӳK666ii6666i6666i66ii66i6i6i66666666i666i6i6i6i666i66i66666i66666i66i666i666i66666iii66i66666i6i66i66iii6i6i66ii6i566666666i6i66i66ii6i % %&% &%&& & % & & & & & && % %% (ii6i6666i6i6666i6i66i6666i66i66i666i6i66i6i66666666i66666666iiii6ii6666666(%        i55666i66666i66666i6ii66666666i66666666ii666i666i666666i6i66666666i666i6i66i666666666666666666i6666i666666i66i66666i66666i6i6iKKKKKKKKKKKKKKKKKKKKJKKWKKJJKKKKJKJKKKJKJKJJJKJKJJKJJKJJJJJJJJJJJJJJJHJJJGJGGGGGGFFFFFEKKKKKKKKKKKKKK+OOO2O+11*4*31*333301԰ͭ+&&&&&&+KKKKKKKKKKKKKKKKFFDFFFFFFGFGGGGGHGHHGJHHGJHJHHJHJJHJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJ?==!!!!!!$=!!$=$!!$!!!=$!!=!!==!!=!$=$!$$$!===$$==!!====!=!$==$=!=$$==$$==$!====$!===========!$====!=====$$$====!======$=$!=========$=====$=============$!===>$==!=======!=========>@A@=@=@=@=====$=====$==$!=====$$$=====$===!$=====!=$===>9==!=====$=$===!======$===$===$!==$$===!===!=$$=$!$$$$====$$!==$!$=!!=$$$$!=!$!$!==!!==!!!!!!=$!!!!=$!!!$!$$$!!!!!$!$!!=!$!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!! !! !! !!!!   !     ! qKK6i666i6i6i6ii66666i666i6666ii6666666i66666666666666i6666i6i6ii6i66i66666i6666i66ii6i66666i66666666i6666iiiii66i66i66666ii6i6666i666666%%%&% % & & & & & & & & %&% %&66666i66i66i666i6i6i6666i6666i666666666666666666666i66666666666666666i665 % %%        ( 66666iii66i6i6i666666i6i6i666666666666i66i66i666i666ii6666i666666i66666666666i666i66i666i66i666i6666i6666i66i666666i666666iKKKKKKKKKKKKKKKKKKKKKKKKKKKJJKKKKKKKJJJJJJHHKJJKJKJJJJJJJKJJJJJJJJJJJJJJJJJJJHJHGJGHGGGGGFFFGFFFFKKKKKKKKKKKKKKKKKKK+OOOOO++1*2*41133333*ݰ&&&&&&&+KKKKKKKKKKKKKKKKKKDFFFFFGFFGGFGGGGGGGGJGGJGHHGJGHHJHJHJHJHJJJHJJJJJJJJJJJJHJJJHJJJHJJJHJJJJJJJJJJJJJJJJJJJJJJ?$$!!!==!!$!!===!!======!===!!!!=!!$====!!!==$!=$!=!!$$==!=$!!!!$!$$!=====$!$!$$$=========$!$$$======!!===!=$$======$$$=====$$$$======$=====!=>===>===!!==!$===========$=!====!!$=$=A=!!$==========!$====$=======$!$!==>==!!$==!==>=====!$$=$=>C==!$=!$=!!!===!=$$$$!===$==!$==$===!==$=====!!!$!$==$!$===!!!$!!$=$!!!====$=!!!!!=!!======!!!!!!!!!!!=$!!$$!!!=!!!!!!!$!!!!!!==!!!!!!!!!=$!!!!!!!!!!!!! !!!!!!!!!!!!! !!!!!!! !! !!   !    !  ! !!! qӳKKKii666i6i66i6666i6666i6ii6666ii6i6i6i6i66666i66666i6666i6666666i66666i66666666ii666i666i6i66i66666666666666i6i66666ii6666666666i6666666 & &% % & % & % & % % % %& % %66666666666666666i6i666666666i6666666666i6i6i66i66666i66i6i6666666666i6i6%           i6666666666i666i66666i66i6i6i6iiii66666666i6666666i666666i66666666i66666666666i6665iii66i666i666i666666666666666i6666i6i66iKKKKKKKKKKKKKKKKKKKJJKKJJKJKJKJJKJKJJKJJKJKJJJKJJJJJJKJJKJJKJJJJJJJJHJJHJGJGHGGGFGFFFFFDKKKKKKKKKKKKKKKKKKK+OOO2O+11*4*21*333331ͭ+&&&&&&+KKKKKKKKKKKKKKKKKKFFFFFFFFFGFFGGGGHGHGHGHHGHHHHJHHJHJHJHJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJl!!!$!!$!!=!!=$!!$$=!$$$$$$$$$=!!$$$$!!$$====!!$!===$$==!$!=$=!===$==!==!==$==!=$=====!===!=!=====!=========!=$===$!==========$!=========!=========$===$====$=====!=============!=A=!=====$$=============$=========$=============$=$$==$$====$=====>=$====$!=!=========!!=====!===!===!=!$====!$=$$!=====$!!$!=!$=!$$!==!!!!=!==$!$!!=$!=!=$=!!$!!$$!!!!$$!!=!!!=!!!!$$!!!!$!!!!!!!!!$!!!!!!$!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!   !!!!!!    !  $qӳ666i6i6i6666i66666i6666666666666i66666666i6i666i6666iii66i666i666i6i666iii66i666i66666i66666i666i66i6666666666ii666i666i666i66ii6666i6 %% % %& % & & & & & % & & %% %% %%6666666i6i6666666i666i666i66666ii66i6i66i66ii6666666i66i6i6i6666666i66666(         (% 6666iii666666666i666666i666i66i6i6ii6ii6666i666i6666666666i6666i66ii666i6iii66666i6i66666666i66i666i6666i66666i66i666666666KKKKKKKKKKKKKKKKKKKKJJJKJJJJKJJJKKJKJJKJJKJKJJKJJKJJKJJJJJJJJJJJHJJHJGGGGGGGFFFGFFFKKKKKKKKKKKKKKKKKK+OOOO2+1114*4*133333*Ѧ+&&&&&&+KKKKKKKKKKKKKKDFFFFFFFFGGGGGGGHGJGHGJHHJGJHJHJHJJHJHJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJo===!!$==!!=$!==!!!$!!!!!!$!$======!=$====$!!=$!!!=!!==$===$$$!==$$!!==!$$========$===!$===!=======>=!!==>=====$==A=======$$===$======$$!=$$==!!$==!$=$======!====$$!!====>=!======A=$$>CA===$$=!$========>A>=====$!!============!====!=========!!!!====$!=>====$====!!==$==$$====$=$!=$$!$!$$!!$$==$$!$====!!!=$===!==>=$!!=!!!=!$!!==!!!!!!!$==$!!$!!!!!!!!!=$!!=!$!!!!===!!!!!!!!!!!!!!! !!$!!!!!!!!!!!!! !!!!!!!!!!!! ! !!!!!       ! !  ! !   =pӳi6666i66ii666666i66666666666666666i666ii666666666666666666666666666i6i6666i666666i666666666i6666666666i6i66i666666i6ii66i6666666666i65% %% % % % &&& & % % % % % % % %6i6i66i66i66i6ii666i66i6i66i666i66i6666i6i6i6666i6i6666ii6666i6i6666666655(        ( % 6666666ii66ii66666i6i6i6i666i66666666i666666i66i6666i666666i66666666i666i66666ii6666i6i6ii6ii6i6i66666i6666i666i666666666i6KKKKKKKKKKKKKKKKKKKKKKKJKKJKKJKKJJKJKJKJKJKWKJKJKKJKJJJJJJJJJJJJJJJJJJJJJJHJJGJGHGGGGGFGFFFFFKKKKKKKKKKKKKKKKKKK+OOOOO+11*4*31*33333*ͭ+&&&&&&+KKKKKKKKKKKKKKKKKKDFFFFGFFFFGGGGGGGGHGHHGHGHGJGJHHJHJHJJHJJHJJJJJHJJJHJJJHJJJHJJJHJJJJJJJJJJJJJJJJJJJJJJJJJJo!!$!!!!!=$$$!!!$$=$!!!!=$!$$==$=$$$!$===$$=$$$$=$=$!$=$$===!=!====!=======$$=!===$=!=========$=======$===$=====$$=================!============A=$$=============!===========$=======$===$$======$$=====$===============$==========!===========!================$$==$!======$!=====$====$!!====!!====!!$$!!$$$!=====$!$$!====$!$!==$=$!!!!$$$$=$!!!==!!!$=!!!=!!!!!!=!!!$!!!!!!!!!!!!!!!!!!!!!!!!!!$!!!!!!!!!!!!!!!!!!!!!!!! !!!!  !!!!!!  !!!!!!!!    ! qӷKKK666i66666ii666666ii6i6ii5i6i666i666ii666666666666666i666i66i66i6i66i666i6i66666i6666i6i6ii6666i6i666i66i66666666i66666i66666i666i6666 %% %%&% & % % & % %% & & & % %& & % %&%& i6666i66666i666666i666666666i6666i6i666666666666666i66i666666666i6666666%(      666i6666i666i6i66666666i666i66ii66i6i6i6i66i666666i666i666666i666i6666i66i6666666i666i666666666666i6ii666i66i6666666666666iKKKKKKKKKKKKKKKKKKKKKKKKKKJJKKJKKJJJJJJJJJKHJJJWJJKWKJKJJKJJJJJJJJJJJJJJHJHJHGJGGGFGFFFFFFFKKKKKKKKKKKKKKKKKKK+OOOOO++112*4*10Q333*+&&&&&&+KKKKKKKKKKKKKKKKKKEFFFFFFFGGGFGGGHGGHGJGHGJHHJGJHJHJHJJHJJJHJJHJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJo!!!====!!!===!$$===$!!!!$==!$=!!!!!$===!$!=>A=!$=$$=====$==========!$===$===$$!!=========!$!!$==$$$===$======$====!$=CA=$==$$========!======!!$!==!====$===>==>=======>=========$=$!=$============$==$$!$====$!=>=====!$==========$==!=$$==>==C==!!=>==$=!!=$$====$$=$!!$!==!==$========!$!$======!!==$$====!!!$$$$!=!!!!!$==$$==!!!$!=!$===$$==!!==!$!!=!!!!!$!!=$!!!!!!! !!!!!!$=!!!!!!!!!!!!!!!!!!!!! !!! !!! !  !!!!! !!! !! !!     !   !!  !  !!!  =}ӳ6666666i6i66i66i66666666666666666666i6666666i66666i66i666666i66i6i66666666666666666i6666666ii66i6i6i66666666666i6i66666i66666666666i%&%% & % %% % %&% & & & % % && % & &% &%%6666666i666i6666i66666666i6i66i6ii6666ii6666i666666666i66i66666i6i6666i66( (% %       666666666i66i66666666666666666666666i66666i666i66i6ii6i66ii6666666666666666i666666666666i6i666i6666666i666666i666i6666i666666KKKKKKKKKKKKKKKKJKKKKKKJKJJKKKJJKJJKJKJKKJKJJJKJKJJKJJKJJJJJJJJJHJJJGJHHGGGGFGFFFGDKKKKKKKKKKKKKKKK+OOOOO+1+*4*31*333331ͭ+&&&&&&+KKKKKKKKKKKKKKKKEFFFFFGFFFGFGGGGGGHGJGHGJGJHHJHJHJHJJHJJHJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJj=$!!=$$$!$=$$$=$!!$===!!$==!!$$$$!===!=$!!==$!==$!$!===$$$=$$C===!===$!=$====!!====$$=========!=$===$$======$$====$$===============$===================$$=====$=====!=C===================>======================$=======!=>===========>=$========$=======$=$=>===!!====!!==$====!========!$==!==$=$========$$$$=======!$$==$!$==!$=$!$===$=$!!$$$!$!$!!==$!!=!=!$!!$!!$!!=$!!!!!!!!!!!!$!$!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!! !!!! !!!!!!    !    !=sӳK6666666i66666i666ii66666i666i6i66i566656666666666i666i66666666666666i666666666i66i666666666666666666666666666666i66666i6i6i66666668%% % %% % % & % % & % %% % %%&&%%56i66ii6i66666666666666i6666666i6666i6666666i666666i66i66666666i66666i666i665( % %       i6666666i666666666666666i666666i6666666666656666666666666666666i66666666666666666666i6666666666666666i6i66i6666666i66666i66666KKKKKKKKKKKKKKKKKKKKKKJKKKJJKKJJJKJJKKKJHKJJKJJJJJKJKJJJJJJJJJJJJJJJJJJJHJHJGGGGGGGFFFGFFFKKKKKKKKKKKKKKKKKKK+OOOOO+11144*4113O334*ݰ&&&&&&&+KKKKKKKKKKKKKKKKKKFEFFFFFFFFGFGGGGGGHGHGJGHGJGHGJHJHJHJHJJJJHJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJ}?9=!!!!!!!!$=!!!=!!==!$!$==!!==!!$!$=!!====$=======$=!======!!==!!!!=$!===$!!==$====>$$==>===========$==>==$====!$=>=$!$==$!!$=>===========$======>>==>=$=C======$$>=$=====$$====!!===>==!$=A=>===$=====!======!$$!$!!=>>>=========$==$!$==$$==!!$$==>====$$=!!===!!=>C>=====$!==$==$!$!!!=$===!=$========!!!!===!!!!!$$!!!!!!$$!!!$==!!!!!==$==!$=$!!!!$!!!!$=$!===$!====!=$!!==$!!!!!!==!!!!!!!!!$!!! !!!! !!!!!!!!!!!!!!!!$! ! !!!! !!!!! !!!!!!!!! !    !!  !    !  !  !!=}ӳK666666666i66666i6666666i6666i666666i666666i666666666i8i66666666666i66i6666666666i6666666i66666666666i66i6i6666i6666666666666666666i6% % % %% %%& %&% &% % % % % % % & &% % %& %% %6666i6666666i6i6666666i6666i666666i6666666666i66666666666i6i6666666i66i66i66 %      i666666666666i6i6i66i66666666666666i66666i6665i6666666666i666666666666666666666i6666666i6i66i6666i66i6666666666666i6i66i666666KKKKKKKKKKKKKKKKKKKKKKKJJKJKKKJKKWJKKKKKJKJKJKKJJJJJJJJJKJJKJJJJJJJJJJHJJHJGHGGGGFGFFFFFFFKKKKKKKKKKKKKKKKKKK+OOOOO+11*4*441*43343*ͭ+&&&&&&+KKKKKKKKKKKKKKKKKKFFFFFFFFGFGFGGGGHGHGHGJGHJGJHHJHJHJHJJJHJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJC!=!!$$=!$$!$!==$$$$!$$!!=$!$===!!$=!===!!=$===$$==!====$==!===$!====$=======!==$$===================>>=$=================$===========A=!=============$$A>=$===$===$=======>===$==================================$===>========================$=$=====$=====$===$===================$!===$===========$!==$$==$$$=$$$!==$!!$!!==$$$$$=$$$=$!$=$==!!$$!=$!!!$!=$!!!$$$!$!!!$$!!!!!!$!!!!!!!!$!!!!=!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!! !!!!!!!!    !=qӳ6666i66666666i6i666i6i6i666i6666ii666666i66666i6i6i666666666666666666666i6i666ii666i666i6666666i6666666666i6i666666666666i66666666i6 % %% %%% % % %& &% %& & % % % % % %&6i666666i6666666666666666i66666i6i6i66i6666i6i66666666666666i6666i66666666665%%% % %    % % 666i66666666666666i6666i666i666i666666ii66666666666666666666666666666666666666666i66666i6666i666666i666666666666i6i66666i66KKKKKKKKKKKKKKKKKKKKKKKJKKJKKKKKKKJJKKWKJKHJJJKJJKJKJJJJJKJJJJJJJJJJHJHJGJGGGGFGFFFFFFKKKKKKKKKKKKKKKKK+OOOOO++**4*41*34333*+&&&&&&+KKKKKKKKKKKKKEFFFFFFFGFGGGGGGHGHGJGHGJHHHJHJHJHJHJJJJHJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJj==$==!$==$!!!$===!!===$==$$=$==!!===$==$!$===!!$!!$========!!>>=>==!======$==>=!!!====$!!=$==$=!$!$$!!==$=======$$=====>>=====!$===>>======$=======>=$>>====$==>=====$$==>=====>>=$!$$========>=>=========>A==C>=====$!!!$=!!$=====$$!====$=$=============>=!=>==$$==$$==$!=========!==!!$$$=!$!$$$!===$$$======$!!=A======!!!$=!!$!$!$=!!==!$==!!!==!$!!!$$=!!!!!!!!!!$!!=!=!!=$$$==!$==!$!!!!!!!$=$!!! !!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!! !!!!!!!          !  !  !    !p׳666666i66i8i66i86i6666666666ii6666666666666666666i666i666666666666666666i666666666i6i666665666666666i6i6i66666666i6666i666666666i666 %%%% %% %&%%%&% % %%%%% % &% % & &% %%%% %6666666i6666666666666666i6666666666666666666i666i66ii6666666666666666i665666 % % %    % % %66666i66666i6i666i666666666i666666i6666666666666i66666666666666i6666666i6i6666666666666666666666666i66666666666666i6i6666KKKKKKKKKKKKKKKKKKKKKKJJKJKWKKKWJKKJHHJJKHJJJJKJKJJJJJJJJJJJJJJJJJJJHJHJGHGGGFGFGFFFFEKKKKKKKKKKKKKKKKKKK+OOOOO+11144*4'*433O3*+&&&&&&+KKKKKKKKKKKKKKKKKKFFFFFFGFFFGFGGGGGGHGGHGHGHGJGHHJHJHJHJJHJJHJJJHJJJHJJJHJJJHJJJHJJJHJJJJJJJJJJJJJJJJJJJJJJJJl=$!$$$$$==!!$$!===!!$===$$$==!$$==$=====$!===$==$===!===$=======$====$====$!=======!$======$===$$$$=$===========================!========================>===========>=!======================$=======A=======>===============================$===============$>===$!======$=====$$=======!==$!===!!=$$=====!!=====$!=====$!=$===!==!!!!=$$!!===!!!$$!!===!==$!!!$=!!$$$!!!!$$$$!$$!!!!=$!$!!!$!!!!!!!!!=!!!!!!!!!!!!!!!!!!! !!!!! !!!!!! !   !!!!!!      !!qK666666666i6666i6i6666i666666i6666666666666666666666666666i66i66666666i6i6666666666666ii666666i66666666666i6i666666i6i8666i66i6666665%%&%% % &% % % %%& % %&%%&% %% &% %&%%% % %5666666666666666i6666666666i6i666666666666666i666i6i6666666i6666666i666i6666% % %    % %566666i66666i6i66666666666666666666i6666i66i6666666666666i6665i6i66666666566i6666666666i6i66666666666666666i66666666666i6KKKKKKKKKKKKKKKKKKJKKKKKJKKKKKJKKJKKKKKKKJKJKJJJJHJJJJJJJKKJJKJJJJJJJJJHJHJHGGGGGGGFFFFFFFKKKKKKKKKKKKKKKKKKK+OOOOO+11'4*4**34334*צ+&&&&&&+KKKKKKKKKKKKKKKKKKDFFGFFFFFGFGGGGGGHGHHGJGHHJGHJGJHJJHJHJJJJJHJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJj!!=!==!!!=====!$====!!==!!!$!=====$!!$$!==!!$=======$$=$!$$=>==!$$$=====$!==$$==$=>=$$$!$!=====$==>>===>A>==========>$$===========$$$!===>=========$!!===$===>=!========9=>=======>>=>==$====$==A>==>=$!$============A>>=>A>=====!==A==>>>=>=====$$==$$=$!!$===$=====$===$!!$!=>=$==!$=!!====A=$!$===========$!===$$=$=!=$!$=$!!=====!!!!==$!=!$!!!$=$!!$=!!!!!=$$!!!!==!!!!!!$!$!!!!!$=!!!!!!!$!!$!!!!!!!!$!!!!!!! !!!!!!$!!!!!!!!!!!!!!!!!!!!!!! ! !!!!   !! !    !       !       !! !!! =sӳ666666666666666666666i66i66666i666666666666666666i66i66666i66666666i66666666666666666666i666666i666i66i666i66666666i666i66666666666%%%&%% %%% %%%&% %%% % % % & &%& %% % % %%% %% % (i6666i6i6666i6666666666i6i666666666i6666i666666i666666i6666i6666666666666665%% %    % 66666666i6666666666666666666666666666666i66666666i6666666666666i666666i6666666666666i6666666666i6666666i666666666666i6666KKKKKKKKKKKKKKKKJKKJJKKJKKWKJKKJJJKJJKJKJJKJKJJJKJJJJJJJJJJJJJJJGJGHGGGFGFFFFDKKKKKKKKKKKKKKKK+OOOOO+1+**4**433431ɰ+&&&&&&+KKKKKKKKKKKKKKKKFFDFFFFFGGFGGGGHGHGHGJGJHJHHJHJHJHJHJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJo!!$$==!!!===!=!======$!=$!==$$$$==$!!$=$!!====!====>=!=====!=====$!=$$======!===========!===============!=>>>>===========$=========!==================================$=====>======$=====>===>===$============>==$=====================AA=======$===$=======$===$$>===$!=====!=!$====!=$$==!$=======$$=====!=======$===$!=========$!!==!==!!==$!$!$!!==$$!!$==!$$!!$=$$=!!=$!$=!!$!!!!=$=!!!!$!!!$!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!! !!!! =qӳ66666i6666666666666i66686666i666i66666666i66666i66666666i666666666666666666i66i666i6666666666i6i6666666666i66666i66666i6i6666666i666'%% & % %%% %%% %%% % % %&% % %%&%% %% %%% %%5'%%666666666666666666i6666666666i6i666i66666666666666666666666i66866666i66656666% % %  % % 6666i66i6666666i6666666i66666i6i6666666i6i6656666666666666i66666666666666666666666i66666666666666i666666i666i666i66666666KKKKKKKKKKKKKKKKKKKKKKKJJJKKJKJJJKKHHKJJJHKJKJJKJJJJJJJJJJJJJJJJJJHJHJHGHGGGGGFFFGFFFFKKKKKKKKKKKKKKKKKKK+OOOOO++1*4*4**34334*ݰԦ(&&&&&&+KKKKKKKKKKKKKKKKKKDFFFFFGFFFGFGGGGGGGHGHGHGJGJGHHJGJHJJHJHJHJJHJJJJJJJJJJJHJJJHJJJHJJJHJJJJJJJJJJJJJJJJJJJJJJso$!9!!!$====!=!=!!$$=$!!!======$!===============$!$=>===A===!=$$$===>>===!=>==========$=A>>A>>>=================================$=>=====>>=======>=====>C>==$=>>=A======>>>==>=$>>=$=$=$===$=>>=========$$=======>======>==$======>=$!=$=====A==$!=>====$========$==!!=============!=!===>A====$!$==!==$=!=$!!=$!$$=$!!$!!==!=!$!!$!$====$$!==!!$======!!$==!!!$=$!!!!!!!=!!!$!!=$!=!!!!=!!!!$!!$!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ! !!!!!!!!  !!! !!!!    !qӳ66i6666666666666ii6666i6i666666666i6666666666666666666666666666666i66666i666i6666i66666i66666i66666666666666666i6666666666666666666i(66(%&%%&%% &% &% % % % %& %% %% %%&%%%((5(6666666666666666666666666i6666666i6666ii6i66666666i6666i666666i6666666i6666i666 % % %  % %66i6i666666666i8666666666666i6i66i666i66666666i66i666666666666i66666i666666i6i6i66666i6i6i66i66666666i6666666666666666i66KKKKKKKKKKKKKKKKKKKKKKJKKKJKJJKKKKJJKKWKJKJKJJJJJJKJJKJJKJJKJJJJJJJHJJHJHJGHGGGFGFFFFFEKKKKKKKKKKKKKKKKKKK+OOOOO+11*4*4**3O343*ئ+&&&&&&+KKKKKKKKKKKKKKKKKKFFFFFFFFFGFFGGGGGGGHGJGHGHGJHHJHJHJHJHJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJs?===$$!!==!=====$$!!!!$$$!!======!$===$===$$===$===========!=>===$=====!==============$===A=====$=======$=========!====================$=C>========A====A=A=========>===>=========>=====$=$=>=========>==$===========>===========>=====$==>======$$=====$=====$=>=$=======$===!$=====!=====>======!========$$!$==$!$$$$==$===$$$==$$$====!=!=$!!$!$$$===!$!!===!!!$$!=$!!$$$$!!$!=$!$$!!!$$$!!!!!!!$!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!! !!!!!!!!!!!!!!!!!   !  =qӳ6i6666666666i6i66666i6666666666i6668i6666i6666i6i66666666i66i66666666666666666i66666666666i66666666i66666666666ii666666i666666666666(i5%%% %&% &% %%% &%% %%% % %% % %%% % %%%%86666666i86666666i66i666i6666666666i668666666i66666666666666666666i6i6666666ii566i % % % %  % % 666666666666666666666666666665666666i66ii666666666666i666i6i66i666i66666i66666i6i6666666i66666666i6666666666666i6i66666i6KKKKKKKKKKKKKKKKKJKKJJJKKKJJKKKJJKJJJJJKJKJJJJJJJJJJJJJJJJHJGJGGGGGGFFFFFFDKKKKKKKKKKKKKKKK+OOOOO+11*4*4**43334*ݰͦ+&&&&&&+KKKKKKKKKKKKKKEFFFFFFFFGGGGGGHGHGJGHGJHHHJHHJHJHJJJHJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJ?$!!$!$==!!$$$!!===$!======!=!=!$==!==!!====$!!!===!$!$=$==!=A==$!=!===$$==!$$==$===============!$=========!==$$==================>>>>=$==========$==$$=====>=======C=====$==========A=>=>=========>=$===>>=>=>==>============>>===$=============>=$===$==================$!===$=>==$==A==!$$!==$$$$$$$==>>==$$=$!$=======$!==!==$$!!$$$===$!$====!$=$=!==$$!!!!!==!==!!==!==$$!!!!!!!!$!!!$$!$!!!!!!!!!=!!$===$!!!$$!!!!$==!!!!!!!!!!$!!!! ! !!!!!!!!!!!!!!!!!!! !!!!!  !   !   !!    ! ! ! !sӳ656665666666665666666666666666666i6666656666665666666666666666666i866666666666666666i666666i66666666666666666i8666666666666666666666%%% %%%%%% %% %%%%%%%%%% %% %%%%%%% % %%%& %%5666i666i6i66666666666666i66666i666668666666666666i66i666666666666666666666655666( % % %  %666i65666666666i6666565666666i666666i5666666666666666666666666i6666666666i666i6666666i5666666i66i66666666666i6666666666KKKKKKKKKKKKKKKKKKKKKKKKKJJKKJKKJKKWKKJJKJKKJKJJJJJJJJJJJJJJJJJJJJJJJJHJHJHGGGGGGFGFGFFFKKKKKKKKKKKKKKKKKKK+OOOOO+1+*4*2**34343*а+&&&&&&+KKKKKKKKKKKKKKKKKKFFFFFGFGFFFGGGGGGGHGHGJGHGJGHJGJHJHJHJJHJJHJJJJJHJJJHJJJHJJJHJJJHJJJJJJJJJJJJJJJJJJJJJJJJJJՏl!$!!====!$!!!=============!=====$==$=!==!$$!$==!==$$==$=======$=====$=====$============$===============================>==$=>===>=>==============================>==>==$=>=$=>====>==>A==A==$=>======>=>========$==>==>A===>====$================$=========C=============$======$======$!$====!$$$$===========$==========!=!==$==$!$=======!!=!==$!$$=$!=!=!!===$!!$==!===!!$!!$=$!!$=!!!!!$!=$!!$!$$!!!!!!!!!!!!!!==!!!!!!!!!!!!!!!!!!!!!! !!!!!! !!!$!!!!!! !!!!!qӳ665i6666666665666666666666i5i8666i66666i66666666i66666666666666i666666i566666i666666i66566666666666668i6666666i6666656i66666666i65'%%%%%% %%%%%%%%%&%%%& &%&%%%% %&% %% %%%%%%66666666i6666666666666666666666666666666ii6666666666566666i666i66i66666666i665666%% % % % % 666686566566666i66i66666666666i66666666566i6666666666656666666666i6666666666i6666666666i6666666i666i6i666666666686i6i666KKKKKKKKKKKKKKKJKKKJKKKKKKKKJJJJHJKJKJKJKJJJJJJJKJJKJJJJJJJJJJHJHHJGGGGFGFFFFFFFKKKKKKKKKKKKKKKKKKK+OOOOO+11*)*1P3434*ئͭ+&&&&&&+KKKKKKKKKKKKKKKKKKDFFFFFFFGFGFGGGGGHGHGHHGHJHJGJHJHJHJJHJJJHJJHJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJo==$!!!$$=====!$=!=$!$=$!$$$=$=!$==$!=$==>=========A=$==$!===$$=>=$=======>=======$=>=========>==>==========>============$=>=========>===C====>==$=C>=>=>========>====$=====C=$==============>========>=======$=====$=$==>=====$$=>==>====>=======$===>>A===$===$$====$====A======$$==$$==============$===$==========!$$$$=!=!===!$======!$!!!==!$=$=!=$!!!!=$$=!!=!!$=!$=!!$!!==!$=!$$!!!!$=$!!!$!$=!!!!!!!!$$!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!$!!!!!!!!!! !! !!   !!  !        !  =sӷ66666666666i66i6666665666666666666i6666666666i66666i666665i6ii86666666666666656666666666666666668666666i6666666666666666666i66666665'%%%&%%'%%%%%%&%%&%%%%%%% & & %%&%%%&%%%%% %66666i6666666666666666666666666666i6666i86666666666i666i5666666666866i6666i6666i6i6i6 % % % % % % % % (6666666666666666666666i6666666i66i6666666666666666666666666i66666666i6666i666666666i666666i6i6666566666666666i666666i6KKKKKKKKKKKKKKKKKKKJJKKWKJJKJKKJKKJJKJKJJKJKJKJJKJJJJJJJJJJJJJJHJGHGGGGFGFFFFEKKKKKKKKKKKKKKKK+OOOOO+*1*4*41*34343*ަͭ+&&&&&&+KKKKKKKKKKKKKKKFFFFFFFFFFGFGGGGGHGJGHJGHJGHHJHJHJHJJHJJHJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJo==!$!!==$$===!!$======$!!=$!$$!$==$$=================$=!====$>======>===>=$=====$===>==========>===============$==A>=$==>A>===>==============C=====>C===$=====>>====!=====>=======>==>>====>=====>===>>======$==>==========>=====>>===A==============>>=$=====$==========>AA=======$=====>=======A==$=$$============!$!$==$$$==========!!$!=$$$$!!$!!!=!!!!$$$==!$==!==$=$!$==!!!==$$!!!!$!!$$!!!!$!!$$!!!!!!!!==!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ! !$!!!!!!!!!!!!!  !  !!!!!! !   =}ӳ66666666666i666666666666666666666666i6666666i666666666566666666666i666666656666665666666i666i666666666666i66566666666666666666i6665(%%%' %%%%%%%%%%%%%%%%%%%%%% %%%%% %%%&% %%((66666666666666666i666666666665i566666i66666566666666i666i666i66666i6666566i66666666 % % % % % % % % % %%666666666666i8i66666656i666656666856666i666666666666666666666666666i66i6666666666i666666666i66666i666666666666666i6i66iKKKKKKKKKKKKKKKKKKKKJKKKKJKKKKKKJJHKJKJJWJJJKJJKJJJJJJJJJJJJJJJJJHJJHJGHGGGGGFFFGFEFFKKKKKKKKKKKKKKKKKKK+OOOOO+111*44*133434*ѭ+&&&&&&+KKKKKKKKKKKKKKKKKKFFFFFFFGFFGFGGGGGGGHGHGJGHJGHGJHJHJHJHJJJJHJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJsj======$=$!==$!=!====!=====$====!====!=!===$===$======$$=====$=======$=============$===!=>==========>========>A=====>====================A>===>>====>=====>>=====A===$=====>===C>====>========>===========$=>================A==>=====A=====$======>=============>======================$===!==!=========!====!$$!=====$=====!$=$=!==!!$====$!========!======9!=!!$$!!!$!$$!!$=$$!!!!=$!!!=!!!$!!!!!!!$!$!!$$!!!$!!!!!!!!!!!!!!!!!!!!!!!!!  !! !!!!!!!!!!!!!!!!!! !!  !     $qӳ66566666666666666666666666i66666666666i666686666666666666666666666665666i6666666566666666666666666666666666666i666666666666i66666666%%%(%%%%'%%%&%% %% '%&%%%&%%%&%&%%%%% %%%%%%%6666666666i66666686i666666666i6666666666668i6666i5666i66666666i6666666i86666666666 % % % % % % % % % % %%56666666666666666666i666666666666666666666666666i66666666665i666666666i666666666i6666665666656666i666i666666666666666KKKKKKKKKKKKKKKKKKKKJKKKJJJKKKKKKKJKJJJJJJJJKJJJJKKJKJJJJJJJJJHJHJHGGGGFGFFFFFDKKKKKKKKKKKKKKKKKKK+OOOOO+1+)4***43434*װͭ+&+&&&&+KKKKKKKKKKKKKKKKKKFFFFFGFFFFGFGGGGHGHGHGHHGHJGJHJHJHJHJJJHJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJC==========$$$=======!==========!!====!====$===========$=======$$==$$==$=$$===$=======!=======>================>=$=====$===>==============>A===>=====>>======C===>========>===>=A>====>>A====================>>=======>================>=============>=$$=>===================$==>===$=>========$$=>=>==$!$$$=$==$$====$======$$!==$$========$!========$=$$===!$!$!!$!$$!$=$!!=$=$!$=!!!!!!==!!!$!!!!!!$!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!! !!!!!!!!!!! !!!!!!!!! !!! !!!!       =pӷ6666666566i66666666666666666i666666666i66666668666i6666666666666666666666666666666i666666i66666666666666666666666666666666i666666666%%'((%%%%%%%%%%%'%%%%%&%%%%%%%%%%%% %%%%%&%%(i66666666i666i6666666666666666668i6i6666i666666666i6666666666666666666i6i6666i666 % % % % % % % %% % % % % 66666666666i6666666666i66666666666i6i66ii68i666666666666666666i666i66666666666i666666666666666666666666666666666666666KKKKKKKKKKKKKKKKKKKJJKKKJKJKKWKJJJKJKJJKJKJKJKJJJJJJJJJJJJJJJHJHGJGGGGFGFFFFFFKKKKKKKKKKKKKKKK+OOOOO++1**4**44343*Ͱ+&&&&&&+KKKKKKKKKKKKKKEFFFFFGGFGGGGGGHGHGJGHHJGHHJHJHJHJHJJJJHJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJm=!$!$$!$$$$!==!$$$$==!$!===============$$!$======$!===========!=C===@======>======>========$=====$===========>===>===>>=========>=>=========================>=====>=>C>==C=====A>=>========>>>C=======>=A==>>==>C=======>====>===>==========>>===========>===>====>A>=========$=====!=A======$===========$======$$==$==$==!======>=$!$==$==!$$==!=!=!===$!!==$=$!!!==$=!$==$!$!$!$$$$!!!=!$!==!=!!!$!!!!=!!$!!!!!!!!!!!!$!!!=!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!! !!!!     !! $sӳ6i666666566666666666666666666666666i8666666666666666666666666666666666666i6666666i6666666i66666666i666666666666668i66666666666i666666%%(%%%%%%%% %%'&%%%%'%%%%%% %%%%%%'%%%'%%%(566666666666666i6666666666666666666666666666666i6666666666666666666666686666666666% % % % % % % % % % % %% 66666i6666666i66i6i6666666666666666666666668666666666666666666666666i8666666666666666666666666666666666666666666666KKKKKKKKKKKKKKKKKKKKKJJJKKWKKKKJJKJJKJKJKJKJJJKJJJJJJJJJJJJJJJJJJJHJJGJGGGGGGFFFFFFKKKKKKKKKKKKKKKKKKK+4OOOO+11*4*1*43434*Ѧ+&&&&&&+KKKKKKKKKKKKKKKKKKFFFEFGFFFFFGFGGGGGGHGHGJGHGJHGJGHHJHJHJJHJJHJJJHJJJHJJJHJJJHJJJHJJJHJJJJJJJJJJJJJJJJJJJJJJJJo!!===!!!=$$!=$!$=$!===!===========$$====!!$====$=$$========$$==========>=A===>=====>==$==============>=>====>===>====A>>A=====>>>==========>=======>>>=>===C===>>=>>=>=>A=$=>==>=A>=A=======A=>=======>>>=>===CC>=>====>===A=======>>=$=>>=>====>==$=>====>======>C>$===!$=======>=$==>A===$====$$$================!$$=======>========$!!=!=!=$=$=$$====!!$$$$=!$=!$!!$===$=!!==!!$!!$!!$$====!!$!!!$=!!$$!!!!!!!!!!!$==!!!!!!!!!!! !!!!!!$!!! !!!!!!!!!! !!!!!!!!!  !! !     !!  ! =qӳ6666666666i6666666666666666666666666666i66666i66666666666666666666666666666666666666666866666666i66i666i66i66i66i6666666666666666666('%%%%%%%%'%(%%%%'%%&%%%%%%'%%%%%%%%%%%%(666666666i66666666666666666666666666666i5i6666666666i666i6666i6666666666i6666666 %%% %% % % % % % ((666666666666666656666666666666666666666i6i66666i6666666666666i666666666668i6i666666666666666666666i66666666666666666666KKKKKKKKKKKKKKKKKKKKKKJKKJKJJKKKKJJJKHHJJHJJKJJJJJKJJJJJJJJJHJHJGHGHGGGGFFGFFDKKKKKKKKKKKKKKKKKKK+OOOOO+11*)4)134443*ذ+&+&&&&+KKKKKKKKKKKKKKKKKKDFFGFFFGFGFGGGGHGHGHGHGHHHGJHJHJHJJHJHJJJJJHJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJo=!$$$===$======$===!======$$===$$=$$===========$$=$=========$====$==$======>===>===$=================>=>======>>====>>==========>===A==>==>=====>======>=>=$=C=====>=$===>===>===========>>====>>===>>>===========>==>==>>===>==>==$>>==>>===>======>========$==========>=$>===$!=======>===$=>===$==========================!==$!$======$$$!===$!$!===$==$!$$!=====$=!=!$!!==!!!$$=!$!=$=!!$!$=$!!=$!$$!!!$!!$$!$$!!!!!!!!!$$!!!!!!!!!!!!!!!!!!! ! !!!! !!!!!! !!!!!!! ! !!       =sӳ6i666i56666666666666666666666666i6666i8666666666666666666666666i66i6666566666666i666666i66666666666i66668666666666666666666666666666666%''%%%%%%%%'%%%'%'%%'%%%'%%%%%%%%%%%%%%66666666666666666666666666666666666i666666i66666i66666666i6i666i66666666i6i6666666666%%%% %%% % % % % % % % (666666666666i6666666666666666666666668i66665666i6666666i666666666666666666i666666666666666666i6666666i6666666666666666666KKKKKKKKKKKKKKKJJJJKKWKKJKKJJJKJKJJWKKJKJJJKJJJJJJJJJJJHJHGGGGGFGFFFFFFKKKKKKKKKKKKKKKKKK+4OOOO+11*4***344331ަ+&&&&&&+KKKKKKKKKKKKKKKEGFGFFFGGFGGGGGHGHGJGHJGHJHJHJHJHJHJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJso!$=!==========$!$=$!==========$$======$======!$==!==$======$===============>=================>========>===>>=>AA=>=>=>==========>=>=>===>>===>=>A>==>========>C>=>===$===>C===============>====>>==>=CA========>>>A====>==>=>>=>C>======>===>======>>>====>==>=====$=======A=$==$==$=================$=======$==============$$!!$!$$$$====$======!!$$=====$$!======$===!=!!==!!$!!$==$!$===!!!!$$!==$=!!!!!!!$!$==!!!$!!!!!=$!!!$!$!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!   !  ! =sӳ66666666666i666666i686666666666666i66666666666666666666666666666666666666i686666i8i6666ii666666666i6666666666i66666666666666666666666'(%%%%%%%%%%'%%%%%%%%%%%%%%%%%'%%%%%%%%6666666666666i6666i66666666666666i666666666666i666666665i66666i6i666666666666i6666666% % % % %%% % % % % % % % %%% % %5666666666i6ii6666666666666i666666i666665666666666666666i66666666666ii6666666666666i6666666668i666665i666666i6i66666666iKKKKKKKKKKKKKKKKKJJKKKKKKKJKJJKKJHKJKJKJJJKJJJKJJJJJJJJJJJJJJJJHJHJHGJGGGGFFFFFFFDKKKKKKKKKKKKKKKKKKK+O4OOO+11**4**43443*԰&&&+&&&+KKKKKKKKKKKKKKKKKKDFFFFFFFFFGFGGGGGGGHGHGHJGHGJGHJGJHJJHJHJHJJHJJJJJJJJJJJHJJJHJJJHJJJHJJJJJJJJJJJJJJJJJJJJJJo7=!!===$==!====!========$!========================$=========>===========$$=========C====>>>==>==================>========>>==========>=>===>====>=>=>>=====>===>===>==>==>==?==>====>>===>====>=>====>>===>=====>=>=========>==========>=============>=====$=A==>======>====>=====>===============$$=========$===A==$=$$=======$=====!$====>=!$==!$==$$$$==$!=$$$$=!!==$=$$=$$=!==!!!!$!==!!$=!!!==!!!$!!$=!!!!!!!!!!$!!!!!!!!!!!!!$!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!! !!!!!!  !!!   !     !=qӳ666666666666656666666666666666666666666i6i6666666666666566666666i665i666668i66666666666i6666666666666666666686666666666666666i666666665%%%%%'%'%'%%%%%%%%'%%%%%%%'%%%'%'%%'%%666666666656666666666665666666666656666656666666666i666666i8656666666i66666666i566( %% % % %% % % % %% % %% %% % 666i6666666i6656665666666566666666i666666666665i666666668i6666666666686666665666i6666666666866666666666666666666666666666KKKKKKKKKKKKKKKKKKJKKKKKJJKKJJHJKJKJKJJJKJJJJKJKJJJJJJJJJHJJHJHHGGGGGGFFFFEKKKKKKKKKKKKKKKKKKK+OO4OO+++*4)**44344*ذ++&&+&&+KKKKKKKKKKKKKKKKKKEEFFFFGFGFFGGGGGGGHGHGHGHGJHHJHHJHJJHJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJso==========$$$===9====$!!=$$=========$=====!$==========A==>=>=========$$===========>====CCA>========>============>>====>==A>========>>====>>===>C==>C==>===>>=>===>>>>>>====>>>=>========CC=>====C===>C==>CC>====>>==============>>>>=========>>===C>>>======CCA==========$===>==>>>====$===================$====>===!$!!=>======>===========$!!!==!==$!!!====$!!!$=!$==!!$$!!!=$!=====!$$$=$!!!!!!$$$!!=!$$!!!!!!!$!$$$$!!!=$$!$!!!!!!!$!!!!!!$!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ! !   !! !!qӳ666656666666666666666666666666666i5666666i6666666i6566666666i6666665666666666666665666566666686686666666666666566i66i666666656666666%'%%'%%'%%%'%%%'%%%'(%'%'%%%'%'%%%%%66656666i56666656666666666i666666566666666665656566666666656666666666i6666666666686%% %% %% %% %% % % % % % % % % %% % % %%666665656566666666666666666666i66666666665666666i66666666666666666666666666666565666666666666666666666666666i666i5666iKKKKKKKKKKKKKKJJJJKJKKJJKKKKKKJHKJJKJKJKJKJKJJJJJJJJJJJJHJHJGHGGGGFGFFFFFFKKKKKKKKKKKKKKK+O4OO4+111*4**43443*ݰװͭ+&&&&&&+KKKKKKKKKKKKKKKEEFFFFFFFFGGGGGGHGHGJGJGJHJGHJHJHJHJHJHJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJo$=!$===!=====!==========$$=====!===$============>=====>=$=>=======>>====>>===>=======A===>======>==>=>>====>>=======>====>====>=====>==>>=====>===>=======>====>======>=======>=>====A>====>>=>===>===?=======>====>==>==>====>>=====>>=======>A=$=>===========>=====>>=====>================================================$=$===$=======!===$===$$==$===!!$=====$$==!!=====!$$=$!$!!=$!!$=!!$=!!!!!!$$!$!!!!$!!!!$!!!!!!!!!!!$!!!!!!=!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!    !    !=sӳ656666i665666666666666666665665666666666666665666665i6i66668665656666666666666666666i66666666i666666666666666666666666666666666656666i8666(%%('%%'%'%'%%'%%'%%%%'%%%%%6556666i66666666666666666666666566666666666666666666666i6666666666666666666i666666i666666(% % %%%% % % % %% % % %% % % %% % % %% % i6666666666666666656666666666666i666666666656666666666666666666668666666866666566i6666666666666666656666666666i86666i86KKKKKKKKKKKKKKKKKKKJKKJKKKJJKKWKJKJKJKKJJJJJJJJJJJJJJJJJJJJJJHJJHJGHGGGGGFFFFFFDKKKKKKKKKKKKKKKKKKK+4OO4O+11)4*1*44434*԰+&+&&+&+KKKKKKKKKKKKKKKKKKFFFFFFFFFFFGGGGGGGHGHGHGHGJHGJGJHJHJHJJHJJHJJJJJHJJJHJJJHJJJHJJJHJJJJJJJJJJJJJJJJJJJJJJJJJJՏo=!=!$=!!$=!=$!$==============$=====!=====$=====>C=$=======>======>AA====>=>>>===>=>=>C>==========>=>=>A>==>AA>>==============>=>>>>>====A>=========>=>>==>>====CC>====>>>>=====>=====>A>====>=>===>===>A>====AA>>===>==>>======>>=====A>=C=====A================>>==>C>=====>===>==$$==>========$==>==$========$=>=>==========$!====$!!$==!=$!!!!====!=!!$==!!===>=!!$=====!!=$!!===$!!==!!!==$=$!!!=$!!$======$!!!!!!!!!$=!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!$!!! !!!!!!!  !!!!!!!! ! !    !  $qӳ6i6666566i66i6666666656i666666666666i6666666i6656i6566i8666666666668666666666666666668i6666665666666666666566656666666666666666666666666666565%%%%%'%%)%%%'%%%%%'%%%%66i66666666666666i6666668665666666666666666i6666666666666666666666666666666666666666666ii66( % %%%%% %% % % %% %% % % % % % %56% (666566666656i666i66666666i65i66666666666566666668656665666666666666666666666566666i666i665665668666i666665666666666KKKKKKKKKKKKKKKJKKKKJJKKJKKKJJKKWKJHKJHJJJKJKJJKJKJJJJKJJJJJHJJHJGGGGGGFFGFFFFKKKKKKKKKKKKKKKKKKK+O4OOO+11**4)*43444*ݰذЭ+&&&&&&+KKKKKKKKKKKKKKKKKKFFFFFFFGGFGFGGGGGHGHGHGJGHHHJHJHJHJJJHJJHJJJHJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJo==$=$==$===$=======$$9===$======================>=======================================>=>=======>=====>=>>====>>==>>====>>===>===>===>=>===>=>>====>>===>==>=>A===>===>>===>>=====>>=>==>>====>A====>C>>===>======>====>====>>=======>======>=>==========>>========>====>===>>=================>====$=$=========$====$$=====!========$!=============$$==!==$$$$=$!=!$=$=$==!==!=$$$=$!$!!=$!$!!$!!!$=!!$!!$!!!$!!!!!$!!$!!!!!!!!!!!!$$!!$=!!$!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!    =sӷi56666656666666666666666666666666666666666i6656i66666i66666666666i66666666666666666666666666665666666668666566666i666665666666666666666666566655%%%%'6%%'%%'%%%%%%6i666666666656666656666666666666666666666666666i66666666566666666666666666686666666i6i66666666566%%% % %%% %% %% % % %%% % %%%%% %%65(5666666i66666665666666666i866666686i666666666656666666566666665666i666666665666i86666i6666666i566666666566666666666i66KKKKKKKKKKKKKKJJKKJJJJJKKKJKJJJJJKJKJJJKJJJJJJJJJJJHJGHGGGGFGFFFFDKKKKKKKKKKKKKKKK+4O4OO+*1*4***44434*ް+&&&+&&+KKKKKKKKKKKKKKKEFFFGFFFFGFGGGGGHGHGJGJGHJGJHJHJHJJHJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJj!======!!==$$===========$!$======$==========$===9=$=>==========A>=====$$==>=====>===>======>==>>>=========>=>====A>>====>=>C>===>======A>=====>C>>>=======>>==>>>>=>>====>>>A>=C>==>>=>=====>>>>==>>C>==>=>>==>>>=======>CA>>>>=============>>====?==$=======>=$=>>>====>==C>>=>>==>====>====$====>>====$===========$====$========>========>>>=======>>=======!!$$$==$!!$==!===!!!!!$====$!!$===$!!!$!!!!!!!==$$==!!!!!!!!!!$!!!!!!$!!$!!!!!!!!!! !!!!!!!! !!!!! !!!!!!!!       !  =}ӳ6686666656666666666666666666666666666666i6665i666666666666666666666666666i866i56666666666566666666i6666666666666656666666566666666666666666666665%%%%665%%%%%%%%%%55666i66666666666566666666666665666566666666i66i666666666666665665666666666666666666866666666666%% % %% % % %%% %% %% % %%%6666666666666666666666666566ii8ii6666666668666666666i6666i656666666666666666666666656668686866666666666666666566666666666666KKKKKKKKKKKKKKKKKKKJJKKJJJKWKKKKKJKJKJJKJKJJJJKJKJJJJJJJJJJJJJJHJJHJGHGGGGGFFFFFEFFKKKKKKKKKKKKKKKKKKK+4O4O4+1+**4**44443*ѭͭ+&&+&&++KKKKKKKKKKKKKKKKKKEFFFFFFGFFGFGGGGGGGHGHGJGHJGHGJHJHJJHJHJJHJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJo=$===>=========$=====$==============================>===============>>=====>=====>===>==>==>===C===>===>=>=>=====>==>==>=>>====>C===>=>==>>===?=====>==>==>A===>=C=======>=>=>>A>=>>>===>=>=>===>==>>==>=>====>=>==>====A>==>=======>>==>>====>>===>===>=====C>$=C>=>=======>=>=====>===C======================================$=$=$========!==!$==$===$$$$==$$===!==$==!=$===$$$===!$====!!==9=!$!$!=!$$!==CYCYCZ@ZZZBBZZZCYCBBZZCYBBZZ@BBYBBCZZBBBBYBZ@@BZBBB@@ZBBB@B@BBB@BBB@B@BBB@@@CBBB@@B@@@@@B@@B@@@@@B@@@@@@@@@@@@@@@@@@@@@@@;@@@;@@@@@@@@@;@;;@@@@;;@;;;;@@;;;;;;@@@@;;;;@@;;@@;;@@;;@;@@@;@;@;;@@;;;;;@@@;;@@@@;;;;@@;;@@;;;;@@;;@@@;@;;;;@@@@@;;;;;@@;@;@;;@@!! !     wӳ66666666666666666666666666566666666i5i666666666666566666566666566i6686i66665i66i65666666665666i66666i66568666i5656566666i665666i66666666666666665(%(66665%'%(((((i86i56666666666i66666666i6i666566666i666666666666666566666666666666666666i66666666666686666666666i666%%% %% %%%% % % % % % % %% % 66666i66i66568i6666666665ii6666666666i8i666666666666666666666666666656666666666666666i666666566866656666666666666686666666KKKKKKKKKKKKKKKKJKKKKKKJKJJKKJJJJJJJJJJWKJKJKJJJJJJJJJJJHJHJHHGGGGGGFFFFEKKKKKKKKKKKKKKKKKKK+O4O4O+11*4)**4444P1װ++&&&&&+KKKKKKKKKKKKKKKKKKEFFFFFFFFFGFGGGGGGGHGHHGHGJGJHJHJHJHJHJJHJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJso=!$======!====$!===$$===>==$!===@==$=>>==========>======>====>=======A=======>====>=====>======>>=>=>===>=>=====>=>====>>A=====>>>>======ACC>=========>AC=>>=====>AC====>A==>=>CC>>C?==>>>>>==>>>>==>>=======>=====A>======>=>=>=>>>>CC>C=====>=====>>=>>=>>======>======$=>====$==>====>>>==>>========A=>>===============>=======$======$===$$====!!=!====$$=====$!$=====$==$!!==$$=!$=!=!!==!==!!!!$!ZƖx_Y!  !   =qӷ666666i5i6666i66666i66656666656666666566666666666666666666656666866i666i865666i6666666665666666565666666666666666666566666666i666656665666i666666666666(%%666666i8668666566i5668666i666i66666i66686866i66666i66566i66666666666666666656866666i666666666666666666i %% %%% % %% % % %%% %% % % %% 5666666666666666666666656i866666566666666i66656666566666866665656666666666666666666i6866666i666i6666666666666666666566i6KKKKKKKKKKKKKKKJKJJJKKKKKKKJJJJKJHKJKJKJJKJJKJJKJJJJJJJJJJJHGJGGGGFGFFFFFFKKKKKKKKKKKKKKKKK+4OOO++11*4*1P4O44*װͭ+&&&&+&+KKKKKKKKKKKKKKKEEFFFFFFGFGGGGGHGHGJGHHHJGHHJHJHJHJHJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJo==$======$=====$========================!=======>=======C=$=====$=======C>==>A=====A=>===>=====>=======>=====>===>>=======>=>>===>>=>====>>==>>=>=>>==>>=>===>==>=>C>>==>C=>>==>===>=>=?>====>>=>===>=>=>>>====>>>>>===>==>=>======>==>==>==>>==>>===C=====>=====>====A===$==>A===>=======A=====>======>============================$$====$==!=====$====>==!===$!===!===$$!=====!$==!$$!==!$$$==!$$=!!==!!$=x΅_B;   !! $sӳ66666666566ii6668666666666i666666656666666666666666666i66665665666666666666666666666666666666i666656666666655666666666666656666666566666666666656i666666i6666666666666686i666i666i666i656666666666666i66i8666666i6566666666566i66666i5i66666i66666666666656666666i666((%%%% % % %% %% %% % % %% %%% %%% 66566666666666i566666666666i6666i666686i666666666i666666666i56666666666i56686566666666666666666665666666666666666566666i666KKKKKKKKKKKKKKKKKKKJKJKKWKKKKJKJJKJKJJKJKJJJJJJJJJJJJJJJJHJGJHGGGGGFFFFFFDKKKKKKKKKKKKKKKKKKK+OO4O+11**1*444431ѭͭ+&&+&&&+KKKKKKKKKKKKKKKKKKFFFFFFFFGFFGFGGGGGGHGHGHGHGJHGJGHHJHJHJJJHJJHJJHJJJHJJJHJJJHJJJHJJJHJJJJJJJJJJJJJJJJJJJJJJJJl$$=$==$========!$==A>============>============>===>=>==>C==>=======>>===CA==>>=>>>=>===>==>=====>=>===========>=>>=>>===>==>AA>=>>>C>=>>======>>===>=>C===>=>=>=A>=CC>>>C>==========>===>====>>>==>>==>>>CC>===>CA>=>>>>>>>==>>>=>===>==>CCCC>=>A>C==>=====>>===>>=$=>=======>===>>>============>>====>=>========================$===$=$$==$$===$=$$=A====!!===$==$===!=$!$!===!!=$!!$=!!!$==!!!==$=======z˂@! qӳ666666656666666666i6666566666666666866i666666666566665656i6666666666666666666666666666666665i6666i66665666666666666666666566666566666666666666666566665666666i666i666666666666666i66i66666i6666666666666666666666i68668i6666666666656665666686668668666666i66666668655% % %%% % % %% % % % % % % %%%6668656666i6666666666666665666i666666666i68666666666666666666666666666566668566665666666666i66666666666656656666566666i666665KKKKKKKKKKKKKKKKKKKJKKKKKKKJKKJKKKJKKKKJKJHKJJJJJJJKJJJJJJJJJJJJJJHJHGHGGGGGFGFFFFFKKKKKKKKKKKKKKKKKKK+4O4O+111*4**44443*װ+&&&&&&+KKKKKKKKKKKKKKKKKKDFFFFFGFFGGGGGGGGHGHGHGJHHGJHJHJHJJHJHJJJJHJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJj=!========================================>===C===================>>=>$=A>==>=====>>=$==>>>====>=====A>>>====>=====>===>>==>>===>==>C==>=>==C=>=>>=>==>=>>====>=>=>>>=>C==>>=C=>==>====C>=>=>>>==>>==>>=>>>>=>==>=>>C>====C>==>>>>==>===>>=====>===C=>===>=====>=>=$=>>=>====>>===>==>=>====>============>=====>===================>=$=============$=>==$==$!====$!====$$$=$=====!=!===!!=$$=!$$$$!$$$$==$=xY!    !qӳ66i65665665656656665666666566666666666666566666666666666665666665666666666666566656666566666i866666666666666666566666668i6666666666i66666666866656i56666666568i66865666666666666656666666666666i666666666666666666666656666665666666666666666666i56666666i666666665666i(%%% %%%% % %%%%% % % %%%% %%%%(6666666656666666566666566666688666666666666i65666i666666666665666666666666666666866656666666565i6i5686666666666666666656i6666KKKKKKKKKKKKJKJKKKKJKWKKWKKKJJJJJKJKJKJJJJJJJJJJHJJGJGHGGGFGFFFFDKKKKKKKKKKKKKKKK+O4O4O+)+****44444*ذͰ+&+&&+&+KKKKKKKKKKKKKKFFFFFFFFFFGFGGGGGHGHHGJHHGJHJHHJHJJHJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJl=$=!$==============$===$$!$==>=$=====$$==>=>==>===>>============>=A=====>==>===$===========AA>>C===>>>ACACA>>=>>>=>>=>>>>>==>=>=====>>>===>=C>>>AC>>>>>>CC>>==l==>========CA=>C>>=====>>>=>C>>>==>>==>>==>=>>>=>=>=>>=====>C>=>==A>=>>===========>>>C>>>====>=>>>====CC=>CC>=A>>>===>>==>==>>==$===>========$$==>=====$$==$===========>>==========$$===$$!========$==$=!====$!=$===!$===$=$=!$$==!$$!!$$!$!xY !  ! =sӳ6666666565666i5666566666656666i6866666666666656i6856666666666666666666666866556666666665565668666666666666666666i6656686665666566666i656668666666666i656686i6656i6666i566666566566666665666665656i65666666666666666566666666866566566666i6666666666666666665i66665666665% %%% %%%%%%% % % %% %% %%% %% 6(6i86665666666556666665666666666656666685686666656666666666666566565i6666665666668i866666666666666666666566655666i66666656KKKKKKKKKKKKKKKKKKKKJKKKKKJKKKWKJJJKJKJKJKJJJJKJJJJJJJJJJJJJJJJHJJGJHGJGGGFFFFGFFFFKKKKKKKKKKKKKKKKKKK+OOO4+111*4**44444*ͮ+&&&&&&+KKKKKKKKKKKKKKKKKKDFFFFFGFFFGFGGGGGGGGJGGJGHHGJGHHJHJHJHJHJJJHJJJJJJJJJJJJHJJJHJJJHJJJHJJJJJJJJJJJJJJJJJJJJJJo=====================>=======A===>=>========>=======$=>=====>=====>>==>=>=>=>>===>=======>>>>=>A===>>===>>>>===>=>>=>>=>>=>>>===>==>>>=>>=A>=>==CA======>>>===A>=>=A==>>>=>=>=A=>==>>==>===>=>>==>>>===>>==>>A>==>>>=>>==@C>====>=>=CA=>==>C===>>>==>=>C====>=>>==>==>>==>A=>==>=>>====>A===>==============>=====>====$$=>===>=$=============$$>====$==========$=$!=$===$$$=$===!$$$===$=$!$==!!$$$$$!$$!!x;! ! 9qӳ666666666666656i566666666i6656666665665666666566666666666666665666666666665666665665666666666666666656666666i66665666i666666666i6666665666i66666566665666668666666666656666656656i666666566665665665666666565666566866666i5566i6i6666666666666665665666566665656656666666 % % % % %%%%% %%%%% %% % %%% %(66666666666665i666666666666666i86656666866666i666666666i65665i6866666666568i66666666666666565666666666656666666i66666666i66KKKKKKKKKKKKKJJKKJKKKKJJJKKHJHJJJJKJKJJJJJKJJJJJJJJHJJGJGHGGGGFFFEFEKKKKKKKKKKKKKKKKKKK+4OO+11****44444*װ++&&+&&+KKKKKKKKKKKKKKKKKKFFFFFFFGGFFGGGGHGHGHGHHGHHHHJHHJHJHJHJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJo========$====$=========!$====>>==>CAA>=>>=============>>C==CCA>>===>=========>>>>>==>>>>=>======>=======>>>=>>==>=====>>>===>=>>A====>===>>>=A>>>>ZCZ]xxz{x{zx{zz{{{x{{{{xx{{yx{z{{{xx{z{z{xz{xx{z{xxz{zxx{{{{xxxxxx{{{{{{xxyx{xx{{{xz{x{{{x{xz{xxzxy{{{xxxxzz{{{xzxxxz{xxxxxxxzxxxxz{{xxx{xxxz{xxxxx{xxzx{zxxxx{{zxxx{zxz{xxxxxxxxxxzz{zxxxzxxxxxxxx{zz{xxxxxxxxxxz{xxxxxxxxxxxzxx_xxxxxxxxxxxxxxxxxx_xxY  ! $p׷666566666666666666666666666668i6686656668665666666666666666666665656666666856666666666565656666566666666566565i566656866666566566566666666666668i66666i6566i5686666666i6566656666666668666666686666666666666666656666856566i6656666666565666666666666666666666i6666565 % %% %% %%%%% % %%%%%%%% %%( 6666668i66666656856i6665666666688666666666i6565666666666656666666666666666566666666656666656565i666666666666666666666i66656KKKKKKKKKKKKKKKKKKKKKKJJKJJKJKJJKJJKJJJJJKJKJJJJJJJJJJJHJHGHGGGGFGFFFFFFKKKKKKKKKKKKKKK+4O4O+11****44444*ح̰Ħ+&&&&&&+KKKKKKKKKKKKKKFFFFFFFFFFGGGGGGGHGJGHGJHHJGJHJHJHJJHJHJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJo=======!=============================>>=>=>===========>=>===>>=>=====>=>====>>=>==>>==>C=>====>>=>=====>>==>=>===>===>>C>==>>===>>=>=>>=C>=>=CuƔ_!   $qӳ656666666666666656666566666666666666666865866666666566666666i665i66666656666666666666i6666686665i6656666666666686666666666666666666666656666666668i86666666686666668i86666688666656566666566666666668666666666i666666666666666666566656666656666566656668666668656666655% %%%%%% %%%%% %% %% %% % % %%% %66656666666666566666686666665i66666666666666666668666666668666666666566666666866666566668665i66656666566666666656665666666666KKKKKKKKKKKKKKKKKJJJJKJKJJJKJKHJJJKJJJJJKJJJJJJJJJJJJJHJJGJHGGGGGFFGFFFDKKKKKKKKKKKKKKKKKKK+OOO+******44444*ذƭ+&+&&+&+KKKKKKKKKKKKKKKKKKDFFFFGFFFFGGGGGGGGHGHHGHGHGJGJHHJHJHJJHJJHJJJJJHJJJHJJJHJJJHJJJHJJJJJJJJJJJJJJJJJJJJJJJJJJ?=======$$=======>=======>==$$==$===$======>A=========>================>>>CA====>===>>==>====>>====>A>==>=>>=>>=>>>>====>A>A=>C>>>=>>===>AACxx$=$!$$!!!!==$!===!$$=!!!$=$=!!!!!!$!!!!$!!!!!!!!!!!!!! !!!!!!!!!!! !!!!! !!!!!!!!!!!!!! ! ! !   @!!!      q׳66666666866i666666666666866666666666i66665656666666i66666666666666666i866666866866666666i666666666666666666666666666656666668i66666666666i66666666666666566i6566666666666666666666665666665666666566666666666ii66666666666565668i866666i566( %%%% %%%% %% % %%%%%% %%%% % %% % 666666668666666666666666666i6566666666666666i666666666866666666666666666666666i666666668666666666866866666666666665KKKKKKKKKKKKKKKKKJJJKKKKJJKJJJKJKJKJJJKJKJJKJJKJJJJJJJJJHJHGJGGGGGFFFFFFFKKKKKKKKKKKKKKKKKKK+4O4O4+11****44444*ͭװ+&&+&&&+KKKKKKKKKKKKKKKKKKFFFFFFFFFGFGFGGGHGGHGJGHGJHHJGJHJHJHJJHJJJHJJHJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJ}j=========!=========>============$=====>====>>=====>===========?=====>>>>>A======>==>>=>===>=>>>>==>>>===>A>=>==AA==>=>>=>CC>=>=>>>=>=?C>ux==!!$$!$$!!$$!!!$!!$$=$!=$!!$$!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!! !! !!!!   !! ! !  #_! !qӳ66i6666666i8666666666666666666666665666666666666666666566666666i6666686666666666666666666668666i66666666666668666666666666666666668666666666666666666666686666666666666686666666566666666i6666666665i666666665666666i686i6666666666666666666866686i66( %%%%%% % %%% % %%% % % %%% % % %%6666ii666566666666666666566i6666i6666666666666666866666666666666666666666666i6665i66666666666i6666666656666666KKKKKKKKKKKKKKJJKKKWKKKKKKKJKKJJKJJJKJJKJKJJJJJJJJJJJJHJJGJGHGGGFGFFFFFKKKKKKKKKKKKKKKKK+42O4+++++++++++++++++++++++++++++++++++++++++++++++++11****44444*++++++0++++++++++0++++++++++++++++++++++++++++++++&&+&&+KKKKKKKKKKKKKKKFFFFFGFFFGFGGGGGGHGJGHGJGJHHJHJHJHJJHJJHJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJsj===$$$=========>=============>==============>A>===>===>====>==A==>==A=>>>=========>====>>>>===>CC>==>==>=CC>==>CC=>==>===CC>==>>>=====C]$=!!!=====$$$$!!!!!=$!$$!!!=!$!!!==!!!!$!!!!!!!!!!!!!!!!$!!!!!!!!!!!!!! !!!!!!!!!!!!!! !! ! _ !=q׳66i668666i6666666666666666i866668866666666666666666i666666666i86i6666666566656666666666666686666666666666666666666666686656656666656i666666666666666566666666656i6666666666666666666666666666665666i6i566666i68i66668666666i66665666i6i666666666(%(65%%%%%%% %%%% %%%% %% %%%%% %%% (666656656i6686666656i66665666666666666665666686656666666666666666665666666666666666666666666666566666666666866666666866668KKKKKKKKKKKKKKKKKKKKKJKJJKJJJHJJHKJKJKJJJKJJJJJJJJJJJJJJHJHJGHGGGGGFFFGFEFDKKKKKKKKKKKKKKKKKKK+OO4O4O4OOOO4OOOOOOOOOOOOOO2OOO24222222222222222022032*11**11**1***1*11*111*111111*11*11*11*111*111*11*1111*111******)***1*****)*****11*******)***)********************44444*+++++(++(++&++&0++&++&0&++&+&+&+&+&+&+&+&+&&+&+&&&++KKKKKKKKKKKKKKKKKKFFFFFFFFGFGFGGGGGGHGHGJGHGJGHGJHJHJHJHJJJJHJJJJJJJJJJJJJJJJJJJJJJJHJJJJJJJJJJJJJJJJJJJJJJJJo=$====================================>======>>====>==>>===>=>>===>>>>====>>==>=>>===>===?>>==>C>==>>>==>C>=>=>>=>>>>>=>>>>=>>>>>===C{]$=$!$==!===!!$!$!!!!!!$!$!!!!!!!!$$$=!$!!!!!!!!!!!!!!!!!!$!!!!!!!!!!!!!!!!!! !!!!! !!!!!!!!!! _  =qӳ68666i6668666656i6i66i6666666666666666666566666668656566666666656666i6656666666666666666666666666666666666666i6565666i6666666666666668666656556666666666666656666i668666656666i66666i88666566666666666666i666i666666666666666665666i886566666666666666665% %% % % % % % % %% % %% %%6666666666666666666666666666666666666666656666666665666i66666666666666566666666656666666656666666666666566666666i66i5666KKKKKKKKKKKKKKJJKKKKKKJJKKJKKJKJJJJJKWJJKJKJJKJJJJJJJJJJHJHGHGGGGFFFFFEKKKKKKKKKKKKKKKKKKK+4OO2O4O4OOOOOOOOOOOOOOOOOO2O2O2O2222222222222222031*14414444444444444444444444*+++0+++0+++0&++(+0&+&++&+&++&+&+&+&+&+&+&+&+&+&&+&+&&&+KKKKKKKKKKKKKKKKKKDFFFFFFFFGFGGGGHGHGHGJGHHGJHHJHJHJHJJJHJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJj$!$========>=$==$=======>A>===>=>?>======>====C=>=======>A====>=====>=====CA>C>==>>==>>>=======>==>A=>C>==>=>>========>>===>=>CC>>=u_===!!=$!!!=!!===!!=!!!!!!!!!!!!!!!!!!!=!!!=!!$!!!$!!!!!!!!!!!!!!!!!   Y =qӷ6666686666666666666666568666666i6666668666666666656666666665666666566666666666666666666666666666665666665666666666666i6i86656666666666666666666666666666666666668666666666666666666666666i86666i656665666665665666666666666666666686666666666666665666%%%%%% %%% %%%%%%% %% %(66866666666666i666666666666i6566666666656666656666666666666568i666668666656666666566566666666666666666566666666666666666i8KKKKKKKKKKKKKKKKJJKJKKWKKJJJKJJKJKJKJKJKJJJKJJJJJJJJJHJJHGJGGGGFGFFFEFEKKKKKKKKKKKKKKK+22O4OO4OOO4OOOOOOOOOOOOOOOOO2O2O2222222222222222220**411144444444444444444444*++++0++(++(+&0&+(++&0&+&0&+&0&+&+&+&+&+&&+&+&&&&+&&+KKKKKKKKKKKKKKDFFFFFFFGFGGGGGGHGHGJGHGJHHHJHJHJHJHJJJJHJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJ}m==============$$==============>==A=====>>========>>====>A>>===A>===>>>===>>>>>>==C==>C=====>===>>=>>>>>==>=?>==>>=>==>>>>>>==>>>A>xߖxx_xdz_x_____x_x_dx__xdx_x__dxdx____dx_dx___d_ZY@; ; !qӳ6566656666666666665666i66666666656666666566566666686666656666666566566666666666656666666666666666666666686665686656686666666i8666565666i666666666666566666668666666656656666i6665i8668668866665656666i666665666665865666666666666666666666666666666686666666666(%% % %%%% %%%%%% %%(65666666665666868666665666586666i56666i66i66665666565666666666666666866666666666666666666666665666668666686666666666666666666666KKKKKKKKKKKKKJJJKKKKKKJJKJKJKJKJJJJJJKJJJJJJJJJJJJJJHJJHJGJGGGGGFFFFFGFKKKKKKKKKKKKKKKKKKK+OOO4OO4O4OOOOOOOOOOOOOOOO2OOOO2O2422222222222220231*44444444444444444444444444444*++++++++++++++++&+++&+++&+&+&+&+&+&+&+&+&+&&+&+&+&&+&+&+KKKKKKKKKKKKKKKKKKFFFFFGFGFFGFGGGGGGHGGHGHGJGJGHHJHJHJHJJHJJHJJJHJJJHJJJHJJJHJJJHJJJJJJJJJJJJJJJJJJJJJJJJJJJJo==>=========$======$=====$=====$=>>====A>>====>>====>>==>==>==>>==>>====?==>>==>>>==CC>=ACCC>>>C==>=>>>>===>>>=CCC>>===>>?>=>>==>ǝ{xuxuuuuuuxuuuuuuxuxuuu]uuuxuuuuxuuu]uxuxuuxuxuuxuuu]uxuuuxuxuu]uxuuuxuuxuuxuuu]uuxvxuuuuuuuxuuxuuuuZuxuuu]uxuxuu]txu]uuZuxuuuuuZuu]u]uuZuuxuuu]u]uuuu]utZuZZuu]u]uuu]uu]uxutZZuxuZuuZZ]u]uZCZZ]uZ]uuZ]uZu]uuZZZuZ]ZuZZuuZZZZZZZZ]]uZZZ]uZZZZZZZZZZZZZ̖d@ ! [!!q׳66666666665666668666665668866666666666566666656566566666666666666566686666666666666665666666566666668868666668666i6666666656566686666666866686666666666666666665666556656686665566866666566666666656665i6666566666666666666566666666666666666666666i66666565666666565%%% 68%% %%% % % 66566666656565666666666566666666666666665666666666i65686566668665686666665656556666666666666666666i666666566666685665668868KKKKKKKKKKKKKKKKKKKKKKKKKKKJJKKKKKJJJKJHKJJJJJKJKJJJJJJJJJJJJHJHGHGGGGGFGFFFFFKKKKKKKKKKKKKKKKKKK+OOOOOOOOOOOOOOOOOOOOOOOOOOOOO042O2O22222222222222220**4444444444444444444Q4*++++++++++++++++++&+++&++&+++&+&+&+&+&+&+&+&+&+&&+&&+&&+KKKKKKKKKKKKKKKKKKEEFFFFFFFFGFGGGGHGHGHGHGJHHHHHJGJHJJHJHJJJJJHJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJo=======>===============>=========A>====>======>>>===>>=>>=>>===C==C>====>>=>===A==>>>A=>?CA>>>>>>>>>>>>>===>>==CC>>>=>=AC>=>>==C̛xC>>C>C>>>==>=>C>=>C==>>>C>>===?>C>=>=>=>=>>>>>>>>>>>>>>>=>>>>=>>?>=>>>>C>=>A>>>==>=>>=>>A>=>>>=>>>>>>>==>==>>====>>>===>>A>>>==>====>=====>>===>>=>==>>=>===========>=>>=====>>>===================================$=============$$===$==$$====$!=$======!!xÂ;BY  $qӳ66566565i6566668666566666666666666666665666666666666666666666666666666665666666666666666566566656666666666666666666666656665666668i6666666666666565666566666665666666666565666666566666666666566666656656666666686666666656666665666666666665666666666856%%%%666% %% % %%6666666666666666666666666656666666665666666658666666656666666666666666666666i666666686666666656666666665665666656666i666666666KKKKKKKKKKJKKKKWKKKKJKJJJJKJKJJJKJKJJKJJJJJJJJJHJJGJGHGGGFGFFFFEKKKKKKKKKKKKKKKKKK++++++++++++++++++++++++++++++OOOOO0O202020202020202022*Q*4444444444244444444424*++++++++++++++++++++++++++++++++++++++++++++++++++++++++KKKKKKKKKKKKKKKKKFEFFFFFFGFGGGGGHGHGHGJGJGJHJHJHJHJHJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJӟp============>>>=>==$===AA===>>===>>====>=>===>>====>=========>===>C>=>>>=>====>>>>>>==>==C=====>C>>=>>>=ACCC>==>C==>>>>===>CCACxCC>>>>==>>>C>=>>CC>=>CC>C>=CCC>==>>CC>CC?>>>C?=>=>=>>=>>>>A==>=>>>===>>>>>>>>=>>>>=>=>AC>=>===>>=>>=>=>C>=>lC>>>>>>>>>>=>=======>C====>>>C>>==>=========AA====>===>>>=>>=====>===========>>>>=>>==>=>=======>=========$$=======$====!=$$$=>=$$$=!$$$=$==$=!=$$xς;Y!  !   !  qӳ66666666666656666i56566666666656666665666666665666666666566665666i6665656666666666566666656i6666566666655666666666666666666686666666666666656665656655666566666665666566666686666666666656566666666566668i668666556666i8656566656565686666666656668566666666666665565665% %(( 666666666666666666656666i665i6666668656665666666566666666666566666666666666666656666666666566i666666686666666666566i665656666666KKKKKKKKKKKKKKKKKJJJKKKJKKWKJJKJJKJKJJJJJJJJJJJJJJJJJJJJJJJHHGJGGGFFFFGFFFFKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK++++++++++++++++++++++++++1+1+1+1+1+1+1+1+1**********1+1************1************1+111**********1+************1+11*********1+*************1+***********1+KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKEEEFFFFFGFFGFGGGGGGGHGJGHGJGJGHHJGJHJJHJHJHJJHJJJHJJJHJJJHJJJHJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJo===========>>>========>>>======>==>===>=>====A>===C===>====>=>>==>>=>>A>====>>>>>>>>====>>>==>>>>>=>>>>>>CCC>==>>=>CA==>=>>>>CuC>C>>>>===>>>>>>>>>>>?>>>>?>=CC>>=>C>?>>>CC>>>>C>==>=>>=>>>A?>>==>>>>==>C>>>=>>>>>=>>>>>>C=>=>>>>=>=>>>>=>>=>C>A>>>>>==>>====>=>A==>===>>>>>A====>====>==>>>>===>==>=>==>>>>======>===>=====>========>==>===============================!!$=====!$$=$$$====!$$==x΂!  _[=qӳ65666666666566666566666666666566866666656668666666666666i6866566666656568666666i566866656665666666666666666666566666666668666666656566656668i66i686665666666666656666666666666666666656666665666656666566566656666666666666666666666665656886666666666666656686666666686(%%8666656666666566656566556665666666656665666666666656666866i666666666565666566666666666665665686666666666666665656666665666KKKKKKKKKKKKKKKKKKJJKJKKJKKKJKKJJKJJKJKJKJJJJJJJJJJJJJJJHJGJGHGGGGFFFFFDKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKJKKKKKKKKKKJKKKKKJKKKKKKKKKJKJKKKKKJKJKKKKKKKKKJKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKEFFFGFFFFGFGGGGGGHGHGHGHJGHHHJHJHJHJHJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJo==========>======>=>=>====>====>A====CA====>==>==>>==>C>>C====CC>==>=>>>=>>==>====>>C>>=>>>=>>>=>===>====CC>>=>C>==>C>>A>>>>=x=>AC>>>>>C>>CA>=>>>>=>=>>>>=>>>C>=>>=>CCC>=>A>>=>>>>=>>>>>>>=>CCA>>CCCC>=>?CCC>>C>C>>>>>>>CC>=>=>C=>>>=>=>=>===>>=>=>=>=>===>==>>CC==>CC=>>===>>>>==>===A>>=>>>>====>=>=========>>=======>=====$=$==========================>>>=!=====>======$==!===$$!==!=$$===$=x@     =}ӳ666666665665666866666666656666686666668666656665665666666666665666666666665666666668666666666666566686665666666565666665665666666666666666666866i66665656i6665666566566666665i66i6666665666566666866666665666566656566666666566665656666666666666566685686865666666666666666666668666666566i66665666668666866656666666666566666i6866665668688i6666666i6666665666666656666566668666666685665656666668i66666666656KKKKKKKKKKKJJJJKJJJJJKKJKJJKJJJKJJKJKJJJJJJJHJJHHGGGGGFGFFFFFKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKFFFFFFFFGFGFGGGGHGHHGHGJGHHJHJHJHJHJJJHJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJm==>========>=$====>=>==========>>====C>====>=>=>>>>==>==C>==>>CC====>>>>>>>=>>==>>=>C>>>>=>=>>>==>>==>>=>CC=>>>>>==C>=?CC>==zC=C>>>>>C>>C>>>>>=>>>C==>C>>==>=>C==>A>=AAC>=>>C>>>>C=>A>>>>>>=>lA>AC>?>>>>>?>?C???A?>=>>>>>C>>>==C>==>>>>===>==>=>>=C==>>=>==>==C>A>=>>C>=>==>==CA===>=>=>>==>>>=>===C>=>==>>===>>=>=====>=>==>================>=========$========$==========$$==$===9=!==!=====!$!xZ![   =q6666666586666666666665665656666566666666666656666655666666656866666656666666865666666656666666656666666566656666666666666666666656666656656668666665666666656656666i666i6656568666566666666686656666666566666i56666666666566666666866586665666666666i666666666566666666666686668666666666666666665666666665666865666566566566666686666666666666665666665866666666665666666656666666666666666666665i6666666666666566KKKKKKKKKKKKKKKKKKKKKKKKKKKKJKKKJKJKJKJKJKJJJKJJJKJJJJJJJJJJJJJJHJJGJGHGGGFGFGFFEEFKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKFFFFFFFFFFGFGGGGGGGHGHGJGJGHHJGJHJHJHJJHJJHJJJJJJJJJJJJJJJJJJJJJJJJHJJJJJJJJJJJJJJJJJJJJJJJo====>=========>A>>===>AC=====>>A>=>==CA=>==>==>=>=>>===>>===>=>>=C>>>====>==CC=>AC===>==>>>=>>==>CC>>>>==>>>>>>>CC=?C>=>C>=uCCCCC>>=>CC===>>>C>C>>>>=CC>C>>==>C>=CCC>>>>=>>=>A==>>>=>CCCC>>=>>==>>>=>>>>=>>>>>>=>CC>>>>>==>=C>>>C>>CCCC>>>>==>>=>=>C=>>>>CA>>=>>>=>==>====>CC==>>=>>>>>C>========>=>>=>>====C=====>==>=>====CA====>>>=======>=!$==========$$=====$$==$==========!======$!$=======x  !@! !q656656666666566i6666666666666656665666666666666666666666686866666556566556656666666866566665656666666666666666666666666566686666566666666666666666666666666i56665665666566686885666i66668i666665666666666568666566566666666656666666666656666666666656666666866i666566566656666566666666666666656666565666666666666666666666i56666666665666665666566666688665666666665666666566666656666566666666668656668665666568566666KKKKKKKKKKKKKKKKKKKKKKKKJKKKJKJKKJJJKJJJKJJJKJJJJJJJJJJHJJJHJHJGHGGGFFFFFFEKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKEFEFFFFGFGGGGGGHGHGJGHGHHJHHHHJGJHJJHJJHJJJHJJJJJJJJJJJJHJJHJJJHJJJJJJHJJJJJHJJJJJJJJJJHJJo=>===>===$=====CAA===A>A>====>=>>=>==>>=>=>===>====>>==>==C=>>==>A>>==>====>C>>>>>====>=>==>>>=>>=>C>>>>>>>>>C>>C>>>>>=>>>CxCACCC>=>>>>>>=>>>ACC>C=>>>>>?>>A>>>=>>?l?>>>>=>>>>?=>=>>=>CCl>A?=>=>>A>==>C>==>>=>>==>ACC>C>==>>>>>>>>?>?>>>>C>>>=>>=>>=>=>>A=?>>>>==>>==>>====>C>=>>==>=>>>>>====>==>======C>==>>>=>===>===>>===>>====A>=======>==================$$=!=>=!=====$===$!=======!!====!==x !  !9qi66666666666656565666566665666566i666566666566668666666656666655566665666656665666666666656566666565656686666666686686656666566665665666666686665666666665665656666666666665666656656666656666665656666666i66666656666565666656665666565666666666666665666666665656566665i65666655666666i66866656566665666666i866686665666666666666656666666i666656666566666666666565656566i665666666666666666656666666666656565JJJJKJJJJJJJJJJJJJJJJJJJJJJKJJJJJJJJJJJJJKJJJJJJJJJJJHJJHJJHJHJHJHJHJHJHJHJHJHJHJHHJHHJGHHJHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHGHHHHHFHHHFHGTFHGTFHFHFGGHFHFGFGFFFFFFDFKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKFFEFDFFFFFFGFGFFGFFFFGFGHFGFGFGFGGHFHGFHFHGFHFFHFHFGHFGHFHFTo=====>=>===>>========================>=>=====CC==>===>>==>C>=>=>>>>>===>C>>>=>=>>?>CA>>>C=>=>CC>>>=CC>=>>>>=>>>>>=>A>>=AC>xC>>>>>>>=>>>>>>>?>==>>C?=>>>=>>>CCCC>>>>CC>>>?=>C>CC>>>=>>>>>>>=>CCCCC>C?=>CC>CCC=>>C>>==CC>>==CC>=>C>=>>=>>>>C>>>>>>>CA>C>>C>>>==>>==>>>>>>=>C>=>>>=>>>>>=>=>ACC===>>>>>C>>=====>====>====>==>>====>>==>=======>==>==>A=======>=========A=$======!$=========$==$!==!==x;_  =s5668686655656666666665565666656666566666665566666666566666666666666866686666686666566656566656656668666666666656i566i6668656656566666665666666656686566686666666666666666666656666i66656i6i66566668666666566685666666566656656566665666666566665668666666566656566566666668566566566665668666565666656668666656666666668566656666566565666566566656666665666666656666i666566666566666666666566566565666566686866    HHHHHHHHGHHHHHGHHHHHHHHHHHHHHHHHGHHHHHHHHHHHHHHHHHGHHHHHHHHHHHHHHHHHHHHHHHHHHGHHHHHHHHHHHGHHHHHHHHGHHHHHGHHHHHHHHHHHHHHHHHHHHGHHHHHHHHHHHGHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHGHHHHHHHHHHHGHHHHHHHHGHHHHHGHHHHHHHHHHHHHHHHHHHHHGHHHHHHHHHHHHHHHHHHHHHHHHHGHHHHHHHHHHHHHHHHHHHHHHHHHHH     l=====>=>>==>===>=============>===>===========CC==>>=>===>>C==>>>=>>>==>>>>>=====>A?>>>>>>=>=?C>>>=>>C>>>>==>>>>==>CCC=>?>CC>>>>>>>>>>>>>?C>>>>=>=>C>>C==>CCl>>?>>>>CC>>??=>CC>>>>>>>>C>=>>>>CCCC>>>>>>C>>>C>C>>>?>>=CC>===CC==AC>=>>>>C>>>>>?C>=>=>lC>>=??>=>=>>>=>>CA>=>C>=>>>>=>>>C>==>CA>>>=>=>>ACC==>=>====>==>===>=>======>==>==>============>=>======>==>=========!=====$=========!$=!==$$==xY! !  qTTTTTTT66666886665666665665666656666568666665665656556686666866666566666666656668656666666666666566665666666666656665666666666i56666868666i6666586666666665686566656666685666566666668666665i6665665666656666566666686666656i6566666666666666666586566666656686666665i86666586565656666666866566666656666666665666666668665665866666666566566i66666656668686668665666566666568656866656566686566656668668666666565668666668       l=====>====>=========>C>==>A>==>==>>=>>>>>>>==>l===C>>>=A>>>>>=>>==>==>C>=>CCCCC>>>=>>>C=>>>==>>>>?CC>==>C=>>>AC>>C>>>>=>>C>>==>>>>>C>>>=>?>=>C>>>>>CCC>=>C>C>>C>>>>=>=>C?=>lC>=>>>?>>>C?>>>>>>>>>>>=>CCC=>>>>>=>?>=>>>>>>>>C==CC>>>>A>=>AC>=>C>>>>=>=>>>=>>=>=>CC==C=>C>>=>>>==>=>?>>>=>====>A>===>=>>=====>==>C=============>>======C========>==>==>===$=====C======================$==$!=====!$=z;@ $q"T"TTTT"TTTTTTTTTTT666566666666668i66656666656656666566656656666665656665656666666566665666686566666566666566i66666666666666666666686i66666666666666656i666656656656666666566666666568666686665656665666668656666665666665666686666666666656656666666666666i6666666666666666666i6666666666665666666666666i665665666656666665666666666666666656686666666666666666566666566666666666666866666666       m=========>==========>A>==A>==>===>>>A>>==CC==>A==>C>=>>>A==>>>=>==>==>>>>>CCC>C>>=>>>>>>>C>==>>=>>C>>>>C>>>>>>>>>>>>>>>>tC>C>>>>>C>=>C?=>>>>>>CC>>>>>CC>>=>CC>?CC>=>>>>>>>=>CC=>C>>>>>>>?>C>>>>>>>>>=>>C>>>>>>>>>>A>>>>>>>>>>>>>>>>=>C>==C>>=>C>>C>>>>=>C>====>>>>=>C=>CC>==>==>>>?C>=>?=====>>>>===>=>=>======>C>======>>====>====>=>A========C=>>===>====>====>$=============$$==$=====$======!=={!;!qTT668666566666666665666666666866665i6i6666666668666665666665666666656566666666566666666666656866666565668666665666568i6665666566656665666866666666666i8666666666656666566666666666666666656666666566666666666666666666686666866666i8866668666566566565666666668666666566566666666866566665666656666666666666865666656666655666666666666666666566656666666666666666656665666566666666666566   o==>=====>====>>====>==>==>>===>>>==A>>>==CC===>>=>C>=>>=>>=>?=>=>=CC>===>=>>=>=>>>>C>===>C>>AC>>>=>>>CC>>>>>>C>>>>>>>>>>u=>CC>>>>>>=>CCCC>>CAC>>C>>>>>>>CC>>>>>>CCAC>>>C>>>=?C>>>CCCCC>>C>>>CCCC>?>>?>>>>>>>>>>>>>>?>>>>?CCC>>>=>>>>>=C>=>CA=>>>>=CCC>>=>>=C?>A>>C>=>=CC=>>>?=>>>==>>==>C>===>>>A>=>====>>>>>==AC==>>>==A==>=>C==>C====>==>>==>========>=>=>====$!=>=======!====$=========$$=======xx ! !   $pTTTT""TT""TT""TTT""TT"TT"TT"TT6656566666665666668666666666i866i666666866666566856666668566566666665665666666666666666i666656666666865666566666666i8556666666668666666666666686656686666666666656666666665666665666566665666666656665666656666866666666666666666866666656666666666665656565i656665656668i66666i56666565656666656666666688886666666665666666666666666665666666666666866656666666i665686i8i66566666"T     o===>========>==>=>>>>>==>==>===>===>>>>=>AC===>>>>>====>>>=>>==>=>CC=>>>=>C>==>>=>>C>>==>C>>CA>==>>>>CC>=>?CC>>>>==>>>>tA=>>>>C>>C>>>>Cll>>>C>>?C>=>>>>>CCC>>>>>CCCC>>>C>>==>C?>CCCCC?>C>>CCCCCCC>>?>>>=>>>C>=>=>>>>?C>>>??>>>>>>=?>=>C?>>?>=>>A=>CCC>==>>CC>C==CC>===>=>C>A>>===C==>=>>>>>>>>>>>>>=====A>>>==>>==>>>>==>==>=CC>>>=>>====>>====>=======A======>=====================$$!=====!==$===x ! @ !q8686666656666666666665656665666686686i6566666666666666566666i666666566665666666666666666i65656666666656666665668666866666666i6656656666666666566666666668666666566666566666666i6666665666656656666668666666666666i565666665566668666666666665666666666666866666566666666656666i5665666666666666666666666666666566666666666666665666565666566666666666i666666566666688656866666666TTT"TT  TTTT""TTTT""TT""TT""TTT""TT""TT""TTTTTT""TT""TTT""TTTTTT""TT""TT""TT""T  q==>=>A==>=>===>======>>>===>>>>=>==>>====>>=>>=>>>CC>>>>>>>=>C>>>A>>>AC>>=>C>=>>>=AC>>>=>>>>>C>>CC>>>?>=>>C>>>>?C>>>C>>{u>CC>>>>>>CCCC>>CC=>>?>>?>>>C?>AC>>?>>>>>=>CC>C>>CC>>C>A>>>>>>CCC==>>>>C?>>>>>>>>>CCCC>>C>CC>>AC>>>?CCA?A?==>>>>>>>>>>>>>=>C>A>>>=>C>>>==?>>A>>>=C>>>>>>=ACC=>=====>>>====>>>>=>>A=>>>====>=>>>=>>>====>=>>=====>============>==============>=======A=$====>======$======$!$z !  $}66666666666656556666656666666656566666656666666666666666656656666566666666668666665i66666656666656686666666666665666665666686666666666566666568666656666665666668665666566656i6665666666565656666666666666666665666668666666i656666666666666668566666i66666655656666666566666666686886666656666666665666666666566666666666656666566666666666666666666566666665666566565566666666666656666T:TTM""TT  TTTTM""TTTTM""TM""TM"TTTTM""TM""TM"TTTTT"TM""TM"TTTTM""TT"TT"TM""TM""TM""TM"T  q===>>>>>==>>===>=====>>===>A>==>>>>=========C>=>>=>C>>=>>=>=>C>>=?C>=CC>===?>>>C=>CC>>>>CC=>>CC>CC>=>C>=>C>>>>>C>A>>>A>CC>CC>>>>>CC>CC>>>>>>>>=>?>>CC>>C>>C>>>>>>>>?>CC???>CC>C>??>>>>?>>>>>?C>>CC>>>>>>>>CC?>CCCC?=>>CCA?CCCC>>>>>>C>>>>=>>>?=>>?C>C>=>>C>=>>=>==CCC>>>>C>=>>>>>lC=>>===>>===>>>===>=>A>=>>=>>====>>=>==>>===>=>=============>====A===========>>====>=====>====================!$$z; =}TTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTT66656666656666665665666656686666656665666665666665666666666i66666565666556686i66666566656i666656665566565666666666565656i66655665666666656666666566666666666666666666656565656656656666656665665665666666666556556i56666666656656656565656666666656665686666i556556566666656i56658665685665666666665566686666566666656666656665666666656666665666666565666568866566665666656666TT""T"TTTTTTTTTTTTT"TTT"TTTTTTTT"TTTTTTTT"TTTTTTTT"TTTTTTTTTTTTTTTT p==>========>==>=>AA>A>>=>==>>=>=>=>==CC>>>>>>==>>=>=>C=>?CC>>>>C==>>>==>>>C>>=CC>=A>>>>=>>>=>C>>>?>==CC>>>>>=>>CC>C>>CuuC>>>>CC>>>>>>>>>>?CC>?=>??C>>C>>>CCC=>>?C>C?>>>>>>?>>>>>>C>>>>>>>>>>>>>>>>CCClCC?>=>>>=>CCCC=>C>?>>>>>>CCC>>>C>=>CCC>>>==>=C>>>=C>>=>C>CC>=C>=>>>>>>===>>=>>>>AA=>C>>>=>CC==>=>>>?>===CC==>>=>>>>=>C>====>=>==>==>==>>===>=>=$=>>===>=====$=======$=====$===================x!!  =qTTT:TT:TT:TT:TT:TT:TT:TT:TT:TT:TT:TT:TT:TT:TTTT:TTTT:TTTTT"TT:TT65655665665656666656566656666666656665656666566666666666686565566666666556688566i6666686666665666666665665665656666666i666566566566668665666666568666566666656666665566566566656i5665666665665666665666666665666666866665655666666666866656565668866666666566656666666565655668866866i566665565655i6666666656666666666656666566656656665685666566666666666666665566566"T""TTTTTT T"TTTT""TT"TTT""TT""TT"""TTTT""TT""TT"""TTTT""TT""TT"""TTTT""TT""TT""TT""TT""TT""TT"""T" ӏo=>>=>>====>=>>==>CC>>A>=>>>>>==>=>=>>>CC?C>>>>=>>=>=>>>>>CC>=>>>=>>>===>>>CC>>>CC>>>>C>>>=>>>=>>>=>>=>>C>>>>>>CC>>>>>C{CCC>>>?>?C>>=>?>>>CC>?>>>??>=C?>=?CC>=?>>CCCC>>?>>=???C>>CC>>>>=?C>>CC>>>>>>ClCCCC>=>>>>>??CC>>>C>>>>C>=?CCC>>C>=>C>>>=>>=>>>>>>>C>>>>>>CC>=>=>>>>>C>>=>==>>>C>>C>A>>=>>>>==>>=>>>>>>>>?>>>>====A>>>====>=>>>==>==>>>>>===>>===$>>=====>============$==========$$=====$$=====x[   pTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTT856666666665886666565665656566666666566666666665586665666565566666566566i56656566656666666i666666566666666666666666666655658i5666666666i666556656566665666566565666865666666566i6666666666566866666656666656566665866566668655666686586688666666666666666665i565666666656686656866666666666666656666666566656665666665666566666565i6565565666666565686656566666666665666665656666666656TTTTTTTTTTTTTTTTTT"TTTTTT"TT"TT"TTTTTTTTTTTTTTTTTTTTTTTT l>>===>==>>===>===>====>=>==>==>>>>>=>>====>===>>A>>===>>=>>C=>>>==CCCC>>>>>C>>>=>>>>>C>=>>CC>>>>>>>>?>>>C>>>>>>>?CC>=A{>?>>?>CCClC>CC>>>C>>CCl>?CC>=>C?>?CCCCC?>>>>?>>>?C=>C>CC>>>CCC>=CC>>Cl>>>?>>?>>>>C?>?lC>>=>>>=>C>>>C>>C>>>>=>>>>>CCCA>=>lCC>>>>>>>=>C>>=>>>>C>>>=>>A>>>>C=>>>C>>>==>CA>>>=>>>>>C?===>=>===>>>>A>>>>==>>>>>==>>====>>==>====>=>===A=====A======>====$=>===========A==!$=======x#Y!!!=qXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXbXXXXXXXXXXbXXbXX66666656666666665656666i86666566666665566565666i6665666556666556666565i8666666i66666666566666665665665655566666666566566666i6665665666i665666655666656656666666665666666666656566556666665656665666i686666666866866665666665666666666556686566566i666566666666686666686666665656666666666666686556666565666566686566656565665666668666666866666666666666656656666666668666665656666TTTTTTTTTTTT"":TT"T"TTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTo>>==>===>=====>=>========>==>=>CCC?=>=>===>===AC>>>=>=>===>>=CC>=>lCCA>=C>CC>C>>>==C>>>>>>CCC>=>>>>>>>=>>>>>>>=>CCC>>Cu>>>=C?ClCCCCCC?=>lC>>lC>?CCC>>CCCACCCCC>>>>>>?>>CC>>C>>C>>CCCCC=>>CCCCC>>>>>>C>=>?CCClC?>=>?>=>>>>?CC>>>>>>>C>>>>CC>>C>CCCCC>>>>>>>>C>==>>=CCC===>>>>CACC>>>=?>>>=>>>>>>======>CC>====>==>>=>C>>A>>=>>C>>===?>=====>=>======>=>===A>=======>===>================A============x@@ !  ! =sӷ666665i656666686866i6556666686666666656866666665666666666666566666666666666665666566655665666556566656666665i5666666666656665665665666i5665666666666666666566666666666666656566666566665665666666556665665665666666668666866666656666666565666666666666586656566665666666556658i6666665666665686666666866666655666666666i66665565566565666666i86565666666566566666668655i686665666566666TTTTTTTTTTTTTTTTTTT:TTTTTT"T"T"T"TTTTTTTT""T""T"T""""""TT""T":TTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTM so=>===>>>===>>>>==>==>>>>>>=>>====>>==>>==>A==>C>>>=>>=C?>=>>=>?>==CA=>>=>>>C>>>>>>CC>>>??>>=>>CACC??>CC>>>>CC>C>>>>>CuC??>>>>>C>=>CCA>>>CC=>CC>>>>>ClC>C>?>>CCCC>CC>?=CC>>>CCC??>Cl>?>CC>CC>>>CCC>>CC>>>C?C>C>>>>>Cl?>CC>>?C>>>>?CCC>>>C>C>>>=>>>CC>>C?>>>>CC=>CC>>>C>>?>>=>>>>>>>>>>>=>C>>>>>>C=>>>>>A=>>>>>>=>?C>==>=>==>=>>>>>==>====>>===>>=>>>======>===>>>======C>======>====>============$$==z @Y !=sӳ6666666566666666666566666666666656656666566665656685668688666856666555665655666665665666566566666666686566566566666666665666566566566666666666566568655566566665655665666666656666665666656666566666668668668656666656666666656666566666566666666665666666666665665656666666665666665666665655668i8668666565656666685656666566656565566i665688666656686565666666666666656666656TTXTTXTTXTTXTTTVTXTXTXTVTXTTTTUTTTTTTVTTTTTTTTTTXTTUTTTTVTUTVTTUTTVTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTT"T:T"TTTTTTTTTTTTTT"TT"TTTTT"TTTTTT"TTTTTT"TTTTTT"T"TTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTT:TTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTT:TT:TT:TT:TT:TTso>>==CC>====>>>===>>=>A>===>CC====>==>>==>>>>>>>>=>>>>=>C>>>>>>=>>>==>>==>>>>>>>=>?CC>>>>C>>=>CCC>>CCCCC>>CC>?CC?>>>>?u>>CCCC>>>>=>>>>>>>>>>>>>>>?>>?lCCC>>>CCCC>>??C>>CC>>>CCCC>>?C>>?CC??C>=>?CCC>>>>>C>CCC>A>C>>lC>>CC?>>CCC>>?CC?>>>>C>>>>=>>=?C>>>A?C>=CA>>CCC>>>??>>==>>>=>A>>>>==CC>===>>>C>=>>>=>>C>>>>>>>>>====>===>>>>>>>=====>>>>>===>C>>=======>==CC====>=>>>>===============$==A========z;Y !! $sӳ6666568666666556666666656666665666686665666655566656665856668866665666666566665666656686566i666656566866568566666656666666665i65668656565i8666666666686665566666686666865568656566665666666666666666665668666666656666666566666656665i55666655566666665656566556556666866656666666566656666665666566656586666666566666566666666866666565656666666666665666i556656666656686665666658XXXXXXXXXXXXXXXXXXXXXXXXXX^XXbXbXbVbXX^X^XX^XXXXXXXbVbVXXXXXXXXXXXXXXXXXXWXXXXXXXXWXXXXXXXXXXXXXXXXXXXVXXVXXVXVXXXVXVXVXVXVVVVVVVVXVXXX:VVXXXVXTVVXTXUXVVX:XTVVVVXUXXTXTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTXTXTXTXTXTXTXTXTXTXXTXXTXXTXXTXXTX}j=>===>==>>==>=>=>>=>=C>>===C>>>>=>A>>=>CC>>>>>=>=>>>>?=>>>C>C>=>CC=>lC=>C?>>>>>>AC>C>>>>>>>>>C>C?>>CCC>>>CC>>?C>>C?>>z>C>>C>>>lC>>>?>>>>CC>??>>>CC=>C>CCC>>C?>?=CCClC?>>C>?C>C?>>C?>>C??CCC>>???C???>?C>>>??C>?C=>CC>>CC>CC>CC>?CC>>>>>>>?>C>>>CCC>>C>>C>>>C>>>>>C>>=CC>>C>>C>=>>>>>CC>>CC>>>=>>>C>>>>==>>>>==>A>>=>>=>?==>>>>===>>=>>=>>==>>=>========>>=C===>=========C>=======>=$==>=============x!;Z! q׳6666666666666656566565666566668665655666666666856666666686656666666666656566666566666566866656656665686566666666666666666565666586686666565656666666666i6666566666666656666666566666666866665i65i6566666866668666866566865666668666656566666566666668566665656666666666666666666566656556566666656666656686666566666i66866566666665686656i665666666666565666i5i666665656666655665666KKKKKKKKKKKJJJKKKWKKJJKKWJKJKJKJJKJKJKJJJJKJJJJJJJJHJHJGJGGGGFGFFFFFFTXWXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXbXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXHFFFFFFGGFGGGGGGHGHGJGHGJHHJGHJHJJHJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJӏm=========>>>===>>=>=>>==>=>>>?C>>>>==>CC>?CC>===>CC>C?>>C>CC>>>CCC>>CC>>CCC=>>=>CA>?C>C=>>>CCCC>C>>>?>>>?CC>>?>C>?C>>{{>>>>>>ClCCC>CC>>>>>CCC?>>>C?>>C>ClC>>>>?>ClCCCC?>=?CC>>?C??>>>?C>>ClCC?C>?>>CCCC>>>>>?>>>>>>>>>>>>ClCC>>>>CC>A>>>=>CA>>=CCCC>>CC>?>CCC>>>>C>>>>AC>>CC>>>C>>>>CCCC=>>ACC?>==>>>>==>C=====>>>=>>==A>>=?>====>A>>A>>?>=>>=>======>==C>=>C>======>==$==>>===$========>=========$$$x@!Y  qӳ86666856666666656666666686656668666656668665666666666666656666666666666656666666656666i65666666666656556656865666668i666865655666666668666665566666665686i5686566666666865566666656666666566i666566566685665665656666666665666656666668666656656666656666656656866656656566866566666665666668665866666686656866666566665665666666656666KKKKKKKKKKKKKKKKKJKKJKKKKKJJKJJJKJJJKJKJJJJJJJJJJJJJJHJJHJGHGGGFGFFFFFFFTXXXXWXWXWXWXWXWXWXWXWXWXWXWXWXWXWXWXWXWXWXWXWXWXWXWXWXWXWXWXWXWXWXWXWXWXWXWXWXWXWXWXWXWXWXWXWXWXWXWXWXWXWXWXWXWXWXWXWXWXWXWXWXWXWXWXWXWXWXWXWXWXWXWXWXWXWXWXWXWXWXWXWXWXWXWXWXWXWXWXWXWXWXWXWXWXWXWXWXWXWXWXWXWXWXWXWXWXWXWXWXWXWXWXWXWXWXWXWXWXWXWXWXWXWXWXWXWXWXWXWXWXWXWXWXWXWXXXXFFFFGFFFFFGFGGGGGGHGHGHGJGHGJGJGJHJHJHJJHJJHJJHJJJHJJJHJJJHJJJHJJJHJJJJJJJJJJJJJJJJJJJJJJJJo>==>==>>==>>=>>A>>===>>=>>===A>>>>>>>C?==A>>C==>>Cl>>>=>>>>>>>>>>C>>>C=>>>>>CC==>>>>CC>>>>>CCC?>>>>CC>C?>C>>>>>>>CC>>u>>C>>>?>>?>CCC>CCCC?C?>?C>Cl>=??CC?C?>>C>>>>>CClC=?l?>>CCCC>>?>CCC?>C??>CCC>>C>??CCC>>>CCC?CC>>?>>CC?>>C>=CACCA>>>CC>>>>>CC>?=>?>>>>>>CC>>?>C>=>>>>>C>=Cl=>>>>?>>>=>>=C>>>>>>=>>>>>C=>>>>>==CC>==C>==>>==>>>>>>==>===>===>A=>====>C===>==>====>>=====>====>============>=====$x_;Z $p׳66686656666656666656566666666666656866565655656666656666565686566656666866656666i6665665566566656668656656656666666866666866686666656666668866566866565666565665566665666566665566665666565688656666666566656666668665666656666865656685666656866668668668568666886666656665666656656656656666666666666665665656866565i686566665868666686KKKKKKKKKKJKJJKKKKKWKKKJKKJJJJJJHJJJJKJJKJJJJJJJJJJHJHJHGGHGGGGFFGFFFDKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKFDFFFFFFGFGFGGGGGGHGHGHGJHHHJHJHJHJHJHJHJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJo===>==>>>>==>CC>>>>>>>>>>>>==>>>>>>A>>=>>>>=>>>>>CCC>>=>CC>>=C?>>CC>>>>>==?C>>>=>>>>>>>C?=>?>>CCC>>>CCCCC>>>>==>C?>>?Z>>>CC>=>>=>CC?>CCCl>>?CCC??l?>>CC>?CC>>CC?>=llCCCCClC?CllCCCC>>CCCCC>?>>CC?>>>C?>>?>>=?CC>CC>>>>>?C>=>?C>>>CCCCCC>Cl>>>>?CC?>>>>>>>>>>CC>>>>CC>>>==>C=>C?>>>>>C>=>=>>>=CCC>==>>C>>C>CCC>AC>>>A>=>A>==>==>>==>>==>>>>==>>=CA>>=>==AC>=>>==C>===CA====>=>===>>==========>C==$$==z@Y $pӳ6566666556656666656666656856666656666866666666656665666666666666566686565666666656668666666666666666666665666i66665i668665666666666666566686665666666668665666666866666668666665666658666668658665666666655656666666566686866666666666566666665656665668666666666566566656686686556656665566665i866866668686666586666666566666666666KKKKKKKKKKKKKKKKJJJKKJJJKJKJKJJKJKJKJJKJJJJJJJJJJHJJHHGGGGGGGFFFFFKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKFFFGFFFGGFGGGGHGHHGJGJGJGJHHJHJHJJHJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJp>>>>====>C>=>C>>=>>===>A>A>=>>=>>>>=>>>>>>>>=>C>>>>>=>>>l>>>>>>>C>>>>>>>>>Cl>>>>>>>>>>CC>>?C>>>>>>?>>>>>>CCCC>>CC?CCCuCC>ClC>>C?CC>>>>?CCC>?CCCCCC>>CC?>C>CCClACC>>CC>>>>C?>CCC?CCC>=?CCC>>>??C?CC?ClCCC>???C??>CC?CCC>>Cl>>CCC?>?>>CC>>CCCC>>>?>>>>>=>C>>>>>>??>>>>C>C>>>C>>>=>>>=>C>>>>>C?==C>>>>>CC=>=>>>>>>>==>>=>>>>>>>>=>>>==>>====C>=>==>>>>=>===>>==>=>===$=C======>=>======================x;Z  !!=sӳ6566666556656668666666666556566566665665i666665686655566688656566566666666i56666665656685666668865656586666566668566558558656566656666666656666i666566866656566666686666686666666566665666866666666868866666565666666666568665566668656666666666666566656665665666666666666566568666666665668666665666666666556685666666666668656666KKKKKKKKKKKKKKJKKKKKJKJJJJKJKJJJJKJJJKJJJJJJJJJJJJJJHJJGJGJGGGGGFFFFFFFKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKDFFFFFFFFFGFGGGGGGGHGHGHGJGJHGHHJHJHJHJJHJJHJJJJJJJJJJJJHJJJHJJJHJJJHJJJJJJJJJJJJJJJJJJJJJJo?>CC>>==CCC>>>===>>====>>>>>?>=CC>>=>>>C>=>==>>>===>=C?CC>>>=>=>C>>C==C>=>CC>C>=>CCC>=>?=>CCC>>>>>C>>>>>>CCCC>>ClC?CCulC>llClCCC?>>?>C>>lCC?CCCCC>ClC>>>?C>>lCC?CCC>>>>>>>>C>C>>CCC>>>CCC>>>???CCC?CllCCCCCC?>>CCClCCC>>?CCCCCC?>>>>?>>>>C??>>>>>CC>=>CCC?>>>>>>===>>Cl>>>CCC==>=>>>C=>CC>>>>=>>>>C>AC>>>>?>==>>>>>>>>>>=>C>===>=>==>===>>C>=>>C>===C>======>===>>====>>=====>>>===>================z@Y  qӳ86668666666566666666666666656586666556686666666866666656666666586565555665666556665666665666866665666666666656666556565658666665666666665666i66i665668666665666668656566866865566665566666656666565666666555665666766856666686566666866665666566666586656866666666656566866666666666666565658666666666665666656656668666866665666666665656666566666KKKKKKKKKKKKKKKKKKKJKKJKJJKWKKKJKJJJJWKJJJJKJJKJJJJJJJJJHJHJGHGGGFGFFFFFFEKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKFFFFFFFGFGFFGGGGGGGHGHHGHGHJHHJHJHJHJHJJHJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJso==>>>>===>>>>=>>>=>=>>>>>>>>>>=>>>>==>>>>>C=>>C>C>>>=>>>>>C?=>>>C>>>>>CC>>CC>>>>C>Cl?=CC?>AC>=>lC??>>C?>??C>>?CCC>>CClC?>>>ClCCC>>C>C>>>CCCCCC>C>>Cl>>>>ClC>Cl>>?C?C?>C?C?>CC?C>>CC>>CCCC>>CCC>CC>>?CCCC??CC>AlC?CCC>>?>CCCC>>CC?>>>>?CCC?Cl>>>>>>C>CCC>>CCC>>CCC>>CCCC>=C>Cl>>>>>>>CC>>?>>>C>>C>>>>>>>>=>>?>=>=>>>>>=>C>>>>>>>==>>>>==CA==>=A>>C====>>=====>=>===>===>=========>>==========$$======z@Y =}׳666686666568566656666665666i66565566856i6666656686i586666666656666565666666666665666656i5556565666666665656566688586566665666686686666666688665656666666568666656i666666566666666666686665666666666666666656666566666688666656666656668666666666666658856666566665656685i565656666666666666856666686566666586666665666658666665566566668566866KKKKKKKKKJJJKKKKJJJJJKJJJKJKJKJKJKJJJJJJJJJJJHJJHJGGGGGGGFGFFFFFKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKDFFFFFFFFGGGGGGHGHGJGJGJHHJGJHJHJHJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJso==>==>====>>A>>C>==>C>=>>>>>>==>>>=>>>>=>>>>>CCCCC?C>>>>>=>CC>==C>=>>>>CC>>C?>=?l>>C>>lC>>>>=>CC>>C>>>>>>?>>>>CCC>CCClC>>>>>CCC>>ClC>>>>>ClCCCClCCllCC>?Cll>>C>>>?C?CCCClCCCCCC>>>???C>>>CllCCC>>>>>>>>>CCC?>CC>>>>>>>>CCC>>=>ClC>??CCClCCCC??C?>>>?C>>>CCC>>>>>?CCCCC?>C>>ClC>C>=>>CC>>?CCA>>>CC>=>=>>>>>CC>>>>>>=>=>>>>===>C>>>>===>AC>=>==>==>=>>==>>=>>>==A>===C====>>==>=>=>>===========!======z;Y!!  !!=sӳ56566666586665666666565686666686i6686556666566865565666665656666666656656666665566556565666666668566666666666666656666865666666666666665665666666666566688666566668666666666i66668666658666566686688666566666886566566666665666656665686865566668656566666666666666666686566i566566566666666666866566656666666686668666666666i666656566665666KKKKKKKKKKKKKKKKKKJKJKKKKJKJKKHJJJJKJJJJJJJJJJJJJJJJJJJJJJHJGJGGGGGFFFFFFDKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKDFFFFFFFFFFGGGGGGGHGHGHGJGGJGJGJHJHJHJHJJJHJJJJJHJJJHJJJHJJJHJJJHJJJJJJJJJJJJJJJJJJJJJJJJJJp>===>A>=>>>>==>>>==C>>>=>>>>>>>==>>C>>>>>?C>=>?>?>>>>>>>C>=>C>>>CC=>CC>>?>>>CC?>CCCCCA>CC>>>??CCC???C>>CC??>>>>C>>>CCC>CCCCC>?lC>>lC>?C?>>CC>>CC?>?CCC?>CCCCClC>CC>>?CC??CC?>CCCC>???CC>>Cl?>CC>>?>CCC?CCCCC?CCC>>>>?>CClCCC>>ll>>>?>>?CC>??C??CC?>CC>>>?CC>>CC>>CC>>>>CC>>>?>>>lAC>>>=>>>A>CC>>CC>>>=>>>>>>>>>>>>>=>?==>C>=>>>=>=>>>=>>>=>==>>>>==CC>====>>=>>>>====>==>===A=======>===============x;Z! !qӳ6566566656666566666868665i666566566666686666566686665656666658666666i666656666566665656666666665866i655566666666666666566665666556665856i666656866655665686656556566666655656666666666656685656i5566665686655566666656666666666866666686665686666665666686666866666666685666665565666668666666666666676866656656666KKKKKKKKKKKKKKKJJKKKWKKKJJHKJJKJJKJKJKJJJKJJJJJJJJHJHJHHGJGGGFGFFFFFFFKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKFFFFFFFGGFGFGGGGGHGHGHHHGJHHJHHJHJHJJHJHJJJJHJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJo====>==>C>=>>>=>>=>>>>>>====>>C>=>CCC>>>>C>=>>>=>>>====>C>=>>CCClCCllC==>C>>ClC>CCCC>?CCC>>CCCClC?>ClCCCCC>>?C>>?>>>>uClllllCCll>>lClCCl??lC>>??>>C>?lC????lllCCC?>>C?C>>>C>>>ClCCClCC?>>?C?>??>>CCCllCCCCC>>>?C?>>C?>>>lCCCC>CCCCCCCCClCC>>?>?CCC>CC=>??>>>>?>C>>>>>=>>lC>>==>?CClC>>>>>>>CCC>=>>?CC?>>>>>>>>CA>>>>>>>>CCCCA>=>>>C>>>=>>>=>>CCA>=>C>=>======A>=========>==>>==>====>C======>>======x ;Z!   pӷ68666656656656556666655666666665565586666868666i68666665666666666565555666666665656555555668666686665566566565656655i66565566856656665666866666658656665666665666565666i66686566566656565568666566568586656866666665665665655665666656666666666656656666666866568666666666656666658666666655668668666665556556666865686866566666566556666666565666KKKKKKKKKKKKKKJJJKKKKKJKKKKKKKJKJJJJJKJKJJJKJJJJJJJJHJJHJGHGGGGGGFFFFFKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKDFFFGFFFFGFGGGGGHGHGJGJGJHHJHHJHJHJJHJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJo=>>>>=>>>A>=>>>=>>>=>>>>>>>>>>>>>>>>>>>>>CC>=?C>=>C>=>>AC>=>>>C???>?CC=>CC>>Cl?=CCCCC?>??>CCC>CCC>>CC>>CC????C>lC>>ACC>CC??CCC>C?CCClCCC>>lC>>CC>>?>CCCCC?CCCCClC>CCCCC>?CC??>?lCCC?>Cl?>C?CC???>?CCCClCCCCC????C?>??CCC?C>>C??>Cl>>?>CCCC?>C>>?C>ClC>>lC>>CC>>lC>>>>C>Cl>C>>>>>>?C?=>C>>>>>CC>>=>>>CC>>>>>>>>AC>=>>>>>?>>>>>=>>>A>>=>=>>==>>A?=>==A=>=>===>=>>===>=======>=>====>===>===>=======>==z !Y!9qӳ55666666686566656566566565665666i668666668656555665656665668565665666666556558865558656656688668668666665566666666566656656688666655666566665665665668i58666656665666665656665556666566655666666686666665i5656666565566565686868686656565586665856565668665555i65866668656665i6686665666865666666566565566686666666866568586856866668656656666566566655KKKKKKKKKKKKKKJJJKKJKKWKJHKJHJJJJKJKJJJJJJJJJJJJJJHJJHJGHGGGGGFFFFFFFFKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKEFFFFFFGFFGFGGGGGGGHGHGHGJGHHJGJHJGJJHJJJHJJJJJJJJJJJJJJJJJJJJJJJJHJJJJJJJJJJJJJJJJJJJJJJJJm=?>==>C>>>====>=>>=>==>?>>C>===>CA>>C>>==>C>>>C>=>C>CA>lol>>>>C>>>=>>CCCC>=>>>>=>???>>>>??CC?>?>>>C??>?>>ClCCCCCC>ClClCA>>>C>>>>>CC?CCCC>>CllClC>>>>C>?C>?>>>>Cl>>ll>>llCCCClC>C?>>>C?CCCllllC?>>>CC?>?CC?ClCCClllC?CClCCC>>>CCCllC>>CCC>C>>?>>>>CCC>>>CC>Cll>ClllC>CCClCCC>CC>>=>CCC?>CC>>>>>>>>>CCA>>>>>>?>=>>>>=?ACC>===>=>CCC>==>=>===>>>==>====>>===>====>=>>AC>C====>==>======>>=============>{@Y  !!$sӳ56558665666666566665656865656568666665656666666666665666658666666666665666666666566666568665686666686556558566556566568666566566665886685556566555658868865666656686688666666865i5665656666556655668i566666556656666655655566666666565656666656566665866566666i5566686666565866566665568i5656866565666666566865866666668656665665658666655655656666KKKKKKKKKKKKKJKKKKJJJKKJKJJJHJJJJJJJJJJKJJJJJJJJJJJJHJGJGHGGGFGFFFFFDKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKEFFFFFFFFFGFGGGGHGHGHGHGJHGJHJHJHJHJJHJJHJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJo>?==>>>>>=>C>==>>>>>=>=A>>A==>>?>>>>>>>>>A>?>>>>>>>?>>>Cl>>?=>C>?C>>>>CC>>CC>>>>>?>>?>???CC?CC>>?CC>?lC>>ll>>C?ll?>??lC>>??CC?CC>ClC?C>C>>AClCCC???C?>Cl?C?C>>ClCCCCC>Cll>CCC??CCCCCC>>CCCCCC?>A>ClCC>>CCCCC>?CCCCCC??C????C?CC????>CCC?CCC>?CCCCCC>>CC>?>>lC>?C?Cl>???C>>>CC>>>>>??>?>>C?>>>>C>>>C>C>>>>>>>>>>>>>>>>>>C>>>>=>>C?=>?>==C?==>>=>==>>=>==>=>>>>===>>==>==>==C===>===>==A>===>==>===>==z;Y !qӷ8666666556858686666666655656666666865655686565566855566866865666666666655666566668665668666685i68668i6866556565566656666656666686666666666665686666856556866566666656566666i6666566666655666666568666666866665566556666668655566666655655568566666556666566666566656656i65665666566656666866586666658566666665656566668688666566585KKKKKKKKKKKKKKKJJKKJKKJJJJKJKKJKJJKJJKJJJKJJJJJJJJJJJHJHHGHGGGGFFGFFFFKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKEEFFFFFGGFGGGGGGHGHGJGHHGJHHJHJHJHJHJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJm=?>>==>==>>>=>CCCCCCC>>CCC>>>>>A>>CC>>CCCCCCC>>=>>?CCC>CC>>C=>>>>>>>>>C>>CCC>?ClCCCCC?>C??>C>>CCll?>Cll>>?>>>>>ClC>>?lC>?CC>??C>>>?>?>>>CllCCCllCCCC>?lllC>Cl>ClllllC?>?CC?>?>?CClCCCC>??CCCClCllllCCC>>CC>>?>>>>>??>>?CC>CCC?>?CC>>ClCC>?>>CllllC>>CCC>>>ClC>==CCC?>CC>>>>??>>CCCC>>>>CllC>=?CCCC>=>CCA>=>>>>>>=?>==>>CCC>==>>>==>CC>CC>==>>==>>>?C>==A>>>CA==>===>======>C===C>=A=======>==>==>===z@Y! !  !qӳ665686566865655868655666855656666666666568665656666666666i6866566686566668668666655686666668666666566666686865865566666568666666555666656665656656566686655666i66666666656666566665665656668666866656665666656566666658666856656665666666656666566565665656666665665556668655686655556586668656565656666656656568666666566KKKKKKKKKKKKKKKKKKKKKKKKKKKHHJKJJKJKJJJKJJJJJJJJJJJJJJHJHJHHGGGGGGFFFFFFFKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKFFFFFFFFFFGFGGGGGGHGHGHGJGHJGHHJHJHJHJHJHJJHJJHJJJHJJJHJJJHJJJHJJJJJJJJJJJJJJJJJJJJJJJJJJJJՏp=>>>>==>==>>>>>>>=>CC=>=>C>>>>>C>>?>>>CCC>>CC>>>>>>>>?>?C>C?>>C>=>C>CCC>>CC??CCC>>?CCC?>?>CCC>?CCC?>>CCC>??CCCCCC>>??lCCCCC?>CCCCC>ACC>>ClCCC?CCC>ll?CC?CCCCC?ClClC?CCC>?lC>C?C>?ll?CCCCCCC>>CCClCCC>?lCC?>?CCCCCC?CCC>C?>Cl??>>lC>>CCCC??>>?CCCCl?>C>?C??CC?CC>>???>Cl>?>>CC?C?>C>AC>>>lC>>>>C>>>>>CC>>>>>>>>CC>>>=>=?CCC>==>>>>=>C>>>>>>=>>==AC=>>>>=>?==AA>A===C===>=>=A>==>>=>>====>=======>====z!Z    =qӳ688i66666685666666565666665666866668566666686665i8866566655666666656656666866668666566666868565666666566686i66666666656665566566866568666668666865666868856656566666666666566i5668668656666566866656656886686666686656868656665686566685665i8665566656666668668686866566556655666666668668665668666666655668KKKKKKKKKKKKKKKKKKKKKJKWKKKWKKJKKJKJJJJJKWJJJJJKJJJJJJJJJJHJHJGJGGHGGFGFFFFDKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKDFFFFFFFGGFGGGGHGHGHGHGHHHGJHJGJHJHJJHJJJJHJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJq?>=?>>>CCCClC==>=>>C>>C>>>CCC>>>>>===C>>>>>ACC?CCCCCC>=>ClC>>CCCCCl>C>>CC?>???>C?>=>>?CCCCClC?????C?>>>>CCCllllC>>CC>lClCCC>?CCCC?CllC?CC?>>CCC?>Cll?>>>>>CCC>CC>???ll?>Cll???CCCll??Cll?>>>>>>C??CCClC>ll>>lllC>>>>AlCACCCC>>>>>>>>??>CCC>>C?>>?llC>>C>>>=>>>lC?>>>>CC??>>?lll?>CC>>?=>>>>>=>??>>>?lCC=>C>=>>llCC>>C>===>>>CA>A>==>>===>==>C>=CA===CC==>==>CA>>=>>===C==>>===>=====>==>============z@Y  ! !  qӳ6666886566666666665i666666686665665666866686566666866656866666666565666566686666666866566566668666666666686866556566656686666866666656666i66665656666666566666666666665668666686656i65666866666686656686666866686666666666666665i86556666i656666566665666666686668668666665686666686685868666i5666666658KKKKKKKKKKKKJJKJKKJKKKKKKKJJJJKJKJKJKJJKJJJJJJJJJJJJGJGHGGGGGGFFFFFFKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKFFFFFFGFFGFGGGGGGHGHGJGJGHHJHJHJHJHJHJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJp>=>=>=>>>>CC?=>>>=>>>C>>>>>>A>>>>>>>=>>>>>>CC>>CCCCCC>=>CC=>CCCCCC>CCC>?>C>CC>CCC>CCCC?>C?ClC>?C??CCC>???CCCCCC>>Cl>>C?CCCCCCCCC?ClCCC?C?CC?llCC>?CCCC?>CCCl?>Cl?>C??C?CC?CCC?C?Cll?>CCC??CC?CCCCC?lCCCC>CCCClCC>>lCCCC>llCC>>CC>>CCCl>>Cl?>C??CC>?lC>CCCCC?C>CCC>>?CC?CC>>??CCCCC>>>>>>>>C>>>lC>>>>CC?>>>>>?CCCC>>>>>>>>>>>AC>>>>=C>==C>==>>>>>>===>>?====>l==>=>C==>C>==>===A>========>===>=======z;Y!9qӳ66565i66666666666555666565i686866656666556666686666665656666666566668686856666656656666666566666i666555666666666665656686686665656666666666668668668566568666866666656665666886666665i666565i55i66666666565666668i566666666565686665666665586656566866866686866666665668656665866666556866656656666KKKKKKKKKKKKKKKKJJJKKKKKJJKJKJHJJJJJJJJJJJJJJJJJJJJJJJHJHJHJGHGGGGFFFFFFFDKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKEFFFFFFFFGFGFGGGGGGHGHGJGGHGJGHJGJHJJHJHJJJHJJJJHJJJHJJJHJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJՏp=?=>>>>===>>==>C>====>>=>>>>>CCCCCC>CC>>>>>?>>>C>>>>CCCCC>=?C?>>?>>CCC>CC>>>>>>>>CCC>>?>>?ll?CC?CClC??CC?CC>>>lllllCCuA>?CCC?>CCCCC?????>>>Cll>?CC?>?CCCllloC?ll>>>>CClC>>>Cl?>>>?C>>>?ClllCC>>>??>?Clll??llC?CCClllll?>CC?llCCCCllClllC>CC??ClC>>>CC?>?lllC>>>>C>CC>?>ClCCC>>>>>>?C>>>CCClC>>ACC>>=>>>CCCC>>>=>===>>CCC>>=>=>>>C>CC=>>CC?CC=>ACCC>>==>>>>==C=========>==>=======C>=A>>=>=>==>>====={ @Y    !!! ! $qӳ668666685668666565686568868686668665866665866686558658568666666865565656666656666658666656666i66665655656655666565565865666686665656666686656686568866656566876665666665656656666855656866668666588565656666555566665865655665865686566666i585666665656565666666565665655666686666656866566665556866766668KKKKKKKKKKKKJJJJJJKKWKJKJKJJJJKJKKJJJJJJKJJJJJJJJHJHJGJGHGGGGGFFFFFFKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKFFFFFFFFGFFGGGGGGGHGHGJGHHJGJHHJHJHJJHJHJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJo?>>=>>>=>C>=>>>>>A>=>C>>>>>>>>>>>CCC>>>C>>>>>CCC>CCA>?CC>?>?C>?>CC>C>>?>CC>>??A>AlCC>>C???C?ClCCCCCC?>ClCCC>>CCClC?CClCCCC??>ClC?C??lC?C>??CCC?Cll>>Cl?CC>loC?C?C?CCClCCCCCCl>>lCCC>??CCl??lCC>>?>>ClllC>?CCCCCCCC?Cll?>CC>Cll?>ClC>CCllC>CCC?ClC>?>CCCCCCCCC>>C?CC?C>>ClCCCC>>>>>CC?>>CCCCC>>>CCC>>??>?C?CC>>>>>=>>>>CC>=>>>>>=>C>>>>>>>>>>>??>>CC>==>>=>>>>>>>==C====>@===>===>A=ACZuxz;Z qӳ56866i5666686865686868666856666665686666685656866656668866665665665665666685655668666656566566558665665666666686665668656665665665568666686566866568665665666566666556686665556686666586566556856656666666856566668666666865586658686666566865866666668868668655656586556865666655656685666866KKKKKKKKKKKKJJJJKJKJJKJJKJKJJKJJJKJJKJJJJJJJJJJJJJJHJGGGGGGFGGFFFFDKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKDFFFFFGFFGFGGGGHGHGHHGJGHHJHJHHJJHJHJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJ}p?C==CC>>C>=>CCCC>>>>CC>>AC>>>>C>=>>>>>>>C?C?>>>>=CC>>>C??C>>>>>CllCC>CCCClCCCC>>ll?ClC>>>>>=?lC>>C>CCC>>>CCCCCCCC?>lCCC??>?lllllC??CllCl?lC>CC?CllCCllC>>>ClCCCClCllClCCCCllC>?lllllllC?lC>CllllCC>>??CC>CCC??C?>>>>?>?lllC>?C?ClC>>C?CC?CC??CCC>CCCllC>?>?Cl>>>>CCC>>>CC=>>>>>?>>>>ClC>>>CCCC>>===>>C>>>>>>>CC>>CC>?>>>>>>ClCC>>>>>CC>=C>>C?>=>=CC>CA===>CA=>===ACCCC=Cu{;[ !!     =pӳ6668686666865656666668656668686586666656568666686668666656666655656656656656665865865666565665656566656565658565688686656656666665558666686686668665656666556666666566565686656586666565558665658666668665566566656666i6556686568566656865655556565686666866685586668666666668666666565666666856566566656666KKKKKKKKKKKKJJKJJKKKJKJKJJJJJJJJKJJJJJJJJJJJJJJJJJHJGJGHGGGGFGFFFFFFKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKFFFFFFFFFFFGFGGGGGGHGGHGHGJGHHGJHHJHJJHJHJHJJHJJJJJJJJJJJJJJHJJJHJJJHJJJJJJJJJJJJJJJJJJJJJJJso?C=>>>>>>>>C>=Cl>>>>>C>>>A>>>>C=>CC>>??C>>CC>>>>>Cl?>>CCCC>>??>?CCCCC??>Cl?CCC>>CC?>ll?>??>>>CC?CCC>ClC??>?lC??CC?CC?l>CC?>CllClCC>ClCCCClCCCCllCCCCClCCClCClCCCCCCCClC>C>CCCCClllCClCCCCC>ClCCC?C?ACC>ClClC>ClC?>>>??CCCCll?CC?CCCCCCC>CCCCClC>ClCCCCCC?C?ll>>CC?Cll>>C>CC>>CCC>>>C>CC?>ClC>>CA>>>=CC??>>CC>>C>>C>>>>>>>>>>?C>>>>>>C>>>>>>CC==>>>>>>>>==?C>===u;Z =sӳ58686666866865668666568666866866666666666665566656868665556866566665665665565866656668586865686656666665656868686666866566568565686565656566665i66686656568565666665655658656665866666656555686556685666566666666866665668656866866665566676666556565566665586865566686656865665656665866855666665KKKKKKKKKKKKKKKKKKKKKKKKJKJKJKKJKKJKJJJJKJJJJKJJJKJJJJJJJJHJHJHGHGGGGFFFFFFFFDKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKFFFFFFGFFGFGGGGGGHGHJGHGJGHJGJHJHJHJHJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJm>>>>>>>=AAC>>=>C>=>>>CC>=>CA>>>>>lC>>>C>>>>>>ClC>>?=>>=>>>>?lCCCC>>>>C?CCC>?>CC?>?>>ClCClllClC>>?CC?>ClClC>CCC??Cl>>>CCClC?CCCC>?C?>llC?>>?>CCCC>>??CCCCC?>>>??lC>>ClllClCll>C>C>>CllCC????ClClCCClllCClllCC>CllllCC?>>>>?lC?CCC??Cl>>>ClCCC?C>>>lA>>>>>CC>>>>>CCl>?llCClll>>CC>CC?>>>>>>=?>>?lllCCllC>>==>CC>>CC?>>>CCllC>==>>>>>>>=>>====>==>C>==>>=>?CxƝƛ  @Y  !    =ӷ5666666656666556656658665665666856686656686656868656886866686665666868666666666666568656665665666866656566666568656666865568665686866568665i66666685866868666566666866868665656686656665566665666685666586656665656656665656665658656856686666665666656686686558665666866666668686566686688656656686666KKKKKKKKKKKKKKKKKKKJKKKKKKKJKKKKJJKJJJJJJKJJJKJJJJJJJJJJHJJHJHJGHGGGGGFFFFFFFKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKFFFFFFFFGFGFGGGGGHGHHGHHJHJHHJHJJHJJHJJJHJJJHJJJHJJJHJJJHJJJJJJJJJJJJJJJHJJJJJJJJJJJJJJJJJJJp>=>>CC>>>C>>>>CC>=>C?=>C?CCCC>?CCCCC?>?C>>>>CCCCC>>>>>=>CC>?CClCl>>?>>CC>>CC??Cl>>>>CCClCCCCCC>>?CC>>CCClC?>ClC?CCC>?lClCCCCCCCC>CCCClC>>?CCllCC>>CClCCl>>>>C?ClC>CClllClCCl?CCC>CCCCCCCC??C>llC>CCllC>llllClCCCCCCClC>>?CC?CCCl>>llC>ClC>ClC>C?ClCC??>>CC>C>CC>?lC?ClCllCC>>?C>=CC>CC>>?>>>??CCCC>Cll>>>>>>?CCCCC>>>>CCCC>>==>C>=>>>??>>>>>A==CC=?z̛utZuuZClZCCCCCCCCAAAAA=AAAA===AA@ACCCC@CCC@CBCZCCZCCuZux@Z !sӳ866568686668686666666686686566668666565686656658666686556566656656565568666656666656666668568686558656566565666856666556665666866666665565556668568666866565565656666666566665865668656665666566656656665666665686666668656868666666668666866568666886565556656686865686866668565666866666656666665568666855iKKKKJKKKJKJKKKJKKKKKKKJKJKJKJKJKJJJKJJJJJJJJJJJJJJJKJJJJHJJHJJJHJJJHJHJHJHJHJHJHHJHHJHHJHHJHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHFHHFTGHHFHGHGHFTFHFTFHGFFHFFFGFFFFF KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKFFFFFFFFFFGFFGFGGFHGFTFHFTFHFTFHFMFHFTFHFTFHFTFHFTFHFTFHHGHHGHHGGHGHGGՏo=>C====>CA>>>==CC>>CA=>>>C>>>>>>=>C>CCCAlC>>>>>=CCCCll?CC>>?>>>>>ClC>CCC?>CC>>CCClC>C??C?>CCCllCC???CCCC>CllCllC??CCCuCCllC>>CllCllllC?llCllplClC???CClllllCCCClllllC?>>??>CllCllCCClCCClCCllCl?CCC>?>>?C?>>lCCCC>>CllllCC?CCCCC?>ClC?ll>>ClC>>CllllC?lC>>?llllC?CC>>CC>C>ClCCCC>?ClCCClCC>>>>>>>C?>lC>CCCCCC>>>>>=>=>>>>CCCC=>CCCC>>>==CCCA>AuƃuZCCCA@>A===C======>=============>>>==A=========A==========$=>=====CC@@@CCBZx!!;Y!     !!!qHHJHHHJHHJHHJHHJHJHJHJHJHJHJHJHJHJHJHJHJHJHJHJHJHJHJJJHJHJHJJJHJ6856686686865866666566566665666566565655686866866656656566568566686565666686656655656666566566665656666666665868686568665666866656856568666665655666666666568866665666586666686665666865868556666566656566565656866686686866655666656556668665656866666666668565865686566568866566866566566586566568 KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKo>>>>>>>>>C>>>>=>>>>>>>A>AC>CC?>=>>>CCCCCCC??C?>>C>?ClC>C>CCC>>l>>C>>>C?CC>Cl>?>CClC>??>>ClClCCllCCC>>CC?>CllCCCCCCCCCuClClCCClCllllClC?CllClolCClC?CCCCCClCCCC?CllllCCC>>CCClCCll>>lllCCC??lllC??ClC?>?CCCCCllCCCACC?CCllC>ClC?C?>CCllll?>CCCC>>ClllC>Cll>?ClCCCCCA>CClC??>ll>>>C>CC>>CCC>C>CC>>>?>>Cl>C?>CC>>>>C>>>>>C?>=?CC>>CC>>>>A>>CuƔxCZCCCCC>====>=>>====>>========>A=>===>>==A>=>==========>>========$$=========!=!$=====@=CCZx@Z q5686566666666656558666856566666866666655655556566565566866656866665665666656566686665668658i8666666666565565665866666666555666856655666656668656565866565686666656568666686565566866566655685656666686565686665665566568665i6656866656556565686668566668665685556668665666668665666686665666666655666666666666655666  KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKp?>=>>>>=>=>>>>CCCCC>>>>>=??C?>CC?>>==>>=>?>??>>CClCCC>>>>>C?>CllCCClC?>>?CllC?>>CC?ClClACC?lC??Cl??>ClCCClC?>????CCl?C>>CCllCC???>??lC??CC>?lC>>ClllCllCllCCCCl>>?>>?lllllllCCCllC?CCClll?>CCClCClllll?>?ClllC??llll??llllCCCl?>CClC?>ClCCllCll>CC>CC>llC>llC>>?>>lC>?C>CC>CllClllC>=?>>?CClllCC>>>>CC>>>>>>>>?CCllll>>>>=>C>>C?>>>==uzZCCClA=>CA>=>=>C===>C>>CC>>=>C>=>>=========A==>=>==>=>===============C>===>======!=====!!!=>=$=!===@Bu;Y  !  ! =p6656566866656586668668665866856665655666866886666556685656666865656656665665855656666568656566666585665555666586656686556568666768686656655855556865666665686565656666566565665655656656666566666665i8556555688656566565668665566656566566868665656666666686556668666855688656865566865668666856768666565658    p?C==>>====>>>CC>CCC>>C>>>>>?CCCCC=>>>CC>>CC>C>C>CClC>Cl>??>C>CllCC>lC?>>>CCClC?>>?ClC?ClC??CClC>Cl?>CllllCCCC?C??CClll>>>ClCCClC>>>CCl??ll?ClC>>CllCCClCClClACCCCC?>CllllllllCCCCCCll?Cll??llllClllllCC?>CllllCCllClC?ClCClC?CCC?CC?lCCClllCl?ClCC??C>ClC>ClC>>CCCl?>ClCCCCCClllCll?>?>>CCCCCC?>CC>>>?>>>>>>>>?>CCCCCC>>>>CCC>?>>C{ߛxZtCC>==>>>==>C>>>C>=>>===??>>CC====>=======>>==>>=====>=>=>>====>===>======>=========$$===$==$====$==$=!$===@CZ;Z  q5665886686566568558555656656655568685665i685666856858667865685556656565555688656555686668558568665568666868865586666686568666566586665665656566668566566556558665665685686556885865865866868558655588658666656855656866655668556658666566865565666556566655665666566856666655686686866555865856666885556  p>>?CCCCACC>>>>>>>C>=CCC>CACC>=>?C>>?ClC>>>CCCCCC>>>>>ClCCC>C??C?Cll>>C>CCC>>Cllll??C>>lC?CCC?C?>?Cl>ClC??>?CClC????llollllll?>lClllCCC>ClC>>llllll>CC>?llCCllClllllCCC?CCC>?lCCCClCll>>llC>>>ClC>>ClCllC??lCC>?CllC?CllC>CllC???C?>>???>?C?>>>Cl?CCC?>>Cl?>CC?>llll>>lC?C>>??>>>>ClCCC>CCC>>>>>CC>CCCCCCllll?CCC>>>=>>>>C>>C>=u{uCCCCC>>>>>C>>?C=>C=>=>>==>C==>===>=>C>==>>>>>>>=>===================>>=$===>==$$=>=====$$===$=>=====$$====$!$======!=@C@Y            !p556568665556588586666866865665666566665686686656886686686566665565668686665686556665658665665866886665866665665665565666565686856565585657665586566886665865656865658666665655866655668656866856666686666568666658565556868558666686686586655566666666868686666668668686566658666656566566656555658665566565656655565665658TT  TTTՏo>?>CCCC>CC>>>>>>>C>>?CC>>CCC>>>>?CC>?C>=>CCCCCCCCC???llCCCCClC>CllC>CC>>>C?>llCCC>>?ClllCl?>CCC?CCCCCllC?>?CC?>ll?>?lullllllCC>CllCAllClClC>ClllCClllCCCCCC?llllllllCCC>CC?ClllCClllC?CCCC>?C>CA>CClllCCCCCllC>ClC>llllCCCCllC??>C?>>>CC>?Cl?>>>>>?C?>>?lC>ll?>ll>>CCllCCCCC>>?>?CClll?ClC>>>?C??>ClC?CCClCC?CCC>>>CCC>>??>lzCCC?C?>>>>ACC>>CC=>>==>>A>=C>==AC===>>C>=C>>>>>>=>CC>==========>>====>=========A===$!=====>=$=>=$==AC====$!$====!=======!===@A@Y ! 7s:TT"TT"T""TT""6656665668668865665666866565865865665566856668665666566865656656586656565555685666868665665655885865665686855556665686855686656556555586566868666568556555665688665i865656666886686656556665566556686668688666666666656565656655588668666566668656685555585866566655665656566868666885668668656656586686665666TT TT"TT"TTTTTTTT"T"TT:T"T:TTT:T"TTTT"TTTTo?>>>>>>>?>>>>>>>>C>>>>>>>>>llC?>>CC>>>l?>Cl>>>>CC>>>>>>>??>>CC>>>>Clolllll>>CC>?CClCCC>>?Cl?ClllC?C?>CCCCCCllllllCCl?lCCClCCllCClCCllCCCC>?llCCl?CllCCClllC?llC>?Clllll>ClCl?ClC?CCCllCCllllllllllCC???ClClClC>Clol>?CC?ClC?CllllCCllllllCClCllllClllClC>>?lC>>ll>>CC?C?>CCCllCC>>>>CC>?lCClC?>C?ClC>>CC>>>??>>C>>CC>CCCCuCCC=CAC>>>>>>>>>>>AC>=>=CC>C>==>C>=>C====>C>>=>=======>======A>===C==>>============>=A==>>=$=====A=!====$$$==!=====$==$!$$$!!==!=====x ;Y  ! ! =p"TTTT"TTTTTTT6586666685568658686566866556656656555686586855558886586856856656558665665666666655566866666865668865666856565568656665656566685656656855855668686865666668686655666565566566556656566686866666656566658666566666656586556685656686686668666568688565666568655565685656866586556656666556866866T":TTT"T:TT"T"M"TTTTT  "T"TTT"""Տp?C>>>>=>>>>>>>>>?C>>C>>CC>Cll>>>>C>>>?C?ClCC>>CCC?=>lC=>C>>All>>lC?lCColC?lC??>>CllCCC>>>ClllllC?CCC>Cl?CCCCCllllllllllClCCCCllllllClC>C>>ClllCC>ClCll?CllC?ll???>C?lCCllll>>lllC?ClllC?llllllllllC?CCClClllC?Clllll>CCC>>CC>Clol?ClllooC>?lCllll?CCCllC?>ClCCC?C?Cl?ClC>CllCllCC?>>?CCCCCClC>>CCClCCACC>>>>>>?C??>>>CuߘuCC>=>>CCC>A>C>=>?>CCC>>>>==>>?>=>>=>>==>======>=>C>======?>=====>=====>=>=====>==========>=========>======>=$=!!$==$=====$!$$$==$====!!$$=Z;Y  !!!=pTT"TT""M"TT:TT:6685666665666665686686566666866566666676666565666686865656656886686568568666565685665656668556668666686668566586565686586685686886568868665568566688666668866866686686656656655865686586856868865665665665866866866665656656565868666656865656588656668685865566868688686686"M"""T"TTTT"""TT:TTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTT:"TTTTsp?C==CClC>CCC?>C>ClC>>>>lC=>A?>>lCllACCC>=>>>>lC?C?>ll>>lCC=>C>>?lCCC>>ll>>CCC?CCCCC>ClllC>>?CCC?ClClllCClCl??lC>>CCC?uCCCClCCClC??ClllClllllCCCll???lol?ClC>llClCllCCCClCll>ClCllCC??Clll?CCCllllC>ClCCCCCllllCC??lC??llllllCColCCCC?>lll>CCCCClCCCClC>>C?>lCllCCC>C?Cl>???>>?CCC??C>>?C>>?>?lC>?>>>>>llCCC>>>CC??>>{xCC>>>CC>>C>>>C=>>=>C>>>>>==>C>=>>>?>C>=>>CCA>CC>>>>>>>==>=>=>===>>CA>>>=>======>A>==========================!==========@>=!$===!==$===!!$======9C;[ !   q65565566686565666665685686656656866666668668686666566558666866866865666685566666866656656556665666586665556665566586686665656556666656655666686868667668665856866565655868686656566666566866566668566565565656666686686566666666566666665866668665685866566858686866565686TTTTTT"0TTT:TT"TTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTsoCC=>llC>>>>>CCCllCllC>?CC>=>>>lCC>ClC>=>>CC>?C>>CCCll>>lC>C>>>>C?>>?>?CCC>ClC?llCl?>?llCC??ll??llC?llC>>CllC>Cl>?>CCCulCClllClllCCCCCClllllll??lol?>lpl??l?C??lClolCllllllllll?llC?CCllC???ClllllCl>>ClCClCllllCCC??CC>?llllllllClC>>AllCC??>?CllCC>lC>>CCC>?ClCC>?C>ClCC?>Cl>>C>CllC?>C??C>?lCC>>>>>?CC?CCC>>C?>>xuCCCC>=>CC>>C>>CCC>>=CCC>=C>>>=>>>>>C>==>CC>>CC?CCC>>>>CC>>==>AC===>>Cl=>CC>>>===>==>>=========>===========>=========$====>========$==$$==$$=====$!==Z;Z  qTTTTTTTTTTTTTTTTTTTTTT568565556656565885585656666565855685556556556686655666656656865665656566656565858685855585866666565656586866865666656565666566565666658656666665665865666866656566665668866666688856665688668686686668565656666655666665686858656665666658565855556556665655656866865565856655565886686666565TTTTTTTTTTTTTT:"""TTT""TTTTTTTTTTT:T:TTTTTT"TTTTTT"TT"TTTTTT"TTTTTT"TTTTTTTTTTTT"TTTTTTTTTTTTTTTT"TTTT"TTTTTT"TTT:TTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTӎmCl>=>A>CC>C>>>>>>=>C?=>CCCClC>>>C>>llCCl?Cl?>>C?>C>>CC>?ClllCClC?ClC????CClC>>llCC?>lC>?lCClC?ClC>CllllCClC?CllCCCCCCuClCClC??CC?ClllCl?Cl??Cll?ll?CllC?Cllll>CCloC?CClCC?Cll>?lllCllllClC?lClC??lllClolCCCCCC?CllCllC?Cll????CCllClC?ClllClCCCCCll>ClCCCllCCClCC?>CllC>l>>ClCC>>ClCCC>>>?ClCC>>CCC?lCCCC>>C?>ClyCC?>>>lC?CCC>>?C==?C>>>>>>==>>>>CC>>>=>>C>AC>=>>===>>==>=>=>C==>>=>>=>=>A====>===>>==>===>A>==>=>========================$$=$!$========!==!=$==!!!===$$$@@Z   ! =}TTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTT68665556686665565665676865558566656856565585555688856586686656655656585688567666666867868666585866568565655856866565865668556656568666655588566565656665666656566656856656566856665656665556657655688566866585585686856565665676588668658556568685855565666665858665655TTTTTTTTTTTTTTTTTTTTTTTT""""T"""""T"""TTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTpCC>>CC?CCCCC>=>??>CCC>>?CClC?>>=CCCCCClC>>C?>>>CC>>>?lCClllllllllCllCCClllC>?>AlCClCC?>?CCClCCll?>CCCCllCCllllllCCCllllllll?>?lllCClllllll??lolC?C>llCllCCClCCCCllllC?llC>llllACCllCClllCC?ClCC?>>CllllllCCC?>>?C?llCCCCAC?C>?>llCCClC?lollCllC>>llCCll>lollCClll>>>CoC>ClCllCl>>>C>>>>=>>?CCCCCCllCCll>>CCCC>tx>>C?=>CCClCC>>>>>A>>>CCC==C>==>>=>CC>==>==ClC>=>C>>>==C>==>===?CCC>>CC>>>>A=====>>==>==>===>==CC==>?========>=========$!$==!!$=!!==!========$!!!!==========x @Y    !sTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTT5856667666666586655655666586556686656585556866786868676558656686688658666655666866566656885565667686568665666668666866755658866656865685655656666566856568558558586866556666858666576556665655665655885668668868686866655568658565856676868566566566868686656666556686T:"TTTTTTTTT:TTTTTTTTTTTTTTTTTTTT"TTT"T""T"""T"""TTTTTTTTT"TTTT:TT:TT"TT"T:TT"T"T"TTT"T"TT:"T:"M"T"TT:"M"T"TT:"T"TTT:"T0T"TT:"TT:"T:"Տm>C>=?C?C>>>>>>??>>>?>>C?>>>CClC>>???CCC>ClCCCCClC>ClC?>?lC>>CC>?CCCC?C??CC?>lCllC???ClCCC>lll?CCClClCllCCl?ClCCClll?Cu?ClCll?llCClClllCCllCCllClCCl?C?lolllllllClCCll>CllCCCCllllllC?llClCllllCC?llllClClllClllllllC?CllllllCClCCllllll?CCC>loCClCC>Cll>?llll>CClCCC>lll?C>CClll>llllCClllC?CClC>>>C>A?Cll?>?{uCCCCl?=?lC?>>>>>lC>>>>>>>C>>>CC>CC>>>C>>CCC=>C>=>C>==>>>==>CC==>=>>=>>=====>C>====C===C>===>====A>======>========$=========C=======A>!!=$=$$=!$======$$!$$!$!=$Z;Y  ! qTTTTTT"TTT:TTTTTTT"TTT"TTT""TTT"TT"T"TT"TT"TTT"TTTT66586666585658585688666586856655666566868566856856865656666566568656566565556866566686656666865686868568565556855556665568658566666656858668656655685665855588656658666586566565686558666556665666865665666866665655566856665668556868656566586568666576586856656665668565565856XXXXXXTXXXTXXXTXXXTXTXTXXTXXXXTXXTXTXTXTXTXTXTXXXTXTXXTXXTXXXTTXVTXTXTXTXTXTXTXTWTXVTTTXTXTXTVTXTXTXTXTXTXTTXTTXTTTTXTTXTTXTWTTTTXTTXTTTXTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXl=>??=?C>>C>=>>CC>??C>>>?>CCClClC>>?>>CC>ClC>C?CCCCllC>CC?>>>CC>>Cl>CllCClllClllll>ClCllCCC>CCCC>llllCCllCCC>CC>?lllC?l?CCCCCClllllllllCCll?CC?CCClllCllvllllCllll?>lllllolCAllll>llllllClClllllCCCCC?>?ClllllllCCll>?Clool?Cllll?ClllllC>CllllCCC?>>ClllCollllCCC>?CClplC>>>CllCClooplClllCC?Cl>>>>>>?ClllC?CCCCllCC>>CCC>??>>=>>>=>>>>>?CCCCCCCC?>>C==>CC>>>=====>>=>>==CC>=>==>>==>>=====A>===>C>=>=>A========>=>?==>=>>=>======$$=======>=========$!!$$!========$!$!=$$!!!@!Z! !!  ! $qXTXXTXTXXXXTXXTXTXXXTXXXXXTXXXXTXXWXTXWXTXXXWXTXVXTXXXTXWXTXXXTX668688688866856868666566555556568866586668665685566566568556666685866866665685666686656856585655656655656566656888686865556555865568556666555855565665555676565666665565658665866885666555656686588658666666586666666665566865656568666868656886855556688656688586686566XTXTXTXTXTXTXTXTXTXTXTXTXTTVTTXTUXTTTXTTXTTTTVTTTTXTTTTUTTTTTTVTTTTTTTUTTTTTUTTTTTTTTXTTUTTTTTTTTTTUTUTTTTTXTTTTTTXTTTXTTVTTTTTTTTTTTTTTTTUTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTUTTTTTTTTTTXTTXTTXTXTUXTTXTTXTUXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTՎp??CCC>>>CC>>CC>>?CC>>>C>CCCCC>>>CCC>?CC>>llCl?>C>ll>>ClC>CClCC>>pl>?CC>>CC??CCCl?>llClCClCl>ClC>CllCllClllC??lllCCCCCuClplClCllC>CCCCCllllCl?CllllCClCllC?CCl?llCClllCC?Cllll?CClllC?llllC?CllCllllllllCClllCCClCCCllllCllCCllCl??llCCClC?C?CClllClClCCC?lC>?CCCl??C?llCCC?llACC?CCCCC?CCC?C>>ClllCC?>>>CCC{ClC>>>CCCC?>>>>>CC>CCCCClCCC=>????>>>=CCAl>>>>>>>?>>C=>C?==>>CA>>>C==>A===>==>>>>>===>>=>===>=>>===>==============================$======$$==>==!===!======!===$====u;Y   $qXXXVXXXXXVXXXXXXXXVXXXVXXXXXXVXXXXXXXXXXXXXXXXXXXXXXXVXXXXXXWXXX866666656666565555666656865856656567686656865566665655655688886655686668867655685855856688656668656567858665568688568568686566565555656686666566565665665566856556665865565675568666685865686565555655566768568686655666888568658656565886566585666866666886665678668676865655656568666766676866655668666656656668558566865556665565666665556686658688656565556665686588886666656856666656865568TTTTTTTTTTTTTT"TTTT:TTTTTTTTTTTTT:TTTTTTTTTTTTTTTTTTTT:TTTTT:TTTTT:TTTTTTTTTTTTTTTTTTTTTTT:TTTTTTTTTTTTTTTTTTTTTTT:TTTTTTTTT:TTTTTTTTTTTTTTTTTTTTTTTTTTTTTTT:TTT:TTTTTT:TTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTT:TTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTT:TTTTTTTTTTTTTTTTTTTTTT6666855688858568565568555566656865856666666666865865665568pC>?C>C>=>C?ClC?>>CClCC>>=>>>>>>>>>CCCCCC>lCllC>>llC>>CCC>ClllC>CllC???C>?C?>?C?>CllllClllCllCCl>>CClllCClll?ClllCCC>>ullooplC??>>?C?>CllpolC?llll?Cl??llll?CCllllllCCCl?lllllC>CllllllllC??CCClllloppol??ClllClClllllllllllll?>CClllCClCCC?>?>Cl?Clllll?>?CCCCC>CCCl?CC>>??CllllCC?>>>CC?Cll??CClllC>>???Collll?>>>>>CC>>C>>>ClClCCCllA>>>?C?CC>>>>>>>A>>>>>=>C>>C==CCC>>>>>CC>==>CC====>CCC==>>>====>=>==>A=>A===>========$=>=>>========$===!=====!=====>=!===!!=$!$==!===$!===@!;Y !! !   p6586655656866555586855686665686586655688866665665565668665666668666566666555666666856656568666685676556656656886656686656686665686755565665867666665675566656666585688886666865666656766685685556556566666585688566756886686766556768685685866667578566865655568566665888655566865666566658656865586655565856565566566666856665565668656565558586886756565565856665566685665566668666555666658566588558655565566567855668665656688656656668656TTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTT8566565655656668665588868658656566865568556656558566566Վm>>C>C?>>CCC?>>?CC>?C?>CCCCC>?lCCCCCCCCC>>CClCC?ll?C?>ClC>ClCll>?lCCC??llCC?>llC>llCCCCClCllCClCCllCCCClCCllCCllCClllCuCCCllCClllClolCllCllClCCllCCloC>lClplClCCllllClll?CCllCCllllCCCllllC?llllC?CCCClll?CllCllllllC>?ll?CllCCllCCCCllCCloCCCllll?ClCCCCllCllClCClCClCl?>lCllC?ClClC>llC?ClCCC>???CCC?CCCx?C>>llCCC?>>?CCC?>???CC>>??CC=>C?C>>>>>>CCC>>>C>>>C>>>>>lC=>>C=>==>>>C>=>>==>>>>=>===>>>>=>>====>A>==>>======>=A========>===$=A===========!=>=====$$=======!u$===!===!=;Y  !!=q68568565565665666556556565655656658656586868678685665856656556685568565756568555585656566665558665655565656665568666868665566686665566666668686658666588666655668865666588576566665665865676566855655566886555586585766665865666666566565666866685566668656586686658585586555666566885568568656588585655555668685658566658568666766865658666556655668685665686656566866565886586656665856856565655686566555686658666885658658655865866568586656556665688556556586XXXXXXXXXXXXXXXbXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX=6886666866855658666655686685665686865665665556676666655o>>>CC?>ClC?>>>CCC>>CCC?CllllCllllCCCClC?>>CllCllC>?lClll>>llll?>>>>C>?lCll?ClC?>CllllClCCllll?>?ll>>???C>llllCl?ClplllClCll?>?llCCvpllllCCllllCl??lll?>llllllCClCCC>ll>>?llllllllll>>Cl?CllllCl??Clll>llC???ClllllllCClC??lllllllC>>>>AlllCllllolC>>CC>?llC>?ClllllCll?>lllCC?>CC>>>lllC>lllCC?llC>>>CC>tyCC>>>CC>?CC>>ClC=>CCCllC=>>>??ClC?>>=>>?>ClC>>C>C>=CC===>>>C>===>=>>>=>CCA>>CCCC===>====>C?C>>===>>=======================>====>C>==>===========$!=!=====A=!=@!=!!$=$@;Y      ! =s6556566655868566865666856666866568666588685555588688555568588565665865556686866656656855655555867665675555555655555585555556556586658565565656655685565667688656565655856655586565666765666588586556856565676556686568855856566556768655856686565686565565655566556655886556566685855666866588688565656856765565565565667686556566675566586566658568656656858865785866555688856556858556866866765686655666686666558686865666668685865566555868566856555TTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTMTTTTTTTTTTTTTTTTTTMTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTT76866555676558858658566566656666686688858856656668p?>CCCCC?CC>>?C>?>>?CC>C>?>?CCCCCC>???CCCCC?CCCCClC>C?ClC>ClCCCClClll>?lClCC?llCClClCClCCClllC?llCClllllllllCCllC?llClulCClll?lllClllClCCClllllllCClClllClllllClllll?lolClllllCllCllCClllCllllllC>lllllllCllllCCClClCllllCCllllC?llllC?lllCllC?lllll>lllCCll?CllClClCCCCllCCCCC?llCCllCCC>CCCCCCCCC>?ll>>{CCC?>>CCCCClCACCC>>lC>>CC>>C>?>lC>>CC>>?C>>>C>=?>A>Cl>>>?A=>C?=>CC==>=>=CC=>>>>>==>>=>>>=A=>===>>====C>====>>>>=====>=====>=====$===$=====$=========$$==!=$========!$=;Yq8655655656567765568666585566655558855656555555875865655655686555857656565665565856855555666565658565668665567656855558676665686576555556868658586888555686865556566865586865855666588565586765886558555856655565658658556655866655665665657655686886665558688555665565565656556886566558555568665566656855866556688565766668868665565576865865676678556656556868656666658586656856588665868656885767656655586885765768656556885566656565686555866565565865566668686588688656567685656555556556558665865665685656585866786565686656865856665686858565685667556685685666766855865585566655586656555566566665686568686586866665566666668876558866588685555556886565858657656665566558655656o>ClC>>>>?>>>?C>>CACC>>CC>>>CC?C>>CC?>>?ClC>>CCCClllC>CCClll???llllllC>AllCCCClllllC>Cl?>>?CCllolCCCCllllC>>CC?llCClCCvllCClClpvllCCllCll>>CClllllllCCllCllCCClol>ClllpllllCllllllllllollllllpollCllClllCllpolllC>>ClC???ClCClClClollllllC?>>>>CllllC?CCCClllllC???lCllllCCClCC>CllCllCllC?>>CllCClClllCCC?lC?>>>>ClvC>?C>>?lC>>CCCCC>Cl?=CCll>>CCC?CC>>ClC>CCCAClC>>>>==>>>>>>>>===>?===>>==>?>=>CA====>===CC======CA===>>>>>>==========$======>=$$==!===$!!===!!!=x=$!!$@{ ;Z!!  =s656588565656865685565565656565585586565565568685665856856765685665566665686668558686585886576568678676555656668656578676566656656856556685556685665856555565676556565566655656656686556588867566556668566656568665565688866576568685666855665668855568656565555855566566858565558568566665586856878665665656555586655656568586856586855666555655566866566655566556666565655858686568555655855585865558555668565566558665655565666656685686666656558568555555656585665566665676558555566565666566855666555666565676668688855555585565686565657855665658668656655655555686855588686555568585856668586556556868666566566556555558676556675555556555558565555655658585866556565656555855665656886656656555856655586565555676566658ӏp???C???C?C>=CCCC?>ClC??CC?ClCCC>?lCCC??Cl>?CCC?CCllC>C?ClCCC?Cll>ClCCClClCllCCCCll?>llCllCClClCllllCCClCllllll?lCllCCull?lllClllll?CllllClllllllCClllllllolClllllCllllllCllolll?ClllllllCllllCClClolCCClllllClllClllllClllll?llCllC?lllllllClll?l>llllllClCllCl?lCClCllC?ClClC>lll?CCCllCC>?lCCCCl>CCCCCl>C?>CCCCullC>?CC>>CC>>CCC?>>CC>>>>?>C>?>>C>=CC>>C>>>C>>C?=>CC>>>>>=>>>>>>>?==CC==>>>=>>>>>=>===>>>==>=>=>==>==>>=======>=========>=!========$>============!Au=!==x@Y  !q8856586556665665658656555585676567676555565858668868558555566565868555656568658566856686658556655686556658655765555666556665556858865568676885655568685565555555865885686855565885556855556565858655865855685586556868565655585666566565658585666555655558566555676555565568656865665676585566855565688866565565585655656865688588555556586565665858555665658586665865567655658588656865656568686655858676665586566558765555865658556565656885656566566566855888567686656565668555865656565568586856587655658665565555566866666655865656666656558586865585555655555556855665655655657655585765656656765856655555666565658565668665586568555586766786656655556865655858688855686855556566865586855855666768665586765spCCC?CCCCCC?>>ClC>=>ll>CClClllClllllC??CCClllllCC>>CC>>>?C??>>>lll>>??lll?lCCCCCCCCC>>llollC>>>C?CClCCC?lollpoll>llCl?ul>Clol?lllllC?CCllllolllCC?llllllC?l?CC>>llCllClll?lllllCCllC?CllllllllllllClCCllllClC?ClllllllllCllllC?llClCCClCllllllC>C?CllCCll?CC???Cll???>>???lllC>ClllCCClCCC?>C?>>>CCC>ClllllCC?lllzClC>?ClC>ll>>??CC>>ClC>>?CCC>>C>=>>>>=>C>>>>=>ClCCC?>==>=>C?==A>>>=>>C>>>C=>CC>====>=CCC>=>>==>>>=>========>>>==>>============$=A=$$A==A==!$====>==A==!Z    p666567688568856865656656568676865665656676565866566566555665655885856685655565675566688685656566886856656655668556565865676855686656656676558686766558675555668685655856565655686565678856765665866685665888555555566686568678666565575678585855568865555666655566556556565786768655858688755565666586565588558565685566655556756568655885667655686666868558686665666556656558655556586556665865865856656865566558888556866667655666586558568656855565556555676555566866686568558685656758555658886556675565585655656865688586556558586565656585855668585658667558655565556585868686666556566686556666658665858686585666565688658666555656568656568666566566656856656685556856658565555656666756556667565665868656588886565658668666m??>C?C?>C??>CCCC?>?lA>>CCCCCC?CCCCCCCCC??CC??CClCClC?ClClClC>CllllCl>?llllCCCCllCllllClllClClCClCllClClllCl>lllCCl?llullClll?lllllClllllllllllllCClllClllllllClllllllllClllllCClllllClll?lllClllllClolClllllCCllllllllCCllllClCCllllllC?l?lplClll?lll?lClll?ClCllCCC?lCCCllllllCCllCCC?ClllC??CClCCClClCCCCClCCuuCCCC???>ClC>>CCCC>>C??>CC?>>>Cl>=CCCl>=?>>C?>>>ACC=>C>CC==CC==??>?>=>=?>>>==>>>=>>>==>>=>=>=>======A>>>========>C===========C=$===$==========!=====xx@Y!!q556665586665658566556666858885658668565655565558656556666656565565556686665857685568556565565585567686665686586665586655666556656568686566586666558566565565655556865866586765555886558855868666688655568665555658655665556656588676555556585665566655655665555666685676765666658658668655656655666565556655656565655665666555656557655655686666556655657656885656768686585565665655856658686565866665566556556558658676865856868565556686585565766686656585556665565566558865688566865568566868568556585665565665656668666556865566655565858688868558555665658685556565686585668566865586565655686685666557665676655665655885866556856868566556868555555555686588568685665568557685655Տo>>>>>>>>>CCCllCCC>CCC>>ClC??>>>>?C?ClllC>>>>>>CClClCCllllCCllllCClCCCCllCl?lllllCCClllllCllllllllllllloolllCCllCCClovClllClC>??Clollll??llCClppol?CC?lCllolloollllClolC?>lllC?CCC?lllCl?ClC>ClllolClllCCllllClCCCC?CllllllCC>?>llCllpllC>ClollllCllll?>lllC?Clool???Clll??CClllCCClllC>>lllC>>lll??CC?>C{?>>CCCCCCCCC?>>?lC?CCCCl?>=>=>C>>>>>CC>=>CCll>=C?ClC>=>?===>CllC>CC>==CCCA>==>C=>>=>C=>CCC>=====>==>>>>>C=>==>>=======>=========>==A=$====$$==$======$$$!!=@Y      ! !q86586688586886666666887565555556556556565665675667565555565566676886568655566555665567555556875658556565656566666555555658666856555656568565666686656656655865688555665555665655686667666565558566566858658667656566866665675656558688566656565665855555888585565856555565558676685656685656868665568558555868686566568685565586558585668688656666555568555686556656886565565556585656556585555565856555565566856665866566655656866586556576556755655566555585655655565586556566556555565558566565665656865686555558858656856555656656665658885656667586856656655666656565658568555686556666765586866665566765556688656556555656566666556758655676566867686656888o?CCCCC>>?CCCCCC>>?ClC>CCC?CCClC>>llCl>?C?CClCCCllC?CClCCCC>CllCl?ClCll?ClClClCloCClClClClllllCCllClllllCllllllCllCllluCCClllllClllllll?CplCCllllllllllC?lllClvlClllClllllllllllllCClllllClllllllllllllllClllllllllClll?lllllllCClllllllllClllolCl?llCClCllClColClClClClC?C?llCCCCCCCCCCClllC?CCCCClllC??uoCCCC{CCCCCC>A>CCCCC>CCC??>?>>C>CCCC>>C?CCCCA=>l?=>lC=>CC>>>>>>>>CA>>>>CC=>>>>>==>=AC>>>>>=>>>=>==?>==>>=>=>===>>>===========$=>=>============$===>===!====;Z!  !q675685666865855668565556865656556886568665655556565685658576865556685656565657566766868866886855566657576688655665667555558865656558686585768655656856555658856655658555555886656565866666885655558656555685666658756555556868855855565656558768568565656656555557685655556566656656565658676868656665587665565865565555555558856586685556665656865565556866576558685556656565868566686565585667866656557655656665555655856665688866865656556585555586876558585665555676856665565686686565655686565568686855565686655658655665678586855586565556666556565565556557666558676856685565655665856565865655556686656558665565665565565686686556566655858666556665556668665658676555565765688556688solC>>>>>?CC?C?C>>>>CC>Cll??CCllC>>?CCCC?>?llCCC>>???>CCCCClCClCC??lllllC?C?>>lllollC???ClllC?C?llClC>>>?>lllCCllllC?llvll?ClllllllCllolllollllClCClpolllllllllllllll?>?AlovlopolopolppplllolllCClplloollCllloolllllllCCCCCllplllCllllC?CllCCClllClCClllll?lll?ll>C?lll?CCClC?llCCll????lllCClCll>>CCCCl??>tC?luCCCCClllC>>>CCC??>CCCl>>>>lllC>>>CCC>>>=Cl>=>>>>>>CClC>>>>==>>>C==>>>>==>>====>>=====>AC>=>=======>==>>==========$==>>=======>>=====>=====$=====$====Z;Z  ! !!!!=p565856565655656556855556685656565565658655858555675665868866655555585565575655685865565558886865656568685686676558655755856665675586867856566555688685566555855655855667556856888565565865556588855586555856555585858565856855556566556566858567585576567655556555885566856555767755558556666756586768555666556555655676676658866566656565555566557555868676568558566555767585556656656567655555576868585558586755867666556656575555558855555555686567565656686567885686666586558585558555565568866686675666856785565566666865556556655585755565675567657555556665686556865556655557656755555567555855656657566676555555758665856556555875555556676655865655866588555556ՏqCC?>>>CC??CCCC??CCC???CCCCC?C?CCCCC>AllCCllCCClClC>ClClCCllCllCl?CllCClCCl>?lllllol?CllllolllClAlllAlllCllllClllClCllull?lllllllllllllllllllllllCClllllllllllllllllllllllolllCClllllllllllllll?lllClllllllllClllllollCllClllllCllllllClllllllllllClClll>Col??llClClClCCCClllCl?llCCCCllCCCCClCllll?CC?lCC{{ul?CC??CCClA>>CCCC>>CClC>>?CCCC>>>>CC??>C>>l>?>=?CC=>?C>>CC>>>>>=>=C>>C>>=>>=>C>>>=>>>>>>=>=>=>>>===A>=>=====>=>======>>====>===============!====$!=A=$C;Y!!!s665656556785656855555558555658556558666558666688566558566555565588556556566556586665586557686565556667585576857657656558556586656865556767655785768856865665655565655556657665565655578658655655565686558556855655555558556555788586865586586556865856568656556767686685555565676556665755555565868565655656558565555656857656565656655566588558866555686588587558656665565558585865585665555668556665856566585576568565565556655666555556866656658586655686665556875585565567668655568565656556555556868556856856588685688656856565555656865668556865555576655856555655576765866556688685557685757668865666565655555866565656766658558685556568565565866556585555558586556656586ՏpCCCllClCC>CCCClCClCClC>>>>>>>CClClllClCCC?ClllllllllCCCC?CllllllCllC?llClll>C?>>ClClllll?CCCCllllollllllCllClollllC??ulClppoolCCCl>?lllC??llCClllllllCllCCllllllCllllllllolll?ClllCCClllCllllCllllClCClllC?ClCClolollllC??lllll?ClllClll?lllCCClCCCCC?llloC>loollllClClCCClllCCClClllCCCCC?lCllpol?CCCCC>?>>>Cl?>CCllACCC?>>>CClC>>C>>>>>?>lC>>>>>>>CC>>=>C>=>=>>>?=>?C?>>>>>>=>=>>==>CC?>==>CCC===>==>C>=>===>>==>>>===>>==AA>=C>=>=====$=====>>===$==$======!@!Y ! !q556568555678565686866665558865666586765565585856865667556785586765586655585655675755566555678665565567556678568555556565766585656685558666555556556685686685558855665655565856656567656556555566756558585658555665685568665558655565555756557655866555556857558655656856878575876765558575658566856855555556565556685587656865865565555766676585685575556585565658868686558557657855856568565568567676855555676566556566557566856587556765856565667566555565655586588586568568585855665668686886555558555575655685865865586867556565666668665755675575865655656586656785656757688688656556558558555656568568675556585ՏqC?ClCCCCCCCCClC>ClClC??CC>>CCCCC?ClllCCll??llC?llllC?Cll?CCllClllllClCllClllClC?lllllllll>lllllCllllllCllllllllllCClCullClllllllllClllllCllllllllllllllll?lolllClllll?lllollllllllllllolllllllllllllClllllClllClllllllCCClllllCllllllClllllllClllllll>lllll?CllllCCllllllCllllllCC?lolCC?ClClClllCCClCClCCC>>ClC?CCC?CCCCCCC>>C?CC>>C?CC>C>>CC?>>??CC>?>>>>>>C>>>?C==CC>>>?>=>>>>>>>=>>>>C>>=>>A=>>>=>=>CA==>=====>A=A=>=====>==>====>==========================!C ;Y  =q8565555586686565586576568676555676565786655765666758765685556685886585556567586655655588856565656586657667556556866755556576565886786686658665686565566588558568676656558655555568658665656766555686857565685566568656756855568766685768566666556866765686765866556656566668865768656865565686857667666785668585658568556655667665556585655655655655665567686558585658555686886555686565656665575568555686755665787556755658568685556676658555668556865566575556655565655585586758666567565865658665565665885565566565676665586576868655666866576858665655856566556865558566756857688686556555555565666567656sp?CCC>>>>CCllCC??lllC>CllllllCCC>lCCC?llllCCClC?CC?l?ClllCllC?ClC?CCClClplCClpplClC>CllllCllpollllllClClC>?CC?lllCllpouolClllCllpplClolClllpollllolllllCllClollCCpollllC?CllCClplClpllplC?llllllllCCClllCCCllllCCllllClllllllCClllCllC?lllC>ClllllC?ClCClllllCC>?llllCCC?CC>??ClCllCCClllCllC>>>>?llCClllllCClCCl??>?>CllllCCllClCCllCC>?lCCC>?C>>?>?lCCCCCCCC>CCC>>>>>CC>CC?>=>?ClCCCCCCAC>=>=>>=>=>>====CC>=>=>>>=A>>========>==========$=A>==>===!====$>=$====9=;Y       7p5576758765765686876765556558555765588856556865768586556855856865668566665655655865856556786586658556665658656655655568785566558655656886668855555655656675pj57655656656555666866768676656558587567556655558655568555655676558767658555568656586556588668658885678876578655856656765566855678655678868555766858558666558566655685565655655666565556875588656556756568566655576865865688567586755686555666577658865668558656656676865555886867675867655885568685686556585566856656565658676558576676565658676565865858568676685567855865655866556865667576555765556586756556566785558555655656566585656685658556565556655558585866558575ӎp??C?CCCCCCCC?>?ClCC?CCCCClC>?ll??CCCCllCCCCC?llllCCC?lllClllCCllCl?ClCooll?ClllllllllClllllllllllllllllCClllllllllCoovol?lllllolllllpllllllllllllllllllllllplllllllllllllllCllllloollloCClllllllllllll?lllllllllllllllllCClllllllClllllClllllllCllCllllllClllCl>llllClllCClCCllllllC?llCClol>?ll>CCllClllCCCl{x?CClC??>CCCCCCCCClCll>?lC>>CCCCCC?C>?>>?CC?C>>>CC>C?>?>>>>C>CC>A>>>>>>?>A>>A>>>=>C>=A>>>>>>==>>>>=>>>=>>>==>>=====C=========$==>===============!=>=$=C;Y =q6568666555568556568568665568558665766558565555555865555768765575656565566586658556658585885555565657866865856856555668656656565655565j68665855865856666558685568666856658655665686856856655685685656858657565765557856565588656888588578855865565656766557885655865858865665756665656678685655755768555877866768876665855685768556665658656656556555676566558565557666565856565787685688556755867786658766688556578556886556585668656588876555865555655755767665576556556785656865555888676555555675866556555888565566565866565675556865665555566765587675766866586655585866566666558566sl>>>?CCCl?>???>>>>>?CCllC?llCCllCC?C?>?C>>CC??lCCl?ll????lllC?llCCl?>C?llCC?>?CCCClll??llllC>CC??>llllllllllCCCCClllllullC?lllllC?CCCollllllllollllpllvlllllllllCCllllppvoopppllllllCllllllplCCClollollCllollllpplllllllllllClllllllllllllllllllClollCClllC??llllCllClopollllllllllllC???ClllClllC?l?CllC>CCClloul>CCCllC>??>>CC>?C?CCC>>C?Cll???>>ClCC>ClC?>>?>>CClC>>>C?=>>>C=>CCC>>>>==>>>>==>CC>>>?CA>>>====>===>>>=>C>==>==>>>?=>==>===$=>>====$==$=$=====$======Z@Z!!     $s56765658658855676676576558765586656656565656656855556658655856655856676656555876556568568566866658567567576555676668667865556555555756656656886775556565575656568p66556558685566558555558556658886556655755756555765586556556656856555686855568655685868556656655568566665555655588668556576556655556566867668566556886888667566568675566656566865568865576588658656655858685867656556567685886568558656655577655655586565688685857676556655865686655686655865658656855578865555868866555675688656666866868856556865768586565855855586556856856756556555855856556786585685556676586585558655867855555586558686868885555555567566758567565566565555667885o?C>>C?ClCCC?>?CC?>CllllCCCCCl?lllCCCC?CCCCC?ClClCCClCCCCllol>lAlol>?llCCllClClllCllClllllll>lllCl>lolllllllCllllllloouClllllllllllllClllllllppllllollplllllCllllllllllpllllpllllllllllllllllClllllplllClllolllllllllllllllClllllCClllllllolClll?lllllCllllCCCllCClllClllllClllllllClll?CllllClllClCCCllClCCClClouCCClCCCC??C>>lCCCCCCCCC>?>?ll?>?>>>CCCCCCCC>?C>>=?lC=>CC>=?>>>>>CC>C>=>=>>>C>=>C?>>>>>>C>>A>=>=>>==>>==?>C>======>=>===>A=======>>===============$===@Z!q57655865675685657587665656858656588587555565655655685667855885765855686555565856765568867676685565556858565558658656576666555656576568865585586655658855556856586>5555656556865566556568558555556886755855566868755586558566555555686585655566565565655865685558558685755556556565666585668655555666558556555555655875686658856656565667655685555668567555558585886586565555585675658755555655855658678556586656858685676566556876666556556566877855557657685666585756765666566687868655656568865565655656685555685585667685585655566658755565667556865655556556865855665865888556576656866665866856555668656656565665556658556855556658766ՏpllC>>>?C????lClll?>CCC?CllCCCC>ClCCllCClllllCCClllCClllll??lCllloC>loolloplllCllllCCClllCllllolllllvpllClolllvpollllouClpolollllllllllllllCCllllCCloollClClllplppolClC?llllllll?lllllllpllllllllllllllllllllll?>llllpollllllolllllllpllllllClllClpllllC??Clllll?Cll?ClClClllC?lCCCCllCClC?ClCClClC?llCClllCCCCCClu??ClllCClC?>?ll>>CC?>CC>C?>ll??ClC>>CC>>C>?CCC>>>>ClC>>>>>>CCC==>CC>>>>>C>>>>=CC>=>=>==>====?>>>C>=>>=====>>========>====A=A>===>====>=>==C>==$=$!$=C ;Z    ! p5686765576766855686566557686576555555655565565555565885866556757565866555657558556666565655856855656565558555558555555558685868655585555556555665558667675668865758658565676557555655558776755575586585555558558885655556557655655768765565555655566585676788685655675858585556576758855565555568855555655675555855555555765565766587658686758655655555668575565655585887565865586655555555685565668565585585555675585558587555575555768585658676555556585575755555585855556585685585555555565556655555568685566556555666858755675655856765555555655655556857855587575855767556655565566585687665555555555556656655885755555656558565755655656558585565756855ՏqCCCC?>?C?>?CCllllCCC>??CllCClCCCCllCCCCllll?ClllllClllllCC?ClllllCCllllloolllClollCClCl?lllllllllllplllllllllpollllllullolllllllllolllllollllllllClllllllllCllllpllllllCllllllllClllllllplllllllllllllloolllllllllllllllllllllllllCClolllllllllClllllplCCllllllClllC?llCClllCllCCCClClllCClCClllCCCClClllClCCC?CCu{C?CllCCCClC>Cll>>lC>????CC?llCCCl>=?CC=?CCC?>CC>>?>CC>>>C>>?CC>=ClCC>>>C?C>>>>>A===>=>>==?>=>A>>?>>=>>====>>========>>>===>==>========>>==========$=;Y !q85855556675576565556555856655676865855565655575586556655656555656855576765865566565655555555555585558755655555585555658585755856586555658556655655655586767568555865565558555685555788587665555665556655867857668766586585555568655565555557686855565858565555665585676767555587655655675655885656855657557558858585658656666585556568555555657558857675585556555565767555686758555568576686856655556665557676756565755676856765685867556786586556766586558555565665788555556555855758555655556755865586558587655565565566866876587555588655568567665688685766855655678585555656856567866555765577678885855676557568565585555755577555588555766p?>C?>>llC??CllC>>Clll??CCllClClCCC??Cl?lCCCl?C?ClC?C??l?ll?lllCC?lllCCCCClClClllllClllCCll>llllllCAllCCllllClllC?lllCulppllllllllopollllllllllllllllllovollCllll?llllpol?llllplCClpll>llllClloolllllClllpplllllllCCCllllllllClllpollllllClllopllllCClvpllolCllpllolllllClllCloolClClllllllllCCllllCCClllCCllCClCllCCCCCClCCll>>ll>CllC??CC>?>CCCCCl?>Cl>>?l>C?>>>C?>>>>CC>CCl>?C?=>?==>>>>?>>>>>>>C>C?>=>>>>>==>>>>>>>==>>>===>>>=>==>>=A===>=>======>=========>>A===Z!Z   ! ! !!!9q865655655657665555555555655575655657676687556855857585855576557586566578556555555655568856765567656555885687656568555655566758765658565867665658865758565555585565685555885555555655658566755585655655855555656655555655666565565655565676755568555655658865856565555555685655856558856856768655555558655685685665556555765557556556556565865655855555555556675665555755655556678556786656668555578755565557658585556587685555655556586768575567675655665858556568566575556568565857585566665655667856565685855666755855555555658855755567585658655565755865556656765856855656565556655767555555566858675675585555558565565656568675656865565585q??>C??llCCCCllC>>CllCC??CllCCCllC?ClCC?CClllC>?Clll>ClCClllCllllAllCCCll??lollllllCClolCllllllllllllllllllCCloolllllluollllllllllllollplllllolllllllllpvlCllllllllllllllllllolllllllllllpllllpplllllllllpollllpllllllllllllllllllplllllllllllllllllllloplllCCllollllll>lllllllllllllllllllllClllCCCCllllCllllllllluulC?CCllCCClC?CCCllCC>C?>CC?CCCClCCCC>=Cl?>?>>CC>>??=?C>>CC>>CC>>>>=>C>>>C>>>>>>>CCA>>>>>==>=>>>=>>>===>=>=>>>>====>==>===>>=======>==$======>=$=A=@Z !=q5865655776685855755558558858565567657856586866585788555655586686857876557576755555556658555556655855658555855576555555656565658565655555565656558688567656555766766766556665657555656585856555858555785857657555555755656555655677655555866568555558555576675658576585655555555856656567655655565555556575578656558655655585565868565755856675555555565655656555868886555865577656858885855557555555685855855558858655658855555566757687676555555655567555765755555685658565555555565656856565655568556655578655656855576588555665656565555555555685677556555655865566586657585658655567855665565655565767568555556565558558865p?ClCCCClCCC>>CCClC??CCllCCCC???CC??ll?llClClllCCllllCClllCClllllllllllol?CllCllllolllplllollllC?CllClllllllCCllllplllvollCllllplll?lllppllllllCl?llllllllllllopvololpllllllpllllppllpllllllollolloplllCCllplllppllllpoll?lloolllllllllllllCllllllllCCCllllpllllClCCllClllllCC??CClCClCCCCCllllllCllCCCCClC?CllC?ClCul?CCClllCClC>>?>>lllC>>ClC>>>CC>?>C?>>lCC?>ClC>CC?=>CC>>CCC>ClC>>>Cl>>>C?>>C>==>=>>>>?>=>C>>>=>>>=>>=>A>>===>=>>=====>=>>=>====A======>========Cx;Y  ! q68565578858565765586575886686885655585656855658557567565865565555855876557556656655555566585555567675665665767556765555585555655656565686555855586858565758655585565655665555565856888575555765555555676555758665766765686858665585565655556888566685557665555575655586676865565556575765855875677555558655885555565588555555556786657655588656555555565658556555655656555556585676755556756565757657566557868558567566655756875855856756555555856776676775655655555558656855566555586557555857655766758667558556555555555556885656656765675566768565655655555566768766555655655885685658665558555556556556568555586565555557Տq?>lllC?CCCCC??llC>?CC?Cll>ClC??>?>CllCCllC?CClCllllCllllAlllolCllllCllllCllClllllllllllllplllClCllollllllllllllopllllvplClllllolllClllplolllllllCllllllClolClplooloplolllllplllllvololloolllllplolllll?llllolllllollllllCClpollClpllCClplClllllllllllllllllllolCll?llllllllllCClllClClllCllllllllCll>>ClllCCllCClCCl{CCC?ClllCCCC?>>>?llCC>?CCC>CC>>?>>>?C??Cl>>ClCCC>>??>C?>CCCC?CCC>>CCC>CCCC>>>>==>>>>CC>>>>===>A>>>>==>>=>=>==>=>>>==>>>>==>>==>>======>==A=$===C;Y!    9q55685566667558565568675555555586558585656655785857556576566855568656557885758855675575555567565555658556756557685855585786568655558855567867677855576558665568566565565555855685565658688565556557658555785675655557655685685555885586865555565568555566555566755557675866755565575557585685567767876755555676856585557558858667555865676855585566765565558655556586585557586657685658588656785655566575588865555855555766555555565556576766565675567655568678555585657665565585668555555588655588768678876855556776568578766575566555565585855555588658556585558555675655556575655765556755655556567655888855576Տ}??lC?CC??CClC?ClCCllllCll>?llCllll?llCClllCllllll?lll>ll?CCCllCCClClllllllC?lClllllllllllplCllolll?llpl?llloollolCCCluolllllloplllll??lllllllplopllpplCloplllllllllllplllClllllllolllllpplllClllllllllllllCllollplllpllllCll?lClplllllllCllllllClllplllllCCllplCCCllloll>llllllllC?lClllCCll??CCClllllllCCC?lolCClC?ulC?>?CCCClllCC?CllClCCll>?CC?CCCCACCC>?CC>>>CCC>?C>>>>>??>>>>>C?>>>>>>>>C>=>>C>>>C==>>>>=>>>>>>=>?>>>>=>C>==>>=====>>====>=======>>>====>==A==@Z !     $}57555858655655655555655556658676755765585685555756556556658556555557885655665675758567665585556755855686555555556565685586665555588856786675565655858565587867665858655555585886568775556557555568558556688886556866758655556658578857788556665655868555567655766875685868588556755685567555588566656866658755666866755868867667575765865658566788665676585566585556858856665565556555755788555676755558568656568567566875555667586885555656555755856887667676565565566768555585557558858558665667575867556556565565655667655555655676855755556877558658555567675755566555565565665655655555565655555665556555868585575855665556555565756ՠ}??lCCC?A>?lll??CllllllC?C?ClC?CooC?lllClCClllClpllClAAllCClllClCClllllllllll??lllClolllllollllollllllplCllllpllllllllullllplllolllpllllllplllollpllvlllllvlllllplllllpolllCllllllpllllllllplCllllllllllppllllllllllllolllllllllllllplCllCllllollllloolllllCClllCCllllllllCClolllollC?lllCllC??lCllCllll?ll??lllllllllllCCCC?CllllC>CCCCCllllClC?>?C?CC>>ClC>?CC>>>?C??>>>>>>>>?>>>>CC?CC>>>>>C>=>?>>>C>>>>C>>>>>>C>===>CA=>=?>======>=>>>>======>=====A>==>====>==C@Y    =s75565576657675767656785555655656557655658567675655565585575855655685686758675555557655565556755568868685575675555555558676578556685566865555555556556555585567565585685555876568675765855555765865655558586555655555665575566565655575558655858555565786565867656755657556858555656555665556555556558566565585655556858888655555575565655555756786555856656558655556658556886588856756556578585555575565555667855588588855565765565655556856686685555586688687665568558868575665867676885578656755555685675768656555666567865585555555667565555585675555788585558578865865765585567876877865676558665558566565565565Տ}?>CCCClllC?CC?ClClCCCllCCClolCCll?CllClCllClll?lplllllllCllClllllCllllCClllllClplllllll?CoplpollllllllllllllllllllllouCllllllllllllolplllllolllllllllllllllpllopllllovllllllllllllpllllllllllppllollllllllllllllllllplllpopolpllllllllooplllllllClClCClvoll??lllllllllllllClllClvlCj>CllllllCllllllCllCClll?ClCClClClxuCCCCCCllCCC?lll>ClC>??>Cl?ClCCCCClCCC?>ClC>CC??C?CC>?CCC>CCCC>>>>>>>>=>C=>CC>=>>>=>>>>>>=>=>>=>>=>C>>>==>>A>=>C======>=>==C>==$=>=!$=>=$===A!Y!  ! =q558865656575556565555555557658576555758858665555565686755865565558856555555558865585557555556555555556566755588586555875856875565556566555565565586555555565568676556575665555585575865667865658555555855867665856855755657655655555555555587656686655555766656557565576665875685855758556758555555555576876858555856858jCn855565765555667586675866855555688565785555858755575575565755565586758565755555655575565655555567558656855667655658685556565686557555555565555758656565565555755587555556586555557855655675655566558585665555768867566756755555855865556566586588555665667555568668656565656685658765585565556565658555655658865767585Տp??>CCCllll>?ClCllllC?lllCllollllCCClCCCllllllC?llllllllllllCllll?llllCCClllllllolllll>llllpplplllplllllllllllllllllllullollllllllllloolllllllllolllllppplllllllpllllplllllllllllllllllllllllppplllplllllllllllllllllollllllplopolllllllplllllll?lllClClvlllllClllllllllllllllllllllC?lllllolClllllC?lllCClllCC?CCCClCllCllCClCCCC>llC>ClC>>>>Cl>lCC>?C?Cll>CCCCClC>>CC?C??>CCCCCCCCC>>?>>>=>>>=>CC>>>>>=>C>>>>>=>>>>C>=>>>>>=>CC===C>=>==>>==>===>====>====>=====x;Z =q76687755556575555556875765555758566565556565555767665565555565567655576656657557686555856766855657656567558557685558868876585555585575855855555555858556557558578656555555855655765565585585557785558557655765557558755855655675755655558888765767655657558657665565688857586558585855586865576765557555685675656558555656jZrp65555555556557566555576555565555585566768576765867576556555555557555767587876555555765758656555565567675587656555585565855555555675765856556755865655555555555555565757856558558555585755555565556558588755656767557657555558575587855767555577556575557675555855676566688555565555855655756558655spCllClCCCClC>?ClCCCC?ClCllllCCCCClllll?lllCCllC>ClCllllClllllllllClllllllllCClllllllllllpllCllllCloollllppllllllllllloulpplllllllppllllloll?lloplllllollollllollplllllllllllvpollloopplllpllllllllllpllllllllllllllllpolllllllllllolllllllllllllCloollllllllpollll?ClClllllllll?lllllllllClllllllCCCClllll?llllllC?CllCv{llllC?>?lC>?llCCCllCCCllll?CC??>ll>>CCCCCl?>CCCCCCCCC>=>>>>CC>>>>>CC>CCC>>CCC?>>==>>>=>>?>ACC>==>>=>==C>=>>=>>==>==>>===>>==A==>A=>======C@Y! ! !q6568855565675575665877655558555565585575555555575557655567556586685655678575855855555657555565678565555585656655657558555575755555678565756675576555555555555755555565656875676755556685556757675665555856555658755658567585587587587565585555555758767555567565555565555655555565876765558757788>{Zj685675558558857875658577857555555655585765575555555578676755587557576855876555587675685658858557675556757555557687556855756555565755766875676555767555567655767575655556555587557555657555555656767558868555666855856556757555555555558555555555676576557so?olCllCC?CC>CllCC???CCCClol?>ClllllCCClCClllllCllCllllllllplllllClllolClllllllCClllllCllpllClllllllolllppllllllllplllvloollollollllllCopllllovlllpllpllllllloollloplllllllpvvpllpllpplCllllllllllllplllllllllllllllllllllllllllollllllllllllllllllppllCllllopolllllllll?Cloppl?lClolllol?CllllllCCllllllCCllllClllllllCvllClC>C>>>?llCC?llllCClCCClC?CCllCll>CCClC>C?llC>CCC?>>>Cl?>?CCA>>lCClC>>ClCC>>=>>>==>C>>CC>>>>==>==>==>>>>CA>>==>=====>A=>>=======>==== @Y!q855555555555585558585555555555785558555655555755575678675855755678885885555657686555575885555565576855657555855855556556676588585858555568885555565765857557556555675588555575585576558555765875555557575555576876565655557755655576755878655557576657557565565755575555865555555555678565585578jln>5655765676558755556765555567558777675785575675555565765586758556556787586755558575555755855855555575575555565557557556556657855787555556565855656556655665765556765755555755558557876555856755875657755585557576875887875855555575575555585555558575565575857866555555756ՏplC?>CCllC>CCClClCC?Clll?CllllllCClllllCC?lllCllllllCllll?lol?llllCClpollooopollllllll>lllllllllClllllllll?lllollllpllvllllllllolllllllpllpllpolllllllloooplCllllllllllllpllpllopllllollllplplloopplllplolpppllolllplllplllvllllClllllllllllpoolllllllClCllllllolllCllool?lllllllllllllll?lllllllllCCCCllCClCCCllClClCllulCClllCllCClllC>?CClC?>lCllCCC??C?C?=?lClC??>>>?>>>>>C?>CC>>CC>CC>>C>>>>>>>C>>>C?CC=>C>>>>>=>CC>>=>>>>=>>>>==>>>====>>>===========>==>=];Z ! ! 9q55555576555587577655558555875555556765655675555655575755555558657587575556585588566675756677555685855868655755555555575567585555585875555855557585857558565586875657555567855576755565755555876775555576567555688655567655555755665665755765765555555557555555575655575555657555555585655565877855558>ikCj6867755756555567557656585675555578575656555685855585656775555865665585565655655555576556765555557767555586565678655685555555655788555556556875755555555555767557655556585685755678566755855557658555657558557556755555556557558755575756555878555757675576555555555555՟ql?>?llllAC??ClCClCCCClCCClllllllCClllllCCllllllllllCllCll?ollCCplllllllloppopplllllllllllllllllllolllllllllllplllplllullllllllllllllplllppolpllllplllllppolllplllllolplllllplpplllllloollppollloplllollpopvpllllpoolllplllppllllllllllllllppppollll?lllClollClllllCllolC?llllllollollllllllllllllll>CCCllCCCClllClC?lllC{{??lllllll>CllCC>?lCl>?CClllCC>>C??>=CCClCCC>>>>>>>>CC?>C?>CC?CCC>C>A?>>>>>=>CC>>CC>>>>>>=>=>CC>=>>C>==>====>=>>====>CC>======>===A==A= ;Y! }5655755565667555567767586575555655577555576555565875555765575555555885556555667856555585555557556555587675555775766565565757885557557655657657565657555555555875558758855655858567585555558655555565585585575565775555575785755855658875757555556755556657555558555855755765557565765788>875656567575556556556757765657755655556555555585767565556555555855565857755855755757656775655555577555755555585555555655555557858555576555557675655555755755678675865765688776885575667785556555885577655768576575558558555567666855777856585555686855555pCCC?CCllllllllC?CllllllCC?Cll?CllCCllCCllllCClllClllll?CllollllClollCClllllllllllllClllllllllllllllllppllllplllCCllllulllppollploolovpllplllllllplllllpllllClvollllplplllllolollllllloplllllpllppollllllllpllllllllllloollpolloopllllllllllllllolplllloplpolllllllllllolCllllCl?ClllClClCCllll?loolllllClllllllCllC?lllCCtlCCClCCClCCClllCC?CC?CCClCCCCllClC>Cl?CClCCCCC??CClC>>C??C>>??>>>>>>>>C>>>>>>=>>>>>>A>A==>>>>>C>=>>>>>>=>>>===>>>=>====>>=>=>A==>===z9Z !    =q558586555556567665565575755555556556557575675565556756556755555657576585555655575775557557555558575585765556556655766658556765556575558756555556756755757578576556755556758557685765575566855585656856566555566555555655776676685757565785555775585557555855785865555765855555856555655556756555858867555555575857557585855676555755855875875556765555575565675575555567555655655755676565656756756555656576755565875575558555765576765555566556556765656755575565575555575575556766555575855858555568555656555687557665575555565558576765556768765555655557585855755865568875ӏqCCC>>llolClllllClllllCCCC??lllClC?lllCllllllCCllllolllClCllllollllllClClllllloovlllllllllllplllllllllplllpoplllllllllulllpploplppvvpoloopolllplppollllollllllovvlllplplllllllppllloollollllplpoppllllllllllllllllllllloollllllpplllollllllllllooloolllovpollCllllClollplllol>llClllllllCllllCCClllolllllllllolCCllC?llCCClolCCC>?lllClllCCCClCC>>lC>ClllllClllCCClCl>llC?CCCCC>>>?>>>>?>=>>C>>>>>>>>>=>>>>>>>>>>>>>>>==CC>>=>>>===CC>>==>A>>===>>A>=>>C>=====A@Y !=q56558556555555555767558575555855658558565755785585555585555555657575875556575858755557566575558555585555555555557765755585755655865555657857655558557657655655675555855565557557555555675855578585555575566557778555555555556555565568566555655658756556755555775556766757655576866877555555575655658555587658555555566856555557765555675556658756565555585565555655767677786657655565655565758555555855755885555655655565656655555655855876557558575555655555655557675555567555585877555555588555768585855585555557555555565755765757656675657576755657557655658757556585qClCClCCC??llCCCCCAlllCCll?lllllCClClllllllllllClllolllCC?lllllll?llolllCllllllllllollloplllllllollllllllllllplllllollvllllllllllolplClolplllolllopllllppoploollvl?lpllpllopllplllppllppllpllllllpooollllpllllollppplllpollllllllllpplllllplllllllllllClpllllloploCllllllllllllllllllllllllllllll?lloClllCllllllllllllllllCy{lllC>Cll>lCC?ClCCCCl?>Cl?>CC??C?>C?CC?C>CC>CC>>>>>C>>ClCCCC>>CCClCACC>>AC?=>C>>>>>>>>>>>CC==CC>>>=>>>>>>====>A>>>>>==>==>===>=>=>=;Z    !q5767557655655655856855565755655556555555767566655567655555586555556585656665655555565756556555555557858575556558576555565757555758855778567555556855855585557576755585555567555675877558855575567555558555565765575655555555575555858578857675556576556555585558576758855675555575555565555768755755556675865555755765755556556778555785585555755786575655855755555665555555667685555567565875555855555556555556876755855755855677557557575665565555765576565655655757767656556885658555567558768555565557576555775755565585575586556666655765758556765555575668756575567567557575675765ՎpjClllC>>CClCClCCClCll?ClllllllACllCllllllClpvl?lllllllllllllllClllColplllllllCllloplpopvppllplllpllloplollllloollppplvollllllllopllllllllllllllllpllolpllopppooplllolloplppopllllploppppppolllllovpolllpolllllppvpolllpllllllllplpoollllpllllllplllllClvllllllopllllllCllllllllllllllloollllllllClllllllCCllllllllCllllllllulCClllllCC?CClC>>CCC>>lC>>>>C>>>>CCC>?ClC?>?>>>?>>>>CCClCCCCl>ClClCCC?C?>=>CC>>>>>==>>>C>=>?>>>>=>>>C>=>>==>C>>AAA===>====>===>Au;Y!   =q85565675867667557756565555555586758556555557576575557578557558558767566575755675755566556855555855555766755665856555757565666565685555575555865565556586555755576587565687585566555565555555556555557655555576586567555557555558555565655565855675555585655585865558765555558555576585676578565565555655556575586576758585658556555555865555757555655556555655555585585658555875558557565675655765587566556555565755755755575765575655577655678585556785656555855555557556758755657565765555756655765855557556555555758755555585656755857555767855855578555655655655575555ՎpCCCllllCClCClllCllllCllolClllllll?ClllllllCllCClllClllplolllll?lpollllllllpllllllolllllllvlllolllllolllollllllolllllovllllplllollllollllpppplllpppllllloolpolllpollvpllpolollolplllpolllllpllopollplllllllplllpolllllopollllllllllllllpllllloolvlllllClpplllllllllllpllollllplllllllolllllllllllCCllllllllllCCllllCClllllClolClllCCllCCllllCCllClCC?CC?ClCCC?CC?>C>CCCCC>CCl?C>>C>C?>>>C>>>>>C>>CA>C?=>CC??>>>>>>>>CC>=>>>>>C>>>>>==A>>>=>==>>==>=>>=>=>>==C!Y!   7}6578555558555576655675565555786555565555565555558555565585586565577755567575555575656585575558656758658557558755575555585555675555556575785565765755855575557555556556765575655665855555555555556555857558655555885655575576755557655677585556588565876555685577655785555587585566766655555555578755585557576588655758556855557556585575555657575555555587558755557557555585555558755755557555655558765556587675556757555767558568565776855555557757655555765556656865555565658566557555555757765655555555578785755565585576556576755575885556557575755568558555855Տp?ClClllCCC??lollllolC?lolCllClllClCllCCClCllllllll?lllpolollClllllllllllplllllllollllllllpplllooploolllllllllllollllpulllllpllpllllplllllpppllppplllplllpppollloplppvolpplpppollllloplllClllopvppllllpolpplllppollllppppllllllllllllpollllllollplpllllllllppoolllllllpplClllolClllllllll???llllllllllCllllllCCCCCCllClllllllu{Clll>?CllClClCllllCCllC??CC>Cll>>C>?C??>CCCCCCCClC>?>>>>>>>>>>=>>>>>CCCC>>CCCC?>CC>>>>CC>=>>CACCC>==>==CC=========A>>C=>>=C?==;Y ! =s6557885655855555555557765576555868877555557557655575575655587555585755755555685785785557575557575558555555555875576555775767575756555875555675555577555775565585576755676555755555767575855556755555775557555756557555565555585575557578556555556768556855857587755557575655555557555565785575555755755775575555568557576655655575555555555675575555555555555555557575555555676565555577765655555567757555558687585555556655567558555885557576855657555555555555557555575555555555558575757566555555675755555558555555755757587555565575567576565665558758557555555755556pllCCClCllClClllCCClll?ClllCllllCllllllllllllllllllllllplllllllllllllolllollllplllllllllllllllllllllpollolllllppollloovllplllpppollllololplllplllllooolplpolpolpllplplpololloplplpllpplplllpllplllplllopopollllllppllppllolplllvvlollllllpllllloolplllolllllllpplllllllolllolplllllClllllClllolClllllllllCClllllllllllClllllClulCCCClCClllCClClCCCll?CClC>llC>ClCCCCC>?llCl>>CC?C?CCCCCCC?>>>?C>>Cll>>=>???A>>>C=>>>>>>>>>>>>>>>>>>>>C>>=>>>=>>====>>=>====Z;Y !q55558556575875575655558585575875555555777575555677555875676555585555755555855555585675577555557675575557555765555755765855655555555567775787558655585585555757855555765555555585577556557555556577555555565575856755558757755875757557558755775756758555555565555757555577557585576575555576755555557575755555675557555776587555755756555575555557555575558585757575557575758567555585885556755677578555557575855555576755855558555755755575555557575557555575555655556555555575555555556558556557775555587557575655585555565556758757555555655557555575555675555556575775557755755855575qll>?CClCClllCllCllllCClllClCClllllllllllllCllpolll?llllllpllppollll?lllllplllplllllllllllpllllllllllllplppopppllpollluvlollppppololllplplllloolllloploplpllopopppplloollplllpolllolpopoplolllllllllollppppppllllppoppoloppppllvvplpllllpppllllpllllloppllll?CllllpolllllClpoplllllllllllllllllllllllllllCClllllllollC?lCCClClvlClClCC?CllCC?CClCCll?llCClllC>CCllCCC>llllC?>>CCCClllCClCC>>?CCC>?CC>>>>?>C>>>>>>=>==>=>C>>>>>=?C>A>A>=>=====>>=>==========@Z ! =p5755558555555556578757557555555555575655575555557555755758555558575557555855655585575555577555758857678778757675656555555565775566557575757755587585576755575586555577555785575557555755565757555555555878555557585758755565565556557556555555856585555787855566557567555675557565555555558775875555555887555565575555858557755655565655557555557555575757585555578575556857575575587555765685776755556555556585576577575576575555557555555565577876765755555778557565757755875575755557555556555785767555555557575655855656557785755557558757575556555575555675555575557675555775576755ՏplCClCClllCCllCC?lllllCCCCllCllllllllllllCllllllllCllllllpllollllllClplCllollollllllpllllplpllllllllplpllllolloloooollvvollllpoolpoplllllolpopplollpvllollppoollllpollpollllpoopllllllolopllplllloloololllolllplllpllllllllppllvplllplllllplllplolllllplllvp?lplllolllpolllllllolllolllpollllplllllllllllllllllCCllllCCllllClllv{CCCllC?llllll?llCCllClC>llCCllCCClC>CCCCC?C?CC?ClCCClC???C>Cl>>?>??>>CCC=>C?>>C>>>>>>>>>CC>=>>>>>>>>>>>=>=>C>>>=>=>>>>=>>=;Y ! q55855765555585555585765557557558555555555755555565575575557555587555555755875555575575876757755555655575855575575557575575575555875658655555557555555577556755858775755775755557557865558577755755587655875675765555875755857565576575555555855757657685588755875855555555555555555578555777557577765557555567555555575555555557585555575677556555867587555758555755756565555655775757875855655876575556555877555555578755855555555557757555555565558756767555855555755557655755765585577755555758875555755765555755556585585755555557667675855787778558555ՏslllllCClC??llC?CllllllCllllllClClllllllC?llolllllCllllClollllllppollllllllllpolClllpplplloppllllllppllllllllllllppoolwoooplllllplllplppopppooppppopplllllppppllpllollpollplpllolllolllolopplppoplpopollllllloploplllllllpllplopplllollllllplllllolllllplpplllooolplloopllllllllllllplpvpllCllplllCllllllllllllC?lllllllllCC?ClluClC?C>CllClllClllClCCCCCl>?lllCllC?C?Cl>>?CCC>CCCCCC>?>>>ClC>>>>CC>CCC>>>>>>>CA>CCCC>>>>>=>>>>>=>>CA>=>>=CCC>>>==ACC?===Z@Y   9s655658655856858756685856576775775575875577755555675757575757875557557755765787657565755555587568555755557757577655576755577557785555555555757775567875555777555555585575555555785575755557577557855775575585565575575755757587555775555585555775558757575756555756575557575577655575775777575855557557755555775555776776775757575557555775857555575555567555855785558775555555557555576755577575655555555765555565757758575558575557575755778557555575575786765577765558765575565576575577565757855587777ՏplClClCllCClllllCllllCClllClllCCllllllllllllll?llllllolllllllClollolllllllllloolllplplplllllolllppllololllllllolppolopulllolplploppolllolpooploooopooplllpplplllpololopollppppllooppllppllpvlllplllllpollollpppolooolllllpplllllloolllpollllopolloolololllllllpollllpolllllllllllllllllllllllpllllllllllllllllllCllllllllllC>llloollllCCllCCllClClCCC>llClC>ClClCCCCC>?Cl>CCCC?CCCCCCC?>>?>ClC??>CCCCC>>>CCC>>lC>>>>>>CA>>>>==>>>=>>>>>>>>>>>==>>==>=>>==!Y! =q755555555557555778557757555757855775775575755557775775557575877677585777575575777577757555778575875577555775555757555787557577755775575575775575757577775557575755575777557555785757675757557555576575585855677585577757777585575755757555577757875755755577585755875556775565775575787555777555575576755557575787557877577565575785557577555858758557558557577775787755555757555755578557787555557775755885755575755555577855555575577557657577775575778777777775567756778577755577776577755777757555758575575558778ӎqClCCCllCllllllllllCCClllCCClllCClloll?ClllClllCllollllllolllllollllolllpplllllllppoolllplllppoppploplollllppolopoopppullllppplllppplllplollppllplplllolppllllllpolplpppllpolllpppvvpopppoppllllppllppppppooppolllpopplllpvolpllloppoloopplplvpllpvolplllplppllollllpllllolllllllplllCC?lllCllllolllllllClllllllllllClloll?llCCllu{ullll>CC>CllCC?lCCllllCClC??lC?llCC>CCCCCC?ClC?ClAllC>>>>ClCC?>>CCC?>>CCCCCClC>=>>>>CC>?CC>>>>>>==>CC>>==>>==>>===>>C={@Y   !=p7555855757758755555775555577588577775755575775755785776577875577755577857675575557775575777775558585755787755877557887577555765555755775776555555755555558555577657875777776555577765578575657555775755575755555777787575777577575757577555557577575757757555767875575557775577577555757577555575577555568757558775775755577555755857556775755757577587577575758575557755587577575757765555578756577557577577575587757777775576577755757778755557577558758787575555755555787768757555555785755575557775557757778555577575qCClCllllllClllllCClllollllllllllllllllllllllllllolllllllplllllllllllllllpoCllloolplllllllpllllollloppolllooppllllolllvllloppoollplpplovplpllpplplpllllplplplolppplpplpollvplplololoppolppllllllpvllopplppoppllppplploollopplolllppoolllolllloplllpllllllpllopllolllollllplllpllllollllllplllllolllllCllllolllllllClllllllClllllll{ulll?CllllClClCCCCllClC?ClC>C?CCClC?CCCCC?>ClC>Cl>>CCCC?>ClC>C??>?C??>?>>CCCCC>>>>>>CC>>>>>>>=>A>=>C>=>>>=>>=>>>>==>>A;Y  =q575777757755785658575757776755778757875577575775577557557655557776555557775776575575578558577557555777755577757775557555758657576557755755758775567555775557777557575577555555775757555557786588758577575565577575877575575875755755557775875757775577557575556757757575555755875755555575856755555577578757577878557557557777555585555685575755575577775777875676775675575557555575557575577557558775855557555677557555757555777757555557575777755877765755757775577575777585757577755575555587755577757557577755587557557577577Տp??CCllllllllClCCC>llpollllllCCllCllllllllCCllllppllllllCloollllplClllplllollloplpplllllllllllllllllpolppoppppllllllllvvpllllpppplllppppplollllppoplllppoopllllv|olllloplpppppplllooppoopplllopopppllplpollllllpppolppplopolllppppplllllpllllpplllpllllopllppplllppllolllpppollloplpppplpvplllCllC?llllllollpollll?lllllllllllllCllCCCllllllClllC??CCCllC>?CCCC>?ClllCCCC?Cl?CC>>?C?>?ClC>>>CC>>C>>>>CCC>>>>>>=>?C?>>>CC>>>>=>>>>>>=>>>>>CC>AC>=>===>>> ;Z  !  $q555755558575775777785557785757758777787855557755775757765557855757757857757555755775775575775557575765775577567558757777755755577557575585787555575755567555775575555675877767755575557555777577775755777577755585575777785555775755576557755557765577555777567576756575776757577555557778775575857555755557575757555775555555557575555578866777785775757575577777575577855775755555578758577757558557755555557757557557775757555758757557857755778755775757757575555575757775775775777775577557877558775587875587557565575pCCllllllllllllllllllllllllllClCllolCllllllllllllllllllplllllllllllllllplpplllolllolllllllllolploollolllooppooloppllolvppllolloppoolopoppopllllvpllopllpoovplllpvollplolppplpplollpploplpploplplplplolopopllollopppllooppploplollpppplllvllolopollplllplpplllplllllplplllllplllllllllolllllllllllllllllllllllllllCllllllllolllllllCoyllllllllCCllC?C?lCClllCCClC>CCClClC?C>?llCC?>?>Cl>CCCC>C??CCCCC>>C??>?>>CC>>>CC?>>C>>>>>>C>>>=>>>>>C>>>=>C>=>=>==@u;Y =s7557567575775555757557787655577555777577785575757577555555577577575575777855775557557575557577555757755577777577775755777555557577777755577777775558575757557577577777575875755785755777775757676757555755757755577555775557757575577755775755775875575855557857557755557557575557755775877558777775557577757577577778557557757575557875755577757556575775555577775575775557555577577877778555557777555577557777785556755775575557555775575575555557777555557577557755755877657757555755557577556775757555755577775555557577557557757p?lllC?ClCCllCCCllllolCCllllllClllllClopoollpllllll?llpolllllllllllllolllvvooolllllllolpppopvpllpllllllloplllpppvplllpulllpppllollppllplllllllpppllpvpllolpopplpvollllppollllllollllpolllopvppllllllpopploppolooollllppoololplpoplvppolppllpllpoopppolplllllpppolllllplllllpllolllllllllllllllpplllppllClllllllllllllCCClloplCllCCll{vlllllll??llllC?CC?ClllClllCllCllCC>?>>CCCCCll?CC>>>CClCCCCllCCCC>A>?CC?CC>>CC?C>>==?>?CC>CC>>A>>>>CC>==>C>=>>>>>>@Y  =q7557755577575775555755757577578775777577857557577777575755757577555855778755555557555777577755757755557575575755757555575575755777755757577575577757555757776557558575555558755555557577755587555875757575555755867787755855557557767775755555585577577577575775577757755557757777758578755757757557577757758757575575587575555775555775777757855557577577755577757585575777557757555755775755755857555555757577755577555577557577777557557755755755785577575755557557577555757777775575757555757555757875555755775pllllC?llCllllllllllllllllllClllllllClllolllpllllllllolllplllllplll?lplllpplpollolllllllpllopolloopoplllllpplolplpllppvpllpplllpolppollpoopppppplllvvolppplplplopopplovplolopoppopllpvoloopppoplloooplovplooooooollllopllpollplppllppopoplllplplpllopopplllllppllllllloplllllllllvlllllplllplllplllpplllllllllllllllllClllllllllllllllllllCCCCllllCCllC?lllCCCCCCCCCClCCl>CCCC?CCC?CCC?CCClC>?CC???CCC>CCCCCCC>>lC>>C>>>>CCC>>>?>>>C>>>>>C>==C>>>=>>>;Y !q55557577555775757757875775657575755875577875775575755757577557577555577755777777775577755555775777575775555557755755575775755777757555577577557755785575755555577557755575775577558555755757775755775555577575587575577575577557877556778757775755557575755577577557777775675557575575755577755775775555757785777755557755855575758757575558757757575755557577775787555575557575555577587555755577775775577557575577577755557577555555775775575577785557755575775757577755575757555777775775557557775555555777777555577677575558ՏslClllCllllClllllllllllllCCClloplllllllllolColllllllopllpolpllllplllllllllllolopollllllllplpolllpppllpolllopolpllloppovllllppoppolllllpllopvvollllpppllpppopllllpppppv|olllpvvvplplppplppppplllopppollpppppppopolpooopllllplplllollllpppplllppoollllplppllpollllllllllopllllllllppplpCllllllploloollllpollClllllllllllllllClllllollllv{lCCCCCC?Cllplllll?ClCCC?C>?>ClCllll?>?lC>C?>ClCCClC?CCCC?>>>CCC?CCCCCCC?>CC>=>>CC>=>CCC>=>>>>>C>==>>C==>>C>==>t!9Z !    q555755755777755577775575777557557577577575577757555787758755755577557757757757555578757775558575777557557557777577875575775757755775777777777557765575777558875775555775557557757775777758575757557575555555775575775875755557877755755575757575777575585757555775755575757575557577777575575757757775557557757757775575757775755575555757755677565577757555575757575557877577757777777755577865775755775755575555857765775557757757557575775775757757757758557757775577575557775777555557557757575575755758555575575755777555575ՏpCCllCCClllClllllCllllllllllllllllllCllllllllllolllllolllllvlllllvolllllllloplllplplllllllloplllpplolpolllppllpplllloovoopoloppoopllloopplpvpplllpoplpopoppopplopplplpvooplopvppllloppoppppplpllopppllovplplopploppllppllolpollpppollpopplllpplpllolplllloplllllopllollloplllllpollplllolllllplllpllllplllllllllllllolllllClllllllllll{ulllCllllClllClCCllllllCCClCCCClllCllCl??CC??llCCCC?>CCC?>>?CCCA>ClC>>>>CC?>>>A???>>CCCC=>>C>>>>>=>=>>>=>C>=>>;Y   !q7585557577755557575555575555778857575555555775578757787777555555575755775587757755557775777557755757557575577587555775555777557555577557557775778777755755775775557577775557575575755558557575555775777757577877575577777557577755775578577575757577555777757557578555577555575555755775777567775575777757577775555765675555777777757555587757575577777757775587575757555777557555577775577777657575755775775755555575555757775575775555755575777577558557775555577777757577755555777575557577575777775755557757755775577555ql?l?>CllllllCCCCllCCllllllolllC?lllll?llpllllpollollpllllppolpolppppoolpopplllllppppppolllloooppllppllppppollppplllplvopollpolpppooopovvolppllpppppoppollplpvvppllllovpopoopooolpollplllllolppopollloppolllollopvplppplloloploollplllllllllpplllpllllllpllllllopploolpllpllopolollllllollplloollopllploollllllllllllllllllllllClllCCClolCClllllllCCCClllloolCllllllCllClloC?CClllCCl????>>>CCC?CCCCC?>lC?>>>>?C>>>CCCCCC>CC>>>=>>>CC?>>=>>>>=>>==>x;Y!         =w575555757575775756785575775775555775778767575755875557577757555575775855575775555575575555775755777555575575755575757555755777758577575557575775575855577775575757775577557557557575757575757575755557877777575657775755855655775575577575585755777557657555777755577777557555775855755577755775775775557577557557755755577555778557575557575557555575777777755757555577757557575755675577575577555757557577555577755575757577775757575757777787555557755775775775755555787577755565757755577575777755778757757758577557757777777775577655ՎpCClllllllllll>llllllllllllllllllllllllllllllloolllplllolllloloppllvpoplllplllllllpllollplllpplopplpppllopplllopolpoopvpppoloollpppppoppppllloovvloopppllppoopvplplplo}plooopppplpolooolllppppplpplllopoopplllloppplopopollpoopllpoolpplllplpoplololllllpplloolpllpplolollpplllllolllllllllllllllollllllllllllllllllllllllllllClllllllCl{lllCllllCClClClllllllClolllCCllCCll>>ClCClCCCC??>??CCC?ClC?Cl?>>?>>>?>lC>>>>C>>??>C>>A>>>=>>>>>>>>>=>>>>>=C#Yq55577755755757755755575775757575777576755875777875575757775777757755757775575555557555577577577555555577575757557555577757557757775757575757557575777577555557775755855555775558757558577755755555555757775577777875557755785757557755577777755775585575757757555757575775755755555575568757577775755775575557575775575557575757557775777575857785757855755755577577757577775755557557557675555657575757577757757575775555775775757555777557757775655557557757755777577555775757757577557575555555557755855557555557775575575o?Clllllllllllllllpollllllll?loollllllolllopllopollllololll?lolllllpppplllollopollllopllpplolllpppllplllllllpppoopppopwolppllooloppvplllplolpolvpllpllpopppoopppoolpllppllpoppppoollppooppvvppllpppolollppoolloplppllolppoppvpoloppoooolloovolpooppopvppvplpppopoopplpplllllllllopplllppppllllllllllllllllpllllCllplllllllllCCClllllllllvolllllClllllCllClC?CC?ll>?CCllC>Cll>>lllCl>CllCCClCC?>CCC>>?CC>>>>>CCCCCCCC>>>>>===>>lCC=>>>>>>CCC>=A?>>C>;Z  =s5555575777555577755788757557777755757757755778787775577757577757577557757577557557555755555555877555777777575777755778575555575557575775567585758577755775757577857755555757775577777757777785577555757577777557778575577557777775555755857575577775765785785757755555777555555575575575755777575755587785755575775777755777578765757557758577578557757787577575557587755755775757577755755777575555576555775557755655775755555777585555777577777575556575757777575565557575577577755775775755777575557577775575875557plClllllllllllllllplllllllllClplllpllloolllolllplllllllllplllollplloppllllloplpllllloolpvpolllplllppllllopllopppoppollvoopppopoloppppopllooppolpvoplplploppppoopvolppplpplvplpppllpopvoplppvplooooppppoloppoolopplooopplolovpppllopllppopllpooppllpplppppooplpppllopllolppllllllllollplppvlllllpllllllllllllllllllolllllllllllllllCllllllollCClllClCllC?llC>l>lll>ClllCCClClCCCll??CCCCClCCCCCCC?CC??CCC>>>>CC>?>?CC>>A>>>>>CC?>>=>>>>>CC>>=>C>=>C9Y q55557577557755757557765757557758777577575757775777777857557775777777585757775777755556775755575577777577575755775755577575575757877775575775777757755575755757755775575777755577555775777777877557786775575575755577757775577575775758785775775777775577578578787775575577777757575577777558557757675575755775555555775775555675575575757577575775575775757557556755557757557755777575777757575577575777777775755875657777575775557577777755575777775776ՏsllCClllll?lllllCllllllloll?CClllllppllplopol?lllpppollllppllpllllllllolppppllllpppvploppllllllollllpvppplooooppollppouloolopppolppvvpvppvpppppvpppoolllloopplllpvppppolppppooooolpv}vopoplllloppppvpooopvpppllllopooppppolpolplpppoppvpplloppollpplolplpllppllllllllllppplpolllllppllllllplplpppllllllppllllppolpllllllClllllClollClllCCly?CClCCllCClll?llCllCCllC?CC?C?CCClllCCCCCl?>???>?>??CCCCC?>>ClCC>>CC?>>>CCCCCCCCCCC>>CC>>>=>CC>>>>>>>>>@Y!! ! p775557577777578575577757557767575757587755775787577755777558557757775677775775778557777757575578755777575555777755777555755857577777577557585757557777777757777777755567777775757757575757775567755575755777577575755777757777755755557777557757557775558575755757775775755557775557755757557775757557775577777777577777755557575775577757777777555555775655787775755575777777775777577557757557757575775555555755585777577777575777757577775557575685557577plllllllllllllll?lllllllllllllplCllplllolllllllllvoloolllllllllplpllllllppplplplppppollppopllollllllvpllpploplppoollpovoploppppoplpppppppppllppppvpooploopopvolopp}ppplppppplooppoop|pplpooooppppoppoopoppplppplloooopppppooplpplpplopvppllppppllopplpllpllppllllolplllpllopopllllpplllolllllplolllpollolllllpplllllllllllllllllplllCllllluulllC?lllClClllCClllCllCClC?>lCllllll?>ClC?C>CCClC>CClCCCC>CCC??C?CCC>CC>?>>CCCCCC>>?C>>>>>>>>>?>C>=A>x;Y $p75755558757555557877757777775757877775777777755777557577757757775777777577757557775557575757757557575557557757577755757577577577757777757785785757777555775555775575557557555777857577757777775777577755757555777577577577777575777557557757777775775557575575557777575757777777755575777577555557555757777557755775755557775775555575775777775757777775557555777555758757577557577575757775577557757757555557777558777555577575557575577755777577577575557757556577777775575ՎpllolllCCCllolll?llllllllllpllpollpllllollllllolllljlpollllllplpolpllllplllooopvpllllollllppplopppopplllppvppolpppollpulllppppppppolllppoppllloloppppppppoloploppoplpplooloppooopppopplopppopppppppppppppolllppovvpllppvplllolllppppooplppllpllpoloollolpvpllollopopollllopvpppllllolllpllllllollllllllllvplllplllloppplllloplllolllllllCll{plllCllClCClCCllCClllCCCCCCllllCCCCl?>llCClllCllCllCCCl?>>>?>>>?CC>>CllC>=>?CC>>>>CC>>CCCC>>=C>>C>>>C ;Z  $p7577755757755577575557557757575577757757777577777577777757857777775775575755557775775575757777777555775775777577757557757577757577577576757557775557577575555555775757557757575575755777757555775777757755557757575577777577575577757557555777575757775775775776777577775577775577575557775775757755577775577757555777755777757575575757557757755757777777755756655575775755777577557557755577775777577755777757777777777775757558757557775755557755757577575sllollClllllllClllllllllllplllpolllllllplllllppllolClvlllllllplpllolplplolloplopooplpolllopppploppllplooopppppolopolppvppppoppoppoooploppppoplpooppopppppplpoppplpppppppplppplplppppppolpopppppppppppppvpooloopop|plolovpllppllppopppllooppopllpplllllvopplollploopvlllllpololpvlllplllplllpllllloolllllolppllllllllllllllllllllplllolll?Cpo{lllClllllCllllllCClllCl>CllllCCllCCCCCCCClllCllClC?CCC?>>?CCCC>??>CCCCC>>>CC>>A>>C?>CCC>>>>>>>>?>>>9Z!!q7575777575757577557587577777577757575777777757877575555777777575775577777757577577777777777575757777755757757555557777575857775757557775757757757777577555767757777755777775775757575755555777777757777577757777577777577777775757777775777555777575777757575577775775775557755757777777775775757557577777577555777777857555555775757777757755777777755757777557767755567755557577575757775575755777577775757775755777755757755775755555775575755757577755755ӏq?ClpllllCllollllpplllllllllllllllllllplllllolllpvlllplpppolpvpllllppollllllpplllpvpollpppvppolppllloopoolooppollllovpwpoolloppooppppplpolplppoloopolopolloppoplloolllppppplpplppollpvpploppooooppoolloppppoopplpvvppllpppppvppvplllllppppvppplpvpppoovpollllpppppppovplppllllovvppppllolppppplllppllpllllllllllpolpllllllllllClllClpppol?ooutCCClllllCCCCClll>?llllACC?CC?>CCCCClCC?>???>?CCCC>>??lllCCCllC???llC?CCCCCC>>>llC>CCC>>>>>>>>?>>>t;Y  !! ! !  =}5577775555755777755757755555777777775777775757777777777777577575575775755755777775577557775577575777755777777778575557557777777757775777557557757575775557557575757757757557577777775775757775775575557757557577575757757575758557757757755777755555557777577575775557575755777575777777777577557557775777755775757555757557777757577777577577777557755577557577555777577575557777575775577777575777575557757575557777577557575777777755777757577757775755775757775765757757pCllllllllCllllllovlllllllllllllllolllpllllllllopopllllpplplppplllooopolpllppppllpppppolopppppolppllopooplllppplopopopvppoolppplovplpoppplopoppppopplppoloppopvolpppllvppplpvpllppoopppoooppppolppppllpppppopppppppppplpoppooppppoolllopopvpoplppopplppooollppllppplpvllpvlllloopppllpllllllopollpppolllllllllllplllllllllllllllllllllollllll{CllllllllllCll?llCllClllCCClCCCl>CCCllCl?>?>?CCACl?>CCCCl>>CllC>?CCCCCC???>?>?CCCCC?>?C>=>>CC>>>>;Y  =}755577777757757767777777755775575787757787775757757775577577558575577787577575777755778576775577755775775557555755775575577755775575575557555555757777575757555577557757777787575757777777757777757757577777755777777557577755757555775755777575757777755755777575775555757575757757757755777777757575775775575557755577577577557575577555775757557557777577577767575677557755757777776575777757577555777775757757777777775775757577777577557575555577575756577757575ՠ}ollllloollllClollplllllllllpllllllllllllpplllllllopplllllollloopplllopopllollolllpopllpllolllppvvolpollpppooloppppllluolpoppvpopvllllpvvpolpvpvvopllppopppppv|pppppoppoppllvvppvppppplppplppppoppppollplpppppollpppvpvppppllppoppppppppplppllllpppollpppllovollllllppllovpolllplollpvppplopopllllllllpvvolllllllllllllllllllooppolllllCCllllCvllllCllllooolClllll?llllllCClllllC?llClC?CCllClllC>CllC>>?CCCC>>CC>>??>?>>>CC>>>CC>>CC>>>>=C>=={@Y!      =s7777757557557577577577577577757577755777775775777777757777777777555757775757585577577575775557577757777755755757657777777755775575777775755767757777575775757577777775757557577777575577577557755757577575557757777577777755775577755575557777757557775555775575757577677775775777757577775577577757555557757775577777775757557757777757577777577777757557577565577555557857775777755757777755775757755775777777557777777775757575577777777577Տ}lClllllllllllllllplClollloollllpllllllplpollllllolloolllpllplploolpploppoollllopllopllopplopllpppplpplplooopopvopplopvlppppppppppppplpppvplopppppppopplppopopvpppopvpoovpooppppppppppolppoopppppppopplloppvvpplooppppppoopplpoppopppllpvplpllplopplllppollpvpllllolololopppolllolllopooplpppolllllllllvvllopllllolllllopllllpllolllllCllllllluuCllllCllllllllllCllllClllClCllllCCCCCCCCCllllCllCCCCCCCCCCCCCC???CC>?C>C>>?CC>>?>>>C>?C>>>>>=C ;Yq575757757575577557577577757557755757575877777577777777775577757757575757757577757557775777757555775775757577585557755557777775575757775757777557577775558575555775557575557777757575777777775577557775775777777577777775755777557565777557575577557757775557575577575555575777577577757575777757555775775777575555775775558755557557575757775577755555777757775757575777757577757775557577575777577755576777755777576775577755775775555575557557775755777557755755555Տp?lllllllCllolllClloloplClllllllll?lllvpollolopolplllppopvvllllopoppllppplpoploppllopopppollpplpplpvvppoololopvplooooowvvvpoolllppvvploolpplpopoppolpp}ppolppppooolppplpppppppoppvpppolpvvpplopplollppvpppppolopppppllloppoloooppolpplloplllpvvvplpplloopvplpppvvppppppppllllppllopllppolllllllllppppllpplllpllpllpppolpvplllllllllllpoplllllllllllolCCCllCClll?ClCCllC>CCll?ClClll?ClClCC??CCllClC??CllCC?CllCC?>>>>CCC>>?lC>>CA>>>ClC>CCCC;[     !  =q5755775555755755575777785775757577875777777577577777577557777577757757557777575577777775557555757777775575757755755757577575555577777787557777555577577577777777577775757555577775757777577775577755777555757557775575557757757577777877577785557557557575757777757775757577577757777577775777755777757557757575575777575755775577557755775775757575775775755555555777577575557777755757777757585577575575575575577577777557557577577777777577578splllllllCllllllllllllpllllolllplllllllppllopllpplpollpplpppolpllpppllppllppppolopllpopppopllllpppplpvppoooopopppopopplwpvpppppploppoppooopppplopppplov}popoppploopvppplpvpppppopppppppooppvpolpppllooppppoppppppppoopollpppoppppppollooloploppvplovllllo|vlolppppppppopppolpplplovolllppppolllollopppllpopllllllllppplllopvlllllllolllppllllllluvlClllllllllClllCCll?llCCCCCl?llllll?>llCC??CClllCClC>ClllC>CCCC???CC>C>>C>CCC?CCCC>CCC?>>ACv;Z!=s575577767775777775777557577877575577777757757757755757575757777757785557757777677575777777575775577777755577575757775757577577677765577575577855757777757757577755777755775777785655775577577577557775557555555555555555777557777757555775577555575557577555677757557777775775757775776755577777777577575777777575555557757777577775558775755757575857575777757757775575775755777577757757777555775575757775577775755755775775777777557755775555777577757575557575757Վpllllolllollllllloopllllllpolloollppolllllpllllpoollppllllllppollollpvolloooolpopppoopplloppvvplplllvoopppppplpppvvvpvulopooppoopvvpppoopv|ppoppppvplvvppolpolpvpp}vvpolpppppploloolpvppoppv|pv}vpvppoopppoppvvpppppoopppvpppppppppppppppolpppolopvvpvplplppplllllppllpooppollllpvpoolllllollolllppollllloppllllloplolllllpplllllllllCllllloolllvuCollllllllllClllolCCllllCCCClC??llClllCCC?C??C?>>?>>>CCC?>>llCC>>ll?>>>?CCC>?????>>=>>>?>C ;Z!   !  !q7757577777575587857777777777777778777757757775777777777777777777557777775777755557757575757575775557755775565755555555557777555557757775575757575755755775777555757777577575757577777577755757775577577777775777557555675755575777577557555777757877575577775557757577757577557757757575777777777575757577575575755577755777777755775575557557556557755557577777775557555757777555757555775555555575557575577775557757777555755555757777775775575557575757577Տqlllllllppllllllppllllloloplllllllllpppollollllpppploplplollllllloooppollpplpooloppllpopolpvvpollllpppoppppppllovvvppvvoooppppolpvppppopppvppppppp|pppppvloppooppp|vpploppoooopooloovvplppppppppvvppppoppopppvvppppppppopvvppppppoopppopppppooolopppppvoolpvplpllopvllppopopllopppppooopollollpplppllllllllollllllllllllllplllllllpllllllllpllllllloCllllllllllllClll?lllllCllC?CllCClllCCCC??>>C?>>C?>?CC>?llCC?>Cl>>>>>>lC>>>???>C>>>>?>{;Z! !q77577777777757775577577557777875777777775757777757775757777577777777777775757777777577777577555777757575757775557575577755575777757777557767675777777577557777557777757577575575755577577575555755757577575577775557577557575557557777777757777757565757775757757755755755757557557555577557757575777775575557575577757555757777577558575757577755575575755575755757757557557777557757557577577557777777557557755577575755585757777577777757577557755577557577575577755776557777ӎqjCllllppllppollplllllplllllllppolllpolllllppoplllloppllllllppvllplollolopplplpplopplollppolpppvpplopvpoplppppooppopppwppppppvvpoppoppv|pvpllppvvpplloop}ppoppppooppplppvvppppvpppvpppppvpoooppppvppv|vppppooppooppppppllppllpppllpppopppppolppppploopppppvllppvllpplllplplplloollopollollopppolllllllollllppopppllllpppllllllllllplllllpolllllllovoollCCllllClCll?CllCCllllCCCllCCllClCCCllCCClllC?lClCCC?>?CC?CCClC??llCCCCC>>>?CCCC>>>>C @Y! p575575575757755757775767577777755757777775775777557777757775577777555757775777778777777775577577557757577757557767775755775755755777775777557577557757755577755555557757555577775757577777777777775577755775755575777557757577555575557575577775577557557757757767675577775575555777775557575775757777555757775557557757557757757575557777577577577557657775775757577578557775577775755777775775777777555757577775557575557575557757755577575575555555575577775555wlCllllllllpppplllllllooplllllpopplllollllpppopllllvpllllllooppllpplolplpplpplppolpplpooppplloppooolppppplopvpooppllplwppppppvpppopppppvvpoppppvvppllolp}pplpplpopppopopvv|ppvppppppplpppopppppppvpppvvvpppopppllppoppppppplppvpplpppllpppploopolpopopvppppolpopppppplllopllplpplppppopllloloppooollllppolollloopollopvppllllllplllllloollllllClllyullollloCllCCll?CClllCllllCClll?llCClCllCCClllC>?ClCCCCC?>??lC?ClCClCClCCCCC>>?CCCCC>>>;Y   9p757757577577777555757557775777577577777777777577787777777577555775777577775575577777557775775577755575777757555567575575555755755575777757785577575777575777777557777577567575757775755757575755755757757577757775757557755557557575775755775757777755677557557775557755555767557755557777577757767777577757755775577775557777755575577577557557555556755577755757755775557556557557575777775777577577757577757577577755777757555757777557575577775577757657777555775555777757775Տ}llvplllllllllplllllllllolopooolplllllllplllllllpooplpppplppppllpvvppooloopvvllllpoloopppppvpppppppppollpvpppppopplpopuopvppoppppolppopppvvvollppoplpvp|vpvvvplpppvpoppppopvpppppolpopvvppvppppoppoloppvpooppvplpvpoooppvvvplpppvppvvoopppvpoppplppoloppoppppploplploppppvvpollpllllpppppolllpllollppppllpppolllllllolllllllllllllppllpllCllpplllol{lppC?llllCCllllllCllCCClCllCClCCCCC?CCClCCllCClC?C??CllllCCCC>>?>CC>?CCCCCC?>>>>>>C>?u;Z $s5755557557577575775775577577777777777787777577857757577777777777777577777787757757777757777555757777575557775555757565557777577777755757555576757555755575777565757777557577757777757575755777555755775755757775577775555757575757757755577575777575757556575577757577777777755775775757755757575775775575557575755555775757577775555557775777575757777775765575555777777775755575775577755776575577557575557855575777777755557757775757557775555776777577777557757777758Տqllppllllllolllllllllllollopppplpllllllpolllopoppplllpppppppplllpppppvpopoppppollppllpppppvvppppppppplplopppppppllppppvoppvvplpvpoppplppp}}ppppopooopvvpppvw|ppplp}povvpoppppppppoppooppppppvvplpppopvvppppppppppvppooppvpplpppv|ppppppoppppppoppppplloopooppplpopllpopppppppolllplllppvvpplllllopllpplpppvpolllllolllllopplllllpppllpllllllvplClolouoolCClllCClllllllllll>?llClCCClCllC??CllCCllll>>?C??>ClllC?CCC>>CCC?CCCCCCCC>>>>>>>?!!!Z! !s7777775757557757555775755775777777785775777777877577777577575777775777777775777777775777575557787777757557557775777775575775757577757777757755777577577557575577575767757777757757575777575757577577577555555777557575577555755557757577575757777778757577775757557755577777555777555775757777575775757757575555757777775757757557555755757757777757777555575777775757757557577757757555877755575755575555577777787557775557757755777575755857577557777575757777555557757755557577555777755775ӏqjClllolllllllllllplllpllolllllloplplppollllooollplllllllpolllppollplpplplplopvplvpooppoooolllppvpppoppvppooooppoopvpovvpopvvppvppvvppoolpppvvvppppvpppplpppvpppppvplpvppolpopvpppvpppoppopppvolvpppvpoooooopppvppvppolplpppoolppploppppooopppoppppppppoppoopvvpllloppppololopopvppoppllllplvppolppopllllllppppllopolllolllllollplloolllllplllllllll{lllClllplllllllplllllCClllC??llCC?CC?llCCllClCCllClC??CCCC?>>?>ClC>>?>>>>>CC?>?CClCx@Y     =s7757577777757775575777575777778777757777757777775557777755775775777757577775777577777575775557777557777757577557577577775577777757775777777757777775577757767777757775577775575577777777577777757777757777777577577777577757557575557577575775577775577755777757777755757777777577557755777757577575777775777777557775775757777757555775577877777778577755577777757757777757775577757777575777757577755577755777775575Տplllllpllllllllollplllllpllllllllppoplolllpplpollolllllllpololvlllopllplopolpppppppopppoppollloopvppoopvvppploppppppppwvvoopvvvvvppvploplppp}pvvppvpppvolpppppppppppopvpppllpp|vvppppppopppvpppppppvvpppppopppvvpopppppllpvplopppoppooppplloppppppppvvpplppppv}voollpopoopllpoppvvoppppllopppvvllpppolllllpooooplpppllllllolloppplpplpllllollllllllll{lllClllllllllllllllClCCllC??llC>CC??ClllCClCClllCClCC>>CCC>>>?ClC?C>>>>?C>CC?CCCCC@Z =s777557775777755757775777777877757777577777555777775777575577577757775777777555577555555575775577577757755775755757575575775775557775577575777775567557575757777585577775775757777557777577777577777557575777777767777777575775777755757767777777775775757557555577775775557777757577757577777557757777777777777577577757557755757557575757755777777775858777575755577777775757757777577777757755777757Տqllllpllllllollllllllllppollppoolloploppllppolllpvppolppovppolplppopppplloopopplpppvpoopppppoppppolpppppppppppppppoool}vppoopppppppppopppvpvppppvppoopvppvppppvppplpppvpvvpppovppvpopppppopppppoopvpplpppoppppppplppv|vppppopppvpooppppppoovpppooooppppvopppllpppvppppppppllopplpvppolllppllpoollooppoolppplplllllllppplllvollolllllllllllllCCpplllllvllloololllllCCllllCllllClllllllllllClClll?C>llCClllCCClCCClCCCClCCC>?C?CC>>>?CCC>;Y !!!q55775757577755755557777777777777755777777777777777775777575757777777777757757555777777577577777777775777777777577577777757777777555577577755775777557775777575575757755785577777577755777755555777775757777777777577755755775557775757755777757775757757775577777777555555757777755555577577577757756577775777777557777577677777777575757777775575767757577577777777777775577577555775577777577755777757777555577757757splllllllllppolllllllllpppllppppllpplolopooplllpllpopppopppppoopvpopppolloopoppllv|ppppooppppppppollppplopopppppppploowpppoppppppppplpvpv|vppppppvppppppppppvppvvppppppp}|pppppplppppppppppvppplpppplpppppppppplpppvvppvppplovvvpopppppppopppppopllovppppopvpllpppvpppooppllppolpvppllovvollopolllllpppolpplpppllllllopllpplllplllllllplllllCllllllloollpvlllClll?CCllClllollllllolCllllllCClClClll?>CllC??ClCClllCCClC>CCCC?>>C>>Cl>A;Z!   =q7757775777775567757557777777777777778777777777777777577777777577785755777777777777577755777777577777777775777775575777777575557755557557575757775775777557765577775577777575775777577776777757575755777755757577557767757575775577555777777757777577577775777755577555777555757775577757757778757557755577757777575577557755775775775775777777557578575757577757577775Վpllllllllllllpllolpolllollllppllllpooollllppooppolpoppolpplloppolpppplpooplpppvlloplpovpooppppppvpppvpppvvpoppppvvpoppwpopppolplpvvvp|poppppppppppp|vpopvpov}poppppvvpppvvppop}vppppvpppppvvpppppppppvvppppppvvpoppppopv|pppopppp|pllvppvpoplpvpvvlppooppvvppplloopppvllpppppvplopopolpvpopolplopppoloollppllpplplllploollppollllllllllllllollppllllllluCoolllllvllllCllllllCCllC?llCCll?>CllCl?CCCllCCCCCClClCCCCl?CCC>>ClCC>>lC>>ClC;Y ! =q577777757777577577777777787777777777777777777777577777777777775577578775777775777777775775775777577755777757757778557757777777575777777755575777577777777575755777557577777777775757755775577777755577755777575777577557755757555577577757557777577557557775575777557577557777577777757777757777577577877555577755577777757555757775757775575577757777777755577777777575775775757plpllpoolllllllllolllllolpopollplllllllllploppppploolollppllloppllppplpppploopppllpllppppppplopvpvppvvpv|vppoppppvppoowppvpopplplp}|vpvpppppvpoppvvpvvppvppv}plpvvpv}plpvppoppvvpppvvppplp}}vvplopppppp}ppppppppopppplpppvppppppvpplovpopvppoppppvppplllpvvpoollpppvppppvpppppolllopopppppvpplllpvvvpollllllllopplloppplllppllllolllplllpoloppplpll?lClullplllllllllllllllllllCCClll?ll?CC>CllClCClllCCCCClClCCCCCCCCCC?>CCC?>CC?>?Clv#Y !   =s5757577777577775757577777777757775755777777777787877777777777777755577777777775757577777755755557777757575757777555875777775777577577777777577767577577777577557855777577577777777577555777787775757575755775755577577777757758777757755757777757757575577777775777777755557577755577777777777777755575757775777575555775575775757575776777577577755777577575567557775577757557757757757758577577777777777657775777777Տqollllplolllpolllllplollllpllloolopppplppplooplpolppppolpvpppoppplppvplppoopppppvpppppppppppppopopppppopvvoolopvpppvppvvppplp|ppvpppvppppppppppvppppopp|}plpvplppppp|popppvpppppppppvvv|povvppppv|v|popppppppppppvvvppopppvpppppppppppvpoppppppppppoppppvppoppppppppllpooppooppppppvppolppopolpplplpolooollpplplollpoollloollpllllllplllplllllllpollllol{lolllllllllClll?CllollClllllCCllol?ClCCC?ClCClCCllCC>ClC?C??>?ClCCClCC>>C>>C;Y   !!p77757777777777777575777577777777777887777777777775777777777777577777577777755777777775757777775777575757777757655775757777755777757757777775777575575755557577777775777755777777757577757757777755575755577575577655775775777777757557577777857775775775577577557577577777777775775577777575775575775777757775777777575777777777577777756575775757775775578557577577575575775755575777777557777778plpplpllllllppvollloppllollplllloppoppppppolpplloplpvpplpvvppvoppplpvppppppvvvppppppvllovpppllloppopopvvpopppppppppvpowppoppvvvv|voppppppppvpppppppplppvvpppvplpppvp|vplpv}vppppppppp}}}|pvppppp}}}vppppoppppplpv}|pvppppvpppppplpvpop|pppppppvvppoopppppollppppllpppoplloplpppvpppppvllppplopvollopploppollppopppllolllllploolllolpollllollllllpllllloovoll?lllllC?lopl?lollllllCCClClloollCCCCC>?CCCllCCl?>Cll??>>>?>?ClC>CCC>lC>>u;Z!! q7755777755555775757555557787778777777775757777777577777877777777777777777777777777777577777577575757575757777777755577777577575776757577755777577777775755755575775775577777755575577777757775777777575777755575775575577775775575577755755567577775557755577777575777777755577755575766775757777777575577757775777555757555557775577777775575757577777575777777557777777757775755575755755777755577777777775777777757777677577Վpolllllllllpllollllpoollvpllllppoopppplollllppoopvolopollpolppooplopopoppppppopppplp|plv}pppopop}pppooppopppvpppppvpppwvpopppppvpvpppppvpppppopppppppvvppppppvpppp|ppppvppvvpppvppppppppppp}oopmv|ppv|vpppppvvpppppoppppppppppvpop|ppv|plpvpoppppoopvpppppopppppllvpolpvpppoolpvplplpwplpoollvppppooollppoopplllppopplollpppolllplllloolllllpolllplllllllolCllllllllllllCllllllllllllCllCCCClllCCClC?lllCCCClC?CCC?CCCCCll?>CCCC?>C;Y $q755755757577777777777777777777777775777777777577777777777757777757777777575777777577575777775757777777777757777757577775775555577777575577777557777775777777577575575777777777775757777777577555775775757755555575757555757577777777757775777577577775577577777577557757775755755777777755557757557575555775775575577775757557757777557756575557577757555775775777775775557555775757plllllpvollvpllllpolollolpopooppppolllopllllpplloplopolllollvvppplovpllppoolpppppolpvpppppppppopvvppppllllp}ppppppvpppvvppvpppvppp|ppppvv}vpppp}}vvpp|}popop|vv|plplopv}pp||pppp|||vpppppppppoopvvlopv}}}vplpvvpppppppvvpppopvvvvvvvvvppppppoploopppvplllopppppplpvppplvvvplplpvppooppppoollllllpvpopplopppvplllloppppllolpopplppplllpollllloplllllppllllovCCollllllC>CllCllC?CllllllCllCClllllllllllClllCC>>???lll?ClllCllC?CClC>?{!;Z   !   p7775775577777577577575557577878777777757777777777877777777777777757557777777777577775775777775777775577577777577775555777555777555775777555575778777777577557557757578757575757777577577777777777756775777775577777577777557575577777575557775777777575757575757557577775777787775575757775577577757557777757577777777757755777775557577757557777775777577576575575575877777577755775777775775777775775577557577757777777777555775777777567757575557755577777557775Տqlllplllolllvllplolppoplllllooolpplollppplllpvoopopooopppvplopoppllvplovplpppoppopopvppppppppplpppvppplpppvppppppoppv}vvppppppppppppppppp|vppppppppppppppp|vvpppvvpvopvpppvpppppvpvpppppppvvppplp}ppppvvppppp|vopppvvppvprvopppppppppppppppppppppppp}pppop}ppvpvolppppppooplplppolppoppppppppplvpppllpopplopvllppopollpppololooolloppollplllllpollpplllCllvlllllllplllllllllClllllC?lllllCllllC?CClll?CCClClllCCCCCCCCCCCCC?>>>CCCC;Y!=q7775777775757787777775877575775777777877777777777777577777777777777757777777777775755577757775557777575757757777777777775555775785777557575577575577757557777775757577777755777577777757777776777755757557775775777777777777777777777777777777577555757757777775555777777775777757777777577777777777777757777577577757775775775777777557777777775557775757577577777577577577577577577777577775557777757577775785775777777777757777557575775575}llplllllllppvvpplollpvplllllppoloppllovvolpv|pppppplpvvvppolpppvllpoovvpplllppooopvvpplllllpppoppppppplpv|ppvvppplp|vvlloppppppv}plppplpp|vvpopppppppvppvv}}popv}}vpppoplpppvpp}ppvppppp}|}v}vppvvppppppppp|}ppppp}vppppvvpoplppppollo}}vvvpopvpv|pppppppvplvpppopvp}pppllolllllpppllllopvppvvpvpolllppplloolloolppploppopllllllllvvppppploollpllplllllpolllllolllllllppolCCCllllClllol?CllllCCClllC>?CCCClllC>CC>Cll>>>>?C>>>CC!Y!    !!  =77587755775777775777587777757775777775575575777755577777755577577777577577777757555757777757577777577777755775577555775777755557777757877777777775777757557777577777777755577557777777777575755775777577757755777777777577775777757576757757575777777757777777565775575557775757777755557777557777577777577555877577777777577775757775777577777777757577777575755577775777577777777575777777777777577775577777757757777777757777775777557775777777775557777777777777575575775777Տqolllpllllllpopollolpoppooplllpolloploppppplppllppppolpppopppvppplppppppooppopppppppppppppoppvppppppvvppppvvppppppppppwpppppv}pppvppp}vppvpppppppv|vppvpppov}ppppp}plpvppvppvvppppppppppv|ppppppppvvpppppopppvpppopv|pppppppopp}vpppppppppppvpppppvpppvppppvpoppvpppopolpvppppplppppppooppplpppppllpopppooopoppoollllloooopllpoppollllplllllllpolllllollllllulllllClvllClllllllllll?llllCClllClllClCCllCCCC?ClCClll??lCCC??ll>>CCl;Z !w77777557575777777755557877787777777777777757757787777777557775777777775577577777757577777777575577757777755777577777777755777575775557757755775777777575777757757777777777557775555777775777777577557575777557777575577777577775777777775777777577577575777575757775555775577777757577755777777577777577775777777577757757777777777775755557777777775777777577777775777577777857777557557777575775777775777577777777577757775577777775775577775777755755777577777777777775577splllllllopllllllllpppvpppppllloollpvpppolvppopollooplllplpp|vvppplovpppoopppppppp}popoppv}vppp}vppp|}}ppvvppvpv|||pppp}}}pop}}|v||vpv}vpv|pooopvp}}}|vpppvp|}ppplp||pv}}}pvvpppppppv|ppp}}ppoppv}vpppvppppppop}}pppppopvvvvppppvvpopvvppoppp|vppooppllpvv|ppppllplpvppolpv|vppvpppppvvvpollloplplllolpopolllppplopplllllppplllollllllllllpolppppllloplllllllvoCClllllll?>llpvlCCC?Cll?lCCl?>lllClC?ClllClC>>?>>CllCCClClC>ClCCC> !Y!    7p7555577777755577777577557577787775777577757775778575777757757777575778577777577577775777777757577757577777757757777777577775575575755577755755777775787757577555777777777777755555757755777757777755777777777555777777757755557777777557577775757757577757777775587757557777775775775775575757775777577777775775575557777777775777777555777755775777577575557775757775777757777775757777777777775757785577777777777757575777777777757555757777755777577775777ӏpoplollpplloplllollollpllovpllvpllppopppppllllpppoplppplpppppopppopvppppppppvpplopppvppppppplpvpppppvpop}vppppppvpppppwvppppp|vvpppppppppvvppppvpvpppppppppp}p|ppppppppppv}ppppppvpppvppppppv}ppppppv|ppppvppppvpppvvppppppvvppppppv|ppolpppvpppppvpppvpvplpvpopppvppoppppppppppppppppppplovpppllppppoopvlpplppolpoppolooppoolollopolllollllollollplpolllllllyplllllllpoCllllllllllllllClllClllClol>lll>lllllClCClClC??ll??CCCCCl;Y  !q777777577777775756577777575$775777575777775777777778757777777777777757775575777777757775777775755755777777577777777777577575777557555775577575557757775577775777575555777577775777777775777775857775577577775755575775775757757777775777777755575777577757755555575777777777777775577777555777775557777777777557577777757577577575577777575757555775777777577775777755787777777575855577757775775777775557777777577777757775755755775757875757577777757757575775757777775576775577557777757577557777՟pllloolooloppopppolllllllp}vlovvpppolopllloplllolppolpoplppollollppppolpvpoppplllopppppvppppo|}}vpoppplpppplpp|pp|ppop}vppppvvppppppoppppppppppoppppppppppppvpp}|}vpppv|pp}|vv}}}}ppp}plppp}}pppv|vpvvpv}vv}}pppvpv}}|vpppp|}|poopp}|vpplppplpppppp|v||ppppp|}vplp}plovppplppolppllloppoppppllppllpvpvpppvppppppolllpppploppolppllpplllolllllppllllloopolllllulvplClCllllll?lllovlllopplllllllClllllClClllllllllCClll?>ClCCllC??#Y!!!!!  q7775777777775575775775777777775777755777777757787775757577777757777557877777777777777577775775757775757577577777777775755557775777775555555555575777575557775677775755777777577555555557757777555757777777775775575757775577577777577577775757777757757577757575777577775555775777575777777578577557555777775777555757755577777775777757777755777755575775755757757777777587577777777777777777577777775777777778575777777777775777777775757777577777777757577777557775777757755777slllllllloplllpollooppllllppllpppppppolloopvolppppolpopppppoppplovppplov|oopppppopvpppppvpppppppppppppvpppvpppppppppppwpppppvvpppvppppppppppp|vppvvppppp}ppp|popppppppvppppppp|vv|op|}ppppv}ppppp|ppppvvppp}pvpppppvrvpppppvppppppppppvpppvpppvpppppppppppppppv|lp|vpppvpvplpppvppplpvpopppppppppllpppvplpvllpopvopopolplopppooollllolllvplllollllllllpplllllplvllllllllpCClllllllllllllllllllllClll>lllCCClllCCCCCC??llCCCCCCu@Z   ! !q7775777777775775775775557775777757775=77777775777577777775757777777755775777557577787575775757777775775777557575777555577777777775775577577557777575755777557777577757777777777777777755757757555578755755777557777775775577775757757555577777777777557557577777757777777757777777775557557777755555777757577777577787757757775557757777775757777557777775775577657755577557577577575775755577775777757577777575777757777577775777577577775777877757757777775577557577557577577757777857577777pjlllllllpvplpplppllpvvpllllllllppppopopppv|ppv}pplpvvpvvvppppopppppvpppplpvvvvvv|vppoopplpvpllpppppv}}}pppvpppppvvvv}wvvvvpppppplpv}}}}|v}|v}}pp|pv|v}pppv}vpmpv||pppppppppp||pppppp}pppp|vv||ppvpppppppp}}|pppppppppppp|ppppvp}}popv|vopp||vvpp}vpppvvpplpllppll}}vpopvvpplp|vpvvpp}}pooppvplopppppvpooopollpppopppllllloppppllppolpollllpvolpppolllllllplllllopolllllllllllolll?CCl>CC?Cl?CCC>?Cll>>lCCllClCCCCC???llC?CCCCC@Y    !=p5775857757757557775777777755777=5787757=5777=5=577777577575777577877777777777777775757775757555777577777777775775775555555757775777557575757575577555577577777777777775777575775777777757755757777755577575575757755577777557577755775777577555755777757775775557757655777757577777577777577775758575757755577777755777555777557755555577777777757757577775775577777775575757557577855787757577557557777777775577555757777777777777755775757777757755575577777ӏqlllpopllopooolppplppploploopplopopplppplppppppvooolpvplppppplp|poppppvoppppvpppppppppppppop|pppvvpppppppp|vppvvpppp}}wvppprpppvppp}ppp|vpvop|vpppp||v|ppp}p|pov}vpvvppp}|ppppppppvpvpppp|pprvppp|pppppppvppppppp}vvppppppppppppppppvpppppvvppppppppvpvpvppvpvopoo|vpvpoppp}olpppppppppvppppploopppolpppppolpppolpppopoppllppollpovpllllpollpplolooolllllllllpl{llolllllllllllllllllllllC?lllllCllllC>lll?CllClCClCCClCCCll??Cu @Z =s7575777775587777557577557757755=577777777777777877>77775=7755775777777777555777777777777775775775775777575777755777577777777775577757775577757777777777555775757757575777777777757777777775557757557575575775777675755777775757777577777755778577575757777777575757555777757757777775577557577757557787555557575777777775777575757777757575777757577755777675777557775777857777777777575575575777777775777757555777775555557577577777777575775577s}ppv|vvpllllooollloloollovvv}ppooopollopollllpopopllpvpllpopppv}plppooppllp}popvpppppvvv}}pv}}ppolpppppppv|vplpv|pppvvvppppv}}}|v|ppoppploppp}}}pvv||p|vpvvp||p|vpppp|pppvpppppppv}}vppp}}ppvpppvppv|}||vpppppvpp|vppp}}vp|}}}}vpp}}popppvpppopllppopppvvppppppvplpplpllppv}pppplopplpllopppppvvopllloppplpllpplpvpllppppvpovplllv|plllo|vpllpllllllpvvpplloppllolooolllllllollllllClolll?lollllllClllllllC?ClllCClCCCCllCCClC @Y! !!! p75777577777757577575557777877777557757777775777777777777777757775777777777777775777757777777777757757775777555577775777575757775757755555577575767777555557575557775555577777755757575777757577577775575777755777777577755777577757777555775557777777575775777557557657777577775777577777557777777777755775777777775777777777757557575577757777777577757777777757758775775577775755757577757777777577777777758557577555677575777777777777Տsllpplllllloppoolpvplopoopppooooppppllvvppllp|llvvpoppplp}plp|vpplpvpppppppv|oopppoppp|pppppvvppppppppppppvpppppppppppwvv}vpp|pop}vppppvvvvpp}|v|pvpvpppvpvvvvvppp}ppv}ppvvvppvvppv||}pp}}ppppv|ppp}pp||vppppvpppvppppp|p|vpp|vppppvppppp||ppp|plp}ppppp|pppppvpppppppplpvpppvplpvpopvplpppppppppooopppllpplopppppplpppppplppploopvplllpvpllpoplllllplpolllloollvllllllllllllllllllClllllllolClClllClllllllll>llCCCllCCll?Cllu@Y !q7775757757775755777577575575777777775=78777887777787775777577775777777777777575577775777757577775757577777775555777777777775577777757557557777777575757577757777777777577777757755777777777877577575757775575757577757577755775577777777775757777777777755555777555775757577777777555577577577775577777777757557757775755575777755577775577785775777777757775577757577775777557577757575757577577777757775757775775757777777777777777777557775՟plllollllpopolllllppllpplllllvvvpooolpv|vpllvvppp}vplopovvllpvlovpop}|vv}pplppppppp|p}}vpoopppv|v||v|vvppp}}}|pppppppv|p|p|vvppp}pp|vp|vrppppppvv|vppopppopp|ppppvrppv}pp|}}}||pppppppo}}pppp||pp|pppvrvv}|v|vpv}|||vppv|ppvvppppplpppppppppp|}ppv}}popv}pppv|vp}vpopvov|ppopopvplppvppvppollop}|vppvppvvpopvvplllollolllllpolpplplpvpllolllllllllloplplopllllll{lllooolCClllClloollllCC>lllCj>lolllllC?ClCCC>ClolClCCCl>>CC ;Y  ! !  !s558767777777775577577777777577777757777777777777777575777757887777757775577777577757777777777757777775755775775757775777577575555575777757575857577777758777575555755577777557777577875775557777577777575777775577757575577575777577757575777557777777577755777777555777777757755777575777757775557577557775775557777777777757757578777777755775777775577777755577777575877777755577755777777775777555Տpllppllllppopppolopolllppppppppppppploppppppppppppvppppppppppopppppvpvpvppplppppvpppvppppp}popvvvvvpv|vvpppppppp}}pppp}vvvvvppv|vpppp||pvppvppp|p||vvppp|plrv||pvppplppp}p}|p}pp|p}|vppp||vvv|v|ppppp}pvppvvvvpppvvvppvvppp||pppp|vppppvpvvppppvvpppvppppvpppppppvpppppovvvvplpppppppvpvvlooppoppvvlpppv|ppppppppllpvplpollppolpoloppppollpploppllpopooolllllllllpClllplllClolllllllllllllllllCClplClllllCCCCllClllCCllCC>?lx;Y !q57775777777777757557777777577778777577777777787577775787755757787775775777777777777777777757777755777777777777577777587758775757755757557757757577777757777777775775775757577777575755575777777777777777777557575555577555777557777775575577785775557757575775777775775755775777557775575775555775777555757577577775755577775557777777777777777755775777777555777757577577577755577557877575767777577557775757555777577}pppllppllpllooopppploppvppppllloopppppllppplllooopvvollppvvoopppplpplplpp}vpoopllp|pooop}}plppppvppppppppppop|p|povppvpppppppv~}}}|pvvvpppp}}vpvvrp}v}}}pp|pp|}p}}}}p}pppppppppppppv}vppppppvvvvvppvpppvppp|}}ppppvvpppppppppppp|}||vv}}p|v|vpp||pppvvpplopppv||vp}vppoppppvploppvvppppop}|pppppvpplllpplolllppvppvplllopvvvollpvplllllloppvpopplolllllllllppvvvvpllllCll>lloolllllllllllClClllllC??Cllll?Cll??CC>>>CClCCl  !Z   !      7p5575777755775577555777775777777777775875775777777777777557$7577555777577775777757775775775757777757757577757777777757775565755757577555775755757577757555757775757755777777577777557577785777777557775757755757757575555775775755777757775775577575777757757577575777555777575575777577757577755577875777777557755555555575757557777775757555777575557557775757777757557557577757757575578775757557577577777577777775755777777757755555757ӏpollloppoolpllppppppoopvplppplpppppppppopppllppvpp|ppopppppplp|pppoppppppppploppppvpppppppppp|vpppp}vpp||ppppppvppp|vwvppppp|}||p|}ppprvppvv}ppp|v}}p|vpvvvpv}pop}|v|pppppp|v|vpp|pp|ppppppvrpp}vpppppppppp|v|vppp}|pp||ppvpv|vvppvppp|vvpvvvp|}pppp|ppoppppvvvppv|povppppovvplppp|popopppvpoovpppopoppplloopppop|ppppllpppppppoollvolllpppvpllvplplpllllloplpppllllllllllllloplllllolClllllllllllol>CllllCCCCCClC?CCCCCCCv@Y  !!p5777775777757557755777777777777775777777777577777777787=7757775=777777557777757777757575775777777777775757757575555555757785555777757577557557775777757757677757577577777777755755557775557577555767557577777575577777757757775575577877575577577577577755777765575777575577757757575775575755575777557577777555777557575777757557777557775557775775777777575755557775777757777555775777775775755577777557558755577575755757855558577755777775775755777֠}lloppllloppllllllllopllppooolllvppppppvploppppplopvppolpvvppllppp}}|pvpolppv|p}}vpop}ppppppppvpppppppppvvpppppop}}pvv}vpppp|ppppp}}pp}ppv}pv}ppppppppppppppv}}pv|pppv}}}rv|ppppv|}vppv||}}p|vppp}pv|}vppvppppppop|}pv|ppppppv||vpppppv}poppppppvp}vpv}v}}|vpppolpoppp}vpoo|}vppoopppppppppplpppllooppv}vvplopllllllv|vppplpopolllopvopplllopllppoppllpolplllll?llulpvlllppplpollllllllppolllllCllol?lolCC?lllllllllllClll@Y  !!!      !! q777777777777557675777=777777775=5777777875577778755557577777577575777777777777777577777775777777775777777577577575757555755757577577775555755577557555775757777555777575775555557577577757555755757585577577777757777755757575777575577755755775757755755757755577575555755757577577557755775757775755757777575777777755777755757777777557777775577755777777757757555577575757757777555577575755777775555557775555755758ӏqlooppollloollpllppplppolopppplp|vlpvvoppppppopplppppppppppppoo|plpppvpppppppvvvvppppvvppppvppppvpppvppppvvpvvppvvpppp}v|pppv}ppvp|}|v|vppp||}|pp}}po|}pppvppv|pppppppp}}}pvvp|ppp|v|pv}p|}|ppppppv}v}ppp|pppvppppppp|p}ppppppp}}|vpppp|vvppvppp}pvppp}}p|pvpvvvooppppvppvppvpv}poppppplpvpppppppoopoppppppolpppooplpppvwpoppplpllpplopoloolpploppoollpvllolpllplClloollllllllllollllllllllllClolClllCllllC>lllCClClllCllll ;Z ! 9q577775777755577755577777757777777775757777755=7575775577775777757577557577777777577757757756757575777575757757775775577757577575577557577555577757555577775577575755777575775757577757775557555757775555555757755777757777777757777777757577775575555555577575757775755758555777557555777777577557575575577577577757575577777777777757775775755575755775585555557567755575775777557757775577755577775557555775575755775757755qpppllpoopllpvplolppllppppoopvllppllvppllppvppppvvpppvvpllopvvv}volopvpp}pppp|pppp|volp}vvpp|vv|vppv|pp|vrpv}}pp|}vppvvop}}|ppppppppvppv}|ppppppp|vppv|p|}}vp|}v}}}vv|vp}vpppv|}pv|pp}}}ppp}vppv}|v|p||p}}|pp}}}}|}vpppv}}|v|vppppvvpvpoppv||ppvpppvop}pppppppppopvvvvv}vplloopvpopvv}vooppvvpvppoppvvoooovpppvvvvvplllpplllplllpppollplllloplllooollloplllplllvplloolpplllllllCClllCCllCCllllllllCllCCopolCCllCllllCCCCC?{;Y!!!!! ! =}5755757755755577555555775775757777777777755777777777557777777777757777777757757755777777577755777577577775777577777777777777555775557575757555775577555757777775757757577575775577557755555575777777555557777585585757577575557857757577755557757777755557757755557755755757777757777757777755757575557755757577577557577557775575555755755555757777555757575755755575555577757577757755555777575555577757577755577557577757555577777577ӎsppolloppollpolppplllovvpppppppopvpoppppllpppppppvvppvplpppppppvppopvpppvpopp|ppppvvpp}vppppp|}vppv|}ppp}vppp|pp|}vppvvvv|v|ppp|pppp|pp~}pvppvppppppopvp}vprw}pp}}}vvvpvpp|p}vppvvpp}}vp|p}}vppp}v|vppvv}|vv|}}||v}vpppp}}|pp}ppp}}pvppppv}vvvvvpp}vpppp|vvpvvpvppvvpp}}vpoopppppoopvvvooppvpvvpoppopvvpoopvpppppoopppppoooppollvpoloollollpvllolpololllppoolollpplCvvlllpllloollllllC?lllllllllllllClllClllllllll?lllllCCl@Y !q757555777555755757775757755577777577777575777577777777777777575757757755777777755755557775777775777577777755777577757777575755775557575755575575757557577555555757757755575777775775757575575755777757777755775777577755577777755577775555577575557575557555775755557557577555575577575775557555777777785575557755757557755755775555577757757575775757757555755755775755777755755557757577558575757577577777775777775557755555575775577757Տplllopppplpvvppvvppllppllollollpplllppppopppppopvpoppplpvpooppppvv||pv|ppoppop}}vpppp||pppvvpppplv|pvvpp|vvvpppv|vp}|ppp|ppvpv}pvvpppp}vppv|}|p}}}||}}}|pppppv|vpvrv}pppvvpp}||||pp}}pppp|pp}}|ppp}}|pppppppppppppp}vpppv}ppvvpppvppv|vppvppvpppv}ppvvv}vvvppp|vvpppo|vpv}|}}}vvv}vppopvvvvvvplpvvolppppvpopppoppllopooloopvvov|vvpvpopvpplpvppollllopllllllolllplllllloopllplllllllCllllC?C??llllCllll>llllllllCCllCCCCC;[     !q755575575775777575775787777557775757777757777777557577777577777577577855775777757755777775777757557577775757777757575775575577777577555755577575557775555575755577577755755555557777555575555775777775757575575777575555775557777757757555755775557555775757575555557557777557775575575757575777775777755775757575575757755577775575575555557757557755757557757575775555777575775577555577855757555577757555577775757775757557575775757757ӎsplpppopllppvppppppllopoolpppolopplppppoppvvpvpopop|ploppoppopppppvvvppvppvpppv|vppp}plpvppppp|ppp}pv|vv|}ppppvrpp|}pp}vpvv|v|}vv|vpppppp}pp||p|}}~p|}}}|pppp}|vp|}vp|}pp|}pp|}|}|p|v|ppv|pvp|}||}pp}|pppp|vpppopppvv|pp|vvvppppvppvp|||vpppvvvvvvppvvvv}||vpoov}vpvppwvvvvwwv}vvpvvvvpovvvvvvvvpvplovvovppppvoppoolooopvopoooppopovvvlooopppvvvvpllllvlovlllloololClvolooollllolllCllolCoplCCClllllClllllCClCCllllClCClllu;Z  q77777757557777777557757777777777777757777757775577577777777777875775577577777577755775777777575755575577877775777755577775755775777757775555777755555577757557757757577757775557557555777555775557775575757757775777555555757557775575555755577777775775575775757557775855557575757555755777555577755575775557775555577755557557577575555557577757555777775757757575557575775757577577755757777777557577557757575575575757575757Վpllopoloppooolplllppplppppvpoplpv|ppvpopppppvpppppvvpp|}ppv||vpppppppppvv}|vvvpo|pop}ppv}}vppv}}ppppppppppv|vpp|ppvvpp}p|}||ppppp|||p||vp|}pppp}ppppppppppp}vp|||p|ppv|vppp}pppp|}pppppv}}|pppppv}|pp}|vvvvv}}vpv}}vvp}}vvvv}}}}vpppvvvv}}|vppppvvovpvvvvvv}v}vp}}vvpopvvvvpopvvvovvvv}vvvvvvoopv}wvv}}vvuvovvvpvwvvvvvvwvvpopvppopovvlvvpvpoollopovplovv|vouvovoopllollolooollpoolllll?lpllllollllllllll?lollCCC?ClolCCl{@Y!!!! !  m775575775757757775757757777777757777777775775775777=575577777757777775777777777777575577757755777777755777577775777575575757775575775555555577755755777558757555557555775577777575757757557575757775757775755575757777555557777775777557577575557757558555777557557757585577757777587757777555775757577777575775757557755575575755577575577777775777775577577755557575575755555755755575555575777555577755557577755555757577577577555557757ӎpolpplppoppopoolllopppooloppoopppvpp|vppppvvppppolp|pvvppppvvpppp||pppv}|pv|}vppvpopv|||}}|ppp}vvppppppppvp}pppppppvvvww}p}ppppppvp|vp}ppvvpp}}vpppp}pppvpv}pv|}}vpppprp}rppvpvpp|vpp}v}rwppvpvvvvvp}|vpv|pvvv|}}p}}ppw}v}vpw}}vvvpvvvv|v}}vvppvwvvvvvvv}vvv}wvvvvvvvpvwvvvvvvvpvvvwpvvwvvwvvvvovwvvvvwwvvvvvvvvv}vvovvvvvvvvvvvvvuvvvvvvvvvvpllvvpvuooppvvvpvpvoloollvullloovlopllllllClloollllllllollllCClloCCCllClolCCC@Y  ! !!p75577775555755755755575555775577777755757577577757778877777757777775777777775777$77577777757575777757757777777777757757757777757775777577575575577755577577787555555777775577557577755757757555777577775777757575577557557575757557555757757775577577575575577775555777577557557557575575757757757775757557577755577755775775575755757577755777757777757755757575757755555577577775577777757555575775557755575577577775755555775777755555775577577755577757555՟}lpppollpppppllopppp}vpppppoop}ppoooppopplpppppvplp||ppppopppp|pvvpppplppppppp||pppvppvppppvopppp}}}pppvppppp}|vvv|vvv}ppppv|}|p|}v}vpppr}}pp}|pp}}}}pp}}}rvp}pp}p|}p|vv}vp|vv|}}|v}|vvvvvvv}}v||v|vv|vpv}}}vvv}vvv}}ppvv}}vvw}v}vv||vvvvv}wvvv}}v}vvovvvvv}}vvvvvvvv}}vvvvwvvuvvvw}vvvvvvvvvvuvwvvvpv}vvvvvvvouvvovvoovvvovvvuoovooooouooouolvuvvooloolovulooolpvvlolollllllllllouopllollolllllllllCCClllpllllCCllCllll;Y ! 7s5775757755755555755557557777757775577577575577577777777775575777877777777>57757777777757777577775775777787577777777777577577755777777777577757755557757557777577577555557757557557575777755775555755577577757555775577757757557577755777755577757575575575777755557775577575555575778755755755757557577577775555557555777575577557555757577757757555755775755775577775775575755755575755755755575775775755575577575777555577555775557577557555555575777775757557575բ}oopppoopvplllppvppv|poppppppppppplppppppoppvvpppopvpppppplppvpv|ppvvlpppolpppvvppvpvvp|vpvpppppp}}pvp}rvpppv}vv||}}}v}pp|vp}|p|}}p|ppp|}}pp}}pp|}}}p}v}}}pv}ppppv|vvpppvppvvv}}}pv|vp|vv|}}}pw}vvvpv}vvvvv}}}}vvv}vvw}}}}}v}vv}}}vvvvvvvvvwvvv}}vwvvvvvvv}wvvvvvvw}wvw}vvvvvvvvwvuvvvwvvvvvvvvvvuv}{vvuv{}vvvuvvuvvvvvvvvvuvuouvopvuluoluvvlououvoovvllvvuouvvoplvooololllllooooolooluollllllllllllllllllolCllCllll;Z  !!s757555575555575557777555757777577778575777777777777577777777575=777777777777777777775557777755757777775775777757777777777755575755575757557557575575557555757577777775557577757775755555755557557575575757757555775755575575755777757555575777577557787555755577755557557755557575775555775555577575555777555757557755577555575555777555575575557555557777775755755755557575757557777575777575577555575775755757757775757557577755755777575755775577575575}llloopllloplpopppllpppppopppplpvpploooppppppppppppvvpp|vp}pp|ppplppppp}pppvv|ppov||pplppv|vr|vvppoppv}}pv}||vppvppppp}pp}pppv|pv}|}}|pppp||p}}pp}}ppp|pvppp}}pvpvv}}}p}}}|vpv}vvv|}vvw}vvvvvvv}v}vv}}}wvv|wvvvw}}vvvvvvvvwwvvv}v}vvvwww}}wwvw}vvv}vvvvv}vvwvw}}vwvvvvwwvvvvvvwwvvvvvvv{vvvvvvvv{vvvvvvuwwvvvuvvvwwvuuv{vvvvvuv}{vvuvwvvovvvvvvvvuoovulppooouuouuullolovvoovlllooouollllllllllllClllllllCCllCCClllll@Y!  !=q777775577577575757777577577777757777757757777777777777777575775777557777777775777777777775777575575777757777575757777777777757577575755577755777755775555575755757775557555755555575755555577775757577575775577755557575555575775555555755555575755557777557577557555555775755575777785775575577557555757775557577575775557557555577555755555755555557557555575757855757555577575755777557775777777577555557555557557575Վsppollpollloopololllpvpplpoppolppplppplpppvppvpoppv}vv|}vp}pppppppppop|vvpp}}ppppp}|pppppp}}}}p}pppp|}}|}}|}}|pprpppppwp}}ppp|}}p}}p}}|p}pp}|v}}}vvpp|}ppp}v}vpppp}|}}}}}}}vvpp}}vp||v|}vv}vvw}}}vvw}}w}}}}}w}}wvvv}}vvvvvvwvw}vv}vvvvww}vwvwvwww}vwvw{}wwwwvuvwwvvw}vvvw{wvvvwwvuvvvvwwwvvvuvvvvvv{}vuuvw}{vuvvvvvvvvvvwvvvvv{vuuvvv{}vuvovvoluuuvuovuuv{lvvouvvvvuluvvuoolllllllluololllllllllllCCCllCllCC@Y  !=q5775575557575755757777757777577775757775755775777577777775=777775777775577777577757777777777775577757777757577775755757755755555577555557777557555755557557557557755557757577775775575775575555555555555757775757557555757555575755755575755575777555557577555757755777557757757757555777575755575555757557775555575557575575755555775555577775757557755575557555Տpooopvplppppplopvppppooopppp}vplpvppvvvplopppvpopppvpppppoppppvvppvpvvpppppv}pvppvpp|vv|pppp}||v|vpv}|pppppppppp|}}}powpv}|p|pv}v|ppp}}vvpv}|ppv}pppv}}vp}}|vv}}p}vvvppv}p}}v}vv}}}vwwvvvv}}}}}vvw}vw}}}vvwwwvw}}vw}ww}}w}}vvv}}wvvw}wvvvwvvwvwvwwvvvvw{vwvw}vvwwwwwvwwv}vvw}wvvvvvw}{vvvvvvvwvvvvvvvvvvv}{wv}vvvyvvwvvwvuvuvvvvvuvvvvuvvuuuuv{vuvuu}ulovuvuvuoouvoollotolulllulovolllouulolllllllllllCllllCl ;Z!   !  !!q5555575757777575555757775757577777777777777=5555777777575577777575557577777577577577777777777577777777777777755577777777577755557777577777757557757775777555557555555575757777555777757755557757755775755557775577777777755775577775757775757777575575777557575757557577575775557577557555757557555755755757557777575577557757555575557577575775755777555775777575555755575577755575577soolpvolpvppllppvppvppooopvvvvppv}vpp|vvpppppppplppppopppvolppv}ppp}|pppppppp}}pp}ppvpp||pp|}}|pp}||vpppvppppv}pp}}vppvvp}}}pp}pppppv}}}}v}}}ppppv}}p}}v|}}vv}~}v}}v}vvvvv}}}}vw}}v}}vvvvvw}}v}}}wv}}}vv}vvw}w}vvwvv}}wvwww}}wwwwwvwwvw}vvvv{vwwvvvvw{}}wvvwv}{}{}wvyvvvvuwwwvvvuvvvvvvvvvvv{vvv{w}wvv{{wvvvyvyvuvvuvvuuvuvywvvvouv{vuvwvuvuuuvvuvuluuuuuoouolulluvvuuvuulCuvvvuuutltllluvlCllCCCl!Z  ! q55777557557557777777757777777757777575757777777577777777777777777=7777775775777777777577577777575777575775=7775775777757757557777777577557777557575557575577777755757755757755577775575775557577577577757577757555755557775557555557557577575775577555557557775755555775757777577575575577757575557575557585555775755775757555575755777777757775575777Տ}opolopppoooppppvpoolppppppplplovppppppplppvvppv|vppppppp}vppop}vop}|ppvv|}ppv}ppppp}|pv}vpp|pv}pp|vpp|v|vv|ppp}|pprvv}p}|v|vpp|p}}pwpp|p}ppvp}|v|}vvv|v}vv}vv}vpv}w}w}vvv}w}}wv}}vw}vw}ww}wv}wv}}wwww}}wv}{ww}w}{w}ww}vvwww}wwwvwwwwwv{w}ww}vwvwww}{v}wv{v}{wvvvvwwvw}{wvwvvvv}{wv}w}v{vwvwvvuvvv{vvvvvvvuvvvwyvuvvvvuvyvvvvvuvuuvvvwvuvvvuuuvvuuuvvvuouvvuuvvvvuouullulouulllloullllluClulClullllC;Y   s5755757555555557577577777575777577577777777=57777557577777777777777757775777777777775775757777757777557775775577775777757757755577557775777755555555775575755555775755557775757755755757777755755577557557575575757577855755775555757577577557555757755757555757757755557577757555555577555577575757777777755575555577555555755555785775777577575557575575757757755777775Վqpppoopppoop|vpoppolpolppppplllploppppollpp}pppvvpppppplp||vpp|}||pp|||p}}}pv|||vppv}|v}}|vvpv}}}|ppp|}|pppv||p}}ppv}}}v}pv|vpp}}wvppppppvvppv}vvpv|}}vvvv}}}vvv}vv}vvvvvwww}}}}}w}w}}}}}vw}wwwvvvwwvvw}www}}}ww}wvv}vw}}}}ww}ww}}}}wvvvv{}}wwvv{}vvvvvvvv}www}}}wwv{}wvv{w{}}wwvvvvvv{}vvvuvvvvvvvvvvvvvvvuvwvvuuvuuuvvuuuuvuvuuvvvuuvuvw{vuvvvvvvvvvuuvulluluvvuuuoullCllullulClllluull@Y !!=s775575555757577575555775775777775777757577777575777577778777777777777777775755777777757577775777$7757777775777777575575777755775555755557557577757575755575757577755777557587555575775557575757777555557577557557757577577775575555555775555555575557577577775755555755757777555775555577775555577577557555777757877757775775557755755575777557755577577577557775777555555Տpppopppooolpppppopppvpppppppvvpppp|vvpppvpvvppvvpppvpppppvp}|pppp}}pvvvppvvvpppp}ppp|p|v|ppp|ppp||pppp}}vrpp}}ppv}vpvv}pv|v|vv}}}v|}|pvv}}}v}}v}vv|vw}}}}wvvv}wv}}w}w}}w}}wwwvww}w}w}w}ww}w}}{wvw}v}ww}wwwvw}{}{w}{}w{w}w{wwww}v}{ww}}}{vv}{vvvvvw}vv{wvwwv{vvvvvwvw{vvvwvwwwvyvvvvwv{vv{vvvv{vyvvv{vvvwyvvvv{wwwvyvvvvvvvvyvvuvuvvv{vuuvvouvuvuvuuuuvuuuuuuvvuvuluouvuloouuooulouulloouullloCC!;Z  $q77755757757757555777777777777577577777777577777575777557577777777775577777757757776=57777777777775575757777777557577775777757775757577777577755555757777775557755555755776575557775557775757755775555757775755555775755575775577755757555577577555775557575775775555755555755557555777775757755557755555757757775557575575577557775757755575777775555775757755575775775757775555757Տ}pllopvpllooplllppppppppppppv|pvvvppppppvvvpv}vppvv}pppp}}pp}volp}}}pp|vpp}vppppv|pppp|pp}}}pppp|}pvpp|vp}}}}pppp}|ppvwppp|}}}}}}|}}}v}}}}}}}}}vw}ww}w}}wv}}}w}}vww}wvwwvv}www}}w}ww}ww}}vvwwvvv{vwwwvv}}wv}wvvwwwwvvvw}ww}vvvw{vvww}vvvw}wwvvwv}vwwv}wvvv}{vv{}vvv{vvvv{}vvvv{vw}}wvvvvvvvvwvvvvw{wvvyv}w{vvuvyw{w{vvvvuuuvvuuvvvvuuuuvvuuuuuuuuuultuuuuvuuluvuoltuuluuvvuuoouuvvulllClt!;Z!!   p5755775755777557557775577757777757577775757777777777775757777777577775557775755$77775=7775777757777777=775777575777777777577577757777755777575777577577757755775577577757757575575577777755757575575577555557757757577557755757577557777555555557575757557577755575557757755555755575555757577557557557775575557557575777777555755557755575555557757557756555757775755575555757557557sllppppplpppvpopppvpopppppop}pppppppppvvpppp|vppvpvvppppp|ppp}|ppvppppp|vvrpvpp|pv}vpv}vpppvv|v|pvv|pp}}vvppv|vpvv|||v|vvv}|vv}vvv}}w}vww}v}}}vv}}}}www}wv}}ww}}ww}}v{}}}v}w}vw}{}wv}v{}w}}ww}v}{wwwwwwvw}}}}vw}ww}vwww}ww}w{wwv{vvv}{vvw}wvw}{vvvwwv}}vvwyvvvv}vvwvvv|{vwyvv{vvvvvwwyvvvvwuvvvw{vvvvvvvvvuvvuvvuvvvvuvwvvvuvvvvvuvvvuuvuuuvuuuuuuuuuuuuuuvuuuuuuuouuouutloutloo@Y   !q7555755555755757577775577775575777777575777757777775777777557775777757577777777777577777577775577575777757775775777777755777757577775777775777775777557557557575557757557775755555557557775755777577555577775755557575577775577575757777755775777575757555577555557575555575555755577775755557757557575757557575555577775575577557555755775557755555555557775555757575775557ӏpppppopopppvvppppppppoloppplppolppppov|vpopp}pppppp}ppp|p|vpp}}vppvpppvvpvvpp}pppp}|v}}vpppp}|vp|v||||}|ppv|}}}}}}ppvpvvv}}v|vvvvv}}wvv}}}}w}}}}w}vvvvwvw}vv}w}wv}wwwwww}wvww}wwwww}{}vvw}vww}}}}w}}}{vvvvv}wwv{}vwww}wwwvvvwvvv{vvvwwvvvww{}}wwvvvv{vwvvv{vvvvvwvvy{vvvuvvvvvvwwvvuvvvvvuuuvvvuuvv{vvu{vvvvwvuuuvvvuuuuuuvvuuuvuuuvuuluvvvvvvuoluuvuuuoouuvvuuu@Y!!  ! $w555555557577557575575777757775777777775777757577755777577775577775777755777757777777757777777757775777777777755576577775775575577577757557577775755575755755777577755757755777777555577577555555575775755575575755777557557557577555555755755757757575775557557557755575577775757555555775555555555755755557755775755577757555757557577757775557755557555575777775577575ӏsppoppopppppppppppopvpppppopvvppvpvvppppppvpvvppppp}ppp}pppppvppvppppvrpp||ppv}ppv}pvrvp}ppv}|pv|v|vvv|vpp}}|vwp}}pv}}}wv}v}}}w}v}w}ww}}ww}}ww}}}ww}}}}}w}}v}vwv}}w}wwwwwwww}}w}}w}w}}}wwwv}w}}}wwww}w}}{w}ww{wv}{v{w}vw}vw{vvvwvvwwvwwwvww{wwv}{wvv}}{wvvvvvwvvw}yvw{w}vvvvvvvvwvvvv{vyvuvvvvv{vvvvvvvv{vvvuvwvuvvvvvuvuuvvuu{vuvuuuuvyuuuuvvuuuvuuuvuuuuuuuuuuuouluuuuotuuuu9Y   q557575777757557555575757577775757775777777757577757775575777775777577757777557777557777757777757775777557755575775755555775575755557775575575757557755555575555555755775557557775577555557557775555757557777557757557577555555757557575755575557577555575755575577757557757757775757577755757555775755755557577557557757755555755777555775sqpplpploppppppoopvppppp|vplp}}}v|vpppopppp|pvppppppv|pppv|vppvv|||ppv}ppp|ppv}|pp}}}vvpp}ppr}pp|pppvvv|}}}}pppv}}}v|}}}wv}wv}v}}ww}w}}wvv}}vwwwww}}vvw}wvv}}}ww}www}w}}wvwww}wvvw}www{}}}vvvw{ww}wvwvvvww}wwv}wvvvvwvvwwvwwwwvv{vvw}wwwvw}wvw}wwvv{}wv{vvw}}vv{vvwvwvvvw}wwy}vvvvuvwvvvvuvwwvvvwvvuuw{vluvuuuuuuuvvuvwvvvvvuuuvvvvvvwuuvvvuuuuuuuutuuuuuuuuuuuCluollu ;Y   !!p575777555575757557577575777777775577555755755775777577777777777577577577777757777777777=57777775777787757775777777775757577557577575557575755557557557757575577557777755557575575757575755575577577775575575557577557557577777777755555555777775555755777757755557557755555555575555755555557557755557577777777557555757575557577557575sppvppoopppppppppppppppvpvppppppvppppppvvpppppvv|ppppp|ppppppvvp|v||ppvvv|v|ppp}pp}||p||vvvpv}vvvpv}v}vv|v|||vv}}|vvvv}}}vw}}}}}}w}v}}}wvw}}ww}}}}w}ww}w}}w}}{}}}{}www}}{}w}}}www}}w}}}w}{www}w}}ww}ww}w}wvwwv}{}{}wwvvvw{w}wwwwwwwwvw}wwwvwv{wwvv{vvvwwv{vvvwvvvvv}{vvvwwvv{vvvwvvvvvvvvvwvvuw}uvvvvuvuvvuvvuvvvvv{{vvuvvuuvvuvuuvvuuuvuuvuuuuuuuvvuouvuuuuuouuuluuuouu;Y ! =q7577555775775775775777557575775777775557757575757557577777777777557757777777775755777577777575777777757757777777757777777775755757755757755775757755777775575777557775555555757557577755777555755757755575755777575555555757755775575557577575775755755555577575777755555777757757555555555557555755755575577555577757775557555755577757557557ppppppppopppppopppoopvppv}vpppppppppppppppppp}}vpp}p}ppppppp|ppppvppppv|}p}vpv}}v|ppp|pp}}ppvv|vvv||v|vvvvvvvvv|v}vv}vvvvv}}ww}}}w}wwwwww{}www}ww}ww}}vwv}v}}ww}w}vvvvwwwwww}}wwwwwwwwwvw}vwwvvwvw}wwwwvvvvvw{}}w{}wvvvvww}{wvvvv{wvvvv{vvvw{}{wvvv{}vvv{vvw{{vvyvv{}wvvuuvvvywvvuuv{wvuuuuuuuvvvuuvuuuuuuuulluvuuouwvuvuuuulllouuuouuuZlu! ;Y !  !!q55555557575555557777777777777777777775777575675757777577775577777777777757577577577777775775777577775775757777575777777775557755785755775557755575555555757557777577575575777557755577755555557575555557757557557775575557755577755577755775777755775757557755577757557775775575555755557757775657555755555557Տpvvplpppppwppplpvpppppopppvpppppppvvppppv|vvppppppppppvpvvp|pvvpp|v|vrp|}vvpprpp}||vvv}v|vpvv}}}|vvvvvv}|v}wvv}wv}}vw}vww}}}w}}w}}www}ww}}}}}w}wwwwvvwwwww}}w}{}}w}w}}}w}w}w}www}{w}{wv}}}vw}vvwwwwwwvww}vww}}w}{v}wvw}}wwww{vvwwwwwwwwvwvv}}vvvvvvw{vvvvvwvvvvvw{uv{vvvvwvvvvv}{vvvvvvvvvvvwvuvv{vvvvvvuuvvvuvuvuuuvvvvuuuuuvuuuuuuuvvouuuuuuuluuuoluu9Y   !q7757555557777757575555755775757777575757777757757757777577=577775577787557777577757777777777=5777777757775777777575755577557555557577577755557775577755775555557555777777557575555557757577577575557577775555755555757777555787755777575575775555755775557775557555577Տspvppllllp|vvppvpppppplpppppppppp}|vvvpp}vppvppv|pppv}}v||vppprpv|p|}}}}vppp}}p}}pvpp}}}vpv}}}}}}vv}}}}}v}vvvw}}vvvvvww}wwwwwwvww}}}ww}}}wwvw}}vvvv}}ww}}}}}ww}{}ww}}wwwwwwwvw}ww}}}www}}vwvw}wvv}vww}wvvv{}}ww}{vw}w}vvwwvwwww}}wvvyvvwvvwwvww{}{}vwwwvvvvvuvvuuvwvvvvvvvvvv{wvvv{vvvv{vuvvuuyv{vvv{vuuuvwvuvuuvvuuvuvvvwvvuvuouvuuuluvvuuuuuuuuuuuuuuuou{@Y  ! !!o77575777575555757757577777777775557777575777775757777577777557777777777757775577755777577777877775777787777775757555575777777577577755577777555557557557575555775555555577575575777555575555777555557775555555577577557555775557575555577557585575775557755775555575755Տppppppppppvpppppvpppvppppppppppppppp}vpppppppp|vvpppp}vpp}pppp|pp}p|pppp}p}ppvv|}vvvvv}vpvp}}}vv}}vv}}v}vwv}vwvvw}}}w}}}}w}w}}w}}}}w}ww}{}w}}}}}}}w}ww}{}}}}}}w}wwww}}wwwwwww}w}w}}}}wwww{vwwwww}vw}{vv}wwvw}}}wvw}}{vw}{}wwv{vvvv}{wwvv}{vvvwwwwwwvvwvvvvv}wvvwvwwvvvvuvuvvvuvvwvvvvvuvvvvvuvvvuvuvv{vuuvvuuuuuvuvuuuvuvuouvuuuuuuuuuvuuuuuuuuuuuuuuou;Z! !q5775575575555755557575775777775777757757577777577777757775777775777775775=7777777777577757577777777577777557755555577777777577557577755555577575777555557557575555575575575555557755755757775557555555575777575777555575577555777775557757575555575555577757755755575575sqooppopvplloopppp|pvv|ppppppvpvppppp}vppppopv||pp||vv|pp|}popv}ppp}}pppppppvvvvpv|}|vpvv}}}}vvpvw}vvvw}wwv}}}}}}}}}}{}w}}w}wvww}}www}w}ww}wwww}ww}wwww}}w}}wwwwv}www}wwwv}wwwvww{vv}wwvwvw}}vw}}}vvv}}vw}w{}ww}wwwvwwwvw}wvvwvwwvwv}vvvvv{vvwww{www{wvwwww{}{vvvvvvuuvyvyvvvvw{vvuuvv{uuuuvvuvvuuvuuvvvvuuuuuvuouuuuvvvuuoouuouvuuuvuuvvvuuu@Y =}7575555555585777575557575775775775777777777757555777557777757757777775777577757777775=777775777777777777755777757757575575757757557577577555577557555777755757555775755577557775555755755755555777577555755757755555555557575575755557777555557577555557577577755757555557777555555555Տ}opppppppplpppvpppoppppppp|vpppppppp|pppppppvvpppv|ppppvv}vppvpvpvp}}pp}}pp|}}}vv|v}}vv}}ww}}vvv}}}vw}}v}}w}ww}ww}}}w}w}}w}}}}vw}ww}w}}w}vww}}www}w}ww}}ww}w}}}ww}}}}w}w}}w}wwwwwwwww}w}}}{}wvvww}{w}wwwv}wwwww}}wwwwwwwwww}wwvv{vv{www}vvw}wwwvvvv{vvwwwwvwvvvvvvwvvvvvvvvvvvvvvvvvvvv{vvvvuvvuvvvvvwuuvuvvvvuouuuluuuuuvvuuuuuuuuuuluvvuuuuuulu@Y !  !q55755557555575777777775557757575577775575757777775775557777777585755757757577577757777757757775577577557777577577775777577557785555755557755555777577555575575755575557565575775555555555577575575577755577555775555557577577555757557755555577757755755555555575557575757575557577575557՟sppvvvolpppvvpvvppoppoppopvppppvppppppp}}}v|ppppv|v|}p}}pv|v}}ppv|v}}|}}vpv}v}}vvvvv}}}}}vw}w}}w}www}}w}}vvw}}vwwvw}}wwvww}}w}w}}w}vwwv}}ww}vv}}}www}}wwwwww}wwww}vv}}wvvw}wwwwvwwvwvvwvvvwwvvvv}wvw}w{}vvv{}wvwwww}vwww{}wvv}}w{}wvvv{}}wwvvvvvv}}vvv{vvuvvvw}{wvwwvuuuvvw{vvvv{vwwwvuvuuvw{}vuvvuuuuvutuuuuuuvvuvuuuuvvvuuuuuuvvoluuuuul !@Y      q5555755775557755577757575777755757777755777755777577775777775757557775777777555757757777777575777577777777757777575757777757557555755755555757557555577755777577575575577555775557577555555555575555575555777757775757757577557557555575775557557757577757755555757775555575555575557755575777755Տppppppppppppppppppvpvpppppppvvppvppppppvvvv|vvppp}|pppv}vprvv}v|v}vpv|w}}v}vvvvvw}}vv}}}}w}}w}}}}}}v}}v}}w}wv}}w}}}}}}w}www}}}}w}w}}}}w}ww}}}}}ww}}}}}}}}}}wwv}}ww}vw}ww}}}}}www}wv}w}wwwvv{w}wvw}}wvvw}wwwwwwwwvw}wvw}}{vvwwww{vwv{vvw}vvv{w{w{vvwyvvv}{vvwvyvwwvvvuvvvvvvvv{vuvuuvvvuvvuuvuvvvuuuvvvvuuuuuvvuvuutuuvuuuuuuuuuouuuuou;Y !  =q5557577757555775755777587575775775575757777=7555777577777577575=7775777777757757778577775577757757557757557775777575775555755755755577557557755577555755555575575557757575555575757775575757755575557557577757757775555757555775577575557577575755577ӎsppppopvvvppppoppp|v||v|pppv}|pppp}}}}}ppvp|prvp}vppppp}ppvvvvv}vvpvvvv}}}vpv}}}}wvvw}wv}}}wwvvvww}}}wwww}}wvww}ww}wv}vvwwww}}}w}ww}w}wvw}ww}}}}}}ww}ww}w}www{}}ww}}}wwwwww}wwww}{}ww}wvwvv}v}}vwwwvw}}}}wwww}}vwwwvwwvv}}wwv{}wwvvvvwvv}}}vvvvvw{}wwvvvvvvvvvvvw}vwvwwvvwvv{vw{vvv{uvvuuuuv{vuuvuuuuuuuuvvv{wvvuvuuuvvvvllvvvuouullultuuultty;Y   =q575777555555577557575775577557755777775577557755757777757577557777777777777777777775778755777777757757777575575775777555575755575555755557555555555557775557557777555557775557575557555555555775755755555757755775575755577555575755575555557575575Տ}pppppppvpppppoppv|vvppvvppp||vpvppppv||ppppvvppv|pvvpp|vvvpv|p}}vvv}vv}}wwvvww}}vv}}}}w}}}}w}}w}}}}}}{}}}}}}}}}}}}w}}}ww}w}}w}www}}}w}}w}}w}ww}}}}}{}}{}}}}w}ww}}w}w}}www{}}w}}w}}}{}w}ww}{vv}{}wvww}wv{}{wvwwvw}}}ww}vv{www}w}{wvvwww{vvvy|yvvvwvvvv{vvvvvww{w{vvvvwwvvvvvw{vvvvvvvvuuvuvuvvuuvvvuvuvvvvvuvuvuuuuvuuuuuuuvuuuuullvultuuuvy{;Y!=q75577555575555555757557557575575557577575775777757777575777777777777557777777775777575775777777757755777777777555775777777775757575755755775577775555575555555555577575555555557575577555555577555555775557557575755777555777557575777557775555577Տsolpp|vpopppvpppppppvppppppv|pp}}vppppv}pppppppp}ppppv}}vvvppvv}wv}}}vv}vv}}wvw}}w}ww}vvwvw}}}wwwvw}}www}}w{}{}ww}w}}w}w}}}ww}w}w}w}www}}w}wv}w}}}}}}}}}w}www}wvw}www}}w}wvwv}}}}www}wwvvwv}www}wwwwvvwvw{}}}vwwvww}wwwvvwvv}vvvvwvvvvvv{w{}}wvvv{wwwvvuuvvv{wv{vvuvuvw{|vvvvvvvvvyv{vvvvvuuuuvvuvuvuuuvulouuvuuuvvuluuvuvvvuuulluuulltu{!@Z!   !! =w755757557557777775757777757755775757755777755575757575757577577755777777557577777757777777775557775757577875577757577755777775755775755755557555555775557577775755757575575575575777755755755575555755557777555575555757555555555755755575775555557Տqpppvvppppvppppppppv|ppppppvvppv}}pppppp|vppppppv}vpvv|vv}vvv}vvv}}w}vvwvw}}}vvw}}}}v}ww}v}}ww}w}w}w}www}}}}ww}wwww}}}}}}}}w}}}w}}}}}}w}w}v}}}}}ww}ww}w}www}}}w}}}w}}{}}}}}}ww}wvwvv}ww}wwwwwwvwv}{}{vvvvwwwwvvwww{vvwvvw}{vvvvvvvvv{w}{uvwwvvvvv{{vvvuvvvw{vvuvvuvvvvvvvuvvuuvuvvvvuuuvuuuuuuuvvuuuvuuuuuuuuvuuluvuuutuCuuu@Z   7}5575557755557775755775757777775777777=77557575775577577777777777757777775777757757777757557757557577577777775577777755575755577557555755775775575575555777757557555775775555755775577757555557775755555775575557557775577577577555555775555775555775557577ӎspppppvppppppppppppp|}ppp}|ppvvppvpvppvvv}vpp}}pp|v|v|v}v}wv}}}v}}v}vw}}vw}vvwvvw}vwww}}w}}}}wwwv}}v}}w}ww}}w}w}}}w}}}}}}w}w}}}}}}}w}}}}}}}}w}}wwww}}w}}w}w}}www}}{}w}{vw}}}vw}www}vww}w}}wvvwww}w}wwvvwwwvw}w}www{}}wvvwvvvwvvwvv{}vvvvvv}}vvvvvvvvv}}vvuv{vvvvvuuuuvv{vvuuuvvvuuuuvuoltuvuuvvvuuuuuvuluvuvultluuluvuuulllluuu;Y    =q555575575557557555575757555777755775777577577577$77757757777755777755=777755557777777775777777775775557757575575755555755557555757557575555557555557777555575555557755755755555557775555555777555555557555775575777777755555ӏspvpppppppppppvpppppvvppv|}vpp}pvp}vppv|v}pvpv|vpv}}vvv}wvv}}}}w}}}ww}w}}wv}}ww}vv}}w}w}w}}}ww}}}}w}wwwww}w}}}}}w}{w}{}}}}w}ww}w}}}}}w}w}w}wvw}{}}}ww}w}w}w}w}vww}}}wv}wwwwvwwwwvw}wvv}vvvvw}{vvvww{wwvvww{vvvvvvvvwvvvvvvw{wvv}{vvvvvכvvv{vvuvvvvvvvvvuuvvvvuuvuuvvvvuuvuuuouvuuvuvuuuuuvuuuuvuuuoooluuuluuttltuvu{@Y  q775777555575777575575555757777775777577757757577575777775775777755775777757=777777777777775557=55777777775557555755557555755775557555555575775557557555555575575555575575555555557557575555555555777555575555555555755557775555555s}}vpvvppvpppppvvvpppppppp}}pppvpppvvv}}pvv}}vvv}vw}vvv}wv}}}w}vvvvvwww}vww}}w}vww}w}}{}}}v}}w}}}}}{}}}}}}w}}}www}}}w}w{}}w}w}}}ww}w}}w}}}}}}}}www}ww}w}}}}w}}vw}}}ww}wvvwwwwwvwv}v{wvw}ww}wvwwvvvwvvw}w}wv{}ww{}vvvvvwwvvvvuvwvvvvvʞ{vuvvuyvwvyvvvuvuuuuvuvvyuuvuvvuvvuuuvvyuuvuuuvvuoluvvvvuuuuotuuuuuuouultuulluluuuzv!@Z!   p57555555575555555575577557575775777777775777575$75777777777577777757777777=77777777777777775755775777757755575555577577755555555557757557557755557557575557575557775555555֎}v|pppppvpppvpppppvvvpoppv}}|vpppppv|vv}vp}}vvvvw}vv}vv}wwwww}}vv}}vv}vw}}}w}w}}}}}wwww}}}}w}}}}}w}www}}}}}}w}}ww}w}}}w}w}}}}}w}}w}}}}}}}w}}}}}w}}}www}www}}}}}w}}{}}wwwwv}w}wwwwvw}wwv}}www}}}wwwvvvwvvwwvw}{wwwvwwvw}{vvvvvvwvvvvv{vvv}מvvv{vuvuvvvvyvvvvvvuuuuvvvvvuvvuvvuvvvyuvuuvvvuvuuuuuuuuuvvvuuuuutuuuuuuuuuutuuuuuullluvv{;Z  !q55777755778775555557777757775577777577775578757757777777557757777777$777777757777777757575775777555755555555575777578555755775577555557555555757555555775755775575555775ppppppoppppvvppppvvpppppppvvvvvpvvpp}}v|ppw}vvvv}}}}wwwwvv}vv}vvv}}ww}wwv}}}wvvvwww}vwwww}}www}}}}}}}}}ww}w}}}}}w}ww}}w}wwvw}w}}}}{}}}}ww}w}w}w}}}}}w}}www}}ww}}wvwwwwwww}w}w}}wwwwvv}{}wvw}w}}w}wwvvwwwvwvvvvww}}{vv{}vw}vvv{wvvv}}vvvuvvvvvvvuvvvuuvuyv{wvvvvvvuuuuvvvvuuvuvuuvvvvuuuuuuuluuvvuvvuluvuuvuvvuCuuvluultuuu@Z ! !$s5755755555575557755575557555757557575775575757775777775577777557577777767777777775777577775575577557777557575555575555555755557577557555555555575575755755557555Տqoopppppvpppppopvvvppppppppvpvvvvvvvv}vvvvvwvvvww}}}}}}wvvwvv}}vww}}}w}}}wvv}wvwv}}}}}w}}w}}}wvv}w}}}}ߐ}}}}w}}}}}}}}}}}}w}}}w}}}}}}}}}}}}}}}}}}www}}}}ww}}v}w}}w}w}w}ww}}}w}www}}}wwwwwwvvw}}wwvv}{v}w}vvvwww}{vvvvww}{vwvvw}}v{}vvvvvvv{w{vvvvvvvwvvvuvvvvvuvvvvvvvvvvvvuvvuvvvuuvuvvvuvvuuuvvouuuluuvvvvuluvuuuuuuvuuvuuuulluul!@Z !s75557757557557555555775577557777575777575=777=577757=7757777775777777775755555575557557555575775777755575577755575557555555557555555577755757555557555577ӏppvvppppppvvpppvv|}pvvpvvvpvv}v}}vvvvvvvw}w}w}www}wvvw}}}w}v}}w}vw}}}}}}w}}}}w}w}}w}w}}}}wwwww}}}}}ww}w}}}}}}}{}}}}}}}}}}}}}}}}}w}}}w}}}}}}w}}}}}}w}}}w}w}}w}wv}www}w}}wwwww}wwvwww}v{}wwwww}{}w}vwwwwwww}ww}www}}wvww}vvvw}vvv}wvwwvvv{wvwvwvvvvv}v{vvwvvvuvwvvvvuvvvuvuvuuuouvwvuuvvvvuuvuuuvvuvwvuovuoluvvuuulluvuluouuuuluuuuuuuvu@Y! !  =q555575555575757557575557577757557757777757755777777777775577777757777557577777575557557755557555775555555575557555575755775557555557557757555755757555775755757577֏~ppvpvppopvvvppv}vpv}vpp}}pvvvvv}}vvvvvvv}}}}}wvvwwvvw}}}ww}}v}w}vw}w}}w}}}v}}}}w}w}}}}}wwv}}}}w}}}}w}}}ww}}}}}w}}}}}vw}w}}}w}}w}w}}w}}w}v}w}}w}}wv}}vw}w}wwww}}w}wvww}}wwvww}{w}}ww}}}}www}wvwwwwv}{vvvw}wvv{vv{wvvv}}w{wvvvvv{vvvwvvvuvvyvvvvvuuvuvvuuuvuuv{vvuuvvvvuuuuuvvuvuvuuvvuuuuuuuuuuuvuuutluvutluvuuuouu! @Z    q5575555757757775757577555575757577757757757777757777777877=7777777777755=7777577757555775555577575777555755555575755755555555555557555555575557555575555577ӎsppppp|ppvvpvppv|vpvvvv}}vvv}vw}wvvvwvvv}wvww}w}}}w}}v}vwww}}vv}}}ww}w}vwwwvwv}}}}}}ww}w}}}}}}}w}w}wwv}}}}}}w}}}}ww}}}w}}}}}}}}www}}}v}}}w}}}}}{}}}w}w}w}w}}}}}w}}ww}www}}wvw}ww}w}wvwvw}w}}w}wwwwvvw{}wwv{}w}{}w}wv{}}vwvv{}vwvvvwv}vwvvwvv{}wyvvvvvv{vvvvvvvvwwvvvvwwvvv{vvvvvvvuuuuvvvvuvuuoouuvuuvuuvuuvvvuuuuuvuvuooultuuoluuuu;Y !=q575557777575777557577777757577777755577777777757$777757777777777775575577575557755755755755577755575555557775757555777557ӎqppvvpppvvpppvvpvvvvvvo}}}vvv}v}}vvwwwv}w}vww}}wwv}v}}vwwwv}}ww}w}}w}w}vvw}}wv}}}}}}}w}}}w}}}w}}}}}}}w}}}}}}}}}}w}}}}}}}ww}}}}{}}w}}}}}}w}}}}}}}}w}www}}}}}}w}www}}}}}ww}w}}www}}}wvv}}w}}{wv}wwwwvvw}wvvwwwwwvwwwwvwvw{vwvvvvww}{wwvvvvvvwwvvvv{vvwvvvvvwwvuvvvuvyvvwvvw{vvvvuvuuuuvvvuvvuuuuuuvuuouvuuuvvvvvvuvvvultluluuuuuouu{;Z  =s5575577575555557577577577777757757777557775577775777777757=75777777757577775777557777577577575755757555757557575555775555777555555577777555555555577575555755575555555557ppppwpvvvpopvv}vpvvv}vvv}vv}vvvv}}}}}}wwv}}wvwvvwwvww}www}}ww}}ww}}}}wv}w}}ww}}w}}w}}}}w}}}}}}w}}}}}}}}}}}}}}}}}}}}}}w}}}}wv}}}}w}}}}}w}}}ww}}}}w}}}wwwwww}}w}}w}}}{}w}ww}}ww{}vv{}wwv}w}wvvvwwwwwww}wvvvv}wwwvv{vvv{vv}vwvvvuwvvvvuvwyvvv{}vvvvuvvuvvuvvvuuvuvvuuvvv{vuvvvvvvuvvuuuouvuuuoltltluuuuuuvuuuluouuuou@Y!q555555555577577555757555557557557578755775755755577777577777777777577777557777577757575775557575755555575757555557755757555557575555557555757555555555555Տqppppvv|vppvvv|vvpvvw}vvvvw}}www}}}}w}wwvww}vwwvwww}ww}v}}w}}wv}w}wwwv}}wv}}wvww}}}}v}}}}}}}}}}}ߐ}}}}}}}w}}w}}}}w}}w}}}}}}}}}w}}}}w}}}{}w}w}}w}wv{ww}}}www}}}}{vww}w}wwv}}}}{vw}{wwvwwvww}{v}vv}vww}}vvvvwv{vv{wvwvvvwvv{wuvvvvuvw{vvvvvuvvvvvuvvvuuuvvvvvvvuvvvuvwvvuuuvvouuuuuotuouuoouuuuuvvululuouutt@Y! p5555555775775755555557577555755575777577557757555757577575757577575777575577785775577777755775757557555755755775555577575555557775755777755555557575555Տ}qvppppw}vvvvvvvvvvv}vvvv}wvwvvvwwvv}}}wvwwvvw}}}}}vv}ww}}}}}}vwww}ww}}}}}w}}w}}w}v}}}}}}w}}}}}}w}}}}}}w}}}}}}}}}}}}}}}w}}}w}}}}}}}}}w}}}}ww}ww}w}}}}www}wwwww}w}}ww}}}}}wwvv}}{}vw}}}wvwwwv}vvwww}|}vvv{wvvvv{}ww}wvv{vvwvwvuvvvvvvvwvvvuvvvv{vvvvuvvvvvvvvvvvuvvvvuluvuuuuouvvuvuuoouvuuvvuuultuvvultuuouuuuuuoo!;Z! !!q5775557755557557777577755577755$755775775775757777775757777775777757577557555557777777575555557777555757557575555757755555577555555555777757555575775575֏}ppvvppvv}}}vvv}vvvwwvvvvwvv}}vvvwvv}ww}ww}}vv}wwwv}}}}}vww}}}vv}}}}}}}w}}}}}w}}}}}w}}w}}}}}ߙ}w}}}}}}}}}}}}}}}}}}}}}}}}}}}}}w}w}}}}}}}}}w}}}}}}w}w}}{w}}}}vwvvw}vw}}ww}www}}ww}vv{vvwwvvvw}{vvwwv{}w{vvvw{vvv}}{wwvvvvvw{vvvyvvvv}yvvvvvvvvvv{vvvvvyvvuvvvvuuvvyvvvuuuuvuuuuouuvuvuuuuvuvvvvuuuuuuvvulouuuuutoutu!!;Z !s5555755577775855777555575557557755755555577577787!7755577575575577775757575555775577557557575575555555775755755555557555555775755777755755575555ӎsvv|vvvpvvvvvvvv}wvv}w}wwwvvwvw}ww}}}vv}w}}}}www}}wwwv}}}}w}{}vw}}www}}}}}}w}w}}}}w}}}w}}}}}}}}}}}}}}}}}}}}}}}}}}}}v}}}}w}}}}}}}}}}}}}w}w}}}ww}}}ww}}wwvww}wwwwww}w}wvwwww}wv}wwww}}vvw{}wvvwvwwvwwvwvvv{vv}wvwwuvvvvv{vvuvvwwvvuvvvvvuvwvuuvvvwvuvuvvvvuuvvuvvvuuuvuouuvuouuuvuuvvvulluvuuuvuououuuul@Z !=q755755775555775757775557757775755575757577575$5577777777557777557777757777777757577755577555775755555555555777555555555755555555557555555557577555575Տ}vvvvvvvpvvv}vvv}}vv}}}}vvw}vw}}}}w}vvw}}}ww}vv}wwww}}}}}}}}www}}}ww}}}}w}}}}}}}}w}}}}}}}}}}}}}ߐ}}}}}}}}}}}w}}}}}}}}}}}}}}}}}w}}}}}}}}w}w}}}}w}}wwwww}w}vwwwvww}wvvvwvvvvv}}w}}ww}www{vvvwvvwwwww}{vvvvvww}{vwvvuwvvvvvvv{vvvvuvwwuuuvvvuvvuvwvvuuvwvvvvvvuuuvvvvvvtluvuuuvuuouvvuouuouvvuuuuololvoZ@Z =s555575555555575555555557575755755777577777557757757555=77777755777777777755557755557557555577755575555775557555555567557555555555755555555557775557755557555755Տ}pvvv}}vvvv}wvvwvvvvv}}wwvv}}}vww}w}ww}ww}}}vvw}w}}v}w}wwvw}}w}}}}ww}}}w}w}}w}}}}}}}}}}w}}}}ww}}}w}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}ww}}}}}}w}w}}w}}}}}}}ww}}ww}}w}}}wwvwwvvwwwwvvvv{}v}wwwvwwwvvww{vvvvvw{vvvvvwvvvwvvvwwvuvv{vvvvvvvuuuvvvuvovvvuuvuvvuvvvuuvvuuvuuuvvuuuuuulluultouuuuuuuuuwtl!@Y! q55557575557555557555775775557575575557775575777=755775775775575775757575775577775555555577755775557557575755557577557757555755755555555575757577755555555755Տ}vwvvw}v}vv}}}vvvvvwvvw}wwvw}}}vwv}}}}vw}w}}}}}}vwv}}}}}w}}vw}}w}}}}}}ww}}}}w}}}w}}}}}}}}}w}w}}w}}}ߑ}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}w}}w}w}w}ww}w}}w}ww}}w}w}w}wwvvvw}wv}vwvwwvvwwvvwvvvwvw}{v{vvvvvvvwwwvwvwwuvwvvvvvvvvvvuuvuvuvvuvvuuvuuuvvuvvvvuuuvvuvuuuvvvvvvuuutuuuuuluoooluvuuuuC!@Z!q55557755577555555557775755575757555777557757557775777777757777757777755777577755755557557555757557555555557555555575555575575555755555555577755555555Տsw}vvvvwwvvvv}}wvw}wvvvw}}w}wwv}ww}}}}wvw}}}wwwww}}}}}}}}w}}}}}w}ww}}}w}}}}}w}}}}}}}}}}}}}}}}}}}}w}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}w}}}www}}}www}}w}w}}}v}}}w}wwww}wvvw}}w}w}wwvwwww}vvvw}w}{}wwwvvvwvvvvvwvwwwvuvwvwwvuwvvvwwvvvvvvvvvvv{vvvuuuvvvvvvuuuvvvvuvuvvuouvuuuuuuuouvuvuvuuouuuuvvuowul !@Z  =s55575775575555755777777777555==7777777757557777775777777755777555575775555757Տ}}}vvvvwwvvwv}}}ww}}}vvvvw}w}}vvvww}}w}w}ww}wvvvvv}}ww}w}}}}}}}}}v}v}w}}w}}}}w}w}}}}}}}}}}}w}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}w}}}}}w}w}}}}wvvw}v}}}}}}}}}}}wvw{w}vw}www}vw}w}w}}}}ww}}vvwwwvv}}ww}{vvvvuvv}}w}wwvvvv}{wuvvvvvvvvuvvv{vvvuvvvvvvuvyvvvvvvvuvvvvuvvuuuuuvvvuouuouvvuvvuoouuuuuvuuuvul@Y   =s55775557577757775777555777555775777755775777557557757557755577575577755Տ}vvvvwww}wvvwwvwvwv}}www}}}}}}wwwww}}}w}}}vv}}}}}wv}}w}}}vwww}w}}w}}}w}}}}}}}w}}}}}}}}}}}}}}}}}}}}w}}}}}}}}}}}}}}}}}}}}}}}}w}}w}}}}}w}vv}wv}w}w}w}w}}}}}ww}w}}vw}vvw}}w}wwwwwww}}ww}w}v{wwwvwvvvw}vvv{vvw{}wvvywwv{vvvvvvvv{w{vwwvvvvvuvvwvuvvwvvvvvvuuuvvvuvvuvuvvvuuvuvuuovuvvlouvouuuuuuuoltu{ov;Z    =q77775577775575575777557755577775775577777577557755557577557575755757557575575577֠}vvvvw}w}}vvvw}vwvvw}}}}}}}}ww}w}ww}}}w}}ww}}}}vvw}}}ww}wwv}}}}}ww}}}}}}}}w}}}}}}}w}}}}}}}}}}}}w}w}}}}}}}}}}}}}}}}}}}}}}}}}}}w}}}}}w}w}w}}wwwww}w}}w}}{}}vwww}wvw}}}vw}ww}vvwvvvv}ww}}wwvv}wvvvvvwvv}vvvvvvvvvvww}{vvvv{vvvvw}{vuvvvvv}vvvwyvvvvvvuuvv{vvvvuvvvuvvvvvuuuuuuuuuuvuuouuououlllo{uv!!9Z!=q75757557577577755555777=7777557557575775575577575755555755575Տvvvvw}vvwwwwwwwwvvv}}}www}}vw}w}}www}w}w}wv}w}}}ww}}}}}v}}}}}}}}}}}}}}}w}}}}}}w}}}}}}}}}}}}}}}}}}}}}}}}}w}}}}}}}}}}}}}}}}}}}}}}}}}www}}w}w}}}}}ww}}{w}}}}w}ww}w}w{}ww}ww}wvwww}{}}wvw}wvvwvvwvvw}w{w}vvv{vvvvvwwvwvvvvvvvwvvvvvvuvvvv{wvwuvvuvyvvvvuvvvuuuvuuvvvvuuvuvvuuuvuvouvuuouvuuvuuuuvuv!@Y  !=s5555775775775775755575777777577577775555577755755755777755Տ}vvvvv}}wvv}}}wvwvvvw}}wvww}vvw}v}}wvww}w}wvw}w}w}}}}}}}wv}}}}}}}}vv}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}w}}}}}}}}}}}}}}}}}}}}}}w}}}}}}}}ww}}}vwww}}}}w}}w}ww}w}}}w}}}}wwvvvwvvvvvw}w}}wwwvvv}{vvvvwvuvwvwwvvvvwwvvv{wvwvuv{vvw}wvuvvvuvvvvvvvvvvuouvvvvvvuouvvvvouvvvuouvvuuvvouuvvuxlv@Z ! =}575577555575755555775777575555575777577575775755577557555775575775777555777Տ}wvv}}vwvv}wvv}}}}w}w}wvw}wv}}ww}wv}}}}w}}}}}}}}}}w}}}w}}}}w}}w}}}wwv}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}v}}}w{}w}}ww}w}}}ww}}wwwwwww}}wwwwww}w}ww}}}w{}wwwww}vwww}vvvvvvvvvwvvvvvvvvuvwvvvuvvvvuvvw{vvuvvvvuvvvvuvuouvuuuvuvvuuuuvuuuvuuuuuuvuouvuluuuo{uuu @Y=s5555557575757777557755777777757877777775575755775575555757555575757Տ}}}vw}vvvv}ww}}}}}ww}}wv}wv}}wv}}}}}}}}}}}wvww}vw}ww}v}}}}w}}v}}}}}}}}}}}}}}w}}}}}}}}}}}}}}w}}}}}}}}}}}}}}}}}}}w}}}}}}}w}}}w}}}}}vww}}}w}}w}ww}w}wvwww}}wwwvwwvvvw}ww{}}}}wwvvwv}w}wwvvvvvvvvvw}vvvuvvvuvvvuvvvvvvvvwvvvvvvvvuuuuvvvouuvuvuuvuuvvuoouvuouuuvuoouvuuuvulootyyou{!!!;Z!  =q555777575757557777575575757577777757$7757!75777755557557555775577557757577777557Տw}vvw}vvwwvvwwvw}}wwww}}w}vw}}}}vw}}w}}}ww}}}w}}w}}}}}}}w}}}w}}}w}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}w}}}}}}}}}}}}}}}}}}}}}w}}}}}}}}}www}}wwwww}ww}}}}w}}}wwwww}www}vw}wwwwvw}wvvwvvvw}vvw{vvvv{}v{vvvvvv{vvvvwvvvvvvuuvvuvvvvvvuvvvuvvvuuvvvvvvvvuuuvuuuvvvuvuuuuoovvuuuov{uu{!@Y!!!!   !q5577577557555775757775557577557777757577557775777755555575֏}vwvvwwvvw}vv}}vvvw}}wvvww}}wvw}}www}}ww}ww}}}}}w}}w}}w}}}}v}}w}}}}}}w}}}}}}}}}}}w}}}}}}}}}}}}}ww}}}}}}}}}}}}}}}}}}}}}}}}}}wwww}}}ww}}}}}w}ww}w}wwwww}{}w}wvvvwwwvww}wvww}vvww}wvvwvvv}}wvvvvvvwvvw}vvwvvvuv{wvw{vvvuuuvuvwvvuvuvuvyvvuuuvvvuuvvvuvvuvvuvvuuvulluuuvuoluu{vvv@Z! ! p5775575555777577555575757757577577555775557577577555757555775555777575755775Տ}vvwww}wv}}vv}}wvv}}}vvw}}w}w}}}w}}}}}w}w}w}w}}}}}w}v}}}w}}}}}}v}}}}}}}}w}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}w}}}}}}}}w}}vw}w}}}}}w}}}w}}}w}ww}wwv}w}vwwww}}ww{ww}}wwwvwvuw}w{wvv}vvvv}vv{wvwvvvvvvwvvvvwvuvvvuvvv{vvvvvuvvvvvvvuuvuuuvuvuvvuuuuuuuouvuuuuuvuuuuu{uuu@Y  =s57775577577575557777555755775777!577=775=55557755757577577777755755755775575777Տ}vv}}v}}w}wvv}}wwvvvvv}}}w}ww}}w}}}}wvvvww}}}}wvwv}w}}}}}w}}}}}}}}}}}}}w}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}w}}w}}}}}}}w}}}w}}}}w}}w}}}}ww}}}}wwwww}w}}}}}}{}vv}}w}vww}wvvvvv}vvwvvvv}vvv}{vwwvvw}{uvuvvvvvvvvvvvvvvvvvvwuuvvvuvvvvvvwvuuvuouvuouuuuvuuoouuuvvuuuuuuvvu{ouv;Z!!   =}57757775777557555!7575$7755!755775575$7577777557757777757777757557777Տvvwwvv}wvvwwww}}ww}}w}}}wwww}}}}ww}}}}}}}}}}w}}w}}w}}}}}v}}}}}}}}}}}}w}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}w}}}}}}w}}}}}}}}}www}www}}}www}w}}}v}v{}www}}}}vwww}{www}wwvvwvvyvvvvvvvwvwvvvvvwwvvvwvvvvvvvvvuvvvuvuvuvvvuvvuvuuuuuvvuuvuvvvvuuvvoouvuuuvuuuvo{uou @Z!=q777577777577555757755775777775757577575777757775777777577575֒}vvwwvw}}}vvwwvvw}}}}}}w}w}wvw}wv}}}}}}wvw}}}}}}}w}}}w}}}}}}}w}}}}w}w}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}w}}}}}}}}}}}}}}}}}}}w}}}}}w}}www}w}}}w}}}}ww}w}wvwwwvw}{v}w}}}wvvwww}w{vvvvvvvvvvvvvvvvvvvv}vuvwvuuvvvvuuvvuvuvvuvvvvvuvvvvvvuvuuuuvvvvuvvvuuuuuouvuvvvuouo{luo@Y     q75555557557557775575777755777577777557557ՠw}vvvv}}vvvv}}vv}}}w}vvw}w}}w}w}w}}}vw}}}}v}}}}}}}}w}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}v}}}}}}}}}}}w}}}}wv}ww}wv}}}w}ww{}wwvw}vvvvvvwvwwwvw}w}wvvvvvv{vwvvvv{vuwuvvv{}vvuvvvvvvvuuvvuvuvvvvuvuvuuvuvvuuvuvvuovvuuouuuuuuvu{uvuzu! @Z ! =q7757757775557577757777757777775775557577755777777777777775577555֢}vvvvvvvvvvvv}}}v}}}w}}}vw}}}}v}}wv}ww}vv}}}}}}}}}}}}}}}}w}}}}}w}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}w}}}}}}}}}}}w}ww}}}}wvw}}}}}}w}w}ww}w}}}ww}vvw}}}}}www}ww}}wvwvwwvvwvvvvvwwvww}{wvw{vvvvwvwvvvvvv}}vvvvw}wvw}w{vvuvvuvuuuvvvvvvvvvvuuouvuuuoovvvuuouulouvu{oulߖuCCC@Z!!!   =q77557757555775775857557!55=577775775757757777577757777775557757757777557777Տvvvvwwwwww}w}wwv}}}v}}wvw}}}}}}vw}}}}}}}}wv}}}}}}}}}}}w}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}w}}}}ww}}}}w}w}}}v}}}}www}w}}}w}w}vww}ww}wvvwvvwv}vwvvwvvvwvvvwvvwvvwwvvvvvu{}vvvvwwvvvvvvvvvvuuvwvouvvvvuuvuvvuuvvuuuvuuuuuvuuuvuouuuuluylCZlCu !@Y ! =s555575775575775777557777777!55$77577757557577777777777575755775555s}v}}w}}}}v}vvv}w}vw}w}}wvv}}vvwvw}}}}wv}}w}}wwv}}}}}w}}}}}}}}}w}}}}v}}}}}}}}}}}}}}}晑}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}w}}}}ww}}}}}}}www}}w}}www}vw}}vvvwvww}}}wwwvvvvwvwvvwvvvvuuvwvvvvvwvvv}vuuuouuuvuvvuouvwvuvvuvuuououuouvuoouuvuvuvulouvououuuuv{uCtlltlly!@Z ! =577577575575757775555777575777577757575!5775755557775577777777577777757555Վsw}vv}}w}}}v}}wvw}}w}w}w}}}ww}wvw}}}w}}}}}}}}}}}w}}}}}w}}w}}}w}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}wv}}}}}}}}}}}}}}}}}}w}}www}}}wv}}v}wwwwv}www}}}w}ww}wwwvvvwvvwwvwvvwvvv}vvv{}vvvwvv{wvvvuvvvyvvvuvvvvvvuvvvvouvuuvuuvvuuvvuouvuvuluvuvuluouuߔvlZllCZllCZ @Z!=}7775777575555!57!577759755755$7!55!5!7757577777757577755577բ}}vv}}}vvvvv}}}}vvv}}}}}}}}}}}}}}}}}}}}}}}}}}wwvv}w}}}w}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}w}}}v}}}}ww}}}}}}}}}wvw}}}vw}www}vvw}}w}wvv}ww}}w}v}}wvwvwwwvw}wwvvvvvvvvuvww}vv{vvv}vvvwvvvvvwwyvvvwvuvvuuuuvuuuvuuvvuuvulvvvvvvvuuvvllouuvuluuvlxZCClZClClZCCZ!!@Z!! p777575775755775755777!7!5!7755$77555!75775777777777777Տwvw}wv}vvw}w}}}}www}}}ww}}}}}w}w}}}}}}}}ww}}}}}}}}}}w}v}}}}}}}}}}}}w}}}}}}}}}}}}}}}}}}}}}w}}}}w}}}}}v}}}w}}w}}}wv}}ww}}w}w}}}}}}w}www}}}}wwww}wwv}}vvwwwwvwv}vvvvvvvvvvwvvvvvwvvvwvvvvvvwvvvvvvvvvvvvvvuvvvuvuuvvvvuuvuvvuvuvouuvuluuuvuououũutCCuZlCZCZllCCu @Y  !p75777557575775777!557577775557Տ}pvwvvvw}w}}wwvvv}}}}w}}vvw}w}}}vw}}}}ww}}}}}}w}}}}}}w}}}}w}}}}}}w}}}}}}}}}ww}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}www}}}}ww}}}}}}}}}}}w}wwwvwvvwvw}}www}wwww}wvw}}wwvvw}{vuvwvv}}w}{vv}{vvv{vvvvvwvvvvvvvuv{wvv{vvuuuvvvvuuv{vuuvvvvuuuuuovvvuvvultluouvulttCClutCClultlZC{!9Z !!  s77575777777!577557777777755Տpvw}vv}}w}wv}}v}}}}}w}}vww}}}}}w}}}}}}}}}}}v}}}}}}}}}}}w}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}w}}}}}}}}}w}}}}w}wvw}}}}w}}w}}v}}w}wv}wwww}wwwwvvwv}vvvwvvw{}wvvvvwvwvvvvvv{vuvvvvvvvvvvvvvvvvvuvvvvvvvuvvvuvvvuuvuuvuuuvuouvuuouuulu{uCZllllttCCCCCZltlCt!!@Z  $q77757777575757777757757777777Տ}w}vvw}}vvv}vvwvwvvvw}}vv}}}vvvvw}}}wv}v}}v}}}}v}w}}}}}}}}w}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}w}}}}}}}}}wڞ}w}}}}}ww}w}w}}}ww}}}}}wwwvw}}ww}}w}}}wvvwv}}}vvvvvvv}}wvwvwvvvwvvvvvvuvvwwvvv{vvuvvvvvvuvuuuvvw}{uvvvvuvvvvuouvvvvuooouolvvvvvvvvlluCtClZlttlCltutllZlCZtu@Z!!!   ! ! !q7775775777577!557757575757777777775777Տww}wvw}}}wvvvw}vw}}wvw}}}vw}w}}}}ww}}}}}}}}}}w}}}w}}}}}}}v}~}}}}}}}}}}}}}}}}}}}}}}}}}}}w}}ٙ}}}}}}}}}}}}ww}wv}w}vww}ww}}vw}}w}}}vwvvww}}vvw}vvvvvwwvvvwwvvvvwwvvvvvvwvwvvvvvvvuv{vvvvvuvvvwvvvvvuuvvvvuuuuvvuouvuouvuuuuvvvuuo{ulClltCCllCCtultCZllltCC{!@Z =s77775557577775!7777!5577777777777777Տ}vv}}vw}}}}v}}}}}w}}v}}ww}}}}}}}}}}}}}}}}}}}}w}}}}}}}}}}}}}}}}}}}}}w}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}v}}}}ww}}w}w}}w}}}}}}}}w}ww}}}vw}}wwwwwwww}v}}vwvvvwwvwvw}ww}vvvvvwvwvuvvvvvwwvwvuvvvvuuvvvvuouvuvuvvvuvvvvouvuvvuvvuouvvuooououuuu߆utCuutuulZtlZCCtCCCCCZCClCu  @Y   !  !   s577777775777557757777757777777777777777757Տ}pv}}}v}}}}w}}}}}}}}}}}}w}}}v}}}}}}w}}}}}}}}}}}w}}}}}}}w}}}}}}}}}}}}}}}}}}}}}}~}}}}}}}}}}}}}}}}}}}}}}}}Ӑ}}}}}}}}}w}}}}w}}w}w}}}}vww}w}}}}}}}vv}wvvwwwwwwvvw}v}wvvwvv}vvvv}wvwvvvvvvvvwvvwvvuvvvvvvvvvvuvvvvvvvvuuvvuuuvuvvuvuuuvvuvuuoouuuuu{ulCtlultlllCCtCtlCCltCCCCZlZt! @Z! ! =s77575557777!7!!75!77777777557775757Ւvvvvvwwww}}wvv}vw}}vvvvw}v}}}}}w}}}}}w}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}ꤑ}}}}}}}}}}}}}}}}}}}}}}}}w}}}}ә}}}}}}}w}}w}}w}}}}}vwvwwww}vwvw}}wvvvvv}}wvv}vvwvvw}{vvvvv{wvvvvwvvwvuvvvvvwwwwvuuvvuuvvwvvuvvvuovvouvvvuuvvvvuuuvvuuooyvuxulttllttClZlutCClutCZCtlttCCCCC{!!!@[!!      9q7775777777777575!757!7575$!75777575777֟wpvv}}}}}}}w}}wvw}}}wv}}}}}}}}}}}}}ww}}}v}}w}}}}}}}}}}}}}}}}}}}}}}}}摑}}}}}}}}}}}}}}}}}ב}}}}}}}}}w}}}}}w}}}}w}}}}w}wvw}w}}wvvvvvwww}wvvwvvw}vvwwvvvwvv}vvwwvuvvvwvvvwvvvvvvvuvvvvvvvvvvuuuvuvuvvuvvvvuuuvvvuvuuvvuuultlltuolCullttllCtCCCCCCllCttCCt!@[q77777555755577775757777777777777777775Տ}v}}w}}wwvvv}}}}}}w}wvv}}w}}}ww}}}}}w}w}~}v}w}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}~}}}~}}}}}}}}}}}}}}}}}}}}}}ِww}}www}}}}}w}}wvw}}ww}}}wvvw}}}}}ww}w}wwvvvwvv}vvvwvvvwvvvvvvvvvvwvvuuvvvvvvvvvvvvvvvvuvuvuvvvvvuouuvvuuuuvvvouuoouvuvv{ttotlZlllZCCttCClZCtCuutllZCCCtutCCt  @Z!!!      =7577775777555775!57575777577777577Տww}}}w}}wvw}}}}}}}}}}vv}}v}}}w}}}}}}}}w}w}}}}}}}}}}}}w}}}}}}}}}}}}}~}摑}}}}}}}}}}}}}}}}}}}א}}}}}}ww}}}}}w}ww}}www}v}}}}}}}vw}}}}v}wvvv}}wvvvwvvvw}w}vvvvwvvvvw}vuvvvvvuvwvvvvv}wvvvuvvvvvwvuuuuvuvuvvvvvuuvvuuuuo{{vvvlllullllCZlllCCCCCCltlllZltlCZllClCCC{!@Z!  =s7777777!55!7777!77577777777777775բ}ww}}}}}vv}}}}vw}}w}}}}}}}}v}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}~}}}}}}}}}}}}}}}}}}}}}}}}}}ww}}}}w}}}w}ڙ}w}}}}}}}}vw}v}}wv}ww}}wwvvvw}w}wvwvvv}vvvvwvw}{vvv}wwvwvvwvv}wvvuvvvv}wvvuvvw}wvuvwvuuvvwwulvuuuvvwvuvvouvuuoluvuvuvv{vulxulultuuttlloluuuuootluuZCCCltCClZCCZCtCl@Y!    !  $p77775575777!555577757777777777777ՠ}}}}}}}}vv}}wwwww}}}}}vw}}}}}}}}}}}}}}}}}}}}}}}}}}}}~}}}}}}}}}}}}}}}}}}~}}}}}}}}}}Ӏ}w}}}ِ}}}}}}}w}wvv}w}}}vw}}}vvwwvv}}}vv}}wvvvw}vwvwvvvvvww}wvvvvwvvvvvvvvvvv}vvvvvvvvvvvvvvvwvvuvvvvvvwvuuvuuuuuvuoovvvuvwwuu{uoluttluulltltuuuuuttuultlCClCCZlCtCCCCCCZt!@Z!!     !q77775757777757!577757!5!7557557555775777755557Տ}vvvvvvw}}}}}w}}}}v}}wv}}}}www}vw}}}}}}}}}}}}}}}}}}}}}}}}}w}}}}}}}}}}}}}}}}}}}}}}}}}~}}}}}}}}}}}}}}}}}}}}}}}}}}w}}w}}}}w}}w}ww}vv}wwww}vvvv}wvw}vvvvuvvvvvwvvvwwvwvvvwvvuvvvuuvvvuvuvuuvuuvuuvvvvvvvuvvvoouvvuvvuuuv{vuwulZlllltllZCZltClZltCCtZCCZCuutlltlltCultCCl{!@Z! !  ! =s5755575577=577777577Տ}wvvvww}}w}}}}}}w}}vw}}}}}}}}}}}w}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}w}}}}}}}v}}}wvww}}ww}w}ww}}}}}v}wvvvvwvvvvwvvvvvvvvvwvvvvwvvvvuvvvvuuvvuuvvvuvvuvvuvvvvvvuuvvvuuvvuvvvvvuvuuoyuuvlltCtuoCtulCCCCtCCltlCCCCtlluuulttlltCCZlCCt!@Z!  !q577757575!557775777777777757֏}vv}vwv}}}w}}}wwwvw}}v}}}}}}}}}}}}}}}}}}v}}}}w}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}w}}}}}}ww}}}}ww}}ww}}w}w}}www}w}wvww}v}wvww}vvwvvwvw}vwvv}vvvwwvvvv}{vvvvvvvvvvvuvvvuvuvvuolvvuuuvuuvvuuouuouoou{lvuutluululoutClvvttlllotluuCCtltuZClZCCCZCtCClutClZ@Z !   =s777757577!57!5!!777777557777Տ}w}}}}}v}}}}}wwvvv}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}w}}}}}ww}}}}w}w}}}}}w}}}}}v}wwww}vvvv}}vvw}vvvv}}v}wvvv}wvwvvww}wvwvvvvvvvvvvvvouvvvvuuvuuuuuuuvuuvvvuluuvvoulu{luvuulCuuluuutltltuuulCCZluoutlltullClltCCZCCCCCCZCCZt!@Z!!!!  !q757777777!57777557777֏}}vvv}}}vvw}}}}}}v}w}}w}}}}}}v}}}}w}}}}}}}}}}}}}}}}}}w}}}}}}}}}}}}}}}}}}}}}}}}}}}晑}}}}}}}}}}}}}}}ב}}}}}}}}}}}}w}}}}}}}w}}}}w}ww}}w}wvw}w}}vvv}vwwvw}}wv}vvvv}v}}wvuvvvvv{vvvvvvvvwvvvvvvvvvuvuvvwvvvv}wvvwvvvvvvvvvvvuvvuvuuvuuvovu{uullulltlulluluClltluluutlZCltClultlZCtCClltulZCCCCCtC!!!@Y  !!!!=q7777!77577֠vv}}v}}}wvvw}}}}}}}ww}w}}}}}}}}}}}}}}}}}}ww}}}}}}}}}}}}}}v}}}}}}}}}}}}}}}}}}}॑}}}}}}}}}}}}}}w}}}}w}}}}}}}}}}}}}}}vvvw}}}}w}}w}}wvvvv}vwww}wvw}}vw}}vwwvvvvuv}}vvwwwvovwwwwvvvvvvuvvvvv{vvvvvvvw}vvvuvvvwvuovvvvvvuouuu{uuvuoluvuulllultuullCtlultuvvtllZtCltltltCCCCltuuulCCCCtllu!!@Z! ! ! =s75!5777777777Տ}}v}}wwww}}}}}}}www}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}~}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}wwvw}}v{vv}}vw}}wwwwvw}wvvvwvwvvvvvwvv}wvvvvw}vvwvvvvv}wvvvuv}wuvwvvvuouuvuvvuvvvuuuvvupuuvuvvooouvyvttlZltlutluulCltltlttltlCuuCtCClltlZlltltlZCtCZCZlltCCZCC!!!!@Z!   !  9q75577777777775Տv}}}vvv}}}}w}}}}}}}}}}}v}}}vw}}w}}}}}w}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}w}}}}}}}}vv}}}ww}vv}}}wv}}vwvv}wvvv}}wvvvvvvwwwvwwvvvvvvwwvuvvwvvvvv}vvvvvvuouuovvvvvvwvvuovwvuvvvuvvuluvv{uvulllllllulluultllulltlllClulllClututlCCZCluCCCllCCCZltlCtlZ!!!!!YZ!!    ! !=s77777777777Տ}v}}}}}}}}}}}}}}}}}}}}}w}}}w}}}}}}}}}}}}}}}}}}}}}}}}}}}}~}}}}}}}}}}}}}}}}}}}w}}}}}}}}w}}}w}}wwבwvw}}wvw}}vvwvv}vv}wvv}}}}vvvvvwvvvvwמvwvuvvvvvvvvvwwvvvvvvvuuuuuvvvuuvuvuuuuouvuvuvlloutltluluvultloutuuClllutuCtltltCClttCClllZClllZuCCCCluCCZCCu! !!@Z!!  $p577!77577777}}}}}}}}}}}}}}w}}v}}}}}}}}w}}}}}}}}}}}}}}}}}}v}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}v}}}}}}}}ڐ}}}}}}v}}}}}}vבvw}}}}vv}w}wwwvvwwvvwv}wvvvvvvvvvuvuuvvvvvvvvvvuuuvulouvvulluuoolltuvvvtvuutltulCltvuuuuuluvlllttlttutllCCltoltlClluutCCllttlCCZllutCCCCCC!! @Z!! !  !! !! !p775!577!77Տ}w}w}vw}}}}}w}w}}}}}}}}}}w}}}}}}}}}}}}}}}}}}}}}}}}w}}}}}}}}}}}}}}}晑}}}}}}}}}}}}}}}}}}}}}}}}}}}ڙ}}}}}}}}}}w}}}}ww}}}}wwvwv}}ww}vw}}wvwvw}vvvwwwv}vvvvvvvvvvvuuvvvvwwvuvvvvvuvvuvvvvuvwwvuluvtluvuoutuuutlltttlutlluCllluulutCtlltlZtClCtlZCltCCllZCClZCCtZCC!!!!!@_!  ! =q77!5!75757֟}w}}w}}}vvvw}}}}}vv}}}}|}ww}v}}}}}}vv}}v}}}}}}}}}}}}}}}}}}}}}}}}摑}}}}}}}}}}}}}}}}}}}}}}}}}}}}ڙ}vw}}w}vv}}}}}wvww}}}}}vv}v}}wvvvv}wvvvߘvwww}}v}{}wwvvvvuuuvvuvuvv}vvuuvvvvvuovvwvvvw{vuultvvllluvuuoCCCutlCllulCltlCluvutttlltCCClCCCuullCCtlCZCCCCCuCCllCCt! !!!Y[!! !! !!    p777!!7757Տ}}}w}}}}w}}}}}}}}}v}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}~}}}}~}~}}}}}}}}}}}}}}}}}}}}}}}}}}}}ِ}}}}}}vw}ww}w}wvw}}www}vwwwwv}vwv}wvv}wwvwww}vvvuvvvv{vvvvwwvvwwvvvvvuvvvvuuuvvvvuvvuluu{o{uuuulvuuuuluvlollulluuvutultlltlttluCCtltuCltlltCCltlltCCllClttCCClZClZC!!!!!B[!! 9s77775!7$57}vvwvw}}w}w}}}}}}}}}}}}}v}}}}}w}}}}}}}}}}}}}}}}}}}}}摑}~~}}}}}}}}Ӏ}}}}}ww}}}}}}}}}}}}wvvvwwww}}v}}vv}}wvvvw}}vwwv}}wvvv}}}ww}כwvvvvvwwvuuvvvvvvvvwvuvvvvvvuvoouvwvvulluu{vtuvullllluvvuuuuuuoCtvuouuluvuutClCCttlCtlCClttlCllltuttlttCZluuCCCtuCCtCC!;9!!Y_      !!  =}75777!57775777Վ}}}}}}v}}}}}}}}v}}}}}}}}v}}}}}}}}}}}}}}}}}}}}}}}}}摀}}~}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}v{}}w}w}ww}}}vw}}}}vw}}vwwwvwv}vvvwwwvvvvvvvvvvvvuuvvvvvvuuuuvvuuvuvvo{vvlluvuluuuluuoluuovoCovuCtlluutlltuullltllltltltCClttClCltCllCCCCCZCCttCCCCu!!!!!@[!!!! !=q5!77!Տ}q}}}}}vvvvw}}vvvv}w}w}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}~}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}w}}vڑ}vv}wvwwvw}}}}w}wvvw}}www}w}ww}w}vvwvvv{}}vvuvwvovvvuuvvvvvvuvvuvuvvvvvuuuvulvvuouvuulvuuuulluuuvuulCluvCCCuvwvtCtvutuuuCtltlZCCCCtlCtullZCCCCCllCCCCCu !!!!Y[!!! !!    !!!p777557777բwv}}}}}}}v}}}}}}}}}w}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}晑}}}}}}}}}}}}}}}}}}}}}}}}}א}v}}}}}}}w}}}w}v}vw}}}vvwv}vw}٘vvvvvwvwvvvw{vvvvvvuuvvvuvvvvvvuovwvuvvvvuuvvvluvvluuuuuuvlCuvlluouvutuuulutluuCluluuCltuCltulllltlltCCttCClttCClZCCCZCCulZCCC!!!!!B[!   !  q557=777!7֢}}}vv}}}}}}}}}}v}}}}}}}}}}}w}}}w}}}}}}}w}~}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}ؑ}w}wvvvvvvwvwv}w}v}}w}ww}w}vvvvvwwvvvuvvwwv{}wvvovuuuvvvoluvoluwwuuuulluvvuvuuvwvollvuouulltvuolluululltlulttlCCCtuollullluulttlClutlCllCZCCCCltlCtCCCltlCCCC]!@@!!Y_ !! !!!!!!!!   !=77!7!7Տ}}}}}}v}}}}}}}}}}}}}}}}}}}}}}}}w}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}wӑ}}w}}w}}}w}}vw}w}}w}w}www}wvvw}vvvvvvvv{vvvvvvvvvvuvvvvvvvuovvvuuvvuuvvuvvuuuvuvuvvluuuvvuuoulvuluuuvtlulululluulluuotllutuulttltulCotltluCCZCllllZCCtlCCltlZCCtCZCC!!!!!B_ ! ! !! =}$7557s}}}v}}v}}}}}}}}}}}}}v}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}摑}}}}}}}}}}}}}}}}}}}}}}}ww}}}}}}}}}}}}}}}}wvw}v}}}}vv}wvvvvv}vvwv}wwvvv}}vw}vuvvwwvvuvvvuuvvwwwvvvuouvvvuvvvuvvuoovvvuvvuulluv{vltluvuvultulluuuuluuulCCuvuvuCCCtlClCCClltuvultllCCCCttuullltCZlulCCCtCCCCC!!!#9Z_! !!  !      ! =s!!7!7Տ}}}vv}}}}w}w}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}ꙑ}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}wv}}w}}wv}}w}vw}}v}vwvwvvvvw}vwvvv}vvv}vvvuu}wvvuvvvvvvvulvvvvvvvvuvuouvvuvuuvvuvllvvouotulvvuluvuluutuuloltlluultotlluultCltutluutltttClllCtltlZCClCtltCCCtCCCllx9!!!!Y_!!! !!!! !!!!q7!57!7֠}}}}}}}}}}}}}}}}}v}}}}}v}}}}}}}}}}}}}}}}}}}}}}}~}摑}}}}}}}}}}}}}}}}}}}}}}}}}}}w}}}w}}}}}}}w}wvw}}}v}}vw}ww}}vvv}vvvvvvvvvvuvvvvuvvuwwwwvvuouvuvuuvuvuoltuvvvovuvuulollvvuovuuuuuulvvllvvvuluvvuutuvvullClluoluullltuCCCCCCCCCCltuulCCCCCCCZCCCttllutCtuuu!9!!!Y_! !   !     !  !q7$!7$7!$777֏}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}~~摑}~}}}}}}}}}}}}}}}}}}}}}}}}}}}w}}}}}}}}}w}}}}}w}w}}}}vwvw}}}vvw}vvwwwwvvw}wvvvvuv}vvvvvvvvuvvwvvvvvvuuvvovvvluuvvvvvoovovvulvuvvluluuuutuvuvuluuuvllutltluluultttlltlllotttlltCCCltttllllCCCCCCtCCZlltCCCClt;!#! B_!!!!!!!! !!     $q7!!!!77}}}}}vv}}}vvvvvvv}}}}}}}}}v}}}}}}}}}}}w}}}}}}}}}}}}}}~ꥑ}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}w}}}}}w}w}}wvvv}vvvvww}}v{vwww}wvvvw}}vvv}}vvvvw}v{wwvvvvvvuvvwvwvulvvuvwwvuuoluuvulouuuuoluluvvluolClllllulllCluullluuuvuuulollCtltlouvoCCtCCtlZCCClZttulCCttCCCCCZCCC@CCZ{!!!!!B_!#!!!#!! !!    $p7!57Տ}}w}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}~~}}}}}}晑}}ӑ}}}}}}}}}}}}}}}}}}}}}}}}}v}}}}w}}}}}w}}}www}v}}w}vv}}vv}w}wvwvvvwvw}}vyvvvvvwwvvvvvvvvuovvvvwvvuuovvvvvvvouvvvvluuvlovuvluuvuuulluoooluuollluuuuClouluuuuutlllltutuutlllltCllCltCCCltuCCllZCCCCCCtlCCCCC=9!!!Y_!#!! !!! ! !! !  ! =q777!$7!$!֏vv}}}wv}}}}}}}}}}}}}}}}}}}}}}}}~}}}}}}}}}}}}}}}}~}}}}}}}~}}}}}}}}}}}}w}}}}}}v}}ww}}}}}}vv}v}w}vvwvwv}}}}v}}}}}}w}}}vv}w}vvvvvvvvvwvwvvvvuvvuvvuvvvvvwvvvuvulooouovvuuluvvvlluvuuolvuvvulvuuuuuoltluvuullltltllCCCouvuulCCCtluuuullttluullllllllCltullCCCtllCC@Cu@!!;!Y_!! ! !  !! ! p77!!!75Տwv}}}}}v}}}}}}}}}}}}}}}}}}}}}}}}}~}}}}}}}}}}}}}}}}}~}}}}}}}}}}}}}}}}}}}}}}}}}}}}ww}}}}}}}}}w}}w}}vw}}w}vw}}v}}ww}vwv}vvwvvvvvvwvvwvvvvvvvvvvvuvvvvuvvvuvvuouuouvvvouovvvllvvvuuuoouvouuluooultluuuullvulluulllltutluollltuuuultCCllttltttlZCCZCltlZCCCCZtZCCll=;!!!B_!!! ! !! !!!! !   q7Տsv}}}w}}}}}}}}vv}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}摑}}}}}}}}}}}}}}}}}}}}}}}}}}}}}w}}}}}}}}wv}}w}wv}}w}}wvv}}vv}}wvvwvvw}vvvvuvwvvwvvvwwvuuvovvvvuw}vvtvvuououvvluvuuvlovuluuvvuuluouvvuvvllllluuulullCttlulllouuuoCCCCCCtltttlCCtlCCtllCCCZlCCCCtCCCCCCZC!!#!!Y_ !!!!;;! ! ! !;!   !   !  !=q$5!Վ}w}}}ww}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}摑~}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}ww}v}}v}}}w}}v}}}vvv}}v}vwvvv}vvvwvvvvvvvvvvvvvvuvvuuuvuvvvvvvuvuvvuovuoovvuuvuuvvuvuvtvloulvwouullotluooulltltlluluttluuullCCllllllulCCltlCtltCCCllCCCtCCCClZCCCx!!!!!B_ !!#!!!!! !! !!  !=q7֢}}}}}}}w}v}}}}}}}}}}}}}}}}}}}w}}}}}}}}}}}}}}}}}摀}}}}}}}}}}}}w}}}}}}}}}}}}}}}}}vv}}v}}w}}}}v}vv}}v}w}wvvvwvvw}vvv}ʞ}vvvw}vvv{vvvvvvvvvvvuvvvw}vvuvvvuvvuuvvvvuvvvvvvuuvvvluluuolluvvuulluvtotouuoulltltllluCltlulCCllCCluuvuulCZlCCtlCCtlCtllluultlCltCCtlCCCC!! ;!Yx!!;!! ! !!!! ! ! !!    !s5!77բ}}}}}w}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}Ꙁ}}}}}}}}}}}}}}}}}}}}}}}}}w}}}}}}}}}}}}}}}v}ww}}}w}}ww}vwv}}}wvvw}}v}wvwvvvwvvvvvvv}vuvvvw}|vvvvvuuvvuvvvvvuuuvvwvuvvvuvuoolvvuullouoououvuluvuluotlllltllllllllCClttCltllutluClulllltCtlCCutttttllZClCClCCCCCC!!!!=Z_!;!#! ! !!!!! !! ! !  !  q!77}}}}}}}}}v}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}摑}ڑ}}}}}}}}}}}}}}}~}}}}}}}}}}}}}}}}}}}wvvww}w}}wvww}}w}}}}v}}}vvwvvvvvvvvvwvvw}wvwvvv}v}vvuuvvuouvvvuuwvvvvuoovvvuvuuuvuuouuuuuvuuvvuuouuulltlluvuoouvlluvuvuuluotlultuvlltllZlCCCCtCCZCCCCCtlCCCCCCultCCCZtltlCCZx!!!!9Y_! !!! !#!;! !#! ! !!  !  =p!$֏}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}ꙑ}}}}}}}}}}}}~}}}}}}w}}}}}}}}}ww}}vv}w}ww}w}}}}}}}}vw}w}}wwvv}}}vvvvvvv}vvwvw{vw}vvwvvwvuvvvvuuuvvvvvvuvvuuuuuvuvvuvvvullvvllvovvuvulluullulluvluutultluutuuululoullouuuoullltCCCCCCCtCCCttCClCuCCZCClCCCtCouCCCC@! !!B_!!!! !! ! !#!!# !!! ! !  =q!7Վs}v}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}摑}ڑ}}}}}}}}~}}}}}}}}w}}}}}}}}}}}}}}}}}}}}}}}}w}}}wvv}}ww}}wvv}ww}}vv}vv}v}}}wvvvvvvv}vvvvvvvvvvvvvvvvvuovvvvlvvvvvuooovuuvluwvoluuvvouoovuouvvvououvlCluvltllultuoooulCtllCullltolluultllCCClCCltlCCCCCCZlCCCCZCCCCZt!!!!;Z_!!#!!!#!#! ! ! !! !! !    !! q!!75Տ}}v}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}ꙑ}}}}}}}}}}}}}}~}}}}}}}}}}}v}}}}}}}}}}}}v}}v}v}}wv}}}vv}v}}v}}wvv}}}}v}}vvuvvvvvvvvuvvvwvvvvvuvvvvvvuvuvvvvuouuuuouvlovvuullvuuvluvluvvvvlououllluvllltClouuuuulultCCltlttlZutllulCCCCCZlutuCCCCCClttCCCCCZCCCC;!!!!B_!!!;!!!!! ! ! !!! !!! ! ! ! !! p7!7!!֏}}}}}}}}w}w}}}}}}}}}}}}}}}}}}}}}}}}}}~}}}}}}}}~}椡~~}~}}}}}}}}}}}}}}}}}}}}}}}}}}}}}w}w}}}}}}v}}}w}}}}wvw}}}wvvv}vv}}vvvvvw{wvvwvvvvvvvwvvvvvvvvvvwvvvouovvvuvuvvvvuvvouvvvvuluovuoooluuuuoCtuuvulvuoluuvooullZlllllulCuulllllCCCtutltlullCCCCCCZCCCtCCCCCCCCuCCCZ=9!!!Y_! !! ! !! !! ! ! !!   !!   q!7!Տ}}}}}wv}}}v}}}}}}}}}}}}}}}}~}}}}}}}}}}}}}~}}}}}}}}}ॡ}}}}}}}}}}}}}}}}}}}}}}}}}}w}}}}}}}}w}}w}}}w}v}}}wwwvw}wwv}vvvvvww}wvvwvvvvwvvvvvvvvvvvwvvvuoovuvuvvvvvvuouvulvuvoluluvtluulooullloouuuuvtlluvuuuullutlututCllltluCCClCtlluCoutltCCCCCCCltCCCCCBCCCCCCCu!!;!!@_! !! !!#!! !!! ! !! ! ! !  !    $}7!7$!777֏}}}}}}}}}}~}}}}}}}~}}}}}}}}}}}}}}}~}}}}~}}椑}Ӏ}}}}~}}}}}}}}}}}}~}}}}}}w}}}}ww}v}ww}v}}v}v}}}}}}}}wvv}vwvvw}vvvwvvwvvvvvouvupvvvuvvvuuvovuvvvvvvuuovvuvvvuuovuuuovvuluvvluvluuvuoooltouoolotullCuulltllCuutlltllutolCtlCCullCCtllCllCtCCCtlCCuCulCCC!!=!!Bx!!!!!!! #!!!!#! ! ! !     !=q!!!!֎}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}ड~}}}}}}}}}}}}}}}}}}}}}}}}w}}}v}}}vv}}}}}w}vvw}w}}}}}{}}{wvvvvvvv}vvvvvvvvvuvvvvvvvvvuvvuvvvvvvooulvvuuvvuovuovvuuvvuuvultlluuuuuvlluvotullouClluCCllllluutltCCuuulltuCltttltluCCZluCCluCZCCllZtCCCC9#!!!@x;!! !!!!!!!!!!! ! !! ! !!  ! !! ! q!!!!֏}}}}}}}}}}}}}}}v}v}}~}}}}|}~}}}}}~}}}}}}}楡ӑ}}}}}}}}}}}}}}}}}}}}}}}}}}}}~ww}w}}}}w}}}}w}}w}}}w}}vwvӞvvw}wvvw}v{}vvvvvvuvvvuuovvvvvovuuuouuvvvovvvvvvoooovvtlvvoluuvvuuuoluuvulluullluuulluulltltullllltlllllttlCCCuCCCCCllCCCCCltCCCCCZCCCCBA@u!!!!;Z_!! !!9!!! ! !! ! !      !q7!!՟}}}}}}}}}}}}}}}}}}}}}}}}~}}}}}}}}}}}}~}}}}}}}त}}}}}}}}}}}}}}}}}}}}}}}}}w}w}w}}}}}}}}}}}}}}wvwvv{vvvv}}}wwvyvvw}wvwvvvvvvvvouvvvvuoovvvolovwvvuvvvvvououuvvovvooluvvvooutlluouuouutlluuuouulluClutllttlulttClltCCCCCCCZltlCClZCCulClCCCCCCCCCC@;!!9!C_!!!!#!#! ! !! ! !!!! !!   ! !   !q57Տ}~}}}}}}}~}}}}}}~}}}}}}}}}~}}}~~}}}~~}~}}}}}}~}}~}}}楡}~}}}}}}}}}}}}}}w}}}}}}}}}}}}}}}wwwwww}vw}v}}v}}}vvv}wvv}v}wvvvvvvvvuvvwvvvvvuovvvvvuvuuvvuvvuuvvuoooououvlloouuuououuuluooluouvoluooltlltluulllluulltlllltlClulCCulullllCCCZltCCCCCCZltClCCCtCCCC=!!!!Y_!!#!! !! !!!#!# ! !  !! !  !  p!Տ~}}}}}}}}}~}}}}}}}}}}}}}~}~}}~}}}}}}}}~}}}}}}}}}}}}ꥡ}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}vvv}wvv}}vvvvvvwvvv}}vvvw}wvvvvvuuov}vvvv}wvuvvvuvvvvuvvvv}oovvvououououuluvovvuvllllvulllouuvtlotluoltlllululultullutltlltCCoClltltultCCCCutlCZCCCCCCZCCCClZCCC{@!!!!@_!!;! ! !!!!!! !!! !  !!!  !! !!  ! !$p7!!!$!!7֏}}}}}}}}}}}}}}~}}}}}}}}}}}~}}}}}}}}}}}}摑}}}}}}}}}}}}}}}}}}}}w}}}}}}}}}}}}}}}v}w}}}v}}v}}}}}wv}v}wvvvv}v{vvvvvvvvvv}wvuvvv}vvvvvovvvwvvulv}vuuvuoovvvvuoolvvuuouoououvoouluuouolltluuoolltoulttlllltllCultulCZltulCltltlCllCCCllCCCCCCCCCCZCCCCCZ!9!9!Z_!!!!! ! ! ! !!! ! ! !#! ! !   !  !q!!$!7֢}v}}}~}}}}}}}}}}}~}~}}}}}}}}}~~}}}}}~}}}}~}}~Ꙁ뤑}}}}}}}}}}}}}}}}}}}}}}}}w}w}}v}}}}}}}}}}vww}}w}٘w}}vvwwvvvvvvvvvvvvvvvwvvvvovvvvvwwvvvuvvvvvvvuvwvvuvvuuluvvuvuovvuouvuovvuvuvvuuuuuvulCloutlluluullllCtltuClltCCCCCloulZCtlltltlCClZulllZCClZCCCCACCCCv!9!!9Z_!! !#! !!! ! !!!!! ! !!!!  ! ! !!   !  q7!֏}}}}}}}}}}}}}}}}}}}}}}}~}~}}~}}}}~}}~}~}~}~}}桑}}}}}~}}}}}}}}}}}}}}}}}}}}}}}w}}v}}}}}v}}ww}}ww}}}әvvwvvwwwvvvvvvvvvvvvvvvuvvuvvvvvvvvuvovuvoovvvvvvvvoovvuuuovuolvvolupooouoluloltooltuollvulloululllullCCtulCtllCZCllllCtlCCttCCCCCZCCCCtlCCCCCBCCCZ!!!!9Y_!! !!!!!#$! !! ! ! ! ! ! ! !   !  !q!775Վ}}}}}}}}}~}}}}}}}}}}}}}}}}}}}~}~}}}}}~ड}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}w}w}}}}}}}}}}}}}}}}Әww}vvvvvvw}vvvvuvvvvvvuvpvwwvouovvouvuvuuuuvvvuvvvllvulluooulooulluoooooullullouluvuuullullultluClllltlllCCCCCCCtCCCZCClltCCCCCCCCtlCCCCCCCCCCC!;!9@C_! !!=#!!#!!! ! ! !! ! !! ! ! ! !  !!=q!77Տ}}}}}}}}}}}}}}}}}}}~~}~}}}}~~~~}}}}~~~~}}~~~}楡}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}ww}w}}}wwv}}}ww}wӐ}vvvvvvvvvvv}vvvvvvvwvvvuvvvvvovvuuvvvvvvvoovvouvvllvvulvuuouvuuuloluvoooluvullulvulluultlluulllltlllltttllllCtlulCCulCCtlClllCCCZlCCZCCtlCCCCC{!!!!!Y_!!!!#!! !!! ! !#! ! ! !  ! !    !$q!֟}}}}}}}}~~}~}}}}~}}}}~}}}}}}}}}}~}}~~}}}}}椑}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}w}vwwv}vwvv}}}wvww}׆vv}vvwv}vvvvvw}wvuvvvwvvuvvvuvvuvvvvvvvvvuooovullouuouvolvvvuluooptlluuluulluvulllulCCluClllouolluuuotCluvuuultllvtCClltllZCttttCCCllCClllZCZCCZC=;!!!@_!#!!!#!! !!!! !! !!!! !  ! ! !  !! !p$!!֠}}}}}}}}}}}}}}}}~}}}~}}~}}}~}~~~}~~}~~~}~}椑}}}}}~}}}}}}}}}}}}}}}}}}}}}}}v}}}}}}}}}}}}}w}ww}}}wv}vvvvv}}vvvvvwvvvwvvvvvvvvvuvvvvuvvvvwvvvvvouvuvvovuuvvvvulvvovoluluuuluoovlluvlllltuuCluollultltttulCtllllulCCtlCttlCllZolCCCCClClCCCZCClZCCCCCCCCu!9!!!Y_!!!!!!!!!!!#!!!! !!!!! !! !! ! ! !    p!!֢}w}}}}~}}}~~}}}}}~}}}}}}}}}~}~}}}}}}}~}}~}}ꤡڥ}}}}}~}}}}}}}}}}}}}}}}}}}}}v}w}}}}}}}w}}}}wvv}}}}}}}}}析}vvvv}}vvv}}v}vvvwwvvvwwvvvvvwvvvvuvvvvvvvvvvvvoouvouvvvvvvvvvloouuvolllvvlovotlloulllluvvuouulCltllClCCllloutllllCCCCClCltllutCCCCCttltCCCZCCCCCCCCCCCC!!!@!@_!!!!#!!#!!!!!!# !!!#!!! ! ! !   !  ! !!  =s֟}}}}}}}~}}}}}}}}}}}}}}~}~~~}}~~}}~}}}摑}}}}}}}}}}~}}}}}}}}w}}}}}}w}}v}}}}}}}}w}}ww}w}}wvwv}}}vv}wwvvv}vvv}vvvvvvvvvvvvvvvvvvvvvvvvvvuvuvvvvuvuuvvvuuvvvvoouvoouuoluvuuvvulovololuuuuooolluululluulllllltltltlCCuullCCCCCtlCtllCtllCCCCttCCCCCCCZCCCtC@CZ!!#!!Y_!!!!!!!!!!!#! !!!! ! !! !! ! !!   !   =q!$֏}}}}}}}}}}}}}}}}}}~}}}}~}}}}}}}}}~}}~ꥑڑ~}}}}}}}}}}}}}}}}}}}}}}}}}}wvw}}}}wv}}}}}}}vvv}}}w}}}}vvwvv}}wwvvwwvvvw}vvvvvvvvvuvvvvvwwvvpvvooooooooovvwvvvvloulloouovvolovuvvuolluuuvoovvvutltCllllCuuullllCCllllllCCluullCCCClllCtlllZlCCCCClCCCCCCCCCACCCACl!!!!!C_;!#! !!#! !!!! ! ! ! ! !! !  !!=q֏}}}}}}}}~}}~}}}}}}}}}}}}}}}~~}}}~~}~椑}}}}}}}}}}}}}}}}}}}}}}v}}}w}}}}}}}w}}}w}}}}}}w}}}}w}}w}wvv}}v}v}vvvwvvvvvvvvvwwvvvvvvw}vvvvvvvwvvvuvvvpuovvvuvuvvvvvoovvoovuoovvuuvuoououvoooooltvuuolloolluollloltuulCltltltllttltlCtllulCllCtlCCulCClCCCtlCCCCCACZCACuC!$!!!Y_!!!!! !!! !! ! ! ! ! ! ! ! !  ! !!     !!q!7֎}}}}}}}}}}}}}}}}}~}}}~}}}~}}}~~~}}~ꑑڥ}~}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}w}}}ww}w}}}v}}}}v}}}}}wvvvvvwv}}}}vvvvv}vvwvvvvvv}}wwvvw}vvovvw}wvuvvwvuuovvvvvuvouvulvuvvvvuoouvuvvvuloovvovuvullloooluluououlotllouvtClltllluClllCClouuulZCCClCCCltCCCCCCltCCClCACCCCClC{!;!!!B_ ! !!! !!!!! !!! ! !!! ! ! !  ! !!!! ! !!  !=s$֎}}}}}}}}~~}}}~}~}}}}}~}}}}~}~}~}~~~~~}}~~ꙑ}}}}}}}}}}}}}}}}}}}}}}}}}w}}}}}}}}}}}w}}}}}w}}}w}}vww}vwwvw}wvvwvvvvvwvvvvwvvvvvvvuvvvvvvvvvovvvvvvvouoowvuvoouvvvouoovvvvoooooouuouuluuouuuoolultluolluultlCtullllCClulClCtulCllCCCllCCtCCCZCCCtCClCZCCCCCCCZC@!!9!;Z_!!!!!!!! ! ! !! !! !!! !  ! !!! ! ! ! !  }7!֎}}}}}~}}~}~}~}~}}}}}}}}~}}~}}~}}}ꥡԑ}}}}}}}}}}}}}}}}}}}}}vv}}}}}}}}}}v}w}vvvw}}}vwvv}}}}}vwvvvvvv}wwvvvvvwvvvoovvvvvvvvpuvvwvuvovvloouwvvvulovvvvvulluouuluuulvvtllouvuulououluoooullllCClluuullulCCttltllutCCtlClZCCCltClltCCtlZCCCClZCCAACCCx!!!!=Z_!9!! !#!!!! ! !!! ! ! !!!  !!  !!   ! !! !9s Վ}}}}~}}}}}~}~}}}~~}}}}~~}}~}~}~}}~}椑}}~}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}w}}w}}w}v}}}}v}}}wwvww}}wvv}}vvvvvv}wvvvvvvvvvvvvvvvvvvvouvv}vvvuvovouvvuvvvvvuuvuolvvuuoluvolovoluouuuolltuulltluluuuolllllllCtlltltlClCuulCCllClCCllllCCtlCCCCCCCCCCCCCCCCCtC!!9!!Z_!!!#!!!!!! ! ! ! ! ! !! ! ! !   ! ! ! ! ! !!q Տ}}}~}}}}}~}}}}}~}}~~}}~}~~}}}}}}~~~~}}}~~ꤑӑ}}~~}}}}}}}}}}}}}}}}}}}}}ww}}}}}}vv}}}w}}}}vvvv}wvvvw}}}v}}}w}vvvvwww}wuvvvwwvvvvvvvvvvopov}vvvvvvvuooooovvuoloouvuvvovvoovoluuulllooooullovvtllullooutvutltllltClltllCCCltlltCCCCttCtCCCCtCCCCCCCClCACCCtCCll!!!@!B_!! !! !! !! !! !!    !!!! !   !! ! !!   p  ֏}}}}}~}}}}}}}~}}}}}}~}}}~}}}}}}~椑}~~}}}}}}}}}}}}}}}}}}}}v}}v}}}}}}}vw}}}}}}}}wv}}v}}wvvw}}vvvvwv}vvvvvvvwvvvvvvv}wvpwwvov}vovpv}vvouv}voovuovvvoovvoovvuvouuouuouololuooouuolluuuolltluultuulltltllllCtllCtllllCtlCllClCClCCCCCCCCCCCCCZCCCCCCCCC{=!!!!Z_!9!!! !! !!!! !! ! ! !!    !  !  ! !q! ֠}}}}}}}}}}}}}~~}~}}}}~~}}}}}~~}~}~}}~}~}ꥡӑ}}}}}}}}~}}}}}}}}}}}}}}}}}}}}}w}}}}}v}}vwwvw}}}}}}}}w}}}}pww}}}vvvvvvvv}}}vvvwvvvvvvvvwvvvwvvvwwvvoovvvulvwvovwvooouoluooluuluooovvovvululuvtlouuloullluloooulCltlllllluullltCllotCCllttttCClZClCClCCCCZlllCCClCtCCCC@9!!!B_!!!!!!!!! !!!!! ! ! !!!! ! ! !! !  ! !   ! ! !!!!  }  ֏}}}}}}}~~}}}~}}}~}~}}~~~~}~}}}~~}楡}}}~}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}wv}}}}w}}}w}vwwvvvvv}}vvvvvvwvvvvvvvvvvvvvvpvvvwvvvvvovvvvvovvvvuvvuvllvlvvlooouvuuvuovlluuolloolooultlloouollllllloCCuulllCltlltCCulllCllCtlCCCCZlCCltCCZlCCCCCCC{!!!!@Y_!!!#!!!! !;! ! ! ! ! ! !  !   !!  !  !  !! !=q ֏}~~}}}}}}}~}}}}}}~~}}~}}}~}}}}}~~}~}~~榥ڑ}}}}~}}}}}}}}}}}}}}}}}}}}w}}}w}vvw}}www}}}v}}}}}}}}}wvwvvvvvvvw}vvvpvwv}}}}wvvvvwwwvvpuvvvvwwvvpvvvvooovvvoovvvvvvvoovuoolovollluovullvvuuultlolououuoulouootuullltllCltltllClltltlCltuCClCCltlCCCCCCCCCCCCux!!!!9C_!!!!!!#!! !!!! !! !!  !!! !     !    ! !  !!=q  ֏}}}}}}}}~}}}}~~}}}}~}~}}}}}~}~}楢}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}w}}}}}}}}}wv}}}}}w}vv}}}}www}vwwvvvwwvvvvvv}vv}}wvvovvvvvvvpvvvvvwvvuvvwvovuvuvovuvvovvuouvoluoouuouooluvtluvollolllluouuouolllttllltlttltlllllCltltlCtCltlCCCCZlllllCCCCCZCCCA{u]!!99Y_!!!!! !!! ! !#! !! ! ! !   ! ! ! ! ! q  Տ}}}}}}~}~}}~}}}}}}}}}}}}~}}~}~}}}ꙡڙ}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}w}}}}}}}}}}v}}}}ww}}vv}}ww}w}}}}vvwvvvwv}wv}wvvvvv}vvvvvwvvvvwvvopvvvpovvvovvvvwvvvooovvlvvvvovvvvlloollvvvolvvovuuulultlllluuullltlllCClulltlCtlCllttCCCCClClCClClZCZCCCCCllCZ{C!!!!!@_!!!;!!! !!!!! ! !! ! !!! !! ! ! !  !       ! !  !$p   ֏}}}~}}}}}}~}}}~}}}~}~}~~}}}~~}}}~楑}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}w}}}}v}}}}}w}}w}wv|w}}ww}}wvv}vvvvwvwwvvwvvv}vvvvvvvvvwvvvovvvvvopvuvuvuuvvvvvouvvlovvuovvvvlluvulvvuluoouuuoloolltlulluulllllllllllltllllCCtlllCltlCClZlCClllCCClCCCCCߔlt!!;!!Y_!!!#!! !!!! !!! ! ! ! ! ! ! !! !! !!   ! ! ! !   !!p  ֏}}}}~}}~~}}~}}}}}}~}~}~}~}}}~}릡ڤ~}}}}}~}}}}}}}}}}}}}}}}}}w}}}}}w}}}}v}}vvv}v}}vv}}}v}v}}}}wvv}}vw}}}wvvwvvvvvvvwvvppovvvvwvvvvvvvpvvuvvvvvovvooouvovvvuoluoouvoullvvvllolllvulooootllllulllovptlluoooultlltltClltlllCCltClCuClZCtCCCltlCCutl!!=9!C_ !!! !!!!!!!#! ! ! ! ! !! !! !! ! !!!!! ! !  !   !  q!  ֏}}~~}}~}}}}}}~}}~}}~}}}~}}~~}~ꥢ}~}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}w}}}}}vv}v}}v}}}vw}}}}}wwwwvw}wvwwvvwvvvvwwvvvvvvvov}vvvvvovvvvvvvuvvvovvvlovouvvvvoooovovooolu}ullulluvlolluoolllllullluullltluvlltllltlltlllCZCCllCltlCCllCCCCCCltzCx!!9!!Y_!!!! !!!! !!!! !!!  ! !!  !!! !!  !  !   !q7    ֠}}}}}}}~}}}~}~}}}~~}~}}~}~~~}}}~ꙡ}}~}}}}}}}}~}}}}}}}}}}}}}}}}}}}}}}vv}}}}}}}}}vw}}}vwvvv}}}}}w}}}vv}vwvvpvwvw}vvvwvvvvoovvuvuvvvuvvovvvoovvovvvvupoovvvvulvuvvlvvoovvvlouolulluvuuulullullltlloouvtlCCCClClttlCllClttlCCCCltlCltCCAuߔCC!!@=!Bx!!!!!#!!!!! ! !!!!!! ! !  !! !   !   !  ! !      !=s!     ֟}}}}}~}}~}}}}}~}}~}~~~摡}}}}~}}~}}}}}}}}}}}}}}}}}}}}}}}}}v}}}}}}}}}v}}v}}}}vwvwv}}}}wvv}vvvvvvvvvvvvwvvvwvvvvvovovvvvvvvovvvvvoovvuvuvovuooovuoooovvvluvouvuuuollvoluouvvollltllllllltluulllllClllllCltlCltlCCCClltCltllCut{!!@!!Y_9!! !!!! #! !!! !#! !  ! !! ! ! !   ! !!!  !  9sՎ}}~}}}}~}~}}~}~}~}~}}~~}}~}~}}~~~~ꥑ楑}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}v}}}}}w}}vw}}}}}}v}}}}vv}vwwvv}}w}vvvw}wvvvvvv}vvw}}vvvvv}wvuvpvvvvvvoouvvvvvuoovuvvvvvvloolllovvlloooouvullulltluolooutltllCCClltllltCllulCCltCCCClttCCCCtCCCuzll!!!!!B_!! !;!!!!!!!!!! !!! !!   !! ! !  !! !! !     !!!!!=p!!     Տ}~}}}~}~}}~}~~}}}~~}~}}~}}}}}~ꡑ}}}~}}~}}}}}}}}}}}}}}}}}}}}}}}}}v}}}}}}}}}vv}}}}}wv}}}}}}}vv}v}v}vvvvv}wwvvvvpv}vvvvvvwvpv}vvvlvwvvvvvvuvuvvvvovovvvoovwuluuoloouolooouuvvoluollloolultolllulllllllluulCCtutllllCCCllllCZlCCCCߔtC{!!!!!B_!!!!! !!!!!!!#! !!!! !  ! !!! ! !!!  ! ! !!    !!  !!q  ֢}}}}~}}}}}~~}}}}~}~}}}}~~}}~ꥑꙑ~~~~}}}}}}}}}}}w}}}}}}}}}|}}}}~}}wv}}}}}v}}}}}}}}}w}vw}vvv}wwvvvvv}wvvvvvw|vvv}wvvv}wvvovvvovwwwvvwwvvupovvvvouvvvvlvoooluvolvvvvuvoopvvllltlulluvulvvuullllullouluotltlltllCCCltCCClultCCllCCCuxCl@!!!!Z_!!!! !!!! !! !! !!!!!! ! ! !!! !   !! !!  !  !  ! !      p   ֠}}}}}}}}~~}~}}~~}}}}}}~~}~~ꥡԑ~}}}}}}}}}}}}}}}}}}}}}}}}}}v}}}}}}}w}}}}}}}w}}v}}v}}}wwv}}}}}vv}vv}vvv}vvvvvwvvvvwvv}}vvvvvvvovwvvvvvovvvvupvwvovvvvuvvououovvovvvovvuouuullloulluvuuuuuoolltooltuluulltlCtllClCtllCCCoutCCCClCl̃tC=!!!!Y_!!!!!!#!! !!!! ! !  !!! !!! !! ! !!   !!   ! !  !  !!  !! q!      ӏ}}}}}}}}}}}~}}~}}}}}}~}~~~~}}~}}~}~楢~}~}~}}}}}}}}}}}}}}}}}}}}v}}}w}}w}}wv}}}}}vv}vw}vvvvv}vvvw}}}vvvvvvvvvvv|vv}vvvvvvvpvvuopvvvvuovvovupoovvvlvooooouvulovouvoolvulvvllllllolllCloolllltlCtllCllullCllvllltCCCCCCCCxuCu!9==!C_!#!!!! ! !!!!!! !! !!!      !!!! !   !  ! !!  !  !!! 7p$   ֎}}}}}~}}}}}}~}~}}}}}}~}}}}}~~~}~~ꥡڢ~~}}}}}}}}}}}}}}}}}}}}}}}}}w}}}}}}}}}}v}}vvv}v}wvvvwww}}v}vvwwvvv}vvv|vvw}vvvvvvvovvvlvvvovpovvvvvulovvvvlulpouvvllupllovuvoluvulltlllvulClluulllllllllllCtotllllttuulCCCCClt{CC!!9!9Z_!!!!!!! !!!! ! ! ! !     !! !!!!!! ! !  ! ! !! ! !  ! ! =q      ֏~}}}~~}~}}~}}~~~~~~ꤑ묡~}}~~}~}}}~}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}v}w}v}vw}}}w}v}}w}}}v}vvvv}}vvvvvvpvvvv}vvvvwvvovovvpvv}vvv}vvvuvvouoovvvvvuvvvvuvovovuovvouuloulluvuooolltvluuCuvulullluultlllllotClCCCClllCCC{ߛulx!!!!!B_9! !!! !! !! ! !! !!! !!!  ! !!  !        !!  !  !  9s$!    ֠}}~}~}}~~}}~~~~~}}~~}摑ꥡ}~}}}}}~~}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}w}vw}}w}v}w}}v}vv}vvvv}wvvvvvvvvvv}}vvvwvvvvpvvvvpvvvvvvv}vovvvpvlvvvvvoov}vuovouvolvuvlolvllluovllultllvoollvuulllullllltlCtltllllClCtlluulu!!@!!B_!!!!! !!! ! !!! !!!!!! !! ! !!!!   !    ! !     ! ! !  ! q!    ֏}}}}~}}}}}}}}~~}}~}}}}~~}~~~~~}~ꥑؑ~~~~}~~~}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}v}}}}}vvw}}}}}w}}vv}}}}}}vvvv}}vvww}}}}vvv}vvvvvv}}vvvvvovpovpov}vovvvvwvooovvllvvopouoovovoouulovulooouvolvootlulltllllluvulutlulCllClloltCCCõlC{!!9!!B[!!!!!!#!!!! !! !! ! ! !! !  !!! ! !!  ! !! ! !  !   !!!9s!   ֎~}}}}}}}}}}}}}}}}~}~~~~~~}}~}~~桑묑~}}}~~~}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}w}}ww}}}w}}}}}v}}}vv}}}vvvvv}}w}}}}}}wwv|vvvvvpvvwvvvvvvvvvpovupvvovvvvv}voooouooovvoopoouvuoollooolouuvvluuuolllllulllltlllullullllCltltulCluuCu!!!!9Z_! !!!!!!!! ! !! ! !!!  ! !  ! ! !   !! ! !!! !!  !!!  !   !!=}  ֎}}~~}~}~~}~}~~~~}~~~~}~~~~ꥑꥑ~~~~}~~~}}~}}}}}}}}}}}}}}}}}}}}}}w}}}}}}}}}}}}}}}}|vvvv}}}v}}}|vv}vvvvw|vvvvvvvvvvvvvvvvvvpvvvvvpvvvvvlooovvoooovvvovvoououoooovvvulvlulovvlloouvulllovtlooulullllouuCClullClu{ul!!!!@Cx9;!! ! !!! ! ! ! !! ! !       ! !  !  !   ! ! !!  ! !q    ֏~}}}}}~}}~~}}}~~}~}~~~ꥡꥥ}}~}}~}}}}}~}}}}}}}}}}}}}}}}}}}}}}}}}}}w}}}}}vvwv}w|}}}}vvvv}}vvv|vvvwvovv}vvvpppvvwvvvvvvvovpvouvvovvuvulvpvvvvvoooooluooooulovloltooouoououlllluuluvloltlCtuollltltllyߘutx!=@=!Y_!!!!!!!! !!!!! ! !  !!!!  !    !  !  !!! !!!! ! !! ! !!!! 9q   ֏}}}}}}}~~~}}}~}~}~}}~~~~~}楑ڥ~~~~~~~}~}}}~}}}}~~}}}}}}}}}}}}}}}}}}}}}}}}}}}wv}}ww}v}}}vvv}w}}vvvv}vvv}}vvvvppvvv}}vvvvpvvvvvvvvvvvvvvovvooovvvvpuovovvvvuouloupuvvvvullloulvoltluvvvutllllttlltlClltltllCluutC!!!!!C_! !!! !! !!!!!! !! !!!! ! ! !!  !  !  !  !  !   !  !!   ! !! !$p֏}}}}}~~}}}}}}~}}~}}~}}~~~~~}桡ڡ}}~}}~}}}}}}}}~}}}}}}}v~}}}}}}}}}}}v}}}}}}}v}vv}}}}vvw}wvvvv}vvvv}}vvvvvpvvvvvvvvvvvvvvvvvvvvvvvvvvovoovvvwvvoopovvvvpooovvvvuouooooovouvuoollvvuollCClllllllltllllCCl{΃uly!!!!!Y_ !!!#!!!!!!!#!!!! !! ! !!!! !!  !  !!   !  !! !  !  ! !!! !   $q    ֏~~}~}}}~}}}}~}~}}}}}~~}~}}}~륡ԑ~~}~}}~~~}}}~~~}}}}}}}}~}}}}~}}}}}}}}}}}}}~}}}}}}}}}}}v}}vw}}v}}}vv}}}}wvvvvvv}ww}vv}vvvvvvvvvvv}vwvpvvvovvvuvvvvvvvpvpoulovovopolulovoooulvuoulloooulllulloulllllultlllllulluvll!!@!!Zx!!!!!!!!!#!!! !! ! ! !!  ! ! !!   !    !!!!   !   !  !  !=q    ֏~}~}}}}}}~~}~~~~}~}~}~~}~}~~~ꦡ맑}}}}}}}~}}}}}}}}}}}}}}~}}}}}}}~}}}v}~}~}}}}}}v}}}}}}}}}}vvv}}v}wvv}}wvvv}}vpp}}}v}vvv}vvvvvwvpvwwvv}uoppupvvvvvvvvvvvvvvloloovuuvuoovulooolooolouvulullllluuolluluoooltltlou{uC!==;=Z_!;!!!!9;!! !! ! ! !!  !! !  !    !!    !!  !    !     !! =}  ֏}~~}~}}}~}~}}~~}~~~~~~~~ꥢꬡ~}}~}}}~}~}~}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}wv}}w}}v}v}vw}}vw}}vv}}}v}v}wvv}}vv}}vvv}wvvvvw}vvopvvpvvvvvpvvvvopuovoovvoouvuoooopulooupoouvuoulloullloulpllluulllolullllluvou!9!!!B_!!!! !!!!!! !!! ! !!!!!  !!!!    !!! ! !      ! !  ! !!   !9q  ֏s~~}~}}}~~}}~}}}}}}}~}~}ꥢꑑ~}}~}}}}}}}}}}}}}}}}}}}}}}}}v}~}}}}}}vv}}}vv}}vv}}v}}}}v}}vvvvv}}}}wv}}vvvv}}}vopvwvpovvpuvvvvvvppvvovpvooooooovvolllouollovvllvuolllllllluvuoltuoolllltuolClluuC=9!!!Y_!! !!!!!!!!!! !!! !!!!!! ! ! !!!   !  !  !  !!  !!  !! !! ! !!=q Տ}~}}}}~}~}}}~}}~}~ꥢڥ~}}}~}}~~}}~}}~}}~}}}}~}}}}}}}|}}}}}~}}}}~}v}}}}}}}}}vv}}}}}}}}}}}}v}vvv}}v}vvw}vvvv}vvvvvvvv}vvvvv}vov}vpvovvvwwvuvoovovvvpovpvvuvvvoouluvovvlooooouoouoolllulCouoolulllullu߃ulv!!!!!C_!!! !! ! ! ! !!! ! !!! ! !  !   !  !    !  !   !! =w!!!  ֎s}}}}~}~}~~~~~}~~~~~~~~ꥢԡ~}}~~~}}}~}}}}}}}}}}}~}~}~}~}}}}~}}}}}}}}}}}}}vvv}}}vv}}}}}}}}}}wvvvvvvvv}}vv}wvvvv|}}vvvvvvv}}}vvpvvvvvvpooovv}wvvoovvovovvoovvvovvoolllvvuvoluluvlouupolllllllllultollllovlu!!!!!Yx!!!!! !!! !!!!! !!! !! ! ! !   ! !!!  !  !  !!  !! !  ! !!   !  =q!$  ֏}}~}~}~}}}}~~}~~~~}~~~~ꤡ~~~~}}}~}~~}}}}~}}}}}}}}}}}}}}}}}}}}}}}}}w}v}}}wv}}v}v}vv}vvv|v|v}}vvvvvvvv}}vvvvvvvvvvvvvvvvvvvvvpvvvovwvovoouvvvvvuoulvvvuvloovvolovvllvuouoloulooullouolo{{ul!!!9!C_!!!!!!! !!!! !! !!! !  ! ! !! !!  !       !  !   !! !q$      ֟~~}}}}}~}}}}~~~}~~}~ꥡ륡~~~~~}}~}}}}}~}}}}}}}}}}}}}}}}}v}}}}}}}}}}}}}}}}|}}vvvvv}}}vv}v}}}}}}}vpvv}vvvvpoppvwvpvvvvvvpvvvpvvvov}povloouwvvoloopvvpoouvvoovuvvvluvvvvvluouuuoluuuouߔtC{!!!!!Y_!!!!!!! !! ! !!!!!    !!!  !!!  !! !  ! !!   ! ! !!  ! ! !  !!9}   ֏~~}}~}~~~~}}~~~~~}~}~楑॑~}~}~}}}}~}}~}}}}}}}}~}}}}}}}}}}}}}}}}}}}}}}v}}}}w}v}}vv}}vw}}vvvv}}vvwvpvv}vvw}vvvvvvwwvvvvvvvovvvuvvvlo}vvvpvllvwlvouovouvouooouooouooooououlullllululll{{ou==!!!C_!!!!! !!!!!! !!! !! ! ! !! ! ! !!  !  !  ! !   !  !  ! !  ! ! =q$    ֏}}}~~}}~}}}}~~}}~}}}}}}~}~~}ꡑڑ~}}~}~}~}~}}}}~}}}}}}}}}}}}~}}}}}}}}w}}}v}}}}|vpv}vvvv}}}}}vvvv}}vvpvpv}vvvvvvv}}vvvvvvvvvvvvvvovvollv}wvvvvvovvvuvlllooollupoollolluuoloouooolllllllo{uu=!@==Y]!9!! !!!!@!!!!!!!!!!!!! !!!  !!    ! !!! !  !   ! !   !!  !=q  ֏~~~~~}}~~}~~~~~~~~}~}~~ꥡ֡~~}~~~}}~~}}}~~}}}}}}}}}}}}}v}}}}}}}}}}}}}}}}}}v}}w}}wv}}}}vvv}}}v}vvv}v}wvvvvvvvvvvvvv}vvvvvpvvvovvvlvwvovoovvvvoovvoovvovvuovuououuoluvvloputllloououloulvߘul{!!99!Z_!!!!! !!!!! ! ! !! !! ! !! !!! ! ! !  !   ! !  !  !  !      !=}        ֎}~~}}}~~}}}}}}~~}}~~~~}~~뫦}~}}}}~~~}~~}}}}~}}~~}~}}}}}}}}}~}}}}}}}v}}}}}vvvw}}v}}}}}}}v}}}vvvvvppvv}}}wvvvvv}vvvpvvvpvvvpvwvvvvvvvpvvvlvvvvvvvoloopv}vovvoovvllvovvvvlluoltuvoovvvul{ulu!!!!!Z_!!! ! ! ! !!! !! !!! !   ! ! !!    !! !   ! ! !   !! = $$8>        ֏~}}}~~~~~}~~~~}~~}~~~~~}~榢륑~~~~}~}}}~~}}}}}}}}}}}}}}}}~v}}}}}}}}}}}}}}}}}}}}w}}wwvw}}vv}}vvvv}wvvwv}vvvvww}vpvvv}vvvpvvvvvvvlvvvvvvvvvvovvvuvovvulvwoluvvouloopuvlllloouotlouv{vo!9!!!Y_!!!!! !! !!!! !!!!!!!! !!!   ! !   !  !  ! !!  !   !   ! !=q $j_j!   ֏}}~}}~}}~~~}}}~~~~~}}}}~}~~~~ꥡॡ}~~~}}~}}}}~}}~}}}}}|}}~}}}}}}}}}}}}v}}}}}}v}}vvw}}}}vvv}w}}}}}}}v}vvv}}}vvvv}}vvvvvv}}}vovvvv}vpovvvvvvuoovvvvollvoolo}vlovvvlouvupollovvolllltvʘvv===!!Y_ !!!!!!!!!!! !! !   !! !!!!!  ! !  !! !!   ! !  ! ! !! ! !! !  !p  >Bי_    ֏~}}~~~~}}~~~~~~~~~~~~~~~~ꥡڡ~}~~~}~~}}}}}}}}~}}}}}}}}}}}}}}}}}}v}}}}}}}}}}}w}v}}v}v}}vvv}}}}}vvvv|vwvvvvvvvv}vvvvvvvvvvvpvvvvvvvvvouvvuovvlvoouoouvvulopovvoooouuuuoovullulovvuo{!9!!!B_!!9! !!! !! !!! !!  !!!!!! ! !  !!!  ! !    !!  !  !!   !   !9q     8_>       ֟~}~}}~}}}}~~~~}}~~~~}~~~~~楣~ԡ~}~}~}~}}~}}}}}}}}}}}}}}}}}}}}}}}|}}}}}v}}|}}~wv}}}wv}}vvvvv}}vv}}|vv}vv}vvvvpv}vpvvv}vpvvvpoov}}wvpvvvv}vvvoovvoovvvvvopvvvvvoovvuvolollollllltoluloltu!!!9!Yx!!!!!! !!!!!!! !!! !  ! ! ! !! ! !!  ! !  !!! !  !   !   =w  =ZC   ֏~~}}~~~}~~~~~~~~~~~~~~襢~~~}~}}}}}}}}}}}}~}}}}~~}}}}~}}}}}v}}}}}}}}v}}}}}}}vv}}vv}}}w}}vvvv}}vvvvvvvvvvvpv}vovvvvvpvwvuvvvvvvovvppvvvvolvvvovuuvvvovooullvulollolllolu!9!!!B_99!!! !!! ! !!!! ! !!! !! !!!!   !        ! !!!  !!   !  =}   7ZCB>!      ֏s~~}~}~}~~}}~~~~}~~~}~ꦦ륑}}~~}}}}}}~}~}}}}}}~}}~}}}}}}}}}}}}}}}v}v}}vvv}}}}v}w}|vvvvvvvvvv|}}wv}}}}vv}vvvvwvvvvvvvvvpopoovoopvoooov}vvupouvovvvooollvlluvvvolovvvvvvvvuuuoo!!!!!B_!9! !!! !!!! !! !!!    ! !!   !! !    ! ! !!! ! ! ! !   =w ==      ֏}}}~}~}~~~~~~~~~~~~~~ꦦॡ~~~~~}}~~~~}}}}}~}}}}}~}}}}}}}}}}}}}}}}}}}}}}v}}v}}}v}w}}wvv}vvvvv}}vvv}vv}}vvvvvvvvvvvvvvvpuvvvvpvoovpvvvvvvoooovvuvooulovvlovuvvoolovvlouuuooolu{!!!!!@_!!! !!!!! ! !! !!! !! !  !!! !!   !  !   !  !  !   !    !   !=q     !          ֏s~~~}}~}}~}}~~~}}}~}}}~~}~~}~~~~~~~~楡ڡ~~}}}}}}}~}}}}}}}}}}}}}}}}}}}}v}}}v}}}}}vvv}}vvvv}}}}}}}}vvvvv}wvp}}w}vvvv}}}v|vpvvvpv}}vooovvvvoovlllovovvovvoovvvoopoopoovpvvullCllluvouou=!!@!Z_!!!=!! !!!! !!!! ! ! ! !!!  ! !  !  ! !! ! !!!!!   ! ! !  !!!  =           ֏}}~}~}}~~}}~~}~~~~~~}~~~~~~~ꥡ~}}~~}}}~}~}}}}~}~}}}}}}}}}}}v}}}}}}}}}}}}}}w}}v}}}}vv}}}v}}}vv}}vvvv}}vvv}vwvvvvvv}vvvvpvvvvvvvvvvvvvuovvoovvoovvvvoooovvvovvuuvouuuuovulllllvlluou!!9!!Z_ !!;!!!!!!!!!! !! ! !!!! ! !!! !!  !  ! !  !  !  !!  !! !!!    ! !!=}  !      ֎~}~~}~~}}~}~}~~~梡ڤ~}}}}~~}}}}}}}}}}}}~}}}}}}}}v}}}}w}}}}}}}}}ww}vv}}}}}vppvvvvvvvvvv}vv}vv}vvvvvvvvvvvvv}}voppvvvouvp}}vvvvvooooooovvuollllulvllllllvvvoluvvvllluolu!!!!!Y_!!!!!!!!!!!!!!! ! !!!!! ! !   !  ! !! ! ! !  !  !!!  ! ! 9p       ֏~}}}}~~~}~~~}~~~~~~ꥢ~~}~}}~~~~}~}}}}|}}w}}}}}}}}}}}}}}}}~}}v}}}}}vv}}}w}vvv|v}}vvvpw}vv}vv|vvvov}vwvvvvv}vopvvvvoovvovvvvvvvovulovoovvpllooovvvllvoouvvooouuuollluluvu!!!!!B_!!!!!!!!!!!!! !!!!! !!!!!!!!! !! ! !! !!! !    !  ! !   !!  !!     =q             Տs}~}~~}}~}}}~~~~~~~}~~~~~~뭫ڑ}~~~}~}~~}~}}}}}}}}}}}~}~}}}}vv}}}}}}vv}vw}}}vv}}}w}}vw}}}v}}}}}}vv}}}vvvvvvvvov}vvv}}vvvvvv}vv}vv}}vplovvvvvvoolvvwvovuovolvuvtlovvvlllouvllllvullluvul{!=@=!B_!!!!!! ! ! !!!!  !   !!       !!! ! ! !  !!!!  !!!=q         ֏}}}~~~~}}~}}}~~}~~~~ꦢ摑~}}}}~}}~}}}~~}~}~~}}}}~}}}}}}}}}}}}v}}}}v}|}wv}}v}}}}vv}}}}vwvv}ww|v}vvvvvvv}vvvvvvvvvvvvv}vvvvvvvlovvvuvvovvovoouvvvlovvvvlovvvvoullvuvoloolllllouuu{!!=9!B_!!!!! !!!!! !!!!!!! !    !  ! ! ! !! !!! !! ! ! !  !!!q   !        ֠}}~~~~~~}~~}}}~~~}~~}~~~~ꥢԑ~}}~}}}}}}}}~}}}}}}}}}}}}}w}}}}}}}}}}}}}}}}v}vvv}}w}}vvvvv|}}}vvvvvvvvvv}}}vvvpppvvvpv}vvv}voooovwpovvovvvvvolovvoovpovvlllllulltlolluopulluvvvolCClllo{!!!!!Y_!!! !!!@!!! ! !!!!!!!! !! !!!!! ! !  !!  !   !    ! !!!    !!   ! =q           ֢~~}}~~}~~~}~~~~~~~~~}~~ꦦ~ࡑ~~}}~}}}~~}}}}}}}}~}}}}}}~}}}}~}~}}}}}~}}}}}}w}v}v}}v}}}vv|vv}}}vv|}vvv}vvvvvvvvvvvvvvvvvvv}vvvvvvvlovvvvvvvvvvvvvpulvoovulvvuvollllloovlovuuollouvuullllotlul{!!!!!B_!!!!!!!!!!! !!!!!!!! !!!!!  !   ! !!! !   !!    ! !  ! !    !! 9q                   ֏~~}~}~~}~}~~~~~}}~~~~~~}~~~~~~楦ڑ}~}}}~}}}}}}}}}}}}~}}}~~}}}}}}}}}}}}v}}}}}}}}}}v}}}}v}vvv}}}}vvvv}vv|}}}}wvvvvvvvv}}vvvvpvvplovvvwvvvvvovupuoouvvoopvvvvolouovvvvovvvuolCloovolllCllpoltvlCCluv=!!=!Zx!!!! !!!  !!  !!!  !!  !! !! !      ! ! !    !!!  !=q                   ֠~}~~}}~~~~}~~~~}}~~~~~}~}~ꥢ~ԡ~~}}}~~}}}}}}}}}}}}}}}}}}}}~}}}}}}}}}}}}v}}|}}w}}}}}vv}vv}}v}vv}vvwvv}vvvvvvvvvvv}}vvvovvvvvvvuvvv}voovovvolovvovvvvvvllvvvvvvuooouvvllluuvuullCClulClllllltluu!!!!!C_!!!!!!! !!!!!!! !!!!! !  !!!!!   !! !   ! ! !  !    !   !   >}            ֏}}~~~~~}}~~~~~~~~}ꦡ뚑~}~}}}}~}~~}}}~}}}~}}}}}~}}}}}}v}}}}}v}}}vv}vvvw}}}vv}}vvv|vv}}}vov}}}|vvvvv}vpvvvpoovpvv}vovvvvvpvvv}voovvlovuoovvvlloovoovvvlllltpuolllluullvvllvlltoolCCllu!=!!=Y_!!!!!! ! ! !!!!!!!   !!!!  !!  !!    ! ! !!   ! !! ! !  !!   !!  =   !          ֏}}}~~~~~}~}}~~~릣~}~~}}}~}}}}}}}}~}~}}}~}}}}}}}}}~}}}}}}}}}}}}}}v|}}}}vvvvvv}}vvv}}ppv}}vvvvvvv}}vpvvpopppp}vvpvoo}vvvvvvvvovvulvolovvvolllvuovvlolllovvllCllluuloullvvlltllClllCCv9!!9!C_!!!!!! !! !!!!!!! !!  ! !!  !!!  !  !!  !! ! !!! ! ! !! ! !  !  =                 ֏}}}~~~~~}}~~}~~~~}~~~~~~~ꥡ~}~~}~~}~}}~}~}}}}~}}}}}}}}}}v}}}}}}}}}}}}}}}vv}}}}}}vvv}}}}v}}w}}vp}}vv}}v}vvvvvov}vovv}v|vvvovvvvoovvooooovoov}ovvvvoovoovovvoluluvooouovvuvvoollluvollvuulllluulllllu=!!!!B_!!!9!9!!!!!!!!! ! ! !! !! !!!  !    !  !      !  !  ! !  ! =p                  ֟~}}}~~~~~}~~~~~~~~~}~~~~~~~~~릣~}~}}}}}}~}}~}}}~}}}}~}}}}}}}}}~~}}}}}}v}w}}~}vvv}}}}vpvvvwv}v|}vv|vvv}}}}vvv}pvvpvvvvvpvvvvvvvpvvvvvvvvvpvoovoovvvvvvvvvlvvvoovllooooouullovvvullollltvouoooullloutlCCCll{@=!$=B_!!!!!!!!!9!!!!!!!!! !!! !!!!!!!!!! !    ! !!  !   !  !!!!  ! ! !! 9q                  ֏~}~~~~~~}}~~~~~~~~~~~ꥣڑ~}~~}~~}~}}}~}}}}}}}~}}}}~}}}}}}}}}}~}}}}}}}v}}}}}v}}v}}}}}}w}vwvv|v}vvvvvpv}}}vvpv}vvvvvvvvvvv}vpvooopovvvolvvpvooooolovolovvvlooouvvllulvoltvvlulllClluoovlllllloloollC!!!!9Zx!!! !!!!!! ! !9!!!! ! ! ! !     ! ! ! !! !!!     !  =}               ֏~~~~}}}~}~}~~~~~}~~~~楡~~}~~}~}~}}}~}}~}}}}}}}}}}}}}}~}v}~}}}}}}}}w}}}|}}}}}}|}}}}}vvv}w}}}wvvvvvvvw}}vpvvvvvvvvvvvvvvvvvvlopov}}vllvvluvppvollvvvovvvolllovvlllouulovvuoullllluuuvuutlluuouuullll!!!!!C_=! ! !!!!!!!!!!!!!!!!! !!!     !!! ! !! !     !!  !    =}            ֏~~~~~~~~~~~~~~~~ꦥڑ~~~~~}}~}}~}~}~}}}}}}}}}}}}}}}}}}}}}}}}}}}Ӏ}}vw}v}}}vv}}v}}v}}vvv|vvv}}w}wvvvvv}}vv}vvvvvv}v|vpopvvvvvpvpovolvvvooluvoovuoppoooooollvvlolllollvvlloolllllllulllClullllCCClltu!!!!!B_!!!!!!! !!!! ! !! ! !! !  !  !   !!   !   ! !! ! !   ! 9q                     ֟}}~~}}~~}~~~~~ꦢ~~}~~~}~}~}}~}}}}}}}}}}}~~}}}}}}}}~}}}v}}}}}}}}}}}vv}w}}v}}vvv}}v}}}vwvvvvvvvvvppvv}vvw}}vvvvv}wvvvoovwvvovoolvollovvlloovvvolvullpvvoouvvvvvlovvlllovvlluulllCCllllCClltClClllCClu=9!!!@_!!! !!! !!!!! !!!   !!! !   !!  ! !   !!!!! ! !    !  !  !! !=q    !          ֏~~~~~}~~~~~~~~~~~~~~~~~ꥡࡑ~~~}}~}~}}}}}~~}~}}}|}}~}}}~}}}}}}}}}}}}}}}~}v}v}v}}}}}vv}}vv}}vv}}wv}}w}}wvvvv}vv}vpvvvov}vppvp}vopvvvvvvvvpovvvpv}oovvooolvvolovlouolltplolvlltlllllluolllllllllullltllllluollCClu=!!!!Y]!9!!!!!!!!!! !!! !! !!! ! !!     !   ! !!    !  !!!  =                     ֏~}}~~}~~}}~~~~~~~~~~~~~~}~~~~~ꥡ~~~~}}~}}~~}}~}}~~~~}~~}}}}}}}}}}}}}}v}}~}}}}}}}}}|v}vvvv}}}}v}}|v}}}}}}vv|vvvv}}vv}vvvvvvvvvvvvvvvvvoovvlpvvvvvvvvwvllpvvovlvvpvvvuloolloollovullllltlloulvuullllloullvtlCCCtuulCCluuy!!!!C_!!;9!!!!!!  !!!!  !!! ! !!  !  ! !! !! !   !!! !!!!! !! ! ! =}    !                    ֟~~}~~~~~~~~~~~~~~~~~~ꥡࡡ~}}}~~~~}}}}}~~}}~}}}}}}}}~}}}}}}}~}}}}}}}}}}}}}}v}}}vv}}}}}}vv}}vvvvv}}}w}vvpvv}vvvpvvvvvvvpvvvvvlo}}vvppvovpuopvvovvopploluvovoluooolltpolooollvllullllllllovlllCltlllllllltCCllllCu!=!9!B_!!!!!!! !!!!! !! !!!!  ! !!! ! !  ! !       !    =q                   ֠~~~~}}~~~~~~~~~~}릢~~}}}}~~}}}}}}}}}}}}~~}}~}}}}}}}}}}}}}}}}}}}}}vpv}}}}}v|vvvpvw|vv}vvvpop}wvvvpv}}vvvvopvvvvlovvvvvvoouvplovvvvvvopvollvollllovvuloulllovulllllllllClluuultlllllllClllllClltlCCClx!!$9!Zx!!!!!!!! ! !! !!!!!!!!!!   ! !!!!!!!! !!!  ! !! ! !   ! !! 9}      !                     ֟}~~}~~~}~~~~~~~~~~ꦢꥡ}}}}~~}}~}~}~~}}}}~~}}}}}}}}~}}}}}}}}}}}}}}|}}}|}}}v}}w}vvv}}v}vv|vvv}w}}vwvpvv|wvpvvvvvvvpvvvvvpvvpvvvvoovvvvvvplvvlouvolovvlovooovolloluoovluluoolClooltlllllllllltlCCtlllCCllClCCCCl{!!!!!B_!!!!!9!!!!!!!!!!!!!! !! ! !!!   !   !  !  ! !   !      !  =}       !!                  ֏~}}}}}~~}}~~~~~~}~~~~~~~~~~~楡ԡ~~~}}}}}~~}}}}}}~}}~}~}}~}}}}}}}|}}v}}}}}}wvvv}}}}}}}}}}|vpp}}}wv}}}v}vv}}}|}vvvvpoovvpppppvvvvov}vvvvvovoovvovvolllolllvvlloovvvvvoovoollloloollluvvooulClllllltlCClllllllCCCCCCllCCCCClC{9===!@]!!!!!!!!!!!!! ! !   ! !!! ! !!   !!! !  ! ! !!! !! !! ! !!! !=}      !                           ֏}}~~~}~}~}~~~~ꦥꥡ~}}~~~~}}}~~}}~~}~}}}}}~}}}}~}}}}~}}}}}}}}}}}}|}}}|}v|}}}|w}}}}}}}}vvv}vvv}vvvvvv}vvvvvwwwvvpvv}vovvvppvvpvoovvvvopvovvvlvvovuoovulouluooolovvlluollllltlullovlllllltllllultlCCllCCtlCCllllCAl!!!!!Z_!!!!!!!!!!!! !!!!!!! ! !! ! !! !  !!  !! !!   !  !!  ! !  ! =w                             ֏}}~~}~~~~뫫Ԣ~~~}}}}}~}}}~}}}}~~}}}}}}}}}~}~}}~}}}}~}}~}}}}}}}}}}}vvvvv}|v}}}}}}vv}}}v}}}}vv}}}vpvvvv}vpv}}}vvvvvvppvpvvovvvvvvvvolvwov}vvpvlvvvolllloooouuovwvuolouolllllllouuluvolllltlCCllCCllCllulCltutlCAClC!!!!!Z]99! !!!! !  !!!!! !!!!!!         !! !!      !!! !=q                                       ֏~~~~~~~~}~~~~ꫦ륡~~~}~~~}}}}}~~}}}}}~}~}}}}}}~}}}}}v~}}}}}}}}vv}}}}}}v|}v|v}|}}v|vvv||v}}vvv}vvvvvvv}vovvvvvvvvvvvopvpvvpovvpvolvvvlvloouopvvllvloooollpoollluvllollltulllllulClullCllClClllllllCCllCCCCClCCl==!!!C_!!!!!!!!! !!!! ! !  !!!  !! !   ! !      !   !    !!  ! !=q                              ֏}~}}~}}~~~~~~}~~~~~~~~榦֣~~~~}~~}~~}}~}}}~}~}~}}}}}}}~~}}}}}}}~}}}}|}}s}vvvvv|}}}}}vvvv|}}vv|v||vvvppvvv}}|v}}}||vvpovv|wpvvvvoppvpoooopolpvvvooopoopvvvlvvvvouvvvulllluooullulluvvlllllllltllClullllllllltllClCCCClCCCCCCCCCCC!!!!!@] !!!!!!!!!!!!!!!!!  ! !!!  !!!!!   !! !!! !   !!!!! !  !!!  =q                              ֏~~}~~~~~~~~~~~~~~ꦦ}~~}~}~~}}~}}}~}}~}}}}~}}}~v|}}}}}}}}}}}}v|}}}}v}v}}}}}}vvv}}}}vv|vvvv|}}vpv}vvvpv}vpvvvvvvv}vvvppvvpovvvov}oopvopoovpvuuooouvooopoolllvvlllllluolulllllltolllllllllllllllllCCtlCCCClCCllCCCCAClt!!!!!Y_!!!!!!!! !!!! !!! ! !  !!! !   !    ! ! ! !    !!  !! ! !=w      !                  ֏~}~}}}~}}~~}~~}~}~~릢Ԧ~~~~~~}}}}~~}~~}}~}}~}}}}}|}}}}}}}}}v}}v}~}}~}}}||v}}}}}~}}|v}vvvv}}}vvvvv}vv}vp}}}vvvv}}p}vvvvvv}vvvvvvvvvvolvvvvvvvvullollvvvllllullovuvollolollluvllClllllloollotlllltlllltCClCCClCCCCClCllulCAClluCu!!!!=C_!!!!!!!! !!!!!!!!!!!  !  ! ! !  !!! !!!   !! ! ! !!  =q     !                           ֏~~~~~~~}~~~~~ꥡ륡~}}~}}~}}}}}}}~~}}}~}}}}~}}}}}~}}}}}}}}}}}}|v}}}v|}}}v||}v}}|}v}v|||vv||vvv}vvvvvvvvvvvpvppvvpvvvpo}}lovvvovvvvvovvvlvvovooololovvoooolluulloolllllolllululllullCllCCllullCClllllCCllCCClClCCCCCCCCx!!!!9Z_!!!!!!!! !!!!!!!!!!!!! !! ! !  !     !!! !!  !   !!     =q                               Վ~~}}~~~~~~~~~~~~~릣ڦ~~~~~}}}~}~}~}~}}}}}}}}}}}~~}}}~}}~}}}}}}}vvv}v}pvv}}}}|v}}}vvv}pvpvvvppvvvvvppppvpvvvplpvpv}}ooppvovvovvvvvooouvoovvvlluvoloouvvvvuulllloouvotllutlCllllllCCCCCoulllovtltlltlCAClCCCCCACCllCC=!!!!C_!!!!!!!!! !  ! !!    ! !  !! !! !!!! !    !  =}       !                                      ֏~~~~~}}~~~~~ꫣ륢~~~~~~~}~}}~~}}}}}~~}}}}}}}}}}}}~}}}}}}}}}}}vv}}}}}}v}}}vvv|v}}vv||}}vv|}vvvvv|ppv}vvvvvpvppvvvvppvvppvvpvpopvoovvvvvovuppvlovpoollvoooopoulloloollluollolllllllltllllllllllCllCllllCClCCAltCCClCCClCCCACC=!!!!Y_!!!!!!!!!!!!!!!!! ! !!    ! ! !      !!  !        !   =}        !                                        ֠}}}}~}~~~~~}~}~~~~뫣ڡ~~~~}~~~~~~}~~~}}}~}}}~}}}}~}}}}}}}v}}}}}}}}}v}}||}}}}}}}}vvv}}v}}}v}}|vvvvv}|vvvvvvv}}|vv}}|vvvpvvvvv|vvvv}vvopvvvvpvoploooolooppooluvvovvouooululllvuouuolulloollllCllllllullvulCCClCCltCllllClCClCCCCCCCCtCCCCCC==!=$B_!!9!!! !  !!! !!!!!!! !!!!!!  !! ! !  ! !!!!!!! !  !!  ! =}                                         ֏}~~~~~~~~}~~~~ꦥ~~~~~~~}~~~~}~}~}}}~~}}~}~}~}}}}}}}}}~}}}}}}}}}}w}}}}v}}}|v}|}}}}vv|v|vv||vv|}}p|v|vvvvv}vvvvvpvvvvvvvpvppppvvpvppooppplpvppolovpoolvvvlvlllluouoololuolluluollllllllltlCltlllllCClClllCtlCCCCClClCCCAClCAClCu!!=!!Y_!!!!! !! !!!!!  ! !!!!! ! !!!  !    !  !!!!!  !   =}       !                                Տ~}}}}}}}~~~~~~~~~릦ꦡ~~~~~~}~~~}}}~~~}}}}}}}}}}~}}}}}}}}}}~}}v|}}vv}vv|}}v}}||}}}vv}}}}vv}}vvvwvvvvvppvvvvv|}vpvvppvvpoppvvpvvvolopvoplovvppvoopvvvpoovppvvlllloolollllollllvvollooolllCCClCltClCCCCCCllltCllCltoClCCCCCCCCCC!$!!@x!!!!!!!!!!!!!!!  !! ! !  ! ! ! ! !!!! !!!!!!!!  !!!  =q     !                                           ֟}~~~~~~~~~~~~~ꫦ~}~~~}~~~}~~~~~~}}}}}}}~}}}}}}}~~}}}}}}}}}}|}}}}}}}v}}|}|}}}v}|v|}}}v||}}vpv}vpv}vpvvvvvvv|vpvvvvvpppppvvpvvpoppvvpopovvvlvpoooovvovolvvvlllovolllllluulllluullltoolClllllllCCtlClClCllllllCCCCCllCllCCCClu!@!!Y_!9!!!!!!!!!!!! !!! !!!! !!!! !!  !!  !!     !  ! !=q     !                                   ֢~}~~~~~~~~~~~榦ꦡ~~~~}~~~~~}}~}}}}~~~~~}}~}}}~}}}}}|v}}|}}}}}}}}}}}~}~~}}}}vv}}}}|}vvv}v}vvv}vv|}}vvvpv}|pppppvpvpopvppvvvplopopopvvvvpvppovpooovvvlllollllvollolovlouvullolluolllllllvvlllooouuCCluoullltlCCCCllCCClultCCCCCCC!==!C]!!!!!!!!!! !! !! !!   ! !!!! ! ! !!    ! !  !q       !     !                                         ֠~~~~~}~~~~~ꦦ~~~~~~~}~}}}}}~~~}}~}}}~}}}}}}}}}}|}}}}|}}}}}}}}}v}}}}}v|}v}}v}v|}}}vvp|vv}vp|vvppvpvvvvopvvpvvvplvvpvopppvvvvvvooploppvppollplllooppllooooooloolloolloollllvlCloltlollllltlltllCCllCCCCCCllltlCCACCZl!!9!!B_!!!!!=!!!!!!!! !!!! !  ! ! !! !  !     !! !! ! !q                                                    ֏~~~}~~~}}~~~~~~뫦ড~~~~~~~~~}~~~~~~~}}}}~}}}~}~~}}}}}}}~}}}~}}}~v|vvv|vp}}}vrpvvv}}vvv}}}|pppvv}}vvvv}}}vpv}vvvv|v|}vvvvvvvvvvvvpvpppoppopopvlolopopooollvvvolloolouvolllolloulllllllCCCllClllloClCllCllCCCCClttltlClCCCCCCCCCCC!!=!!Z]!!!!99!! ! ! !! !!!!!! !! !!   !  ! !!  ! ! ! !! !=}                                                                ֏}~~~~~~~~~~~~ꫦ}~}}~~~~}~~}}}~}}}}}~~}}}}}}~~}}}}}}}}~}}}}}v|vp}|}}vvvv}}}|vp}|}|vv}vvv}|vv||v|vvpv|vvpvvvpv}vvvpvvp}}ppvppvoopvoopoppllovpoollopvvoolopplopplllolllllllluplllCllllClllllCllllClllClCCllClllCCCCCCClCAlCl!9=!!Y_!!!!!!!! ! !!!!!!! ! !!! !!  !! !  !!   ! ! !!!! !    ! !=}                                         Տ~}~~}~~~~~~~~~~~~ꥦঢ}~~~~~}}~}~}~}~~}}~~}}}~}}}}}}}}}}}~}}}}~~}}}}}}}}v}}~}}v}vvv}||vv}}|vvv|vvvvvw}}vvvvpv}vop}vvvvvppvvpppoppppvvppooovvpvvvvplpolooopoovvlloolloovoClllllovlluluoououllCClCClllCCCloCCllCCCCCllCCCACCCxC!!=!!@_!!!! !!!!!!!!!! !!!9!!! ! !   ! ! ! ! !! !   =p           !                                                   ֏}~}~~~~~~~~~~ꦣܢ~~~~~~~}~~}~~}}}}}~}~}~~}}}~}}}}}~}}}}}}}}}}}}v|}}}}w}}|vvp}vpvv|}}}}vv|}vvvpv}|vv}vov}vpvvvpv}vpvvvvvvvppoovopopvpvvppvvvoloooppovopoooooolollvllllulloololllllllllClllCClllCClltlCllCCCCCCCCClCCCCCt$==9@_!!!!!! !!!!!!!!!!! !!! !!!!!! ! !  ! ! !!!  !  !q                                             ֏}}~~~~~}~~}}~~릣~~}~}}}~}~}}}~}~}~}}}}~~}~}}~}}}}}}}}}}}}}}v}}}}p}}}}}pv}}v}}}}}vv}v|v}}vpv|v}vp|vvvv}}pv}|ppvvppvvvpvpvvvvv}pppvvvvvvvooooovvpplloollooolooooooolloollolllllolCllllllllCllCCulCClCllCCllCCCCCCACllCCC{CC!!!!!B_ !=!!!  !!! !! !   ! ! !!  ! ! !   ! ! !!    !  !  !9                                                         ֏}}~~~~~~~~~~~ꦥꥡ~~~~}}~~~}~}}}~~}~}}~}}~}~}~~}}}}}~}}}}}}}}w~}}}}}}}}|p}}|}}v}}}}vvvvv}}}}vv|v|vv}vvv|}vv}vppvvvpvvvvpvvpppv}povvvvvvvvoloppvvpollpollvplllloooovolllllolllllllllollCllllllCCuollllCClCClCCCCCCCCCCCClCl!!!!!Z]!!!!!!!! !!!! !! !!  !  !!  !!    ! ! !   !  ! !=}          !  !                                                              ֠~}}~~~}~~~~~~~뫦ݦ~~~~~}~~~}~~~~}}}}}}~~}}}}}}}}~~}}}}}}}}}}w}~}}}p}}v}}}}vvs}}}wpp|v}}p}}||v}pvvvvp|}|pppvvpv}pv|vpvvvvvvppvvo}wplvvppolopplpoooolvov}volvvolppooolovllooolllloullClllClClllllCCllCCllCCllllClCCCCllCllC{C>!!!!!C_$!!!!!!!!!!!!!  !! !!!!!! !!!!      !    !  !9p                                                            ֠~~}~~~~~}~~~~~~~~ꫦԫ~~~~~~~}}}}}}}~}}~~}}}~~}}}}~}}}}}}}}}}~}}}}p}}}wvppvp}}vvv}}}v}}}ppv|v}pppvv}vvvpvppvvvv}vpppvvvvppvppvpvpvpovllooopooollpvov}vllvpopvpooooollvoooolCloollllllllllClulllCCllClCCClCCCllCClClClCC{CC!!!!Yx!!!!!!!!!!!!! !!!!!  !!!! !!!!!!! !!     ! ! !!   ! !!!!!!   $q                                                                       ֟~}~~~~~~~~ꦦ~~~~~~~~}~~~~~~~~}}~~~~}~}}~}}}}}}}}~}}}}}}}}}}}}}}}}p}}}}}}}}}vv|}v|}vv}}}vvvvvvp}|}}vvpppvv}vpp|vpvppvpppvpoopopvpov}popvvvvpplvvolovvlloooooooloooooolllvulupllllootllllllloolCCllClCCloCllCClluCCCCC{CC!!!!!A_!!!! !!!! ! !!! !! !!!! !!! !  !! !!   !=}           !                                                                                           ֏~~~~~~~~~ꥦ~~~~~~}~~~}~~~}~}~~~}}}}~~}}}}}}}~}}}}}}}}}}}}}}vp}}}}}}}}}}}p}qv}}v}p}p}}}ppp}}}}v|vvvppv}popvvvvvppovvvvooolpvpovvvppvvvvpovvpllovoollloolollooloollllooovvllllouolllllllllolCCllllClllCllCClllCCCCyCu!!!!!Y_!! !!!!!! ! !  !!!!!!!!!!! ! ! ! !!! ! ! !!!! !!  ! !  =}                                                                                       ֠~~~}~~~~~~~~~~~~~~뫦ꦫ~~~~~~}~~~~~~}~}}}}~}~}~~}~}~~~~}}}}~}~~}}}}~~}}}}}}}}}}}}}}p}pv}}}}vv}}|v}pvp}}}}}pwvvppv|v}ppvvppvpppppopv|vvppvvvvoopvoopvolooovpopoloooooovopuooovoollollllllvlllCCllllllvolClllllCCCCllCCCllCCCCCCCCCC!=!!B_!!!!9!9!!! !!!  !  ! !!! ! !  !! !   !!   ! !=q                                                                                                 ֠~~~~~~~~~~~~~ꦦ~~~~~~~}}~~}~~~}~}}~~~~}}}}~}}}~~~}}~~}}}~}~}}}}~}}}}}}}}}~}p|}}}}}}}}}ppv}vvvp}}}}}vvv|vpv}|}vpp}pppvvoovpopvvvvovvvvvolopopplollpoppovvllloovopollolvooolllllllloolllCllllllluuollllllCllCClCCClCCCCCClCluCu=!!!!B_!!!!!!!!!!! !!! !!! !!!! !! ! !!!  !! ! ! !!  ! =w                                                                              ֏~}~}~~~}~~~~~~~~~~릡~~~~~~~~~~}~~~~~~}~~}}~}}}}}~}~~}}}}}}}}}~}}}}}}v}}v}}v}}}p}v}|wpw}}v}|}vpvv}}wpwvpvvvvvvpvvvpw}vpp}}povpvvvooppvvovvppvoppvvpvpooopoppoovoplovpooopolvvlllllopulllolllllClllClClllooCCCCllClllCCCCC{CC=!=!!B]!!!!!! !!!! !!!!!! !!!! ! !!!!  ! !!  !  !!   =s      !   !                                                                                ֟~~~~~~}~~~~~~~~~~~ꥢ֦~~~~~}~~~}~~}~~~~}}}}~}}}~}}}}~}}}}}}}}}}}}}}}}}}}w}}}~~}pvp}}qvp|}}}}p}|vpppv}}ppppv}pppvvvpvvpv}vvv}}popopvvppvopvvvvvvppvvppvvvooovopvooopooovvolopooppollllouolltlllullClllllCCClolCCCCCClllCCCCCCt>u!!!9=Y_!!!!! !!!! !!  !  ! ! !!!!!!! ! !   !!!!!!!! !  !=}                                                                                    ֏~~~~~~~~~}~~~릢~~}~~~~}}~~}}}~}}~~}}~}~}}}}}}}}}}}}}}}}Ӑ}wv}}p}}}}}}}vpv}p}}v}}}v}pv}v}vp|}vpvv|vv}pov|vvp}vppvvvpvvvvpovppvpopoopolovpppooooooooopoololloollllllopollllllllllvulCllCllollCCCClllloCCCllllCC!!!!=C_!!!!!!!!!!!!!!!!! ! !!!! ! !  !!! !! ! !!   =}                                                                                       ֎~~~~~}}~~~~~ꦢڢ~~~~~~~~~}~~}}~}~}}}}}~}~~}}}}}}}}}}}p}}}}wv}}}}}ppvvpp|}pp}}}}}vpwpvvvvvppvvvvv}vppvwvpppppv}ppv}opppppppooppolloooooovppoooooooollllloolllClovvolloolllloovolllllClllCllCCllllllCCCCCuuCz!!!!Z_!! !!!! !!!!!!! !!! ! !! !    ! !!!  !!  !   =q     !                                                                                 ֏~~~~~~~~~~~릣~~~~}~~~}~~~}~}~}~~}}~}}}}~~~}}}}}}}}}}}ә}}v}}}}}}}}}}}}vp}}}ppv}}}pv}|vvpv}vpv}vopvpppvvvvvvvpvvplpppppvvpoppopoolooopoppooopolopolllopooplollulllolllllollllllCllClClllCCllClllClCClCC=!!!!B_!!!!!!!!! ! !!!! !!!!! ! !   ! !  ! !  !9q          !  !                                                                                          ֏}~~~~~~~~~~~ꫦ릥~~~~~~~~~~~~}}}}~}}}~}~}~}~~}}}~~}}~~}}~}}}}}מ}vw}}}}}}}}}ppvpvpp}}}}}}}vv}v}}}ppvvppppppvvvvppppppvopoppovvvoopvoooooopolopoopollvvollllovvuolllloloolllllllClllllCllllCllllCCCCCllllCluC{=!!!!Y_!!!!!!!!!!    ! ! !  !!! !!  !!     !!   ! !p                                                                                                                     ֠~}~~~~~~~~~~~~~~~~릣֢~~~~~~~~~~~~~~~}~~}~~~~}}}~}}~}~}}}}}}~~}}}}}}}}}}}}}ә}vv|vp}}}wwv}v}}v}vpw}vvvvvvv}vpv}vvvvvvpvv|vppvvpoppvpvvvopvooopvopopoooopooooollpplloooolllllllllllllllClolClClllClllllCCouCCCCCCClC?{CC!!9!@x!!!!! ! !!!!! ! !!! !!!!!!!!! !!   ! !  !! !q                                                                                                          ֏~~~~~~~~~}~~~~~~ꫦ~~~~~~}~~}~~}~}~}}~}~~}}}}~}}}}}}~}~~}}ڙ}|w}}}v}~~}}}}ٞvv}w}}pp}}}}}vppp|v}}wpvv}}pvvvv}}v}vvppvvppvvvpvpvpvvppooolopppppooppoololvolllpoolloollllllCllllllCCCloolCllllllCCClCloollCCCCCCCCZC{!!!!!Bx!!!!!!!!!! !!!!!!!!!!! ! !!   !! ! ! ! ! !!! !!! !!!!!  !!=q                                                                                                               ֏~~~~~}~~~~~~~~릣ꢡ~~~~~~~}~~~~~}}}}}~~~}~~}}}}}~~}~}}}}}}}}v}}}ә}}}p}}vwp}}pvv|vpp}vvvpp|vpvvv}wvpvvoovvvpvppppvpopppvopppvppvpopooooloolovooploplloplollllolovlllllllolCllllllCllClCCllllCCllCCC{Cl=9!!!B_!!!!! !!!!! !!!  !! ! !!!!! ! !   !!!   !!!=}                                                                                             ֢~~~~~~~~~ꫢ~~~~~~~}~~~~~~~}~~~~}}}}}~~~~}}}}~~~~~}}}}}}}}wv|vvڙ}w}}ppvvw}}vvvpv}pvpppvvpppp}vpopvpopvvvpoppopvooppoovvpvvpvvopoopoloolooooolooolooopoollvoollollllollllllollllCllCCClllllCllCCoC=!$!!C_!!!!!!!!!!!!!!!! !!!! !!!! !!! ! !!!!!! !=q                                                                                                                                  ֏~~~~~~~~~~롢~}~~~~}~~~~~}~~~}~}~~~~}~~~}}~}~~}}ב}}}}}ӧv}}}}}}ٙ}ww}}vp}}vvvp}}vvvpv}vvvpvvppvvvvvppvpoovvppvoppppvvplpoopoloppoploppppllolopoolloooolCoplllllllllllolllllllllllllllCCllCCClyCu!!=!!B_!!!!!!!!!!! !!!!!!!! !! !  ! !  !     !=}                                                                                                         ֏~~~~}~~~~~ꫦ֢~~~~~~~~}}~~~~}~~}}}~}}}}~~}~~}}}}}ך}}}~ә}}}}}}}ٙ}}}pv}}}}v}}}w|vv}}}}vvpppvvvvvvppvvoovvvvooopvvpolooppoooooooooopvvpollloopolloolollovlllllllCllCllllCllolCClllllC>ClClCCul!$=!!@_!!!!!!!!!!!! !!! ! ! !! ! !! !! ! !! !!!!! ! !  =}               !                                                                                             ֎}~~~~~~~~~뫦~~~~~~~~}~~}}}}}}}~~}}}}ڥ}}}}}ә}}}}v|ߞ}vpv|}||v|vvvvvpv}vpvvp}wpppvvov}plvvvvpovpvvpovpoppoppooolooooooollooollooooplllllplllollCllClllllCColClCCllClCClllllult!!$!!B_!!!!!!!!!!!!!!!!! !!!!   ! ! !!    !  ! !!  =q                                                                                                                                   ֎}~~~~}~~~~~~~~ꦦڡ~~~~~~}}~~~}~~~}}~}}}}}~~}~~槑}}}ӧٚ}}}|v}}vvvvvvvvpp|vpv|pppv|v}vppvpvpv}vppvvvop}}vvpvvppvvvoooollloolllllooopolloopvlllllolovoollCllllClCClll?llCCCCCClllllulC!!!$!@_!!!! !!!!!!!!!!!!!!! !!!!! !! ! !  !!!!!!  !!!=q                                                                                               ֏~}~~~~~~~~~릣~~~~~~~~}~}~~}~~~}}}}}}~ב}}}}ڧ}}}}}}}v}}vvژvvpv|v|vv|vvpvvv|vvvppppvvvvppvpppvvpovvpvvpvlppovplopooovploppoolloplloooolllolllllllolllllClllllolCCllllllCCCCCCuCu=!$!!B]!!!!!! ! !!!! !!!!!!!!!!!!!!! ! !!   ! !!      ! 9q                                                                                                                                              ֏~~~~~~~~}~~~~~~~~ꦣꢦ~~~~~~}}}~~~}~~~}}}}槑}}}ә}}~}~}ppp}~~}~~}Ӑ}vv}}vw}vv|vvppvp||vvvppvppvvpvvvvpvppppovvlvvvoopoopoovvvpvvpopvvvpoloplloooollooolllllopolluollpoCloolCllollllCCCCCCC!=!!!Z_!!!! !!!! ! ! !!  !!!!!  ! ! ! ! !! !   !p                                                                                                                                                 ֏~~~~~~~~~~~뫣~~~~}~~~~~~~~~~}~~}~~ב~}}ґ}}s}~}~}}s}}~}v}}}}}}ךv}vv}}}vp|}vvvvv|vpvvvppvvvvppvpppvpvvpovvpopppppooppopoppopooopplllloolloolllooolllllllvllllllCvolllCllClllCClCClCuCu!!!!@_!!!!!!! !!!!!!!! !!  !!!! !   !!!!! !!=s                                                                                                                                            ֏}}~}~~~~~~~~~~~~~~~~}~~}~}}~}~~}ڞ}}}~}}}}}}}}}}}}}r}|v|||}}vvvv}v}}}v}}|vvpp||ppp|}vpploppvvv}olp}voopvvpooopooopoooopppollllpolllolllopolooolllllCClClllllCCCCCCClllCCllllll!!!!!Yx!!!!!!!!!!!!!!!!  ! ! !! !!! ! !!!!   !!!!! ! !  !=q                                                                                                                                       ֏~~~~~~~~~~~~~ݢ~~~~~}}~~~~~}~}}~}~}ڙ}}~~}~}}}}}}}}}}~}}}p}}}|}}}}|}|}vvv}|}vpv}|vvppvvpppppvpppp|vppvvpopvppppppvppppoopploppopoollooovollolllllollollllllllllolllllllllllCCllClCCvly!!=!@_!!!!!!!!!!!!!!!!!! !!!!!!! ! !  !! ! !!   !  !q                                                                                                                                                            ֎~~~~~~~~~~ꫦ~~~~~~~}}~~}~~~}}~~~~~}ӑ}}~ә}}~}}~~}}}}}}}}}}v}}|}}~~}}|}}|v}}}vvvvppppvppvpppvppppvvvv|vppvvpvvppvvvpppvvvvppvoooppollllooloovppllllllClllllllllllllpolCCClllllCCllCllCllC$!!=!@_!!!!!!!!!!!     !!!! !!!!!!!!!!! ! ! !  =q                                                                                                                                                                   ֏}~~~~~~~~뫦ꢢ~~~~~~~~~~}}~~~~~~}}~}~~}}}}}}}}}}}}}~}||s}}}}}}}}}}}|vvw}}|vvpvvv}vvvppvvvvvppvvpvvpppvpvpoppvppppvvlplovoopoplloooooollovoloolllllllolllllllllullllCllllllCCCCllluC{=!!!$B[!!!!!!!!!!!!!! !! !!!!!!!!!  !! !  ! ! !=q                                                                                                                                                               ֏~~~~~~~갦~~~~}~~}~~~~~}~~}}}~}}}}~ב~~}묑~}~}}}}}}|}}}}}}}}}}}}}}}}|}}rw}}||}rv}}ِwvv}w|vv~}v|p|}v|||ppvppvvvpvplvplpplpoplooplllolppopllovplopolvllvppllllooovoluuoollllollCllClllllCCllllCl$!!!=Z_!!!!!!!!!!!! !! !!!!  !! !!!!! !   !  !$q                                                                                                                                                          ֏~~~~~}뫦~~~~~~~~}~~~~}~}}}ؑ}~ٙ~}}}~}}}~}|}}}}}|}}}~}p}}|}s}}vp~}pp}}}}vv}vvvv}|ppvvvvvvvvvvoopppppvpovlvvolppplpvploooppopoooppllollpllloulllolllllllllllllllllllllllCClCllCCvl=!!!!C]!!!!!!!!!!!! !!!!!!!!!! !!!!! ! !!!!   !9q                                                                                                                                                           ֏~}}~}~~~~~~ꫫܡ~~~~~~~~~~~~~~}}}}~ӑ}~~}}~~~}~~}}}||}|||}~|vv|}}}}}p}}}p}}p|v||}}vpwvvvvvppppvv|}vpooopvpv|vlpppvvpppllvvplpvvvpollpollopvollvvppopvllllllllllllllulllllllollCCCllCClol!!$!!Z_!!!!!! !!!! !!!!!!!!!!!!!!! !! ! !!    =w                                                                                                                                                                  ֏~~~~~~~~~~~ꦣ~~~~~~~~~}}}}~~}}~~|}~~~~}}}}}}}~}}}s}p}}}r}}}pw}}||}}v||v|p}}||}v}pwvv|vvvvp|vvvpppppovvpvvlpvpppwppplpvpoppppvlollvlvvlpllllppllvvollllllllllllllllllClllllCCllllCul!!!!!B_!!!!!!!!!!!!!! !!!!!!!! !!!  !  !!  !!! !=q                                                                                                                                                                                              ֏~}~~~~~~~~~ꥣ桦~~~~~}}}~~~~}~~}}}~}Ӏ}}}}~~}}}}}}}}}rvr}}~}}|}}}}}}p}}|}rvp}}}}}|}|vv|v||}}}vvvvpppv|}ppppppv}pppopolvvvpvvpvvopvplolllpvvllplvvlllvvpollloplvllollCllllClllllllllCClClllolu{Cl$!!$!@x!!!!! !!!!!!!!!!!!!!!  !!  !  !! !  !! !! !!q                                                                                                                                                                                         ֏~~~~~~~~~릣~~~}~~~~}}}~~Ӏ~}}}}}~}~}}~}}}}}}}}}}}~~}}}~}p}}}}}}}}}v}}}}}}}|v}|||||}|v}wv}vpvpvppppvvpl}vpvoppoppppppvvplpvvloolllvvpolvlvlolooplllllllollullClllllllllllllllllllllCltC!!!!@_!!!!!!!!!!!!!!!!!!!! !  ! !!!!!  ! !  !!!!  9p                                                                                                                                                                                  ֠}~~~~}~~~~}~~~~~~~ꫢ~~~}~~~~~~~~~ӡ}}~~~~~}}~}}}}}}}}~~}~}~}~}}v}}~~}}}}}v|}}}}}p}}~}}pv|||v|v{wvpppvppv|vpp}}|}vvopolppvolplllpllppvplvpovvlllplllllllllllollllllllCllltlllllllClCCCCCCCu{lu!!!!!B_!!!!!!!!!! ! ! ! !!!! !!!!!! !   !! !   !!!=q                                                                                                                                                                                             ֠~}~~~~~~~~~~~뫦֦~~~~~~~~~~~~~~~בؑ~}}~~}}}}~}}}}}}~}}}}}}}}}}}}vr}}}}}}}}s}|}}}}vv}}}}|v||v||p}vvpv|vpvvpvpvvvvvppvolpvpvplopoppllpvplpplovvlloolllllloolllllllolllllllllllllllCCllCCCCltl!!!!!CZ!!!!!!! !!!!!!!!!!! !!!! ! !! !   !! =q                                                                                                                                                                                            ֏~~~~~}~~~~~~ꮮ~~~~~~~}}}~~}}}}}}~}}}}}}}~~}~}}~}}sp}}r}}}}p}}}}}}vrvv}}rvvp||vv}ppvpvvvpv|}vpvvvppppoppopv}vvplvvpppvvvpvpopollpvlllpolopvololltpvllloollvpllllvlllClCCllClllllllyyCu=!!!$Y_!!!!!!!!!!!!!!!!! !!! !!! !!! !!!!!!!! ! =}                                                                                                                                                                                     ֎~~~~~~~~~~~~뫫ꑢ~~~~~~~}~~}~}}}}~~}}~}~}}~}~}}}}}}}}}}}}}}}|s}}}}}}}}v}pp}}vvwwr}pv|v}}rppvvvv}vvvv}vopppppppvvvpvlvvplp|voovovovllooplpopoploppllllvolllvlllvlllltlllllCllClllllllCllC!!!!=C_ !!!!!!!!!!!!!!  ! ! !!!!!!!  ! !   ! ! =q                                                                                                                                                                                                            ֎}~~~~~~~~~~ꫢ~~~~~~}~}}ڑ}~}}~}}}}}|}~}}}}~}~}}}}}}rw}}}}}}}}}}pvv}p}v}}}p}}p}prvp}p}}}}}vv}}v|pv}ppvvp}|vvvvpppolooovppvvolvpvpppvlppvpllllvollvlpllllllllltplllllllllllllllClClllllvyl{!!!!!Z_!!!!!!!!! !!!!!!!!!!!  !  !!!!!!!!! ! !!!!q                                                                                                                                                                           ֏~~~~~~~~~~릡~~~~}~}~~Ӥ~}~}}~}~}}}}}~}}~}}}}}}}|}}}}}}}}}}}}}s}}}vrp}}}}}p}vvvvvvv}}}}}pvs}vvppvvpvpv||ppvpppppppppppvopopvlvoppvlvvpplllppplloolllllllllpllllllltlllClllClllllllCtl!!!!!CZ!!!!!!!!!! ! ! !!!!!!  !! ! ! !  !!   ! $p                                                                                                                                                                                                                  ֏~~~~~~~~~~~~ԡ~~~~~~~~~~~~~~}~}}}}}}}}}}~}}}}}}~}}}}}}}s}}~~}}}}}}}~}}}}}v}}v}}~~}}p}|v}}}pvp}}}pv}}wpp}}pv|vvvvpvvpvvvv|}vpllopppolvpppooolllolppllollllpvvolplllllupllllollCllvlllollCCC{{l{!!!!!B_!!!!!! !!!!!!! !! !!!! !   !  !!!!q                                                                                                                                                                                                         ֎~~~~~뫮~~~~~~~ښ~}}}}~}}~~}}~~}}}}}}}}~}}}}}}~}}}}}}}~}}}}}}}rp}}}}}vv}qw|q}p}}w}}ppp}p}pv}vov}vvvvvppvpvvvvplplppvppllppvvoolloopvvlllooolllpllllolllovulllllllllllCltlllClol!!!!!@_!!!!!!!!!! !!!!!!!!!!!!! ! !! !! !!9q                                                                                                                                                                                                                                     ֎~~~~~~~~ꫫݥ~~~~~~~~~~~}~~~~}~॑}~~}}}}}}}}~}}~}}}}}}}}}}}}}}|}s}}sp}}}p}}}}vv}}}p}p}}}|}ppp}wpppw}}pp}ppv}}ppvwopvolpvpopvvvvpvvpvplppvwppvlopoollolovolvplllolpplllllllllllCllClCClllClC{yC!!!!!Zx!!!!!!!!!! ! ! !!!!!!!!   !!!!!!!!  ! ! =q                                                                                                                                                                                                                      ֎~~~~~~~~~~뫣~~}~~~~~~~}}}}}}}}~~}~~~~}}~}~}}}}}|}~}}}}}|v}}}}}}pp}}}}}}}p}}}}vpv}s}}}}}}}}v}}}|}}vp}pp}vpppvp{ߘpppppoovvvppopvpppoovvvvlppvlllolllpolloppllllpolllllllllllllllClClllllltl!!!!!B_!!!!!!!!!!!!!!!!!!!!!!  !!  !!!! !!!  =q                                                                                                                                                                                                                     ֏s~~~~~~~~ꦣ~~~~~~}~~~~~~葑~}~~}}}~~}~}}}}}~~}~}}~~}r}}~~}}}}}}}}}v}}}vp}}}pv}}~}}wp}pppppp}pp|vvpppv}}p|}vvv|opvpoppovpoopoopopplpollooopvoovplllolvollllltppollllllCllovollCClllluC!!$!!B_!!!! !!! !!!!!!!!!!!! ! ! !  !  !!!!q                                                                                                                                                                                                                                 ֏~~~~~}~~~~~~ꦣڦ~~~~~~~~~~}~}~}~}}~~~}~~}}~~~}}~}}}}}}}}~}}}}}}}}|}}}pp}}rvvv}}}}}|v}wpp}w}}p}}}pppppvvv|}}v}}vvppopppplopppopvpolpllpplopovvoollloopvlvlllolluvllllCllolllllCllllll$!$!!@_!!!!!!!! ! !!!! !!! !! !    !!  !!p                                                                                                                                                                                                      ֠~~}~~~~~~~~~~~~~~~~~}}~~}~}}}}}}~}}}}}~}}}}}~~}}}~}}|}|v}|}}}}}s|}~}}}}}}}sv}}p}p}pp}}}vpppv}}p}wv}pwppvpvppppvpopooopvooopoppollovpllpopvoollvllllllllllllllllllluvlCClllllCl{o$!!!!C_!!!!!!!!! !!!!! !!!!!!!!  !  !!! !!! !q                                                                                                                                                                                                                          ֠~~~}~~~~~~롡~~}~}~葑~}}~~}}}}~}~~}}~}~}}}}}}}}}}}}}}}sp}}}p}}}}}}}~}}}p}p}}p}p}p}vp}|}vvp}}|v}}p}}vpppppvpovvooppvvplllpvvllppopooopolpppoovlllolllllllllllplllllCCCloullllu!!!!$@[!!!! !!!!!! !!!   ! !!!!!! !! !!  ! !      !!!!q                                                                                                                                                                                                                         ֏~~~~~~}~~ꫦ~~~~~~}~}}}}}}~~}~}~}~}}}|}}}}~}}}}}}}}}}|v}}}}}}}}wp}}}v}v}w}ppppvpvp}}ppwvpp}}v}vpv}ooopvppvpopolopololloollollloolloolllCllolllovllllolllllClluC!!!!!Z_!!!!!!!!!!!!! !!!! !!!!!!! !   !    !!q                                                                                                                                                                                                             ֏~}~~~~~~~~}~~~뫣~~~~~~~ڑ~~~}}}}|}}~~~~}}}w|}~}}}~}~~}}}~~}}}}}}pv}}|}}}}}}}}s}pppp}vppppppvppp}v}|v}}}}pvvppopvvvlloppplllllllpooplllllopllpolllollllopollllolCClCCllu=!!$A[! !!!!!!!!!!!!!!! !!!  ! !!!!    =p                                                                                                                                                                                                                                                         ֟~~~~~~~ꫫ墡~~~~~~}~ڙؑ}}}}~~~~~~}~}}~}}}}}}~}}}~~}}}}~}}}}}}}}}}}}}~}p}}}}}v}}}wvv|}}}}}vp}}}}|}}vpvwp}vppvvpv}|pvlovolooovploppvppollopoooooplllollollllCllCllCCllCllllyl=!!!!Z_!!!!! !!!!!!!! !!! !!! ! !    ! =q                                                                                                                                                                                                                                                      ֟~~}~~~~밮~~~~~}~맀~~~~}~}}~~}}}}|rs}}~~}}}~}|}}}}}}}~}|}}}}}}}}}}}}}}vsp}}}}}}}p}}}pv}v}}vpvv}}}}|}}}p}vpvvpplppollpoloovvvooolppoooloollllllolllllCllCllCllClullv{!=!!!C] !!!!!! !!!!!!!!!!! !!!!!!! !! ! ! ! !  =s                                                                                                                                                                                                                                                          ֠~~~~~~~~~ꦦ~~~~~~~~ؑ}}~~~}}~~}}}~}}~}}}~~}~~}}s~}~}}}}~}}}s}}}p}}}}}rw}}}}}p}r}vv}}}v}}rvp}}}v}|vpppv}pvppvpppvwvvplovvpploppllllopllloolllloollloolllolllloolllolyl!=$!Bx!!!!!!!!!!!!!!! !!!!!  !!     ! 9q                                                                                                                                                                                                                                                ֠~~~~~~~릢֢~~~~~}~륑}}~}}~~}r}~~}}~}}}}}~~}}~}~~}}}~}}}p}~}}p}p}pvr}}}}}}pv}}p}}ppvw}vv}}}}pp}}vpv}}ppvvpv}vpooopvpolopllllllllooolloovolllllloopollllloooluC{!!!!!B_!!!!!!!!!!!!$!!! ! !! !  ! ! !! !! =q                                                                                                                                                                                                                                                 ֎~~~~~~~릣~~~~}~~}}}~}~~~~}}~~}~}~~}}}|}~}~}}s|}}}}}v}}~}}}}}}}}}}pp}}p}p}}}v|pp|v}}}pvvpppwvvv}vppppvoovpoooooploopollloooooolllolllllllClolClllCul!!!@_!!!!!!!!!!!! !!!!  !  !! =}                                                                                                                                                                                                                                            ֏~~~~~~~~~~~릣ꫣ~~~ڤ~}怀}}~~~~~}}}}~~}~}}}}~~}}}}}}}}}}r}}}}~}v||p}}}}}|}||pv}}}pppppv}}}vpppopppvppvpppppv{polooollllpvvooololoollllllllCCllClolCCClul{!!!@_!! !!! ! !!!!!!!!!!!!     ! !=q                                                                                                                                                                                                                                                          ֏~~~~~~~~~~~~~~}~~~~~~}~}~}~}~~~}}}~}|}~}}sr}}}}}}}}}|}r}}}}}}}rv}}v|}}}}pw}}}}v}}}pvpp|}|}v}|v|pv}vppvvvvvvwoovopplloololloolllloplllllllllllllllCCyC!!!!!B_!9!!!!!!!!! !! !!!  ! ! ! ! !!q                                                                                                                                                                                                                                          ֏~~~~~~~~~~~~~~~~~~~~~ء}~}}~~}~}}}}~}}~}}}}}r}}}}}v|}r}}rpvr}pv}~}|s}}}}|vrppvv}}r}}vvrp}}}}}pvv|v}}}}}v}||vpppvv}pwppovooplllollllllopvolllllllCllovolCul!!==9C_!!!!!!!!!!!!!!! !!!!! !!!  ! !!! !  ! ! !!!!!  ! !!  ! =}                                                                                                                                                                                                                                                                    ֠~~~~~~~ꦦݣ~~륑}~}~~}~~~}~}}~~}~}}~}}}}}}}}}~}}}|}}}~}}}}}p}}}}}pv}}}}rv|}}}rv|}|}v|ppp|vp|vp}p}vpv}vpv}vwovoollppllllpplllollllllovllllllllll{u!!!!!BZ!!!!!!!! !!! ! !! ! ! ! !   !q                                                                                                                                                                                                                                                               ֏~}}}~}}~~~~~~~~~~~ꦣ~~~}~}~ӑ~}~~}~~}~~~}}~~}}~~}}~}~~}}}}vpvrvr}}}r}}}}}r}|v}}}pp}}v}}}}|v|}}}|pp|||ppp|vp}}}v}vvvollllllloooploolClloopplopolCCCl{C$!!!!@_!!!!! !! !!! !!! !!! ! !  ! ! ! !!q                                                                                                                                                                                                                                                                                           ֏~~}ꫦ॑~ڤ~~~~~}~~~}~~}~}~~~~}}}}~}}}}}}}}}s}s}}}}|}}}}}}}v}}|}}}|p|}}v|}}p}|vvp}|}}p}ppv|vvppv||pvpp|vvovllopoolllloplCoplllClolllllll{u!!!!!B]!!!!!!!!! !! !!!!!    !!  !  !q                                                                                                                                                                                                                                                                   ֏~~~~}~~~~~~~~뫦~~뚀~}}}}}}}~}~~~}}}}~~~~||}}s}}}}}|}~|}~~~~}}pr}r}||}}}~}}}|pp}}ppvrppppp|}pp|ppp|}}p}}}plpppplpvpvvvolllllllooolllllClllCCu!!!B_!!!!! !!! !! ! ! ! !! !!!   !   p                                                                                                                                                                                                                                                                           ֏~~~~~~~~ꮦ楡~ԑ~~~~|~~~|}~}~}}~~~~|}}~~~}|}}}}}}}~}|}s}}}}}}}}}}s|}||p}}s}}}}pp}|pprv}}p|}}ppp|v}vpp}rppvvwpppooolllloolllllllllClolllu{u!!!!$Y_!!!!!!!!!!!!! !! !!  ! !! !  ! !q                                                                                                                                                                                                                                                                               ֏}~~~~~~~~~ꡡ~~~~~~}}|}~}}~~}}}||~}}|s}~}~~}}}||}}~~~}pv}~}}}}}}}}||}}}ppv}}}}}}v|}p}}}|pppv|}p}}}|pppppp|}vvpvollllovplClClllllllllll!==!!CZ !!! !! ! !!!!!!!!!!!!!! !  !!!   !! !!!!! ! =}                                                                                                                                                                                                                                                                                     ֏~~~~~~~ꮮ~ڥ~~~~~~}~}~~~~~~~}}~}}~}}}~~~}|}}~~}}}~}|}}}r}~}s}}}r}}}}}v|}}}}v}}rvps}p}v|vp||v|vv|}rpvvvvpvp|pvppvlllolllllllolllllluu!=!B_!!!!!!! !!!!!!!!!!   !  !9q                                                                                                                                                                                                                                                                             ֎~~~}}~~~밮~ݥ~~~~~~~}~}|}}~~~~}}}}}}}~}}s}}~}s}}~~}p}}}}p}|p}}}rp}~~}rppv|}}}vvv|vpp}}}|vpppppvrp|}|vv}plpolllollC?llllllllu!!=!!@Z!!!!!!!!!!!!!!!!!!!!  !  !!! ! p                                                                                                                                                                                                                                                                                      ֎~~~~~~~ꫦڡڡ륑~~~~~~~~~}~}~~~~~|}~}~~}}}}}~~}}}}}~}}}}}}}}}}}}}p}~}}}}}p}}}}|}}p}}}p}r}p}p|pp|}pp|pv}p}vppppvpwppooolllllllllll{{!!!!B_!!!! !! !!!!  !!!!! !  !  !! =q                                                                                                                                                                                                                                                                          ֏~}~~~~~~~~~~~~~ꥣ~~ӑ~~}~~}~~~~}}}}}}~}}}~~}}}}||p}||}r}|}~}~}}}}pp}r}pv|pppppv}p|p}}}vpv||vvvpvppppppv|pppppvpp|ppvuvuloooooll{!!!C[!! !!!!! !!!!! !!!!!!!!  !!!    }                                                                                                                                                                                                                                                                                   ֏~~~}~~ꫦꡡڡ~~~~~~~~~~~~~}~~~~~~}~}~}~r}~~}}}}~~||}}}~}}}}}}}}}}}p}}}p}}}p}}}pr}}vv}}}}pp}}}|prvvppp}pvpppppvpvvvpvvllllllll!!!!!C]!!!!!!! !! !!  ! ! !    !q                                                                                                                                                                                                                                                                          ֎}}~}}~~}~~~~~~~~ԡ륏~~~~~~~~}}}~~}ӡ}}}~}~}~~}r~}}}}}}}}}}~~}}}~~}}wr}}p}~}}}~}}~~|pp}}p|r}v|v|}|pppp}|pp}}}~}}}vpp||}vpv}vlullllCl{!===!@_!!!!!!!!! !!!!!!!!!! !!!!!!!  !   !!!   ! !   9q                                                                                                                                                                                                                                                                      ֏~~~~~~~~ꫦԡڑ~~~}}~~ӑ~~~~~~~~~~~~}}}}~~}|~~}~}~}}}}}}}}}r}}}}}}r}}}p}~}||}|pp}}pp}}pvpp|p|||vp}pp||w}vppppppvpvppylll̘$!!!!B] !!! !!!!!  !! !! !!! ! !! ! !=s                                                                                                                                                                                                                                                                                    ֟~}~~~}~~~~~~~~릣ꡑ륡륡}~~~~~~~~~}~~~}}}~~}}}}}}~}}~~}~~~}s}}s}}}r}}}vrppv}}vv}}pp}vp}}}|s}}v}}|vrv}}}}vp}}}ppp|vppp}}vppp}vpp螘!!!!!C_!!!!!! !!!!!!!!  !  ! !! !!!   $p                                                                                                                                                                                                                                                                                 ֠~~~~~~~~~~~ꫦԡԑ~~~~~~~~}~~~}~~~~~~~}~}}}}}}}}~}~}}}}}}~}}}}}}}}|p}}rv}}}rw}|}rv}p}}}}}}}rvv|}}v||p}}ppvp}}pppp|}pvpvvwvpv!!!!B_!!!!!! !! !!!!!!!!!!!    q                                                                                                                                                                                                                                                                                 ֢}~~~~~~~~~~릢椏ॡ}~~~~~~~}}~}}~~~}}}~}r|}s}~~}}}}}}|}~~}}}~}}~~}|}}v}}}~~}}}|}|||||v}}|||}pv|}}|p|pp}}}}pp}v}}|vv}pp!!!CZ!!!!!!!!!!!!   !!  !!!!  !!!!   =p                                                                                                                                                                                                                                                                         ֠~~~~~~~~ꫣڡԡӑ~~~~~~~~~~~~}}~}~}}}}~~}}}}}}}}}}}~}}~~}}}s}}}}}}|}}r}}}}}}}}}||v}}|}}vp}}|vv}}}pv}|p|}}}vpppp||vvwpp!=!@_!!!!!!! !!! !!!!  !!    =q                                                                                                                                                                                                                                                                            ֏~~~~~~~~~~~~~륦~~~~~~~~~}~~}}~~}}~}}}}~}~~}~}~~~}}s}~}}r}}}}|ps}r}}|}}}vv}~}||}|}|v||v||vvppr}pp|rvvrvvvvppv|vp|ppppppppp}wpp!!$!B[!!!!!!!!! !!!!!!!!! !! !!!=}                                                                                                                                                                                                                                                                         ֏}}~~~~~~ꫦꡑݢ~~~~~~~~~}~}~}}}}~~}}~~}}~}~~~~|}}}}}}~}}|}|}}}}}}}}pr}}}~}}}}|}}|vpvp}rpvvvpp}}p}pp}|v|v}}p}|ppppppvv||wpp{!!!!@_!!!!!!! !!!!!!!!         =q                                                                                                                                                                                                                                                                                ڟ~~~~~~~~~ꦦݦ~~~~~~~~~~~~~~}}~~}}|s}}}}~~~~~~~}~~~}}}}}~~}}~}}ppvvr}|s}}||}}}}vr}v}}}}v||pvvr}ppppppppp}}|pppp}pv}!!!!C[! !!!!!!!!!! !!! !!!       q                                                                                                                                                                                                                                                             ֠~~~}~~ꦦ~ڥ륢~~~~~~~~~~~~葏~~}~~}}~}~}|}}}~}}~}~~~~~~~}}}}}~}}}}~}p|}rvp}}}}s||}p}}|pp}}}}rvvvvrvvpp}|pppv|p}ppvpvwpvp$!!!YZ!!!!!!!!! !!!!! !    !  9q                                                                                                                                                                                                                                                                   ֎}~~~}~~~~~~}~~~뫣ԭ~~~~~~~~~~~}~~}}}}~}}~}}~}}~}}~~}}}}}}}}}}}~}}}|}r}}}}}p}}}}}}}pv}}}|}p}}vp}|vpv|r}v|vp|pp}vp}}|pppvppp}ppp!!!!!C_!!!!!!!!!!!!!!! !!!!!! !  =                                                                                                                                                                                                                                                                       ֎s~}~~~~~ꫣԡ~~~~~~~~~~}}}~~}}~~}}~~}~}}}}}}~}s|}~}}}}}}}|}|}}}}}}}}}}}}|}|v}}v|vp|pp||||}|}}p|pv}pppp}}|vppp|vppwpop!!!$C_!!!!!!! !!!! !!!!!!!!!!!   !   =}                                                                                                                                                                                                                                                                    ֏~~}~~~}~~~~~~~~릢ڥ~~~~~~}~~~~}~}}~~~~~~}~~~}~s}}~}~}~~~~}}~|}~~}vr}}~}}|}}}}vr}}p}}}v|||}|v}}}}|vv}|p|v|pv|}|ppp}|v|pppppppvvv}ppp!!!@Z!!!$!! !! !!!!!!  ! !!   !  q                            $[=                                                                                                                                                                                                      @                            ֟~~~~}~~~}~~}~~~ꫣڥ~~~~~}~~~~~}~~~~}~~~}}}}}}}~}}}~~}}}}s}~|v}}}}~~}|}}rv|}rv}|r|r|pppr|}r}}}}rv}}vp}}}|vpp|vppppvppppppv|wppp!!!!@_!!!!!!!!! !!! !!!!!!  q                        $̖!                                                                                                                                                                                                    !@_Y                           ֎}~~~}~~~~~릦ԡ~~~}~~~}}~~~}}}}}~}}}~}}~~}~~}}}}}~}}}}~}r~}}}}}}v|}|}}}}}}}}}}}}}|}}}}}}pvvp}}ppv}pv|pv|ppvvv}}pvvppp|wvvv!!$!@[!!!!!!!!!!!!!!!! !     =q                             !Z                                                                                                                                                                                                 !ZZ                           ֏~~}~~뫮֬~~~~~~}}}}}}~}}}~~~}}}~}}~~}~~}}}~}~}}}~}}}~}r}}}r}}s|}~}s|v}}}}}}}}}}}}}pp}vp}vprv}}}v}|pp}}||vpppppv|}v|v!!!!BZ!!!!!! !!!!! !!!!!!!!!  !  $q                        B_!                                                                                                                                                                                                  @@!                        ֏~~~~~~~~~~~~~~~ꦦ~~}~~~~~}}~~~}~}}}}~~}}~s}}}||~}}}}~}}}}}}}}}|s}}}}s}}}}}p}~}||vv}vrp}}vvr}|ppv|p|}|pv}|pp|||pvvpv}pp{|pp!!!!C]!!!!!!!!!!!!!! !!!!  !! !q                           !!                                                                                                                                                                                                                                             ֏}}~~}~~}~~~~~~~~~~~~ꦣ~~~~~~~~~~~}}~~~~~~~}}~~~}~~~}}|}}|}}|}}~}}}~|}~}}r}}}}}}}}}}}}}}}}}|||pppp}pv|}pppv|p|vpp}}vpv|ppprvp}~|pvvvp!$$!Zx!!$$!!!!$!!!! !!!! !!!! =q                                                                                                                                                                                                                                                     ֏~~~~~~~~~~~~~~~~}~~~~~~~~}~~}~}}}~~}}}}~}}}~~~~}}~~}|}~}v}}}}}}}p}}}}|}r}}vv||s}}}}}}||p}v}}||pv|}ppv|rvpvp}pvppp}vo}vp!=!!B_!!!!!! !! !!!!!! !!$q                                                                                                                                                                                                                                                                   ֏~~~~~~~~~ꫢ}~~}~~}~~}~~~~}~}|}~~}}|}~~}~}~}|}~}r|}}}~~}}|}}v}v}|pprv}}}}}}}}vv||}}}}vv|}}vp}vpppp|vvpvpp}|pvpp!!!!@Z! !!!!!!!!!!!!q                                                                                                                                                                                                                                              ֎}~}~~~~릢~~~~}~}~~~~~~}~}~~~}~~~}}~~~}~~}~}r}}}~~}}}}}}}}}}|}~}}~}}r|}|}}}|vv}}}}||v}|vvv||rpvvv}pppp|}|vvpvvpppvppppp$!!!@_!!!!!!!!!!!!! !! !! !9q                                                                                                                                                                                                                                                  ֏}~~~~~~~~ꦦ~~~~~}~~~~~~}~~~~}}}~}}~}~~~}}~}~~}s}}}~~}}}~s|}|p}}}}~}~}}|}s|}}}v}rv|||vpp|}rvrppvvpprvvppv}}|pp|}rvoppppoop!!!Y_!!!!!!!!!!!!!!!! !!!!!!!!!!s                                                                                                                                                                                                                                        ֏~~~~~~~~~~뫣~~~~~~~~~}}~~~}~~~~}~~~}~}}}~}~}}}}}}}}s}}}}}~~}|~}}s|}|}}}}}}}vr}}}|v|vr}|v}}}}|vv|vp||ppv|v}vpp|p|ppvpppppw$!!!@x !!!!!!!!!!!!! !     !p                                                                                                                                                                                                                                           ֟}~~}~}~~~~ꦢ~~~~~~~~~~~~~}}~~~~~~~~}~~}}}}}}}}~~}}}|}}}}}~|}}rv}}}}r}}~~}}}}}}pppp}}p}}}}}p|p|}|vvpp}v|}v|}}pppp}ppppvv$!!!@_! !!!!!!!!!!!! !!!!$q                                                                                                                                                                                                                                              ֏~}~~~~~뫦~~~~~~~~~}~~~~}~}~}~~~}}}~~~~}~}}}}}}}~}}}|}~}p}}}p}~|}}|}}}p|}}v}}}rp}}vvrv}}v||vr}p}pvrp||vpp|ppv|ppvpvpp!!!@Z!!!!!!!!! !!!!!!!!!   9q                                                                                                                                                                                                                                                                     ֏~~}}~~~~~~~~~~~~~~~~~}}}}~~~}}~~}}}}}~}~~~}}~}}~~~}~}}~}~}}s}}||}~}|}}}}}p|||vp|vr}}~}}}}ppv}}vv}|pv}}|vpvvppppvp|}}pv}}vvp}!!!@_!!!!!!!!!!!!!!!!!!      !!=q                                                                                                                                                                                                                                                          ֟~~~~~~~~릣~~~~~~~~~~~~}~}~}}~}~~}~}~~}}~~}}}}}}|}}~}}}}}}}s}~}~}p}~}|}v||s}|}}|}vr}}|v}}|vr}p}vp||v|v|p}|pvrpvppppp}vpvpp!=!@Z!!!!!!!!! ! !! !! $q                                                                                                                                                                                                                                                      ֠~~~~~}~~~~~~~~~~~~ꫢ~~~~}~~~~~~~}}}~~~}}}}~~}}~}}}}|}r}}}}rv}}}}}}}~}}}}}}}rvv}}}v}}vv|}}}v}}}vpv}pp||pp|}pvvvvvpp}ppppppprvpp!!$!B]!!! !!!!!!!! !! !  ! !!  =}                                                                                                                                                                                                                      ֏~}~~~~~~~~ꦣ~~~~~~~~~~~}~}~~}~~~~}~~~}~}~}~~}|}}}}}}~}|}~}}}}}~|}}|s}}}}r}}}rp}}}}|}|r}vr}|p}p}}ppv|v|vrp}ppp}vpppp|pv}pp!!!!@Z!!! !!!!!! ! !  !=s                                                                                                                                                                                                                     ֏~~}~~~~~~~~~ꦦ~~~~~~~~~~~~~~}~~~}}~~}~~~~~~}}}~}}|r}|}}}}~~}|}}}s}v|p}}p}}}p}}|v}rvvvp|vppv}|v}}}pp||v|}}}}pppp}pp}vvvvpwvp{!$!!B_!!!!!!!! !! !!!!!!!! =}                                                                                                                                                                                                                            ֏~~~~~~~~~~~~~~뫦~~~~}~~~~~~}~~~~~}~}}~~~~}}}}~}~~~}}}}}}}~~}}}v}~}||s}}}}}}}}}vv|p}}rv|v|}vp}}rv|}|pv|pp|v|}v|vvvvpvvpppppvpvw!!!!!@Z!!!!!!!!  !  !=q                                                                                                                                                                                                                          ֏~~}}~~}~~ꮦ~~~~~}~~}~~~~~~~}~}}~}}}}}~}~~~~}}~~}~~~}~~}~~}r|}}}}||}}~}}}ppr}}}}}}}s}}r}vvvpvvv||ppp|ppvv}p|p}vrpvppppvpp!!!@_!!!!!!!!!!!! !!!q                                                                                                                                                                                                                     ֏~~~~~~~~~릣~~~~~~~~~~}~~}~}ӡ}~~~}}~~}}~~~~~~}}}}}}}}~}}}}}}s}}}}}}p}~}v}}}pp}}p}}}|v}}}}rpv||||vvppp|p|pp}v}|ppvvvrpppvppw!!!!CZ!!!!!!!!!!!! =q                                                                                                                                                                                                                               ֏~~~~~~~~~~~~ꫣ~~~~~~~~~}}~}}~~~ӡ}~~~~~~}~~}~~}}~}}|}}r~~}v|}s}}}~}~s}}}}}vr}~}|}}}vv}p|p|}}}pp}}}}|}}vvv|v|p|}}p|p|vv|vvppvvov!!!!@Z!!!!! !!!!!! !  !! !!! =q                                                                                                                                                                                                              ֏}}~~~~~~~~~~~~~~~~~~~~~~}ڑ~}~~}~~}}}}~~~}}~}}}}}}~~}}}v}}}}}}}r}}|}}p|}}v|}}r}|v|}pv|||p}}||vvr}|v}v|pp}|vppv}|ppppovpv!!!BZ!!!!! !!!!!!!!! !=q                                                                                                                                                                                                                    ֏~~~~~~~~~~~ꫦ~~~~~~~}~~~~~}}}~~ڑ~}}~}~}s~~}}}~}}~~~~~~|}s}~}~|r}}}}}}}p|}rvrv}}vvr|vpppr}}vv|v|||pppp}v}vpvpp}}vpppop|ppppv}vpw!!!!@_!!!!!! !!!!!! !   =q                                                                                                                                                                          ֏~~~~~~~~~~릦~~~~~~~~~~~~~}}~~~}~}~}~}}~~}}}}}}}~}}~}}}|}~}}s}}}}v}~}p}}}s}p||s}}p}p|p}}}vp|}p|vp|pvvr}v|p|pv||ppppp|vpp|vvppv!!!!@Z!!!! !!!!! =q                                                                                                                                                    ֠~~}~~~}~~~~~~~~~ꦦ~~~~~~~~~~~~~}~~}~}~~~~}}}}}}}~~~}}~~}}}}|}}}}}}p}}~}}~}}}}p}|}}s|}}}}~~}}}vv}}||}}|vppp|v|pp|vvpppvpp|vppplv!!@_ !!! !!!!!! !!    !q                                                                                                                                                                      ֠~~~~~~~~~}~~릫~~~~}~~~}~~}~~~}~~}~~}~~}}~~|}~~~~s}}~}|~}s}}}}~}r}}}}}}}}}||p}}}}}v}}}}}}r}vrv}}||}}|v|pp}ppv|pvvppvpprppvwvop!$!@Z!!!!! !!!! ! !!q                                                                                                                                                                      ֟~}}~~~~~~~~~~~~~ꫣ~~~~~}~~~~~~~~~}}~~~~~~~~~~}}}}~~~}}~~}}}|}s}}s}~~}}r}}}}~}}p}}}vv}}|}}~}p}prv}}p}v}pp}}vpp}|v|vvppppvv}rv||vppppv|}pu!$!!Z[!!!!!!!!! !   ! !=}                                                                                                                                                                                             ֏~~~~~~~}~~~~~~릢~~~~~~~~~~~~~}~~~~~~~~}~~}~~}~~~}}}~~}~}}}}}}~}}}}}|}}}}}}||}}}rp}|s}~}}||}vr}}|v}||pv||vvv|}vvppp|p|ppvpv}pppvppp}vv!!!!CZ!!!!!!!!! ! ! =s                                                                                                                                                              ֏~~~~ꦢ~~~~~~~~~~~~~}~~}~}}}~~}}}~~~}}}~}~}}r|}~}}}}}s||}v}}}s}r||}}}|}}|p}}ppp}|pvv}p|}||rvpv|}}p}|}}vpppppv|pppvvvvo!!!B_!!!! !!!! ! !q                                                                                                                                                                      ֏~~~~~~~~~~~릢~~~~~~~~~~~}}}~~}}~~}}}~~~~}~}}}}}}}}~~}}}}}}r}|s}}}}|||}}}}}}}v|}}}v||vr}}|v}}pvr}pv|||v|pv}pppvppvvppp}vp!!!!@[!! !!! !!!!  !! 7q                                                                                                                                                                             ֠~~~~~~}~~~~~~~~~~~~~~ꦢ~~~~~~~~~~~~~}}~~~~~}}~}~}~}}}}~}}}}|}}}}}~~~~}|}}}|}}~}}}}}}v|vvrv|p}}}}}}}v|ppppv|pp}pppvrv}ppp|vv}ppppvpop}wo!!!C]!!!!!!!!!!!  !!!  !9q                                                                                                                          ֠~}~~~~~~~~}~~~}~~~ꦣ~~~~~~~~~~~~~~~~~~~~}~~}~~}}}~~}}~}}}~}}}}}}}~}}}}}}}~}}}}}}r}}}pp}}v}}}}}}|}wvv}|vpvvvv|ppvpvppv|v}{!!!@_!!!!!!!!!!!!!!! !!  =s                                                                                                                                     ֏}~~~~~~~~~ꥢ~~~~~}~~~~~~~}~~~~~}}~~ڑ}}~}}}~}}}}}~~~}}}~~~}}}|}}}v}~}}}}sv}}|}}}}|}~}|ppp}}vvwww!!!!Bx!!!!!!! !!!!  =s                                                                                                                                                   ֏~~~}~~릢~~~~~~~~}}~~~}~~摑~}|}~}}}}}}}}}}}}~}}}}$!!!!@Z!! !!!  !! =s                                                                                                                                             ֏~~~~~~~~~~~~~ꦦ~~~~~}~~}~~~~~}}~~~}}}~$!!!C_!!!!!!!!!!!! !!!     !!q                                                                                                                                                     ֏~~~~~~~~~~~~~~릣~~~~}~~~}~}~~~~}}!!!!!@]!!!!!!! !!!! !!!=q                                                                                                                            ֢}}~~~}}~~~}~~~~~~ꫦ~~~~~~~~~~~}~~}~~}~~}~~}}}~!!!BZ!!!!!!! ! ! ! !9s                                                                                                                                ֠~~~~~~}~~~~}~~~~~~ꦣ~~~}~~~~~~~~~~}~~~~}}~~~}~!!!!CZ!!!!!!!!!!     =q                                                                                                                             ֏}~~~~~~~~~~~~~~~륡~~~~~~~~~~~~~~~~~}}}}~~~~}}}}~~~}}~}}}}}}}}~}}~}}}}}~}}r}}}}}}$! @]!!!!!!! !!  !!   =s                                                                                             ֟~~~~~~~~~~~~~~~~~릡~~~~~~~~~~}}~}}~~~}}s}}~}~~}}}}r}~}}~}}~~}}}}~}}}}p}}|}!!!!@Z!!!!!!!!!!! !!!!  !=}                                                                             ֏~~~}~~~~~~~~~~~ꢡ~~~~~~~~~~~}~~}}~}~~~~~~~~~}}}}}~~}~}}}}|}~}~~}|}}}}}}|}}}pp}|}} !!!@Z!!!!!! !! !! !!  $q                                                                                      ֏}}~~~~}~~}~~~~~ꥢ~~~~~~~~~}~~}~~}~~~~~}~~~~~}}~}~}~~}}}~~}|}}}}~|s}}}~}r}}}}}}}r}}!@Z!!!! !!!!!! !!   =s                                                                                         ֟}~~~~~~}~~}~~~~뫦~~~~~~~~~~~}~~~}~~~~}}~~}~~~}~}}~}}~}~~}}}~}s}}}}s|}}~}}}}}}}}~}}~~!!!!!@Z!!!!!! !!!! !!   !q                                                                                                ֏~~~~~~~~~~~~~}릢~~~}~~~~~~}~~~~}~}}~~~~}~}~~}}}}}}~~~}}~}|}}}}}}}~}}||}}}}}}~}}~!!@Z !!!!!!!!  !!! q                                                                                                ֏}}~}~~~~~~~~~~~~ꦢ~~~~~~~~~~~~}~}}~~}~~}}~~}}}~~|}}~~~}}}~~}}}}}}}}}}}}}}|}}}|}!!!@[!!!!!!!! !   !s                                                                                                   ֏}~~~}~~}~~~}~~~~}~ꦢ~~~~~~~~~~~~~~}}~}}~~~}}}}}}}~~}}}~}}~}}}~~}}}}}}p}~}r}}vr}}}}}$!!!@_$!!!!!! !!!  !=s                                                                                ֏~~~~~~~~~~~~~~}~~~~ꥣ~~~~~~~~}}~~~}~~~~}~~}}~~~}}~}~~~}}}~~}}}~}}}~~}|}}}}}}}}}rvv!!! @Z!!!!!! ! !!!  ! p                                                                                         ֏~~~~~~~~~~~~~}~륢~~~~}~~~}~~~~~}~}~~}~}}}}~}}}}~}}~}}~}}p}~}r}}~}}r}}}}}}}|p}}!!!@Y! !!!!!!!!!    9q                                                       ֏~}}~~~~~~}~~~~~~~~~~~~~~~~}}~~}}~~}}~~~}~}}~~~~}~}~}}~}}}}}}}}p}}}p}r}w}~|||}x!=!Z!!!!!!!!! !!! ! q                                                                                                                     ֏}}~~~}}~~~~~}~~~~~~~~~~~~~~~~~~~}~~~~~}}}}}~~}}~}}}~~}~~~}~~}}}~~}s}|}}}r}}}}|r}}}|s}|_!!!!Z!!!!!!!  !!!!!     q                                                                                                                  ֎~~~~~~~}~~~~~~~~~~~~~~~~~~~~~~~~~~}~~~~~}}~~}~~}~}}~~}~~}}}}~~}}}}~~}}}r}~}|}~}}|v}}}}}pB!!!!x!!!!! !! !!! ! !!q                                                                                                   ֎~}~}}}~~~}~~~~~~~~~~~~~ԣ~~~~~~~~~~~~~~}~~}}~~~~~}}~}}}~}}~~}~~~}|}}~~~~}}}}}}}}~}}}~~}vr}}s}}p!!!!!!!!!!!!!! !!!  =q                                                                                                                  ֏s}~~~~~~~}~~}~~ݫ~~~~~~~~~~~~~}~~}~}}}~~~}}}~~~~}}}}}}s}}}}}}}}r}}}s}~}}}}}}}v}}}}}}!!!!!!!!!!!! !!  !!! =q                                                                                                                    ֏}}}}~~~~}~~~~~~ꦦ~~~~~~~~~}~~}~~~}~~}~~}}}}}}~~~~}}}~}}}}}}r}}~~}}s}}}~}r}}|}~}pp}}~}}!!!!@!!!!!!!! !!!!   !q                                                                                                                         ֏~~~~~~~~~}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}}~}~}}~~}}}~~}~}}}~p}}}~~}}}}}|}~}}}s}}|r}|}}s|Z!!!!C!!!! !!  !!!!! !q                                                                                                        ֏~~}~~~~}}}}~~~~~~~~~}~~~~}~~~~~~~~ԡ~~~~~}~~}~}~~}~~~}}}}~~~~}~~~~}}}~}~}}~}}}}}}}}}~}|}}~~}}}s}}}}}}}v|!!!!xY!!!!!!!!!!! =q                                                                                               ֠~}}~~~~~~~}~~~~~~~~~~ݢ~~~~}~~~~~~~~~~~~~~~~~}~}~~~}}~~}~~}}~~}~|}}}}}~}}r}}}}|v}}}}}}}}|p!!!!!!!!!!!!!!!  !q                                                                                                            ֢}}}~~~~~~}}~~~~~~~~~~}~~~~~}~}~~~~~~}~~~}}}}~~~~}}~}}}sp}}~}}||p}r}}}}}wrvr}}_$!!!@!!!!!!! !!!!!!!! !! ! q                                                                                                          ֟~~~~~~~~~~}~~~~~~ڢ~~~~~~~~~~~~~~~~~}~~~~~~}~}~}}~}~}~}}}~}}}~}}|}}}~~}}}}}}}}||}}r}}}}}=!!!!Y[!!!!!!!!!! !!=}                                                                                                           ֏}~}}}~~}~~}~~~~}~~~~~~~~~~~~~~}~~~~~}}}}}~}}~}~~}~~}}~}}~~}s}~}s}}}~}~~~~}}}r}}p}}s|rp}}||}}}}|v}Z!!!!!!!!!!!!!!!!!    =s                                                                                                     ֏~~~~~~~~~~}~~~~}~~~~~~~ڦ~~~~~~~~}~~~~~}~~~}~}}~~}~~}}~}~}~}~}}}}~}}}~}~~|}}}}}}}}}}}sv}~}}}v}r!!!$!@!!!!!!!!! !!!!=q                                                                                                                  ֏~~~~~}}~~}~~~~~~~~~ܦ~~~~~~~~}~}~~}~~}~}s}~~}}~~}}}}}}}s}}||~}r}~}}}|~~~|p}}}~}}}pp}~~}}}}Z !!= !!!! !!!! !!  !!p                                                                                                                                                                                             ֏~~}~~~~~}}~~~~~~~~~~~~~~~~~~~~}~~~~~}}}~}~~}}~~}}~~}}}~~|}s}}|}}}}}}}}}}}}~}}}}}}p}}}}p}}!!!!!@9 !!!!!!!!!!! !  =s                                                                                                                                                                                   Տ~}}~}~~~~~}}~~}~~~~~~~~~~~~}~~~~~~~~뫣~~~~~~~~}~~~~~~~}}}}~~~~}}}}~}~~~}~}}~}~}}}|}}}}rp}}}~}}}}}v}}pp}||}}!!!!! !! !!!!!! !!   ! !  =s                                                                                                                                                                   ֏~~~~~~~}~~}~~~~~~~~~~~~~~~~~~~~ݦ~~~~~~~~~~~~~}~}~~~}~~~}~~~~}}}~~~~}}}}}}~~}~}r}}}~}}}}~}}}|}}rv}}}}|v}}=!!!!@!!!!!!!!!!!! !!  !p                                                                                                                                                                              ֟}}}}}~~~~~}}}~~}}~~}~~~~~~~~ڢ~~~~~~~~~}~~~~~~~}}~}}}}~}~~~}~~~}}~}~}}}~~}~}}}}}~~}}~}}~}}}}}r~}}s}vr}}}}}rv}@!!!!!!x!!!!!!!!!!!!!   9q                                                                                                                                                                                         ֏}~}~~~~}~~~~~~~~}~~~~~~~~~~~~~ݥ~~~~~~~}~}~~}}}~}}~}}~~~}}~}}}}}}~}|}}}}}~~~|}~~pr}}}}}}}}}v}}}}|p}}@!!!!!@!!!!!!! !!!! !q                                                                                                                                                                        ֏~}~~}}}}~}}~}~~~~~}}~~~~~~~~~ꫢ~~~~~~~~~}~~}~~~~}}~~}}}}}}~~~~}~~}||}~s}}}}}|}}}}}}}}}vvp}~}|}r|}}}}}@!!!!]]!!! ! !!!!!!! !! !!!    !  !p                                                                                                                                                               ֠}}~~~}}~~~~~~~~~~~}~~~~~~~~}~~~~~~~}~~~~~~}~~~~}}~~~~~}~}}~~}}}}~}}}}}}}}}v|}}}~}}rv}~}}rv}}v|}|=!!!!!!@!!!!! !!!!!!  !q                                                                                                                                                             ֏}~~}~}~~~}}~~}~~~~~}~~~~ګ~~~~~~~~~~~~~}~~~~~}}~~~~}}~}}~~}}}}~~}}}~~}~}}}}}~}~}}}~~~}}}}~r}}~~~}}~}~}p}}|}}}rpvx!!!=$=@!!!!!!! !  !!!! $                                                                                                                                                             ֠}}}~~}~}~~~~~~~~}~~~~~~~~ܢ~~~~~~~~}~~~~}~~~~~}~}~~}~}~~}}~}}}~~}}}}}}~|}}~}}}}|}~}}}}}}}}}}}}|}}}}}}rvp}x=!!!!!!!$9_!!!!! !!!!! !!!   =}                                                                                                                                                                                 ֠~}~~}~}}~~~~~~~~~~~~~~~~~~~~~ڦ~~~~~~~~~}}~~~}~}~~}~~~}||}}~~~}}}}|}~}}}}~||}~}}|}|}}}p|v}~}||p}}}}}z@$!!$!!9!!!! !!!! !! !!!     $p                                                                                                                                                                                ֏~~}~}~~~~~~}~~~~~~~~季~~~~~~~~~~~}~~~~~~~}}}~}}~}}}}~}|}}}~}}}}}||}}}||}||}}vv}~}v|vv}}}||΂C@=!!!!!!=@!!!!!!! !! !!  p                                                                                                                                                                     ֎~}}~~}~~}}~~}~~}}}~}~~}~~~~~~~~}~~}~~~~~~ƃxZ@=!!!!!!!=!!=9u=$!!!!!!!! !!!!! ! !!!!!! ! !! =s                                                                                                                                                                                ֏~~}~~}~~~}~}~~~~}}}~~~~~~~~~~~~~}~}~~~~~}}}}}}}}}}}w}}}vvv}}}}}vv}}}}}v}}vv}}vw}vpv}wvvvv}vvvvvvvvvvv}vvvvvuvvvvvvvvvuluvvvuovvvoouuuolovvolluuluulllltllluulllullooolCllCltllCCllllCCCCCCClCCCCCllCoCCCCCAACC@AClCCCACCCCA@CCCCCCC=CCCAA@ACCCCCCA@=@AA@=@>@>@=C=@=@=@==@==@==@=====@>====!=!!!!!!!!!!==@!!!!!!!!!!!!!!!  !!!   =s                                                                                                                                                                                                                          Ԏ~}~}~}}}~~~}~~~~~~}}~~~}~~~~~~}}}}|rvrp|}v|p}vrvvp}}ppvpppoppvvvv|}ppvpppp|vplppppplpppvplllpppllloopvppplllllllpllplovlllpllCllllCoollollllllllpllC??Cl?CCl?CCCCllll?>>CllC??>lC>CCCC>CClC>=>>C>=C>>=>CC>=C>=>=>A>=CC==>===================$===A========!$==========$!=!=$==!!!!!=$$!!$!=$!$$!!!_B!! !!!!!!! !!!!!   =}                                                                                                                                                                                                                                 ֎}~}~~~~}~~}~~~~~}~~}~~~~~~~~~~~~~}~}}}}}v||pv|||}vp}}|}vpppppppp||vvvppppppvpvppoopppvppppppllpvppplllopvppplpplllllllpooplllpolllllllopCClpllllllllllC>ClllClC?Col?CllC?CC>ClCC>>?CClCC>>=?lC>>=>C>>>>=>?=>>>>>>=>>>==>A>=>=>=======>============>>=======!!=====$====$!!==$===$$$!!==!!!!=!!!!$=Y@!!!!!!!! !!!!!!!! !!!! $q                                                                                                                                                                                                                             ֏s}~}}}}}}~}}}~~~~~~~~~~~~~~~v}|pppvpv}}|ppv}ppppp|}||pv|||pppppppv|vpppopvvvpplpvvvvpppppollppllvopplollloolpppllplllllollllClplClollpplllCCllllllCCllllll>?Cl??C?>?llC??C?lCC?>?l>C>>Cl>AC>>CC>>>ClC>>A>=>=>>A>>?=>=>AC?==>C>=>C===>>=============$$=======$!=====!===!!$$!!==!!=!!$!@=$!Z!!!!!!!!!!!!!!! !!!  !q                                                                                                                                                                                                                      䠏s}}~}}}~~}~~}}~~~~~~~}~}~~~~}~~~ppvppp}}|v}}vpppppp|vvrv|vvvv|pppvvppvvvppvppvpp|vop}vpvvvppplpolllppllpllpllplllllllpplllllllllllplCllllollllllllllllll?Clllll>???C?>CCCCCC?>>CC??>CC>>>>CC>ll??>C>=?l>>CCC>==>>CA=?>=A>>>>===C>>=>A>========$========!$===========!!!====$=$=!9=!!==!!!$==!_!!!!!!!!!! ! !!! !!!   s                                                                                                                                                                                                         ڏ~}~~}~~~~}~~~~~~~~~~~~~~~~~~~~~~}}}}}}||ppp|}v|}}|pv|vv|vpvpppv|vv}vpppppp}}ppop|pllppllllopllopppppolpvolllpvvppllllvlllllllllllollllllCllCCClllC?llCClCCll?>ClCClC?CllC?lCClllCC??>lC?C??=>l>?>>C>CC>=>>>>?>=>>Cl>>===>>===>>==>==========@=9$9==============$!9!====$!!!!!!!!=!!!$$=Zx_$!$!!!!!!!!!!!! ! !!!!!   ! =s                                                                                                                                                                                                                          䏏}}~~}}~~}}~~~~~}}~~~~~~~B!!!!$!!!!!!!!! !!!!!!!! !!! =s                                                                                                                                                                                                                 ꠏ~~}}~~~~}}~~}}}~}~~~~~~~~~~~~~~~~~~}~~~~~~~~~}~~~~~~~}~~}}~~}}}~~}}}~~}~~}}}}}}~}}}}}p}~}}}r}}}}~}}}}}}}r}}}pvr}}|w}||}[!!!!!!!!!!!!! !!! ! !! 7ڞ                                                                                                                                                                                                                柏~~~}~~~}~}~}~}}}~~~~~~~~~~~~}~~~~~~~~~~~~~~}~~~~~~~}~~~~~~~}}}}~~}}}}~}~~~}}}~}}r}}}}}}}}~}v}}~~}}s|}}~}}}r}}}}}}}}v|p}}r}}}!!!!!!!!!!! !!! !!!!!!! =                                                                                                                                                                                                                     뎎}}~~~~}}}}~~~}~~~~~~~~~~}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}~}}~}~~~}}~}}}}~~}~}~}}}~}}}}~~}~}}}~~|}}}}}}}}r}}}~}}|}v}r}|}pp}}}||v!!!!!!!!!!!!!!!!!!!!!!!      !?ٛ                                                                                                                                                                                                      {뎏}}}s}~}}}~~~~}}~~}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}~}~~~~~~~}~~~}~~}}~~}~}~~~~~}}~}}~}}~}~~}~~~}}~~}}}~}|}r}~}}}}}}}}|}rvp|}}}}ppv}}vpv=!!!!=! !!!!!!!!!!!! !!!! !!!  ! ?ژ                                                                                                                                                                                                                     z}s}}~~}~~~~~}~~}~~~~~~~}}~~~~~~~~~~}~~~~~~~~~~~~~~~}~~~}~~}~~}}~~}~}}~~}}}}}|}}}}~~}}}|}r}}}~}r}}}}|}}}v~}}}vv}}}r}wr}}|ς=$!!=!=!!!!!!!!!! !!!! !! ! !?ڔ                                                                                                                                                                                                   z}}}}~}}~}~~~}}~}~~~~~~}}}}~~~~}~~~}~}~~}}~~~~~}~~~~~~~}~~~~~~~~}~}~~~~~~~}~~~}~}}~}}s}r}~}}r}v|}s}}|}~~}}}}rv}}~}p}}r}}}}}}}}px======!!$$!!!!$!!!!!!!!! !!!!!!!!!!! !jك                                                                                                                                                                                        ]~~~~}~~~~}}~~~~~~}~~~~~~~~~~~~~~~~~~~~~~}~~~~~~~~~~~~~~~~~~~~~~}~~}~~~~}}}~~}}}~~}~s}}}}~}}}}~}}s}}}}~~}~}}|}}}}}}}}}}}r}}}|}}wv|v}p}}|vӞӞҞʞǞʞǞǞǞǞǞǞǞǞǞǞǞǞƞǞǝǞxZ=!!!$$!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !oك                                                                                                                                                                                                         B~}}~~~}~}}}}}~~~}}}~~~}}}~~~~}}~~~~~~~~~~~~~~~~~~~~~~~~~~~}}~}}~~}~~}}}}}~~}~~}}}}|}~r}}}}}}}}}~}~~~}p}}}||}}|p}}}}~}}vvvrv}|v|}}}}}||pp|}}|p}}vp}}}|}}|pvppp|}|||pppv|ppppppploopoolllv|pppplllp|ppppvppllvolpvppplllpvolllllllpplllllpll?lllvllllClollllllllC?ClCCllC>?llC??>>>>>CCC>>>>CC>Cl=>>=CCC=>C>>==>?>>>>===>>>>>llA===>>=======>=====$==!====$$$=======$!!=$$$=!!$=====$=!!==!$$!!!$!!!!!!!!!!!!!!!!!!!!  !!!!!!!!!!!!!=q]                                                                                                                                                                                                                 9ڏ~}~}~}}~}~}~~~~~~~~~}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}~~~~~}~~}~~}}~}}}}}~~~}}}~}~}~~}|}}}}}}}|}}}~}|}}~vv}}}}}}rp}|}~pp|r|}|||v|v|}}pp||pv}}ppppvvp|pvv|ppppvppvvvpppvpoppp}pppopppllvpppvpolllppolpvlllopplllllplloolllolllllllllllCllllClllCCClClllllCCCClCll?CCCCCCCll?C?CClCCC>?CCC>=>>>C>>A?>=>>>?>>>>=>=>=>>>=>C=====>>======>===A===================!====!=====$!$!!==!!!!$!!!=!!!$$!!!!!!!!!!!!!!!!!!!!!!!!!! ! !  =s]                                                                                                                                                                                                      揎~~}}}}}}}}~}~~~~~~~~~~~}~~~}~~~~~~~~~~~~~}}~~~~}~~}}}~~}}}~~}}~~~}}}~|}}~~~}}~}}~~}}}}|}~ps}}}r}}|}~}~rvv}}p}}}}}}}}}}vvvpv|pp|pp}}pp|}vppppp|}}}}vpppp||ppppp|vppvoop}}}v|plolllpvvvvvollllllllplllllllllllopvvpppllllpllCClll?lllllClCCC>CC??Cll?CllCC>ClCC>>?>>>CC>ClllCllC>?ClC>>C>>C>ClC>ClCCC>CC====>>>>>=>==>>=========>===>====>>=========!=9$$====!$===!!$!!!!==!!$!!$==$!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!! !!   ! =B                                                                                                                                                                                                                   ~}~~}~~~}~~}~~~}~~}~}~}~~~}~~~~~~~~~~~~~~~~~~~~~}~}~~}~~~~}~~~~}~~}}~~}}}}}~}}}~}v~~}}r}~}p}}}}}}}vp}}}}}}|}}}|}}p}v}}}v|r}v}||p}}}ppv|v|pp}}pp||vv|vppv|ppppvvpov}pppppvpppoplpppppppppplpppvloolpploolollppllplllllolllllllllllllllllllllllllCCCllCCCClCllCCClCCCCCCllA?CC>>Cl>>>>CCCC>>>C>?>=>C>>>>>>>>>>=>=>=>==>>>==>========>======================$===$$!=$=!$!$===$$$!!$!!!$!!!!!!$!$!!!!!!!!!!!!!!!!!!!!! !!!! !     ?9                                                                                                                                                                                                                                             s}~~}~}}}}}~~~~~~~~~~~}}}~~~~~~}~~~~~~~~~~~~~~~~~}~~~}~~~~}~}~~~}}}}~~~~}}}~}}}}}}}~~}~~|p}~~}}}|}~}~|}}}p}~}}}}}r}}}spp}}pr}}|p|}rv|prvvp}rvv|}}ppp|}}pp|}~}}|vp}pppppvvpp|}|vpp}}}}p}}olppplpvvvpvopplloppppplpvvpoppollpvllll?ClllllllllllllClllCCllllllllllllCC??>CCllll>CCCCCllllll>>>>>CC?CC>>CClC>=C>====>=>>>=ACA>CCC>>>===CC==>>A>>>A>=============!$$=======C=$=$!==!!!$=======!!$!!!$$!!!!$!!!!!!!!!!!!!!!!!!!!!!!!!!!  j                                                                                                                                                                                                                                                          x}~}}}}~~}~}}}~~}}~~}~~~~~~}~~~~~~~~}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}~}}~}}~}~~~~}}}}}~}}}r~}v}}}~}}}}r|}}}}}}}}}r}}}r}}sp}|}}}}}p}pvrv|vv|v|pv}}|vv|pvpp|vpp|vv|ppv|pppoppvvpop}vlpvpopppppplvvllpvllppplloooopollplllplllpplllllllllllllolClllllllClllllCClllClCll?C?CC?CCC?ll>>ClC>>>Cl>>?????CC>C>?=>?>=>>=C>==>>>>>A==>>===>>==>=====================$=====$$$==$===!$!$=$$$$$!!=$!!!!!!!==!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!! !pڔ                                                                                                                                                                                                                                        Zڏ}}}~}}}}~}}}~~}}}}~~}~~}~~~~~~~~~~~~~~~~~~~~~~~~~~~}~~~~~~}}~}}}}~~}}}}}~~~~}~~}}~~~}}r}}}}}}~}}|p|}|v|}}s}svv|v|}~}}}}}}}}}}}}}|p|p|}}}}}}r}}}~}pp|pp|pppppppppppvpppp|vvpoopppplp}}pvvolplopolpppolvploppllllppopolollopoplppllpllCCCClloppolllllllCClCCllCCCCllolllCCCCCCCC>>C?>>>CC>>>=>C>>>>>>>CCCCCCC>C>>>>=>>>>C==>=>>>>>==>>==>===>>==>==$====!====$==!$======$====!===!!$!!=====$$=$!!==!!!!!!!!!!!!!!!!!!!!!!!!  !!!! !=}z                                                                                                                                                                                                                                 ;}}~~}}~}}~~~~~~}}~~~~~~~~}~~~~~~~}~~~~~~~~~~~~}~~~~~~~~~~~~}~~~~~}~~}~~~}}~}~}~~}}}}}}}}~}}}}}}p}}}}}}}}vr}|}s~}}|}}|}}p}}}}vv}}|p}}|v}}}|v|p}|pppp}|ppv|ppppvvppvppppppppvpppppppppvpppopppppolppopplppplploplllpollppllllllpollllllClllllllllllCClllCClllC>CllClCCll?ClC>>lCC>CCCCCC>>>C?>AC>>?>>>>>>>C=>C>>>>=>>>=>A=>>?=>===>===>=============$=>==========$======$=$!====!!!=$=$!$=$!!!!!$!!!!!!!!!!$!!!!!!!!!!!!$!!!!!!! !  ?]                                                                                                                                                                                                                                     }}~~}~~}~~~~~~~~}}~~~}~~~~~~~~~~}~~~~~~~~~~~~~~~~~~~~~~~~~}}}}~~~}}~~~~~~~}}~~}~}~~}~~}}~~~~}}}}~~~~~}rv}~}}r}}~~}~}}}}|}}}}}}pp}pp||pp|pp|}r}}}vppp|}}}pppppvvpppp}}v|}vpp|}}||vpolppopvpppplloloop|vpooplppllpploloppopplpplllpolppllllllllllpplllplllllllllCC?Clll?ClollC?ClC>?llC>CllCCl?>llCllCC??ll>CCC>>>CC==>>>=>>>>>C>=>===CC===?>=======>A>>=====>>============!!$!!===!$!!$=$!!!!=$$!$!$!!$!!!!$=!!!!!!$$!=!!!!$!!!!!! !!!!!!!! !! ! !!!!!!    oY                                                                                                                                                                                                                                             ~}}~~}~}~~~}~~}}~~~}~~~~~~}}}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}~~~}~}~~~~}~}}~}}~~}}~~}}}}~}s}}}}}r}~}|}~}}}|r}}}}}~v|}}pp|}r}}}|p}|||v}||vpv}|pv|}pvpv||ppppv|ppp|ppppv}ppppp}pppppvpppppppooppllvvlpllpvllolopollplllllvllllllloollllllllllllllllllllllCClllllCCCCCCllCCCC?CCCCl>>ll>>??CC?>C>>>>>C=>l?=>>A>>>>>=>>>=>C====>>>==>===>=======>=========$=A======!===$===!==!$$$!=$!!$!$$!!==!=$!!!!!!!$!!!!!!!!!!!!!!!!!!! ! ! !!9q;                                                                                                                                                                                                                                            ڟ~~}}~~~~}}~}}~~~~~}~~~~~~~~~~~}~~~~~}}~}~~~~~~~~~~~~~~~~~~~~~~~~}~~~}}}~~}}~~}|}}}~}}~}}}}}}}}}r}~}}}}}}}~}r}}}}}~}s|}~}}r}}~}}}}p}}}}}}~}w}}}}}|}|pv}|}}|ppp|}}}v|}}}}vp||pppv|vpppvvp|p|vplppv}v|vvvpplllllpoppppovvpvplpplpplovolollllllppoolllloppplll>llllC?lllllllllllC?CClllC>???CCCllC??CClC>>CC>>CC>CC>>CC>>>>>CCC>>>C>====ACCA=>=========>>>>>=======>==========$$=========$!$=$!$===$!!==!!!=!$$!!==!!!!$!!!!!!!!$!!!!!!!!!! !! !!   =!                                                                                                                                                                                                                                      x鏏}~~~~~~~}}}~~}}~}~~~~~~~~~}~~~~~~~}~~~~~~~~~~~}~~~~~~~~~~~~~~~~~~~~}}~~}~}}~~}}~}}}}}~s}}~s|~}}}}~}}}}}}}}~|}}}}}}}vp}}|v}}}r}|}}}}}vs}}vr}|}ppp}}rv||||vp}|ppppv|vvppv|pvpvpppppppppvpppoplppoppppppoppppvllooopoloppplllllllllplllllolllllllllllCCllllllCCllllCCCClll?ClC?CCCClCCll>??>ll>>?CC=CC>CCCCA>C>CC>A>CA>=>>>>>>>===>===>>==>=>>==========>=======$========$===!==$!!!$==$$!$=$$$$!!!$$!=$!!!=!!!!!!!!!!!!!!!!!!! !!! !!! ?ڔ                                                                                                                                                                                                                          B}s}}}~~}~}}~~~~~~}}}~~}~~~}}}~~~~~~~~}}~~~~~~~~~~~~~~~~~~~~~~~~}}~}~}}}~~~}~}}~~}~~}}~~}}~~}}}}}}}~}}}}|}p}}~}|pp||}p}}rv}}}prpp}}ppr|}pv|pp||v}}}v}}pvp|vvpp|}}pppv|pppppv|ppppp|vpolopopppppvppvvvppoooppollplpllllllppllllllllllpplllllollCClllolllllllllCll?ClCCC??CCCClll??lC>>>>?Cl?C?>>CC??C>>>>C?>>>>>=>=?>C>>>C>======C>>CC>=>=========>>==========$=====$=$==$=======$$$!$==!!===$==!!!$!!$!!!=!=!!!$!!!!!$!!!!!!!!!!=!!!!!!!!!!!!!!!!   !!q]                                                                                                                                                                                                                                                   䏏~}}}}}~~~}}~}~}~~~~~~~~~~~}}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}~~~~~~}}~~}~~~~}}}~~}~~~~~}}}}}}s}~}}}}|}~}p}}}}~}}|}|p}}}}||}|}}}}pp}|}p}}|}}vv}|p}}}|v}|v|p}vvpv}}vvv|ppvvppv|pppppppppppvpppvpppppppppoollvpplolpvllllopppoolllolllllpllllllllllllllllllllllllCCCClClC?lllCCllCCCCCCCC>CCCCC?>>CC>?>??C>C?>lC>>=>>>>>C>>>C>>>>==>>>>C>=>>=>===>=======================$!====$===$=$!$$$!!===!!$$$$!!$!!!!!$!$!!!!!!!!!!!!!!!! !!!!!!!! !!!!!!  ! =@                                                                                                                                                                                                                                      菎}}}r}}}}}~~}~~~}}~~~~~}}}~}}~~~~~~~~~~~~~~~~~~~~~~~~}~~~~}~~~}~}~~}~~~}~}}~~~~~}~}}}~~|}~~~~~}~~}}~}}}r}}}}}~}}s}r}~|p}s~}}}~}}p|}}}||v|vv|vpp}}|vv|vprv|||ppprvpv|prvpp|}}ppv}vppppoopvppppllp|plppppopppplpplpplpolpplllllllpoppolllllvplljlllpolClllllClllCCCCCClCllllllC>ClCClCC>>CC>>>>?>?ClCClC>>?>=>>>C>CC>C====>===>>>>=>>?>A>>=====>==>CA=>=?==$$=>>A===$=========$====!==$!!===$==!!$!!!!!=$!$!=!!!!!$!!!!!!!! !!!!!!!! !!!! !!!  ?!                                                                                                                                                                                                                                           ]~}}}}~}}}~~~~~}}~}}~~~~~~~}}~}}~~~~~~~~~~~~~~~~~~~~~~~~~}~~}~~~~~~}~}~~~}~~}~~}}~~}}}}}~}~}}}}}}~}}}}}}}}r}~}}}}}s}}}p|}}}}~}s}||}||vvvr||}|p}}|vr}p}}}v}}pvpp}}ppv|ppp||vvvp|ppppppppppoppppvvppppopllpppopvooploolppollopllovollllplllpllClllplllllllllCllCllClllCllllllC>>?ClllC??CC>>>?>CCCCCCl>>CC>>>>?C>>AC>=>=>C>=>>>=>>>=>A>>=>>>===>=>A>=========================$$===$$==$====$$!!!$$!$!!=!!$!$!!!!!!!$!!!!! !!!!!!!!!!! !!!!!!!! $sك                                                                                                                                                                                                                                                       ;䠡~~~~}}~}}~}~}}~~~~~}}}~~~~}}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}~~~~~~~}}}}~~}~~~~~~}}}~~~~~~}}}}}}~~~}}~~}~~}}~}}}}||}}}}}}vp}~}r|}rv}}}}}p}}}}}}}}}}ppprppvpp|vprv|pppv}vppp|v|vpllp}|pvvpppv|ppp}}vpppplppppollppvvvpllppvvppllpllpploplloplppllllClllpll?llllllllllllllpoC??ClC???Cllll>CCClllCllC?>?C>>CC>>CCC>?CC>=>>>C>>>AC>==>C>A>>>=====?C=>=>=====>>========$$=>===$$=!======$=$!!$=$!==!!!!$$=!$!!!===!!$!!!!$$$$=!!!!!!!!!!!!!!! ! !!!!! !!      =Z                                                                                                                                                                                                                                          ~~~~}}}~}}~~~}~~~}}~~~}~}~~}~~~}}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}~~}}~~}~~}}}~~~~~~~}~r}~~}~~}}}}~~}}}~~}}}v}}}}}r}}}}}~}pp}}}}|}}}|}|r}|}}}v||ppvp}pp}|ppp}}|vrp}pp|v}|pppppvppv}pop|popp|}vpppolpppppllppppppllppppppllopllpplllllpllolllllllllllllllClllllClllllllClCCCC>?ClllCClCllClCCCC???>C>CC>?CCC>C>CC>>>=>C>>>>>==C>>>>>>>=>=>>>>=>=>>===>>========================$!===$$$$$===!!!!$!!!=!!!$=!!!$!!$=!!$!!!!$!!!!!!! !!!!!!!  !!!!! !  oB                                                                                                                                                                                                                                             s}}}~}}}}}}~~~}~}}~~~~~~~}~~~~~}~~~}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}~~~~~~~~~}~~}}}~}~~~~~}~~~~~~}}}}}~}~}~}}~}~}}}~}}}}}~}}~}}rw}~}~}v}}}}p}}vp|v}}}}v}|vrvvp}}vpvpv}}|pp|}|v}vpppp|ppppppv|||vp}}pppvpp||ppvppvplopplppovpppplllplolppoppolllplllplloploll?lllppolllllloolCllolllllC?ClllCllllCCCCCCCCCCCC?>>CC?>>>>>>CC>>C>>>>>>lC>>=>C>==>C=>CA====>>===========>======AC>A>======$$=====$!!$==$====$$$!!$!$=!$==$===!=!!!!!!$!!!!!!!!!!!!!!!!!!!!!!!!!  !   ! 9sڛ9                                                                                                                                                                                                                                            Z蒏}}~}}}~}}}~~}~}~~}~}~~~~}}~~~~}~~~}~~}~}~}~~~~~~~~~~~~~~~~~~~~}~~}~~~~}~~~}}~~~~}}~~~}~}}}~~~~}}}~}}}}}~}~}}}}}r}}}}r}}r}}}}}}||vvvr}}}}vvvppv}vvrpp}||ppv|||}|pppv|vp|vppppv|v|pvpppppvvvppppp}poploopvppvoppolloopppplppllplolloplClvllllllloollllllllollllllllllCClCCllCCllClCCC?ClClC>?CCCCCC?C>>>>CC>>C>?C?>ClC>>C>C>=>>C=>C>>=>>>>==>>=======A=========C>=====$=========$=======!$!=!!=$$!$$!$==!$$$$$!!!$!!!!!!!!!$!!!!!!!!!!!!!!!!!!  !! !! oz                                                                                                                                                                                                                                          "ՠ}~~~}}~~~}}}~}}~}}~~~}}~~}}~~~~}~}~~}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}~}~~~~}}~~}}~~~~~}}~~}~~}}}~}}~}}}~}}}s}~~}|}}rv}}}|}|}}}}}|}}}}}}~}~}r}}}}prvr}|}rp}||}}}}}}|vpppp|}}|vpp|vppppvpppppppvppppvppplpvvppopopvv|pllpvpoopoplplllpvppplllplllpolollllpllCloolClCllllCClClCClllClllC?>?CllA>>?ClC>?lllCCCCCCCCCClC?>>Cl>==?>=CC>CC>A>====>==>>=>==CA==C>=======>===$=============$$====$!$=$=!=======!$=$$!!$!!!!!!!=!!$!!!!!!!$!!!!!!!!!!!!!!!!!!!!!!!!   =]                                                                                                                                                                                                                                                             ~}}~}~~~~~~}~~}}~~~~~}~}}~}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}~~}~~~~~~~~~~}}~~~~~}~~~}~~~~~~~}}~~}~~}}}~~}}~}|~~~}}}}~~}r}}}r}}}v}}}}|}}~}}}~}}}}}}}}}}}}}pp}}}}pp}}}~|v}}}}vvvv|pv||ppppppppvvpppppvppppvvvppppppvpppppvvpppopvppopololpplvppvppolplllolllpplllllllplllllCllllllC?CllCCCllllCC?>llC?>>ClC>CllCC>??CCCllCCll>=CC>=>C>>C?>>>l>==>=>>=>>>=>>>>>==>==================>===>===$!=====!===!===!$==!!!!==!!=!!!!!!!==$!$!!$!!!!!!!!!!!!!!!!!!!!!!!!!  !!   !?ߞ;                                                                                                                                                                                                                                                   ]}~}}}}~}}~~}}~~~~}}}~~}~~~~}~~~}~}~~~~~~~~~~~~~~}~}}}}~~~~~~~~~~~~}~~}~~}}~}~}}}~}~~}}}~~}|}~}}}}}}pp}}}}~~}}}rv|~}}~}p}}|vv}}vv|pvv}}}}}||}}v|v}}vprvp|vpr}vp|vp|}}|||vv||vpvppppp|vpppppppoooopplloollppoppppploolllollloooollllopllloollllllol?lllCllllloolllll?llCCCllllCCllCl?Cll>?CCClCCC>>>?>>>CC>=>CC>CC>>==?=>CC>C>>>C===>======>==>>C>>=A=>=>>========!$=====$=$!$$===$$==!!==$===$=!!$==!$!!!=!!!!!!!!$!!!!!!!!!!!!!!!!!!!!!!!    9s{                                                                                                                                                                                                                                                               梏}~~}s}}~}}~~}}}~~~~~}~~~~~}~~~~}~~~}~~~~~~~~~~~~~~~~~~~~~~~~~~~}~~~~~~~~~~~~~~}~}~}}~~}|}~~~~~}}}}}}}s}}~~s}}}}|}}}|~~}p}}}p}}}|}}|}vrv}rp}}rpp}}}}}}}}r}||}pp|pp}}pv|vvvvpp}pp}}vp|vrvppppppvvpppppvvpoloppllpollppllppppppolollllplpopplplplllloopollllllCCllClllllllllllClClC??llllCCllCCCCll??lCClCCCC>>?C>>?CC=>?CCCC>>>=?>>C?CC>=>>>===>>===>>==A>=>>>===>================$==$!==$==$$==!!!$!==!$$=$=$=!!!$!$=!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!    !lY                                                                                                                                                                                                                                                               }}}}}~~}}~}}}~~}~}~~}}~~~}~~~~~~~~~~}~}~~~~~~~~~~~~~~~~}~~~~~~}}}~~}~~}~~}}~~}}}~~~}}~~}}}}}r~~}}}}}}}~}}}~}}~~}}}}}p~~}v}}|p|}}p||}}p|}}}pp}v}|vvv|pppp}}}ppp|}vpp}}pvrvpppp}|pvvpvpv|vvpppppopoopppppv}ppvppop}vllololllllpppopplllllllllllCllllllCllllllllllllClCCCCllllllC?lCCCCC?lC>CC?CC?>CCCC>?>>>>C?>>??>>?>>>>CCCC=>>>>>A>=>C>=?>>>>=>>===>>=====================>==$======$$===!$!====$=$!=!!!$!$!=!!!!!!!$!!!!!!!!!!!!!! !!!!! !!!!!!!! !!!!!  =ڛ;                                                                                                                                                                                                                                                                                @撏s}}}~~}}~}~}}~}~~~~~}~~}}~~}~~~~~~~~~~~~~~}}~~~~~~~~~~~~~~~~~~~~}~}~~~}~~~~}}}}}~~~~}}~~}}~}}}}~}}}}}}}|}~~}~~}}}}}}~s|}~}}}}|pspv}|p}}p}}}}p}rp|vrv}|ppppp}}ppv|}}vvrv}pvpppp|pvv|v|p|vvvpvvppppppoppvpppvvpppoppppplllplllpppoppoplll?lplllllllllllllllllollllCllC>?lCClllllllCClCCC>?CC?CC>?CC??CC>C?>>?CC?>C>>>>?>>C>CC>C?=>>==>>=>l>=>=>>=>C>============>================$=====$$!!=!==!===$!==$$$!!!!!=$!!!!!!$!$!!!!!!!!$!!!!!!!!! !! !!!!!!! ! !! ! $pz                                                                                                                                                                                                                                                                  ӟ}}~~}}}~~~}}~}}~~}~}}~}~}~~~}~}~~}~~~~~}~~~~~}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}~}~~~~~~~~}}~~}~~}}}~}}~}~~~~}~}}s|}}~~}s}r}}}~}}v}}||}}}}}p~}}}||}}|}}}pp}}|pp}p|}}|}pp||vvp||pp||v}p|vppp|pppppvpppp|pppppppppppoppoooppppllloopvvllppollplplplllpollopoolllllloollllllllllllllCCllllCCCClllllllCCCCClC?lCCC>>Cl>CC?>>CCCC>>?=>?>>>=>>>>A=>>A==CC>>====?>===C===>>====C======$==$================!=$!=$$=$$!=$$!!$=$$!!!!!$!!!!!!!==!!!!! ! !!!$!!!!!! ! !   =B                                                                                                                                                                                                                                                                          z襟~~~}~~~~~~}~}}}}}}}}}~}~~~~~}}~}}~~}}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}~~~~~~~}}~~~~~~~~~}~~}}}}}}~~}}~}}}~~}~~}}}}}}}}}}|}}}}}}r}|}}r}}}}}}v}}}|s}}}}}}pp}}}pppp}}}}pvv||vppp}ppvp}}pp}vpp|pppppppplppvvvvppplovplppllpppppllpppppvplopollllllollovollpplollllClpllllllllllllll?llllCClllClllllll??CC?CCCCCC?>>CC?CCC??>CCC>>>>=>>=>>==>>>>>>>>=A>CC==>C>=======>>>>=$=A>=========$==$$====!======$==$!!=$$==$!==$!=$!!!!!!=!!!!!!!!!=$!!!!!!!$!!!!! !! qڔ!                                                                                                                                                                                                                                                                                ;䢏}}}~~}}}~~}}}~~~~~~~~~~}}~~~~~~~~}~}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}~~~~~~~~~~}~~}}}~~}}~~~}}}}~~}}}}}~~}}}}}~~}}~}~}}}}}}~~}}|}}}s|}}|vv|}}}||}p|v|}p}}|}|}vv}}|vv||pp||}|v}vpppp|}ppp||pppppp|vvpppvpppppppplv}pppvvplpppplpvppolpllpooppplloolllolloplllllollClolll?llllCCllC?llClllCCC?ClClCll?ClC????CClC?ClCC?>>?C>>>C>?>?CCC>>C?AC>>>A>>==>>C>=A>>=>==>>===>=A=========>=>=$===$=============!=!$==!!$$$!$=$!!$$!!==!!=!!==!!!!!!!!!!!=!!!!!!!!!!!!! ! ! j_                                                                                                                                                                                                                                                                            }}}~~}}}~~~~~~~~~~~~~}}~~}}~}}~~~~~}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}~~~~~}~~~}~}~~~~~}}}~~~}~}}~}r}~~~~~|}s}}}~~}}}}vr}}s}~}}}}}}}|~}vrp}|}}}rp}}pp}v||}}}vr}}}}pp|vppvpv}}|}v|pp|pppvpvppvppppppppvpppppvvppppvvvppppppppppppppllolopplpvpollllllolllllllllllClllllllCCC??>llllllllllC?CCllllCCCCCCCCC?CCCCC?ClC>>>?CC>>>C?>C>CCCC?CCCC>>>>>==>=>C>=>A>==>=>C>==A>>>======$=====$===$$=======$$====!!!=$!!!!!!!==$!$!!==$==!!!=$!!!!!!!!!!!!=!!! !!!!!!!!!!       =@                                                                                                                                                                                                                                                                                       _撎}}}}}}~}}}}}}}~~~~~~}}}}~~~~}~~~~~~~}~~~~~}}~~~~~~~~~~~~~~~~~}~~~~~~~~~~}~}}~~}~~~~~~}~}~}~}~~}}~~}}~~}}~}}}~}}}}}}}~}}}~}}}}}r}}}}}}r}}}|v~|vp}}vv||||}}pp}}p}vvvpp}||v}|vvpp}pppv|}pppppv||vppppvvppvpppppppolopploppppllpollppppllppllllllppoloplllllpoloopllollllCllllllllllllCCllCCCCClClC?CCC?C??CCCCC?C?CC>>CC>?>>CC>>>>>>>C>>>>>=>=>>>C>==>>>>>C====>>==>>======>=>$=============$$==$$====!==$$!=$$$==!$!!!$=!$!!!!!$!!!!!!!!!!!!$!!!!!!!!!!!! !!!! oz                                                                                                                                                                                                                                                                            Տ~}}}}~~}}~~}}}~~~}}}~~~}}}~~}}~~~~}~~~}~~~}~~~~~~~~~~~~~~~~~~~~~~~~~}~~~}}~~~~~~~~}~~}~~}}}}}}~~~}}}}}}~}}|}~~~}}}}r}}~~}}}}}}}}v}}~}}}}}}}~}svr}}v}|}|v||}p|pv}vpr}|pp|}pp|}vrpppvppp}}pppppp||vppv}vpvvppppppopooooppolpvpllplllpplllllpllllllppoolvlllllpoolpplplllllllllllllllCCCCCClCCl?>ClC???CC>?C?CllCCC?C?>>>C>>>?>C?=>C>==>C>>>=>>>====>C===>>=>>>>==>==>>====>=>=>================!==!$!$$=====!$$!===$!!!!=!!!!!!=$!!!$$!!!!==!!!!!!!!!!!!!!!!!! ?B                                                                                                                                                                                                                                                                                            _}}}}}}~~}~~~}~~~}~~~~~~~}~~}}~~~~~}~~~~~~~~~}~~~~~~~~~~~~~~~~~~~~~}~~~~~~}~~~~~}}~~~}}~~~~~~}~~}}~~}}~~}s}}~~}}}~}|}s}}~}}}}}}r}}|}}}s}}p}}}}}}}|p|vps}|vv}||}pp}}pp|}p|}}p|vvppp|||vpvvppv|vpppppppoppppvvpvppppooppplopolpvpllvvlppllopploplllpoopollllllllllCClllCllolllll?CCCClClllll?ClClClCCCC>?CCCCCCCCCCCC>=CCC?>>?CC>>CC>>C>>C=>C>>>=>>>=>>>==>=>>=====>=====>=============$$$===!=====$$$$!=$==!!=!!=!!===!!!!=!!$!!!$!!$! !$!!$!!!!!!!!!!!!!!!! >ك                                                                                                                                                                                                                                                                                  襠~}|}~}}~~~~~~~}~~}~~~~~}~}}}~~~}}}~}~}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}~~~~~}~~~~~~~~~~}~}~~~}~~}}~~~~~~~~~}}~~}}~~}}~}}}}}}r}~}}}}}}}}|}}|p}}}}vr}}||}p}}}}}}|}vr}pv}}pp|}r}pv|}}p}}vp}}|pppppvv}}|p|||ppvppv|pppppppppppp|vpppoppppllpolovpllvppvppllopppppllppllpolpllllllCllClllllllClCCCCC>lllClllCCCllCCCllCCC>>ClCCCCCCCCC>>CCCC==>lC>>CC>CC>CCCAC>>>=>=>>CC>>====>===========>A===$$=>===========$9!$====!!!!!$!==!!!!=======!!$!!!!!!!!!!!!!!!$!!!!!!!!!!!!!!!!!! !$qB                                                                                                                          !T                                                                                                                                                       _䢏}s}~~|s~~}~~}}~}~~~}~~}~~}}~~~~}~~~~~}~~~~~~~~~~~~~~~~~~~~~~~~~~~~}~~}}~~~}~~~~~~~~~~}~~~~~~}}}~}~~}~}~}}s}~~}}~}~~}|}}}}~}}|||~~}p}}}~}v}}}}}}||}}}pv}}}}|p}}vp}}}}vp|v|}v||pv}pv}||pprvpppppppppvvvpvpvppppppppvvploopppopppvplpppllpppolplpllpllllllplllpovllllllppolllllllllCllllCllllCllCCCCCCl?CCCCCll??CC?>??>>?CC?CCCC>>?C>=>C>>>>>=>>>?>>>AC==>===>>>>=>==>==>=====>=======>==================$===$$$$$$$$$==$!!$=!!$=$!$!$!!!!!!!! !!!!!!!!!!!!!! !!!!!    !!oك                                                                                                           @_Y@                                                                                                                                                             Տ}}~~}}}~~~}}}}}}}~~~~~}}}}}}}}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}~~~~~~~}}~~}~~~}~~~~}~~~~~}}}~~~~}~~~}}~}~}}}}}~~}}~}~~}}|rv|}|}}}}}}vr}~}~~pv}}}~~}p|}rpps}}~}|}}rpp}}}}|pp|}pp|pv}||}}}vpvppvvpp}pp|p}pvpppvvpppopvvppopppopppppvplppplpllollpppollllllllllllooplllllppolllllllllllCCllllllClCCCCC?ClCCCC??lll?>???CC?>>?CCCCC>?>>CC=>=AC>>>>>===C>>C>>========>A>=>=>>>===>>>==================$$===========!$=====$==$!$$!!$!!!!!==$!!!!!!!!!!!!!!!!!!!!!!!!! !! !!  !oY                                                                                                                         !bZ                                                                                                                                                                  xs~~}}~~}}}~~~}}~~~~}}}~~~~~~~}~~~~~~~~}~~~}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}~~~}~~~}}}}~~~~}~}~~}}~}}}~~}~}~}~}}}}}}}}}}}}}}}s}}~~}}|r}}}}}}}p}~}p}}}p}}}}}|p}v|v}||p}p}}pv|p||vpppv}|ppvppv|vpppp|vppppppp|ppppppppppolppppplpvppppplolppplollplpvlolllloooolllllllllllplllllllCCllllllCCl?lllllClll?ClCCCCCCCCC>CCCC???>>CCC??C>>>>CC>>CC>>>>CC>=>?>>>==>=C=>=>=>====>==>====>=======A====$====>A==$==$=$===$!$==!$!!!$!!$=!!$!!$!!!=!!!!!$!!!! !!!!!!!!!!!!!!!! !!! !!!    ?ڔ                                                                                                                           !Y_T!                                                                                                                                                                  蚏}~}}~~}~}~}}}}~}}~~}}~}}~}}~}}~~~~~~~~~~}~~~~}}}~~~~~~~~~~~~~~~~~~~~~~~~~}}~~~~~~~~}~~}}}~}~~~~~~~~~~}~~}~}~~}}}}}}}~}}~}}~~~~}}rs}~~}}}}}~~}p}}~~~}vv}}}}}r}p}~|vvrp}}p}}}}v|}|pp}|v|vvv|||pp||pppvv|ppppvv|}|vppppppppvppvpoopppppppllppvvplopppovvppolppooooollpopllovooplpllllllllllllllCCll?looollllllllllollllllC??CllCC????ClC>>>>>CC>CC??>>>>>>>>C>>>>>CC>==>>>=>>=>>C==========>==>===>=====>>======!$=======!!!!===$=!!=!$$!!!!===!!!$!!!!$!!!$!===!!!!!!!!!!!!!!!!!! !!!! !!! !!!!!!!!!=}]                                                                                                                            !YT!                                                                                                                                                             檏}}}}}}}}}}~}~~~}}~~~~~~~~~}~~~~~~~~~~~~~~}~~~~~~~~~~~~~}~~~~~~~~~~~~~~~~~~~~~~}~~}~~}}}}~~~}}}~~~}}}}}~}}}~~~}}}}}}|}}~~}}}}}}}}|}r}}}}w|}v}~}s|p}}}pv}}||}||v}|pp}pv||}p}pppp}}prvp|||vrpppppvvpvvppp|pppppppppvpopppppvpoppppppooplpppppoollpolplllvlllllplpllllllllollllllCClllllClCCCClllllC?llllCCCClCC>CCClCCC?ClC>?CC?CCAC?>>?>>>>>>>>>>>>A>==C>=>>>=>>C=>===>=====>>======>=======$$======$$======$$$$!$==!!$=!!$$!$=!$!!!!!!$!!!!!!!!!!!! !!!!!! ! !!    !!!=sٔ                                                                                                                              !                                                                                                                                                                  檟}}}}}|}}}~~~~~~}~~}~~}~~~}~~~~~}~~}}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}~~~~~~~~~~~}~~~~~}~~}~}}}}}~~}}}~~}}r}~~}}~~~~}}~}}}r|}}~}r|}|s}ps}}~}}rv|p}|}}v|pp}vrpv|||vp|}}}v||p}ppppv|ppv|}}|ppv}}}ppppppp}vppppppppvvvvpppppppvvppvpppppppollolopppppplpplllolpplll?lppppllllllolpllClllCllCCClCCCCClllllC?CllllC?CllC?ClCCCClCCCCC>C>?l>>CC?CC>=>=====>C>>>C>A>==>=>>C>>CAC>=======>>>>=>===========$$$!========$!=$!==!==$$===!$$$!$=!!!!!!=!!!!!!!!=!!!!!!!! !! !!!!!! !!  =qZ                                                                                                                                                                                                                                                                                           _楏}}~}}~}}~}}}~}~~~~}}}}~~~}~}~~~~~~~~~~~~~~~~~}~~~~~~~~~~~~~~~~~~}~~~~~~~~~~~~~~~~~~~}~~~}~~}}~~~~~~~~~~~~}}~~}}}~}}~~}}}}~}}}}}}}}~~}}~}}}}}~}}}}}~}}}p}}}v}|}}}|}||}|}|}}p|}|p|}}||}}pp||}}}pvvvv|}vvvpp}vpv|vpppp}|ppppppppv|ppppppplpvppppppppopllpppopopllpplllplllplllllllolllllllllllllllCllllllClllClllCClClCCCCClClCCCCC?ClCCClC?C>?>?CCCC>>Cl?C>>>C>>>>>>>=>>>C>>>CC==AC==?>>C==>>========================$==$=====!!====!!=$$=!!$!!$!$!=$!!!!!!$!!=!!!!!$!!!!!!!!!!!!!!  ! !!!  =s׃                                                                                                                                                                                                                                                                                              ڒ~~~~~~~~}~}~~~}}~~~~~}~}}~~}}~}~~~}}~}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}~~~~~}~~~~}~~}~}~~~~~~~~}}}}}~~}~~~}}~~}}}}}}}~}~}}~~}}}|}}~~~~}}~~~~}}~~}}p}~}}}v}}r|vr}~}}}}}}}}p}}|}p}pp}v|}}||pv|}}}}|r}}r}|ppv|ppppp|vppp|}vvpppvpp|vppppplolppplpolloppllovpooppolllppllpollpplllllllllllllllllllllollllllC?lllllllC???ClCC>CllllCCC??>?CCCCC?>>CCCCCC>>?CCC>>>CACCC>>C>=>>=>=CCC>==>>==>=====>C>=>============A>====A====$!$=$==!=====$===!$!$!!!!!$=$!!$=$!!!!!!!=!!!!!!$!!!$!!!! !!!! !!!! =qڞY                                                                                                                                                                                                                                                                                                           Bڢ}~}}~}~}}}~~~}~~}}~~~~}~~}~~~~~}~~~~}}~~~~}~~~~}~~~~~~~~~~~~~~~~~~~~~~~~~}~~~}}~}}~}~~}~}~~}}~~}}}~}~}}~}}}}}}}}}}}}}}}~}}}}}|}}}}}}}}}}}}|}}}}s||p}}}}}||v||v}r}|v||}pp|v}v||}p}pppv}pp|v|vpppppppvpppvpppvvpppvolppvvppoppoopolovplplopplolllllpllopollplllllllllplllllllllCCllllCClllllllllCCClCCCCllCClCCCCC>>>C>?C?CC>C??>>>>?>>>CCA>>C>=>C>=>>>=>C>=>=>==>>===>======>>===>===$=======$=====$===$====$$$$$$$$=$!=!$!!!$!!!!!!$=!!!!!!!!!!!!!!!!!!!! ! !!!!!!  ?sx                                                                                                                                                                                                                                                                                        䪏}}~}}~~~}}}}}}}}}}}}~~~}~}}}}~~}~~}}~}~~~~}~}~~~~~~~~}~~~}~~~~~~~~~~~~~~~~~~~~~~~~~}}~~~~~~}}}~~}~}~}~~}}}~}~~~}}}}~}}~}~~}s}}||}}s}}}}}}r}}}}}}|}rp}}}s}}}}}vr}v|}}}}v|p}}ppvv}p||}}||pppppp}ppp|}}|v|v|}|v|ppppvpppvvppp}|poppppppvppppvpplllppopplllllllllpoolllllolloopllllllvvll?Cl?llllCClllllllllllllCC?CllCllC???CC?>>>>>>>CCClC?>?>>=>>>>>CCCA>>?>>>CC>>=>==========>>=>==>=====>>==>====$$=====$$!$==!====!!====!!!!!!==!=$!!$!!!!$!!=!!!!$!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !! !>}ٝ;                                                                                                                                                                                                                                                                                                        ;檏}~~}}~~}~~}}}~}~~}~}}~~~}~~~~~~~}~~~~}}~~~~~~~~~}~~~~~~~~~~~~~~~~}~~~~~}}~~~~~~~~~~~}~~~~~~~~~~~~~~~~~~~}}~~~~}}}}}}~}}}~~}~}}}}|}~}}}}}}}}}v}rv}r}}}}}}}}}}}}v}}p}p|~}rv}}pp||||pp}}}|pp|pvvv}ppv}pppv|pv|vppppppvvpppppopppppoppplppppplppploppooppllpplplppplllplllolllllllllllolplllCllloolCllCllCllllllllC?CCC?CCClCCCCC?C?ClC>?>>CC>>>>>>CC>=?C?C>>?>>>>>>C>=>>==>>=>=>=>=>========>=======>=!==========!====$$$=====!!==$$!!==$$!!$=$!=!!!!!=!!!$!!!!!!!!!!!! !!! !!!!!!!!!!!!! ?s]                                                                                                                                                                                                                                                                                                  ]楒}}~}}}~}~~}~}~~}~~~~~~~}}}~}}~}~~~}~~~~~~~~~~~~~~~~~~~~~~~}}~}~}}~~~}~~}~~}~}~~~~}}~~~}~~}}}~~}~~~}~}}}}}|}}~}}s}~~~~}}~}}v}}}|}}||}}r}}}~}}}}}pr}}pp}r}}}}|vpr}}}p}|vpv}}}pp|}}}vpvvr}p}pp||pppppppppppp||vp}vppvpopopvvplllpplpppplpppvppoppplllppvppvpollllllllllllllllllpllpolllllolCCllCCl??CC?CClllCCCCCC??CCCCCCCClClC?>>>C?>>>CCCClC>>>>>=CCC>>?==>>>?>>>=CAC>=>=>A>>=>>>=>=======>====>===>>======$=!!=!=!$=$$==!==!===$!!$=$!===$=$!$!!!!!!!!=!!!!!!!!!! ! !!!!!!! !lӔ                                                                                                                                                                                                                                                                                                              몢}}~}}~~}~}}~~~~}}~~~~~}~~~~~~}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}~}~}~~~~~~~~}~~~~}}~~~}}~~}}}}~}~}~~}}}}}~}~~}}~~r}~|}~~}r}}}}}v~~}|}}}p}}}p}}|}v|}||||v}}|pp}|}r}}vp}}pprvv}|}ppvp||vppvppppp|vppvp|vp|pppppppppppppollpvppolppppoopolpolpppllpplplplllllllllllolllllllpollCllllllllCC?CClCClllCC??ClC?CCllC?CCCCC??CC>>CC>>?>CCC?>?>?>=>>?C>>>>>=>>>=>==>>>>==>=>>====>>======>==$============$====$=!$$$=$==$$$=!$==$!$!$!$!$=$!!!!!!!!!!!!!!!$!!! !!!!!!!! !!!!!!!! !!oٝB                                                                                                                                                                                                                                                                                                              @򬢏~~~}}}}}~}}}~~~}}}}~}}}}}}}~~}~~}}~~}}~~}~~~}~~}~}~~~~~~~~~~~}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}~~~~~~~}~~}}~~}~~~}~~~~~~~}r}}}}}}~}}~~}}}}|}~~}}|}}|}r|}}}}~s|}~pp}~vr}pp|}}ppvp}}p}}}vv}|pp}vpv||v|v|pp|ppv|}|pppppppppvv|pppppppppppovvpppoopppppllpppololllvpllllllloppooollllllpllpllCllClllllCClllllllllCCCCClCCC?CC?llCCllCl?>?C>CC?>>>>>ll?>>ClC>>=?CC>>>>>CC>>>C>>=>=>>=>=>>=====>========>===========$==$$==$====$!===!!$!!$===$!!!$!!$$!!!!$!!!$!!!$!!!!!!!$!!!!!!!!!!!!!!!!!!!!!!!! !?qx                                                                                                                                                                                                                                                                                            zڒ~}~}}~~}}~}~~~~}}~~~}}~~}~}~~~~}~~}~}}~~~~~~~}}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}~~~~~~~~~~~~}~~~~~~~~}}~}~~}~~~~~~~~}~~~}~~}}}}}}}}~}}}}}s}s}}}}}}}rv}}}}}|}}}}}}vp}~|}}p}}}p|||pv}|v|}vrv}}pppp|}pp|}pvv|vpp||vv|v|vppvppppppvpppoppvppppppoppplpppoovpppllpopplollpoloopllpvlllllllllllllolClllllCCllllllCllllCllCCClllC>ClC?CCllC>CCCCC??C>>CCC>?>>CC>=>>C>>C>=>C>=>>>>>==?>==>=>>>===>>=======>===>=======$===$=========$$==$!==$$!=!!$$!!$!9=!!!=!!!!!!$!!$!!!!!!! !!!!!!!!!!!!!!!!!!! jsӔ                                                                                                                                                                                                                                                                                                            "暏}s}}~}~~~}}}~~}}~~~~~~~~~~~~~}~~~~~~}~~~~~~~~~~~~~~~~~~~~~~~~~~~~}~~}~~~~~~~~~~~~~~~~~}~~}~~~~~~}}}}~~}~~~}~}~~~~~~~~}}}~~}}}~~}}~}}}}~}}~~}}}}}~~}}}}|v|vv~~}}|p}~}pv||}||p}}p|}}}vv}}}|}}pp||}|v}}}vs}}|pp}}}pp|}|||vpppppppv|ppvvpppppvpppoppvpppoopppppplopppppopplopvpplllopoloolllovoopollllllllpll?ClllllCClClCllClllC?C?>lllll???>>>CClC>?CCC?>CClC>CCCC>>>>>C>>=>>>>C>=>>=======C>=>A>===>===A>>==>=====>>==>=====>==!===$======$======$==!!!==!!$$$$!!!=!$=$$!!=!!!!!$!! !!!!!!!!!!!!!!!!!! !  m}ڝB                                                                                                                                                                                                                                                                                                ;謏}}}}~~}}~}~~~~~~~~~~}~}~~}~~~~~~~~~}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}~~~~~~~~~~~~~~~~~~}~~}~~~~~~}~~~~}~}~~}~~~}~~~}~~~}}}~}~}}~~}}}}}}~~}}}~}}}r}}~~}}}}}}r|}~~}}s}}}||}s|}|||v}}|v}}rp}}}}}p|}vp||p}}p|v}}}pp|}ppv}||vppvppvvvpp|vpppppppvpppvppppppppopppppplppppplpppllppllplpoolpplllloplllllvlllClllllllolClllllllCllClolllCCClllCCCCCCCCCCCC?CCClC>?CCCC>>>?CA>>CC>>>>>=Cl>=>C>>>=>=>C>=>>>==>=>>=>==>==>=====>==============$========$$=$===$$!!!==$!$=!!$!!$!!!=$!!!$!!!!!!!!$!!!!!$!!!!!! ! !!!!    ?q_                                                                                                                                                                                                                                                                                                    Zڪ}~}~~}~~~~~~}}~}}}~}}~}~~}}}~}}~}}~~~~~~}~~}~}~~~~~~~~~~~~~~~~~~}~~~~~~~~~~~}~}~~~~~~~~~~~}~~}}~~~}}~~}}}}~~}}~}}}}}}~~~~~~}~}}}~}}~~}}~~}}}~~~}|}}}}}~~~}|s}}}}~}}~}}s}}p}|}}rp}}|p}}vvpp|}p|}pvvpp||v|ppp}}|||||vpp|pppv|pp|vppp|pppvvpvppoppvppppvvpllopopoppppplllplpoolloppplooppllpolllllllllllClolllllllCllllllllCClllllllllllC>??ClllllCCCCCClll>Cl>>?>>>CCl?=?C>>CCC>>C===C==>CC==>>==>>=>>=>>C==>============!==========$$=!===$====!===$!!===$!!==$!===!!$!!!!! !$!!!!!!!!!!! !!!!!!!!!!! !     ?pz                                                                                                                                                                                                                                                                                                        zՏ}}}}~}~}~}}~~}}~~}~~~~~~}~~~}~~~~~}~}~~~~~~~~~~~~~~}~~~~~~~~~~~~~~~~~~}~~~~~~~~~~}~~~~~~~~}}~}~~~}~~}~~~}}~}~~}~~~}}~~}|~~~~}~~}}~}}}}}~}}s}}|}~~}}}}}}}}}}}}}}}}}|}}}}||}}}}|v}}rpv}}v}vvprvvvvvvvpvpv|vvvpppv}ppp|ppp|pppvp|ppppp|vppppv|pppppppppopvplpppollplovploloppllppllppoolllllllllllCllllllllllllllllClllllCllllCClCCl??lllClC??CCCCCll>?C?C>C>>>CC>>>>?CCCCC>=>>>C>=>lA==>>>=>>=>=>==C>==========================!!!==$!====$$==$!===!$!!$==!!!$$$!!$!!!!!$!!!!!!!!!!!!!!!!!!!!!!! !!! !!!! oט#                                                                                                                                                                                                                                                                                 9暟}}~}~}}~~}~~~}~~}}~}~}~~~}}~~~~}~~~~}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}}~~}}}~~~~~~}~~~~~}}}}~~~~}~~~~}}~~~}~~~}}}}}~}}~}}}~~}}}}}~}s}~}}}}}}}p}}}|v|p}}p}}}ps}}}}}||p}}}}||vv|v}}|v}}vr}}}|}pvvppppppvpp|}vppvppppvvppppppppvppvvpvpoppvpppppoloooppopplppplllpl?llplllolpllvplllllllllllllllllllClllClllllCllClC??CllCCCClC>>>?>CClCClC>>>??CClC>>>>>ACCC>=>CC>>>ClC=AC>=>?==>=>>=>===>C>>=>>===========$===$$!=============!!!$=====$$$$=$$$$!!!!$!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!! !!! $osٞ<                                                                                                                                                                                                                                                                                   ;ڢ}~}s~~~~~}~~~}~~}}}~~~}~}~~~~~~~}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}~~~~~}~}}}~~~~~~}}~~~}}}~}~~}}~}~}s~~~}}}~~}~}}}s}}}}}}}}}}}}}~}}}}}}}p}~}|}}}||rp}~}}}rv}}p}~}p}|}}v}}vv}|r}p|v|vrv|v|}vvvrvpvppvrpp|}ppvppopvpppppppppp|popppppppvpppopvpoooopolpllppolllpplllollllllpplllllolllllllllllllll?CllCllCllllllCCCCllC?ClCCCCC?>>?lC??CCC>??CCCCCC=>??C>?C>>>>C>>>>C>>>=>==>>==>>=>A>==>>>=====>==============$$===========$!!=!$====$!$==!$!$=!!!$!$!!!$!!!!!!!!!$!!!!!!!! !!! !!!! !7lq]                                                                                                                                                                                                                                                                            YՒ}}}}}~~~}}~~~~~}~~~~}~~}}~~}}}~~~~~~}~~}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}~~~~~~~~~~~~}~~}~~~~~~~}}~~}~~~}}~~~}}~~~~~}}}}~}~~}}~}}~}}}~~~}}rp|s}~}~}}|pvr}p}~}}|}}~}}}}}}}}}}v||}}||}}vr}}|pr}}}}v}|}ppppp|r}ppvrpv}p}}}pv|}}|pppppppovvpvv|vppppoplloppopppvpopooopplllpplpvolpvoooplllplllpllllpolllpolllllCllllllllC??lllCCCCCllCClCCllCC?CCC>>?CC>>>>ClCCC?>>>C>=>?A>>>>=>>>>CC>>==>>>>>>==>>===>C=====>>>===>>>>====$=========!!=!=!!=!=!$===$!$!==!!==$!!$==!$!!!!$!!!!$!!!!!!$!!!!!!!!!!!!!!!!!!   !!?pz                                                                                                                                                                                                                                                                                         xՒ}}}}~~~~~}~~}~~~}~~~}~~~~~~~~~~~}}~}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}~~~}}~~}}~~}~}~~~~~}}~~~~~}}~~}~~~}}~}~}~}}~}}~}}}}}|}}}~}}}}|}}}p}~~}}r}}}}}}s}|}}}rwv}}|}}p|}}}|v}p}}}p}}||ppp}}ppv|vvpp}|}|vpp}}}ppppp}popprvpvvpppppppppppoppppppppopolpooopppopollllooollllllollolllllllplllllClllllllllCCClllC?lClCCClllllCCCC?CC?>?CC>?>>CC>?CCCC>>>>>CCA>=>>>C>>Cl>==>>>>C>=>=>==>>=>===>=========>===========$=======$$===$!=====!!$$!$$!=!$$=$!!!!$!!!!!!!!$!!!!!!!!!!!!!!!!! !!!!!  ! !! =oqӔ;                                                                                                                                                                                                                                                                                                  ֚}~}}}~~}}}}}~}}~~~~}~~~~}}~~~}~~~}~~~~~~}}~~~~~~~~~~~~~~~~~~~}~~~~~~~~~~~~}~~}~~~~~~~}}~~~}}~~~~~~}}}}}~~~~~~~}~~}~~}~~~~}}}}s}~}}}}}}}~}}}}}~}}~~~}}}}s}~~~~}~}v}}}}vvv}}}|p}}}~}w}rp|||pp|}|}}||ppp|ppppp}}p}|pp}}p}}ppvp|ppppppvp|pp||pppvppppop|vpoopvpoopoollppppollopvpplllllpllllpllpolllllpllllllClplCClCllpllllllloolCll?>?CllCCCCCC?Clll??ClllC>CCllC>>>CCC>>>>>C>>>>>=>?C==>C>>CC=>=>>>C>===>=>==>>>>========>=$$=>=$==>===A>>A===!=$$=!!!$!=!!$=!!$==!!!!!!!!!=!!$=!!!!!!!!!!!!! !!!!!!! !!!!7?qӛ;                                                                                                                                                                                                                                                                                                ڬ}}}~}~~}}}}~~~~~~~~}~~~~~~~~~~~~~~~~~~}~~~~~~~~~~}~~~~~~~~}~~~~~~~~~~~~~~~~}~}~}}~~~}~~}}~~~~~}~~~~~~}~~~~~}~~}}}}}}~}}}}}~}}}sr}}}}}}}}~}p}}}}}}}}}s}}}}sr}}}vv}}}}}}rv|}psppv}}}||vvvpppp|p}}pp}}}}p||}ppvv|vppvppppvvpp}pppvpppppppvppppppppopppoppolppoloppvpllllooplllpolplllllololCllllllljlllClllollllllolClCl??ClClCC?CCCClllCCCCCCCCCCCCC>>>C?C?>>>>>C>>>>>>>>>=>>>C>>>>>=>CA====>>==>>===========>=====================!==$$$$$=$!!=!!!$=!!=!!!!!$$!!!!!!!!!!!!!!!$ !!!!!!!!!!!!!!!!! 9?psםY                                                                                                                                                                                                                                                                                   9֚s}}}}~}~}}}~~~}~~}}~~}~~~~~}~~~}~~~~}}~~~~~~~~~~~}~~~}~~~~~~~~~~~~~~~~~~~~~~~~~~~~}~~~~}~}}~}}~}~~~}~~}}}}}}~~}}}}}}~}}}}}~}~}}}~~~}}}}}}}}~}r}|v}}}}}}s}}|r}}}s}}}}}vr}r}wr}}p}}}}}}}}r}}v|}}}r}}||p}p}}ppppp|ppvpppppppppppppppppppvpppppppppppppvpoopppoooppppllpppplllolppoplppooollllopoplloljlppppllllplCllClllCCCllC?CCClC?CClllCC?CCCCCCCCCC?>>??C?>C>>>?llCCCCCC>>CCCC>>>====?>=>>==>>>==>>>====>==>>=>=$===>=>====A=$!$===!=======$!!$!!!!$=$$=!!$!!!$==$$$=!!!!!!!$=!!!!!!!!!$!!!!!!!!!!!!!! !!   =?mpsٞY                                                                                                                                                                                                                                                                                                     9եs~~~}~}~}}~}~~~}~~~}~~~~}~~~~~}~~~~~~~~~~~~~~~}~~~~}~~~~~~~~~~~~}~}~~~~}~}}}}}}~~}}}~}}}}}}}s}~~}}}~}}~}~~}}}~}s}~}}}sr}}}}}}}}s}p}}~}}}}}}}}|}}}pp}}v|}~}}}}}}}||}}s|p}}}p}s|}vpp|vppppppppp}pppppppvpopppppppppppppppplp}pplpppooppppolopppopllppppplpppoojojlopppllllllloollllllplCllllllClClllCllCClCClClll>>CCljlllCC?CCC>>lCCC>>?Cl?>>CCC?>>>>CC>>>>==>?>>>=>=>>===C>>>======>>==================$===97====!=!=$$=$=!=$!$$$!!!=$!!$=!=!!!!!!!==!!!!!!!!!!!!! !!!!!!!!!!!!!! ==jpqs}ٞY                                                                                                                                                                                                                                                                                       ;ڬs~}s~s}}~~}~}~~~~~}~}~~~~~~}~}}~}}}~}s}}~}}}~~~}}}}}~~}s}}}s}}}}}}}~~}}}~}}s}ss~}}}s}}s}}rq}}s}ps}qpq}sppqppsppwq}sppp}}ppspppppspps}s}qwqp}ws}}q}sppvrppp}ppppppppppp|poo}ppppoopppppplllpppppppllplllllooooopolpolllllloolllllllljolj?jlllll?l??Clll?llj?ljllll>??>??lC?>>>jl>>CCCj?C??>>>??>>?>=>>>?>=>??>?C>>==>==>>??>>=C??===>>>>===============>==!7============>===$==!$==!$!$$!$$!$$$!$!!!!!!!!===??mo}sssٞ_                                                                                                                                                                                                                                                                    @֬ssssss~sssssssss~sssss}ssssss~sssssssss}s}s}s}ss}ss}ss~ss}ssssss}ss}ssssss}s~ssssssspss~ssss}ssssss}sssppss}ss}ssssssssssqs}sssqssq}s~s}sssqqs}ss}ss}ssssssqpsssq}ssspqs}sqqsqs}ssss}s}}qsssqqqqqssss}qpqqsqspqssqqsspqqsqssqpqsspnqsq}qqpnqqqsqqqpqqpsspnqqqqpqqsqqqqpnqqpnqsqqqqqpqqpqqqqqqqqqqpnqqq}}x                                                                                                                                                                                                                                                                                     YӬx                                                                                                                                                                                                                                                                                         Yx                                                                                                                                                                                                                                                                                          B_                                                                                                                                                                                                                                                                              Yٞ_                                                                                                                                                                                                                                                                           ;ٞZ                                                                                                                                                                                                                                                                 ;םY                                                                                                                                                                                                                                                         ӝ@                                                                                                                                                                                                                                                            zӛ;                                                                                                                                                                                                                                                                       xӔ"                                                                                                                                                                                                                                                      Yמx                                                                                                                                                                                                                                                      ӝY                                                                                                                                                                                                                                                 _Ӄ                                                                                                                                                                                                                                                                   Z]                                                                                                                                                                                                                                                                 "ӝ@                                                                                                                                                                                                                                                        _ӂ                                                                                                                                                                                                                                           Ә;                                                                                                                                                                                                                                      Y]                                                                                                                                                                                                                                                               _Ӄ                                                                                                                                                                                                                                   9ӝY                                                                                                                                                                                                                             Y_                                                                                                                 _                                                                                     Y_                                                                                                                 c                                                                                  Y_                                                                                                                                                                                                                                 YZ                                                                                                                                                                                                                  ;ӞY                                                                                                                                                                                                           !ӔY                                                                                                                                                                                                                       Yӝ]                                                                                                                                                                                          Zx!                                                                                                                                                                                            Ӄ@                                                                                                                                                                                     ZӘ_;                                                                                                                                                                                                    Zӛ_;                                                                                                                                                                                                        _{Ӟ];                                                                                                                                                                                                                        #YxǘzY;                                                                                                                                                                                                     ;;@Y]Zxzzzzzzzzzzxzzzzzzzzzzzzzzzzzzzzx{zzzzzzzzzxzxxzzzzzzxzzzzzxzxzzxzzzzzzzxzzzzzzzzzzzxxzzzzzxzzzzzzzzzzzzzzzzxzzzzzzzxzx{zxzzzxzxzzxzzzzzxzzzxxzzzzzzzzzzzzzzzxzzzzzzzzxzxxzzzzxzzxz{zzzzzxzzzzxzzzzzzxzzzzzzzzxzzxxzzxzzzzzxzzzzzƝƝƖzzzzzzxzzzzzzzzzxzxzzzxxzzzzzxzzzzzzxzzxzzzzzzzzzzzzzzzzzzzxzzzxzzzzz{zzzzzzzzzzzzzzzzxzzzzzzzzzzzzzzzzzzzzzzxzzzzzx{zzzzzzzxxxzzzzxzxxzzzzzxzzzzzzzzzzzxzzzzzzzxzxzzzzxzzx{zz{zzzzxxxzzzzzzzzzzzzzzz{zzzxzzzzxzzxzzzzxzzzzzzzzzzzzzzzzzzzzxxZYY;;                                                                                                                                                                                                                                           "chhhhhhhhhhcccccXXXXTTTTTT                                                                                                                                                                                                                                                                     chhhhhhcccbccXXXXTXTXTT"                                                                                                                                                                                                                                                            dhhhhhhccccXXXXXXXTTTTTT                                                                                                                                                                                                                                         "chhhhhhhhcccccccbXXVXTTT"M                                                                                                                                                                                                                                           "chhhhhhhhcccccbccXXXTTTX:T"                                                                                                                                                                                                                           chhhhhhhhhcbccXXXXTXTTTTT"                                                                                                                                                                                                                       cdhhhhhhhchcccXcXXXXXXTTTTT                                                                                                                                                                                              chhhhhhhhhccccccXXXXXTTTTTT                                                                                                                                                                                                                bhhhhhhhhhhhcccccXXcXTTXXTTT""                                                                                                                                                                         ^hhhhhhhhhcccccXXXXXXTTTT                                                                                                                                                                             chhhhhhhhhcccXXXXXXTTTTT"T                                                                                                                                                                    ccghhhhhccccccbXXXXTT"M                                                                                                                                                                      chhhhhhccccccXbXXTUTTTT                                                                                                                                                           "chhhhchcccccXXXTXTT"T"                                                                                                                                               chhhhccccXXXXXTXTT"M                                                                                                                                                                                chhhhhhccccXXXXXXTTT                                                                                                                                                                    chhhhccccXXbXXTTTT"                                                                                                                                                                  chhhhcdcccXXXXXUTTTT                                                                                                                                                                                  "chhhhhccccccXXXXTTTTT                                                                                                                                                       dhhhchcccXbXXXXTTTT                                                                                                                                                           chhhccccccXXXXXTXTT                                                                                                                                                                             "fhhhhhdccXXXXXXTTTTTTT                                                                                                                                                        dhhhcccbbXcXXTTUTTT"T                                                                                                                                                     hhhhcccccccXVXTTTT"T                                                                                                                                         "chhhchcccXXXXTXTTTT"TT                                                                                                                        "fhhhhhhccccbXXXXXTTT"MTTT"TT                                                                                                                          "hhhcchccXXXXXTTTTT""M"TTTT                                                                                                                       hhhhhccccXXXXXXTT:T"                                                                                                                 "hhhhccccccXXXXXXXTTTTT                                                                                                   ghhhchhccccXcXTVTTTTTTTTTTTT                                                                                                            !ThhhhhhcccccXbXXXTTTTT"TTTT                                                                                             TY_T "hhhhhchcccbXXXXTTTTTTTTTTT                                                                                                      !chY!   "hhhhhhcccccXXXXXTXT"T:                                                                                                 ZXY   hhhhhhhccccbXXXXTTTTTTTT                                                                                                                 !dhhcchccbXbXXXTTT:TTTTTT                                                                                         "dhhhhccccXXXVXXTTTTT                                                                                         "fhhhccccbXbXXXTTTXT":TTT                                                                                         "hhhhhcchcccXXXXTXTTTTT"MT                                                                                                      dhhhhcccccXcXXTTXTTT"TT                                                                                                hhhhhhccccXXXXXXTT"TT"TTTTTT                                                                                                      "dhhhhhchcccXXXXXTTUT:M"TTT:                                                                                                     hhhhhhcccccXXXXTTTTTT                                                                                        "hhhhhchcbbcXXXTXTTTTTTTTT                                                                                                           hhhhhhcccbcbXXXXTTTTTTTT                                                                                                         hhhhcccgcXcXXXTXTTTTT"TT                                                                                              hhhhhhcccccXbXXXTTTTTT"TTT                                                                   dhhhhdchbXcXXbXXTTTTTM"TT                                                                       dhhhhgchcccbXXXXXTTTTT:TTT                                                                hhhhchccccXbXXXVTTTT:T"TTT                                                                "hhhhhcdccbcXXXXXTTTT"T                                                                                 chhhhcccbXXXXTTTT:TTT                                                                   hhhhhhhcccbX^XXXXTTTT"MTTT:T                       @Y!                                               "hhhhchXcbXXXXXTTTT:TT                 !cX                                             "hhhhchccccXXXXXTTTTTTTTTT"TT                      T_cB                                               hhhhhcccccbXXXTTXTTTTT                             @T!                                    "hhhhhhcccccXXXXTTTTTTTTTT                                                              chhchccccXXXXXXTTTTTT:T                                                              "hhhhchccccbXXXXXTTTTTTT                                                                                    hhhhhchcccXXXXVTTTTT"TTT                                                                     "hhhhhhccccXXXTXXVTTTTTTT                                                                             dhhhhchccXbXXXXTTTT"T:T                                                                           "hhhhccbccXXXXXTTTTTT:TTT                                                                                 hhhhhchccbbXXXXTXTM"TTTT                                                                           hhhhhchccccXXXTTTT":TTTTT                                                                  hhhhhhccccbbXXXXTXTTTTT                                                                         hhhhccccXXXXXTVXTTTTT                                                                                      hhhcccccccXXXTTTTTTTT                                                                                 "ghhhchccccbXXXVTTTTTTTT                                                                                                                    "fhhhhhchhccXXXXXTXTTTT:TT                         CorsixTH-0.63/CorsixTH/Bitmap/mainmenu1080.dat000066400000000000000000077220001347163623700207240ustar00rootroot00000000000000                                                                                         "fhhhhhchhccXXXXXTXTTTT:TT                                                                                    "ghhhchccccbXXXVTTTTTTTT                                                                                                 hhhcccccccXXXTTTTTTTT                                                                                 hhhhccccXXXXXTVXTTTTT                                                                    hhhhhhccccbbXXXXTXTTTTT                                                                      hhhhhchccccXXXTTTT":TTTTT                                                                       hhhhhchccbbXXXXTXTM"TTTT                                                                            "hhhhccbccXXXXXTTTTTT:TTT                                                                                 dhhhhchccXbXXXXTTTT"T:T                                                                          "hhhhhhccccXXXTXXVTTTTTTT                                                                                  hhhhhchcccXXXXVTTTTT"TTT                                                                   "hhhhchccccbXXXXXTTTTTTT                                                                         chhchccccXXXXXXTTTTTT:T                  @T!                                    "hhhhhhcccccXXXXTTTTTTTTTT                     T_cB                                               hhhhhcccccbXXXTTXTTTTT                     !cX                                             "hhhhchccccXXXXXTTTTTTTTTT"TT                    @Y!                                               "hhhhchXcbXXXXXTTTT:TT                                                                 hhhhhhhcccbX^XXXXTTTT"MTTT:T                                                                            chhhhcccbXXXXTTTT:TTT                                                                 "hhhhhcdccbcXXXXXTTTT"T                                                                  hhhhchccccXbXXXVTTTT:T"TTT                                                                            dhhhhgchcccbXXXXXTTTTT:TTT                                                                 dhhhhdchbXcXXbXXTTTTTM"TT                                                                        hhhhhhcccccXbXXXTTTTTT"TTT                                                                                                     hhhhcccgcXcXXXTXTTTTT"TT                                                                                                                       hhhhhhcccbcbXXXXTTTTTTTT                                                                                             "hhhhhchcbbcXXXTXTTTTTTTTT                                                                                                     hhhhhhcccccXXXXTTTTTT                                                                                           "dhhhhhchcccXXXXXTTUT:M"TTT:                                                                                         hhhhhhccccXXXXXXTT"TT"TTTTTT                                                                                                                dhhhhcccccXcXXTTXTTT"TT                                                                                              "hhhhhcchcccXXXXTXTTTTT"MT                                                                                       "fhhhccccbXbXXXTTTXT":TTT                                                                                      "dhhhhccccXXXVXXTTTTT                                                                                                                 !dhhcchccbXbXXXTTT:TTTTTT                                                                                                ZXY   hhhhhhhccccbXXXXTTTTTTTT                                                                                                 !chY!   "hhhhhhcccccXXXXXTXT"T:                                                                                              TY_T "hhhhhchcccbXXXXTTTTTTTTTTT                                                                                                             !ThhhhhhcccccXbXXXTTTTT"TTTT                                                                                                      ghhhchhccccXcXTVTTTTTTTTTTTT                                                                                                                      "hhhhccccccXXXXXXXTTTTT                                                                                                                 hhhhhccccXXXXXXTT:T"                                                                                                                  "hhhcchccXXXXXTTTTT""M"TTTT                                                                                                                         "fhhhhhhccccbXXXXXTTT"MTTT"TT                                                                                                                                    "chhhchcccXXXXTXTTTT"TT                                                                                                                                                hhhhcccccccXVXTTTT"T                                                                                                                                            dhhhcccbbXcXXTTUTTT"T                                                                                                                                                                          "fhhhhhdccXXXXXXTTTTTTT                                                                                                                                                                   chhhccccccXXXXXTXTT                                                                                                                                                       dhhhchcccXbXXXXTTTT                                                                                                                                                                            "chhhhhccccccXXXXTTTTT                                                                                                                                                              chhhhcdcccXXXXXUTTTT                                                                                                                                                                         chhhhccccXXbXXTTTT"                                                                                                                                                                           chhhhhhccccXXXXXXTTT                                                                                                                                                    chhhhccccXXXXXTXTT"M                                                                                                                                                               "chhhhchcccccXXXTXTT"T"                                                                                                                                                       chhhhhhccccccXbXXTUTTTT                                                                                                                                                           ccghhhhhccccccbXXXXTT"M                                                                                                                                                                         chhhhhhhhhcccXXXXXXTTTTT"T                                                                                                                                                                                       ^hhhhhhhhhcccccXXXXXXTTTT                                                                                                                                                                                                                    bhhhhhhhhhhhcccccXXcXTTXXTTT""                                                                                                                                                                                     chhhhhhhhhccccccXXXXXTTTTTT                                                                                                                                                                                                               cdhhhhhhhchcccXcXXXXXXTTTTT                                                                                                                                                                                                                     chhhhhhhhhcbccXXXXTXTTTTT"                                                                                                                                                                                                                                                   "chhhhhhhhcccccbccXXXTTTX:T"                                                                                                                                                                                                                                          "chhhhhhhhcccccccbXXVXTTT"M                                                                                                                                                                                                                                            dhhhhhhccccXXXXXXXTTTTTT                                                                                                                                                                                                                                                   chhhhhhcccbccXXXXTXTXTT"                                                                                                                                                                                                                                                                              "chhhhhhhhhhcccccXXXXTTTTTT                                                                                                                                                                                                                                                  ;;@Y]Zxzzzzzzzzzzxzzzzzzzzzzzzzzzzzzzzx{zzzzzzzzzxzxxzzzzzzxzzzzzxzxzzxzzzzzzzxzzzzzzzzzzzxxzzzzzxzzzzzzzzzzzzzzzzxzzzzzzzxzx{zxzzzxzxzzxzzzzzxzzzxxzzzzzzzzzzzzzzzxzzzzzzzzxzxxzzzzxzzxz{zzzzzxzzzzxzzzzzzxzzzzzzzzxzzxxzzxzzzzzxzzzzzƝƝƖzzzzzzxzzzzzzzzzxzxzzzxxzzzzzxzzzzzzxzzxzzzzzzzzzzzzzzzzzzzxzzzxzzzzz{zzzzzzzzzzzzzzzzxzzzzzzzzzzzzzzzzzzzzzzxzzzzzx{zzzzzzzxxxzzzzxzxxzzzzzxzzzzzzzzzzzxzzzzzzzxzxzzzzxzzx{zz{zzzzxxxzzzzzzzzzzzzzzz{zzzxzzzzxzzxzzzzxzzzzzzzzzzzzzzzzzzzzxxZYY;;                                                                                                                                                                                                                            #YxǘzY;                                                                                                                                                                                                        _{Ӟ];                                                                                                                                                                                                Zӛ_;                                                                                                                                                                                   ZӘ_;                                                                                                                                                                                                      Ӄ@                                                                                                                                                                                          Zx!                                                                                                                                                                                                                   Yӝ]                                                                                                                                                                                                             !ӔY                                                                                                                                                                                                                 ;ӞY                                                                                                                                                                                                                                YZ                                                                                                                   c                                                                                  Y_                                                                                                                         _                                                                                     Y_                                                                                                                                                                                                                              Y_                                                                                                                                                                                                                    9ӝY                                                                                                                                                                                                                                                                  _Ӄ                                                                                                                                                                                                                                                  Y]                                                                                                                                                                                                                                Ә;                                                                                                                                                                                                                                             _ӂ                                                                                                                                                                                                                                                                      "ӝ@                                                                                                                                                                                                                                                                            Z]                                                                                                                                                                                                                                                     _Ӄ                                                                                                                                                                                                                                                    ӝY                                                                                                                                                                                                                                                    Yמx                                                                                                                                                                                                                                                                      xӔ"                                                                                                                                                                                                                                                              zӛ;                                                                                                                                                                                                                                                         ӝ@                                                                                                                                                                                                                                                            ;םY                                                                                                                                                                                                                                                                      ;ٞZ                                                                                                                                                                                                                                                                              Yٞ_                                                                                                                                                                                                                                                                                                  B_                                                                                                                                                                                                                                                                                     Yx                                                                                                                                                                                                                                                                                  YӬx                                                                                                                                                                                                                                                                         @֬ssssss~sssssssss~sssss}ssssss~sssssssss}s}s}s}ss}ss}ss~ss}ssssss}ss}ssssss}s~ssssssspss~ssss}ssssss}sssppss}ss}ssssssssssqs}sssqssq}s~s}sssqqs}ss}ss}ssssssqpsssq}ssspqs}sqqsqs}ssss}s}}qsssqqqqqssss}qpqqsqspqssqqsspqqsqssqpqsspnqsq}qqpnqqqsqqqpqqpsspnqqqqpqqsqqqqpnqqpnqsqqqqqpqqpqqqqqqqqqqpnqqq}}x                                                                                                                                                                                                                                                                                    ;ڬs~}s~s}}~~}~}~~~~~}~}~~~~~~}~}}~}}}~}s}}~}}}~~~}}}}}~~}s}}}s}}}}}}}~~}}}~}}s}ss~}}}s}}s}}rq}}s}ps}qpq}sppqppsppwq}sppp}}ppspppppspps}s}qwqp}ws}}q}sppvrppp}ppppppppppp|poo}ppppoopppppplllpppppppllplllllooooopolpolllllloolllllllljolj?jlllll?l??Clll?llj?ljllll>??>??lC?>>>jl>>CCCj?C??>>>??>>?>=>>>?>=>??>?C>>==>==>>??>>=C??===>>>>===============>==!7============>===$==!$==!$!$$!$$!$$$!$!!!!!!!!===??mo}sssٞ_                                                                                                                                                                                                                                                                                                      9եs~~~}~}~}}~}~~~}~~~}~~~~}~~~~~}~~~~~~~~~~~~~~~}~~~~}~~~~~~~~~~~~}~}~~~~}~}}}}}}~~}}}~}}}}}}}s}~~}}}~}}~}~~}}}~}s}~}}}sr}}}}}}}}s}p}}~}}}}}}}}|}}}pp}}v|}~}}}}}}}||}}s|p}}}p}s|}vpp|vppppppppp}pppppppvpopppppppppppppppplp}pplpppooppppolopppopllppppplpppoojojlopppllllllloollllllplCllllllClClllCllCClCClClll>>CCljlllCC?CCC>>lCCC>>?Cl?>>CCC?>>>>CC>>>>==>?>>>=>=>>===C>>>======>>==================$===97====!=!=$$=$=!=$!$$$!!!=$!!$=!=!!!!!!!==!!!!!!!!!!!!! !!!!!!!!!!!!!! ==jpqs}ٞY                                                                                                                                                                                                                                                                                      9֚s}}}}~}~}}}~~~}~~}}~~}~~~~~}~~~}~~~~}}~~~~~~~~~~~}~~~}~~~~~~~~~~~~~~~~~~~~~~~~~~~~}~~~~}~}}~}}~}~~~}~~}}}}}}~~}}}}}}~}}}}}~}~}}}~~~}}}}}}}}~}r}|v}}}}}}s}}|r}}}s}}}}}vr}r}wr}}p}}}}}}}}r}}v|}}}r}}||p}p}}ppppp|ppvpppppppppppppppppppvpppppppppppppvpoopppoooppppllpppplllolppoplppooollllopoplloljlppppllllplCllClllCCCllC?CCClC?CClllCC?CCCCCCCCCC?>>??C?>C>>>?llCCCCCC>>CCCC>>>====?>=>>==>>>==>>>====>==>>=>=$===>=>====A=$!$===!=======$!!$!!!!$=$$=!!$!!!$==$$$=!!!!!!!$=!!!!!!!!!$!!!!!!!!!!!!!! !!   =?mpsٞY                                                                                                                                                                                                                                                                                               ڬ}}}~}~~}}}}~~~~~~~~}~~~~~~~~~~~~~~~~~~}~~~~~~~~~~}~~~~~~~~}~~~~~~~~~~~~~~~~}~}~}}~~~}~~}}~~~~~}~~~~~~}~~~~~}~~}}}}}}~}}}}}~}}}sr}}}}}}}}~}p}}}}}}}}}s}}}}sr}}}vv}}}}}}rv|}psppv}}}||vvvpppp|p}}pp}}}}p||}ppvv|vppvppppvvpp}pppvpppppppvppppppppopppoppolppoloppvpllllooplllpolplllllololCllllllljlllClllollllllolClCl??ClClCC?CCCClllCCCCCCCCCCCCC>>>C?C?>>>>>C>>>>>>>>>=>>>C>>>>>=>CA====>>==>>===========>=====================!==$$$$$=$!!=!!!$=!!=!!!!!$$!!!!!!!!!!!!!!!$ !!!!!!!!!!!!!!!!! 9?psםY                                                                                                                                                                                                                                                                                                     ֚}~}}}~~}}}}}~}}~~~~}~~~~}}~~~}~~~}~~~~~~}}~~~~~~~~~~~~~~~~~~~}~~~~~~~~~~~~}~~}~~~~~~~}}~~~}}~~~~~~}}}}}~~~~~~~}~~}~~}~~~~}}}}s}~}}}}}}}~}}}}}~}}~~~}}}}s}~~~~}~}v}}}}vvv}}}|p}}}~}w}rp|||pp|}|}}||ppp|ppppp}}p}|pp}}p}}ppvp|ppppppvp|pp||pppvppppop|vpoopvpoopoollppppollopvpplllllpllllpllpolllllpllllllClplCClCllpllllllloolCll?>?CllCCCCCC?Clll??ClllC>CCllC>>>CCC>>>>>C>>>>>=>?C==>C>>CC=>=>>>C>===>=>==>>>>========>=$$=>=$==>===A>>A===!=$$=!!!$!=!!$=!!$==!!!!!!!!!=!!$=!!!!!!!!!!!!! !!!!!!! !!!!7?qӛ;                                                                                                                                                                                                                                                                                              xՒ}}}}~~~~~}~~}~~~}~~~}~~~~~~~~~~~}}~}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}~~~}}~~}}~~}~}~~~~~}}~~~~~}}~~}~~~}}~}~}~}}~}}~}}}}}|}}}~}}}}|}}}p}~~}}r}}}}}}s}|}}}rwv}}|}}p|}}}|v}p}}}p}}||ppp}}ppv|vvpp}|}|vpp}}}ppppp}popprvpvvpppppppppppoppppppppopolpooopppopollllooollllllollolllllllplllllClllllllllCCClllC?lClCCClllllCCCC?CC?>?CC>?>>CC>?CCCC>>>>>CCA>=>>>C>>Cl>==>>>>C>=>=>==>>=>===>=========>===========$=======$$===$!=====!!$$!$$!=!$$=$!!!!$!!!!!!!!$!!!!!!!!!!!!!!!!! !!!!!  ! !! =oqӔ;                                                                                                                                                                                                                                                                        YՒ}}}}}~~~}}~~~~~}~~~~}~~}}~~}}}~~~~~~}~~}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}~~~~~~~~~~~~}~~}~~~~~~~}}~~}~~~}}~~~}}~~~~~}}}}~}~~}}~}}~}}}~~~}}rp|s}~}~}}|pvr}p}~}}|}}~}}}}}}}}}}v||}}||}}vr}}|pr}}}}v}|}ppppp|r}ppvrpv}p}}}pv|}}|pppppppovvpvv|vppppoplloppopppvpopooopplllpplpvolpvoooplllplllpllllpolllpolllllCllllllllC??lllCCCCCllCClCCllCC?CCC>>?CC>>>>ClCCC?>>>C>=>?A>>>>=>>>>CC>>==>>>>>>==>>===>C=====>>>===>>>>====$=========!!=!=!!=!=!$===$!$!==!!==$!!$==!$!!!!$!!!!$!!!!!!$!!!!!!!!!!!!!!!!!!   !!?pz                                                                                                                                                                                                                                                                                ;ڢ}~}s~~~~~}~~~}~~}}}~~~}~}~~~~~~~}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}~~~~~}~}}}~~~~~~}}~~~}}}~}~~}}~}~}s~~~}}}~~}~}}}s}}}}}}}}}}}}}~}}}}}}}p}~}|}}}||rp}~}}}rv}}p}~}p}|}}v}}vv}|r}p|v|vrv|v|}vvvrvpvppvrpp|}ppvppopvpppppppppp|popppppppvpppopvpoooopolpllppolllpplllollllllpplllllolllllllllllllll?CllCllCllllllCCCCllC?ClCCCCC?>>?lC??CCC>??CCCCCC=>??C>?C>>>>C>>>>C>>>=>==>>==>>=>A>==>>>=====>==============$$===========$!!=!$====$!$==!$!$=!!!$!$!!!$!!!!!!!!!$!!!!!!!! !!! !!!! !7lq]                                                                                                                                                                                                                                                                                9暟}}~}~}}~~}~~~}~~}}~}~}~~~}}~~~~}~~~~}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}}~~}}}~~~~~~}~~~~~}}}}~~~~}~~~~}}~~~}~~~}}}}}~}}~}}}~~}}}}}~}s}~}}}}}}}p}}}|v|p}}p}}}ps}}}}}||p}}}}||vv|v}}|v}}vr}}}|}pvvppppppvpp|}vppvppppvvppppppppvppvvpvpoppvpppppoloooppopplppplllpl?llplllolpllvplllllllllllllllllllClllClllllCllClC??CllCCCClC>>>?>CClCClC>>>??CClC>>>>>ACCC>=>CC>>>ClC=AC>=>?==>=>>=>===>C>>=>>===========$===$$!=============!!!$=====$$$$=$$$$!!!!$!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!! !!! $osٞ<                                                                                                                                                                                                                                                                                                       zՏ}}}}~}~}~}}~~}}~~}~~~~~~}~~~}~~~~~}~}~~~~~~~~~~~~~~}~~~~~~~~~~~~~~~~~~}~~~~~~~~~~}~~~~~~~~}}~}~~~}~~}~~~}}~}~~}~~~}}~~}|~~~~}~~}}~}}}}}~}}s}}|}~~}}}}}}}}}}}}}}}}}|}}}}||}}}}|v}}rpv}}v}vvprvvvvvvvpvpv|vvvpppv}ppp|ppp|pppvp|ppppp|vppppv|pppppppppopvplpppollplovploloppllppllppoolllllllllllCllllllllllllllllClllllCllllCClCCl??lllClC??CCCCCll>?C?C>C>>>CC>>>>?CCCCC>=>>>C>=>lA==>>>=>>=>=>==C>==========================!!!==$!====$$==$!===!$!!$==!!!$$$!!$!!!!!$!!!!!!!!!!!!!!!!!!!!!!! !!! !!!! oט#                                                                                                                                                                                                                                                                                                      Zڪ}~}~~}~~~~~~}}~}}}~}}~}~~}}}~}}~}}~~~~~~}~~}~}~~~~~~~~~~~~~~~~~~}~~~~~~~~~~~}~}~~~~~~~~~~~}~~}}~~~}}~~}}}}~~}}~}}}}}}~~~~~~}~}}}~}}~~}}~~}}}~~~}|}}}}}~~~}|s}}}}~}}~}}s}}p}|}}rp}}|p}}vvpp|}p|}pvvpp||v|ppp}}|||||vpp|pppv|pp|vppp|pppvvpvppoppvppppvvpllopopoppppplllplpoolloppplooppllpolllllllllllClolllllllCllllllllCClllllllllllC>??ClllllCCCCCClll>Cl>>?>>>CCl?=?C>>CCC>>C===C==>CC==>>==>>=>>=>>C==>============!==========$$=!===$====!===$!!===$!!==$!===!!$!!!!! !$!!!!!!!!!!! !!!!!!!!!!! !     ?pz                                                                                                                                                                                                                                                                                                   ;謏}}}}~~}}~}~~~~~~~~~~}~}~~}~~~~~~~~~}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}~~~~~~~~~~~~~~~~~~}~~}~~~~~~}~~~~}~}~~}~~~}~~~}~~~}}}~}~}}~~}}}}}}~~}}}~}}}r}}~~}}}}}}r|}~~}}s}}}||}s|}|||v}}|v}}rp}}}}}p|}vp||p}}p|v}}}pp|}ppv}||vppvppvvvpp|vpppppppvpppvppppppppopppppplppppplpppllppllplpoolpplllloplllllvlllClllllllolClllllllCllClolllCCClllCCCCCCCCCCCC?CCClC>?CCCC>>>?CA>>CC>>>>>=Cl>=>C>>>=>=>C>=>>>==>=>>=>==>==>=====>==============$========$$=$===$$!!!==$!$=!!$!!$!!!=$!!!$!!!!!!!!$!!!!!$!!!!!! ! !!!!    ?q_                                                                                                                                                                                                                                                                                                             "暏}s}}~}~~~}}}~~}}~~~~~~~~~~~~~}~~~~~~}~~~~~~~~~~~~~~~~~~~~~~~~~~~~}~~}~~~~~~~~~~~~~~~~~}~~}~~~~~~}}}}~~}~~~}~}~~~~~~~~}}}~~}}}~~}}~}}}}~}}~~}}}}}~~}}}}|v|vv~~}}|p}~}pv||}||p}}p|}}}vv}}}|}}pp||}|v}}}vs}}|pp}}}pp|}|||vpppppppv|ppvvpppppvpppoppvpppoopppppplopppppopplopvpplllopoloolllovoopollllllllpll?ClllllCClClCllClllC?C?>lllll???>>>CClC>?CCC?>CClC>CCCC>>>>>C>>=>>>>C>=>>=======C>=>A>===>===A>>==>=====>>==>=====>==!===$======$======$==!!!==!!$$$$!!!=!$=$$!!=!!!!!$!! !!!!!!!!!!!!!!!!!! !  m}ڝB                                                                                                                                                                                                                                                                                           zڒ~}~}}~~}}~}~~~~}}~~~}}~~}~}~~~~}~~}~}}~~~~~~~}}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}~~~~~~~~~~~~}~~~~~~~~}}~}~~}~~~~~~~~}~~~}~~}}}}}}}}~}}}}}s}s}}}}}}}rv}}}}}|}}}}}}vp}~|}}p}}}p|||pv}|v|}vrv}}pppp|}pp|}pvv|vpp||vv|v|vppvppppppvpppoppvppppppoppplpppoovpppllpopplollpoloopllpvlllllllllllllolClllllCCllllllCllllCllCCClllC>ClC?CCllC>CCCCC??C>>CCC>?>>CC>=>>C>>C>=>C>=>>>>>==?>==>=>>>===>>=======>===>=======$===$=========$$==$!==$$!=!!$$!!$!9=!!!=!!!!!!$!!$!!!!!!! !!!!!!!!!!!!!!!!!!! jsӔ                                                                                                                                                                                                                                                                                                               @򬢏~~~}}}}}~}}}~~~}}}}~}}}}}}}~~}~~}}~~}}~~}~~~}~~}~}~~~~~~~~~~~}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}~~~~~~~}~~}}~~}~~~}~~~~~~~}r}}}}}}~}}~~}}}}|}~~}}|}}|}r|}}}}~s|}~pp}~vr}pp|}}ppvp}}p}}}vv}|pp}vpv||v|v|pp|ppv|}|pppppppppvv|pppppppppppovvpppoopppppllpppololllvpllllllloppooollllllpllpllCllClllllCClllllllllCCCCClCCC?CC?llCCllCl?>?C>CC?>>>>>ll?>>ClC>>=?CC>>>>>CC>>>C>>=>=>>=>=>>=====>========>===========$==$$==$====$!===!!$!!$===$!!!$!!$$!!!!$!!!$!!!$!!!!!!!$!!!!!!!!!!!!!!!!!!!!!!!! !?qx                                                                                                                                                                                                                                                                                                            몢}}~}}~~}~}}~~~~}}~~~~~}~~~~~~}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}~}~}~~~~~~~~}~~~~}}~~~}}~~}}}}~}~}~~}}}}}~}~~}}~~r}~|}~~}r}}}}}v~~}|}}}p}}}p}}|}v|}||||v}}|pp}|}r}}vp}}pprvv}|}ppvp||vppvppppp|vppvp|vp|pppppppppppppollpvppolppppoopolpolpppllpplplplllllllllllolllllllpollCllllllllCC?CClCClllCC??ClC?CCllC?CCCCC??CC>>CC>>?>CCC?>?>?>=>>?C>>>>>=>>>=>==>>>>==>=>>====>>======>==$============$====$=!$$$=$==$$$=!$==$!$!$!$!$=$!!!!!!!!!!!!!!!$!!! !!!!!!!! !!!!!!!! !!oٝB                                                                                                                                                                                                                                                                                                  ]楒}}~}}}~}~~}~}~~}~~~~~~~}}}~}}~}~~~}~~~~~~~~~~~~~~~~~~~~~~~}}~}~}}~~~}~~}~~}~}~~~~}}~~~}~~}}}~~}~~~}~}}}}}|}}~}}s}~~~~}}~}}v}}}|}}||}}r}}}~}}}}}pr}}pp}r}}}}|vpr}}}p}|vpv}}}pp|}}}vpvvr}p}pp||pppppppppppp||vp}vppvpopopvvplllpplpppplpppvppoppplllppvppvpollllllllllllllllllpllpolllllolCCllCCl??CC?CClllCCCCCC??CCCCCCCClClC?>>>C?>>>CCCClC>>>>>=CCC>>?==>>>?>>>=CAC>=>=>A>>=>>>=>=======>====>===>>======$=!!=!=!$=$$==!==!===$!!$=$!===$=$!$!!!!!!!!=!!!!!!!!!! ! !!!!!!! !lӔ                                                                                                                                                                                                                                                                                                          ;檏}~~}}~~}~~}}}~}~~}~}}~~~}~~~~~~~}~~~~}}~~~~~~~~~}~~~~~~~~~~~~~~~~}~~~~~}}~~~~~~~~~~~}~~~~~~~~~~~~~~~~~~~}}~~~~}}}}}}~}}}~~}~}}}}|}~}}}}}}}}}v}rv}r}}}}}}}}}}}}v}}p}p|~}rv}}pp||||pp}}}|pp|pvvv}ppv}pppv|pv|vppppppvvpppppopppppoppplppppplppploppooppllpplplppplllplllolllllllllllolplllCllloolCllCllCllllllllC?CCC?CCClCCCCC?C?ClC>?>>CC>>>>>>CC>=?C?C>>?>>>>>>C>=>>==>>=>=>=>=>========>=======>=!==========!====$$$=====!!==$$!!==$$!!$=$!=!!!!!=!!!$!!!!!!!!!!!! !!! !!!!!!!!!!!!! ?s]                                                                                                                                                                                                                                                                                         䪏}}~}}~~~}}}}}}}}}}}}~~~}~}}}}~~}~~}}~}~~~~}~}~~~~~~~~}~~~}~~~~~~~~~~~~~~~~~~~~~~~~~}}~~~~~~}}}~~}~}~}~~}}}~}~~~}}}}~}}~}~~}s}}||}}s}}}}}}r}}}}}}|}rp}}}s}}}}}vr}v|}}}}v|p}}ppvv}p||}}||pppppp}ppp|}}|v|v|}|v|ppppvpppvvppp}|poppppppvppppvpplllppopplllllllllpoolllllolloopllllllvvll?Cl?llllCClllllllllllllCC?CllCllC???CC?>>>>>>>CCClC?>?>>=>>>>>CCCA>>?>>>CC>>=>==========>>=>==>=====>>==>====$$=====$$!$==!====!!====!!!!!!==!=$!!$!!!!$!!=!!!!$!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !! !>}ٝ;                                                                                                                                                                                                                                                                                                         Bڢ}~}}~}~}}}~~~}~~}}~~~~}~~}~~~~~}~~~~}}~~~~}~~~~}~~~~~~~~~~~~~~~~~~~~~~~~~}~~~}}~}}~}~~}~}~~}}~~}}}~}~}}~}}}}}}}}}}}}}}}~}}}}}|}}}}}}}}}}}}|}}}}s||p}}}}}||v||v}r}|v||}pp|v}v||}p}pppv}pp|v|vpppppppvpppvpppvvpppvolppvvppoppoopolovplplopplolllllpllopollplllllllllplllllllllCCllllCClllllllllCCClCCCCllCClCCCCC>>>C>?C?CC>C??>>>>?>>>CCA>>C>=>C>=>>>=>C>=>=>==>>===>======>>===>===$=======$=====$===$====$$$$$$$$=$!=!$!!!$!!!!!!$=!!!!!!!!!!!!!!!!!!!! ! !!!!!!  ?sx                                                                                                                                                                                                                                                                                               ڒ~~~~~~~~}~}~~~}}~~~~~}~}}~~}}~}~~~}}~}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}~~~~~}~~~~}~~}~}~~~~~~~~}}}}}~~}~~~}}~~}}}}}}}~}~}}~~}}}|}}~~~~}}~~~~}}~~}}p}~}}}v}}r|vr}~}}}}}}}}p}}|}p}pp}v|}}||pv|}}}}|r}}r}|ppv|ppppp|vppp|}vvpppvpp|vppppplolppplpolloppllovpooppolllppllpollpplllllllllllllllllllllollllllC?lllllllC???ClCC>CllllCCC??>?CCCCC?>>CCCCCC>>?CCC>>>CACCC>>C>=>>=>=CCC>==>>==>=====>C>=>============A>====A====$!$=$==!=====$===!$!$!!!!!$=$!!$=$!!!!!!!=!!!!!!$!!!$!!!! !!!! !!!! =qڞY                                                                                                                                                                                                                                                                                            _楏}}~}}~}}~}}}~}~~~~}}}}~~~}~}~~~~~~~~~~~~~~~~~}~~~~~~~~~~~~~~~~~~}~~~~~~~~~~~~~~~~~~~}~~~}~~}}~~~~~~~~~~~~}}~~}}}~}}~~}}}}~}}}}}}}}~~}}~}}}}}~}}}}}~}}}p}}}v}|}}}|}||}|}|}}p|}|p|}}||}}pp||}}}pvvvv|}vvvpp}vpv|vpppp}|ppppppppv|ppppppplpvppppppppopllpppopopllpplllplllplllllllolllllllllllllllCllllllClllClllCClClCCCCClClCCCCC?ClCCClC?C>?>?CCCC>>Cl?C>>>C>>>>>>>=>>>C>>>CC==AC==?>>C==>>========================$==$=====!!====!!=$$=!!$!!$!$!=$!!!!!!$!!=!!!!!$!!!!!!!!!!!!!!  ! !!!  =s׃                                                                                                                              !                                                                                                                                                                  檟}}}}}|}}}~~~~~~}~~}~~}~~~}~~~~~}~~}}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}~~~~~~~~~~~}~~~~~}~~}~}}}}}~~}}}~~}}r}~~}}~~~~}}~}}}r|}}~}r|}|s}ps}}~}}rv|p}|}}v|pp}vrpv|||vp|}}}v||p}ppppv|ppv|}}|ppv}}}ppppppp}vppppppppvvvvpppppppvvppvpppppppollolopppppplpplllolpplll?lppppllllllolpllClllCllCCClCCCCClllllC?CllllC?CllC?ClCCCClCCCCC>C>?l>>CC?CC>=>=====>C>>>C>A>==>=>>C>>CAC>=======>>>>=>===========$$$!========$!=$!==!==$$===!$$$!$=!!!!!!=!!!!!!!!=!!!!!!!! !! !!!!!! !!  =qZ                                                                                                                               !YT!                                                                                                                                                             檏}}}}}}}}}}~}~~~}}~~~~~~~~~}~~~~~~~~~~~~~~}~~~~~~~~~~~~~}~~~~~~~~~~~~~~~~~~~~~~}~~}~~}}}}~~~}}}~~~}}}}}~}}}~~~}}}}}}|}}~~}}}}}}}}|}r}}}}w|}v}~}s|p}}}pv}}||}||v}|pp}pv||}p}pppp}}prvp|||vrpppppvvpvvppp|pppppppppvpopppppvpoppppppooplpppppoollpolplllvlllllplpllllllllollllllCClllllClCCCClllllC?llllCCCClCC>CCClCCC?ClC>?CC?CCAC?>>?>>>>>>>>>>>>A>==C>=>>>=>>C=>===>=====>>======>=======$$======$$======$$$$!$==!!$=!!$$!$=!$!!!!!!$!!!!!!!!!!!! !!!!!! ! !!    !!!=sٔ                                                                                                                      !Y_T!                                                                                                                                                                  蚏}~}}~~}~}~}}}}~}}~~}}~}}~}}~}}~~~~~~~~~~}~~~~}}}~~~~~~~~~~~~~~~~~~~~~~~~~}}~~~~~~~~}~~}}}~}~~~~~~~~~~}~~}~}~~}}}}}}}~}}~}}~~~~}}rs}~~}}}}}~~}p}}~~~}vv}}}}}r}p}~|vvrp}}p}}}}v|}|pp}|v|vvv|||pp||pppvv|ppppvv|}|vppppppppvppvpoopppppppllppvvplopppovvppolppooooollpopllovooplpllllllllllllllCCll?looollllllllllollllllC??CllCC????ClC>>>>>CC>CC??>>>>>>>>C>>>>>CC>==>>>=>>=>>C==========>==>===>=====>>======!$=======!!!!===$=!!=!$$!!!!===!!!$!!!!$!!!$!===!!!!!!!!!!!!!!!!!! !!!! !!! !!!!!!!!!=}]                                                                                                                           !bZ                                                                                                                                                                  xs~~}}~~}}}~~~}}~~~~}}}~~~~~~~}~~~~~~~~}~~~}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}~~~}~~~}}}}~~~~}~}~~}}~}}}~~}~}~}~}}}}}}}}}}}}}}}s}}~~}}|r}}}}}}}p}~}p}}}p}}}}}|p}v|v}||p}p}}pv|p||vpppv}|ppvppv|vpppp|vppppppp|ppppppppppolppppplpvppppplolppplollplpvlolllloooolllllllllllplllllllCCllllllCCl?lllllClll?ClCCCCCCCCC>CCCC???>>CCC??C>>>>CC>>CC>>>>CC>=>?>>>==>=C=>=>=>====>==>====>=======A====$====>A==$==$=$===$!$==!$!!!$!!$=!!$!!$!!!=!!!!!$!!!! !!!!!!!!!!!!!!!! !!! !!!    ?ڔ                                                                                                                   @_Y@                                                                                                                                                             Տ}}~~}}}~~~}}}}}}}~~~~~}}}}}}}}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}~~~~~~~}}~~}~~~}~~~~}~~~~~}}}~~~~}~~~}}~}~}}}}}~~}}~}~~}}|rv|}|}}}}}}vr}~}~~pv}}}~~}p|}rpps}}~}|}}rpp}}}}|pp|}pp|pv}||}}}vpvppvvpp}pp|p}pvpppvvpppopvvppopppopppppvplppplpllollpppollllllllllllooplllllppolllllllllllCCllllllClCCCCC?ClCCCC??lll?>???CC?>>?CCCCC>?>>CC=>=AC>>>>>===C>>C>>========>A>=>=>>>===>>>==================$$===========!$=====$==$!$$!!$!!!!!==$!!!!!!!!!!!!!!!!!!!!!!!!! !! !!  !oY                                                                                                                            !T                                                                                                                                                       _䢏}s}~~|s~~}~~}}~}~~~}~~}~~}}~~~~}~~~~~}~~~~~~~~~~~~~~~~~~~~~~~~~~~~}~~}}~~~}~~~~~~~~~~}~~~~~~}}}~}~~}~}~}}s}~~}}~}~~}|}}}}~}}|||~~}p}}}~}v}}}}}}||}}}pv}}}}|p}}vp}}}}vp|v|}v||pv}pv}||pprvpppppppppvvvpvpvppppppppvvploopppopppvplpppllpppolplpllpllllllplllpovllllllppolllllllllCllllCllllCllCCCCCCl?CCCCCll??CC?>??>>?CC?CCCC>>?C>=>C>>>>>=>>>?>>>AC==>===>>>>=>==>==>=====>=======>==================$===$$$$$$$$$==$!!$=!!$=$!$!$!!!!!!!! !!!!!!!!!!!!!! !!!!!    !!oك                                                                                                                                                                                                                                                                              襠~}|}~}}~~~~~~~}~~}~~~~~}~}}}~~~}}}~}~}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}~~~~~}~~~~~~~~~~}~}~~~}~~}}~~~~~~~~~}}~~}}~~}}~}}}}}}r}~}}}}}}}}|}}|p}}}}vr}}||}p}}}}}}|}vr}pv}}pp|}r}pv|}}p}}vp}}|pppppvv}}|p|||ppvppv|pppppppppppp|vpppoppppllpolovpllvppvppllopppppllppllpolpllllllCllClllllllClCCCCC>lllClllCCCllCCCllCCC>>ClCCCCCCCCC>>CCCC==>lC>>CC>CC>CCCAC>>>=>=>>CC>>====>===========>A===$$=>===========$9!$====!!!!!$!==!!!!=======!!$!!!!!!!!!!!!!!!$!!!!!!!!!!!!!!!!!! !$qB                                                                                                                                                                                                                                                                                          _}}}}}}~~}~~~}~~~}~~~~~~~}~~}}~~~~~}~~~~~~~~~}~~~~~~~~~~~~~~~~~~~~~}~~~~~~}~~~~~}}~~~}}~~~~~~}~~}}~~}}~~}s}}~~}}}~}|}s}}~}}}}}}r}}|}}}s}}p}}}}}}}|p|vps}|vv}||}pp}}pp|}p|}}p|vvppp|||vpvvppv|vpppppppoppppvvpvppppooppplopolpvpllvvlppllopploplllpoopollllllllllCClllCllolllll?CCCClClllll?ClClClCCCC>?CCCCCCCCCCCC>=CCC?>>?CC>>CC>>C>>C=>C>>>=>>>=>>>==>=>>=====>=====>=============$$$===!=====$$$$!=$==!!=!!=!!===!!!!=!!$!!!$!!$! !$!!$!!!!!!!!!!!!!!!! >ك                                                                                                                                                                                                                                                                            Տ~}}}}~~}}~~}}}~~~}}}~~~}}}~~}}~~~~}~~~}~~~}~~~~~~~~~~~~~~~~~~~~~~~~~}~~~}}~~~~~~~~}~~}~~}}}}}}~~~}}}}}}~}}|}~~~}}}}r}}~~}}}}}}}}v}}~}}}}}}}~}svr}}v}|}|v||}p|pv}vpr}|pp|}pp|}vrpppvppp}}pppppp||vppv}vpvvppppppopooooppolpvpllplllpplllllpllllllppoolvlllllpoolpplplllllllllllllllCCCCCClCCl?>ClC???CC>?C?CllCCC?C?>>>C>>>?>C?=>C>==>C>>>=>>>====>C===>>=>>>>==>==>>====>=>=>================!==!$!$$=====!$$!===$!!!!=!!!!!!=$!!!$$!!!!==!!!!!!!!!!!!!!!!!! ?B                                                                                                                                                                                                                                                                                     _撎}}}}}}~}}}}}}}~~~~~~}}}}~~~~}~~~~~~~}~~~~~}}~~~~~~~~~~~~~~~~~}~~~~~~~~~~}~}}~~}~~~~~~}~}~}~}~~}}~~}}~~}}~}}}~}}}}}}}~}}}~}}}}}r}}}}}}r}}}|v~|vp}}vv||||}}pp}}p}vvvpp}||v}|vvpp}pppv|}pppppv||vppppvvppvpppppppolopploppppllpollppppllppllllllppoloplllllpoloopllollllCllllllllllllCCllCCCCClClC?CCC?C??CCCCC?C?CC>>CC>?>>CC>>>>>>>C>>>>>=>=>>>C>==>>>>>C====>>==>>======>=>$=============$$==$$====!==$$!=$$$==!$!!!$=!$!!!!!$!!!!!!!!!!!!$!!!!!!!!!!!! !!!! oz                                                                                                                                                                                                                                                                                }}}~~}}}~~~~~~~~~~~~~}}~~}}~}}~~~~~}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}~~~~~}~~~}~}~~~~~}}}~~~}~}}~}r}~~~~~|}s}}}~~}}}}vr}}s}~}}}}}}}|~}vrp}|}}}rp}}pp}v||}}}vr}}}}pp|vppvpv}}|}v|pp|pppvpvppvppppppppvpppppvvppppvvvppppppppppppppllolopplpvpollllllolllllllllllClllllllCCC??>llllllllllC?CCllllCCCCCCCCC?CCCCC?ClC>>>?CC>>>C?>C>CCCC?CCCC>>>>>==>=>C>=>A>==>=>C>==A>>>======$=====$===$$=======$$====!!!=$!!!!!!!==$!$!!==$==!!!=$!!!!!!!!!!!!=!!! !!!!!!!!!!       =@                                                                                                                                                                                                                                                                                  ;䢏}}}~~}}}~~}}}~~~~~~~~~~}}~~~~~~~~}~}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}~~~~~~~~~~}~~}}}~~}}~~~}}}}~~}}}}}~~}}}}}~~}}~}~}}}}}}~~}}|}}}s|}}|vv|}}}||}p|v|}p}}|}|}vv}}|vv||pp||}|v}vpppp|}ppp||pppppp|vvpppvpppppppplv}pppvvplpppplpvppolpllpooppplloolllolloplllllollClolll?llllCCllC?llClllCCC?ClClCll?ClC????CClC?ClCC?>>?C>>>C>?>?CCC>>C?AC>>>A>>==>>C>=A>>=>==>>===>=A=========>=>=$===$=============!=!$==!!$$$!$=$!!$$!!==!!=!!==!!!!!!!!!!!=!!!!!!!!!!!!! ! ! j_                                                                                                                                                                                                                                                                     z襟~~~}~~~~~~}~}}}}}}}}}~}~~~~~}}~}}~~}}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}~~~~~~~}}~~~~~~~~~}~~}}}}}}~~}}~}}}~~}~~}}}}}}}}}}|}}}}}}r}|}}r}}}}}}v}}}|s}}}}}}pp}}}pppp}}}}pvv||vppp}ppvp}}pp}vpp|pppppppplppvvvvppplovplppllpppppllpppppvplopollllllollovollpplollllClpllllllllllllll?llllCClllClllllll??CC?CCCCCC?>>CC?CCC??>CCC>>>>=>>=>>==>>>>>>>>=A>CC==>C>=======>>>>=$=A>=========$==$$====!======$==$!!=$$==$!==$!=$!!!!!!=!!!!!!!!!=$!!!!!!!$!!!!! !! qڔ!                                                                                                                                                                                                                                                                    ӟ}}~~}}}~~~}}~}}~~}~}}~}~}~~~}~}~~}~~~~~}~~~~~}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}~}~~~~~~~~}}~~}~~}}}~}}~}~~~~}~}}s|}}~~}s}r}}}~}}v}}||}}}}}p~}}}||}}|}}}pp}}|pp}p|}}|}pp||vvp||pp||v}p|vppp|pppppvpppp|pppppppppppoppoooppppllloopvvllppollplplplllpollopoolllllloollllllllllllllCCllllCCCClllllllCCCCClC?lCCC>>Cl>CC?>>CCCC>>?=>?>>>=>>>>A=>>A==CC>>====?>===C===>>====C======$==$================!=$!=$$=$$!=$$!!$=$$!!!!!$!!!!!!!==!!!!! ! !!!$!!!!!! ! !   =B                                                                                                                                                                                                                                                                                      @撏s}}}~~}}~}~}}~}~~~~~}~~}}~~}~~~~~~~~~~~~~~}}~~~~~~~~~~~~~~~~~~~~}~}~~~}~~~~}}}}}~~~~}}~~}}~}}}}~}}}}}}}|}~~}~~}}}}}}~s|}~}}}}|pspv}|p}}p}}}}p}rp|vrv}|ppppp}}ppv|}}vvrv}pvpppp|pvv|v|p|vvvpvvppppppoppvpppvvpppoppppplllplllpppoppoplll?lplllllllllllllllllollllCllC>?lCClllllllCClCCC>?CC?CC>?CC??CC>C?>>?CC?>C>>>>?>>C>CC>C?=>>==>>=>l>=>=>>=>C>============>================$=====$$!!=!==!===$!==$$$!!!!!=$!!!!!!$!$!!!!!!!!$!!!!!!!!! !! !!!!!!! ! !! ! $pz                                                                                                                                                                                                                                                              }}}}}~~}}~}}}~~}~}~~}}~~~}~~~~~~~~~~}~}~~~~~~~~~~~~~~~~}~~~~~~}}}~~}~~}~~}}~~}}}~~~}}~~}}}}}r~~}}}}}}}~}}}~}}~~}}}}}p~~}v}}|p|}}p||}}p|}}}pp}v}|vvv|pppp}}}ppp|}vpp}}pvrvpppp}|pvvpvpv|vvpppppopoopppppv}ppvppop}vllololllllpppopplllllllllllCllllllCllllllllllllClCCCCllllllC?lCCCCC?lC>CC?CC?>CCCC>?>>>>C?>>??>>?>>>>CCCC=>>>>>A>=>C>=?>>>>=>>===>>=====================>==$======$$===!$!====$=$!=!!!$!$!=!!!!!!!$!!!!!!!!!!!!!! !!!!! !!!!!!!! !!!!!  =ڛ;                                                                                                                                                                                                                                                           梏}~~}s}}~}}~~}}}~~~~~}~~~~~}~~~~}~~~}~~~~~~~~~~~~~~~~~~~~~~~~~~~}~~~~~~~~~~~~~~}~}~}}~~}|}~~~~~}}}}}}}s}}~~s}}}}|}}}|~~}p}}}p}}}|}}|}vrv}rp}}rpp}}}}}}}}r}||}pp|pp}}pv|vvvvpp}pp}}vp|vrvppppppvvpppppvvpoloppllpollppllppppppolollllplpopplplplllloopollllllCCllClllllllllllClClC??llllCCllCCCCll??lCClCCCC>>?C>>?CC=>?CCCC>>>=?>>C?CC>=>>>===>>===>>==A>=>>>===>================$==$!==$==$$==!!!$!==!$$=$=$=!!!$!$=!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!    !lY                                                                                                                                                                                                                                                     ]}~}}}}~}}~~}}~~~~}}}~~}~~~~}~~~}~}~~~~~~~~~~~~~~}~}}}}~~~~~~~~~~~~}~~}~~}}~}~}}}~}~~}}}~~}|}~}}}}}}pp}}}}~~}}}rv|~}}~}p}}|vv}}vv|pvv}}}}}||}}v|v}}vprvp|vpr}vp|vp|}}|||vv||vpvppppp|vpppppppoooopplloollppoppppploolllollloooollllopllloollllllol?lllCllllloolllll?llCCCllllCCllCl?Cll>?CCClCCC>>>?>>>CC>=>CC>CC>>==?=>CC>C>>>C===>======>==>>C>>=A=>=>>========!$=====$=$!$$===$$==!!==$===$=!!$==!$!!!=!!!!!!!!$!!!!!!!!!!!!!!!!!!!!!!!    9s{                                                                                                                                                                                                                                                                    ~}}~}~~~~~~}~~}}~~~~~}~}}~}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}~~}~~~~~~~~~~}}~~~~~}~~~}~~~~~~~}}~~}~~}}}~~}}~}|~~~}}}}~~}r}}}r}}}v}}}}|}}~}}}~}}}}}}}}}}}}}pp}}}}pp}}}~|v}}}}vvvv|pv||ppppppppvvpppppvppppvvvppppppvpppppvvpppopvppopololpplvppvppolplllolllpplllllllplllllCllllllC?CllCCCllllCC?>llC?>>ClC>CllCC>??CCCllCCll>=CC>=>C>>C?>>>l>==>=>>=>>>=>>>>>==>==================>===>===$!=====!===!===!$==!!!!==!!=!!!!!!!==$!$!!$!!!!!!!!!!!!!!!!!!!!!!!!!  !!   !?ߞ;                                                                                                                                                                                                                                              "ՠ}~~~}}~~~}}}~}}~}}~~~}}~~}}~~~~}~}~~}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}~}~~~~}}~~}}~~~~~}}~~}~~}}}~}}~}}}~}}}s}~~}|}}rv}}}|}|}}}}}|}}}}}}~}~}r}}}}prvr}|}rp}||}}}}}}|vpppp|}}|vpp|vppppvpppppppvppppvppplpvvppopopvv|pllpvpoopoplplllpvppplllplllpolollllpllCloolClCllllCClClCClllClllC?>?CllA>>?ClC>?lllCCCCCCCCCClC?>>Cl>==?>=CC>CC>A>====>==>>=>==CA==C>=======>===$=============$$====$!$=$=!=======!$=$$!!$!!!!!!!=!!$!!!!!!!$!!!!!!!!!!!!!!!!!!!!!!!!   =]                                                                                                                                                                                                                                            Z蒏}}~}}}~}}}~~}~}~~}~}~~~~}}~~~~}~~~}~~}~}~}~~~~~~~~~~~~~~~~~~~~}~~}~~~~}~~~}}~~~~}}~~~}~}}}~~~~}}}~}}}}}~}~}}}}}r}}}}r}}r}}}}}}||vvvr}}}}vvvppv}vvrpp}||ppv|||}|pppv|vp|vppppv|v|pvpppppvvvppppp}poploopvppvoppolloopppplppllplolloplClvllllllloollllllllollllllllllCClCCllCCllClCCC?ClClC>?CCCCCC?C>>>>CC>>C>?C?>ClC>>C>C>=>>C=>C>>=>>>>==>>=======A=========C>=====$=========$=======!$!=!!=$$!$$!$==!$$$$$!!!$!!!!!!!!!$!!!!!!!!!!!!!!!!!!  !! !! oz                                                                                                                                                                                                                                         s}}}~}}}}}}~~~}~}}~~~~~~~}~~~~~}~~~}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}~~~~~~~~~}~~}}}~}~~~~~}~~~~~~}}}}}~}~}~}}~}~}}}~}}}}}~}}~}}rw}~}~}v}}}}p}}vp|v}}}}v}|vrvvp}}vpvpv}}|pp|}|v}vpppp|ppppppv|||vp}}pppvpp||ppvppvplopplppovpppplllplolppoppolllplllplloploll?lllppolllllloolCllolllllC?ClllCllllCCCCCCCCCCCC?>>CC?>>>>>>CC>>C>>>>>>lC>>=>C>==>C=>CA====>>===========>======AC>A>======$$=====$!!$==$====$$$!!$!$=!$==$===!=!!!!!!$!!!!!!!!!!!!!!!!!!!!!!!!!  !   ! 9sڛ9                                                                                                                                                                                                                                       ~~~~}}}~}}~~~}~~~}}~~~}~}~~}~~~}}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}~~}}~~}~~}}}~~~~~~~}~r}~~}~~}}}}~~}}}~~}}}v}}}}}r}}}}}~}pp}}}}|}}}|}|r}|}}}v||ppvp}pp}|ppp}}|vrp}pp|v}|pppppvppv}pop|popp|}vpppolpppppllppppppllppppppllopllpplllllpllolllllllllllllllClllllClllllllClCCCC>?ClllCClCllClCCCC???>C>CC>?CCC>C>CC>>>=>C>>>>>==C>>>>>>>=>=>>>>=>=>>===>>========================$!===$$$$$===!!!!$!!!=!!!$=!!!$!!$=!!$!!!!$!!!!!!! !!!!!!!  !!!!! !  oB                                                                                                                                                                                                                                                        ;䠡~~~~}}~}}~}~}}~~~~~}}}~~~~}}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}~~~~~~~}}}}~~}~~~~~~}}}~~~~~~}}}}}}~~~}}~~}~~}}~}}}}||}}}}}}vp}~}r|}rv}}}}}p}}}}}}}}}}ppprppvpp|vprv|pppv}vppp|v|vpllp}|pvvpppv|ppp}}vpppplppppollppvvvpllppvvppllpllpploplloplppllllClllpll?llllllllllllllpoC??ClC???Cllll>CCClllCllC?>?C>>CC>>CCC>?CC>=>>>C>>>AC>==>C>A>>>=====?C=>=>=====>>========$$=>===$$=!======$=$!!$=$!==!!!!$$=!$!!!===!!$!!!!$$$$=!!!!!!!!!!!!!!! ! !!!!! !!      =Z                                                                                                                                                                                                                                               ]~}}}}~}}}~~~~~}}~}}~~~~~~~}}~}}~~~~~~~~~~~~~~~~~~~~~~~~~}~~}~~~~~~}~}~~~}~~}~~}}~~}}}}}~}~}}}}}}~}}}}}}}}r}~}}}}}s}}}p|}}}}~}s}||}||vvvr||}|p}}|vr}p}}}v}}pvpp}}ppv|ppp||vvvp|ppppppppppoppppvvppppopllpppopvooploolppollopllovollllplllpllClllplllllllllCllCllClllCllllllC>>?ClllC??CC>>>?>CCCCCCl>>CC>>>>?C>>AC>=>=>C>=>>>=>>>=>A>>=>>>===>=>A>=========================$$===$$==$====$$!!!$$!$!!=!!$!$!!!!!!!$!!!!! !!!!!!!!!!! !!!!!!!! $sك                                                                                                                                                                                                                                      菎}}}r}}}}}~~}~~~}}~~~~~}}}~}}~~~~~~~~~~~~~~~~~~~~~~~~}~~~~}~~~}~}~~}~~~}~}}~~~~~}~}}}~~|}~~~~~}~~}}~}}}r}}}}}~}}s}r}~|p}s~}}}~}}p|}}}||v|vv|vpp}}|vv|vprv|||ppprvpv|prvpp|}}ppv}vppppoopvppppllp|plppppopppplpplpplpolpplllllllpoppolllllvplljlllpolClllllClllCCCCCClCllllllC>ClCClCC>>CC>>>>?>?ClCClC>>?>=>>>C>CC>C====>===>>>>=>>?>A>>=====>==>CA=>=?==$$=>>A===$=========$====!==$!!===$==!!$!!!!!=$!$!=!!!!!$!!!!!!!! !!!!!!!! !!!! !!!  ?!                                                                                                                                                                                                                                                   䏏~}}}}}~~~}}~}~}~~~~~~~~~~~}}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}~~~~~~}}~~}~~~~}}}~~}~~~~~}}}}}}s}~}}}}|}~}p}}}}~}}|}|p}}}}||}|}}}}pp}|}p}}|}}vv}|p}}}|v}|v|p}vvpv}}vvv|ppvvppv|pppppppppppvpppvpppppppppoollvpplolpvllllopppoolllolllllpllllllllllllllllllllllllCCCClClC?lllCCllCCCCCCCC>CCCCC?>>CC>?>??C>C?>lC>>=>>>>>C>>>C>>>>==>>>>C>=>>=>===>=======================$!====$===$=$!$$$!!===!!$$$$!!$!!!!!$!$!!!!!!!!!!!!!!!! !!!!!!!! !!!!!!  ! =@                                                                                                                                                                                                                           B}s}}}~~}~}}~~~~~~}}}~~}~~~}}}~~~~~~~~}}~~~~~~~~~~~~~~~~~~~~~~~~}}~}~}}}~~~}~}}~~}~~}}~~}}~~}}}}}}}~}}}}|}p}}~}|pp||}p}}rv}}}prpp}}ppr|}pv|pp||v}}}v}}pvp|vvpp|}}pppv|pppppv|ppppp|vpolopopppppvppvvvppoooppollplpllllllppllllllllllpplllllollCClllolllllllllCll?ClCCC??CCCClll??lC>>>>?Cl?C?>>CC??C>>>>C?>>>>>=>=?>C>>>C>======C>>CC>=>=========>>==========$=====$=$==$=======$$$!$==!!===$==!!!$!!$!!!=!=!!!$!!!!!$!!!!!!!!!!=!!!!!!!!!!!!!!!!   !!q]                                                                                                                                                                                                                                   x鏏}~~~~~~~}}}~~}}~}~~~~~~~~~}~~~~~~~}~~~~~~~~~~~}~~~~~~~~~~~~~~~~~~~~}}~~}~}}~~}}~}}}}}~s}}~s|~}}}}~}}}}}}}}~|}}}}}}}vp}}|v}}}r}|}}}}}vs}}vr}|}ppp}}rv||||vp}|ppppv|vvppv|pvpvpppppppppvpppoplppoppppppoppppvllooopoloppplllllllllplllllolllllllllllCCllllllCCllllCCCClll?ClC?CCCClCCll>??>ll>>?CC=CC>CCCCA>C>CC>A>CA>=>>>>>>>===>===>>==>=>>==========>=======$========$===!==$!!!$==$$!$=$$$$!!!$$!=$!!!=!!!!!!!!!!!!!!!!!!! !!! !!! ?ڔ                                                                                                                                                                                                                                            ڟ~~}}~~~~}}~}}~~~~~}~~~~~~~~~~~}~~~~~}}~}~~~~~~~~~~~~~~~~~~~~~~~~}~~~}}}~~}}~~}|}}}~}}~}}}}}}}}}r}~}}}}}}}~}r}}}}}~}s|}~}}r}}~}}}}p}}}}}}~}w}}}}}|}|pv}|}}|ppp|}}}v|}}}}vp||pppv|vpppvvp|p|vplppv}v|vvvpplllllpoppppovvpvplpplpplovolollllllppoolllloppplll>llllC?lllllllllllC?CClllC>???CCCllC??CClC>>CC>>CC>CC>>CC>>>>>CCC>>>C>====ACCA=>=========>>>>>=======>==========$$=========$!$=$!$===$!!==!!!=!$$!!==!!!!$!!!!!!!!$!!!!!!!!!! !! !!   =!                                                                                                                                                                                                                                             ~}}~~}~}~~~}~~}}~~~}~~~~~~}}}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}~~~}~}~~~~}~}}~}}~~}}~~}}}}~}s}}}}}r}~}|}~}}}|r}}}}}~v|}}pp|}r}}}|p}|||v}||vpv}|pv|}pvpv||ppppv|ppp|ppppv}ppppp}pppppvpppppppooppllvvlpllpvllolopollplllllvllllllloollllllllllllllllllllllCClllllCCCCCCllCCCC?CCCCl>>ll>>??CC?>C>>>>>C=>l?=>>A>>>>>=>>>=>C====>>>==>===>=======>=========$=A======!===$===!==!$$$!=$!!$!$$!!==!=$!!!!!!!$!!!!!!!!!!!!!!!!!!! ! ! !!9q;                                                                                                                                                                                                                                 }}~~}~~}~~~~~~~~}}~~~}~~~~~~~~~~}~~~~~~~~~~~~~~~~~~~~~~~~~}}}}~~~}}~~~~~~~}}~~}~}~~}~~}}~~~~}}}}~~~~~}rv}~}}r}}~~}~}}}}|}}}}}}pp}pp||pp|pp|}r}}}vppp|}}}pppppvvpppp}}v|}vpp|}}||vpolppopvpppplloloop|vpooplppllpploloppopplpplllpolppllllllllllpplllplllllllllCC?Clll?ClollC?ClC>?llC>CllCCl?>llCllCC??ll>CCC>>>CC==>>>=>>>>>C>=>===CC===?>=======>A>>=====>>============!!$!!===!$!!$=$!!!!=$$!$!$!!$!!!!$=!!!!!!$$!=!!!!$!!!!!! !!!!!!!! !! ! !!!!!!    oY                                                                                                                                                                                                                               ;}}~~}}~}}~~~~~~}}~~~~~~~~}~~~~~~~}~~~~~~~~~~~~}~~~~~~~~~~~~}~~~~~}~~}~~~}}~}~}~~}}}}}}}}~}}}}}}p}}}}}}}}vr}|}s~}}|}}|}}p}}}}vv}}|p}}|v}}}|v|p}|pppp}|ppv|ppppvvppvppppppppvpppppppppvpppopppppolppopplppplploplllpollppllllllpollllllClllllllllllCClllCClllC>CllClCCll?ClC>>lCC>CCCCCC>>>C?>AC>>?>>>>>>>C=>C>>>>=>>>=>A=>>?=>===>===>=============$=>==========$======$=$!====!!!=$=$!$=$!!!!!$!!!!!!!!!!$!!!!!!!!!!!!$!!!!!!! !  ?]                                                                                                                                                                                                                                              Zڏ}}}~}}}}~}}}~~}}}}~~}~~}~~~~~~~~~~~~~~~~~~~~~~~~~~~}~~~~~~}}~}}}}~~}}}}}~~~~}~~}}~~~}}r}}}}}}~}}|p|}|v|}}s}svv|v|}~}}}}}}}}}}}}}|p|p|}}}}}}r}}}~}pp|pp|pppppppppppvpppp|vvpoopppplp}}pvvolplopolpppolvploppllllppopolollopoplppllpllCCCClloppolllllllCClCCllCCCCllolllCCCCCCCC>>C?>>>CC>>>=>C>>>>>>>CCCCCCC>C>>>>=>>>>C==>=>>>>>==>>==>===>>==>==$====!====$==!$======$====!===!!$!!=====$$=$!!==!!!!!!!!!!!!!!!!!!!!!!!!  !!!! !=}z                                                                                                                                                                                                                                                         x}~}}}}~~}~}}}~~}}~~}~~~~~~}~~~~~~~~}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}~}}~}}~}~~~~}}}}}~}}}r~}v}}}~}}}}r|}}}}}}}}}r}}}r}}sp}|}}}}}p}pvrv|vv|v|pv}}|vv|pvpp|vpp|vv|ppv|pppoppvvpop}vlpvpopppppplvvllpvllppplloooopollplllplllpplllllllllllllolClllllllClllllCClllClCll?C?CC?CCC?ll>>ClC>>>Cl>>?????CC>C>?=>?>=>>=C>==>>>>>A==>>===>>==>=====================$=====$$$==$===!$!$=$$$$$!!=$!!!!!!!==!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!! !pڔ                                                                                                                                                                                                                                            s}~~}~}}}}}~~~~~~~~~~~}}}~~~~~~}~~~~~~~~~~~~~~~~~}~~~}~~~~}~}~~~}}}}~~~~}}}~}}}}}}}~~}~~|p}~~}}}|}~}~|}}}p}~}}}}}r}}}spp}}pr}}|p|}rv|prvvp}rvv|}}ppp|}}pp|}~}}|vp}pppppvvpp|}|vpp}}}}p}}olppplpvvvpvopplloppppplpvvpoppollpvllll?ClllllllllllllClllCCllllllllllllCC??>CCllll>CCCCCllllll>>>>>CC?CC>>CClC>=C>====>=>>>=ACA>CCC>>>===CC==>>A>>>A>=============!$$=======C=$=$!==!!!$=======!!$!!!$$!!!!$!!!!!!!!!!!!!!!!!!!!!!!!!!!  j                                                                                                                                                                                                                         ~}~~}~~~}~~}~~~}~~}~}~}~~~}~~~~~~~~~~~~~~~~~~~~~}~}~~}~~~~}~~~~}~~}}~~}}}}}~}}}~}v~~}}r}~}p}}}}}}}vp}}}}}}|}}}|}}p}v}}}v|r}v}||p}}}ppv|v|pp}}pp||vv|vppv|ppppvvpov}pppppvpppoplpppppppppplpppvloolpploolollppllplllllolllllllllllllllllllllllllCCCllCCCClCllCCClCCCCCCllA?CC>>Cl>>>>CCCC>>>C>?>=>C>>>>>>>>>>=>=>=>==>>>==>========>======================$===$$!=$=!$!$===$$$!!$!!!$!!!!!!$!$!!!!!!!!!!!!!!!!!!!!! !!!! !     ?9                                                                                                                                                                                                     揎~~}}}}}}}}~}~~~~~~~~~~~}~~~}~~~~~~~~~~~~~}}~~~~}~~}}}~~}}}~~}}~~~}}}~|}}~~~}}~}}~~}}}}|}~ps}}}r}}|}~}~rvv}}p}}}}}}}}}}vvvpv|pp|pp}}pp|}vppppp|}}}}vpppp||ppppp|vppvoop}}}v|plolllpvvvvvollllllllplllllllllllopvvpppllllpllCClll?lllllClCCC>CC??Cll?CllCC>ClCC>>?>>>CC>ClllCllC>?ClC>>C>>C>ClC>ClCCC>CC====>>>>>=>==>>=========>===>====>>=========!=9$$====!$===!!$!!!!==!!$!!$==$!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!! !!   ! =B                                                                                                                                                                                                                 9ڏ~}~}~}}~}~}~~~~~~~~~}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}~~~~~}~~}~~}}~}}}}}~~~}}}~}~}~~}|}}}}}}}|}}}~}|}}~vv}}}}}}rp}|}~pp|r|}|||v|v|}}pp||pv}}ppppvvp|pvv|ppppvppvvvpppvpoppp}pppopppllvpppvpolllppolpvlllopplllllplloolllolllllllllllCllllClllCCClClllllCCCClCll?CCCCCCCll?C?CClCCC>?CCC>=>>>C>>A?>=>>>?>>>>=>=>=>>>=>C=====>>======>===A===================!====!=====$!$!!==!!!!$!!!=!!!$$!!!!!!!!!!!!!!!!!!!!!!!!!! ! !  =s]                                                                                                                                                                                                       B~}}~~~}~}}}}}~~~}}}~~~}}}~~~~}}~~~~~~~~~~~~~~~~~~~~~~~~~~~}}~}}~~}~~}}}}}~~}~~}}}}|}~r}}}}}}}}}~}~~~}p}}}||}}|p}}}}~}}vvvrv}|v|}}}}}||pp|}}|p}}vp}}}|}}|pvppp|}|||pppv|ppppppploopoolllv|pppplllp|ppppvppllvolpvppplllpvolllllllpplllllpll?lllvllllClollllllllC?ClCCllC>?llC??>>>>>CCC>>>>CC>Cl=>>=CCC=>C>>==>?>>>>===>>>>>llA===>>=======>=====$==!====$$$=======$!!=$$$=!!$=====$=!!==!$$!!!$!!!!!!!!!!!!!!!!!!!!  !!!!!!!!!!!!!=q]                                                                                                                                                                                     ]~~~~}~~~~}}~~~~~~}~~~~~~~~~~~~~~~~~~~~~~}~~~~~~~~~~~~~~~~~~~~~~}~~}~~~~}}}~~}}}~~}~s}}}}~}}}}~}}s}}}}~~}~}}|}}}}}}}}}}}r}}}|}}wv|v}p}}|vӞӞҞʞǞʞǞǞǞǞǞǞǞǞǞǞǞǞƞǞǝǞxZ=!!!$$!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !oك                                                                                                                                                                                                      z}}}}~}}~}~~~}}~}~~~~~~}}}}~~~~}~~~}~}~~}}~~~~~}~~~~~~~}~~~~~~~~}~}~~~~~~~}~~~}~}}~}}s}r}~}}r}v|}s}}|}~~}}}}rv}}~}p}}r}}}}}}}}px======!!$$!!!!$!!!!!!!!! !!!!!!!!!!! !jك                                                                                                                                                                                                                        z}s}}~~}~~~~~}~~}~~~~~~~}}~~~~~~~~~~}~~~~~~~~~~~~~~~}~~~}~~}~~}}~~}~}}~~}}}}}|}}}}~~}}}|}r}}}~}r}}}}|}}}v~}}}vv}}}r}wr}}|ς=$!!=!=!!!!!!!!!! !!!! !! ! !?ڔ                                                                                                                                                                                                    {뎏}}}s}~}}}~~~~}}~~}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}~}~~~~~~~}~~~}~~}}~~}~}~~~~~}}~}}~}}~}~~}~~~}}~~}}}~}|}r}~}}}}}}}}|}rvp|}}}}ppv}}vpv=!!!!=! !!!!!!!!!!!! !!!! !!!  ! ?ژ                                                                                                                                                                                                                  뎎}}~~~~}}}}~~~}~~~~~~~~~~}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}~}}~}~~~}}~}}}}~~}~}~}}}~}}}}~~}~}}}~~|}}}}}}}}r}}}~}}|}v}r}|}pp}}}||v!!!!!!!!!!!!!!!!!!!!!!!      !?ٛ                                                                                                                                                                                                                 柏~~~}~~~}~}~}~}}}~~~~~~~~~~~~}~~~~~~~~~~~~~~}~~~~~~~}~~~~~~~}}}}~~}}}}~}~~~}}}~}}r}}}}}}}}~}v}}~~}}s|}}~}}}r}}}}}}}}v|p}}r}}}!!!!!!!!!!! !!! !!!!!!! =                                                                                                                                                                                                                 ꠏ~~}}~~~~}}~~}}}~}~~~~~~~~~~~~~~~~~~}~~~~~~~~~}~~~~~~~}~~}}~~}}}~~}}}~~}~~}}}}}}~}}}}}p}~}}}r}}}}~}}}}}}}r}}}pvr}}|w}||}[!!!!!!!!!!!!! !!! ! !! 7ڞ                                                                                                                                                                                                                             䏏}}~~}}~~}}~~~~~}}~~~~~~~B!!!!$!!!!!!!!! !!!!!!!! !!! =s                                                                                                                                                                                                         ڏ~}~~}~~~~}~~~~~~~~~~~~~~~~~~~~~~}}}}}}||ppp|}v|}}|pv|vv|vpvpppv|vv}vpppppp}}ppop|pllppllllopllopppppolpvolllpvvppllllvlllllllllllollllllCllCCClllC?llCClCCll?>ClCClC?CllC?lCClllCC??>lC?C??=>l>?>>C>CC>=>>>>?>=>>Cl>>===>>===>>==>==========@=9$9==============$!9!====$!!!!!!!!=!!!$$=Zx_$!$!!!!!!!!!!!! ! !!!!!   ! =s                                                                                                                                                                                                                   䠏s}}~}}}~~}~~}}~~~~~~~}~}~~~~}~~~ppvppp}}|v}}vpppppp|vvrv|vvvv|pppvvppvvvppvppvpp|vop}vpvvvppplpolllppllpllpllplllllllpplllllllllllplCllllollllllllllllll?Clllll>???C?>CCCCCC?>>CC??>CC>>>>CC>ll??>C>=?l>>CCC>==>>CA=?>=A>>>>===C>>=>A>========$========!$===========!!!====$=$=!9=!!==!!!$==!_!!!!!!!!!! ! !!! !!!   s                                                                                                                                                                                                                             ֏s}~}}}}}}~}}}~~~~~~~~~~~~~~~v}|pppvpv}}|ppv}ppppp|}||pv|||pppppppv|vpppopvvvpplpvvvvpppppollppllvopplollloolpppllplllllollllClplClollpplllCCllllllCCllllll>?Cl??C?>?llC??C?lCC?>?l>C>>Cl>AC>>CC>>>ClC>>A>=>=>>A>>?=>=>AC?==>C>=>C===>>=============$$=======$!=====!===!!$$!!==!!=!!$!@=$!Z!!!!!!!!!!!!!!! !!!  !q                                                                                                                                                                                                                                 ֎}~}~~~~}~~}~~~~~}~~}~~~~~~~~~~~~~}~}}}}}v||pv|||}vp}}|}vpppppppp||vvvppppppvpvppoopppvppppppllpvppplllopvppplpplllllllpooplllpolllllllopCClpllllllllllC>ClllClC?Col?CllC?CC>ClCC>>?CClCC>>=?lC>>=>C>>>>=>?=>>>>>>=>>>==>A>=>=>=======>============>>=======!!=====$====$!!==$===$$$!!==!!!!=!!!!$=Y@!!!!!!!! !!!!!!!! !!!! $q                                                                                                                                                                                                                       Ԏ~}~}~}}}~~~}~~~~~~}}~~~}~~~~~~}}}}|rvrp|}v|p}vrvvp}}ppvpppoppvvvv|}ppvpppp|vplppppplpppvplllpppllloopvppplllllllpllplovlllpllCllllCoollollllllllpllC??Cl?CCl?CCCCllll?>>CllC??>lC>CCCC>CClC>=>>C>=C>>=>CC>=C>=>=>A>=CC==>===================$===A========!$==========$!=!=$==!!!!!=$$!!$!=$!$$!!!_B!! !!!!!!! !!!!!   =}                                                                                                                                                                                   ֏~~}~~}~~~}~}~~~~}}}~~~~~~~~~~~~~}~}~~~~~}}}}}}}}}}}w}}}vvv}}}}}vv}}}}}v}}vv}}vw}vpv}wvvvv}vvvvvvvvvvv}vvvvvuvvvvvvvvvuluvvvuovvvoouuuolovvolluuluulllltllluulllullooolCllCltllCCllllCCCCCCClCCCCCllCoCCCCCAACC@AClCCCACCCCA@CCCCCCC=CCCAA@ACCCCCCA@=@AA@=@>@>@=C=@=@=@==@==@==@=====@>====!=!!!!!!!!!!==@!!!!!!!!!!!!!!!  !!!   =s                                                                                                                                                                            ֎~}}~~}~~}}~~}~~}}}~}~~}~~~~~~~~}~~}~~~~~~ƃxZ@=!!!!!!!=!!=9u=$!!!!!!!! !!!!! ! !!!!!! ! !! =s                                                                                                                                                                              ֏~~}~}~~~~~~}~~~~~~~~季~~~~~~~~~~~}~~~~~~~}}}~}}~}}}}~}|}}}~}}}}}||}}}||}||}}vv}~}v|vv}}}||΂C@=!!!!!!=@!!!!!!! !! !!  p                                                                                                                                                                                 ֠~}~~}~}}~~~~~~~~~~~~~~~~~~~~~ڦ~~~~~~~~~}}~~~}~}~~}~~~}||}}~~~}}}}|}~}}}}~||}~}}|}|}}}p|v}~}||p}}}}}z@$!!$!!9!!!! !!!! !! !!!     $p                                                                                                                                                                 ֠}}}~~}~}~~~~~~~~}~~~~~~~~ܢ~~~~~~~~}~~~~}~~~~~}~}~~}~}~~}}~}}}~~}}}}}}~|}}~}}}}|}~}}}}}}}}}}}}|}}}}}}rvp}x=!!!!!!!$9_!!!!! !!!!! !!!   =}                                                                                                                                                              ֏}~~}~}~~~}}~~}~~~~~}~~~~ګ~~~~~~~~~~~~~}~~~~~}}~~~~}}~}}~~}}}}~~}}}~~}~}}}}}~}~}}}~~~}}}}~r}}~~~}}~}~}p}}|}}}rpvx!!!=$=@!!!!!!! !  !!!! $                                                                                                                                                          ֠}}~~~}}~~~~~~~~~~~}~~~~~~~~}~~~~~~~}~~~~~~}~~~~}}~~~~~}~}}~~}}}}~}}}}}}}}}v|}}}~}}rv}~}}rv}}v|}|=!!!!!!@!!!!! !!!!!!  !q                                                                                                                                                                    ֏~}~~}}}}~}}~}~~~~~}}~~~~~~~~~ꫢ~~~~~~~~~}~~}~~~~}}~~}}}}}}~~~~}~~}||}~s}}}}}|}}}}}}}}}vvp}~}|}r|}}}}}@!!!!]]!!! ! !!!!!!! !! !!!    !  !p                                                                                                                                                                                           ֏}~}~~~~}~~~~~~~~}~~~~~~~~~~~~~ݥ~~~~~~~}~}~~}}}~}}~}}~~~}}~}}}}}}~}|}}}}}~~~|}~~pr}}}}}}}}}v}}}}|p}}@!!!!!@!!!!!!! !!!! !q                                                                                                                                                                             ֟}}}}}~~~~~}}}~~}}~~}~~~~~~~~ڢ~~~~~~~~~}~~~~~~~}}~}}}}~}~~~}~~~}}~}~}}}~~}~}}}}}~~}}~}}~}}}}}r~}}s}vr}}}}}rv}@!!!!!!x!!!!!!!!!!!!!   9q                                                                                                                                                                        ֏~~~~~~~}~~}~~~~~~~~~~~~~~~~~~~~ݦ~~~~~~~~~~~~~}~}~~~}~~~}~~~~}}}~~~~}}}}}}~~}~}r}}}~}}}}~}}}|}}rv}}}}|v}}=!!!!@!!!!!!!!!!!! !!  !p                                                                                                                                                                                            Տ~}}~}~~~~~}}~~}~~~~~~~~~~~~}~~~~~~~~뫣~~~~~~~~}~~~~~~~}}}}~~~~}}}}~}~~~}~}}~}~}}}|}}}}rp}}}~}}}}}v}}pp}||}}!!!!! !! !!!!!! !!   ! !  =s                                                                                                                                                                                         ֏~~}~~~~~}}~~~~~~~~~~~~~~~~~~~~}~~~~~}}}~}~~}}~~}}~~}}}~~|}s}}|}}}}}}}}}}}}~}}}}}}p}}}}p}}!!!!!@9 !!!!!!!!!!! !  =s                                                                                                                   ֏~~~~~}}~~}~~~~~~~~~ܦ~~~~~~~~}~}~~}~~}~}s}~~}}~~}}}}}}}s}}||~}r}~}}}|~~~|p}}}~}}}pp}~~}}}}Z !!= !!!! !!!! !!  !!p                                                                                                     ֏~~~~~~~~~~}~~~~}~~~~~~~ڦ~~~~~~~~}~~~~~}~~~}~}}~~}~~}}~}~}~}~}}}}~}}}~}~~|}}}}}}}}}}}sv}~}}}v}r!!!$!@!!!!!!!!! !!!!=q                                                                                                           ֏}~}}}~~}~~}~~~~}~~~~~~~~~~~~~~}~~~~~}}}}}~}}~}~~}~~}}~}}~~}s}~}s}}}~}~~~~}}}r}}p}}s|rp}}||}}}}|v}Z!!!!!!!!!!!!!!!!!    =s                                                                                                           ֟~~~~~~~~~~}~~~~~~ڢ~~~~~~~~~~~~~~~~~}~~~~~~}~}~}}~}~}~}}}~}}}~}}|}}}~~}}}}}}}}||}}r}}}}}=!!!!Y[!!!!!!!!!! !!=}                                                                                                          ֢}}}~~~~~~}}~~~~~~~~~~}~~~~~}~}~~~~~~}~~~}}}}~~~~}}~}}}sp}}~}}||p}r}}}}}wrvr}}_$!!!@!!!!!!! !!!!!!!! !! ! q                                                                                                  ֠~}}~~~~~~~}~~~~~~~~~~ݢ~~~~}~~~~~~~~~~~~~~~~~}~}~~~}}~~}~~}}~~}~|}}}}}~}}r}}}}|v}}}}}}}}|p!!!!!!!!!!!!!!!  !q                                                                                                         ֏~~}~~~~}}}}~~~~~~~~~}~~~~}~~~~~~~~ԡ~~~~~}~~}~}~~}~~~}}}}~~~~}~~~~}}}~}~}}~}}}}}}}}}~}|}}~~}}}s}}}}}}}v|!!!!xY!!!!!!!!!!! =q                                                                                                                        ֏~~~~~~~~~}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}}~}~}}~~}}}~~}~}}}~p}}}~~}}}}}|}~}}}s}}|r}|}}s|Z!!!!C!!!! !!  !!!!! !q                                                                                                                  ֏}}}}~~~~}~~~~~~ꦦ~~~~~~~~~}~~}~~~}~~}~~}}}}}}~~~~}}}~}}}}}}r}}~~}}s}}}~}r}}|}~}pp}}~}}!!!!@!!!!!!!! !!!!   !q                                                                                                                     ֏s}~~~~~~~}~~}~~ݫ~~~~~~~~~~~~~}~~}~}}}~~~}}}~~~~}}}}}}s}}}}}}}}r}}}s}~}}}}}}}v}}}}}}!!!!!!!!!!!! !!  !!! =q                                                                                                      ֎~}~}}}~~~}~~~~~~~~~~~~~ԣ~~~~~~~~~~~~~~}~~}}~~~~~}}~}}}~}}~~}~~~}|}}~~~~}}}}}}}}~}}}~~}vr}}s}}p!!!!!!!!!!!!!! !!!  =q                                                                                                                ֎~~~~~~~}~~~~~~~~~~~~~~~~~~~~~~~~~~}~~~~~}}~~}~~}~}}~~}~~}}}}~~}}}}~~}}}r}~}|}~}}|v}}}}}pB!!!!x!!!!! !! !!! ! !!q                                                                                                                      ֏}}~~~}}~~~~~}~~~~~~~~~~~~~~~~~~~}~~~~~}}}}}~~}}~}}}~~}~~~}~~}}}~~}s}|}}}r}}}}|r}}}|s}|_!!!!Z!!!!!!!  !!!!!     q                                                         ֏~}}~~~~~~}~~~~~~~~~~~~~~~~}}~~}}~~}}~~~}~}}~~~~}~}~}}~}}}}}}}}p}}}p}r}w}~|||}x!=!Z!!!!!!!!! !!! ! q                                                                                         ֏~~~~~~~~~~~~~}~륢~~~~}~~~}~~~~~}~}~~}~}}}}~}}}}~}}~}}~}}p}~}r}}~}}r}}}}}}}|p}}!!!@Y! !!!!!!!!!    9q                                                                                ֏~~~~~~~~~~~~~~}~~~~ꥣ~~~~~~~~}}~~~}~~~~}~~}}~~~}}~}~~~}}}~~}}}~}}}~~}|}}}}}}}}}rvv!!! @Z!!!!!! ! !!!  ! p                                                                                                 ֏}~~~}~~}~~~}~~~~}~ꦢ~~~~~~~~~~~~~~}}~}}~~~}}}}}}}~~}}}~}}~}}}~~}}}}}}p}~}r}}vr}}}}}$!!!@_$!!!!!! !!!  !=s                                                                                               ֏}}~}~~~~~~~~~~~~ꦢ~~~~~~~~~~~~}~}}~~}~~}}~~}}}~~|}}~~~}}}~~}}}}}}}}}}}}}}|}}}|}!!!@[!!!!!!!! !   !s                                                                                         ֏~~~~~~~~~~~~~}릢~~~}~~~~~~}~~~~}~}}~~~~}~}~~}}}}}}~~~}}~}|}}}}}}}~}}||}}}}}}~}}~!!@Z !!!!!!!!  !!! q                                                                                        ֟}~~~~~~}~~}~~~~뫦~~~~~~~~~~~}~~~}~~~~}}~~}~~~}~}}~}}~}~~}}}~}s}}}}s|}}~}}}}}}}}~}}~~!!!!!@Z!!!!!! !!!! !!   !q                                                                                             ֏}}~~~~}~~}~~~~~ꥢ~~~~~~~~~}~~}~~}~~~~~}~~~~~}}~}~}~~}}}~~}|}}}}~|s}}}~}r}}}}}}}r}}!@Z!!!! !!!!!! !!   =s                                                                             ֏~~~}~~~~~~~~~~~ꢡ~~~~~~~~~~~}~~}}~}~~~~~~~~~}}}}}~~}~}}}}|}~}~~}|}}}}}}|}}}pp}|}} !!!@Z!!!!!! !! !! !!  $q                                                                                         ֟~~~~~~~~~~~~~~~~~릡~~~~~~~~~~}}~}}~~~}}s}}~}~~}}}}r}~}}~}}~~}}}}~}}}}p}}|}!!!!@Z!!!!!!!!!!! !!!!  !=}                                                                                                                              ֏}~~~~~~~~~~~~~~~륡~~~~~~~~~~~~~~~~~}}}}~~~~}}}}~~~}}~}}}}}}}}~}}~}}}}}~}}r}}}}}}$! @]!!!!!!! !!  !!   =s                                                                                                                                  ֠~~~~~~}~~~~}~~~~~~ꦣ~~~}~~~~~~~~~~}~~~~}}~~~}~!!!!CZ!!!!!!!!!!     =q                                                                                                                          ֢}}~~~}}~~~}~~~~~~ꫦ~~~~~~~~~~~}~~}~~}~~}~~}}}~!!!BZ!!!!!!! ! ! ! !9s                                                                                                                                                   ֏~~~~~~~~~~~~~~릣~~~~}~~~}~}~~~~}}!!!!!@]!!!!!!! !!!! !!!=q                                                                                                                                            ֏~~~~~~~~~~~~~ꦦ~~~~~}~~}~~~~~}}~~~}}}~$!!!C_!!!!!!!!!!!! !!!     !!q                                                                                                                                                     ֏~~~}~~릢~~~~~~~~}}~~~}~~摑~}|}~}}}}}}}}}}}}~}}}}$!!!!@Z!! !!!  !! =s                                                                                                                                       ֏}~~~~~~~~~ꥢ~~~~~}~~~~~~~}~~~~~}}~~ڑ}}~}}}~}}}}}~~~}}}~~~}}}|}}}v}~}}}}sv}}|}}}}|}~}|ppp}}vvwww!!!!Bx!!!!!!! !!!!  =s                                                                                                                      ֠~}~~~~~~~~}~~~}~~~ꦣ~~~~~~~~~~~~~~~~~~~~}~~}~~}}}~~}}~}}}~}}}}}}}~}}}}}}}~}}}}}}r}}}pp}}v}}}}}}|}wvv}|vpvvvv|ppvpvppv|v}{!!!@_!!!!!!!!!!!!!!! !!  =s                                                                                                                                                                      ֠~~~~~~}~~~~~~~~~~~~~~ꦢ~~~~~~~~~~~~~}}~~~~~}}~}~}~}}}}~}}}}|}}}}}~~~~}|}}}|}}~}}}}}}v|vvrv|p}}}}}}}v|ppppv|pp}pppvrv}ppp|vv}ppppvpop}wo!!!C]!!!!!!!!!!!  !!!  !9q                                                                                                                                                                          ֏~~~~~~~~~~~릢~~~~~~~~~~~}}}~~}}~~}}}~~~~}~}}}}}}}}~~}}}}}}r}|s}}}}|||}}}}}}}v|}}}v||vr}}|v}}pvr}pv|||v|pv}pppvppvvppp}vp!!!!@[!! !!! !!!!  !! 7q                                                                                                                                                                  ֏~~~~ꦢ~~~~~~~~~~~~~}~~}~}}}~~}}}~~~}}}~}~}}r|}~}}}}}s||}v}}}s}r||}}}|}}|p}}ppp}|pvv}p|}||rvpv|}}p}|}}vpppppv|pppvvvvo!!!B_!!!! !!!! ! !q                                                                                                                                                                                         ֏~~~~~~~}~~~~~~릢~~~~~~~~~~~~~}~~~~~~~~}~~}~~}~~~}}}~~}~}}}}}}~}}}}}|}}}}}}||}}}rp}|s}~}}||}vr}}|v}||pv||vvv|}vvppp|p|ppvpv}pppvppp}vv!!!!CZ!!!!!!!!! ! ! =s                                                                                                                                                                    ֟~}}~~~~~~~~~~~~~ꫣ~~~~~}~~~~~~~~~}}~~~~~~~~~~}}}}~~~}}~~}}}|}s}}s}~~}}r}}}}~}}p}}}vv}}|}}~}p}prv}}p}v}pp}}vpp}|v|vvppppvv}rv||vppppv|}pu!$!!Z[!!!!!!!!! !   ! !=}                                                                                                                                                                          ֠~~~~~~~~~}~~릫~~~~}~~~}~~}~~~}~~}~~}~~}}~~|}~~~~s}}~}|~}s}}}}~}r}}}}}}}}}||p}}}}}v}}}}}}r}vrv}}||}}|v|pp}ppv|pvvppvpprppvwvop!$!@Z!!!!! !!!! ! !!q                                                                                                                                                          ֠~~}~~~}~~~~~~~~~ꦦ~~~~~~~~~~~~~}~~}~}~~~~}}}}}}}~~~}}~~}}}}|}}}}}}p}}~}}~}}}}p}|}}s|}}}}~~}}}vv}}||}}|vppp|v|pp|vvpppvpp|vppplv!!@_ !!! !!!!!! !!    !q                                                                                                                                                                   ֏~~~~~~~~~~릦~~~~~~~~~~~~~}}~~~}~}~}~}}~~}}}}}}}~}}~}}}|}~}}s}}}}v}~}p}}}s}p||s}}p}p|p}}}vp|}p|vp|pvvr}v|p|pv||ppppp|vpp|vvppv!!!!@Z!!!! !!!!! =q                                                                                                                                                                                                              ֏~~~~~~~~~~~ꫦ~~~~~~~}~~~~~}}}~~ڑ~}}~}~}s~~}}}~}}~~~~~~|}s}~}~|r}}}}}}}p|}rvrv}}vvr|vpppr}}vv|v|||pppp}v}vpvpp}}vpppop|ppppv}vpw!!!!@_!!!!!! !!!!!! !   =q                                                                                                                                                                                                                ֏}}~~~~~~~~~~~~~~~~~~~~~~}ڑ~}~~}~~}}}}~~~}}~}}}}}}~~}}}v}}}}}}}r}}|}}p|}}v|}}r}|v|}pv|||p}}||vvr}|v}v|pp}|vppv}|ppppovpv!!!BZ!!!!! !!!!!!!!! !=q                                                                                                                                                                                                                             ֏~~~~~~~~~~~~ꫣ~~~~~~~~~}}~}}~~~ӡ}~~~~~~}~~}~~}}~}}|}}r~~}v|}s}}}~}~s}}}}}vr}~}|}}}vv}p|p|}}}pp}}}}|}}vvv|v|p|}}p|p|vv|vvppvvov!!!!@Z!!!!! !!!!!! !  !! !!! =q                                                                                                                                                                                                                     ֏~~~~~~~~~릣~~~~~~~~~~}~~}~}ӡ}~~~}}~~}}~~~~~~}}}}}}}}~}}}}}}s}}}}}}p}~}v}}}pp}}p}}}|v}}}}rpv||||vvppp|p|pp}v}|ppvvvrpppvppw!!!!CZ!!!!!!!!!!!! =q                                                                                                                                                                                                                        ֏~~}}~~}~~ꮦ~~~~~}~~}~~~~~~~}~}}~}}}}}~}~~~~}}~~}~~~}~~}~~}r|}}}}||}}~}}}ppr}}}}}}}s}}r}vvvpvvv||ppp|ppvv}p|p}vrpvppppvpp!!!@_!!!!!!!!!!!! !!!q                                                                                                                                                                                                                           ֏~~~~~~~~~~~~~~뫦~~~~}~~~~~~}~~~~~}~}}~~~~}}}}~}~~~}}}}}}}~~}}}v}~}||s}}}}}}}}}vv|p}}rv|v|}vp}}rv|}|pv|pp|v|}v|vvvvpvvpppppvpvw!!!!!@Z!!!!!!!!  !  !=q                                                                                                                                                                                                                       ֏~~}~~~~~~~~~ꦦ~~~~~~~~~~~~~~}~~~}}~~}~~~~~~}}}~}}|r}|}}}}~~}|}}}s}v|p}}p}}}p}}|v}rvvvp|vppv}|v}}}pp||v|}}}}pppp}pp}vvvvpwvp{!$!!B_!!!!!!!! !! !!!!!!!! =}                                                                                                                                                                                                                  ֏~}~~~~~~~~ꦣ~~~~~~~~~~~}~}~~}~~~~}~~~}~}~}~~}|}}}}}}~}|}~}}}}}~|}}|s}}}}r}}}rp}}}}|}|r}vr}|p}p}}ppv|v|vrp}ppp}vpppp|pv}pp!!!!@Z!!! !!!!!! ! !  !=s                                                                                                                                                                                                                                                    ֠~~~~~}~~~~~~~~~~~~ꫢ~~~~}~~~~~~~}}}~~~}}}}~~}}~}}}}|}r}}}}rv}}}}}}}~}}}}}}}rvv}}}v}}vv|}}}v}}}vpv}pp||pp|}pvvvvvpp}ppppppprvpp!!$!B]!!! !!!!!!!! !! !  ! !!  =}                                                                                                                                                                                                                                                             ֟~~~~~~~~릣~~~~~~~~~~~~}~}~}}~}~~}~}~~}}~~}}}}}}|}}~}}}}}}}s}~}~}p}~}|}v||s}|}}|}vr}}|v}}|vr}p}vp||v|v|p}|pvrpvppppp}vpvpp!=!@Z!!!!!!!!! ! !! !! $q                                                                                                                                                                                                                                                                ֏~~}}~~~~~~~~~~~~~~~~~}}}}~~~}}~~}}}}}~}~~~}}~}}~~~}~}}~}~}}s}}||}~}|}}}}}p|||vp|vr}}~}}}}ppv}}vv}|pv}}|vpvvppppvp|}}pv}}vvp}!!!@_!!!!!!!!!!!!!!!!!!      !!=q                                                                                                                                                                                                                                        ֏~}~~~~~뫦~~~~~~~~~}~~~~}~}~}~~~}}}~~~~}~}}}}}}}~}}}|}~}p}}}p}~|}}|}}}p|}}v}}}rp}}vvrv}}v||vr}p}pvrp||vpp|ppv|ppvpvpp!!!@Z!!!!!!!!! !!!!!!!!!   9q                                                                                                                                                                                                                                                     ֟}~~}~}~~~~ꦢ~~~~~~~~~~~~~}}~~~~~~~~}~~}}}}}}}}~~}}}|}}}}}~|}}rv}}}}r}}~~}}}}}}pppp}}p}}}}}p|p|}|vvpp}v|}v|}}pppp}ppppvv$!!!@_! !!!!!!!!!!!! !!!!$q                                                                                                                                                                                                                                             ֏~~~~~~~~~~뫣~~~~~~~~~}}~~~}~~~~}~~~}~}}}~}~}}}}}}}}s}}}}}~~}|~}}s|}|}}}}}}}vr}}}|v|vr}|v}}}}|vv|vp||ppv|v}vpp|p|ppvpppppw$!!!@x !!!!!!!!!!!!! !     !p                                                                                                                                                                                                                                              ֏}~~~~~~~~ꦦ~~~~~}~~~~~~}~~~~}}}~}}~}~~~}}~}~~}s}}}~~}}}~s|}|p}}}}~}~}}|}s|}}}v}rv|||vpp|}rvrppvvpprvvppv}}|pp|}rvoppppoop!!!Y_!!!!!!!!!!!!!!!! !!!!!!!!!!s                                                                                                                                                                                                                                                ֎}~}~~~~릢~~~~}~}~~~~~~}~}~~~}~~~}}~~~}~~}~}r}}}~~}}}}}}}}}}|}~}}~}}r|}|}}}|vv}}}}||v}|vvv||rpvvv}pppp|}|vvpvvpppvppppp$!!!@_!!!!!!!!!!!!! !! !! !9q                                                                                                                                                                                                                                                                  ֏~~~~~~~~~ꫢ}~~}~~}~~}~~~~}~}|}~~}}|}~~}~}~}|}~}r|}}}~~}}|}}v}v}|pprv}}}}}}}}vv||}}}}vv|}}vp}vpppp|vvpvpp}|pvpp!!!!@Z! !!!!!!!!!!!!q                                                                                                                                                                                                                                               ֏~~~~~~~~~~~~~~~~}~~~~~~~~}~~}~}}}~~}}}}~}}}~~~~}}~~}|}~}v}}}}}}}p}}}}|}r}}vv||s}}}}}}||p}v}}||pv|}ppv|rvpvp}pvppp}vo}vp!=!!B_!!!!!! !! !!!!!! !!$q                             !!                                                                                                                                                                                                                                             ֏}}~~}~~}~~~~~~~~~~~~ꦣ~~~~~~~~~~~}}~~~~~~~}}~~~}~~~}}|}}|}}|}}~}}}~|}~}}r}}}}}}}}}}}}}}}}}|||pppp}pv|}pppv|p|vpp}}vpv|ppprvp}~|pvvvp!$$!Zx!!$$!!!!$!!!! !!!! !!!! =q                         B_!                                                                                                                                                                                                  @@!                        ֏~~~~~~~~~~~~~~~ꦦ~~}~~~~~}}~~~}~}}}}~~}}~s}}}||~}}}}~}}}}}}}}}|s}}}}s}}}}}p}~}||vv}vrp}}vvr}|ppv|p|}|pv}|pp|||pvvpv}pp{|pp!!!!C]!!!!!!!!!!!!!! !!!!  !! !q                         !Z                                                                                                                                                                                                 !ZZ                           ֏~~}~~뫮֬~~~~~~}}}}}}~}}}~~~}}}~}}~~}~~}}}~}~}}}~}}}~}r}}}r}}s|}~}s|v}}}}}}}}}}}}}pp}vp}vprv}}}v}|pp}}||vpppppv|}v|v!!!!BZ!!!!!! !!!!! !!!!!!!!!  !  $q                         $̖!                                                                                                                                                                                                    !@_Y                           ֎}~~~}~~~~~릦ԡ~~~}~~~}}~~~}}}}}~}}}~}}~~}~~}}}}}~}}}}~}r~}}}}}}v|}|}}}}}}}}}}}}}|}}}}}}pvvp}}ppv}pv|pv|ppvvv}}pvvppp|wvvv!!$!@[!!!!!!!!!!!!!!!! !     =q                            $[=                                                                                                                                                                                                      @                            ֟~~~~}~~~}~~}~~~ꫣڥ~~~~~}~~~~~}~~~~}~~~}}}}}}}~}}}~~}}}}s}~|v}}}}~~}|}}rv|}rv}|r|r|pppr|}r}}}}rv}}vp}}}|vpp|vppppvppppppv|wppp!!!!@_!!!!!!!!! !!! !!!!!!  q                                                                                                                                                                                                                                                                     ֏~~}~~~}~~~~~~~~릢ڥ~~~~~~}~~~~}~}}~~~~~~}~~~}~s}}~}~}~~~~}}~|}~~}vr}}~}}|}}}}vr}}p}}}v|||}|v}}}}|vv}|p|v|pv|}|ppp}|v|pppppppvvv}ppp!!!@Z!!!$!! !! !!!!!!  ! !!   !  q                                                                                                                                                                                                                                                                         ֎s~}~~~~~ꫣԡ~~~~~~~~~~}}}~~}}~~}}~~}~}}}}}}~}s|}~}}}}}}}|}|}}}}}}}}}}}}|}|v}}v|vp|pp||||}|}}p|pv}pppp}}|vppp|vppwpop!!!$C_!!!!!!! !!!! !!!!!!!!!!!   !   =}                                                                                                                                                                                                                                                                   ֎}~~~}~~~~~~}~~~뫣ԭ~~~~~~~~~~~}~~}}}}~}}~}}~}}~}}~~}}}}}}}}}}}~}}}|}r}}}}}p}}}}}}}pv}}}|}p}}vp}|vpv|r}v|vp|pp}vp}}|pppvppp}ppp!!!!!C_!!!!!!!!!!!!!!! !!!!!! !  =                                                                                                                                                                                                                                                             ֠~~~}~~ꦦ~ڥ륢~~~~~~~~~~~~葏~~}~~}}~}~}|}}}~}}~}~~~~~~~}}}}}~}}}}~}p|}rvp}}}}s||}p}}|pp}}}}rvvvvrvvpp}|pppv|p}ppvpvwpvp$!!!YZ!!!!!!!!! !!!!! !    !  9q                                                                                                                                                                                                                                                                                ڟ~~~~~~~~~ꦦݦ~~~~~~~~~~~~~~}}~~}}|s}}}}~~~~~~~}~~~}}}}}~~}}~}}ppvvr}|s}}||}}}}vr}v}}}}v||pvvr}ppppppppp}}|pppp}pv}!!!!C[! !!!!!!!!!! !!! !!!       q                                                                                                                                                                                                                                                                         ֏}}~~~~~~ꫦꡑݢ~~~~~~~~~}~}~}}}}~~}}~~}}~}~~~~|}}}}}}~}}|}|}}}}}}}}pr}}}~}}}}|}}|vpvp}rpvvvpp}}p}pp}|v|v}}p}|ppppppvv||wpp{!!!!@_!!!!!!! !!!!!!!!         =q                                                                                                                                                                                                                                                                         ֏~~~~~~~~~~~~~륦~~~~~~~~~}~~}}~~}}~}}}}~}~~}~}~~~}}s}~}}r}}}}|ps}r}}|}}}vv}~}||}|}|v||v||vvppr}pp|rvvrvvvvppv|vp|ppppppppp}wpp!!$!B[!!!!!!!!! !!!!!!!!! !! !!!=}                                                                                                                                                                                                                                                                       ֠~~~~~~~~ꫣڡԡӑ~~~~~~~~~~~~}}~}~}}}}~~}}}}}}}}}}}~}}~~}}}s}}}}}}|}}r}}}}}}}}}||v}}|}}vp}}|vv}}}pv}|p|}}}vpppp||vvwpp!=!@_!!!!!!! !!! !!!!  !!    =q                                                                                                                                                                                                                                                                                  ֢}~~~~~~~~~~릢椏ॡ}~~~~~~~}}~}}~~~}}}~}r|}s}~~}}}}}}|}~~}}}~}}~~}|}}v}}}~~}}}|}|||||v}}|||}pv|}}|p|pp}}}}pp}v}}|vv}pp!!!CZ!!!!!!!!!!!!   !!  !!!!  !!!!   =p                                                                                                                                                                                                                                                                               ֠~~~~~~~~~~~ꫦԡԑ~~~~~~~~}~~~}~~~~~~~}~}}}}}}}}~}~}}}}}}~}}}}}}}}|p}}rv}}}rw}|}rv}p}}}}}}}rvv|}}v||p}}ppvp}}pppp|}pvpvvwvpv!!!!B_!!!!!! !! !!!!!!!!!!!    q                                                                                                                                                                                                                                                                                   ֟~}~~~}~~~~~~~~릣ꡑ륡륡}~~~~~~~~~}~~~}}}~~}}}}}}~}}~~}~~~}s}}s}}}r}}}vrppv}}vv}}pp}vp}}}|s}}v}}|vrv}}}}vp}}}ppp|vppp}}vppp}vpp螘!!!!!C_!!!!!! !!!!!!!!  !  ! !! !!!   $p                                                                                                                                                                                                                                                                         ֏~~~~~~~~ꫦԡڑ~~~}}~~ӑ~~~~~~~~~~~~}}}}~~}|~~}~}~}}}}}}}}}r}}}}}}r}}}p}~}||}|pp}}pp}}pvpp|p|||vp}pp||w}vppppppvpvppylll̘$!!!!B] !!! !!!!!  !! !! !!! ! !! ! !=s                                                                                                                                                                                                                                                                           ֎}}~}}~~}~~~~~~~~ԡ륏~~~~~~~~}}}~~}ӡ}}}~}~}~~}r~}}}}}}}}}}~~}}}~~}}wr}}p}~}}}~}}~~|pp}}p|r}v|v|}|pppp}|pp}}}~}}}vpp||}vpv}vlullllCl{!===!@_!!!!!!!!! !!!!!!!!!! !!!!!!!  !   !!!   ! !   9q                                                                                                                                                                                                                                                                                   ֏~~~}~~ꫦꡡڡ~~~~~~~~~~~~~}~~~~~~}~}~}~r}~~}}}}~~||}}}~}}}}}}}}}}}p}}}p}}}p}}}pr}}vv}}}}pp}}}|prvvppp}pvpppppvpvvvpvvllllllll!!!!!C]!!!!!!! !! !!  ! ! !    !q                                                                                                                                                                                                                                                                          ֏~}~~~~~~~~~~~~~ꥣ~~ӑ~~}~~}~~~~}}}}}}~}}}~~}}}}||p}||}r}|}~}~}}}}pp}r}pv|pppppv}p|p}}}vpv||vvvpvppppppv|pppppvpp|ppvuvuloooooll{!!!C[!! !!!!! !!!!! !!!!!!!!  !!!    }                                                                                                                                                                                                                                                                                     ֎~~~~~~~ꫦڡڡ륑~~~~~~~~~}~}~~~~~|}~}~~}}}}}~~}}}}}~}}}}}}}}}}}}}p}~}}}}}p}}}}|}}p}}}p}r}p}p|pp|}pp|pv}p}vppppvpwppooolllllllllll{{!!!!B_!!!! !! !!!!  !!!!! !  !  !! =q                                                                                                                                                                                                                                                                              ֎~~~}}~~~밮~ݥ~~~~~~~}~}|}}~~~~}}}}}}}~}}s}}~}s}}~~}p}}}}p}|p}}}rp}~~}rppv|}}}vvv|vpp}}}|vpppppvrp|}|vv}plpolllollC?llllllllu!!=!!@Z!!!!!!!!!!!!!!!!!!!!  !  !!! ! p                                                                                                                                                                                                                                                                                    ֏~~~~~~~ꮮ~ڥ~~~~~~}~}~~~~~~~}}~}}~}}}~~~}|}}~~}}}~}|}}}r}~}s}}}r}}}}}v|}}}}v}}rvps}p}v|vp||v|vv|}rpvvvvpvp|pvppvlllolllllllolllllluu!=!B_!!!!!!! !!!!!!!!!!   !  !9q                                                                                                                                                                                                                                                                            ֏}~~~~~~~~~ꡡ~~~~~~}}|}~}}~~}}}||~}}|s}~}~~}}}||}}~~~}pv}~}}}}}}}}||}}}ppv}}}}}}v|}p}}}|pppv|}p}}}|pppppp|}vvpvollllovplClClllllllllll!==!!CZ !!! !! ! !!!!!!!!!!!!!! !  !!!   !! !!!!! ! =}                                                                                                                                                                                                                                                                            ֏~~~~~~~~ꮦ楡~ԑ~~~~|~~~|}~}~}}~~~~|}}~~~}|}}}}}}}~}|}s}}}}}}}}}}s|}||p}}s}}}}pp}|pprv}}p|}}ppp|v}vpp}rppvvwpppooolllloolllllllllClolllu{u!!!!$Y_!!!!!!!!!!!!! !! !!  ! !! !  ! !q                                                                                                                                                                                                                                                                       ֏~~~~}~~~~~~~~뫦~~뚀~}}}}}}}~}~~~}}}}~~~~||}}s}}}}}|}~|}~~~~}}pr}r}||}}}~}}}|pp}}ppvrppppp|}pp|ppp|}}p}}}plpppplpvpvvvolllllllooolllllClllCCu!!!B_!!!!! !!! !! ! ! ! !! !!!   !   p                                                                                                                                                                                                                                                                                        ֏~~}ꫦ॑~ڤ~~~~~}~~~}~~}~}~~~~}}}}~}}}}}}}}}s}s}}}}|}}}}}}}v}}|}}}|p|}}v|}}p}|vvp}|}}p}ppv|vvppv||pvpp|vvovllopoolllloplCoplllClolllllll{u!!!!!B]!!!!!!!!! !! !!!!!    !!  !  !q                                                                                                                                                                                                                                                                ֏~}}}~}}~~~~~~~~~~~ꦣ~~~}~}~ӑ~}~~}~~}~~~}}~~}}~~}}~}~~}}}}vpvrvr}}}r}}}}}r}|v}}}pp}}v}}}}|v|}}}|pp|||ppp|vp}}}v}vvvollllllloooploolClloopplopolCCCl{C$!!!!@_!!!!! !! !!! !!! !!! ! !  ! ! ! !!q                                                                                                                                                                                                                                                                          ֠~~~~~~~ꦦݣ~~륑}~}~~}~~~}~}}~~}~}}~}}}}}}}}}~}}}|}}}~}}}}}p}}}}}pv}}}}rv|}}}rv|}|}v|ppp|vp|vp}p}vpv}vpv}vwovoollppllllpplllollllllovllllllllll{u!!!!!BZ!!!!!!!! !!! ! !! ! ! ! !   !q                                                                                                                                                                                                                                          ֏~~~~~~~~~~~~~~~~~~~~~ء}~}}~~}~}}}}~}}~}}}}}r}}}}}v|}r}}rpvr}pv}~}|s}}}}|vrppvv}}r}}vvrp}}}}}pvv|v}}}}}v}||vpppvv}pwppovooplllollllllopvolllllllCllovolCul!!==9C_!!!!!!!!!!!!!!! !!!!! !!!  ! !!! !  ! ! !!!!!  ! !!  ! =}                                                                                                                                                                                                                                                     ֏~~~~~~~~~~~~~~}~~~~~~}~}~}~}~~~}}}~}|}~}}sr}}}}}}}}}|}r}}}}}}}rv}}v|}}}}pw}}}}v}}}pvpp|}|}v}|v|pv}vppvvvvvvwoovopplloololloolllloplllllllllllllllCCyC!!!!!B_!9!!!!!!!!! !! !!!  ! ! ! ! !!q                                                                                                                                                                                                                                            ֏~~~~~~~~~~~릣ꫣ~~~ڤ~}怀}}~~~~~}}}}~~}~}}}}~~}}}}}}}}}}r}}}}~}v||p}}}}}|}||pv}}}pppppv}}}vpppopppvppvpppppv{polooollllpvvooololoollllllllCCllClolCCClul{!!!@_!! !!! ! !!!!!!!!!!!!     ! !=q                                                                                                                                                                                                                                                    ֎~~~~~~~릣~~~~}~~}}}~}~~~~}}~~}~}~~}}}|}~}~}}s|}}}}}v}}~}}}}}}}}}}pp}}p}p}}}v|pp|v}}}pvvpppwvvv}vppppvoovpoooooploopollloooooolllolllllllClolClllCul!!!@_!!!!!!!!!!!! !!!!  !  !! =}                                                                                                                                                                                                                                                    ֠~~~~~~~릢֢~~~~~}~륑}}~}}~~}r}~~}}~}}}}}~~}}~}~~}}}~}}}p}~}}p}p}pvr}}}}}}pv}}p}}ppvw}vv}}}}pp}}vpv}}ppvvpv}vpooopvpolopllllllllooolloovolllllloopollllloooluC{!!!!!B_!!!!!!!!!!!!$!!! ! !! !  ! ! !! !! =q                                                                                                                                                                                                                                                          ֠~~~~~~~~~ꦦ~~~~~~~~ؑ}}~~~}}~~}}}~}}~}}}~~}~~}}s~}~}}}}~}}}s}}}p}}}}}rw}}}}}p}r}vv}}}v}}rvp}}}v}|vpppv}pvppvpppvwvvplovvpploppllllopllloolllloollloolllolllloolllolyl!=$!Bx!!!!!!!!!!!!!!! !!!!!  !!     ! 9q                                                                                                                                                                                                                                                ֟~~}~~~~밮~~~~~}~맀~~~~}~}}~~}}}}|rs}}~~}}}~}|}}}}}}}~}|}}}}}}}}}}}}}}vsp}}}}}}}p}}}pv}v}}vpvv}}}}|}}}p}vpvvpplppollpoloovvvooolppoooloollllllolllllCllCllCllClullv{!=!!!C] !!!!!! !!!!!!!!!!! !!!!!!! !! ! ! ! !  =s                                                                                                                                                                                                                                                           ֟~~~~~~~ꫫ墡~~~~~~}~ڙؑ}}}}~~~~~~}~}}~}}}}}}~}}}~~}}}}~}}}}}}}}}}}}}~}p}}}}}v}}}wvv|}}}}}vp}}}}|}}vpvwp}vppvvpv}|pvlovolooovploppvppollopoooooplllollollllCllCllCCllCllllyl=!!!!Z_!!!!! !!!!!!!! !!! !!! ! !    ! =q                                                                                                                                                                                                                 ֏~}~~~~~~~~}~~~뫣~~~~~~~ڑ~~~}}}}|}}~~~~}}}w|}~}}}~}~~}}}~~}}}}}}pv}}|}}}}}}}}s}pppp}vppppppvppp}v}|v}}}}pvvppopvvvlloppplllllllpooplllllopllpolllollllopollllolCClCCllu=!!$A[! !!!!!!!!!!!!!!! !!!  ! !!!!    =p                                                                                                                                                                                                                        ֏~~~~~~}~~ꫦ~~~~~~}~}}}}}}~~}~}~}~}}}|}}}}~}}}}}}}}}}|v}}}}}}}}wp}}}v}v}w}ppppvpvp}}ppwvpp}}v}vpv}ooopvppvpopolopololloollollloolloolllCllolllovllllolllllClluC!!!!!Z_!!!!!!!!!!!!! !!!! !!!!!!! !   !    !!q                                                                                                                                                                                                                         ֠~~~}~~~~~~롡~~}~}~葑~}}~~}}}}~}~~}}~}~}}}}}}}}}}}}}}}sp}}}p}}}}}}}~}}}p}p}}p}p}p}vp}|}vvp}}|v}}p}}vpppppvpovvooppvvplllpvvllppopooopolpppoovlllolllllllllllplllllCCCloullllu!!!!$@[!!!! !!!!!! !!!   ! !!!!!! !! !!  ! !      !!!!q                                                                                                                                                                                                           ֠~~}~~~~~~~~~~~~~~~~~}}~~}~}}}}}}~}}}}}~}}}}}~~}}}~}}|}|v}|}}}}}s|}~}}}}}}}sv}}p}p}pp}}}vpppv}}p}wv}pwppvpvppppvpopooopvooopoppollovpllpopvoollvllllllllllllllllllluvlCClllllCl{o$!!!!C_!!!!!!!!! !!!!! !!!!!!!!  !  !!! !!! !q                                                                                                                                                                                                                                   ֏~~~~~}~~~~~~ꦣڦ~~~~~~~~~~}~}~}~}}~~~}~~}}~~~}}~}}}}}}}}~}}}}}}}}|}}}pp}}rvvv}}}}}|v}wpp}w}}p}}}pppppvvv|}}v}}vvppopppplopppopvpolpllpplopovvoollloopvlvlllolluvllllCllolllllCllllll$!$!!@_!!!!!!!! ! !!!! !!! !! !    !!  !!p                                                                                                                                                                                                                    ֏s~~~~~~~~ꦣ~~~~~~}~~~~~~葑~}~~}}}~~}~}}}}}~~}~}}~~}r}}~~}}}}}}}}}v}}}vp}}}pv}}~}}wp}pppppp}pp|vvpppv}}p|}vvv|opvpoppovpoopoopopplpollooopvoovplllolvollllltppollllllCllovollCClllluC!!$!!B_!!!! !!! !!!!!!!!!!!! ! ! !  !  !!!!q                                                                                                                                                                                                                     ֎~~~~~~~~~~뫣~~}~~~~~~~}}}}}}}}~~}~~~~}}~}~}}}}}|}~}}}}}|v}}}}}}pp}}}}}}}p}}}}vpv}s}}}}}}}}v}}}|}}vp}pp}vpppvp{ߘpppppoovvvppopvpppoovvvvlppvlllolllpolloppllllpolllllllllllllllClClllllltl!!!!!B_!!!!!!!!!!!!!!!!!!!!!!  !!  !!!! !!!  =q                                                                                                                                                                                                                                ֎~~~~~~~~ꫫݥ~~~~~~~~~~~}~~~~}~॑}~~}}}}}}}}~}}~}}}}}}}}}}}}}}|}s}}sp}}}p}}}}vv}}}p}p}}}|}ppp}wpppw}}pp}ppv}}ppvwopvolpvpopvvvvpvvpvplppvwppvlopoollolovolvplllolpplllllllllllCllClCClllClC{yC!!!!!Zx!!!!!!!!!! ! ! !!!!!!!!   !!!!!!!!  ! ! =q                                                                                                                                                                                                            ֎~~~~~뫮~~~~~~~ښ~}}}}~}}~~}}~~}}}}}}}}~}}}}}}~}}}}}}}~}}}}}}}rp}}}}}vv}qw|q}p}}w}}ppp}p}pv}vov}vvvvvppvpvvvvplplppvppllppvvoolloopvvlllooolllpllllolllovulllllllllllCltlllClol!!!!!@_!!!!!!!!!! !!!!!!!!!!!!! ! !! !! !!9q                                                                                                                                                                                                                    ֏~~~~~~~~~~~~ԡ~~~~~~~~~~~~~~}~}}}}}}}}}}~}}}}}}~}}}}}}}s}}~~}}}}}}}~}}}}}v}}v}}~~}}p}|v}}}pvp}}}pv}}wpp}}pv|vvvvpvvpvvvv|}vpllopppolvpppooolllolppllollllpvvolplllllupllllollCllvlllollCCC{{l{!!!!!B_!!!!!! !!!!!!! !! !!!! !   !  !!!!q                                                                                                                                                                             ֏~~~~~~~~~~릡~~~~}~}~~Ӥ~}~}}~}~}}}}}~}}~}}}}}}}|}}}}}}}}}}}}}s}}}vrp}}}}}p}vvvvvvv}}}}}pvs}vvppvvpvpv||ppvpppppppppppvopopvlvoppvlvvpplllppplloolllllllllpllllllltlllClllClllllllCtl!!!!!CZ!!!!!!!!!! ! ! !!!!!!  !! ! ! !  !!   ! $p                                                                                                                                                                                                             ֎}~~~~~~~~~~ꫢ~~~~~~}~}}ڑ}~}}~}}}}}|}~}}}}~}~}}}}}}rw}}}}}}}}}}pvv}p}v}}}p}}p}prvp}p}}}}}vv}}v|pv}ppvvp}|vvvvpppolooovppvvolvpvpppvlppvpllllvollvlpllllllllltplllllllllllllllClClllllvyl{!!!!!Z_!!!!!!!!! !!!!!!!!!!!  !  !!!!!!!!! ! !!!!q                                                                                                                                                                             ֎~~~~~~~~~~~~뫫ꑢ~~~~~~~}~~}~}}}}~~}}~}~}}~}~}}}}}}}}}}}}}}}|s}}}}}}}}v}pp}}vvwwr}pv|v}}rppvvvv}vvvv}vopppppppvvvpvlvvplp|voovovovllooplpopoploppllllvolllvlllvlllltlllllCllClllllllCllC!!!!=C_ !!!!!!!!!!!!!!  ! ! !!!!!!!  ! !   ! ! =q                                                                                                                                                                                                ֏~~~~~}~~~~~~ꮮ~~~~~~~}}}~~}}}}}}~}}}}}}}~~}~}}~}}sp}}r}}}}p}}}}}}vrvv}}rvvp||vv}ppvpvvvpv|}vpvvvppppoppopv}vvplvvpppvvvpvpopollpvlllpolopvololltpvllloollvpllllvlllClCCllClllllllyyCu=!!!$Y_!!!!!!!!!!!!!!!!! !!! !!! !!! !!!!!!!! ! =}                                                                                                                                                                                                    ֠~}~~~~~~~~~~~뫦֦~~~~~~~~~~~~~~~בؑ~}}~~}}}}~}}}}}}~}}}}}}}}}}}}vr}}}}}}}}s}|}}}}vv}}}}|v||v||p}vvpv|vpvvpvpvvvvvppvolpvpvplopoppllpvplpplovvlloolllllloolllllllolllllllllllllllCCllCCCCltl!!!!!CZ!!!!!!! !!!!!!!!!!! !!!! ! !! !   !! =q                                                                                                                                                                             ֠}~~~~}~~~~}~~~~~~~ꫢ~~~}~~~~~~~~~ӡ}}~~~~~}}~}}}}}}}}~~}~}~}~}}v}}~~}}}}}v|}}}}}p}}~}}pv|||v|v{wvpppvppv|vpp}}|}vvopolppvolplllpllppvplvpovvlllplllllllllllollllllllCllltlllllllClCCCCCCCu{lu!!!!!B_!!!!!!!!!! ! ! ! !!!! !!!!!! !   !! !   !!!=q                                                                                                                                                                                        ֏~~~~~~~~~릣~~~}~~~~}}}~~Ӏ~}}}}}~}~}}~}}}}}}}}}}}~~}}}~}p}}}}}}}}}v}}}}}}}|v}|||||}|v}wv}vpvpvppppvvpl}vpvoppoppppppvvplpvvloolllvvpolvlvlolooplllllllollullClllllllllllllllllllllCltC!!!!@_!!!!!!!!!!!!!!!!!!!! !  ! !!!!!  ! !  !!!!  9p                                                                                                                                                                                                 ֏~}~~~~~~~~~ꥣ桦~~~~~}}}~~~~}~~}}}~}Ӏ}}}}~~}}}}}}}}}rvr}}~}}|}}}}}}p}}|}rvp}}}}}|}|vv|v||}}}vvvvpppv|}ppppppv}pppopolvvvpvvpvvopvplolllpvvllplvvlllvvpollloplvllollCllllClllllllllCClClllolu{Cl$!!$!@x!!!!! !!!!!!!!!!!!!!!  !!  !  !! !  !! !! !!q                                                                                                                                                                 ֏~~~~~~~~~~~ꦣ~~~~~~~~~}}}}~~}}~~|}~~~~}}}}}}}~}}}s}p}}}r}}}pw}}||}}v||v|p}}||}v}pwvv|vvvvp|vvvpppppovvpvvlpvpppwppplpvpoppppvlollvlvvlpllllppllvvollllllllllllllllllClllllCCllllCul!!!!!B_!!!!!!!!!!!!!! !!!!!!!! !!!  !  !!  !!! !=q                                                                                                                                                            ֏~}}~}~~~~~~ꫫܡ~~~~~~~~~~~~~~}}}}~ӑ}~~}}~~~}~~}}}||}|||}~|vv|}}}}}p}}}p}}p|v||}}vpwvvvvvppppvv|}vpooopvpv|vlpppvvpppllvvplpvvvpollpollopvollvvppopvllllllllllllllulllllllollCCCllCClol!!$!!Z_!!!!!! !!!! !!!!!!!!!!!!!!! !! ! !!    =w                                                                                                                                                           ֏~~~~~}뫦~~~~~~~~}~~~~}~}}}ؑ}~ٙ~}}}~}}}~}|}}}}}|}}}~}p}}|}s}}vp~}pp}}}}vv}vvvv}|ppvvvvvvvvvvoopppppvpovlvvolppplpvploooppopoooppllollpllloulllolllllllllllllllllllllllCClCllCCvl=!!!!C]!!!!!!!!!!!! !!!!!!!!!! !!!!! ! !!!!   !9q                                                                                                                                                             ֏~~~~~~~갦~~~~}~~}~~~~~}~~}}}~}}}}~ב~~}묑~}~}}}}}}|}}}}}}}}}}}}}}}}|}}rw}}||}rv}}ِwvv}w|vv~}v|p|}v|||ppvppvvvpvplvplpplpoplooplllolppopllovplopolvllvppllllooovoluuoollllollCllClllllCCllllCl$!!!=Z_!!!!!!!!!!!! !! !!!!  !! !!!!! !   !  !$q                                                                                                                                                                    ֏}~~~~~~~~뫦ꢢ~~~~~~~~~~}}~~~~~~}}~}~~}}}}}}}}}}}}}~}||s}}}}}}}}}}}|vvw}}|vvpvvv}vvvppvvvvvppvvpvvpppvpvpoppvppppvvlplovoopoplloooooollovoloolllllllolllllllllullllCllllllCCCCllluC{=!!!$B[!!!!!!!!!!!!!! !! !!!!!!!!!  !! !  ! ! !=q                                                                                                                                                             ֎~~~~~~~~~~ꫦ~~~~~~~}}~~}~~~}}~~~~~}ӑ}}~ә}}~}}~~}}}}}}}}}}v}}|}}~~}}|}}|v}}}vvvvppppvppvpppvppppvvvv|vppvvpvvppvvvpppvvvvppvoooppollllooloovppllllllClllllllllllllpolCCClllllCCllCllCllC$!!=!@_!!!!!!!!!!!     !!!! !!!!!!!!!!! ! ! !  =q                                                                                                                                        ֏~~~~~~~~~~~~~ݢ~~~~~}}~~~~~}~}}~}~}ڙ}}~~}~}}}}}}}}}}~}}}p}}}|}}}}|}|}vvv}|}vpv}|vvppvvpppppvpppp|vppvvpopvppppppvppppoopploppopoollooovollolllllollollllllllllolllllllllllCCllClCCvly!!=!@_!!!!!!!!!!!!!!!!!! !!!!!!! ! !  !! ! !!   !  !q                                                                                                                                            ֏}}~}~~~~~~~~~~~~~~~~}~~}~}}~}~~}ڞ}}}~}}}}}}}}}}}}}r}|v|||}}vvvv}v}}}v}}|vvpp||ppp|}vpploppvvv}olp}voopvvpooopooopoooopppollllpolllolllopolooolllllCClClllllCCCCCCClllCCllllll!!!!!Yx!!!!!!!!!!!!!!!!  ! ! !! !!! ! !!!!   !!!!! ! !  !=q                                                                                                                                                    ֏~~~~~~~~~~~뫣~~~~}~~~~~~~~~~}~~}~~ב~}}ґ}}s}~}~}}s}}~}v}}}}}}ךv}vv}}}vp|}vvvvv|vpvvvppvvvvppvpppvpvvpovvpopppppooppopoppopooopplllloolloolllooolllllllvllllllCvolllCllClllCClCClCuCu!!!!@_!!!!!!! !!!!!!!! !!  !!!! !   !!!!! !!=s                                                                                                                                              ֏~~~~~~~~}~~~~~~~~ꦣꢦ~~~~~~}}}~~~}~~~}}}}槑}}}ә}}~}~}ppp}~~}~~}Ӑ}vv}}vw}vv|vvppvp||vvvppvppvvpvvvvpvppppovvlvvvoopoopoovvvpvvpopvvvpoloplloooollooolllllopolluollpoCloolCllollllCCCCCCC!=!!!Z_!!!! !!!! ! ! !!  !!!!!  ! ! ! ! !! !   !p                                                                                          ֏~}~~~~~~~~~릣~~~~~~~~}~}~~}~~~}}}}}}~ב}}}}ڧ}}}}}}}v}}vvژvvpv|v|vv|vvpvvv|vvvppppvvvvppvpppvvpovvpvvpvlppovplopooovploppoolloplloooolllolllllllolllllClllllolCCllllllCCCCCCuCu=!$!!B]!!!!!! ! !!!! !!!!!!!!!!!!!!! ! !!   ! !!      ! 9q                                                                                                                                        ֎}~~~~}~~~~~~~~ꦦڡ~~~~~~}}~~~}~~~}}~}}}}}~~}~~槑}}}ӧٚ}}}|v}}vvvvvvvvpp|vpv|pppv|v}vppvpvpv}vppvvvop}}vvpvvppvvvoooollloolllllooopolloopvlllllolovoollCllllClCClll?llCCCCCClllllulC!!!$!@_!!!! !!!!!!!!!!!!!!! !!!!! !! ! !  !!!!!!  !!!=q             !                                                                                             ֎}~~~~~~~~~뫦~~~~~~~~}~~}}}}}}}~~}}}}ڥ}}}}}ә}}}}v|ߞ}vpv|}||v|vvvvvpv}vpvvp}wpppvvov}plvvvvpovpvvpovpoppoppooolooooooollooollooooplllllplllollCllClllllCColClCCllClCClllllult!!$!!B_!!!!!!!!!!!!!!!!! !!!!   ! ! !!    !  ! !!  =q                                                                                                      ֏~~~~}~~~~~ꫦ֢~~~~~~~~}}~~~~}~~}}}~}}}}~~}~~}}}}}ך}}}~ә}}}}}}}ٙ}}}pv}}}}v}}}w|vv}}}}vvpppvvvvvvppvvoovvvvooopvvpolooppoooooooooopvvpollloopolloolollovlllllllCllCllllCllolCClllllC>ClClCCul!$=!!@_!!!!!!!!!!!! !!! ! ! !! ! !! !! ! !! !!!!! ! !  =}                                                                                                                                         ֏~~~~~~~~~~롢~}~~~~}~~~~~}~~~}~}~~~~}~~~}}~}~~}}ב}}}}}ӧv}}}}}}ٙ}ww}}vp}}vvvp}}vvvpv}vvvpvvppvvvvvppvpoovvppvoppppvvplpoopoloppoploppppllolopoolloooolCoplllllllllllolllllllllllllllCCllCCClyCu!!=!!B_!!!!!!!!!!! !!!!!!!! !! !  ! !  !     !=}                                                                                            ֢~~~~~~~~~ꫢ~~~~~~~}~~~~~~~}~~~~}}}}}~~~~}}}}~~~~~}}}}}}}}wv|vvڙ}w}}ppvvw}}vvvpv}pvpppvvpppp}vpopvpopvvvpoppopvooppoovvpvvpvvopoopoloolooooolooolooopoollvoollollllollllllollllCllCCClllllCllCCoC=!$!!C_!!!!!!!!!!!!!!!! !!!! !!!! !!! ! !!!!!! !=q                                                                                                               ֏~~~~~}~~~~~~~~릣ꢡ~~~~~~~}~~~~~}}}}}~~~}~~}}}}}~~}~}}}}}}}}v}}}ә}}}p}}vwp}}pvv|vpp}vvvpp|vpvvv}wvpvvoovvvpvppppvpopppvopppvppvpopooooloolovooploplloplollllolovlllllllolCllllllCllClCCllllCCllCCC{Cl=9!!!B_!!!!! !!!!! !!!  !! ! !!!!! ! !   !!!   !!!=}                                                                                                             ֏~~~~~~~~~}~~~~~~ꫦ~~~~~~}~~}~~}~}~}}~}~~}}}}~}}}}}}~}~~}}ڙ}|w}}}v}~~}}}}ٞvv}w}}pp}}}}}vppp|v}}wpvv}}pvvvv}}v}vvppvvppvvvpvpvpvvppooolopppppooppoololvolllpoolloollllllCllllllCCCloolCllllllCCClCloollCCCCCCCCZC{!!!!!Bx!!!!!!!!!! !!!!!!!!!!! ! !!   !! ! ! ! ! !!! !!! !!!!!  !!=q                                                                                                                   ֠~}~~~~~~~~~~~~~~~~릣֢~~~~~~~~~~~~~~~}~~}~~~~}}}~}}~}~}}}}}}~~}}}}}}}}}}}}}ә}vv|vp}}}wwv}v}}v}vpw}vvvvvvv}vpv}vvvvvvpvv|vppvvpoppvpvvvopvooopvopopoooopooooollpplloooolllllllllllllllClolClClllClllllCCouCCCCCCClC?{CC!!9!@x!!!!! ! !!!!! ! !!! !!!!!!!!! !!   ! !  !! !q         !  !                                                                                          ֏}~~~~~~~~~~~ꫦ릥~~~~~~~~~~~~}}}}~}}}~}~}~}~~}}}~~}}~~}}~}}}}}מ}vw}}}}}}}}}ppvpvpp}}}}}}}vv}v}}}ppvvppppppvvvvppppppvopoppovvvoopvoooooopolopoopollvvollllovvuolllloloolllllllClllllCllllCllllCCCCCllllCluC{=!!!!Y_!!!!!!!!!!    ! ! !  !!! !!  !!     !!   ! !p        !                                                                                 ֏~~~~~~~~~~~릣~~~~}~~~}~~~}~}~}~~}}~}}}}~~~}}}}}}}}}}}ә}}v}}}}}}}}}}}}vp}}}ppv}}}pv}|vvpv}vpv}vopvpppvvvvvvvpvvplpppppvvpoppopoolooopoppooopolopolllopooplollulllolllllollllllCllClClllCCllClllClCClCC=!!!!B_!!!!!!!!! ! !!!! !!!!! ! !   ! !  ! !  !9q                                                                                     ֎~~~~~}}~~~~~ꦢڢ~~~~~~~~~}~~}}~}~}}}}}~}~~}}}}}}}}}}}p}}}}wv}}}}}ppvvpp|}pp}}}}}vpwpvvvvvppvvvvv}vppvwvpppppv}ppv}opppppppooppolloooooovppoooooooollllloolllClovvolloolllloovolllllClllCllCCllllllCCCCCuuCz!!!!Z_!! !!!! !!!!!!! !!! ! !! !    ! !!!  !!  !   =q                                                                                   ֏~~~~~~~~~}~~~릢~~}~~~~}}~~}}}~}}~~}}~}~}}}}}}}}}}}}}}}}Ӑ}wv}}p}}}}}}}vpv}p}}v}}}v}pv}v}vp|}vpvv|vv}pov|vvp}vppvvvpvvvvpovppvpopoopolovpppooooooooopoololloollllllopollllllllllvulCllCllollCCCClllloCCCllllCC!!!!=C_!!!!!!!!!!!!!!!!! ! !!!! ! !  !!! !! ! !!   =}           !   !                                                                                ֟~~~~~~}~~~~~~~~~~~ꥢ֦~~~~~}~~~}~~}~~~~}}}}~}}}~}}}}~}}}}}}}}}}}}}}}}}}}w}}}~~}pvp}}qvp|}}}}p}|vpppv}}ppppv}pppvvvpvvpv}vvv}}popopvvppvopvvvvvvppvvppvvvooovopvooopooovvolopooppollllouolltlllullClllllCCClolCCCCCClllCCCCCCt>u!!!9=Y_!!!!! !!!! !!  !  ! ! !!!!!!! ! !   !!!!!!!! !  !=}                                                                            ֏~}~}~~~}~~~~~~~~~~릡~~~~~~~~~~}~~~~~~}~~}}~}}}}}~}~~}}}}}}}}}~}}}}}}v}}v}}v}}}p}v}|wpw}}v}|}vpvv}}wpwvpvvvvvvpvvvpw}vpp}}povpvvvooppvvovvppvoppvvpvpooopoppoovoplovpooopolvvlllllopulllolllllClllClClllooCCCCllClllCCCCC{CC=!=!!B]!!!!!! !!!! !!!!!! !!!! ! !!!!  ! !!  !  !!   =s                                                                                                 ֠~~~~~~~~~~~~~ꦦ~~~~~~~}}~~}~~~}~}}~~~~}}}}~}}}~~~}}~~}}}~}~}}}}~}}}}}}}}}~}p|}}}}}}}}}ppv}vvvp}}}}}vvv|vpv}|}vpp}pppvvoovpopvvvvovvvvvolopopplollpoppovvllloovopollolvooolllllllloolllCllllllluuollllllCllCClCCClCCCCCClCluCu=!!!!B_!!!!!!!!!!! !!! !!! !!!! !! ! !!!  !! ! ! !!  ! =w                                                                                      ֠~~~}~~~~~~~~~~~~~~뫦ꦫ~~~~~~}~~~~~~}~}}}}~}~}~~}~}~~~~}}}}~}~~}}}}~~}}}}}}}}}}}}}}p}pv}}}}vv}}|v}pvp}}}}}pwvvppv|v}ppvvppvpppppopv|vvppvvvvoopvoopvolooovpopoloooooovopuooovoollollllllvlllCCllllllvolClllllCCCCllCCCllCCCCCCCCCC!=!!B_!!!!9!9!!! !!!  !  ! !!! ! !  !! !   !!   ! !=q       !                                                                                           ֏~~~~~~~~~ꥦ~~~~~~}~~~}~~~}~}~~~}}}}~~}}}}}}}~}}}}}}}}}}}}}}vp}}}}}}}}}}}p}qv}}v}p}p}}}ppp}}}}v|vvvppv}popvvvvvppovvvvooolpvpovvvppvvvvpovvpllovoollloolollooloollllooovvllllouolllllllllolCCllllClllCllCClllCCCCyCu!!!!!Y_!! !!!!!! ! !  !!!!!!!!!!! ! ! ! !!! ! ! !!!! !!  ! !  =}                                                                            ֟~}~~~~~~~~ꦦ~~~~~~~~}~~~~~~~~}}~~~~}~}}~}}}}}}}}~}}}}}}}}}}}}}}}}p}}}}}}}}}vv|}v|}vv}}}vvvvvvp}|}}vvpppvv}vpp|vpvppvpppvpoopopvpov}popvvvvpplvvolovvlloooooooloooooolllvulupllllootllllllloolCCllClCCloCllCClluCCCCC{CC!!!!!A_!!!! !!!! ! !!! !! !!!! !!! !  !! !!   !=}                                                              ֠~~}~~~~~}~~~~~~~~ꫦԫ~~~~~~~}}}}}}}~}}~~}}}~~}}}}~}}}}}}}}}}~}}}}p}}}wvppvp}}vvv}}}v}}}ppv|v}pppvv}vvvpvppvvvv}vpppvvvvppvppvpvpvpovllooopooollpvov}vllvpopvpooooollvoooolCloollllllllllClulllCCllClCCClCCCllCClClClCC{CC!!!!Yx!!!!!!!!!!!!! !!!!!  !!!! !!!!!!! !!     ! ! !!   ! !!!!!!   $q         !  !                                                              ֠~}}~~~}~~~~~~~뫦ݦ~~~~~}~~~}~~~~}}}}}}~~}}}}}}}}~~}}}}}}}}}}w}~}}}p}}v}}}}vvs}}}wpp|v}}p}}||v}pvvvvp|}|pppvvpv}pv|vpvvvvvvppvvo}wplvvppolopplpoooolvov}volvvolppooolovllooolllloullClllClClllllCCllCCllCCllllClCCCCllCllC{C>!!!!!C_$!!!!!!!!!!!!!  !! !!!!!! !!!!      !    !  !9p                                                             ֏}}~~~~~~~~~~~ꦥꥡ~~~~}}~~~}~}}}~~}~}}~}}~}~}~~}}}}}~}}}}}}}}w~}}}}}}}}|p}}|}}v}}}}vvvvv}}}}vv|v|vv}vvv|}vv}vppvvvpvvvvpvvpppv}povvvvvvvvoloppvvpollpollvplllloooovolllllolllllllllollCllllllCCuollllCClCClCCCCCCCCCCCClCl!!!!!Z]!!!!!!!! !!!! !! !!  !  !!  !!    ! ! !   !  ! !=}                                          ֏}}~~~~~}~~}}~~릣~~}~}}}~}~}}}~}~}~}}}}~~}~}}~}}}}}}}}}}}}}}v}}}}p}}}}}pv}}v}}}}}vv}v|v}}vpv|v}vp|vvvv}}pv}|ppvvppvvvpvpvvvvv}pppvvvvvvvooooovvpplloollooolooooooolloollolllllolCllllllllCllCCulCClCllCCllCCCCCCACllCCC{CC!!!!!B_ !=!!!  !!! !! !   ! ! !!  ! ! !   ! ! !!    !  !  !9          !                                                   ֏}~}~~~~~~~~~~ꦣܢ~~~~~~~}~~}~~}}}}}~}~}~~}}}~}}}}}~}}}}}}}}}}}}v|}}}}w}}|vvp}vpvv|}}}}vv|}vvvpv}|vv}vov}vpvvvpv}vpvvvvvvvppoovopopvpvvppvvvoloooppovopoooooolollvllllulloololllllllllClllCClllCClltlCllCCCCCCCCClCCCCCt$==9@_!!!!!! !!!!!!!!!!! !!! !!!!!! ! !  ! ! !!!  !  !q                                                 Տ~}~~}~~~~~~~~~~~~ꥦঢ}~~~~~}}~}~}~}~~}}~~}}}~}}}}}}}}}}}~}}}}~~}}}}}}}}v}}~}}v}vvv}||vv}}|vvv|vvvvvw}}vvvvpv}vop}vvvvvppvvpppoppppvvppooovvpvvvvplpolooopoovvlloolloovoClllllovlluluoououllCClCClllCCCloCCllCCCCCllCCCACCCxC!!=!!@_!!!! !!!!!!!!!! !!!9!!! ! !   ! ! ! ! !! !   =p                                                                  ֏}~~~~~~~~~~~~ꫦ}~}}~~~~}~~}}}~}}}}}~~}}}}}}~~}}}}}}}}~}}}}}v|vp}|}}vvvv}}}|vp}|}|vv}vvv}|vv||v|vvpv|vvpvvvpv}vvvpvvp}}ppvppvoopvoopoppllovpoollopvvoolopplopplllolllllllluplllCllllClllllCllllClllClCCllClllCCCCCCClCAlCl!9=!!Y_!!!!!!!! ! !!!!!!! ! !!! !!  !! !  !!   ! ! !!!! !    ! !=}                                                ֏~~~}~~~}}~~~~~~뫦ড~~~~~~~~~}~~~~~~~}}}}~}}}~}~~}}}}}}}~}}}~}}}~v|vvv|vp}}}vrpvvv}}vvv}}}|pppvv}}vvvv}}}vpv}vvvv|v|}vvvvvvvvvvvvpvpppoppopopvlolopopooollvvvolloolouvolllolloulllllllCCCllClllloClCllCllCCCCClttltlClCCCCCCCCCCC!!=!!Z]!!!!99!! ! ! !! !!!!!! !! !!   !  ! !!  ! ! ! !! !=}  !     !                                         ֠~~~~~}~~~~~ꦦ~~~~~~~}~}}}}}~~~}}~}}}~}}}}}}}}}}|}}}}|}}}}}}}}}v}}}}}v|}v}}v}v|}}}vvp|vv}vp|vvppvpvvvvopvvpvvvplvvpvopppvvvvvvooploppvppollplllooppllooooooloolloolloollllvlCloltlollllltlltllCCllCCCCCCllltlCCACCZl!!9!!B_!!!!!=!!!!!!!! !!!! !  ! ! !! !  !     !! !! ! !q       !                                   ֢~}~~~~~~~~~~~榦ꦡ~~~~}~~~~~}}~}}}}~~~~~}}~}}}~}}}}}|v}}|}}}}}}}}}}}~}~~}}}}vv}}}}|}vvv}v}vvv}vv|}}vvvpv}|pppppvpvpopvppvvvplopopopvvvvpvppovpooovvvlllollllvollolovlouvullolluolllllllvvlllooouuCCluoullltlCCCCllCCClultCCCCCCC!==!C]!!!!!!!!!! !! !! !!   ! !!!! ! ! !!    ! !  !q        !                                           ֟}~~~~~~~~~~~~~ꫦ~}~~~}~~~}~~~~~~}}}}}}}~}}}}}}}~~}}}}}}}}}}|}}}}}}}v}}|}|}}}v}|v|}}}v||}}vpv}vpv}vpvvvvvvv|vpvvvvvpppppvvpvvpoppvvpopovvvlvpoooovvovolvvvlllovolllllluulllluullltoolClllllllCCtlClClCllllllCCCCCllCllCCCClu!@!!Y_!9!!!!!!!!!!!! !!! !!!! !!!! !!  !!  !!     !  ! !=q      !                                Տ~}}}}}}}~~~~~~~~~릦ꦡ~~~~~~}~~~}}}~~~}}}}}}}}}}~}}}}}}}}}}~}}v|}}vv}vv|}}v}}||}}}vv}}}}vv}}vvvwvvvvvppvvvvv|}vpvvppvvpoppvvpvvvolopvoplovvppvoopvvvpoovppvvlllloolollllollllvvollooolllCCClCltClCCCCCCllltCllCltoClCCCCCCCCCC!$!!@x!!!!!!!!!!!!!!!  !! ! !  ! ! ! ! !!!! !!!!!!!!  !!!  =q                                           ֏}~~~~~~~~}~~~~ꦥ~~~~~~~}~~~~}~}~}}}~~}}~}~}~}}}}}}}}}~}}}}}}}}}}w}}}}v}}}|v}|}}}}vv|v|vv||vv|}}p|v|vvvvv}vvvvvpvvvvvvvpvppppvvpvppooppplpvppolovpoolvvvlvlllluouoololuolluluollllllllltlCltlllllCClClllCtlCCCCClClCCCAClCAClCu!!=!!Y_!!!!! !! !!!!!  ! !!!!! ! !!!  !    !  !!!!!  !   =}       !                                        ֠}}}}~}~~~~~}~}~~~~뫣ڡ~~~~}~~~~~~}~~~}}}~}}}~}}}}~}}}}}}}v}}}}}}}}}v}}||}}}}}}}}vvv}}v}}}v}}|vvvvv}|vvvvvvv}}|vv}}|vvvpvvvvv|vvvv}vvopvvvvpvoploooolooppooluvvovvouooululllvuouuolulloollllCllllllullvulCCClCCltCllllClCClCCCCCCCCtCCCCCC==!=$B_!!9!!! !  !!! !!!!!!! !!!!!!  !! ! !  ! !!!!!!! !  !!  ! =}       !                                      ֏~~~~~}}~~~~~ꫣ륢~~~~~~~}~}}~~}}}}}~~}}}}}}}}}}}}~}}}}}}}}}}}vv}}}}}}v}}}vvv|v}}vv||}}vv|}vvvvv|ppv}vvvvvpvppvvvvppvvppvvpvpopvoovvvvvovuppvlovpoollvoooopoulloloollluollolllllllltllllllllllCllCllllCClCCAltCCClCCClCCCACC=!!!!Y_!!!!!!!!!!!!!!!!! ! !!    ! ! !      !!  !        !   =}                                Վ~~}}~~~~~~~~~~~~~릣ڦ~~~~~}}}~}~}~}~}}}}}}}}}}}~~}}}~}}~}}}}}}}vvv}v}pvv}}}}|v}}}vvv}pvpvvvppvvvvvppppvpvvvplpvpv}}ooppvovvovvvvvooouvoovvvlluvoloouvvvvuulllloouvotllutlCllllllCCCCCoulllovtltlltlCAClCCCCCACCllCC=!!!!C_!!!!!!!!! !  ! !!    ! !  !! !! !!!! !    !  =}      !                           ֏~~~~~~~}~~~~~ꥡ륡~}}~}}~}}}}}}}~~}}}~}}}}~}}}}}~}}}}}}}}}}}}|v}}}v|}}}v||}v}}|}v}v|||vv||vvv}vvvvvvvvvvvpvppvvpvvvpo}}lovvvovvvvvovvvlvvovooololovvoooolluulloolllllolllululllullCllCCllullCClllllCCllCCClClCCCCCCCCx!!!!9Z_!!!!!!!! !!!!!!!!!!!!! !! ! !  !     !!! !!  !   !!     =q      !                  ֏~}~}}}~}}~~}~~}~}~~릢Ԧ~~~~~~}}}}~~}~~}}~}}~}}}}}|}}}}}}}}}v}}v}~}}~}}}||v}}}}}~}}|v}vvvv}}}vvvvv}vv}vp}}}vvvv}}p}vvvvvv}vvvvvvvvvvolvvvvvvvvullollvvvllllullovuvollolollluvllClllllloollotlllltlllltCClCCClCCCCClCllulCAClluCu!!!!=C_!!!!!!!! !!!!!!!!!!!  !  ! ! !  !!! !!!   !! ! ! !!  =q                              ֏~~}~~~~~~~~~~~~~~ꦦ}~~}~}~~}}~}}}~}}~}}}}~}}}~v|}}}}}}}}}}}}v|}}}}v}v}}}}}}vvv}}}}vv|vvvv|}}vpv}vvvpv}vpvvvvvvv}vvvppvvpovvvov}oopvopoovpvuuooouvooopoolllvvlllllluolulllllltolllllllllllllllllCCtlCCCClCCllCCCCAClt!!!!!Y_!!!!!!!! !!!! !!! ! !  !!! !   !    ! ! ! !    !!  !! ! !=w                                 ֏}~}}~}}~~~~~~}~~~~~~~~榦֣~~~~}~~}~~}}~}}}~}~}~}}}}}}}~~}}}}}}}~}}}}|}}s}vvvvv|}}}}}vvvv|}}vv|v||vvvppvvv}}|v}}}||vvpovv|wpvvvvoppvpoooopolpvvvooopoopvvvlvvvvouvvvulllluooullulluvvlllllllltllClullllllllltllClCCCClCCCCCCCCCCC!!!!!@] !!!!!!!!!!!!!!!!!  ! !!!  !!!!!   !! !!! !   !!!!! !  !!!  =q                                    ֏~~~~~~~~}~~~~ꫦ륡~~~}~~~}}}}}~~}}}}}~}~}}}}}}~}}}}}v~}}}}}}}}vv}}}}}}v|}v|v}|}}v|vvv||v}}vvv}vvvvvvv}vovvvvvvvvvvvopvpvvpovvpvolvvvlvloouopvvllvloooollpoollluvllollltulllllulClullCllClClllllllCCllCCCCClCCl==!!!C_!!!!!!!!! !!!! ! !  !!!  !! !   ! !      !   !    !!  ! !=q                              ֏}}~~}~~~~뫫Ԣ~~~}}}}}~}}}~}}}}~~}}}}}}}}}~}~}}~}}}}~}}~}}}}}}}}}}}vvvvv}|v}}}}}}vv}}}v}}}}vv}}}vpvvvv}vpv}}}vvvvvvppvpvvovvvvvvvvolvwov}vvpvlvvvolllloooouuovwvuolouolllllllouuluvolllltlCCllCCllCllulCltutlCAClC!!!!!Z]99! !!!! !  !!!!! !!!!!!         !! !!      !!! !=q      !                           ֏}}~~~}~}~}~~~~ꦥꥡ~}}~~~~}}}~~}}~~}~}}}}}~}}}}~}}}}~}}}}}}}}}}}}|}}}|}v|}}}|w}}}}}}}}vvv}vvv}vvvvvv}vvvvvwwwvvpvv}vovvvppvvpvoovvvvopvovvvlvvovuoovulouluooolovvlluollllltlullovlllllltllllultlCCllCCtlCCllllCAl!!!!!Z_!!!!!!!!!!!! !!!!!!! ! !! ! !! !  !!  !! !!   !  !!  ! !  ! =w  !!                  ֏~}}}}}~~}}~~~~~~}~~~~~~~~~~~楡ԡ~~~}}}}}~~}}}}}}~}}~}~}}~}}}}}}}|}}v}}}}}}wvvv}}}}}}}}}}|vpp}}}wv}}}v}vv}}}|}vvvvpoovvpppppvvvvov}vvvvvovoovvovvolllolllvvlloovvvvvoovoollloloollluvvooulClllllltlCClllllllCCCCCCllCCCCClC{9===!@]!!!!!!!!!!!!! ! !   ! !!! ! !!   !!! !  ! ! !!! !! !! ! !!! !=}        !                     ֟}~~}~~~}~~~~~~~~~~ꦢꥡ}}}}~~}}~}~}~~}}}}~~}}}}}}}}~}}}}}}}}}}}}}}|}}}|}}}v}}w}vvv}}v}vv|vvv}w}}vwvpvv|wvpvvvvvvvpvvvvvpvvpvvvvoovvvvvvplvvlouvolovvlovooovolloluoovluluoolClooltlllllllllltlCCtlllCCllClCCCCl{!!!!!B_!!!!!9!!!!!!!!!!!!!! !! ! !!!   !   !  !  ! !   !      !  =}                       ֠~~~~}}~~~~~~~~~~}릢~~}}}}~~}}}}}}}}}}}}~~}}~}}}}}}}}}}}}}}}}}}}}}vpv}}}}}v|vvvpvw|vv}vvvpop}wvvvpv}}vvvvopvvvvlovvvvvvoouvplovvvvvvopvollvollllovvuloulllovulllllllllClluuultlllllllClllllClltlCCClx!!$9!Zx!!!!!!!! ! !! !!!!!!!!!!   ! !!!!!!!! !!!  ! !! ! !   ! !! 9}     !                    ֟~~}~~~~~~~~~~~~~~~~~~ꥡࡡ~}}}~~~~}}}}}~~}}~}}}}}}}}~}}}}}}}~}}}}}}}}}}}}}}v}}}vv}}}}}}vv}}vvvvv}}}w}vvpvv}vvvpvvvvvvvpvvvvvlo}}vvppvovpuopvvovvopploluvovoluooolltpolooollvllullllllllovlllCltlllllllltCCllllCu!=!9!B_!!!!!!! !!!!! !! !!!!  ! !!! ! !  ! !       !    =q                      ֏~}}~~}~~}}~~~~~~~~~~~~~~}~~~~~ꥡ~~~~}}~}}~~}}~}}~~~~}~~}}}}}}}}}}}}}}v}}~}}}}}}}}}|v}vvvv}}}}v}}|v}}}}}}vv|vvvv}}vv}vvvvvvvvvvvvvvvvvoovvlpvvvvvvvvwvllpvvovlvvpvvvuloolloollovullllltlloulvuullllloullvtlCCCtuulCCluuy!!!!C_!!;9!!!!!!  !!!!  !!! ! !!  !  ! !! !! !   !!! !!!!! !! ! ! =}    !          ֏~~~~~}~~~~~~~~~~~~~~~~~ꥡࡑ~~~}}~}~}}}}}~~}~}}}|}}~}}}~}}}}}}}}}}}}}}}~}v}v}v}}}}}vv}}vv}}vv}}wv}}w}}wvvvv}vv}vpvvvov}vppvp}vopvvvvvvvvpovvvpv}oovvooolvvolovlouolltplolvlltlllllluolllllllllullltllllluollCClu=!!!!Y]!9!!!!!!!!!! !!! !! !!! ! !!     !   ! !!    !  !!!  =                    ֟}}~~}}~~}~~~~~ꦢ~~}~~~}~}~}}~}}}}}}}}}}}~~}}}}}}}}~}}}v}}}}}}}}}}}vv}w}}v}}vvv}}v}}}vwvvvvvvvvvppvv}vvw}}vvvvv}wvvvoovwvvovoolvollovvlloovvvolvullpvvoouvvvvvlovvlllovvlluulllCCllllCClltClClllCClu=9!!!@_!!! !!! !!!!! !!!   !!! !   !!  ! !   !!!!! ! !    !  !  !! !=q          ֏~~~~~~~~~~~~~~~~ꦥڑ~~~~~}}~}}~}~}~}}}}}}}}}}}}}}}}}}}}}}}}}}}Ӏ}}vw}v}}}vv}}v}}v}}vvv|vvv}}w}wvvvvv}}vv}vvvvvv}v|vpopvvvvvpvpovolvvvooluvoovuoppoooooollvvlolllollvvlloolllllllulllClullllCCClltu!!!!!B_!!!!!!! !!!! ! !! ! !! !  !  !   !!   !   ! !! ! !   ! 9q                ֏~~~~}}}~}~}~~~~~}~~~~楡~~}~~}~}~}}}~}}~}}}}}}}}}}}}}}~}v}~}}}}}}}}w}}}|}}}}}}|}}}}}vvv}w}}}wvvvvvvvw}}vpvvvvvvvvvvvvvvvvvvlopov}}vllvvluvppvollvvvovvvolllovvlllouulovvuoullllluuuvuutlluuouuullll!!!!!C_=! ! !!!!!!!!!!!!!!!!! !!!     !!! ! !! !     !!  !    =}                     ֏~}~~~~~~}}~~~~~~~~~~~ꥣڑ~}~~}~~}~}}}~}}}}}}}~}}}}~}}}}}}}}}}~}}}}}}}v}}}}}v}}v}}}}}}w}vwvv|v}vvvvvpv}}}vvpv}vvvvvvvvvvv}vpvooopovvvolvvpvooooolovolovvvlooouvvllulvoltvvlulllClluoovlllllloloollC!!!!9Zx!!! !!!!!! ! !9!!!! ! ! ! !     ! ! ! !! !!!     !  =}                 ֟~}}}~~~~~}~~~~~~~~~}~~~~~~~~~릣~}~}}}}}}~}}~}}}~}}}}~}}}}}}}}}~~}}}}}}v}w}}~}vvv}}}}vpvvvwv}v|}vv|vvv}}}}vvv}pvvpvvvvvpvvvvvvvpvvvvvvvvvpvoovoovvvvvvvvvlvvvoovllooooouullovvvullollltvouoooullloutlCCCll{@=!$=B_!!!!!!!!!9!!!!!!!!! !!! !!!!!!!!!! !    ! !!  !   !  !!!!  ! ! !! 9q                ֏}}}~~~~~}}~~}~~~~}~~~~~~~ꥡ~}~~}~~}~}}~}~}}}}~}}}}}}}}}}v}}}}}}}}}}}}}}}vv}}}}}}vvv}}}}v}}w}}vp}}vv}}v}vvvvvov}vovv}v|vvvovvvvoovvooooovoov}ovvvvoovoovovvoluluvooouovvuvvoollluvollvuulllluulllllu=!!!!B_!!!9!9!!!!!!!!! ! ! !! !! !!!  !    !  !      !  !  ! !  ! =p   !          ֏}}}~~~~~}~}}~~~릣~}~~}}}~}}}}}}}}~}~}}}~}}}}}}}}}~}}}}}}}}}}}}}}v|}}}}vvvvvv}}vvv}}ppv}}vvvvvvv}}vpvvpopppp}vvpvoo}vvvvvvvvovvulvolovvvolllvuovvlolllovvllCllluuloullvvlltllClllCCv9!!9!C_!!!!!! !! !!!!!!! !!  ! !!  !!!  !  !!  !! ! !!! ! ! !! ! !  !  =           ֏}}~~~~~}}~~~~~~~~}ꦡ뚑~}~}}}}~}~~}}}~}}}~}}}}}~}}}}}}v}}}}}v}}}vv}vvvw}}}vv}}vvv|vv}}}vov}}}|vvvvv}vpvvvpoovpvv}vovvvvvpvvv}voovvlovuoovvvlloovoovvvlllltpuolllluullvvllvlltoolCCllu!=!!=Y_!!!!!! ! ! !!!!!!!   !!!!  !!  !!    ! ! !!   ! !! ! !  !!   !!  =                 ֠~}~~}}~~~~}~~~~}}~~~~~}~}~ꥢ~ԡ~~}}}~~}}}}}}}}}}}}}}}}}}}}~}}}}}}}}}}}}v}}|}}w}}}}}vv}vv}}v}vv}vvwvv}vvvvvvvvvvv}}vvvovvvvvvvuvvv}voovovvolovvovvvvvvllvvvvvvuooouvvllluuvuullCClulClllllltluu!!!!!C_!!!!!!! !!!!!!! !!!!! !  !!!!!   !! !   ! ! !  !    !   !   >}                   ֏~~}~}~~}~}~~~~~}}~~~~~~}~~~~~~楦ڑ}~}}}~}}}}}}}}}}}}~}}}~~}}}}}}}}}}}}v}}}}}}}}}}v}}}}v}vvv}}}}vvvv}vv|}}}}wvvvvvvvv}}vvvvpvvplovvvwvvvvvovupuoouvvoopvvvvolouovvvvovvvuolCloovolllCllpoltvlCCluv=!!=!Zx!!!! !!!  !!  !!!  !!  !! !! !      ! ! !    !!!  !=q            ֢~~}}~~}~~~}~~~~~~~~~}~~ꦦ~ࡑ~~}}~}}}~~}}}}}}}}~}}}}}}~}}}}~}~}}}}}~}}}}}}w}v}v}}v}}}vv|vv}}}vv|}vvv}vvvvvvvvvvvvvvvvvvv}vvvvvvvlovvvvvvvvvvvvvpulvoovulvvuvollllloovlovuuollouvuullllotlul{!!!!!B_!!!!!!!!!!! !!!!!!!! !!!!!  !   ! !!! !   !!    ! !  ! !    !! 9q    !        ֠}}~~~~~~}~~}}}~~~}~~}~~~~ꥢԑ~}}~}}}}}}}}~}}}}}}}}}}}}}w}}}}}}}}}}}}}}}}v}vvv}}w}}vvvvv|}}}vvvvvvvvvv}}}vvvpppvvvpv}vvv}voooovwpovvovvvvvolovvoovpovvlllllulltlolluopulluvvvolCClllo{!!!!!Y_!!! !!!@!!! ! !!!!!!!! !! !!!!! ! !  !!  !   !    ! !!!    !!   ! =q           ֏}}}~~~~}}~}}}~~}~~~~ꦢ摑~}}}}~}}~}}}~~}~}~~}}}}~}}}}}}}}}}}}v}}}}v}|}wv}}v}}}}vv}}}}vwvv}ww|v}vvvvvvv}vvvvvvvvvvvvv}vvvvvvvlovvvuvvovvovoouvvvlovvvvlovvvvoullvuvoloolllllouuu{!!=9!B_!!!!! !!!!! !!!!!!! !    !  ! ! ! !! !!! !! ! ! !  !!!q             Տs}~}~~}}~}}}~~~~~~~}~~~~~~뭫ڑ}~~~}~}~~}~}}}}}}}}}}}~}~}}}}vv}}}}}}vv}vw}}}vv}}}w}}vw}}}v}}}}}}vv}}}vvvvvvvvov}vvv}}vvvvvv}vv}vv}}vplovvvvvvoolvvwvovuovolvuvtlovvvlllouvllllvullluvul{!=@=!B_!!!!!! ! ! !!!!  !   !!       !!! ! ! !  !!!!  !!!=q       ֏~}}}}~~~}~~~}~~~~~~ꥢ~~}~}}~~~~}~}}}}|}}w}}}}}}}}}}}}}}}}~}}v}}}}}vv}}}w}vvv|v}}vvvpw}vv}vv|vvvov}vwvvvvv}vopvvvvoovvovvvvvvvovulovoovvpllooovvvllvoouvvooouuuollluluvu!!!!!B_!!!!!!!!!!!!! !!!!! !!!!!!!!! !! ! !! !!! !    !  ! !   !!  !!     =q   !      ֎~}~~}~~}}~}~}~~~梡ڤ~}}}}~~}}}}}}}}}}}}~}}}}}}}}v}}}}w}}}}}}}}}ww}vv}}}}}vppvvvvvvvvvv}vv}vv}vvvvvvvvvvvvv}}voppvvvouvp}}vvvvvooooooovvuollllulvllllllvvvoluvvvllluolu!!!!!Y_!!!!!!!!!!!!!!! ! !!!!! ! !   !  ! !! ! ! !  !  !!!  ! ! 9p          ֏}}~}~}}~~}}~~}~~~~~~}~~~~~~~ꥡ~}}~~}}}~}~}}}}~}~}}}}}}}}}}}v}}}}}}}}}}}}}}w}}v}}}}vv}}}v}}}vv}}vvvv}}vvv}vwvvvvvv}vvvvpvvvvvvvvvvvvvuovvoovvoovvvvoooovvvovvuuvouuuuovulllllvlluou!!9!!Z_ !!;!!!!!!!!!! !! ! !!!! ! !!! !!  !  ! !  !  !  !!  !! !!!    ! !!=}    !          ֏s~~~}}~}}~}}~~~}}}~}}}~~}~~}~~~~~~~~楡ڡ~~}}}}}}}~}}}}}}}}}}}}}}}}}}}}v}}}v}}}}}vvv}}vvvv}}}}}}}}vvvvv}wvp}}w}vvvv}}}v|vpvvvpv}}vooovvvvoovlllovovvovvoovvvoopoopoovpvvullCllluvouou=!!@!Z_!!!=!! !!!! !!!! ! ! ! !!!  ! !  !  ! !! ! !!!!!   ! ! !  !!!  = ==      ֏}}}~}~}~~~~~~~~~~~~~~ꦦॡ~~~~~}}~~~~}}}}}~}}}}}~}}}}}}}}}}}}}}}}}}}}}}v}}v}}}v}w}}wvv}vvvvv}}vvv}vv}}vvvvvvvvvvvvvvvpuvvvvpvoovpvvvvvvoooovvuvooulovvlovuvvoolovvlouuuooolu{!!!!!@_!!! !!!!! ! !! !!! !! !  !!! !!   !  !   !  !  !   !    !   !=q  7ZCB>!      ֏s~~}~}~}~~}}~~~~}~~~}~ꦦ륑}}~~}}}}}}~}~}}}}}}~}}~}}}}}}}}}}}}}}}v}v}}vvv}}}}v}w}|vvvvvvvvvv|}}wv}}}}vv}vvvvwvvvvvvvvvpopoovoopvoooov}vvupouvovvvooollvlluvvvolovvvvvvvvuuuoo!!!!!B_!9! !!! !!!! !! !!!    ! !!   !! !    ! ! !!! ! ! ! !   =w  =ZC   ֏~~}}~~~}~~~~~~~~~~~~~~襢~~~}~}}}}}}}}}}}}~}}}}~~}}}}~}}}}}v}}}}}}}}v}}}}}}}vv}}vv}}}w}}vvvv}}vvvvvvvvvvvpv}vovvvvvpvwvuvvvvvvovvppvvvvolvvvovuuvvvovooullvulollolllolu!9!!!B_99!!! !!! ! !!!! ! !!! !! !!!!   !        ! !!!  !!   !  =}    8_>       ֟~}~}}~}}}}~~~~}}~~~~}~~~~~楣~ԡ~}~}~}~}}~}}}}}}}}}}}}}}}}}}}}}}}|}}}}}v}}|}}~wv}}}wv}}vvvvv}}vv}}|vv}vv}vvvvpv}vpvvv}vpvvvpoov}}wvpvvvv}vvvoovvoovvvvvopvvvvvoovvuvolollollllltoluloltu!!!9!Yx!!!!!! !!!!!!! !!! !  ! ! ! !! ! !!  ! !  !!! !  !   !   =w   >Bי_    ֏~}}~~~~}}~~~~~~~~~~~~~~~~ꥡڡ~}~~~}~~}}}}}}}}~}}}}}}}}}}}}}}}}}}v}}}}}}}}}}}w}v}}v}v}}vvv}}}}}vvvv|vwvvvvvvvv}vvvvvvvvvvvpvvvvvvvvvouvvuovvlvoouoouvvulopovvoooouuuuoovullulovvuo{!9!!!B_!!9! !!! !! !!! !!  !!!!!! ! !  !!!  ! !    !!  !  !!   !   !9q    $j_j!   ֏}}~}}~}}~~~}}}~~~~~}}}}~}~~~~ꥡॡ}~~~}}~}}}}~}}~}}}}}|}}~}}}}}}}}}}}}v}}}}}}v}}vvw}}}}vvv}w}}}}}}}v}vvv}}}vvvv}}vvvvvv}}}vovvvv}vpovvvvvvuoovvvvollvoolo}vlovvvlouvupollovvolllltvʘvv===!!Y_ !!!!!!!!!!! !! !   !! !!!!!  ! !  !! !!   ! !  ! ! !! ! !! !  !p$$8>        ֏~}}}~~~~~}~~~~}~~}~~~~~}~榢륑~~~~}~}}}~~}}}}}}}}}}}}}}}}~v}}}}}}}}}}}}}}}}}}}}w}}wwvw}}vv}}vvvv}wvvwv}vvvvww}vpvvv}vvvpvvvvvvvlvvvvvvvvvvovvvuvovvulvwoluvvouloopuvlllloouotlouv{vo!9!!!Y_!!!!! !! !!!! !!!!!!!! !!!   ! !   !  !  ! !!  !   !   ! !=q       ֎}~~}}}~~}}}}}}~~}}~~~~}~~뫦}~}}}}~~~}~~}}}}~}}~~}~}}}}}}}}}~}}}}}}}v}}}}}vvvw}}v}}}}}}}v}}}vvvvvppvv}}}wvvvvv}vvvpvvvpvvvpvwvvvvvvvpvvvlvvvvvvvoloopv}vovvoovvllvovvvvlluoltuvoovvvul{ulu!!!!!Z_!!! ! ! ! !!! !! !!! !   ! ! !!    !! !   ! ! !   !! =   ֏~~~~~}}~~}~~~~~~~~}~}~~ꥡ֡~~}~~~}}~~}}}~~}}}}}}}}}}}}}v}}}}}}}}}}}}}}}}}}v}}w}}wv}}}}vvv}}}v}vvv}v}wvvvvvvvvvvvvv}vvvvvpvvvovvvlvwvovoovvvvoovvoovvovvuovuououuoluvvloputllloououloulvߘul{!!99!Z_!!!!! !!!!! ! ! !! !! ! !! !!! ! ! !  !   ! !  !  !  !      !=} $    ֏}}}~~}}~}}}}~~}}~}}}}}}~}~~}ꡑڑ~}}~}~}~}~}}}}~}}}}}}}}}}}}~}}}}}}}}w}}}v}}}}|vpv}vvvv}}}}}vvvv}}vvpvpv}vvvvvvv}}vvvvvvvvvvvvvvovvollv}wvvvvvovvvuvlllooollupoollolluuoloouooolllllllo{uu=!@==Y]!9!! !!!!@!!!!!!!!!!!!! !!!  !!    ! !!! !  !   ! !   !!  !=q   ֏~~}}~}~~~~}}~~~~~}~}~楑॑~}~}~}}}}~}}~}}}}}}}}~}}}}}}}}}}}}}}}}}}}}}}v}}}}w}v}}vv}}vw}}vvvv}}vvwvpvv}vvw}vvvvvvwwvvvvvvvovvvuvvvlo}vvvpvllvwlvouovouvouooouooouooooououlullllululll{{ou==!!!C_!!!!! !!!!!! !!! !! ! ! !! ! ! !!  !  !  ! !   !  !  ! !  ! ! =q$      ֟~~}}}}}~}}}}~~~}~~}~ꥡ륡~~~~~}}~}}}}}~}}}}}}}}}}}}}}}}}v}}}}}}}}}}}}}}}}|}}vvvvv}}}vv}v}}}}}}}vpvv}vvvvpoppvwvpvvvvvvpvvvpvvvov}povloouwvvoloopvvpoouvvoovuvvvluvvvvvluouuuoluuuouߔtC{!!!!!Y_!!!!!!! !! ! !!!!!    !!!  !!!  !! !  ! !!   ! ! !!  ! ! !  !!9}!$  ֏}}~}~}~}}}}~~}~~~~}~~~~ꤡ~~~~}}}~}~~}}}}~}}}}}}}}}}}}}}}}}}}}}}}}}w}v}}}wv}}v}v}vv}vvv|v|v}}vvvvvvvv}}vvvvvvvvvvvvvvvvvvvvvpvvvovwvovoouvvvvvuoulvvvuvloovvolovvllvuouoloulooullouolo{{ul!!!9!C_!!!!!!! !!!! !! !!! !  ! ! !! !!  !       !  !   !! !q!!!  ֎s}}}}~}~}~~~~~}~~~~~~~~ꥢԡ~}}~~~}}}~}}}}}}}}}}}~}~}~}~}}}}~}}}}}}}}}}}}}vvv}}}vv}}}}}}}}}}wvvvvvvvv}}vv}wvvvv|}}vvvvvvv}}}vvpvvvvvvpooovv}wvvoovvovovvoovvvovvoolllvvuvoluluvlouupolllllllllultollllovlu!!!!!Yx!!!!! !!! !!!!! !!! !! ! ! !   ! !!!  !  !  !!  !! !  ! !!   !  =q Տ}~}}}}~}~}}}~}}~}~ꥢڥ~}}}~}}~~}}~}}~}}~}}}}~}}}}}}}|}}}}}~}}}}~}v}}}}}}}}}vv}}}}}}}}}}}}v}vvv}}v}vvw}vvvv}vvvvvvvv}vvvvv}vov}vpvovvvwwvuvoovovvvpovpvvuvvvoouluvovvlooooouoouoolllulCouoolulllullu߃ulv!!!!!C_!!! !! ! ! ! !!! ! !!! ! !  !   !  !    !  !   !! =w  ֏s~~}~}}}~~}}~}}}}}}}~}~}ꥢꑑ~}}~}}}}}}}}}}}}}}}}}}}}}}}}v}~}}}}}}vv}}}vv}}vv}}v}}}}v}}vvvvv}}}}wv}}vvvv}}}vopvwvpovvpuvvvvvvppvvovpvooooooovvolllouollovvllvuolllllllluvuoltuoolllltuolClluuC=9!!!Y_!! !!!!!!!!!! !!! !!!!!! ! ! !!!   !  !  !  !!  !!  !! !! ! !!=q  ֏}~~}~}}}~}~}}~~}~~~~~~~~ꥢꬡ~}}~}}}~}~}~}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}wv}}w}}v}v}vw}}vw}}vv}}}v}v}wvv}}vv}}vvv}wvvvvw}vvopvvpvvvvvpvvvvopuovoovvoouvuoooopulooupoouvuoulloullloulpllluulllolullllluvou!9!!!B_!!!! !!!!!! !!! ! !!!!!  !!!!    !!! ! !      ! !  ! !!   !9q    ֏~}~}}}}}}~~}~~~~}~}~}~~}~}~~~ꦡ맑}}}}}}}~}}}}}}}}}}}}}}~}}}}}}}~}}}v}~}~}}}}}}v}}}}}}}}}}vvv}}v}wvv}}wvvv}}vpp}}}v}vvv}vvvvvwvpvwwvv}uoppupvvvvvvvvvvvvvvloloovuuvuoovulooolooolouvulullllluuolluluoooltltlou{uC!==;=Z_!;!!!!9;!! !! ! ! !!  !! !  !    !!    !!  !    !     !! =}    ֏~~}~}}}~}}}}~}~}}}}}~~}~}}}~륡ԑ~~}~}}~~~}}}~~~}}}}}}}}~}}}}~}}}}}}}}}}}}}~}}}}}}}}}}}v}}vw}}v}}}vv}}}}wvvvvvv}ww}vv}vvvvvvvvvvv}vwvpvvvovvvuvvvvvvvpvpoulovovopolulovoooulvuoulloooulllulloulllllultlllllulluvll!!@!!Zx!!!!!!!!!#!!! !! ! ! !!  ! ! !!   !    !!!!   !   !  !  !=q֏}}}}}~~}}}}}}~}}~}}~}}~~~~~}桡ڡ}}~}}~}}}}}}}}~}}}}}}}v~}}}}}}}}}}}v}}}}}}}v}vv}}}}vvw}wvvvv}vvvv}}vvvvvpvvvvvvvvvvvvvvvvvvvvvvvvvvovoovvvwvvoopovvvvpooovvvvuouooooovouvuoollvvuollCClllllllltllllCCl{΃uly!!!!!Y_ !!!#!!!!!!!#!!!! !! ! !!!! !!  !  !!   !  !! !  !  ! !!! !   $q   ֏}}}}}}}~~~}}}~}~}~}}~~~~~}楑ڥ~~~~~~~}~}}}~}}}}~~}}}}}}}}}}}}}}}}}}}}}}}}}}}wv}}ww}v}}}vvv}w}}vvvv}vvv}}vvvvppvvv}}vvvvpvvvvvvvvvvvvvvovvooovvvvpuovovvvvuouloupuvvvvullloulvoltluvvvutllllttlltlClltltllCluutC!!!!!C_! !!! !! !!!!!! !! !!!! ! ! !!  !  !  !  !  !   !  !!   ! !! !$p    ֏~}}}}}~}}~~}}}~~}~}~~~ꥡꥥ}}~}}~}}}}}~}}}}}}}}}}}}}}}}}}}}}}}}}}}w}}}}}vvwv}w|}}}}vvvv}}vvv|vvvwvovv}vvvpppvvwvvvvvvvovpvouvvovvuvulvpvvvvvoooooluooooulovloltooouoououlllluuluvloltlCtuollltltllyߘutx!=@=!Y_!!!!!!!! !!!!! ! !  !!!!  !    !  !  !!! !!!! ! !! ! !!!! 9q  ֎}}~~}~}~~}~}~~~~}~~~~}~~~~ꥑꥑ~~~~}~~~}}~}}}}}}}}}}}}}}}}}}}}}}w}}}}}}}}}}}}}}}}|vvvv}}}v}}}|vv}vvvvw|vvvvvvvvvvvvvvvvvvpvvvvvpvvvvvlooovvoooovvvovvoououoooovvvulvlulovvlloouvulllovtlooulullllouuCClullClu{ul!!!!@Cx9;!! ! !!! ! ! ! !! ! !       ! !  !  !   ! ! !!  ! !q!   ֎~}}}}}}}}}}}}}}}}~}~~~~~~}}~}~~桑묑~}}}~~~}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}w}}ww}}}w}}}}}v}}}vv}}}vvvvv}}w}}}}}}wwv|vvvvvpvvwvvvvvvvvvpovupvvovvvvv}voooouooovvoopoouvuoollooolouuvvluuuolllllulllltlllullullllCltltulCluuCu!!!!9Z_! !!!!!!!! ! !! ! !!!  ! !  ! ! !   !! ! !!! !!  !!!  !   !!=}!    ֏}}}}~}}}}}}}}~~}}~}}}}~~}~~~~~}~ꥑؑ~~~~}~~~}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}v}}}}}vvw}}}}}w}}vv}}}}}}vvvv}}vvww}}}}vvv}vvvvvv}}vvvvvovpovpov}vovvvvwvooovvllvvopouoovovoouulovulooouvolvootlulltllllluvulutlulCllClloltCCCõlC{!!9!!B[!!!!!!#!!!! !! !! ! ! !! !  !!! ! !!  ! !! ! !  !   !!!9s$!    ֠}}~}~}}~~}}~~~~~}}~~}摑ꥡ}~}}}}}~~}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}w}vw}}w}v}w}}v}vv}vvvv}wvvvvvvvvvv}}vvvwvvvvpvvvvpvvvvvvv}vovvvpvlvvvvvoov}vuovouvolvuvlolvllluovllultllvoollvuulllullllltlCtltllllClCtlluulu!!@!!B_!!!!! !!! ! !!! !!!!!! !! ! !!!!   !    ! !     ! ! !  ! q      ֏~}}}~~}~}}~}}~~~~~~ꤑ묡~}}~~}~}}}~}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}v}w}v}vw}}}w}v}}w}}}v}vvvv}}vvvvvvpvvvv}vvvvwvvovovvpvv}vvv}vvvuvvouoovvvvvuvvvvuvovovuovvouuloulluvuooolltvluuCuvulullluultlllllotClCCCClllCCC{ߛulx!!!!!B_9! !!! !! !! ! !! !!! !!!  ! !!  !        !!  !  !  9s$   ֎}}}}}~}}}}}}~}~}}}}}}~}}}}}~~~}~~ꥡڢ~~}}}}}}}}}}}}}}}}}}}}}}}}}w}}}}}}}}}}v}}vvv}v}wvvvwww}}v}vvwwvvv}vvv|vvw}vvvvvvvovvvlvvvovpovvvvvulovvvvlulpouvvllupllovuvoluvulltlllvulClluulllllllllllCtotllllttuulCCCCClt{CC!!9!9Z_!!!!!!! !!!! ! ! ! !     !! !!!!!! ! !  ! ! !! ! !  ! ! =q!      ӏ}}}}}}}}}}}~}}~}}}}}}~}~~~~}}~}}~}~楢~}~}~}}}}}}}}}}}}}}}}}}}}v}}}w}}w}}wv}}}}}vv}vw}vvvvv}vvvw}}}vvvvvvvvvvv|vv}vvvvvvvpvvuopvvvvuovvovupoovvvlvooooouvulovouvoolvulvvllllllolllCloolllltlCtllCllullCllvllltCCCCCCCCxuCu!9==!C_!#!!!! ! !!!!!! !! !!!      !!!! !   !  ! !!  !  !!! 7p   ֠}}}}}}}}~~}~}}~~}}}}}}~~}~~ꥡԑ~}}}}}}}}}}}}}}}}}}}}}}}}}}v}}}}}}}w}}}}}}}w}}v}}v}}}wwv}}}}}vv}vv}vvv}vvvvvwvvvvwvv}}vvvvvvvovwvvvvvovvvvupvwvovvvvuvvououovvovvvovvuouuullloulluvuuuuuoolltooltuluulltlCtllClCtllCCCoutCCCClCl̃tC=!!!!Y_!!!!!!#!! !!!! ! !  !!! !!! !! ! !!   !!   ! !  !  !!  !! q  ֢}}}}~}}}}}~~}}}}~}~}}}}~~}}~ꥑꙑ~~~~}}}}}}}}}}}w}}}}}}}}}|}}}}~}}wv}}}}}v}}}}}}}}}w}vw}vvv}wwvvvvv}wvvvvvw|vvv}wvvv}wvvovvvovwwwvvwwvvupovvvvouvvvvlvoooluvolvvvvuvoopvvllltlulluvulvvuullllullouluotltlltllCCCltCCClultCCllCCCuxCl@!!!!Z_!!!! !!!! !! !! !!!!!! ! ! !!! !   !! !!  !  !  ! !      p!!     Տ}~}}}~}~}}~}~~}}}~~}~}}~}}}}}~ꡑ}}}~}}~}}}}}}}}}}}}}}}}}}}}}}}}}v}}}}}}}}}vv}}}}}wv}}}}}}}vv}v}v}vvvvv}wwvvvvpv}vvvvvvwvpv}vvvlvwvvvvvvuvuvvvvovovvvoovwuluuoloouolooouuvvoluollloolultolllulllllllluulCCtutllllCCCllllCZlCCCCߔtC{!!!!!B_!!!!! !!!!!!!#! !!!! !  ! !!! ! !!!  ! ! !!    !!  !!qՎ}}~}}}}~}~}}~}~}~}~}}~~}}~}~}}~~~~ꥑ楑}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}v}}}}}w}}vw}}}}}}v}}}}vv}vwwvv}}w}vvvw}wvvvvvv}vvw}}vvvvv}wvuvpvvvvvvoouvvvvvuoovuvvvvvvloolllovvlloooouvullulltluolooutltllCCClltllltCllulCCltCCCClttCCCCtCCCuzll!!!!!B_!! !;!!!!!!!!!! !!! !!   !! ! !  !! !! !     !!!!!=p!     ֟}}}}}~}}~}}}}}~}}~}~~~摡}}}}~}}~}}}}}}}}}}}}}}}}}}}}}}}}}v}}}}}}}}}v}}v}}}}vwvwv}}}}wvv}vvvvvvvvvvvvwvvvwvvvvvovovvvvvvvovvvvvoovvuvuvovuooovuoooovvvluvouvuuuollvoluouvvollltllllllltluulllllClllllCltlCltlCCCClltCltllCut{!!@!!Y_9!! !!!! #! !!! !#! !  ! !! ! ! !   ! !!!  !  9s7    ֠}}}}}}}~}}}~}~}}}~~}~}}~}~~~}}}~ꙡ}}~}}}}}}}}~}}}}}}}}}}}}}}}}}}}}}}vv}}}}}}}}}vw}}}vwvvv}}}}}w}}}vv}vwvvpvwvw}vvvwvvvvoovvuvuvvvuvvovvvoovvovvvvupoovvvvulvuvvlvvoovvvlouolulluvuuulullullltlloouvtlCCCClClttlCllClttlCCCCltlCltCCAuߔCC!!@=!Bx!!!!!#!!!!! ! !!!!!! ! !  !! !   !   !  ! !      !=s!  ֏}}~~}}~}}}}}}~}}~}}~}}}~}}~~}~ꥢ}~}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}w}}}}}vv}v}}v}}}vw}}}}}wwwwvw}wvwwvvwvvvvwwvvvvvvvov}vvvvvovvvvvvvuvvvovvvlovouvvvvoooovovooolu}ullulluvlolluoolllllullluullltluvlltllltlltlllCZCCllCltlCCllCCCCCCltzCx!!9!!Y_!!!! !!!! !!!! !!!  ! !!  !!! !!  !  !   !q  ֏}}}}~}}~~}}~}}}}}}~}~}~}~}}}~}릡ڤ~}}}}}~}}}}}}}}}}}}}}}}}}w}}}}}w}}}}v}}vvv}v}}vv}}}v}v}}}}wvv}}vw}}}wvvwvvvvvvvwvvppovvvvwvvvvvvvpvvuvvvvvovvooouvovvvuoluoouvoullvvvllolllvulooootllllulllovptlluoooultlltltClltlllCCltClCuClZCtCCCltlCCutl!!=9!C_ !!! !!!!!!!#! ! ! ! ! !! !! !! ! !!!!! ! !  !   !  q   ֏}}}~}}}}}}~}}}~}}}~}~}~~}}}~~}}}~楑}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}w}}}}v}}}}}w}}w}wv|w}}ww}}wvv}vvvvwvwwvvwvvv}vvvvvvvvvwvvvovvvvvopvuvuvuuvvvvvouvvlovvuovvvvlluvulvvuluoouuuoloolltlulluulllllllllllltllllCCtlllCltlCClZlCClllCCClCCCCCߔlt!!;!!Y_!!!#!! !!!! !!! ! ! ! ! ! ! !! !! !!   ! ! ! !   !!p  Տ}}}}}}~}~}}~}}}}}}}}}}}}~}}~}~}}}ꙡڙ}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}w}}}}}}}}}}v}}}}ww}}vv}}ww}w}}}}vvwvvvwv}wv}wvvvvv}vvvvvwvvvvwvvopvvvpovvvovvvvwvvvooovvlvvvvovvvvlloollvvvolvvovuuulultlllluuullltlllCClulltlCtlCllttCCCCClClCClClZCZCCCCCllCZ{C!!!!!@_!!!;!!! !!!!! ! !! ! !!! !! ! ! !  !       ! !  !$p  ֏}}}}}}}}~}}}}~~}}}}~}~}}}}}~}~}楢}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}w}}}}}}}}}wv}}}}}w}vv}}}}www}vwwvvvwwvvvvvv}vv}}wvvovvvvvvvpvvvvvwvvuvvwvovuvuvovuvvovvuouvoluoouuouooluvtluvollolllluouuouolllttllltlttltlllllCltltlCtCltlCCCCZlllllCCCCCZCCCA{u]!!99Y_!!!!! !!! ! !#! !! ! ! !   ! ! ! ! ! q ֏}~~}}}}}}}~}}}}}}~~}}~}}}~}}}}}~~}~}~~榥ڑ}}}}~}}}}}}}}}}}}}}}}}}}}w}}}w}vvw}}www}}}v}}}}}}}}}wvwvvvvvvvw}vvvpvwv}}}}wvvvvwwwvvpuvvvvwwvvpvvvvooovvvoovvvvvvvoovuoolovollluovullvvuuultlolououuoulouootuullltllCltltllClltltlCltuCClCCltlCCCCCCCCCCCCux!!!!9C_!!!!!!#!! !!!! !! !!  !!! !     !    ! !  !!=q  ֏}}}}}}}~~}}}~}}}~}~}}~~~~}~}}}~~}楡}}}~}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}wv}}}}w}}}w}vwwvvvvv}}vvvvvvwvvvvvvvvvvvvvvpvvvwvvvvvovvvvvovvvvuvvuvllvlvvlooouvuuvuovlluuolloolooultlloouollllllloCCuulllCltlltCCulllCllCtlCCCCZlCCltCCZlCCCCCCC{!!!!@Y_!!!#!!!! !;! ! ! ! ! ! !  !   !!  !  !  !! !=q! ֠}}}}}}}}}}}}}~~}~}}}}~~}}}}}~~}~}~}}~}~}ꥡӑ}}}}}}}}~}}}}}}}}}}}}}}}}}}}}}w}}}}}v}}vwwvw}}}}}}}}w}}}}pww}}}vvvvvvvv}}}vvvwvvvvvvvvwvvvwvvvwwvvoovvvulvwvovwvooouoluooluuluooovvovvululuvtlouuloullluloooulCltlllllluullltCllotCCllttttCClZClCClCCCCZlllCCClCtCCCC@9!!!B_!!!!!!!!! !!!!! ! ! !!!! ! ! !! !  ! !   ! ! !!!!  }  ֏}}}}}~}}}}}}}~}}}}}}~}}}~}}}}}}~椑}~~}}}}}}}}}}}}}}}}}}}}v}}v}}}}}}}vw}}}}}}}}wv}}v}}wvvw}}vvvvwv}vvvvvvvwvvvvvvv}wvpwwvov}vovpv}vvouv}voovuovvvoovvoovvuvouuouuouololuooouuolluuuolltluultuulltltllllCtllCtllllCtlCllClCClCCCCCCCCCCCCCZCCCCCCCCC{=!!!!Z_!9!!! !! !!!! !! ! ! !!    !  !  ! !q Տ}}}~}}}}}~}}}}}~}}~~}}~}~~}}}}}}~~~~}}}~~ꤑӑ}}~~}}}}}}}}}}}}}}}}}}}}}ww}}}}}}vv}}}w}}}}vvvv}wvvvw}}}v}}}w}vvvvwww}wuvvvwwvvvvvvvvvvopov}vvvvvvvuooooovvuoloouvuvvovvoovoluuulllooooullovvtllullooutvutltllltClltllCCCltlltCCCCttCtCCCCtCCCCCCCClCACCCtCCll!!!@!B_!! !! !! !! !! !!    !!!! !   !! ! !!   p Վ}}}}~}}}}}~}~}}}~~}}}}~~}}~}~}~}}~}椑}}~}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}w}}w}}w}v}}}}v}}}wwvww}}wvv}}vvvvvv}wvvvvvvvvvvvvvvvvvvvouvv}vvvuvovouvvuvvvvvuuvuolvvuuoluvolovoluouuuolltuulltluluuuolllllllCtlltltlClCuulCCllClCCllllCCtlCCCCCCCCCCCCCCCCCtC!!9!!Z_!!!#!!!!!! ! ! ! ! ! !! ! ! !   ! ! ! ! ! !!q7!֎}}}}}~}}~}~}~}~}}}}}}}}~}}~}}~}}}ꥡԑ}}}}}}}}}}}}}}}}}}}}}vv}}}}}}}}}}v}w}vvvw}}}vwvv}}}}}vwvvvvvv}wwvvvvvwvvvoovvvvvvvvpuvvwvuvovvloouwvvvulovvvvvulluouuluuulvvtllouvuulououluoooullllCClluuullulCCttltllutCCtlClZCCCltClltCCtlZCCCClZCCAACCCx!!!!=Z_!9!! !#!!!! ! !!! ! ! !!!  !!  !!   ! !! !9s$֎}}}}}}}}~~}}}~}~}}}}}~}}}}~}~}~}~~~~~}}~~ꙑ}}}}}}}}}}}}}}}}}}}}}}}}}w}}}}}}}}}}}w}}}}}w}}}w}}vww}vwwvw}wvvwvvvvvwvvvvwvvvvvvvuvvvvvvvvvovvvvvvvouoowvuvoouvvvouoovvvvoooooouuouuluuouuuoolultluolluultlCtullllCClulClCtulCllCCCllCCtCCCZCCCtCClCZCCCCCCCZC@!!9!;Z_!!!!!!!! ! ! !! !! !!! !  ! !!! ! ! ! !  }!7֎}}}}}}}}}}}}}}}}}~}}}~}}}~}}}~~~}}~ꑑڥ}~}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}w}}}ww}w}}}v}}}}v}}}}}wvvvvvwv}}}}vvvvv}vvwvvvvvv}}wwvvw}vvovvw}wvuvvwvuuovvvvvuvouvulvuvvvvuoouvuvvvuloovvovuvullloooluluououlotllouvtClltllluClllCClouuulZCCClCCCltCCCCCCltCCClCACCCCClC{!;!!!B_ ! !!! !!!!! !!! ! !!! ! ! !  ! !!!! ! !!  !=s֏}}}}}}}}~}}~}}}}}}}}}}}}}}}~~}}}~~}~椑}}}}}}}}}}}}}}}}}}}}}}v}}}w}}}}}}}w}}}w}}}}}}w}}}}w}}w}wvv}}v}v}vvvwvvvvvvvvvwwvvvvvvw}vvvvvvvwvvvuvvvpuovvvuvuvvvvvoovvoovuoovvuuvuoououvoooooltvuuolloolluollloltuulCltltltllttltlCtllulCllCtlCCulCClCCCtlCCCCCACZCACuC!$!!!Y_!!!!! !!! !! ! ! ! ! ! ! ! !  ! !!     !!q!$֏}}}}}}}}}}}}}}}}}}~}}}}~}}}}}}}}}~}}~ꥑڑ~}}}}}}}}}}}}}}}}}}}}}}}}}}wvw}}}}wv}}}}}}}vvv}}}w}}}}vvwvv}}wwvvwwvvvw}vvvvvvvvvuvvvvvwwvvpvvooooooooovvwvvvvloulloouovvolovuvvuolluuuvoovvvutltCllllCuuullllCCllllllCCluullCCCClllCtlllZlCCCCClCCCCCCCCCACCCACl!!!!!C_;!#! !!#! !!!! ! ! ! ! !! !  !!=q֟}}}}}}}~}}}}}}}}}}}}}}~}~~~}}~~}}~}}}摑}}}}}}}}}}~}}}}}}}}w}}}}}}w}}v}}}}}}}}w}}ww}w}}wvwv}}}vv}wwvvv}vvv}vvvvvvvvvvvvvvvvvvvvvvvvvvuvuvvvvuvuuvvvuuvvvvoouvoouuoluvuuvvulovololuuuuooolluululluulllllltltltlCCuullCCCCCtlCtllCtllCCCCttCCCCCCCZCCCtC@CZ!!#!!Y_!!!!!!!!!!!#! !!!! ! !! !! ! !!   !   =q!!֢}w}}}}~}}}~~}}}}}~}}}}}}}}}~}~}}}}}}}~}}~}}ꤡڥ}}}}}~}}}}}}}}}}}}}}}}}}}}}v}w}}}}}}}w}}}}wvv}}}}}}}}}析}vvvv}}vvv}}v}vvvwwvvvwwvvvvvwvvvvuvvvvvvvvvvvvoouvouvvvvvvvvvloouuvolllvvlovotlloulllluvvuouulCltllClCCllloutllllCCCCClCltllutCCCCCttltCCCZCCCCCCCCCCCC!!!@!@_!!!!#!!#!!!!!!# !!!#!!! ! ! !   !  ! !!  =s$!!֠}}}}}}}}}}}}}}}}~}}}~}}~}}}~}~~~}~~}~~~}~}椑}}}}}~}}}}}}}}}}}}}}}}}}}}}}}v}}}}}}}}}}}}}w}ww}}}wv}vvvvv}}vvvvvwvvvwvvvvvvvvvuvvvvuvvvvwvvvvvouvuvvovuuvvvvulvvovoluluuuluoovlluvlllltuuCluollultltttulCtllllulCCtlCttlCllZolCCCCClClCCCZCClZCCCCCCCCu!9!!!Y_!!!!!!!!!!!#!!!! !!!!! !! !! ! ! !    p!֟}}}}}}}}~~}~}}}}~}}}}~}}}}}}}}}}~}}~~}}}}}椑}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}w}vwwv}vwvv}}}wvww}׆vv}vvwv}vvvvvw}wvuvvvwvvuvvvuvvuvvvvvvvvvuooovullouuouvolvvvuluooptlluuluulluvulllulCCluClllouolluuuotCluvuuultllvtCClltllZCttttCCCllCClllZCZCCZC=;!!!@_!#!!!#!! !!!! !! !!!! !  ! ! !  !! !p!77Տ}}}}}}}}}}}}}}}}}}}~~}~}}}}~~~~}}}}~~~~}}~~~}楡}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}ww}w}}}wwv}}}ww}wӐ}vvvvvvvvvvv}vvvvvvvwvvvuvvvvvovvuuvvvvvvvoovvouvvllvvulvuuouvuuuloluvoooluvullulvulluultlluulllltlllltttllllCtlulCCulCCtlClllCCCZlCCZCCtlCCCCC{!!!!!Y_!!!!#!! !!! ! !#! ! ! !  ! !    !$q!775Վ}}}}}}}}}~}}}}}}}}}}}}}}}}}}}~}~}}}}}~ड}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}w}w}}}}}}}}}}}}}}}}Әww}vvvvvvw}vvvvuvvvvvvuvpvwwvouovvouvuvuuuuvvvuvvvllvulluooulooulluoooooullullouluvuuullullultluClllltlllCCCCCCCtCCCZCClltCCCCCCCCtlCCCCCCCCCCC!;!9@C_! !!=#!!#!!! ! ! !! ! !! ! ! ! !  !!=q7!֏}}}}}}}}}}}}}}}}}}}}}}}~}~}}~}}}}~}}~}~}~}~}}桑}}}}}~}}}}}}}}}}}}}}}}}}}}}}}w}}v}}}}}v}}ww}}ww}}}әvvwvvwwwvvvvvvvvvvvvvvvuvvuvvvvvvvvuvovuvoovvvvvvvvoovvuuuovuolvvolupooouoluloltooltuollvulloululllullCCtulCtllCZCllllCtlCCttCCCCCZCCCCtlCCCCCBCCCZ!!!!9Y_!! !!!!!#$! !! ! ! ! ! ! ! !   !  !q!$!7֢}v}}}~}}}}}}}}}}}~}~}}}}}}}}}~~}}}}}~}}}}~}}~Ꙁ뤑}}}}}}}}}}}}}}}}}}}}}}}}w}w}}v}}}}}}}}}}vww}}w}٘w}}vvwwvvvvvvvvvvvvvvvwvvvvovvvvvwwvvvuvvvvvvvuvwvvuvvuuluvvuvuovvuouvuovvuvuvvuuuuuvulCloutlluluullllCtltuClltCCCCCloulZCtlltltlCClZulllZCClZCCCCACCCCv!9!!9Z_!! !#! !!! ! !!!!! ! !!!!  ! ! !!   !  q!!!$!!7֏}}}}}}}}}}}}}}~}}}}}}}}}}}~}}}}}}}}}}}}摑}}}}}}}}}}}}}}}}}}}}w}}}}}}}}}}}}}}}v}w}}}v}}v}}}}}wv}v}wvvvv}v{vvvvvvvvvv}wvuvvv}vvvvvovvvwvvulv}vuuvuoovvvvuoolvvuuouoououvoouluuouolltluuoolltoulttlllltllCultulCZltulCltltlCllCCCllCCCCCCCCCCZCCCCCZ!9!9!Z_!!!!! ! ! ! !!! ! ! !#! ! !   !  !q!!Տ~}}}}}}}}}~}}}}}}}}}}}}}~}~}}~}}}}}}}}~}}}}}}}}}}}}ꥡ}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}vvv}wvv}}vvvvvvwvvv}}vvvw}wvvvvvuuov}vvvv}wvuvvvuvvvvuvvvv}oovvvououououuluvovvuvllllvulllouuvtlotluoltlllululultullutltlltCCoClltltultCCCCutlCZCCCCCCZCCCClZCCC{@!!!!@_!!;! ! !!!!!! !!! !  !!!  !! !!  ! !$p757Տ}~}}}}}}}~}}}}}}~}}}}}}}}}~}}}~~}}}~~}~}}}}}}~}}~}}}楡}~}}}}}}}}}}}}}}w}}}}}}}}}}}}}}}wwwwww}vw}v}}v}}}vvv}wvv}v}wvvvvvvvvuvvwvvvvvuovvvvvuvuuvvuvvuuvvuoooououvlloouuuououuuluooluouvoluooltlltluulllluulltlllltlClulCCulullllCCCZltCCCCCCZltClCCCtCCCC=!!!!Y_!!#!! !! !!!#!# ! !  !! !  !  p7!!՟}}}}}}}}}}}}}}}}}}}}}}}}~}}}}}}}}}}}}~}}}}}}}त}}}}}}}}}}}}}}}}}}}}}}}}}w}w}w}}}}}}}}}}}}}}wvwvv{vvvv}}}wwvyvvw}wvwvvvvvvvvouvvvvuoovvvolovwvvuvvvvvououuvvovvooluvvvooutlluouuouutlluuuouulluClutllttlulttClltCCCCCCCZltlCClZCCulClCCCCCCCCCC@;!!9!C_!!!!#!#! ! !! ! !!!! !!   ! !   !q!!!!֏}}}}}}}}}}}}}}}v}v}}~}}}}|}~}}}}}~}}}}}}}楡ӑ}}}}}}}}}}}}}}}}}}}}}}}}}}}}~ww}w}}}}w}}}}w}}w}}}w}}vwvӞvvw}wvvw}v{}vvvvvvuvvvuuovvvvvovuuuouuvvvovvvvvvoooovvtlvvoluuvvuuuoluuvulluullluuulluulltltullllltlllllttlCCCuCCCCCllCCCCCltCCCCCZCCCCBA@u!!!!;Z_!! !!9!!! ! !! ! !      !q!!!!֎}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}ड~}}}}}}}}}}}}}}}}}}}}}}}}w}}}v}}}vv}}}}}w}vvw}w}}}}}{}}{wvvvvvvv}vvvvvvvvvuvvvvvvvvvuvvuvvvvvvooulvvuuvvuovuovvuuvvuuvultlluuuuuvlluvotullouClluCCllllluutltCCuuulltuCltttltluCCZluCCluCZCCllZtCCCC9#!!!@x;!! !!!!!!!!!!! ! !! ! !!  ! !! ! q7!7$!777֏}}}}}}}}}}~}}}}}}}~}}}}}}}}}}}}}}}~}}}}~}}椑}Ӏ}}}}~}}}}}}}}}}}}~}}}}}}w}}}}ww}v}ww}v}}v}v}}}}}}}}wvv}vwvvw}vvvwvvwvvvvvouvupvvvuvvvuuvovuvvvvvvuuovvuvvvuuovuuuovvuluvvluvluuvuoooltouoolotullCuulltllCuutlltllutolCtlCCullCCtllCllCtCCCtlCCuCulCCC!!=!!Bx!!!!!!! #!!!!#! ! ! !     !=q!7!Տ}}}}}wv}}}v}}}}}}}}}}}}}}}}~}}}}}}}}}}}}}~}}}}}}}}}ॡ}}}}}}}}}}}}}}}}}}}}}}}}}}w}}}}}}}}w}}w}}}w}v}}}wwwvw}wwv}vvvvvww}wvvwvvvvwvvvvvvvvvvvwvvvuoovuvuvvvvvvuouvulvuvoluluvtluulooullloouuuuvtlluvuuuullutlututCllltluCCClCtlluCoutltCCCCCCCltCCCCCBCCCCCCCu!!;!!@_! !! !!#!! !!! ! !! ! ! !  !    $}7!7!!֏}}}}}}}}w}w}}}}}}}}}}}}}}}}}}}}}}}}}}~}}}}}}}}~}椡~~}~}}}}}}}}}}}}}}}}}}}}}}}}}}}}}w}w}}}}}}v}}}w}}}}wvw}}}wvvv}vv}}vvvvvw{wvvwvvvvvvvwvvvvvvvvvvwvvvouovvvuvuvvvvuvvouvvvvuluovuoooluuuuoCtuuvulvuoluuvooullZlllllulCuulllllCCCtutltlullCCCCCCZCCCtCCCCCCCCuCCCZ=9!!!Y_! !! ! !! !! ! ! !!   !!   q!!75Տ}}v}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}ꙑ}}}}}}}}}}}}}}~}}}}}}}}}}}v}}}}}}}}}}}}v}}v}v}}wv}}}vv}v}}v}}wvv}}}}v}}vvuvvvvvvvvuvvvwvvvvvuvvvvvvuvuvvvvuouuuuouvlovvuullvuuvluvluvvvvlououllluvllltClouuuuulultCCltlttlZutllulCCCCCZlutuCCCCCClttCCCCCZCCCC;!!!!B_!!!;!!!!! ! ! !!! !!! ! ! ! !! p!7Վs}v}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}摑}ڑ}}}}}}}}~}}}}}}}}w}}}}}}}}}}}}}}}}}}}}}}}}w}}}wvv}}ww}}wvv}ww}}vv}vv}v}}}wvvvvvvv}vvvvvvvvvvvvvvvvvuovvvvlvvvvvuooovuuvluwvoluuvvouoovuouvvvououvlCluvltllultuoooulCtllCullltolluultllCCClCCltlCCCCCCZlCCCCZCCCCZt!!!!;Z_!!#!!!#!#! ! ! !! !! !    !! q!$֏}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}ꙑ}}}}}}}}}}}}~}}}}}}w}}}}}}}}}ww}}vv}w}ww}w}}}}}}}}vw}w}}wwvv}}}vvvvvvv}vvwvw{vw}vvwvvwvuvvvvuuuvvvvvvuvvuuuuuvuvvuvvvullvvllvovvuvulluullulluvluutultluutuuululoullouuuoullltCCCCCCCtCCCttCClCuCCZCClCCCtCouCCCC@! !!B_!!!! !! ! !#!!# !!! ! !  =q!77}}}}}}}}}v}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}摑}ڑ}}}}}}}}}}}}}}}~}}}}}}}}}}}}}}}}}}}wvvww}w}}wvww}}w}}}}v}}}vvwvvvvvvvvvwvvw}wvwvvv}v}vvuuvvuouvvvuuwvvvvuoovvvuvuuuvuuouuuuuvuuvvuuouuulltlluvuoouvlluvuvuuluotlultuvlltllZlCCCCtCCZCCCCCtlCCCCCCultCCCZtltlCCZx!!!!9Y_! !!! !#!;! !#! ! !!  !  =p5!77բ}}}}}w}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}Ꙁ}}}}}}}}}}}}}}}}}}}}}}}}}w}}}}}}}}}}}}}}}v}ww}}}w}}ww}vwv}}}wvvw}}v}wvwvvvwvvvvvvv}vuvvvw}|vvvvvuuvvuvvvvvuuuvvwvuvvvuvuoolvvuullouoououvuluvuluotlllltllllllllCClttCltllutluClulllltCtlCCutttttllZClCClCCCCCC!!!!=Z_!;!#! ! !!!!! !! ! !  !  q7֢}}}}}}}w}v}}}}}}}}}}}}}}}}}}}w}}}}}}}}}}}}}}}}}摀}}}}}}}}}}}}w}}}}}}}}}}}}}}}}}vv}}v}}w}}}}v}vv}}v}w}wvvvwvvw}vvv}ʞ}vvvw}vvv{vvvvvvvvvvvuvvvw}vvuvvvuvvuuvvvvuvvvvvvuuvvvluluuolluvvuulluvtotouuoulltltllluCltlulCCllCCluuvuulCZlCCtlCCtlCtllluultlCltCCtlCCCC!! ;!Yx!!;!! ! !!!! ! ! !!    !s$5!Վ}w}}}ww}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}摑~}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}ww}v}}v}}}w}}v}}}vvv}}v}vwvvv}vvvwvvvvvvvvvvvvvvuvvuuuvuvvvvvvuvuvvuovuoovvuuvuuvvuvuvtvloulvwouullotluooulltltlluluttluuullCCllllllulCCltlCtltCCCllCCCtCCCClZCCCx!!!!!B_ !!#!!!!! !! !!  !=q7Տsv}}}w}}}}}}}}vv}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}摑}}}}}}}}}}}}}}}}}}}}}}}}}}}}}w}}}}}}}}wv}}w}wv}}w}}wvv}}vv}}wvvwvvw}vvvvuvwvvwvvvwwvuuvovvvvuw}vvtvvuououvvluvuuvlovuluuvvuuluouvvuvvllllluuulullCttlulllouuuoCCCCCCtltttlCCtlCCtllCCCZlCCCCtCCCCCCZC!!#!!Y_ !!!!;;! ! ! !;!   !   !  !=q77!!!75Տwv}}}}}v}}}}}}}}}}}}}}}}}}}}}}}}}~}}}}}}}}}}}}}}}}}~}}}}}}}}}}}}}}}}}}}}}}}}}}}}ww}}}}}}}}}w}}w}}vw}}w}vw}}v}}ww}vwv}vvwvvvvvvwvvwvvvvvvvvvvvuvvvvuvvvuvvuouuouvvvouovvvllvvvuuuoouvouuluooultluuuullvulluulllltutluollltuuuultCCllttltttlZCCZCltlZCCCCZtZCCll=;!!!B_!!! ! !! !!!! !   q777!$7!$!֏vv}}}wv}}}}}}}}}}}}}}}}}}}}}}}}~}}}}}}}}}}}}}}}}~}}}}}}}~}}}}}}}}}}}}w}}}}}}v}}ww}}}}}}vv}v}w}vvwvwv}}}}v}}}}}}w}}}vv}w}vvvvvvvvvwvwvvvvuvvuvvuvvvvvwvvvuvulooouovvuuluvvvlluvuuolvuvvulvuuuuuoltluvuullltltllCCCouvuulCCCtluuuullttluullllllllCltullCCCtllCC@Cu@!!;!Y_!! ! !  !! ! p7!57Տ}}w}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}~~}}}}}}晑}}ӑ}}}}}}}}}}}}}}}}}}}}}}}}}v}}}}w}}}}}w}}}www}v}}w}vv}}vv}w}wvwvvvwvw}}vyvvvvvwwvvvvvvvvuovvvvwvvuuovvvvvvvouvvvvluuvlovuvluuvuuulluoooluuollluuuuClouluuuuutlllltutuutlllltCllCltCCCltuCCllZCCCCCCtlCCCCC=9!!!Y_!#!! !!! ! !! !  ! =q7!!!!77}}}}}vv}}}vvvvvvv}}}}}}}}}v}}}}}}}}}}}w}}}}}}}}}}}}}}~ꥑ}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}w}}}}}w}w}}wvvv}vvvvww}}v{vwww}wvvvw}}vvv}}vvvvw}v{wwvvvvvvuvvwvwvulvvuvwwvuuoluuvulouuuuoluluvvluolClllllulllCluullluuuvuuulollCtltlouvoCCtCCtlZCCClZttulCCttCCCCCZCCC@CCZ{!!!!!B_!#!!!#!! !!    $p7$!7$7!$777֏}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}~~摑}~}}}}}}}}}}}}}}}}}}}}}}}}}}}w}}}}}}}}}w}}}}}w}w}}}}vwvw}}}vvw}vvwwwwvvw}wvvvvuv}vvvvvvvvuvvwvvvvvvuuvvovvvluuvvvvvoovovvulvuvvluluuuutuvuvuluuuvllutltluluultttlltlllotttlltCCCltttllllCCCCCCtCCZlltCCCClt;!#! B_!!!!!!!! !!     $q7!57!7֠}}}}}}}}}}}}}}}}}v}}}}}v}}}}}}}}}}}}}}}}}}}}}}}~}摑}}}}}}}}}}}}}}}}}}}}}}}}}}}w}}}w}}}}}}}w}wvw}}}v}}vw}ww}}vvv}vvvvvvvvvvuvvvvuvvuwwwwvvuouvuvuuvuvuoltuvvvovuvuulollvvuovuuuuuulvvllvvvuluvvuutuvvullClluoluullltuCCCCCCCCCCltuulCCCCCCCZCCCttllutCtuuu!9!!!Y_! !   !     !  !q!!7!7Տ}}}vv}}}}w}w}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}ꙑ}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}wv}}w}}wv}}w}vw}}v}vwvwvvvvw}vwvvv}vvv}vvvuu}wvvuvvvvvvvulvvvvvvvvuvuouvvuvuuvvuvllvvouotulvvuluvuluutuuloltlluultotlluultCltutluutltttClllCtltlZCClCtltCCCtCCCllx9!!!!Y_!!! !!!! !!!!q$7557s}}}v}}v}}}}}}}}}}}}}v}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}摑}}}}}}}}}}}}}}}}}}}}}}}ww}}}}}}}}}}}}}}}}wvw}v}}}}vv}wvvvvv}vvwv}wwvvv}}vw}vuvvwwvvuvvvuuvvwwwvvvuouvvvuvvvuvvuoovvvuvvuulluv{vltluvuvultulluuuuluuulCCuvuvuCCCtlClCCClltuvultllCCCCttuullltCZlulCCCtCCCCC!!!#9Z_! !!  !      ! =s77!7!7Տ}}}}}}v}}}}}}}}}}}}}}}}}}}}}}}}w}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}wӑ}}w}}w}}}w}}vw}w}}w}w}www}wvvw}vvvvvvvv{vvvvvvvvvvuvvvvvvvuovvvuuvvuuvvuvvuuuvuvuvvluuuvvuuoulvuluuuvtlulululluulluuotllutuulttltulCotltluCCZCllllZCCtlCCltlZCCtCZCC!!!!!B_ ! ! !! =}557=777!7֢}}}vv}}}}}}}}}}v}}}}}}}}}}}w}}}w}}}}}}}w}~}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}ؑ}w}wvvvvvvwvwv}w}v}}w}ww}w}vvvvvwwvvvuvvwwv{}wvvovuuuvvvoluvoluwwuuuulluvvuvuuvwvollvuouulltvuolluululltlulttlCCCtuollullluulttlClutlCllCZCCCCltlCtCCCltlCCCC]!@@!!Y_ !! !!!!!!!!   !=777557777բwv}}}}}}}v}}}}}}}}}w}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}晑}}}}}}}}}}}}}}}}}}}}}}}}}א}v}}}}}}}w}}}w}v}vw}}}vvwv}vw}٘vvvvvwvwvvvw{vvvvvvuuvvvuvvvvvvuovwvuvvvvuuvvvluvvluuuuuuvlCuvlluouvutuuulutluuCluluuCltuCltulllltlltCCttCClttCClZCCCZCCulZCCC!!!!!B[!   !  q5!77!Տ}q}}}}}vvvvw}}vvvv}w}w}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}~}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}w}}vڑ}vv}wvwwvw}}}}w}wvvw}}www}w}ww}w}vvwvvv{}}vvuvwvovvvuuvvvvvvuvvuvuvvvvvuuuvulvvuouvuulvuuuulluuuvuulCluvCCCuvwvtCtvutuuuCtltlZCCCCtlCtullZCCCCCllCCCCCu !!!!Y[!!! !!    !!!p75777!57775777Վ}}}}}}v}}}}}}}}v}}}}}}}}v}}}}}}}}}}}}}}}}}}}}}}}}}摀}}~}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}v{}}w}w}ww}}}vw}}}}vw}}vwwwvwv}vvvwwwvvvvvvvvvvvvuuvvvvvvuuuuvvuuvuvvo{vvlluvuluuuluuoluuovoCovuCtlluutlltuullltllltltltCClttClCltCllCCCCCZCCttCCCCu!!!!!@[!!!! !=q77775!7$57}vvwvw}}w}w}}}}}}}}}}}}}v}}}}}w}}}}}}}}}}}}}}}}}}}}}摑}~~}}}}}}}}Ӏ}}}}}ww}}}}}}}}}}}}wvvvwwww}}v}}vv}}wvvvw}}vwwv}}wvvv}}}ww}כwvvvvvwwvuuvvvvvvvvwvuvvvvvvuvoouvwvvulluu{vtuvullllluvvuuuuuuoCtvuouuluvuutClCCttlCtlCClttlCllltuttlttCZluuCCCtuCCtCC!;9!!Y_      !!  =}777!!7757Տ}}}w}}}}w}}}}}}}}}v}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}~}}}}~}~}}}}}}}}}}}}}}}}}}}}}}}}}}}}ِ}}}}}}vw}ww}w}wvw}}www}vwwwwv}vwv}wvv}wwvwww}vvvuvvvv{vvvvwwvvwwvvvvvuvvvvuuuvvvvuvvuluu{o{uuuulvuuuuluvlollulluuvutultlltlttluCCtltuCltlltCCltlltCCllClttCCClZClZC!!!!!B[!! 9s77!5!75757֟}w}}w}}}vvvw}}}}}vv}}}}|}ww}v}}}}}}vv}}v}}}}}}}}}}}}}}}}}}}}}}}}摑}}}}}}}}}}}}}}}}}}}}}}}}}}}}ڙ}vw}}w}vv}}}}}wvww}}}}}vv}v}}wvvvv}wvvvߘvwww}}v}{}wwvvvvuuuvvuvuvv}vvuuvvvvvuovvwvvvw{vuultvvllluvuuoCCCutlCllulCltlCluvutttlltCCClCCCuullCCtlCZCCCCCuCCllCCt! !!!Y[!! !! !!    p775!577!77Տ}w}w}vw}}}}}w}w}}}}}}}}}}w}}}}}}}}}}}}}}}}}}}}}}}}w}}}}}}}}}}}}}}}晑}}}}}}}}}}}}}}}}}}}}}}}}}}}ڙ}}}}}}}}}}w}}}}ww}}}}wwvwv}}ww}vw}}wvwvw}vvvwwwv}vvvvvvvvvvvuuvvvvwwvuvvvvvuvvuvvvvuvwwvuluvtluvuoutuuutlltttlutlluCllluulutCtlltlZtClCtlZCltCCllZCClZCCtZCC!!!!!@_!  ! =q577!77577777}}}}}}}}}}}}}}w}}v}}}}}}}}w}}}}}}}}}}}}}}}}}}v}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}v}}}}}}}}ڐ}}}}}}v}}}}}}vבvw}}}}vv}w}wwwvvwwvvwv}wvvvvvvvvvuvuuvvvvvvvvvvuuuvulouvvulluuoolltuvvvtvuutltulCltvuuuuuluvlllttlttutllCCltoltlClluutCCllttlCCZllutCCCCCC!! @Z!! !  !! !! !p7777777777Տ}v}}}}}}}}}}}}}}}}}}}}}w}}}w}}}}}}}}}}}}}}}}}}}}}}}}}}}}~}}}}}}}}}}}}}}}}}}}w}}}}}}}}w}}}w}}wwבwvw}}wvw}}vvwvv}vv}wvv}}}}vvvvvwvvvvwמvwvuvvvvvvvvvwwvvvvvvvuuuuuvvvuuvuvuuuuouvuvuvlloutltluluvultloutuuClllutuCtltltCClttCClllZClllZuCCCCluCCZCCu! !!@Z!!  $p75577777777775Տv}}}vvv}}}}w}}}}}}}}}}}v}}}vw}}w}}}}}w}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}w}}}}}}}}vv}}}ww}vv}}}wv}}vwvv}wvvv}}wvvvvvvwwwvwwvvvvvvwwvuvvwvvvvv}vvvvvvuouuovvvvvvwvvuovwvuvvvuvvuluvv{uvulllllllulluultllulltlllClulllClututlCCZCluCCCllCCCZltlCtlZ!!!!!YZ!!    ! !=s775!5777777777Տ}}v}}wwww}}}}}}}www}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}~}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}wwvw}}v{vv}}vw}}wwwwvw}wvvvwvwvvvvvwvv}wvvvvw}vvwvvvvv}wvvvuv}wuvwvvvuouuvuvvuvvvuuuvvupuuvuvvooouvyvttlZltlutluulCltltlttltlCuuCtCClltlZlltltlZCtCZCZlltCCZCC!!!!@Z!   !  9q7777!77577֠vv}}v}}}wvvw}}}}}}}ww}w}}}}}}}}}}}}}}}}}}ww}}}}}}}}}}}}}}v}}}}}}}}}}}}}}}}}}}॑}}}}}}}}}}}}}}w}}}}w}}}}}}}}}}}}}}}vvvw}}}}w}}w}}wvvvv}vwww}wvw}}vw}}vwwvvvvuv}}vvwwwvovwwwwvvvvvvuvvvvv{vvvvvvvw}vvvuvvvwvuovvvvvvuouuu{uuvuoluvuulllultuullCtlultuvvtllZtCltltltCCCCltuuulCCCCtllu!!@Z! ! ! =s757777777!57777557777֏}}vvv}}}vvw}}}}}}v}w}}w}}}}}}v}}}}w}}}}}}}}}}}}}}}}}}w}}}}}}}}}}}}}}}}}}}}}}}}}}}晑}}}}}}}}}}}}}}}ב}}}}}}}}}}}}w}}}}}}}w}}}}w}ww}}w}wvw}w}}vvv}vwwvw}}wv}vvvv}v}}wvuvvvvv{vvvvvvvvwvvvvvvvvvuvuvvwvvvv}wvvwvvvvvvvvvvvuvvuvuuvuuvovu{uullulltlulluluClltluluutlZCltClultlZCtCClltulZCCCCCtC!!!@Y  !!!!=q77757577!57!5!!777777557777Տ}w}}}}}v}}}}}wwvvv}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}w}}}}}ww}}}}w}w}}}}}w}}}}}v}wwww}vvvv}}vvw}vvvv}}v}wvvv}wvwvvww}wvwvvvvvvvvvvvvouvvvvuuvuuuuuuuvuuvvvuluuvvoulu{luvuulCuuluuutltltuuulCCZluoutlltullClltCCZCCCCCCZCCZt!@Z!!!!  !q577757575!557775777777777757֏}vv}vwv}}}w}}}wwwvw}}v}}}}}}}}}}}}}}}}}}v}}}}w}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}w}}}}}}ww}}}}ww}}ww}}w}w}}www}w}wvww}v}wvww}vvwvvwvw}vwvv}vvvwwvvvv}{vvvvvvvvvvvuvvvuvuvvuolvvuuuvuuvvuuouuouoou{lvuutluululoutClvvttlllotluuCCtltuZClZCCCZCtCClutClZ@Z !   =s7755575577=577777577Տ}wvvvww}}w}}}}}}w}}vw}}}}}}}}}}}w}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}w}}}}}}}v}}}wvww}}ww}w}ww}}}}}v}wvvvvwvvvvwvvvvvvvvvwvvvvwvvvvuvvvvuuvvuuvvvuvvuvvuvvvvvvuuvvvuuvvuvvvvvuvuuoyuuvlltCtuoCtulCCCCtCCltlCCCCtlluuulttlltCCZlCCt!@Z!  !q75757777757!577757!5!7557557555775777755557Տ}vvvvvvw}}}}}w}}}}v}}wv}}}}www}vw}}}}}}}}}}}}}}}}}}}}}}}}}w}}}}}}}}}}}}}}}}}}}}}}}}}~}}}}}}}}}}}}}}}}}}}}}}}}}}w}}w}}}}w}}w}ww}vv}wwww}vvvv}wvw}vvvvuvvvvvwvvvwwvwvvvwvvuvvvuuvvvuvuvuuvuuvuuvvvvvvvuvvvoouvvuvvuuuv{vuwulZlllltllZCZltClZltCCtZCCZCuutlltlltCultCCl{!@Z! !  ! =s57775575777!555577757777777777777ՠ}}}}}}}}vv}}wwwww}}}}}vw}}}}}}}}}}}}}}}}}}}}}}}}}}}}~}}}}}}}}}}}}}}}}}}~}}}}}}}}}}Ӏ}w}}}ِ}}}}}}}w}wvv}w}}}vw}}}vvwwvv}}}vv}}wvvvw}vwvwvvvvvww}wvvvvwvvvvvvvvvvv}vvvvvvvvvvvvvvvwvvuvvvvvvwvuuvuuuuuvuoovvvuvwwuu{uoluttluulltltuuuuuttuultlCClCCZlCtCCCCCCZt!@Z!!     !q7777777777!55!7777!77577777777777775բ}ww}}}}}vv}}}}vw}}w}}}}}}}}v}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}~}}}}}}}}}}}}}}}}}}}}}}}}}}ww}}}}w}}}w}ڙ}w}}}}}}}}vw}v}}wv}ww}}wwvvvw}w}wvwvvv}vvvvwvw}{vvv}wwvwvvwvv}wvvuvvvv}wvvuvvw}wvuvwvuuvvwwulvuuuvvwvuvvouvuuoluvuvuvv{vulxulultuuttlloluuuuootluuZCCCltCClZCCZCtCl@Y!    !  $p7577775777555775!57575777577777577Տww}}}w}}wvw}}}}}}}}}}vv}}v}}}w}}}}}}}}w}w}}}}}}}}}}}}w}}}}}}}}}}}}}~}摑}}}}}}}}}}}}}}}}}}}א}}}}}}ww}}}}}w}ww}}www}v}}}}}}}vw}}}}v}wvvv}}wvvvwvvvw}w}vvvvwvvvvw}vuvvvvvuvwvvvvv}wvvvuvvvvvwvuuuuvuvuvvvvvuuvvuuuuo{{vvvlllullllCZlllCCCCCCltlllZltlCZllClCCC{!@Z!  =s777555755577775757777777777777777775Տ}v}}w}}wwvvv}}}}}}w}wvv}}w}}}ww}}}}}w}w}~}v}w}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}~}}}~}}}}}}}}}}}}}}}}}}}}}}ِww}}www}}}}}w}}wvw}}ww}}}wvvw}}}}}ww}w}wwvvvwvv}vvvwvvvwvvvvvvvvvvwvvuuvvvvvvvvvvvvvvvvuvuvuvvvvvuouuvvuuuuvvvouuoouvuvv{ttotlZlllZCCttCClZCtCuutllZCCCtutCCt  @Z!!!      =75777777777575!757!7575$!75777575777֟wpvv}}}}}}}w}}wvw}}}wv}}}}}}}}}}}}}ww}}}v}}w}}}}}}}}}}}}}}}}}}}}}}}}摑}}}}}}}}}}}}}}}}}ב}}}}}}}}}w}}}}}w}}}}w}}}}w}wvw}w}}wvvvvvwww}wvvwvvw}vvwwvvvwvv}vvwwvuvvvwvvvwvvvvvvvuvvvvvvvvvvuuuvuvuvvuvvvvuuuvvvuvuuvvuuultlltuolCullttllCtCCCCCCllCttCCt!@[q77575557777!7!!75!77777777557775757Ւvvvvvwwww}}wvv}vw}}vvvvw}v}}}}}w}}}}}w}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}ꤑ}}}}}}}}}}}}}}}}}}}}}}}}w}}}}ә}}}}}}}w}}w}}w}}}}}vwvwwww}vwvw}}wvvvvv}}wvv}vvwvvw}{vvvvv{wvvvvwvvwvuvvvvvwwwwvuuvvuuvvwvvuvvvuovvouvvvuuvvvvuuuvvuuooyvuxulttllttClZlutCClutCZCtlttCCCCC{!!!@[!!      9q777577777775777557757777757777777777777777757Տ}pv}}}v}}}}w}}}}}}}}}}}}w}}}v}}}}}}w}}}}}}}}}}}w}}}}}}}w}}}}}}}}}}}}}}}}}}}}}}~}}}}}}}}}}}}}}}}}}}}}}}}Ӑ}}}}}}}}}w}}}}w}}w}w}}}}vww}w}}}}}}}vv}wvvwwwwwwvvw}v}wvvwvv}vvvv}wvwvvvvvvvvwvvwvvuvvvvvvvvvvuvvvvvvvvuuvvuuuvuvvuvuuuvvuvuuoouuuuu{ulCtlultlllCCtCtlCCltCCCCZlZt! @Z! ! =s77775557577775!7777!5577777777777777Տ}vv}}vw}}}}v}}}}}w}}v}}ww}}}}}}}}}}}}}}}}}}}}w}}}}}}}}}}}}}}}}}}}}}w}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}v}}}}ww}}w}w}}w}}}}}}}}w}ww}}}vw}}wwwwwwww}v}}vwvvvwwvwvw}ww}vvvvvwvwvuvvvvvwwvwvuvvvvuuvvvvuouvuvuvvvuvvvvouvuvvuvvuouvvuooououuuu߆utCuutuulZtlZCCtCCCCCZCClCu  @Y   !  !   s7775775777577!557757575757777777775777Տww}wvw}}}wvvvw}vw}}wvw}}}vw}w}}}}ww}}}}}}}}}}w}}}w}}}}}}}v}~}}}}}}}}}}}}}}}}}}}}}}}}}}}w}}ٙ}}}}}}}}}}}}ww}wv}w}vww}ww}}vw}}w}}}vwvvww}}vvw}vvvvvwwvvvwwvvvvwwvvvvvvwvwvvvvvvvuv{vvvvvuvvvwvvvvvuuvvvvuuuuvvuouvuouvuuuuvvvuuo{ulClltCCllCCtultCZllltCC{!@Z =s77757777575757777757757777777Տ}w}vvw}}vvv}vvwvwvvvw}}vv}}}vvvvw}}}wv}v}}v}}}}v}w}}}}}}}}w}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}w}}}}}}}}}wڞ}w}}}}}ww}w}w}}}ww}}}}}wwwvw}}ww}}w}}}wvvwv}}}vvvvvvv}}wvwvwvvvwvvvvvvuvvwwvvv{vvuvvvvvvuvuuuvvw}{uvvvvuvvvvuouvvvvuooouolvvvvvvvvlluCtClZlttlCltutllZlCZtu@Z!!!   ! ! !q7575777777!577557777777755Տpvw}vv}}w}wv}}v}}}}}w}}vww}}}}}w}}}}}}}}}}}v}}}}}}}}}}}w}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}w}}}}}}}}}w}}}}w}wvw}}}}w}}w}}v}}w}wv}wwww}wwwwvvwv}vvvwvvw{}wvvvvwvwvvvvvv{vuvvvvvvvvvvvvvvvvvuvvvvvvvuvvvuvvvuuvuuvuuuvuouvuuouuulu{uCZllllttCCCCCZltlCt!!@Z  $q7775777557575775777!557577775557Տ}pvwvvvw}w}}wwvvv}}}}w}}vvw}w}}}vw}}}}ww}}}}}}w}}}}}}w}}}}w}}}}}}w}}}}}}}}}ww}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}www}}}}ww}}}}}}}}}}}w}wwwvwvvwvw}}www}wwww}wvw}}wwvvw}{vuvwvv}}w}{vv}{vvv{vvvvvwvvvvvvvuv{wvv{vvuuuvvvvuuv{vuuvvvvuuuuuovvvuvvultluouvulttCClutCClultlZC{!9Z !!  s7775755775755777!7!5!7755$77555!75775777777777777Տwvw}wv}vvw}w}}}}www}}}ww}}}}}w}w}}}}}}}}ww}}}}}}}}}}w}v}}}}}}}}}}}}w}}}}}}}}}}}}}}}}}}}}}w}}}}w}}}}}v}}}w}}w}}}wv}}ww}}w}w}}}}}}w}www}}}}wwww}wwv}}vvwwwwvwv}vvvvvvvvvvwvvvvvwvvvwvvvvvvwvvvvvvvvvvvvvvuvvvuvuuvvvvuuvuvvuvuvouuvuluuuvuououũutCCuZlCZCZllCCu @Y  !p7775777575555!57!577759755755$7!55!5!7757577777757577755577բ}}vv}}}vvvvv}}}}vvv}}}}}}}}}}}}}}}}}}}}}}}}}}wwvv}w}}}w}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}w}}}v}}}}ww}}}}}}}}}wvw}}}vw}www}vvw}}w}wvv}ww}}w}v}}wvwvwwwvw}wwvvvvvvvvuvww}vv{vvv}vvvwvvvvvwwyvvvwvuvvuuuuvuuuvuuvvuuvulvvvvvvvuuvvllouuvuluuvlxZCClZClClZCCZ!!@Z!! p7775757577575575757775555777575777577757575!5775755557775577777777577777757555Վsw}vv}}w}}}v}}wvw}}w}w}w}}}ww}wvw}}}w}}}}}}}}}}}w}}}}}w}}w}}}w}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}wv}}}}}}}}}}}}}}}}}}w}}www}}}wv}}v}wwwwv}www}}}w}ww}wwwvvvwvvwwvwvvwvvv}vvv{}vvvwvv{wvvvuvvvyvvvuvvvvvvuvvvvouvuuvuuvvuuvvuouvuvuluvuvuluouuߔvlZllCZllCZ @Z!=}5575775575775777557777777!55$77577757557577777777777575755775555s}v}}w}}}}v}vvv}w}vw}w}}wvv}}vvwvw}}}}wv}}w}}wwv}}}}}w}}}}}}}}}w}}}}v}}}}}}}}}}}}}}}晑}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}w}}}}ww}}}}}}}www}}w}}www}vw}}vvvwvww}}}wwwvvvvwvwvvwvvvvuuvwvvvvvwvvv}vuuuouuuvuvvuouvwvuvvuvuuououuouvuoouuvuvuvulouvououuuuv{uCtlltlly!@Z ! =5777557757555775775857557!55=577775775757757777577757777775557757757777557777Տvvvvwwwwww}w}wwv}}}v}}wvw}}}}}}vw}}}}}}}}wv}}}}}}}}}}}w}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}w}}}}ww}}}}w}w}}}v}}}}www}w}}}w}w}vww}ww}wvvwvvwv}vwvvwvvvwvvvwvvwvvwwvvvvvu{}vvvvwwvvvvvvvvvvuuvwvouvvvvuuvuvvuuvvuuuvuuuuuvuuuvuouuuuluylCZlCu !@Y ! =s55757757775557577757777757777775775557577755777777777777775577555֢}vvvvvvvvvvvv}}}v}}}w}}}vw}}}}v}}wv}ww}vv}}}}}}}}}}}}}}}}w}}}}}w}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}w}}}}}}}}}}}w}ww}}}}wvw}}}}}}w}w}ww}w}}}ww}vvw}}}}}www}ww}}wvwvwwvvwvvvvvwwvww}{wvw{vvvvwvwvvvvvv}}vvvvw}wvw}w{vvuvvuvuuuvvvvvvvvvvuuouvuuuoovvvuuouulouvu{oulߖuCCC@Z!!!   =q55557557557775575777755777577777557557ՠw}vvvv}}vvvv}}vv}}}w}vvw}w}}w}w}w}}}vw}}}}v}}}}}}}}w}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}v}}}}}}}}}}}w}}}}wv}ww}wv}}}w}ww{}wwvw}vvvvvvwvwwwvw}w}wvvvvvv{vwvvvv{vuwuvvv{}vvuvvvvvvvuuvvuvuvvvvuvuvuuvuvvuuvuvvuovvuuouuuuuuvu{uvuzu! @Z ! =q777777577555757755775777775757577575777757775777777577575֒}vvwwvw}}}vvwwvvw}}}}}}w}w}wvw}wv}}}}}}wvw}}}}}}}w}}}w}}}}}}}w}}}}w}w}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}w}}}}}}}}}}}}}}}}}}}w}}}}}w}}www}w}}}w}}}}ww}w}wvwwwvw}{v}w}}}wvvwww}w{vvvvvvvvvvvvvvvvvvvv}vuvwvuuvvvvuuvvuvuvvuvvvvvuvvvvvvuvuuuuvvvvuvvvuuuuuouvuvvvuouo{luo@Y     q75557775777557555!7575$7755!755775575$7577777557757777757777757557777Տvvwwvv}wvvwwww}}ww}}w}}}wwww}}}}ww}}}}}}}}}}w}}w}}w}}}}}v}}}}}}}}}}}}w}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}w}}}}}}w}}}}}}}}}www}www}}}www}w}}}v}v{}www}}}}vwww}{www}wwvvwvvyvvvvvvvwvwvvvvvwwvvvwvvvvvvvvvuvvvuvuvuvvvuvvuvuuuuuvvuuvuvvvvuuvvoouvuuuvuuuvo{uou @Z!=q77757775577577575557777555755775777!577=775=55557755757577577777755755755775575777Տ}vv}}v}}w}wvv}}wwvvvvv}}}w}ww}}w}}}}wvvvww}}}}wvwv}w}}}}}w}}}}}}}}}}}}}w}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}w}}w}}}}}}}w}}}w}}}}w}}w}}}}ww}}}}wwwww}w}}}}}}{}vv}}w}vww}wvvvvv}vvwvvvv}vvv}{vwwvvw}{uvuvvvvvvvvvvvvvvvvvvwuuvvvuvvvvvvwvuuvuouvuouuuuvuuoouuuvvuuuuuuvvu{ouv;Z!!   =}5775575555777577555575757757577577555775557577577555757555775555777575755775Տ}vvwww}wv}}vv}}wvv}}}vvw}}w}w}}}w}}}}}w}w}w}w}}}}}w}v}}}w}}}}}}v}}}}}}}}w}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}w}}}}}}}}w}}vw}w}}}}}w}}}w}}}w}ww}wwv}w}vwwww}}ww{ww}}wwwvwvuw}w{wvv}vvvv}vv{wvwvvvvvvwvvvvwvuvvvuvvv{vvvvvuvvvvvvvuuvuuuvuvuvvuuuuuuuouvuuuuuvuuuuu{uuu@Y  =s55577577557555775757775557577557777757577557775777755555575֏}vwvvwwvvw}vv}}vvvw}}wvvww}}wvw}}www}}ww}ww}}}}}w}}w}}w}}}}v}}w}}}}}}w}}}}}}}}}}}w}}}}}}}}}}}}}ww}}}}}}}}}}}}}}}}}}}}}}}}}}wwww}}}ww}}}}}w}ww}w}wwwww}{}w}wvvvwwwvww}wvww}vvww}wvvwvvv}}wvvvvvvwvvw}vvwvvvuv{wvw{vvvuuuvuvwvvuvuvuvyvvuuuvvvuuvvvuvvuvvuvvuuvulluuuvuoluu{vvv@Z! ! p577777575757557777575575757577777757$7757!75777755557557555775577557757577777557Տw}vvw}vvwwvvwwvw}}wwww}}w}vw}}}}vw}}w}}}ww}}}w}}w}}}}}}}w}}}w}}}w}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}w}}}}}}}}}}}}}}}}}}}}}w}}}}}}}}}www}}wwwww}ww}}}}w}}}wwwww}www}vw}wwwwvw}wvvwvvvw}vvw{vvvv{}v{vvvvvv{vvvvwvvvvvvuuvvuvvvvvvuvvvuvvvuuvvvvvvvvuuuvuuuvvvuvuuuuoovvuuuov{uu{!@Y!!!!   !q55557575757777557755777777757877777775575755775575555757555575757Տ}}}vw}vvvv}ww}}}}}ww}}wv}wv}}wv}}}}}}}}}}}wvww}vw}ww}v}}}}w}}v}}}}}}}}}}}}}}w}}}}}}}}}}}}}}w}}}}}}}}}}}}}}}}}}}w}}}}}}}w}}}w}}}}}vww}}}w}}w}ww}w}wvwww}}wwwvwwvvvw}ww{}}}}wwvvwv}w}wwvvvvvvvvvw}vvvuvvvuvvvuvvvvvvvvwvvvvvvvvuuuuvvvouuvuvuuvuuvvuoouvuouuuvuoouvuuuvulootyyou{!!!;Z!  =q555577555575755555775777575555575777577575775755577557555775575775777555777Տ}wvv}}vwvv}wvv}}}}w}w}wvw}wv}}ww}wv}}}}w}}}}}}}}}}w}}}w}}}}w}}w}}}wwv}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}v}}}w{}w}}ww}w}}}ww}}wwwwwww}}wwwwww}w}ww}}}w{}wwwww}vwww}vvvvvvvvvwvvvvvvvvuvwvvvuvvvvuvvw{vvuvvvvuvvvvuvuouvuuuvuvvuuuuvuuuvuuuuuuvuouvuluuuo{uuu @Y=s5555775775775775755575777777577577775555577755755755777755Տ}vvvvv}}wvv}}}wvwvvvw}}wvww}vvw}v}}wvww}w}wvw}w}w}}}}}}}wv}}}}}}}}vv}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}w}}}}}}}}}}}}}}}}}}}}}}w}}}}}}}}ww}}}vwww}}}}w}}w}ww}w}}}w}}}}wwvvvwvvvvvw}w}}wwwvvv}{vvvvwvuvwvwwvvvvwwvvv{wvwvuv{vvw}wvuvvvuvvvvvvvvvvuouvvvvvvuouvvvvouvvvuouvvuuvvouuvvuxlv@Z ! =}5755757557577577755555777=7777557557575775575577575755555755575Տvvvvw}vvwwwwwwwwvvv}}}www}}vw}w}}www}w}w}wv}w}}}ww}}}}}v}}}}}}}}}}}}}}}w}}}}}}w}}}}}}}}}}}}}}}}}}}}}}}}}w}}}}}}}}}}}}}}}}}}}}}}}}}www}}w}w}}}}}ww}}{w}}}}w}ww}w}w{}ww}ww}wvwww}{}}wvw}wvvwvvwvvw}w{w}vvv{vvvvvwwvwvvvvvvvwvvvvvvuvvvv{wvwuvvuvyvvvvuvvvuuuvuuvvvvuuvuvvuuuvuvouvuuouvuuvuuuuvuv!@Y  !=s555577775575575777557755577775775577777577557755557577557575755757557575575577֠}vvvvw}w}}vvvw}vwvvw}}}}}}}}ww}w}ww}}}w}}ww}}}}vvw}}}ww}wwv}}}}}ww}}}}}}}}w}}}}}}}w}}}}}}}}}}}}w}w}}}}}}}}}}}}}}}}}}}}}}}}}}}w}}}}}w}w}w}}wwwww}w}}w}}{}}vwww}wvw}}}vw}ww}vvwvvvv}ww}}wwvv}wvvvvvwvv}vvvvvvvvvvww}{vvvv{vvvvw}{vuvvvvv}vvvwyvvvvvvuuvv{vvvvuvvvuvvvvvuuuuuuuuuuvuuouuououlllo{uv!!9Z!=q775557577757775777555777555775777755775777557557757557755577575577755Տ}vvvvwww}wvvwwvwvwv}}www}}}}}}wwwww}}}w}}}vv}}}}}wv}}w}}}vwww}w}}w}}}w}}}}}}}w}}}}}}}}}}}}}}}}}}}}w}}}}}}}}}}}}}}}}}}}}}}}}w}}w}}}}}w}vv}wv}w}w}w}w}}}}}ww}w}}vw}vvw}}w}wwwwwww}}ww}w}v{wwwvwvvvw}vvv{vvw{}wvvywwv{vvvvvvvv{w{vwwvvvvvuvvwvuvvwvvvvvvuuuvvvuvvuvuvvvuuvuvuuovuvvlouvouuuuuuuoltu{ov;Z    =q777775575555755777777777555==7777777757557777775777777755777555575775555757Տ}}}vvvvwwvvwv}}}ww}}}vvvvw}w}}vvvww}}w}w}ww}wvvvvv}}ww}w}}}}}}}}}v}v}w}}w}}}}w}w}}}}}}}}}}}w}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}w}}}}}w}w}}}}wvvw}v}}}}}}}}}}}wvw{w}vw}www}vw}w}w}}}}ww}}vvwwwvv}}ww}{vvvvuvv}}w}wwvvvv}{wuvvvvvvvvuvvv{vvvuvvvvvvuvyvvvvvvvuvvvvuvvuuuuuvvvuouuouvvuvvuoouuuuuvuuuvul@Y   =s557755577555555557775755575757555777557757557775777777757777757777755777577755755557557555757557555555557555555575555575575555755555555577755555555Տsw}vvvvwwvvvv}}wvw}wvvvw}}w}wwv}ww}}}}wvw}}}wwwww}}}}}}}}w}}}}}w}ww}}}w}}}}}w}}}}}}}}}}}}}}}}}}}}w}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}w}}}www}}}www}}w}w}}}v}}}w}wwww}wvvw}}w}w}wwvwwww}vvvw}w}{}wwwvvvwvvvvvwvwwwvuvwvwwvuwvvvwwvvvvvvvvvvv{vvvuuuvvvvvvuuuvvvvuvuvvuouvuuuuuuuouvuvuvuuouuuuvvuowul !@Z  =s55575775557555557555775775557575575557775575777=755775775775575775757575775577775555555577755775557557575755557577557757555755755555555575757577755555555755Տ}vwvvw}v}vv}}}vvvvvwvvw}wwvw}}}vwv}}}}vw}w}}}}}}vwv}}}}}w}}vw}}w}}}}}}ww}}}}w}}}w}}}}}}}}}w}w}}w}}}ߑ}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}w}}w}w}w}ww}w}}w}ww}}w}w}w}wwvvvw}wv}vwvwwvvwwvvwvvvwvw}{v{vvvvvvvwwwvwvwwuvwvvvvvvvvvvuuvuvuvvuvvuuvuuuvvuvvvvuuuvvuvuuuvvvvvvuuutuuuuuluoooluvuuuuC!@Z!q5555755555575555555557575755755777577777557757757555=77777755777777777755557755557557555577755575555775557555555567557555555555755555555557775557755557555755Տ}pvvv}}vvvv}wvvwvvvvv}}wwvv}}}vww}w}ww}ww}}}vvw}w}}v}w}wwvw}}w}}}}ww}}}w}w}}w}}}}}}}}}}w}}}}ww}}}w}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}ww}}}}}}w}w}}w}}}}}}}ww}}ww}}w}}}wwvwwvvwwwwvvvv{}v}wwwvwwwvvww{vvvvvw{vvvvvwvvvwvvvwwvuvv{vvvvvvvuuuvvvuvovvvuuvuvvuvvvuuvvuuvuuuvvuuuuuulluultouuuuuuuuuwtl!@Y! q55557555775555775757775557757775755575757577575$5577777777557777557777757777777757577755577555775755555555555777555555555755555555557555555557577555575Տ}vvvvvvvpvvv}vvv}}vv}}}}vvw}vw}}}}w}vvw}}}ww}vv}wwww}}}}}}}}www}}}ww}}}}w}}}}}}}}w}}}}}}}}}}}}}ߐ}}}}}}}}}}}w}}}}}}}}}}}}}}}}}w}}}}}}}}w}w}}}}w}}wwwww}w}vwwwvww}wvvvwvvvvv}}w}}ww}www{vvvwvvwwwww}{vvvvvww}{vwvvuwvvvvvvv{vvvvuvwwuuuvvvuvvuvwvvuuvwvvvvvvuuuvvvvvvtluvuuuvuuouvvuouuouvvuuuuololvoZ@Z =s5555755577775855777555575557557755755555577577787!7755577575575577775757575555775577557557575575555555775755755555557555555775755777755755575555ӎsvv|vvvpvvvvvvvv}wvv}w}wwwvvwvw}ww}}}vv}w}}}}www}}wwwv}}}}w}{}vw}}www}}}}}}w}w}}}}w}}}w}}}}}}}}}}}}}}}}}}}}}}}}}}}}v}}}}w}}}}}}}}}}}}}w}w}}}ww}}}ww}}wwvww}wwwwww}w}wvwwww}wv}wwww}}vvw{}wvvwvwwvwwvwvvv{vv}wvwwuvvvvv{vvuvvwwvvuvvvvvuvwvuuvvvwvuvuvvvvuuvvuvvvuuuvuouuvuouuuvuuvvvulluvuuuvuououuuul@Z !=q75577755557557777577755577755$755775775775757777775757777775777757577557555557777777575555557777555757557575555757755555577555555555777757555575775575֏}ppvvppvv}}}vvv}vvvwwvvvvwvv}}vvvwvv}ww}ww}}vv}wwwv}}}}}vww}}}vv}}}}}}}w}}}}}w}}}}}w}}w}}}}}ߙ}w}}}}}}}}}}}}}}}}}}}}}}}}}}}}}w}w}}}}}}}}}w}}}}}}w}w}}{w}}}}vwvvw}vw}}ww}www}}ww}vv{vvwwvvvw}{vvwwv{}w{vvvw{vvv}}{wwvvvvvw{vvvyvvvv}yvvvvvvvvvv{vvvvvyvvuvvvvuuvvyvvvuuuuvuuuuouuvuvuuuuvuvvvvuuuuuuvvulouuuuutoutu!!;Z !s555575555775775755555557577555755575777577557757555757577575757577575777575577785775577777755775757557555755755775555577575555557775755777755555557575555Տ}qvppppw}vvvvvvvvvvv}vvvv}wvwvvvwwvv}}}wvwwvvw}}}}}vv}ww}}}}}}vwww}ww}}}}}w}}w}}w}v}}}}}}w}}}}}}w}}}}}}w}}}}}}}}}}}}}}}w}}}w}}}}}}}}}w}}}}ww}ww}w}}}}www}wwwww}w}}ww}}}}}wwvv}}{}vw}}}wvwwwv}vvwww}|}vvv{wvvvv{}ww}wvv{vvwvwvuvvvvvvvwvvvuvvvv{vvvvuvvvvvvvvvvvuvvvvuluvuuuuouvvuvuuoouvuuvvuuultuvvultuuouuuuuuoo!;Z! !!q577555555577577555757555557557557578755775755755577777577777777777577777557777577757575775557575755555575757555557755757555557575555557555757555555555555Տqppppvv|vppvvv|vvpvvw}vvvvw}}www}}}}w}wwvww}vwwvwww}ww}v}}w}}wv}w}wwwv}}wv}}wvww}}}}v}}}}}}}}}}}ߐ}}}}}}}w}}w}}}}w}}w}}}}}}}}}w}}}}w}}}{}w}w}}w}wv{ww}}}www}}}}{vww}w}wwv}}}}{vw}{wwvwwvww}{v}vv}vww}}vvvvwv{vv{wvwvvvwvv{wuvvvvuvw{vvvvvuvvvvvuvvvuuuvvvvvvvuvvvuvwvvuuuvvouuuuuotuouuoouuuuuvvululuouutt@Y! p5555575577575555557577577577777757757777557775577775777777757=75777777757577775777557777577577575755757555757557575555775555777555555577777555555555577575555755575555555557ppppwpvvvpopvv}vpvvv}vvv}vv}vvvv}}}}}}wwv}}wvwvvwwvww}www}}ww}}ww}}}}wv}w}}ww}}w}}w}}}}w}}}}}}w}}}}}}}}}}}}}}}}}}}}}}w}}}}wv}}}}w}}}}}w}}}ww}}}}w}}}wwwwww}}w}}w}}}{}w}ww}}ww{}vv{}wwv}w}wvvvwwwwwww}wvvvv}wwwvv{vvv{vv}vwvvvuwvvvvuvwyvvv{}vvvvuvvuvvuvvvuuvuvvuuvvv{vuvvvvvvuvvuuuouvuuuoltltluuuuuuvuuuluouuuou@Y!q5555557777575777557577777757577777755577777777757$777757777777777775575577575557755755755755577755575555557775757555777557ӎqppvvpppvvpppvvpvvvvvvo}}}vvv}v}}vvwwwv}w}vww}}wwv}v}}vwwwv}}ww}w}}w}w}vvw}}wv}}}}}}}w}}}w}}}w}}}}}}}w}}}}}}}}}}w}}}}}}}ww}}}}{}}w}}}}}}w}}}}}}}}w}www}}}}}}w}www}}}}}ww}w}}www}}}wvv}}w}}{wv}wwwwvvw}wvvwwwwwvwwwwvwvw{vwvvvvww}{wwvvvvvvwwvvvv{vvwvvvvvwwvuvvvuvyvvwvvw{vvvvuvuuuuvvvuvvuuuuuuvuuouvuuuvvvvvvuvvvultluluuuuuouu{;Z  =s5557757775757577555575757577757757757777757777777877=7777777777755=7777577757555775555577575777555755555575755755555555555557555555575557555575555577ӎsppppp|ppvvpvppv|vpvvvv}}vvv}vw}wvvvwvvv}wvww}w}}}w}}v}vwww}}vv}}}ww}w}vwwwvwv}}}}}}ww}w}}}}}}}w}w}wwv}}}}}}w}}}}ww}}}w}}}}}}}}www}}}v}}}w}}}}}{}}}w}w}w}w}}}}}w}}ww}www}}wvw}ww}w}wvwvw}w}}w}wwwwvvw{}wwv{}w}{}w}wv{}}vwvv{}vwvvvwv}vwvvwvv{}wyvvvvvv{vvvvvvvvwwvvvvwwvvv{vvvvvvvuuuuvvvvuvuuoouuvuuvuuvuuvvvuuuuuvuvuooultuuoluuuu;Y !=q5755555575555575757557575557577757557757777757755777777777775577777757777557577777575557557755557555775555555575557555575755775557555557557757555755757555775755757577֏~ppvpvppopvvvppv}vpv}vpp}}pvvvvv}}vvvvvvv}}}}}wvvwwvvw}}}ww}}v}w}vw}w}}w}}}v}}}}w}w}}}}}wwv}}}}w}}}}w}}}ww}}}}}w}}}}}vw}w}}}w}}w}w}}w}}w}v}w}}w}}wv}}vw}w}wwww}}w}wvww}}wwvww}{w}}ww}}}}www}wvwwwwv}{vvvw}wvv{vv{wvvv}}w{wvvvvv{vvvwvvvuvvyvvvvvuuvuvvuuuvuuv{vvuuvvvvuuuuuvvuvuvuuvvuuuuuuuuuuuvuuutluvutluvuuuouu! @Z    q557555577757557557555555775577557777575777575=777=577757=7757777775777777775755555575557557555575775777755575577755575557555555557555555577755757555557555577ӏppvvppppppvvpppvv|}pvvpvvvpvv}v}}vvvvvvvw}w}w}www}wvvw}}}w}v}}w}vw}}}}}}w}}}}w}w}}w}w}}}}wwwww}}}}}ww}w}}}}}}}{}}}}}}}}}}}}}}}}}w}}}w}}}}}}w}}}}}}w}}}w}w}}w}wv}www}w}}wwwww}wwvwww}v{}wwwww}{}w}vwwwwwww}ww}www}}wvww}vvvw}vvv}wvwwvvv{wvwvwvvvvv}v{vvwvvvuvwvvvvuvvvuvuvuuuouvwvuuvvvvuuvuuuvvuvwvuovuoluvvuuulluvuluouuuuluuuuuuuvu@Y! !  =q55575557755575557555757557575775575757775777775577777557577777767777777775777577775575577557777557575555575555555755557577557555555555575575755755557555Տqoopppppvpppppopvvvppppppppvpvvvvvvvv}vvvvvwvvvww}}}}}}wvvwvv}}vww}}}w}}}wvv}wvwv}}}}}w}}w}}}wvv}w}}}}ߐ}}}}w}}}}}}}}}}}}w}}}w}}}}}}}}}}}}}}}}}}www}}}}ww}}v}w}}w}w}w}ww}}}w}www}}}wwwwwwvvw}}wwvv}{v}w}vvvwww}{vvvvww}{vwvvw}}v{}vvvvvvv{w{vvvvvvvwvvvuvvvvvuvvvvvvvvvvvvuvvuvvvuuvuvvvuvvuuuvvouuuluuvvvvuluvuuuuuuvuuvuuuulluul!@Z !s75557755778775555557777757775577777577775578757757777777557757777777$777777757777777757575775777555755555555575777578555755775577555557555555757555555775755775575555775ppppppoppppvvppppvvpppppppvvvvvpvvpp}}v|ppw}vvvv}}}}wwwwvv}vv}vvv}}ww}wwv}}}wvvvwww}vwwww}}www}}}}}}}}}ww}w}}}}}w}ww}}w}wwvw}w}}}}{}}}}ww}w}w}w}}}}}w}}www}}ww}}wvwwwwwww}w}w}}wwwwvv}{}wvw}w}}w}wwvvwwwvwvvvvww}}{vv{}vw}vvv{wvvv}}vvvuvvvvvvvuvvvuuvuyv{wvvvvvvuuuuvvvvuuvuvuuvvvvuuuuuuuluuvvuvvuluvuuvuvvuCuuvluultuuu@Z ! !$s5755755555575577557575775777777775777575$75777777777577777757777777=77777777777777775755775777757755575555577577755555555557757557557755557557575557575557775555555֎}v|pppppvpppvpppppvvvpoppv}}|vpppppv|vv}vp}}vvvvw}vv}vv}wwwww}}vv}}vv}vw}}}w}w}}}}}wwww}}}}w}}}}}w}www}}}}}}w}}ww}w}}}w}w}}}}}w}}w}}}}}}}w}}}}}w}}}www}www}}}}}w}}{}}wwwwv}w}wwwwvw}wwv}}www}}}wwwvvvwvvwwvw}{wwwvwwvw}{vvvvvvwvvvvv{vvv}מvvv{vuvuvvvvyvvvvvvuuuuvvvvvuvvuvvuvvvyuvuuvvvuvuuuuuuuuuvvvuuuuutuuuuuuuuuutuuuuuullluvv{;Z  !q557777575575555757777775777577757757577575777775775777755775777757=777777777777775557=55777777775557555755557555755775557555555575775557557555555575575555575575555555557557575555555555777555575555555555755557775555555s}}vpvvppvpppppvvvpppppppp}}pppvpppvvv}}pvv}}vvv}vw}vvv}wv}}}w}vvvvvwww}vww}}w}vww}w}}{}}}v}}w}}}}}{}}}}}}w}}}www}}}w}w{}}w}w}}}ww}w}}w}}}}}}}}www}ww}w}}}}w}}vw}}}ww}wvvwwwwwvwv}v{wvw}ww}wvwwvvvwvvw}w}wv{}ww{}vvvvvwwvvvvuvwvvvvvʞ{vuvvuyvwvyvvvuvuuuuvuvvyuuvuvvuvvuuuvvyuuvuuuvvuoluvvvvuuuuotuuuuuuouultuulluluuuzv!@Z!   p5755555557555555557557555575757555777755775777577577577$77757757777755777755=777755557777777775777777775775557757575575755555755557555757557575555557555557777555575555557755755755555557775555555777555555557555775575777777755555ӏspvpppppppppppvpppppvvppv|}vpp}pvp}vppv|v}pvpv|vpv}}vvv}wvv}}}}w}}}ww}w}}wv}}ww}vv}}w}w}w}}}ww}}}}w}wwwww}w}}}}}w}{w}{}}}}w}ww}w}}}}}w}w}w}wvw}{}}}ww}w}w}w}w}vww}}}wv}wwwwvwwwwvw}wvv}vvvvw}{vvvww{wwvvww{vvvvvvvvwvvvvvvw{wvv}{vvvvvכvvv{vvuvvvvvvvvvuuvvvvuuvuuvvvvuuvuuuouvuuvuvuuuuuvuuuuvuuuoooluuuluuttltuvu{@Y  q77577755557575557775755775757777775777777=77557575775577577777777777757777775777757757777757557757557577577777775577777755575755577557555755775775575575555777757557555775775555755775577757555557775755555775575557557775577577577555555775555775555775557577ӎspppppvppppppppppppp|}ppp}|ppvvppvpvppvvv}vpp}}pp|v|v|v}v}wv}}}v}}v}vw}}vw}vvwvvw}vwww}}w}}}}wwwv}}v}}w}ww}}w}w}}}w}}}}}}w}w}}}}}}}w}}}}}}}}w}}wwww}}w}}w}w}}www}}{}w}{vw}}}vw}www}vww}w}}wvvwww}w}wwvvwwwvw}w}www{}}wvvwvvvwvvwvv{}vvvvvv}}vvvvvvvvv}}vvuv{vvvvvuuuuvv{vvuuuvvvuuuuvuoltuvuuvvvuuuuuvuluvuvultluuluvuuulllluuu;Y    =q55557557577775757777757755775757755777755575757575757577577755777777557577777757777777775557775757577875577757577755777775755775755755557555555775557577775755757575575575575777755755755575555755557777555575555757555555555755755575775555557Տqpppvvppppvppppppppv|ppppppvvppv}}pppppp|vppppppv}vpvv|vv}vvv}vvv}}w}vvwvw}}}vvw}}}}v}ww}v}}ww}w}w}w}www}}}}ww}wwww}}}}}}}}w}}}w}}}}}}w}w}v}}}}}ww}ww}w}www}}}w}}}w}}{}}}}}}ww}wvwvv}ww}wwwwwwvwv}{}{vvvvwwwwvvwww{vvwvvw}{vvvvvvvvv{w}{uvwwvvvvv{{vvvuvvvw{vvuvvuvvvvvvvuvvuuvuvvvvuuuvuuuuuuuvvuuuvuuuuuuuuvuuluvuuutuCuuu@Z   7}55755577555757557557575575557577575775777757777575777777777777557777777775777575775777777757755777777777555775777777775757575755755775577775555575555555555577575555555557575577555555577555555775557557575755777555777557575777557775555577Տsolpp|vpopppvpppppppvppppppv|pp}}vppppv}pppppppp}ppppv}}vvvppvv}wv}}}vv}vv}}wvw}}w}ww}vvwvw}}}wwwvw}}www}}w{}{}ww}w}}w}w}}}ww}w}w}w}www}}w}wv}w}}}}}}}}}w}www}wvw}www}}w}wvwv}}}}www}wwvvwv}www}wwwwvvwvw{}}}vwwvww}wwwvvwvv}vvvvwvvvvvv{w{}}wvvv{wwwvvuuvvv{wv{vvuvuvw{|vvvvvvvvvyv{vvvvvuuuuvvuvuvuuuvulouuvuuuvvuluuvuvvvuuulluuulltu{!@Z!   !! =w7557575575577577557575775577557755777775577557755757777757577557777777777777777777775778755777777757757777575575775777555575755575555755557555555555557775557557777555557775557575557555555555775755755555757755775575755577555575755575555557575575Տ}pppppppvpppppoppv|vvppvvppp||vpvppppv||ppppvvppv|pvvpp|vvvpv|p}}vvv}vv}}wwvvww}}vv}}}}w}}}}w}}w}}}}}}{}}}}}}}}}}}}w}}}ww}w}}w}www}}}w}}w}}w}ww}}}}}{}}{}}}}w}ww}}w}w}}www{}}w}}w}}}{}w}ww}{vv}{}wvww}wv{}{wvwwvw}}}ww}vv{www}w}{wvvwww{vvvy|yvvvwvvvv{vvvvvww{w{vvvvwwvvvvvw{vvvvvvvvuuvuvuvvuuvvvuvuvvvvvuvuvuuuuvuuuuuuuvuuuuullvultuuuvy{;Y!=q7557755557555557757555775755777587575775775575757777=7555777577777577575=7775777777757757778577775577757757557757557775777575775555755755755577557557755577555755555575575557757575555575757775575757755575557557577757757775555757555775577575557577575755577ӎsppppopvvvppppoppp|v||v|pppv}|pppp}}}}}ppvp|prvp}vppppp}ppvvvvv}vvpvvvv}}}vpv}}}}wvvw}wv}}}wwvvvww}}}wwww}}wvww}ww}wv}vvwwww}}}w}ww}w}wvw}ww}}}}}}ww}ww}w}www{}}ww}}}wwwwww}wwww}{}ww}wvwvv}v}}vwwwvw}}}}wwww}}vwwwvwwvv}}wwv{}wwvvvvwvv}}}vvvvvw{}wwvvvvvvvvvvvw}vwvwwvvwvv{vw{vvv{uvvuuuuv{vuuvuuuuuuuuvvv{wvvuvuuuvvvvllvvvuouullultuuultty;Y   =q57577755555577757575777755757777755777755777577775777775757557775777777555757757777777575777577777777757777575757777757557555755755555757557555577755777577575575577555775557577555555555575555575555777757775757757577557557555575775557557757577757755555757775555575555575557755575777755Տppppppppppppppppppvpvpppppppvvppvppppppvvvv|vvppp}|pppv}vprvv}v|v}vpv|w}}v}vvvvvw}}vv}}}}w}}w}}}}}}v}}v}}w}wv}}w}}}}}}w}www}}}}w}w}}}}w}ww}}}}}ww}}}}}}}}}}wwv}}ww}vw}ww}}}}}www}wv}w}wwwvv{w}wvw}}wvvw}wwwwwwwwvw}wvw}}{vvwwww{vwv{vvw}vvv{w{w{vvwyvvv}{vvwvyvwwvvvuvvvvvvvv{vuvuuvvvuvvuuvuvvvuuuvvvvuuuuuvvuvuutuuvuuuuuuuuuouuuuou;Y !  =q55575757555575777777775557757575577775575757777775775557777777585755757757577577757777757757775577577557777577577775777577557785555755557755555777577555575575755575557565575775555555555577575575577755577555775555557577577555757557755555577757755755555555575557575757575557577575557՟sppvvvolpppvvpvvppoppoppopvppppvppppppp}}}v|ppppv|v|}p}}pv|v}}ppv|v}}|}}vpv}v}}vvvvv}}}}}vw}w}}w}www}}w}}vvw}}vwwvw}}wwvww}}w}w}}w}vwwv}}ww}vv}}}www}}wwwwww}wwww}vv}}wvvw}wwwwvwwvwvvwvvvwwvvvv}wvw}w{}vvv{}wvwwww}vwww{}wvv}}w{}wvvv{}}wwvvvvvv}}vvv{vvuvvvw}{wvwwvuuuvvw{vvvv{vwwwvuvuuvw{}vuvvuuuuvutuuuuuuvvuvuuuuvvvuuuuuuvvoluuuuul !@Y      q555575577555775555777575557575775775775777777777757555777557777757757777775777577757777775=777775777777777777755777757757575575757757557577577555577557555777755757555775755577557775555755755755555777577555755757755555555557575575755557777555557577555557577577755757555557777555555555Տ}opppppppplpppvpppoppppppp|vpppppppp|pppppppvvpppv|ppppvv}vppvpvpvp}}pp}}pp|}}}vv|v}}vv}}ww}}vvv}}}vw}}v}}w}ww}ww}}}w}w}}w}}}}vw}ww}w}}w}vww}}www}w}ww}}ww}w}}}ww}}}}w}w}}w}wwwwwwwww}w}}}{}wvvww}{w}wwwv}wwwww}}wwwwwwwwww}wwvv{vv{www}vvw}wwwvvvv{vvwwwwvwvvvvvvwvvvvvvvvvvvvvvvvvvvv{vvvvuvvuvvvvvwuuvuvvvvuouuuluuuuuvvuuuuuuuuuuluvvuuuuuulu@Y !  !q557555755557575775777775777757757577777577777757775777775777775775=7777777777577757577777777577777557755555577777777577557577755555577575777555557557575555575575575555557755755757775557555555575777575777555575577555777775557757575555575555577757755755575575sqooppopvplloopppp|pvv|ppppppvpvppppp}vppppopv||pp||vv|pp|}popv}ppp}}pppppppvvvvpv|}|vpvv}}}}vvpvw}vvvw}wwv}}}}}}}}}}{}w}}w}wvww}}www}w}ww}wwww}ww}wwww}}w}}wwwwv}www}wwwv}wwwvww{vv}wwvwvw}}vw}}}vvv}}vw}w{}ww}wwwvwwwvw}wvvwvwwvwv}vvvvv{vvwww{www{wvwwww{}{vvvvvvuuvyvyvvvvw{vvuuvv{uuuuvvuvvuuvuuvvvvuuuuuvuouuuuvvvuuoouuouvuuuvuuvvvuuu@Y =}75755555555875555757757577777777775557777575777775757777577777557777777777757775577755777577777877775777787777775757555575777777577577755577777555557557557575555775555555577575575777555575555777555557775555555577577557555775557575555577557585575775557755775555575755Տppppppppppvpppppvpppvppppppppppppppp}vpppppppp|vvpppp}vpp}pppp|pp}p|pppp}p}ppvv|}vvvvv}vpvp}}}vv}}vv}}v}vwv}vwvvw}}}w}}}}w}w}}w}}}}w}ww}{}w}}}}}}}w}ww}{}}}}}}w}wwww}}wwwwwww}w}w}}}}wwww{vwwwww}vw}{vv}wwvw}}}wvw}}{vw}{}wwv{vvvv}{wwvv}{vvvwwwwwwvvwvvvvv}wvvwvwwvvvvuvuvvvuvvwvvvvvuvvvvvuvvvuvuvv{vuuvvuuuuuvuvuuuvuvuouvuuuuuuuuuvuuuuuuuuuuuuuuou;Z! !q5775575575555757575555755775757777575757777757757757777577=577775577787557777577757777777777=5777777757775777777575755577557555557577577755557775577755775555557555777777557575555557757577577575557577775555755555757777555787755777575575775555755775557775557555577Տspvppllllp|vvppvpppppplpppppppppp}|vvvpp}vppvppv|pppv}}v||vppprpv|p|}}}}vppp}}p}}pvpp}}}vpv}}}}}}vv}}}}}v}vvvw}}vvvvvww}wwwwwwvww}}}ww}}}wwvw}}vvvv}}ww}}}}}ww}{}ww}}wwwwwwwvw}ww}}}www}}vwvw}wvv}vww}wvvv{}}ww}{vw}w}vvwwvwwww}}wvvyvvwvvwwvww{}{}vwwwvvvvvuvvuuvwvvvvvvvvvv{wvvv{vvvv{vuvvuuyv{vvv{vuuuvwvuvuuvvuuvuvvvwvvuvuouvuuuluvvuuuuuuuuuuuuuuuou{@Y  ! !!o77575777557777777777777777777775777575675757777577775577777777777757577577577777775775777577775775757777575777777775557755785755775557755575555555757557777577575575777557755577755555557575555557757557557775575557755577755577755775777755775757557755577757557775775575555755557757775657555755555557Տpvvplpppppwppplpvpppppopppvpppppppvvppppv|vvppppppppppvpvvp|pvvpp|v|vrp|}vvpprpp}||vvv}v|vpvv}}}|vvvvvv}|v}wvv}wv}}vw}vww}}}w}}w}}www}ww}}}}}w}wwwwvvwwwww}}w}{}}w}w}}}w}w}w}www}{w}{wv}}}vw}vvwwwwwwvww}vww}}w}{v}wvw}}wwww{vvwwwwwwwwvwvv}}vvvvvvw{vvvvvwvvvvvw{uv{vvvvwvvvvv}{vvvvvvvvvvvwvuvv{vvvvvvuuvvvuvuvuuuvvvvuuuuuvuuuuuuuvvouuuuuuuluuuoluu9Y   !q77575555577777557575775777775557757575757557577777777777557757777777775755777577777575777777757757777777757777777775755757755757755775757755777775575777557775555555757557577755777555755757755575755777575555555757755775575557577575775755755555577575777755555777757757555555555557555755755575577555577757775557555755577757557557ppppppppopppppopppoopvppv}vpppppppppppppppppp}}vpp}p}ppppppp|ppppvppppv|}p}vpv}}v|ppp|pp}}ppvv|vvv||v|vvvvvvvvv|v}vv}vvvvv}}ww}}}w}wwwwww{}www}ww}ww}}vwv}v}}ww}w}vvvvwwwwww}}wwwwwwwwwvw}vwwvvwvw}wwwwvvvvvw{}}w{}wvvvvww}{wvvvv{wvvvv{vvvw{}{wvvv{}vvv{vvw{{vvyvv{}wvvuuvvvywvvuuv{wvuuuuuuuvvvuuvuuuuuuuulluvuuouwvuvuuuulllouuuouuuZlu! ;Y !  !!q55555557575555557577575777777775577555755755775777577777777777577577577777757777777777=57777775777787757775777777775757577557577575557575755557557557757575577557777755557575575757575755575577577775575575557577557557577777777755555555777775555755777757755557557755555555575555755555557557755557577777777557555757575557577557575sppvppoopppppppppppppppvpvppppppvppppppvvpppppvv|ppppp|ppppppvvp|v||ppvvv|v|ppp}pp}||p||vvvpv}vvvpv}v}vv|v|||vv}}|vvvv}}}vw}}}}}}w}v}}}wvw}}ww}}}}w}ww}w}}w}}{}}}{}www}}{}w}}}www}}w}}}w}{www}w}}ww}ww}w}wvwwv}{}{}wwvvvw{w}wwwwwwwwvw}wwwvwv{wwvv{vvvwwv{vvvwvvvvv}{vvvwwvv{vvvwvvvvvvvvvwvvuw}uvvvvuvuvvuvvuvvvvv{{vvuvvuuvvuvuuvvuuuvuuvuuuuuuuvvuouvuuuuuouuuluuuouu;Y ! =q75775557757757757757757555575757577775757775777777757577757775575777775777577757777557777557777757777757775777557755575775755555775575755557775575575757557755555575555555755775557557775577555557557775555757557777557757557577555555757557575755575557577555575755575577757557757757775757577755757555775755755557577557557757755555755777555775sqpplpploppppppoopvppppp|vplp}}}v|vpppopppp|pvppppppv|pppv|vppvv|||ppv}ppp|ppv}|pp}}}vvpp}ppr}pp|pppvvv|}}}}pppv}}}v|}}}wv}wv}v}}ww}w}}wvv}}vwwwww}}vvw}wvv}}}ww}www}w}}wvwww}wvvw}www{}}}vvvw{ww}wvwvvvww}wwv}wvvvvwvvwwvwwwwvv{vvw}wwwvw}wvw}wwvv{}wv{vvw}}vv{vvwvwvvvw}wwy}vvvvuvwvvvvuvwwvvvwvvuuw{vluvuuuuuuuvvuvwvvvvvuuuvvvvvvwuuvvvuuuuuuuutuuuuuuuuuuuCluollu ;Y   !!p575777555575757577757775777777775777757577755777577775577775777755777757777777757777777757775777777777755576577775775575577577757557577775755575755755777577755757755777777555577577555555575775755575575755777557557557577555555755755757757575775557557557755575577775757555555775555555555755755557755775755577757555757557577757775557755557555575777775577575ӏsppoppopppppppppppopvpppppopvvppvpvvppppppvpvvppppp}ppp}pppppvppvppppvrpp||ppv}ppv}pvrvp}ppv}|pv|v|vvv|vpp}}|vwp}}pv}}}wv}v}}}w}v}w}ww}}ww}}ww}}}ww}}}}}w}}v}vwv}}w}wwwwwwww}}w}}w}w}}}wwwv}w}}}wwww}w}}{w}ww{wv}{v{w}vw}vw{vvvwvvwwvwwwvww{wwv}{wvv}}{wvvvvvwvvw}yvw{w}vvvvvvvvwvvvv{vyvuvvvvv{vvvvvvvv{vvvuvwvuvvvvvuvuuvvuu{vuvuuuuvyuuuuvvuuuvuuuvuuuuuuuuuuuouluuuuotuuuu9Y   q55757577775757577775577775575777777575777757777775777777557775777757577777777777577777577775577575777757775775777777755777757577775777775777775777557557557575557757557775755555557557775755777577555577775755557575577775577575757777755775777575757555577555557575555575555755577775755557757557575757557575555577775575577557555755775557755555555557775555757575775557ӏpppppopopppvvppppppppoloppplppolppppov|vpopp}pppppp}ppp|p|vpp}}vppvpppvvpvvpp}pppp}|v}}vpppp}|vp|v||||}|ppv|}}}}}}ppvpvvv}}v|vvvvv}}wvv}}}}w}}}}w}vvvvwvw}vv}w}wv}wwwwww}wvww}wwwww}{}vvw}vww}}}}w}}}{vvvvv}wwv{}vwww}wwwvvvwvvv{vvvwwvvvww{}}wwvvvv{vwvvv{vvvvvwvvy{vvvuvvvvvvwwvvuvvvvvuuuvvvuuvv{vvu{vvvvwvuuuvvvuuuuuuvvuuuvuuuvuuluvvvvvvuoluuvuuuoouuvvuuu@Y!!  ! $w55555555757755757557577757777757577775757777777777775757777777577775557775755$77775=7775777757777777=775777575777777777577577757777755777575777577577757755775577577757757575575577777755757575575577555557757757577557755757577557777555555557575757557577755575557757755555755575555757577557557557775575557557575777777555755557755575555557757557756555757775755575555757557557sllppppplpppvpopppvpopppppop}pppppppppvvpppp|vppvpvvppppp|ppp}|ppvppppp|vvrpvpp|pv}vpv}vpppvv|v|pvv|pp}}vvppv|vpvv|||v|vvv}|vv}vvv}}w}vww}v}}}vv}}}}www}wv}}ww}}ww}}v{}}}v}w}vw}{}wv}v{}w}}ww}v}{wwwwwwvw}}}}vw}ww}vwww}ww}w{wwv{vvv}{vvw}wvw}{vvvwwv}}vvwyvvvv}vvwvvv|{vwyvv{vvvvvwwyvvvvwuvvvw{vvvvvvvvvuvvuvvuvvvvuvwvvvuvvvvvuvvvuuvuuuvuuuuuuuuuuuuuuvuuuuuuuouuouutloutloo@Y   !q75557555557557577777777777577577777777577777575777557577777777775577777757757776=57777777777775575757777777557577775777757775757577777577755555757777775557755555755776575557775557775757755775555757775755555775755575775577755757555577577555775557575775775555755555755557555777775757755557755555757757775557575575577557775757755575777775555775757755575775775757775555757Տ}pllopvpllooplllppppppppppppv|pvvvppppppvvvpv}vppvv}pppp}}pp}volp}}}pp|vpp}vppppv|pppp|pp}}}pppp|}pvpp|vp}}}}pppp}|ppvwppp|}}}}}}|}}}v}}}}}}}}}vw}ww}w}}wv}}}w}}vww}wvwwvv}www}}w}ww}ww}}vvwwvvv{vwwwvv}}wv}wvvwwwwvvvw}ww}vvvw{vvww}vvvw}wwvvwv}vwwv}wvvv}{vv{}vvv{vvvv{}vvvv{vw}}wvvvvvvvvwvvvvw{wvvyv}w{vvuvyw{w{vvvvuuuvvuuvvvvuuuuvvuuuuuuuuuultuuuuvuuluvuoltuuluuvvuuoouuvvulllClt!;Z!!   p575577575577755755777557775775777775777757577777575777577778777777777777777775755777777757577775777$7757777775777777575575777755775555755557557577757575755575757577755777557587555575775557575757777555557577557557757577577775575555555775555555575557577577775755555755757777555775555577775555577577557555777757877757775775557755755575777557755577577577557775777555555Տpppopppooolpppppopppvpppppppvvpppp|vvpppvpvvppvvpppvpppppvp}|pppp}}pvvvppvvvpppp}ppp|p|v|ppp|ppp||pppp}}vrpp}}ppv}vpvv}pv|v|vv}}}v|}|pvv}}}v}}v}vv|vw}}}}wvvv}wv}}w}w}}w}}wwwvww}w}w}w}ww}w}}{wvw}v}ww}wwwvw}{}{w}{}w{w}w{wwww}v}{ww}}}{vv}{vvvvvw}vv{wvwwv{vvvvvwvw{vvvwvwwwvyvvvvwv{vv{vvvv{vyvvv{vvvwyvvvv{wwwvyvvvvvvvvyvvuvuvvv{vuuvvouvuvuvuuuuvuuuuuuvvuvuluouvuloouuooulouulloouullloCC!;Z  $q77755757757757555757577577777575777577577777777=57777557577777777777777757775777777777775775757777757777557775775577775777757757755577557775777755555555775575755555775755557775757755755757777755755577557557575575757577855755775555757577577557555757755757555757757755557577757555555577555577575757777777755575555577555555755555785775777577575557575575757757755777775Վqpppoopppoop|vpoppolpolppppplllploppppollpp}pppvvpppppplp||vpp|}||pp|||p}}}pv|||vppv}|v}}|vvpv}}}|ppp|}|pppv||p}}ppv}}}v}pv|vpp}}wvppppppvvppv}vvpv|}}vvvv}}}vvv}vv}vvvvvwww}}}}}w}w}}}}}vw}wwwvvvwwvvw}www}}}ww}wvv}vw}}}}ww}ww}}}}wvvvv{}}wwvv{}vvvvvvvv}www}}}wwv{}wvv{w{}}wwvvvvvv{}vvvuvvvvvvvvvvvvvvvuvwvvuuvuuuvvuuuuvuvuuvvvuuvuvw{vuvvvvvvvvvuuvulluluvvuuuoullCllullulClllluull@Y !!=s775575555757577575555777777757777575757777777577777777777777777=7777775775777777777577577777575777575775=7775775777757757557777777577557777557575557575577777755757755757755577775575775557577577577757577757555755557775557555557557577575775577555557557775755555775757777577575575577757575557575557585555775755775757555575755777777757775575777Տ}opolopppoooppppvpoolppppppplplovppppppplppvvppv|vppppppp}vppop}vop}|ppvv|}ppv}ppppp}|pv}vpp|pv}pp|vpp|v|vv|ppp}|pprvv}p}|v|vpp|p}}pwpp|p}ppvp}|v|}vvv|v}vv}vv}vpv}w}w}vvv}w}}wv}}vw}vw}ww}wv}wv}}wwww}}wv}{ww}w}{w}ww}vvwww}wwwvwwwwwv{w}ww}vwvwww}{v}wv{v}{wvvvvwwvw}{wvwvvvv}{wv}w}v{vwvwvvuvvv{vvvvvvvuvvvwyvuvvvvuvyvvvvvuvuuvvvwvuvvvuuuvvuuuvvvuouvvuuvvvvuouullulouulllloullllluClulClullllC;Y   s575575755555557775757577777777777777=5555777777575577777575557577777577577577777777777577777777777777755577777777577755557777577777757557757775777555557555555575757777555777757755557757755775755557775577777777755775577775757775757777575575777557575757557577575775557577557555757557555755755757557777575577557757555575557577575775755777555775777575555755575577755575577soolpvolpvppllppvppvppooopvvvvppv}vpp|vvpppppppplppppopppvolppv}ppp}|pppppppp}}pp}ppvpp||pp|}}|pp}||vpppvppppv}pp}}vppvvp}}}pp}pppppv}}}}v}}}ppppv}}p}}v|}}vv}~}v}}v}vvvvv}}}}vw}}v}}vvvvvw}}v}}}wv}}}vv}vvw}w}vvwvv}}wvwww}}wwwwwvwwvw}vvvv{vwwvvvvw{}}wvvwv}{}{}wvyvvvvuwwwvvvuvvvvvvvvvvv{vvv{w}wvv{{wvvvyvyvuvvuvvuuvuvywvvvouv{vuvwvuvuuuvvuvuluuuuuoouolulluvvuuvuulCuvvvuuutltllluvlCllCCCl!Z  ! q557775575575577777777577777757777577775757775755775777577777775=777775777775577777577757777777777775577757777757577775755757755755555577555557777557555755557557557557755557757577775775575775575555555555555757775757557555757555575755755575755575777555557577555757755777557757757757555777575755575555757557775555575557575575755555775555577775757557755575557555Տpooopvplppppplopvppppooopppp}vplpvppvvvplopppvpopppvpppppoppppvvppvpvvpppppv}pvppvpp|vv|pppp}||v|vpv}|pppppppppp|}}}powpv}|p|pv}v|ppp}}vvpv}|ppv}pppv}}vp}}|vv}}p}vvvppv}p}}v}vv}}}vwwvvvv}}}}}vvw}vw}}}vvwwwvw}}vw}ww}}w}}vvv}}wvvw}wvvvwvvwvwvwwvvvvw{vwvw}vvwwwwwvwwv}vvw}wvvvvvw}{vvvvvvvwvvvvvvvvvvv}{wv}vvvyvvwvvwvuvuvvvvvuvvvvuvvuuuuv{vuvuu}ulovuvuvuoouvoollotolulllulovolllouulolllllllllllCllllCl ;Z!   !  !!q555557575777757555575777577577777757777757757777777777777777575775777557777777775777777777775777575575777757777575757777777777757577575755577755777755775555575755757775557555755555575755555577775757577575775577755557575555575775555555755555575755557777557577557555555775755575777785775575577557555757775557577575775557557555577555755555755555557557555575757855757555577575755777557775777777577555557555557557575Վsppollpollloopololllpvpplpoppolppplppplpppvppvpoppv}vv|}vp}pppppppppop|vvpp}}ppppp}|pppppp}}}}p}pppp|}}|}}|}}|pprpppppwp}}ppp|}}p}}p}}|p}pp}|v}}}vvpp|}ppp}v}vpppp}|}}}}}}}vvpp}}vp||v|}vv}vvw}}}vvw}}w}}}}}w}}wvvv}}vvvvvvwvw}vv}vvvvww}vwvwvwww}vwvw{}wwwwvuvwwvvw}vvvw{wvvvwwvuvvvvwwwvvvuvvvvvv{}vuuvw}{vuvvvvvvvvvvwvvvvv{vuuvvv{}vuvovvoluuuvuovuuv{lvvouvvvvuluvvuoolllllllluololllllllllllCCCllCllCC@Y  !=q5775575557575755755757777577778575777777777777577777777575=777777777777777777775557777755757777775775777757777777777755575755575757557557575575557555757577777775557577757775755555755557557575575757757555775755575575755777757555575777577557787555755577755557557755557575775555775555577575555777555757557755577555575555777555575575557555557777775755755755557575757557777575777575577555575775755757757775757557577755755777575755775577575575}llloopllloplpopppllpppppopppplpvpploooppppppppppppvvpp|vp}pp|ppplppppp}pppvv|ppov||pplppv|vr|vvppoppv}}pv}||vppvppppp}pp}pppv|pv}|}}|pppp||p}}pp}}ppp|pvppp}}pvpvv}}}p}}}|vpv}vvv|}vvw}vvvvvvv}v}vv}}}wvv|wvvvw}}vvvvvvvvwwvvv}v}vvvwww}}wwvw}vvv}vvvvv}vvwvw}}vwvvvvwwvvvvvvwwvvvvvvv{vvvvvvvv{vvvvvvuwwvvvuvvvwwvuuv{vvvvvuv}{vvuvwvvovvvvvvvvuoovulppooouuouuullolovvoovlllooouollllllllllllClllllllCCllCCClllll@Y!  !=q7777755775775757577777757775577577575577577777777775575777877777777>57757777777757777577775775777787577777777777577577755777777777577757755557757557777577577555557757557557575777755775555755577577757555775577757757557577755777755577757575575575777755557775577575555575778755755755757557577577775555557555777575577557555757577757757555755775755775577775775575755755575755755755575775775755575577575777555577555775557577557555555575777775757557575բ}oopppoopvplllppvppv|poppppppppppplppppppoppvvpppopvpppppplppvpv|ppvvlpppolpppvvppvpvvp|vpvpppppp}}pvp}rvpppv}vv||}}}v}pp|vp}|p|}}p|ppp|}}pp}}pp|}}}p}v}}}pv}ppppv|vvpppvppvvv}}}pv|vp|vv|}}}pw}vvvpv}vvvvv}}}}vvv}vvw}}}}}v}vv}}}vvvvvvvvvwvvv}}vwvvvvvvv}wvvvvvvw}wvw}vvvvvvvvwvuvvvwvvvvvvvvvvuv}{vvuv{}vvvuvvuvvvvvvvvvuvuouvopvuluoluvvlououvoovvllvvuouvvoplvooololllllooooolooluollllllllllllllllllolCllCllll;Z  !!s75755557555557555777755775577777755757577577757778877777757777775777777775777$77577777757575777757757777777777757757757777757775777577575575577755577577787555555777775577557577755757757555777577775777757575577557557575757557555757757775577577575575577775555777577557557557575575757757757775757557577755577755775775575755757577755777757777757755757575757755555577577775577777757555575775557755575577577775755555775777755555775577577755577757555՟}lpppollpppppllopppp}vpppppoop}ppoooppopplpppppvplp||ppppopppp|pvvpppplppppppp||pppvppvppppvopppp}}}pppvppppp}|vvv|vvv}ppppv|}|p|}v}vpppr}}pp}|pp}}}}pp}}}rvp}pp}p|}p|vv}vp|vv|}}|v}|vvvvvvv}}v||v|vv|vpv}}}vvv}vvv}}ppvv}}vvw}v}vv||vvvvv}wvvv}}v}vvovvvvv}}vvvvvvvv}}vvvvwvvuvvvw}vvvvvvvvvvuvwvvvpv}vvvvvvvouvvovvoovvvovvvuoovooooouooouolvuvvooloolovulooolpvvlolollllllllllouopllollolllllllllCCClllpllllCCllCllll;Y ! 7s57757577557555557555575557757777777757777777775775775777=575577777757777775777777777777575577757755777777755777577775777575575757775575775555555577755755777558757555557555775577777575757757557575757775757775755575757777555557777775777557577575557757558555777557557757585577757777587757777555775757577777575775757557755575575755577575577777775777775577577755557575575755555755755575555575777555577755557577755555757577577577555557757ӎpolpplppoppopoolllopppooloppoopppvpp|vppppvvppppolp|pvvppppvvpppp||pppv}|pv|}vppvpopv|||}}|ppp}vvppppppppvp}pppppppvvvww}p}ppppppvp|vp}ppvvpp}}vpppp}pppvpv}pv|}}vpppprp}rppvpvpp|vpp}v}rwppvpvvvvvp}|vpv|pvvv|}}p}}ppw}v}vpw}}vvvpvvvv|v}}vvppvwvvvvvvv}vvv}wvvvvvvvpvwvvvvvvvpvvvwpvvwvvwvvvvovwvvvvwwvvvvvvvvv}vvovvvvvvvvvvvvvuvvvvvvvvvvpllvvpvuooppvvvpvpvoloollvullloovlopllllllClloollllllllollllCClloCCCllClolCCC@Y  ! !!p75577775555755755755575555777777777777757777757775577577777777777875775577577777577755775777777575755575577877775777755577775755775777757775555777755555577757557757757577757775557557555777555775557775575757757775777555555757557775575555755577777775775575775757557775855557575757555755777555577755575775557775555577755557557577575555557577757555777775757757575557575775757577577755757777777557577557757575575575757575757Վpllopoloppooolplllppplppppvpoplpv|ppvpopppppvpppppvvpp|}ppv||vpppppppppvv}|vvvpo|pop}ppv}}vppv}}ppppppppppv|vpp|ppvvpp}p|}||ppppp|||p||vp|}pppp}ppppppppppp}vp|||p|ppv|vppp}pppp|}pppppv}}|pppppv}|pp}|vvvvv}}vpv}}vvp}}vvvv}}}}vpppvvvv}}|vppppvvovpvvvvvv}v}vp}}vvpopvvvvpopvvvovvvv}vvvvvvoopv}wvv}}vvuvovvvpvwvvvvvvwvvpopvppopovvlvvpvpoollopovplovv|vouvovoopllollolooollpoolllll?lpllllollllllllll?lollCCC?ClolCCl{@Y!!!! !  m775575775757757775775787777557775757777757777777557577777577777577577855775777757755777775777757557577775757777757575775575577777577555755577575557775555575755577577755755555557777555575555775777775757575575777575555775557777757757555755775557555775757575555557557777557775575575757575777775777755775757575575757755577775575575555557757557755757557757575775555777575775577555577855757555577757555577775757775757557575775757757ӎsplpppopllppvppppppllopoolpppolopplppppoppvvpvpopop|ploppoppopppppvvvppvppvpppv|vppp}plpvppppp|ppp}pv|vv|}ppppvrpp|}pp}vpvv|v|}vv|vpppppp}pp||p|}}~p|}}}|pppp}|vp|}vp|}pp|}pp|}|}|p|v|ppv|pvp|}||}pp}|pppp|vpppopppvv|pp|vvvppppvppvp|||vpppvvvvvvppvvvv}||vpoov}vpvppwvvvvwwv}vvpvvvvpovvvvvvvvpvplovvovppppvoppoolooopvopoooppopovvvlooopppvvvvpllllvlovlllloololClvolooollllolllCllolCoplCCClllllClllllCClCCllllClCClllu;Z  q77777757557777777557757577777577777575777577777777777777575757757755777777755755557775777775777577777755777577757777575755775557575755575575757557577555555757757755575777775775757575575755777757777755775777577755577777755577775555577575557575557555775755557557577555575577575775557555777777785575557755757557755755775555577757757575775757757555755755775755777755755557757577558575757577577777775777775557755555575775577757Տplllopppplpvvppvvppllppllollollpplllppppopppppopvpoppplpvpooppppvv||pv|ppoppop}}vpppp||pppvvpppplv|pvvpp|vvvpppv|vp}|ppp|ppvpv}pvvpppp}vppv|}|p}}}||}}}|pppppv|vpvrv}pppvvpp}||||pp}}pppp|pp}}|ppp}}|pppppppppppppp}vpppv}ppvvpppvppv|vppvppvpppv}ppvvv}vvvppp|vvpppo|vpv}|}}}vvv}vppopvvvvvvplpvvolppppvpopppoppllopooloopvvov|vvpvpopvpplpvppollllopllllllolllplllllloopllplllllllCllllC?C??llllCllll>llllllllCCllCCCCC;[     !q755575575775777575775775757777777777755777777777557777777777757777777757757755777777577755777577577775777577777777777777555775557575757555775577555757777775757757577575775577557755555575777777555557777585585757577575557857757577755557757777755557757755557755755757777757777757777755757575557755757577577557577557775575555755755555757777555757575755755575555577757577757755555777575555577757577755577557577757555577777577ӎsppolloppollpolppplllovvpppppppopvpoppppllpppppppvvppvplpppppppvppopvpppvpopp|ppppvvpp}vppppp|}vppv|}ppp}vppp|pp|}vppvvvv|v|ppp|pppp|pp~}pvppvppppppopvp}vprw}pp}}}vvvpvpp|p}vppvvpp}}vp|p}}vppp}v|vppvv}|vv|}}||v}vpppp}}|pp}ppp}}pvppppv}vvvvvpp}vpppp|vvpvvpvppvvpp}}vpoopppppoopvvvooppvpvvpoppopvvpoopvpppppoopppppoooppollvpoloollollpvllolpololllppoolollpplCvvlllpllloollllllC?lllllllllllllClllClllllllll?lllllCCl@Y !q75755577755575575777575775577777757777777775757777755=7575775577775777757577557577777777577757757756757575777575757757775775577757577575577557577555577757555577775577575755777575775757577757775557555757775555555757755777757777777757777777757577775575555555577575757775755758555777557555777777577557575575577577577757575577777777777757775775755575755775585555557567755575775777557757775577755577775557555775575755775757755qpppllpoopllpvplolppllppppoopvllppllvppllppvppppvvpppvvpllopvvv}volopvpp}pppp|pppp|volp}vvpp|vv|vppv|pp|vrpv}}pp|}vppvvop}}|ppppppppvppv}|ppppppp|vppv|p|}}vp|}v}}}vv|vp}vpppv|}pv|pp}}}ppp}vppv}|v|p||p}}|pp}}}}|}vpppv}}|v|vppppvvpvpoppv||ppvpppvop}pppppppppopvvvvv}vplloopvpopvv}vooppvvpvppoppvvoooovpppvvvvvplllpplllplllpppollplllloplllooollloplllplllvplloolpplllllllCClllCCllCCllllllllCllCCopolCCllCllllCCCCC?{;Y!!!!! ! =}5755757755755577555555777=777777775=5777777875577778755557577777577575777777777777777577777775777777775777777577577575757555755757577577775555755577557555775757777555777575775555557577577757555755757585577577777757777755757575777575577755755775757755755757755577575555755757577577557755775757775755757777575777777755777755757777777557777775577755777777757757555577575757757777555577575755777775555557775555755758ӏqlooppollloollpllppplppolopppplp|vlpvvoppppppopplppppppppppppoo|plpppvpppppppvvvvppppvvppppvppppvpppvppppvvpvvppvvpppp}v|pppv}ppvp|}|v|vppp||}|pp}}po|}pppvppv|pppppppp}}}pvvp|ppp|v|pv}p|}|ppppppv}v}ppp|pppvppppppp|p}ppppppp}}|vpppp|vvppvppp}pvppp}}p|pvpvvvooppppvppvppvpv}poppppplpvpppppppoopoppppppolpppooplpppvwpoppplpllpplopoloolpploppoollpvllolpllplClloollllllllllollllllllllllClolClllCllllC>lllCClClllCllll ;Z ! 9q577775777755577755577777777775777777777577777777787=7757775=777777557777757777757575775777777777775757757575555555757785555777757577557557775777757757677757577577777777755755557775557577555767557577777575577777757757775575577877575577577577577755777765575777575577757757575775575755575777557577777555777557575777757557777557775557775775777777575755557775777757777555775777775775755577777557558755577575755757855558577755777775775755777֠}lloppllloppllllllllopllppooolllvppppppvploppppplopvppolpvvppllppp}}|pvpolppv|p}}vpop}ppppppppvpppppppppvvpppppop}}pvv}vpppp|ppppp}}pp}ppv}pv}ppppppppppppppv}}pv|pppv}}}rv|ppppv|}vppv||}}p|vppp}pv|}vppvppppppop|}pv|ppppppv||vpppppv}poppppppvp}vpv}v}}|vpppolpoppp}vpoo|}vppoopppppppppplpppllooppv}vvplopllllllv|vppplpopolllopvopplllopllppoppllpolplllll?llulpvlllppplpollllllllppolllllCllol?lolCC?lllllllllllClll@Y  !!!      !! q7777777777775576757775777777777775875775777777777777557$7577555777577775777757775775775757777757757577757777777757775565755757577555775755757577757555757775757755777777577777557577785777777557775757755757757575555775775755777757775775577575777757757577575777555777575575777577757577755577875777777557755555555575757557777775757555777575557557775757777757557557577757757575578775757557577577777577777775755777777757755555757ӏpollloppoolpllppppppoopvplppplpppppppppopppllppvpp|ppopppppplp|pppoppppppppploppppvpppppppppp|vpppp}vpp||ppppppvppp|vwvppppp|}||p|}ppprvppvv}ppp|v}}p|vpvvvpv}pop}|v|pppppp|v|vpp|pp|ppppppvrpp}vpppppppppp|v|vppp}|pp||ppvpv|vvppvppp|vvpvvvp|}pppp|ppoppppvvvppv|povppppovvplppp|popopppvpoovpppopoppplloopppop|ppppllpppppppoollvolllpppvpllvplplpllllloplpppllllllllllllloplllllolClllllllllllol>CllllCCCCCClC?CCCCCCCv@Y  !!p57777757777575577557777777577778777577777777787577775787755757787775775777777777777777777757777755777777777777577777587758775757755757557757757577777757777777775775775757577777575755575777777777777777777557575555577555777557777775575577785775557757575775777775775755775777557775575775555775777555757577577775755577775557777777777777777755775777777555777757577577577755577557877575767777577557775757555777577}pppllppllpllooopppploppvppppllloopppppllppplllooopvvollppvvoopppplpplplpp}vpoopllp|pooop}}plppppvppppppppppop|p|povppvpppppppv~}}}|pvvvpppp}}vpvvrp}v}}}pp|pp|}p}}}}p}pppppppppppppv}vppppppvvvvvppvpppvppp|}}ppppvvpppppppppppp|}||vv}}p|v|vpp||pppvvpplopppv||vp}vppoppppvploppvvppppop}|pppppvpplllpplolllppvppvplllopvvvollpvplllllloppvpopplolllllllllppvvvvpllllCll>lloolllllllllllClClllllC??Cllll?Cll??CC>>>CClCCl  !Z   !      7p557577775577557755577777577777757777777777777777575777757887777757775577777577757777777777757777775755775775757775777577575555575777757575857577777758777575555755577777557777577875775557777577777575777775577757575577575777577757575777557777777577755777777555777777757755777575777757775557577557775775557777777777757757578777777755775777775577777755577777575877777755577755777777775777555Տpllppllllppopppolopolllppppppppppppploppppppppppppvppppppppppopppppvpvpvppplppppvpppvppppp}popvvvvvpv|vvpppppppp}}pppp}vvvvvppv|vpppp||pvppvppp|p||vvppp|plrv||pvppplppp}p}|p}pp|p}|vppp||vvv|v|ppppp}pvppvvvvpppvvvppvvppp||pppp|vppppvpvvppppvvpppvppppvpppppppvpppppovvvvplpppppppvpvvlooppoppvvlpppv|ppppppppllpvplpollppolpoloppppollpploppllpopooolllllllllpClllplllClolllllllllllllllllCClplClllllCCCCllClllCCllCC>?lx;Y !q577757777777777575577775575777777775=78777887777787775777577775777777777777575577775777757577775757577777775555777777777775577777757557557777777575757577757777777777577777757755777777777877577575757775575757577757577755775577777777775757777777777755555777555775757577777777555577577577775577777777757557757775755575777755577775577785775777777757775577757577775777557577757575757577577777757775757775775757777777777777777777557775՟plllollllpopolllllppllpplllllvvvpooolpv|vpllvvppp}vplopovvllpvlovpop}|vv}pplppppppp|p}}vpoopppv|v||v|vvppp}}}|pppppppv|p|p|vvppp}pp|vp|vrppppppvv|vppopppopp|ppppvrppv}pp|}}}||pppppppo}}pppp||pp|pppvrvv}|v|vpv}|||vppv|ppvvppppplpppppppppp|}ppv}}popv}pppv|vp}vpopvov|ppopopvplppvppvppollop}|vppvppvvpopvvplllollolllllpolpplplpvpllolllllllllloplplopllllll{lllooolCClllClloollllCC>lllCj>lolllllC?ClCCC>ClolClCCCl>>CC ;Y  ! !  !s558767777777775577577777777877777557757777775777777777777777757775777777777777775777757777777777757757775777555577775777575757775757755555577575767777555557575557775555577777755757575777757577577775575777755777777577755777577757777555775557777777575775777557557657777577775777577777557777777777755775777777775777777777757557575577757777777577757777777757758775775577775755757577757777777577777777758557577555677575777777777777Տsllpplllllloppoolpvplopoopppooooppppllvvppllp|llvvpoppplp}plp|vpplpvpppppppv|oopppoppp|pppppvvppppppppppppvpppppppppppwvv}vpp|pop}vppppvvvvpp}|v|pvpvpppvpvvvvvppp}ppv}ppvvvppvvppv||}pp}}ppppv|ppp}pp||vppppvpppvppppp|p|vpp|vppppvppppp||ppp|plp}ppppp|pppppvpppppppplpvpppvplpvpopvplpppppppppooopppllpplopppppplpppppplppploopvplllpvpllpoplllllplpolllloollvllllllllllllllllllClllllllolClClllClllllllll>llCCCllCCll?Cllu@Y !q77757577577757557775775757757755=577777777777777877>77775=7755775777777777555777777777777775775775775777575777755777577777777775577757775577757777777777555775757757575777777777757777777775557757557575575775777675755777775757777577777755778577575757777777575757555777757757777775577557577757557787555557575777777775777575757777757575777757577755777675777557775777857777777777575575575777777775777757555777775555557577577777777575775577s}ppv|vvpllllooollloloollovvv}ppooopollopollllpopopllpvpllpopppv}plppooppllp}popvpppppvvv}}pv}}ppolpppppppv|vplpv|pppvvvppppv}}}|v|ppoppploppp}}}pvv||p|vpvvp||p|vpppp|pppvpppppppv}}vppp}}ppvpppvppv|}||vpppppvpp|vppp}}vp|}}}}vpp}}popppvpppopllppopppvvppppppvplpplpllppv}pppplopplpllopppppvvopllloppplpllpplpvpllppppvpovplllv|plllo|vpllpllllllpvvpplloppllolooolllllllollllllClolll?lollllllClllllllC?ClllCClCCCCllCCClC @Y! !!! p7577757777775757757555777=5787757=5777=5=577777577575777577877777777777777775757775757555777577777777775775775555555757775777557575757575577555577577777777777775777575775777777757755757777755577575575757755577777557577755775777577555755777757775775557757655777757577777577777577775758575757755577777755777555777557755555577777777757757577775775577777775575757557577855787757577557557777777775577555757777777777777755775757777757755575577777ӏqlllpopllopooolppplppploploopplopopplppplppppppvooolpvplppppplp|poppppvoppppvpppppppppppppop|pppvvpppppppp|vppvvpppp}}wvppprpppvppp}ppp|vpvop|vpppp||v|ppp}p|pov}vpvvppp}|ppppppppvpvpppp|pprvppp|pppppppvppppppp}vvppppppppppppppppvpppppvvppppppppvpvpvppvpvopoo|vpvpoppp}olpppppppppvppppploopppolpppppolpppolpppopoppllppollpovpllllpollpplolooolllllllllpl{llolllllllllllllllllllllC?lllllCllllC>lll?CllClCClCCClCCCll??Cu @Z =s7575777775587777557577575777757775=77777775777577777775757777777755775777557577787575775757777775775777557575777555577777777775775577577557777575755777557777577757777777777777777755757757555578755755777557777775775577775757757555577777777777557557577777757777777757777777775557557777755555777757577777577787757757775557757777775757777557777775775577657755577557577577575775755577775777757577777575777757777577775777577577775777877757757777775577557577557577577757777857577777pjlllllllpvplpplppllpvvpllllllllppppopopppv|ppv}pplpvvpvvvppppopppppvpppplpvvvvvv|vppoopplpvpllpppppv}}}pppvpppppvvvv}wvvvvpppppplpv}}}}|v}|v}}pp|pv|v}pppv}vpmpv||pppppppppp||pppppp}pppp|vv||ppvpppppppp}}|pppppppppppp|ppppvp}}popv|vopp||vvpp}vpppvvpplpllppll}}vpopvvpplp|vpvvpp}}pooppvplopppppvpooopollpppopppllllloppppllppolpollllpvolpppolllllllplllllopolllllllllllolll?CCl>CC?Cl?CCC>?Cll>>lCCllClCCCCC???llC?CCCCC@Y    !=p5775857757757557775777777755775777777775777755777777757787775757577777757777557877777777777777577775775757775757577577777777775755557775777775555555555575777575557775677775755777777577555555557757777555757777777775775575757775577577777577577775757777757757577757575777577775555775777575777777578577557555777775777555757755577777775777757777755777755575775755757757777777587577777777777777777577777775777777778575777777777775777777775757777577777777757577777557775777757755777slllllllloplllpollooppllllppllpppppppolloopvolppppolpopppppoppplovppplov|oopppppopvpppppvpppppppppppppvpppvpppppppppppwpppppvvpppvppppppppppp|vppvvppppp}ppp|popppppppvppppppp|vv|op|}ppppv}ppppp|ppppvvppp}pvpppppvrvpppppvppppppppppvpppvpppvpppppppppppppppv|lp|vpppvpvplpppvppplpvpopppppppppllpppvplpvllpopvopopolplopppooollllolllvplllollllllllpplllllplvllllllllpCClllllllllllllllllllllClll>lllCCClllCCCCCC??llCCCCCCu@Z   ! !q7775777777775775775775557777575$775777575777775777777778757777777777777757775575777777757775777775755755777777577777777777577575777557555775577575557757775577775777575555777577775777777775777775857775577577775755575775775757757777775777777755575777577757755555575777777777777775577777555777775557777777777557577777757577577575577777575757555775777777577775777755787777777575855577757775775777775557777777577777757775755755775757875757577777757757575775757777775576775577557777757577557777՟pllloolooloppopppolllllllp}vlovvpppolopllloplllolppolpoplppollollppppolpvpoppplllopppppvppppo|}}vpoppplpppplpp|pp|ppop}vppppvvppppppoppppppppppoppppppppppppvpp}|}vpppv|pp}|vv}}}}ppp}plppp}}pppv|vpvvpv}vv}}pppvpv}}|vpppp|}|poopp}|vpplppplpppppp|v||ppppp|}vplp}plovppplppolppllloppoppppllppllpvpvpppvppppppolllpppploppolppllpplllolllllppllllloopolllllulvplClCllllll?lllovlllopplllllllClllllClClllllllllCClll?>ClCCllC??#Y!!!!!  q7775777777775575775777577787775777577757775778575777757757777575778577777577577775777777757577757577777757757777777577775575575755577755755777775787757577555777777777777755555757755777757777755777777777555777777757755557777777557577775757757577757777775587757557777775775775775575757775777577777775775575557777777775777777555777755775777577575557775757775777757777775757777777777775757785577777777777757575777777777757555757777755777577775777ӏpoplollpplloplllollollpllovpllvpllppopppppllllpppoplppplpppppopppopvppppppppvpplopppvppppppplpvpppppvpop}vppppppvpppppwvppppp|vvpppppppppvvppppvpvpppppppppp}p|ppppppppppv}ppppppvpppvppppppv}ppppppv|ppppvppppvpppvvppppppvvppppppv|ppolpppvpppppvpppvpvplpvpopppvppoppppppppppppppppppplovpppllppppoopvlpplppolpoppolooppoolollopolllollllollollplpolllllllyplllllllpoCllllllllllllllClllClllClol>lll>lllllClCClClC??ll??CCCCCl;Y  !q777777577777775756577787777777777777757757787777777557775777777775577577777757577777777575577757777755777577777777755777575775557757755775777777575777757757777777777557775555777775777777577557575777557777575577777577775777777775777777577577575777575757775555775577777757577755777777577777577775777777577757757777777777775755557777777775777777577777775777577777857777557557777575775777775777577777777577757775577777775775577775777755755777577777777777775577splllllllopllllllllpppvpppppllloollpvpppolvppopollooplllplpp|vvppplovpppoopppppppp}popoppv}vppp}vppp|}}ppvvppvpv|||pppp}}}pop}}|v||vpv}vpv|pooopvp}}}|vpppvp|}ppplp||pv}}}pvvpppppppv|ppp}}ppoppv}vpppvppppppop}}pppppopvvvvppppvvpopvvppoppp|vppooppllpvv|ppppllplpvppolpv|vppvpppppvvvpollloplplllolpopolllppplopplllllppplllollllllllllpolppppllloplllllllvoCClllllll?>llpvlCCC?Cll?lCCl?>lllClC?ClllClC>>?>>CllCCClClC>ClCCC> !Y!    7p75555777777555777775775587777757775777775575575777755577777755577577777577577777757555757777757577777577777755775577555775777755557777757877777777775777757557777577777777755577557777777777575755775777577757755777777777577775777757576757757575777777757777777565775575557775757777755557777557777577777577555877577777777577775757775777577777777757577777575755577775777577777777575777777777777577775577777757757777777757777775777557775777777775557777777777777575575775777Տqolllpllllllpopollolpoppooplllpolloploppppplppllppppolpppopppvppplppppppooppopppppppppppppoppvppppppvvppppvvppppppppppwpppppv}pppvppp}vppvpppppppv|vppvpppov}ppppp}plpvppvppvvppppppppppv|ppppppppvvpppppopppvpppopv|pppppppopp}vpppppppppppvpppppvpppvppppvpoppvpppopolpvppppplppppppooppplpppppllpopppooopoppoollllloooopllpoppollllplllllllpolllllollllllulllllClvllClllllllllll?llllCClllClllClCCllCCCC?ClCClll??lCCC??ll>>CCl;Z !w777775575757777777555578777787777775877575775777777877777777777777577777777777777757777777777775755577757775557777575757757777777777775555775785777557575577575577757557777775757577777755777577777757777776777755757557775775777777777777777777777777777777577555757757777775555777777775777757777777577777777777777757777577577757775775775777777557777777775557775757577577777577577577577577577777577775557777757577775785775777777777757777557575775575}llplllllllppvvpplollpvplllllppoloppllovvolpv|pppppplpvvvppolpppvllpoovvpplllppooopvvpplllllpppoppppppplpv|ppvvppplp|vvlloppppppv}plppplpp|vvpopppppppvppvv}}popv}}vpppoplpppvpp}ppvppppp}|}v}vppvvppppppppp|}ppppp}vppppvvpoplppppollo}}vvvpopvpv|pppppppvplvpppopvp}pppllolllllpppllllopvppvvpvpolllppplloolloolppploppopllllllllvvppppploollpllplllllpolllllolllllllppolCCCllllClllol?CllllCCClllC>?CCCClllC>CC>Cll>>>>?C>>>CC!Y!    !!  =77587755775777775777557577878777777757777777777877777777777777757557777777777577775775777775777775577577777577775555777555777555775777555575778777777577557557757578757575757777577577777777777756775777775577777577777557575577777575557775777777575757575757557577775777787775575757775577577757557777757577777777757755777775557577757557777775777577576575575575877777577755775777775775777775775577557577757777777777555775777777567757575557755577777557775Տqlllplllolllvllplolppoplllllooolpplollppplllpvoopopooopppvplopoppllvplovplpppoppopopvppppppppplpppvppplpppvppppppoppv}vvppppppppppppppppp|vppppppppppppppp|vvpppvvpvopvpppvpppppvpvpppppppvvppplp}ppppvvppppp|vopppvvppvprvopppppppppppppppppppppppp}pppop}ppvpvolppppppooplplppolppoppppppppplvpppllpopplopvllppopollpppololooolloppollplllllpollpplllCllvlllllllplllllllllClllllC?lllllCllllC?CClll?CCClClllCCCCCCCCCCCCC?>>>CCCC;Y!=q7775777775757777777777777777777777775777777777577777777777757777757777777575777777577575777775757777777777757777757577775775555577777575577777557777775777777577575575777777777775757777777577555775775757755555575757555757577777777757775777577577775577577777577557757775755755777777755557757557575555775775575577775757557757777557756575557577757555775775777775775557555775757plllllpvollvpllllpolollolpopooppppolllopllllpplloplopolllollvvppplovpllppoolpppppolpvpppppppppopvvppppllllp}ppppppvpppvvppvpppvppp|ppppvv}vpppp}}vvpp|}popop|vv|plplopv}pp||pppp|||vpppppppppoopvvlopv}}}vplpvvpppppppvvpppopvvvvvvvvvppppppoploopppvplllopppppplpvppplvvvplplpvppooppppoollllllpvpopplopppvplllloppppllolpopplppplllpollllloplllllppllllovCCollllllC>CllCllC?CllllllCllCClllllllllllClllCC>>???lll?ClllCllC?CClC>?{!;Z   !   p7775775577777577577575587778777777775757777777577777877777777777777777777777777777577777577575757575757777777755577777577575776757577755777577777775755755575775775577777755575577777757775777777575777755575775575577775775575577755755567577775557755577777575777777755577755575766775757777777575577757775777555757555557775577777775575757577777575777777557777777757775755575755755777755577777777775777777757777677577Վpolllllllllpllollllpoollvpllllppoopppplollllppoopvolopollpolppooplopopoppppppopppplp|plv}pppopop}pppooppopppvpppppvpppwvpopppppvpvpppppvpppppopppppppvvppppppvpppp|ppppvppvvpppvppppppppppp}oopmv|ppv|vpppppvvpppppoppppppppppvpop|ppv|plpvpoppppoopvpppppopppppllvpolpvpppoolpvplplpwplpoollvppppooollppoopplllppopplollpppolllplllloolllllpolllplllllllolCllllllllllllCllllllllllllCllCCCClllCCClC?lllCCCClC?CCC?CCCCCll?>CCCC?>C;Y $q75575575757777777777777887777777777775777777777777577777577777755777777775757777775777575757777757655775757777755777757757777775777575575755557577777775777755777777757577757757777755575755577575577655775775777777757557577777857775775775577577557577577777777775775577777575775575775777757775777777575777777777577777756575775757775775578557577577575575775755575777777557777778plpplpllllllppvollloppllollplllloppoppppppolpplloplpvpplpvvppvoppplpvppppppvvvppppppvllovpppllloppopopvvpopppppppppvpowppoppvvvv|voppppppppvpppppppplppvvpppvplpppvp|vplpv}vppppppppp}}}|pvppppp}}}vppppoppppplpv}|pvppppvpppppplpvpop|pppppppvvppoopppppollppppllpppoplloplpppvpppppvllppplopvollopploppollppopppllolllllploolllolpollllollllllpllllloovoll?lllllC?lopl?lollllllCCClClloollCCCCC>?CCCllCCl?>Cll??>>>?>?ClC>CCC>lC>>u;Z!! q775577775555577575755555777757775755777777777787877777777777777755577777777775757577777755755557777757575757777555875777775777577577777777577767577577777577557855777577577777777577555777787775757575755775755577577777757758777757755757777757757575577777775777777755557577755577777777777777755575757775777575555775575775757575776777577577755777577575567557775577757557757757757758577577777777777657775777777Տqollllplolllpolllllplollllpllloolopppplppplooplpolppppolpvpppoppplppvplppoopppppvpppppppppppppopopppppopvvoolopvpppvppvvppplp|ppvpppvppppppppppvppppopp|}plpvplppppp|popppvpppppppppvvv|povvppppv|v|popppppppppppvvvppopppvpppppppppppvpoppppppppppoppppvppoppppppppllpooppooppppppvppolppopolpplplpolooollpplplollpoollloollpllllllplllplllllllpollllol{lolllllllllClll?CllollClllllCCllol?ClCCC?ClCClCCllCC>ClC?C??>?ClCCClCC>>C>>C;Y   !!p777577777777777775757775777777787777777777777777777777577777777777775577578775777775777777775775775777577755777757757778557757777777575777777755575777577777777575755777557577777777775757755775577777755577755777575777577557755757555577577757557777577557557775575777557577557777577777757777757777577577877555577755577777757555757775757775575577757777777755577777777575775775757plpllpoolllllllllolllllolpopollplllllllllploppppploolollppllloppllppplpppploopppllpllppppppplopvpvppvvpv|vppoppppvppoowppvpopplplp}|vpvpppppvpoppvvpvvppvppv}plpvvpv}plpvppoppvvpppvvppplp}}vvplopppppp}ppppppppopppplpppvppppppvpplovpopvppoppppvppplllpvvpoollpppvppppvpppppolllopopppppvpplllpvvvpollllllllopplloppplllppllllolllplllpoloppplpll?lClullplllllllllllllllllllCCClll?ll?CC>CllClCClllCCCCClClCCCCCCCCCC?>CCC?>CC?>?Clv#Y !   =s575757777757777575757777777777777777777778777777777777777577777777577785755777777777777577755777777577777777775777775575777777575557755557557575757775775777557765577775577777575775777577776777757575755777755757577557767757575775577555777777757777577577775777755577555777555757775577757757778757557755577757777575577557755775775775775777777557578575757577757577775Վpllllllllllllpllolpolllollllppllllpooollllppooppolpoppolpplloppolpppplpooplpppvlloplpovpooppppppvpppvpppvvpoppppvvpoppwpopppolplpvvvp|poppppppppppp|vpopvpov}poppppvvpppvvppop}vppppvpppppvvpppppppppvvppppppvvpoppppopv|pppopppp|pllvppvpoplpvpvvlppooppvvppplloopppvllpppppvplopopolpvpopolplopppoloollppllpplplllploollppollllllllllllllollppllllllluCoolllllvllllCllllllCCllC?llCCll?>CllCl?CCCllCCCCCClClCCCCl?CCC>>ClCC>>lC>>ClC;Y ! =q57777775777757757757777777777777755777777777777777775777575757777777777757757555777777577577777777775777777777577577777757777777555577577755775777557775777575575757755785577777577755777755555777775757777777777577755755775557775757755777757775757757775577777777555555757777755555577577577757756577775777777557777577677777777575757777775575767757577577777777777775577577555775577777577755777757777555577757757splllllllllppolllllllllpppllppppllpplolopooplllpllpopppopppppoopvpopppolloopoppllv|ppppooppppppppollppplopopppppppploowpppoppppppppplpvpv|vppppppvppppppppppvppvvppppppp}|pppppplppppppppppvppplpppplpppppppppplpppvvppvppplovvvpopppppppopppppopllovppppopvpllpppvpppooppllppolpvppllovvollopolllllpppolpplpppllllllopllpplllplllllllplllllCllllllloollpvlllClll?CCllClllollllllolCllllllCClClClll?>CllC??ClCClllCCClC>CCCC?>>C>>Cl>A;Z!   =q7757775777775567757557775777777877757777577777555777775777575577577757775777777555577555555575775577577757755775755757575575775775557775577575777775567557575757777585577775775757777557777577777577777557575777777767777777575775777755757767777777775775757557555577775775557777757577757577777557757777777777777577577757557755757557575757755777777775858777575755577777775757757777577777757755777757Տqllllpllllllollllllllllppollppoolloploppllppolllpvppolppovppolplppopppplloopopplpppvpoopppppoppppolpppppppppppppppoool}vppoopppppppppopppvpvppppvppoopvppvppppvppplpppvpvvpppovppvpopppppopppppoopvpplpppoppppppplppv|vppppopppvpooppppppoovpppooooppppvopppllpppvppppppppllopplpvppolllppllpoollooppoolppplplllllllppplllvollolllllllllllllCCpplllllvllloololllllCCllllCllllClllllllllllClClll?C>llCClllCCClCCClCCCClCCC>?C?CC>>>?CCC>;Y !!!q557757575777557555777778777757777757777775557777755775775777757577775777577777575775557777557777757577557577577775577777757775777777757777775577757767777757775577775575577777777577777757777757777777577577777577757557575557577575775577775577755777757777755757777777577557755777757577575777775777777557775775757777757555775577877777778577755577777757757777757775577757777575777757577755577755777775575Տplllllpllllllllollplllllpllllllllppoplolllpplpollolllllllpololvlllopllplopolpppppppopppoppollloopvppoopvvppploppppppppwvvoopvvvvvppvploplppp}pvvppvpppvolpppppppppppopvpppllpp|vvppppppopppvpppppppvvpppppopppvvpopppppllpvplopppoppooppplloppppppppvvpplppppv}voollpopoopllpoppvvoppppllopppvvllpppolllllpooooplpppllllllolloppplpplpllllollllllllll{lllClllllllllllllllClCCllC??llC>CC??ClllCClCClllCClCC>>CCC>>>?ClC?C>>>>?C>CC?CCCCC@Z =s77755777577775575777777785775777777877577777577575777775777777775777777775777575557787777757557557775777775575775757577757777757755777577577557575577575767757777757757575777575757577577577555555777557575577555755557757577575757777778757577775757557755577777555777555775757777575775757757575555757777775757757557555755757757777757777555575777775757757557577757757555877755575755575555577777787557775557757755777575755857577557777575757777555557757755557577555777755775ӏqjClllolllllllllllplllpllolllllloplplppollllooollplllllllpolllppollplpplplplopvplvpooppoooolllppvpppoppvppooooppoopvpovvpopvvppvppvvppoolpppvvvppppvpppplpppvpppppvplpvppolpopvpppvpppoppopppvolvpppvpoooooopppvppvppolplpppoolppploppppooopppoppppppppoppoopvvpllloppppololopopvppoppllllplvppolppopllllllppppllopolllolllllollplloolllllplllllllll{lllClllplllllllplllllCClllC??llCC?CC?llCCllClCCllClC??CCCC?>>?>ClC>>?>>>>>CC?>?CClCx@Y     =s775757777775777557577757577777777777787777577857757577777777777777577777787757757777757777555757777575557775555757565557777577777755757555576757555755575777565757777557577757777757575755777555755775755757775577775555757575757757755577575777575757556575577757577777777755775775757755757575775775575557575755555775757577775555557775777575757777775765575555777777775755575775577755776575577557575557855575777777755557757775757557775555776777577777557757777758Տqllppllllllolllllllllllollopppplpllllllpolllopoppplllpppppppplllpppppvpopoppppollppllpppppvvppppppppplplopppppppllppppvoppvvplpvpoppplppp}}ppppopooopvvpppvw|ppplp}povvpoppppppppoppooppppppvvplpppopvvppppppppppvppooppvpplpppv|ppppppoppppppoppppplloopooppplpopllpopppppppolllplllppvvpplllllopllpplpppvpolllllolllllopplllllpppllpllllllvplClolouoolCClllCClllllllllll>?llClCCClCllC??CllCCllll>>?C??>ClllC?CCC>>CCC?CCCCCCCC>>>>>>>?!!!Z! !s77777757575577575557757557757775777577577777777777577787777777577555775777577775575577777557775775577755575777757555567575575555755755575777757785577575777575777777557777577567575757775755757575755755757757577757775757557755557557575775755775757777755677557557775557755555767557755557777577757767777577757755775577775557777755575577577557557555556755577755757755775557556557557575777775777577577757577757577577755777757555757777557575577775577757657777555775555777757775Տ}llvplllllllllplllllllllolopooolplllllllplllllllpooplpppplppppllpvvppooloopvvllllpoloopppppvpppppppppollpvpppppopplpopuopvppoppppolppopppvvvollppoplpvp|vpvvvplpppvpoppppopvpppppolpopvvppvppppoppoloppvpooppvplpvpoooppvvvplpppvppvvoopppvpoppplppoloppoppppploplploppppvvpollpllllpppppolllpllollppppllpppolllllllolllllllllllllppllpllCllpplllol{lppC?llllCCllllllCllCCClCllCClCCCCC?CCClCCllCClC?C??CllllCCCC>>?>CC>?CCCCCC?>>>>>>C>?u;Z $s57555575575775757757755775777755757777775775777557777757775577777555757775777778777777775577577557757577757557767775755775755755777775777557577557757755577755555557757555577775757577777777777775577755775755575777557757577555575557575577775577557557757757767675577775575555777775557575775757777555757775557557757557757757575557777577577577557657775775757577578557775577775755777775775777777555757577775557575557575557757755577575575555555575577775555wlCllllllllpppplllllllooplllllpopplllollllpppopllllvpllllllooppllpplolplpplpplppolpplpooppplloppooolppppplopvpooppllplwppppppvpppopppppvvpoppppvvppllolp}pplpplpopppopopvv|ppvppppppplpppopppppppvpppvvvpppopppllppoppppppplppvpplpppllpppploopolpopopvppppolpopppppplllopllplpplppppopllloloppooollllppolollloopollopvppllllllplllllloollllllClllyullollloCllCCll?CClllCllllCClll?llCClCllCCClllC>?ClCCCCC?>??lC?ClCClCClCCCCC>>?CCCCC>>>;Y   9p757757577577777555757557777875777777775757777757775757777577777777777775757777777577777577555777757575757775557575577755575777757777557767675777777577557777557777757577575575755577577575555755757577575577775557577557575557557777777757777757565757775757757755755755757557557555577557757575777775575557575577757555757777577558575757577755575575755575755757757557557777557757557577577557777777557557755577575755585757777577777757577557755577557577575577755776557777ӎqjCllllppllppollplllllplllllllppolllpolllllppoplllloppllllllppvllplollolopplplpplopplollppolpppvpplopvpoplppppooppopppwppppppvvpoppoppv|pvpllppvvpplloop}ppoppppooppplppvvppppvpppvpppppvpoooppppvppv|vppppooppooppppppllppllpppllpppopppppolppppploopppppvllppvllpplllplplplloollopollollopppolllllllollllppopppllllpppllllllllllplllllpolllllllovoollCCllllClCll?CllCCllllCCCllCCllClCCCllCCClllC?lClCCC?>?CC?CCClC??llCCCCC>>>?CCCC>>>>C @Y! p5755755757577557577757675777777777778777757757775777777777777777777557777775777755557757575757575775557755775565755555555557777555557757775575757575755755775777555757777577575757577777577755757775577577777775777557555675755575777577557555777757877575577775557757577757577557757757575777777777575757577575575755577755777777755775575557557556557755557577777775557555757777555757555775555555575557575577775557757777555755555757777775775575557575757577Տqlllllllppllllllppllllloloplllllllllpppollollllpppploplplollllllloooppollpplpooloppllpopolpvvpollllpppoppppppllovvvppvvoooppppolpvppppopppvppppppp|pppppvloppooppp|vpploppoooopooloovvplppppppppvvppppoppopppvvppppppppopvvppppppoopppopppppooolopppppvoolpvplpllopvllppopopllopppppooopollollpplppllllllllollllllllllllllplllllllpllllllllpllllllloCllllllllllllClll?lllllCllC?CllCClllCCCC??>>C?>>C?>?CC>?llCC?>Cl>>>>>>lC>>>???>C>>>>?>{;Z! !q775777777777577755775775577877575577777757757757755757575757777757785557757777677575777777575775577777755577575757775757577577677765577575577855757777757757577755777755775777785655775577577577557775557555555555555555777557777757555775577555575557577555677757557777775775757775776755577777777577575777777575555557757777577775558775755757575857575777757757775575775755777577757757777555775575757775577775755755775775777777557755775555777577757575557575757Վpllllolllollllllloopllllllpolloollppolllllpllllpoollppllllllppollollpvolloooolpopppoopplloppvvplplllvoopppppplpppvvvpvulopooppoopvvpppoopv|ppoppppvplvvppolpolpvpp}vvpolpppppploloolpvppoppv|pv}vpvppoopppoppvvpppppoopppvpppppppppppppppolpppolopvvpvplplppplllllppllpooppollllpvpoolllllollolllppollllloppllllloplolllllpplllllllllCllllloolllvuCollllllllllClllolCCllllCCCClC??llClllCCC?C??C?>>?>>>CCC?>>llCC>>ll?>>>?CCC>?????>>=>>>?>C ;Z!   !  !q7757577777575587857777777785775757577875777777577577777577557777577757757557777575577777775557555757777775575757755755757577575555577777787557777555577577577777777577775757555577775757777577775577755777555757557775575557757757577777877577785557557557575757777757775757577577757777577775777755777757557757575575777575755775577557755775775757575775775755555555777577575557777755757777757585577575575575575577577777557557577577777777577578splllllllCllllllllllllpllllolllplllllllppllopllpplpollpplpppolpllpppllppllppppolopllpopppopllllpppplpvppoooopopppopopplwpvpppppploppoppooopppplopppplov}popoppploopvppplpvpppppopppppppooppvpolpppllooppppoppppppppoopollpppoppppppollooloploppvplovllllo|vlolppppppppopppolpplplovolllppppolllollopppllpopllllllllppplllopvlllllllolllppllllllluvlClllllllllClllCCll?llCCCCCl?llllll?>llCC??CClllCClC>ClllC>CCCC???CC>C>>C>CCC?CCCC>CCC?>>ACv;Z!=s575577767775777775777557575757575877777577777777775577757757575757757577757557775777757555775775757577585557755557777775575757775757777557577775558575555775557575557777757575777777775577557775775777777577777775755777557565777557575577557757775557575577575555575777577577757575777757555775775777575555775775558755557557575757775577755555777757775757575777757577757775557577575777577755576777755777576775577755775775555575557557775755777557755755555Տp?lllllllCllolllClloloplClllllllll?lllvpollolopolplllppopvvllllopoppllppplpoploppllopopppollpplpplpvvppoololopvplooooowvvvpoolllppvvploolpplpopoppolpp}ppolppppooolppplpppppppoppvpppolpvvpplopplollppvpppppolopppppllloppoloooppolpplloplllpvvvplpplloopvplpppvvppppppppllllppllopllppolllllllllppppllpplllpllpllpppolpvplllllllllllpoplllllllllllolCCCllCClll?ClCCllC>CCll?ClClll?ClClCC??CCllClC??CllCC?CllCC?>>>>CCC>>?lC>>CA>>>ClC>CCCC;[     !  =q575577555575575557577577757577755777775775777777757777777777555757775757585577577575775557577757777755755757657777777755775575777775755767757777575775757577777775757557577777575577577557755757577575557757777577777755775577755575557777757557775555775575757577677775775777757577775577577757555557757775577777775757557757777757577777577777757557577565577555557857775777755757777755775757755775777777557777777775757575577777777577Տ}lClllllllllllllllplClollloollllpllllllplpollllllolloolllpllplploolpploppoollllopllopllopplopllpppplpplplooopopvopplopvlppppppppppppplpppvplopppppppopplppopopvpppopvpoovpooppppppppppolppoopppppppopplloppvvpplooppppppoopplpoppopppllpvplpllplopplllppollpvpllllolololopppolllolllopooplpppolllllllllvvllopllllolllllopllllpllolllllCllllllluuCllllCllllllllllCllllClllClCllllCCCCCCCCCllllCllCCCCCCCCCCCCCC???CC>?C>C>>?CC>>?>>>C>?C>>>>>=C ;Yq57575775757557755757757775755775575787757787775757757775577577558575577787577575777755778576775577755775775557555755775575577755775575575557555555757777575757555577557757777787575757777777757777757757577777755777777557577755757555775755777575757777755755777575775555757575757757757755777777757575775775575557755577577577557575577555775757557557777577577767575677557755757777776575777757577555777775757757777777775775757577777577557575555577575756577757575ՠ}ollllloollllClollplllllllllpllllllllllllpplllllllopplllllollloopplllopopllollolllpopllpllolllppvvolpollpppooloppppllluolpoppvpopvllllpvvpolpvpvvopllppopppppv|pppppoppoppllvvppvppppplppplppppoppppollplpppppollpppvpvppppllppoppppppppplppllllpppollpppllovollllllppllovpolllplollpvppplopopllllllllpvvolllllllllllllllllllooppolllllCCllllCvllllCllllooolClllll?llllllCClllllC?llClC?CCllClllC>CllC>>?CCCC>>CC>>??>?>>>CC>>>CC>>CC>>>>=C>=={@Y!      =s7777757557557577577577577555777777775777775757777777777777577575575775755755777775577557775577575777755777777778575557557777777757775777557557757575775557557575757757757557577777775775757775775575557757557577575757757575758557757757755777755555557777577575775557575755777575777777777577557557775777755775757555757557777757577777577577777557755577557577555777577575557777575775577777575777575557757575557777577557575777777755777757577757775755775757775765757757pCllllllllCllllllovlllllllllllllllolllpllllllllopopllllpplplppplllooopolpllppppllpppppolopppppolppllopooplllppplopopopvppoolppplovplpoppplopoppppopplppoloppopvolpppllvppplpvpllppoopppoooppppolppppllpppppopppppppppplpoppooppppoolllopopvpoplppopplppooollppllppplpvllpvlllloopppllpllllllopollpppolllllllllllplllllllllllllllllllllollllll{CllllllllllCll?llCllClllCCClCCCl>CCCllCl?>?>?CCACl?>CCCCl>>CllC>?CCCCCC???>?>?CCCCC?>?C>=>>CC>>>>;Y  =}7555777777577577677777777557757577777577757575777777757877575555777777575775577777757577577777777777575757777755757757555557777575857775757557775757757757777577555767757777755777775775757575755555777777757777577757777577777577777775757777775777555777575777757575577775775775557755757777777775775757557577777577555777777857555555775757777757755777777755757777557767755567755557577575757775575755777577775757775755777755757755775755555775575755757577755755ӏq?ClpllllCllollllpplllllllllllllllllllplllllolllpvlllplpppolpvpllllppollllllpplllpvpollpppvppolppllloopoolooppollllovpwpoolloppooppppplpolplppoloopolopolloppoplloolllppppplpplppollpvpploppooooppoolloppppoopplpvvppllpppppvppvplllllppppvppplpvpppoovpollllpppppppovplppllllovvppppllolppppplllppllpllllllllllpolpllllllllllClllClpppol?ooutCCClllllCCCCClll>?llllACC?CC?>CCCCClCC?>???>?CCCC>>??lllCCCllC???llC?CCCCCC>>>llC>CCC>>>>>>>>?>>>t;Y  !! ! !  =}55777755557557777557577557757575577757757777577777577777757857777775775575755557775775575757777777555775775777577757557757577757577577576757557775557577575555555775757557757575575755777757555775777757755557757575577777577575577757557555777575757775775775776777577775577775577575557775775757755577775577757555777755777757575575757557757755757777777755756655575775755777577557557755577775777577755777757777777777775757558757557775755557755757577575sllollClllllllClllllllllllplllpolllllllplllllppllolClvlllllllplpllolplplolloplopooplpolllopppploppllplooopppppolopolppvppppoppoppoooploppppoplpooppopppppplpoppplpppppppplppplplppppppolpopppppppppppppvpooloopop|plolovpllppllppopppllooppopllpplllllvopplollploopvlllllpololpvlllplllplllpllllloolllllolppllllllllllllllllllllplllolll?Cpo{lllClllllCllllllCClllCl>CllllCCllCCCCCCCClllCllClC?CCC?>>?CCCC>??>CCCCC>>>CC>>A>>C?>CCC>>>>>>>>?>>>9Z!!q757577757575757755758777775757877775777777755777557577757757775777777577757557775557575757757557575557557757577755757577577577757777757785785757777555775555775575557557555777857577757777775777577755757555777577577577777575777557557757777775775557575575557777575757777777755575777577555557555757777557755775755557775775555575775777775757777775557555777555758757577557577575757775577557757757555557777558777555577575557575577755777577577575557757556577777775575ՎpllolllCCCllolll?llllllllllpllpollpllllollllllolllljlpollllllplpolpllllplllooopvpllllollllppplopppopplllppvppolpppollpulllppppppppolllppoppllloloppppppppoloploppoplpplooloppooopppopplopppopppppppppppppolllppovvpllppvplllolllppppooplppllpllpoloollolpvpllollopopollllopvpppllllolllpllllllollllllllllvplllplllloppplllloplllolllllllCll{plllCllClCClCCllCClllCCCCCCllllCCCCl?>llCClllCllCllCCCl?>>>?>>>?CC>>CllC>=>?CC>>>>CC>>CCCC>>=C>>C>>>C ;Z  $p7577755757755577575557557575757587755775787577755777558557757775677775775778557777757575578755777575555777755777555755857577777577557585757557777777757777777755567777775757757575757775567755575755777577575755777757777755755557777557757557775558575755757775775755557775557755757557775757557775577777777577777755557575775577757777777555555775655787775755575777777775777577557757557757575775555555755585777577777575777757577775557575685557577plllllllllllllll?lllllllllllllplCllplllolllllllllvoloolllllllllplpllllllppplplplppppollppopllollllllvpllpploplppoollpovoploppppoplpppppppppllppppvpooploopopvolopp}ppplppppplooppoop|pplpooooppppoppoopoppplppplloooopppppooplpplpplopvppllppppllopplpllpllppllllolplllpllopopllllpplllolllllplolllpollolllllpplllllllllllllllllplllCllllluulllC?lllClClllCClllCllCClC?>lCllllll?>ClC?C>CCClC>CClCCCC>CCC??C?CCC>CC>?>>CCCCCC>>?C>>>>>>>>>?>C>=A>x;Y $p757555587575555578777578777577575757775777777857557775777777585757775777755556775755575577777577575755775755577575575757877775575775777757755575755757755775575777755577555775777777877557786775575575755577757775577575775758785775775777775577578578787775575577777757575577777558557757675575755775555555775775555675575575757577575775575775757557556755557757557755777575777757575577575777777775755875657777575775557577777755575777775776ՏsllCClllll?lllllCllllllloll?CClllllppllplopol?lllpppollllppllpllllllllolppppllllpppvploppllllllollllpvppplooooppollppouloolopppolppvvpvppvpppppvpppoolllloopplllpvppppolppppooooolpv}vopoplllloppppvpooopvpppllllopooppppolpolplpppoppvpplloppollpplolplpllppllllllllllppplpolllllppllllllplplpppllllllppllllppolpllllllClllllClollClllCCly?CClCCllCClll?llCllCCllC?CC?C?CCClllCCCCCl?>???>?>??CCCCC?>>ClCC>>CC?>>>CCCCCCCCCCC>>CC>>>=>CC>>>>>>>>>@Y!! ! p775557577777578575577757557767757755778787775577757577757577557757577557557555755555555877555777777575777755778575555575557575775567585758577755775757577857755555757775577777757777785577555757577777557778575577557777775555755857575577775765785785757755555777555555575575575755777575755587785755575775777755777578765757557758577578557757787577575557587755755775757577755755777575555576555775557755655775755555777585555777577777575556575757777575565557575577577755775775755777575557577775575875557plClllllllllllllllplllllllllClplllpllloolllolllplllllllllplllollplloppllllloplpllllloolpvpolllplllppllllopllopppoppollvoopppopoloppppopllooppolpvoplplploppppoopvolppplpplvplpppllpopvoplppvplooooppppoloppoolopplooopplolovpppllopllppopllpooppllpplppppooplpppllopllolppllllllllollplppvlllllpllllllllllllllllllolllllllllllllllCllllllollCClllClCllC?llC>l>lll>ClllCCClClCCCll??CCCCClCCCCCCC?CC??CCC>>>>CC>?>?CC>>A>>>>>CC?>>=>>>>>CC>>=>C>=>C9Y q555575775577557575577657575577577576755875777875575757775777757755757775575555557555577577577555555577575757557555577757557757775757575757557575777577555557775755855555775558757558577755755555555757775577777875557755785757557755577777755775585575757757555757575775755755555575568757577775755775575557575775575557575757557775777575857785757855755755577577757577775755557557557675555657575757577757757575775555775775757555777557757775655557557757755777577555775757757577557575555555557755855557555557775575575o?Clllllllllllllllpollllllll?loollllllolllopllopollllololll?lolllllpppplllollopollllopllpplolllpppllplllllllpppoopppopwolppllooloppvplllplolpolvpllpllpopppoopppoolpllppllpoppppoollppooppvvppllpppolollppoolloplppllolppoppvpoloppoooolloovolpooppopvppvplpppopoopplpplllllllllopplllppppllllllllllllllllpllllCllplllllllllCCClllllllllvolllllClllllCllClC?CC?ll>?CCllC>Cll>>lllCl>CllCCClCC?>CCC>>?CC>>>>>CCCCCCCC>>>>>===>>lCC=>>>>>>CCC>=A?>>C>;Z  =s55555757775555777557887575577777557575778767575755875557577757555575775855575775555575575555775755777555575575755575757555755777758577575557575775575855577775575757775577557557557575757575757575755557877777575657775755855655775575577575585755777557657555777755577777557555775855755577755775775775557577557557755755577555778557575557575557555575777777755757555577757557575755675577575577555757557577555577755575757577775757575757777787555557755775775775755555787577755565757755577575777755778757757758577557757777777775577655ՎpCClllllllllll>llllllllllllllllllllllllllllllloolllplllolllloloppllvpoplllplllllllpllollplllpplopplpppllopplllopolpoopvpppoloollpppppoppppllloovvloopppllppoopvplplplo}plooopppplpolooolllppppplpplllopoopplllloppplopopollpoopllpoolpplllplpoplololllllpplloolpllpplolollpplllllolllllllllllllllollllllllllllllllllllllllllllClllllllCl{lllCllllCClClClllllllClolllCCllCCll>>ClCClCCCC??>??CCC?ClC?Cl?>>?>>>?>lC>>>>C>>??>C>>A>>>=>>>>>>>>>=>>>>>=C#Yq555777557557577557555757757575757778857575555555775578757787777555555575755775587757755557775777557755757557575577587555775555777557555577557557775778777755755775775557577775557575575755558557575555775777757577877575577777557577755775578577575757577555777757557578555577555575555755775777567775575777757577775555765675555777777757555587757575577777757775587575757555777557555577775577777657575755775775755555575555757775575775555755575777577558557775555577777757577755555777575557577575777775755557757755775577555ql?l?>CllllllCCCCllCCllllllolllC?lllll?llpllllpollollpllllppolpolppppoolpopplllllppppppolllloooppllppllppppollppplllplvopollpolpppooopovvolppllpppppoppollplpvvppllllovpopoopooolpollplllllolppopollloppolllollopvplppplloloploollplllllllllpplllpllllllpllllllopploolpllpllopolollllllollplloollopllploollllllllllllllllllllllClllCCClolCClllllllCCCClllloolCllllllCllClloC?CClllCCl????>>>CCC?CCCCC?>lC?>>>>?C>>>CCCCCC>CC>>>=>>>CC?>>=>>>>=>>==>x;Y!         =w5755557575757757567855757757755557777557557577577575577757555787758755755577557757757757555578757775558575777557557557777577875575775757755775777777777557765575777558875775555775557557757775777758575757557575555555775575775875755557877755755575757575777575585757555775755575757575557577777575575757757775557557757757775575757775755575555757755677565577757555575757575557877577757777777755577865775755775755575555857765775557757757557575775775757757757758557757775577575557775777555557557757575575755758555575575755777555575ՏpCCllCCClllClllllCllllllllllllllllllCllllllllllolllllolllllvlllllvolllllllloplllplplllllllloplllpplolpolllppllpplllloovoopoloppoopllloopplpvpplllpoplpopoppopplopplplpvooplopvppllloppoppppplpllopppllovplplopploppllppllolpollpppollpopplllpplpllolplllloplllllopllollloplllllpollplllolllllplllpllllplllllllllllllolllllClllllllllll{ulllCllllClllClCCllllllCCClCCCClllCllCl??CC??llCCCC?>CCC?>>?CCCA>ClC>>>>CC?>>>A???>>CCCC=>>C>>>>>=>=>>>=>C>=>>;Y   !q758555757775555757555557555557575755875577875775575755757577557577555577755777777775577755555775777575775555557755755575775755777757555577577557755785575755555577557755575775577558555755757775755775555577575587575577575577557877556778757775755557575755577577557777775675557575575755577755775775555757785777755557755855575758757575558757757575755557577775787555575557575555577587555755577775775577557575577577755557577555555775775575577785557755575775757577755575757555777775775557557775555555777777555577677575558ՏslClllCllllClllllllllllllCCClloplllllllllolColllllllopllpolpllllplllllllllllolopollllllllplpolllpppllpolllopolpllloppovllllppoppolllllpllopvvollllpppllpppopllllpppppv|olllpvvvplplppplppppplllopppollpppppppopolpooopllllplplllollllpppplllppoollllplppllpollllllllllopllllllllppplpCllllllploloollllpollClllllllllllllllClllllollllv{lCCCCCC?Cllplllll?ClCCC?C>?>ClCllll?>?lC>C?>ClCCClC?CCCC?>>>CCC?CCCCCCC?>CC>=>>CC>=>CCC>=>>>>>C>==>>C==>>C>==>t!9Z !    q5557557557777555777755758775777577857557577777575755757577555855778755555557555777577755757755557575575755757555575575755777755757577575577757555757776557558575555558755555557577755587555875757575555755867787755855557557767775755555585577577577575775577757755557757777758578755757757557577757758757575575587575555775555775777757855557577577755577757585575777557757555755775755755857555555757577755577555577557577777557557755755755785577575755557557577555757777775575757555757555757875555755775pllllC?llCllllllllllllllllllClllllllClllolllpllllllllolllplllllplll?lplllpplpollolllllllpllopolloopoplllllpplolplpllppvpllpplllpolppollpoopppppplllvvolppplplplopopplovplolopoppopllpvoloopppoplloooplovplooooooollllopllpollplppllppopoplllplplpllopopplllllppllllllloplllllllllvlllllplllplllplllpplllllllllllllllllClllllllllllllllllllCCCCllllCCllC?lllCCCCCCCCCClCCl>CCCC?CCC?CCC?CCClC>?CC???CCC>CCCCCCC>>lC>>C>>>>CCC>>>?>>>C>>>>>C>==C>>>=>>>;Y !q5555757755577575775787577567577785575757577555555577577575575777855775557557575557577555757755577777577775755777555557577777755577777775558575757557577577777575875755785755777775757676757555755757755577555775557757575577755775755775875575855557857557755557557575557755775877558777775557577757577577778557557757575557875755577757556575775555577775575775557555577577877778555557777555577557777785556755775575557555775575575555557777555557577557755755877657757555755557577556775757555755577775555557577557557757p?lllC?ClCCllCCCllllolCCllllllClllllClopoollpllllll?llpolllllllllllllolllvvooolllllllolpppopvpllpllllllloplllpppvplllpulllpppllollppllplllllllpppllpvpllolpopplpvollllppollllllollllpolllopvppllllllpopploppolooollllppoololplpoplvppolppllpllpoopppolplllllpppolllllplllllpllolllllllllllllllpplllppllClllllllllllllCCClloplCllCCll{vlllllll??llllC?CC?ClllClllCllCllCC>?>>CCCCCll?CC>>>CClCCCCllCCCC>A>?CC?CC>>CC?C>>==?>?CC>CC>>A>>>>CC>==>C>=>>>>>>@Y  =q755775557757577555575575757757777787855557755775757765557855757757857757555755775775575775557575765775577567558757777755755577557575585787555575755567555775575555675877767755575557555777577775755777577755585575777785555775755576557755557765577555777567576756575776757577555557778775575857555755557575757555775555555557575555578866777785775757575577777575577855775755555578758577757558557755555557757557557775757555758757557857755778755775757757575555575757775775775777775577557877558775587875587557565575pCCllllllllllllllllllllllllllClCllolCllllllllllllllllllplllllllllllllllplpplllolllolllllllllolploollolllooppooloppllolvppllolloppoolopoppopllllvpllopllpoovplllpvollplolppplpplollpploplpploplplplplolopopllollopppllooppploplollpppplllvllolopollplllplpplllplllllplplllllplllllllllolllllllllllllllllllllllllllCllllllllolllllllCoyllllllllCCllC?C?lCClllCCClC>CCClClC?C>?llCC?>?>Cl>CCCC>C??CCCCC>>C??>?>>CC>>>CC?>>C>>>>>>C>>>=>>>>>C>>>=>C>=>=>==@u;Y =s7557567575775555757557787655577555778757875577575775577557557655557776555557775776575575578558577557555777755577757775557555758657576557755755758775567555775557777557575577555555775757555557786588758577575565577575877575575875755755557775875757775577557575556757757575555755875755555575856755555577578757577878557557557777555585555685575755575577775777875676775675575557555575557575577557558775855557555677557555757555777757555557575777755877765755757775577575777585757577755575555587755577757557577755587557557577577Տp??CCllllllllClCCC>llpollllllCCllCllllllllCCllllppllllllCloollllplClllplllollloplpplllllllllllllllllpolppoppppllllllllvvpllllpppplllppppplollllppoplllppoopllllv|olllloplpppppplllooppoopplllopopppllplpollllllpppolppplopolllppppplllllpllllpplllpllllopllppplllppllolllpppollloplpppplpvplllCllC?llllllollpollll?lllllllllllllCllCCCllllllClllC??CCCllC>?CCCC>?ClllCCCC?Cl?CC>>?C?>?ClC>>>CC>>C>>>>CCC>>>>>>=>?C?>>>CC>>>>=>>>>>>=>>>>>CC>AC>=>===>>> ;Z  !  $q5557555585757757777855577857577588577775755575775755785776577875577755577857675575557775575777775558585755787755877557887577555765555755775776555555755555558555577657875777776555577765578575657555775755575755555777787575777577575757577555557577575757757555767875575557775577577555757577555575577555568757558775775755577555755857556775755757577587577575758575557755587577575757765555578756577557577577575587757777775576577755757778755557577558758787575555755555787768757555555785755575557775557757778555577575qCClCllllllClllllCClllollllllllllllllllllllllllllolllllllplllllllllllllllpoCllloolplllllllpllllollloppolllooppllllolllvllloppoollplpplovplpllpplplpllllplplplolppplpplpollvplplololoppolppllllllpvllopplppoppllppplploollopplolllppoolllolllloplllpllllllpllopllolllollllplllpllllollllllplllllolllllCllllolllllllClllllllClllllll{ulll?CllllClClCCCCllClC?ClC>C?CCClC?CCCCC?>ClC>Cl>>CCCC?>ClC>C??>?C??>?>>CCCCC>>>>>>CC>>>>>>>=>A>=>C>=>>>=>>=>>>>==>>A;Y  =q57577775775578565857575777675577775775575755557775775557575877677585777575575777577757555778575875577555775555757555787557577755775575575775575757577775557575755575777557555785757675757557555576575585855677585577757777585575755757555577757875755755577585755875556775565775575787555777555575576755557575787557877577565575785557577555858758557558557577775787755555757555755578557787555557775755885755575755555577855555575577557657577775575778777777775567756778577755577776577755777757555758575575558778ӎqClCCCllCllllllllllCCClllCCClllCClloll?ClllClllCllollllllolllllollllolllpplllllllppoolllplllppoppploplollllppolopoopppullllppplllppplllplollppllplplllolppllllllpolplpppllpolllpppvvpopppoppllllppllppppppooppolllpopplllpvolpllloppoloopplplvpllpvolplllplppllollllpllllolllllllplllCC?lllCllllolllllllClllllllllllClloll?llCCllu{ullll>CC>CllCC?lCCllllCClC??lC?llCC>CCCCCC?ClC?ClAllC>>>>ClCC?>>CCC?>>CCCCCClC>=>>>>CC>?CC>>>>>>==>CC>>==>>==>>===>>C={@Y   !=p75558557577587555557755555775875775575875577755555675757575757875557557755765787657565755555587568555755557757577655576755577557785555555555757775567875555777555555585575555555785575755557577557855775575585565575575755757587555775555585555775558757575756555756575557575577655575775777575855557557755555775555776776775757575557555775857555575555567555855785558775555555557555576755577575655555555765555565757758575558575557575755778557555575575786765577765558765575565576575577565757855587777ՏplClClCllCClllllCllllCClllClllCCllllllllllllll?llllllolllllllClollolllllllllloolllplplplllllolllppllololllllllolppolopulllolplploppolllolpooploooopooplllpplplllpololopollppppllooppllppllpvlllplllllpollollpppolooolllllpplllllloolllpollllopolloolololllllllpollllpolllllllllllllllllllllllpllllllllllllllllllCllllllllllC>llloollllCCllCCllClClCCC>llClC>ClClCCCCC>?Cl>CCCC?CCCCCCC?>>?>ClC??>CCCCC>>>CCC>>lC>>>>>>CA>>>>==>>>=>>>>>>>>>>>==>>==>=>>==!Y! =q755555555557555778557757555757855555555755555565575575557555587555555755875555575575876757755555655575855575575557575575575555875658655555557555555577556755858775755775755557557865558577755755587655875675765555875755857565576575555555855757657685588755875855555555555555555578555777557577765557555567555555575555555557585555575677556555867587555758555755756565555655775757875855655876575556555877555555578755855555555557757555555565558756767555855555755557655755765585577755555758875555755765555755556585585755555557667675855787778558555ՏslllllCClC??llC?CllllllCllllllClClllllllC?llolllllCllllClollllllppollllllllllpolClllpplplloppllllllppllllllllllllppoolwoooplllllplllplppopppooppppopplllllppppllpllollpollplpllolllolllolopplppoplpopollllllloploplllllllpllplopplllollllllplllllolllllplpplllooolplloopllllllllllllplpvpllCllplllCllllllllllllC?lllllllllCC?ClluClC?C>CllClllClllClCCCCCl>?lllCllC?C?Cl>>?CCC>CCCCCC>?>>>ClC>>>>CC>CCC>>>>>>>CA>CCCC>>>>>=>>>>>=>>CA>=>>=CCC>>>==ACC?===Z@Y   9s65565865585685875668585657675555575655575555557555755758555558575557555855655585575555577555758857678778757675656555555565775566557575757755587585576755575586555577555785575557555755565757555555555878555557585758755565565556557556555555856585555787855566557567555675557565555555558775875555555887555565575555858557755655565655557555557555575757585555578575556857575575587555765685776755556555556585576577575576575555557555555565577876765755555778557565757755875575755557555556555785767555555557575655855656557785755557558757575556555575555675555575557675555775576755ՏplCClCClllCCllCC?lllllCCCCllCllllllllllllCllllllllCllllllpllollllllClplCllollollllllpllllplpllllllllplpllllolloloooollvvollllpoolpoplllllolpopplollpvllollppoollllpollpollllpoopllllllolopllplllloloololllolllplllpllllllllppllvplllplllllplllplolllllplllvp?lplllolllpolllllllolllolllpollllplllllllllllllllllCCllllCCllllClllv{CCCllC?llllll?llCCllClC>llCCllCCClC>CCCCC?C?CC?ClCCClC???C>Cl>>?>??>>CCC=>C?>>C>>>>>>>>>CC>=>>>>>>>>>>>=>=>C>>>=>=>>>>=>>=;Y ! q55855765555585555585765557557558555777575555677555875676555585555755555855555585675577555557675575557555765555755765855655555555567775787558655585585555757855555765555555585577556557555556577555555565575856755558757755875757557558755775756758555555565555757555577557585576575555576755555557575755555675557555776587555755756555575555557555575558585757575557575758567555585885556755677578555557575855555576755855558555755755575555557575557555575555655556555555575555555556558556557775555587557575655585555565556758757555555655557555575555675555556575775557755755855575qll>?CClCClllCllCllllCClllClCClllllllllllllCllpolll?llllllpllppollll?lllllplllplllllllllllpllllllllllllplppopppllpollluvlollppppololllplplllloolllloploplpllopopppplloollplllpolllolpopoplolllllllllollppppppllllppoppoloppppllvvplpllllpppllllpllllloppllll?CllllpolllllClpoplllllllllllllllllllllllllllCClllllllollC?lCCClClvlClClCC?CllCC?CClCCll?llCClllC>CCllCCC>llllC?>>CCCClllCClCC>>?CCC>?CC>>>>?>C>>>>>>=>==>=>C>>>>>=?C>A>A>=>=====>>=>==========@Z ! =p57555585555555565787575575555577555557557655575575655587555585755755555685785785557575557575558555555555875576555775767575756555875555675555577555775565585576755676555755555767575855556755555775557555756557555565555585575557578556555556768556855857587755557575655555557555565785575555755755775575555568557576655655575555555555675575555555555555555557575555555676565555577765655555567757555558687585555556655567558555885557576855657555555555555557555575555555555558575757566555555675755555558555555755757587555565575567576565665558758557555555755556pllCCClCllClClllCCClll?ClllCllllCllllllllllllllllllllllplllllllllllllolllollllplllllllllllllllllllllpollolllllppollloovllplllpppollllololplllplllllooolplpolpolpllplplpololloplplpllpplplllpllplllplllopopollllllppllppllolplllvvlollllllpllllloolplllolllllllpplllllllolllolplllllClllllClllolClllllllllCClllllllllllClllllClulCCCClCClllCClClCCCll?CClC>llC>ClCCCCC>?llCl>>CC?C?CCCCCCC?>>>?C>>Cll>>=>???A>>>C=>>>>>>>>>>>>>>>>>>>>C>>=>>>=>>====>>=>====Z;Y !q555585565758755756555585855758755555556555565555565555558555565585586565577755567575555575656585575558656758658557558755575555585555675555556575785565765755855575557555556556765575655665855555555555556555857558655555885655575576755557655677585556588565876555685577655785555587585566766655555555578755585557576588655758556855557556585575555657575555555587558755557557555585555558755755557555655558765556587675556757555767558568565776855555557757655555765556656865555565658566557555555757765655555555578785755565585576556576755575885556557575755568558555855Տp?ClClllCCC??lollllolC?lolCllClllClCllCCClCllllllll?lllpolollClllllllllllplllllllollllllllpplllooploolllllllllllollllpulllllpllpllllplllllpppllppplllplllpppollloplppvolpplpppollllloplllClllopvppllllpolpplllppollllppppllllllllllllpollllllollplpllllllllppoolllllllpplClllolClllllllll???llllllllllCllllllCCCCCCllClllllllu{Clll>?CllClClCllllCCllC??CC>Cll>>C>?C??>CCCCCCCClC>?>>>>>>>>>>=>>>>>CCCC>>CCCC?>CC>>>>CC>=>>CACCC>==>==CC=========A>>C=>>=C?==;Y ! =s65578856558555555555577655765558688556555557576575557578557558558767566575755675755566556855555855555766755665856555757565666565685555575555865565556586555755576587565687585566555565555555556555557655555576586567555557555558555565655565855675555585655585865558765555558555576585676578565565555655556575586576758585658556555555865555757555655556555655555585585658555875558557565675655765587566556555565755755755575765575655577655678585556785656555855555557556758755657565765555756655765855557556555555758755555585656755857555767855855578555655655655575555ՎpCCCllllCClCClllCllllCllolClllllll?ClllllllCllCClllClllplolllll?lpollllllllpllllllolllllllvlllolllllolllollllllolllllovllllplllollllollllpppplllpppllllloolpolllpollvpllpolollolplllpolllllpllopollplllllllplllpolllllopollllllllllllllpllllloolvlllllClpplllllllllllpllollllplllllllolllllllllllCCllllllllllCCllllCClllllClolClllCCllCCllllCCllClCC?CC?ClCCC?CC?>C>CCCCC>CCl?C>>C>C?>>>C>>>>>C>>CA>C?=>CC??>>>>>>>>CC>=>>>>>C>>>>>==A>>>=>==>>==>=>>=>=>>==C!Y!   7}6578555558555576655675565555785555767566655567655555586555556585656665655555565756556555555557858575556558576555565757555758855778567555556855855585557576755585555567555675877558855575567555558555565765575655555555575555858578857675556576556555585558576758855675555575555565555768755755556675865555755765755556556778555785585555755786575655855755555665555555667685555567565875555855555556555556876755855755855677557557575665565555765576565655655757767656556885658555567558768555565557576555775755565585575586556666655765758556765555575668756575567567557575675765ՎpjClllC>>CClCClCCClCll?ClllllllACllCllllllClpvl?lllllllllllllllClllColplllllllCllloplpopvppllplllpllloplollllloollppplvollllllllopllllllllllllllllpllolpllopppooplllolloplppopllllploppppppolllllovpolllpolllllppvpolllpllllllllplpoollllpllllllplllllClvllllllopllllllCllllllllllllllloollllllllClllllllCCllllllllCllllllllulCClllllCC?CClC>>CCC>>lC>>>>C>>>>CCC>?ClC?>?>>>?>>>>CCClCCCCl>ClClCCC?C?>=>CC>>>>>==>>>C>=>?>>>>=>>>C>=>>==>C>>AAA===>====>===>Au;Y!   =q855656758676675577565655555555867588565755785585555585555555657575875556575858755557566575558555585555555555557765755585755655865555657857655558557657655655675555855565557557555555675855578585555575566557778555555555556555565568566555655658756556755555775556766757655576866877555555575655658555587658555555566856555557765555675556658756565555585565555655767677786657655565655565758555555855755885555655655565656655555655855876557558575555655555655557675555567555585877555555588555768585855585555557555555565755765757656675657576755657557655658757556585qClCClCCC??llCCCCCAlllCCll?lllllCClClllllllllllClllolllCC?lllllll?llolllCllllllllllollloplllllllollllllllllllplllllollvllllllllllolplClolplllolllopllllppoploollvl?lpllpllopllplllppllppllpllllllpooollllpllllollppplllpollllllllllpplllllplllllllllllClpllllloploCllllllllllllllllllllllllllllll?lloClllCllllllllllllllllCy{lllC>Cll>lCC?ClCCCCl?>Cl?>CC??C?>C?CC?C>CC>CC>>>>>C>>ClCCCC>>CCClCACC>>AC?=>C>>>>>>>>>>>CC==CC>>>=>>>>>>====>A>>>>>==>==>===>=>=>=;Z    !q57675576556556558568555657556555565556556557575675565556756556755555657576585555655575775557557555558575585765556556655766658556765556575558756555556756755757578576556755556758557685765575566855585656856566555566555555655776676685757565785555775585557555855785865555765855555856555655556756555858867555555575857557585855676555755855875875556765555575565675575555567555655655755676565656756756555656576755565875575558555765576765555566556556765656755575565575555575575556766555575855858555568555656555687557665575555565558576765556768765555655557585855755865568875ӏqCCC>>llolClllllClllllCCCC??lllClC?lllCllllllCCllllolllClCllllollllllClClllllloovlllllllllllplllllllllplllpoplllllllllulllpploplppvvpoloopolllplppollllollllllovvlllplplllllllppllloollollllplpoppllllllllllllllllllllloollllllpplllollllllllllooloolllovpollCllllClollplllol>llClllllllCllllCCClllolllllllllolCCllC?llCCClolCCC>?lllClllCCCClCC>>lC>ClllllClllCCClCl>llC?CCCCC>>>?>>>>?>=>>C>>>>>>>>>=>>>>>>>>>>>>>>>==CC>>=>>>===CC>>==>A>>===>>A>=>>C>=====A@Y !=q5655855655555555576755857555585565855555655577555576555565875555765575555555885556555667856555585555557556555587675555775766565565757885557557655657657565657555555555875558758855655858567585555558655555565585585575565775555575785755855658875757555556755556657555558555855755765557565765788>875656567575556556556757765657755655556555555585767565556555555855565857755855755757656775655555577555755555585555555655555557858555576555557675655555755755678675865765688776885575667785556555885577655768576575558558555567666855777856585555686855555pCCC?CCllllllllC?CllllllCC?Cll?CllCCllCCllllCClllClllll?CllollllClollCClllllllllllllClllllllllllllllllppllllplllCCllllulllppollploolovpllplllllllplllllpllllClvollllplplllllolollllllloplllllpllppollllllllpllllllllllloollpolloopllllllllllllllolplllloplpolllllllllllolCllllCl?ClllClClCCllll?loolllllClllllllCllC?lllCCtlCCClCCClCCClllCC?CC?CCClCCCCllClC>Cl?CClCCCCC??CClC>>C??C>>??>>>>>>>>C>>>>>>=>>>>>>A>A==>>>>>C>=>>>>>>=>>>===>>>=>====>>=>=>A==>===z9Z !    =q558586555556567665565575755555556765655675555655575755555558657587575556585588566675756677555685855868655755555555575567585555585875555855557585857558565586875657555567855576755565755555876775555576567555688655567655555755665665755765765555555557555555575655575555657555555585655565877855558>ikCj6867755756555567557656585675555578575656555685855585656775555865665585565655655555576556765555557767555586565678655685555555655788555556556875755555555555767557655556585685755678566755855557658555657558557556755555556557558755575756555878555757675576555555555555՟ql?>?llllAC??ClCClCCCClCCClllllllCClllllCCllllllllllCllCll?ollCCplllllllloppopplllllllllllllllllllolllllllllllplllplllullllllllllllllplllppolpllllplllllppolllplllllolplllllplpplllllloollppollloplllollpopvpllllpoolllplllppllllllllllllllppppollll?lllClollClllllCllolC?llllllollollllllllllllllll>CCCllCCCClllClC?lllC{{??lllllll>CllCC>?lCl>?CClllCC>>C??>=CCClCCC>>>>>>>>CC?>C?>CC?CCC>C>A?>>>>>=>CC>>CC>>>>>>=>=>CC>=>>C>==>====>=>>====>CC>======>===A==A= ;Y! }565575556566755556776758657555655555755575678675855755678885885555657686555575885555565576855657555855855556556676588585858555568885555565765857557556555675588555575585576558555765875555557575555576876565655557755655576755878655557576657557565565755575555865555555555678565585578jln>5655765676558755556765555567558777675785575675555565765586758556556787586755558575555755855855555575575555565557557556556657855787555556565855656556655665765556765755555755558557876555856755875657755585557576875887875855555575575555585555558575565575857866555555756ՏplC?>CCllC>CCClClCC?Clll?CllllllCClllllCC?lllCllllllCllll?lol?llllCClpollooopollllllll>lllllllllClllllllll?lllollllpllvllllllllolllllllpllpllpolllllllloooplCllllllllllllpllpllopllllollllplplloopplllplolpppllolllplllplllvllllClllllllllllpoolllllllClCllllllolllCllool?lllllllllllllll?lllllllllCCCCllCClCCCllClClCllulCClllCllCClllC>?CClC?>lCllCCC??C?C?=?lClC??>>>?>>>>>C?>CC>>CC>CC>>C>>>>>>>C>>>C?CC=>C>>>>>=>CC>>=>>>>=>>>>==>>>====>>>===========>==>=];Z ! ! 9q5555557655558757765555855587555555575555555575557655567556586685655678575855855555657555565678565555585656655657558555575755555678565756675576555555555555755555565656875676755556685556757675665555856555658755658567585587587587565585555555758767555567565555565555655555565876765558757788>{Zj685675558558857875658577857555555655585765575555555578676755587557576855876555587675685658858557675556757555557687556855756555565755766875676555767555567655767575655556555587557555657555555656767558868555666855856556757555555555558555555555676576557so?olCllCC?CC>CllCC???CCCClol?>ClllllCCClCClllllCllCllllllllplllllClllolClllllllCClllllCllpllClllllllolllppllllllllplllvloollollollllllCopllllovlllpllpllllllloollloplllllllpvvpllpllpplCllllllllllllplllllllllllllllllllllllllllollllllllllllllllllppllCllllopolllllllll?Cloppl?lClolllol?CllllllCCllllllCCllllClllllllCvllClC>C>>>?llCC?llllCClCCClC?CCllCll>CCClC>C?llC>CCC?>>>Cl?>?CCA>>lCClC>>ClCC>>=>>>==>C>>CC>>>>==>==>==>>>>CA>>==>=====>A=>>=======>==== @Y!q855555555555585558585555555555785558556565555767665565555565567655576656657557686555856766855657656567558557685558868876585555585575855855555555858556557558578656555555855655765565585585557785558557655765557558755855655675755655558888765767655657558657665565688857586558585855586865576765557555685675656558555656jZrp65555555556557566555576555565555585566768576765867576556555555557555767587876555555765758656555565567675587656555585565855555555675765856556755865655555555555555565757856558558555585755555565556558588755656767557657555558575587855767555577556575557675555855676566688555565555855655756558655spCllClCCCClC>?ClCCCC?ClCllllCCCCClllll?lllCCllC>ClCllllClllllllllClllllllllCClllllllllllpllCllllCloollllppllllllllllloulpplllllllppllllloll?lloplllllollollllollplllllllllllvpollloopplllpllllllllllpllllllllllllllllpolllllllllllolllllllllllllCloollllllllpollll?ClClllllllll?lllllllllClllllllCCCClllll?llllllC?CllCv{llllC?>?lC>?llCCCllCCCllll?CC??>ll>>CCCCCl?>CCCCCCCCC>=>>>>CC>>>>>CC>CCC>>CCC?>>==>>>=>>?>ACC>==>>=>==C>=>>=>>==>==>>===>>==A==>A=>======C@Y! ! !q656885556567557566587765555855556558858665555565686755865565558856555555558865585557555556555555556566755588586555875856875565556566555565565586555555565568676556575665555585575865667865658555555855867665856855755657655655555555555587656686655555766656557565576665875685855758556758555555555576876858555856858jCn855565765555667586675866855555688565785555858755575575565755565586758565755555655575565655555567558656855667655658685556565686557555555565555758656565565555755587555556586555557855655675655566558585665555768867566756755555855865556566586588555665667555568668656565656685658765585565556565658555655658865767585Տp??>CCCllll>?ClCllllC?lllCllollllCCClCCCllllllC?llllllllllllCllll?llllCCClllllllolllll>llllpplplllplllllllllllllllllllullollllllllllloolllllllllolllllppplllllllpllllplllllllllllllllllllllllppplllplllllllllllllllllollllllplopolllllllplllllll?lllClClvlllllClllllllllllllllllllllC?lllllolClllllC?lllCClllCC?CCCClCllCllCClCCCC>llC>ClC>>>>Cl>lCC>?C?Cll>CCCCClC>>CC?C??>CCCCCCCCC>>?>>>=>>>=>CC>>>>>=>C>>>>>=>>>>C>=>>>>>=>CC===C>=>==>>==>===>====>====>=====x;Z =q76687755556575555556875765555758566565555656557655658567675655565585575855655685686758675555557655565556755568868685575675555555558676578556685566865555555556556555585567565585685555876568675765855555765865655558586555655555665575566565655575558655858555565786565867656755657556858555656555665556555556558566565585655556858888655555575565655555756786555856656558655556658556886588856756556578585555575565555667855588588855565765565655556856686685555586688687665568558868575665867676885578656755555685675768656555666567865585555555667565555585675555788585558578865865765585567876877865676558665558566565565565Տ}?>CCCClllC?CC?ClClCCCllCCClolCCll?CllClCllClll?lplllllllCllClllllCllllCClllllClplllllll?CoplpollllllllllllllllllllllouCllllllllllllolplllllolllllllllllllllpllopllllovllllllllllllpllllllllllppllollllllllllllllllllplllpopolpllllllllooplllllllClClCClvoll??lllllllllllllClllClvlCj>CllllllCllllllCllCClll?ClCClClClxuCCCCCCllCCC?lll>ClC>??>Cl?ClCCCCClCCC?>ClC>CC??C?CC>?CCC>CCCC>>>>>>>>=>C=>CC>=>>>=>>>>>>=>=>>=>>=>C>>>==>>A>=>C======>=>==C>==$=>=!$=>=$===A!Y!  ! =q558865656575556565555555557658576555758685555756556556658556555557885655665675758567665585556755855686555555556565685586665555588856786675565655858565587867665858655555585886568775556557555568558556688886556866758655556658578857788556665655868555567655766875685868588556755685567555588566656866658755666866755868867667575765865658566788665676585566585556858856665565556555755788555676755558568656568567566875555667586885555656555755856887667676565565566768555585557558858558665667575867556556565565655667655555655676855755556877558658555567675755566555565565665655655555565655555665556555868585575855665556555565756ՠ}??lCCC?A>?lll??CllllllC?C?ClC?CooC?lllClCClllClpllClAAllCClllClCClllllllllll??lllClolllllollllollllllplCllllpllllllllullllplllolllpllllllplllollpllvlllllvlllllplllllpolllCllllllpllllllllplCllllllllllppllllllllllllolllllllllllllplCllCllllollllloolllllCClllCCllllllllCClolllollC?lllCllC??lCllCllll?ll??lllllllllllCCCC?CllllC>CCCCCllllClC?>?C?CC>>ClC>?CC>>>?C??>>>>>>>>?>>>>CC?CC>>>>>C>=>?>>>C>>>>C>>>>>>C>===>CA=>=?>======>=>>>>======>=====A>==>====>==C@Y    =s7556557665767576765678555565656655785857556576566855568656557885758855675575555567565555658556756557685855585786568655558855567867677855576558665568566565565555855685565658688565556557658555785675655557655685685555885586865555565568555566555566755557675866755565575557585685567767876755555676856585557558858667555865676855585566765565558655556586585557586657685658588656785655566575588865555855555766555555565556576766565675567655568678555585657665565585668555555588655588768678876855556776568578766575566555565585855555588658556585558555675655556575655765556755655556567655888855576Տ}??lC?CC??CClC?ClCCllllCll>?llCllll?llCClllCllllll?lll>ll?CCCllCCClClllllllC?lClllllllllllplCllolll?llpl?llloollolCCCluolllllloplllll??lllllllplopllpplCloplllllllllllplllClllllllolllllpplllClllllllllllllCllollplllpllllCll?lClplllllllCllllllClllplllllCCllplCCCllloll>llllllllC?lClllCCll??CCClllllllCCC?lolCClC?ulC?>?CCCClllCC?CllClCCll>?CC?CCCCACCC>?CC>>>CCC>?C>>>>>??>>>>>C?>>>>>>>>C>=>>C>>>C==>>>>=>>>>>>=>?>>>>=>C>==>>=====>>====>=======>>>====>==A==@Z !     $}575558586556556555556555566586767557655855658557567565865565555855876557556656655555566585555567675665665767556765555585555655656565686555855586858565758655585565655665555565856888575555765555555676555758665766765686858665585565655556888566685557665555575655586676865565556575765855875677555558655885555565588555555556786657655588656555555565658556555655656555556585676755556756565757657566557868558567566655756875855856756555555856776676775655655555558656855566555586557555857655766758667558556555555555556885656656765675566768565655655555566768766555655655885685658665558555556556556568555586565555557Տq?>lllC?CCCCC??llC>?CC?Cll>ClC??>?>CllCCllC?CClCllllCllllAlllolCllllCllllCllClllllllllllllplllClCllollllllllllllopllllvplClllllolllClllplolllllllCllllllClolClplooloplolllllplllllvololloolllllplolllll?llllolllllollllllCClpollClpllCClplClllllllllllllllllllolCll?llllllllllCClllClClllCllllllllCll>>ClllCCllCClCCl{CCC?ClllCCCC?>>>?llCC>?CCC>CC>>?>>>?C??Cl>>ClCCC>>??>C?>CCCC?CCC>>CCC>CCCC>>>>==>>>>CC>>>>===>A>>>>==>>=>=>==>=>>>==>>>>==>>==>>======>==A=$===C;Y!    9q5568556666755856556867555555558655858856586866585788555655586686857876557576755555556658555556655855658555855576555555656565658565655555565656558688567656555766766766556665657555656585856555858555785857657555555755656555655677655555866568555558555576675658576585655555555856656567655655565555556575578656558655655585565868565755856675555555565655656555868886555865577656858885855557555555685855855558858655658855555566757687676555555655567555765755555685658565555555565656856565655568556655578655656855576588555665656565555555555685677556555655865566586657585658655567855665565655565767568555556565558558865p?ClCCCClCCC>>CCClC??CCllCCCC???CC??ll?llClClllCCllllCClllCClllllllllllol?CllCllllolllplllollllC?CllClllllllCCllllplllvollCllllplll?lllppllllllCl?llllllllllllopvololpllllllpllllppllpllllllollolloplllCCllplllppllllpoll?lloolllllllllllllCllllllllCCCllllpllllClCCllClllllCC??CClCClCCCCCllllllCllCCCCClC?CllC?ClCul?CCClllCClC>>?>>lllC>>ClC>>>CC>?>C?>>lCC?>ClC>CC?=>CC>>CCC>ClC>>>Cl>>>C?>>C>==>=>>>>?>=>C>>>=>>>=>>=>A>>===>=>>=====>=>>=>====A======>========Cx;Y  ! q68565578858565765586575886686885655585656857556855857585855576557586566578556555555655568856765567656555885687656568555655566758765658565867665658865758565555585565685555885555555655658566755585655655855555656655555655666565565655565676755568555655658865856565555555685655856558856856768655555558655685685665556555765557556556556565865655855555555556675665555755655556678556786656668555578755565557658585556587685555655556586768575567675655665858556568566575556568565857585566665655667856565685855666755855555555658855755567585658655565755865556656765856855656565556655767555555566858675675585555558565565656568675656865565585q??>C??llCCCCllC>>CllCC??CllCCCllC?ClCC?CClllC>?Clll>ClCClllCllllAllCCCll??lollllllCClolCllllllllllllllllllCCloolllllluollllllllllllollplllllolllllllllpvlCllllllllllllllllllolllllllllllpllllpplllllllllpollllpllllllllllllllllllplllllllllllllllllllloplllCCllollllll>lllllllllllllllllllllClllCCCCllllCllllllllluulC?CCllCCClC?CCCllCC>C?>CC?CCCClCCCC>=Cl?>?>>CC>>??=?C>>CC>>CC>>>>=>C>>>C>>>>>>>CCA>>>>>==>=>>>=>>>===>=>=>>>>====>==>===>>=======>==$======>=$=A=@Z !=q5865655776685855755558558858565567657565655575586556655656555656855576765865566565655555555555585558755655555585555658585755856586555658556655655655586767568555865565558555685555788587665555665556655867857668766586585555568655565555557686855565858565555665585676767555587655655675655885656855657557558858585658656666585556568555555657558857675585556555565767555686758555568576686856655556665557676756565755676856765685867556786586556766586558555565665788555556555855758555655556755865586558587655565565566866876587555588655568567665688685766855655678585555656856567866555765577678885855676557568565585555755577555588555766p?>C?>>llC??CllC>>Clll??CCllClClCCC??Cl?lCCCl?C?ClC?C??l?ll?lllCC?lllCCCCClClClllllClllCCll>llllllCAllCCllllClllC?lllCulppllllllllopollllllllllllllllllovollCllll?llllpol?llllplCClpll>llllClloolllllClllpplllllllCCCllllllllClllpollllllClllopllllCClvpllolCllpllolllllClllCloolClClllllllllCCllllCCClllCCllCClCllCCCCCClCCll>>ll>CllC??CC>?>CCCCCl?>Cl>>?l>C?>>>C?>>>>CC>CCl>?C?=>?==>>>>?>>>>>>>C>C?>=>>>>>==>>>>>>>==>>>===>>>=>==>>=A===>=>======>=========>>A===Z!Z   ! ! !!!9q86565565565766555555555565557565565767668655565565555565885866556757565866555657558556666565655856855656565558555558555555558685868655585555556555665558667675668865758658565676557555655558776755575586585555558558885655556557655655768765565555655566585676788685655675858585556576758855565555568855555655675555855555555765565766587658686758655655555668575565655585887565865586655555555685565668565585585555675585558587555575555768585658676555556585575755555585855556585685585555555565556655555568685566556555666858755675655856765555555655655556857855587575855767556655565566585687665555555555556656655885755555656558565755655656558585565756855ՏqCCCC?>?C?>?CCllllCCC>??CllCClCCCCllCCCCllll?ClllllClllllCC?ClllllCCllllloolllClollCClCl?lllllllllllplllllllllpollllllullolllllllllolllllollllllllClllllllllCllllpllllllCllllllllClllllllplllllllllllllloolllllllllllllllllllllllllCClolllllllllClllllplCCllllllClllC?llCClllCllCCCClClllCClCClllCCCClClllClCCC?CCu{C?CllCCCClC>Cll>>lC>????CC?llCCCl>=?CC=?CCC?>CC>>?>CC>>>C>>?CC>=ClCC>>>C?C>>>>>A===>=>>==?>=>A>>?>>=>>====>>========>>>===>==>========>>==========$=;Y !q8585555667557656555655585665567686585555655685667855885765855686555565856765568867676685565556858565558658656576666555656576568865585586655658855556856586>5555656556865566556568558555556886755855566868755586558566555555686585655566565565655865685558558685755556556565666585668655555666558556555555655875686658856656565667655685555668567555558585886586565555585675658755555655855658678556586656858685676566556876666556556566877855557657685666585756765666566687868655656568865565655656685555685585667685585655566658755565667556865655556556865855665865888556576656866665866856555668656656565665556658556855556658766ՏpllC>>>?C????lClll?>CCC?CllCCCC>ClCCllCClllllCCClllCClllll??lCllloC>loolloplllCllllCCClllCllllolllllvpllClolllvpollllouClpolollllllllllllllCCllllCCloollClClllplppolClC?llllllll?lllllllpllllllllllllllllllllll?>llllpollllllolllllllpllllllClllClpllllC??Clllll?Cll?ClClClllC?lCCCCllCClC?ClCClClC?llCClllCCCCCClu??ClllCClC?>?ll>>CC?>CC>C?>ll??ClC>>CC>>C>?CCC>>>>ClC>>>>>>CCC==>CC>>>>>C>>>>=CC>=>=>==>====?>>>C>=>>=====>>========>====A=A>===>====>=>==C>==$=$!$=C ;Z    ! p568676557676685568656655768657655555556855556658655856655856676656555876556568568566866658567567576555676668667865556555555756656656886775556565575656568p66556558685566558555558556658886556655755756555765586556556656856555686855568655685868556656655568566665555655588668556576556655556566867668566556886888667566568675566656566865568865576588658656655858685867656556567685886568558656655577655655586565688685857676556655865686655686655865658656855578865555868866555675688656666866868856556865768586565855855586556856856756556555855856556786585685556676586585558655867855555586558686868885555555567566758567565566565555667885o?C>>C?ClCCC?>?CC?>CllllCCCCCl?lllCCCC?CCCCC?ClClCCClCCCCllol>lAlol>?llCCllClClllCllClllllll>lllCl>lolllllllCllllllloouClllllllllllllClllllllppllllollplllllCllllllllllpllllpllllllllllllllllClllllplllClllolllllllllllllllClllllCClllllllolClll?lllllCllllCCCllCClllClllllClllllllClll?CllllClllClCCCllClCCClClouCCClCCCC??C>>lCCCCCCCCC>?>?ll?>?>>>CCCCCCCC>?C>>=?lC=>CC>=?>>>>>CC>C>=>=>>>C>=>C?>>>>>>C>>A>=>=>>==>>==?>C>======>=>===>A=======>>===============$===@Z!q576558656756856575876656568586565885875555656568558665766558565555555865555768765575656565566586658556658585885555565657866865856856555668656656565655565j68665855865856666558685568666856658655665686856856655685685656858657565765557856565588656888588578855865565656766557885655865858865665756665656678685655755768555877866768876665855685768556665658656656556555676566558565557666565856565787685688556755867786658766688556578556886556585668656588876555865555655755767665576556556785656865555888676555555675866556555888565566565866565675556865665555566765587675766866586655585866566666558566sl>>>?CCCl?>???>>>>>?CCllC?llCCllCC?C?>?C>>CC??lCCl?ll????lllC?llCCl?>C?llCC?>?CCCClll??llllC>CC??>llllllllllCCCCClllllullC?lllllC?CCCollllllllollllpllvlllllllllCCllllppvoopppllllllCllllllplCCClollollCllollllpplllllllllllClllllllllllllllllllClollCClllC??llllCllClopollllllllllllC???ClllClllC?l?CllC>CCClloul>CCCllC>??>>CC>?C?CCC>>C?Cll???>>ClCC>ClC?>>?>>CClC>>>C?=>>>C=>CCC>>>>==>>>>==>CC>>>?CA>>>====>===>>>=>C>==>==>>>?=>==>===$=>>====$==$=$=====$======Z@Z!!     $s56765658658855676676576558765586656656565656688856556865768586556855856865668566665655655865856556786586658556665658656655655568785566558655656886668855555655656675pj57655656656555666866768676656558587567556655558655568555655676558767658555568656586556588668658885678876578655856656765566855678655678868555766858558666558566655685565655655666565556875588656556756568566655576865865688567586755686555666577658865668558656656676865555886867675867655885568685686556585566856656565658676558576676565658676565865858568676685567855865655866556865667576555765556586756556566785558555655656566585656685658556565556655558585866558575ӎp??C?CCCCCCCC?>?ClCC?CCCCClC>?ll??CCCCllCCCCC?llllCCC?lllClllCCllCl?ClCooll?ClllllllllClllllllllllllllllCClllllllllCoovol?lllllolllllpllllllllllllllllllllllplllllllllllllllCllllloollloCClllllllllllll?lllllllllllllllllCClllllllClllllClllllllCllCllllllClllCl>llllClllCClCCllllllC?llCClol>?ll>CCllClllCCCl{x?CClC??>CCCCCCCCClCll>?lC>>CCCCCC?C>?>>?CC?C>>>CC>C?>?>>>>C>CC>A>>>>>>?>A>>A>>>=>C>=A>>>>>>==>>>>=>>>=>>>==>>=====C=========$==>===============!=>=$=C;Y =q65686665555685565685686655765666758765685556685886585556567586655655588856565656586657667556556866755556576565886786686658665686565566588558568676656558655555568658665656766555686857565685566568656756855568766685768566666556866765686765866556656566668865768656865565686857667666785668585658568556655667665556585655655655655665567686558585658555686886555686565656665575568555686755665787556755658568685556676658555668556865566575556655565655585586758666567565865658665565665885565566565676665586576868655666866576858665655856566556865558566756857688686556555555565666567656sp?CCC>>>>CCllCC??lllC>CllllllCCC>lCCC?llllCCClC?CC?l?ClllCllC?ClC?CCClClplCClpplClC>CllllCllpollllllClClC>?CC?lllCllpouolClllCllpplClolClllpollllolllllCllClollCCpollllC?CllCClplClpllplC?llllllllCCClllCCCllllCCllllClllllllCClllCllC?lllC>ClllllC?ClCClllllCC>?llllCCC?CC>??ClCllCCClllCllC>>>>?llCClllllCClCCl??>?>CllllCCllClCCllCC>?lCCC>?C>>?>?lCCCCCCCC>CCC>>>>>CC>CC?>=>?ClCCCCCCAC>=>=>>=>=>>====CC>=>=>>>=A>>========>==========$=A>==>===!====$>=$====9=;Y       7p5576758765765686876765556558555765565666586765565585856865667556785586765586655585655675755566555678665565567556678568555556565766585656685558666555556556685686685558855665655565856656567656556555566756558585658555665685568665558655565555756557655866555556857558655656856878575876765558575658566856855555556565556685587656865865565555766676585685575556585565658868686558557657855856568565568567676855555676566556566557566856587556765856565667566555565655586588586568568585855665668686886555558555575655685865865586867556565666668665755675575865655656586656785656757688688656556558558555656568568675556585ՏqC?ClCCCCCCCCClC>ClClC??CC>>CCCCC?ClllCCll??llC?llllC?Cll?CCllClllllClCllClllClC?lllllllll>lllllCllllllCllllllllllCClCullClllllllllClllllCllllllllllllllll?lolllClllll?lllollllllllllllolllllllllllllClllllClllClllllllCCClllllCllllllClllllllClllllll>lllll?CllllCCllllllCllllllCC?lolCC?ClClClllCCClCClCCC>>ClC?CCC?CCCCCCC>>C?CC>>C?CC>C>>CC?>>??CC>?>>>>>>C>>>?C==CC>>>?>=>>>>>>>=>>>>C>>=>>A=>>>=>=>CA==>=====>A=A=>=====>==>====>==========================!C ;Y  =q8565555586686565586576568676555676565786658666558666688566558566555565588556556566556586665586557686565556667585576857657656558556586656865556767655785768856865665655565655556657665565655578658655655565686558556855655555558556555788586865586586556865856568656556767686685555565676556665755555565868565655656558565555656857656565656655566588558866555686588587558656665565558585865585665555668556665856566585576568565565556655666555556866656658586655686665556875585565567668655568565656556555556868556856856588685688656856565555656865668556865555576655856555655576765866556688685557685757668865666565655555866565656766658558685556568565565866556585555558586556656586ՏpCCCllClCC>CCCClCClCClC>>>>>>>CClClllClCCC?ClllllllllCCCC?CllllllCllC?llClll>C?>>ClClllll?CCCCllllollllllCllClollllC??ulClppoolCCCl>?lllC??llCClllllllCllCCllllllCllllllllolll?ClllCCClllCllllCllllClCClllC?ClCClolollllC??lllll?ClllClll?lllCCClCCCCC?llloC>loollllClClCCClllCCClClllCCCCC?lCllpol?CCCCC>?>>>Cl?>CCllACCC?>>>CClC>>C>>>>>?>lC>>>>>>>CC>>=>C>=>=>>>?=>?C?>>>>>>=>=>>==>CC?>==>CCC===>==>C>=>===>>==>>>===>>==AA>=C>=>=====$=====>>===$==$======!@!Y ! !q5565685556785656868666655588858555675665868866655555585565575655685865565558886865656568685686676558655755856665675586867856566555688685566555855655855667556856888565565865556588855586555856555585858565856855556566556566858567585576567655556555885566856555767755558556666756586768555666556555655676676658866566656565555566557555868676568558566555767585556656656567655555576868585558586755867666556656575555558855555555686567565656686567885686666586558585558555565568866686675666856785565566666865556556655585755565675567657555556665686556865556655557656755555567555855656657566676555555758665856556555875555556676655865655866588555556ՏqCC?>>>CC??CCCC??CCC???CCCCC?C?CCCCC>AllCCllCCClClC>ClClCCllCllCl?CllCClCCl>?lllllol?CllllolllClAlllAlllCllllClllClCllull?lllllllllllllllllllllllCClllllllllllllllllllllllolllCClllllllllllllll?lllClllllllllClllllollCllClllllCllllllClllllllllllClClll>Col??llClClClCCCClllCl?llCCCCllCCCCClCllll?CC?lCC{{ul?CC??CCClA>>CCCC>>CClC>>?CCCC>>>>CC??>C>>l>?>=?CC=>?C>>CC>>>>>=>=C>>C>>=>>=>C>>>=>>>>>>=>=>=>>>===A>=>=====>=>======>>====>===============!====$!=A=$C;Y!!!s6656565567856568555555585556585565556886568665655556565685658576865556685656565657566766868866886855566657576688655665667555558865656558686585768655656856555658856655658555555886656565866666885655558656555685666658756555556868855855565656558768568565656656555557685655556566656656565658676868656665587665565865565555555558856586685556665656865565556866576558685556656565868566686565585667866656557655656665555655856665688866865656556585555586876558585665555676856665565686686565655686565568686855565686655658655665678586855586565556666556565565556557666558676856685565655665856565865655556686656558665565665565565686686556566655858666556665556668665658676555565765688556688solC>>>>>?CC?C?C>>>>CC>Cll??CCllC>>?CCCC?>?llCCC>>???>CCCCClCClCC??lllllC?C?>>lllollC???ClllC?C?llClC>>>?>lllCCllllC?llvll?ClllllllCllolllollllClCClpolllllllllllllll?>?AlovlopolopolppplllolllCClplloollCllloolllllllCCCCCllplllCllllC?CllCCClllClCClllll?lll?ll>C?lll?CCClC?llCCll????lllCClCll>>CCCCl??>tC?luCCCCClllC>>>CCC??>CCCl>>>>lllC>>>CCC>>>=Cl>=>>>>>>CClC>>>>==>>>C==>>>>==>>====>>=====>AC>=>=======>==>>==========$==>>=======>>=====>=====$=====$====Z;Z  ! !!!!=p56585656565565655685555668565656556565865556565665675667565555565566676886568655566555665567555556875658556565656566666555555658666856555656568565666686656656655865688555665555665655686667666565558566566858658667656566866665675656558688566656565665855555888585565856555565558676685656685656868665568558555868686566568685565586558585668688656666555568555686556656886565565556585656556585555565856555565566856665866566655656866586556576556755655566555585655655565586556566556555565558566565665656865686555558858656856555656656665658885656667586856656655666656565658568555686556666765586866665566765556688656556555656566666556758655676566867686656888o?CCCCC>>?CCCCCC>>?ClC>CCC?CCClC>>llCl>?C?CClCCCllC?CClCCCC>CllCl?ClCll?ClClClCloCClClClClllllCCllClllllCllllllCllCllluCCClllllClllllll?CplCCllllllllllC?lllClvlClllClllllllllllllCClllllClllllllllllllllClllllllllClll?lllllllCClllllllllClllolCl?llCClCllClColClClClClC?C?llCCCCCCCCCCClllC?CCCCClllC??uoCCCC{CCCCCC>A>CCCCC>CCC??>?>>C>CCCC>>C?CCCCA=>l?=>lC=>CC>>>>>>>>CA>>>>CC=>>>>>==>=AC>>>>>=>>>=>==?>==>>=>=>===>>>===========$=>=>============$===>===!====;Z!  !q6756856668658556685655568656565565558656556666656565565556686665857685568556565565585567686665686586665586655666556656568686566586666558566565565655556865866586765555886558855868666688655568665555658655665556656588676555556585665566655655665555666685676765666658658668655656655666565556655656565655665666555656557655655686666556655657656885656768686585565665655856658686565866665566556556558658676865856868565556686585565766686656585556665565566558865688566865568566868568556585665565665656668666556865566655565858688868558555665658685556565686585668566865586565655686685666557665676655665655885866556856868566556868555555555686588568685665568557685655Տo>>>>>>>>>CCCllCCC>CCC>>ClC??>>>>?C?ClllC>>>>>>CClClCCllllCCllllCClCCCCllCl?lllllCCClllllCllllllllllllloolllCCllCCClovClllClC>??Clollll??llCClppol?CC?lCllolloollllClolC?>lllC?CCC?lllCl?ClC>ClllolClllCCllllClCCCC?CllllllCC>?>llCllpllC>ClollllCllll?>lllC?Clool???Clll??CClllCCClllC>>lllC>>lll??CC?>C{?>>CCCCCCCCC?>>?lC?CCCCl?>=>=>C>>>>>CC>=>CCll>=C?ClC>=>?===>CllC>CC>==CCCA>==>C=>>=>C=>CCC>=====>==>>>>>C=>==>>=======>=========>==A=$====$$==$======$$$!!=@Y      ! !q86586688586886666666887565555556556566566555665655885856685655565675566688685656566886856656655668556565865676855686656656676558686766558675555668685655856565655686565678856765665866685665888555555566686568678666565575678585855568865555666655566556556565786768655858688755565666586565588558565685566655556756568655885667655686666868558686665666556656558655556586556665865865856656865566558888556866667655666586558568656855565556555676555566866686568558685656758555658886556675565585655656865688586556558586565656585855668585658667558655565556585868686666556566686556666658665858686585666565688658666555656568656568666566566656856656685556856658565555656666756556667565665868656588886565658668666m??>C?C?>C??>CCCC?>?lA>>CCCCCC?CCCCCCCCC??CC??CClCClC?ClClClC>CllllCl>?llllCCCCllCllllClllClClCClCllClClllCl>lllCCl?llullClll?lllllClllllllllllllCClllClllllllClllllllllClllllCClllllClll?lllClllllClolClllllCCllllllllCCllllClCCllllllC?l?lplClll?lll?lClll?ClCllCCC?lCCCllllllCCllCCC?ClllC??CClCCClClCCCCClCCuuCCCC???>ClC>>CCCC>>C??>CC?>>>Cl>=CCCl>=?>>C?>>>ACC=>C>CC==CC==??>?>=>=?>>>==>>>=>>>==>>=>=>=>======A>>>========>C===========C=$===$==========!=====xx@Y!!q55666558666565856655666685888565866856565555565858668868558555566565868555656568658566856686658556655686556658655765555666556665556858865568676885655568685565555555865885686855565885556855556565858655865855685586556868565655585666566565658585666555655558566555676555565568656865665676585566855565688866565565585655656865688588555556586565665858555665658586665865567655658588656865656568686655858676665586566558765555865658556565656885656566566566855888567686656565668555865656565568586856587655658665565555566866666655865656666656558586865585555655555556855665655655657655585765656656765856655555666565658565668665586568555586766786656655556865655858688855686855556566865586855855666768665586765spCCC?CCCCCC?>>ClC>=>ll>CClClllClllllC??CCClllllCC>>CC>>>?C??>>>lll>>??lll?lCCCCCCCCC>>llollC>>>C?CClCCC?lollpoll>llCl?ul>Clol?lllllC?CCllllolllCC?llllllC?l?CC>>llCllClll?lllllCCllC?CllllllllllllClCCllllClC?ClllllllllCllllC?llClCCClCllllllC>C?CllCCll?CC???Cll???>>???lllC>ClllCCClCCC?>C?>>>CCC>ClllllCC?lllzClC>?ClC>ll>>??CC>>ClC>>?CCC>>C>=>>>>=>C>>>>=>ClCCC?>==>=>C?==A>>>=>>C>>>C=>CC>====>=CCC>=>>==>>>=>========>>>==>>============$=A=$$A==A==!$====>==A==!Z    p6665676885688568656566565686768656656566765658665856856765685665566665686668558686585886576568678676555656668656578676566656656856556685556685665856555565676556565566655656656686556588867566556668566656568665565688866576568685666855665668855568656565555855566566858565558568566665586856878665665656555586655656568586856586855666555655566866566655566556666565655858686568555655855585865558555668565566558665655565666656685686666656558568555555656585665566665676558555566565666566855666555666565676668688855555585565686565657855665658668656655655555686855588686555568585856668586556556868666566566556555558676556675555556555558565555655658585866556565656555855665656886656656555856655586565555676566658ӏp???C???C?C>=CCCC?>ClC??CC?ClCCC>?lCCC??Cl>?CCC?CCllC>C?ClCCC?Cll>ClCCClClCllCCCCll?>llCllCClClCllllCCClCllllll?lCllCCull?lllClllll?CllllClllllllCClllllllolClllllCllllllCllolll?ClllllllCllllCClClolCCClllllClllClllllClllll?llCllC?lllllllClll?l>llllllClCllCl?lCClCllC?ClClC>lll?CCCllCC>?lCCCCl>CCCCCl>C?>CCCCullC>?CC>>CC>>CCC?>>CC>>>>?>C>?>>C>=CC>>C>>>C>>C?=>CC>>>>>=>>>>>>>?==CC==>>>=>>>>>=>===>>>==>=>=>==>==>>=======>=========>=!========$>============!Au=!==x@Y  !q8856586556665665658656555585676567676556555555875865655655686555857656565665565856855555666565658565668665567656855558676665686576555556868658586888555686865556566865586865855666588565586765886558555856655565658658556655866655665665657655686886665558688555665565565656556886566558555568665566656855866556688565766668868665565576865865676678556656556868656666658586656856588665868656885767656655586885765768656556885566656565686555866565565865566668686588688656567685656555556556558665865665685656585866786565686656865856665686858565685667556685685666766855865585566655586656555566566665686568686586866665566666668876558866588685555556886565858657656665566558655656o>ClC>>>>?>>>?C>>CACC>>CC>>>CC?C>>CC?>>?ClC>>CCCClllC>CCClll???llllllC>AllCCCClllllC>Cl?>>?CCllolCCCCllllC>>CC?llCClCCvllCClClpvllCCllCll>>CClllllllCCllCllCCClol>ClllpllllCllllllllllollllllpollCllClllCllpolllC>>ClC???ClCClClClollllllC?>>>>CllllC?CCCClllllC???lCllllCCClCC>CllCllCllC?>>CllCClClllCCC?lC?>>>>ClvC>?C>>?lC>>CCCCC>Cl?=CCll>>CCC?CC>>ClC>CCCAClC>>>>==>>>>>>>>===>?===>>==>?>=>CA====>===CC======CA===>>>>>>==========$======>=$$==!===$!!===!!!=x=$!!$@{ ;Z!!  =s656588565656865685565565656565585586565565568685665588685555588688555568588565665865556686866656656855655555867665675555555655555585555556556586658565565656655685565667688656565655856655586565666765666588586556856565676556686568855856566556768655856686565686565565655566556655886556566685855666866588688565656856765565565565667686556566675566586566658568656656858865785866555688856556858556866866765686655666686666558686865666668685865566555868566856555TTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTMTTTTTTTTTTTTTTTTTTMTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTT76866555676558858658566566656666686688858856656668p?>CCCCC?CC>>?C>?>>?CC>C>?>?CCCCCC>???CCCCC?CCCCClC>C?ClC>ClCCCClClll>?lClCC?llCClClCClCCClllC?llCClllllllllCCllC?llClulCClll?lllClllClCCClllllllCClClllClllllClllll?lolClllllCllCllCClllCllllllC>lllllllCllllCCClClCllllCCllllC?llllC?lllCllC?lllll>lllCCll?CllClClCCCCllCCCCC?llCCllCCC>CCCCCCCCC>?ll>>{CCC?>>CCCCClCACCC>>lC>>CC>>C>?>lC>>CC>>?C>>>C>=?>A>Cl>>>?A=>C?=>CC==>=>=CC=>>>>>==>>=>>>=A=>===>>====C>====>>>>=====>=====>=====$===$=====$=========$$==!=$========!$=;Yq865565565656776556866658556665555885568685665856656556685568565756568555585656566665558665655565656665568666868665566686665566666668686658666588666655668865666588576566665665865676566855655566886555586585766665865666666566565666866685566668656586686658585586555666566885568568656588585655555668685658566658568666766865658666556655668685665686656566866565886586656665856856565655686566555686658666885658658655865866568586656556665688556556586XXXXXXXXXXXXXXXbXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX=6886666866855658666655686685665686865665665556676666655o>>>CC?>ClC?>>>CCC>>CCC?CllllCllllCCCClC?>>CllCllC>?lClll>>llll?>>>>C>?lCll?ClC?>CllllClCCllll?>?ll>>???C>llllCl?ClplllClCll?>?llCCvpllllCCllllCl??lll?>llllllCClCCC>ll>>?llllllllll>>Cl?CllllCl??Clll>llC???ClllllllCClC??lllllllC>>>>AlllCllllolC>>CC>?llC>?ClllllCll?>lllCC?>CC>>>lllC>lllCC?llC>>>CC>tyCC>>>CC>?CC>>ClC=>CCCllC=>>>??ClC?>>=>>?>ClC>>C>C>=CC===>>>C>===>=>>>=>CCA>>CCCC===>====>C?C>>===>>=======================>====>C>==>===========$!=!=====A=!=@!=!!$=$@;Y      ! =s655656665586856686566685666686656866665665565668665666668666566666555666666856656568666685676556656656886656686656686665686755565665867666665675566656666585688886666865666656766685685556556566666585688566756886686766556768685685866667578566865655568566665888655566865666566658656865586655565856565566566666856665565668656565558586886756565565856665566685665566668666555666658566588558655565566567855668665656688656656668656TTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTT8566565655656668665588868658656566865568556656558566566Վm>>C>C?>>CCC?>>?CC>?C?>CCCCC>?lCCCCCCCCC>>CClCC?ll?C?>ClC>ClCll>?lCCC??llCC?>llC>llCCCCClCllCClCCllCCCClCCllCCllCClllCuCCCllCClllClolCllCllClCCllCCloC>lClplClCCllllClll?CCllCCllllCCCllllC?llllC?CCCClll?CllCllllllC>?ll?CllCCllCCCCllCCloCCCllll?ClCCCCllCllClCClCClCl?>lCllC?ClClC>llC?ClCCC>???CCC?CCCx?C>>llCCC?>>?CCC?>???CC>>??CC=>C?C>>>>>>CCC>>>C>>>C>>>>>lC=>>C=>==>>>C>=>>==>>>>=>===>>>>=>>====>A>==>>======>=A========>===$=A===========!=>=====$$=======!u$===!===!=;Y  !!=q6856856556566566655655656565565665865658686867866666656666565555666656865856656567686656865566665655655688886655686668867655685855856688656668656567858665568688568568686566565555656686666566565665665566856556665865565675568666685865686565555655566768568686655666888568658656565886566585666866666886665678668676865655656568666766676866655668666656656668558566865556665565666665556686658688656565556665686588886666656856666656865568TTTTTTTTTTTTTT"TTTT:TTTTTTTTTTTTT:TTTTTTTTTTTTTTTTTTTT:TTTTT:TTTTT:TTTTTTTTTTTTTTTTTTTTTTT:TTTTTTTTTTTTTTTTTTTTTTT:TTTTTTTTT:TTTTTTTTTTTTTTTTTTTTTTTTTTTTTTT:TTT:TTTTTT:TTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTT:TTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTT:TTTTTTTTTTTTTTTTTTTTTT6666855688858568565568555566656865856666666666865865665568pC>?C>C>=>C?ClC?>>CClCC>>=>>>>>>>>>CCCCCC>lCllC>>llC>>CCC>ClllC>CllC???C>?C?>?C?>CllllClllCllCCl>>CClllCClll?ClllCCC>>ullooplC??>>?C?>CllpolC?llll?Cl??llll?CCllllllCCCl?lllllC>CllllllllC??CCClllloppol??ClllClClllllllllllll?>CClllCClCCC?>?>Cl?Clllll?>?CCCCC>CCCl?CC>>??CllllCC?>>>CC?Cll??CClllC>>???Collll?>>>>>CC>>C>>>ClClCCCllA>>>?C?CC>>>>>>>A>>>>>=>C>>C==CCC>>>>>CC>==>CC====>CCC==>>>====>=>==>A=>A===>========$=>=>>========$===!=====!=====>=!===!!=$!$==!===$!===@!;Y !! !   p65866556568665555868556866656865866556888666668688688866856868666566555556568866586668665685566566568556666685866866665685666686656856585655656655656566656888686865556555865568556666555855565665555676565666665565658665866885666555656686588658666666586666666665566865656568666868656886855556688656688586686566XTXTXTXTXTXTXTXTXTXTXTXTXTTVTTXTUXTTTXTTXTTTTVTTTTXTTTTUTTTTTTVTTTTTTTUTTTTTUTTTTTTTTXTTUTTTTTTTTTTUTUTTTTTXTTTTTTXTTTXTTVTTTTTTTTTTTTTTTTUTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTUTTTTTTTTTTXTTXTTXTXTUXTTXTTXTUXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTՎp??CCC>>>CC>>CC>>?CC>>>C>CCCCC>>>CCC>?CC>>llCl?>C>ll>>ClC>CClCC>>pl>?CC>>CC??CCCl?>llClCClCl>ClC>CllCllClllC??lllCCCCCuClplClCllC>CCCCCllllCl?CllllCClCllC?CCl?llCClllCC?Cllll?CClllC?llllC?CllCllllllllCClllCCClCCCllllCllCCllCl??llCCClC?C?CClllClClCCC?lC>?CCCl??C?llCCC?llACC?CCCCC?CCC?C>>ClllCC?>>>CCC{ClC>>>CCCC?>>>>>CC>CCCCClCCC=>????>>>=CCAl>>>>>>>?>>C=>C?==>>CA>>>C==>A===>==>>>>>===>>=>===>=>>===>==============================$======$$==>==!===!======!===$====u;Y   $qXXXVXXXXXVXXXXXXXXVXXXVXXXXXXVXXXXXXXXXXXXXXXXXXXXXXXVXXXXXXWXXX66586666585658585688666586856655666566868566856856865656666566568656566565556866566686656666865686868568565556855556665568658566666656858668656655685665855588656658666586566565686558666556665666865665666866665655566856665668556868656566586568666576586856656665668565565856XXXXXXTXXXTXXXTXXXTXTXTXXTXXXXTXXTXTXTXTXTXTXTXXXTXTXXTXXTXXXTTXVTXTXTXTXTXTXTXTWTXVTTTXTXTXTVTXTXTXTXTXTXTTXTTXTTTTXTTXTTXTWTTTTXTTXTTTXTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXl=>??=?C>>C>=>>CC>??C>>>?>CCClClC>>?>>CC>ClC>C?CCCCllC>CC?>>>CC>>Cl>CllCClllClllll>ClCllCCC>CCCC>llllCCllCCC>CC>?lllC?l?CCCCCClllllllllCCll?CC?CCClllCllvllllCllll?>lllllolCAllll>llllllClClllllCCCCC?>?ClllllllCCll>?Clool?Cllll?ClllllC>CllllCCC?>>ClllCollllCCC>?CClplC>>>CllCClooplClllCC?Cl>>>>>>?ClllC?CCCCllCC>>CCC>??>>=>>>=>>>>>?CCCCCCCC?>>C==>CC>>>=====>>=>>==CC>=>==>>==>>=====A>===>C>=>=>A========>=>?==>=>>=>======$$=======>=========$!!$$!========$!$!=$$!!!@!Z! !!  ! $qXTXXTXTXXXXTXXTXTXXXTXXXXXTXXXXTXXWXTXWXTXXXWXTXVXTXXXTXWXTXXXTX5856667666666586655655666586556686656585556866786868676558656686688658666655666866566656885565667686568665666668666866755658866656865685655656666566856568558558586866556666858666576556665655665655885668668868686866655568658565856676868566566566868686656666556686T:"TTTTTTTTT:TTTTTTTTTTTTTTTTTTTT"TTT"T""T"""T"""TTTTTTTTT"TTTT:TT:TT"TT"T:TT"T"T"TTT"T"TT:"T:"M"T"TT:"M"T"TT:"T"TTT:"T0T"TT:"TT:"T:"Տm>C>=?C?C>>>>>>??>>>?>>C?>>>CClC>>???CCC>ClCCCCClC>ClC?>?lC>>CC>?CCCC?C??CC?>lCllC???ClCCC>lll?CCClClCllCCl?ClCCClll?Cu?ClCll?llCClClllCCllCCllClCCl?C?lolllllllClCCll>CllCCCCllllllC?llClCllllCC?llllClClllClllllllC?CllllllCClCCllllll?CCC>loCClCC>Cll>?llll>CClCCC>lll?C>CClll>llllCClllC?CClC>>>C>A?Cll?>?{uCCCCl?=?lC?>>>>>lC>>>>>>>C>>>CC>CC>>>C>>CCC=>C>=>C>==>>>==>CC==>=>>=>>=====>C>====C===C>===>====A>======>========$=========C=======A>!!=$=$$=!$======$$!$$!$!=$Z;Y  ! qTTTTTT"TTT:TTTTTTT"TTT"TTT""TTT"TT"T"TT"TT"TTT"TTTT68665556686665565665676865558566656856565585555688856586686656655656585688567666666867868666585866568565655856866565865668556656568666655588566565656665666656566656856656566856665656665556657655688566866585585686856565665676588668658556568685855565666665858665655TTTTTTTTTTTTTTTTTTTTTTTT""""T"""""T"""TTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTpCC>>CC?CCCCC>=>??>CCC>>?CClC?>>=CCCCCClC>>C?>>>CC>>>?lCClllllllllCllCCClllC>?>AlCClCC?>?CCClCCll?>CCCCllCCllllllCCCllllllll?>?lllCClllllll??lolC?C>llCllCCClCCCCllllC?llC>llllACCllCClllCC?ClCC?>>CllllllCCC?>>?C?llCCCCAC?C>?>llCCClC?lollCllC>>llCCll>lollCClll>>>CoC>ClCllCl>>>C>>>>=>>?CCCCCCllCCll>>CCCC>tx>>C?=>CCClCC>>>>>A>>>CCC==C>==>>=>CC>==>==ClC>=>C>>>==C>==>===?CCC>>CC>>>>A=====>>==>==>===>==CC==>?========>=========$!$==!!$=!!==!========$!!!!==========x @Y    !sTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTT568565556656565885585656666565855685556556556686655666656656865665656566656565858685855585866666565656586866865666656565666566565666658656666665665865666866656566665668866666688856665688668686686668565656666655666665686858656665666658565855556556665655656866865565856655565886686666565TTTTTTTTTTTTTT:"""TTT""TTTTTTTTTTT:T:TTTTTT"TTTTTT"TT"TTTTTT"TTTTTT"TTTTTTTTTTTT"TTTTTTTTTTTTTTTT"TTTT"TTTTTT"TTT:TTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTӎmCl>=>A>CC>C>>>>>>=>C?=>CCCClC>>>C>>llCCl?Cl?>>C?>C>>CC>?ClllCClC?ClC????CClC>>llCC?>lC>?lCClC?ClC>CllllCClC?CllCCCCCCuClCClC??CC?ClllCl?Cl??Cll?ll?CllC?Cllll>CCloC?CClCC?Cll>?lllCllllClC?lClC??lllClolCCCCCC?CllCllC?Cll????CCllClC?ClllClCCCCCll>ClCCCllCCClCC?>CllC>l>>ClCC>>ClCCC>>>?ClCC>>CCC?lCCCC>>C?>ClyCC?>>>lC?CCC>>?C==?C>>>>>>==>>>>CC>>>=>>C>AC>=>>===>>==>=>=>C==>>=>>=>=>A====>===>>==>===>A>==>=>========================$$=$!$========!==!=$==!!!===$$$@@Z   ! =}TTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTT65565566686565666665685686656656866666668668686666566558666866866865666685566666866656656556665666586665556665566586686665656556666656655666686868667668665856866565655868686656566666566866566668566565565656666686686566666666566666665866668665685866566858686866565686TTTTTT"0TTT:TT"TTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTsoCC=>llC>>>>>CCCllCllC>?CC>=>>>lCC>ClC>=>>CC>?C>>CCCll>>lC>C>>>>C?>>?>?CCC>ClC?llCl?>?llCC??ll??llC?llC>>CllC>Cl>?>CCCulCClllClllCCCCCClllllll??lol?>lpl??l?C??lClolCllllllllll?llC?CCllC???ClllllCl>>ClCClCllllCCC??CC>?llllllllClC>>AllCC??>?CllCC>lC>>CCC>?ClCC>?C>ClCC?>Cl>>C>CllC?>C??C>?lCC>>>>>?CC?CCC>>C?>>xuCCCC>=>CC>>C>>CCC>>=CCC>=C>>>=>>>>>C>==>CC>>CC?CCC>>>>CC>>==>AC===>>Cl=>CC>>>===>==>>=========>===========>=========$====>========$==$$==$$=====$!==Z;Z  qTTTTTTTTTTTTTTTTTTTTTT6685666665666665686686566666866566666676666565666686865656656886686568568666565685665656668556668666686668566586565686586685686886568868665568566688666668866866686686656656655865686586856868865665665665866866866665656656565868666656865656588656668685865566868688686686"M"""T"TTTT"""TT:TTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTT:"TTTTsp?C==CClC>CCC?>C>ClC>>>>lC=>A?>>lCllACCC>=>>>>lC?C?>ll>>lCC=>C>>?lCCC>>ll>>CCC?CCCCC>ClllC>>?CCC?ClClllCClCl??lC>>CCC?uCCCClCCClC??ClllClllllCCCll???lol?ClC>llClCllCCCClCll>ClCllCC??Clll?CCCllllC>ClCCCCCllllCC??lC??llllllCColCCCC?>lll>CCCCClCCCClC>>C?>lCllCCC>C?Cl>???>>?CCC??C>>?C>>?>?lC>?>>>>>llCCC>>>CC??>>{xCC>>>CC>>C>>>C=>>=>C>>>>>==>C>=>>>?>C>=>>CCA>CC>>>>>>>==>=>=>===>>CA>>>=>======>A>==========================!==========@>=!$===!==$===!!$======9C;[ !   q6586666685568658686566866556656656555686586855558886586856856656558665665666666655566866666865668865666856565568656665656566685656656855855668686865666668686655666565566566556656566686866666656566658666566666656586556685656686686668666568688565666568655565685656866586556656666556866866T":TTT"T:TT"T"M"TTTTT  "T"TTT"""Տp?C>>>>=>>>>>>>>>?C>>C>>CC>Cll>>>>C>>>?C?ClCC>>CCC?=>lC=>C>>All>>lC?lCColC?lC??>>CllCCC>>>ClllllC?CCC>Cl?CCCCCllllllllllClCCCCllllllClC>C>>ClllCC>ClCll?CllC?ll???>C?lCCllll>>lllC?ClllC?llllllllllC?CCClClllC?Clllll>CCC>>CC>Clol?ClllooC>?lCllll?CCCllC?>ClCCC?C?Cl?ClC>CllCllCC?>>?CCCCCClC>>CCClCCACC>>>>>>?C??>>>CuߘuCC>=>>CCC>A>C>=>?>CCC>>>>==>>?>=>>=>>==>======>=>C>======?>=====>=====>=>=====>==========>=========>======>=$=!!$==$=====$!$$$==$====!!$$=Z;Y  !!!=pTT"TT""M"TT:TT:6656665668668865665666866565865865665566856668665666566865656656586656565555685666868665665655885865665686855556665686855686656556555586566868666568556555665688665i865656666886686656556665566556686668688666666666656565656655588668666566668656685555585866566655665656566868666885668668656656586686665666TT TT"TT"TTTTTTTT"T"TT:T"T:TTT:T"TTTT"TTTTo?>>>>>>>?>>>>>>>>C>>>>>>>>>llC?>>CC>>>l?>Cl>>>>CC>>>>>>>??>>CC>>>>Clolllll>>CC>?CClCCC>>?Cl?ClllC?C?>CCCCCCllllllCCl?lCCClCCllCClCCllCCCC>?llCCl?CllCCClllC?llC>?Clllll>ClCl?ClC?CCCllCCllllllllllCC???ClClClC>Clol>?CC?ClC?CllllCCllllllCClCllllClllClC>>?lC>>ll>>CC?C?>CCCllCC>>>>CC>?lCClC?>C?ClC>>CC>>>??>>C>>CC>CCCCuCCC=CAC>>>>>>>>>>>AC>=>=CC>C>==>C>=>C====>C>>=>=======>======A>===C==>>============>=A==>>=$=====A=!====$$$==!=====$==$!$$$!!==!=====x ;Y  ! ! =p"TTTT"TTTTTTT556568665556588586666866865665666566665686686656886686686566665565668686665686556665658665665866886665866665665665565666565686856565585657665586566886665865656865658666665655866655668656866856666686666568666658565556868558666686686586655566666666868686666668668686566658666656566566656555658665566565656655565665658TT  TTTՏo>?>CCCC>CC>>>>>>>C>>?CC>>CCC>>>>?CC>?C>=>CCCCCCCCC???llCCCCClC>CllC>CC>>>C?>llCCC>>?ClllCl?>CCC?CCCCCllC?>?CC?>ll?>?lullllllCC>CllCAllClClC>ClllCClllCCCCCC?llllllllCCC>CC?ClllCClllC?CCCC>?C>CA>CClllCCCCCllC>ClC>llllCCCCllC??>C?>>>CC>?Cl?>>>>>?C?>>?lC>ll?>ll>>CCllCCCCC>>?>?CClll?ClC>>>?C??>ClC?CCClCC?CCC>>>CCC>>??>lzCCC?C?>>>>ACC>>CC=>>==>>A>=C>==AC===>>C>=C>>>>>>=>CC>==========>>====>=========A===$!=====>=$=>=$==AC====$!$====!=======!===@A@Y ! 7s:TT"TT"T""TT""5665886686566568558555656656655568685665i685666856858667865685556656565555688656555686668558568665568666868865586666686568666566586665665656566668566566556558665665685686556885865865866868558655588658666656855656866655668556658666566865565666556566655665666566856666655686686866555865856666885556  p>>?CCCCACC>>>>>>>C>=CCC>CACC>=>?C>>?ClC>>>CCCCCC>>>>>ClCCC>C??C?Cll>>C>CCC>>Cllll??C>>lC?CCC?C?>?Cl>ClC??>?CClC????llollllll?>lClllCCC>ClC>>llllll>CC>?llCCllClllllCCC?CCC>?lCCCClCll>>llC>>>ClC>>ClCllC??lCC>?CllC?CllC>CllC???C?>>???>?C?>>>Cl?CCC?>>Cl?>CC?>llll>>lC?C>>??>>>>ClCCC>CCC>>>>>CC>CCCCCCllll?CCC>>>=>>>>C>>C>=u{uCCCCC>>>>>C>>?C=>C=>=>>==>C==>===>=>C>==>>>>>>>=>===================>>=$===>==$$=>=====$$===$=>=====$$====$!$======!=@C@Y            !p6656566866656586668668665866856665655666866886666556685656666865656656665665855656666568656566666585665555666586656686556568666768686656655855556865666665686565656666566565665655656656666566666665i8556555688656566565668665566656566566868665656666666686556668666855688656865566865668666856768666565658    p?C==>>====>>>CC>CCC>>C>>>>>?CCCCC=>>>CC>>CC>C>C>CClC>Cl>??>C>CllCC>lC?>>>CCClC?>>?ClC?ClC??CClC>Cl?>CllllCCCC?C??CClll>>>ClCCClC>>>CCl??ll?ClC>>CllCCClCClClACCCCC?>CllllllllCCCCCCll?Cll??llllClllllCC?>CllllCCllClC?ClCClC?CCC?CC?lCCClllCl?ClCC??C>ClC>ClC>>CCCl?>ClCCCCCClllCll?>?>>CCCCCC?>CC>>>?>>>>>>>>?>CCCCCC>>>>CCC>?>>C{ߛxZtCC>==>>>==>C>>>C>=>>===??>>CC====>=======>>==>>=====>=>=>>====>===>======>=========$$===$==$====$==$=!$===@CZ;Z  q5686566666666656558666856566666866666655655556566565566866656866665665666656566686665668658i8666666666565565665866666666555666856655666656668656565866565686666656568666686565566866566655685656666686565686665665566568665i6656866656556565686668566668665685556668665666668665666686665666666655666666666666655666  KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKp?>=>>>>=>=>>>>CCCCC>>>>>=??C?>CC?>>==>>=>?>??>>CClCCC>>>>>C?>CllCCClC?>>?CllC?>>CC?ClClACC?lC??Cl??>ClCCClC?>????CCl?C>>CCllCC???>??lC??CC>?lC>>ClllCllCllCCCCl>>?>>?lllllllCCCllC?CCClll?>CCClCClllll?>?ClllC??llll??llllCCCl?>CClC?>ClCCllCll>CC>CC>llC>llC>>?>>lC>?C>CC>CllClllC>=?>>?CClllCC>>>>CC>>>>>>>>?CCllll>>>>=>C>>C?>>>==uzZCCClA=>CA>=>=>C===>C>>CC>>=>C>=>>=========A==>=>==>=>===============C>===>======!=====!!!=>=$=!===@Bu;Y  !  ! =p6856686686865866666566566665666566565655686866866656656566568566686565666686656655656666566566665656666666665868686568665666866656856568666665655666666666568866665666586666686665666865868556666566656566565656866686686866655666656556668665656866666666668565865686566568866566866566566586566568 KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKo>>>>>>>>>C>>>>=>>>>>>>A>AC>CC?>=>>>CCCCCCC??C?>>C>?ClC>C>CCC>>l>>C>>>C?CC>Cl>?>CClC>??>>ClClCCllCCC>>CC?>CllCCCCCCCCCuClClCCClCllllClC?CllClolCClC?CCCCCClCCCC?CllllCCC>>CCClCCll>>lllCCC??lllC??ClC?>?CCCCCllCCCACC?CCllC>ClC?C?>CCllll?>CCCC>>ClllC>Cll>?ClCCCCCA>CClC??>ll>>>C>CC>>CCC>C>CC>>>?>>Cl>C?>CC>>>>C>>>>>C?>=?CC>>CC>>>>A>>CuƔxCZCCCCC>====>=>>====>>========>A=>===>>==A>=>==========>>========$$=========!=!$=====@=CCZx@Z q866568686668686666666686686566668666565686656658666686556566656656565568666656666656666668568686558656566565666856666556665666866666665565556668568666866565565656666666566665865668656665666566656656665666665686666668656868666666668666866568666886565556656686865686866668565666866666656666665568666855iKKKKJKKKJKJKKKJKKKKKKKJKJKJKJKJKJJJKJJJJJJJJJJJJJJJKJJJJHJJHJJJHJJJHJHJHJHJHJHJHHJHHJHHJHHJHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHFHHFTGHHFHGHGHFTFHFTFHGFFHFFFGFFFFF KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKFFFFFFFFFFGFFGFGGFHGFTFHFTFHFTFHFMFHFTFHFTFHFTFHFTFHFTFHHGHHGHHGGHGHGGՏo=>C====>CA>>>==CC>>CA=>>>C>>>>>>=>C>CCCAlC>>>>>=CCCCll?CC>>?>>>>>ClC>CCC?>CC>>CCClC>C??C?>CCCllCC???CCCC>CllCllC??CCCuCCllC>>CllCllllC?llCllplClC???CClllllCCCClllllC?>>??>CllCllCCClCCClCCllCl?CCC>?>>?C?>>lCCCC>>CllllCC?CCCCC?>ClC?ll>>ClC>>CllllC?lC>>?llllC?CC>>CC>C>ClCCCC>?ClCCClCC>>>>>>>C?>lC>CCCCCC>>>>>=>=>>>>CCCC=>CCCC>>>==CCCA>AuƃuZCCCA@>A===C======>=============>>>==A=========A==========$=>=====CC@@@CCBZx!!;Y!     !!!qHHJHHHJHHJHHJHHJHJHJHJHJHJHJHJHJHJHJHJHJHJHJHJHJHJHJJJHJHJHJJJHJ5666666656666556656658665665666856686656686656868656886866686665666868666666666666568656665665666866656566666568656666865568665686866568665i66666685866868666566666866868665656686656665566665666685666586656665656656665656665658656856686666665666656686686558665666866666668686566686688656656686666KKKKKKKKKKKKKKKKKKKJKKKKKKKJKKKKJJKJJJJJJKJJJKJJJJJJJJJJHJJHJHJGHGGGGGFFFFFFFKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKFFFFFFFFGFGFGGGGGHGHHGHHJHJHHJHJJHJJHJJJHJJJHJJJHJJJHJJJHJJJJJJJJJJJJJJJHJJJJJJJJJJJJJJJJJJJp>=>>CC>>>C>>>>CC>=>C?=>C?CCCC>?CCCCC?>?C>>>>CCCCC>>>>>=>CC>?CClCl>>?>>CC>>CC??Cl>>>>CCClCCCCCC>>?CC>>CCClC?>ClC?CCC>?lClCCCCCCCC>CCCClC>>?CCllCC>>CClCCl>>>>C?ClC>CClllClCCl?CCC>CCCCCCCC??C>llC>CCllC>llllClCCCCCCClC>>?CC?CCCl>>llC>ClC>ClC>C?ClCC??>>CC>C>CC>?lC?ClCllCC>>?C>=CC>CC>>?>>>??CCCC>Cll>>>>>>?CCCCC>>>>CCCC>>==>C>=>>>??>>>>>A==CC=?z̛utZuuZClZCCCCCCCCAAAAA=AAAA===AA@ACCCC@CCC@CBCZCCZCCuZux@Z !sӳ58686666866865668666568666866866666666666665566656868665556866566665665665565866656668586865686656666665656868686666866566568565686565656566665i66686656568565666665655658656665866666656555686556685666566666666866665668656866866665566676666556565566665586865566686656865665656665866855666665KKKKKKKKKKKKKKKKKKKKKKKKJKJKJKKJKKJKJJJJKJJJJKJJJKJJJJJJJJHJHJHGHGGGGFFFFFFFFDKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKFFFFFFGFFGFGGGGGGHGHJGHGJGHJGJHJHJHJHJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJm>>>>>>>=AAC>>=>C>=>>>CC>=>CA>>>>>lC>>>C>>>>>>ClC>>?=>>=>>>>?lCCCC>>>>C?CCC>?>CC?>?>>ClCClllClC>>?CC?>ClClC>CCC??Cl>>>CCClC?CCCC>?C?>llC?>>?>CCCC>>??CCCCC?>>>??lC>>ClllClCll>C>C>>CllCC????ClClCCClllCClllCC>CllllCC?>>>>?lC?CCC??Cl>>>ClCCC?C>>>lA>>>>>CC>>>>>CCl>?llCClll>>CC>CC?>>>>>>=?>>?lllCCllC>>==>CC>>CC?>>>CCllC>==>>>>>>>=>>====>==>C>==>>=>?CxƝƛ  @Y  !    =ӷ6668686666865656666668656668686586666656568666686668666656666655656656656656665865865666565665656566656565658565688686656656666665558666686686668665656666556666666566565686656586666565558665658666668665566566656666i6556686568566656865655556565686666866685586668666666668666666565666666856566566656666KKKKKKKKKKKKJJKJJKKKJKJKJJJJJJJJKJJJJJJJJJJJJJJJJJHJGJGHGGGGFGFFFFFFKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKFFFFFFFFFFFGFGGGGGGHGGHGHGJGHHGJHHJHJJHJHJHJJHJJJJJJJJJJJJJJHJJJHJJJHJJJJJJJJJJJJJJJJJJJJJJJso?C=>>>>>>>>C>=Cl>>>>>C>>>A>>>>C=>CC>>??C>>CC>>>>>Cl?>>CCCC>>??>?CCCCC??>Cl?CCC>>CC?>ll?>??>>>CC?CCC>ClC??>?lC??CC?CC?l>CC?>CllClCC>ClCCCClCCCCllCCCCClCCClCClCCCCCCCClC>C>CCCCClllCClCCCCC>ClCCC?C?ACC>ClClC>ClC?>>>??CCCCll?CC?CCCCCCC>CCCCClC>ClCCCCCC?C?ll>>CC?Cll>>C>CC>>CCC>>>C>CC?>ClC>>CA>>>=CC??>>CC>>C>>C>>>>>>>>>>?C>>>>>>C>>>>>>CC==>>>>>>>>==?C>===u;Z =sӳ56866i5666686865686868666856666665686666685656866656668866665665665665666685655668666656566566558665665666666686665668656665665665568666686566866568665665666566666556686665556686666586566556856656666666856566668666666865586658686666566865866666668868668655656586556865666655656685666866KKKKKKKKKKKKJJJJKJKJJKJJKJKJJKJJJKJJKJJJJJJJJJJJJJJHJGGGGGGFGGFFFFDKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKDFFFFFGFFGFGGGGHGHGHHGJGHHJHJHHJJHJHJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJ}p?C==CC>>C>=>CCCC>>>>CC>>AC>>>>C>=>>>>>>>C?C?>>>>=CC>>>C??C>>>>>CllCC>CCCClCCCC>>ll?ClC>>>>>=?lC>>C>CCC>>>CCCCCCCC?>lCCC??>?lllllC??CllCl?lC>CC?CllCCllC>>>ClCCCClCllClCCCCllC>?lllllllC?lC>CllllCC>>??CC>CCC??C?>>>>?>?lllC>?C?ClC>>C?CC?CC??CCC>CCCllC>?>?Cl>>>>CCC>>>CC=>>>>>?>>>>ClC>>>CCCC>>===>>C>>>>>>>CC>>CC>?>>>>>>ClCC>>>>>CC>=C>>C?>=>=CC>CA===>CA=>===ACCCC=Cu{;[ !!     =pӳ668666685668666565686568868686668665866665866686558658568666666865565656666656666658666656666i66665655656655666565565865666686665656666686656686568866656566876665666665656656666855656866668666588565656666555566665865655665865686566666i585666665656565666666565665655666686666656866566665556866766668KKKKKKKKKKKKJJJJJJKKWKJKJKJJJJKJKKJJJJJJKJJJJJJJJHJHJGJGHGGGGGFFFFFFKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKFFFFFFFFGFFGGGGGGGHGHGJGHHJGJHHJHJHJJHJHJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJo?>>=>>>=>C>=>>>>>A>=>C>>>>>>>>>>>CCC>>>C>>>>>CCC>CCA>?CC>?>?C>?>CC>C>>?>CC>>??A>AlCC>>C???C?ClCCCCCC?>ClCCC>>CCClC?CClCCCC??>ClC?C??lC?C>??CCC?Cll>>Cl?CC>loC?C?C?CCClCCCCCCl>>lCCC>??CCl??lCC>>?>>ClllC>?CCCCCCCC?Cll?>CC>Cll?>ClC>CCllC>CCC?ClC>?>CCCCCCCCC>>C?CC?C>>ClCCCC>>>>>CC?>>CCCCC>>>CCC>>??>?C?CC>>>>>=>>>>CC>=>>>>>=>C>>>>>>>>>>>??>>CC>==>>=>>>>>>>==C====>@===>===>A=ACZuxz;Z qӳ66565i66666666666555666565i686866656666556666686666665656666666566668686856666656656666666566666i666555666666666665656686686665656666666666668668668566568666866666656665666886666665i666565i55i66666666565666668i566666666565686665666665586656566866866686866666665668656665866666556866656656666KKKKKKKKKKKKKKKKJJJKKKKKJJKJKJHJJJJJJJJJJJJJJJJJJJJJJJHJHJHJGHGGGGFFFFFFFDKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKEFFFFFFFFGFGFGGGGGGHGHGJGGHGJGHJGJHJJHJHJJJHJJJJHJJJHJJJHJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJՏp=?=>>>>===>>==>C>====>>=>>>>>CCCCCC>CC>>>>>?>>>C>>>>CCCCC>=?C?>>?>>CCC>CC>>>>>>>>CCC>>?>>?ll?CC?CClC??CC?CC>>>lllllCCuA>?CCC?>CCCCC?????>>>Cll>?CC?>?CCCllloC?ll>>>>CClC>>>Cl?>>>?C>>>?ClllCC>>>??>?Clll??llC?CCClllll?>CC?llCCCCllClllC>CC??ClC>>>CC?>?lllC>>>>C>CC>?>ClCCC>>>>>>?C>>>CCClC>>ACC>>=>>>CCCC>>>=>===>>CCC>>=>=>>>C>CC=>>CC?CC=>ACCC>>==>>>>==C=========>==>=======C>=A>>=>=>==>>====={ @Y    !!! ! $qӳ6666886566666666665i666666686665665666866686566666866656866666666565666566686666666866566566668666666666686866556566656686666866666656666i66665656666666566666666666665668666686656i65666866666686656686666866686666666666666665i86556666i656666566665666666686668668666665686666686685868666i5666666658KKKKKKKKKKKKJJKJKKJKKKKKKKJJJJKJKJKJKJJKJJJJJJJJJJJJGJGHGGGGGGFFFFFFKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKFFFFFFGFFGFGGGGGGHGHGJGJGHHJHJHJHJHJHJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJp>=>=>=>>>>CC?=>>>=>>>C>>>>>>A>>>>>>>=>>>>>>CC>>CCCCCC>=>CC=>CCCCCC>CCC>?>C>CC>CCC>CCCC?>C?ClC>?C??CCC>???CCCCCC>>Cl>>C?CCCCCCCCC?ClCCC?C?CC?llCC>?CCCC?>CCCl?>Cl?>C??C?CC?CCC?C?Cll?>CCC??CC?CCCCC?lCCCC>CCCClCC>>lCCCC>llCC>>CC>>CCCl>>Cl?>C??CC>?lC>CCCCC?C>CCC>>?CC?CC>>??CCCCC>>>>>>>>C>>>lC>>>>CC?>>>>>?CCCC>>>>>>>>>>>AC>>>>=C>==C>==>>>>>>===>>?====>l==>=>C==>C>==>===A>========>===>=======z;Y!9qӳ688i66666685666666565666665666866668566666686665i8866566655666666656656666866668666566666868565666666566686i66666666656665566566866568666668666865666868856656566666666666566i5668668656666566866656656886686666686656868656665686566685665i8665566656666668668686866566556655666666668668665668666666655668KKKKKKKKKKKKKKKKKKKKKJKWKKKWKKJKKJKJJJJJKWJJJJJKJJJJJJJJJJHJHJGJGGHGGFGFFFFDKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKDFFFFFFFGGFGGGGHGHGHGHGHHHGJHJGJHJHJJHJJJJHJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJq?>=?>>>CCCClC==>=>>C>>C>>>CCC>>>>>===C>>>>>ACC?CCCCCC>=>ClC>>CCCCCl>C>>CC?>???>C?>=>>?CCCCClC?????C?>>>>CCCllllC>>CC>lClCCC>?CCCC?CllC?CC?>>CCC?>Cll?>>>>>CCC>CC>???ll?>Cll???CCCll??Cll?>>>>>>C??CCClC>ll>>lllC>>>>AlCACCCC>>>>>>>>??>CCC>>C?>>?llC>>C>>>=>>>lC?>>>>CC??>>?lll?>CC>>?=>>>>>=>??>>>?lCC=>C>=>>llCC>>C>===>>>CA>A>==>>===>==>C>=CA===CC==>==>CA>>=>>===C==>>===>=====>==>============z@Y  ! !  qӳ665686566865655868655666855656666666666568665656666666666i6866566686566668668666655686666668666666566666686865865566666568666666555666656665656656566686655666i66666666656666566665665656668666866656665666656566666658666856656665666666656666566565665656666665665556668655686655556586668656565656666656656568666666566KKKKKKKKKKKKKKKKKKKKKKKKKKKHHJKJJKJKJJJKJJJJJJJJJJJJJJHJHJHHGGGGGGFFFFFFFKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKFFFFFFFFFFGFGGGGGGHGHGHGJGHJGHHJHJHJHJHJHJJHJJHJJJHJJJHJJJHJJJHJJJJJJJJJJJJJJJJJJJJJJJJJJJJՏp=>>>>==>==>>>>>>>=>CC=>=>C>>>>>C>>?>>>CCC>>CC>>>>>>>>?>?C>C?>>C>=>C>CCC>>CC??CCC>>?CCC?>?>CCC>?CCC?>>CCC>??CCCCCC>>??lCCCCC?>CCCCC>ACC>>ClCCC?CCC>ll?CC?CCCCC?ClClC?CCC>?lC>C?C>?ll?CCCCCCC>>CCClCCC>?lCC?>?CCCCCC?CCC>C?>Cl??>>lC>>CCCC??>>?CCCCl?>C>?C??CC?CC>>???>Cl>?>>CC?C?>C>AC>>>lC>>>>C>>>>>CC>>>>>>>>CC>>>=>=?CCC>==>>>>=>C>>>>>>=>>==AC=>>>>=>?==AA>A===C===>=>=A>==>>=>>====>=======>====z!Z    =qӳ8666666556858686666666655656666666865655686565566855566866865666666666655666566668665668666685i68668i6866556565566656666656666686666666666665686666856556866566666656566666i6666566666655666666568666666866665566556666668655566666655655568566666556666566666566656656i65665666566656666866586666658566666665656566668688666566585KKKKKKKKKKKKKKKJJKKJKKJJJJKJKKJKJJKJJKJJJKJJJJJJJJJJJHJHHGHGGGGFFGFFFFKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKEEFFFFFGGFGGGGGGHGHGJGHHGJHHJHJHJHJHJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJm=?>>==>==>>>=>CCCCCCC>>CCC>>>>>A>>CC>>CCCCCCC>>=>>?CCC>CC>>C=>>>>>>>>>C>>CCC>?ClCCCCC?>C??>C>>CCll?>Cll>>?>>>>>ClC>>?lC>?CC>??C>>>?>?>>>CllCCCllCCCC>?lllC>Cl>ClllllC?>?CC?>?>?CClCCCC>??CCCClCllllCCC>>CC>>?>>>>>??>>?CC>CCC?>?CC>>ClCC>?>>CllllC>>CCC>>>ClC>==CCC?>CC>>>>??>>CCCC>>>>CllC>=?CCCC>=>CCA>=>>>>>>=?>==>>CCC>==>>>==>CC>CC>==>>==>>>?C>==A>>>CA==>===>======>C===C>=A=======>==>==>===z@Y! !  !qӳ56558665666666566665656865656568666665656666666666665666658666666666665666666666566666568665686666686556558566556566568666566566665886685556566555658868865666656686688666666865i5665656666556655668i566666556656666655655566666666565656666656566665866566666i5566686666565866566665568i5656866565666666566865866666668656665665658666655655656666KKKKKKKKKKKKKJKKKKJJJKKJKJJJHJJJJJJJJJJKJJJJJJJJJJJJHJGJGHGGGFGFFFFFDKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKEFFFFFFFFFGFGGGGHGHGHGHGJHGJHJHJHJHJJHJJHJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJo>?==>>>>>=>C>==>>>>>=>=A>>A==>>?>>>>>>>>>A>?>>>>>>>?>>>Cl>>?=>C>?C>>>>CC>>CC>>>>>?>>?>???CC?CC>>?CC>?lC>>ll>>C?ll?>??lC>>??CC?CC>ClC?C>C>>AClCCC???C?>Cl?C?C>>ClCCCCC>Cll>CCC??CCCCCC>>CCCCCC?>A>ClCC>>CCCCC>?CCCCCC??C????C?CC????>CCC?CCC>?CCCCCC>>CC>?>>lC>?C?Cl>???C>>>CC>>>>>??>?>>C?>>>>C>>>C>C>>>>>>>>>>>>>>>>>>C>>>>=>>C?=>?>==C?==>>=>==>>=>==>=>>>>===>>==>==>==C===>===>==A>===>==>===>==z;Y !qӷ55666666686566656566566565665666i668666668656555665656665668565665666666556558865558656656688668668666665566666666566656656688666655666566665665665668i58666656665666665656665556666566655666666686666665i5656666565566565686868686656565586665856565668665555i65866668656665i6686665666865666666566565566686666666866568586856866668656656666566566655KKKKKKKKKKKKKKJJJKKJKKWKJHKJHJJJJKJKJJJJJJJJJJJJJJHJJHJGHGGGGGFFFFFFFFKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKEFFFFFFGFFGFGGGGGGGHGHGHGJGHHJGJHJGJJHJJJHJJJJJJJJJJJJJJJJJJJJJJJJHJJJJJJJJJJJJJJJJJJJJJJJJm=?>==>C>>>====>=>>=>==>?>>C>===>CA>>C>>==>C>>>C>=>C>CA>lol>>>>C>>>=>>CCCC>=>>>>=>???>>>>??CC?>?>>>C??>?>>ClCCCCCC>ClClCA>>>C>>>>>CC?CCCC>>CllClC>>>>C>?C>?>>>>Cl>>ll>>llCCCClC>C?>>>C?CCCllllC?>>>CC?>?CC?ClCCClllC?CClCCC>>>CCCllC>>CCC>C>>?>>>>CCC>>>CC>Cll>ClllC>CCClCCC>CC>>=>CCC?>CC>>>>>>>>>CCA>>>>>>?>=>>>>=?ACC>===>=>CCC>==>=>===>>>==>====>>===>====>=>>AC>C====>==>======>>=============>{@Y  !!$sӳ68666656656656556666655666666665565586666868666i68666665666666666565555666666665656555555668666686665566566565656655i66565566856656665666866666658656665666665666565666i66686566566656565568666566568586656866666665665665655665666656666666666656656666666866568666666666656666658666666655668668666665556556666865686866566666566556666666565666KKKKKKKKKKKKKKJJJKKKKKJKKKKKKKJKJJJJJKJKJJJKJJJJJJJJHJJHJGHGGGGGGFFFFFKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKDFFFGFFFFGFGGGGGHGHGJGJGJHHJHHJHJHJJHJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJo=>>>>=>>>A>=>>>=>>>=>>>>>>>>>>>>>>>>>>>>>CC>=?C>=>C>=>>AC>=>>>C???>?CC=>CC>>Cl?=CCCCC?>??>CCC>CCC>>CC>>CC????C>lC>>ACC>CC??CCC>C?CCClCCC>>lC>>CC>>?>CCCCC?CCCCClC>CCCCC>?CC??>?lCCC?>Cl?>C?CC???>?CCCClCCCCC????C?>??CCC?C>>C??>Cl>>?>CCCC?>C>>?C>ClC>>lC>>CC>>lC>>>>C>Cl>C>>>>>>?C?=>C>>>>>CC>>=>>>CC>>>>>>>>AC>=>>>>>?>>>>>=>>>A>>=>=>>==>>A?=>==A=>=>===>=>>===>=======>=>====>===>===>=======>==z !Y!9qӳ6566566656666566666868665i666566566666686666566686665656666658666666i666656666566665656666666665866i655566666666666666566665666556665856i666656866655665686656556566666655656666666666656685656i5566665686655566666656666666666866666686665686666665666686666866666666685666665565666668666666666666676866656656666KKKKKKKKKKKKKKKJJKKKWKKKJJHKJJKJJKJKJKJJJKJJJJJJJJHJHJHHGJGGGFGFFFFFFFKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKFFFFFFFGGFGFGGGGGHGHGHHHGJHHJHHJHJHJJHJHJJJJHJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJo====>==>C>=>>>=>>=>>>>>>====>>C>=>CCC>>>>C>=>>>=>>>====>C>=>>CCClCCllC==>C>>ClC>CCCC>?CCC>>CCCClC?>ClCCCCC>>?C>>?>>>>uClllllCCll>>lClCCl??lC>>??>>C>?lC????lllCCC?>>C?C>>>C>>>ClCCClCC?>>?C?>??>>CCCllCCCCC>>>?C?>>C?>>>lCCCC>CCCCCCCCClCC>>?>?CCC>CC=>??>>>>?>C>>>>>=>>lC>>==>?CClC>>>>>>>CCC>=>>?CC?>>>>>>>>CA>>>>>>>>CCCCA>=>>>C>>>=>>>=>>CCA>=>C>=>======A>=========>==>>==>====>C======>>======x ;Z!   pӷ56566666586665666666565686666686i6686556666566865565666665656666666656656666665566556565666666668566666666666666656666865666666666666665665666666666566688666566668666666666i66668666658666566686688666566666886566566666665666656665686865566668656566666666666666666686566i566566566666666666866566656666666686668666666666i666656566665666KKKKKKKKKKKKKKKKKKJKJKKKKJKJKKHJJJJKJJJJJJJJJJJJJJJJJJJJJJHJGJGGGGGFFFFFFDKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKDFFFFFFFFFFGGGGGGGHGHGHGJGGJGJGJHJHJHJHJJJHJJJJJHJJJHJJJHJJJHJJJHJJJJJJJJJJJJJJJJJJJJJJJJJJp>===>A>=>>>>==>>>==C>>>=>>>>>>>==>>C>>>>>?C>=>?>?>>>>>>>C>=>C>>>CC=>CC>>?>>>CC?>CCCCCA>CC>>>??CCC???C>>CC??>>>>C>>>CCC>CCCCC>?lC>>lC>?C?>>CC>>CC?>?CCC?>CCCCClC>CC>>?CC??CC?>CCCC>???CC>>Cl?>CC>>?>CCC?CCCCC?CCC>>>>?>CClCCC>>ll>>>?>>?CC>??C??CC?>CC>>>?CC>>CC>>CC>>>>CC>>>?>>>lAC>>>=>>>A>CC>>CC>>>=>>>>>>>>>>>>>=>?==>C>=>>>=>=>>>=>>>=>==>>>>==CC>====>>=>>>>====>==>===A=======>===============x;Z! !qӳ666686666568566656666665666i66565566856i6666656686i586666666656666565666666666665666656i5556565666666665656566688586566665666686686666666688665656666666568666656i666666566666666666686665666666666666666656666566666688666656666656668666666666666658856666566665656685i565656666666666666856666686566666586666665666658666665566566668566866KKKKKKKKKJJJKKKKJJJJJKJJJKJKJKJKJKJJJJJJJJJJJHJJHJGGGGGGGFGFFFFFKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKDFFFFFFFFGGGGGGHGHGJGJGJHHJGJHJHJHJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJso==>==>====>>A>>C>==>C>=>>>>>>==>>>=>>>>=>>>>>CCCCC?C>>>>>=>CC>==C>=>>>>CC>>C?>=?l>>C>>lC>>>>=>CC>>C>>>>>>?>>>>CCC>CCClC>>>>>CCC>>ClC>>>>>ClCCCClCCllCC>?Cll>>C>>>?C?CCCClCCCCCC>>>???C>>>CllCCC>>>>>>>>>CCC?>CC>>>>>>>>CCC>>=>ClC>??CCClCCCC??C?>>>?C>>>CCC>>>>>?CCCCC?>C>>ClC>C>=>>CC>>?CCA>>>CC>=>=>>>>>CC>>>>>>=>=>>>>===>C>>>>===>AC>=>==>==>=>>==>>=>>>==A>===C====>>==>=>=>>===========!======z;Y!!  !!=sӳ86668666666566666666666666656586666556686666666866666656666666586565555665666556665666665666866665666666666656666556565658666665666666665666i66i665668666665666668656566866865566665566666656666565666666555665666766856666686566666866665666566666586656866666666656566866666666666666565658666666666665666656656668666866665666666665656666566666KKKKKKKKKKKKKKKKKKKJKKJKJJKWKKKJKJJJJWKJJJJKJJKJJJJJJJJJHJHJGHGGGFGFFFFFFEKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKFFFFFFFGFGFFGGGGGGGHGHHGHGHJHHJHJHJHJHJJHJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJso==>>>>===>>>>=>>>=>=>>>>>>>>>>=>>>>==>>>>>C=>>C>C>>>=>>>>>C?=>>>C>>>>>CC>>CC>>>>C>Cl?=CC?>AC>=>lC??>>C?>??C>>?CCC>>CClC?>>>ClCCC>>C>C>>>CCCCCC>C>>Cl>>>>ClC>Cl>>?C?C?>C?C?>CC?C>>CC>>CCCC>>CCC>CC>>?CCCC??CC>AlC?CCC>>?>CCCC>>CC?>>>>?CCC?Cl>>>>>>C>CCC>>CCC>>CCC>>CCCC>=C>Cl>>>>>>>CC>>?>>>C>>C>>>>>>>>=>>?>=>=>>>>>=>C>>>>>>>==>>>>==CA==>=A>>C====>>=====>=>===>===>=========>>==========$$======z@Y =}׳6566666556656668666666666556566566665665i666665686655566688656566566666666i56666665656685666668865656586666566668566558558656566656666666656666i666566866656566666686666686666666566665666866666666868866666565666666666568665566668656666666666666566656665665666666666666566568666666665668666665666666666556685666666666668656666KKKKKKKKKKKKKKJKKKKKJKJJJJKJKJJJJKJJJKJJJJJJJJJJJJJJHJJGJGJGGGGGFFFFFFFKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKDFFFFFFFFFGFGGGGGGGHGHGHGJGJHGHHJHJHJHJJHJJHJJJJJJJJJJJJHJJJHJJJHJJJHJJJJJJJJJJJJJJJJJJJJJJo?>CC>>==CCC>>>===>>====>>>>>?>=CC>>=>>>C>=>==>>>===>=C?CC>>>=>=>C>>C==C>=>CC>C>=>CCC>=>?=>CCC>>>>>C>>>>>>CCCC>>ClC?CCulC>llClCCC?>>?>C>>lCC?CCCCC>ClC>>>?C>>lCC?CCC>>>>>>>>C>C>>CCC>>>CCC>>>???CCC?CllCCCCCC?>>CCClCCC>>?CCCCCC?>>>>?>>>>C??>>>>>CC>=>CCC?>>>>>>===>>Cl>>>CCC==>=>>>C=>CC>>>>=>>>>C>AC>>>>?>==>>>>>>>>>>=>C>===>=>==>===>>C>=>>C>===C>======>===>>====>>=====>>>===>================z@Y  qӳ6566666556656666656666656856666656666866666666656665666666666666566686565666666656668666666666666666666665666i66665i668665666666666666566686665666666668665666666866666668666665666658666668658665666666655656666666566686866666666666566666665656665668666666666566566656686686556656665566665i866866668686666586666666566666666666KKKKKKKKKKKKKKKKJJJKKJJJKJKJKJJKJKJKJJKJJJJJJJJJJHJJHHGGGGGGGFFFFFKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKFFFGFFFGGFGGGGHGHHGJGJGJGJHHJHJHJJHJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJp>>>>====>C>=>C>>=>>===>A>A>=>>=>>>>=>>>>>>>>=>C>>>>>=>>>l>>>>>>>C>>>>>>>>>Cl>>>>>>>>>>CC>>?C>>>>>>?>>>>>>CCCC>>CC?CCCuCC>ClC>>C?CC>>>>?CCC>?CCCCCC>>CC?>C>CCClACC>>CC>>>>C?>CCC?CCC>=?CCC>>>??C?CC?ClCCC>???C??>CC?CCC>>Cl>>CCC?>?>>CC>>CCCC>>>?>>>>>=>C>>>>>>??>>>>C>C>>>C>>>=>>>=>C>>>>>C?==C>>>>>CC=>=>>>>>>>==>>=>>>>>>>>=>>>==>>====C>=>==>>>>=>===>>==>=>===$=C======>=>======================x;Z  !!=sӳ66686656666656666656566666666666656866565655656666656666565686566656666866656666i6665665566566656668656656656666666866666866686666656666668866566866565666565665566665666566665566665666565688656666666566656666668665666656666865656685666656866668668668568666886666656665666656656656656666666666666665665656866565i686566665868666686KKKKKKKKKKJKJJKKKKKWKKKJKKJJJJJJHJJJJKJJKJJJJJJJJJJHJHJHGGHGGGGFFGFFFDKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKFDFFFFFFGFGFGGGGGGHGHGHGJHHHJHJHJHJHJHJHJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJo===>==>>>>==>CC>>>>>>>>>>>>==>>>>>>A>>=>>>>=>>>>>CCC>>=>CC>>=C?>>CC>>>>>==?C>>>=>>>>>>>C?=>?>>CCC>>>CCCCC>>>>==>C?>>?Z>>>CC>=>>=>CC?>CCCl>>?CCC??l?>>CC>?CC>>CC?>=llCCCCClC?CllCCCC>>CCCCC>?>>CC?>>>C?>>?>>=?CC>CC>>>>>?C>=>?C>>>CCCCCC>Cl>>>>?CC?>>>>>>>>>>CC>>>>CC>>>==>C=>C?>>>>>C>=>=>>>=CCC>==>>C>>C>CCC>AC>>>A>=>A>==>==>>==>>==>>>>==>>=CA>>=>==AC>=>>==C>===CA====>=>===>>==========>C==$$==z@Y $pӳ86666856666666656666666686656668666656668665666666666666656666666666666656666666656666i65666666666656556656865666668i666865655666666668666665566666665686i5686566666666865566666656666666566i666566566685665665656666666665666656666668666656656666656666656656866656656566866566666665666668665866666686656866666566665665666666656666KKKKKKKKKKKKKKKKKJKKJKKKKKJJKJJJKJJJKJKJJJJJJJJJJJJJJHJJHJGHGGGFGFFFFFFFTXXXXWXWXWXWXWXWXWXWXWXWXWXWXWXWXWXWXWXWXWXWXWXWXWXWXWXWXWXWXWXWXWXWXWXWXWXWXWXWXWXWXWXWXWXWXWXWXWXWXWXWXWXWXWXWXWXWXWXWXWXWXWXWXWXWXWXWXWXWXWXWXWXWXWXWXWXWXWXWXWXWXWXWXWXWXWXWXWXWXWXWXWXWXWXWXWXWXWXWXWXWXWXWXWXWXWXWXWXWXWXWXWXWXWXWXWXWXWXWXWXWXWXWXWXWXWXWXWXWXWXWXWXWXWXWXWXXXXFFFFGFFFFFGFGGGGGGHGHGHGJGHGJGJGJHJHJHJJHJJHJJHJJJHJJJHJJJHJJJHJJJHJJJJJJJJJJJJJJJJJJJJJJJJo>==>==>>==>>=>>A>>===>>=>>===A>>>>>>>C?==A>>C==>>Cl>>>=>>>>>>>>>>C>>>C=>>>>>CC==>>>>CC>>>>>CCC?>>>>CC>C?>C>>>>>>>CC>>u>>C>>>?>>?>CCC>CCCC?C?>?C>Cl>=??CC?C?>>C>>>>>CClC=?l?>>CCCC>>?>CCC?>C??>CCC>>C>??CCC>>>CCC?CC>>?>>CC?>>C>=CACCA>>>CC>>>>>CC>?=>?>>>>>>CC>>?>C>=>>>>>C>=Cl=>>>>?>>>=>>=C>>>>>>=>>>>>C=>>>>>==CC>==C>==>>==>>>>>>==>===>===>A=>====>C===>==>====>>=====>====>============>=====$x_;Z $p׳6666666666666656566565666566668665655666666666856666666686656666666666656566666566666566866656656665686566666666666666666565666586686666565656666666666i6666566666666656666666566666666866665i65i6566666866668666866566865666668666656566666566666668566665656666666666666666666566656556566666656666656686666566666i66866566666665686656i665666666666565666i5i666665656666655665666KKKKKKKKKKKJJJKKKWKKJJKKWJKJKJKJJKJKJKJJJJKJJJJJJJJHJHJGJGGGGFGFFFFFFTXWXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXbXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXHFFFFFFGGFGGGGGGHGHGJGHGJHHJGHJHJJHJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJӏm=========>>>===>>=>=>>==>=>>>?C>>>>==>CC>?CC>===>CC>C?>>C>CC>>>CCC>>CC>>CCC=>>=>CA>?C>C=>>>CCCC>C>>>?>>>?CC>>?>C>?C>>{{>>>>>>ClCCC>CC>>>>>CCC?>>>C?>>C>ClC>>>>?>ClCCCC?>=?CC>>?C??>>>?C>>ClCC?C>?>>CCCC>>>>>?>>>>>>>>>>>>ClCC>>>>CC>A>>>=>CA>>=CCCC>>CC>?>CCC>>>>C>>>>AC>>CC>>>C>>>>CCCC=>>ACC?>==>>>>==>C=====>>>=>>==A>>=?>====>A>>A>>?>=>>=>======>==C>=>C>======>==$==>>===$========>=========$$$x@!Y  qӳ6666568666666556666666656666665666686665666655566656665856668866665666666566665666656686566i666656566866568566666656666666665i65668656565i8666666666686665566666686666865568656566665666666666666666665668666666656666666566666656665i55666655566666665656566556556666866656666666566656666665666566656586666666566666566666666866666565656666666666665666i556656666656686665666658XXXXXXXXXXXXXXXXXXXXXXXXXX^XXbXbXbVbXX^X^XX^XXXXXXXbVbVXXXXXXXXXXXXXXXXXXWXXXXXXXXWXXXXXXXXXXXXXXXXXXXVXXVXXVXVXXXVXVXVXVXVVVVVVVVXVXXX:VVXXXVXTVVXTXUXVVX:XTVVVVXUXXTXTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTXTXTXTXTXTXTXTXTXTXXTXXTXXTXXTXXTX}j=>===>==>>==>=>=>>=>=C>>===C>>>>=>A>>=>CC>>>>>=>=>>>>?=>>>C>C>=>CC=>lC=>C?>>>>>>AC>C>>>>>>>>>C>C?>>CCC>>>CC>>?C>>C?>>z>C>>C>>>lC>>>?>>>>CC>??>>>CC=>C>CCC>>C?>?=CCClC?>>C>?C>C?>>C?>>C??CCC>>???C???>?C>>>??C>?C=>CC>>CC>CC>CC>?CC>>>>>>>?>C>>>CCC>>C>>C>>>C>>>>>C>>=CC>>C>>C>=>>>>>CC>>CC>>>=>>>C>>>>==>>>>==>A>>=>>=>?==>>>>===>>=>>=>>==>>=>========>>=C===>=========C>=======>=$==>=============x!;Z! q׳6666666566666666666566666666666656656666566665656685668688666856666555665655666665665666566566666666686566566566666666665666566566566666666666566568655566566665655665666666656666665666656666566666668668668656666656666666656666566666566666666665666666666665665656666666665666665666665655668i8668666565656666685656666566656565566i665688666656686565666666666666656666656TTXTTXTTXTTXTTTVTXTXTXTVTXTTTTUTTTTTTVTTTTTTTTTTXTTUTTTTVTUTVTTUTTVTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTT"T:T"TTTTTTTTTTTTTT"TT"TTTTT"TTTTTT"TTTTTT"TTTTTT"T"TTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTT:TTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTT:TT:TT:TT:TT:TTso>>==CC>====>>>===>>=>A>===>CC====>==>>==>>>>>>>>=>>>>=>C>>>>>>=>>>==>>==>>>>>>>=>?CC>>>>C>>=>CCC>>CCCCC>>CC>?CC?>>>>?u>>CCCC>>>>=>>>>>>>>>>>>>>>?>>?lCCC>>>CCCC>>??C>>CC>>>CCCC>>?C>>?CC??C>=>?CCC>>>>>C>CCC>A>C>>lC>>CC?>>CCC>>?CC?>>>>C>>>>=>>=?C>>>A?C>=CA>>CCC>>>??>>==>>>=>A>>>>==CC>===>>>C>=>>>=>>C>>>>>>>>>====>===>>>>>>>=====>>>>>===>C>>=======>==CC====>=>>>>===============$==A========z;Y !! $sӳ666665i656666686866i6556666686666666656866666665666666666666566666666666666665666566655665666556566656666665i5666666666656665665665666i5665666666666666666566666666666666656566666566665665666666556665665665666666668666866666656666666565666666666666586656566665666666556658i6666665666665686666666866666655666666666i66665565566565666666i86565666666566566666668655i686665666566666TTTTTTTTTTTTTTTTTTT:TTTTTT"T"T"T"TTTTTTTT""T""T"T""""""TT""T":TTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTM so=>===>>>===>>>>==>==>>>>>>=>>====>>==>>==>A==>C>>>=>>=C?>=>>=>?>==CA=>>=>>>C>>>>>>CC>>>??>>=>>CACC??>CC>>>>CC>C>>>>>CuC??>>>>>C>=>CCA>>>CC=>CC>>>>>ClC>C>?>>CCCC>CC>?=CC>>>CCC??>Cl>?>CC>CC>>>CCC>>CC>>>C?C>C>>>>>Cl?>CC>>?C>>>>?CCC>>>C>C>>>=>>>CC>>C?>>>>CC=>CC>>>C>>?>>=>>>>>>>>>>>=>C>>>>>>C=>>>>>A=>>>>>>=>?C>==>=>==>=>>>>>==>====>>===>>=>>>======>===>>>======C>======>====>============$$==z @Y !=sӳ66666656666666665656666i86666566666665566565666i6665666556666556666565i8666666i66666666566666665665665655566666666566566666i6665665666i665666655666656656666666665666666666656566556666665656665666i686666666866866665666665666666666556686566566i666566666666686666686666665656666666666666686556666565666566686566656565665666668666666866666666666666656656666666668666665656666TTTTTTTTTTTT"":TT"T"TTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTo>>==>===>=====>=>========>==>=>CCC?=>=>===>===AC>>>=>=>===>>=CC>=>lCCA>=C>CC>C>>>==C>>>>>>CCC>=>>>>>>>=>>>>>>>=>CCC>>Cu>>>=C?ClCCCCCC?=>lC>>lC>?CCC>>CCCACCCCC>>>>>>?>>CC>>C>>C>>CCCCC=>>CCCCC>>>>>>C>=>?CCClC?>=>?>=>>>>?CC>>>>>>>C>>>>CC>>C>CCCCC>>>>>>>>C>==>>=CCC===>>>>CACC>>>=?>>>=>>>>>>======>CC>====>==>>=>C>>A>>=>>C>>===?>=====>=>======>=>===A>=======>===>================A============x@@ !  ! =sӷ856666666665886666565665656566666666566666666665586665666565566666566566i56656566656666666i666666566666666666666666666655658i5666666666i666556656566665666566565666865666666566i6666666666566866666656666656566665866566668655666686586688666666666666666665i565666666656686656866666666666666656666666566656665666665666566666565i6565565666666565686656566666666665666665656666666656TTTTTTTTTTTTTTTTTT"TTTTTT"TT"TT"TTTTTTTTTTTTTTTTTTTTTTTT l>>===>==>>===>===>====>=>==>==>>>>>=>>====>===>>A>>===>>=>>C=>>>==CCCC>>>>>C>>>=>>>>>C>=>>CC>>>>>>>>?>>>C>>>>>>>?CC>=A{>?>>?>CCClC>CC>>>C>>CCl>?CC>=>C?>?CCCCC?>>>>?>>>?C=>C>CC>>>CCC>=CC>>Cl>>>?>>?>>>>C?>?lC>>=>>>=>C>>>C>>C>>>>=>>>>>CCCA>=>lCC>>>>>>>=>C>>=>>>>C>>>=>>A>>>>C=>>>C>>>==>CA>>>=>>>>>C?===>=>===>>>>A>>>>==>>>>>==>>====>>==>====>=>===A=====A======>====$=>===========A==!$=======x#Y!!!=qXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXbXXXXXXXXXXbXXbXX65655665665656666656566656666666656665656666566666666666686565566666666556688566i6666686666665666666665665665656666666i666566566566668665666666568666566666656666665566566566656i5665666665665666665666666665666666866665655666666666866656565668866666666566656666666565655668866866i566665565655i6666666656666666666656666566656656665685666566666666666666665566566"T""TTTTTT T"TTTT""TT"TTT""TT""TT"""TTTT""TT""TT"""TTTT""TT""TT"""TTTT""TT""TT""TT""TT""TT""TT"""T" ӏo=>>=>>====>=>>==>CC>>A>=>>>>>==>=>=>>>CC?C>>>>=>>=>=>>>>>CC>=>>>=>>>===>>>CC>>>CC>>>>C>>>=>>>=>>>=>>=>>C>>>>>>CC>>>>>C{CCC>>>?>?C>>=>?>>>CC>?>>>??>=C?>=?CC>=?>>CCCC>>?>>=???C>>CC>>>>=?C>>CC>>>>>>ClCCCC>=>>>>>??CC>>>C>>>>C>=?CCC>>C>=>C>>>=>>=>>>>>>>C>>>>>>CC>=>=>>>>>C>>=>==>>>C>>C>A>>=>>>>==>>=>>>>>>>>?>>>>====A>>>====>=>>>==>==>>>>>===>>===$>>=====>============$==========$$=====$$=====x[   pTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTT66656666656666665665666656686666656665666665666665666666666i66666565666556686i66666566656i666656665566565666666666565656i66655665666666656666666566666666666666666666656565656656656666656665665665666666666556556i56666666656656656565656666666656665686666i556556566666656i56658665685665666666665566686666566666656666656665666666656666665666666565666568866566665666656666TT""T"TTTTTTTTTTTTT"TTT"TTTTTTTT"TTTTTTTT"TTTTTTTT"TTTTTTTTTTTTTTTT p==>========>==>=>AA>A>>=>==>>=>=>=>==CC>>>>>>==>>=>=>C=>?CC>>>>C==>>>==>>>C>>=CC>=A>>>>=>>>=>C>>>?>==CC>>>>>=>>CC>C>>CuuC>>>>CC>>>>>>>>>>?CC>?=>??C>>C>>>CCC=>>?C>C?>>>>>>?>>>>>>C>>>>>>>>>>>>>>>>CCClCC?>=>>>=>CCCC=>C>?>>>>>>CCC>>>C>=>CCC>>>==>=C>>>=C>>=>C>CC>=C>=>>>>>>===>>=>>>>AA=>C>>>=>CC==>=>>>?>===CC==>>=>>>>=>C>====>=>==>==>==>>===>=>=$=>>===>=====$=======$=====$===================x!!  =qTTT:TT:TT:TT:TT:TT:TT:TT:TT:TT:TT:TT:TT:TT:TTTT:TTTT:TTTTT"TT:TT66666666666656556666656666666656566666656666666666666666656656666566666666668666665i66666656666656686666666666665666665666686666666666566666568666656666665666668665666566656i6665666666565656666666666666666665666668666666i656666666666666668566666i66666655656666666566666666686886666656666666665666666666566666666666656666566666666666666666666566666665666566565566666666666656666T:TTM""TT  TTTTM""TTTTM""TM""TM"TTTTM""TM""TM"TTTTT"TM""TM"TTTTM""TT"TT"TM""TM""TM""TM"T  q===>>>>>==>>===>=====>>===>A>==>>>>=========C>=>>=>C>>=>>=>=>C>>=?C>=CC>===?>>>C=>CC>>>>CC=>>CC>CC>=>C>=>C>>>>>C>A>>>A>CC>CC>>>>>CC>CC>>>>>>>>=>?>>CC>>C>>C>>>>>>>>?>CC???>CC>C>??>>>>?>>>>>?C>>CC>>>>>>>>CC?>CCCC?=>>CCA?CCCC>>>>>>C>>>>=>>>?=>>?C>C>=>>C>=>>=>==CCC>>>>C>=>>>>>lC=>>===>>===>>>===>=>A>=>>=>>====>>=>==>>===>=>=============>====A===========>>====>=====>====================!$$z; =}TTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTT8686666656666666666665656665666686686i6566666666666666566666i666666566665666666666666666i65656666666656666665668666866666666i6656656666666666566666666668666666566666566666666i6666665666656656666668666666666666i565666665566668666666666665666666666666866666566666666656666i5665666666666666666666666666666566666666666666665666565666566666666666i666666566666688656866666666TTT"TT  TTTT""TTTT""TT""TT""TTT""TT""TT""TTTTTT""TT""TTT""TTTTTT""TT""TT""TT""T  q==>=>A==>=>===>======>>>===>>>>=>==>>====>>=>>=>>>CC>>>>>>>=>C>>>A>>>AC>>=>C>=>>>=AC>>>=>>>>>C>>CC>>>?>=>>C>>>>?C>>>C>>{u>CC>>>>>>CCCC>>CC=>>?>>?>>>C?>AC>>?>>>>>=>CC>C>>CC>>C>A>>>>>>CCC==>>>>C?>>>>>>>>>CCCC>>C>CC>>AC>>>?CCA?A?==>>>>>>>>>>>>>=>C>A>>>=>C>>>==?>>A>>>=C>>>>>>=ACC=>=====>>>====>>>>=>>A=>>>====>=>>>=>>>====>=>>=====>============>==============>=======A=$====>======$======$!$z !  $}6656566666665666668666666666i866i666666866666566856666668566566666665665666666666666666i666656666666865666566666666i8556666666668666666666666686656686666666666656666666665666665666566665666666656665666656666866666666666666666866666656666666666665656565i656665656668i66666i56666565656666656666666688886666666665666666666666666665666666666666866656666666i665686i8i66566666"T     o===>========>==>=>>>>>==>==>===>===>>>>=>AC===>>>>>====>>>=>>==>=>CC=>>>=>C>==>>=>>C>>==>C>>CA>==>>>>CC>=>?CC>>>>==>>>>tA=>>>>C>>C>>>>Cll>>>C>>?C>=>>>>>CCC>>>>>CCCC>>>C>>==>C?>CCCCC?>C>>CCCCCCC>>?>>>=>>>C>=>=>>>>?C>>>??>>>>>>=?>=>C?>>?>=>>A=>CCC>==>>CC>C==CC>===>=>C>A>>===C==>=>>>>>>>>>>>>>=====A>>>==>>==>>>>==>==>=CC>>>=>>====>>====>=======A======>=====================$$!=====!==$===x ! @ !q668666566666666665666666666866665i6i6666666668666665666665666666656566666666566666666666656866666565668666665666568i6665666566656665666866666666666i8666666666656666566666666666666666656666666566666666666666666666686666866666i8866668666566566565666666668666666566566666666866566665666656666666666666865666656666655666666666666666666566656666666666666666656665666566666666666566   o==>=====>====>>====>==>==>>===>>>==A>>>==CC===>>=>C>=>>=>>=>?=>=>=CC>===>=>>=>=>>>>C>===>C>>AC>>>=>>>CC>>>>>>C>>>>>>>>>>u=>CC>>>>>>=>CCCC>>CAC>>C>>>>>>>CC>>>>>>CCAC>>>C>>>=?C>>>CCCCC>>C>>>CCCC>?>>?>>>>>>>>>>>>>>?>>>>?CCC>>>=>>>>>=C>=>CA=>>>>=CCC>>=>>=C?>A>>C>=>=CC=>>>?=>>>==>>==>C>===>>>A>=>====>>>>>==AC==>>>==A==>=>C==>C====>==>>==>========>=>=>====$!=>=======!====$=========$$=======xx ! !   $pTTTT""TT""TT""TTT""TT"TT"TT"TT666566666666668i66656666656656666566656656666665656665656666666566665666686566666566666566i66666666666666666666686i66666666666666656i666656656656666666566666666568666686665656665666668656666665666665666686666666666656656666666666666i6666666666666666666i6666666666665666666666666i665665666656666665666666666666666656686666666666666666566666566666666666666866666666       m=========>==========>A>==A>==>===>>>A>>==CC==>A==>C>=>>>A==>>>=>==>==>>>>>CCC>C>>=>>>>>>>C>==>>=>>C>>>>C>>>>>>>>>>>>>>>>tC>C>>>>>C>=>C?=>>>>>>CC>>>>>CC>>=>CC>?CC>=>>>>>>>=>CC=>C>>>>>>>?>C>>>>>>>>>=>>C>>>>>>>>>>A>>>>>>>>>>>>>>>>=>C>==C>>=>C>>C>>>>=>C>====>>>>=>C=>CC>==>==>>>?C>=>?=====>>>>===>=>=>======>C>======>>====>====>=>A========C=>>===>====>====>$=============$$==$=====$======!=={!;!qTT66666886665666665665666656666568666665665656556686666866666566666666656668656666666666666566665666666666656665666666666i56666868666i6666586666666665686566656666685666566666668666665i6665665666656666566666686666656i6566666666666666666586566666656686666665i86666586565656666666866566666656666666665666666668665665866666666566566i66666656668686668665666566666568656866656566686566656668668666666565668666668       l=====>====>=========>C>==>A>==>==>>=>>>>>>>==>l===C>>>=A>>>>>=>>==>==>C>=>CCCCC>>>=>>>C=>>>==>>>>?CC>==>C=>>>AC>>C>>>>=>>C>>==>>>>>C>>>=>?>=>C>>>>>CCC>=>C>C>>C>>>>=>=>C?=>lC>=>>>?>>>C?>>>>>>>>>>>=>CCC=>>>>>=>?>=>>>>>>>>C==CC>>>>A>=>AC>=>C>>>>=>=>>>=>>=>=>CC==C=>C>>=>>>==>=>?>>>=>====>A>===>=>>=====>==>C=============>>======C========>==>==>===$=====C======================$==$!=====!$=z;@ $q"T"TTTT"TTTTTTTTTTT5668686655656666666665565666656666566666665566666666566666666666666866686666686666566656566656656668666666666656i566i6668656656566666665666666656686566686666666666666666666656666i66656i6i66566668666666566685666666566656656566665666666566665668666666566656566566666668566566566665668666565666656668666656666666668566656666566565666566566656666665666666656666i666566666566666666666566566565666566686866    HHHHHHHHGHHHHHGHHHHHHHHHHHHHHHHHGHHHHHHHHHHHHHHHHHGHHHHHHHHHHHHHHHHHHHHHHHHHHGHHHHHHHHHHHGHHHHHHHHGHHHHHGHHHHHHHHHHHHHHHHHHHHGHHHHHHHHHHHGHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHGHHHHHHHHHHHGHHHHHHHHGHHHHHGHHHHHHHHHHHHHHHHHHHHHGHHHHHHHHHHHHHHHHHHHHHHHHHGHHHHHHHHHHHHHHHHHHHHHHHHHHH     l=====>=>>==>===>=============>===>===========CC==>>=>===>>C==>>>=>>>==>>>>>=====>A?>>>>>>=>=?C>>>=>>C>>>>==>>>>==>CCC=>?>CC>>>>>>>>>>>>>?C>>>>=>=>C>>C==>CCl>>?>>>>CC>>??=>CC>>>>>>>>C>=>>>>CCCC>>>>>>C>>>C>C>>>?>>=CC>===CC==AC>=>>>>C>>>>>?C>=>=>lC>>=??>=>=>>>=>>CA>=>C>=>>>>=>>>C>==>CA>>>=>=>>ACC==>=>====>==>===>=>======>==>==>============>=>======>==>=========!=====$=========!$=!==$$==xY! !  qTTTTTTTi66666666666656565666566665666566i666566666566668666666656666655566665666656665666666666656566666565656686666666686686656666566665665666666686665666666665665656666666666665666656656666656666665656666666i66666656666565666656665666565666666666666665666666665656566665i65666655666666i66866656566665666666i866686665666666666666656666666i666656666566666666666565656566i665666666666666666656666666666656565JJJJKJJJJJJJJJJJJJJJJJJJJJJKJJJJJJJJJJJJJKJJJJJJJJJJJHJJHJJHJHJHJHJHJHJHJHJHJHJHJHHJHHJGHHJHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHGHHHHHFHHHFHGTFHGTFHFHFGGHFHFGFGFFFFFFDFKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKFFEFDFFFFFFGFGFFGFFFFGFGHFGFGFGFGGHFHGFHFHGFHFFHFHFGHFGHFHFTo=====>=>===>>========================>=>=====CC==>===>>==>C>=>=>>>>>===>C>>>=>=>>?>CA>>>C=>=>CC>>>=CC>=>>>>=>>>>>=>A>>=AC>xC>>>>>>>=>>>>>>>?>==>>C?=>>>=>>>CCCC>>>>CC>>>?=>C>CC>>>=>>>>>>>=>CCCCC>C?=>CC>CCC=>>C>>==CC>>==CC>=>C>=>>=>>>>C>>>>>>>CA>C>>C>>>==>>==>>>>>>=>C>=>>>=>>>>>=>=>ACC===>>>>>C>>=====>====>====>==>>====>>==>=======>==>==>A=======>=========A=$======!$=========$==$!==!==x;_  =s656656666666566i6666666666666656665666666666666666666666686866666556566556656666666866566665656666666666666666666666666566686666566666666666666666666666666i56665665666566686885666i66668i666665666666666568666566566666666656666666666656666666666656666666866i666566566656666566666666666666656666565666666666666666666666i56666666665666665666566666688665666666665666666566666656666566666666668656668665666568566666KKKKKKKKKKKKKKKKKKKKKKKKJKKKJKJKKJJJKJJJKJJJKJJJJJJJJJJHJJJHJHJGHGGGFFFFFFEKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKEFEFFFFGFGGGGGGHGHGJGHGHHJHHHHJGJHJJHJJHJJJHJJJJJJJJJJJJHJJHJJJHJJJJJJHJJJJJHJJJJJJJJJJHJJo=>===>===$=====CAA===A>A>====>=>>=>==>>=>=>===>====>>==>==C=>>==>A>>==>====>C>>>>>====>=>==>>>=>>=>C>>>>>>>>>C>>C>>>>>=>>>CxCACCC>=>>>>>>=>>>ACC>C=>>>>>?>>A>>>=>>?l?>>>>=>>>>?=>=>>=>CCl>A?=>=>>A>==>C>==>>=>>==>ACC>C>==>>>>>>>>?>?>>>>C>>>=>>=>>=>=>>A=?>>>>==>>==>>====>C>=>>==>=>>>>>====>==>======C>==>>>=>===>===>>===>>====A>=======>==================$$=!=>=!=====$===$!=======!!====!==x !  !9q6666666586666666666665665656666566666666666656666655666666656866666656666666865666666656666666656666666566656666666666666666666656666656656668666665666666656656666i666i6656568666566666666686656666666566666i56666666666566666666866586665666666666i666666666566666666666686668666666666666666665666666665666865666566566566666686666666666666665666665866666666665666666656666666666666666666665i6666666666666566KKKKKKKKKKKKKKKKKKKKKKKKKKKKJKKKJKJKJKJKJKJJJKJJJKJJJJJJJJJJJJJJHJJGJGHGGGFGFGFFEEFKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKFFFFFFFFFFGFGGGGGGGHGHGJGJGHHJGJHJHJHJJHJJHJJJJJJJJJJJJJJJJJJJJJJJJHJJJJJJJJJJJJJJJJJJJJJJJo====>=========>A>>===>AC=====>>A>=>==CA=>==>==>=>=>>===>>===>=>>=C>>>====>==CC=>AC===>==>>>=>>==>CC>>>>==>>>>>>>CC=?C>=>C>=uCCCCC>>=>CC===>>>C>C>>>>=CC>C>>==>C>=CCC>>>>=>>=>A==>>>=>CCCC>>=>>==>>>=>>>>=>>>>>>=>CC>>>>>==>=C>>>C>>CCCC>>>>==>>=>=>C=>>>>CA>>=>>>=>==>====>CC==>>=>>>>>C>========>=>>=>>====C=====>==>=>====CA====>>>=======>=!$==========$$=====$$==$==========!======$!$=======x  !@! !q666666665665666866666666656666686666668666656665665666666666665666666666665666666668666666666666566686665666666565666665665666666666666666666866i66665656i6665666566566666665i66i6666665666566666866666665666566656566666666566665656666666666666566685686865666666666666666666668666666566i66665666668666866656666666666566666i6866665668688i6666666i6666665666666656666566668666666685665656666668i66666666656KKKKKKKKKKKJJJJKJJJJJKKJKJJKJJJKJJKJKJJJJJJJHJJHHGGGGGFGFFFFFKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKFFFFFFFFGFGFGGGGHGHHGHGJGHHJHJHJHJHJJJHJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJm==>========>=$====>=>==========>>====C>====>=>=>>>>==>==C>==>>CC====>>>>>>>=>>==>>=>C>>>>=>=>>>==>>==>>=>CC=>>>>>==C>=?CC>==zC=C>>>>>C>>C>>>>>=>>>C==>C>>==>=>C==>A>=AAC>=>>C>>>>C=>A>>>>>>=>lA>AC>?>>>>>?>?C???A?>=>>>>>C>>>==C>==>>>>===>==>=>>=C==>>=>==>==C>A>=>>C>=>==>==CA===>=>=>>==>>>=>===C>=>==>>===>>=>=====>=>==>================>=========$========$==========$$==$===9=!==!=====!$!xZ![   =q65666666666566666566666666666566866666656668666666666666i6866566666656568666666i566866656665666666666666666666566666666668666666656566656668i66i686665666666666656666666666666666666656666665666656666566566656666666666666666666666665656886666666666666656686666666686(%%8666656666666566656566556665666666656665666666666656666866i666666666565666566666666666665665686666666666666665656666665666KKKKKKKKKKKKKKKKKKJJKJKKJKKKJKKJJKJJKJKJKJJJJJJJJJJJJJJJHJGJGHGGGGFFFFFDKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKJKKKKKKKKKKJKKKKKJKKKKKKKKKJKJKKKKKJKJKKKKKKKKKJKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKEFFFGFFFFGFGGGGGGHGHGHGHJGHHHJHJHJHJHJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJo==========>======>=>=>====>====>A====CA====>==>==>>==>C>>C====CC>==>=>>>=>>==>====>>C>>=>>>=>>>=>===>====CC>>=>C>==>C>>A>>>>=x=>AC>>>>>C>>CA>=>>>>=>=>>>>=>>>C>=>>=>CCC>=>A>>=>>>>=>>>>>>>=>CCA>>CCCC>=>?CCC>>C>C>>>>>>>CC>=>=>C=>>>=>=>=>===>>=>=>=>=>===>==>>CC==>CC=>>===>>>>==>===A>>=>>>>====>=>=========>>=======>=====$=$==========================>>>=!=====>======$==!===$$!==!=$$===$=x@     =}ӳ66666666666656666i56566666666656666665666666665666666666566665666i6665656666666666566666656i6666566666655666666666666666666686666666666666656665656655666566666665666566666686666666666656566666666566668i668666556666i8656566656565686666666656668566666666666665565665% %(( 666666666666666666656666i665i6666668656665666666566666666666566666666666666666656666666666566i666666686666666666566i665656666666KKKKKKKKKKKKKKKKKJJJKKKJKKWKJJKJJKJKJJJJJJJJJJJJJJJJJJJJJJJHHGJGGGFFFFGFFFFKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK++++++++++++++++++++++++++1+1+1+1+1+1+1+1+1**********1+1************1************1+111**********1+************1+11*********1+*************1+***********1+KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKEEEFFFFFGFFGFGGGGGGGHGJGHGJGJGHHJGJHJJHJHJHJJHJJJHJJJHJJJHJJJHJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJo===========>>>========>>>======>==>===>=>====A>===C===>====>=>>==>>=>>A>====>>>>>>>>====>>>==>>>>>=>>>>>>CCC>==>>=>CA==>=>>>>CuC>C>>>>===>>>>>>>>>>>?>>>>?>=CC>>=>C>?>>>CC>>>>C>==>=>>=>>>A?>>==>>>>==>C>>>=>>>>>=>>>>>>C=>=>>>>=>=>>>>=>>=>C>A>>>>>==>>====>=>A==>===>>>>>A====>====>==>>>>===>==>=>==>>>>======>===>=====>========>==>===============================!!$=====!$$=$$$====!$$==x΂!  _[=qӳ66566565i6566668666566666666666666666665666666666666666666666666666666665666666666666666566566656666666666666666666666656665666668i6666666666666565666566666665666666666565666666566666666666566666656656666666686666666656666665666666666665666666666856%%%%666% %% % %%6666666666666666666666666656666666665666666658666666656666666666666666666666i666666686666666656666666665665666656666i666666666KKKKKKKKKKJKKKKWKKKKJKJJJJKJKJJJKJKJJKJJJJJJJJJHJJGJGHGGGFGFFFFEKKKKKKKKKKKKKKKKKK++++++++++++++++++++++++++++++OOOOO0O202020202020202022*Q*4444444444244444444424*++++++++++++++++++++++++++++++++++++++++++++++++++++++++KKKKKKKKKKKKKKKKKFEFFFFFFGFGGGGGHGHGHGJGJGJHJHJHJHJHJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJӟp============>>>=>==$===AA===>>===>>====>=>===>>====>=========>===>C>=>>>=>====>>>>>>==>==C=====>C>>=>>>=ACCC>==>C==>>>>===>CCACxCC>>>>==>>>C>=>>CC>=>CC>C>=CCC>==>>CC>CC?>>>C?=>=>=>>=>>>>A==>=>>>===>>>>>>>>=>>>>=>=>AC>=>===>>=>>=>=>C>=>lC>>>>>>>>>>=>=======>C====>>>C>>==>=========AA====>===>>>=>>=====>===========>>>>=>>==>=>=======>=========$$=======$====!=$$$=>=$$$=!$$$=$==$=!=$$xς;Y!  !   !  qӳ66666666665666668666665668866666666666566666656566566666666666666566686666666666666665666666566666668868666668666i6666666656566686666666866686666666666666666665666556656686665566866666566666666656665i6666566666666666666566666666666666666666666i66666565666666565%%% 68%% %%% % % 66566666656565666666666566666666666666665666666666i65686566668665686666665656556666666666666666666i666666566666685665668868KKKKKKKKKKKKKKKKKKKKKKKKKKKJJKKKKKJJJKJHKJJJJJKJKJJJJJJJJJJJJHJHGHGGGGGFGFFFFFKKKKKKKKKKKKKKKKKKK+OOOOOOOOOOOOOOOOOOOOOOOOOOOOO042O2O22222222222222220**4444444444444444444Q4*++++++++++++++++++&+++&++&+++&+&+&+&+&+&+&+&+&+&&+&&+&&+KKKKKKKKKKKKKKKKKKEEFFFFFFFFGFGGGGHGHGHGHGJHHHHHJGJHJJHJHJJJJJHJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJo=======>===============>=========A>====>======>>>===>>=>>=>>===C==C>====>>=>===A==>>>A=>?CA>>>>>>>>>>>>>===>>==CC>>>=>=AC>=>>==C̛xC>>C>C>>>==>=>C>=>C==>>>C>>===?>C>=>=>=>=>>>>>>>>>>>>>>>=>>>>=>>?>=>>>>C>=>A>>>==>=>>=>>A>=>>>=>>>>>>>==>==>>====>>>===>>A>>>==>====>=====>>===>>=>==>>=>===========>=>>=====>>>===================================$=============$$===$==$$====$!=$======!!xÂ;BY  $qӳ6566656666666666665666i66666666656666666566566666686666656666666566566666666666656666666666666666666666686665686656686666666i8666565666i666666666666566666668666666656656666i6665i8668668866665656666i666665666665865666666666666666666666666666666686666666666(%% % %%%% %%%%%% %%(65666666665666868666665666586666i56666i66i66665666565666666666666666866666666666666666666666665666668666686666666666666666666666KKKKKKKKKKKKKJJJKKKKKKJJKJKJKJKJJJJJJKJJJJJJJJJJJJJJHJJHJGJGGGGGFFFFFGFKKKKKKKKKKKKKKKKKKK+OOO4OO4O4OOOOOOOOOOOOOOOO2OOOO2O2422222222222220231*44444444444444444444444444444*++++++++++++++++&+++&+++&+&+&+&+&+&+&+&+&+&&+&+&+&&+&+&+KKKKKKKKKKKKKKKKKKFFFFFGFGFFGFGGGGGGHGGHGHGJGJGHHJHJHJHJJHJJHJJJHJJJHJJJHJJJHJJJHJJJJJJJJJJJJJJJJJJJJJJJJJJJJo==>=========$======$=====$=====$=>>====A>>====>>====>>==>==>==>>==>>====?==>>==>>>==CC>=ACCC>>>C==>=>>>>===>>>=CCC>>===>>?>=>>==>ǝ{xuxuuuuuuxuuuuuuxuxuuu]uuuxuuuuxuuu]uxuxuuxuxuuxuuu]uxuuuxuxuu]uxuuuxuuxuuxuuu]uuxvxuuuuuuuxuuxuuuuZuxuuu]uxuxuu]txu]uuZuxuuuuuZuu]u]uuZuuxuuu]u]uuuu]utZuZZuu]u]uuu]uu]uxutZZuxuZuuZZ]u]uZCZZ]uZ]uuZ]uZu]uuZZZuZ]ZuZZuuZZZZZZZZ]]uZZZ]uZZZZZZZZZZZZZ̖d@ ! [!!q׳6666686666666666666666568666666i6666668666666666656666666665666666566666666666666666666666666666665666665666666666666i6i86656666666666666666666666666666666666668666666666666666666666666i86666i656665666665665666666666666666666686666666666666665666%%%%%% %%% %%%%%%% %% %(66866666666666i666666666666i6566666666656666656666666666666568i666668666656666666566566666666666666666566666666666666666i8KKKKKKKKKKKKKKKKJJKJKKWKKJJJKJJKJKJKJKJKJJJKJJJJJJJJJHJJHGJGGGGFGFFFEFEKKKKKKKKKKKKKKK+22O4OO4OOO4OOOOOOOOOOOOOOOOO2O2O2222222222222222220**411144444444444444444444*++++0++(++(+&0&+(++&0&+&0&+&0&+&+&+&+&+&&+&+&&&&+&&+KKKKKKKKKKKKKKDFFFFFFFGFGGGGGGHGHGJGHGJHHHJHJHJHJHJJJJHJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJ}m==============$$==============>==A=====>>========>>====>A>>===A>===>>>===>>>>>>==C==>C=====>===>>=>>>>>==>=?>==>>=>==>>>>>>==>>>A>xߖxx_xdz_x_____x_x_dx__xdx_x__dxdx____dx_dx___d_ZY@; ; !qӳ68666i6668666656i6i66i6666666666666666666566666668656566666666656666i6656666666666666666666666666666666666666i6565666i6666666666666668666656556666666666666656666i668666656666i66666i88666566666666666666i666i666666666666666665666i886566666666666666665% %% % % % % % % %% % %% %%6666666666666666666666666666666666666666656666666665666i66666666666666566666666656666666656666666666666566666666i66i5666KKKKKKKKKKKKKKJJKKKKKKJJKKJKKJKJJJJJKWJJKJKJJKJJJJJJJJJJHJHGHGGGGFFFFFEKKKKKKKKKKKKKKKKKKK+4OO2O4O4OOOOOOOOOOOOOOOOOO2O2O2O2222222222222222031*14414444444444444444444444*+++0+++0+++0&++(+0&+&++&+&++&+&+&+&+&+&+&+&+&+&&+&+&&&+KKKKKKKKKKKKKKKKKKDFFFFFFFFGFGGGGHGHGHGJGHHGJHHJHJHJHJJJHJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJj$!$========>=$==$=======>A>===>=>?>======>====C=>=======>A====>=====>=====CA>C>==>>==>>>=======>==>A=>C>==>=>>========>>===>=>CC>>=u_===!!=$!!!=!!===!!=!!!!!!!!!!!!!!!!!!!=!!!=!!$!!!$!!!!!!!!!!!!!!!!!   Y =qӷ66i668666i6666666666666666i866668866666666666666666i666666666i86i6666666566656666666666666686666666666666666666666666686656656666656i666666666666666566666666656i6666666666666666666666666666665666i6i566666i68i66668666666i66665666i6i666666666(%(65%%%%%%% %%%% %%%% %% %%%%% %%% (666656656i6686666656i66665666666666666665666686656666666666666666665666666666666666666666666666566666666666866666666866668KKKKKKKKKKKKKKKKKKKKKJKJJKJJJHJJHKJKJKJJJKJJJJJJJJJJJJJJHJHJGHGGGGGFFFGFEFDKKKKKKKKKKKKKKKKKKK+OO4O4O4OOOO4OOOOOOOOOOOOOO2OOO24222222222222222022032*11**11**1***1*11*111*111111*11*11*11*111*111*11*1111*111******)***1*****)*****11*******)***)********************44444*+++++(++(++&++&0++&++&0&++&+&+&+&+&+&+&+&+&&+&+&&&++KKKKKKKKKKKKKKKKKKFFFFFFFFGFGFGGGGGGHGHGJGHGJGHGJHJHJHJHJJJJHJJJJJJJJJJJJJJJJJJJJJJJHJJJJJJJJJJJJJJJJJJJJJJJJo=$====================================>======>>====>==>>===>=>>===>>>>====>>==>=>>===>===?>>==>C>==>>>==>C>=>=>>=>>>>>=>>>>=>>>>>===C{]$=$!$==!===!!$!$!!!!!!$!$!!!!!!!!$$$=!$!!!!!!!!!!!!!!!!!!$!!!!!!!!!!!!!!!!!! !!!!! !!!!!!!!!! _  =qӳ66i6666666i8666666666666666666666665666666666666666666566666666i6666686666666666666666666668666i66666666666668666666666666666666668666666666666666666666686666666666666686666666566666666i6666666665i666666665666666i686i6666666666666666666866686i66( %%%%%% % %%% % %%% % % %%% % % %%6666ii666566666666666666566i6666i6666666666666666866666666666666666666666666i6665i66666666666i6666666656666666KKKKKKKKKKKKKKJJKKKWKKKKKKKJKKJJKJJJKJJKJKJJJJJJJJJJJJHJJGJGHGGGFGFFFFFKKKKKKKKKKKKKKKKK+42O4+++++++++++++++++++++++++++++++++++++++++++++++++11****44444*++++++0++++++++++0++++++++++++++++++++++++++++++++&&+&&+KKKKKKKKKKKKKKKFFFFFGFFFGFGGGGGGHGJGHGJGJHHJHJHJHJJHJJHJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJsj===$$$=========>=============>==============>A>===>===>====>==A==>==A=>>>=========>====>>>>===>CC>==>==>=CC>==>CC=>==>===CC>==>>>=====C]$=!!!=====$$$$!!!!!=$!$$!!!=!$!!!==!!!!$!!!!!!!!!!!!!!!!$!!!!!!!!!!!!!! !!!!!!!!!!!!!! !! ! _ !=q׳66666666866i666666666666866666666666i66665656666666i66666666666666666i866666866866666666i666666666666666666666666666656666668i66666666666i66666666666666566i6566666666666666666666665666665666666566666666666ii66666666666565668i866666i566( %%%% %%%% %% % %%%%%% %%%% % %% % 666666668666666666666666666i6566666666666666i666666666866666666666666666666666i666666668666666666866866666666666665KKKKKKKKKKKKKKKKKJJJKKKKJJKJJJKJKJKJJJKJKJJKJJKJJJJJJJJJHJHGJGGGGGFFFFFFFKKKKKKKKKKKKKKKKKKK+4O4O4+11****44444*ͭװ+&&+&&&+KKKKKKKKKKKKKKKKKKFFFFFFFFFGFGFGGGHGGHGJGHGJHHJGJHJHJHJJHJJJHJJHJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJ}j=========!=========>============$=====>====>>=====>===========?=====>>>>>A======>==>>=>===>=>>>>==>>>===>A>=>==AA==>=>>=>CC>=>=>>>=>=?C>ux==!!$$!$$!!$$!!!$!!$$=$!=$!!$$!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!! !! !!!!   !! ! !  #_! !qӳ656666666666666656666566666666666666666865866666666566666666i665i66666656666666666666i6666686665i6656666666666686666666666666666666666656666666668i86666666686666668i86666688666656566666566666666668666666666i666666666666666666566656666656666566656668666668656666655% %%%%%% %%%%% %% %% %% % % %%% %66656666666666566666686666665i66666666666666666668666666668666666666566666666866666566668665i66656666566666666656665666666666KKKKKKKKKKKKKKKKKJJJJKJKJJJKJKHJJJKJJJJJKJJJJJJJJJJJJJHJJGJHGGGGGFFGFFFDKKKKKKKKKKKKKKKKKKK+OOO+******44444*ذƭ+&+&&+&+KKKKKKKKKKKKKKKKKKDFFFFGFFFFGGGGGGGGHGHHGHGHGJGJHHJHJHJJHJJHJJJJJHJJJHJJJHJJJHJJJHJJJJJJJJJJJJJJJJJJJJJJJJJJ?=======$$=======>=======>==$$==$===$======>A=========>================>>>CA====>===>>==>====>>====>A>==>=>>=>>=>>>>====>A>A=>C>>>=>>===>AACxx$=$!$$!!!!==$!===!$$=!!!$=$=!!!!!!$!!!!$!!!!!!!!!!!!!! !!!!!!!!!!! !!!!! !!!!!!!!!!!!!! ! ! !   @!!!      q׳666566666666666666666666666668i6686656668665666666666666666666665656666666856666666666565656666566666666566565i566656866666566566566666666666668i66666i6566i5686666666i6566656666666668666666686666666666666666656666856566i6656666666565666666666666666666666i6666565 % %% %% %%%%% % %%%%%%%% %%( 6666668i66666656856i6665666666688666666666i6565666666666656666666666666666566666666656666656565i666666666666666666666i66656KKKKKKKKKKKKKKKKKKKKKKJJKJJKJKJJKJJKJJJJJKJKJJJJJJJJJJJHJHGHGGGGFGFFFFFFKKKKKKKKKKKKKKK+4O4O+11****44444*ح̰Ħ+&&&&&&+KKKKKKKKKKKKKKFFFFFFFFFFGGGGGGGHGJGHGJHHJGJHJHJHJJHJHJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJo=======!=============================>>=>=>===========>=>===>>=>=====>=>====>>=>==>>==>C=>====>>=>=====>>==>=>===>===>>C>==>>===>>=>=>>=C>=>=CuƔ_!   $qӳ666666666666656i566666666i6656666665665666666566666666666666665666666666665666665665666666666666666656666666i66665666i666666666i6666665666i66666566665666668666666666656666656656i666666566665665665666666565666566866666i5566i6i6666666666666665665666566665656656666666 % % % % %%%%% %%%%% %% % %%% %(66666666666665i666666666666666i86656666866666i666666666i65665i6866666666568i66666666666666565666666666656666666i66666666i66KKKKKKKKKKKKKJJKKJKKKKJJJKKHJHJJJJKJKJJJJJKJJJJJJJJHJJGJGHGGGGFFFEFEKKKKKKKKKKKKKKKKKKK+4OO+11****44444*װ++&&+&&+KKKKKKKKKKKKKKKKKKFFFFFFFGGFFGGGGHGHGHGHHGHHHHJHHJHJHJHJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJo========$====$=========!$====>>==>CAA>=>>=============>>C==CCA>>===>=========>>>>>==>>>>=>======>=======>>>=>>==>=====>>>===>=>>A====>===>>>=A>>>>ZCZ]xxz{x{zx{zz{{{x{{{{xx{{yx{z{{{xx{z{z{xz{xx{z{xxz{zxx{{{{xxxxxx{{{{{{xxyx{xx{{{xz{x{{{x{xz{xxzxy{{{xxxxzz{{{xzxxxz{xxxxxxxzxxxxz{{xxx{xxxz{xxxxx{xxzx{zxxxx{{zxxx{zxz{xxxxxxxxxxzz{zxxxzxxxxxxxx{zz{xxxxxxxxxxz{xxxxxxxxxxxzxx_xxxxxxxxxxxxxxxxxx_xxY  ! $p׷6666666565666i5666566666656666i6866666666666656i6856666666666666666666666866556666666665565668666666666666666666i6656686665666566666i656668666666666i656686i6656i6666i566666566566666665666665656i65666666666666666566666666866566566666i6666666666666666665i66665666665% %%% %%%%%%% % % %% %% %%% %% 6(6i86665666666556666665666666666656666685686666656666666666666566565i6666665666668i866666666666666666666566655666i66666656KKKKKKKKKKKKKKKKKKKKJKKKKKJKKKWKJJJKJKJKJKJJJJKJJJJJJJJJJJJJJJJHJJGJHGJGGGFFFFGFFFFKKKKKKKKKKKKKKKKKKK+OOO4+111*4**44444*ͮ+&&&&&&+KKKKKKKKKKKKKKKKKKDFFFFFGFFFGFGGGGGGGGJGGJGHHGJGHHJHJHJHJHJJJHJJJJJJJJJJJJHJJJHJJJHJJJHJJJJJJJJJJJJJJJJJJJJJJo=====================>=======A===>=>========>=======$=>=====>=====>>==>=>=>=>>===>=======>>>>=>A===>>===>>>>===>=>>=>>=>>=>>>===>==>>>=>>=A>=>==CA======>>>===A>=>=A==>>>=>=>=A=>==>>==>===>=>>==>>>===>>==>>A>==>>>=>>==@C>====>=>=CA=>==>C===>>>==>=>C====>=>>==>==>>==>A=>==>=>>====>A===>==============>=====>====$$=>===>=$=============$$>====$==========$=$!=$===$$$=$===!$$$===$=$!$==!!$$$$$!$$!!x;! ! 9qӳ66i65665665656656665666666566666666666666566666666666666665666665666666666666566656666566666i866666666666666666566666668i6666666666i66666666866656i56666666568i66865666666666666656666666666666i666666666666666666666656666665666666666666666666i56666666i666666665666i(%%% %%%% % %%%%% % % %%%% %%%%(6666666656666666566666566666688666666666666i65666i666666666665666666666666666666866656666666565i6i5686666666666666666656i6666KKKKKKKKKKKKJKJKKKKJKWKKWKKKJJJJJKJKJKJJJJJJJJJJHJJGJGHGGGFGFFFFDKKKKKKKKKKKKKKKK+O4O4O+)+****44444*ذͰ+&+&&+&+KKKKKKKKKKKKKKFFFFFFFFFFGFGGGGGHGHHGJHHGJHJHHJHJJHJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJl=$=!$==============$===$$!$==>=$=====$$==>=>==>===>>============>=A=====>==>===$===========AA>>C===>>>ACACA>>=>>>=>>=>>>>>==>=>=====>>>===>=C>>>AC>>>>>>CC>>==l==>========CA=>C>>=====>>>=>C>>>==>>==>>==>=>>>=>=>=>>=====>C>=>==A>=>>===========>>>C>>>====>=>>>====CC=>CC>=A>>>===>>==>==>>==$===>========$$==>=====$$==$===========>>==========$$===$$!========$==$=!====$!=$===!$===$=$=!$$==!$$!!$$!$!xY !  ! =sӳ666666656666666666i6666566666666666866i666666666566665656i6666666666666666666666666666666665i6666i66665666666666666666666566666566666666666666666566665666666i666i666666666666666i66i66666i6666666666666666666666i68668i6666666666656665666686668668666666i66666668655% % %%% % % %% % % % % % % %%%6668656666i6666666666666665666i666666666i68666666666666666666666666666566668566665666666666i66666666666656656666566666i666665KKKKKKKKKKKKKKKKKKKJKKKKKKKJKKJKKKJKKKKJKJHKJJJJJJJKJJJJJJJJJJJJJJHJHGHGGGGGFGFFFFFKKKKKKKKKKKKKKKKKKK+4O4O+111*4**44443*װ+&&&&&&+KKKKKKKKKKKKKKKKKKDFFFFFGFFGGGGGGGGHGHGHGJHHGJHJHJHJJHJHJJJJHJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJj=!========================================>===C===================>>=>$=A>==>=====>>=$==>>>====>=====A>>>====>=====>===>>==>>===>==>C==>=>==C=>=>>=>==>=>>====>=>=>>>=>C==>>=C=>==>====C>=>=>>>==>>==>>=>>>>=>==>=>>C>====C>==>>>>==>===>>=====>===C=>===>=====>=>=$=>>=>====>>===>==>=>====>============>=====>===================>=$=============$=>==$==$!====$!====$$$=$=====!=!===!!=$$=!$$$$!$$$$==$=xY!    !qӳ66666666566ii6668666666666i666666656666666666666666666i66665665666666666666666666666666666666i666656666666655666666666666656666666566666666666656i666666i6666666666666686i666i666i666i656666666666666i66i8666666i6566666666566i66666i5i66666i66666666666656666666i666((%%%% % % %% %% %% % % %% %%% %%% 66566666666666i566666666666i6666i666686i666666666i666666666i56666666666i56686566666666666666666665666666666666666566666i666KKKKKKKKKKKKKKKKKKKJKJKKWKKKKJKJJKJKJJKJKJJJJJJJJJJJJJJJJHJGJHGGGGGFFFFFFDKKKKKKKKKKKKKKKKKKK+OO4O+11**1*444431ѭͭ+&&+&&&+KKKKKKKKKKKKKKKKKKFFFFFFFFGFFGFGGGGGGHGHGHGHGJHGJGHHJHJHJJJHJJHJJHJJJHJJJHJJJHJJJHJJJHJJJJJJJJJJJJJJJJJJJJJJJJl$$=$==$========!$==A>============>============>===>=>==>C==>=======>>===CA==>>=>>>=>===>==>=====>=>===========>=>>=>>===>==>AA>=>>>C>=>>======>>===>=>C===>=>=>=A>=CC>>>C>==========>===>====>>>==>>==>>>CC>===>CA>=>>>>>>>==>>>=>===>==>CCCC>=>A>C==>=====>>===>>=$=>=======>===>>>============>>====>=>========================$===$=$$==$$===$=$$=A====!!===$==$===!=$!$!===!!=$!!$=!!!$==!!!==$=======z˂@! qӳ666666i5i6666i66666i66656666656666666566666666666666666666656666866i666i865666i6666666665666666565666666666666666666566666666i666656665666i666666666666(%%666666i8668666566i5668666i666i66666i66686866i66666i66566i66666666666666666656866666i666666666666666666i %% %%% % %% % % %%% %% % % %% 5666666666666666666666656i866666566666666i66656666566666866665656666666666666666666i6866666i666i6666666666666666666566i6KKKKKKKKKKKKKKKJKJJJKKKKKKKJJJJKJHKJKJKJJKJJKJJKJJJJJJJJJJJHGJGGGGFGFFFFFFKKKKKKKKKKKKKKKKK+4OOO++11*4*1P4O44*װͭ+&&&&+&+KKKKKKKKKKKKKKKEEFFFFFFGFGGGGGHGHGJGHHHJGHHJHJHJHJHJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJo==$======$=====$========================!=======>=======C=$=====$=======C>==>A=====A=>===>=====>=======>=====>===>>=======>=>>===>>=>====>>==>>=>=>>==>>=>===>==>=>C>>==>C=>>==>===>=>=?>====>>=>===>=>=>>>====>>>>>===>==>=>======>==>==>==>>==>>===C=====>=====>====A===$==>A===>=======A=====>======>============================$$====$==!=====$====>==!===$!===!===$$!=====!$==!$$!==!$$$==!$$=!!==!!$=x΅_B;   !! $sӳ66666666666666666666666666566666666i5i666666666666566666566666566i6686i66665i66i65666666665666i66666i66568666i5656566666i665666i66666666666666665(%(66665%'%(((((i86i56666666666i66666666i6i666566666i666666666666666566666666666666666666i66666666666686666666666i666%%% %% %%%% % % % % % % %% % 66666i66i66568i6666666665ii6666666666i8i666666666666666666666666666656666666666666666i666666566866656666666666666686666666KKKKKKKKKKKKKKKKJKKKKKKJKJJKKJJJJJJJJJJWKJKJKJJJJJJJJJJJHJHJHHGGGGGGFFFFEKKKKKKKKKKKKKKKKKKK+O4O4O+11*4)**4444P1װ++&&&&&+KKKKKKKKKKKKKKKKKKEFFFFFFFFFGFGGGGGGGHGHHGHGJGJHJHJHJHJHJJHJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJso=!$======!====$!===$$===>==$!===@==$=>>==========>======>====>=======A=======>====>=====>======>>=>=>===>=>=====>=>====>>A=====>>>>======ACC>=========>AC=>>=====>AC====>A==>=>CC>>C?==>>>>>==>>>>==>>=======>=====A>======>=>=>=>>>>CC>C=====>=====>>=>>=>>======>======$=>====$==>====>>>==>>========A=>>===============>=======$======$===$$====!!=!====$$=====$!$=====$==$!!==$$=!$=!=!!==!==!!!!$!ZƖx_Y!  !   =qӷ6686666656666666666666666666666666666666i6665i666666666666666666666666666i866i56666666666566666666i6666666666666656666666566666666666666666666665%%%%665%%%%%%%%%%55666i66666666666566666666666665666566666666i66i666666666666665665666666666666666666866666666666%% % %% % % %%% %% %% % %%%6666666666666666666666666566ii8ii6666666668666666666i6666i656666666666666666666666656668686866666666666666666566666666666666KKKKKKKKKKKKKKKKKKKJJKKJJJKWKKKKKJKJKJJKJKJJJJKJKJJJJJJJJJJJJJJHJJHJGHGGGGGFFFFFEFFKKKKKKKKKKKKKKKKKKK+4O4O4+1+**4**44443*ѭͭ+&&+&&++KKKKKKKKKKKKKKKKKKEFFFFFFGFFGFGGGGGGGHGHGJGHJGHGJHJHJJHJHJJHJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJo=$===>=========$=====$==============================>===============>>=====>=====>===>==>==>===C===>===>=>=>=====>==>==>=>>====>C===>=>==>>===?=====>==>==>A===>=C=======>=>=>>A>=>>>===>=>=>===>==>>==>=>====>=>==>====A>==>=======>>==>>====>>===>===>=====C>$=C>=>=======>=>=====>===C======================================$=$=$========!==!$==$===$$$$==$$===!==$==!=$===$$$===!$====!!==9=!$!$!=!$$!==CYCYCZ@ZZZBBZZZCYCBBZZCYBBZZ@BBYBBCZZBBBBYBZ@@BZBBB@@ZBBB@B@BBB@BBB@B@BBB@@@CBBB@@B@@@@@B@@B@@@@@B@@@@@@@@@@@@@@@@@@@@@@@;@@@;@@@@@@@@@;@;;@@@@;;@;;;;@@;;;;;;@@@@;;;;@@;;@@;;@@;;@;@@@;@;@;;@@;;;;;@@@;;@@@@;;;;@@;;@@;;;;@@;;@@@;@;;;;@@@@@;;;;;@@;@;@;;@@!! !     wӳi56666656666666666666666666666666666666666i6656i66666i66666666666i66666666666666666666666666665666666668666566666i666665666666666666666666566655%%%%'6%%'%%'%%%%%%6i666666666656666656666666666666666666666666666i66666666566666666666666666686666666i6i66666666566%%% % %%% %% %% % % %%% % %%%%% %%65(5666666i66666665666666666i866666686i666666666656666666566666665666i666666665666i86666i6666666i566666666566666666666i66KKKKKKKKKKKKKKJJKKJJJJJKKKJKJJJJJKJKJJJKJJJJJJJJJJJHJGHGGGGFGFFFFDKKKKKKKKKKKKKKKK+4O4OO+*1*4***44434*ް+&&&+&&+KKKKKKKKKKKKKKKEFFFGFFFFGFGGGGGHGHGJGJGHJGJHJHJHJJHJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJj!======!!==$$===========$!$======$==========$===9=$=>==========A>=====$$==>=====>===>======>==>>>=========>=>====A>>====>=>C>===>======A>=====>C>>>=======>>==>>>>=>>====>>>A>=C>==>>=>=====>>>>==>>C>==>=>>==>>>=======>CA>>>>=============>>====?==$=======>=$=>>>====>==C>>=>>==>====>====$====>>====$===========$====$========>========>>>=======>>=======!!$$$==$!!$==!===!!!!!$====$!!$===$!!!$!!!!!!!==$$==!!!!!!!!!!$!!!!!!$!!$!!!!!!!!!! !!!!!!!! !!!!! !!!!!!!!       !  =}ӳ6i6666566i66i6666666656i666666666666i6666666i6656i6566i8666666666668666666666666666668i6666665666666666666566656666666666666666666666666666565%%%%%'%%)%%%'%%%%%'%%%%66i66666666666666i6666668665666666666666666i6666666666666666666666666666666666666666666ii66( % %%%%% %% % % %% %% % % % % % %56% (666566666656i666i66666666i65i66666666666566666668656665666666666666666666666566666i666i665665668666i666665666666666KKKKKKKKKKKKKKKJKKKKJJKKJKKKJJKKWKJHKJHJJJKJKJJKJKJJJJKJJJJJHJJHJGGGGGGFFGFFFFKKKKKKKKKKKKKKKKKKK+O4OOO+11**4)*43444*ݰذЭ+&&&&&&+KKKKKKKKKKKKKKKKKKFFFFFFFGGFGFGGGGGHGHGHGJGHHHJHJHJHJJJHJJHJJJHJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJo==$=$==$===$=======$$9===$======================>=======================================>=>=======>=====>=>>====>>==>>====>>===>===>===>=>===>=>>====>>===>==>=>A===>===>>===>>=====>>=>==>>====>A====>C>>===>======>====>====>>=======>======>=>==========>>========>====>===>>=================>====$=$=========$====$$=====!========$!=============$$==!==$$$$=$!=!$=$=$==!==!=$$$=$!$!!=$!$!!$!!!$=!!$!!$!!!$!!!!!$!!$!!!!!!!!!!!!$$!!$=!!$!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!    =sӷ656666i665666666666666666665665666666666666665666665i6i66668665656666666666666666666i66666666i666666666666666666666666666666666656666i8666(%%('%%'%'%'%%'%%'%%%%'%%%%%6556666i66666666666666666666666566666666666666666666666i6666666666666666666i666666i666666(% % %%%% % % % %% % % %% % % %% % % %% % i6666666666666666656666666666666i666666666656666666666666666666668666666866666566i6666666666666666656666666666i86666i86KKKKKKKKKKKKKKKKKKKJKKJKKKJJKKWKJKJKJKKJJJJJJJJJJJJJJJJJJJJJJHJJHJGHGGGGGFFFFFFDKKKKKKKKKKKKKKKKKKK+4OO4O+11)4*1*44434*԰+&+&&+&+KKKKKKKKKKKKKKKKKKFFFFFFFFFFFGGGGGGGHGHGHGHGJHGJGJHJHJHJJHJJHJJJJJHJJJHJJJHJJJHJJJHJJJJJJJJJJJJJJJJJJJJJJJJJJՏo=!=!$=!!$=!=$!$==============$=====!=====$=====>C=$=======>======>AA====>=>>>===>=>=>C>==========>=>=>A>==>AA>>==============>=>>>>>====A>=========>=>>==>>====CC>====>>>>=====>=====>A>====>=>===>===>A>====AA>>===>==>>======>>=====A>=C=====A================>>==>C>=====>===>==$$==>========$==>==$========$=>=>==========$!====$!!$==!=$!!!!====!=!!$==!!===>=!!$=====!!=$!!===$!!==!!!==$=$!!!=$!!$======$!!!!!!!!!$=!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!$!!! !!!!!!!  !!!!!!!! ! !    !  $qӳ666656666666666666666666666666666i5666666i6666666i6566666666i6666665666666666666665666566666686686666666666666566i66i666666656666666%'%%'%%'%%%'%%%'%%%'(%'%'%%%'%'%%%%%66656666i56666656666666666i666666566666666665656566666666656666666666i6666666666686%% %% %% %% %% % % % % % % % % %% % % %%666665656566666666666666666666i66666666665666666i66666666666666666666666666666565666666666666666666666666666i666i5666iKKKKKKKKKKKKKKJJJJKJKKJJKKKKKKJHKJJKJKJKJKJKJJJJJJJJJJJJHJHJGHGGGGFGFFFFFFKKKKKKKKKKKKKKK+O4OO4+111*4**43443*ݰװͭ+&&&&&&+KKKKKKKKKKKKKKKEEFFFFFFFFGGGGGGHGHGJGJGJHJGHJHJHJHJHJHJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJo$=!$===!=====!==========$$=====!===$============>=====>=$=>=======>>====>>===>=======A===>======>==>=>>====>>=======>====>====>=====>==>>=====>===>=======>====>======>=======>=>====A>====>>=>===>===?=======>====>==>==>====>>=====>>=======>A=$=>===========>=====>>=====>================================================$=$===$=======!===$===$$==$===!!$=====$$==!!=====!$$=$!$!!=$!!$=!!$=!!!!!!$$!$!!!!$!!!!$!!!!!!!!!!!$!!!!!!=!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!    !    !=sӳ666666666666656666666666666666666666666i6i6666666666666566666666i665i666668i66666666666i6666666666666666666686666666666666666i666666665%%%%%'%'%'%%%%%%%%'%%%%%%%'%%%'%'%%'%%666666666656666666666665666666666656666656666666666i666666i8656666666i66666666i566( %% % % %% % % % %% % %% %% % 666i6666666i6656665666666566666666i666666666665i666666668i6666666666686666665666i6666666666866666666666666666666666666666KKKKKKKKKKKKKKKKKKJKKKKKJJKKJJHJKJKJKJJJKJJJJKJKJJJJJJJJJHJJHJHHGGGGGGFFFFEKKKKKKKKKKKKKKKKKKK+OO4OO+++*4)**44344*ذ++&&+&&+KKKKKKKKKKKKKKKKKKEEFFFFGFGFFGGGGGGGHGHGHGHGJHHJHHJHJJHJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJso==========$$$===9====$!!=$$=========$=====!$==========A==>=>=========$$===========>====CCA>========>============>>====>==A>========>>====>>===>C==>C==>===>>=>===>>>>>>====>>>=>========CC=>====C===>C==>CC>====>>==============>>>>=========>>===C>>>======CCA==========$===>==>>>====$===================$====>===!$!!=>======>===========$!!!==!==$!!!====$!!!$=!$==!!$$!!!=$!=====!$$$=$!!!!!!$$$!!=!$$!!!!!!!$!$$$$!!!=$$!$!!!!!!!$!!!!!!$!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ! !   !! !!qӳ66666666666i666666i686666666666666i66666666666666666666666666666666666666i686666i8i6666ii666666666i6666666666i66666666666666666666666'(%%%%%%%%%%'%%%%%%%%%%%%%%%%%'%%%%%%%%6666666666666i6666i66666666666666i666666666666i666666665i66666i6i666666666666i6666666% % % % %%% % % % % % % % %%% % %5666666666i6ii6666666666666i666666i666665666666666666666i66666666666ii6666666666666i6666666668i666665i666666i6i66666666iKKKKKKKKKKKKKKKKKJJKKKKKKKJKJJKKJHKJKJKJJJKJJJKJJJJJJJJJJJJJJJJHJHJHGJGGGGFFFFFFFDKKKKKKKKKKKKKKKKKKK+O4OOO+11**4**43443*԰&&&+&&&+KKKKKKKKKKKKKKKKKKDFFFFFFFFFGFGGGGGGGHGHGHJGHGJGHJGJHJJHJHJHJJHJJJJJJJJJJJHJJJHJJJHJJJHJJJJJJJJJJJJJJJJJJJJJJo7=!!===$==!====!========$!========================$=========>===========$$=========C====>>>==>==================>========>>==========>=>===>====>=>=>>=====>===>===>==>==>==?==>====>>===>====>=>====>>===>=====>=>=========>==========>=============>=====$=A==>======>====>=====>===============$$=========$===A==$=$$=======$=====!$====>=!$==!$==$$$$==$!=$$$$=!!==$=$$=$$=!==!!!!$!==!!$=!!!==!!!$!!$=!!!!!!!!!!$!!!!!!!!!!!!!$!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!! !!!!!!  !!!   !     !=qӳ6i666i56666666666666666666666666i6666i8666666666666666666666666i66i6666566666666i666666i66666666666i66668666666666666666666666666666666%''%%%%%%%%'%%%'%'%%'%%%'%%%%%%%%%%%%%%66666666666666666666666666666666666i666666i66666i66666666i6i666i66666666i6i6666666666%%%% %%% % % % % % % % (666666666666i6666666666666666666666668i66665666i6666666i666666666666666666i666666666666666666i6666666i6666666666666666666KKKKKKKKKKKKKKKJJJJKKWKKJKKJJJKJKJJWKKJKJJJKJJJJJJJJJJJHJHGGGGGFGFFFFFFKKKKKKKKKKKKKKKKKK+4OOOO+11*4***344331ަ+&&&&&&+KKKKKKKKKKKKKKKEGFGFFFGGFGGGGGHGHGJGHJGHJHJHJHJHJHJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJso!$=!==========$!$=$!==========$$======$======!$==!==$======$===============>=================>========>===>>=>AA=>=>=>==========>=>=>===>>===>=>A>==>========>C>=>===$===>C===============>====>>==>=CA========>>>A====>==>=>>=>C>======>===>======>>>====>==>=====$=======A=$==$==$=================$=======$==============$$!!$!$$$$====$======!!$$=====$$!======$===!=!!==!!$!!$==$!$===!!!!$$!==$=!!!!!!!$!$==!!!$!!!!!=$!!!$!$!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!   !  ! =sӳ6666666666i6666666666666666666666666666i66666i66666666666666666666666666666666666666666866666666i66i666i66i66i66i6666666666666666666('%%%%%%%%'%(%%%%'%%&%%%%%%'%%%%%%%%%%%%(666666666i66666666666666666666666666666i5i6666666666i666i6666i6666666666i6666666 %%% %% % % % % % ((666666666666666656666666666666666666666i6i66666i6666666666666i666666666668i6i666666666666666666666i66666666666666666666KKKKKKKKKKKKKKKKKKKKKKJKKJKJJKKKKJJJKHHJJHJJKJJJJJKJJJJJJJJJHJHJGHGHGGGGFFGFFDKKKKKKKKKKKKKKKKKKK+OOOOO+11*)4)134443*ذ+&+&&&&+KKKKKKKKKKKKKKKKKKDFFGFFFGFGFGGGGHGHGHGHGHHHGJHJHJHJJHJHJJJJJHJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJo=!$$$===$======$===!======$$===$$=$$===========$$=$=========$====$==$======>===>===$=================>=>======>>====>>==========>===A==>==>=====>======>=>=$=C=====>=$===>===>===========>>====>>===>>>===========>==>==>>===>==>==$>>==>>===>======>========$==========>=$>===$!=======>===$=>===$==========================!==$!$======$$$!===$!$!===$==$!$$!=====$=!=!$!!==!!!$$=!$!=$=!!$!$=$!!=$!$$!!!$!!$$!$$!!!!!!!!!$$!!!!!!!!!!!!!!!!!!! ! !!!! !!!!!! !!!!!!! ! !!       =sӳ6i666666566666666666666666666666666i8666666666666666666666666666666666666i6666666i6666666i66666666i666666666666668i66666666666i666666%%(%%%%%%%% %%'&%%%%'%%%%%% %%%%%%'%%%'%%%(566666666666666i6666666666666666666666666666666i6666666666666666666666686666666666% % % % % % % % % % % %% 66666i6666666i66i6i6666666666666666666666668666666666666666666666666i8666666666666666666666666666666666666666666666KKKKKKKKKKKKKKKKKKKKKJJJKKWKKKKJJKJJKJKJKJKJJJKJJJJJJJJJJJJJJJJJJJHJJGJGGGGGGFFFFFFKKKKKKKKKKKKKKKKKKK+4OOOO+11*4*1*43434*Ѧ+&&&&&&+KKKKKKKKKKKKKKKKKKFFFEFGFFFFFGFGGGGGGHGHGJGHGJHGJGHHJHJHJJHJJHJJJHJJJHJJJHJJJHJJJHJJJHJJJJJJJJJJJJJJJJJJJJJJJJo!!===!!!=$$!=$!$=$!===!===========$$====!!$====$=$$========$$==========>=A===>=====>==$==============>=>====>===>====A>>A=====>>>==========>=======>>>=>===C===>>=>>=>=>A=$=>==>=A>=A=======A=>=======>>>=>===CC>=>====>===A=======>>=$=>>=>====>==$=>====>======>C>$===!$=======>=$==>A===$====$$$================!$$=======>========$!!=!=!=$=$=$$====!!$$$$=!$=!$!!$===$=!!==!!$!!$!!$$====!!$!!!$=!!$$!!!!!!!!!!!$==!!!!!!!!!!! !!!!!!$!!! !!!!!!!!!! !!!!!!!!!  !! !     !!  ! =qӳ6666666566i66666666666666666i666666666i66666668666i6666666666666666666666666666666i666666i66666666666666666666666666666666i666666666%%'((%%%%%%%%%%%'%%%%%&%%%%%%%%%%%% %%%%%&%%(i66666666i666i6666666666666666668i6i6666i666666666i6666666666666666666i6i6666i666 % % % % % % % %% % % % % 66666666666i6666666666i66666666666i6i66ii68i666666666666666666i666i66666666666i666666666666666666666666666666666666666KKKKKKKKKKKKKKKKKKKJJKKKJKJKKWKJJJKJKJJKJKJKJKJJJJJJJJJJJJJJJHJHGJGGGGFGFFFFFFKKKKKKKKKKKKKKKK+OOOOO++1**4**44343*Ͱ+&&&&&&+KKKKKKKKKKKKKKEFFFFFGGFGGGGGGHGHGJGHHJGHHJHJHJHJHJJJJHJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJm=!$!$$!$$$$!==!$$$$==!$!===============$$!$======$!===========!=C===@======>======>========$=====$===========>===>===>>=========>=>=========================>=====>=>C>==C=====A>=>========>>>C=======>=A==>>==>C=======>====>===>==========>>===========>===>====>A>=========$=====!=A======$===========$======$$==$==$==!======>=$!$==$==!$$==!=!=!===$!!==$=$!!!==$=!$==$!$!$!$$$$!!!=!$!==!=!!!$!!!!=!!$!!!!!!!!!!!!$!!!=!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!! !!!!     !! $sӳ66566666666666666666666666i66666666666i666686666666666666666666666665666i6666666566666666666666666666666666666i666666666666i66666666%%%(%%%%'%%%&%% %% '%&%%%&%%%&%&%%%%% %%%%%%%6666666666i66666686i666666666i6666666666668i6666i5666i66666666i6666666i86666666666 % % % % % % % % % % %%56666666666666666666i666666666666666666666666666i66666666665i666666666i666666666i6666665666656666i666i666666666666666KKKKKKKKKKKKKKKKKKKKJKKKJJJKKKKKKKJKJJJJJJJJKJJJJKKJKJJJJJJJJJHJHJHGGGGFGFFFFFDKKKKKKKKKKKKKKKKKKK+OOOOO+1+)4***43434*װͭ+&+&&&&+KKKKKKKKKKKKKKKKKKFFFFFGFFFFGFGGGGHGHGHGHHGHJGJHJHJHJHJJJHJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJC==========$$$=======!==========!!====!====$===========$=======$$==$$==$=$$===$=======!=======>================>=$=====$===>==============>A===>=====>>======C===>========>===>=A>====>>A====================>>=======>================>=============>=$$=>===================$==>===$=>========$$=>=>==$!$$$=$==$$====$======$$!==$$========$!========$=$$===!$!$!!$!$$!$=$!!=$=$!$=!!!!!!==!!!$!!!!!!$!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!! !!!!!!!!!!! !!!!!!!!! !!! !!!!       =pӷ66666666666i666666666666666666666666i6666666i666666666566666666666i666666656666665666666i666i666666666666i66566666666666666666i6665(%%%' %%%%%%%%%%%%%%%%%%%%%% %%%%% %%%&% %%((66666666666666666i666666666665i566666i66666566666666i666i666i66666i6666566i66666666 % % % % % % % % % %%666666666666i8i66666656i666656666856666i666666666666666666666666666i66i6666666666i666666666i66666i666666666666666i6i66iKKKKKKKKKKKKKKKKKKKKJKKKKJKKKKKKJJHKJKJJWJJJKJJKJJJJJJJJJJJJJJJJJHJJHJGHGGGGGFFFGFEFFKKKKKKKKKKKKKKKKKKK+OOOOO+111*44*133434*ѭ+&&&&&&+KKKKKKKKKKKKKKKKKKFFFFFFFGFFGFGGGGGGGHGHGJGHJGHGJHJHJHJHJJJJHJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJsj======$=$!==$!=!====!=====$====!====!=!===$===$======$$=====$=======$=============$===!=>==========>========>A=====>====================A>===>>====>=====>>=====A===$=====>===C>====>========>===========$=>================A==>=====A=====$======>=============>======================$===!==!=========!====!$$!=====$=====!$=$=!==!!$====$!========!======9!=!!$$!!!$!$$!!$=$$!!!!=$!!!=!!!$!!!!!!!$!$!!$$!!!$!!!!!!!!!!!!!!!!!!!!!!!!!  !! !!!!!!!!!!!!!!!!!! !!  !     $qӳ66666666666i66i6666665666666666666i6666666666i66666i666665i6ii86666666666666656666666666666666668666666i6666666666666666666i66666665'%%%&%%'%%%%%%&%%&%%%%%%% & & %%&%%%&%%%%% %66666i6666666666666666666666666666i6666i86666666666i666i5666666666866i6666i6666i6i6i6 % % % % % % % % (6666666666666666666666i6666666i66i6666666666666666666666666i66666666i6666i666666666i666666i6i6666566666666666i666666i6KKKKKKKKKKKKKKKKKKKJJKKWKJJKJKKJKKJJKJKJJKJKJKJJKJJJJJJJJJJJJJJHJGHGGGGFGFFFFEKKKKKKKKKKKKKKKK+OOOOO+*1*4*41*34343*ަͭ+&&&&&&+KKKKKKKKKKKKKKKFFFFFFFFFFGFGGGGGHGJGHJGHJGHHJHJHJHJJHJJHJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJo==!$!!==$$===!!$======$!!=$!$$!$==$$=================$=!====$>======>===>=$=====$===>==========>===============$==A>=$==>A>===>==============C=====>C===$=====>>====!=====>=======>==>>====>=====>===>>======$==>==========>=====>>===A==============>>=$=====$==========>AA=======$=====>=======A==$=$$============!$!$==$$$==========!!$!=$$$$!!$!!!=!!!!$$$==!$==!==$=$!$==!!!==$$!!!!$!!$$!!!!$!!$$!!!!!!!!==!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ! !$!!!!!!!!!!!!!  !  !!!!!! !   =}ӳ665i6666666665666666666666i5i8666i66666i66666666i66666666666666i666666i566666i666666i66566666666666668i6666666i6666656i66666666i65'%%%%%% %%%%%%%%%&%%%& &%&%%%% %&% %% %%%%%%66666666i6666666666666666666666666666666ii6666666666566666i666i66i66666666i665666%% % % % % 666686566566666i66i66666666666i66666666566i6666666666656666666666i6666666666i6666666666i6666666i666i6i666666666686i6i666KKKKKKKKKKKKKKKJKKKJKKKKKKKKJJJJHJKJKJKJKJJJJJJJKJJKJJJJJJJJJJHJHHJGGGGFGFFFFFFFKKKKKKKKKKKKKKKKKKK+OOOOO+11*)*1P3434*ئͭ+&&&&&&+KKKKKKKKKKKKKKKKKKDFFFFFFFGFGFGGGGGHGHGHHGHJHJGJHJHJHJJHJJJHJJHJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJo==$!!!$$=====!$=!=$!$=$!$$$=$=!$==$!=$==>=========A=$==$!===$$=>=$=======>=======$=>=========>==>==========>============$=>=========>===C====>==$=C>=>=>========>====$=====C=$==============>========>=======$=====$=$==>=====$$=>==>====>=======$===>>A===$===$$====$====A======$$==$$==============$===$==========!$$$$=!=!===!$======!$!!!==!$=$=!=$!!!!=$$=!!=!!$=!$=!!$!!==!$=!$$!!!!$=$!!!$!$=!!!!!!!!$$!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!$!!!!!!!!!! !! !!   !!  !        !  =sӷ656665666666665666666666666666666i6666656666665666666666666666666i866666666666666666i666666i66666666666666666i8666666666666666666666%%% %%%%%% %% %%%%%%%%%% %% %%%%%%% % %%%& %%5666i666i6i66666666666666i66666i666668666666666666i66i666666666666666666666655666( % % %  %666i65666666666i6666565666666i666666i5666666666666666666666666i6666666666i666i6666666i5666666i66i66666666666i6666666666KKKKKKKKKKKKKKKKKKKKKKKKKJJKKJKKJKKWKKJJKJKKJKJJJJJJJJJJJJJJJJJJJJJJJJHJHJHGGGGGGFGFGFFFKKKKKKKKKKKKKKKKKKK+OOOOO+1+*4*2**34343*а+&&&&&&+KKKKKKKKKKKKKKKKKKFFFFFGFGFFFGGGGGGGHGHGJGHGJGHJGJHJHJHJJHJJHJJJJJHJJJHJJJHJJJHJJJHJJJJJJJJJJJJJJJJJJJJJJJJJJՏl!$!!====!$!!!=============!=====$==$=!==!$$!$==!==$$==$=======$=====$=====$============$===============================>==$=>===>=>==============================>==>==$=>=$=>====>==>A==A==$=>======>=>========$==>==>A===>====$================$=========C=============$======$======$!$====!$$$$===========$==========!=!==$==$!$=======!!=!==$!$$=$!=!=!!===$!!$==!===!!$!!$=$!!$=!!!!!$!=$!!$!$$!!!!!!!!!!!!!!==!!!!!!!!!!!!!!!!!!!!!! !!!!!! !!!$!!!!!! !!!!!qӳ6i6666666666i6i66666i6666666666i6668i6666i6666i6i66666666i66i66666666666666666i66666666666i66666666i66666666666ii666666i666666666666(i5%%% %&% &% %%% &%% %%% % %% % %%% % %%%%86666666i86666666i66i666i6666666666i668666666i66666666666666666666i6i6666666ii566i % % % %  % % 666666666666666666666666666665666666i66ii666666666666i666i6i66i666i66666i66666i6i6666666i66666666i6666666666666i6i66666i6KKKKKKKKKKKKKKKKKJKKJJJKKKJJKKKJJKJJJJJKJKJJJJJJJJJJJJJJJJHJGJGGGGGGFFFFFFDKKKKKKKKKKKKKKKK+OOOOO+11*4*4**43334*ݰͦ+&&&&&&+KKKKKKKKKKKKKKEFFFFFFFFGGGGGGHGHGJGHGJHHHJHHJHJHJJJHJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJ?$!!$!$==!!$$$!!===$!======!=!=!$==!==!!====$!!!===!$!$=$==!=A==$!=!===$$==!$$==$===============!$=========!==$$==================>>>>=$==========$==$$=====>=======C=====$==========A=>=>=========>=$===>>=>=>==>============>>===$=============>=$===$==================$!===$=>==$==A==!$$!==$$$$$$$==>>==$$=$!$=======$!==!==$$!!$$$===$!$====!$=$=!==$$!!!!!==!==!!==!==$$!!!!!!!!$!!!$$!$!!!!!!!!!=!!$===$!!!$$!!!!$==!!!!!!!!!!$!!!! ! !!!!!!!!!!!!!!!!!!! !!!!!  !   !   !!    ! ! ! !sӳ66i6666666666666ii6666i6i666666666i6666666666666666666666666666666i66666i666i6666i66666i66666i66666666666666666i6666666666666666666i(66(%&%%&%% &% &% % % % %& %% %% %%&%%%((5(6666666666666666666666666i6666666i6666ii6i66666666i6666i666666i6666666i6666i666 % % %  % %66i6i666666666i8666666666666i6i66i666i66666666i66i666666666666i66666i666666i6i6i66666i6i6i66i66666666i6666666666666666i66KKKKKKKKKKKKKKKKKKKKKKJKKKJKJJKKKKJJKKWKJKJKJJJJJJKJJKJJKJJKJJJJJJJHJJHJHJGHGGGFGFFFFFEKKKKKKKKKKKKKKKKKKK+OOOOO+11*4*4**3O343*ئ+&&&&&&+KKKKKKKKKKKKKKKKKKFFFFFFFFFGFFGGGGGGGHGJGHGHGJHHJHJHJHJHJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJs?===$$!!==!=====$$!!!!$$$!!======!$===$===$$===$===========!=>===$=====!==============$===A=====$=======$=========!====================$=C>========A====A=A=========>===>=========>=====$=$=>=========>==$===========>===========>=====$==>======$$=====$=====$=>=$=======$===!$=====!=====>======!========$$!$==$!$$$$==$===$$$==$$$====!=!=$!!$!$$$===!$!!===!!!$$!=$!!$$$$!!$!=$!$$!!!$$$!!!!!!!$!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!! !!!!!!!!!!!!!!!!!   !  =qӳ66666i6666666666666i66686666i666i66666666i66666i66666666i666666666666666666i66i666i6666666666i6i6666666666i66666i66666i6i6666666i666'%% & % %%% %%% %%% % % %&% % %%&%% %% %%% %%5'%%666666666666666666i6666666666i6i666i66666666666666666666666i66866666i66656666% % %  % % 6666i66i6666666i6666666i66666i6i6666666i6i6656666666666666i66666666666666666666666i66666666666666i666666i666i666i66666666KKKKKKKKKKKKKKKKKKKKKKKJJJKKJKJJJKKHHKJJJHKJKJJKJJJJJJJJJJJJJJJJJJHJHJHGHGGGGGFFFGFFFFKKKKKKKKKKKKKKKKKKK+OOOOO++1*4*4**34334*ݰԦ(&&&&&&+KKKKKKKKKKKKKKKKKKDFFFFFGFFFGFGGGGGGGHGHGHGJGJGHHJGJHJJHJHJHJJHJJJJJJJJJJJHJJJHJJJHJJJHJJJJJJJJJJJJJJJJJJJJJJso$!9!!!$====!=!=!!$$=$!!!======$!===============$!$=>===A===!=$$$===>>===!=>==========$=A>>A>>>=================================$=>=====>>=======>=====>C>==$=>>=A======>>>==>=$>>=$=$=$===$=>>=========$$=======>======>==$======>=$!=$=====A==$!=>====$========$==!!=============!=!===>A====$!$==!==$=!=$!!=$!$$=$!!$!!==!=!$!!$!$====$$!==!!$======!!$==!!!$=$!!!!!!!=!!!$!!=$!=!!!!=!!!!$!!$!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ! !!!!!!!!  !!! !!!!    !qӳ666666666666666666666i66i66666i666666666666666666i66i66666i66666666i66666666666666666666i666666i666i66i666i66666666i666i66666666666%%%&%% %%% %%%&% %%% % % % & &%& %% % % %%% %% % (i6666i6i6666i6666666666i6i666666666i6666i666666i666666i6666i6666666666666665%% %    % 66666666i6666666666666666666666666666666i66666666i6666666666666i666666i6666666666666i6666666666i6666666i666666666666i6666KKKKKKKKKKKKKKKKJKKJJKKJKKWKJKKJJJKJJKJKJJKJKJJJKJJJJJJJJJJJJJJJGJGHGGGFGFFFFDKKKKKKKKKKKKKKKK+OOOOO+1+**4**433431ɰ+&&&&&&+KKKKKKKKKKKKKKKKFFDFFFFFGGFGGGGHGHGHGJGJHJHHJHJHJHJHJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJo!!$$==!!!===!=!======$!=$!==$$$$==$!!$=$!!====!====>=!=====!=====$!=$$======!===========!===============!=>>>>===========$=========!==================================$=====>======$=====>===>===$============>==$=====================AA=======$===$=======$===$$>===$!=====!=!$====!=$$==!$=======$$=====!=======$===$!=========$!!==!==!!==$!$!$!!==$$!!$==!$$!!$=$$=!!=$!$=!!$!!!!=$=!!!!$!!!$!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!! !!!! =qӳ666666666i6666i6i6666i666666i6666666666666666666666666666i66i66666666i6i6666666666666ii666666i66666666666i6i666666i6i8666i66i6666665%%&%% % &% % % %%& % %&%%&% %% &% %&%%% % %5666666666666666i6666666666i6i666666666666666i666i6i6666666i6666666i666i6666% % %    % %566666i66666i6i66666666666666666666i6666i66i6666666666666i6665i6i66666666566i6666666666i6i66666666666666666i66666666666i6KKKKKKKKKKKKKKKKKKJKKKKKJKKKKKJKKJKKKKKKKJKJKJJJJHJJJJJJJKKJJKJJJJJJJJJHJHJHGGGGGGGFFFFFFFKKKKKKKKKKKKKKKKKKK+OOOOO+11'4*4**34334*צ+&&&&&&+KKKKKKKKKKKKKKKKKKDFFGFFFFFGFGGGGGGHGHHGJGHHJGHJGJHJJHJHJJJJJHJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJj!!=!==!!!=====!$====!!==!!!$!=====$!!$$!==!!$=======$$=$!$$=>==!$$$=====$!==$$==$=>=$$$!$!=====$==>>===>A>==========>$$===========$$$!===>=========$!!===$===>=!========9=>=======>>=>==$====$==A>==>=$!$============A>>=>A>=====!==A==>>>=>=====$$==$$=$!!$===$=====$===$!!$!=>=$==!$=!!====A=$!$===========$!===$$=$=!=$!$=$!!=====!!!!==$!=!$!!!$=$!!$=!!!!!=$$!!!!==!!!!!!$!$!!!!!$=!!!!!!!$!!$!!!!!!!!$!!!!!!! !!!!!!$!!!!!!!!!!!!!!!!!!!!!!! ! !!!!   !! !    !       !       !! !!! =sӳ666666i66i8i66i86i6666666666ii6666666666666666666i666i666666666666666666i666666666i6i666665666666666i6i6i66666666i6666i666666666i666 %%%% %% %&%%%&% % %%%%% % &% % & &% %%%% %6666666i6666666666666666i6666666666666666666i666i66ii6666666666666666i665666 % % %    % % %66666i66666i6i666i666666666i666666i6666666666666i66666666666666i6666666i6i6666666666666666666666666i66666666666666i6i6666KKKKKKKKKKKKKKKKKKKKKKJJKJKWKKKWJKKJHHJJKHJJJJKJKJJJJJJJJJJJJJJJJJJJHJHJGHGGGFGFGFFFFEKKKKKKKKKKKKKKKKKKK+OOOOO+11144*4'*433O3*+&&&&&&+KKKKKKKKKKKKKKKKKKFFFFFFGFFFGFGGGGGGHGGHGHGHGJGHHJHJHJHJJHJJHJJJHJJJHJJJHJJJHJJJHJJJHJJJJJJJJJJJJJJJJJJJJJJJJl=$!$$$$$==!!$$!===!!$===$$$==!$$==$=====$!===$==$===!===$=======$====$====$!=======!$======$===$$$$=$===========================!========================>===========>=!======================$=======A=======>===============================$===============$>===$!======$=====$$=======!==$!===!!=$$=====!!=====$!=====$!=$===!==!!!!=$$!!===!!!$$!!===!==$!!!$=!!$$$!!!!$$$$!$$!!!!=$!$!!!$!!!!!!!!!=!!!!!!!!!!!!!!!!!!! !!!!! !!!!!! !   !!!!!!      !!qK6666i66666666i6i666i6i6i666i6666ii666666i66666i6i6i666666666666666666666i6i666ii666i666i6666666i6666666666i6i666666666666i66666666i6 % %% %%% % % %& &% %& & % % % % % %&6i666666i6666666666666666i66666i6i6i66i6666i6i66666666666666i6666i66666666665%%% % %    % % 666i66666666666666i6666i666i666i666666ii66666666666666666666666666666666666666666i66666i6666i666666i666666666666i6i66666i66KKKKKKKKKKKKKKKKKKKKKKKJKKJKKKKKKKJJKKWKJKHJJJKJJKJKJJJJJKJJJJJJJJJJHJHJGJGGGGFGFFFFFFKKKKKKKKKKKKKKKKK+OOOOO++**4*41*34333*+&&&&&&+KKKKKKKKKKKKKEFFFFFFFGFGGGGGGHGHGJGHGJHHHJHJHJHJHJJJJHJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJj==$==!$==$!!!$===!!===$==$$=$==!!===$==$!$===!!$!!$========!!>>=>==!======$==>=!!!====$!!=$==$=!$!$$!!==$=======$$=====>>=====!$===>>======$=======>=$>>====$==>=====$$==>=====>>=$!$$========>=>=========>A==C>=====$!!!$=!!$=====$$!====$=$=============>=!=>==$$==$$==$!=========!==!!$$$=!$!$$$!===$$$======$!!=A======!!!$=!!$!$!$=!!==!$==!!!==!$!!!$$=!!!!!!!!!!$!!=!=!!=$$$==!$==!$!!!!!!!$=$!!! !!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!! !!!!!!!          !  !  !    !p׳666666666i66666i6666666i6666i666666i666666i666666666i8i66666666666i66i6666666666i6666666i66666666666i66i6i6666i6666666666666666666i6% % % %% %%& %&% &% % % % % % % & &% % %& %% %6666i6666666i6i6666666i6666i666666i6666666666i66666666666i6i6666666i66i66i66 %      i666666666666i6i6i66i66666666666666i66666i6665i6666666666i666666666666666666666i6666666i6i66i6666i66i6666666666666i6i66i666666KKKKKKKKKKKKKKKKKKKKKKKJJKJKKKJKKWJKKKKKJKJKJKKJJJJJJJJJKJJKJJJJJJJJJJHJJHJGHGGGGFGFFFFFFFKKKKKKKKKKKKKKKKKKK+OOOOO+11*4*441*43343*ͭ+&&&&&&+KKKKKKKKKKKKKKKKKKFFFFFFFFGFGFGGGGHGHGHGJGHJGJHHJHJHJHJJJHJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJC!=!!$$=!$$!$!==$$$$!$$!!=$!$===!!$=!===!!=$===$$==!====$==!===$!====$=======!==$$===================>>=$=================$===========A=!=============$$A>=$===$===$=======>===$==================================$===>========================$=$=====$=====$===$===================$!===$===========$!==$$==$$$=$$$!==$!!$!!==$$$$$=$$$=$!$=$==!!$$!=$!!!$!=$!!!$$$!$!!!$$!!!!!!$!!!!!!!!$!!!!=!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!! !!!!!!!!    !=qӳ6666666i66666i666ii66666i666i6i66i566656666666666i666i66666666666666i666666666i66i666666666666666666666666666666i66666i6i6i66666668%% % %% % % & % % & % %% % %%&&%%56i66ii6i66666666666666i6666666i6666i6666666i666666i66i66666666i66666i666i665( % %       i6666666i666666666666666i666666i6666666666656666666666666666666i66666666666666666666i6666666666666666i6i66i6666666i66666i66666KKKKKKKKKKKKKKKKKKKKKKJKKKJJKKJJJKJJKKKJHKJJKJJJJJKJKJJJJJJJJJJJJJJJJJJJHJHJGGGGGGGFFFGFFFKKKKKKKKKKKKKKKKKKK+OOOOO+11144*4113O334*ݰ&&&&&&&+KKKKKKKKKKKKKKKKKKFEFFFFFFFFGFGGGGGGHGHGJGHGJGHGJHJHJHJHJJJJHJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJ}?9=!!!!!!!!$=!!!=!!==!$!$==!!==!!$!$=!!====$=======$=!======!!==!!!!=$!===$!!==$====>$$==>===========$==>==$====!$=>=$!$==$!!$=>===========$======>>==>=$=C======$$>=$=====$$====!!===>==!$=A=>===$=====!======!$$!$!!=>>>=========$==$!$==$$==!!$$==>====$$=!!===!!=>C>=====$!==$==$!$!!!=$===!=$========!!!!===!!!!!$$!!!!!!$$!!!$==!!!!!==$==!$=$!!!!$!!!!$=$!===$!====!=$!!==$!!!!!!==!!!!!!!!!$!!! !!!! !!!!!!!!!!!!!!!!$! ! !!!! !!!!! !!!!!!!!! !    !!  !    !  !  !!=}ӳK6666666i6i66i66i66666666666666666666i6666666i66666i66i666666i66i6i66666666666666666i6666666ii66i6i6i66666666666i6i66666i66666666666i%&%% & % %% % %&% & & & % % && % & &% &%%6666666i666i6666i66666666i6i66i6ii6666ii6666i666666666i66i66666i6i6666i66( (% %       666666666i66i66666666666666666666666i66666i666i66i6ii6i66ii6666666666666666i666666666666i6i666i6666666i666666i666i6666i666666KKKKKKKKKKKKKKKKJKKKKKKJKJJKKKJJKJJKJKJKKJKJJJKJKJJKJJKJJJJJJJJJHJJJGJHHGGGGFGFFFGDKKKKKKKKKKKKKKKK+OOOOO+1+*4*31*333331ͭ+&&&&&&+KKKKKKKKKKKKKKKKEFFFFFGFFFGFGGGGGGHGJGHGJGJHHJHJHJHJJHJJHJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJj=$!!=$$$!$=$$$=$!!$===!!$==!!$$$$!===!=$!!==$!==$!$!===$$$=$$C===!===$!=$====!!====$$=========!=$===$$======$$====$$===============$===================$$=====$=====!=C===================>======================$=======!=>===========>=$========$=======$=$=>===!!====!!==$====!========!$==!==$=$========$$$$=======!$$==$!$==!$=$!$===$=$!!$$$!$!$!!==$!!=!=!$!!$!!$!!=$!!!!!!!!!!!!$!$!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!! !!!! !!!!!!    !    !=sӳK666i66666ii666666ii6i6ii5i6i666i666ii666666666666666i666i66i66i6i66i666i6i66666i6666i6i6ii6666i6i666i66i66666666i66666i66666i666i6666 %% %%&% & % % & % %% & & & % %& & % %&%& i6666i66666i666666i666666666i6666i6i666666666666666i66i666666666i6666666%(      666i6666i666i6i66666666i666i66ii66i6i6i6i66i666666i666i666666i666i6666i66i6666666i666i666666666666i6ii666i66i6666666666666iKKKKKKKKKKKKKKKKKKKKKKKKKKJJKKJKKJJJJJJJJJKHJJJWJJKWKJKJJKJJJJJJJJJJJJJJHJHJHGJGGGFGFFFFFFFKKKKKKKKKKKKKKKKKKK+OOOOO++112*4*10Q333*+&&&&&&+KKKKKKKKKKKKKKKKKKEFFFFFFFGGGFGGGHGGHGJGHGJHHJGJHJHJHJJHJJJHJJHJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJo!!!====!!!===!$$===$!!!!$==!$=!!!!!$===!$!=>A=!$=$$=====$==========!$===$===$$!!=========!$!!$==$$$===$======$====!$=CA=$==$$========!======!!$!==!====$===>==>=======>=========$=$!=$============$==$$!$====$!=>=====!$==========$==!=$$==>==C==!!=>==$=!!=$$====$$=$!!$!==!==$========!$!$======!!==$$====!!!$$$$!=!!!!!$==$$==!!!$!=!$===$$==!!==!$!!=!!!!!$!!=$!!!!!!! !!!!!!$=!!!!!!!!!!!!!!!!!!!!! !!! !!! !  !!!!! !!! !! !!     !   !!  !  !!!  =}ӳi6666i66ii666666i66666666666666666i666ii666666666666666666666666666i6i6666i666666i666666666i6666666666i6i66i666666i6ii66i6666666666i65% %% % % % &&& & % % % % % % % %6i6i66i66i66i6ii666i66i6i66i666i66i6666i6i6i6666i6i6666ii6666i6i6666666655(        ( % 6666666ii66ii66666i6i6i6i666i66666666i666666i66i6666i666666i66666666i666i66666ii6666i6i6ii6ii6i6i66666i6666i666i666666666i6KKKKKKKKKKKKKKKKKKKKKKKJKKJKKJKKJJKJKJKJKJKWKJKJKKJKJJJJJJJJJJJJJJJJJJJJJJHJJGJGHGGGGGFGFFFFFKKKKKKKKKKKKKKKKKKK+OOOOO+11*4*31*33333*ͭ+&&&&&&+KKKKKKKKKKKKKKKKKKDFFFFGFFFFGGGGGGGGHGHHGHGHGJGJHHJHJHJJHJJHJJJJJHJJJHJJJHJJJHJJJHJJJJJJJJJJJJJJJJJJJJJJJJJJo!!$!!!!!=$$$!!!$$=$!!!!=$!$$==$=$$$!$===$$=$$$$=$=$!$=$$===!=!====!=======$$=!===$=!=========$=======$===$=====$$=================!============A=$$=============!===========$=======$===$$======$$=====$===============$==========!===========!================$$==$!======$!=====$====$!!====!!====!!$$!!$$$!=====$!$$!====$!$!==$=$!!!!$$$$=$!!!==!!!$=!!!=!!!!!!=!!!$!!!!!!!!!!!!!!!!!!!!!!!!!!$!!!!!!!!!!!!!!!!!!!!!!!! !!!!  !!!!!!  !!!!!!!!    ! qӷKKK666i6i6i6666i66666i6666666666666i66666666i6i666i6666iii66i666i666i6i666iii66i666i66666i66666i666i66i6666666666ii666i666i666i66ii6666i6 %% % %& % & & & & & % & & %% %% %%6666666i6i6666666i666i666i66666ii66i6i66i66ii6666666i66i6i6i6666666i66666(         (% 6666iii666666666i666666i666i66i6i6ii6ii6666i666i6666666666i6666i66ii666i6iii66666i6i66666666i66i666i6666i66666i66i666666666KKKKKKKKKKKKKKKKKKKKJJJKJJJJKJJJKKJKJJKJJKJKJJKJJKJJKJJJJJJJJJJJHJJHJGGGGGGGFFFGFFFKKKKKKKKKKKKKKKKKK+OOOO2+1114*4*133333*Ѧ+&&&&&&+KKKKKKKKKKKKKKDFFFFFFFFGGGGGGGHGJGHGJHHJGJHJHJHJJHJHJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJo===!!$==!!=$!==!!!$!!!!!!$!$======!=$====$!!=$!!!=!!==$===$$$!==$$!!==!$$========$===!$===!=======>=!!==>=====$==A=======$$===$======$$!=$$==!!$==!$=$======!====$$!!====>=!======A=$$>CA===$$=!$========>A>=====$!!============!====!=========!!!!====$!=>====$====!!==$==$$====$=$!=$$!$!$$!!$$==$$!$====!!!=$===!==>=$!!=!!!=!$!!==!!!!!!!$==$!!$!!!!!!!!!=$!!=!$!!!!===!!!!!!!!!!!!!!! !!$!!!!!!!!!!!!! !!!!!!!!!!!! ! !!!!!       ! !  ! !   =pӳii666i6i66i6666i6666i6ii6666ii6i6i6i6i66666i66666i6666i6666666i66666i66666666ii666i666i6i66i66666666666666i6i66666ii6666666666i6666666 & &% % & % & % & % % % %& % %66666666666666666i6i666666666i6666666666i6i6i66i66666i66i6i6666666666i6i6%           i6666666666i666i66666i66i6i6i6iiii66666666i6666666i666666i66666666i66666666666i6665iii66i666i666i666666666666666i6666i6i66iKKKKKKKKKKKKKKKKKKKJJKKJJKJKJKJJKJKJJKJJKJKJJJKJJJJJJKJJKJJKJJJJJJJJHJJHJGJGHGGGFGFFFFFDKKKKKKKKKKKKKKKKKKK+OOO2O+11*4*21*333331ͭ+&&&&&&+KKKKKKKKKKKKKKKKKKFFFFFFFFFGFFGGGGHGHGHGHHGHHHHJHHJHJHJHJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJl!!!$!!$!!=!!=$!!$$=!$$$$$$$$$=!!$$$$!!$$====!!$!===$$==!$!=$=!===$==!==!==$==!=$=====!===!=!=====!=========!=$===$!==========$!=========!=========$===$====$=====!=============!=A=!=====$$=============$=========$=============$=$$==$$====$=====>=$====$!=!=========!!=====!===!===!=!$====!$=$$!=====$!!$!=!$=!$$!==!!!!=!==$!$!!=$!=!=$=!!$!!$$!!!!$$!!=!!!=!!!!$$!!!!$!!!!!!!!!$!!!!!!$!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!   !!!!!!    !  $qӳ6i666i6i6i6ii66666i666i6666ii6666666i66666666666666i6666i6i6ii6i66i66666i6666i66ii6i66666i66666666i6666iiiii66i66i66666ii6i6666i666666%%%&% % & & & & & & & & %&% %&66666i66i66i666i6i6i6666i6666i666666666666666666666i66666666666666666i665 % %%        ( 66666iii66i6i6i666666i6i6i666666666666i66i66i666i666ii6666i666666i66666666666i666i66i666i66i666i6666i6666i66i666666i666666iKKKKKKKKKKKKKKKKKKKKKKKKKKKJJKKKKKKKJJJJJJHHKJJKJKJJJJJJJKJJJJJJJJJJJJJJJJJJJHJHGJGHGGGGGFFFGFFFFKKKKKKKKKKKKKKKKKKK+OOOOO++1*2*41133333*ݰ&&&&&&&+KKKKKKKKKKKKKKKKKKDFFFFFGFFGGFGGGGGGGGJGGJGHHGJGHHJHJHJHJHJJJHJJJJJJJJJJJJHJJJHJJJHJJJHJJJJJJJJJJJJJJJJJJJJJJ?$$!!!==!!$!!===!!======!===!!!!=!!$====!!!==$!=$!=!!$$==!=$!!!!$!$$!=====$!$!$$$=========$!$$$======!!===!=$$======$$$=====$$$$======$=====!=>===>===!!==!$===========$=!====!!$=$=A=!!$==========!$====$=======$!$!==>==!!$==!==>=====!$$=$=>C==!$=!$=!!!===!=$$$$!===$==!$==$===!==$=====!!!$!$==$!$===!!!$!!$=$!!!====$=!!!!!=!!======!!!!!!!!!!!=$!!$$!!!=!!!!!!!$!!!!!!==!!!!!!!!!=$!!!!!!!!!!!!! !!!!!!!!!!!!! !!!!!!! !! !!   !    !  ! !!! qӳKKK666ii6666i6666i66ii66i6i6i66666666i666i6i6i6i666i66i66666i66666i66i666i666i66666iii66i66666i6i66i66iii6i6i66ii6i566666666i6i66i66ii6i % %&% &%&& & % & & & & & && % %% (ii6i6666i6i6666i6i66i6666i66i66i666i6i66i6i66666666i66666666iiii6ii6666666(%        i55666i66666i66666i6ii66666666i66666666ii666i666i666666i6i66666666i666i6i66i666666666666666666i6666i666666i66i66666i66666i6i6iKKKKKKKKKKKKKKKKKKKKJKKWKKJJKKKKJKJKKKJKJKJJJKJKJJKJJKJJJJJJJJJJJJJJJHJJJGJGGGGGGFFFFFEKKKKKKKKKKKKKK+OOO2O+11*4*31*333301԰ͭ+&&&&&&+KKKKKKKKKKKKKKKKFFDFFFFFFGFGGGGGHGHHGJHHGJHJHHJHJJHJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJ?==!!!!!!$=!!$=$!!$!!!=$!!=!!==!!=!$=$!$$$!===$$==!!====!=!$==$=!=$$==$$==$!====$!===========!$====!=====$$$====!======$=$!=========$=====$=============$!===>$==!=======!=========>@A@=@=@=@=====$=====$==$!=====$$$=====$===!$=====!=$===>9==!=====$=$===!======$===$===$!==$$===!===!=$$=$!$$$$====$$!==$!$=!!=$$$$!=!$!$!==!!==!!!!!!=$!!!!=$!!!$!$$$!!!!!$!$!!=!$!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!! !! !! !!!!   !     ! qKK66iii6iii6i6i66iii6i6ii6666iii6ii6i66666666i6i66i6iiiiii66i666i6i6i6i666ii6666i666666i6iiii6ii66i666i66666666666666666i6666i6i66i6666( % & & &%  & %& & % % &66666ii66iiii666i666666i6666i6666iii666666666ii6ii6666666666i6666666i66ii666i6         6i6666i66i666iii66i666666i6666i6i6i66i666i6666i6i66i6i6ii66i66666ii666666666i666ii6666i6i666i66666i6666i66i66i66666i6i6iii6i666KKKKKKKKKKKKKKJKKKKKKKJKKJKKKKKKKKKKKJJWKKJKJKJJJJJJJJJJKJKJJJKJJJKJJJJJJJJJJHJHJHHGGHGGGFGFFFFFFKKKKKKKKKKKKKKKKKKK+O2OOO+1**4*41*333331ݰ+&&&&&&+KKKKKKKKKKKKKKKKKKFDFGFFFFGGFGGGGGGHGHGHGJHHGJHJHJHJJHJHJJJJHJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJ?==!!$$$!!!$==!!$!!$=!!!$=$!!!!=$!$=!$!!!!$=$!!==!===!===!!$=!$$!$========!!$!====$======!$!!$$$==$!!!$=====$!$$$=$===!$==$==$!$$$$==!!======$$!====$=$====>>=========AAC_̖u@========$$==>====$!=============>===>====$!!==!===!!!$!$=====C=!!$!!==$!==$!!!===!!$!!!$!$=$=!!!!!===$=!!$$$!!==$!$==!!===!$!!!!!$==!!=!!!!$==!$!!$==$!!!!!=!$!!===!!$!!!!!$!!!!!!!!!!!$!!! !!! !!!   !!!!!!!!!!! !  !!! ! !        ! !!  !!qӳK66666666i666i6i6i6666666ii66ii6ii6666i66i6i66i6i6666666666666i6i66666ii66ii6i66666ii66i666i6666iii6i66666666666ii66i666i66i666i666i6ii6i(& & & & & &  % & % %66666666666666i6666666i6ii666i6666666666666i66666666666ii66666666ii6i6i66666666            666i666i666666666i666i6i6i66666i66i6i66i6666ii6i6i6666i6ii6i6i6iii6i6666iii6666666i66iii6i66i66i6i6i666666ii6ii6i66i666i666i666KKKKKKKKKKKKKKKKKKKKKKKKKKKJJKKJJKKKWKKWKKJKJKHHHKHJKJJJKJJJJJJJJJJJJJJJJJJJJJHJJHJGJGHGGGFGFGFFFFDKKKKKKKKKKKKKKKKKKK+OOOO2+11*4*3**333331ݰ+&&&&&&+KKKKKKKKKKKKKKKKKKFGFFGFFFFGFGGGGGGHGHGHGHGJHGJGHHJHJHJJJHJJHJJHJJJHJJJHJJJHJJJHJJJHJJJJJJJJJJJJJJJJJJJJJJJJs?==!!$$$!!$!!!!$!$!$$$!$!!!==!$!!=!==!=!=!==!==$!=!$=$$==!====!!==$=!==$$$==$==!!!==$$$=!===9===!$========$$==$!=======$=!=====$=====$=>=$=====$$====$$=======$=$===@zxC=!=========!===============$$=$>===!$===$$==!=!=====$=$====!$==$==$=!=$=$=!==$!==$!===!!$!$=$$$$$!=!==$!!=!!=$$=!$=$$=!!!=!!$$!=$!!!=!$$!!$$!!!$=!!$!!!!!!!!!!!!$!!!!!=$ !!!!!!!!!!!!!!!!!!!!!!!!  !!!! ! !!! !!!!!!!!!!  ! !   !!qKKii6i6i6i66ii66i6ii6i66i66666666i6i6i6i6i6666666666iii6i66i6i6i66i6i66i6i6i66i666i66666i6iii6ii6ii66i6i66666666666666ii66ii666666666666i6% % % & & %& &  & % & & & & & & %(666666666666i66i666i6666i666666i6666666666666666666i6i66i66iiii66i66i6i66i66666         6i66i6666i6666i6666i6666i6i66i6i66i6666i66666666i66666iii6i6i66666i6666i6666666ii6i666i666i66i66i6i6i6666i6ii6i66666i6i66i666iKKKKKKKKKKKKKKKKKKKKKJKKKKKJKKKKKKKKKKKKKKJKJJKJKJJKJJJJKJJJKJJJJJJJJJJJJHJHJHHGJGGGGGFFFFFFFKKKKKKKKKKKKKKKKKK+OO2OO++1*4*44*1333331&&&&&&&+KKKKKKKKKKKKKKDFFFFFFFGFGGGGGHGHGJGHHHJGHHJHJHJHJHJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJsl==!!$!!===$!$$=!!!=!$===!$==$==$$$!!!!!===!!!!!$$!=!!!$!$=$==$===!=!$=!===!$!!!$=$=9!!$==========!$!!!$$======!$======!!$$=>A>==!=====!=====$$=!=====!!!=!==@x@===!!!$!=========!!$=!!!!!!=$$====!=$$=========!!=$=$!======!!$$!$==$!$$==$!=$$==!$====!!$$!!!$!!!!=$!==!$!$=!!!$!!!$=$!$=$!!!!!!$=!!==!$!$=!!$!!=$!!!$!!!=!!!!!!!$=$!$=!!!!!!!!!$!!!!!!!!!!!!!! !!!! !!!! !!!!!!!!!! !!!!!!!!  !!!       !! !      !pӳKKK6i66666666666666i6i666iii666666666ii6666666666i6i666i66i6i66ii666ii666i66i6i6i666666i666666i666666i66666666666666i6iiiii6666ii6i66ii6i6i &  & &  %& & %66iii66i6i66666i66ii6i6i6ii6i66i66666i66666i66ii6666666666i6666i666666666i666i66            66i66i6ii666i6666i6i666i666i6i66i666i6666ii6iiii666i6i66666i6666i6ii66i6ii6ii6i6666i6666i66i666i6i6i666666i66666i66i6i666i6i6iKKKKKKKKKKKKKKKKKKKKKJJKKWKJKKKJKJJJKJWKJJKHJKJJKJJJJJKJJKJJJJJJJJJJJJJJHJJJHJGHGGGGGFGFFFFFFKKKKKKKKKKKKKKKKKKK+2OOO2+1+*4*4**333301߰+&&&&&&+KKKKKKKKKKKKKKKKKKFFFFFFFGFFGFGGGGGGGHGHHGHGJGJHJHJHJHJHJJHJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJj!!==!!!!$!!!!$==!!!!!=$!!==!==$$!!!!$=!$$$$!==$!$$$!$!!$$$$$$==!!=$!$=$$$$!$$=!==$=====$$$$$!======$===$$=======9===!========$$====$!=======!$====!=!!=====!====]u==$=====$===!$==!$!=$====$!===$!=$=====!$!=!=====!!=$=$!===!!$!=$==$!==$!==$$!$=!$$$=$!$$$!$$!==$!$!==!!!=$!$$!!$=$!!!!!!=!=!!!$!!!!!!!!!=$!!!!!!!!!!!!!!!!!!!=!!!!!!!!!!!!!$!!!!!!!!$!!!!!!!!!!!!!!!!!!  !!!!! !!!! !!!!!!!!    !   =qӳKi6i6666ii6ii6666i666666666i666i666i66i6i6i6666i6i6i6666666666i6i666i666i666i6ii6i66i66i6iiii6666i6i66i666i66i6666666i6666i6i6666i6666(5% 5( & & &&& & & & && & &6i66iiii6i66i6i6ii66iii6666i6i6i666i66i6ii6i66666666i66i666ii6i6ii6666i6i6ii6666(         6665 i6ii66ii6666i666i6666i6i66666666i6ii66ii6666666iii6ii6ii6i66iii6i6i66i6i66666666i666666i66ii6i6i666666666i66i6iii66i666i6i666iKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKJJKKKKJJJKKKJKWKJHKJKKJJKJJJKJJJJJKJJJKJJJJJJJJJJJJJJJJJJJJHJGJGJGGGGGFGFFFFFFKKKKKKKKKKKKKKKKKKK+OO2O2+1112*44*103333*+&&&&&&+KKKKKKKKKKKKKKKKKKEEFFFFFFFGGFGGGGGGGHGHGJGHJGHGJHJHJJHJHJJHJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJ}?!!!!!!!!!!!!=!!!!!=!!!!!======$!!!!$==!!!======A=====9$$$$!!=====$=!!$==$=$!!$$====!===!==$!=======!!==>=$!=!!!!$===$!!$==$!===!=!!$=====$=====>==>Cxx@======!!$!========$>>====$=!$!$====!$===$!=$=!$!!$$!$=$===$$!=====!!!=!=!!$==!!======!!$==!!=$$!!!$!$$!!$!!!!=$=!$!$=$$=$!$!!!==$!!!!$!$=!$=!!$!!!!=$!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!  !  !!!!!!! !!!!!!!!!!!! !!!!! !!! !!!   !   ! !!  !!!!!!!!!!   !!! !!!! !!  !!!!  ! ! $qӳKKKK66666i6666iii666666666i6i6666ii6iii6666666i66i6666666666i6i6i6i66i66i666i6i6i66ii66ii66i66666ii666666ii6i66666i6iii6666i6i66i6666i66i% (666ii6 &  &   & & & & % & (6i6556666ii666i666666666i6i6666666666666666i6i6ii6i6i6i66i66i6i66666666666ii6ii665         666666i666666666ii66i6i666666i66i66666ii6i66666666i66666666ii666i66666iii6i66666i6666i6666ii66i66i6ii6ii66i6i6666666i6666i6i666i6666KKKKKKKKKKKKKKKKKKKKKKKKJKKKJKKJKKJKKJKJJJJJJJKJJJKJJJJJKJJJJJJJJJJJHJJHJHJGHGGGGFFFFFGEKKKKKKKKKKKKKKKK+OO2O2+11*4*431*333331ذͦ+&&&&&&+KKKKKKKKKKKKKKKEFFFFFFGFFGFGGGGGHGHGJGJGHJGJHJHJHJJHJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJl!!!!!!$$!!!!!!!!!$!!$!!!!!!=$!!!!$=!!!$!!$$!!$=!$!$$!==!===!$$!$$=$$$$!$=!=!==$!$!=$$==$$!=!=$===!==$$$====!=======!====$$$=$!===!===$===!===!======$===$=$=@xxA=$=====$$$!$===!=====$!=$===!=====!!===$=$==!!=$$=!!==!!==$=!=!=$$=!$$!$$!!$$$!$!9$$=!!==!==!$$!$$!!!!!$!!!!$!!!!$!$!!=!!!$!!!$$!!!!!!!!=!!!!!!!!!$!!!!!!=$!!!!!!!!!!! !!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!! ___9YY  ! !$qKKK666i6666i66i66ii66i6666ii666i6i66i6666666i66i6666i6iii6i6i6666666666i6i666666i6666i6666i66i6i66666666666i66ii6ii66iiiiii6i666ii6666i66(i6666i &  & &  && % % ii666666i6666ii6i666666i66i66i66iii6666666i66i666i66666666i6i6666666i6ii6i66i666i66        i66i66ii6i666i6iii6666ii6i6i666666666666i6i6666i6i6i66i66ii6i666666i6i666i6666ii666666iii6666i66666ii66i66666666666i6666i6i6i66ii6i66iKKKKKKKKKKKKKKKKKKKKKKKKKKKKJKKJKJKJJKKKKJJJKJJJJKKJJKJJJJKWKJKJJJKJJKJJJJJJJJJJJJJHJHJHGJGGGGGFGFGFFFKKKKKKKKKKKKKKKKKKK+O242O+1Q1*2*44**333331ݰͦ+&&&&&&+KKKKKKKKKKKKKKKKKKEFFFFFFFGFGFGGGGGHGHGHGJGHHHJHJHJHJJJHJJHJJJHJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJ?!!!$!$=====!!$==!$$!!$$==!$==$!!!$!$$$!!$$=======$!!$!!!!$!!!======!!!$=$!$=$!!$=$==!$$===!!$=$===!!!!$!!!!$====$$$==============$!!==$==$!$!===!=!=BC!!!$$!!!=====!!==!!$===!!!$$!$$====!====!!=====!$=$!==$$!!!!======$==$!==!!!!$$==$!$$!$$!!====!!$!======!$!!!$===!!!$$!!!!!!!===!!!!!!!!!!!!!!!!!$$!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!! !!!!!!!!!!!!!!!      !pӳKK666666i666i6i6ii66666ii6i6i66ii666i66i66i6i66i66i6i6i6i6666666i66i6i6i666iiii6ii666i6i6666i66i66666ii66ii666i6i66i6i66666i666i6666i6i6666ii66& & & && &   & & & & & & & %666666i6i66666ii66ii666i6666i6666i66666i6i666666666i66i666i6666i666666666i66i666666i5  (       6666666i66i6666i6666i66i6i66i66666666ii666ii666i6ii6i66666666666ii66666666ii666i66i666i6iii66666i6i66i6ii6i666i66i666i666666ii666i6666KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKJKKKJKJKKJJJJKJKHJJJJWKJJJJJJJJJKJJJJJJJJJJJJJJJJJJHJGJGJHGGGGFGGFFFFEDKKKKKKKKKKKKKKKKKKK+2O2O2+11*44*44**33330*ަ+&&&&&&+KKKKKKKKKKKKKKKKKKDFFFFFFFFFGGGGGGGHGHGHGHGJHGJGJHJHJHJJHJJHJJJJJHJJJHJJJHJJJHJJJHJJJJJJJJJJJJJJJJJJJJJJJJJJ?!$!!!!!!$!!!=!!=!!!$$$$!!$!!===!!=!$!!$!!!=!$$!=@=$$!!==!$!!$=$!$=!$$$$$!!==$!===!!!$$$!$==!===!==!=$$$!===!$$$$====!=!=!=========$$=!=$$==$===$=======@@=!$==$$$====$!$=!!$!===$$$===$====$$!$$!$$!$$==!==$$!$=$$$$!$=$===!!$$==$!=!!!!==!!$$!$==!$!$=!!$$!!!==$$!!!=!!!!!!!$$$$!$!!!!!!$!!!!!!!!!!!!!!!!!!!!!!!!!!!!$!!!!!! !!!!!!!!!!!!!!!! !!! !! !!!!!!!   _!   =qӳKKKKK666iiii6i66i6i6i6i6i6i6i66i6ii6666i666ii666ii6666i6666666iii6666i66i66i666i6i66i666i6666i6i6666666i6iii666i6666i6i66iii6i6i66i666iii666ii6666      & & & & & 6i5666i666i6iii6i6i66i6iii666666i6i66i666666i666i66ii666666i6666ii66i6666i6ii6i66666ii  66       i66iiii66666i66i66666iiiii6ii6666i66i666i66i6i6i66ii6iiiii6ii6ii6i66i6666ii6i6i6666i666666iii6iii6i6i6iii6iii6i666ii666i6i6i66ii6ii666KKKKKKKKKKKKKKKKKKJKJJJJKJJKJKWKKJKJKKJJKJKKJKJKJJKJJJJJJJJKJJJJJJJJJJJJJJJJJHJHGJGHGGGFGFFFFFFKKKKKKKKKKKKKKK+O2O22++1144*44**33333*ذͦ+&&&&&&+KKKKKKKKKKKKKKKFFFFFFFFGFGGGGGGHGHGJGJGJHJGHJHJHJHJHJHJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJ}?==!!=!!!!!!$!$!!!!=$!!==!!$=$!$!===$$$$!!!!$!!$=$$$$=!!!===!!!!!$!$==!$=!==========!!=!$=@===!!!!================$!!!!=!====$$$==!!$$$!$!==Zu=======!======$!$========!$$=!=!!!$===!!$!$!==!$==!!$!$$=$!==!!!!!$==!==$!$$$===$$=$!!!!!!!!$$$!!=!!!$$!!!$!!!!!!!!!!!==!!!!!!!!$$!!!!!!!!!$!!!!!!!!!!!$$!!!!!!!!!!!!!!!! !!!!!! !!!!! !!!!!!_ !  !  qӳKK6i66i6i6ii666i6666i6666i6i6ii6ii66i6i6i6i6i6ii666666i6ii66iii666ii6i66666ii66i6i6666ii66ii66i6i666i666i66ii666666666ii66i6ii66i6iii6iii66i6ii ii &  & &   &  & & & & 566566iii6ii6ii66ii66i6iii66i6i66i66666i6i6i66i6ii6ii66ii6i66i6i6i6i666666ii6i6ii6666i6i%%5       66i66i6i66ii66666666i6ii666i66i6i6i666iiii6iii66ii6i66ii6666666666666iii66i66i66ii666ii66666666ii6iii6i6i6i6ii66666iiii66i6iii6666ii6i6KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKJKJKKKKJJJJKJJKJKJKKJJJJJKJJKJJKJJJJJJJJJJJJJJJJHJHJHJGHGGGGFGFFFFGEKKKKKKKKKKKKKKKKKKK+2O2O2+1Q1*4*44**33333*԰+&&&&&&+KKKKKKKKKKKKKKKKKKFFFFGFFFGFFGGGGGGGHGHGHGHGJHHJHHJHJJHJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJj!=!!!!!!!!$!=$!!!$!!!!$!!!!!!!$!$!$=$!$!!!$$!!!!!$$!!!===!$!$===$!=$$!!$=$!=$!==$===$==!!====$$=$$$$=========!=====$$!$==$$!$===$===$$=$$$!=$====z@======!=====$!!==$$====$$===!$!!==!$=$!$!!!!!$==!$!!!!==$$=!=!=!$=$$=$$!$$!$!==!=$!$!!!!$$$$!!!!$!$!!!!$!!!=$!!!!!=$!$!!!!!!!!!!!!!$!!$!!!!!!!!!!!!!!!!!!!! !!!!!!!!! !!!!!! !!  ! !!!!!  ! !! !  !_    !qKKKKK66i666666i66i666i66i666ii666666ii6i6666ii6666666666i6666i66i666666i6i6iii6666i66i6i6666iiiiii66ii666iii66iii6i66666i666666i6i66ii66i666i666ii666i66  &    &  & & (5666666i6ii6i66i6iii6ii6i66ii66i6ii6ii6i66i66i666666i6666i666i6666i6iiii6i6666ii6i6ii66      6i66i6666i6ii6666i6i6i66i66iii66666ii66i66i6666i6i6ii6i6666i66i6ii6iiii6666ii6666i6i6iii666i66666ii66ii66i6i66i666i66i6ii666iii666iii6iiiKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKJJKKJJJJKWKKKKJJJJJJKJJJHJJJKJKJJKJJJJJJJJJJJJJJJJJJJJHJHJGJGHGHGGGGFFFGFEFEKKKKKKKKKKKKKKKKKKK+O2222+11*24*44*133333*צ+&&&&&&+KKKKKKKKKKKKKKKKKKDFFFFFFGFFGFGGGGGGGHGHGHJGHGJGHJGJHJJHJHJHJJHJJJJJJJJJJJHJJJHJJJHJJJHJJJJJJJJJJJJJJJJJJJJJJs?!!!!!!!$$!!!!!!!!==$!!$!!!!$!!$!$!!$=!!!$=$!==$!!$$=!!=$!!!=!==$!!$========!!====$$!!!=$!!!$!!!$==!$===$!!!!!!!!$!!!!!======$$!!!$=====$!$=!=====@ƃxC=====$$=CxZ=$===!!!!!$======!!$!$!$!$!$$===!$=========$==$=======!!==$!!$$!$$$!!!!=!!!!==$!!!$!!$$!!!!!$!$$!!$==$!!!!!!$!!=!!!!!!!$!!!!!!!!$!!!!!!!!!=!!!$$!!!!!!! !!!!!!!!!!!!!! !!!!!!!!!!  !!!!!! x =}ӳKKKKi666i66i6i66i6i66666i6iiii6ii6i6iiii6i66i66666i6ii6ii6i6666666i666ii66i6ii666i6i66i66i666iii6i6ii6ii6666i66i666ii66666i66i666i6ii66ii6i6666iii666ii  &    & &  && % 6ii666i6i66666ii6i6i666i666i6ii6666i6666i66i666i6666i6ii6i66i66i6ii66i666i6ii6ii6i6666i66i     i66ii6i6i666i6ii66i6i66i666i6i6i6iiii6i6ii6666i6666i66ii66i6i6i666i666666iii66ii66i66i66i6i6i666666666ii66i666666ii666666i66i66i6i66i6i6iiKKKKKKKKKKKKKKKJKKKKKKJKKJKKKKKWKKJKKKJKJJJKJKJJJJKJJJJKJKJJJJJJJJJJJJJJJJJJJHJHJGJGGGGFGFFFFFEKKKKKKKKKKKKKKKKK+22O22+1+*Q4*431*33333*ݰЦ+&&&&&&+KKKKKKKKKKKKKKKKFFFFFFFFFFGFGGGGGHGHGJGHJGHJHJHJHJHJHJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJs?!!!!!!!!$!!!!=!!=!!!!$!$!$$!!!!$!!!!$=!!=!$=!!!!!=!=$!$!!!$==$!$$====$$===!!=$!$=$!$!$$!$$!$!$=!!==!!==!!!!$=$=$$$!$!$$===$$$$$!!=====!$==$====Cx@$!!!=$==!!==@===!==xx===$$$=$$==!==!==!=$!$!$!$=!=====!$$!=!!=$!!$!!=!====$=!$$!!!$==!$=$!===$!!!$=$!$$!!==$!!!$!$$!$$!!!=!!!!!!!!!!!!!!$!!!!!!!!!!!!!!!!!!!!!=!!!!$!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !  !!! !!!! !!  !!d   !!  =}ӳKKKKK666i666i66666i666i6i6i6i666i6666iii6i66i6i666666i6666ii66iiiii6i6i666i6i66i66666i66i66i6i66i6i6i6ii6666i666i6i66i66i6666i66ii66iii6i66i666i66ii6ii66 & D     &( 6i6i6i6i6ii66i666i666iiiii6i666i6i66i6ii6ii66i66i66666i6i6666i666ii666666i6i6i6ii6i66iiii6i66i     6666666i6i6iiiii66i6ii66i66666666i6i66666ii66i666666iiii6iii6i6i6ii66ii6666i6i6iii6i66i6i6i666ii6666iiii6i666i6iii66i6666666666iiiii6ii66i66KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKJJKKJKKJJJKKKKKJWKJKKJKJKKJKJJJKJKJKJJJJJJJJJJJJJJJJJJJHJJHJHJGJGGHGGGFFGFFFDKKKKKKKKKKKKKKKKKKK+04222+1Q1*44*441103333*ݰצ+&&&&&&+KKKKKKKKKKKKKKKKKKDFFFFFGFFGFGGGGHGHGHGHGHHHGJHJHJHJJHJHJJJJJHJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJm!$!!$$!!!!!!$$=!!!!!!!!$$!==$$!!!!$!!$=!!!!!!=!$$$$!!!=$$==$!!$!=!$!$=!!!$$=$!!$!$=!=!$$===!$=!!$==!=$!!$$$=!$$$$$=$!!===!======!!!!$$$==$!!$=ZZ==$$$==$===$$====!$!!!$=_=!!===!!===$!!!===$$===!===!!!!==!$$===$!$===$!!!!!====$$!!!!!!!!!=!$!!!!!!=!!!!!!!!!!===$!!!!==!!!==!!!!!!!!!!!!!!!==$!!!!!!$!!$!!!!$!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!  !!!!!!!! !! !!!!!  ! !_   qӳKKKK6i666iii6i6666ii66ii6666iii6i666ii6i6iii66666i66ii66ii6ii6ii6i6i66ii6i6666ii6666666i66ii666iii66i666i66i6i6666iiiiii6i6i6i6666ii6i6i6666iii6i6i66666EDDD     & & i& i66i6i6ii6i66ii6ii66ii666666i6i6i666666666i666i666ii66ii6666i6i666ii6i6ii6666iii666i6ii6i666iii5    66ii6i66666iiii6iiiii66ii6i6666i66i66ii6iii6i66i6i66i6i6666i6i6i66iii6i66i6i66666666ii66i66ii6666666i666i66ii6i66i6i666ii66iii6666ii6i6ii6666KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKJJKJJJJJKJKKJKKKKJJJKJKJKWJJJJJJJJJJKJJJJJJJKJJJJJJJJJJJJJJJJJJHJHJGJGHGGGFGFFFFFFFFKKKKKKKKKKKKKKKKKKK+O2222+11*44*Q311333331ѭר+&&&&&&+KKKKKKKKKKKKKKKKKKFFFFFFFFFGFGFGGGGGGHGHGJGHGJHGJGHHJHJHJJHJJHJJJHJJJHJJJHJJJHJJJHJJJHJJJJJJJJJJJJJJJJJJJJJJJJ?!=!!!9!!!!!!!!!!!!!!!!=!$!=!!!!!!=!!!$!!$!!$!$!!$!!!=$!=$=$!!!!==!===!=!!$$!$=!$$!!!!!==$!$=!!!$$$$$!!=!==!==!==$!==$$======$!=$!!====!!=Z@$==$$!==!!===!!==$$!$$!$!$===C=$=$$=!==$$$!$=!$=$!!=$===$!$!!!=$!!==!!=$!$!=$!!!==!!!=$$!!!!$!!!!!!!!!===!!!!$!!$!!!!!!!$=!!$!!!$!!!!!$!!!!!$!!$!!!!!!!!!$! !!!!!!!$!!!!!$!! !!!!!!!!!!!!!!!!!!!!!!!! ! !!!  ! !!!!!!!! ! x    !   qKKKKKi66i6666i66666666ii66ii6i66666i6i6ii6i66iii6iiii6i6i666i66i6i6ii666i6i666iii6i6i6i6i66ii6i6i66i6666666i66666i6iiii6ii66i6iiiiiii66iii666i6i6i6666iiiEEDED & & E6  & i6 6i6i66ii6i666i666666ii6i6666i66ii6666666i666666i6i66i6666i6ii6i6666i66ii6666ii666i666ii6i6i666iii6666i  666ii666ii666i6i6i666i66ii6ii66666666iiiii6666i66i6i66iii666666i66iiii6666i6i6i6ii6ii6i66666666iii6i6i666i666666iii6i6ii666i6666666iii6iiii6i6iKKKKKKKKKKKKKKKKKKKKKKKKJJJJKKJJJKWKKKJKKKKKJJJJKJJKJKJKJJJJJJJJJJJJJJJJJJJJHJHJHHGJGGGGFGFFFFEKKKKKKKKKKKKKKKK+2O222+1*134*44**33333*԰ͦ+&&&&&&+KKKKKKKKKKKKKKEEFFFFFFGFGGGGGGHGHGJGHHJGHHJHJHJHJHJJJJHJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJso=!!!!!!!!!!$!!!$!!$$$!!!!!!!!$!===!!!!!!==!=!!$=$$=!!!!!!!=$!$!!!=$!=$!$!!$$====$!===!!==!====$$$====$$=====$!!===$=!!!$==!==!$=====$!$=$Z=$=!==$!$!$=$!==$!==!!==$==$!!!==@x!!!!!=$$=!$$$!!==!!$=$!===$!===$=!!$===$!!=$==!!$=!========$$$$$$!!!!$=!$$!!===$$==$!!!!!!!!!!!!!!$!!!!!!!!!!!!!!!!!!!!!!!$=!!!!!!!!!!!!!!!!!!!!! !!!!!!! ! !!!!!!!!!!! _     =sӳKKKKKi6i66666i666i6ii6i666ii666ii6i6i66666666i6ii6666i6ii6666iii666ii6666666666666666i6666i6i6i66i66ii66iii6i666i666666666666ii66iii6i66666666666i6i66666EGD 6ji6 66i& 6i666i6i6ii6ii66i666i666666i666666i6iii6666iii6ii6666i6i6i666i6i6ii6666i6i666ii666i66i666666666i6i6i66 6iiii6i6ii6666666i6i6i666ii666ii666i666ii66666i666i6ii666666666ii6666ii666666iii6i6ii6i66666iii6666i6i666666i66ii6666iii6iiiii6666iii6i666666666KKKKKKKKKKKKKKKJKKKKKKKKKKJJJKKKKWJKJJKKKJKJKJJJKJJJKJJJJJJJWKJWKJJJJJJKJJJJJJJJJJJJJJJHJHJHJGHGGGGFGGFFFFDKKKKKKKKKKKKKKKKKKK+22222+*1144*44**333301ݰ԰+&&&&&&+KKKKKKKKKKKKKKKKKKEFFFFFGFFFGFGGGGHGHGHGHHGHJGJHJHJHJHJJJHJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJo!!!!$$!!!!!!=$!!!!!!$!!!!$!!$!!!==$!$$!!!!$!!!!!=!!=!!!==!!$!!!!!!!$$!=$=$!!==$==$!==$!!=$!!===$!!$!===$==!=$=$===!==$!$!======!$!!====!$=Z@===$!$=$!$!==$===!==!!$!$!==$$!!$==!@@$!$$!!!!==!$=$$!!===!==!$==$!$==$!!$$!!=!!=$!==!!=$!==$!!==$====!!!!$$!!$=$!!$$!$9!==$$$!!!!!$!!!!!!=$!!!!!!!!!=!!!!!!!!$$!!!!!!!!!!!!!!!!!!!!!!!!! !! !!!!!!  !!!! ! !  _      =}ӷKKKKKi66666i6i66666ii66i66i6i6i66i66ii66i6i666iiiii6i6666i6i6i6i66i66i6666i6i66i6ii666666666ii6i6i66i66iii666iii66ii6i66666i66ii6i6666iiii6666666i6i6ii6iEDD66ii8i6i &6i6665666iiiii66i6i6iiii666i66i6i6iiii66ii6ii66i666i66i666i6iiiii66iiiii66666i6iiiiiiii6i66ii6ii66i66i6ii666D66666666i6iii6i666i66666666i6i6iiii6i6ii666i6i666iii6i6i6666i6666i6i66i66i6i66i66666666ii6iii6iiii6i66ii66ii66666i6i6i66iiii6ii666iii666ii66666iKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKJJKKKJKJKKKKKKKKKJJHJKJJJKJJJJHKJKJKJJJJJJJJJJJJJJJJJJJJJJJJJHJHJHJGJGHGGGGGFFFFFFFFKKKKKKKKKKKKKKKKKKK+22222+1*1P4*44*ݰ*3333M*̦+&&&&&&+KKKKKKKKKKKKKKKKKKEFFFFFFFFFGFGGGGGGGHGHGJGHJGHGJHJHJHJHJJJJHJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJӏo!!!!$!!!!!!!!!!!!$$!!!!!$!!!!!!!!!!!!$!!$!$$!!$$==!!$@=!$!!=!!$$=$$=!!===!!!!===!!!$!!$$!$=$!$!!==$=!=!!$$$$=!!!$$!!!$$=$!!$!==!=$!!!Zu!=$$==!$!$==!$=$!!=!$===!$===!!=====$$!$==u@====$$=$$==$!!====$!===!!$=!!$!!!=!==$$$=!==!!==!==!!!!!!!!!!!!=!$=!!!!!!!!!=!!!!!!!$!!$!!!$$!!!!!!!!!!!!!$!!!!!!!!!!!!!!!!!!!!!$!!!!!!!!!!!!!!!!@ZZ[Z@!! !!!!!!!!!!!!! !!! !!!!!  !_ =qӳKKKKKKKKK6ii666666666i6666i6iii6i66i6666iii6i6i6i6i6i66i6iii6i666ii66iiiiii6i6666i6666i6i6i66i6i6i66ii6i66i6666i66i6i6ii66666iii6i6i66i6ii6i66iii6ii666iiiii66EGEiiiEE8iii656666ii6ii6i66i6iii66i666i6i6iiii666ii666i6666i6i666iiii6i6666ii6i6ii66iii66i66ii6iiiiii666iiiii66i6i66i666i6i6D66i66i66iiiiiiiiii6i6ii6ii6666666666i66i6i6ii6ii666i666iii6ii666666i6i66666ii666i66i6i6i6iiiiii66iii6iii666i66i6i666iiiiii66i6iii66i66i6iiii66i6KKKKKKKKKKKKKKKKKKKJKKKKKKJKKJJKKKJJJKKJKJKKJJJJKJJJKJKJJJJKJJJJJJJJJJJJJJJJJHJJJHJGJGHGGGFGFGFFFEKKKKKKKKKKKKKKKKKK+22222+*1*44*4Q1*333331ͦͦ+&&&&&&+KKKKKKKKKKKKKKKEFFFFFFGFGFGGGGGHGJGHJGHJGHHJHJHJHJJHJJHJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJ鬏l!$!!$!!!!!!!!$!==$$!!$$!!!!!!!!!!!!!!!!!$=$!$$==$$!!$$$!$==!!!!==$$$==$!!!=$!=$!!=$$!$!!!==!!$!!!==!==$!!!=!$!!!$$$!!!!$=$!!!!$@@==!=$!==!===!$!=$!$!====!=$$!!====!$$===!@===$=!!$==!!$==!!==!!====!!$$!!$!====!!==!$!!!!!=!!!!!$$!!$$!!!!!=!$=$!!!!!!$!!!!!!!!!!$$!!$!!!=!$!!$!!!!!$!!!!!!!!!!!!=!!!!!!$!!!!!!!! !$!!!!!!!!!@z@! !!!!!!!!!!!!! !!!!!! !!!! ! _! !! pӳKKKK66ii66iii6i6iii666ii66i6ii666iii6666666i66iiiii6ii666666i66ii6i66i6ii666666i66iii6666666666i6iii66iii666ii6ii6i6i6i66ii6i6ii66i6i66i6ii6ii6iii6666666DDD666E66i666iii6666i66i6666ii6i6666i6i6i6666iii6i6666ii6iiii666i66666666i6ii66ii66ii6ii6i6ii6i66ii6666iii6i6i66666i6666iii6D i666i66iii66666ii6i66i6iiii666i66i6666iiii6i66i6i6ii6i666ii6i6iii66666i666666ii666i6i6i6iii6666i6i66ii6666ii6i66iii6iii6666666i6ii6666ii6666ii6iKKKKKKKKKKKKKKKKKKJKJKKKKKKKKJKKKKKJKJKJKJKJJKWKJKJJKJJKWKJJKJJJKJJKJKJKJJKJJJJJJJJJJJJJJJJJJJJJHJHJHJGHGGGGGFFFFFEFEKKKKKKKKKKKKKKKKKKK+22222+144*134*44*ݰ133333*Ԧ+&&&&&&+KKKKKKKKKKKKKKKKKKFFFFFFGFGFGFGGGGGHGHGHHGHJHJGJHJHJHJJHJJJHJJHJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJo!!!!!!!!!!!!!!!!!!!!!$$!!!!!!!!!!$!$!!!$!$$=!!!!!!!!!====!==!!$!!!!!!!=!!$=!!!!=$!$$!!===$===!!$!!==!$$=!!!=$$$$$!$=====!$====!!=====@!!!!==!!$$=$$==!==$===$!!$!!$=$=!$!$$!==$$!!$===z!!==!!!==!!$!!!!==!$!!$!$$!$$=$$!!!!$=$!$!!=$!!!!!$=!$$!=====!!!!$!!$!$$!!!$!!!!!!!$$$!!!!$!=!!!!!=!!!!!!=!!!!!!!$!!!!!!!!!!!!!!!!!! !$!!!!!!!!!@Y!  !!!!!!!!!!! !  _   qKKKKKKKi66i666i6ii6ii66ii6666i6i6i6iii6iiiiii66iii66i6i66ii6iii6i6i66666iiii6i6i66i6i6iii6i6i666i6ii66i6i6666ii6ii6iii6i666666i66i6i66ii6i666iiiiii666i6i66iEEDDi66i6i66i666iii6666i6ii6i666ii6iii6ii66i6ii6ii66ii666i6i66666i66i6i6iii6i66i6i6i6i66i6ii6iii666i6iiii6ii6iii6iiiii66i66Dii6i6ii6ii6666iiiii6666iii666ii6i6i6iii666666ii66i66i666ii6666iii6i6iii666iii6iii6i6i6i66i66i6i66i6i666i6i6i66iiiii6i66i6iii66i666ii6ii6i6iii666KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKJJJJKKKJJJJJKKKJJJJJJKJKJJJJJJJJJJJJKJJJJJJJJJJJJJJJJJJJJJJJJHJHJHJGJHHGGGGFGFFFFFFEKKKKKKKKKKKKKKKKKKK+22222+*41*44*421*333331ݰަͦ+&&&&&&+KKKKKKKKKKKKKKKKKKFFFFFFFFFFFGGGGGGGHGHGJGHGJGHJGJHJHJHJJHJJHJJJJJHJJJHJJJHJJJHJJJHJJJJJJJJJJJJJJJJJJJJJJJJJJC!!!!!=!$!!!!!!!!!$!!!!!!!$!!!!!==$!!!!!!!!!!!$!!!$=!!==!=!!$!!!=!!==!!!=!!=!!$!===!!==$!!!!!!=!!!$!!==$!!!!!==$!!$==$!!!$====x$$=!$!$!$======$$!!==$!$!!$!$$!==$!!!!!==$=$!!==$Zx$!!!!=$===!!!!$$$!!!!!=$!$=$!$=!==!!!!!!=!!$$!!!!!$$$!!=!!==$!!!!$!$$$!!!!!!!!!!!!$$=!!$9!!!!!!!!!!!!!!!!!!!!!!!$!$!!!!!!!! !!!!!$$!!!!! @@!!! !!!!!!!!!!! ! !! _  !!    $pӷKKKKKKKKKKK666i6ii666i666iiii6i6i6666i6i6666666i6i6666i66ii66i6i66iii6i66i666iii6iii66ii66i66iii6i6ii6ii66ii6666i66i666i6i6666i6iii666i66ii6iiii66666ii6ii6i6666EGDD6i6i6i6ii66i66666iiii6i66iii6ii66iii666666iii6iii6i6i66i6i66i6i6ii66ii6ii666ii66iii66iii66i66i66666i6iiii6iiii6i666ii6iD i6i6666i6ii6ii6ii6i6iii6i66i66666ii66i6i6ii666ii6i6iii66ii66i6i666i66iiii6i6i6i6i666i6666ii66i6i66ii6666iiiii66666i6666666666iiiii66i66i66666ii6KKKKKKKKKKKJKKKKKKKJKKJJJJKKKKKJJJJKJJKJJJJKJJKJKJKJJKJKJJKJJKJJJJJJJJJJJJJJJJJJJHJHJGHGGGGGFGFGFFFFKKKKKKKKKKKKKKK+02222+14*134*4Q*ݰ10333M*ͦͦ+&&&&&&+KKKKKKKKKKKKKKKEEFFFFFFFFGGGGGGHGHGJGHGJHHHJHHJHJHJJJHJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJs?!!!!!!!!!!!!$!!!!!!!!!!!!!!!$!!!!!$!$!!$!!!!$$!!!$!!$!!!$!!!!!$$$$!$$!==!!=$!!$!!$$=$$=!!=!==!!=$$$==!$$!==$!$=!$$$$!$==!=!!$=!=!$!!xx$!$=!!$!$!=!!=!!$$$!==$!====$=$$$===$$====$=$$!=!!==@]!$==!=!$$!!$====!$!====$!!!!=!!!$=!!==!$=!$$==!!=$$=!$!!!!$!!=!!$!!!!$!!!!$$!$!$!$!!$!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!! !!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!! !_!  ! =sӳKKKKKi666i66i6i666i66iiii6i6i66i66i6iii666iiiii66i666iiiiiii6666i66ii6i6i66666i6i666i6i666ii66iii6ii66ii66i66i6ii66i66666i666i66i666iiii666i66iii6i6i66i66DDDDDi6i666i66ii666666i66i6iiii666ii6i6iii666i6ii66ii666i66i6i66ii6iiiiiiii66ii66i6i666iii6ii666i6ii6ii666ii66i666ii6iii66iiD66ii6i6iiiii666iii6666iiiii6i6i666iiii66i6iii6iiii66i66666i6i666i66i666666i666i6iiii6i6i6666666i66i66i66ii66i66iiii666i666i6i6ii66ii66i6i6ii6ii6KKKKKKKKKKKKKKKKKKKJKKKKKKKKKKKKKKKKKKKJKJJJKKJKJKKJKJJKJJKJJJJJJJKJWKJKWJJKJJJJJJJJJJJJJJJJJJJJJJHJHJHJGHGHGGGFGFFFFFDKKKKKKKKKKKKKKKKKK+22222+*11*44*321*333001ܰ԰+&&&&&&+KKKKKKKKKKKKKKKKKKEEFFFFGFGFFGGGGGGGHGJGHGHGJHHJHJHJHJHJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJs?!!$!!!!!!!!!!!!!$!!!$!!!$!$$$=!!===!!!!$$!$!!!!!!!$!!!!!!$!!!=!!$==!=!!==$=$!!==$!!!!!==$!!$!!!==$==!==$!!!!!!$=$!!$$!!===!!!$@Z=!!=$!!==!=!=$!!======$=$$$=!$==!!=!$$=======$!!$=$=$=$!==$=$=$!$====$!$$===$!$!!!!!$!$=!$==$!!!==$=$!$!=!!=!!!!!!!!!!!$=$!!!$!!!!$!!!!!!!=$$$$!!!!!!!!$=$!!!!!!!!!!!!!!!!!! !!!!! !!!!!!!!!!!!!!!@_!!!!!!!! !!!! ! ! !!_ !! !!!qKKKKKKKKKK6iiii6666iii666i6i66iii66iii6i66iii6i6ii6i666ii6i66ii66666i66i6ii6i6ii6ii6ii666ii6iii666i66ii6666i6i6666i666i6i66i666iii6666666ii66ii66ii66i6i66i6666DEDDD8666iiiiii6ii66i6i666iii6i66i66iiiii6iiii66i6iii66ii6i666666iii6ii666i6666iiii6ii6i66ii6i66ii6i66i6ii66iii6i66ii6i6i666iiDi6i6i6ii66iii66ii6ii6i6i6i6iii666ii66i6i6666i6i6i6i6i6i66ii6ii66iiii6i6i6i6iii6iiiiiii6666ii6i6i6ii66iii66i666ii666iiii66i6ii66i666i666i66i6i666KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKJKJJJJKKKKJJJKJKKJJJHJJJJKJKJJJJJKJJJJJJJKJJJJJJJJJJJJJJJJJJJJJHJJHJHJHGJGHGGGGGFFGFFFFFKKKKKKKKKKKKKKKKKKK+22222+14**44*4Q**33M33*̦ͦ+&&&&&&+KKKKKKKKKKKKKKKKKKDFFFFFFFGFGFGGGGGGGHGHGHGJGJGHHJGJHJJHJHJHJJHJJJJJJJJJJJHJJJHJJJHJJJHJJJJJJJJJJJJJJJJJJJJJJ?!!!!!!!!!!!!!!!!!!!!!!$!!!!!!!!!!!!!!!!!$$!!!!$=!$!!=!!=!!!!$!!!$!!!=!!!$$!!!$$!!!!$===!!!!$=!$$$!!!!!!$=$$=!!!!$!$=$!$=$!=!===]$$!$$$$!=!$$!$!$!$=$!!!!!$!!=$!==!$$$=$$$!!!!==!==$!!===$!!!$!$=!!$!!!!!=!!!!$=$$!!$=!!!$$!!!$!=!!!!$$!==!!$!!$$$$$!!$!!!$==!!$!!$!!!$=!!!!!!!!!!!!!$!!!!!!!!!!!!!!!$!!!!!!!!!!! !!!!!!!!!!! !!!!!!!!!!Z!!! !!! !  _!qӳKKKKKKKKKKKKKiii66i66iii6i6i666i6iiiiiiii666666i6ii666ii6666i6i6ii66i6i6i6i666i6666iii6i6ii6i666ii66i66666i6666ii6iiii666i66i6i666ii6i66666666ii6iiii666i6ii6i666iDEDD$i66iiii6i6iii6ii6ii66ii6i66ii666666i66iiii6i666i6i6ii6i666ii6666666i6i6ii66i66i6iiii6i6i666i66666i6i6i6i666i66ii6i6i666ii6DDD6666i66i6iiii6ii666i6iii66ii666i666ii66i6i66i66i6ii66iii6iiii666666iiiiii6ii6666ii66666iiii666i666666666i6ii6i6i6i66i6ii6iiii6ii6i6ii6i666i6iii6KKKKKKKKKKKKKKKKKKKKKKJKKJKKKKJKKKJJJKKJKKKJJKKJKJKJJJJJJKJKJKJJKJJKJJJJJJJJJJJJJJJJJJJJJHJJHJGJGHGGGFGFFFFFEKKKKKKKKKKKKKKKKKK+22222+*1*44*341ݰ*303331ަͭ+&&&&&&+KKKKKKKKKKKKKKEGFGFFFFGFGGGGHGHGHGJGJHJHHJHJHJHJHJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJ?!!!!!!! !!$$$$!!!!!!!!!!!!=!!!!!!!!!$=!!!$$==$!!=$!=!!!$!$!!!$!$!!!!!=$!==!$$$!!!==!!!!$!=!!!$$!!$=$!!$$!!!=!=$!!!!=$=$$z_=!!$$!!!!!==!$!!!$$!!!==!=!!$=!!!!$=====!!!!!=====!!!!$$$!!!=!!!=!=$!=$$!!!$$!!!==$$!!$$!$$!=!$!==!=!$!!!=!!!==$===!!$!!!!===$!!$$$$!==!!!!!!!!!!!!!!!=!!!!!!!$!!!!!!!!!!!!!!!!!!$ !!!!!!!!!!!!!!!!!!!! !!![! !! !!!!!!! ! _ !   ! !!!sӳKKKKKKKKi66ii6i66666i6666iiiii66ii66i66i6666i666i66i6i6i6i6i6i6i66i66i66666i66i6ii6iiii6666ii66ii66i66ii6iiii6i6iii66666iii666i6666i66iiiii6i6ii66666ii66i6i6DDD666ii66i6666666i6i6iii6ii66i6i6iiii66i6i6ii6i6666iii66666i6iii6ii6ii6i6iiii6ii66666ii6i66ii66ii6i66i6666ii666ii66i6ii666i6iDDD6iii66iii6i6iii666ii6ii66i666666ii6iiii66iii6i6i6666i66ii66i6ii66i6iii6ii6ii6i6iii6ii6i66ii66iiii6ii6iii66iii6i6i66ii6i66iii6ii6iiiii6iii6iiiii6KKKKKKKKKKKKKKKKKKKJKKKKKKKKKKKKJJJKKJKKJJJKWKKJJKWKKKJKKKJJJKWKJHKJKJKJKJKJKJJJKJJJJJJJJJJJJJJJJJJJJHJJHJHHJGHGGHGGFFFFFFFFKKKKKKKKKKKKKKKKKKK+22222+1444**43*43*13333M*بԦͦ+&&&&&&+KKKKKKKKKKKKKKKKKKDEFGFFFGFGFGGGGGGHGHHGJGHHJGHJGJHJJHJHJJJJJHJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJs?!!!!!!!!!!!!!!!!!!!!!!!!$!!!!=!!!!$$!!!!!!!=$!!!!!!!!=$!!!$=!$!!$!!$!$!!!$$!!$!!!!!!$!!!!$!$$!!==!$=!!!!$==!!==!$$==!$!==$$$!!!!@z=!!$=$$$$$=!==$!$$!!$=!$$$!$==!!===!!=!!$!!$!=!!!!=!=$!$===!!!!$!!!!=!!!$!!$$!$$!!!!!$===!!!=$!!!!!==!!!=$!!!!$!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!$!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!_!!!!!!! !!!!! !! !_ =pKKKKKKKKKKK6iiiii6i6ii666i6i66ii6ii6ii6i66i666ii6iiiii6iii66i6i666iiii6iiiii66ii6666666666i6ii6ii6iii66iii66i666ii6i6iiiii6iiii666i6iii6i66i66ii66iii6i66i6i6i66GGEDDii6iii6ii6i6ii6i666i6i666i66ii6iiiiii6i66i666iiiii6iiii6i6ii66i66i6i66666ii6i6ii6666666i6i66i6i6ii66i66iii66i6i66666iiii66iDi666i66ii66iii6i6i6666iii66i6ii6i666ii6ii6ii6i6666i6i666ii6i6ii6i666i66i66666i666ii6i6i666i6i66i6i6iiiii6ii666i6i66i666i66ii66i6ii6i6iii6i6ii6iiKJKKKKKKJKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKJKKKKJJKKKJJJKJKKKKKKJKKJKJWJJHJJJJJJJKJJJKJJJJJJJJJJJJJJJJJJJJJJJJJJJJJHJJHJHJGJGHGGGGFGFGFFFFDKKKKKKKKKKKKKKKKKKK+22222+*1*44*431ݰ*M33001ݰʰ+&&&&&&+KKKKKKKKKKKKKKKKKKFFFFGFFFFFGFGGGGGGHGGHGHGHGJGHHJHJHJHJJHJJHJJJHJJJHJJJHJJJHJJJHJJJHJJJJJJJJJJJJJJJJJJJJJJJJs?!!!!!!!!!!!!!!!!!!=!!$$!!!!!$!!!=!!!!!!$!!=!!!$!!==$$!$!=!!$$!!!!!=!!!$=$!!$!!!$!!$!=!$$!!!=!!!!!$!!!!==!=!===!!!!==$!!!!=$$!!!!===$==!!==$!!$!!=$!!$$!!$$$$==!!!!!!$$$==$!=!!!=$=!$$!!!!!!!$!$!!!$!!!!$!!=!$!==!!!!$=!!$$!=!$=!!!!!==!$!!=!!!!!!!!!!!!!!=$!!!$$!!!!!!!!!!!!!!!!!!$!$!!!!!!!!!!!!!!!!!! !!!!!!!!!!!  !!!!!Z!!!!!  !!!!   !_  !   !pӷKKKKKKKKKKKKKKKKKii666666i66ii6i6iii6i6i6iiii6i6i6i6iii66666ii6i66i666iii66i6i66ii6iii6i66i6i6iiii6i666666i6ii66i6i6iii6iiiiii66i66iii6i6i66ii6ii6i6i6iii6i6ii6666i6i6FDIED!666i6666666ii666i6i6iiii666iiii6ii66ii66i6i666666iiiii6666iii6ii6iiii666ii6ii666i66i6i6i66iii6i6ii6ii6666i6ii66666i6i66666i 6i6ii6ii6666i6iii6ii66ii6ii6i66ii66i6iii6i6ii6i6iiii6iiii6i6iii66666ii666iiiii6i66666i6iii66ii6i66666iii6i66i6iiii6i6i6i66ii6i6i6i6ii6iii66ii6i6KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKJJJJKKJJKJJJJKKKJJKJKJJKJKJKJJWKJJKJJJKJJJJJJKJJJJJJJJJJJJJJJJJHJHJHJHGJGGGGFGFFFFFFKKKKKKKKKKKKKKKK+22222+14411133*441103M33*Ѩͦ͜+&&&&&&+KKKKKKKKKKKKKKKDFFFFFFFGFGGGGGGHGHGJGHGJHHHJHJHJHJHJJJJHJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJ}?!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!$!!!!!!!!!=!!!!!!!!!!!!!!!!!!!!!==!!!$!$!!!!=$!!!!$!=$!!!=!!!$!!$!$$$$$!!!$==!$$=$!!!$$!Z=!==!$!!$$!!=$!=!!$$=!$==!$==!$==!!=!!$!!$!$$!!=!!!$$!!=$!!!!!$!!$=$$$$$$!$!!$=$$!=$$$!!!!!!$=$!!$!!==!!!!=!!!!$!!=!!$!$!$!!$!!!!!=!!!!!==!!!!!!!!!!!!!$!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !@_!! !! !  !! _ =qKKKKKKKKKK6iiiiiii6i66i66i66i6ii666i66iii666i6666i6iii66i66i6i66iii6i6ii6ii6i6i6i666iiii66iiiiii66iii6ii6ii6i66i66ii6i6i6iii6i6i6iiiiii6iiii6i6i66iiiiiii6i6i66DGE666i6ii6666iiiii66ii666ii6i6iiii6i6i6iiiiiii6iii6ii6ii6iii666i66i6666i6ii66666ii666666ii6i6i6i6i6i6iiiiii66666i6ii6ii6666i6DD6ii6ii66iiiii6i6i6666iii66666i6ii666i66i666i6i6i66i6i66iii6666666ii6ii66666i6ii6i666ii6i66ii6iiiii666ii6ii6666666i66ii66ii6i6ii6i6ii6i66iiiiiii6KKKKKKKKKKKKKKKKKKKKKJKKKKKKKKKKKKKKJKKKKKKKKKKKWKJKJJKKJJKKKJJKJJKJJJJKJWKJKJKJKJJKJJJKJJJJJJJJJJJJJJJJJJJJJHJJHJHHGHGGGGFGFFFFFEKKKKKKKKKKKKKKKKKKK+22222+*Q1*34*3P1*330M3*ݰ԰+&&&&&&+KKKKKKKKKKKKKKKKKKFFFFFFFGFFGFGGGGHGHGHGJGHJGJHHJHJHJHJJJHJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJ?!!!! !!!!!$$$$!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!=$!!==!!!!!!!$=!$=!$=$!!$$!$!!!$!!=!!!!!!!$$!!=$!!!!!$!B!=!=!!$!$=!!=!$!!!$!!=$!!$$========!!!!!!!$=!!!!!$!!=!!!$=$!!!!=$!=====!=!!!$!!==$$==!!$$!!!!===!!!!$!==!!!!!$!$$!=$!$!!$!!!!$!!!!=$$$!!!$=!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!@! ! !!!!!!!!! !!   _! !! !$}KKKKKKKKKKKKKi66ii66iiiii6i6ii66i6ii6i6i6i666i6i6iii6i666i6i6i6ii6i666i666ii666ii6i6ii6iiii66i6i66i66666ii6ii66i6ii6ii6666666ii6iiii66i66i6i66666ii6i66i666ii6i6iiDDDi6iiiiii6i6ii6i6ii666i6ii666ii6i6i6ii666ii66iiiii6666i6i666ii666i66i666666ii6ii6ii666i66i666i666666ii6i6iii6i66iii66i66i666D i6i6i66i6i6666i66i6ii6i66iii6i6i6ii6ii6i6ii666666i6iiii6ii6666i6iii66666i6ii6i66ii6666i6i6i6i6i66ii6i66iii6i6iiii66iiiiiiiiiii6i66i66ii6i666iiiiKKJKKKKJKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKJKJJKKKJJJKKKKKKKJKKWKKKJKJKJKJJJJJJJJJJKJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJHJJHHJGHGJGGGGGGFFFGFFDKKKKKKKKKKKKKKKKKKK+22222+14**43*43*ݰ*3M330*԰̦+&&&&&&+KKKKKKKKKKKKKKKKKKEFFFFFFFFGGFGGGGGGHGHGJGHGJGHGJHJHJHJHJJJJHJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJ?!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!=!!$!!!!!!$!!!!!!!!$$!!!!!!!!!!!$$!$!!=!!!$$$!$!!!$!$$$!!!$$!$$!$!!!!$=!!!$$$!B=!=!$!$!!$!!!$!!=$!$=$!!!!=$!!!$!$!!!!$$$!!$$!$$==$$!!!!=!!==$!!=!!!!!!!!==!!!$!!$!!!=!!$!!!!!$!!!$!!!$=!!$$!!!=!!!$!!!!$$!!!!!!$!!!!!!!!!$!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !! !!!!!!!!!!@Z   ! ! !! !_  qKKKKKKKKKKKKKKKKKKKKKKKK66i66ii6i6ii6ii6ii6ii66i6iiii66iiiii6i6ii6ii6i6ii66i66iiiiiii6ii66i6ii6iii6i6ii6666iii666i66ii6i6i666iiiiii6iiii66iii66iiiii6i6i6ii6i666ii6i6i6ii6i6i5EDED i6666i66i6iii6iii6ii66666i66i6ii666iiii6i6i6666i6i6i66666i6i6i666i6ii6i6iii6i6iiiii6i666i6i6iiiii666i66ii6i6ii6i6ii6i66iiiiDi66ii666i6i6i6iiii6i6i6ii6iii666i6666i6iii6i6iii66ii6ii6i66i6ii66i6i66ii6ii6i66iiiiii66i6i666ii6iii6i6ii66i6i666i6666i6i6666i66ii6ii6i6i666iii66KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKJKJJKJJKJKJKKKKKJJJJJKWKJJKJKJKJKJKJJJKJJKJJJJJJJJJJJJJJJJJJJJJJJHJJHJHJHGHGGGFGFFFFFFFKKKKKKKKKKKKKKKK+22222+*41*34*331*30403*ݰަ+&&&&&&+KKKKKKKKKKKKKKKKFFFFFFFGFFGFGGGGGGHGJGHGJGJHHJHJHJHJJHJJHJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJl!!!!!!!!!=!!! !!!!!!$!!!$$!!$!! !!!$!!!!!$$!!!!!!=$!!!!=!!$$=!!$!=$$$!!$!$!!!!$!$$!!!!!!!!!=!!!!$$=!!!$$!!====$!$$$!!!!!===!@$!!$=$$=!==$!=!!$!!!$=!!=!!$=$!!!!!=$$!!$$!!$!!===!!!!!$!!==$!!==!!!!==!=$!!!!!$$$!!=!!!!!!$$!!!!=!$$!!!!!!!!!!!=!!!!!$$!!!!!!!!=!!!!!!!!!!!$!$!!!$!!!!!!!!!!!!!!!!!!!! !! !!!! !! !!!!Z   !! !  !!  !  !  _ !    pKKKKKKKKKKKKKKi66iiiii66i6iii6i66ii6666666ii6i6666i6i666i6ii66ii66i66666666666iii666iii6ii6666iiii66iiii6666ii6666iii6ii6iii6iiii6i6i66i66ii6ii6ii66iii666ii666iii66EDD6iiiii66i6ii66i66i6i666i6i6i6i666iii6i666i6i6ii66i666ii6i66ii6i6i6i6iii666iiii666i6iiii666i6i6666iiii6666iiii6ii666i6i666iiDD 6iii6i6iii6ii6i666ii66i6ii6iii6666i6i6i666666ii6iii6ii66iiii666i66ii66ii6i6ii6i666666i6ii666i6iii6ii6ii66iiii6i666i6i66i66i666iii6i66ii6i6ii6i66KKKJKKKKKKKKKKKKKKKKKKKKKKKKKKKJKKKKKKJJJKJKKKKKKKJJKJJJKJJJKKJJKJJJKJKKJJKJJJJJJKJKJKJJKJJKJJJJJJJKJJJJJJJJJJJJJJHJJJHHJHJHGJGGGGGFFGFFFFKKKKKKKKKKKKKKKKKK+02222+144*133*431133T33*ذѭͦ+&&&&&&+KKKKKKKKKKKKKKKKKKFFFFFFFFGFGFGGGHGGHGJGHGJHHJGJHJHJHJJHJJJHJJHJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJs?!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!$!!!!!!!!!!!!!!!!!!!!!$$$!!!!!!!!$!$!!!!!$!!!!!$!!$!!!!!$$$=!!$!!!!!!!!!!$!$!$$$!@]==!!!!!!$$=!!$$!$$!!!!!$$!$!!!!!!$!$$!$!$!$!!$!$=!!$!$!$$!!!!!!$$!$!!!!$$!!$$!!$$!$!!!!!!$!!!$!!!!!!!!!!!$=!!!!!!!!!!!!!!$!!!!!!!$!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!! !!!!!!!!!!!  !!!!!! @Z! ! !!!!! !!x !qӷKKKKKKKKKKKKKKi6666ii6i66i6i6iii666i6iiii6i6ii6i6i66iii66666666iii66i66ii6iiii6i6i6iii6i6i66i66i6iiii666i66i6ii66iiiii6i6i6i6i6i666ii6ii6ii6i6ii6i6i666ii66i66i6i666EGDD6i6i6i6i6i6iii6i6i66ii6i66i666666i6ii6i6ii6iii6iii66iiii6i6ii6iii666iii6ii6i6ii666iii66i6ii6iiii6i666666iii66i66iiiii6ii6i6D66ii6i6ii66i666ii6ii66ii666i6i6i666ii6ii6ii666i66iii6iiiiii66iii6ii6i66i66i6i6iii6666ii66i6i6i6ii6i6i6i6i66ii66iiii6666666iiiii666iii6i6ii6iiii6KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKJKKKKJJJJKKKKKJJKKJJKKJJJJJJJHJJJJJKJKJJKJKJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJHJHJGJHGHGGGGFGFFFFFFFFKKKKKKKKKKKKKKKKKKK+22222+*1*34*3P1ݰ*M30M31װ+&&&&&&+KKKKKKKKKKKKKKKKKKFFFFFFFFFFFGGGGGGGGHGHHGHGHGJGJHHJHJHJJHJJHJJJJJHJJJHJJJHJJJHJJJHJJJJJJJJJJJJJJJJJJJJJJJJJJC!!!$$!!!!!!!!!!!!!!!! !! !!$$!!!!!!$$!!!!!!!!!$!!!!!!=!=!!!!!!!!=!!!$!$=!!!=!!!!!==!===!!!!!!$!!!!!!=$$=!$!$=!$!!=!=!!!!!!$!!!$!$!!$!$=!!$!==!$$!$!$!=!$$!!!!!!!$!!!$$!!$!!$$$$$!!!!!!!$!!$=!!!!!!=$!$$!!@Zxxx_ZY@=!!!=$!$$!!!!!!$!!!$!!===$!!!!!!$!!!!!!!!!!!!!!!!!!!!!  ! !!!!!!!!!!!!!!!!!!!!!!! !!!!!Zƅ_! !!! !!! !  !_! !  !         pKKKKKKKKKKKKKKKKKKKKKKKKKKK66i66ii6i66ii6i6i66ii6iii6ii6i6iiiiii6iiii6i6ii66i6666iiiiiii6iiii666666i66i6i666ii6i66ii6i6iii6666666ii6i6i6666iiiiiii6i666ii666i66ii6i66666i6i66ii66GFDiiiiiii666ii6i6i6i6i6ii6ii6i6ii6ii66i6i666666i66i6i666i6iii6iiii6i66i66i6iii6i66ii6iiii6iiii6666i666i6i66ii666iii66i66iii6iDi6ii66666ii6666666i6i66iiiiii6iiii66i66i6i66i666ii6ii6i6ii66ii6i6666i6i6i66666ii6iiiii666iiiii666i6i6ii6ii66i6iii6i6i6i6i666ii6666666666i66ii66iKKKKKKKKKKJKKKKKKKKKKKKKJKJKKKKKKKKKJKJJJJKKKJJKKJKJKJJJKKJKHJJJJJJJKJKJKJKJKJJKJJJJKJJJJJJJJJJJJJJJJJJJJJJHJHJHJHJGGGGGGFGFFFFFKKKKKKKKKKKKKKKK+22220+141*133*43*ݰ10030U*حͰͦ&&&&&&&+KKKKKKKKKKKKKKDFFFFFFGFGGGGGGGHGJGHGJHHJGJHJHJHJJHJHJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJl!! !!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!=!!!!!!!!!!!!!!!!!!!!!!!!!$=!!!!!$!!!!!!!!$!!=!!!$!!!$!!!!$$!!!$!$!!!$!!]$!!$$!!!!$$!!$=$$$!!$$!$$!!$!$$!!==!!!!=!$!$$$!!!!$$=!$!$!$!$!!$$=$!$!!!!$$$=$$!!!!==!!!!!!!!!!!=!!!$Z_ƖZ@!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!! !!!!! ! !! !!!! !!! !!! !!! _! !_   sӷKKKKKKKKKKKK6iii6ii6666iii66i6iii6i6i6666ii666i6ii66i6ii6ii6iiiiii6i66iiiii6666i66iiii66666ii6ii666iii6ii6iii66i6iiiii666i66iiii6i6i6i6i6iii6iii6i66ii6i6ii6iiiii6DDDDi6iiii6ii6666ii6i6i666666iii6i6iii6i6iii66i6i6ii6ii6i6i6i6i66i6i6iiiiiiiii666i6i66ii6ii6i6i66ii6i6ii6iiiiiii6ii6ii6i6666i66D!66ii6ii66i6ii6i66ii66ii6i66i6i6i6i6ii6ii6i6i66ii6ii6666ii6ii6i6iii666i66666i6i6iiii6iii666i66i666i6i66666ii66i6666666i666iii6ii66i66iiii6iii66i6KJKKKKKKKKKKKKKKKKJKKKJKJKKKJKKKKKKKKKJJKJJJKJJJJKJJJJJJKJKJJJKJKJJKJJJKJKWJKJWJJJJJJKJJKJJJJJJJJJJJJJJJJJJJJJJJHJJHJHJHHHGHGGGFGGFFFFFDKKKKKKKKKKKKKKKKKKK+22222+141134*431*03M301ذѦ+&&&&&&+KKKKKKKKKKKKKKKKKKFFFFFGFFFGFFGGGGHGHGHGHHGHHHHJHHJHJHJHJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJ}?!!!!! ! !!!!!!!!!!!!! !!!!$!!!!!!!!!!==$!!!!=!!!!!!!$=!!!!!!!!!!!!!!!!!!!!!$!!!!!$!!!!!$!$!$!!===$!!!!!!!$@@$=!!==!!!$=!$=$==$$=$==$$!$$$!!!==$!$!!!$!===$!$!=$$!!$!!!!==!!!=$$=!!!!===!!!=$$=!!$!$==!$$!!AxȂZ!!!!!!!!!!!!!!!!!!!!!!$!!!!!!!!!!!!!!!!!=!!!!! !!!!!!!!@_x__@!!!!!!!!!      ! ! ! _!  ! _   ! !!!$sKKKKKKKKKKKKKKKKKKKKKKK66666i6i6iiiii66i6i6ii6i6i66ii66i6ii66i6iiii666i6i6iii666i6iiii6iii666666iii6iiiii666i666iiii6i66i666iiiiiiiiiii6ii6i6i666i6i6i66iii66ii6i6ii666ii6i6iDEDDii6i6iiiiiii6i6ii66i6iiii666i66i66iii6iiiii666i66666i6i6ii6i6iii666ii6iiiii666i6iii66iii6i66i6iiiii66i6i6iii6ii6666666ii6i6DDi6i6i66i6i6i6iiiii6ii6iiii666i6i666iiii666ii666iii6i6i6ii66ii6666666iii6ii6i66ii6i6i6i6ii6i666iii66i66666ii66i66iiiii6i6i666i666i66666i6ii66ii66KKKKKKKJKKKJKKKKKKKKKKKKKKJKKKJKKKKKKKKJJKKJKKKJJKKKKKKKJKKKKKKJJKKKKJKKWKKJKJJJJJKKHJJJHJJJJKWKJJJKJJKJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJHJHJHJHGJGGHGGGGGFFFFFFFKKKKKKKKKKKKKKKKKKK+22022+1421*33*34113U030*԰ҰЦ+&&&&&&+KKKKKKKKKKKKKKKKKKEEFFFFFGFFGFGGGGGGGGJGGJGHHGJGHHJHJHJHJHJJJHJJJJJJJJJJJJHJJJHJJJHJJJHJJJJJJJJJJJJJJJJJJJJJJsj!!!!!!!!! !!! !!!!! $!!!!!!!!!!!!!!!!!!!!!!!!!$!!!!!!!!!!!!!!!!!!$!!!!$!!$$!!!!$$$!!!!!!!!!!!!$!$!!$!!!!$!!!!=!]!!!$!!!!$!$=!!!!=!!$!$!!$!$!!!!$!!!$=!$!$!!$!!!!!!!$$!!!!$!=$!!$!!!!!$!!!!!!!$!!$!$=!!!!!!@_=!!!!!!!=!!!!!!!!!!!!!!!!!!!!!!!!!$!!!!!!! !!!!!!! !!!@Ζ_;!!!!!!!!! !!!!!!!! ! !! ! _!!  $qKKKKKKKKKKKKKKKKKKKKKKKKKi6ii6ii666ii66666ii6ii6ii6i6i6ii6i666ii666iiii6iii6i666i666ii6ii666ii6ii66i6i6666i6i6ii6i6i6i66iiii66i6iiii6i6iiiiii666ii6i666iii6i666i6i6i666i6ii6i66EDDF6i6iii6666666ii66i6iiiii6i6ii6iii6ii6i6i66i66i66iiiii6i6i66i66666ii66ii6ii6ii6i6iii66i66i6i6ii6iii6i6i6i6i66i6ii6i666iii6iiD6i66iii6ii6i6666iii66i666ii6i66ii66iiiii66i6iii6iii6i66iiiiiiii66666ii666iii66ii6ii66i6i66i6ii666ii6ii6i666i6i6ii6666iii6i666i666ii666ii66i666iiKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKJKKJJKKKKJJJKJJJKKKJKJJKJKKJJJKJKJJJJKJKJKJJKJJJJJJJJJJJJJJJJJJJJJJJJJJHJJHJHHJGHGGGFGGFFFGEKKKKKKKKKKKKKKKKK+22222+1441*34*Q01*304031ݰްͦ+&&&&&&+KKKKKKKKKKKKKKKEEFFFFFFFFGFGGGGGHGHHGJHHGJHJHHJHJJHJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJ}?!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!$!!!!!!!!=!$$!=!==!!!!!!!$=$$$!$===$$!!!!!!!$$!!$=!!!!!$!!==!$!@=!!!=$=!!!!!!!!!!!!!$!!!!!!!$!!=$!!!!!!!!!!!$$=$$!!!!$!!!!!$!!!!!$!$!$!!!!!$$@_!!!!!!$!!!!!!!!!!$!!!!!!!!!!!!!!!!!!B!!!!!!! !!!_!!!!!!!!!!!! !!!!!!! ! !!!!! !_     =sӷKKKKKKKKKKKKKKKK6i666i6666i6i66ii666i6iiiiii6666666iiiii66iii6i66i666i66iiiiiii6iiii6i6ii6i666i66666i6666i6ii6i6i6iiii6iii66i66iii66666i666iiiii6i66i6i66iii66iii6i666EDDD666iii6iiii666666iii66ii66i6666ii6i6iii66iiiii6ii666ii666iii6iiii6i6i6ii6ii666666i6iii6ii6ii66666i6i666i6i6i666i66iii666iiDi6i6i66i66666iiiii6i6i6ii6i6iii6iii6ii66iiii6i6666i66i6i6i666iiiii66ii6i6i6iiii6ii6iiii6i66666i6iiii6iiii6ii6i6666i6iiiii6ii6i6iiiiii6666i6iii6iKKKKKKKKKKKKKKJKJKKKJKKKJKKKKKKKKKKKKKKKKKKKKKKKKJJKJJJKJKJKJKKJKJKJJJKKKWKKJKJKWKJKJJKJKJJJKJJKJJKJKJJJKHJJJJJJJJJJJJJJJJJJJJJJJJJHJJHJHJHJHJGHGGHGGFFFFGFFKKKKKKKKKKKKKKKKKKK+22220+144*133*341ݰ103030*Ԧͭ+&&&&&&+KKKKKKKKKKKKKKKKKKEFFFFGFFGFGGGGGGHGHGHGJHHGJHJHJHJJHJHJJJJHJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJ?!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!$!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!$!!!!$!!!!!!$$!!!$=!!===!=$!!!$!!!=!!$!$$!=$!!!!!!$!!!$!$!!!!!!$!!!!!!!$!!$!!!!!!!!$!!!!!!!!!!!!!=!!!!!!!=!!!!!!!=xB!!!!!!!!!!!!!!!!!!!!!;[xxZ!!!!!!!!@΁!!!!!!!!!!!Y;!! !! !!!YxdxxxxZ! !!Yx_dxd@!!!!![________!! _!!_  =qKKKKKKKKKKKKKKKKKKKKKKi6i66iii666ii66ii66i6iii66i6ii6666ii6iii6i66i66iii66iiii666i6i6i66i666i6i66iiii6i6ii666i6i666i666666ii6i6i666iii6ii6i66iii66ii6ii6i6i66i666i66i6ii6ii6EDDDii6i6i6i6iiii66666i66i666i66ii6ii666iii66666i66iii66i66i6ii6666i666i6iiii6ii6ii6666i6ii66iiiiii6i66i6ii66iiiiii6i66i66ii66DD66ii666ii66ii6iii6ii6ii6i6ii6ii66ii66ii666i6iii6ii66i66i6iiiii6i6ii6i66i6666ii6iiii6i6ii6i6iiii666ii66666iii6ii6i66i6iii6iiii6i666i6iiii666ii6iiKKKKKKKKKKKKKKKJKKKKKKJKKKKKKKKKKKKKKKKKKKKKJKKKKKKJKKKKKJKKJWKKKKWKKKJKJKKKJKHKJKJKJKJJJJJJJKJKJKJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJHJJHJHJGJGHGGGGFGFGFFFGFKKKKKKKKKKKKKKKKKKK+22202+144441*34*431*303031ئͦ+&&&&&&+KKKKKKKKKKKKKKKKKKFDFFFFFFFFFGFGGGGGGHGHGHGHGJHGJGHHJHJHJJJHJJHJJHJJJHJJJHJJJHJJJHJJJHJJJJJJJJJJJJJJJJJJJJJJJJՏl!!! !!!!!!!! !!! !!!!!!!!!!!!!!!!!!!!!!=$!!!!!!!!$!!!!!!$$!!!!!$!!$!!!!!!!!!!$$!!!!!$=!!$!!!!!!=$!!!!]Z=!!!!!=!!=!!!!$!!$!======!!!!!!=$!!!!!!!!!$$!!!!!!!!!$!!!!!!!!!!$!!!!!!!!!!$!!Bx$!!!!!!!!!!!!!!!!$]@!@@!!!!!!!!!Z@!!!!! !!@@!Y!! ; _! !@@;;;@@@@;;;;@;;;;@@@@@@;;;;@; ! !=qKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK66iiii6i6ii66i66i666ii6i6ii6iii666iiii6iiiii6iiiii666ii6iii666666iiiiii66i6iii66i6666666ii6ii6iiii66666ii6i66iii66i6i6i666i66i6i66i6iiii6i6iii66i6ii66DEDDDi6666i66i6i66i6ii6i6i666iiiiiiii6i66iii6i6iiii6666i66666ii6i66i666ii6i66ii6i6i6i66ii66i6i66i6ii666ii66i66i6ii6ii66iii6666i 6iii6ii66iii6i6i6i6iii6ii6i66666ii666i66i6i6i66ii66i6i6i6ii66i6ii6i6i6iiii6i66i6i6ii66i666ii6ii6ii66i6iii6iiii666iii6i6i666i666iii6i6i66ii6i66i6KKKJKKKKKKJKKKKKKKKKKJKKKJKKKKKKKKJKJKKKKJKKKKJKJKKKJJKKJKJJJJKJKKKJHJJJJJJJKJJKJKJJKJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJHJHJHHHGJGGGGFGFFFFFFKKKKKKKKKKKKKKKK+22032+1Q1133*3Q*ݰ*03040*حצ(&&&&&&+KKKKKKKKKKKKKKEFFFFFFFGGGGGGGHGHGJGHHHJGHHJHJHJHJHJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJo!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!$!!$!!!!!!!!!!!!!!!!!!!!!!!!!!!$$!!!!$!!$=!!!!=!!!!!C!!!!!!!$!$$!!!=!!$!!!!!!!$!!!$!=!!!!!!!!!!!!!!$!!!!!$!!!!$$$!!!!!$!!!$!!!!!$!!!!!!!!$!!!Z@!!!!!!! !!!!!!!!!x@!!#9!!!!!![! !!!!!!@@Z@_    !!qKKKKKKKKKKKKKKKKKKi66iii66i6i666ii6i66i66ii66i66i6i666ii6i66ii66ii6i666i66i6ii6i66iiii666666i6ii6iii666iiiiii6i6666i6iii66666ii66ii6i66i6ii666i6i6666i6iii6i66i6ii6iiii6GEDD6ii6i66i6iii6ii666iiii6ii6i6i6ii66i66ii66i666iiii66ii6ii66iiiiii6i6i666i66i6666i66iii6i6i666ii66i666666i66666i66666666i6i6D6i6ii666i66666i66i6iii66i66666iii6i6i666i6ii6iii66i6iii6iiii6iiiiii6ii6iiii6i66iiiiii6iii6i6iii66i6ii6iii6666ii666iiiii6ii66i66iiii66i6i6i66ii66KKKKKKKKKKKKJKKKKKJKKKJJKKKKKKKKKJKJKKKJKKJJJJKKJKKJKKJJKKKJJJKJKKJKKJKJKHJKJJJJJJWKJKKWJKJJKJJKJJKJJKJJJJJJJJJJJJJJJJJJJJJJJJJHJHJHJHHJGHGGGGFGFFFFFDKKKKKKKKKKKKKKKKKKK+02202+*4441134*401*03030*ݰ԰+&&&&&&+KKKKKKKKKKKKKKKKKKFFFFFFGFFFGFGGGGGGGHGHHGHGJGJHJHJHJHJHJJHJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJl!!!!!!!!! !!!!!!!!!!!!!!!!!!!$!!! !!!!!!!!!!!!!!!!!!!!!!=!!!!=!!!!!!!!!!!!!!!!!$!!$!!!!!!!!$!!!$=!!!$!!@!=!$$!$!!!!!!!!!!!!!=$=!=!$!!$$!!$=====!!!!!!$!!!!!!$=!!!!=!!!!$=$!!!$=$!!!!!$$!!x@!!!!!!!!!!!!!!_@!!ZZ!!!!!!!!!Z! !!!@Y!!!!!!!;!!!d!!   !   !  =sӷKKKKKKKKKKKKKKKKKKKKKKKKii6iiii6iii66ii6ii66i6666iii66i6i6i66iii666666i6i66i6i66ii66ii6ii6ii6i6ii6i6i6i6666i6i6i66ii6i6iiii66i6iiiii666ii6iiii6i6i6iiii66i666ii6iiiii6ii6iii66EEDD6ii6i6i6i6iii666ii66ii666i6i6i66ii66iiiii66iii66i66666i6i66666i6iiiii6iiii6i6iiii6ii6i66iiiiiii6666iiiii666iiii66iii66iii6DD6i6i6i66iii6iiii6666i6ii6iii6i6i666i6ii6ii666ii6ii666666ii66iiii6i6i66i66i66i6i66ii6iiii6iiii66iiii666i6i6iii66iiii666ii6iiii6ii6i666i6i6ii6iiiiKJKKKJKKKKKKKKKKKKKKKKKKKKKKKKKKJKKKKKKKKJKKJKKKKJJJKKKKKJKKJKJJKKWKKKJHKJHJKJHKJKJJJKJKJKJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJHJJJHJHJGJGHHGGGGGGFFFGFFFFKKKKKKKKKKKKKKKKKKK+22220+1241*43*341ݰ1303+3*筰װ&&&&&&&+KKKKKKKKKKKKKKKKKKDFFFFFFFGFGFGGGGGGGHGHGJGHJGHGJHJHJJHJHJJHJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJ?!!!!!!!!!!!!!!!!!!!!!! !! !!!$!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!$!!!!!!!!!!!!!!!!!!!!!!!!!$!!!!!!!!!!!!!!!!!!!z!$!!!!!!$!!!!!$!!!!!!!!!!$!!!!!!=$!!!!$!!!!!!!!!!!$!!!!!!!!!!$!!!$!!!!!!!!!!!!!!!!=!xB!!!! !!!!!!!!!!_@==!!!!!!!x !!!@@!;_ !Y x  !!qKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKiiiiiii666666666i6iiii6ii666i66i6666666iii6i666i6ii666i66i66i666i66iiii6ii6iii6iiiiii6ii6ii66i6i6iiii6666i666i6i66iiiiii6666iii6i66i6ii6i6i66i6666666iEDEDDi6i6i6i6666iii66i6iii6i666i6iii6ii6i6i6i666iiii6i6iiii6ii6666i6i666i6ii6i66i6i66ii66866i6i66ii66iiii6iii66i6iiiiii66i66i66D6ii666ii6i666i86iiii6ii666iii66i6i6i6iii666666i666ii6i6i6i666i6ii6iiiii66i6i66ii6ii66i66i66iiiiii666666i6i66ii6i6i6i6ii66ii6666666i66i6i6ii66i6KKKKKKKKKKKKKKKKJKKKKKKKJKJKKKKKKKKKKKJKJKJKKJKJKJKKKKKKJJKKKWKKJJJKKWJJKWJJJKJKJKJJKJKJKJKJJKJJJJJJJJJJJJJJJJJJJJJJJJJJJJHJJJJHJHJGJGHGGGFGFFFFFEKKKKKKKKKKKKKKKKK+20202+*441*43*4M1*03030*Ѱװ+&&&&&&+KKKKKKKKKKKKKKKDFFFFGFFFGFGGGGGHGHGJGJGHJGJHJHJHJJHJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJ?! !!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!$!$!!!!!!==!!!!!!$!!!$!!!!!!!!!!!!!$$$!!!$=!!!!!!!!!!!@Z!!$!=!!!!!!!!!$!!==!!$!=!!!!!$!!!!$!!!!!!$=!!!!!!!!!!!!$$$!$!!!!!$!!!!!!!!!B!!!!!!!!!!!_Z_!!!!!!!;!! !!!@B  YB !!!!_! !!   7pӷKKKKKKKKKKKKKKKKKKii6i666i6iiiiiiii6i6i6i6iii66666i6ii66iii66i66ii66i666ii6i6ii66i6iii6i6ii66i6iii66666iiii6i666i666i666i66i6ii66ii6i6i6iiii6iiiii6i6ii666ii66ii6i6i66ii8EDDEi66i6i66i6666666ii666666i66EGDDi666i6i6666ii66i6i66i86ii666i<66666i6656i66666ii6666i6666Q6666Ni6i6ii6i68i5iii6iii666i66i66iiiN68iiii86iiiii66ii6i6iiKKKJJKKKKKKKKKKKKKKKKKKKKKKKKKKJKJJJJKKKKKJKJKKJKKKJKKKKKJJKKKWKKKKJJJKWKKJKJKJHJJKJKJJKJKJJKJKJJJJJJJJJJKHKJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJHJJHJJHJHJGJGHGGGGFGFGFFFFFKKKKKKKKKKKKKKKKKKK+20220+14441143*O31*33030*ѭ԰Ц+&&&&&&+KKKKKKKKKKKKKKKKKKDFFFFFGFFFFGGGGGGGHGHGHGHGJHGJGJHJHJHJJHJJHJJJJJHJJJHJJJHJJJHJJJHJJJJJJJJJJJJJJJJJJJJJJJJJJl!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! $!!!!!!!!!$!!!!!!!!!!!!!!!!!!!!!!!!!!!$$!!!!!x@!!$!!$!!!$!!!!!!!$$!!!!!!!!!!!=!!==!!!!!!!!!!=$$$=$$!!!!!!!!!!$!!!!!!!!!!!xx@!!!!!=$!!=Z@!!!!!!!!!!!!!!x!!!!Ɩ ! !!!!!@B !!!!d! !Y !d! ! !!!qӷKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKiii6i66i66ii66i6i6iiiii6iii6666i6ii66iii6iii666i66ii66ii6i66i66i6iii66iiii6ii6ii6iiiiiii66iiiii6ii6iiii66iii6i6ii8iii6ii6ii6666i66666866j66628ii<<6660iiiN666666655S65Nii56N66SS666i>6iN<<5i6Q6<5i66Ni66i<6i>66i<6i6i666i66i6iii6QNiKJKKKKJJKJKJKJKKKKKKKKKKKKKKJKKKKKKJKKKKJKKJKKKJJKKJJJKKJJKKJJJKKWKKJJJJKJKJWKJKJKWKJKJJJJKJJJKJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJHJHJHJHJGHGGGGGFGFFFFFDKKKKKKKKKKKKKKKK+22202+1444110Q*331ݰ*00+00*ڰ̦ͦ+&&&&&&+KKKKKKKKKKKKKKKKDFFFFFFFFGGGGGGHGHGJGJGJHJGHJHJHJHJHJHJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJ?!!!!!!!!!!!!! !!!!!!!!  !!!!!!!!!!!! !!!!!!!!$!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!$!!!!!!!!@!!!!!!!$!!!!$!!!!!!$!!!!!!!!$!!$!!$!!=!!!$!=!!!!!!!!!!!!!!!!!!!!!!!!!!!!!ZZ=!!!!!=!!!!=!9$!!!!!! !!_@!!!!!!x@!;@ !@@!@Y!_!     ! !qKKKKKKKKKKKKKKKKKKKKKi66666i6iii6ii66iiiii66i6i66iiii6iiii6i6i6666ii6iii6iii66ii6i6i666iiii6ii6i6iii6666i666i6>ii666i666i6i6666iii6666i66i6iiii666i66666i66iN!!!! !!!!!!!! !! !!!!!!!!!!!!!!!!!!!!!$!!=$!!!!!!!!!!!!!!!$!!!!!!!!!!!!!!!!$!!!!!!$$$=!!!!!!!!!=!!!!!!$!!!!!=$!!!!==!!!!!!!!!!!!!!!!!!!!!!$!!!!!!$!$!$!!!!!!!@_!!!!!$!!!!!!!!!!@!!!!!!!!!!!xΖ@!!!@Y!!!!_!!!!@@!!_;_! _#   !pKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK6iii666ii666ii6ii6666iii6i6iii6ii6666iii66i6ii66i6iiii66i6ii666i6i666ii666ii66i666ii66iiiiii6i6i66666Q666656iii8666666<6665i6EDDDDF,,,,, ,NQi658iO!!  !!!! !!!!!!!!!!!!! !!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!$!!!!!!!$!!!!!!!!!$!!!!!!!!!!!!!!!!!!$!!!!!!$!!=$!!!!!!!!!!!!!!!=!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!$!_!!!!!!!!!!$!!=!!!!!!!!=@!!!!!!!!!!_̂@!!! !!!!!!!Y!! !@@  ;[!    x; ! ! =qKKKKKKKKKKKKKKKKKKKKKKKK6666iii6iiiii6ii66iii6ii6666666i6ii6ii6666i6ii6i6iii666i666666ii6i6i6665i !!!!  ! !! !!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!z!!!!$!!!!!$!!!!!!!!$!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!$!!!!!!!!!!!!!!!!!!!!!!!@x!!!!!!!!!!!!!!!!!!!!$!!!!@!! !!! !!_@!!!!!Z !!!@@ ![;!!!!! !qKKKKKKKKKKKKJKKKKKKKKKKKKKKKKKKKKKKKiii66ii666i6ii666i6ii666i666i66i85i6iiiii6666i66iiQ6iQii66666Q66i6>QQ!!!! !!!!!!!!!!!!!!!! ! !!!! !!!!!!!!!!!!!!!!!!!!!!!!!!$ !!!!! !!!!!!@!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!  !!!!!!!!! !!!! !!!!!!@! !!!!!!!!!!!!!! !!!!!!_!!!__!!!!! !!! @!@;!_ _;   _ !qKKKJJJJJJKJKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKSSSSSSSSSSSSNSSSNSSSNSNSNSNSNNNSSSSNSNSNNSSNNSNNNSSSNNNNSNNNNNNSNNNSNNNNNNSSSNSNSSSSNSNNNSSNNNNSNNSNNSNSSNSSNSSNNSSSNNNSSNNNNSSNNNNNSNSNNNNSNNNNNSNNNNNNNNNNNNNNNNNNSNNSNNNNNNNSSNNNLLNNNNLNNNNLNNNNLNNLNNNNNNNNNNLNNNLNNNLLNLNNNNLNNNLNNNNNNNNNNNNNLNNNLNLMKKKKKKKKKKKJKWKKKKKJJKKKJKJJKJJJJKJJHKKJKJJHJJJKJJHJHJJJJJKWKJJJJJJWJKJKJJJJJKJJKJJJKJJJKJJKJJJJJJJJJJJJJJJKJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJHJHJJHJHHHHGJGGGGGGFFFGFFFFKKKKKKKKKKKKKKKKKKK+03000*1P44Q*103*331ݰ*03+0**ڭ԰+&&&&&&+KKKKKKKKKKKKKKKKKKEEFFFFFFGFGFGGGGGGHGHGJGHGJGHGJHJHJHJHJJJJHJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJs? !!!  !!!!!! !!! !!!! !! !!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!Z! !!!!!!!!!!!!!!!!$!!!!!! !!!!!!!!!!!! ! !! !!!@!! ! !!!!!!!!!!!!!  !! !Z! _Z!!!!_@@!!Z ! _! !!  sKKJJKKKKKJJKKJJJJJJJJKKKKKKKKKKKKKKKKKKKKKKKKKSSSSSSSSSSSSSSNSSSSNSSSSSSSNSSNSNSSNNSSSSSSNNSNSNSNSNSNSNNNSNNNNSSSNSNNNNNSNSSNNSSNNNNNSSSNSNNSSSNNSNNNSNNSNNNNNNNSSNNNSSNNNNNNNNSNNNNNNNNNSNNNNNNNNNNSSNNNNNNNNNNNLNLNNNNSNNLNNNNNNNNNNNLLNLNNLNNNLNSNNNNLNLLNNNNNNNNNNNNNNLNNLLNLLNLLLNNNNNLNNNNNNNNNNLLNLLNLcKKJJJJJKKKKKJJKJKJJJJKKWKKJJKJJJKJJJKJJKKJKJKKKKJJKJKKJKJKKJKJJKJJKJKJKJKJKJWKJKJKJJKJKJKJKJKJJJJKJJKJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJHJHJHJHGHGGGFGFFFFFEKKKKKKKKKKKKKKKKK+00400+*444421*33*301ݰݰݰݰݰݰݰݰݰݰ*000+0*+&&&&&&+KKKKKKKKKKKKKKKEFFFFFGFFFGFGGGGGGHGJGHGJGJHHJHJHJHJJHJJHJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJs?! !!!! !! !!!  !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!! !Z!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!! !!!! !!!@!!!!!!!!!!!!!!!!!!!!! !!!!!Z!!!!!!_B!!!!!!!!!!  !@!;;_! x! _   7pӷKJKJKKKKKJJKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKSSSSSSSSSSSSSSSSSNSSSSSNSNNNSNSSNSSNSSNSSSNSSSNNNNNSSNSNSNSNNSNNNNSNSNNNSNNSSSNSSSSSNNNNNSNSNSSNNNSSNNNNNNNNNNNSNNSNSSNNNSNNNNNNNNNNNNNSNNNNNNSSNNNNNNNNNNNSNNNNNLNNNNLNNNNLLNNNNSNLNNNLNNNSNNNLNNLNNNNNNNNNNNNNNLLNNNLNNNSNLNNLNNNNLNNNNLNLNNLNNNNNNNLLNNLNLL,L,LMcKKKJJKJKKJJKKJJJJJKKJJKKKKKKJJJKKJJKJKKJKKKJJKJKJJKJWKJJKJKHJKJKJJKHKJJJJJKJJJJJWJJJKJJKJJJJJWKJKWJJJJKJJKJKJJJJJJKJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJHJJHJHJHJGHGHGGGGFFGFFFFFKKKKKKKKKKKKKKKKKKK+033+0*13444Q**33*33*ǜ*0*03(*rpM&&&&&&+KKKKKKKKKKKKKKKKKKEFFFFFFFGFGFGGGHGGHGJGHGJHHJGJHJHJHJJHJJJHJJHJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJ}?!! ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!;!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!   !!!!@!!!!!!  !!!!!!!!!!!!!!!!!!Z=!!!!_@ ! !!!!!Y!!@@! _        _ !      !=qKJJKKKKKJJJJKKKJJKJKKKKKKJKKKKKKKKKKKKKKKKKKKKKKKSSSSSSSSSSSSSSSSSNSSSSSSSSSSSSNSSNSSSSSNSSNSNSSSNNSSSSSSSSNSSSNSNNNNNSSNNNSNNSNNSSNNSNSSNNNNSNNNNSSNNNNNSNNNNNNNNNNNSNNNNNNNNSNSNNNNNNNSNNSNNSNSNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNSNSNNNNNNNNLNLLNNNNNNNNNNNLNNNNNLNNNLNNNLNNNNNNNNNLNNNNNLNLNLNNNNNNLLNNLNNNLLNNNNNLLLLNNLNLNNLNNNLLLNLNL\hKJKKKJJJJJJKJKJJKKKWKKJKJKKWKKKJKKWKJJJJJJWJJJWJJKWKJKJKKJJJJJJJJKJKJWKJKJKJKJKJKJKJKJKJJKJJKJJKJJJJJKJJHKJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJHJJJHJJHJJHJHJHHGJGHGGGFGFFFFFFEKKKKKKKKKKKKKKKKKKK+30000+*444441133*33+מǞמǞǞǞ*000+01ǜ&&&&&&&+KKKKKKKKKKKKKKKKKKDFFFFGFFFFGGGGGGGGHGHHGHGHGJGJHHJHJHJJHJJHJJJJJHJJJHJJJHJJJHJJJHJJJJJJJJJJJJJJJJJJJJJJJJJJ? !   !!!!!!!!!!!!!!!!  !!!!!!!!! !!!!! !!!!!!!!!!! !!!!!!!!!!!!!$!!!!!! !!!!!!!!! !!!!!!! !!!!! !!!!!!!!!!!!!!@!!!!!!!!!  !!!!!!!!!!!!!!Y !!_@!  !!  9__!;Y;!  ! ! 9qJKKJKKKKKKKKKKKKJKKKKJJKKKKKKJJKKKKKKKKKKKKKKKKKKKKKKSSSSSSSSSSSSNSSSSSSSSSSSSSSSSSSSSNSNNNNSSNSSNNNSNSNSNNNSSNSNNSSNNSNNSNNSNNNNSSNSNSSNSNSNNNSNNNNSSSNNNSSSSNNNNNNNNNNNSNNNNNNNNSNSNNSNNNSNSSNNNNSNNNNNNNNNNNNNLNNNNNNSNNNNNNNNNNNNNLNNNNNNNNNNNNNNNNNNNNNNLNNLLNNNNLNNLNNNNNNLNLNNNLNNNNNNNLLLLLLLLLLNLLLNLLLLNNLLLNLLLNNNNLLNNNLNLLNLNLNNLNLLLLMcX\^X^X^X^X^X^X^X^bbX^X^X^XXbX^Xb^XXbX^bbYXXbVXV^VbXbXX^XXX^XXX^XXV^VXXX^XXX^VXVbXXVXVXVYXXVXXXXVXVXVXXXXXXXXXXXXXXXXVXXXXXXXXXXXXXXXXXXXXXXXXXTXXTXTXTXTXTXTXTXTTXTTTXTTXTTTTTTTTTTTTTTTTTKKKKKKKKKKKKKKK+003+<+134444**03*33*מǜǞǙ*0*0*0*ҦǙ+&&&&&&+KKKKKKKKKKKKKKTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTXTTTTTXTTTXTTTXTTXTXTTXTTXTXTTXTXTXTXTXTXTXTXXTXT?!!  !!!!!!!! !!!  !!!!!!!!!! !!!! !!!!!!!!!!!!! !!!!!!!!@@!!!!!!!!!!! !!!!!!!!!!!!!!!!!! !!!  !!!@!!!!!!!!!!!!!!!!!!!_!!![; !!!  !!! B#!!@; !!; !!! !x  ! pX^X^X^X^X^X^X^X^X^X^X^XXXXX^X^X^XXX^XX^X^X^X^XXXX^XXX^X^XXX^X^XXSSSSSSSSSSSSNSSSSSNSSSSNNSSSSNNSSNSNNSSNSSNNSSSSSNSNNSSNNNSSNSNSSSSSNSNNSSSNNNSSNNNNNNNSNNSNNSNNSNNSSSNSNSNSNNNNNNNNNNNNNNNSNNNNSNNNNSNNNNNNNNNSNNNNNNNNNSNNNNLNNNNSNNNNNNNNLNLNLNLNNNNNNNNNNNNNLNLLNNNNNLNNNNNLNLNNLNNNLNNNLNNLNNLNNNNNNNNNNLLNNLNNLNLLNNLNLLLNNNNNLNNNNLNNNLLNNLNNLLLNLNNLLL,LNbgXXXXXXTXXXTXXXXXVXVXXXXXXXXXXVXXVXXXVXVXWXXXXXXXXXVXXXXXXXXXXXXXXXXXXVXXXVXTXXXTXXXXXTXTXTXTXTXTXTXTXTXTXTXTXTXTTUTUTTTTTUTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTVTTTXTTVTTTXTVTTTTTTTTTTXXXXXXXXXXXXXXXXXXXX+*0000+1444431*33*331ǞǞלǞǞǞǞǙ*+0(0++ǦǙǙǙ+&&&&&&+XXXXXXXXXXXXXXXXXXXTTTTTTTTTTTTTTTTTTTTTXUTTVTXTTTXTVTTTVTTTXTTVTTTTVTTVTTTTVTTTTTTTTTTTTTTTTTUTT}?!!!!! !! !! !! !!!!!!!! !!!!!!!! !!!! ! !!!!!!!!!!!!!!!! !!!! !!!!!!!!!!!!!!!!!!!!!!! ! !!!!!  !!!!!!!_Y!!!!!!!!!!!!!!!!!!!!!!_!! !!!!! !!_!;@ @!9 !_!qXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXSSNNSSNNSSSSSNSNNSSSNNSNSNSSSSSNSNNSSSSNNNSSNNNNSSNSNNNNSSNSNNNSSNNNSSSSSSNNSNSSSSNNSNSSSNNNNSNNSSSSNNSNNSSSNSNNSNSNSNNNNSSNNSNNNNNSNNNNNNNNNNNSNSNNNNNLNNSNNNNNNNNNNNNNLNNNNNNNSNNLNNNNLNNNLNNLNNNNNNNNNNNLNNNNNLNLNNNSNLLNLNLNNNNNLLNNLNNNNNNLNNNLNNLNLNNLNNLLNLLNNLNLNLLLLLNLNNLLLLLLLNNLNLLNLLLNLLLM\hTTTTTTTTT"TT:"TT"T"TT"T"TT"T"TT"T"T"T"T""T"T"T"T""TT""""""""""""":::"0"T::"T:T:T:T"TTXXXXXXXXXXXXXXXXXXX+03030*1P4444*133*331ǭǞǙ*0+0*0*ǦǙ+&&&&&&+XXXXXXXXXXXXXXXXXXX"T""T"T:T:T:"T"s>! !!!!!!!!!!! !!!!!!!!!!!  !!!!!!!! !!!!!!! !!!!!!!!!!ZZ!!!! ! !!!!!!!!!!!!!!!!!!!!! !!!  !! ! !!!!!!!ZZ!!!! !!!! !!!!!!!# _!!!!!!!! !!!!!!!;B!;;Y! ! ! !  !_ !      !qTTT"T:T"TTT"TTTTTTTTTTTTTTTTTT:"TTTTTT:TT"TTTTTTT:TTTTTTTTTTTTTTSSSSNSSSSNSSSSSSSSSNSSNNNSNNSNSSSSNSNNNSNSNSSSNSSSNSNSNNSNNSNSNSSNSSNSNNSSNNNNSNNSSSNNNNNNNSSSNSNNNSSNSNNSSNNSNNSNNNNNNNNNNSNSNNNSNNNNNNNNNNSNNNSNSNNNNNNNNNNLNNNNNNNNSNNNNNNNNNNNLNNNNNNLNNNNNNNLNNNNNNNLNNLNNNNSNNLLLN,NLNNNNLNLLNNLNLLNNLNNLLNLLNLNLNLLLLNLNLLNNLNLLLLLLNNLLLNNLNLNLLLLNNLLLLMcT:T"TTTTTTTTTTTTTTTTTTTTTTTTTTTTTT""0"""""TTT"TTT TT"TTTTTTTTTTTTTTT"*00+00+*4444P1133*33+ל؜ללמ**0+0+*ǰǙǙ+&&&&&&+TTTTTTTTTTTTT"TTT"Ts>!!!!!!! !! !!!!!!!!!!!!!! !!!!!!!!!!! !!!!!!!!!!!!!! !!!!!! !!!!!!! !!!!!!!!!!! !! !!!!! !!9x! !!!! !!!!!!!!!!!!!!!!@!!  _!!!!;@Y   _; _! !  !=qTTTT"TTT"TTTT":T"T"T:T"T:T:T"TTTTT"TT"TTTTTT:TT"TT"T:T"TT":T"T:TSSSSSSSSSSSSSNNNNNSNSNSNSSSNNSSNSNSSNNSNSNNSSNSNNNSSSSNNNNNNNSNSNSNNSSSSSNSNNNSNSNNNNNSSSSNNSNNNNNNSNNSNSSNNNSNSNNSNNNNNNNSNNNNNNNNNNNNSNNLNNNNNSNNNNNNNNSNNLNNNNNNNNNNNNNNNNNNNNLNNNLLNNLNNNLNNNNNNNNNLNNNLNNNNNLNNLNNNNLNLLLNLNNNNNNLNNNLNNNNNLNNLNNLLNLLNNLNNLLNNLLNNLLLLNLLNNNNLLLLNLLNLLNLLLLLchTT"TTTTTTTTTTTTTTTTTTT""""""""TTTTTTTTTTTTTTT:TT:TT:TT"TT+00303+*44444**03*33*ǭלǭǭǭǞ+0+0*0*ǦǙǙǙǙǙ+&&&&&&+T:T"TT"TT"TTTTTTTTTs?!! ! !!!!!! !!!!!! !!!!! !!!!!!!!!!!!!!!!!!!! !! Z!! !!!!!!!!!!!! !!!!!!!!!!!!!!!!!! !!!!@ !!!!!!!!!!!!!!!!!! !!!Yx!!! !_9 !!!!_! ;;!_!  !   _!!         =}TTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTSSSSSSSSSSSSSSNSSSSSSSSSSSSNSSNSSSSSSNSSNSNSNNSSSSSNSNSSNSSSNNSSNNNSSNNNNNNNNSNSNSSSNNNNNNSNNSNNSNSNNNNNNSNNSNNNNNNNNNSNNNNNSNNNNSNSNNNNNNNNNNNSNSNNNNSNNNNNNNNSNNNNNSNNNNNNNNNNNNNNNNNNLNLLNLLLNNNLLLLLLNNLNNNNNLLNNLNNNNNLLNNLNLNNLNNLLNNNNLLNLLNLLNNLLLLNNNLLNNNNLLNNLLNLLLLNLNNLNLNLLLNLNLLNNNNLLLNLLNLLNLLLLLLLLMchTTTTTTTTTTTTTTTTTTTTTTT:TTTTTTTTTT:+0+300+*444441*33*33*לǭǞ*+0+0+*ǙǙǙǙǙ+&&&&&&&TTTTTTTTTT? !!!  ! !   ! ! !!!!  !!!!!!!!!!!!!! !!!!!!! !!!!!!!!_!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!! !!!!!!@!!!!!!!!!!!!! ! !Y_;! !! xd;@!_ !_!! _ =sTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTSSSSSSSSSSSSSSSNSSSSSSSSSSNSSSNSNSSSSNSSNSNSSNSSSNNSNSNSSSSSSSNSNNNSSNNNNSNNNNNSNNNNSNSSSSNNSNNNNNNNNNSSNNNNNNNSSNNNNNNNSSNNNNNNNNNNNNNNNSNNNSNSNNSNSNSNNNNNNNNNSNSNNNNNNNNNNNSNNNNNSNNNNNNNNNNNNNNNNNNNNLNNNNNNLNNLNNNNLLNNNLNLNLLLNNLNNLLNLNNNLLLLLLNLNNLLLLLLNLLLLLLNNLLNNLNNNNNNLLNNLLLLLNLLNNNLLNLLLLLN,NLLLLNNNLLLLLLLNLLL\gTTTTTTTTTTTTTTTTTTTTTTTTTT""TTTTTTTTTTT+0330++*44434**33*33*׭׭׭Ǩ0++0*+*ǰǙǙǙǙǙ+&&&&&&+TTTTTTTTTTTTӏ?!!!!!!  !!!! ! !! !!!!   !!! !!!! !! !!!!!!!!!!B@!! !!!!!!!!!!!!!!! ! ! !!!!   ! !!!!!_!!!!!!!!!!!!!;![;!!! !!!!!! !! ;@!9  !!_  ! !    ! =qTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTSSSSSSSSSSSNNSSSSSSSNNNSNSSSSSNSSNSNSSNSSNSSNSNSSNSNSSNSNNSSSSNNNSSSNSSNNNSNSNSNNNSNNNNSSNSNNNNNNNNNNNNNNNNNNNSNNNSSNNNNNNSSNNNNNNSNNNNNNNNNSSSNSSNSNNNNNNNNNNNNNNSNSNNNSNLNLNNNNNNLNNNNNNNNNNNNLLNNNNLNLNNLLNLLNNNLLNNNLNLNNNNLLLLNLLNLLLNLLLNLNNNNNLLLLNNNLNNLNNNLLLLLNLLLNNNLNNLNLNLNLNLLLLNLLNNNNLNLNN,LLLLLNLLLLLLLLNLLLLLL.MLchTTTTTTTTTTTTTTTTTTTTTTTTTT"++0000+*444431*33*M3*ݰ׭ݰݰݰݰ׭צ*0++0+*ǦǙ+&&&&&&+TTTTTTTTTT鬎?!!  !! !!! !!!!!!!!!!!! !!!!!!!!!!!!! !!!!!;!!! ! !!!!!! !!!!  !!!! !  !!!!!!!!!Y@!! !!!! !!! ! !!!Z !!_$!!;;@@! _! !   =sSSSSSSSSSSSSSSSSSSSSSSSNSNSNSNSSSSNSNSSSSSNNSNSNNSNNNNNNNSNSSNNSSSNSSNSNNNSNSNNNSSNNSNNSNNNSSNNSNNNSNNNNNSNNNNSNNNNSNSSNNNNNSSNNNNNNNNNLNNNNNNNNNNNNNNNNNNNNNNNNNNNNSNNNNNLNNLNLNNLNNNNNLNNNNLNLNLNLNLNNNLNNNLLNLNNNLNLNNNNNNLNLNLNLLNLLLNLLLNLNNLNLNNLLLLNNNNLNLLNLNNLLLLLLLNLNLLLLLNLLLLLLLLLLLLLLNLNLLLLLNLLLLLLLLLLLLLLLLLLLLLMhT0"TT:TTTTTTTT TTTTTTT+003+3+*43443**3M*33*ݭݭݭݰݭݰݭ׭ݰǭ*+0*++*ǭǦǙrrr+&&&&&&+TTTTTT  C!!!!!!!!!!!!!!!!! ! !!!!!!!!!!!!!! !!!! !!!!!!!!! !!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!]!!!!!!!!!!! !!!@_ !!!![!!!!! !!!!Yϖ!! ;@ @;   x! ! _    !!qSSSSSSSSSSSNNSSSSSNSSSSSNSNSSSSNNSSSSSNNSSSSNSSNNSSNNSSNSNSNSSNSNSNSNNSNNSNSNSNNNNNNSNSNNSSNSSNNSSNNNSNNNNSNNNNNNSNNNNNSNNSNNSSNNNNNSNNSNLNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNLNNNNLNNNNNLNNNLNNNNNNNLNNLNNNLNNNNNLNLNLNNNLNNNNLNNLNNNNLNNLLNLNNLNLLNNLNLLNNNLLNLNNNLNLNLLLNLLLLLLLLLLLLLLLLLLLNLLNLLNLLLLNLLLLLLLL.LLLLLLNLLLLLLLLLLL\g:TTTTT"TT0T:T"T"TTTTTTT(30000+*44434**33*331׭ǭ*0++++*ǭǙǙ+&&&&&&+TTTTTTTl !!!!!!!!!!!!!!!!!!! !! !!!!!!!!!!!! !!!!!!!Y!!! !  ! !!! !!!! !!!!! !! !!!!!!!!@  !!!!! !!!Z!!!_#!!Y!!!;;[_ !!_!  _    pTT"T:T:TTT"T:TTT"T:TTT"TT0T"T"MT"TSSSSSSNNSSSSSSSNNNSSSNSNSSSSNSSSNNSSNNSSSSSSNNNSNNSSSNSNNSNNNNNSSSSNNSNSSSNSSNNNSNSSNNNNSNSNSSNNSNSSNNNSSNNNNNNNNNNSNNNNNSNSNNNNNNNNNNNSNSNNNNNNNNNNNLNNNNNLNNNNNNNNNNNNNNNLNNNNNNNNNNLNNLLNNNNNNNNNNLNNNNNNNNNNNLLNNLLLNLNLNNLLNLNNLNLNNLLNLLNLLNLNLLLLNLLNLLLN,LNLLNLLNLNLLLNLLNLNLLLLLLLLLLLLLLNLLLLLLNLLLLLLLLLLLLLLL,LLLLLLLLLLLLLLMd""""TTTTT:TT: TTT+0303+++44443**33*33*ݭݭݭݭݭݭݰ1++0++*r&&&&&&&+TTs?!! !! !!!!!! !!!!!!!!!!! !!!!!! !!!!!!!!!!! !! !!!!! !!!!!!!!!!_@! !@_!!! ! !!!!!!!!#  !![!!!! !!!Y!;@ !@ ZB  !d!! x      ! !p"""SSSSSSSSNSNSSSSSSSSNSNNSNSNNNSNNNNNSSSNNSSSSSSSSSSSNNSSNSNSNSSNSSNNNNSNNSNNSNNNNNSSSNSNSNSSSNSSNNNNSNNNSNNNNNNNNSNNSNNNNNNNSNNNNNNNNNNNNNNNNNNLNNNNNNNSNNNNNSLSNNNNNNNNNNNNNNLNNLNNNNNNNNNNNNLNLLNNNNLNLLNNLLLLNNNLNLNNNNNLNNLNNLLNNLNNNLLLLLLLNNLNNLNLLNLLNLLLLLLLLNNLLLLLLLLLLLNLLLNLLLNLLNLNLLLLNLLLLNLLLLLLLLLLLLLLLLNLLL,L,LNLLLLLL,LLL,,LLLLLLLLLLLbcT:TT""TT0T "T:TT"00+3000+*43434**33*03*ݰݰݰݰݰݰݰݰݰݰݰ*+++++1+&&&&&&+TTT:T: s?   !!!! !!!!! !!!! ! !!!!!!!!!  !!!!!@!!!!!!!!!  !! !!!!!!! !!@!!!!!@! !!!! !!!Z!!_;!! !!B;;x_ x! _!  qT"MTTT"MTT"MTT"T"TTTNSSSSSSSSSSSSSSSNSSNSSSSSSNSNSSNSSNNNSNSNSSSSSSSSNNSNNNNNNNNNSSSNNSNSNNNNNNNSSNNNSNNNSNNNNNSNSNNNNSNNNNNNNNNNNNSNNSNNSNNNNNSNNSNNNSNNSNNNNNNNNNNSNLNNLNNNNNNNNNNNSNNSNNNNNSNNNNNLNNNNLNNNLNNNNNNNLNNLNLNLLNNNNLNLLNNNLLNNNNNNLNLLNNLLLLLLLLLNLNLNLLLNLLLLLNNLNNNLLNLLNLLLNLLLLLLLLLLLLLL.L.LLLLNLNNLLLLLLLNLLLLLLLLLLLL.LLLLLNLLLLLLL,LLL,LLLLL.L,LLL,LL,LLLLL.LLMcT"TTTTTT"TTTT:000+03+*44344**3M*3M*ݭݭݭݭݭݭݭݭԨ10++++*r+&&&&&&+::"T  s? !!! !!!!!!!! !! !! !!!!!!!!!!!! !!!!!!!!!!9;!! !!!!!!!! !!! !!!!!@@!! !!! !!Y@  !! !!!Z!![9! !!!!! !; ;  ;@! ;Y _!!!! _          =q"TTT"TT"TTTTTTTSSSSSSNSSSSSSSSSNSSSSNSNSNSSNNNSSSSNNNSSSNSNSNSNSSNNNSNNNNSSNNNNNSNNNNSNSNNNNNSNNSSNNNNSNSSSNSNSNNNSNNNNNNNNNNNNNSSNNNLNSNNNNNNNNNNNNNSLNSNLNNNLNNNNNNNNNNNNLNNLNNNNNNNNNNNNNLNLNNLLLLNNLLLNSNNSLNLNLNNLLLNLNNLNNNLNLNNLNNNLNLNNLNLNNLLLNLLLLLLLLNNNNLLLNLNLLNLLLLLLNNNLNNLLLLLLLLLNLLLLLLLLLLLLLLLLLLNLLLNLLLLLLLLL,LLL,.LLLNLLLLLLLLLL,,L,LL,L.L,LLLL,LLLLLLL.L,LMcT"TTT TT":"0*30300+*34434**33*03**++++++ęǖƖ™ŖƖę+&&&&&&+TTT  }?   ! !! !!!!!!!!!!!!!!! !!!!!!! !B_!! ! !!!! !!!!!!ZY!!!!!$ !  ! !Y[ _#!Y;@ Y !  !   _!!! =sTTTTTSSSSSSSSSNSNSSSSSSSNSNNNSSSSSSNSNSSNSNNSSSNNNNSSNSNNNNNNNNNSNNNNNSNNNNNSSNNNNSNNNNNNNSSSNNNSNNSNNNNNSNNNNNNNNNLNNNNNNNNNNNNSNNNNNNNNNNNNNNNSNNNNNNNNNNLNLNNNLNNNNLNLLNNNNNNNNLLNNNNLNNLLNLNNNLLLNNLNNNNNNLNLLNNLLNLNLNLLNNNNLNLLLLNNLNLNLLNNLLLLLNLLLNLNLLNLLNNLLLLLLNNNLNLLLLLLLLLLLLLLLLNLLLLLL.LLLLNLLLLLLL,LLLLLLL,L,LLLL,,LLL,LNLLLL,L.,LL,,L,LLL,LLLLL,L,,,,L.L.L\hTTTTTT   """0003+0*133443***11***1*1*11+1+1+1*1+1*11+110*1+10*1+1+1+1+1*1+1*1+1**33*33**1+1+1+1*1*+0**1+1+*+1*10*1++1+1+1+1+1+1*0**+******+1*+++++*͙͙ÙƙęƙÙƖƖ&&&&&&+""TM"T  ?!!!!!!!! !!!!!!!!!!!! !! !!!!!! !!!!!Z!! !!!!!!!!!!!!!!![!! Y!!!!!!!!!!!!! !!Y! [!!!! ! ;;!@ ! !! !!!     x !!   !! !=}TTTTTTTTTT:TSSSSSSSSSSSSSNSNSSSNSSSSNSSSSNNNNNSNNSSNNSNSNSNNNSSSNNNSSSNSNNNNNNNSNNNSNNSNSSSSNNNNNNSNSSNNNNSNSNNNNNNSNSNNSNSNNSNNNNNNNNNNNNNNNNSSNNLNNNNNNNNNSNNNNNNNNNLNNNNNNNNNLLNLLLNNNNNLNNNNLLLNNNNLLNLNNNNNNNNNNNNNLNLNNLLLNLNNNNLLNNLNLLLLLLNNLLNLNLLLNNLLLLLLNLLNNLLLLNLNNLLLLLLLLLLNNLLNLLLLLLLLL,NLLLLLL.L,L,LLLLLLLLLL.L...LL,L,LLLLLLLLLLL,LLLL,.LL,,LLLLLL,,L.LLL.,.,LLLL,Mc TTTTT"0(30300+*34434343334333333033333P0333\03333333333333333333303330333333M3*303M3030303030030000000000000000000000000000+0+0+0++0++++++++++ęƙęęęě–+&&&&&&+TTT""  ?!! !  ! !!!! !!  !!!!  !! !!!!!!!_Z !!!!!! !!!!!! !!!Z_!!! !!!!!  !!! !!@@ _!!   ;;;_@ d!  !_    =qT::TT:TT:TT"NSSSSSSSNSSSNSNSNSNNSNSNNSNSNNSNNSNSNNSNNNNNNSNNNSSSSSSSNNNNSNNNSNNNSSSNNNNNSNNSNNNNSNSSNNNSNNNNNNNNNNNNSNNSNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNLNNNLNNNNNNNNNNNLNLNNLLNNLNLNNNNNNNNLLNNNLLNNLLNNNNNLNLNLNNNLNNLLLLNLNNNLNLLLNLLLLLLNLNNLLLNLLNLLNLNLLLLLNLLLNLLNLLLLLLLLLLLLLLLLLLLLNLLLLLNLLLLLL,LLL,LLLLLLL,LLLLL,LLLL,,LL.,LLLLL,L,LLLLL,N.,,,,L.LLL,LL,,L,,,.,,L,LXc  TTT003+03+13343443434343433433334333Q333333333333333333333333333M333M33330*3M030M3030U00303030303003000303003030*00+0*0*0++0+++++++++++++1̛ƙƙƛÆƖȆ+&&&&&&+TTT   ӏ?!!!!!!!! !!!!!!!!! !!!!!!!!!!!!!!!!!!! !!!!_@!!!! !!!!!!!!@_!!!!!!;@ !! !! _ ![!!!!!_;@@! __!    x !_      !  !!qSSSNSNSSNNNNNSSSSSNSSNNNSNSSSSNSNNNNSNNSNNSSSSNNNNSNNNNNNSNSNSSSNNNNSNNSNNSSNNNNSSNSSNSNNNNNNSSSNNNNLNNNNNNNNNNNNSNNNNSNNNNNNNNNNNNSNSNNNNNNNNNLNNNNNLNNLNNNNNNNNNLNNNNNNNNNLLNLLLLLNNLNNNLNNNLLLNNNLLNNNLNNNLLLLNNLNLLNLLLLNNNNLLLLLLLNNLLLNLNLLNLLNLNLLLLLLLN,N,LLLLLLN,LLLLLLLLNLLLLL,LLLLLLLLLLLLLLLLLLLL,L,,,,,LL,LLLLLLL,,,LNLL,LLLLLLLL,,LLLLL,LL,LL,LLLL,,L,,,,,LL.,L,.Mc *00300++++++++++++++-++-+++-+-++-++++++++++++++++++++0+*3434434343434334334333343333333333333333333333333M333333333M3M3*303033030303003+300+0+300+30+0+300+0000*0(0+0++0++0++++++++++0*+0+&0&00&0++++++0++++0++0+++++0++++++0++&&&&&&+ ?! !! !!  !!! !!!!!!!!!!!!!! !_#  !!! !!!@@!!!YY!!!!!!!!  !_!!! Y!;;@!! @@ _! _   ! =qSNSSSNSSNNSSSSNSNSNSSNSSNSSSNNSNSSSSNSNNNNSNNNNNNNNNNNSNNSNNSNNNNNSSNNNNSNSSNNNSSNNNNNNNNNSNNNNNNNNNNNSNNNNNNNSNNNNNNNNSNNNSNNNLNNNNNNNNLNNNNNNNNNNNNNLLNNNNNLNNNNNLNNNNLLLLLLNNNNNLNLNNNLNNNLLLLNNLNLNLNLNLLLNNLNNNNLLNLLNNLNLNLLLLNLLLNLLLLLLLLNLLNLLNLNLLNLLLLLNLLNLLLLLLNLLLLLLLLLL,LLLLLLLLLLL,LLLLL,,,,L,LLLLLL,LLL,LNL,L,,NLLL,L,LLLL,LLL.,LL.L,,,,LL.L,L,,.,L,,,,,.,\b    +003+03000000000000000000000000000000000000000000000000*43434434343O33433333433333333333333333333333333M333M333M3330<3M*0300Q0300303303+30+30003+0003+003+0*0*00*0*0++0+++++++++++++++*&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&+    s?! !!!!! !!!!!!!!! !!!!!!!!!!!!! !Z@!!!!!!!!!!!!Y!!!!!!!!!! !! !Z!!!_;_ ;;@ [!  ! d9!_   =}NNSSSSSNSNSNNSNSSNSNNNNNNNSSNNSSNNSNNNNNSSNNNNSNSNNNNNSNSSNNNNNSSNSNSSNNNSSSNNNNSNNNNNNNNSNNSNNNNNNNNSNNNNSNSNNNNNNNNNNNNNSSNLNNNSNNNNNNNNNNNLLLNNNNNNNLNNNNLNNLNLNNNNNNNNLLNLNLLNLNNLNNNLLLNNNLNLNNLNLNNNLLNLNNNLNLLLLLNLNNNLLLLLLLLNLLLLLNNLLLLLLLNLLLLLNNLLLLLNNLLLLLNLLLL,,LLLLLLLLLLLL.LLLLLLLLLLLLLL,LL,L,L.,LLLL.LL,LLLL,L,LL,L,L.L,LLLL.L,L,,,,LL,LLL,L,,,,,,LL,,,LLLL.,Lch  +3030+0300030003000003003000300300030003000300303030+20*34344343434334334333333333333333333333333333333333333333M33M303*:40303330030+0000000+30+33+0<+30+300(30+0+0+*0++0+++++++++++++*&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&+  l  !! !!!  !!!  !!!!!!B!!!!!!!!;!!!!!!!!!!YY  [9!@; ![;;; ![  _;! _      =sNSSNNSSNNSSNNSSSSNNNSSSSSSSSSNSSNSSNSSSSNSSNNSSNSSNNNNNNSNSNNNNNNSSSSNNSSSNNSSSNNNNSSNNNNNSNSNNNNNNNNSNSNNNNNLNNNNNNNNNSNNNLNNNNNNNNNNNNNNNNNNNNNNNNNNNLNNNNNNNNNNNNNNNLNNNNLNLNLLLNNNNNLLNNNLNNNNLNNNNNNNLNNNLNLLNNLLNLLLNNLLLLLNLLLNLLLLLLLLLLLLLLLLLNLLLLLLLLLLLLNLNLLLLLLLLL.LLLLLLLLLLLLLLLLLLLLLL,LLL.,LLLL,LLLL.L,,LLLLLLLL,LLLLLLL,LLL,LL,LL,,L,,,L.L,.,.L.,L.L,,,L,,,,,,,L,,,L,,Rc +000+00003+003+003+30+03+03+0+0+03+00*00+03+0*0+0(0+0+0*434344343O33433333433433333333333333333333333M333M333M333M330<0*03030:0033+03303+33+0<+00+0000003(0+00(0*0++0+++++++++++++++++*&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&+     ?!!!!!!!!!!!!  !! !!!!!!!! ! !! @ȁ@!!!!@x_!!! !!!Z!#_!_;!‚;@Y!  !!!!x      pSNSSSSNSSNSSSNSSNSSNNSSNSNNNNNSNNSSSSNSSSSNNNSSNSSNSNSNNSSNSNSSNSSSNNNSSSSSNNNSSNNNNSNSNSNNSSNNNNNSNNSNNNNNNNNNNNLNNNLNNNNLNNNNNNNNNSNNNLNNNNNNNNNNLNNNNNLNNLNNNNNNLNNNNLNLNNLNNNNNNNNLLNNNLLNNLLNNLLNNNNNNLNLNLLNLLNLLNLLNNNLLLLNNLLNNLLLLLLLLL.LLL,LLLLLLLLLLLLLLLLLLLLLNLL,LLLLLLLLLLLLLLLLLLLLL,LLLLLLL,N,,L.LLLLL,,LLLLL.L,LLL,,.LLLLL,L,L,,L,L,L,LL,L.L,,,,L.,,.L,L,,,,L,.,,,,,,,,LWd++30330*00+3000+300+30+00+00303000+300030+300000303(300********************************************************************************************************************************&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&+  ? !! !!!  !! !!!!–@!!!!! ƅ_[ZZZd_!! ;Y;@ Y  !_     !_  !  !    $qNSNNNSNSNNSSNNNSNNSNNSSSNNSNSNNNNSNSNSSNNSNNNSSSSNSSNSSSSSNNSSNNNSNSSNNNNSSSNNNNNNNNSNNNNNNNNSLNNNNNNNNNNLNNNNNNNNNNLNLNNNNNNNNNLNNNNNNSNLNNNNLNNNNNNLNLLLNLNNNLNNLNNNNLLNLNNNNNNLNNNNNNLNNNNLNLNNNLLLLNNLNNLNLLNLLNLLLLLNLLNLLLLNL,LLLLLLLLLNNLLLLLLLLLLLLL.NLLLLLLLLNLL,LLLLLLLLLL.LLL,,L,.L.LLLLLLLL.,L,LLLLLLL.LLLLLLL.L.,LL,LLL,,,L.LLLLL,,L,,L,,.,,.LL.L,,,L,,,,,,,,,.,L,L,L,,,,,Mc   +000+0+00030+03+003+00033+<03+03+03003+03+0(03+*0+00+0*+00+        +&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&+   s> !!!!!!!!!!!!!!!!!!!! !!!! !!! _!! !!!!!!!! !!!_!!!![!! _;B!_;!     _  ! =}SNSNSNNNSNNSNNNSSNNNNSSSSNSSNNSNNNSNSNSSNSSNNNNNNNSSSSSSSNSSNNNNNNNNNNNNNSNSNNSNNNSNNNNNNNNSNNNLNLNNNNNLNNNNNNNNNNNNLNNLLNLNNNNNNNNNLNNNNLNNNNNLNNNLNNNNNLLNN,NLNNLLNNLLLLNN,NNNNNNNNLNNLLLLLNLLLLNNLNLNNNLNNNNLLLNLLLLNLLLNLNLL,LLNLLLLLLLLLLLLLNLL,.L,LL,.LLLLLLLL,LLLLLLLLLL,LLL,LLL,L,,LL,L,LL.LLLL,,,LL,LLLL.LLLLLL,,,,,L,,L,LL..,.L,.L.LLL,,L,,,,L,,,L,L,,,,,L,L,,,,.,,.,,,.,,,LMchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhgddfhhdhhddhhhhhdhhhhchhhdchhdhcgfhhdhghcdhchdhgcchchhcghchhchccdhchchcchccchchccccccchcccccchccccccccchcccccccccccccccccccccccccccccdccgfcccgcccccccdcccccXcc*0+3300<+30+30<+3000<0+000+0+30+30(30+300003000000+30+00+0+       +&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&+XcXcccccbcccccccccccccccccccccccchchcccchccccccccchcccccdccccccccchccccccccccccccccccccccccc?!!!!!!!   !!!!!   !! 9@ ! !![ ! [;@B__  !!      x  !   !!!schddhchhfhhhgddghhhghdhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhSSSNNNSNSSNSNNSNSNNNNSNNNNSNNSNNNNSNSSNNNNNSNSSNNNNNSNSSSNNSSNNSNNNNSNNNSSSSNNSNSNNNSNNSNNNNNLNNNNNNNNSNLNNNNNNNNNLNNNNNNNNNNNLNNNNLNNNNLNNLNLLLLLNLNLNNLLNLLLNNLNNLNNLNLNNLNNLLNLNNNLNNN,LNNNLLN,LLNNLLNLNNLLLNLNL,NLLNLLLNLLLLLLLLLLLL,LLLNLLLL,LLLLLLLLLLLL,LL.L,LLLL,LLLL,L,,,L,LLLL,,L,,,LLLLL,LL,L,LL,LL,,.,LLL,L.L,,L..,L.,.,LL,,L,L.,,,LLL,,L.,L,,LL,,,,.,L,,,,.,,,,L,,,,,,,,,.,,.,,M\hhhhhhhhhhhh&0++((++++(++(+++(++*(++++++++(++(+0(++(+*++(*(*+*(+++++*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++chhhhhhhhhhhhhhhhhhhhhhhӎ? ! !!!!!!!!!! !!!!!!!!  !!! [_ !!!!@!!!_! ;@!! ;@! !_ !     $qĈSNNNSNNNSSNSSSNNNSSNSNNSNSSSNNNNNNSSNSNSNSNNNSSSNNNSNSSNNSSNNNSNNNNSNNNNNNNNNNSNNNNSNNSNNNNNNNNNLNNNLSNNNLNNNNNNNNNNNNNNNNNNNNLNLLLNNNNNNNLLNNNLNLLLNNNNNNLLLNLNNNNNNNNLNLLNNNNNLLLLNLNLNNNLLNLLLNNLLLLLLLLLNNLNNLNLNLNLLLLLLLLL.LLLLLNNLLLLLLLLLLLLLLLNLLLLLL,L,,LLN,LLLLL,LLL,L,L,LLLLLLL,.,LLLL,LLLL,L,,LLN,L,.,,.L,.LLL,,L.,,,L,L.,,,,,.LLLLL,LLL,,L,,,,,,,,,,,,,.,L,,,,.,,,L,,,,.,.,.,,Mbhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhs?!!!  !! !!!!!!!!!!!!!!!!!Z! [! ;@Y!!!!_  !  !      =qSNNNSSSNNSNSSNSNNNSNSSSNNSNNSSNNNNNSSNNNSNSSNNNNNSNNSNNNNSNNSSNNNSNNNNNNNNNNNNNNNNNNSSNNNNNNNNNNNNNNNNNNNNNNNNNNNNNLNNNLNNNNNLNNNNLNNLLNNNNLLNNNNLNNNLNLNNNNNLLLNNNLNNLNLLNLNLLLNNLLLLLLNNLNNLLLNNLLNLLLLLLLLLNLNLNLNLLNLLLNLLLLL.LLL.L,LL...,LLLLLLLLL,LLLLL,LLLL,LL,,LLLL,,,LLLLLLL,L,L.LLL,,,LLL,LLLL,LL,L,,,LL,L,.,.LL,L.,L,L,,LL,,,,,L,.,.LL,L,L,,,L,.,,,,,,,,,,,,,,,,,,,,,,,.,,,,,,,,.,,\cľľľľhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhُ?!!! !!!!!!     !!! !!!!!!!!!!!! !!!!!!!!!!!; !!!!!  _!!!9; ;[!  ! _     !!!=NNNSSSSSNNNSSNNNNNSSSSNSNNSSNNNNSNNSSNNNSNNNNNNNNSNNNSNNSSNNNSNNNSSNSNNNNNLNNNSNNNSNNNNNNNNNNLLNNNNNNNLNNLLNNNNNNNNNNNLNLLLNLNLNNNNNNLLNNLLLLNNNNNNNLNNNLNNLLLLNLLNLLNNNLNNLNNLLNLLNLNLLNLLLLNNL,NLLLLLLLLLLLLNNLLLNLNLLLLLNL,LLLLLLLLLLLL,LNLNLLLLLLL,L,,L,LLLLLLLL,L,.L,,.,LLLLLLL,,N,LLL,,,L,,.L,,L,L,,L,LL.,L,,L,L,,L,,,,LL.,L,,,L,,,,,,,L,L,,,L,L,,,,,L,,,,,,.,,,,,,,,,,,,.,,,,,,,,,,,MWhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhُj!!!!!! !!!!!!!!! !!!!!_!!   !!!!!![9!!Z9! YY  ;; @ !    ! ! ! !     !!!?NNNSSSSSSNNSNNNNNNSNSSSSNSNSSNNSNNSSNNSNSNNNNNNNNNNNNNNNNNSNNNNNNNNNNNNNNNNLNNNNLNNNNNNSNSNNNSNNNLNNNLLNNNLNNNNNNNSNNLNNNNNNNNLLLNNNNNNLNNLLLLLNLLNNNNNLLNNLLNLLLNLLLNNLLLLLLNLLLLLNLLLLLNLLLLLLLLLLLLNLLLLLLLLLLLLLLLLNLLN,LNLL,L,LL.,NLL,L.LLLLLLLLLLLLLLLLL,,,LLLLLL,L,,.,,,,.,LLLL,L,LL,,L,,.L,.L,L,.,,,LL,,,,,,L,.,LL,.,,,L,,,,,,L,L,,,,,,,,,,,,,.,L,,,,.,,,,,,,,,,,,,,,,,,,.,,,,,,,,,,,,,0\ľľľhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhq!!!!!!!! !!!!!!! ! Y@!!!!!!;!_;Y ;@Z   ! ! _  !   ! 7}ľNSNNSNSSSNSSNNNNNNNNSSNSSNNNNSNNNNSNNSNNNNNNNNNNNNSNNNNNNNSNNNNNNSNSNSNNNNNNNNNNNNNNNNSNNNSNNNNNNLNNNNLNLNLNNNNNNNLNNNNLNNNLNNNNNNLNNNLNNLLLLLLNLNLLNNLNLNLNLLNLNNLNNLNLNLLLNNLLLLNLLLLLLNNLLLLLNLLNLLNLL,LNLLLLLLLLLLLLLLNLLNLLL,LLLL,L,L.LLLLLLLL,LLL,LLLLLLLL.L.LLLLLL,.,L,,L,LL,LL,LLL,L,,L,LL,LL,.,,L,,LL.,L,L,,,,,,L,L,,,,,.,,.,,,,,,L,,,,,,,,,,.,,..,,,,,,,,,,,,,,,,,,,L,.,,,,,,,,,,,Lchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh¹q!!! !!!! !!!! !  !!!!!!!ZB! !! !!_; !_! !   @@  !  ;@! !!Y!   x ! !    _ ! !   ! !     =NSSSSSNNSNNNNNNNNNNSSSNSSNNNNSNNNNSNNSSNSNNNNNNNNNNSNNNNNNNNNNNNNNNNNNNNNNLNSNNNNLNNNNNNNLNNNSNNNLNLNNNNLLNNNNNNNNNLLNNLLNNNLNNNLLNNLNNLLLLNLNLLLNNNLNNLLLLNLLLLNNLLNNLNLLLLLLLLLLNLLLLLLNLLLLLLLLNLLNLLLLLLLLLLL,LL,LNLN,LLLLLLLLL,LLLL,,LL.LLLLLL,,LL,L.L,L,LLL.L.,LL,,,,.,,L,,LLL,LL,,,,L,.,,LL,,LL,L,,,,,,L,,,LL,,,,.L,.,,,,,.,L,,L,,,,,,.,,,,,.,,.,,,,,..,,,,,,,,,,,,,,,,,,,,,,,,,,,0\ľhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhq  ! ! !! !!!!!!!!!!!!!!Z̖Y!!!!!! !!    !Z!!!YYYZZZ[ZZ@ @__@! @YZYYZYZ_Y  @ZYZ[ZYZ[ZY! YZZZZ[ZZYZY!!   !_    ?NNNNSSSNNNNNSNSSSNNNSSNSSNNNNNNNNNSNNNNSNNNNNNNNNNLNNNNNNNNNNNNNNSNNNNNNNNSNNSNNLNNNNSNNNNNNNNNNNNNLLNNNNNNNLLNLNNLLLLNNNLLLLLNNLNNNNLNLNLLLLLNNNLLNNLNNLLLNLLLNLNLLLLNNLLLLLLLLLLLLLLLLLNLLLLLLLLLLLLL.LLLLNLNLLLLLLLLLLL,LLLLLLL,,LLLLLL.L,LL,LL,,,LLLL,L,,,..L,.LL,L,L,,L,.,L,,,LL,L.,,,L,,,L,L,,,LLL,L,.,,,,,,,,,.,,,,,,,,,,,,,,L,,,,,.,,.,,,,,,,.,,,,,,,,,,,,,.,,,,,,,,,,,,,,,,chhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhq    !!!!!  ! !!!!!!! @BY__x_ZB;!!!! ! !!!!!!!!!! @x˅[             !!           !    !        ! !!! !!! !mNSNNSNNSNNSNNNNNNNNNSNSNNNNNNNNNNNNNNNNNNSNNNNSNNNNNNNLNNNNNNNNLNNNNLNNNSNNNNNNNNNNNLLNNNNNSNLLNNNLNNNLLNNNNNNLLLNNNNLNLNNNNLLNLNLLNLNLNLLNLLLLNLNLLNLNLLLLLLLLLLLLL,LLLNN,LLNLLLNLLL,LLLLNLLLLL.LLLLLLLLLLLLNLLLLL.,,LLLLLLL,,LLL,LLL,,LLLL.L.,,LLLL,L,LL.L,,,LL,.,L,,,,,L,,,,L,L,.L,L,,,L,,,,,,,,,,,.,,L,,,,,.,.,,.,,,,,,.,,,,,,,,,,,,,,,,.,,,,.,,,,.,,.,,,,,,,,,,,,,,,,,,,,,,,,,,,,bľhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhq!!!!! !! !! !!!!!! !!!!!! !!     !  lNNNNNNNNNSNNNNNNSSNNNNNNNSNNNNNNNNNNSNSNNNNNSNNSNNNNNNNNNNNNNNLNNLNNNNNNNNNNNNLNNNNNLLNNNNNNLLLNLLNNNNNLLNLNNNNNLNLNLLLNNNNNLLNNLLLLLLLLLNLLLLLLLLLLNLLLLLNLL,LLNLLLNLLNLLLLLLNLLLLLNLLLLLLL.L,LLLLL,LLNLLLLLL,LLL,L,,LLLLLLL,,L,,,LLLL,,,,LLLLL,LL,,,,,L.LL,,L,,,,,.,L,L,.,,,,,.,,L,,L,,,...,,,L,,,,.,.,,,L,.,,,,,,,,,,,,,,,,,,,,,,,,L,.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,Thhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhs= ! !!    !!! ! !!!!  ! !!!! !!!! !!!!!!!!   !! !   !!  !   !!        !!    !!!!  ! !  qNNSNNNNNNNNNNNNNNNNSNNNSNNNNNSNNNNNNNNNNNSSNNNNNSNNNNSNNNLNNNNLNNNNNNNLNNSNNLNNNLLNNNLLNNNNNNNNLLNLLNNNLLNNLLNNNNLNNNLLLLNLNNLNLLLLLLNLLLNLLLLNLLLNNNLLNLLLLNLLLL,LLLLLNLLNLLLNLLNLLNLLLLLLLLL,LL..L.LL,LLNL,LLL,,NLL,LLLLLLLLL,,L,LLLL,,LL,L..LL,L,,L,L,,L,LLL,L,.,.,.,,.,,.,L.,,L,L,.,,,,,,,,,,,,,,.,,,.,,,,,.,L,,L,.,,,,,.,,,,,,,.,,,,,,,,,,,.,,,,,,,,,,,,,,.,,,,,,,,,,,,,,,,,0chcccccccccXcXXXbXbXXXXXXXWXXWTXWXWXWXXXXXXXXWXXXXXXWXWXWXXWXWXWXXWXXWWXWXXWXWXWXXXXXXXWXWXXXXXXXXXWXXXXXXXXXXXXXXXXXXXXXXXXXXWXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh}? !!!!!! !!!!!  !!      !}NNSNNNNNNNSSNSSNNNNNNNNNNNSNNNNNLSNNNNNNNNNNNNNNNNNNNNLNNNNNNLNNNNNSNNNNNNLNLNNLNLNNLNNNNNNNLLNNNLLNNNLLNLNNLNNLLNLLNNLLNLNNLLNLNNNLLLNLLNLLLNLLLLNLLLLLLLNLNLLLLNLLLLNLLLLLNLLLLLLLLL,,LLLLL,LLL,LLLLLLLL,L,LL,L,LL,LLLL.LL,,LLL,,LL.,L,L,,LL,,,L,,,L.,.LL,,.,,L,L,,,.,,L,,,L,,,L,.,..,,L,.,,,,,,,,,,.,,,.,,,,,,,,,,,,,,,,,,,,,,,,,,,.,,,,,.,,,,,.,,,,,,,,,,,,,,,,,,,,WccXhchchccccccccccXccXcXcXXXcXXcXXcXXXXcXXXXcXXXcXXXXcXXcXcXXXXcXXcXXXcXcXXcXXcXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXThhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhsl!!      !!! !!!!!!!!!!!!! !!  !!!!  !!!    !     !!       !        !!      !=ľľNNNNSNNSNNNNNNNNNNSNSNNNSNNNNNNNLNNNNNSNNNSNNNLSNNNNNNNNLLNNNNNNNNNNNNNNNNNNLNNLNNNNNNLLNNNNNNNNNNNLNNLLLNLNLLLNLLLLLNNLNLNLLLLLLNLNLLLN,LLLLNLNLLLNNLLLLLLLNLL.L,LLLLLLLLLNLL,LLL,LLLLL,,NLLLL,LLLLLLLLLLLL,LL,LLLL.,,,LLL..LLLL.,,,L,,,L,,L,,L,,L,.LL,L,,,,.,,,.LL,,L,,,,,.,,,,,,.,,,,,,,,,,,,,,.,,.,,,.,,,,,L,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,chXhhhhchchcchcccccXcXcXXXXcXXXcXXcXXXXcXXcXXXXcXXXcXXXXcXXcXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXTXXXXXXXTXXXTXXXcXhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhٟp!! !  !!!!!  ! !    ! ! !=NNNNNNNNNNNNSNNNNNNNNNNNSNNNSNNLNNLNNSNNNNNNNNNNNNNNNNNNLLNNNNNNLNNNNNLNNNLLNNNNNLNNNLNNLLNLNNNLLNNNLNLLNLLLLNNLNLLNLL,NLLNLNLLL,LLLLLLLLLLLLLLLLLLLLLLLNLLLNLL.LL,LLLNLLLLLLLLLLLLN,LLL,,LL.LLLLLLLLL,L,LL,L,LLL,LLL,LL,,L.LLL,,LLL.,,,.,,.,LL,L.,,L,,,,,LL,.,,,,,,,,,,,,.,,,,,.,,.,,,,.,,,L,,,,,,,,,.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,LccXccccccccccccccccXXXcXXXXbXXXbXXbXbXbXbXbXXXbXXXXbXXXXXXXXXXXXXXXXXXXbXbXXXXbXbXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXWXTXXXXTXXXTXXXXXXXTXXXTXXXXXXWXhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhq!!  !!  !!!!!   !! !!!   !!!!  !! !!!!  !!        !!  ! !      !!!!!    ! ?NNNNNSNNNNNNNNNSNNNNNNSNNNNNNNNNNNNLNNNNNNLNNNNNNNNNNNNNNLNNNLNNNNNNNNLLNNNLNNLNNNLLLNLNNLLLNLNLLLNNNLLLLLLLLNLLNLLNLLNLNNLLLLNLLLLLLLLLLLLLLLLLLLLLLLLLLNLLLLLL.LL,LLLLLLLLLLLLLLLLLLLLL,,LL,LLLL.LLL,,,LL,LL,LLL,,,,LLL,,,,L.,,,LLL,.,.,.,,,,,L,,L,,,.,L,,,,.,,,,,.,,,,,,,,,.,,,,,,,L,,,,.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,cXXXXXWXXTXXWXXXXWXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXTXWXXXXTXWXTXWXTXXTXWXTXTXXXXXTXXXXTXXXTXWXTXXXTXXXTXUXXThhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhq9  !!!! ! ! !!    !o¾ľľNNNNNNNLNNNNNNNNNNLNNNNNNNNNNNNNLNNLNNNNNNNNNNNLNNLLNNNNNLNNNLLNNNNNLNNLLNNNLNNLNNLLNNLLNNLLLNNLLLNLNLLNNNLLLLLLNLLLNLNNLLNLLLLLLL,LLLLL.LLLLLLLLL,LLLLLLLLL,LLL,LL,LLLLLL,,LLL,LL,,.LLLL,L.L,,LL.LL,L,L,,LL,,L,.L,L,L,,L.,,,,L,,,L,L,,,L,,,,,L,L,,,,,L.,.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,McXhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhXhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhs> !!  !!!! !!! !!!!!!!!   !!!!!!   !!!    !!  !   !!           !  ! =qLNNLNNNNNNLNNNNLNNNNNNLNNLSNNNNNNLNNLLNNLNNNLNNNLNNLLNLNNLLNLNNLNNNNNLLNLLNNLLNLLNLLNNNLNLLLNLLLLNLNLLLLLLLLLLLNLLLLNLNLLLLLLLLL,LL,NLL,LLL,NLLLLNLLLLLLL,LLLL,L,,LL,,LL.,LN,LLL,LLL,,,LL,,L,L,,LLLLL,,L,,L,,,,.,.,,LLL,L,,L,L,,,L,,,,,,.L,L,,,,,,,,.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,MchhXhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhXWWXWXWWWWWMMMMMMMMMMMMMMMMMMMMMMMMMMM0M0MM-L-MTMM-M000M00000M-0M0M00,,,0,0XhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhՎj  !!!!   ! !     !!   =NLNNNNNNNNSNNNNNNNNLNNNNNNNNLNNNNNNLNLLNNLNNNLNNNNNLNLLNNLLNLLNNLLNNNNLLNLLNLLNNLLLNNNLNLNLLLLLLLNLLLLLLNLNLNLLNLLLLLLLNLLLLLLLL,LLLL.LLLLLLLLLLL,L.L.L.LLLLLLLLNLLL,,.L,L,L,,LLLLL,L,,LL.,,.,L,,,,.L,,,L,,LL,L,,,,L,L,L,,,,.,,,,LL,,.,,.,,,,,.,L,,,.,..,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,MM\XXWbb\XW\WWWWXWWWXXWWWXhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhX,,chhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhcccccccccccccccccccccccccccccccccccccccccccccccccccccccccco     !  !! !! !!!!!!! !           !! ! !!     !!!!!  !  !! =NNNLLLNLNNNNNNLNNNNNLNNNNNNNLNNNNNNNLLNNLLNLNLLNNNNNNNLLLNNNNLLNLLLNNNLNLLLLNLNLNLLLNLNLLLLLLNLLLLLLLLLLLNLLNLLLLLLLNLLNLLL.LLLLLL,L,,L,LLLN,LL,LL,L,,LL.LLL,LLL,LLL,.LL,L,LL,LLL.,LLL,,,,L,L,,.,,,.LL,,L,,,,,.L,.,,L,L,,.,,,,L,,,,,,,,,,,.,L,,,,,,,.,,,,.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,L,,,,,,XhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhX,,,,,,,,"dhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhcXWXWXWXWWXWXWWWWWXWTWWWWMMMMMMMMMMMMTMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM0MM0M-M0T0LMT"L"--0M-000LMM00M-M00M0F0M0000M00F,Mq!  !!!  !! jhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhNNNNNNNLNNNNNLNNLNNNLLNNNNNNLLNNNNNNLLNLNNNLLNLLNNNLNNNLLLNLNLLLNLNNLNNLNLLLLLLNLNLLLNLNLLNLLLLLLNLLLLLLLLLLLNLLLLLLLLLLLNLLLLLLLLLLLL,LLLL,L,LL,LLL,LLLLLLL,,LLL.LL,,,L,LL,,,,,.LL,,LL,.,L,L.,,LL,.LL.,,.,,L,,,L,,,,L,.,,,L,,,,,L,,,,,,,,,,.,,,,,,,,,,.,,,,,,.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,XhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhX,,,,,,,Whhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhds= !  !!!! !!!! !! !!! !!!!! !         !!   !!! !  !!! =qeMRM\MRMMRMM\RMMRMR\RMRUMRMMMMMTMMRM\MMRMTRMMMMMMRMRMRMMMR\WMMRMMMNNNNNNLLNNNNLNLNNNLNNNNNNNNNNLNNNLNNNLNNLNNLNNLNNNLLNLNLNLNNNNLLNNLNLNLNLLLLLLNLNLLLLNNLLLLLNLLLNLLLLLLL,L,LLLLL,LLLLLLLLLLLLLLNLL,LLL,,LLLLL,,LLL,LLL,LLLL.,,L.L,L.,,.L,LL,LL,L,L,,,.,,.,LLL,,,.L,.L.LL,,.,,,.,.,.,,,,.,,,,,,,,.,,,,,,,,,,,,,,,,,,,,,,,L,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,XhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhX,,,,,,,,,,,,,,ghhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhW,ُm!  ! !!    !   ! =PLLLLLLLL,LLLLLLL,LLLNLLLLLLLLL,LLL,LL,LLLLNNLL,-LLELNLNNNNNNLNNLNNNNNNNLNLLNNNNLNNNNNNNNNLLNNNLNLNNLNNNNLLNLLLLNNLNLLLNLNLNNNLLLNNLNLNLL,NLLLNLLLLLLNNLL.L.LLNLL,LL,LLLLLLLL,,L.LLLLLLLLLLL,,LL,LLLLL,L,.L,LL.L,,LLLLL.LL,,,LL,,,,L,,LL,.,L,,,,LLL,,,,,L,,L,.,,,.,.,,,,,,L,,,L,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,Xhhhhhhhhhhhhhhhhhhhhhhhh¹hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhùhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhùhhhhhhhhhhhhùhhhX,,,,,,,,,,,,,,Mhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh,,,ap! !  !! !!! !!         !  ! !!       ?ڕP,,LLDMLL,LLLLLLLLLLNLLL,LNLLLLLLLLLLLLLL,LLLLLLLLLLLLLL.LNNNNNNNLNNLLNNNNNNNNNNNNNLNLLLNNNNLLLLLLLNNNLNNNLNNLLNNLNNLNLNLLLLLNLLNLNLLLLNLLL,LLLLLNNLLLL,LLLLNLLLLLLLLLLLLL,LLLLLLL,LLL,L,L.,LLLL,,LL,,,LL.LLLLL.L,L,L,.,L..,,,,,,,,LLL,LLL,LL,,.,.L,.,L,,,,,,,,,,,L,,,,,,.,,,,,,,,,,,,,,,,,,.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,XhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhÄhhhW,,,,,,,,,,,,,,,,,,chhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhM,,,,,,Ms=  !!!!!!     !     peL,L,LL,LLL,LLLLL,LLLLLL,,DLLLLLLL,LLL,LLLLLLLLLN,LLLLLL.LLNNNLNLNNLLLNLNNNNLNNLNLLNNNNNNLNLLLLLLLLNNLLLNNLLLLLNLLNLLNLLLLLLLLL,NLN,LLNLNLNLL,LLLLLLLLLLL,LL.LLLLL,LL,,.LL,LLLLLLL,.LLL,,,LLLL,L,LL,L,L,LL.L,LL,L,,,.,,.L.,.,,.,,,,,L,,,LL,,,,.,,,.,,,,,,,,,L,,,L,,,,,L,,,,,.,,.,,,,,,,,,,,,L,,,,,,,.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,Xhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh¹hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhX,,,,,,,,,chhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhX,,Վj !!     !!  !    !         !!      !  !  ! 7\,,,,LLLL,,L,,LLLL.LLL,,LLLLL,,LLL,LLLLLLLLLLLLLLLLLLL,LLLL.LNNNNNNNLLNNNNLNNNLLLLLLLNLNLNLLNLLLLLLNLLLLLLLLNLLLLLNLLLLLLNLLLLNLLLLLLNLLLNLLLLLLLLLLLLLLLLL,LLL,LLLLLLL,LL,,LLL,LL.LLLL,LL,L,LL.L.LL,,LL,L,,L.,,,,,,.,.,,L,.,,,.,,,,,,L,,,,,L,,,,,L,.,,,,.,,,,,,,,,,,.,,,,,,,.,,,,,,,,,,,,LD,L,D,DL,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,XhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhX,,,,,,,,,,,,Xhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhc0,,,p9    ! ! !  !  ! !!!CR,,,LLLLL,L,LLL.L,L.,,LLLLLL,L,LLL,LLLLLLL,LLLLLLLLLLLLLLLLLLL.NNNLNNNNLNLNLLLNLLLLLNLLLLLLNNLNLNLNLLLLLNLLL,NLLLLNLLNLLLLLLLLL,LLLLLNLLLL,LLNLLLLLL,LLLLL,LLLLLLLL,LL,,LL,,L,,LL,L.LL,LL,L,,,LLL,,LL,,,LL,,L,,.,,.,,.,,.,.,L,L,.,,.,L,,L,,,,,,,,,,,,,,.,,,,,,,,,,,,,,L,,,,,,,,.,.,,,,,,LD,LL,DL,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,XhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhùhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhX,,,,,,,,,chhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhX,,,,,^誏?!   !!   !    ! !!     !9ٍOL,,,,,,,LLLL,,.L.LL,LLL,,LLLL,LLLLLLLL,,L,,LLL,L,,LL,LLLLLLL,LL,.LNLNNNNLLNNNLNNLLNNLLLLLNLLLNLNLLLLNLLLLNNNNLLLLLLLLNLLLLLLLLLLL.LLLLLLLLLNLLLLLLLLLLLLLLLL.LLLL.LLLLL,LLL,LL,,L,LLL,,,LL,,,L,L.,,,LLL.,,LL,,.L,,.L,,,,,.,.,,L,.,,,,L,,,,L,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,LDD,D,DL,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,XhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhV,,,,,,,,,,,Mchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhc,,,,,0ٟo !   !  ! !    ! !  ! ?eLL,,L,L,L,L,L,,LL.,L,,L,,L,,,LLLLLLLLL,LLLLLL,,L,LLL,,LL.LLLL.LL.LNLNNLLLNNLNLNNLLNNLLLLLLNLLNNLLNNNNNLLLLLLNNLNL.LLLLLLNLLL.L..LLL.NLLLLLLLLLLLLLLLLLL,LL.L.L.L,,LLLL,LLLL,L,.,L,,LLL,L,L.,L,,LL,,,,L,,,L,.,L,L,,.L,,,,,,,,.,.,,,.,.,,,,,.,,.,.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,L,LD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,XhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhX,,,,,,,,,,WhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhM,,,,q= !          !     ! !     !    !  ! m\,,,,,,L,L,L,L,.,,LL,L,,,L,LLL,L,,L,,LLLL,,LLL,L.,,LL,LLL..LL,,LL,LLNNLLNLLNLNLNLNLNLNNLNNLLLLLLNLLLNLNLLLLLLLNLLNLNLLLLLLLLLLLL.LL.L.L.LL,LLLLL.LLLLLL,LL,L.LL,LL.L,LL,L,,LLLL,,.L,L,LL,,LL,,,.LL,,LL,L.,,L,,L,,.,,L,L,,.,,,,,,,,,,.,L,,.,,,,L,,,,.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,D,,LL,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,XhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhX,,,,,,,,,,,,,,,chhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhc,,,,,,,,,,?!!    !  !      =sO,,,,,,,LL,,L,L,,.L,L,,L,L,,LLL,LL,,,LL,,,LLLLL,,,L,L,LLLLL..,LL.L,LNNLLNLLNLLNLLNLLNLLLLLNNLLLLLLLNLNLLLLLLL,LNLLLNLL.LLLLLLLL.LL.L,LLLLLLLLLLL,,LLL.LL.L,,LLL,.LL,L,LL,.,,.L,L,,,LL,,,L,,,,.,L,L,,LL,,.,,,.,.,,,.,,,,L,,.,,,,,,.,.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,L,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,XhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhX,,,,,,,MchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhgM,,,\q= !    !     !  !!     oٓL,,,,L,,,,,,L,,L,,,L,LLLL,,,,LL,,,,L,,LLL,,,LL,L,L,LLL,L.L,L,LLLLLLLNLNNNLNLLNLLNLLNLLNLNLLNLLLLLNNNN,LLLLLLLLLLLNLLLLL.LLL,LLLLLLL,LL.L,LLL,LLLLLLLLL.LLL,.,LLL.,,,.,,,.,.,LLL,,,L,LL,LL,.,L,,,L,,,,,,LL,.,,.,,L,,.,L,,,.,,,,,,,,,.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,L,,D,DDD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,XhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhX,,,,,,,,,,\hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhX,,,,,0謏?  !          !! =\L,,,,,,,,,.,,L,L,,L,L,,,L,,,,,LL,L,,,,,,,,L,LLL,,LL,LL,,LLLL,,L.LL,LLLLNLNLLNLNLLLLNNN,LLNNNLLL.NN,NLLLNLLLLLLLLLLLLLLLLLL,LLL,LL..LLLLLL,LLLLL.L,LLL.L,.LL,,LL,,L,.,,L,,L,,,.L,L,LL,L,,,.,,,..,L,L,.,,,,,,,,,,,,,.,,,,,,,..,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,D,DLL,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,Xhhhhhhhhhhhhhghh_c_hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhX,,,,,,,,chhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhgM,,q!      !!!      !        !o\,,,,,,,,,,.,,,,L,,.,.L,,,L,.,,,,L,,,L,.,,L,,,LL,L,LLLL,L,,,,,L.L.L,LNLLNLNLLLLLLLLLNLNLLLN,NLLLLLLLLLNLLL,LN,LLL.LLLLLLLLLL,LLL,LLLLL,LLLLL.L.LL.,,LLL.L,,L,.,,,L,,,LLL,.,,,L,LLL,L,,,,,L,,,,L,,.,,,,,,,L,.,,.,,,,,,.,,,,.,,,,,,,,,,,.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,DDDD,DDDDD,,L,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,Xhhhhhhhhhhhhhhhhhhh_@$$$$>YhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhZYYYYYBYCYZYZ_YYYYh_=@>hhhhhhhh=$hhhhhX,,,MghhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhW\謎?  !      ! ! !       !! =ڍ/,,,.,,L,,,,,.,,,,,,L,,.,L,,,,,,,,,,,L,L,,,,,.,LLL,L.,,,,L,,L,LL,L,,LN.LLN,NLNLLLLLLLLLLLLLLLLLLLL.LLLLLNLLLLL,.LLLLLLLLL,LLLLL,LLLLLLL,,L,.L.L.L.,,LLL,,L,LL,,,,L.,,,L,L,L.,,LL,,L,,.,.,,,,,,,,,,,,.,,,,,,,,,,,,,,,,.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,.,,,,,,,,,DDIDDD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,Xhhhhhhhhhhhhh_$$$=hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh$$!$$$$hhY_hhhhhhhhhhh@$hhhhhhhX,,,bhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhg,0ْ}!!  !!  !!!   !    ! !! o\,,,.,,,,,,,,,,,L,,,,,,L,,,,,L,,,,L.,,,L,L,LL,,L.L,LL,L,LL,,L,LL,,L.,LLL.LLLNNLLLLNLLLLNLLLNLLLLLNLL.LLLLL,LLLL,,LLLLLLLLLLLLLLL,,L.LLLL,LLLL.,,L,L,L,L,L,.,,,,.,,,L,.L,,LLL,,,,,LL,,L,,,,,,.,,,,,,,,,,,,,,,,.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,DDDDDDDDD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,Xhhhhhhhhhhhhhhhf>$$$[hhhghhhhhhhhhhhhhhhhhhhghhhhhhhhhhhhhhhhhhhhhhhhhhh$$$$hYchhhhhhhhhh>$hhhhhhhhhhX,,,,,,,LdhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhM ,謠?      !  !  !            =}ڗM,,,,,L,,,,,,,,,,,,,,,.,,,,,,,,,,,,,,,L,,L,L,,,,,LL,,,,,,,,LL,,,LLL,,LLLLL.L,LLLLLLLLLL,LLLLLLLLLLLLLLLLLLLL.L,,LL.LLL,LLLL..LLLL,.LL,,LLL,L.L,,LL,,,,,L,LLL,L,,L,,,,,,,,,,L.,,,,,,.,,,,,,.,,,.,..,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,DDDLD,L,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,Thhhhhhhhhhhhhhhh_!@Y_c_[@$@hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh@_@[>@$@>YZYZhhZ$_hhhhhhhhhhh$hhhhhhhhhhhhX,,,,,MhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhX Us=   !!!      ! !oٍ-,,,,,,,,,,L,,,,L,,,,,,,,,L,,,.,,,,,,,,,,.,L.,,.,.LL,,L,,.,L,.,LLL,,,LLLNLLLLLLLLLLLLLLLL.LLL,LLNLLL.,L,LLLLL.L,LL,LLLLLLLLLL.LL,,LL.,.,,,L,L.,,LL,,L,.,,,,,,,L,,,,.,.,,,,,,,,,,,L,,,,,,,,,,,,,,.,,,,,,,,,,,,,,,,,,,,,,,,,.,,,,,,,,,,,,,,,,,,,,,,,DDDDDDDDDD,L,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,Xhhhhhhhhhhhhh_$>hdhhhhhh_XhghdhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhB$>hhhhhhhhhhhhhhhhhhhhhhhhhhhdhh>$hhhhhhhhhB$chhhhhhhhhhhh@hhhhhhhhhhX,,,chhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhc0 ӏm!  ! !  !     !   !  !=\,.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,.,L,,,,.,,,L,,,,.LL.,.,,LNLLL,.LLLLLLLLL.L,LL,LLLLL.L,LL,LLLLL.LL,,,,,LLL.L,,L,,L,L,,L,L,.,LLL,LL,.LL,,L.,,L,L,,,,,,,,,,.,,,,,,,.,,,,,,,,,,,,,,,,.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,DDDDDD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,Whhhhhhhhhhhhhhhd$chhhfhhhhhhhghhhdhhhchhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhghhhhhhhhhhhhh_$Chhhhhhhhhhhhhhhhhhhhhdhhdhhhd@hhhhhhchhZ$[hhhhhhhhhhhh>$hhhhhhhhhhhhX,,,0chhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhW  , f}>!   !  !  !  !!$qٓM,,,,,,,,,,,,,,L,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,LL,.,,,,,,.,L.L.,LL,LLLLLL,LLLLLLLL,LL,,L,L,LLLL.L,L,L.L.LL.LL,LL,LLLLL,,,,.,,,,,,.,L,,,LL,LL.,L.,,,L,.L,,,,,,,,,,,.,,L,,,,,,,,,.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,DDDDDDDDL,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,Xhhhhchhhhhhhhhh$hhhhhhhhdhdhhhhhhghhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhdhhhhhhchhhhC$Yhhhchhhhhhhhhhhhhghhhhhhhhhd>hhhhhchhhC$xhhhhhhhhhhhd@hhhhhhhhhhhhX,Whhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhc0      0Տq !        !     ! ! ! ! !         l`,,,,,,,,,,,L,,,,,,,,,,,,,,,,,,,,,,,L,,,,,,,,,.,,,,,,,,,,,L,,,,,.L,LLLLL,L.LLLLLLLL.L.,,L,LLLLLLLLLL,LLL.L,,L,,,LLL,,LLL,L,,,,,,,,,LLL,,L,.LL,,.,L,,L,,,,,,,,,,.,,.,,,,,,,,,,,,,,,,,,,,,.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,DDD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,XhhchhhhfhhhhC$$>gdhhhhdhhghhhhdhhhdhhhhhhchchhhhghhhchchhhhhhhhchchghhhhhchghhhhhhhhhhg$8hfhhhhhhhchhhhhhhhhdhhhghhhhg$hhhhhhhghY$[dhchhhhhchdh>$hhhhgfhdhhhhX,,,,,,chhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhM    , 笏l     !   !  =sP,,,,,,,,,,,,,,,,,,,,,,,,,,,,,L,.,,,,,,,,,,,,,,,,,,,,.,.,L.,,,,L,,L,L,LL,LLLLLL,LLL,L,.LL,LL,LLLLLLLL.LLL,.LL,L,,L,L,L,,LLL,L,.,.,,L,,,,LL,,,L,,,,,,,,,.,L,,,.,,L,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,DIDDDDDDD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,Xhhhhhhgghghhhhchhhhhhhchhhghhhhhhhhghhhchhhhchhdhhchhhchhhhhhhhhhdhchhhghhhhchhghhgghhhghdhhhhhhhchhhchhhhhhhhhhhhhhhdhh>$$hdhhhhchgYchdhhhchhhhgh>hhhhhghgdhhhW,,,,Mchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhc^s=     !   !!     ! !     !!!o׍/,,,,,,,,,,,,,,,,,,,,,,,,,.,,,,,,,.,,,,,,,,,,,,,,,,,,,,.,,,,,,,,L,L,LL,,LLLLLLNLLL,L,,L,L,LL,,L.L.LL.L,.LL,LL,.,,L,L,,,,L,LL,,L,.,.,,,,,,,,,,,,,,,,,,,,,,,.,,.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,L,D,DD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,Xhhhhhhdhdhhhh_$Zhhhhghhhhhhhhhhhhhhhdhhchhhchhhhhghhhhhhhhhhhhhhhhchhhhhhdhhdhhhhdhdhdhghdhdhhhhhhhhhchhhhhhhhhhhhhhdhhhhh>hhghhhhhhC$[hhhhhhchhhdd@hdhhhhdhghhhX,,,,WhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhcM -ӏp$   ! !   !         !j\,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,.,,,,,,,,,,,,,,,,,,.,,,,.,L,.,,,N,L,NL.,L.L,L,LL,,.,L,,.LL,,LL,L.L.LL.,,,,,LLL,,LL,.,,,,,,,,.,,L,.,,,,,.,.,,,,,,,,,,,.,,.,.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,DDDDDDD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,Xhhhhhfghhdhhh8chdhhdhdhhhdhdhchchhhhhhhhhch_B_B__hhhchchBBB_hh[B$j@hhhhghgh[CYB_chhhghdZBY_hhhh[c_chhchhc_c[hhhhhhhdghh>@hhhhdhhdhB_hhchhhhhhghh>$hhhhhdhhdhhdX,,,,,,chhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh^,,, ,,,`蚏m     !!!   !   !    ! =ٓ-,,,,,,,,,,,,,,,,,,,.,,,,,.,.,,,,,,,,,,,.,.,,,,,,.,,,,,,,,L,,LLLLL,,L,,,L,,,LL,.,,,LLL,,LL,,,.L.L.L,,,LLLL,LL,,LL,,,,L,L,,,,,,,,,,,,,,L,,,,,,,,,,,,,L,,.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,D,DD,,,,,,,,,,,,,,,,,,,,,,,,,,,Thhhhghdhghhdg$>hhhhhhhghghhhhhhhhhghhchhh@$Bhhhhh@@hhchch@>hchh_Bhhhh_$_hhhcchdhhghhhhh@>hdhhhhhghZchhhhhhchhdhh>hchhghhghhghX,,Mdhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhg0,0}?   !   !   ! !=q\,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,.,.,,,,,.,,,L,L,L,,LL,,NL,,.,L,,L,L,,,.L.,,,,.L,,,.,LL,,,,.,L,L,,L,,L,,,,,,,,,.,,,,,.,,,,,,,,,.,,,,,,,,,,,,L,,,,,,,,,,,,,,,,,.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,DDDDDD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,Xhhhhhhhhdhhh[Chhhhhchhdhdhgdhdhghdhhhhd_$$>fhch>@@hhhhhd@chdhcCghchh>$>hdh>_hhghhdhhgdh>>hhdhchhhc_hhhgdhdhhhdhT,,,, ,bhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhW ,,, ^ْq= !       !   !!        !   ! !  oٓ0,,,,,,,,,,,,,,,,,,,,,,,,,,.,,,,,,,,,,,,,,,,,,,,,,.,,.,,,,LLL,LL.,LLLL,,L,.L,LLLL,L,,,,.,L,L,,,L,,L.,,.,.,L,,.,,,,,,,,,,,,,,,,.,,,,,,,,,,,,,,.,,,,,,,,,,,,,,.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,DDD,,,,D,,,,,,,,,,,,,,,,,,,,,,,,WhghdghdggdghY_hhchdhhghdghdhgghdhhhhch_>___C$>ghh$$hchch__c_>[hhgh_BhhhhdhCgC>dhhdhhgdhdhf>>chghhhchhCchhghdhdghghX,chhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhùhhhhe ,  ,0Ӡp=!     !!  !j\,,,,,,,,,,,,,,,,,,,,,,.,,,,,,,,,.,,,,,,,,,,,,.,,,,,,.,..,LLLLLL,,LLL,,LL,,.,L,,,,,,,,L,L,L,,,,,L,,,,,,,,,,,,,,.,,,,,,,,,.,,,,,,,.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,DDIIID,,,D,,,,,,,,,,,,,,,,,,,,,,,,,,,,,XddghdhghdhhhB$[hhhghghdhghghgdhdhghchhd_hdhghhCCgdChhhhdhghhB_hhdhchhchd$Zhggdhd[_hhhchgddhghhg>@hhdhhchhhBhhchdhhhgdhcX,MhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhM `謏q=! !!  !    !    !    !   !  ! ?ٓM,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,L,,,,,.,.,,,,,,L,L.LL,,,,.,L,.,,L,,L.,,L,L,L,.,,,,.,.,,,,,,,,,,,,.,,.,,,,,.,,,,,,.,,,L,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,D,DIID,,D,,,,,,D,,,,,,,,,,,,,,,,,,,,,,,,,,,XhhdghddghdgfZ[hchdhdghhdgdhdhghchghhh__chdhdggh>hh_ghdhghdhch>Zhdhdhhdhhh_Bhhdhdhh>[hchhdhghhdhdh>>dghchhhhhY__c__c__c__c_>chhgghghdhhhX,XhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhùhhhhhhhhhhhhhhX,  0⚎o   !  !       ?\,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,L,LL.,,L,,,.,,,,L,.L,,,,,L,L,,,.,,L,,.,,,,,,,,,,,,,,,,.,,,,.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,D,DDDDDDDDD,,DD,DD,,,,,,,,,,,,,,,,,,Xedhdhhhghgdh_Zhhhghhdhghhdhghdhhgdhch>dhhhhhdhgc_dCghggdhdhghh]>_hhghchggccCghghghch>hfhghghdhchhhd>jhdhhhchchC_hhhdhhdhhghh>hhchdhchghdgW  chhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhc0      al !       !    ! !   !      !  !  !>}ٖ0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,.L,L,,.,,,L,L,.,L.,,.,,,L,,.,,.,,.,,,,,,,,,,,,L,,,,,,,,..,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,DDIDDIID,,DDD,DDD,D,,,,,,,,,,,,,,,,,,,,,,Xhgghgdgdhdhh_>hdgdgdghdhghchdhchdhhhhBhchgdghdhh>Bh_hdhdhghchchc>>[dhhdhh_Bhchdhdhh_cgghdgdgghhchdhj>ghchghhhc_chdghchghdhdf>chhghdhhdghdX,ThhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhX    0٥l     !     ?s\,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,L,L,,,L,L,,,,,,,,LL,,,,,,,.,,,.,,,,.,,,,,,,,,,,,,,,,,,,,.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,DIIIIIDDDDDDDDDDDID,,,,,,,,,,,,,,,,,,,Xdgdhdhhchhghdchdhhhdhghdhchghhhghccc_chghghghgh>Cg>hghghgdhhhhhh__hghc_Zhhhghghcc>>hhdhghhdhdhhhgh>>fdhghcchgY_hghdhghdhdhg>hhchdhgghdhgX,Xhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhc               ^٥?!!  !  !!    ! !    ! !  !!      ! =qד0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,L,LL,,,L,L,.L,.,,,,,,.,,,,,,,,,,,.,.,,,.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,DIIIIIIIDIDDDIDDID,,,,,,,,,,,,,,,,XghcdhchdhgdhgC>ghgdghhdghchdcgdgdhhh_Bhdhdhchcdf>Bh>hdhdhdhchchchhc>cdhh_BchchchchC[hdhddghgghchdd>>ghhdhhhchC_dhchhcggghdh>chhchdhdhdhdX 0chhhfhùhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh¹hhhhhhhhhhhhhhhM        ْs?  !!    ?sٝU,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,.,L,,,,,,,,L,.,L,,,,,.,,,,,,.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,IIIIIIDIIIIDDDDII,,,,,,,,,,,,,,,,,,,,,,,,Xhchhchchdhghhc_hdhdhchdhhchgchhdhcccCghgghchhhc_c>fhcchhghhhghdhhfh_Chgd[Chghcchh[hchcchhdhdhghh>>hcdhdcchc__hhhchdhdhghd>hhccchgdhgghX Whhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhc           Vْ}?     !  ! !!!   !   !       !  ! !   ?e-,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,.,.,L.,L,,,,,.,,,,,,,,,,.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,D,IIIIIIIIIIID,,,,,,,,,,,,,,,,,,,,,,,,XcdhcghdghdhchhY[hghdhhghchhdhchcghhhhhdhdhhchZ_h>hdhhcgchchdhgghghghh>dhh_Bhchchhc>>>hhchcdhgghdfdj>chghchhchB_cgdhghchchdhjchhhhchcdhdeX, XhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhcM    f٥o!        ! !      ?ٖM,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,L,,,,,,L,,,,,,,,,,,,,.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,DIIIDIIIIIIIDD,D,,,,,,,,,,,,,,,,Xhchchchdhgghchc_chchchchchch[>chdchBjgdcchccc>hd>fchchccchhhchBhcgchcChgd[_chchchB>h[hchchchchggh>jhchchgchcCj_hchcchchhdhg>hhchchccchdhXMchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhX             0䚏m  !          !!                ?}\-,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,.,.,,.,,.L,,,,,,,,,,.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,D,DIIIIDDD,,,,,,,,,,,,,,,,,,,,,,,Xchchcchghcccghc>[chhchhch_C[hhcjcchcc_[eh>chchcchccchhB>[hchcj>chh_>Bhchch_cc_chchcchchdgf>>chchhdhgh_[hcchchdgghdhjhchchcchchcdXXhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh    \䚏p=   !    ! jsق-,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,.,.,,.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,DDDIIIIDIID,,L,,,,,,,,,,,,,Xhchchdhchccdhdccc>>[__[C>>chch_>>>jhhdjcchcchchchc>>>ChchZjZfhchc>__ccC>hccchchcchcjhchcchchcZcchchchdhdhg>jchchcchchchcX  , 0bhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhW       એq?  ! ! !    !       !       !! ! $o}ڝM,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,.,,,,,,,,,,,,,.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,D,,IDDIIIIIDD,,,,,,,,,,,,,,,,,,,Wchchghchccchchhhhcj>ccchch_Cchch>chhhhccchch_jccch_Ychchj>chchcj_hchchcdhhcj>dhhchchhc__chchghdhghcf>jhchchhccchchX,Mhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhc      M謒}l! !      !!>q`-,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,DDDIII,,,,,,,,,,,,,,,,,,,,Xccchcchchchcchchccc_jjj_chdhchch[jjj_hchchjhcdccccdchcc>jj>cchcc_j_ccc_j_cccch_jchchchcchcjhfchchchcBk_hchgchghchhcjhcchcccccchcW,XhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhM         aӢp=  !  ! ! !! !     !  !! !oד0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,DIIDDIII,,,,,,,,,,,,,Xhchhchccchcchchhhhchc_jjjC[hchhchchchchcx>_C_[hhchchcB_C_ccchcchccchccc_>jZC_hchccccj>>_chhB_C_Cdchgcch_C_>_hcchchcchj_C_chcchcdhc__YCcchchchdhdhcc_>_CcchcchchccccX  chhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh¹hhhhhhhhhhhhhhhhhhhhhX      0એq=      !  !=pٝ\,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,DDDIIDL,,,,,,,,,,,,,,Xchchccchcccccchccchcccccc__chcchcccchchchchchchchchcghcccccchcgcdcchccgcccdchchchgcccccgccchcdcchchgcggcccccchgchccccccchcccccchccgchcchchchchchchchchchchcchcgcchcccchccX      Mhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhc0               M笒}p= !!!!       !  ! !!   ! !!  ?p\,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,DIIIID,,,,,,,,,,,,ThccchchchchhcccchccchchdcccchchccchccccccchcccccchchhcccchcgcccchchchchhdchchchchccchchcdchcchcchcchcchchchcchcchccchchccccchchccchcccchchcchcccchchccchccccccchchcchhhchcX,      Xhhhhhhhùhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh¹hhhhhhhhhhhhhhhhhhhhhW         Vْsl!      ! !!  !   >qf0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,DDDIID,,,,,,,XccchcccccccccchhccccccchcchcccccgcccgcchhchccchchcccccchccghcchcccchchccccccccchcccfccchccchcchccccchccccccdccccccchccchchcccgccgcccchccchhccchccchchccchcchcchcccchchchccX     0chhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhc                 a謒q?!    !       !!!!        !     =psד0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,DDDDDDIIDID,,,,,,,,,,,,,,,,,XhcccchcchcchccccccchchcchcccchccdcgcdcccchchhcccchchgchcchcccccchccchcchchchcchcdcgdgchcchcchhchchcccccgdcgchchchcccchcchchcchcdcchcccccchchgccchcccccchcchccccchcchcchcccX          ThhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhùhhhhhhhhhhhhhhhhhhhhhhhhhhhhhM             檏so=!        !jsٝ\,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,.,,,,,,,,,,,,,,,,,,,,,,,,,,,,DIDDDDIDDDD,,,D,,,,,,XcchccccccccccchcchccccchccchccchccdcchcccccchcchcchchccchcccdgcdcchcccccccccchccccccchccccdcccccccchcdcccgccccccccchccchcccccccdcgccchchcccchcchcchchchcchccchcccchccccchcX   Xhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhc                 0Ւ}sp? !      !    ! !! !!  ! !! !      !! !?p\,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,DII,DDDDDD,,,,,,,XccchccgcdechcccccccchccchccchcccgccgccchccccccccccchccdcchcdcccgccchcchcchcchccgcgdcccchcchchccchccccgcdcchcchcchccchcccccgdcgcdccchccchcdccchccccchcccccchccccgccccchccccX      0chhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh¹hhhhhhg0                  V⬒p?   ! !!  ! !   $jf-,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,L,,DDD,DDDDDDIDD,,,,,,,,,XcchcccdcdcdccchchcchcccccccgccchccdccdchhchcchccchhcccgccccgcdcccdcccccccccccchccccdcgcccccccchcccchcccgcdccccccccchccchccdcccdcgcdccchcccgcdcccchhccchcccccchcdcchccccchcX     XhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhX                        a՚o?!  ! !     !   ! !!  !=pqӓ0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,DD,DDDD,D,DIDD,,,,,,,,, XccccdcgcgcchcccchccchchccdcchcccccgcgcchccccchhchcccgcccgdcccgcdcgcchchcchchcccdcgcgcdcchcchcccchcccgcdcccchcchchccccccchcchccgcccchccchcdccchhchcchcccccchcccdcccccchccccX       chhhhhhhhhhhhh¹hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh                   fՒso>   !! !   !!    !=lqsםM,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,D,DD,D,,DDIDDD,,,,,,,XcchccgccccdccchccccccccccgccccchcccdccccccgcccccccccdcdcccgcdcdcgccccccccccccchcccdccdcgcccccchcccchccgcchcccccccchcchccccccccccddccccgccgcdcccccccccchcchccchccdgcchccchcX         MchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhW                     0٬sp?=!    !      ! ! !   !!    Cps؝M,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,DD,D,D,,DIII,,,,,XcccdccdcgcchccccchcchcccdccchcccddcchcgcdcchccchcchccgcgcchcgcgccccchcchccchccccdccgcdccchchcccchcccdccccccchcchcccccccdcgdcgdcgcgfcdccdccgcgccchcchcccccchccccgccccchccccX       Xhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhc                     0՚sspC=  !   ! !>opqٝ\,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,DDIIID,,,XcchccgcccdcccchcccccccchccdgccchcccdccccgccccchccccccdcccdccccccdccccccccchccchcgccccgcgcccccchcccchccgchcchcccccchchccgcccccdccccgcgccccgccccdgcccccchchccchccccdcccccchcX               XhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhM                  0Ӓqpj>=! !  !! !! !     !   =>lpqsٝ\,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,D,,,,D,I,,,,,XccccccddcgchcccchccchcccgccchccccgcccccccccccccchccgccdcgcdcgcdcgcccchchccccccccccddccdccccccccchccccdccccccccchcccccdccgchccgcdcccccccdccccgcccchchccccchccchcgccccchccccX            MhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhX                      0٬}ssp??>===!!!!   !    !!!!!! !! !!!! !!! !!!==?lpwqqٞ\-,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,DDDI,,,,,XcchccdcgccccccccccccccchccchccchcccdccccccccccchccccdcccccgccdcgccccccccccccchcchccgcgccdcchcchccccgccgcdcgccccccccccgcdcccccccgcccdcccccccccccgccccccchccccccccdccccccchcX       chhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhc                      V٬}sppppppppppps}qqopppppppppppppq}q}}qwsssqs}qppsq}qpqpqppqqqpqq}}}pppppppqqp}}}qppp}qpppqqppqw}ppp}}popp}}pqsqpmp}}}}qpq}qq}}}qppq}}qppqsppppqppqps}}ppqpqwqpqpppppq}qpps}w}qpqppppqs}pmpqq}}qqpppqoopppoppsqq}qpps}}}}qp}qpsq}qpp}qqqppq}qqqqpppqqq}}}qpqqpq}}qppqpppqsqqpppoopqppoppqqpq}qppq}wooppqq}qppoppqpq}}qpppppq}qpp}pqps}}}ppppsqpqqqqpqppqqpqpppppsqqpqqspqw}}ppppqppp}}qqs}ppqpppps}spp}}qppqpppppspq}}}w}}pqq}qpopppppq}}ss}}qqpppswpq}}q}}qqppqqpqpppqqppq}}}pppqqpppq}sppssppnw}}}}qqppppq}pqpq}ppmq}qppp}}}}}ppqsq}}qpqw}}qppppppppppppqwqppppppopppppppp}qq}qqws}qqwsppqwq}qqpqppqqqqpqq}wopqppppsqp}}qppq}pqppqppqp}sppq}spppq}qqqqppmp}}}}qp}wqq}}qqpp}}}sqs}s^,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,L,,,DDIIID,,,,XcccccgcccccccchccccccccchcccdcccccccccccchccccccccccgccccccdcgccdccccccchccccccccdcccdccgccccccccdccccccccccccecccccccgcchcdgccccccccccccdcccccdcccchcccccchcdccccccccccccX         0chhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhùhhhhhhhhhhhhhhhhhhhhhhhW                 \լ`-,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,DD,IIDDD,,Xcchccccc cccccX               Thhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhc                V`-,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,L,,,DIIIDID,,,XccccddcccccccW                XhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhM                       U`-,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,DD,IIDD,,,,,,,XccccgccdccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccX            0ghhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhc               Uڝ\-,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,DD,D,DDID,,,,, XcccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccgccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccX                 Xhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhc0                         Mם\,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,D,IDDDD,DDDDDDIDIDD,,,,,,,,XccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccgcccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccX             chhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhX               0ӝU,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,DDDDDIDD,DD,D,IDDDD,,,,,, XccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccX                   Mchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhc                       0fӝM,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,DDDDIDIDD,DDDD,DDDD,,,,,XccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccX             WhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhW                       aזM,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,DDI,DDDD,DDDDD,DDDD,,,  WccccccccccccccccccccccccccccccccccccccccccccccccccccccccccXcccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccXcccccccccccccccX          chhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh¹hhhhhhhhhhhhhhhhhhhhhhc                                   \ʍ0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,D,ID,DI,D,,,, XccccccccccccccccccccccccccccccccccccccccccccccccXcccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccXcccccccccccccccccccccccccW             MchhhhhhhhhhhhhhhhhhhghhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhM                      U\-,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,DID,DDDD,D,,D,,,  XccXccXcccccccccccccccccccccccccccccccccccccccccXccccccccccccccccccccccccccccccccccccccXcccccccccccXccXcccccccccccccccccccccccccccccccccccccccccXcccccccccccccccccccccccccbX                   XhhhhhhghhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhùhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhX                           0fӖU,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,DDDDDDD,DDD,,D,, ,XcccccccccccccccccccccccccccccccccccccXccXccccccccXcccccccXccXccccccccccXccXccXcccccccccccccccccccccccccccccccccccccccccccccccccccccccXccXccccccccXcccccccXccXccccccccccXccX              chhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhc                                     ^ʂ0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,DDD,DI,,DD,,,,    XcccccccccccccccXccccccccccccccccccccccXcccccXccccccccccXccXccccccccccccccXcccccccccccccccccccccccccccccccccccccXccccccccccccccccccccccXcccccXccccccccccXccXcccccccccccccccX                 MhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhW                        U\-,,,,,,,,,,-,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,DDDDDDDD,,,,,,,XccccccccXcccXcccccXcccccccccccccccccXccXcccXccccccccccccXccXcccccccXcccXccXccccccccccccXccccccccccccccccXcccXcccccXcccccccccccccccccXccXcccXccccccccccccXccXcccccccXcccXccX           cdhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhghhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhc                                   0ӝM,,,,,,,,,,LXcbccRKRLM,-,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,DDDD,,,D,,,, , WcccccccccXcccccccXccccccccccccccXccXcccccccccXccccccccccccccccccXccccccccXccccccccccccXccccXcccccccccccccXcccccccXccccccccccccccXccXcccccccccXccccccccccccccccccXcccccccXcX         chhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhM                        \f0,,,,,,,,,0XXXXcXhRJRKM0L0M,,,,,,,,,,,,,,,,,,,,,,,DD,,,,,,,,,,  XcccccXcccccXcXcXcXYXccccccccXcccccccXcXccXcccXcXccYccXcccXXccccccXcccccccccccXcccccXccccXcccXccccccccXcccccXcXcXcccXccccccccXcccccccXcXccXcccXcXcccccXcccXcX$ccccXcccccccXX             Xhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhc                                  0ӖM,,,,,,,,,MbcXbXXXccT,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,D,,,,,, , XcccXcccXccccXccb$$$@cccXcccccccXcccccccccccXcc@$cccX$$XcX@$XcccXcccXccccccccXcXccccXcXcccccXcccXccccXcXcccXccccccXcccccccXcccccccccccXcccccXccXcXccYcccXccccccXccX            chhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhc                              :\-,,,,,,,,,,,XXXXXXXcXchc,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, , XccccXccccccXcXc$@XcbY@ccccXccXcXccXccccXcXcccX@$YcXccc@$bY@$c@Yb@XccccXccXcccccccXcXccXcc=XcXccccXccccccXcXccXccXcXcccccXccXcXccXccccXcXcccXccXcccccXcXcY$XcccccccccccXX        0chhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhX                        0^f0,,,,,,,,,,,McXbXbbXXXchKKLJK\,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,  VcXcccXcXccXcXc@ccXcc@$XccccXccXccXccXccccccXccYccXccYXXcbY$@ccb$@ccccccXccccccccXcXcY@cX@XcccXccccXcXcc@@ccXccXccXcXccccXccXccXccXccccccXcccXccXccccccXYccXcXccccccccX             Whhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhghhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhd                                     0ӝU,,,,,,XXXXXXbcXcXcK GK,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, , XbcXcccXcXccXcX=@cccXcX$A@YccYYcc@@YcX_@Y@YccXcYX@@YXcY$bcXc$@$YXcc@=ccccXYY@@YccXcY@@YY$$Yc@XcX@Y@ccYYY@YX=XcX@@YcXXXXcX@@XcXcY@@Xc@Y@@Y@cXX@ccY@@XcccX@@@$XcXccXcXccccXX        chhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhW                            UӞ\,,,,,,,,,,XXbXXcXXXbccKKKGKFM,,,,,,,,,,,,,,,,,,    XXccXcXccXcXcXc$YccXcXc$@Y$cY$XX!@$$c@$=XcXcbY$$@B$$cYcXXc@XccX@$cXccc@$$@$=cX@$@$@$Yb$Yc$=@$@c@$=$Y$$YXB$@@cXccXc$=@YXc@$@@X$=YX$Xc=@c@$@@XXY$$$cXccXcXccXcccW            chhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh¹hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhc                                       UӞ\0,,cXXbcXbcXcXcb,,,,,,,,,,,,,,,,,,,,,,,,,,,       XcXcXccXcXcXccX@XXcXcX@X$Y@$c@cXXX@$YccXcXcY@cbcYY$XcXc$@$YXXc$@XcXcX@$bcYYXXcX$@@$ccY@ccYX@$cX$@@cX=$bcXcXccX@YccXYbc$@$@cXc=@Y$XXYcX>@c=@Xc@XcXcXXXcXcXcXX            XhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhghhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhM                                   UӞ\,,,,,,,,cXXcXcXXcXcXh,,,,,,,,,,,,,,,,,,,,,,,,,,, ,    XXcXcXXcXcXccXc@$cXXcbYXc@$Xb@$$YB$XcXcXcXX$YXcc$YXYXcXY$@ccX@Xcccc@ccc$YY$cbc$B@$cXX$$$$c@>Xc=@Y$XcX$$cXcXccY$@XY$$YYXcXY@cY$YX$@cbYXccXcXcXcXcXcX          XhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhùhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhX                                  Mӝ\-,,,,,,,cXcXXXcXcXcc,,,,,,,,,,,,,,,,,     XcXcXccXXXcXccXX=@bcXY$@ccY$Xc@$YbXXc@$cXcXXXcXB$cX@$Yc@$Yb$$X@Yb@XcXcXc@$XcYXXYcX@@cXY@XbYXb@$XX@@@$cbYcY$XccccXYc@bX@XXYXYcXcXXbX$@bcYcX@Xc@bXcXcXbcXcXccX                Mhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhc                                :ӝ\,,,,,,,,,,XcXcXbbcXcchhh,,,,,,,,,,,,,,,,,,  XXcXXcXcXcXccXccY$$$@cXcX$@cXX$$>XA=XcXbXcXcX$@cXc$YbX@YXcXXXc@$@cX@$$@@$cb$Yc$@cA@Xc@A$cX$$cXcXcY$$@Xb@$Y$YXcXbY=XcbY$$XcY$cXcXcXcXcbXXcX          Xhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhùhhhhhhhhhhhhhh¹hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhW                                          0`ӓM,,,,,,cXXcXccXccchľg,,,,,,,,,,,,,,,,,,,,,,     XXXcXbcXcXcXcccXccYYYXcXcXbYXbXXbYYXXcXYdXbXcXXbcXYYcXXcbcYYXbXcXYYbXcXcXcb@$XYXcXcXYYYXYXYcXYXbcYYXXcXYcXb[bXccXYYcXXccXXXYXXXXXXYYcbYcccXXXYcXcXcYYcXXcXYYXYXcXcXcXXcXcXcX                     chhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhc                                       UӖ\,,,,,,,McXcXcXcXccJ,,,,,,,,,,,,,,,,,,,       XXcXXcbXXcXccXccXcXcccXcXcXXXcbXXXXbcXcccXcXbXcXbccXcbcXXXcbXXXXbXcXcXcbXXcA$cXXcXcbccbcXcXcXccXcXbXcXcXXccXcccXcXccXccXXcXXbcXbXbbXXXcXcXcbXXXXXccXcXcXbcXbXbXXXXcbcXcXXcXX         ThhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhM                                  \ӝ^-,,,,XcXcXcXcch0,,,,,,,,,,,,,,,,,,,,,,,,, ,       XXXcXcXcXbcXcXcXcXcXcXcXXbXcXbcXXbcXXcXcXcXXbXXcXXXcbcXXXbXcXXbcXcXcXcXXcXb@=XcXbcXcXcXXXcXXcXXcXcXcXcbcXXXcXcXcXcXccXXcXbcXXXcXXXcXXcXcXcXXXXcXcXXcXcXcXXcXXXXcXcXcXcXcXXcX               chhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhfhhhhhhhhhhhhhhhX                                ^f0,,,,,,,,,,0cccXccchh,,,,,,,,,,,,,,,,,,,,,,,,,,,  ,          XcbXcXXXcXXcXcXcXcXcXcbcXXXcXcXXcXXXXcXcXcXXbXbXXcXXcXbXcXcXcXXXcXcXcbXcXcXcbcXXcXcXcbXcbXcbXcXcXXXXcXXXbXcXcXcXcXcXcXcbXXXcbcXcbXXXcXcXcXXbXbXcbXXXcXXXXXcXcbXXcXcXcbXbXcXX       0chhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhghhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh¹hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhd0                            Ufʓ\0,,,,,,,ccccc,,,,,,,,,,,,,,, ,      XXXXbXbXbXXbcXXXXXcXXXXXbXcbcXcXbXbbcXcXcXbXcXXbXbXXXXXcXXXcXXXbXXbXXXXbcXbXcXXcXXcXXXXXcXXcXXbXcXbXbXXbXXXXcXXXbXXcXXXXXbbcXcXcXXXbXcXcXcXbcXXbXXbXbXbXcbXcXXXbXXbXXXXcXbXX                  XdhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhX                                            \ʔ\0,,,,,,,0XcM,INͻM,,,,,,,,,,,,,,        XXbXXbXXbXcXbXbbXbXbcXbXcXXcXcXcXXXXXcXcbXcXcXcXXbXcbXcXXcXXcbXcbXXXbXXcbXXcXXcbXcXcXXcXXbXXbXcXbXXXXbXXcbXcXbXbXbXbXcbXcXcXcXcXbXbXcXcXcXXcXcbXbXXXXcXcXXcXcXXcbXbXbXcXXcXX              chhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhùhhhhhhhhhhhhhhhhhhhhhhfhhhhhhhhhhhhhh¹hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhd                                        0Vaʖf\M,,,,,,,LJNMM,,,,,,,,,,,,,,,,,,               XXXbXXbcXXbXXXbXXbXXXXbXXbcXcXbXbXbbXbcXXcXcXcbXbXXbXcXXbXcbXcXXXXbXbXbXXXcXbcXcXXcXbcXbXbcXbXXXbXbXbXXbXXcXXbXXXXXbXXXXbXcXcXbcXXXbXcXbXbcXcXXXXbXcbXcbXcXcXcbXXXXbXbXbXbcX             TchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhW                                   0T^ʝ`U0,,,,,,,,,K2,,,,,,,,,,,         XXbXXXXXXbXbXbXXXXbXbXbXXcbXbXcXbXXXcXXbXXcbXXXbXXXbXXcXXcXXcbXbbXXbXXbXbXbXXXXXcXbXXXbXXXXXcbXbXXXbXbXbXbXXXXbXbbXbXbbXXXXbXcXbXbXXbXbXXcbXXbXbXbXXXbXXcXXXcbXXbXbXXXXXXXXX                   Xhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhc                                              00UVV\^^^^^`^^^^^^^^^^`^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^`^^^^^^^^^^^^^^^^^^^^^^^^^`^^^^^^^^^^^^^^^^^^^^^^^^`^^^^^^`^^^^^^`^^^^^^^^^^^^^`^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^``^`^^^^^^^^^^^^^`^^^^^^^^^`^^^^^^^^^^^f›–_x_zdz__x^^^^^^^^^^^^^^^^^^^`^^`^^``````````^^`^`^^^^^^``^`^^^`````^````^```^^```^`^^^`^``^^`^^^``^^``^^^^^^^^^^^^^^^^^`^`^``^``^^^`^^^^^^^`^^^^^^^`^^`^`````^^``^^```^```^`^^^`^`^^^^`^^^`^^^`````^````````^``````^`^`^``^``^^````````````^`^``^^^``^`````````^`^```````e`````^\VUM000,,,,,,,,,,,,,,,,,,,,,,,      XXXXbbbXbXXXbXXbbXbXXXXbXXXcXXXbXXbXbXXcXbXXcXbXXbXXcXbXcbXXbXXXXXXbXbXXXbXXcbXbXcXbXbXbXbXbXXXXbXXXXXbXXXbXbXbXXXXXbXXXbcXbcXXbXXbXcXXcXXXXcXbXXXbXbcXbXbXbXXXbXbXXbbbXbXbX           cghhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhM                                                      \chhhhhhfcccccXbXXXTTT ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,       XXbXXcXbXbXbXXbXXXXbXbXXbXbXbXbXXXXXbXbXXbXXXbXXXbXbXXbXXbXXcbXbbXbXXXbXbXXbXXbXcXbXXXcXcbXcbXbXXbXbbcXXbXXbXXXbXbXbXXbXXbXXbXXbXXXXbXbXbbXbXbXXbXXbXXXXXbXXcXbXXXXXXXXbXXXX                    Mchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhg¹hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhùhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhX                                                                                                                                    bhghhhhhhhhcccbXXXTTTTTT             ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,        XXXXbXXXXXbXXXXbXbXbXXbXXbXXXbXXbXXbXbXXbXXbXXbXbXbXbXXbXXbXbXXXXbXXbXXbXXbXbXXbXbXXbXXbXXXXXXXbXXbXXXXbXbXXbXbXXXbXXbXbXXbXXbXXXXbXXXXXXXXbXXXbXbXXbXbXbXbXbXbXbbbbXbXXbXXX          bhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhc                                                                       bchhhhhhhccccXXXXTXXTTTT       ,,,,,,,,,,,,,,,,,,,,,,,,,,,,           XbXcXbXbXbXXbbXXbXXXXbXXbXXXbXXbXXbXXXXbXXbXbXXbXXXXXbXXbXXbXXbbXXXbXXbXXbXXXXbXXXXbXcXXXbXbbXbXbXXcbXbXXbXXXbXbXbXXXXXXXbXXbXXbXbXbXbbbbXbXbXbXXbXXXbXbXXXXXbXXXXXXXbXXbXXX                  chhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhùhhhhhhhhhhhhhhhhhhhhhhhhhhhhhùhhhhhhhhhhhhhhhhhhhhhhhhhhhhhW                                                                                                                XhhhhhhhchccccbXXXTTT                ,,,,,,,,,,,,,,,,,,,,,,,,,,, ,,,       XXXbXXbXbXXbXXbXXbXbXXXbXbXbXbXXXXbXXbXbXXbXXXXXXXbXbXbXXbXXbXXXXbXXbXXbXXbXbXXbcbXbXXbXbXbXXXXXXbXXXXXbXXbXXXXXbXXbXXbbXXbXXbXXXXXXXXXXXXXXXXXXXXbXXXXXbXbbXXbXbXbXbXbXXbXX      Thhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhc                                                                                               cghhhhhhccccccXXXXTTTT             ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,  ,,,            XbXXXbXXXXXbXXbXXXbXbXbXXXbXXXXXbXXXXXXXXbXbXXXXXbXbXXXXbXXbXXbXbXXbXbXbXXXbXbXXXXXXXbXbXXXXXbbbXbXbXbXXXXXbbbXbXXbXXbXXbXXbXXXbXbXXXTTTXbXbXXXXXXXbbbXXXXXXbXXbXXXbXXXbXXXX               XhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhùhhhhhhhhhhhhhhhhhhhhhhhhhhM                                                                               0bchhhhccccXXXXXVTTTT                  ,, ,,,,,,,,,,,,,,,,,,,,,,,,,,            XXXXbXbXXXXXXbXbXXXXXbXXbXXbXbXXXXXbXbbXbXXXXXXXXXXXbXbXXXXbXbXXXbXXXXXXbXXXXXbXbbXbXbXXXXbbXXXXXXXXbXbXXXXXXXXXbXXbXXbXXbXXbXXXXTXXXbXXXXbXXXXXXbXbXXbXXbXXXbXbXbXbX        chhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhÍhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhc                                                                                                          chhhhhhcccccXcXXXTTTT           ,,,,,,,,,,,,,,,,,,,,,,,    XXXXXXXXXXXXbXXTFFTXbXbXXbXXbbXbXXXXbXXXXbXXXbbbXXbXbXXbXXXXXXbXbbXbXXbbbbXXXXXbXbXXXXXXXXXXXXXXbXXbXXXXXbXbXbXXXTF"bXbXXXXbXXXXbXbXbXXbXXXbXXXXXXbXbXXXXXXXX                Xhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhùhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhc                                                                                         0chhhhhchccccXXXXXTT          ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,       FFFFHEXbXXbXbXXXbXbXXXbbXXXXXFFTbXXXXXXXXXXXXbXXXXXXXXXbXXXXXXXbXbXbXXTTTTbXXXbXXXXXbXXXbTFEVXXXXXXXbTF"TTXXTTTTTT"FTbXXXXX         bhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhghhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhX                                                                                                          bhfghhbXcbXXXTTTTT      ,,,,,,,,,,,,,,,,,,,,,,,,             ETXXXXTFETbXXXbXXXFTTXXbbbbXXXbXXbXbXbXXXXbXbXXXXTFE"bXXXXbXbXXbXTFTXXXXbXTTXX           0chhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh¹hhd                                                                                           MeùhhgcccccXXXXXXTT:TT"                 , ,,,,,,,,,,,,,,,,,,,,,                   FTTFTTXXbXXXXbXXbXXXXXbXXbTFXbXXXXXXbTTXXXXXT           bhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhW                                                                                                         chhhccdccXXXXXTXTXTT                     ,,,,,,,,,,,,,,,,,,, ,,                 FTTTXXXXXXXXXXXXXTFTXXXXXTXXXTF               chhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhùhhhhhc                                                                                          Mc¹hhhhhhgccccXXTXXTT"TT                  ,  ,,,,,,,,,,,,,,,,,  ,                    MdhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhM                                                                                        ghhhhcccccXXXXXTTTTT                     ,,,,,,,,,,,,,,,,                              XhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhX                                                                                          0hhcdccbbcbXXXVTTTTTTT"                         ,,,,,,,,,,,                             chhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhc                                                                                                     ghhhhhccccbXXXXXTTTTTT                 ,,,,,,,,,,,,,,,,,,, ,                        MchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhùhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhW                                                                                               ghhhhchcccbXXXTXTTTTTTTT"                 ,,,,,,,,,,,,,,                             chhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhc                                                                                                           MghhhhccccbXbXXXTTXTTTTTTT                   ,,,,,,,,,,,,, ,,,,                              chhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh¹hhhhhhhhhhhhhhhhhhhhhhhT                                                                                                 0ghhhhhcccbbXXXTXTTTTT               ,,,,,,,,,,,,,,,,,                                XhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhX                                                                                                     hhhhhchccbbbXXXTTTT"TT:T                      ,,,,,,,,,,,                                     Xhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh                                                                                                  MghhhchcccbXXXXXXTTT"TTTT                  , ,,,,,,,,,,,,,,,,,,                                        chhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhX                                                                                                          ghhhhhccbcXbXXTXTTTTTTT"                ,,,,,,,,,,,,,,,,,,, ,                                             Xhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhghhhhhhhhhhhhhhhhhhùhhhhhhhhhhhhhhhhhhhhhhc-                                                                                                  MhhchhcccccbbXXXVTT:TT:TTTT                   , ,, ,,,,,,,,,,,,,,,,,,  ,                                                                XhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhT                                                                                 ghhhchccbbXXXTTXTTTTT                 ,,,,,,,,,,,,,,   ,                                                               chhhhhhhhhhhhhhhhhhhhùhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhd                                                                                                  MghhhcdccbXbXXXTTXTT:TTT                         , ,,,,,,,,,,,,                                                                       Xhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh                                                                                  hhhhcdcccbXXXXXXTTTTTT              ,,,,,,,,,,                                                                          chhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh¹hhhhhhhhhhhhh¹hhhhhhhhhhhhhhhhhhhX                                                                                              ghhhhgcccbcXXXVXTTT"TT                            ,, ,,,,,,,,,,,,,,,                                                             Tdhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhc                                                                                    0ghhhchccbcbbXXTTTTTT:T                   ,,,,,,,,,,,,,                                                                     bhhhhhhhhhhhhhhhhùhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh\                                                                                        MhhhhdhcccbXXXXXTTTTTTTTTTT"                        ,  ,,,,,,,,,,,,,,                                                            chhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhc                                                                                                   hhhchhcccbXXXXTTTVTTTTT                      ,,,,,,,,,,,,,,,                                                                      XhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhùhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhùhhhhhhhhhhhhhhhhhhM                                                                           MchhhhcghcccXXXXXXTTTTTT"T                      ,,,,,,,,,,,,                                                                            Xhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhc                                                                                      0hhhhhcccccXbXXXTTTTTTTTT                         ,,,,,,,,                                                                            chhùhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh¹hhhhhhhhhhhhhhhhhhhhhhc-                                                                                   MhhhhdcccccbXXTXTTTTT:T                       ,,,,,,,,,,                                                                              XhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhX                                                                                     ghhhhgccccbXXXXXTTTT:"TT"M                         ,  ,,,,,,,,,,,,,                                                       chhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhùhhhhhhhd                                                                                                MghhhhhccccXXXXXXTTT"TT"MT""                    ,,,,,,,,,,,,                                                         MchhhhhhhhhhhhhhhhhhhhhhhhhhhÍhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhW                                                                              0ghhhhhcccXXXXXXTTTTTTMT:T"T                  ,,,,,,,,,,,,                                                                            Xhhhhhhhhhhhhhhhhhùhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhc                                                                                        MhhhhhdccccccXXTXTTTTT""TT                           ,,,,,,,,,,,                                                              dhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh                                                                                   0hhhhcccccXcXXXXTXTTT:TT                    ,,,,,,,,,,                                                                                        Mhhhhhhhhhhhhhhhhhhhhh¹hhhhhhhùhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhùhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhX                                                                                  MhhhhhhhcccbXXXXXTTT""TTTTTT                          ,,,,,,                                                            bhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhÍhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhc                                                                                 ghhhcccccXcXXXTVTTMTT                          ,,,,,,,,                                                                                   0chhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhùhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhW                                                                                                  hhhhhhhcccbXXXXTXT""TTTTT                              ,  ,,,,,,,,,                                                                 Thhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhc                                                                             MghhhccccXcbbXXXTTTTTTT:"                    ,,,,,,MMM0-M0MLM0LM000-M-M0MLM-M-M-M0LM-M0-M0-M-M0LMMLM0-M00-M-M00-M0MLM-M000000000LM000MLM000-M000-M0000-M0-M-M000000-M0MLM000-M-M00000-M0-M00000000-M0000000000000000MM000-M00000M00-M00000-M00-M00000000000000000000M00000000000000M000000000000000-000000000000000-M00000MM0000M00M00000M000000000M00M00M000M000M00M00MM000MMM00M00M0M0000000000000M000000M00-M0000M00M0000-000M0000-00M0000Mchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh¹hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhX000M0M00M000-0--0000-M0000M0000-0000M000M0-000M00M0M0M00-M0000-M0-M0M0000MM0M0MM00-0000000000000M0-0M0000000M00000M0MhhhhhhhccXXbXTXXTTTTT"TT0M00000000MM0000M00000000M000MM00000000000000-000000000000000-M000000M000000000000000000000000-M0000-M000000-M00000000-M00000000000000000MM000-M00000M0-M-M000000000LM00MLM000-M000-M0000-M0-M-M000000-M0MLM000-M-M00000-M0-M0000000000-M-M00-M-M000000-M0-M0LMMLM-M-M00-M-M-M-M-M0MLM-M-M-M-M0MLM-MMLM0LM-M-M-MMLM-M-M-M-M0LM-M00LM00LMMLM0MLMhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh¹hhh¾h¹h¹hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh¹hh¹h¹¹hh¹¹¹¹¹hhhhhh¹h¹hhhcchc^XXXXXTXTTTThhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh¹hh¹hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh¹hhhh¹h¹hhhhhh¹hhhhh¹h¹hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh¹hhhh¹hhhhhhhhhhhhhhhhhhhhhhhhhh¹hhhh¹hhhhhhhhùhhhhhhhhhhhcccccbbXXXTTTTTT"TTThhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhùhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhÍhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchccccbbXXXTTTTT:TTTM"Thhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh¹hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhcccbXXXVXTTTTTTTT"hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhùhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhcXc^cXdcXcXcXcXcXcXcXcXcXcXXcXcXcXcXcXcXcXcXcbc^cXcXcXcXcXcXcXcXcXcXcXcXcXcXcXcXcXcXcXcXcXccXcXcXccXcXcXcXcXcXccXccXcXcXcXcXXcXcXcXcXcXcXcXcXccXcXcXcXcXcXcXcXcXcXcXcXcXcXcXcXcXcXcXcXcXcXcXcXcXcXcXcXcXcXcXcXcXcXccXcXcXccXcXcXcXccXcXcXcXcXcXcXccXcXXXcXcXXcXcXcXcXcXcXcXcXcXccXcXcXcXcbcXcXcXcXcXcXcXcXcXcXcXcXcXcXcXcXcXcXcXcXcXcXcXcXcXccXcXcXcXcXcXccXcXcXcXccXcXcXcXcXcXcXccXcXcXcXcXXcXcXcXcXcXcXcXcXcXcXcXcXcXcXcXXcXcXcXcXcXcXcXcXcXcXcXcXcXcXcXcXcXcXcXcXcXcXcXcXcXcXcXcXcXcXcXcXcXcXcXccXcXcXcXcXcXcXccXcXcXcXcXcXcXcXccXcXcXcXc^ccXcXcXcXcXcXcXcXcXcXcXcXccXcXcXcXcXcXcXccXcXcXcXcXcXcXcXcXcXcXcXcXcXcXcXcXcXcXcXcXcXccXcXcXcXcXcXcXccXcXcXXcXXcXcXcXccXcXcXcXccXcXcXcXcXcXcXcXcXcXcXccXcXcXcXcXcXcXcXcXcXcXcXcXcXcXcXcXcXcXcXcXcXcXcXcXcXcXccXcXcXcXccXcXcXcXcXccXcXccXcXXcXcXXcXcXcXcXcXcXcXcXccXcXcXcXcXcXcXcXcXcXccXcXcXcXcXcXcXcXcXcXcXcXcXcXcXcXcXcXcXcXcXcXcXcXcXcXcXccXcXcXcXccXcXcXcXcXcXcXccXcXcXcXcXXcXcXcXcXcXcXcXcXcXcebcXcbc^cXcXcXcXcXcXc\dXcXcXcXcXcXcXc\cXcXcXcXcXcXcXcXcXcXcXcXcXcXXcXcXcXccXcXcXcXcXcXcXcXcXcXccXccXcXcXcXcXXcXcbcXcXcXcXcXcXcXccXcXcXcXcXcXcXccXcXcXcXccXcXcXcXcXcXcXcXcXcXcXcXcXcXcXcXcXcXcXcXcXcXcXcXcXccXcXcXcXcXcXcXcXcXcXcXccXcXcXcXcXXcXccXXcXfXcXcXcXcXcXcXcXcXcXcXcbcXcXcXcbcXcXcXcXcXcXcXcXccXcXcXcXcXcXcXcXcXcXcXcXcXcXcXcXcXcXccXcXcXcXcXcXcXcXcXcXcXccXcXcXcXcXcXccXcXccXcXcXcXcXcXcXcXcXcXc\cXcXcXcXcXcXcXcXcXcXcXcXcXcXcXcXcXcXcXcXcXcXcXcXccXcXcchhhhhhcccbXXXXXTTTTTTTTTcXcXcXcXcXccXcXcXccXcXcXcXcXcXccXccXcXcXcXcXXcXcXcXcXcXcXcXcXcXcXcXcXcXcXcXXcXcXcXcXcXcXcXcXcXcXcXcXcXcXcXcXcXcXcXcXcXcXcXcXccXcXcXcXcXcXcXcXcXcXcXcXcXcXcXcXcXcXccXcXcXcXcXXcXcXcXc\dXcXcXcXccXcXcXcXc^cXcXcXcXcXcXcXcXcXcXcXcXcXcXcXcXcXcXcXcXcXcXcXcXcXcXcXcXcXcXcbcXcXccXcXcXccXcXcXcXcXcXccXccXcXcXcXcXXcXcXcXcXcXcXcXcXcXccXcXcXcXcXcXcXcXcXcc^cXcXcXcXcXcXcXcXccXcXcXcXcXcXcXcXcXcXcXcXcXcXcXcXcXcXccXcXcXccXcXcXcXcXcXccXccXcXcXcXcXcXcXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXchhchchcccXXXXXXVT"TTTTXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXbXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXbXXXXXbXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXbXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXbXXXXXXXXXXXXXXXXXXXXXXXXXXXXXbXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXbXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXchhhchccccccXXTXTTTTTTTTXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXbXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXbXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXbXXXXXbXXXXXbXXbXXXXXXXXbXXXbXXXbXXXXbXbXbXXbXXXXXXXbXXXXXXXXbXXbXXbXbXbXbXbXbXXbXbXbXbXXbXXXbXbXbXbXbXbXbXbXXbXXXXXXXXbXXXXXXbXXbXXXXbXbXbXbXXXbXbXbXbXbXbXbXbXbXbXbXXXbXXXbXXXbXXXXbXXXXXXXbXXXXXbXbXXbXXbXbXXXbXXXXXXXXbXXbXbXXbXXbXXXXbXXXbXXXXXbXXbXXbXbXbXbXbXbXbXbXbXXXbXXbXXbXXXXXXXbXbXbXbXbXXXXbXXXbXXbXXXXbXXXXXXXbXXbXXXbXXXbXXXXXXXbXXbXXXbXXbXXXbXXXbXXbXXXXbXXbXXXXXXXXbXbXXXXXXXbXbXbXbXbXXbXXXXXbXbXXXXbXXXXbXXXbXbXbXXXbXXXbXXXbXXbXXXXXXXXbXXXXbXXXbXXXbXXbXbXbXbXbXXXbXbXbXbXXXbXXbXXbXXXbXXXXXXXbXXXXXXXXbXbXbXbXbXbXbXXbXXXXXbXXbXbXbXbXbXXXbXXXXXXbXXbXbXbXbXbXbXbXbXbXXbXXXbXbXXXbXbXbXXbXbXbXbXXXbXXXXXbXXXbXbXXXbXXbXXXbXXXXXXbXbXXbXXbXXbXbXbXbXXXbXXXXXXXbXXbXXbXbXXbXXXXXbXbXXbXbXXXbXbXbXbXXXXbXXXXXbXXbXXXbXXXbXXXbXXbXXXbXXXXXXXbXXXbXXXbXXXXXbXXXXXbXbXXXXX^XXXbXXbXXXXXXXXXXXXXXbXbXbXXbXbXbXXbXXXXXbXbXXbXbXbXbXbXbXbXXXXbXXXXXbXXbXXXbXXXbXXXbXXXbXXbXXXXbXXXbXbXXbXXbXXXbXXXXXXXbXXXXXXXXXXXbXXXXbXbXbXbXbXbXbXXbXXXbXXbXbXbXXbXbXXXbXXXbXXbXXXXbXXXXXbXbXbXbXXXbXXXXXbXXbXXXXXXXXXXbXbXbXbXbXXXbXXbXbXXbXXXXXXXXbXXXbXXbXXXXbXXXbXXbXbXXbXXXbXbXbXbXXXXXXbXbXbXbXXXXXXXbXXXbXXbXXbXXXXXbXXXXXbXbXbXbXbXbXbXbXbXbXbXXXbXXXbXXXbXXXXXbXXXbXXXXXXbXbXXXbXXXXXXXXXXXXXbXXbXXXbXXXXXXXXbXXXXXXbXXXXXXXbXXXXXbXXXXXXXXXXXXXbXXXXXXbXXbXbXbXXXbXbXbXbXbXbXXXbXXXbXXXXXXXXXXbXXbXXXXXXXXbXXXXXXXXXXXXXXbXbXXbXXXbXXXXbXbXXbXbXbXbXXbXbXbXXbXbXbXXbXbXbXbXbXXXXXXbXXbXbXXXbXbXXXXXX^hhhhhccXccXXXXXXTTT:TT:XXbXXbXbXbXXXbXbXXbXXXbXXbXXXbXXXXXXXXXbXXXXXXXXbXXbXXbXbXXbXXXbXXXXXXXbXXXbXXbXbXbXbXXXXbXXbXbXXbXXbXXXXXXXXbXXbXXXbXXXbXXXXXXXXXXXXXXXXXXXbXXbXXXbXXXXXXbXXXbXXXXXXbXbXbXXXbXXXXbXXXXbXbXbXXbXbXXXbXXXXbXXbXbXbXbXbXXXbXXXbXXXbXXXXbXXXXXXXbXXXXXbXXXbXbXbXbXbXXXbXXbXXbXbXbXbXbXbXbXbXbXbXXbXXXXXXXXbXXXXXXbXXbXXXXbXXbXbXXbXbXbXbXXbXXbXbXXXbXXXXXbXXXbXbXbXbXbXXXbXXXbXbXXXbXXXbXXbXbXXbXXbXbXbXbXbXXXbXXXbXXbXXbXbXbXXXbXXXXXXXbXXXXXXXXXXXXbbXbXbXbXXXXXXXXXXXbXXbXXXbXbXbXXbXXXXXXbXXXXXbXXXXXXXXXbXXbXXbXXXXXXbXXXbXXXXbXXXXXXbXbXbXbXXXbXXXXXbXXXbXXbXXbXXbXXbXbXXbXXXXXXXXXXXXXXXbXbXbXXXXXXXbXXXbXXXbXXXbXbXXXXXXXXXXXXbXXXXXbXXXbXXbbXXXXbXbXbXXXXXbXbXbXbXbXXXXbXXbXbXbXXXXXXXXXXXXbXXXXXXXXXXXXXXXXXXbXXXXXXbXbXbXbXXbXXbbXbXbXXXbXXXbXXbXXXbXXXbXbXbXXXXbXXcXXbXbXXXXXXXXXXXXbXXXXXXXXXXXbXXbXbXbXbXbXXXbXXXXXXXXbXXbXXXXbXXbXbXXbXXXXXXXXXXXbXXbXXXXbXXbXXXbXbXXbXXXXbXXXXXXXXXXXXXXXXXXbXXXbXXbXXXbXbXbXbXXbXXXbXXXbXbXbXXXXXXbXbXbXXXXXXXXXXXXbXXbXXbXXXXXbXXXbXbXXXXbXXXbXXXbXXXXXXXXXXXbXXXbXXXbXXbXXXbXXbXXXbXXXXXXXXXbXXXbXXbXXXXbXXXbXXXbXXXXXXXbXXbXXbXbXXXbXXXXXXXXXXXXXXXbXbXXXXXXXXXbXXXXbXXXbXXbXXXXXbXXbXXbXXXXXXbXXXXbXXXbXbXXXbXbXXbXXXXbXXXbXXXbXXXXbXXbXXXXXXXXXXXbXXbXXXXbXXXbXbXbXXXbXXXXbXXbXXXXXXbXXXXXXXXbXXXXbXXXXbXXXXXbXXXbXXbXbXXXXXbXXXXbXXXbXbXXbXXXbXXXbXXXbXXbXXXbXXXXbXXbXXXXXXXXXXXbXXbXXXXbXXXbXXbXbXXXXXXXXXXXbXXbXXbXXbXbXXXXXXXXXXXXXXbXXbXXXXXbXXbXbXbXXbXXbXbXXXbXXXXXXXXXXXbXXXXXbXXXXXbXXbXbXbXbbXbXbXbXXbXXbXXbXXXXbXXXXXXbXbXbXXbXbXbXXXXbXXbXXXXXXXXXXXXXXXXXXXXbXbXXXXXXXXXXXXbXbXXXbXXXbXXXbXXbXXbXbXXXXXbXbbXbXXXbbXXXbXXXbXXXbXXXbXXXbXXbXbXbXXXXXXXXbXXXXXXXXXXXXXXbXXXbXXXXbXbXbXXbXXXbXXXXXXXXXXXXbXXXXXbXbXXXXbXbXXXXbXXbXXXXbXXXXXXbXXbXbXXbXXXXbXXXbXbXbXXXbXXXbXXbXbXbXXXXbXbXbXXbXXXXXXXXbXXbXXbXbXXXbXXbXXXbXXXbXbXbXbXbbXXXXXXbXXXXXXbXbXXXXXbXXXXXXXbXXXXXXXbXbXXbXXXbXXbXbXbXXXbXXXXchhhhhcccccXXXXTTTTTT"TTTTXXXXbXXbXXbXbXXXXbXbXbXbXbXbXbXXXbXXbXXbXbXXbXXXXbXXXbXXXXXXXbXXXXXXXbXXXbXXXbXXbXXXbXXbXXXXXXXbXbXXXXXXbXXcXXbXbXXXXXXXXXXXXbXXXbXXbXXXbXbXXXXXXXXXXXXXbXXXbXXXXbXXbXXXXXXXbXXXXXXXXbXXXXXXbXbXXbXXbXXbXbXbXXbXXXbXXbXXXXXXXXXXXXXbXXXXXbXXXbXXbbXXbXbXXbXXXXXXbXXXXbXbXbXXXbXXXbXXXXXbXXXbXXbXXbXXbXXbXbXXbXXXXXXXXXXXbXXXbXbXXXXXXXXbXbXXbXbXbXbbXbXbXbXXXXXXXXbXbXbXbXXXXXXbXXXXbXbXXbXbXbXbXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXbXbXXXbXXXXbXbXXbXXXbbXXbXXbXbXXXbXXbXXXXbXXXbXXXXXXXbXbXbXXXbXXXXXXXbXbXbXbXXXbXXXXXXbXbXXXXXXXXXXbXbXbXbXbXbXXXbXXXXXXXbXXXXXXbXbXXbXXbXbXXXXXbXXXbXbXXXbXbXbXbXbXbXXXXbXXbXXbXXbXXbXXbXXXXbXXXXXXXbXbXXXXbXXbXbXXXXXbXXXXbXbXXbXXXXXXbXbXbXbXXXXXXXXXbXXbXXXXXbXbXXXXXXbXXbXXbXXXXXXXXXXbXXbXbXbXbXXXbXXXXXXXXXXXXbXXbXXXXXXbXXXXbXbXXbXXXbXXbXbXXbXXbXXXXXXXbXXbXXXXXXbXXbXXXbXXXXXXXXXXXXXXbXXXXXXXbXXXbXXbXXbXXXXXbXXbXbXXXXXbXbXXbXXbXbXXbXbXXbXXbXXXXbXXXXXXbXXXbXXXbXXXXXXXXbXXXXXbXbXbbXbXXXXXXbXbXbXXXbXXXXXXXXbXbXXXXXXXXXXbXXXXXXbXXXXXXbXXbXbXXXXXXXXbXXXbXXXXXbXXbXbXbXbXXbXbXXXXXXXXXbXbXXXbXXXXXXXXXbXbXXXXXXbXXXXXbXXXbXbXbXbXXXbXXXXXXXbXXbXbXXXXbXXXXXXXXXXXXbXXXXXbXXbXXbXXXXXbXXXXXXXXXXbXbXXbXXXbXXXXbXXXbXXXbXXXXXXXbXXbXXbXXXXXXbXbXXXbXbXXbXXXbXXbXbXXXXXbXXbXXXXbXXXXbXXXbXXbXXXXXXXbXXXXXbXXbXXXXXXXXXXbXXXXXXXXXbXbXbXXbXXXXXXbXXXXbXXXbXXXXXXXbXbXXXbXXXXXXbXbXXXXXXXbXXXXXbXXbXbXXbXXXXXXXXbXXXbXXbXbXXbXXbXXXXXXbXbXbXXXXXbXXXbXXXbXXbXXXXXbXbXXbXbXXXXXbXXXXbXbXXbXbXXXbXXXbXXXXXbXXXXXbXXXXXXbXbXXbXXbXXXXbXXXXXbXXXXXXXXbXXXbXXbXXbXXbXbXXbXXXXbXbXXXbXbXXbXXXXXXXXXXXXXXXXXXXXXXXbXXXXXXbXbXXXXXXXXbXbXXbXXXXXXXXbXXbXbXXXXbXbXXbXXbXXXbXXXbXXbXbXXXXXXbXXXXXXXXXXXbXXXbXbXXbXXbXbXXXbXXXXXXXbXXbXXXbXXbXXbXXbXXXXbXbXXXXXXXbXXXbXXbXbXXXbXXbXXXXXXbXXbXXXXXbXXXXXXbXXXXXXXXXbXXXXXXXXXbXXXXXXXbXXXXXbXXXXXbXXXXXXXbXbXXbXbXXXXXXXXbXXbXbXbXXXbXXXbXXbXXXXXXXbXXbXXbXXbXXbXbXXchhhhhhhcccXbXXXXTTTTT"XbXXbXXXXbXXXXXbXXXbXXbXXXXXbXXbXXXXXXXXXXbXXXbXXXXXXXXXXXbXXXbXXbXbXXbXXXXbXbXXbXbXXXbXXXbXbXXXXXXbXXbXXXXXXbXXXXbXbXXbXXbXXbXbXXbXXbbXXXbXbXXbXXbXXbXXXXXXXXXbXXXXXXXbbXXXXXXXbXXbXXXXbXXbXXXbXXXXXXXXbXXbXXbXbXXbXXXXbXbXXbXXbXXbXXbXXXXbXXXXXXXXbXXbXXbXXbXXXXbXbXXXXXbXXXXXXbXbXbXbXbXbXXXbXXXXXXXXXXXXXXbXXXXXXXXXXXXXXXXXXXbXXXXXXXXXXXXXXXXXXXXXXXXXXXbXXXXXXXXXXXbXXbXXXXbXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXbXXbXXXbXXXXXXXXXXbXXbXbXXXXbXXXbXbXXXXXXXXXXbXXbXXXXbbXXXXXXbXXbXbXXXXXXXXXXXbXXXXbXXXXbXXXXXXbXXbbVXXbXbbXXbXbXXXXbXXXbXXXbXXXXXbXXbXXXbXbXXXXXXXXXbXXXbXXXbXXXXbXXXbXXXXbXXXbXXXbXXXXXXbXXbXXXXbXXXbXXXXXXXbXXXbXXXbXbXbXXXXXXXbXXXXbXXbXXXbXbXbXXXXXXXXbXXbXXbXbXXbXXXXbXXXbXXbXXbbXXXXXXXXbXXbXXbXXXbXbXXXbXXXbXXXXXbXXbXbXXXXXXXbXXbXXXbXbXXXXXbXXXbXXXXXXXXXXXXXXXbXbXXbXXXbXXbXXXXbXXXbXXXbXXbbXbXXbXXXXXbXbXXbXXbXXXXXbXXXbXXbXXXXXXXXXbXXXbXXXXbXXXbXXXbXXXXbXXXXXXXbXbXXbXXbXbXXbXXbXXXbXXXbXbXbXbXXXXbXbXXXXXXXXXXbXXXbXXbXXXXXbXbXXbXbXbXbXXXbXXXbXbXXbXXXXXXbXXbXbXXXXbXXXXbXXXbXXXbXXXbXXXXbXXbbXXXbXXXbXXXXXbXXbXXbXXXbXXXbXXXXbXXXXXXXXXXXXXXbXXbXbXXXbXXXbXXbXXXXXXXbXXXbXXXbXXXXbXXXXbXbXXXbXXXXbXbXbXbXbXXXbXXbXXXXbXXbXXXbXXbXXXbXbXXbXXbXXXXbXXbXXXXbXXXXXXXbXXXbXXXXbXXbXXXXXXXbXXXXbXXXXXXXXXXXbXbbXXXXbXXbXXbXXbXbXXbXbXXXbXbXbXXbXXXXXbXXbXXbXXXXbXXbXXbXXXbXbXXXXXbXbXXbXXbXXXXbXbXbXXXbXXXbXXXbXXXbXXXbXXbXXXXXXXXXbXXXXXbXXXbbXXbXbXXXXXbXXXXbXXbXbXXbXXXbXXbXXXXbXXXXXXbXXXXXXXXXXbXXbXbXXbXXbXbXXXXXbXXXXXbXbXXXXXXbXXXXbXbXbXbXXXXbXXbXbXXXXXXXbXXXXXbXXXXbXXbXXXXXXbXXXXXXXXbXbXXbXXbXXbXbXXbXXXXXXXbXXXbXXXXbXXXbXXXbXXbXXXXbXXXbXXXXXXbXbXXXXbXXXXXXbXXXbXXXbXXXXXbXbXXXXbXXXXbXbXXXbXXXXbXXXbXXbXXXXXXbXXbXXXXXXXbXXXXXXXXXbXXbXXXXXXbbXXbXXXbXbXXXXbXbXXbXXXXbXXXXbXbXbXXbXbXXXXXXXbXbXbXXbXXbXXbXXXXXbXXbXXXXXXXbXXbXbXXbXXbXXXbXXXbXXXXbXXbXbXXXXXXXXXXbXXXXbXXbXXXbXbXXbXXXbXXbXXbXXXXXXchhhcccccXcXXXXTTTTTTTTTXXXbXXbXbXbXXbXXXXbXXXXbXbbXXbXXXXbXXbXXXXXXbXXXXXbXXXXbXXbXbXXXXXXbXXXXXXbXXXbXXbXbXXXXXbXXXXbXXXXXXXbXXbXXXbXbXXXXXbXXXXbXXXXbXXXXXXXXbXXXXXXXXbXXbXXXbXbXbXXbXXbXXbXXXXbXXXbXXXXXXbXXXXbXXbXXXXbXXbXXXbXXXXXXXXXXXXbXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXbXXXXXXXXXXXXbXXXXXXXXXXXbXXXXXbXXXXXXXXXbXXXXXXXXXXbXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXbXXXXXXXXXXXXXXXXXXXXbXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXbXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXbXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXbXXbXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXbXXXXXXXXXXXXXXXXXXXXXXXXXXXbXXXXXXXbXXXXXXXXXXXXXXXXXXXbXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXbXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXbXXXXXXXXXXXXXXXXXXXXbXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXbXXXXXXXXXXXXXXXXXXXXXXXXXXbXXXXXXXXXXXXXXXXXXbXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXbXXXXXXXbXXXXXXXXXXXXXXXXXXXXXXXXbXXXXXXXXXXXXXXXXXXXXXXXXXXXbXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXbXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXbXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXbXXXXXXXXXXXXXXXXXXXXXXXXXXXbXXXXXXXXXbXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXbXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXbXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXbXXXXXXXXXXXXXXXXXXbXXXXXXXXXXXXXXXXXbXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXbXXXXXXXXXXXXXXXXXXXXXXXXXXXbXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXbXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXbXXXXXXXXXXXXXXXXXXXXbXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXhhhccccccXXXXVTTTT::TT"TXXXXXXXXXXXXXXXXXXXXbXXXXXXXXXXXXXXXXXXXbXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXbXXXXXXXXXXXXbXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXVXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXVXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXchhhhchcccXXXXXXTTTT"TTTXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXTXXXXXXXXXXXXXXXTXXXTXXXTXXXXXXXXXXXXXXXTXXXXXXXXXXXXXXXXXXXXXVXTXXXXXXXXXXTXXXXXXXXXXXXXXTXXXXXXXXXXXXXXXXXXXXXXXXXXTXXXXXXXXXXXXXXXXXXXXXTXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXTXXXXXXXXXXXXXXXXXXXXXXXXXXXXTXXTXXXXXXTXXXXXXXXXTXXXXXXXXXXXXXXXXXXXXXXXXXTXTXXXXXXXTXXXXXXXXXXXXXXXXXXXXXXXXXXXXTXXXXXXXXXXXXXXXXXXXXXXXXXXXXXTXXXXXXXXXXXXXXXTXXXXXXXXXTXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXTXXXXXXXXTXXXXXXXXXXXXXXXXXXXXXTXXXXXXXTXXXXXXXXXXXXXXXXXXXXXXXXXXXXXTXXXXXTXXXXXXXXXTXXXXXTXXXXXXXXXXXXXXXXXXXXXXXXXXXXTXXXXXXXXXXXXTXXXXXXTXXXXXXXXXTXXXXXXXXXXXXTXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXTXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXTXXXXXXXXXXXXXXXXTXXXXXXXXTXXXXXXXXXXXXXXXXXXXXTXXTXXXXXXXXXXXTXXXTXTXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXTXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXTXXTXXXXXXXXXXXXXTXXXWXTXXXXXXXXXXTXXXXXXXXTXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXTXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXTXTXXXXXXXXXXXXXXXXXXXXXXXXXXXXTXVXXXTXXTXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXTXXXXXXXXXXXXXXXXXXXXXXXXXXTXXXTXXXXXXXTXXXXXXXXXXXXXTXXXXXXXXXXXXXXXXXXXXXTXXXVXXXXXXXXXXXXXTXXXXXXXTXXXTXXXXXXXXXXXXXXXXXXXXXXXXXXXTXXXXXXXXXXXTXXXXXXXXXXXXXXXXXXXXXXXXTXXXXXXXXXTXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXTXXXXXTXXTXXXXXXXXXTXXXXXXXXXXXXXXXXXXXXXXTXXXXXXXXXXXTXXXXXXXXTXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXWXTXXXXXXXXXXXXXXXXXTchhhhhhhhccccXXXXTXTTTMM"TT"WTXXXXXXXXXXXXXXXXXXXTXXXXXXXWXTXXXXXXXXTXXXXXXXXXXXXTXXVXTXVXTXXXTXXTXXXTXXTXXXTXXTXTXXXXXTXXXXXXXTXXXXXXTXXXTXTXTXXTXXTXXTXTXTXXTXXTXVXXTXWXTXTXTXTXXTXXXTXTXTXTXTXTXXXTXXTXXTXVXTXXTXXTXXTXXTXXTXTXXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXXWXTXXTXTXXTXXUXTXXTXTXWXTXWXTXXTXVXTXXWXTXWXTXWXTXWXTXXTXTXTXTXTXXTXXTXVXXXXXTXTXXTXXXXTXXXTXXTXXTXTXTXTXTXXTXXTXXTXTXTXXTXWXTXXWXTXWXTXXTXWXTXTXTXTXTXTXTXTXTXWXTXWXTXXTXXWXTXWXTXWXTXTXTXWXXTXXXXWXTXXTXXTXTXTXTXTXTXTXTXXXXTXXTXTXTXTXTXXXXXXXXXXXXTXTXTXTXTXTXXXXXTXXTXXTXTXXTXTXTXXTXXXXXTXXTXTXTXXXTXTXTXTXTXWXXXXTXTXTXTXXTXTXXTXWXTXXTXXXXXTXTXTXTXTXTXUXTXTXTXXXTXTXTXXTXTXTXTXTXTXTXTXUXTXTXXXTXTXTXTXTXXTXTXTXTXTXXTXTXXXXXXXTXXTXXXTXTXXTXXXXTXTXTXTXTXWXTXXTXTXTXXTXXXXXTXTXTXXXTXTXXTXTXTXTXTXTXTXTXTXTXXXXXTXTXTXTXTXTXTXTXVXTXTXTXTXTXXXTXTXTXXTXVXTXXXXTXXTXTXXXXTXTXTXTXTXTXTXTXTXTXVXTXTXWXTXXXVXTXTXVXXXTXTXTXTXTXXTXTXXTXXXXXTXTXXXXXTXTXXTXTXXTXTXTXTXTXTXTXUXXXXXTXTXXXTXTXTXTXXXTXTXXXTXTXXTXTXTXTXTXTXXTXTXXTXXXXXTXXTXTXTXXXXXTXTXXXXTXTXTXXXXXTXTXTXTXTXXXXTXTXTXTXXTXUXTXTXTXTXTXTXWXTXTXTXTXTXTXTXUXTXTXTXTXVXTXTXXXXTXTXTXTXTXVXTXTXWXTXTXTXTXTXTXTXTXXXXXTXTXTXTXTXTXTXXXXTXTXTXXXXTXTXXTXTXUXXTXTXTXXXXXXXTXTXTXWXXXXXXXXXXXTXTXTXTXTXTXTXTXTXTXTXVXTXTXTXTXXTXXTXWXTXXTXXTXXTXTXTXTXTXXXTXTXTXVXTXTXTXTXTXTXTXTXTXXTXTXXTXXTXTXTXWXXXXXXXTXTXTXTXTXTXXXTXXXXXTXTXUXTXXXXTXTXTXXXXTXTXTXTXTXTXTXXTXXTXTXTXTXXTXTXTXTXTXTXTXTXTXTXTXTXXXXXTXTXTXXTXTXTXTXTXTXTXTXWXTXTXXXXXTXTXXTXTXXTXTXVXTXTXTXTXTXXXXXTXXXXXXXTXTXTXTXTXTXTXTXTXXTXVXTXXTXUXTXXXXTXTXVXTXTXTXWXXTXTXTXTXXXXXTXXXTXTXXXXXTXTXTXTXTXTXXXTXXTXTXXTXTXTXTXTXTXXXTXXTXTXTXXTXTXTXXXTXXTXXXXXXXXTXWXTXWXXTXXTXXTXVXTXTXTXXXXTXTXTXTXXXXXTXTXTXXTXTXTXTXTXTXTXVXXXTXTXTXTXXXTXTXTXTXVXTXTXTXTXTXTXTXXTXXTXTXXXTXXXXXXXXTXVXTXTXXXTXTXXTXTXTXTXXTXXTXXXXXTXXTXTXXTXXXTXTXTXXXXTXTXUXTXTXTXTXTXTXTXTXVXTXTXTXXXXXTXTXTXTXTXTXTXXXXhhhhhcccXcXXXXXTTTT"T"TTTTMXXXXTXTXTXTXTXTXXTXTXXXXTXTXTXXXXXTXTTXTXXVXTXTXTXTXTXXXXTXXXXXXVXXXXXXXTXXXXXXTXXXXXXXVTXTXXXTXTXTXXXTXTXXXXTXXXXXXXXXXXXXXXXXXXXXXXXXXTXXXXTXXXXXXXXXXXTXXXXXXXXXXXXXXTXXXXXVXXXXXXXXXVXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXTXXXXXXXXXXXXXXXXXXXXXXXXXTXXXXXXXXXXTXXXXTXXXTXXXTXXXXXXXXXXXXXXXXXXXXTXTXXXXXXXXXXTXXXTXXXXXXXXXXXXXXXXXXXXXXXWXXXXXXXXXXTXXXXTXXXXXXXXXXTXXXXXXXXXXXXTXXTXXXTXTXXXTXXTXXTXTXXTXXTXTXTXXXTTXTXTXTXTXXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTWTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTWTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTTTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTWTXTXTXTXTXTXTXTXTXTTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTXTTXTXTTTTXTXTTXTTXTXTXTTXTXTTXTXTTXTTXTTXTTXTXTXTTXTTXTTXTXTTXTXTXTTXTTXTXTXTXTTXTTXTTXTXTTXTXTXTTXTXTTXTTXTXTTTXTTXTTXXchhccccXbXXXXTT"T"TTT""XTTXTXTXTXTXTXTTTTTXTTXTXTTTTXTXTTXTTXTTXTXTTXTTXTTXTTXTXTTXTTXTTXTXTTXTXTTXTTXTTVTXTXTTXTTXTTTXTXTTXTXTXTTXTXTTXTTVTXTTXTXTTXTTXTXTTXTXXTTXTXTTTTXTXTTXTXTTXTTXTTXTTTTTXTXTTXTTXTTXTTXTXTTXTTXTTXTXTTXTXTTXTTXTTXTXTXTTTXTTXTTXTXTTXTXTXTTXTXTTXTTXTXTTTXTTXTTXTXTTXTXTXTTXTXTTTXTXTTXTTXTTXTTXTTXTTTTTTTTTTTTTXTTTTTTXTTTTTTTXTTTTXTTTTTTTTTTTTTTTXTTTTTTTTTTTTTTXTTXTTTTTTTTTTTTTTTTTTTTTXTTXTTXTTTXTXTTTXTTXTTXTXTTXTTXTXTXTTTXTTXTTTXTXTTXTXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXWXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXUXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXhhccccccbbXTXTXTTTM"T"XXXXXXXXXXXXXXXXXXXXXXXXXXX^XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXVXXXXXXXWXXXXTXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXVXXXXXXXXXXXXXXXXXXXXXXXXXXXVXXXXXXXXXXXXXXXXXXXXXXXVXXXXXXXXXXXTXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXbXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXhhhhchhdhhhhhhchhdhhhdhhhhhhhfhhhdhhhdhdhhhhcfhhhdhchdhhhfhdhhhhchhhchhhchhdhhhdhdhhhdhhhhhhchhchhgfhhhdhdhhhfhhhchhgfhhhdhhhhhdhhhhdhhhfhhhfhhhchhhhdhhdhhhhhdhhhfhhhchhhhchhhhfhchdhhhfhhhfhhhhhhhfhhhfhhhdhhhfhhhfhhhdhfhgfhhdhhhhhfhhhfhhhhhhdhhhchhchdhhhfhhhhhchhhchhhhhchhdhhhdhhhhhhhhhhhfhhhdhhhhhhcdhhhhchchhdhhhhhdhhchhhchhhchhdhhhdhhhhhdhhhfhhchhchhchhdhhhdhhhfhhhchhhdhhhdhhhhhhhhhdhhdhdhhhdhhhchhhdhhhhhdhhhfhhhdhhhchhfhhdhhhfhchdhhhhhfhhhhhhhhhfhhhdhdhhhfhhhdhhhhhfhhhchhgfhhhhhfhhhfhhhhhhchhhchhchdhhhchhhhhchhchhdhhhgfhhhdhhhhhhhdhhhfhhhfhhhdhhhhcfhhhhchchhdhhhfhhhhgfhhchhhchhhhfhhhhhdhhhfhhhhchhchhhdhhhdhhhfhhhdhhdhgfhhhfhhhhhhhhhdhhfhhhfhdhhhchhhchhhhhdhhhdhhhfhhhchhfhhdhhhhchchhfhhhdhdhhhfhhhdhdhhhhhhhfhdhhhhhhhfhhhdhhchhhhhhdhhhfhhhhhhchhhchhchdhhhdhhhhhchhchhhhhhchhhhdhhhhhhhhhhhhhhhfhhhdhhhhcdhhhhchchhdhdhdhhhhchhhchhhchhdhhhdhhhdhhhhhdhhdhhdhhchhdhhhfhhhfhhhchhhdhhhfhhhhhhhhhdhhhhdhhhhhchhdhhchhhhhdhfhdhhhfhhhchhhhchhhhhchchhdhhhfhhhfhhhdhhhfhhhfhhhdhhhfhhhfhhhdhhdhhdhfhhhhhfhhhhhhhhchhhchhchdhhhchhhhhchhchhhhhhchhfhhhdhfhhhdhhhdhhhdhhhdhhhhcdhhhhchchhdhhhdhhhchchhchhhchhfhhhfhhhdhhhfhhhhchhchhhdhhhdhhhdhgfhhchhchhhchchhhchdhhchgfhhhchhchchhhcchhdehchgfhhchhchhdhchhhchdhhchgfhhhhchgfhhhhchhchdhdhchhhhchchhchhchhhfhchhhhdhhhchhdhhfhhhdhdehchchgfhhhdhchhhdhdhhhfhhhchhhhcchhhfhchchhhdhhchhchfhhhchhfhhdhchchgfhchdhhdhhhchhhhdhdhhhhhhhhhhhcccXbbbXXTTTT"TTTcdhhgfhhhfhchchhhhhhhchhdghggfhchgfhhfhhchchchfhchhfhchcdhhchhchchdghchchchghchhhdhhchchdhhhchhchchdhchhhchchhfhchcchdhhgdghchhchddhhdhhhchchdhhhchdhfhhchhchhhchchgfhhhchchchdgcdhchchcdhhchhhchchghcgdhchgfhchchhchchcchchchhhchddhchchchchdhhchcchdhhchdgdhdhchdhhddhhchdhchhhchdhhchhchhhcchchchchchhfhchhhhchhhhchchhhhhhchchhchchhhhfhhcfhchhhchccdhfhchhhhcdhdhchdhdhchchchchfhhhhcfhchhchchchdhchchfhchdhchchhhgfhchcchhcfhfhdhfhchchhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhcccXbbXXXTTTTTTThhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhcccccbbXXXXTXTTTTTTTThhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchcccbXXXXXTTTTTTTTThhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhcccbcXXXTVTTTTTTTTT::hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhcccccbXXXXXXTTTTTT:hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchccccbbXTXXTTTTT"hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhùhhhhhhhhhhhhhùhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhccccXXbXXXTTTTT:T:TTM"hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhccccXXXXXXXTT:TM"ThhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhùhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhùhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhccccXXbXXTTTTTTT""TTT"hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchcccXXXXVTTTTTTTThhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh¹hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhùhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhùhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhcccccccXXXTXTT:TTTTThhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchcccbbXXXXTTTTTT"TThhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhccccXXXTXXXT"TTTTThhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchccccXcXXTXTTTTTThhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhùhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh¹hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhcccdcXXXXTTTVTTTTTTTTThhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhcccXccXXXTTTT:ThhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhùhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhccccbbXXXXXXTTTTThhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhccXcXXXXTTTTTTTTTTThhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchcccXXXXTXTTTT"ThhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhfhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchcccccXXXXXXTTTTTTTThhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhcccccXXbXXTTT"TTTTTTThhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhfhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhccccXbXXXXTTTTT:ThhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhfhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhcccccXXXXXXXTTTTTThhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh¹hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhcccbXXXVTTTTTTTThhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhghhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchccXXbXXTTTTTTTThhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhfhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhghhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhfhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhccccccXXbXTXUTTTTT:TTThhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhfhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhcccccXXXXXTTTTTTThhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhcbccXXXXXXXTTTTTTTTThhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhccccccXXXTXTTTT:TT:ThhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhghhhhhhhghhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhcccXXXXXTTTT:TchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhghhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhccccccXbXXXXTTTTTTTTTTThhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhghhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhghhhhhhhhhhhchhhhhhedhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhcccccbXXXXTTTTTTTThhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhghhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhhhhhhhhhhchhhhhhhhhhhhhhhhhhghhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhhhhhghhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhhhdhhhhhhhchhhhhchhdhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhccccXXXXTUXT"TTT"TTchhhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhghhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhghhhhhhhhhhhghhhhhdhhhhhhhhhhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhhhhhhhhhhhhchhhhhhhhchhhhchhhhhhhhhhhhhhhhdhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhghhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchcccXbbXXXXTTTTTTTTT:hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhghhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhghhhhhhhhhhhhhhchhhhhhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhdhhhhhhhhhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhghhhhhhhhchhhhhhdghhhhhhhhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhfhhhhhhhhhhhhhhhhhhhhhhhhhcchcccXbXXTTTTT0"TTTchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhdhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhhhhhhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhdhhchhhhhhhhfhhhhhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhchhhhhhhhhhhghhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhcccccXXXXXTTTTTTTchhhhhhhhhhhhhhhhhhhhhhfhhhhhhhchhhhhhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhhhhhhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhhhhchhhhhhhhhhhhhhhhghhhhhhhhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhdhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhhhdhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhghhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhhhhhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhchhhhhhhhhhhhhhhhhchhhhhhchhhhhhhhhhhhhhhhhhhhhhhhccccXXcXXXTTTTTTTThhchhhhhhhhhhhhhhhhhhhhghhhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhghhhhhhhhhhhhchhhhhhhhhhhhchchhhhhhhhhhhhhhhchhhhhhhhhhhhhhchhhhhhhhhhhhhchhhhhhhhhhhhchhhhhhhchhhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhghdhhhhhhhhhhgdhchhhhhhhhhhhhhhhchhhhhhchhhhhhhhhhhhhhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhchhhhhchhchhhhhhhhhhhhhhhhhhhhhhhchhhhhhhghhhhhhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhghhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhhhhhhhhhhhhhhchhhhhhhhhhhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhchhhhhhhhhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhcccccbXXTTTXTTTTTThhhhhhhhhhhhchhhhhhhhhhhhhhhhhhchhhhhhhhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhchhhhhhhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhchhhhhhhhhhhhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhghhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhdhhhhchhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhchhhhhhhhhhhhhhhhhhhhchhhhhhhhghhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhghhhhhhhchhhhhhhhhhhhhhhhhchhhhhhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhghhhhhhhhhhchhccXbXbbXXTTTTTTTTThhhhhhhhhhhhhhhhhhhhchhhhhhhhhhhhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhchhhhhhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhghhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhchhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhhhchhhhchhhhchhhhhhhhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchghhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhchhhhhhhhhhchhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhghhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhhchhhhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhhhhhhchhhhhhhchhhhhhhhhhhhhhcccccbXXVXTTTTTT:TTchhhhhhhhhhhhhhhhhhhhhhhhghhhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhehhhhhhhhhhhhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhchhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhhhhhhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhchhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhhhhhhhhhhhhhchhchhhhhhhhhhhhhhhhhhchhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhchhhhhhhhchhhhchhhhhhhhhhhhhhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhdgcccXXXTXXXTTTTT:TTTTThhhhhhhhhhhhhhhhhhhhhchhdhhhhhhhhhhhchhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhdhhhhhhhhhhhhhhhhfhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhhchhhhhchhchdhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhchhdhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhdhhhchhhhhhhhhhdhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhchhhhchhhhchhhhhhhhhhhhhhhehhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhfghhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhchhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhchhhhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhchhhhchhhhhhhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhhchhchhhhhhhhhhhhhhhhhhhhhhchhhhchhhhhhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhghhhhhhhhhchhhhhhhhhhhhhchchcccbbXXXTTTT:TTTchhhhhhhhhhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhdhhhhchhhhhhhhhchhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhhhhdhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhhhhchhehhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhghhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhhhhhhhhhhhhhhhchhhhhhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhhchhchhhhhhhhhhchhhhhhhhhhhhhchhhhhhhhhhhhhhhhhchhhhhhhhhchhhhchhhhhchhhhhhhhhhhhhhhhhhhhhhhchchhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhhchhchhhhhhhhhhchhhhhhhhhhhhhchhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhhhchhhhhhhhhhhhhhchhhhhhhhhhhhhhhhchhhhhhhhhhchhhhhhhhchhhhhhhhhhhhhchhhhhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhhhhhhhhhhchhhhhhhhhhhchhhhhhhhhchhhhhhhhhhhhchhhhhhhhhhhhhchhhchhhhhhhhhhhhhhhhhhhhhchhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhghchcXbbXXTTUTTTTchhhhhhhhhhhhhhhchhhhhhhhhhhhhhhhchhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhhhhhhhchhhhhhhhhhhchhhhhhhhhchhhhhhhhhhhhchhhhhhhhhhhhhchhhchhhhhhhhhhhhhhhhhhhhhchhhhhhhhhhhhhhhhhhhhchhhhhhhhhhhhhhhdhhdhhhhhhhhhhhhhchhhhhhhhhhchhhhhhhhhchhhhhhhhhhhhchhhhhhhhhhhhhchhhchhhhhhhhhhhhhhhhhhhhhchhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhhhhhhhhhdghhhhhhhhhhchhhhhhhhdhhchhhhhhhhhhchhhhhhhhhhhhhchhhchhhhhhhhhhhhhhhhhhhhhchchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhchhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhchhhhhhhhhhhhhhhhhhhhhchhhhhhhhhchhchhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhchhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhhhchhchhhhhhhhhhhhhhhhhhchhhhhhhhchhhhhhhhcccbbXXXXXTXTTT"T:hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhghhhhhhhhhhhhhhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhghhhhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhhchhhhhhhchhhhhhhhhhhhhhhhhhhhghhdhhhhdhhhhhhhhhhhhhghhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhchchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhhhhhhhhchhhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhhhhchhchhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhchhhhhhhhhhhchhhhhhhchhhhhhchhhchhhhchhhhhhhhhhhhhhhhhhhhhhhchhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhchhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhchhhhhhhhhhccccbbXXXTTTT"TTT"TM"hhhhhhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhchhhhhhhhhhhchhhhhhhhhhhhhhchhhhhhhhhhhhhhchhhhhhhhhhhhhhhhhdhhhhhhchhhhhhhhhhhhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhchhhhhhhhhhhchhhhhhhchhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhchhhhhhhhhhhhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhchhhhhhhhhhhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhchhhhhhhhhhhhhchhhhhhhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhchhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhhhhhhhhhchhchhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhhchhhhhhchhhhhhhhhhhhhchhhhhhhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhchhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhhhchhhhhhchhhhhhhhhhhhhhhhhhhhhhcccbccXXVXXTTTTTT"TThhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhchhhhhhchhhhhhhhhhhhhghhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhchhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhchhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhhhhdhhhhghhghhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhhhhchhhhchhhhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhhchhhhhhhhchhchhhhchhhhhhhhhhhchhhhhhhhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhhhhhhhhhhhhhhchhhhhhhhhchhchhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhchhhhhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhhhchhhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhhhhchhhhhhhhhhhhchhhhhhhhhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhhhchchcbXXXXTXXTTTTMTThhhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhchhhhhhhhhhchhhhhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhdhhhhhhhhhhchhhhhhhhhhhhchhhhhhhhhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhhhchhhhhhhhhhchhhhhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhchhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhchhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhchhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhdhhhhhchcccXXXXXTTTTT""TchhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhhhhhhhhhhchhhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhhhchhhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhchhhhhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhchhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhhhhchhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhchhchhhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhhhhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhhhhhhchhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhhhchhhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhchhhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchccbXccXXXTTTTTTTTTTT"TTT:"ThhhhchhhhhhhhhhchhchhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhhhhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhchhhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhchhhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhchhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhchhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhchhchhhhhhhhhhhhhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhhhhhhhhchhhhhhhhhhhhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhhchhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhhhhhhhhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhhhchhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhhhhhhhchhhhhhhhhhhhhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhhhhhhhchhhhhhhhhhhhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhhhhhhhchhhhhhhhhhhhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhhhhhhhchhhhhhhhhhhhhhhhhchccccXXXXXTVTTT"ThhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhhdehhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhhhhhhhhchhhchhhhhhhhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhhhhhhhhchhhchhhhhhhhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhhhhhhhhchhhhhhhhhhhhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhchhhhchhhhhhhhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhchhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhhhhhhhhhhhhhhhchhhhhchhhhhhhhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhchhhchhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhhhhhhhhhhhhhhchhhhhchhhhhhhhhhhhhhhhchhhhchhhhhhhhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhchhhhhhhhhhhhhhhhhhhhhhchhhhhhhhhhhhhhchhhhhhhchhhhhhhhhhhhhhhhhhhchhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhchhhhhhhhhchhhhhhhhhhhhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhhhhhhhhchhhhhhhhhhhhhhhchhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhhhhhhhhhcccccbXXXXTTXTTTTThhhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhdhhhchhhhhhhhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhhhhhhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhhhhhhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhhhhhhhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhhhhhhchchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhchhhhhhhhhhhhchhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhhhhhhchhhhhhhhhhhhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhchhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhhhhhhhhhhhhhchhhhhhhhhhhchhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhhhhhhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhhhhhhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhhhhhhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhchhhhhhhhhhhhhhhhhhhcccbXcXXXTTXTTTT0TchhhhhhchhhhhhhhhhhhhchhhhhhhhhhhhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhhhhhhhhhhhhhhchhhhhhhhhhhhhchhhhhhhhhhhhhhhhhhhchhhhhhhhhhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhhhhhhhhhhhhhhchhhhhhhhhhhhhchhhhhhhhhhhhhhhhhhhchhhhhhhhhhhhhhhhhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhchhhhhhhhhhhhhhhhhhhhchhhhhhhhhhhhhchhhhhhhchhhhhhhhhhhhhhhhhhCorsixTH-0.63/CorsixTH/Bitmap/mainmenu1080.pal000066400000000000000000000014001347163623700207130ustar00rootroot00000000000000                                               ! $ ! " '#$' *( #&'!$"%(),*, "%#$) "(#)%  + - *!.$.!" &""!&$'!*"-%.")#+$*%-#/$0"0$2%4#/&1&6&1'3'7(2(7)1)4)8+:)9,:&",,.!%#),2 #, !&0)5!!! #'!$'%%% #("%) &-$'*$'+"(.&(+%)-***(*-*,.--+--- '0"*1!*4!+3",4$*1$+4&,2%-5 +7!,8$-8(+/*-2).4,.1+/3(/8'/6'/9*05.02-15.37*09-3:,3;.48,4;11/111025246566/37159/5<56837;37;68969<99::;<;;^AdBkCpHlWnQr\tXnCvJ}L|P~Pn`uf{g|p~qw`/Gk~FZJ[Pa}iEM[RWlkvuwgkhurzwLNċV̑ZҖ]`ƙfٛaśtПrcɡlݠeȦyԤ}fnrq<<"U8fAADDbbKK^p$$r˜զŸȩԬΰӳȩѮֶ̲஀᳇ᶒɵԼǼпῠ¬ºǶмĩͷϱѼѲhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhdcbXUTTTTdhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhghhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhdcbXUTTT"""TghhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhdcbXXU""TghhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhdcbXXT""TghhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhghhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhgcbXX:"TdhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhgcbXXT"TdhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhdcbXUTT"TghhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhdcbXUTTTdhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhdcbXXTTTghhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhdcbXXTT""TghhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhdcbXXT""""""ghhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhdcbXXT"ThhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhgdbXXTTThhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhdcbXXT"ThhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhdcbXXT"""ThhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhgcbXXU""ThhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhgcbbXTTThhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhdcbXX:T"ThhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhdcbXXTT""ThhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhdcbXXUT"""ThhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhccbXXTTThhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhdcbXXTT"ThhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhdcbXUTTTghhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhdccddcccddcdccccccdcdcdccccdccddcdccdcccccccccdddcccccdcdcccdcccccdddccccccdcccddccddcdcccccddcccccccccccdcdcdcccdcccdddccddcdcccccccccdccccccccdcccccddccccccccdccdcccccccdccdccccddddcdccccddcccdcccdccccdcccddcccccccddccddddccccccddccccddccccccccccccdccccccccccccdccccccccccccccccdcdcccccccccccdcccccccddccccccccccdccccccccccccccccddcccccccccccccccdcccccccccccddcccccccccccccccccccccccdccddcccccccddcccccdccccccccccccccghdcbXUT""bcccccccccccccccccccdccccccccccccccdccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXVXXVXXXXXXXXVXXXXXXXXXXXXXXXXXXVXXXXXXXXXXXXXXXXXXXXXXXXXXVXVXXWXXUXXXXXXXXXXXXXXXXXXXXXVXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXVXXXXWXXXXXVXVXXXXXVXXXXXXXXXVXXVXXXXXXXXVXXVXXVXXXXVXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXVXXXVXXXXXXXXXXVXXXXXXXXXVXXVXXXXXXXVXXXXXXXXXXXXXXXXXXVXXXXXXXXXXXXXXXXXXXVXVXXVXXVXXXXVXXVXVXXVXXWXXUXXXVXXXXXXXXXXXXXXXVVXXXXXXVXXXUUVUXXXXUXXXXXUXXXchgcbXXTT"WXXVXXUUVXXXXXXVUUXXXXXXXXXXXXXXXXXXXXXVXXXUXXXXXXXVXXXXXXXXXXXXXXXXXXXXXUXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXVXXXXXXXXXVXXXXXXXXXUUUUUVUUXUUVVVXUUUUUXXUUUUUUXXUUUUXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXchhgcbXUTT"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXdhdcbXVT"""XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXbXXXXXXXXXXXXXXXXXbXXXXXXbXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXbXXXXXXXXbXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXbXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXbXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXbXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXbXXXXXXXXXXghhgcbXXU"""XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXbXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXbXbXXXXXXXXXXXXXXXXXXXXXXXXXXXXXbXXbXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXbXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXbXXXXXXXXXXXXXbXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXbXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXbXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXbXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXbXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXbghhgcbXXT""XXXXXXXXXXXXXbXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXbXXXbXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXbXXXXXXXXXXXXXXXXXXXXbXXXXXXXXXXXXXXXXXXXXXggghghghhghhhhhhhhhhhhhhhhhhhhhhhhghhhhhhhgggggghhhhhgggghgghhhhghghhhhhhhhhhhhghhhhhhhhghhghhhhhhhghgghhhghhhghhggghhhhhhhghhghhhhhhhhhhhhghghhhhhgghhhhhhhhhgghhhhhhhhggggghghgghhhhhghhhghhhhhhhhhhhhhhhhgghhhhhhgghgghhhhhhhhghhhggghhhhghhhhhhhhhhhhhhhhghghhhhhhhghhhhhgghghhhhhhghhghhgghghhhhhhhhhhhghhhhhghhhghghhhghhhhhhhhhghghhghhhhhhhhhggghghgghhhhhhhhhghhhhhhhhhhhhhhhhgghhhhhhhghhghhhhhhhhggggghhhhghghhhhhhhhhhhhhhgcbXXTT""TdghhghghhhhhhghhhhhhhhhhggghhhhhgggghghhhhghhhhhhhhhhhhhhhhhhhhhhhhhhhghhhhhhhghhhhhhhhhhhhgggggghhhhhhhhhhhhghhhhhghhghhhhhhhgghhhhhhhghghhhhhhgghhhghghhhhghhghhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhdcbXXT""TghhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhUUT:UUUUUU:::TTUUTUUUU:TUUUUTU:T::U::U:U:U:TTU:UTT:U:UUUUU:UTTT:U:U:TT::UUU:T:U:TTU:TTTTT::UU:UTUUUUTT:WhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhcUTTTTTT:UTTTTTTTTTTTTTTTTTT:UTTTTTTTTTTTTTTTTTTTTTTTTTTTTTUTTTTTTTTTTUTTTTT:TTTTTTTUTTTTTTTTTTTTTTTTTTTTTTT:TTTTTTTTTTTTTTTTTTUTTTT:TTTTTTTTTTU:TTTTTTTTTTTTTTTTU:TT::::TUTTTTU:TT:UUTTTTTTTU:TUTTTTU:U::T:UUUU:T:bhdcbXXT"":UU:UT:UU::U:UU:UUUUUU:U:UUUTUUUUUUUU:UUUUUUUU:UUUUUUUU:UU:UUUU:UUUUUUUUUUUUUUU:U:UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU   bhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhg:                              XhhgcbXU:T"      Uhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhc                                        XhhdcbXUTT"    dhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhX                                     XhhdcbXVT"""T    XhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhgM                              XhhdcbXXTT"     Tghhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhb                                XhhgcbXXT"    chhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh:                             XhhgcbXUT"""  Xhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhc                              XhhdcbXXT"     TghhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhW                          XhdcbXX:""       chhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhd                         XhhdcbXXT"  WhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhX                      XhhgcbXVT""MghhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhgM                        XhhgcbXVT""" -bhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhb                  XhdcbXXTTTTTTTTTTTTTUhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhU                 WhhdcbXXTTTTTTTUUTTTXXXXXXXXXXUTTXXXXTXXXTghhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhd                  WhdcbXXTTTXTTTWXXXXXXXXXXXXUXXXXXXXXXbXXXXXXXXXXXXXXXXXXTTXWTTXXXXWXXXXXXXXXT -bhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhW      UhhhgcbXXT"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXUXXXXXXXXXXXXXbXXT Thhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhg       UghhccbXTTXXXXXXXbXXXXXXXXXXXXXXbXXXXXXXXbXXXXXbXXbXXXXXXXXXXXXXXXbXXXXXXXXXXXXXXXTdhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhb-    TghhhccXXTTXXXXXXXbbXXXbbXbXXXbbbXbXXXXXXbbbXbXXbXXXXXXXXXXXXXbXXXXXXbXXXbXXXXXXXXXTXhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh:     ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::bhfdacbXXXYVV@@;@YV::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::0-XXbXXXXbbbbXbbbbbXXbbbbbXXXXXbbbbbbXbbXXXXXXXXXXXXbbbbXbbbbXXXbbbbbXXXXbTTdhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhc    :Y_ɝ[V:XbbbbbbbbbbXbbbbbbXbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbXbbbbbbXbXbbXbbbbbTchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhW "VɖVbbbbbbbXbbXbbbbbXbbbbbbXbbbbbXYbbbbbbbbbbbbbbbbbbbXXbXXbbbXXbbbbbXXbbbbbT Xhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhc   -^ƂVbbbbYYYbXXY@YYbbbbYYbXYYYBYbXXBYbYBBYXYYYXXYYbYYbbYYXYBYYbYXXYYXYBYbbbbbTMghhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhX:fa:bbbYXbBY@Y@@YBXbbYYXYYbYBbYYbbYYYYX@BX@@BYYY@XYYbbY@XB@BYXBYY@BYYYYbbbbbT-bhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhgT VɁ:-bbbYbbYY[YXYYYYbbYBYYYbY@bY[cbYYbXY@@XYYY[YY@YYYbbXYbYYYYYXY[YYbY@YbbbcbTUghhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhb--Vʂ:cbbYXYYbccbbbcbcbXYbbYXY@YYbcbbcccbbbbbbccbbbbbbbbcccbbbcccbcbbccYXbbccbT dhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhT:^0ccbbXXbccccccbccbbbbbbbbbbbcccccccbbcbccccccbbcccccccccbbccbbccbbbbcbccbT-bhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhcVߖV-cccccccccccccbccccccccccccccbbcccccccccccccccccccccccccbbcccccccbbccccccT UhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhX"a,ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccT chhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhgV߅:ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccT-Xhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhb-^VccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccT:ghhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhgTa^-cbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbccTchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhb^-X;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;@bcT XhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhVMa-ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccT:ghhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhgʞ^-,,,cccdcccddddccccccdccccdcccccdcccccdcccdccdccccccdcccccccccccccccdcdcccccT chhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhXӞuC>=$!!! ! ! ! !!!!!!!!! !! !! ! ! ! !!! !!! !!! ! ! ! !! ! !! ! ! !!! ! ! !!!!!! ! ! !!! !! ! !!! ! ! !!! ! !!! !! ! !!!!! !!!! ! ! ! !!!!! !!!! !!!!! ! !!!! !! !!!!!!!!! !! !! !! !!! ! !! !! !!!!!! !! !! !!! ! ! ! ! !!!!!! !!!$=Alv^-cccdcdcccddcdcccccccccdccccdccccccdccddccdccccccccccccdcdcdccccccddcccccU WhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhgMaٜyC=!!=l}bdccdcddccddcccgccccdcccdccddcdcccccccdccccccccdcdccdcccdddcdcddccddcccccUghhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhb-^טo= !>uVdccdcccdcccccccddddgcccccddccccdccddddccccccccdcccdcccdcdddddcdddddccdccU-bhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhUVنl$ =u:ddcdccddcdcdcccdccdddcddcddggcdddcddcdddddddcddddddddcdccdddcgdddccdddgdUUhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhcv==w,dddgg^ZZCBZ^dggd_]Z[ddd[_ddddd^]Z[adcZ[d_]_dd_[^ddddZ_ddda]_ggggd[[dddccVghhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhWن>  C^-,,,ddgd[>AZBA>Zdd]>>A>CadZddddaAA>AadAZddAA^cCAcdgdc>[dgg^?[dgggdBCdgdddV-bhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhgXv$>{:,,,,,gdg[A_dddd[[d_Z^dcAC^Zddddg[^d_>_d?Zdg_>ZZ>_gdgga>[ggg^>[dgdggZAdgddgVUhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhb-l!!v0,,,,ggd>AdghgggddgZ>aggg[>[Zggggggd_B>^d>BgddZZgdgggd>[dgg^>[gggggC>dggggVchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhT-C !u\,,,hg[^ghgggghgg[Adggga>_ZghghhaA>A[dd>Bggg^>hggghd>[ggg^>[ggggdB>dgghgVWhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhcUA  oM,,,,hdZAdggggghggh_>_hgg[A_>^ghggZ>_dggd>BgggZ[gghhhd>[ghhd>ZddaddA>dghggVThhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhU-C!u^-,,,ghZAdhhhgggghhdCA[_[>ZdA[dggZ>__agdABgg_>ZZA^hgghd>[ghhd>>>>>dghggVchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhg0Ul   vM,,,hh[>dhhhhhhhhhhfZAAA]hdAZZ>ZhhdZAA[gdZZhdZZfdZZghhhd>_hhha>Zdd_daAAdhhhhVXhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhb-v !^-,,,hh[hhhhhhhhhhhgdddhhhdhhddhhhhddghhddhhddhhhdhhhhd>_hhha>[hhhhdZAhhhghVMghhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhgT:$>M,,,hhhZ>^hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhdZ_hhhhhhhhhhhhd>[hhha>[hhhhhZBhhhhhV-chhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhb-Al\,,,hhhdA=[dghd^dhhhhhhhhhhhhhhhhhhhhhhhh[_hhhhhhhhhhdd_>[ddgd>[hhhhhBBhhhhhVWhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhgUu !-,,hhhhdZ>@YB@=[hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhdBB>==@B[d=[hhhhhBBhhhhhVMghhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhcV$CU,,hhhhhha[YY[ahhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhf_[[[[_[ad[dhhhhh_[hhhhhV-bhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhbt!}`,,hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhVUhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhgM$C/,hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhVdhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhb-Vt }M,hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhV-bhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh:a=l\,hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhV,Uhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhc-{!$f.hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhVchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhX:l yMhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhXXhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhXUUUUUUUUUUUUUUUUUUUUUUUUUUUUU:UU:T::TT:TT:TT:::::MMMMMMMMMMMMMMMMMMb= CdhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhbXXXXUUUUUUUUUUUUUUUWUUUU:::::::::::::::T::TTTTTTTTTVhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhghhhhhhhghhhhhhhhhhhhhhhhhhhggghghhhgghhhgghhhhhghggh!=cccccccccccccccccbbcbbbcbccccccccccbbbbcccbbbccbccbcbbbbbbbbbcbbbbbcbbbbchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhv   !gdccccbbbbXbbbXbbXbXXXbXbXbXXXbXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXghhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhht     whhhhhhhhhhhhhhhghhhhhhhhgghghgggggggggggggggdggggggggggggggggggggggghhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhA       ! uhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh=   !@[‚Y;       ;[##YYY@ #@YY;  @YYY#@YYYY  YYYY@@d [[ aY Chhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh$       Yf; Y;  @Y΂#Y ;  !# #Ahhhhhhhhhhhhhh!        Y@ !  9!  Y Y[  YY ; #Ahhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhgbbbcbcccbbccc^cbccccbcccbcc^ccbbbbbXbbbXXXbbbbbbbbbXbbbbbXXXbXbbbbbbbbbXbbbbbbbbbXXbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbccbbbccghhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh!       ! ;#;# Y [[ @ ### #=cXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXWXXXXXXXXXXXXXUXUUXXXXUUXXUUUUUUUTUTTTTUTUTTTTTTT0000020+00022000000000000++&&&&&&&&++&&&&(&&++&(+&&&&&&&&&&&&&&(&&&&&&&&&&&&&&&+++&&&&&&&&&&&&&&&&&&&&&&&&-TTTTTTTTTTTTUTTXTTUTUUXUUUUUTUUTUUUUUUUU[!         [Y   @9!Y;[ _# #=X000000000000000000000000022O222222222222222222222222222222222202++000++++++++++++*&&&&&&&&&&&&&&&&&&&&&&&&-@!           Ƅ__   ;˄[YY_  Y;[ ##; ; #=U 002Ubbbbbb\bbbbbb\\\\\\\\3444343333333333333333333333222202020000000000++00++++++*U::::3:U::3:::33:3:::+&&-Y!       Y!   9[! !Y!   !_  Y# Y;[ _[; #=X20e44333333333333333333333333322332P2220000M000000000+++++\––U&&V!        !     !;   B  !9  9Y  Y  ;_[   @@ ; #=X002e4\\23ƝƝŝƝŗ2+\Ǟ<&&-V!            Y    !  [9  ;     Y  #Y[ Y @; #=X"020e4\`2<ۭ۰:+]Z&&""V!        ! !Z;  !  !  @! !   !Y!Y#;_[  [[; #=X"""""000e4\`2<ӭ3+Z<&&0""""V!    !  ! ! ! ;9  !! !@!! !; !    @ 9Y   Y [ ;;; #=X"""""T""TT"000e4\`2<ӭқ:+Z:&&0""""T"""V!      ! ! ! ! !9 ! !! !!  !  @_ ! !   9!Y  ;; 9[ ; #=PgX"TTT"""TTT"""TTTTTTTT:02e4\`2<Җ30V:&&0TTTTTTTTV!         ! !!   ! ! !@@!!!!! ! ! ! ! !! !!_;  !!! Y@ !Y#@[ # ;  #=L/bXTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTT""T"""T""""T""""""""""WXXXXXXX:00e4\`2Qǔ3+V:&&MXXXXXXXX"""""""""""Y!   ! ! ! ! !! !!  ! ! !! ![!! ! !!!!!!!! !!! ! !!!!!  !  ;Y !Y    Y [ [Y; #=NL.WhXWWWWKWWWWWWWJWWWWWWWJWWWWWWWJJJJJJJHJJJJJHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHFFFJKKKKKKKH00e4\`23ǔ:+<:&&MKKKKKKKJFFFGHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHX$ !!  !   !!! !! !! !!!!!!!!!! ! @9!!! ! !!!!!!!!! !!!!! ! !!! !! ! ! ![ !Y    9Y[  ; #=NNLLMbJKKKKKKKKKKKKKKKKKKKKKKKKKKJKKKKKKKJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJHGGGFFFFJKKKKKKKJ20e4e`2Uӛ:0\ӰǞV&&MKKKKKKKJFFFFGGGGGHHHHHJJJJJJJJJJJJJJJJJJJJJJJJJJX!    !    !!  ! !!!!! !! !!! !!!! !_Y!!!!!!!!!!! !!!!!!!!!!! ! !!!!!!!!!!!!! ! !_ 9[     __ [ Y@# #=NNNNL.JKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKJKJKJKJKJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJHHHGGFFFFJKKKKKKKJ20e4ee2QU0^ذV&&MKKKKKKKJFFFFFGGGHHHHHHJHJJJJJJJJJJJJJJJJJJJJJJJJX!    !  ! ! !  !! ! !!!!!! !!!!!!!9 !! !!!!!!! !!!!!!! !!!!! !!!!!!!! !!!! ! ! ! !!_ !   ; [ [[; # ;=NNNNNNJKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKJKKKKKKKJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJHGGGFFFFJKKKKKKKJ22e4ee2QU0\ح[&&MKKKKKKKJFFFFFGGGGHHHHHJJJJJJJJJJJJJJJJJJJJJJJJJJX!   ! !!!! ! ! !!!! !!!!! ! !! !!!!!!!!9!!!!!!!!!!!!! ! !!!!!!!!!!!!!!!!!!!! !!! !!! 9Y 9!  ;Y  [ ;;; =NNNNNNJKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJHHHGGFFFFJKKKKKKKJ22e4ee2QU0\[&&MKKKKKKKJFFFFFGGGGHHHHHJHJJJJJJJJJJJJJJJJJJJJJJJJX!    !  ! ! ! ! ! !!!!!!!!!!!!!!!!!!!!!!!!!@B!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!_@!!!!!! ! !!!! !!!YB! 9;  #9[  ; =NNNNNNJKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKJKKJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJHHGGFFFFJKKKKKKKJ22e4ee2QU0\[&&MKKKKKKKJFFFFGGGGGHHHHHJJJJJJJJJJJJJJJJJJJJJJJJJJX$  ! !! ! !!!! !! !!! ! !! !!!!! !!!!!!!!!!!!Z9!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!B!!!!!!!!!!! !!!!!9!!9 !  _@  [ _# =NNNNNNJKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKJKKJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJHHGGFFFFJKKKKKKKJ22eg2QU0\\&&MKKKKKKKJFFFFGGGGHHHHHHJJJJJJJJJJJJJJJJJJJJJJJJJJX!   !   ! !! !!! !!!!!!!!!!!!!!!!!!!!!!!!!!_9!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!9;!!!!!!!!!!!!!!!!@!!!9@  ! !! 9!   [ @;# =SSNSSNJKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKJKJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJHGGGFFFFJKKKKKKKJ22ee2QU0\\&&MKKKKKKKJFFFFFGGGGHHHHHHJJJJJJJJJJJJJJJJJJJJJJJJJX$  ! ! !!!!!! !! !!!!!!! ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!9[!!9; ! 9!;_9[  ; =NSRSSNJKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJHGGGFFFFJKKKKKKKJ22e4ee2QU0\ޭ^&&MKKKKKKKJFFFFFGGGGHHHHJHHJJJJJJJJJJJJJJJJJJJJJJJJX$ !! ! !! !!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!@_!!!!!!!!!!!!99!9;  ;9  [Y [  #; =OSRRQPJKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKJJJJJJJJKJJJJJJJJJJJJJJJJJJJJJHHGGFFFFJKKKKKKKJ22ee2QU2e[&&MKKKKKKKJFFFFFGGGHHHHHJJJJJJJJJJJJJJJJJJJJJJJJJJJX$ !!! ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!$!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!9!!!!!!!!!!;[!!!!9΂@!;Y [ Y;@@; =>JKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKJJJJJJJJJJJJJJJJJJJJJJJJJJHJHGGGFFFFJKKKKKKKJ22e4e2QU0\ޭ^&&MKKKKKKKJFFFFFGGGGHHHHHJJJJJJJJJJJJJJJJJJJJJJJJJJX$  ! ! !! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!![9!!!!!!!!!!!!!!!!!!!!!!!!$$!!!!!!!!!!!!BÁZYZ[;!!!!!9! !Y   [  ; =666ii8JKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKJJJJKJJJJJJJJJJJJJJJJJJJJJJJHHGGGFFFFJKKKKKKKJ22ee2QU2e\&&MKKKKKKKJFFFFGGGGGHHHHHHJJJJJJJJJJJJJJJJJJJJJJJJJX$!! ! ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!B@!!!!!!!!$!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!Z@!!!!!!9@!!!@! [  Y#;Y; =ii6ii8JKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKJJKJJJJJJJJJJJJJJJJJJJJJJHHGGGFFFJKKKKKKKJ22eg2QU2e^&&MKKKKKKKJFFFFGGGGGHHHHHJJJJJJJJJJJJJJJJJJJJJJJJJJX=!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!$!$$!;_!!!!!!!!!!!!$$!!!!!$!!!!!!!!!!!!!!!$!!!!Y@!!!!!!!9[ !! _@ ! [!9YY ; =i666i8JKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKJJJJJJJJJJJJJJJJJJJJJJJHHHGGFFFFJKKKKKKKJ22eg2QQ2eޭ^&&MKKKKKKKJFFFFFGGGHHHHHHJJJJJJJJJJJJJJJJJJJJJJJJJJX$ !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!$!!!!!!!!!!$$9$!!$$!!!$$!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!@;!!!!!!!!!Ȗ;!@;!!! !_Y ! ;_ !_  _Ƅ ; Y@@@@@@@@@@@Y=6iiii7JKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKJKKKJJJJJJJJJJJJJJJJJJJJJHHHGGFFFFJKKKKKKKJ22eg2QU2e[&&MKKKKKKKJFFFFFGGGGHHHHHHJJJJJJJJJJJJJJJJJJJJJJJJJX$ !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!$$!!!!!!!!!!!!!@!!!$!!$!!!!!!!$!!!!!!!!!!!!$!!!!!!!!!!!!!9[Y!!!!!!!!!!!!9999!!!!99!!!!!!!!@΂;! !! !   ; #=66iii8KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKJJJJJJJJJJJJJJJJJJJJHHGGGFFFFJKKKKKKKJ22ee2QU2e^&&MKKKKKKKJFFFFFGGGGHHHHHHJJJJJJJJJJJJJJJJJJJJJJJJJX$ !!!!!!!!!!!!!!!!!!!!!!!!!!!!!$!!!!!!!!!!!!!!!$$$!!!!!!$!!Y!!!$$!!!!!!!$!$$$!!$$!!!!!!!!$!$$!!!!$!!!!!9YÁ@$!!!!!!!$!!!!!!!!!! !!!!!!!! !!!9BB@9! !! !@[9  ; #=6ii6i8JKKKKKKKKKKKKKKKKKKKKKKKKKKKKKJJJKJJJJJJJJJJJJJJJJJHHGGFFFFJKKKKKKKJ22eg2QQ3eϭ^&&MKKKKKKKJFFFFGGGGGHHHHHJJJJJJJJJJJJJJJJJJJJJJJJJJX$! !!!!!!!!!!!!!!!!!!!!!!!!!!!!$$!!!!!!!!!!!!!!!!$$!!$$!!!!!9B!$$$!!$!$!!!!$!!$$!!!$$!!!!$!!$!!!!!!!!!!!!!!$=@@@@9$!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!! !_9    #[______________________Y  #=iiiii8JKKKKKKKKKKKKKKKKKKKKKKKKKJJJJJJJJJJJJJJJJJJJJJHHHGGFFFFJKKKKKKKJ22eg2QQ2e׭\&&MKKKKKKKJFFFFFGGGHHHHHHJHJJJJJJJJJJJJJJJJJJJJJJJJX$!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!$!$!!!$!$$!!!!$!!!!!!!$!!_9$!$$!!!$!!$$$$$!!!$!$$$!$!$$$$$$!$!$$$!!!$$!!$!!!!!!!!!!!!!!$!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!! ! ! @   # #=iii6i8JKKKKKKKKKKKKKKKKKKKKKKKKKKJJKJJJJJJJJJJJJJJJJJJHGGGFFFFJKKKKKKKJ22eee2QQ3e^&&MKKKKKKKJFFFFFGGGGHHHHHJJJJJJJJJJJJJJJJJJJJJJJJJJX$!!!!!!!!!!!!!!!!!!!!!!!!!!!$!!$!!!!!!$!!!!!!$!!$!!!$$$$$!$$!9$!$$$!$!!!$$$$$$$!!!$$!$$$$$!$!!!!!$$!!!$!!$!$$!$!!!$!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!! !! [!   ; #=i666i8KKKKKKKKKKKKKKKKKKKKKKKKKKKKJKJJJJJJJJJJJJJJJJJJJHHGGFFFFJKKKKKKKJ22󾇌e2QQ3eޭ^&&MKKKKKKKJFFFFGGGGGHHHHHJHJJJJJJJJJJJJJJJJJJJJJJJJX$!!!!!!!!!!!!!!!!!!!!!$!!$!!!!!!!!!!!!$$$!!$$!!$$$!!$$$!!$$$$$[_$$$$$!$!$!!!$!$$$$$!!$$$$$!!$$$!!$!!$$!$!!!$$$!$$!!!$$!!!!$!!!!$!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!! [!    ; #=iii6i8KKKKKKKKKKKKKKKKKKKKKKKKJJJJJJJJJJJJJJJJJJJJGGGFFFFJKKKKKKKJ22ee2QQ2eޭ^&&MKKKKKKKJFFFFFGGGGHHHHHJJJJJJJJJJJJJJJJJJJJJJJJJJX$!!!!!!!!!!!!!!!$!$$!!!!!!!!!!!!!!!$$$$$$$!!$$!!$$$$$$!!$$$$$!$9$!$$$$$$$$$$$$$$==$$=_[$$$$$=$$$$!!!!$$$!$$$!$$!!!!!!!!$!!!!!$$!!!!!!!!!!!!!!!!!!!!!!!!!!!!  !!@! !    ; # =6ii6i8KKKKKKKKKKKKKKKKKKKKKKKKKKJJJJJJJJJJJJJJJJJJHHGGFFFFJKKKKKKKJ22ee2QQ3e^&&MKKKKKKKJFFFFGGGGHHHHHHJJJJJJJJJJJJJJJJJJJJJJJJJJX=!!!!!!!!!!!!!!!!!!!!$!!!!!$$$$$!!!$!$!$$$$=$$!!$$$$$$$$$=$$$$$@=$!$$$$$=$$$$$$$$$$@_=$$$!$!$$$!$$$$$!$$!!!!$!!$$$!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!@      ; #=i6i668KKKKKKKKKKKKKKKKKKKKKKKKKKJJJJJJJJJJJJJJJJJJHHGGFFFFJKKKKKKKJ22󾇌e2QQ3eϭ^&&MKKKKKKKJFFFFFGGGGHHHHHHJJJJJJJJJJJJJJJJJJJJJJJJJX=!!!!!!!!$!!!!!!!!!!!!!$$!$!$!$$$!$$!$$$$$!$!$$$$$$$$!$$!$$$$$$$@Z$$$$!$$$=$$$$$$=_=$$$$$$$=$!$!$$$$$!$$$!$!!$$$$$!!!!!!!$!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!![;! !! !  !  ; #=6iii67KKKKKKKKKKKKKKKKKKKKKKKKJJJJJJJJJJJJJJJJJHHHGGFFFFJKKKKKKKJ22ee2QQ3ḙ\&&MKKKKKKKJFFFFGGGGGHHHHJHHJJJJJJJJJJJJJJJJJJJJJJJJX=!!!!!!!!!!!!!!!$$!!!$$!$!$!$!!$!$$$!!$$$$$$!$!$$$$=$$=$$$==$$$=$YZ=$$$$$$$$$$@]$$$$!$$$$=$$$$$$$$$$!$$$$$$$$!!$$$!$$$$!!$!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ! !      ; #=ii6i68KKKKKKKKKKKKKKKKKKKKKKKKJJJJJJJJJJJJJJJJJHHGGFFFFJKKKKKKKJ22ee2QQ3eӨ]&&MKKKKKKKJEFFFFGGGHHHHHJJJJJJJJJJJJJJJJJJJJJJJJJJJX=!!!!!$!!!!!$$$!!!$$!$!$!!$$$$!$$$$$$$!$$$$$!$$$$!$$$$$$===$$$$$$$ZΖ_BB@@BZB$$$=$$$$$$$$$$$$=$$$$$!$$$!!$!$$!$!!!$!!$$!!!$!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!! ! !   ; #=ii6ii8KKKKKKKKKKKKKKKKKKKKKKKKJJJJJJJJJJJJJJHHGGFFFFJKKKKKKKJ22ee2QQ3eϨ]&&MKKKKKKKJFFFFFGGGGHHHHHHJJJJJJJJJJJJJJJJJJJJJJJJJX=!!!!!!!!!!!$!!!!!$$$$!!$!$$$$$$$$$$!$=$$$$!$==$$=$$==$$$$$$$==$$$$BB=$==$=$==$$$$=$$$$$=$$$$$$!$$$$!$$$$!!!$$!!!!!!!!!!!!$!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ! !     ; #=666667KKKKKKKKKKKKKKKKKKKKKKKJJJJJJJJJJJJJJJJHHGGFFFFJKKKKKKKJO3ee2QQ3e]&&MKKKKKKKJFFFFFGGGGHHHHHJJJJJJJJJJJJJJJJJJJJJJJJJJX=!!!!$$!!!$!$$$!$!$!$$$=$$$!$$$$$$$$$$$$$$$$$==$$=$$==$$$$$===$$$$$=@_=$$=$$$$==$$$$$$$$$=!$!$$$$$$$$$$!!$$$$!!$$!$$$!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!  !   ; #=666668KKKKKKKKKKKKKKKKKKKKKKKJJJJJJJJJJJJJJJJGGGFFFFJKKKKKKKJO3󾇌e2QQ3e[&&MKKKKKKKJFFFFFGGGGHHHHHHJJJJJJJJJJJJJJJJJJJJJJJJJX=!!!!!!!$!!!$!!$$$!!$$!$=$=$$$$$$=$$$$$$$$==$=$$==$==$$!$=$====$$=====ZA=$$$======$$=$$=$=$$$!$$=$$$$$$$$$$$$$$$$!!$!!$!!!$$!$$!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !    YÕ [[ [ =666668KKKKKKKKKKKKKKKKKKKKKKKKJJJJJJJJJJJJJHHGGGFFFJKKKKKKKJOO󾇌e2QQ3eb&&MKKKKKKKJFFFFFGGGGHHHHHJJJJJJJJJJJJJJJJJJJJJJJJJJX=$!$$!$$!!$!$$$$!$$$!$!$$!$$$$$$$$$$$$$=$$$====$$====$==$===$===$==$$=$=ZυB=====$$$$$$=$$==$==$$$$$=$$$=$$$$$$$$$$$$$!$!$!$!$!!$$!!!!!$$!$!!!!!!!!!!!!!!!$!!!!!!!!!! !!!! !!  !          =666667KKKKKKKKKKKKKKKKKKKKKKKKJJJJJJJJJJJJJJHHGGGFFFJKKKKKKKJOO󾇌eOQQ3eb&&MKKKKKKKJFFFFFGGGHHHHHHJJJJJJJJJJJJJJJJJJJJJJJJJJX=!!$$$$!!$!!$$$$$!!$$$!$$$$$$$==$$$$$$$==$$$=$$$=$$===$===$$==============Bxȅ_=$===$==========$$$=$$$===$$$$$$$$$$!$$$$$!$$$$$$$$$$$$!!!$!!$!!$$!!$!!!!!!!!!!!!!!!!!!!!!!! !!! ! !     =666668KKKKKKKKKKKKKKKKKKKKKKJJJJJJJJJJJJJJHGGGFFFJKKKKKKKJOO󾇌eOQQ3e^&&MKKKKKKKJFFFFFGGGGHHHHHHJJJJJJJJJJJJJJJJJJJJJJJJJX=$!!$$$$$$$$$$$$$$=$$$$$=$$$$$$$$$$$$$$==$=$$$===$=$$=============$====$======BBZZZZB@===========$$$==$$====$$==$$=$=$$$$$$=$$==$$=$$$$$$$!$!$!$$$!!$$$$$!!!!!!$!!!!!!!!!!!!!!!!!!!!!!! !!!! ! !!!   =666667KKKKKKKKKKKKKKKKKKKKKKJJJJJJJJJJJJHGGGFFFJKKKKKKKJOO󾇌eOQQ3e^&&MKKKKKKKJFFFFFGGGGHHHHHHJJJJJJJJJJJJJJJJJJJJJJJJJX=$!$$$$$!!$!$$$$$$$$$$$$=$=$=$$$=$$$============$==============$==$=$===$====================================$$$=====$=====$==$==$$$$$$$=$$$$=$$$$!!$$$!!!!!$$!!!!!!$!!!!$!!!!!!!!!!!!!!!!!!! !! !    =666668KKKKKKKKKKKKKKKKKKKKKJJJJJJJJJJJJJJHGGFFFFJKKKKKKKJOO󾊌e2QQ3e^&&MKKKKKKKJFFFFGGGGGHHHHHJJJJJJJJJJJJJJJJJJJJJJJJJJX=!$$!$$$$=$$!$$$$$!$$=$$=$$$=$=====$=$=======$==$===================$========================$$=================$==$==$=$=$$$=$===$$==$$$$$!$$$!$$$$$!$$$$$$!$!!$!!$!!!!!!!!!!!!!!!!!!!!!!!!!! ! !  !    =666667KKKKKKKKKKKKKKKKKKKKKKJJJJJJJJJJJJJHGGFFFFJKKKKKKKJOO󾊌eOQQ3e^&&MKKKKKKKJFFFFFGGGHHHHHHJHJJJJJJJJJJJJJJJJJJJJJJJJX>$$$$!$$$$$$$$$$$=$$==$$===$$$=$=====$======================================================================================$=$=====$$$$$$$$$$$$$$$$$$$$$$!!!$!$!!$$!!$!!!!!!!!!!!!!!!!!!!!!!!!!!! ! !  !     =666667KKKKKKKKKKKKKKKKKKKKKKJKJJJJJJJJJJJHGGGFFFJKKKKKKKJOO󾊌eOQQ3e[&&MKKKKKKKJFFFFFGGGGHHHHHJJJJJJJJJJJJJJJJJJJJJJJJJJX>$$$$$$$$$=$$$$$$$$$$$$$$======$==$======$==$==========================================================================$$=====$$==$$==$==$$==$$$$$$$$=$!$$$$!!$!$!!!$$!!!$$!!!!!!!!!!!!!!!! !! !!!!!    =666667KKKKKKKKKKKKKKKKKKKJKKKJJJJJJJJJJJHGGFFFFJKKKKKKKJOO󾊌OQQ3eέ]&&MKKKKKKKJFFFFFGGGGHHHHHJHJJJJJJJJJJJJJJJJJJJJJJJJX=$$$==$$$$$$=$$=$$$========================================================>============================================$=$$======$=$$=$$$$$=$$$$=$$$$$$$$!$$!$!$!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!  ! !    =666667KKKKKKKKKKKKKKKKKKJJJJJJJJJJJJJHGGGFFFJKKKKKKKJOO󾊌eOQQ3eӨ]&&MKKKKKKKJFFFFFGGGGHHHHHJJJJJJJJJJJJJJJJJJJJJJJJJJX=$$$$$$$$$$$=$$====$$=======$===================================================================================================$$===$=$$$=$$$=$$=$$$$$$=$!$$$$!$$$!!!$!$!$!!!!!!!!!!!!!!!!!!!!!!!! ! ! ! !   =666667KKKKKKKKKKKKKKKKKKJJJJJJJJJJJJJHGGGFFFJKKKKKKKJOO󾊌e4QQ4eޭ^&&MKKKKKKKJFFFFGGGGHHHHHHJJJJJJJJJJJJJJJJJJJJJJJJJJX>$$$=$$=$=$$$$$=$================================================>>===============================================================$======$$$$$$==$$$=$$$$!$$$$$$$$$$!$$!!!$!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ! !!!    >666668KKKKKKKKKKKKKKKKKJJJKJJJJJJJJJJHGGFFFFJKKKKKKKJOO󾊌4QQ4e^&&MKKKKKKKJFFFFFGGGGHHHHHHJJJJJJJJJJJJJJJJJJJJJJJJJX>=$$$$$==$=$==$=$=================================================>===========>=====================================================$=$$==$==$===$$$$===$$$$$!$$$$!$$$!!!$!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!! !!    =666667KKKKKKKKKKKKKKKKKKJJJJJJJJJJJHGGGFFFJKKKKKKKJOO󾊌e4QQ4e^&&MKKKKKKKJFFFFFGGGGHHHHJHHJJJJJJJJJJJJJJJJJJJJJJJJX>$$$$$$$$=========$===$====$========================>>===>========>==>===>====>=====>=======>======================>=====================$======$=$$$=$==$$$$$$$$$$$$$!!!$$!!!$!!!!!!!!$!!!!!!!!!!!!!!!!! !!!    =666667KKKKKKKKKKKKKKKKKKJKJJJJJJJJJJHGGFFFFJKKKKKKKJOO󾊌4QQ4e\&&MKKKKKKKJFFFFFGGGHHHHHJJJJJJJJJJJJJJJJJJJJJJJJJJJX>$=====$$============$$==========================>==>===========>=====>====>=========>=>>====>====>==========================================$$$==$$=$$===$$==$$$$$!$$$$$!!$!$$!!!!!$!!!!!!!!!!!!!!!!! !! !!   =666667KKKKKKKKKKKKKKKKKJJJJJJJJJJJJHGGGFFFJKKKKKKKJOO󾌌4QQ4e^&&MKKKKKKKJFFFFFGGGGHHHHHHJJJJJJJJJJJJJJJJJJJJJJJJJX>====$====$$===========================>>=============>=========>=======>>>==>>===>>==>>>=>==>======>>======>====>========================$=========$$==$$$$$$$$$$$$$$$$$$!!!$!$$!!!$!!!!$!!!!!!!!!!!!!!!!!  ! !  !    =666667KKKKKKKKKKKKKKKKKKJJJJJJJJJJJJHGGFFFFJKKKKKKKJOO󾌌4QQ4e^&&MKKKKKKKJFFFFFGGGGHHHHHJJJJJJJJJJJJJJJJJJJJJJJJJJX>$=$=$$=========================>>====>=====>>=>>========>>=>==========>==>========>==>=>>=>>===>==>================>===========================$==$$$==$=$$==$$=$$$=$$$!$$$!$!!$$$!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!     =666667KKKKKKKKKKKKKKKKKKJJJJJJJJJJJJHGGFFFFJKKKKKKKJO4󾌾4QQ4e^&&MKKKKKKKJFFFFFGGGGHHHHHHJJJJJJJJJJJJJJJJJJJJJJJJJX>==$===========================================>==>===>==>===>=>=======>===>>>>=>==>===>=>=>>===>>>===============>====>>================================$=$$$$$$$=$$!$$$$$$$!!$B[___[_______[[_[_[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[Y[[[[Y[[YZYYYYY[YY[YYYYYY[[YYYYY[Y[YYYYYYYYYYYYY[[YYYY[YY@;# =666667KKKKKKKKKKKKKKKKKJJJJJJJJJJJHGGGFFFJKKKKKKKJ44󾌾4QQ4e^&&MKKKKKKKJFFFFFGGGGHHHHHJJJJJJJJJJJJJJJJJJJJJJJJJJX>=================================>===============>======>===>>====>>==>>>=>==>>>>>=>>=>=====>>==>>=>>>>=======>=============>======================$=====$==$$==$=$$$$$!$$$$$$=ȂY =666667KKKKKKKKKKKKKKKKKKJJJJJJJJJJHGGFFFFJKKKKKKKJ44󾌾4QQ4e\&&MKKKKKKKJFFFFFGGGHHHHHHJJJJJJJJJJJJJJJJJJJJJJJJJJX>$==============================>=======>====>>====>=>=>==>>==>>>>=>>=>>>>>>>>>==>=>>=>>>>>==>>>>>>>>==>>==>>>====>=>=>>>=================================$$=$==$$$==$$$$$$$$$$@[ =666667KKKKKKKKKKKKKKKKJJJJJJJJJJJHGGFFFFJKKKKKKKJ44󾌌e4QQ4e\&&MKKKKKKKJFFFFFGGGGHHHHHHJJJJJJJJJJJJJJJJJJJJJJJJJX>==========================>======>=====>>>=>=>>==>>>>>====>>>>AtZ]xzxzzzzzxzzzzzzzzzzzxzzzzzzxzzzxxxzzzzxzzzzzxzzzzzxzxxzxxzxzxxzxxxxxxxxxzxx__xxxxxx__xx____xx___xx__________;=666667KKKKKKKKKKKKKKKKJKJJJJJJJJJJHGGFFFFJKKKKKKKJ44򾌌e4QQ4e˭V&&MKKKKKKKJFFFFFGGGGHHHHHHJJJJJJJJJJJJJJJJJJJJJJJJJX>===============================>====>>>===>>=>>>=>==>>>>>>=At––––––––Y=666667KKKKKKKKKKKKKKKKKJJJJJJJJJJJHGGFFFFJKKKKKKKJO4ee͌4Q4Qhhhhhhhhfgggggca<+&MKKKKKKKJFFFFGGGGGHHHHHJJJJJJJJJJJJJJJJJJJJJJJJJJX>=============================>>>=======>=>>>=>>=>>=>>?>>>=]@$=$=$$$$$$$$$!$$!!!!!!!!!!!!!!!!!!!!!!! ! ! !    ;@=666667KKKKKKKKKKKKKKJJJJJJJJJJJHGGFFFFJKKKKKKKJ444O4OOOOOOOOO2222222222eeeeeeeeee4QQQQQQ\\\QQQ44*+++++++++++++++++++++&+&MKKKKKKKJFFFFFGGGHHHHHHJHJJJJJJJJJJJJJJJJJJJJJJJJX>==========>=============>=>==>==>>=>=>===>>>>>>>===>>=>>A_____[__[[[[[[[_[[[[[[_[[[[[[[[[[ZZZZZZZ[[ZZZZZZZZZZYZYZYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYY@; ##=666667KKKKKKKKKKKKKKKKKJJJJJJJJJJHGGFFFFJKKKKKKKJO444OOOOOOOOOOO2222222224444444444444*+++++++++++++++++++++&++MKKKKKKKJFFFFFGGGGHHHHHJJJJJJJJJJJJJJJJJJJJJJJJJJX>=================>======>>=>>>=>=>>>>>>>>>>>>=>>>>>>>>>CŖŖŖŖśŖŖŖŖśŖŖŖŖ˄Y  @ =665667KKKKKKKKKKKKKKKKJJJJJJJJJJHHGFFFFJKKKKKKKJHHHHHHHHHHHHM///MMMMMMMMQ\QQQQQQQQQQQQQQQQQQQQ4Q4444OOOOOOOOOOOOOOOOOOOOOOOOOOOO2VTHHHHHHHHHHHHHHHHHHHHHHJKKKKKKKJFFFFFGGGGHHHHHJHJJJJJJJJJJJJJJJJJJJJJJJJX>=====>===>=========>=======>>>>==>>>>=>>>>>>>>?>>>>>>>Czt>>A>>A>A>>?>>????>A>>>>>A>>>=>A>>A>>A>>>>>>>>>A>>>>==>>>=>>>>=====>===>=>>======>=======================$$$==$@@;Y=666667KKKKKKKKKKKKKKKJJJJJJJJJJHGGGFFFJKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKJFFFFFGGGHHHHHHJJJJJJJJJJJJJJJJJJJJJJJJJJX>=============>=>>===>>=>>=>>=>>>>>==>>>>>=>===?>>>>>>AxCA>>>>>>>>>>>>>>??>A>>>>>>>?>?>>??>?>>>?>>A>>>>=>>>>>>==>>>>>>=>===>=>>=>>================================$=$$$==@_ Y>666667KKKKKKKKKKKKKKKKKKKKKKKKJJJJJJJJJJJJJJJHHHHGFFFFFJKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKJFFFFFFGGGGGHHHHHHHHHHHHHHHHHHHHHHHHJHJJHX>======>==>===>=====>====>>>>>==>>>>>=>>>>>>?>>>>>>>>At?>>>>>>?>>>>>>>>?>>>A>>>??>>AA>A>>>>>A?>>>>>>>>>>>>>>>>>>>>>==>>>=>>>>===>=>=>======>==>===================$===$==@#=656667"HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHV>===================?=>==>>>>>=>>>>>>>>>>>>>?>>>>>>?>tt>>>>>>>>>>?>>??>>?>>??>>>>>>??>>?>?>>>>?=>>>>>>>A>>>?A>>=>>>>>>>>>>>>>>>>>>====================================$$==@[;[=656667"V>========>====>>>>>>>>>>>>>>=>>=>>>>>>>>>>>>>?>>A>>>A]A>>>??>???>A?AA>?A>?>??A??AAA?>>>>>>>>>>>??>>>>>>>>>>?>>>>>?>>>>>>>>>>==>>==>>==>=====>=>========================$==@#=666667"Y>=======>>==>==>>=>>>>>>>>>>>>>>>>>>>?>>>?AA>?>>?>>>C?>>?A?C>>>?>>??>>>???>>?????>???>>>A?>AA>?>??>>>>>>>>>?>>?>>>>>A>>=>>=>>>>>==>>>==>>=>=>>============================@Y =666657""Y>>======>>>=>>>>>>>>>>>>>A>>>>>>>A>?>>>>>AAA>A>>>??>xt??>>>>>?>>??A??>>??>>?>>?>>>>>>A???>>>C?>?>???A>>A>>>A>>A>>>=A>>>=>>>>>>>>>>>>>>>==>>>==>===>>=======================@;; =66565""""""V?=======>==>>>>>>>>>=>>=>>>>>>?>>?>>>AA>?A>>>>>>>>?A?>?C??>?????>??C?>??>???>??A???>>?????>>A>>>?>A>>>?>>??>>>>>>>A>>>>>>>>>>>>>>?>>>=>>>>>>>=>==>=====>==================>_##=656667TTTTTTTTTUTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTT"TTT"TTTTT"TTT"TTTTT"""TTT""TTT"""TTT""TTT""TTT"""TTT""TTT""TTT"""TTT""TTT""TTT"""TTT""TTT""TTT"""TTT""TTT""TTT"""TTT""TTT""TTT"""TTT""TTT""TTTT"TTTTTTTTTTTTTTTTTTTTTTTTTTX?=>==>>==>>>>>>>>>>>>>>>>>>>>>A>>>>>??>>>?????>???>?x??????>?>?>??C??C??????C?????C>??A>?C??>CA???>??>A?>>??>A>?>?A?>>>>>>>>>>>>>>>>>>>>===>>>>==>>==>=====>===>===========> #=666667XbbbbbbXXXXXXWXXXWXXXXXXXWWWWWWWWWWWWWWWWWWWWWWWWWWWWTWTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTWTTWTWTWTTTWTX?=>=>==>=>>=>>>>>??>>>A>>>?>???>?>>>??>>>C?>????>A?CtAA???>>??>?????>??CC?????????C?????>?????>?C?>?A>>A>>C>?>>?>?>>>>>?>>?>>>>>>>>>>=>>>>>>>=>>>>======>>======>==========> #=556667KKKKKKKKKKKKKKJKJJJJJJJJJJHGGFFFFJKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKJFFFFFGGGHHHHHHJJJJJJJJJJJJJJJJJJJJJJJJJJX?==>>>>>>>>>=>>>>>>>>>?>>?>>A?>>>A>>>>A>???>A???>>?Ct??>??????CCC?C?????C???CC??CC??????????????????????>??>>>>??>?>>>AA>>?>>>>A>>>>>>>>>>>>=>>>=>>>>>==>=>===>============> #=666667KKKKKKKKKKKKKKKKJJJJJJJJJJHGGGFFFJKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKJFFFFFGGGGHHHHHHJJJJJJJJJJJJJJJJJJJJJJJJJXCA>=?>>>>=>>>>>>>>>>>>>>??>>A>>>>??>??>A?>A?>>>C??CttCCC??>?CCCC?C>?CC????????????>???CC????CC??C???>??C?>>>???>>>>???C>>>???>>>>A>>>>>>>>>>=>>>=>>>>=====>================># #=656657KKKKKKKKKKKKKKJJJJJJJJJJJJHGGGFFFJKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKJFFFFFGGGGHHHHHJJJJJJJJJJJJJJJJJJJJJJJJJJX?=>=>>>>>>>>>>>>>>?>??>>>>>>>A??????????>>C??A??>??tt??C?C???C?C?C?CCC???CC???????CC?>??CC?C>>>CC?????CC?????>????????A>??A>>????>>>A>>>>>>>>>>>>>>>>=>>===>===============># #=666657KKKKKKKKKKKKKKKJKJJJJJJJJJHGGGFFFJKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKJFFFFGGGGHHHHHHJHJJJJJJJJJJJJJJJJJJJJJJJJXA=>>>>>>>>>>>>>>?>>>>>>=>?>????>?AC??????CC????????ttCC??CCC?C??>?C?CCC??????CCCC?CC??CCCC??C??C???C??C?>>?C?????C?A??>>?C>>>>?>>?>>>>A>>>>>>>>>>>=>>=>>=========>===>=====A# #=57556$KKKKKKKKKKKKKJJJJJJJJJJJHGGGFFFJKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKJFFFFFGGGHHHHHHHJJJJJJJJJJJJJJJJJJJJJJJJJXC>>>>>>>A>>?>>>A>>??>>>??C>>>>>????????????C?C?C?CCCt????????CCC??CC??lCCCC??CCC?CCC?CC?CC??C??C???C??C?>?C????C?CC????>A?>??>>???A>>>>>>?>>>>>>>>=>>=>=>>>=>>=======>=====A# #=566667KKKKKKKKKKKKKKJJJJJJJJJJJHGGGFFFJKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKJFFFFFGGGGHHHHHJHJJJJJJJJJJJJJJJJJJJJJJJJXC>==>A>>??>?>>A>>????>??>???????????????C?CC????CC?CtC????C?CCCCCC?CCCCCC?CC??lCCC??CCCCC??C??????>???C??CC??????????>?C???>C>>?>??>>>C>>>?>>>>>>>=>>>>>>>A>======>>>======># #=555557KKKKKKKKKKKKKKJJJJJJJJJJJJHGGFFFFJKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKJFFFFFGGGGHHHHHJHJJJJJJJJJJJJJJJJJJJJJJJJXC>>>>>>>=>>>>??>>>>?????>?>???C???>?????CCCCC??CCCCltCCCCCC???C?CC?CCCC??CCCC?CCCCC???CCCCCCCCCCCC?CCCCC?C??C?C????????C??>>??AC>?>??>?>>>>>>>A>>?>>A>>>>=>====>==AABCBZZZZ_# #=55665$KKKKKKKKKKKKKJJJJJJJJJJJJHGGGFFFJKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKJFFFFFGGGHHHHHHJJJJJJJJJJJJJJJJJJJJJJJJJJXC>A>>>AA>>>>>A>?>?>A?>??C?>??C??C???CC???CCCCCC??CCtt?ClCCCC?CCCCCC?CCCCCCCCCCCCCCCC???CCCCC??CCCCCC?CCCCCC?C?CC??C?????>>???CA?>????A>>>>>>?>>>>>>A>?A>>AAC]z# ;=55566KKKKKKKKKKKKKJJJJJJJJJJJJJHGGFFFFJKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKJFFFFFGGGHHHHHHJHJJJJJJJJJJJJJJJJJJJJJJJJXC>A>?A>>>>?AA>??>?>A???>?A??C????????CCCC????CC?CCCttCCCCCCC?CCC?CCC??CCClCCCCCCCC?CCCCCCCCCC???CCCCC?CCC??C??????CCCC????A?>????C?>>?C?>??>>>>>>>>>AZ]# #=566657JKKKKKKKKKKKKKKKKJJJJJJJJJJJJJJJJJJJJJJHJHHHHHHHHHHHHHHHHHHHHHHHHHGGHHHGGGGGGFGFFFFJKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKJFFFFFFGGHHHHHHHHHHHHGHHHHHHHHHHHHHHHHXC>>>?>>?A>>??>>??CCA???C?????????C?CC??CCCC??CCCCCCttC?CCClCCClC?CCCCCClCCCCCCCCCCClCCC?CCCCCCCCCCC?CCl?C?ClCC?CCCCCCCCC?C?C?????C??????>???>??>Cxƒx]]ZZBAAAAAAAAAAABBBZZZZ]_#9#=55565"HJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJHVC>>=>>???>>>???>??????CCC??CCCC??CC??CCCCCCC?lCCCCCtCCCC??CClCCCCCCCCCCCClllCCCCClClCClC?ClCllCCCCC?CCClCCCC?CCC?CC?CCCClC???CC????>>>?C??>?CtzÃ]ZC?A>=>>?=====>=>=====================@BZ###=55875"YC???>>>?>????>?????CCC??CCCCCCCC??CC??CCCCCCCC??CCCttllCCCCCCCClCCClClllCCCCCCClCCCCCCllCCCClClCCCCC?CCCCCCC?CCC?CCCCC???CC?C????CCCCC?>??tzttCA?>>A>>>>==>>>>>>>=======================$==$==B]# #=55665"YC>A>A>>?????C?????C??C???????CCCCC?CCCC?ClCCCCCCCClttCCClClCCCCCCCClClCCCClCClCClClllCCCCClClCCCCClCCllCCCCCCC?CCC?CCCCCC??CCC??C?C?>>??]ɔ]C??>>??>>>>>>>>>>>>>======>====================$==$$$$===Z# #  =55565""""""""""""""""""""""""""YC>??????C?????CCC??????C?CC?CC?CCCCCC?CCCCCClCCCCCCttCCCCCCCllCCCCCCCCClCllllCCClCCllCCCCClCCCCClClCCClC?CCCC?CCCC?CC?CC?CC???C???CC??ûtC????A>?>>>>>>>>>?>?>>>>>>>>A>>===>>======================$$==B# ;=57555"TTTTTT"T"TT"TT""T"""""""""""""""TTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTXCA???A>??>??C???CCC??C?C?CCCCCCCCCCCCCCCCCCCClCCCCCttlCCCClClClCCCllllClCCCClllllCClCClllCCClCClCCCCllCCCCCCCCllCC?ClCCCCCC?CCC??CCCCx??????>>A>>>>>?>>?>>>>>>>=>>>>>>>=>=>==============$=$===$$$$$$$$$$Z# #=555777;XVUVVXXU:V@VTV:#:VT:VTTT@YT::T:;T:##:TT####:TT#:T#TTT####TT#T#T##TTTTTTTTT###TT#"""""""T""T""""T"TT""T"""T""TT"T""""T""T""T""""T"TT""T"""T""TT"T""""T""T""T""""T"TT""T"""T""TT"T""""T""T""T""""T"TT""T"""T""TT"TTXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXYXXX[C?>A?????>??C?????CC?CC?C?CCCCC?CCClClCCCCCllCCCCCCltlCClllClCCClClllllClllllCllllCllClCCllCClClllCCllCCCCCCCCllCCCCl?ClCClCCC?CC??ltCC??A????C>????A?>>>>=>>>>?>=>===>>=>>=====================$$=$====$$$B# #=55556577777777777777777777777777777777777777877777777777777$77$77777777$77777777777779TTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTT97777777$77$$77$7$777=77787$777$7=7$7CC?????????????CCC??CCC?CCClCCC?CCCCClCCClCCCCCCCCllttlCCClllllClCCCllCllCCClCllClCCllCllllClllClCllCCCCCCllCCCCCCCCCCCCCCCCCCCCCC?CyCC??C???C?CC??>>??>?>>>?A>>>>>>>>>>>=>>>==>>================$===$===„=$=# #=5555556755555555555655555755577555575557855555775555755555555555555555555555555755555555555$############;;########################################################################;###########;########;###############=55655555585557555555555555557555555555CCC?????????CCC??CC?CCCCCCCCCCCCClCCClCCClClCClCCCClttlllllllClllClCllCllllCllllllllllClllllClClCClllCClCCClCCClCllCCCCCCCClCCCCCCCCt??lytC????A?CC?A???>???>?A>>>>>?>>>>>>>>======>>================$$==@_$B# #=5555578555555555555555555555755555555755775555575575556555555557756555555555555555555575555557755575555557755575575755555557755555555575555555555755555555555555577555577557557755775755555555555556755777555755555555555556555557755755555555555555556575555555CCC????C?CCCCCCCC?CCCCCC?CC?ClCClCCCCCCllCCCCCClllCCttllllCCllllCllllCCllllCllClCllllllllllCClllllCllClllCCCCClCCCCCCCClClCCCCC?CCCtCCt{C????CC??A???>>???>???>>>>>>>>>>>A>==>>==>=====>================[# #=5555555555755555555555555555555555555555557555575565557555555555555555555555555555555555555555577555655555555557555555555677755775555555555557555555557555565555555655575555575555555555755555555755665555555555555555555555555555555557555555555557555555586CC????CC?C??CC??CCC?CCCCClCCClCCCCCCllllllCllllllllCutllCllllllllllllllllllClCllllCllllllllCllllllCClllClllCllllCllCCCCllCCCClC?CCCllCtC??C?CCA???>?ACC>??>?>A?>?>??>>>>>>>>>==>==>>===================# #=5555555555555755555555555555555555555555755557555555555555555555555555555657555755555555555767555755555555555555575555555555555775556555555555555555555755555555555555555555555775555555755555555555555555555555555555555555555555555555565575555578557CC?>?CC??CCCCCC?CCCCCCCCCCCCCCClCCClllCClCCllCCllllCutlllllllllllllllllllCCllllllllllllllllllllCClllllllClllClClClClCCCCCCCCCCCCCCCCzCCCC?C??C?>CC>?C?A?>A>??A>>>>>>>=>>==>>====>>======>============$Z# #=55555555557555555555555555755755555555555555555755555555575555555555557555555555555555555555555555755555555555555555555555555555555555555555555555575555555557555555555555555555555555767555555555555555555555575555555555555555555555555555556555ClCCCCCCCCCC??CCCCCCCllCCCClllCCClCCClllCClllllClllltulollClllllllllClllllllllllClllllllllClllllCCllllllllllCCllClllCCCllCClCCClllCCtCCCCCC??C????AC>>??>>>>>>A?>>>>>>?>=>>==>>====>===>>=============B# #=7555757755555555555555555555555555555555555555555555555555755555555555555555555555555555555555555555555555555655555755555555555555555555555555555755555555555555755555555755555555555555655555555555555555755555555555555555555555555555555555555CCC?CCC?CCCCCCCCCCCCClCCClClCCCllllllllllllllllClllluuCllollllllllllllllllllllllllClllllllllllllllllllllllllCllllCllllCCllCCCCCCCCClCyzCC?CCCCCCC??C????C?????>>??A>>?A?A>>>>>>>>=>>>>==================]# #=5555555555555755555555555555555555755555555555555555555755555555555755555555555555555755755555555555555555555575555555755575555555555555555555555555555555557555557555557555555557555555555555555555555555555555575555555555555555555555755CC??C??C?CCCCCCCCCCCCCCCCCllCCCCllCCClCllCCClllllllluuCllCCllllolooolllllloooolllllllllllllllllllllllllllllllClCClCllllllllCCCllCCClCCtuCCC??CCCC??lC??CCC??AC?A>>A>?>>>>>>?>>>>=>>>=>>==>===============# #=55555555555555555555555555555755555557555555575557555555555555555555555555755555555555775555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555565755555555755555555555555555775555555555555555555555575Cl?>C?CCCCCCCCCCCCClCClCllCCllCllllCllCClllllolllllluullllllllllllllllllllllllClllollllllolllllllllllllllllllllllllllllllCCllCCClCCllCCt{CCCC?lCC???CCC?C?C??>>?A???>?A>?>>>>>>>>>>>>==>====>============Z# #=5555555555555555555555555555555555555555555555555555555555555555555555555575555555555575755575555555555555555555555555555555555555555575555555555555555555555555555555555555555555555555555555555555555555557555555555555555555555555555555CC?CCCCC?CCCCCCCCCCCCCllCClClllClCllllllllllllllCllluullllllolllllloollolllllllllllllolllollllllllllllllllllllollllllllllllllllllCClClllylCCCCCCCC???CC???C??C????C??>>?A?>>>>>>>>>>>=>>>==>=>==========># ;=5555555557555555555555555755555555555555555555555555555555555555555557755555555555575555555555555555555555555555555555555555555555555555555555555555555555555555555555555555755555555555555555555555555555555555555555555555555555555555ClCCCCCCCCClCCCCClClllllClCClCllllllllllollllllllllluullllllllllllollllollollllollolllllllllllllllllllllllllllllllClllllllCClClCClClCClCC{CCCCC?ClCCC????CC??C??>>????A?A?>>>>>>>>>>>>>>>=>==>=>========x# #=555555555555555555555555577557875555555555555555555555755555555555555555555555555555555555555555555555555555555555555555555555555555555755555575555555555555555565555555555555555555555555555555555555555555555555555555555555555555ClCCCCCClllCClCCClCllCllllCllClllllllllllolllllllllluullllllllllllllolloloollllollllllllllllllllllllllllllllllolClCllllllllClllClllllCCllutCCCCCCCC?CCCCCC?C?????A?????>>>>?>>>>>>>>=>>>>=>=>>=========B# #=55555555555555555555557?vC555555555557555555555555555555555555555555555557555555555555555555555555555555555555555555555555555575755555555555555555555555555555555775555555555555555557555555555555555555555555555555555555555555555ClCCCCCCCCCClCCllClllClllllllllllllllllllolllllolllluullllllollolllllllollllooloolllllllllllllllllllllllllllllllollllllllllllllllCllClllCllCCCCCCC?ClC?CCCCCCCCCC?????>?????>=>>>A?>>>>>>>==>=========# #=55555555555555555755557CyC5555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555ClCCCCCCCCCClllCllClllllllllllllloollllllllllllolllouulllllloolollllolllllllooolllloloolllolllllloolllllloolllllllllllllllllllllllClCCCllluyllCCCCCCCClCCCC?CC??>?????????>>?AA?>>>>?>>>=>>>>==>======Z# #=55555555555555555555555555578755555555555555555555555555555555555555555555555555555555555555555555555555555555755555555555555555555555555555555555555555555555555555555555555555555557555555555555555ClCClllCClCCCllClllllllllCllllllllllolllllllllolollluuoooooooolooololloololllolllollooolllollllllllollllllollloolllllllllllllllCllllllllCClztCCCClCCC?CCClCCCCCC??C???>??A>>>>>>>>>>>?>>>=>==>>=>=>>=># #=5555555555555555555555555577555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555575555555555555555555555555ClCCCCCCCllllllCllllllllllllllllllllloooollllllllllluullloollolloolooooolooooooooooolooolollooolollloollllllllollollllllllllllllClllllllllllCClCCCCC?C??C?CC?C???AACC??CC???>?>>>>?>>>>>>>=>>>======z# #=5555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555557555555555555555555555555555555555ClClCCllllCllllClllllllllolllllllolllllloolololllloluuloolllloololllooooopoooolloollooolooolooloollollollloolllloolllllllllllCllllllllCClllluylClCCCCCCCCCC????CC?C?????>????>C?>>>?>>??>>=A====>>>>B# #=5575555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555ClCCllllllClllllllllllllllllollllllollllollllolooooouulopolloooolooooooooooololooooollllloolloooooopooloolollolololllllolllllllllllllllllllCC{tCCllCCClCCClCCC?CC??CCCC??????>?>>>>>>A>>>>>>========# # =5555555555555555555555555555555555555555575555555555555555755555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555ColClCllllClllCllllllllllllllolllllolooololooolllloouuoooooloooooooloolooooloooolooooooolloooollooloololoololllolollolllllllollolllllllCllllCllllllClCCCCCCCC?C?CCCCC??C?>?C?A?AAA>A>>>>>>>>>>>=>>_# #=555555557555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555557555555555555555555555555555575555555555555555555557555555555555555555ClCllllllCllClCllllllllllllllllllolloolllloooooopooouuloooooooloooloollpoooopoooopoolooopoooooooooolooloooooolooolllllolllollllllllllllllllllluylCCCCCCllCCCCCCCCCC?CCC?CC????????>>?>>>>>=?>>>>>=C# #=5555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555CllllllllllllllllllllllllolllllloololllllooololooooouuooooooooloooooooopoooooooooooooooooooloooooooopplolooooooloolooloolllolllllllllllllllllllyollClCCCCCCCCCCC?CC????CCCC??????A?>A>>AA>>>?>A>>># #=555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555ColCllllllllllllllololllololllllloollllooooooolooooovuoooooloooooopopoopooplopoopoopoooopooooooolooooooplooooolloolloollloolllloloolllllllllllllllCllCCClCCCCCCCCCCCCCCCC?CC?CC????>>C?>>A>>>>>>t# #=55555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555ColClllCllllllllllllllllolooloooooollooolooooooooooouuoooooopopooppopoppooppppooooooooooooooopoolooooloolpoolloolloooolooolllllooooolllllllllllloyClllCClllCllCllCCCCC???C?CC?C>??>??AC?>>?>>>>>A# #=55555555555555555555555555555555555555555555555555555555555555555557555555555555555555555555555555555555555555555575555555555555555555555555555555555555555555555555555555555?llllllllllllllllllllollllllooopoooolooooooooolooooovvpooppooooopooopopooopoppooooopoooooooloooooopooooooooooopoooopolollolloolllllllllllllllllllyulllllllCllCCCl?CCCC?CCCC?C?>?????>>A?A>>>A>>>x# #=555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555?olllllllllllCllollolloollololloooooooooollllooooooouuopooppppppppooopopppoppooopoopopppoppoooopoooopopoopoooooopololooollolooloollollolllllllllllCClClCCCClCCCCClCCCCC?CCC????C????????>>?A>>C# #=55555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555?ollClllllllllolllllllololllooolooopoooloooooooppooovvopppooppooopppopopppoopopppopoppppppopppopoooopoopooooooooooopolopooolollollllolollollllollllyllCCllCllCClCCCCCClCCCCC?????CCA???????>>?A# #=555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555755555555555555555555555555555555555555555555555555555ClllllllollllllllollllooloooolooolooopooopopooooopoovvooppoopoopoppooppooopppppoppoppppoppoppppoppppooopppopoppoooooooolopoolooooolllllllllllllloolutlllllCCllCCCCCCCCCCCC?CC?CC?CC??>?CC??>?>]# #=5555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555ColllllllllllllllloolllooooooooopoooooooooopopoooopouvppppooppoppppppppppppppppppopopppoopppoppppoopppopooopoooopooooopooooppooolllpolllllloloollllllllllllllllCllClCCCClCCCCCCC????????>?>?A# #=55555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555CollllllllllllllloooloolooooooooopooooopooopopooopppvvppopppoppppppvppoopppppppppoppppooppppppooppppoooooppooopoooppppooopoooollooloolllooloollllolloyllllllCClCCClllCCCCCCC?CCCC???A?C??A???z# ;=555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555AollolllolllolllooloooooooloooooopooopoooppooppppoppwvppppppppppppppppppvpopoooopppppvppppppppppppppoppppoopppooooopoooooooooloooolllollllollllolllllyulllllllCllCCClCCCCCC??CC?CCCC??C????>t# ;=5555555555555555555555555555555555555555555555555555555555555555555555555555555555555555557555555555555555555555555555557555AoollloolllolooolllooooooooooppooopoooopppppppoppppovvpppppppvpppoovvppppoppppppppppppppppppopopppppppoppopooopppooooopoolopoooooloooololoollllolllllloCllllllCCllCCCCCClCCCCCCCC?CCCCC>???# ;=55555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555CoolllllllllloooloolooollopoooopoopppooppooppooppppovvpppppopvvpppppppppvppppppppppppppppppppppoppoppppppppppoppppooppppooopopooooooooooollollooollloluyllllllllClCClCCClClCCCCCC??C?????>?t# #=555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555Colllllllllolooooooooooooopoooopoopppppppoppopppppppvwpppppoppvpppppppppppvpppppppppppppppppppppppopppppoppoppppppppppoopppoooooooooooooooooolollllllol{oolllCllllllllCClCClClCCC?CCC?????C# #=55555555555555555555555555555555555555555555555555555555555555555555555555555555555CollllolllloooolooooopoooopooopoooppoppppppppppvppppvvppopvppppppppppvpppvpvpvpppppvpppppppppppppppppopppppppopvooppppppoopopooooooooooololoollllllloollollllllllCllllCCCClCCCCCCCC?CC???y# #=55555555555555555555555555555555555555555555555555555555555555555555555555?ololloololoolooppoooooppoppppppppppppppppopppppppppwvppvppppppppppvpppppvpvvpppvvvvpvvppppppvppppppppppppppppppppopooooppppopoooooolooooolloollollllolluulllllllllCCCllCCCCCCCCCC???C???C# # =55555555555555555555555555555555555555555555555555555555555555555CololooloooooooooooloooooooppooopppppopppppvpoopppppvwpppppppvppvppvppppppvpppvvpppvopvpvvpvppppppppppvpppppvpopppopoppoppoppooppoooopooppoooooloolllllollllllllllllllCClClClCCCCCCCC??Cz# #=555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555Collllpooooolooooopopoppoppoppoopoopoppoopppppovppppwvpppvpppvppppppvvpvvpppppvpppvvvpvpvppvppvppppppopvvpppvppvppppppooooppoppppoopoooooooooooopoolooollo{llolllCllCllllCClCCCCCCCCC???t# #=55555555555555555555555555555555555555555555555555555555555555555555555555555555555555?olloooloopoploopppooooooopppoppppppppppppvppvpvppvpvwpvvvpvvvppvvvppvvpvpvvvpppppvvvvppppppvpppvppvppppppppppvppppppppppppppoooooppoopoooooooollllloolollyolllllllCClllllCClCCCCClCCCCC# #=5555555555555555555555555555555555555555555555555555557555555555555555555555CollooooooolpoppoooooppopppooopoppppppppppvvppppppppvwpvvppppppvvppppvpvpppvvvvpvppvvppppvvvppvvpppppvvppppppvpppppvppppppopppppoopppoppopoopooollololllollolllllllllllllllClCllCC?CCCt# #=5555555575555555555555555555555555555555555555555555555555555555555555555555Aoooooooooooooopoppppppopppppppppopvvvpppvpppvvvpppvwwvvvpvvvvvvvv|vvvpvvppvpppvvpvvvppppvvppvpvvpvvvvvppvppppvppppvpppppppvpppopppppopppooopoopolooooololluuollllllllClCCClClCCCCCCCCC# #=55555555555555555555555555555555555555555555555Aoooloooooooopppoopopppppoppvpppppppppvvpvvpppppvpppwwvvvvpppvv|vvvppvvvvvvvvvpvvv|pvvvvvvvvpvpvvvvpppppppppvpvppppppopppppppppppopopoppoopopoopooolollooloollllllllllllClllllCCCCCCCt# #=55555555555575555555555555555555555555555555555Aoolooooooopoppppppppppppppppppvvpppppvpvppvvvppvpvvvwvvvvvvvppvv|vvpvvvvvvvvvvvvvvvvvppvpvvpvvvppppvppvvpvvvppppvvpppvppppppppppppppoppopoopoooooooooooollouyolClllllllllllllCCCCCCCC# #=555555555555555555555555555555555555555555?poooooooooppoopppoooopvpoppopvpppppvppppppppvpvppvvwwpp|v|vvpvvvvvvpp|v|vvvvvpvvvvvvvvvvppvpp|vvppvvppvppvvvvvvpppppvpvpppppppppooppopoopppppoooooooooooloooolllolllllllllClCClllCCt# # =55555555555555555555555555555555555555555555Apooooooooooppopppoppppppppppppppppvpppvpppvpvpvvvvvwwvvvpvvvvvvvvvvvv||vvvwvvvvvwv|pv||vvvvvvvv|vvvvppvvvvvvvvvppppvvopvppvpppppopppppppopppooooooooooloooloouollllllllllllllllllllC{# #=55555555555555555555555555Apopoopppoooooooopoppppppppppppvpppvvpvvppvpvvv|vpvvwwvvvvppvvvvw|||vvvv||vvvv|vwvvv||vwvvpvvvvpvwvpvvvvvvvvvvvvvpvpvvvvwvvppvvpppppppppoooopppppooopooloolloo{ooollllllCllllllllCClC# ;=55555555555555555555555555555555Appooooooopppopppppppppvvvpvppppvvvvvpvvvpvvpppvvvvvww|vvvvvv|vwvvvvvv||vvvvvvvvvv|vvvv|vvvvv||||v|wvpvw|pvvvvwv|vwvpvvvvvvvvvvpvvvvvpvvvpvvppppppppoopooppuoouoooolllllllllllClCCCll# # =5555555555755555555555555555555555555Cppoopoopppppppppppppppvppppvvppppvvpvvvvppv|vvpvvvvwwvvvw|vvwv|vw|w|vvvvvvvvw|vvv|ww|vvvvwwwww|wwwwwvvvwvwwwvvvwwvvwwvwvvwwvvvvvwvwwvvwvpvvvvvpppppoupuoppopopooolloololllllllllCllu# #=5555555555555555555555Apooloooppppppppoppppppvvvvpvpppvpvvpvvpv||vvv|||vvvwwvv||v|vv|wvvvvvvvvw|wwwvww|wvwwwww}wwwwwwvvwwwwww}}}www}wwwwwwwvwwvwwwwvvwvvvvvvvvwvvwvvvvvvvvvvvvvupopuu{uoppoooolllllllllllClu# #=555555Cpppopopppoopppvpvppppppppppvpvvpvv|vvvvv||v|vvvpvv|wwwvvvvw|||vv|wwwwwwwwvw}}}}wwww}www}wwwwww}w}w}}}w}www}ww}}wwwwwwwwwwwwwwvvwvvvvvvvvvwwvvvvvvvvvvvvppwpvuuy{uuuuuooouolooollllllt# #=555555555555Apppoopppoopppopppppvpppppvvv|vvvwvvvp|wvvv|vp|vvv|vww|v|wwvv|vwvwwwwwwwwwww}}}ww}}www}w}w}}w}}}}}}ww}}ww}}w}}wwww}ww}ww}www}}w}wvwwwwwwvvwwvvvvvvvvvvvpvvuvvpvyvupvvuuoopooooloolllu# #=5555555Apppoppopppppvppppppvppvppvvvvvvvvppvvvvvvvvvv|v|vv|ww|www}ww}w}w}w}w}w}}}}}}w}}w}}}}}}}}}w}}}w}}}}}w}www}wwwwwww}ww}wwwwwwwww}wwvwvwwwwvwvvwvwvvwvvvvvvvvvvvvvvvuuuuuuuuuuuuuuuuoou# #=555555Appppppppppppvpppvppvppvpvvpvvpvpvvvpwvvvvvvv||vwww|w}wwwwwww}}}}}ww}}w}w}}}}}}w}}}}w}}}}}}}}w}}w}}w}}}ww}w}}w}}}}wwwwwwwwwww}wwwwwwvwwwwvwwvvvvvvvvvvvpwvvvvw{vvuuvvuupuuvpuuuuuouu# #=555555?ppopppppppvpvvpppppvvppvppvvvpvvvv|v|vvvvvvvw||vvw|}w}}w}}}w}}}}w}}}}}}}}}}}}}}}}}}}}}}}}}w}}}}}}}www}}}}}}}w}}ww}www}wwww}wwwww}wwwvwwwvwwwwwvvvvwvvvvvvpvpvvvvvvvvpupuuupuuuouuuu#!#=55Avpppvppppppppppvpvvpvppvvvvpvvq|vv||v|vvw}|vwwwvwww}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}w}}}}}}w}w}w}ww}}ww}wwwwwwvwwwvwwwwvvwvwvwvvwvvvvvvvvvpvvuupvuuuuuupuuuuuuy#!#=Appppppppvppppppvvpppvvvvvvpvv|vvpvv|wvww}wwwwwww}}w}}}}}}}}}}}}}}}}}}}}}}}}}}}}}w}}}w}}}}w}}}}w}}}}}}w}}}}}}ww}}wwwwww}wwwwwwwwwwwwwvwwvvvvvvvvvvvpvvvuuvvuppuupuouuuuupu# #=5Apppppppppppppppppvvvpvvvvvvvv||wvwwvww}ww}w}w}}}w}w}}}w}}w}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}w}}}}}w}}w}}wwwwww}wwwwwwwwwwwwwwwwwvvwwwwvvwwvwvvvvvwvvvvvpvvpuuuuvuuuuuuuuu{###=Apppvppppvvvpvppvvvpvpvvpvvvwwvvwwwwww}w}www}}}ww}}}}}w}}}w}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}wwww}}}ww}}}}ww}wwwwwwwwvwwwvvwwvvwvvwwwvwwwwvpvvpuupuvvppuvpupuuoouu{# #=Appppppppvppvvvvpvvppvvvvwvvwwwwwwwww}}ww}}}}}}}w}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}w}}}}}}}}}}}}}}}}}w}}}}}}}www}w}}ww}wwwwwwwwvwvwwwvwwv{vvvvvvvvvvvpvvuuuuupupouuvyy{# #>Avpppppppppv|vvvvp|vvvvwvww}w}ww}}}}www}w}}}}}}}}}w}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}w}}}www}ww}wwwwwwwwvvvvwwwwvwvvvvvpvvppvpvuuvppuuuuuuoououtu# #=Avppppppppppwvppvv||wvwwwww}wwwwwww}}}ww}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}w}}w}}w}w}}}w}}wwwww}wwwwwwvwwvvwv̞{wvvvvppvvvvpvvuvpppuuppuuuuuuuuuoo{###=Apppppppvvppvvvvvwvwwww}wwwww}}w}}w}www}}}}}ww}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}w}}w}}}}}}www}}w}}}}}wwwwwww}wwwww{wwvvvvvvvvvvvvvpvvvvvpvupuuuppouuuuuuuy# #=Avpppvpvvvv|vvwwvvww}wwww}}ww}}ww}}}}}}}}w}}}w}}}}}}}}}}}}}}}}}}}}}}}}w}}}}}}}}}ww}}}ww}}}}w}}}}www}wwwvwwwwwwwvvwvvvvvvvvvvpvvvvvvpuvppupuuuuuuuuoouy# ;=Appvvpvvvvvwwvw}}wwwww}ww}www}}}}}ww}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}w}}}}}wwwww}w}wwwwvv}wwwwvvvvvvvvwvvvvvvvvvpvvpvpppuupuouuuuuuuy#!#=Avpvvvvvvvvvwwwww}ww}wwww}}ww}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}w}}}ww}}ww}www}wwwwwwwwwwwwwvvvwvvwvvvvvvvvpvvvppuvpppuuuuuuuuouoy᝛#!#=Avvvvvvvwwwww}wwwww}}ww}w}}}}}w}}}}}}}}}}}}}}}}}}}}}}}}}}w}}}w}}wwwwww}}w}}w}}wwwwwwwwvwwwvvvvvvvvvvvvpvvvvvpvppupouuuuppopuuuuϝ# #=Awvwvw}wwvwww}}ww}ww}}w}}w}}}w}}}}w}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}w}w}}}}}}}}}www}}}vwwwwwvwvwvvwvvvwvvvvvpvvppvvvpvuvpupvuuuuuuuuuǃ9 #=Awvvwvwww}wwwwwww}ww}ww}w}}}}}ww}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}w}}}}ww}}}}}ww}wwww}wwwvwwwwvwwvvvvvvvvvvpvvvpvvpvupvuuuppuoupu{9##=Awvwwvwww}}}}}www}}w}}}}w}}}w}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}w}}}}w}wwww}w}}wwwvvwwwwwwwvvvvwwvvvvvvvvvpvvvpvvvvuuuppuuuuuɆ; #=Awv}wwwwww}wwwwwww}w}}}}}}}}}}}}}w}}}}}}}}}}}}}}}}}}}}w}}}}}}}ww}}}}}}}wwwwwwwwwwvwvwwvvvvwvvvvwvvvvvvvupvvppvuupupppup{# #=A}wwvwww}}wwww}w}}}}}}ww}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}w}}}}}}w}}}}wwww}}}w}}ww}wwvvwwwvvvvvvvvvvvvvvvppppvvupuuuuuupuo{;#;=Awwwwwwww}ww}w}}}}}ww}}w}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}www}ww}}www}vwwwwvwwwvwvvvvvvvvvvvvvvpvpvpuuuuuuupu{#!;=Awww}wwwwww}w}ww}}}}w}}w}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}w}}}}}}}w}}ww}}}wwwwvwwwwvvwvvvvvvvvvvvvvvvvppupupvpuuuuupy##;=Awvvwvwww}}ww}ww}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}w}}}}}}}}}}}}}}}}}}ww}}}wvwwwwvvwwwwvwvvwvvvvvvpvvvvvvppvupuuuuy##;=Awvwwwwww}}ww}ww}}}w}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}ww}}}wwww}w}wwwwwwvvvvvvwwvwvvvvppvpvvppupuuupuupuyzt##; >Aww}www}}ww}}}}}}}}}}}}}}ww}}}}}}}}}}}}}}}}}}}}}}}}}}w}}}wwww}}wwwvvwwvwvvvwvwvvvvvvvvppvppuuvvvpppouuyullt99#=Awww}ww}ww}w}}}}}}}}}}}}}}}}}}}}}}葀}}}}}}}}}}}}}ww}}w}w}}ww}wwwwwwwwwwvwwvwvvvvvvvvvpvvvvpvvupupouuyyltCltu##;=Aw}w}}wwwww}}w}}ww}}}}}}}}}}}}}}~葀}Ґ}}}}}}w}}}}ww}}w}wwwwvvwwwwwvvvvvwwwvvvvvvvvvvvvvppvpuopvpytllllttt##;=Aw}w}}}}}}}}}w}}}}}}}}}}}}}}}}}}ٙ}}}}}}}}}}}}}w}}}}wwwwwwwwwwwwwwvvvvwvvvvvvvpvvvpvpuvppppuuyyttllllCCCl#9;=Aww}}}ww}}w}}}}}}}}}}}}}}}葑}}}}}}}}}w}}}w}}}}}wwwwwwvwwwvwvvwvvvvwwvvvpvvvvpppvvvpuvp{{ttltllllClClt;9;=A}}}ww}}}}}ww}}}}}}}}}}}}}}}~}}葀}ߜ}}}}}}}w}}}w}}}}}}wwwwwwvvwwvvwvwvvvvvvvvvvvvvuuvupvuuuuoltltlCtllllllz9#;=A}w}ww}ww}}}}}}}}}}}}}}}葀}}}}}}w}}}}w}}ww}wwwwwwwwwwwwwvwvwvvvvvvvvvvvpvvvppuuuvp{ottltouttlClllCCC;!;=Awww}}}}w}}}}}}}}}}}}}}}}}葀}}}}}}}w}}}}}w}}w}wv}wwvvwvvwwwvvvvpvvvpvvvvvpvpppvp{uototlCllllltolllllt9#;=Aww}}w}}ww}}}}}}}}}}}}}}}}}葀}}}}}}}}}w}}w}wwww}}wwwwwwwvvwvvvvvvvvvvvvvvvvvvppupuyytooooltlttlloltClllCC;#; =Aw}www}}}w}}}}}}}}}}}}}}}葀⑀}}}}}}}w}}w}wwwwww}ww}}wvvwvwvwwvvvvvvvvvvvvvvpvvvpyooololltttullttltCltlClt;9;=A}}}}}}}}}}}}}}}}}}}}葀}}}}}}}}w}w}wwwwwww}www{džvvvvvvvvppppupuuyyoloutotoltllllltlllltCllCu;9;=B}}}}}}}}}}}}}}}}}}}}}}葏߀}}}}}}}}}ww}}wwwwvwww̆vvvvvvvpvvppppw{uououtttolllotltltllllllClCl;9; =A}ww}}}}}}}}}}}}}}}}}葑}}}}ߜ}}w}wwwwwwwwvwwʞvvvvvvvvpppvpuuoopuuoluooollltlllllltlllllllt@9;=A}}w}}}w}}}}}}}}}}葀׀}}}}}}}w}}www}}www}vvvvpvvvuppvvyouoouooooulooluolltllllllllCCClCu@9; =B}}w}}}}}}}}}}萀}}}}}}}wwwww}}wwޛw߆vpvvvppuvupuޔupouooooooototoltoolutllllllClCCClC@;@ ! =A}w}}}}}}}}}}}}褑}}}}}}}}}}}}}}wwwwwwvwwwwwvvvvvppvvvvpuyvpoovuopuuouuoolooltllltotlClttlCllCCl@;@!  >A}}}}}}}}}}}}}}葑~}}}}}}}}}}}}}w}wvwvvwwww{vvvvvvpvppuvvoopouuuuuppouoooooutllltllCllllCCllllly@9@!! =B}}}}}}w}}}}}}}}}葑Ҁ}}}}}}}}}}}ҙ}}}}wwww}}wwwwvwvvpvvvppvvoppopuuopooooolluoluoollloulllllttlllCCCCC@;@!! ! =Aw}}}}}}}}}}}}}}~葑耀}}}}}}}}}}}}}}}w}}w}}}}wwvwwvvvvvvvppuupupvopuoupuopooooolllttoltolllttllCltCClCt@;@!!! ! =A}}}}}}}}}}}}}}}}}葑}}}}}}}}}}ww}w}}w}}w}vwwvvvvvvpvvvvvpppppuuuppoopuoooollllotolllltlllllClClCClz@;@!!! ! ! =A}}}}}}}}}}}}}葑}}}}}}}}}ww}}}}www}wvw}wvwwvvvvvvvvvvpvvvvpuuuupuuooopooloooollolltlllCCllllllCllC@;@!!!!!!!!! =@}}}}}}}}}}褑~}}}}}}}}}w}}}}}}ww}wwwwvwwwwwvvvvvvvvvuppppuovoppooopoputoooooolooolllClCCllCCClClCt@;@!!! !!! =@}}}}}}}}}}}褑ّ}}}}}}}}}}}}w}wwwwwww}wvvvvvvvvvppvvvpppvpooooouoouooooootlllollllllllCCCClCCCC@;@!!!!! ! ! =@}}}}}}}}}}}}~蒑}}}}}}}}}w}}}}}}✆}wv}wvppvvvvvpvvvpppvupuppuououuooooolollloltlllllllllllCClll@;@!!!!!! =@}}}}}}}}}}}~餑}}}}}}}w}}}}}}}}}}{wwwwvvvvvvvvpvppvvvpoupppuppuououlooollollllllClCllClllCCCCt@;@!!! !!! =B}}}}}}}}}}~餑}}}}}}}}}}w}www☐{wwwvvvvvvvpvvvvvvppopuoouuooooouooooloolollllllllllCllCCCCCCC@;@!!!!!! !  =A}}}}}}}}}~}}}~~褑ّ}}}}}}}}}}}}}}w}}ߐw߆vvvvvvvvvvvvvpvvvupvuppuopppouuoooooollllllCltlllllClCClCCCt@;@!!!!!!!! !  =A}}}}}}}}~褡}}}}}}}}}}}}}}}}}}}}نvvvvvvvvvvvppppvppvuppuoooooooooooouoolollllllCClCCllCCClCCCCx@;@!$!!!!!  =@}}}}}}~~蒑ؑ}}}}}}}}}}}}}}}}}}wߝwwwvvvwvvvvvvvvvvvpppppvpppoooooooolololotttllllllllllCClCCCCCCC@9@!!!!!!!!!!! =@}}}}}}}}}~~褑}}}}}}}}}}}}}}w}}}טwwwwwvvvvvvvvvvvvvvvpvpvvppoupopoptooloooltllllllllCClllCCllCCCCCC]@;@!!!!!!!!!  =A}}}~蒑ӑ}}}}}}}}}}}}}}}}}}wwwwvvvvvvwvvvvvvwvvppvppvvpppupupoopooouoolollloltlltllllllllCCCCCC?CC@9@!!!!!! ! ! =@}}}~褑񤑑}}}}}}}}}}}}}}}}}wwwwwwwvvvwwvvvvvvvvvvvvpuvpuvpopvoopuoooooooolollolllllollCClCCClCCCCCt@;@!!!!!! ! !! ! =  @}}}}~}~钑ӡ}}}}}}}}}}}}}}}www}w}wvvwvvvvvvvppvvvvpppppppppoooulooooollooolllltlClllCllCCCCCCCCCC@;@!!!! ! ! =  @}}}}}~~顡餑~}}}}}}}}}}}}}}}}}}}}wwwvwwwvwvvvwvvvvvvvpvppppoopuouuuoooooooloutolllllllllllClCCCCCCCCCz@;@!!! !!! ! =   @~}}}~~颡ӡ}}}}}}w}w}}w}}wwvvwwvvwwwvvvvvvvvpvppvpvppppooooooooollouolooltlllllllllCClCCCCCt@;@!!! !!!! !! =  @}}}}}餑}}}}}}}}}}}}}}}w}}w}ww}wvvvwwvwwvvvvvvvvpvpvvvpppppppooopoouoltooollllllllllCClCClCCCl@;@9!!!!!!! !  =   @}}}}~~餡ؑ~}}}}}}}}}}}}}w}w}w}wwwwwvvvvvvvvvvvvvvpvpppppppoppovoooooollololloollllllClllllCCu@;@!!! !!! ! ! ! =      @}}}}~~~~~褡}}}}}}}}}}}}}}w}ww}wwwvvvvvvvvvvvvvpvvppvvppppppopopoooooolllllollCllllClCClll@@@!!!! !!!! ! =   @}~}顡ء~}}}}}}}}}}}}}}w}}}}wwwwvvwvvvwvvvvwvvvvppvvpppppuoooooooooooolllllllllllClllCu@;@!!!!!!!! ! ! =   @}}}}~~}}}}}}}}}w}}}}wwwvwwwwvvvvwvvvvvvvvvpvvvppooppppouooooouololoollllCllllCt@;@!!!!!!! ! ! !  =       @}}~颡ؤ}}}}}}w}}w}ww}wvvwwvvvwvvwpvvvvvvpvpppvppppopoooouoloolollllllllllllx@;@!!!!!!! !! ! =      @}~褢鬒}}}}}}}}}}}}ww}wwwwvwwvwwvwvvvvvvvvvvvvvppppppoopoooopoooolollolllllllt@;@!!!!!! !!! =   @~~~~餡模}}}}}}}}}}}}}}ww}ww|www|vvvvvvvvvvpvvppvopvvooooooooopooololoollollo{ɝ@;@!!!!!!!!   =   @}~~~~~ॡ~}}}}}}}}}}w}}w}wwwww|vvvwvvvvvvvvvpppvppvpoouppoloooopolltlllllu@;@!!!!!!!!! !  =      @~}}}~ؤ~~}~}}}}}}}}}}}w}www}wwv|wwvwvvvvvvppvvvvvvoopuoopooooooloooloollo@;@!!!!!! ! !  >    @~~}~~~~~Ӥ~}}}}}}}}}}}}ww}w}w}w}wwwwwwvwwvwvvvvvvvppppoppoooupoooooloooololu̝@9@!!!!!! !!! =   @~~~鬤~}}}}}}}}}w}ww}}wwwvwvwwvwvvvwvvvvvpvvvpppppvppooppooouoollooooޝ@9@!!!!!! !! !   > @~~}}~~~~颡觑~}}}}}}}}}}wvvwww}wwvvwvvvvvvvvvvppvpoppooppoppppupoooooy@;@!!!! !!! !   > @~~~~~~~~~颢৑}}}}}}}}}ww}ww}wvwwvvvvvvvvvvvvpvppvppppppooooopooloooo@@@!!!9!!!!!  >   @~~~~~~룢٤~}}}}}}}}}}}}}}w}wwvwwvwvwwvvvvvvvpvvvvvppvpvppoopooooopǝ@;@!!!! !! ! ! >@~~~~~~ؤ~~~~}}}}}}}}}}}wwwwww}}wvvwvvw|vvvvvvvvvpppppppvoppooooooou@9@!!!!!!! !  =   @~~~~~~}}}}}}}}}}}wwwwwwwwwvvvvvvvvvpvvvvvvpppvpopppoopoooo;9@!!!!!! !! !   >  @~~~~~룢槑}}}}}}}}}}}}ww}wwwwwwwwwvvwvvvvvppvppoopvpopopppvpoooy@;@!!!! !! !!    > @~~~~~٤~}}}}}}}}}ww}|wwvvwvwwvvwvvvvvvvvvvppppopppupoopolpou;9@!!!!!!!!!!!   >@~~~~릣襑}~}~}}}}}}}}w}}ww}wvwvvvvvvwvvvvwvvpvvvpppppoppopoooooooy@;@!! !!!! ! !    != @~~~~룢ؑ}}}}}}}}}}}www}wwwwwvvvvvvvvvvvvwppvvvvvppppppooooouuloolo{;9@!!9!!!!!!! !!    = @~~~~~~~룣褑}}}}}}}}}}w}}wwwwvwwwwvvvvwvvvpvvvvpvppppvvopppopoouollollt{;;@!!!!!! !!! !     > @}~~~~~~룡ؤ~}}}}}}}}www}wwwwvwvwwvvvvvppvvvvvpvppppppoopppoopooolooollo@;@!!!!!!!! !!  ! ! > @}~~~~~~~~ҡ~~}}}}~}}}}}}}wwwwwwvwwwvvvvvvvvvvvvpppppvvpopppoouoopooloooololt@@@!!!!!!!! ! !!!!     =@~~~ॡ}}}}}}}}}}w}}}wwwwvvvwwvvvvvvvvppvoppppopppoluoloopollooolloou@;@!!!!!!!!! !     > @~~~~~룣ӡ~~~~}~}}}}}}}}w}}w}w}wwwwwvvvwvvvvvvpvvvpppvoppppopoopooooooolllllllllu@9@!!!!!! ! !!        >  @~~楑~~~~~}}}}}}}}}wwww}}wwww|wwvvvvvvvvvvpvvvvvvpvppppoooooolllloololllllllly@;@!!!! !! !! !      >@~~~~~~Ԥ~~~~}}}}}}}}}}}w}w|ww||wwvv|vvvvpvvvvvppvvppopopoppooooooolllllllllllClCy@;@!!!!!!!!!! ! !       >   @룢槡~~}}}}}}}}w}}w}}}wwwwwvvvvwvvvpvvvpvvpppppppooooopooootllollllllllCCllx@;@ !!!! !! !!      > @~~~~~~릣ؤ~}}}}}}}ww}ww}ww|wvvwwww|vwvvvvpvppppvpppppppoooooolooolllollllllllCClCCx@9@!!!!!!! ! !      >  @~~~~~~룢觡~~~~}}}}}}}}}w}w}}}ww}wvv|wwwvvvvvvvvvvppvvppoppoooooooolooollolllllllCClCCClCC{;;@!!!!! !!       >@~~~~룣ڤ~~~~}}}}}}}}}w}w|w}w}|wvvvvvvvvvvpvvvppppvpopppooooopollooltllllClllolllClCCCl@;@!!!!! !       >@~~릢訢~}}}}}}}}}w}w}w||||||vwvwvvvvvvvvpvppopoppopppoooooooooollllllllCClllCCCCCCCCz@;@!!!!!!!!! !       > @~~릣ڥ~~~}}}}}}w}|}wwww|wwwvvvvvvpvvpppppppppvpppppppooollollollollllCCClllCCCCCCC@;@!!!!!!!! !      > @~릣뭡~~~~~~}}}}}}}ww}wwwwvw|wwwvvpvvvvvvppppvpppoppooooooooollllllollollllllClCCllCx@@@!!!!!!!! !      = @~~~~~릣ڥ~~~~}~~}}}}}}|}}ww}||}|ww|v|wvvvvvwvvvvpppppppopooopopoololllolllllllllllCllCCCCC@9@!!! !!!!!!        >  @~~릣~~}}}~}}}w}}}}wwv|}wvvvw|vvvpvvvvvvvppppvpvpoooooooooollolllllllClClClCCCCCt@;@!!!!!!!! !!!!       >@~~~릢ꨣ~~~~~}}~}}}}w}w|}}wwww|wvv||vvvvvpvvvvvvppppoopppooooooooolllllllllClllllCCCCl;9@!!!!!! ! !!      =@~~~~릣䣣~~~}~~~}}}}}}}}|}}w}ww}ww||vvwwvvvvvvvvpppppppppooopooopoooooooolllllllllCCCCClCt;9@!!!!! !! !!! !       =  @~~~뫦䣢~~~~~~~~~~}}~}}}}}}}w}}|www|}wwwv|vvpvpppvppvpppppppooooooooollloollllolllCClClCCC@9@!!!!!! !        > @~~~~릣~~~~~~}~}}}}}}}}}wwwww|vwwvvv|vvvvv|pvvpppppppppoooopopoooollollllllllllCClCCt@;@!!!!!!!!!         >   @~~~~~릣꣢~~~~~~}}}}}}ٙ}}|vv|wwwvvvvvvvvpvvvpvvvpppppoooopooooololloollllollCllClllCC;;@!!!!!! !!       >  @~~~릦Ԣ~~~~~~}~}}ߞ}}}}vwvw}w|vwvwvpvvvvppppppppooooooopoloolllllllllllllllClluޝ@9@!!!!!! !! !       =   @~~~~릣~~~~~~~~}}}}}Ӑ}wwwwvvwwvwvvwwvpvppppppooppoooooooolollllllllllllClllCCC@9@!!!!!!!!! !!         =   @~~~릦ڢ~~~~~~}}~ǐҞٙ}wwwvvwvvvpvvvpvppppppppppoooooooooooloolllllllllllllCt@9@!!!!!!! !         >    @~~릣~~~~~ʐٞߜwww||vvwvvvpvpvpvppppppooooooolooooloollllllllCClCll@9@!!!!!!!!        >    @~~~릦棢~~~~~~}~יʘߘwvvvvvvvvpvvvpvpvvvpppooooooooloollloolllllllCCClu@9@!!!!!!!!!!          =   @~~~Ԣ~~~~觙ߞ}}}}י̐|vvvvvpvvpppvpppppoppppopololololllolllolllllClߔ@9@!!!!!!!!       =   @~~~~~~~~ٙߙ}}}}}}}}}}ٙwv|vvppvpvvvpppppppopopoloooolllllllllllllCCCu@;@!!!!!!! !        >   @~뫣ݡ~~~~~~Қ}}}}}}}}}}}w}טwwwvvvpvvvpppppppoooooloooooollooolllllllCClߔ@;@!!!!!!! !    =    @~~뫦~~~ِ}~}}}}}}}|}}w|w|w}ʜنvvvvvpppvpopppppopoooooloooollllllllllCCluޝ@9@!!!!!!!      =  @~࣢~~~~~}}}}|}}}}}}w|w}}|w|}vvvppvpppppppppooppopoooooolllllllllllll̖;9@!!!!!!!!!!      =  @~~~~~릦~~~♀~~}}}}}}}|}}}w}}w}}||}pvvvvvvpopppopoppppoolllllllllllllllCCuޛ;9@!!!! ! !!      =     @~뫦~~א~}}}}}}}}}||}}}|wwv||vwvvvvpppvvoppppppooooooollolllololllllll̛;9@!!!!!!!! ! !         =    @릣آҀ}}}}}}}}}}}}ww|w}||vvw}wwwww|vvppppppppppopoooooolllolllllllllyޛ;9@!!!!!!!     =    @~뫦蚀}}~}}}}}}}}}}}}||}}w|w||wvwvw}wvpvvpoppoppooooloooolllollllllll̝;9@!!!!!!!! !         =      @~뫦䢢~~~~ב~~~}}}}}}}w}}}ww|w}}|w|ww|v|wvwpppppppppoooooooololllllllCClyϛ;9@!!!!!! !      =    @摏~}}}}}}}}}}}}}w}www|vwvv|||vvvvvwpopopooooopolooolllllllllll;9@!!!! !! !        =   @~~릦ُ~~~}~~~}}}}}}}}}}}}}ww|||w|vvwwwvvwvyvpopoooooooollllllolllll{ϛ;;@!!!!!!      =        @~뫦ڢ~~~~~}}}}~}}}}}}}}}}}w}}}}w}}wvw|vv|wwwvyoopoooooooolllllllllCl@9@!! !!! ! !   =       @뫦~~}~}}}~}}}}}}}w}}|}}||w}w||}w|v|vvv{vpopololoolollllllll{@;@!!!!!! !! !  =          @~릫꣡׀~~~}~~}}~}}}}}}}||}w|wwwvv|}vvvvvp{vooloooooolllllllt;9@!!!!! !  =       @~~~ԡـ~~~~}~}}}}}}}}|w|}}}||||www|}vv|w|||vv{ߜvoolloloollllll{@=@!!! !!! !    =                  @~~~뫫~~~~}~~~}}}}~}}||}}}}}|||w|}w||vvvvvvv}ޙulooooloolllt;9@! !! ! ! ! =                     @뫦ڢ٤~~}}~~}}}}}}}}}}}}}}ww|}||vv|vvv||vpwߘߛvllllollll;9@!!!!!! !      =                  @뫦駑~~~~}}}}}}}}|}}}}}}|w}}|wv|vv|v|vvvwߛuollllly@;@!!!!! ! !   =                                 ;뫦餡ؤ~耀~~~~}}}}}}}}}|}}||}|v}|||vwvvpvvvvߜߔullll;9@!!!! !   =                                               ;~~릦ԡ暏~~~~~}}~}}~}}}}}}}|}|}|||||}v||vvvvvpvvޝߔuly@;@!!!!! !   =                                           ;~~~뫦ґ~~~~~~~~}}~}}}}}}}}}|}||ww||vw||vvwvvvvޝ@9@! !!! !  =                                              ;릦㢡ऑ~~~}}}}}}}}}}}}|}}}}||||||||vvwvvvvdž;9@!!!!!!!     =                                                   ;~릦駡~~~~~~}~}}}}}}}}}}}}}}}}}||||v|v|vv||vpvv{;9@!!!! !  =                                                  ;~뫦ڤ~~~~~~}}}~~}}}}}}}w||}w|}|||}|vvvvvpvvp{;9@!!! ! ! =                                                 ;~~뫩槡~~~~~~}}}}}}}}}}}}}w}}}|}||vw|||vvvv|vppw;9@! ! !!!!!  >                                          ;~릦謡~~~~~~~~}}}}}}}}}|}|}w|||w}}w|||w|vvvvpppw;9@!!!!     =                            B@       ;~뫦৤~~~}}}}}}}}}}}}}}}}}}}|vvv||vvv|vpvw;9@!!! !! ! =                          !      ;~~~릦~~~~~~~}}}}}}}}}}}}}}}}}|||v|vvv|vvvvvvww@;@!!!!! !  =                                    ;릦~~~}~}~}}}}}}w||||}}}||wwvwvvvvvvvw;9@! !! ! =                        ;~릦~~~~~~~~}}}}}}}}}}}}}}}}|||}}|vvvpv|v|ppy;9;!!!!! !   =                      ;~릣~~~~~~~}}}}}}}}}}}}}}}w}}|www}v||vv|vvvvv{;9@! ! !     =               ;~릦~~~~~}}}}}}}}}}}||www}}w|||v||vvvvvv|{@9@!!!  =           ;~~릦~~~~~~~~~}}}}}}}}}}}}}|w|||||w|v|w|vvvpv;9;!!!!!  =              ;~뫣~~~~}~~}}}}}|}}}|||}w|||||vvvv|vvvvp;9; !!   =      ;~~~릣~~~~~~~}~}}}~}}}}}}}|}|}w||}||||vvv||vvvv;9@! !   =   ;~~릣~~~~~}}}~~}}~}s}}ww||}||v|w|||v||vv|vpvvp;9@! !! =    ;~~~~~릣~~~~~Ӏ~~}}}~}}}}}}w}}}w|}|w}}||w||vvvvvpvpp;9@! =   ;~~~릣~~~~~~}~}}}}}}}}}}}ww}w|}w||||||vvvvvvpp;9@!    >   ;룣~~~}~}}}}}}s}}}}|}}ww|||w|||vv||vvppvv;9@!  !! = ;~~~~~~~~~~~}}}}}}}}}}}}w}}}}};9@!!!!  = ;~~~~~~;9@!   = ;~~~릣~~~~~~~;9@! ! !   = ;~~~~~~~~~~;9@!   = ;~~~~~~~~~~~}~~}}}}}}}ww};9@!! !  = ;~~~룣~~~~~~~~~~}}~}}}}}}}}}}};9@!!!   = ;~~~룢~~~~~~}}}}}}}}}w};9@!   = ;~~~~~~~}}}}}}}}}}};9;!!!! = ;~~~~~~~~~~~}~~~~}~~~}}}}}}|}}}9@;!    =  ;~~~~~~~~~~~~~~}}~}}}}}}}w}}9@9!!  = ;~~~~~~~~~Ԣ~~~~~~~~}}}}}}}}}}}}}|}![! !  =   ;~~~~~~䢢~~~~~~~~~}~~~}}}}}}}}}}}}Z!! ! ! =  ;~~~~~~~~~~~~~~~~}}~}}}}}}}}}}99Y!! !   =   ;~~~~~~~㣢~~~~~~~~~}~}}}}}w}}}|}}}[!_9 !   =            ;~~}~~~ܣ~~~~~~}}}}}}}}}}}}www}!9 !   =     ;~~~~~~~~~~~~~~~~~~~~~~~~}}~}}}}}}}|}|};!;!! !!  !=        ;}~~~~Ԣ~~~~}~~~}}}}}}}}}}}w}|}}}@!Y! !!! !   =         ;~~~~~~~~ꭣ~~~~~~}}}~}}}}}}}}}}}}9!B9!!!!  >        ;~~~~~ݭY!!ZY!!!!   =           ;~~~~~~~~~~~~~~‚[@9!;_!!!!!!!!   =                       ;~~~~~~~~~~~~w||wvw||||vvvvvvppvpppvpppppooppooooooooolllolollllClllClCCCCCCC?C?CCA??>??>A>A>A>>===>=====>=========$==$$$$!$9@! !! !!   =                        ;~~~~~~␆{{{{{{{{{{y{{{y{yyy{yyyyyyyyyyyyyyxyyxu]xxxxxx]u]]]]]]]]]t]tt]]]]]]]]ZZZZZZZZZZZZZZZZZYYZY_[!!!! !!     =              #~~~~~~Y!!!!!!! !  >                         ~~~}~~~~~~~~~}}}}}}}}}}}ww}_9!!!!!!!!!   C                             }~~~~~~~~~~~~~~~~~~~~~~}}}}|}}}}}}w}ww||w}ȁ;!!!!!!!! ! !!  C                                ~~~~~~~~~~~~~~~~~~~~~}}}}}}}}}}}}}}w}w||ww}„[@9!!!!!!!!   ! tz                                       }}~~~~~~~~~~~~~~}}}~}}}}}}}}}}w}|}|}}|wwwwwwwvvwwvvvvvvvpvwvppovvpopoooooooopoooolllllllllllCCClCCCCCClC?CCA?CC????>>A??A>>======>>==========9$$=$9!$!!!!!!!!!!!!!!! ! !!  y_                                   z}}~~~~~~~~~~~~~~~~~}~}~}}}~}}}}}}}}}}|}||w||||||v|vvwvvvvvpvvp|vvppoppppopooooololllllllllllllllCCCCClCCCClC??C??C??>>>>>>>>>=>>=================$$$$$$$!!!!!!!!!!!!!!!!! !  Y                                              ]}}~}~~~~~~~~~~~~~~~~}}}}}w}}}}|}}}}}}}w||w}}|wwvvvpppvvpvppvpvppppppooopooooolooolllCllllllCllCClllCCCCC?C?A?>????>>>>>>>>>>===================$$$$$$$$!!!!!!!!!!!!!!! ! !! =;                                               Y~~~~~~~~~~~~~~~~~~~~~~~~~~~}~}}}}}}}}}}|w||w|}||||vwvvvvvvvvvppppppooppoopopopooololollllollllllCllClCCCCCCCCCCl?????>>>>>>>>>>>=>===>=========$$$=$$$$$$$$!$!$!!!!!!!!!!!!!! !   l#                                       ;~~~~~~~~~~~~~~~~~~~~~}}}}}}}}}}}}}}}}w}w}}}}}||||vw|||wvvvvpvvvvppvppoopppppoooopolllolloolllllllllCCClCCCCCCC?C??????A??>>>>>>==>=>>========$====$$$$=$$$$!!$$$!!!!!!!!! !!   w                                       }}~~~~~~~~~~~~~~~~~~~~~}}}}}}}}}||}|}w||||||||w||vvvw|vvvpvppppppppppppopoooloplllloolllllllllCCCCCCClCC???C????A???>>>>>>=>>>>===================$$$$$$!!!!!$!!!!!!!!!!!! ! $                                               z~}~~~~~~~~~~~~~~~~~}~}}~}}}}}}}}}}w}}}}|||||||||||wvvwvvpvvvppppppppppoppoopoolololooollollllllllClllCCCCCC???CC??>?>>>>>=>>>>>>>==>=============$$$$$$!$!!$$!!!!!!!!!!!!!!!  CY                                                   Y~~}}~~~~~~~~~~~~~~~~~~}~~~}}}}}}}}}}}}w|}}w||}}vvvv|vvvvvpvvpvvvpvpvppoppoooooppoooolllllllllllllllllCCCCCCCCCC????A???A>A>>>>>>===>===>=============$$$$!$$$!$!!!!!!!!!!!!!!!!!  !  {#                                                     #}~~~~~~~~~~~~~~~~~~~~~~~~~~}}}}}}}}}}}}}}}}}w}}||||||w||vvvvpvpvvvpppvppppoppppoooooopoololllllllllllllllCCCC?CCCCCC??C???>???>>=>=>=>================$==$$$$$$$!!!!!!!!!!!!!!!!!!     >                                              ڑ}~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}}}}}}}}}}}}}}}}}wwww}}w|}||wv|vvvvvvvppppvppppopopppooooopoolololllllllllllCClCCC?CCCCC?????A??A>>?>>>>>>>=============$=$==$$$$$$$$!!$$!!!!!!!!!!!!!    w_                                                         [}}~}~~~~~~~~~~~~~~~~}~}}}}}}}}}}}}}}}}|w||ww||||vvwvv|v|vvvv|vvvvpppppppppppoooloooolllllllllllllCCCllCCCCCCCC?CC?????>>??>>>>>A>>>>==>=============$=$$$$$$!!$!!!!!!!!!!!!!!!! !!  A;                                             #~~}}~~~~~~~~~~~~~~~~~}}~}}}}}}}}}}}|}w}}wv|vv||v||vvv|vpvpppppppppppoppooopooooolololllllllllCCCllCllCCCCCC???????>>>A>>>>>?>=>>==>>=>===========$$$$$$$!$$!!!!!!$!!! ! !! !      {                                                         z~~~~~~~~~~~~~~~~~~~~~~~~~~~~}~~~}}~}}}}}}}}}||}w||||www|wvvwwvvvvvvppppppppppvppppppoooooollolollllllCCCllllCCllCCC?CCCC??????????>>>=>>>>===>>==============$$$!!$$$!$$$!!!!!!!!!!! ! ! lZ                                                    @}}}}~~~~~~~~~~~~~~~~~~~~~}~~}}}}}}}}}|}}}}}||w|||w|||vvv||vvp|vpvvpvvppppoppppooopooollooollooollllllllClCCCCCC??CCCC>?>>?>>??>>>>>=>>>===>============$$=$$$$$!!!!!!!!!!!!!!!!! !    =                                                                ڑ}}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}~}}}}}}}}}w}}w}}}}}||vwv||||wv|vvpvvvvvvvpppppppppopopoppooooooooolllllllCCCCCllCCCCC?CCCCC???>CA????A>>>>>>=>====>========$$=$$$$$!$$$$!!!!!!!!!!!!!!!!!!! !{_                                                         B~~}~}~~}}}~~~~~~~~~~~~~~~~~~~}}}}}|}}}}|}}w}}|w||}|}v||v|vvw|wvvppvpvvpppppppppppopooopollllllollollllllllllCCCCCCC?????CC?A?>?>>>>>>>===>====>=============$$=$$$$!!!!$!!!!!!!!!!! ! !   u#                                                       }}}~~~~~~~~~~~~~~~~~~~~~~~~~~}~~}}}}}}}}}}}}|}}|w}|w|ww|||v||vvvv|vvvvpvvpppppppoppppppoopoooooooooollllllClllCCllCCCCCCCCC???CC??>>>>>>>>>>>>>================$==$$$$!!$!!!!!!!$!!!!!!!!!!  !   l_                                                             @~}}}~~~~~~~~~~~~~~~~~~~~~~~}~~}}}}~~}}}}}}}}||}}|w|||||w|v|wvv||v|vvpvvpppvpppppppppooopoooololloollllllllClCCllCClCCCCCCCC????C?>>>>>>A>>=>>>====>=======$====$$$$$$$$!$!!!!!!!!!!!! !! !  l#                                                       ~~~~~~~~~~~~~~~~~~~~~~~~}}}}}}}}}}}}}}}}}}}|}}||v|||||||||vvvvvppvpppvpppppppoooooolloololllllollllllCllllCCCCCCC????C???>?????>>>>>>==>==================$$$$$$!!!!!!!!!!!!!!!!!! !!!!   l[                                                         #~}~~~~~~~~~~~~~~~~~~~~~~~~~~}}}~}}}}}}}}}}w}}}}}|}||v||v}|vv|pvvvvvppvvppppppoppooppoooooollllllllolllllllllllCCCCCCC?CC???>??A?A?>>>>>>>==>>==============$$=$$$$$$!$$$!!!!!!!!!!!!!! !! !   !o                                                         [ӑ~}}}~}~~~~~~~~~~~~~~~~~~~~~~~~~~~}}~}}}}}}}}}}|}|}||||||w}wvwv||vvvvvpppvvvppppppoppoopooooooooollllolllllllllCCCCCCCCCC?CC?>??>C??>>??>>>>>>>=>>==============$$$$$=$$$!$!$!!!!!!!!!!!!!!!!! $w@                                                             ٤}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}~~~}~}}}}}}}}}}}}}|}ww|}||}|v||}|wvvwv|vvvvvvpppppppppppoopppoppoooolooolllllllllllllCCClCC?CC?C?????A?>>>>A>>>=>=>>==>====>=========$=$=$$!$!!!!!$!!!!!!!!!!!!!!!!    >x                                                        ;槀~~~~~~~~~~~~~~~~~~}~}~~~}~}}}}}}}w}}}}}}|}|}w}||||vv|vv|||vvpvpvpvpppppppppopoppoopoopoooollllllllllllllllllllCClCCCCC?C?>?A???>>>>>>>>>==>>===========$====$=$$$$$$!$!!!!!!!!!!!!!! !!   =v                                                       Y٤~~}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}}}}}}}}}}}}}}}}}|}}}|}}|w}|||||ww|vvvpvvvvpppppppppppppppopoopolololooolllllllllllllllCCCCCC??CCC??C?>>??>?>???>>=>>>=>=========$=$===$$==$$$$$!!!!!!!!!!!!!! !!!!   $t;                                                               xӤ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}~~~}~}~}}}}}}}}|}}}}}}}}}}|}||}w|w||vv|vvvv|vvwppppvvpppppppppoooopoooollllllllollllllCllCCCClCCCC?C???CC?>??>>>A?>>>>=>>>==============$==$=$$$$$$$$!!!!!!!!!!!!!! ! !  =tY                                                         ٧~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}~~~}}}}}}}}}}}}}}}}|}|w}}||||}||vvv|vvv|vpvpppvpvppppvppppopppoopolooollllollllllllllllCCCCCCCCCCC?CC??C?>?>>>>=>>>>>>=>=>>===>=========$$$$$$$$$$$!!!!!!!!!!!!!!!!!!!   $Cw_                                                           Ӛ~~~~~~~~~~~~~~~~~~~~~~~~}}~~}}~}}}}}}}}}|}}}}|}|}|}}|}||||v||v|vvvvvvpvpvppppppvpppppppppopoooolooollooloolllllllCCllCCClCCCCCC?CCCC????>>?>>?>>?>>>>===================$$=$$$$$$$$$$$!$$$$$!!! !!! !  !$=?t{ف                                        #Қ{}{{{{}{{{{{{}}ww}}}{{}}{}}߁                                                        #z                                                     #ށ                                _                                 [                                  Zߛ@                               ;ׂ                      _ߝZ                 ;x#              Z̔@              Ỹ@          Yǂ;          ;_ʖ[#           @_ޝ[;    ;]ǝZ#    ##;;@YYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYa•fa[[[[[[[[[[[[YYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYY@;;##                   XhhhgccbXXTT"            UhhhhgccXXUTT        TghhgcbXXUTT      UhhhhccbXXTT   TghhdccXXTT VhhdcbXWTT     WhhhccXXUT  WhhhccbXUT"  XhhdcXXTTT  XhdcbXUTT   XhhgcbXXTT""  XhdcbXXTT    XhgccbXUTT" Y# XhhccbXTTTT ; XhdcbXXT""   XhdcbXXTT"  XhhdcbXXTT XhhgcbXXTT"    XhhgcbXXTT"""  XhhdcbXXTT" XhhdcbXXTT"""  XhhdcbXXTT" XhhdcbXXTT"""  XhhdcbXUTT XhhdcbXXTT  XhhgcbXXUT XhhgcbXXTT"  XhhgcbXXTT XhccbXUU"  XhhgcbXUTT" CorsixTH-0.63/CorsixTH/Bitmap/mainmenu480.dat000066400000000000000000011300001347163623700206320ustar00rootroot00000000000000 XhhgcbXUTT" XhccbXUU"  XhhgcbXXTT XhhgcbXXTT"  XhhgcbXXUT XhhdcbXXTT  XhhdcbXUTT XhhdcbXXTT"""  XhhdcbXXTT" XhhdcbXXTT""" XhhdcbXXTT"    XhhgcbXXTT"""  XhhgcbXXTT"  XhhdcbXXTT  XhdcbXXTT" ; XhdcbXXT""  Y# XhhccbXTTTT    XhgccbXUTT"  XhdcbXXTT   XhhgcbXXTT""  XhdcbXUTT  XhhdcXXTTT  WhhhccbXUT"    WhhhccXXUT VhhdcbXWTT   TghhdccXXTT     UhhhhccbXXTT       TghhgcbXXUTT        UhhhhgccXXUTT                     XhhhgccbXXTT"         ##;;@YYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYa•fa[[[[[[[[[[[[YYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYY@;;##     ;]ǝZ#           @_ޝ[;         ;_ʖ[#           Yǂ;             Ỹ@           Z̔@                 ;x#                      _ߝZ                               ;ׂ                                    Zߛ@                                  [                               _                                                    #ށ                                                         #z                                        #Қ{}{{{{}{{{{{{}}ww}}}{{}}{}}߁                                                        Ӛ~~~~~~~~~~~~~~~~~~~~~~~~}}~~}}~}}}}}}}}}|}}}}|}|}|}}|}||||v||v|vvvvvvpvpvppppppvpppppppppopoooolooollooloolllllllCCllCCClCCCCCC?CCCC????>>?>>?>>?>>>>===================$$=$$$$$$$$$$$!$$$$$!!! !!! !  !$=?t{ف                                                         ٧~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}~~~}}}}}}}}}}}}}}}}|}|w}}||||}||vvv|vvv|vpvpppvpvppppvppppopppoopolooollllollllllllllllCCCCCCCCCCC?CC??C?>?>>>>=>>>>>>=>=>>===>=========$$$$$$$$$$$!!!!!!!!!!!!!!!!!!!   $Cw_                                                                xӤ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}~~~}~}~}}}}}}}}|}}}}}}}}}}|}||}w|w||vv|vvvv|vvwppppvvpppppppppoooopoooollllllllollllllCllCCCClCCCC?C???CC?>??>>>A?>>>>=>>>==============$==$=$$$$$$$$!!!!!!!!!!!!!! ! !  =tY                                                       Y٤~~}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}}}}}}}}}}}}}}}}}|}}}|}}|w}|||||ww|vvvpvvvvpppppppppppppppopoopolololooolllllllllllllllCCCCCC??CCC??C?>>??>?>???>>=>>>=>=========$=$===$$==$$$$$!!!!!!!!!!!!!! !!!!   $t;                                                         ;槀~~~~~~~~~~~~~~~~~~}~}~~~}~}}}}}}}w}}}}}}|}|}w}||||vv|vv|||vvpvpvpvpppppppppopoppoopoopoooollllllllllllllllllllCClCCCCC?C?>?A???>>>>>>>>>==>>===========$====$=$$$$$$!$!!!!!!!!!!!!!! !!   =v                                                             ٤}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}~~~}~}}}}}}}}}}}}}|}ww|}||}|v||}|wvvwv|vvvvvvpppppppppppoopppoppoooolooolllllllllllllCCClCC?CC?C?????A?>>>>A>>>=>=>>==>====>=========$=$=$$!$!!!!!$!!!!!!!!!!!!!!!!    >x                                                           [ӑ~}}}~}~~~~~~~~~~~~~~~~~~~~~~~~~~~}}~}}}}}}}}}}|}|}||||||w}wvwv||vvvvvpppvvvppppppoppoopooooooooollllolllllllllCCCCCCCCCC?CC?>??>C??>>??>>>>>>>=>>==============$$$$$=$$$!$!$!!!!!!!!!!!!!!!!! $w@                                                         #~}~~~~~~~~~~~~~~~~~~~~~~~~~~}}}~}}}}}}}}}}w}}}}}|}||v||v}|vv|pvvvvvppvvppppppoppooppoooooollllllllolllllllllllCCCCCCC?CC???>??A?A?>>>>>>>==>>==============$$=$$$$$$!$$$!!!!!!!!!!!!!! !! !   !o                                                       ~~~~~~~~~~~~~~~~~~~~~~~~}}}}}}}}}}}}}}}}}}}|}}||v|||||||||vvvvvppvpppvpppppppoooooolloololllllollllllCllllCCCCCCC????C???>?????>>>>>>==>==================$$$$$$!!!!!!!!!!!!!!!!!! !!!!   l[                                                             @~}}}~~~~~~~~~~~~~~~~~~~~~~~}~~}}}}~~}}}}}}}}||}}|w|||||w|v|wvv||v|vvpvvpppvpppppppppooopoooololloollllllllClCCllCClCCCCCCCC????C?>>>>>>A>>=>>>====>=======$====$$$$$$$$!$!!!!!!!!!!!! !! !  l#                                                      }}}~~~~~~~~~~~~~~~~~~~~~~~~~~}~~}}}}}}}}}}}}|}}|w}|w|ww|||v||vvvv|vvvvpvvpppppppoppppppoopoooooooooollllllClllCCllCCCCCCCCC???CC??>>>>>>>>>>>>>================$==$$$$!!$!!!!!!!$!!!!!!!!!!  !   l_                                                         B~~}~}~~}}}~~~~~~~~~~~~~~~~~~~}}}}}|}}}}|}}w}}|w||}|}v||v|vvw|wvvppvpvvpppppppppppopooopollllllollollllllllllCCCCCCC?????CC?A?>?>>>>>>>===>====>=============$$=$$$$!!!!$!!!!!!!!!!! ! !   u#                                                                 ڑ}}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}~}}}}}}}}}w}}w}}}}}||vwv||||wv|vvpvvvvvvvpppppppppopopoppooooooooolllllllCCCCCllCCCCC?CCCCC???>CA????A>>>>>>=>====>========$$=$$$$$!$$$$!!!!!!!!!!!!!!!!!!! !{_                                                    @}}}}~~~~~~~~~~~~~~~~~~~~~}~~}}}}}}}}}|}}}}}||w|||w|||vvv||vvp|vpvvpvvppppoppppooopooollooollooollllllllClCCCCCC??CCCC>?>>?>>??>>>>>=>>>===>============$$=$$$$$!!!!!!!!!!!!!!!!! !    =                                                          z~~~~~~~~~~~~~~~~~~~~~~~~~~~~}~~~}}~}}}}}}}}}||}w||||www|wvvwwvvvvvvppppppppppvppppppoooooollolollllllCCCllllCCllCCC?CCCC??????????>>>=>>>>===>>==============$$$!!$$$!$$$!!!!!!!!!!! ! ! lZ                                              #~~}}~~~~~~~~~~~~~~~~~}}~}}}}}}}}}}}|}w}}wv|vv||v||vvv|vpvpppppppppppoppooopooooolololllllllllCCCllCllCCCCCC???????>>>A>>>>>?>=>>==>>=>===========$$$$$$$!$$!!!!!!$!!! ! !! !      {                                                         [}}~}~~~~~~~~~~~~~~~~}~}}}}}}}}}}}}}}}}|w||ww||||vvwvv|v|vvvv|vvvvpppppppppppoooloooolllllllllllllCCCllCCCCCCCC?CC?????>>??>>>>>A>>>>==>=============$=$$$$$$!!$!!!!!!!!!!!!!!!! !!  A;                                               ڑ}~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}}}}}}}}}}}}}}}}}wwww}}w|}||wv|vvvvvvvppppvppppopopppooooopoolololllllllllllCClCCC?CCCCC?????A??A>>?>>>>>>>=============$=$==$$$$$$$$!!$$!!!!!!!!!!!!!    w_                                                     #}~~~~~~~~~~~~~~~~~~~~~~~~~~}}}}}}}}}}}}}}}}}w}}||||||w||vvvvpvpvvvpppvppppoppppoooooopoololllllllllllllllCCCC?CCCCCC??C???>???>>=>=>=>================$==$$$$$$$!!!!!!!!!!!!!!!!!!     >                                                   Y~~}}~~~~~~~~~~~~~~~~~~}~~~}}}}}}}}}}}}w|}}w||}}vvvv|vvvvvpvvpvvvpvpvppoppoooooppoooolllllllllllllllllCCCCCCCCCC????A???A>A>>>>>>===>===>=============$$$$!$$$!$!!!!!!!!!!!!!!!!!  !  {#                                               z~}~~~~~~~~~~~~~~~~~}~}}~}}}}}}}}}}w}}}}|||||||||||wvvwvvpvvvppppppppppoppoopoolololooollollllllllClllCCCCCC???CC??>?>>>>>=>>>>>>>==>=============$$$$$$!$!!$$!!!!!!!!!!!!!!!  CY                                        }}~~~~~~~~~~~~~~~~~~~~~}}}}}}}}}||}|}w||||||||w||vvvw|vvvpvppppppppppppopoooloplllloolllllllllCCCCCCClCC???C????A???>>>>>>=>>>>===================$$$$$$!!!!!$!!!!!!!!!!!! ! $                                       ;~~~~~~~~~~~~~~~~~~~~~}}}}}}}}}}}}}}}}w}w}}}}}||||vw|||wvvvvpvvvvppvppoopppppoooopolllolloolllllllllCCClCCCCCCC?C??????A??>>>>>>==>=>>========$====$$$$=$$$$!!$$$!!!!!!!!! !!   w                                               Y~~~~~~~~~~~~~~~~~~~~~~~~~~~}~}}}}}}}}}}|w||w|}||||vwvvvvvvvvvppppppooppoopopopooololollllollllllCllClCCCCCCCCCCl?????>>>>>>>>>>>=>===>=========$$$=$$$$$$$$!$!$!!!!!!!!!!!!!! !   l#                                              ]}}~}~~~~~~~~~~~~~~~~}}}}}w}}}}|}}}}}}}w||w}}|wwvvvpppvvpvppvpvppppppooopooooolooolllCllllllCllCClllCCCCC?C?A?>????>>>>>>>>>>===================$$$$$$$$!!!!!!!!!!!!!!! ! !! =;                                   z}}~~~~~~~~~~~~~~~~~}~}~}}}~}}}}}}}}}}|}||w||||||v|vvwvvvvvpvvp|vvppoppppopooooololllllllllllllllCCCCClCCCClC??C??C??>>>>>>>>>=>>=================$$$$$$$!!!!!!!!!!!!!!!!! !  Y                                       }}~~~~~~~~~~~~~~}}}~}}}}}}}}}}w}|}|}}|wwwwwwwvvwwvvvvvvvpvwvppovvpopoooooooopoooolllllllllllCCClCCCCCClC?CCA?CC????>>A??A>>======>>==========9$$=$9!$!!!!!!!!!!!!!!! ! !!  y_                                ~~~~~~~~~~~~~~~~~~~~~}}}}}}}}}}}}}}w}w||ww}„[@9!!!!!!!!   ! tz                             }~~~~~~~~~~~~~~~~~~~~~~}}}}|}}}}}}w}ww||w}ȁ;!!!!!!!! ! !!  C                         ~~~}~~~~~~~~~}}}}}}}}}}}ww}_9!!!!!!!!!   C              #~~~~~~Y!!!!!!! !  >                        ;~~~~~~␆{{{{{{{{{{y{{{y{yyy{yyyyyyyyyyyyyyxyyxu]xxxxxx]u]]]]]]]]]t]tt]]]]]]]]ZZZZZZZZZZZZZZZZZYYZY_[!!!! !!     =                       ;~~~~~~~~~~~~w||wvw||||vvvvvvppvpppvpppppooppooooooooolllolollllClllClCCCCCCC?C?CCA??>??>A>A>A>>===>=====>=========$==$$$$!$9@! !! !!   =           ;~~~~~~~~~~~~~~‚[@9!;_!!!!!!!!   =        ;~~~~~ݭY!!ZY!!!!   =         ;~~~~~~~~ꭣ~~~~~~}}}~}}}}}}}}}}}}9!B9!!!!  >        ;}~~~~Ԣ~~~~}~~~}}}}}}}}}}}w}|}}}@!Y! !!! !   =     ;~~~~~~~~~~~~~~~~~~~~~~~~}}~}}}}}}}|}|};!;!! !!  !=            ;~~}~~~ܣ~~~~~~}}}}}}}}}}}}www}!9 !   =   ;~~~~~~~㣢~~~~~~~~~}~}}}}}w}}}|}}}[!_9 !   =  ;~~~~~~~~~~~~~~~~}}~}}}}}}}}}}99Y!! !   =   ;~~~~~~䢢~~~~~~~~~}~~~}}}}}}}}}}}}Z!! ! ! = ;~~~~~~~~~Ԣ~~~~~~~~}}}}}}}}}}}}}|}![! !  =  ;~~~~~~~~~~~~~~}}~}}}}}}}w}}9@9!!  = ;~~~~~~~~~~~}~~~~}~~~}}}}}}|}}}9@;!    = ;~~~~~~~}}}}}}}}}}};9;!!!! = ;~~~룢~~~~~~}}}}}}}}}w};9@!   = ;~~~룣~~~~~~~~~~}}~}}}}}}}}}}};9@!!!   = ;~~~~~~~~~~~}~~}}}}}}}ww};9@!! !  = ;~~~~~~~~~~;9@!   = ;~~~릣~~~~~~~;9@! ! !   = ;~~~~~~;9@!   = ;~~~~~~~~~~~}}}}}}}}}}}}w}}}}};9@!!!!  =   ;룣~~~}~}}}}}}s}}}}|}}ww|||w|||vv||vvppvv;9@!  !! =   ;~~~릣~~~~~~}~}}}}}}}}}}}ww}w|}w||||||vvvvvvpp;9@!    >    ;~~~~~릣~~~~~Ӏ~~}}}~}}}}}}w}}}w|}|w}}||w||vvvvvpvpp;9@! =   ;~~릣~~~~~}}}~~}}~}s}}ww||}||v|w|||v||vv|vpvvp;9@! !! =      ;~~~릣~~~~~~~}~}}}~}}}}}}}|}|}w||}||||vvv||vvvv;9@! !   =              ;~뫣~~~~}~~}}}}}|}}}|||}w|||||vvvv|vvvvp;9; !!   =           ;~~릦~~~~~~~~~}}}}}}}}}}}}}|w|||||w|v|w|vvvpv;9;!!!!!  =               ;~릦~~~~~}}}}}}}}}}}||www}}w|||v||vvvvvv|{@9@!!!  =                      ;~릣~~~~~~~}}}}}}}}}}}}}}}w}}|www}v||vv|vvvvv{;9@! ! !     =                        ;~릦~~~~~~~~}}}}}}}}}}}}}}}}|||}}|vvvpv|v|ppy;9;!!!!! !   =                                    ;릦~~~}~}~}}}}}}w||||}}}||wwvwvvvvvvvw;9@! !! ! =                          !      ;~~~릦~~~~~~~}}}}}}}}}}}}}}}}}|||v|vvv|vvvvvvww@;@!!!!! !  =                            B@       ;~뫦৤~~~}}}}}}}}}}}}}}}}}}}|vvv||vvv|vpvw;9@!!! !! ! =                                          ;~릦謡~~~~~~~~}}}}}}}}}|}|}w|||w}}w|||w|vvvvpppw;9@!!!!     =                                                 ;~~뫩槡~~~~~~}}}}}}}}}}}}}w}}}|}||vw|||vvvv|vppw;9@! ! !!!!!  >                                                  ;~뫦ڤ~~~~~~}}}~~}}}}}}}w||}w|}|||}|vvvvvpvvp{;9@!!! ! ! =                                                   ;~릦駡~~~~~~}~}}}}}}}}}}}}}}}}}||||v|v|vv||vpvv{;9@!!!! !  =                                              ;릦㢡ऑ~~~}}}}}}}}}}}}|}}}}||||||||vvwvvvvdž;9@!!!!!!!     =                                           ;~~~뫦ґ~~~~~~~~}}~}}}}}}}}}|}||ww||vw||vvwvvvvޝ@9@! !!! !  =                                               ;~~릦ԡ暏~~~~~}}~}}~}}}}}}}|}|}|||||}v||vvvvvpvvޝߔuly@;@!!!!! !   =                                 ;뫦餡ؤ~耀~~~~}}}}}}}}}|}}||}|v}|||vwvvpvvvvߜߔullll;9@!!!! !   =                  @뫦駑~~~~}}}}}}}}|}}}}}}|w}}|wv|vv|v|vvvwߛuollllly@;@!!!!! ! !   =                     @뫦ڢ٤~~}}~~}}}}}}}}}}}}}}ww|}||vv|vvv||vpwߘߛvllllollll;9@!!!!!! !      =                  @~~~뫫~~~~}~~~}}}}~}}||}}}}}|||w|}w||vvvvvvv}ޙulooooloolllt;9@! !! ! ! ! =       @~~~ԡـ~~~~}~}}}}}}}}|w|}}}||||www|}vv|w|||vv{ߜvoolloloollllll{@=@!!! !!! !    =          @~릫꣡׀~~~}~~}}~}}}}}}}||}w|wwwvv|}vvvvvp{vooloooooolllllllt;9@!!!!! !  =       @뫦~~}~}}}~}}}}}}}w}}|}}||w}w||}w|v|vvv{vpopololoolollllllll{@;@!!!!!! !! !  =        @~뫦ڢ~~~~~}}}}~}}}}}}}}}}}w}}}}w}}wvw|vv|wwwvyoopoooooooolllllllllCl@9@!! !!! ! !   =   @~~릦ُ~~~}~~~}}}}}}}}}}}}}ww|||w|vvwwwvvwvyvpopoooooooollllllolllll{ϛ;;@!!!!!!      =    @摏~}}}}}}}}}}}}}w}www|vwvv|||vvvvvwpopopooooopolooolllllllllll;9@!!!! !! !        =      @~뫦䢢~~~~ב~~~}}}}}}}w}}}ww|w}}|w|ww|v|wvwpppppppppoooooooololllllllCClyϛ;9@!!!!!! !      =    @~뫦蚀}}~}}}}}}}}}}}}||}}w|w||wvwvw}wvpvvpoppoppooooloooolllollllllll̝;9@!!!!!!!! !         =    @릣آҀ}}}}}}}}}}}}ww|w}||vvw}wwwww|vvppppppppppopoooooolllolllllllllyޛ;9@!!!!!!!     =     @~뫦~~א~}}}}}}}}}||}}}|wwv||vwvvvvpppvvoppppppooooooollolllololllllll̛;9@!!!!!!!! ! !         =  @~~~~~릦~~~♀~~}}}}}}}|}}}w}}w}}||}pvvvvvvpopppopoppppoolllllllllllllllCCuޛ;9@!!!! ! !!      =  @~࣢~~~~~}}}}|}}}}}}w|w}}|w|}vvvppvpppppppppooppopoooooolllllllllllll̖;9@!!!!!!!!!!      =    @~~뫦~~~ِ}~}}}}}}}|}}w|w|w}ʜنvvvvvpppvpopppppopoooooloooollllllllllCCluޝ@9@!!!!!!!      =   @~뫣ݡ~~~~~~Қ}}}}}}}}}}}w}טwwwvvvpvvvpppppppoooooloooooollooolllllllCClߔ@;@!!!!!!! !    =   @~~~~~~~~ٙߙ}}}}}}}}}}ٙwv|vvppvpvvvpppppppopopoloooolllllllllllllCCCu@;@!!!!!!! !        >   @~~~Ԣ~~~~觙ߞ}}}}י̐|vvvvvpvvpppvpppppoppppopololololllolllolllllClߔ@9@!!!!!!!!       =    @~~~릦棢~~~~~~}~יʘߘwvvvvvvvvpvvvpvpvvvpppooooooooloollloolllllllCCClu@9@!!!!!!!!!!          =    @~~릣~~~~~ʐٞߜwww||vvwvvvpvpvpvppppppooooooolooooloollllllllCClCll@9@!!!!!!!!        >   @~~~릦ڢ~~~~~~}}~ǐҞٙ}wwwvvwvvvpvvvpvppppppppppoooooooooooloolllllllllllllCt@9@!!!!!!! !         >   @~~~~릣~~~~~~~~}}}}}Ӑ}wwwwvvwwvwvvwwvpvppppppooppoooooooolollllllllllllClllCCC@9@!!!!!!!!! !!         =  @~~~릦Ԣ~~~~~~}~}}ߞ}}}}vwvw}w|vwvwvpvvvvppppppppooooooopoloolllllllllllllllClluޝ@9@!!!!!! !! !       =   @~~~~~릣꣢~~~~~~}}}}}}ٙ}}|vv|wwwvvvvvvvvpvvvpvvvpppppoooopooooololloollllollCllClllCC;;@!!!!!! !!       > @~~~~릣~~~~~~}~}}}}}}}}}wwwww|vwwvvv|vvvvv|pvvpppppppppoooopopoooollollllllllllCClCCt@;@!!!!!!!!!         >  @~~~뫦䣢~~~~~~~~~~}}~}}}}}}}w}}|www|}wwwv|vvpvpppvppvpppppppooooooooollloollllolllCClClCCC@9@!!!!!! !        >@~~~~릣䣣~~~}~~~}}}}}}}}|}}w}ww}ww||vvwwvvvvvvvvpppppppppooopooopoooooooolllllllllCCCCClCt;9@!!!!! !! !!! !       =@~~~릢ꨣ~~~~~}}~}}}}w}w|}}wwww|wvv||vvvvvpvvvvvvppppoopppooooooooolllllllllClllllCCCCl;9@!!!!!! ! !!      =  @~~릣~~}}}~}}}w}}}}wwv|}wvvvw|vvvpvvvvvvvppppvpvpoooooooooollolllllllClClClCCCCCt@;@!!!!!!!! !!!!       > @~~~~~릣ڥ~~~~}~~}}}}}}|}}ww}||}|ww|v|wvvvvvwvvvvpppppppopooopopoololllolllllllllllCllCCCCC@9@!!! !!!!!!        > @~릣뭡~~~~~~}}}}}}}ww}wwwwvw|wwwvvpvvvvvvppppvpppoppooooooooollllllollollllllClCCllCx@@@!!!!!!!! !      = @~~릣ڥ~~~}}}}}}w}|}wwww|wwwvvvvvvpvvpppppppppvpppppppooollollollollllCCClllCCCCCCC@;@!!!!!!!! !      >@~~릢訢~}}}}}}}}}w}w}w||||||vwvwvvvvvvvvpvppopoppopppoooooooooollllllllCClllCCCCCCCCz@;@!!!!!!!!! !       >@~~~~룣ڤ~~~~}}}}}}}}}w}w|w}w}|wvvvvvvvvvvpvvvppppvpopppooooopollooltllllClllolllClCCCl@;@!!!!! !       >  @~~~~~~룢觡~~~~}}}}}}}}}w}w}}}ww}wvv|wwwvvvvvvvvvvppvvppoppoooooooolooollolllllllCClCCClCC{;;@!!!!! !!       > @~~~~~~릣ؤ~}}}}}}}ww}ww}ww|wvvwwww|vwvvvvpvppppvpppppppoooooolooolllollllllllCClCCx@9@!!!!!!! ! !      >   @룢槡~~}}}}}}}}w}}w}}}wwwwwvvvvwvvvpvvvpvvpppppppooooopooootllollllllllCCllx@;@ !!!! !! !!      >@~~~~~~Ԥ~~~~}}}}}}}}}}}w}w|ww||wwvv|vvvvpvvvvvppvvppopopoppooooooolllllllllllClCy@;@!!!!!!!!!! ! !       >  @~~楑~~~~~}}}}}}}}}wwww}}wwww|wwvvvvvvvvvvpvvvvvvpvppppoooooolllloololllllllly@;@!!!! !! !! !      > @~~~~~룣ӡ~~~~}~}}}}}}}}w}}w}w}wwwwwvvvwvvvvvvpvvvpppvoppppopoopooooooolllllllllu@9@!!!!!! ! !!        >@~~~ॡ}}}}}}}}}}w}}}wwwwvvvwwvvvvvvvvppvoppppopppoluoloopollooolloou@;@!!!!!!!!! !     > @}~~~~~~~~ҡ~~}}}}~}}}}}}}wwwwwwvwwwvvvvvvvvvvvvpppppvvpopppoouoopooloooololt@@@!!!!!!!! ! !!!!     = @}~~~~~~룡ؤ~}}}}}}}}www}wwwwvwvwwvvvvvppvvvvvpvppppppoopppoopooolooollo@;@!!!!!!!! !!  ! ! > @~~~~~~~룣褑}}}}}}}}}}w}}wwwwvwwwwvvvvwvvvpvvvvpvppppvvopppopoouollollt{;;@!!!!!! !!! !     > @~~~~룢ؑ}}}}}}}}}}}www}wwwwwvvvvvvvvvvvvwppvvvvvppppppooooouuloolo{;9@!!9!!!!!!! !!    =@~~~~릣襑}~}~}}}}}}}}w}}ww}wvwvvvvvvwvvvvwvvpvvvpppppoppopoooooooy@;@!! !!!! ! !    != @~~~~~٤~}}}}}}}}}ww}|wwvvwvwwvvwvvvvvvvvvvppppopppupoopolpou;9@!!!!!!!!!!!   >  @~~~~~룢槑}}}}}}}}}}}}ww}wwwwwwwwwvvwvvvvvppvppoopvpopopppvpoooy@;@!!!! !! !!    >   @~~~~~~}}}}}}}}}}}wwwwwwwwwvvvvvvvvvpvvvvvvpppvpopppoopoooo;9@!!!!!! !! !   >@~~~~~~ؤ~~~~}}}}}}}}}}}wwwwww}}wvvwvvw|vvvvvvvvvpppppppvoppooooooou@9@!!!!!!! !  =   @~~~~~~룢٤~}}}}}}}}}}}}}}w}wwvwwvwvwwvvvvvvvpvvvvvppvpvppoopooooopǝ@;@!!!! !! ! ! > @~~~~~~~~~颢৑}}}}}}}}}ww}ww}wvwwvvvvvvvvvvvvpvppvppppppooooopooloooo@@@!!!9!!!!!  > @~~}}~~~~颡觑~}}}}}}}}}}wvvwww}wwvvwvvvvvvvvvvppvpoppooppoppppupoooooy@;@!!!! !!! !   >   @~~~鬤~}}}}}}}}}w}ww}}wwwvwvwwvwvvvwvvvvvpvvvpppppvppooppooouoollooooޝ@9@!!!!!! !! !   >    @~~}~~~~~Ӥ~}}}}}}}}}}}}ww}w}w}w}wwwwwwvwwvwvvvvvvvppppoppoooupoooooloooololu̝@9@!!!!!! !!! =      @~}}}~ؤ~~}~}}}}}}}}}}}w}www}wwv|wwvwvvvvvvppvvvvvvoopuoopooooooloooloollo@;@!!!!!! ! !  >   @}~~~~~ॡ~}}}}}}}}}}w}}w}wwwww|vvvwvvvvvvvvvpppvppvpoouppoloooopolltlllllu@;@!!!!!!!!! !  =   @~~~~餡模}}}}}}}}}}}}}}ww}ww|www|vvvvvvvvvvpvvppvopvvooooooooopooololoollollo{ɝ@;@!!!!!!!!   =      @}~褢鬒}}}}}}}}}}}}ww}wwwwvwwvwwvwvvvvvvvvvvvvvppppppoopoooopoooolollolllllllt@;@!!!!!! !!! =       @}}~颡ؤ}}}}}}w}}w}ww}wvvwwvvvwvvwpvvvvvvpvpppvppppopoooouoloolollllllllllllx@;@!!!!!!! !! ! =   @}}}}~~}}}}}}}}}w}}}}wwwvwwwwvvvvwvvvvvvvvvpvvvppooppppouooooouololoollllCllllCt@;@!!!!!!! ! ! !  =   @}~}顡ء~}}}}}}}}}}}}}}w}}}}wwwwvvwvvvwvvvvwvvvvppvvpppppuoooooooooooolllllllllllClllCu@;@!!!!!!!! ! ! =      @}}}}~~~~~褡}}}}}}}}}}}}}}w}ww}wwwvvvvvvvvvvvvvpvvppvvppppppopopoooooolllllollCllllClCClll@@@!!!! !!!! ! =   @}}}}~~餡ؑ~}}}}}}}}}}}}}w}w}w}wwwwwvvvvvvvvvvvvvvpvpppppppoppovoooooollololloollllllClllllCCu@;@!!! !!! ! ! ! =  @}}}}}餑}}}}}}}}}}}}}}}w}}w}ww}wvvvwwvwwvvvvvvvvpvpvvvpppppppooopoouoltooollllllllllCClCClCCCl@;@9!!!!!!! !  =   @~}}}~~颡ӡ}}}}}}w}w}}w}}wwvvwwvvwwwvvvvvvvvpvppvpvppppooooooooollouolooltlllllllllCClCCCCCt@;@!!! !!!! !! =  @}}}}}~~顡餑~}}}}}}}}}}}}}}}}}}}}wwwvwwwvwvvvwvvvvvvvpvppppoopuouuuoooooooloutolllllllllllClCCCCCCCCCz@;@!!! !!! ! =  @}}}}~}~钑ӡ}}}}}}}}}}}}}}}www}w}wvvwvvvvvvvppvvvvpppppppppoooulooooollooolllltlClllCllCCCCCCCCCC@;@!!!! ! ! =@}}}~褑񤑑}}}}}}}}}}}}}}}}}wwwwwwwvvvwwvvvvvvvvvvvvpuvpuvpopvoopuoooooooolollolllllollCClCCClCCCCCt@;@!!!!!! ! !! ! =A}}}~蒑ӑ}}}}}}}}}}}}}}}}}}wwwwvvvvvvwvvvvvvwvvppvppvvpppupupoopooouoolollloltlltllllllllCCCCCC?CC@9@!!!!!! ! ! =@}}}}}}}}}~~褑}}}}}}}}}}}}}}w}}}טwwwwwvvvvvvvvvvvvvvvpvpvvppoupopoptooloooltllllllllCClllCCllCCCCCC]@;@!!!!!!!!!  =@}}}}}}~~蒑ؑ}}}}}}}}}}}}}}}}}}wߝwwwvvvwvvvvvvvvvvvpppppvpppoooooooolololotttllllllllllCClCCCCCCC@9@!!!!!!!!!!! =A}}}}}}}}~褡}}}}}}}}}}}}}}}}}}}}نvvvvvvvvvvvppppvppvuppuoooooooooooouoolollllllCClCCllCCClCCCCx@;@!$!!!!!  =A}}}}}}}}}~}}}~~褑ّ}}}}}}}}}}}}}}w}}ߐw߆vvvvvvvvvvvvvpvvvupvuppuopppouuoooooollllllCltlllllClCClCCCt@;@!!!!!!!! !  =B}}}}}}}}}}~餑}}}}}}}}}}w}www☐{wwwvvvvvvvpvvvvvvppopuoouuooooouooooloolollllllllllCllCCCCCCC@;@!!!!!! !  =@}}}}}}}}}}}~餑}}}}}}}w}}}}}}}}}}{wwwwvvvvvvvvpvppvvvpoupppuppuououlooollollllllClCllClllCCCCt@;@!!! !!! =@}}}}}}}}}}}}~蒑}}}}}}}}}w}}}}}}✆}wv}wvppvvvvvpvvvpppvupuppuououuooooolollloltlllllllllllCClll@;@!!!!!! =@}}}}}}}}}}}褑ّ}}}}}}}}}}}}w}wwwwwww}wvvvvvvvvvppvvvpppvpooooouoouooooootlllollllllllCCCClCCCC@;@!!!!! ! ! =@}}}}}}}}}}褑~}}}}}}}}}w}}}}}}ww}wwwwvwwwwwvvvvvvvvvuppppuovoppooopoputoooooolooolllClCCllCCClClCt@;@!!! !!! =A}}}}}}}}}}}}}葑}}}}}}}}}ww}}}}www}wvw}wvwwvvvvvvvvvvpvvvvpuuuupuuooopooloooollolltlllCCllllllCllC@;@!!!!!!!!! =A}}}}}}}}}}}}}}}}}葑}}}}}}}}}}ww}w}}w}}w}vwwvvvvvvpvvvvvpppppuuuppoopuoooollllotolllltlllllClClCClz@;@!!! ! ! =Aw}}}}}}}}}}}}}}~葑耀}}}}}}}}}}}}}}}w}}w}}}}wwvwwvvvvvvvppuupupvopuoupuopooooolllttoltolllttllCltCClCt@;@!!! ! =B}}}}}}w}}}}}}}}}葑Ҁ}}}}}}}}}}}ҙ}}}}wwww}}wwwwvwvvpvvvppvvoppopuuopooooolluoluoollloulllllttlllCCCCC@;@!! ! =A}}}}}}}}}}}}}}葑~}}}}}}}}}}}}}w}wvwvvwwww{vvvvvvpvppuvvoopouuuuuppouoooooutllltllCllllCCllllly@9@!! =A}w}}}}}}}}}}}}褑}}}}}}}}}}}}}}wwwwwwvwwwwwvvvvvppvvvvpuyvpoovuopuuouuoolooltllltotlClttlCllCCl@;@!  >B}}w}}}}}}}}}}萀}}}}}}}wwwww}}wwޛw߆vpvvvppuvupuޔupouooooooototoltoolutllllllClCCClC@;@ ! =A}}w}}}w}}}}}}}}}}葀׀}}}}}}}w}}www}}www}vvvvpvvvuppvvyouoouooooulooluolltllllllllCCClCu@9; =A}ww}}}}}}}}}}}}}}}}}葑}}}}ߜ}}w}wwwwwwwwvwwʞvvvvvvvvpppvpuuoopuuoluooollltlllllltlllllllt@9;=B}}}}}}}}}}}}}}}}}}}}}}葏߀}}}}}}}}}ww}}wwwwvwww̆vvvvvvvpvvppppw{uououtttolllotltltllllllClCl;9; =A}}}}}}}}}}}}}}}}}}}}葀}}}}}}}}w}w}wwwwwww}www{džvvvvvvvvppppupuuyyoloutotoltllllltlllltCllCu;9;=Aw}www}}}w}}}}}}}}}}}}}}}葀⑀}}}}}}}w}}w}wwwwww}ww}}wvvwvwvwwvvvvvvvvvvvvvvpvvvpyooololltttullttltCltlClt;9;=Aww}}w}}ww}}}}}}}}}}}}}}}}}葀}}}}}}}}}w}}w}wwww}}wwwwwwwvvwvvvvvvvvvvvvvvvvvvppupuyytooooltlttlloltClllCC;#; =Awww}}}}w}}}}}}}}}}}}}}}}}葀}}}}}}}w}}}}}w}}w}wv}wwvvwvvwwwvvvvpvvvpvvvvvpvpppvp{uototlCllllltolllllt9#;=A}w}ww}ww}}}}}}}}}}}}}}}葀}}}}}}w}}}}w}}ww}wwwwwwwwwwwwwvwvwvvvvvvvvvvvpvvvppuuuvp{ottltouttlClllCCC;!;=A}}}ww}}}}}ww}}}}}}}}}}}}}}}~}}葀}ߜ}}}}}}}w}}}w}}}}}}wwwwwwvvwwvvwvwvvvvvvvvvvvvvuuvupvuuuuoltltlCtllllllz9#;=Aww}}}ww}}w}}}}}}}}}}}}}}}葑}}}}}}}}}w}}}w}}}}}wwwwwwvwwwvwvvwvvvvwwvvvpvvvvpppvvvpuvp{{ttltllllClClt;9;=Aw}w}}}}}}}}}w}}}}}}}}}}}}}}}}}}ٙ}}}}}}}}}}}}}w}}}}wwwwwwwwwwwwwwvvvvwvvvvvvvpvvvpvpuvppppuuyyttllllCCCl#9;=Aw}w}}wwwww}}w}}ww}}}}}}}}}}}}}}~葀}Ґ}}}}}}w}}}}ww}}w}wwwwvvwwwwwvvvvvwwwvvvvvvvvvvvvvppvpuopvpytllllttt##;=Awww}ww}ww}w}}}}}}}}}}}}}}}}}}}}}}葀}}}}}}}}}}}}}ww}}w}w}}ww}wwwwwwwwwwvwwvwvvvvvvvvvpvvvvpvvupupouuyyltCltu##;=Aww}www}}ww}}}}}}}}}}}}}}ww}}}}}}}}}}}}}}}}}}}}}}}}}}w}}}wwww}}wwwvvwwvwvvvwvwvvvvvvvvppvppuuvvvpppouuyullt99#=Awvwwwwww}}ww}ww}}}w}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}ww}}}wwww}w}wwwwwwvvvvvvwwvwvvvvppvpvvppupuuupuupuyzt##; >Awvvwvwww}}ww}ww}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}w}}}}}}}}}}}}}}}}}}ww}}}wvwwwwvvwwwwvwvvwvvvvvvpvvvvvvppvupuuuuy##;=Awww}wwwwww}w}ww}}}}w}}w}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}w}}}}}}}w}}ww}}}wwwwvwwwwvvwvvvvvvvvvvvvvvvvppupupvpuuuuupy##;=Awwwwwwww}ww}w}}}}}ww}}w}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}www}ww}}www}vwwwwvwwwvwvvvvvvvvvvvvvvpvpvpuuuuuuupu{#!;=A}wwvwww}}wwww}w}}}}}}ww}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}w}}}}}}w}}}}wwww}}}w}}ww}wwvvwwwvvvvvvvvvvvvvvvppppvvupuuuuuupuo{;#;=Awv}wwwwww}wwwwwww}w}}}}}}}}}}}}}w}}}}}}}}}}}}}}}}}}}}w}}}}}}}ww}}}}}}}wwwwwwwwwwvwvwwvvvvwvvvvwvvvvvvvupvvppvuupupppup{# #=Awvwwvwww}}}}}www}}w}}}}w}}}w}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}w}}}}w}wwww}w}}wwwvvwwwwwwwvvvvwwvvvvvvvvvpvvvpvvvvuuuppuuuuuɆ; #=Awvvwvwww}wwwwwww}ww}ww}w}}}}}ww}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}w}}}}ww}}}}}ww}wwww}wwwvwwwwvwwvvvvvvvvvvpvvvpvvpvupvuuuppuoupu{9##=Awvwvw}wwvwww}}ww}ww}}w}}w}}}w}}}}w}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}w}w}}}}}}}}}www}}}vwwwwwvwvwvvwvvvwvvvvvpvvppvvvpvuvpupvuuuuuuuuuǃ9 #=Avvvvvvvwwwww}wwwww}}ww}w}}}}}w}}}}}}}}}}}}}}}}}}}}}}}}}}w}}}w}}wwwwww}}w}}w}}wwwwwwwwvwwwvvvvvvvvvvvvpvvvvvpvppupouuuuppopuuuuϝ# #=Avpvvvvvvvvvwwwww}ww}wwww}}ww}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}w}}}ww}}ww}www}wwwwwwwwwwwwwvvvwvvwvvvvvvvvpvvvppuvpppuuuuuuuuouoy᝛#!#=Appvvpvvvvvwwvw}}wwwww}ww}www}}}}}ww}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}w}}}}}wwwww}w}wwwwvv}wwwwvvvvvvvvwvvvvvvvvvpvvpvpppuupuouuuuuuuy#!#=Avpppvpvvvv|vvwwvvww}wwww}}ww}}ww}}}}}}}}w}}}w}}}}}}}}}}}}}}}}}}}}}}}}w}}}}}}}}}ww}}}ww}}}}w}}}}www}wwwvwwwwwwwvvwvvvvvvvvvvpvvvvvvpuvppupuuuuuuuuoouy# ;=Apppppppvvppvvvvvwvwwww}wwwww}}w}}w}www}}}}}ww}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}w}}w}}}}}}www}}w}}}}}wwwwwww}wwwww{wwvvvvvvvvvvvvvpvvvvvpvupuuuppouuuuuuuy# #=Avppppppppppwvppvv||wvwwwww}wwwwwww}}}ww}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}w}}w}}w}w}}}w}}wwwww}wwwwwwvwwvvwv̞{wvvvvppvvvvpvvuvpppuuppuuuuuuuuuoo{###=Avpppppppppv|vvvvp|vvvvwvww}w}ww}}}}www}w}}}}}}}}}w}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}w}}}www}ww}wwwwwwwwvvvvwwwwvwvvvvvpvvppvpvuuvppuuuuuuoououtu# #=Appppppppvppvvvvpvvppvvvvwvvwwwwwwwww}}ww}}}}}}}w}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}w}}}}}}}}}}}}}}}}}w}}}}}}}www}w}}ww}wwwwwwwwvwvwwwvwwv{vvvvvvvvvvvpvvuuuuupupouuvyy{# #>Apppvppppvvvpvppvvvpvpvvpvvvwwvvwwwwww}w}www}}}ww}}}}}w}}}w}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}wwww}}}ww}}}}ww}wwwwwwwwvwwwvvwwvvwvvwwwvwwwwvpvvpuupuvvppuvpupuuoouu{# #=5Apppppppppppppppppvvvpvvvvvvvv||wvwwvww}ww}w}w}}}w}w}}}w}}w}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}w}}}}}w}}w}}wwwwww}wwwwwwwwwwwwwwwwwvvwwwwvvwwvwvvvvvwvvvvvpvvpuuuuvuuuuuuuuu{###=Appppppppvppppppvvpppvvvvvvpvv|vvpvv|wvww}wwwwwww}}w}}}}}}}}}}}}}}}}}}}}}}}}}}}}}w}}}w}}}}w}}}}w}}}}}}w}}}}}}ww}}wwwwww}wwwwwwwwwwwwwvwwvvvvvvvvvvvpvvvuuvvuppuupuouuuuupu# #=55Avpppvppppppppppvpvvpvppvvvvpvvq|vv||v|vvw}|vwwwvwww}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}w}}}}}}w}w}w}ww}}ww}wwwwwwvwwwvwwwwvvwvwvwvvwvvvvvvvvvpvvuupvuuuuuupuuuuuuy#!#=555555?ppopppppppvpvvpppppvvppvppvvvpvvvv|v|vvvvvvvw||vvw|}w}}w}}}w}}}}w}}}}}}}}}}}}}}}}}}}}}}}}}w}}}}}}}www}}}}}}}w}}ww}www}wwww}wwwww}wwwvwwwvwwwwwvvvvwvvvvvvpvpvvvvvvvvpupuuupuuuouuuu#!#=555555Appppppppppppvpppvppvppvpvvpvvpvpvvvpwvvvvvvv||vwww|w}wwwwwww}}}}}ww}}w}w}}}}}}w}}}}w}}}}}}}}w}}w}}w}}}ww}w}}w}}}}wwwwwwwwwww}wwwwwwvwwwwvwwvvvvvvvvvvvpwvvvvw{vvuuvvuupuuvpuuuuuouu# #=5555555Apppoppopppppvppppppvppvppvvvvvvvvppvvvvvvvvvv|v|vv|ww|www}ww}w}w}w}w}w}}}}}}w}}w}}}}}}}}}w}}}w}}}}}w}www}wwwwwww}ww}wwwwwwwww}wwvwvwwwwvwvvwvwvvwvvvvvvvvvvvvvvvuuuuuuuuuuuuuuuuoou# #=555555555555Apppoopppoopppopppppvpppppvvv|vvvwvvvp|wvvv|vp|vvv|vww|v|wwvv|vwvwwwwwwwwwww}}}ww}}www}w}w}}w}}}}}}ww}}ww}}w}}wwww}ww}ww}www}}w}wvwwwwwwvvwwvvvvvvvvvvvpvvuvvpvyvupvvuuoopooooloolllu# #=555555Cpppopopppoopppvpvppppppppppvpvvpvv|vvvvv||v|vvvpvv|wwwvvvvw|||vv|wwwwwwwwvw}}}}wwww}www}wwwwww}w}w}}}w}www}ww}}wwwwwwwwwwwwwwvvwvvvvvvvvvwwvvvvvvvvvvvvppwpvuuy{uuuuuooouolooollllllt# #=5555555555555555555555Apooloooppppppppoppppppvvvvpvpppvpvvpvvpv||vvv|||vvvwwvv||v|vv|wvvvvvvvvw|wwwvww|wvwwwww}wwwwwwvvwwwwww}}}www}wwwwwwwvwwvwwwwvvwvvvvvvvvwvvwvvvvvvvvvvvvvupopuu{uoppoooolllllllllllClu# #=5555555555755555555555555555555555555Cppoopoopppppppppppppppvppppvvppppvvpvvvvppv|vvpvvvvwwvvvw|vvwv|vw|w|vvvvvvvvw|vvv|ww|vvvvwwwww|wwwwwvvvwvwwwvvvwwvvwwvwvvwwvvvvvwvwwvvwvpvvvvvpppppoupuoppopopooolloololllllllllCllu# #=55555555555555555555555555555555Appooooooopppopppppppppvvvpvppppvvvvvpvvvpvvpppvvvvvww|vvvvvv|vwvvvvvv||vvvvvvvvvv|vvvv|vvvvv||||v|wvpvw|pvvvvwv|vwvpvvvvvvvvvvpvvvvvpvvvpvvppppppppoopooppuoouoooolllllllllllClCCCll# # =55555555555555555555555555Apopoopppoooooooopoppppppppppppvpppvvpvvppvpvvv|vpvvwwvvvvppvvvvw|||vvvv||vvvv|vwvvv||vwvvpvvvvpvwvpvvvvvvvvvvvvvpvpvvvvwvvppvvpppppppppoooopppppooopooloolloo{ooollllllCllllllllCClC# ;=55555555555555555555555555555555555555555555Apooooooooooppopppoppppppppppppppppvpppvpppvpvpvvvvvwwvvvpvvvvvvvvvvvv||vvvwvvvvvwv|pv||vvvvvvvv|vvvvppvvvvvvvvvppppvvopvppvpppppopppppppopppooooooooooloooloouollllllllllllllllllllC{# #=555555555555555555555555555555555555555555?poooooooooppoopppoooopvpoppopvpppppvppppppppvpvppvvwwpp|v|vvpvvvvvvpp|v|vvvvvpvvvvvvvvvvppvpp|vvppvvppvppvvvvvvpppppvpvpppppppppooppopoopppppoooooooooooloooolllolllllllllClCClllCCt# # =55555555555575555555555555555555555555555555555Aoolooooooopoppppppppppppppppppvvpppppvpvppvvvppvpvvvwvvvvvvvppvv|vvpvvvvvvvvvvvvvvvvvppvpvvpvvvppppvppvvpvvvppppvvpppvppppppppppppppoppopoopoooooooooooollouyolClllllllllllllCCCCCCCC# #=55555555555555555555555555555555555555555555555Aoooloooooooopppoopopppppoppvpppppppppvvpvvpppppvpppwwvvvvpppvv|vvvppvvvvvvvvvpvvv|pvvvvvvvvpvpvvvvpppppppppvpvppppppopppppppppppopopoppoopopoopooolollooloollllllllllllClllllCCCCCCCt# #=5555555575555555555555555555555555555555555555555555555555555555555555555555Aoooooooooooooopoppppppopppppppppopvvvpppvpppvvvpppvwwvvvpvvvvvvvv|vvvpvvppvpppvvpvvvppppvvppvpvvpvvvvvppvppppvppppvpppppppvpppopppppopppooopoopolooooololluuollllllllClCCClClCCCCCCCCC# #=5555555555555555555555555555555555555555555555555555557555555555555555555555CollooooooolpoppoooooppopppooopoppppppppppvvppppppppvwpvvppppppvvppppvpvpppvvvvpvppvvppppvvvppvvpppppvvppppppvpppppvppppppopppppoopppoppopoopooollololllollolllllllllllllllClCllCC?CCCt# #=55555555555555555555555555555555555555555555555555555555555555555555555555555555555555?olloooloopoploopppooooooopppoppppppppppppvppvpvppvpvwpvvvpvvvppvvvppvvpvpvvvpppppvvvvppppppvpppvppvppppppppppvppppppppppppppoooooppoopoooooooollllloolollyolllllllCClllllCClCCCCClCCCCC# #=555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555Collllpooooolooooopopoppoppoppoopoopoppoopppppovppppwvpppvpppvppppppvvpvvpppppvpppvvvpvpvppvppvppppppopvvpppvppvppppppooooppoppppoopoooooooooooopoolooollo{llolllCllCllllCClCCCCCCCCC???t# #=55555555555555555555555555555555555555555555555555555555555555555CololooloooooooooooloooooooppooopppppopppppvpoopppppvwpppppppvppvppvppppppvpppvvpppvopvpvvpvppppppppppvpppppvpopppopoppoppoppooppoooopooppoooooloolllllollllllllllllllCClClClCCCCCCCC??Cz# #=55555555555555555555555555555555555555555555555555555555555555555555555555?ololloololoolooppoooooppoppppppppppppppppopppppppppwvppvppppppppppvpppppvpvvpppvvvvpvvppppppvppppppppppppppppppppopooooppppopoooooolooooolloollollllolluulllllllllCCCllCCCCCCCCCC???C???C# # =55555555555555555555555555555555555555555555555555555555555555555555555555555555555CollllolllloooolooooopoooopooopoooppoppppppppppvppppvvppopvppppppppppvpppvpvpvpppppvpppppppppppppppppopppppppopvooppppppoopopooooooooooololoollllllloollollllllllCllllCCCClCCCCCCCC?CC???y# #=555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555Colllllllllolooooooooooooopoooopoopppppppoppopppppppvwpppppoppvpppppppppppvpppppppppppppppppppppppopppppoppoppppppppppoopppoooooooooooooooooolollllllol{oolllCllllllllCClCClClCCC?CCC?????C# #=55555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555CoolllllllllloooloolooollopoooopoopppooppooppooppppovvpppppopvvpppppppppvppppppppppppppppppppppoppoppppppppppoppppooppppooopopooooooooooollollooollloluyllllllllClCClCCClClCCCCCC??C?????>?t# #=5555555555555555555555555555555555555555555555555555555555555555555555555555555555555555557555555555555555555555555555557555AoollloolllolooolllooooooooooppooopoooopppppppoppppovvpppppppvpppoovvppppoppppppppppppppppppopopppppppoppopooopppooooopoolopoooooloooololoollllolllllloCllllllCCllCCCCCClCCCCCCCC?CCCCC>???# ;=555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555AollolllolllolllooloooooooloooooopooopoooppooppppoppwvppppppppppppppppppvpopoooopppppvppppppppppppppoppppoopppooooopoooooooooloooolllollllollllolllllyulllllllCllCCClCCCCCC??CC?CCCC??C????>t# ;=55555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555CollllllllllllllloooloolooooooooopooooopooopopooopppvvppopppoppppppvppoopppppppppoppppooppppppooppppoooooppooopoooppppooopoooollooloolllooloollllolloyllllllCClCCClllCCCCCCC?CCCC???A?C??A???z# ;=5555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555ColllllllllllllllloolllooooooooopoooooooooopopoooopouvppppooppoppppppppppppppppppopopppoopppoppppoopppopooopoooopooooopooooppooolllpolllllloloollllllllllllllllCllClCCCClCCCCCCC????????>?>?A# #=555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555755555555555555555555555555555555555555555555555555555ClllllllollllllllollllooloooolooolooopooopopooooopoovvooppoopoopoppooppooopppppoppoppppoppoppppoppppooopppopoppoooooooolopoolooooolllllllllllllloolutlllllCCllCCCCCCCCCCCC?CC?CC?CC??>?CC??>?>]# #=55555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555?ollClllllllllolllllllololllooolooopoooloooooooppooovvopppooppooopppopopppoopopppopoppppppopppopoooopoopooooooooooopolopooolollollllolollollllollllyllCCllCllCClCCCCCClCCCCC?????CCA???????>>?A# #=555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555?olllllllllllCllollolloollololloooooooooollllooooooouuopooppppppppooopopppoppooopoopopppoppoooopoooopopoopoooooopololooollolooloollollolllllllllllCClClCCCClCCCCClCCCCC?CCC????C????????>>?A>>C# #=55555555555555555555555555555555555555555555555555555555555555555557555555555555555555555555555555555555555555555575555555555555555555555555555555555555555555555555555555555?llllllllllllllllllllollllllooopoooolooooooooolooooovvpooppooooopooopopooopoppooooopoooooooloooooopooooooooooopoooopolollolloolllllllllllllllllllyulllllllCllCCCl?CCCC?CCCC?C?>?????>>A?A>>>A>>>x# #=55555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555ColClllCllllllllllllllllolooloooooollooolooooooooooouuoooooopopooppopoppooppppooooooooooooooopoolooooloolpoolloolloooolooolllllooooolllllllllllloyClllCClllCllCllCCCCC???C?CC?C>??>??AC?>>?>>>>>A# #=555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555ColCllllllllllllllololllololllllloollllooooooolooooovuoooooloooooopopoopooplopoopoopoooopooooooolooooooplooooolloolloollloolllloloolllllllllllllllCllCCClCCCCCCCCCCCCCCCC?CC?CC????>>C?>>A>>>>>>t# #=5555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555CllllllllllllllllllllllllolllllloololllllooololooooouuooooooooloooooooopoooooooooooooooooooloooooooopplolooooooloolooloolllolllllllllllllllllllyollClCCCCCCCCCCC?CC????CCCC??????A?>A>>AA>>>?>A>>># #=555555557555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555557555555555555555555555555555575555555555555555555557555555555555555555ClCllllllCllClCllllllllllllllllllolloolllloooooopooouuloooooooloooloollpoooopoooopoolooopoooooooooolooloooooolooolllllolllollllllllllllllllllluylCCCCCCllCCCCCCCCCC?CCC?CC????????>>?>>>>>=?>>>>>=C# #=5555555555555555555555555555555555555555575555555555555555755555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555ColClCllllClllCllllllllllllllolllllolooololooolllloouuoooooloooooooloolooooloooolooooooolloooollooloololoololllolollolllllllollolllllllCllllCllllllClCCCCCCCC?C?CCCCC??C?>?C?A?AAA>A>>>>>>>>>>>=>>_# #=5575555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555ClCCllllllClllllllllllllllllollllllollllollllolooooouulopolloooolooooooooooololooooollllloolloooooopooloolollolololllllolllllllllllllllllllCC{tCCllCCClCCClCCC?CC??CCCC??????>?>>>>>>A>>>>>>========# # =5555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555557555555555555555555555555555555555ClClCCllllCllllClllllllllolllllllolllllloolololllloluuloolllloololllooooopoooolloollooolooolooloollollollloolllloolllllllllllCllllllllCClllluylClCCCCCCCCCC????CC?C?????>????>C?>>>?>>??>>=A====>>>>B# #=5555555555555555555555555577555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555575555555555555555555555555ClCCCCCCCllllllCllllllllllllllllllllloooollllllllllluullloollolloolooooolooooooooooolooolollooolollloollllllllollollllllllllllllClllllllllllCClCCCCC?C??C?CC?C???AACC??CC???>?>>>>?>>>>>>>=>>>======z# #=55555555555555555555555555578755555555555555555555555555555555555555555555555555555555555555555555555555555555755555555555555555555555555555555555555555555555555555555555555555555557555555555555555ClCClllCClCCCllClllllllllCllllllllllolllllllllolollluuoooooooolooololloololllolllollooolllollllllllollllllollloolllllllllllllllCllllllllCClztCCCClCCC?CCClCCCCCC??C???>??A>>>>>>>>>>>?>>>=>==>>=>=>>=># #=55555555555555555755557CyC5555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555ClCCCCCCCCCClllCllClllllllllllllloollllllllllllolllouulllllloolollllolllllllooolllloloolllolllllloolllllloolllllllllllllllllllllllClCCCllluyllCCCCCCCClCCCC?CC??>?????????>>?AA?>>>>?>>>=>>>>==>======Z# #=55555555555555555555557?vC555555555557555555555555555555555555555555555557555555555555555555555555555555555555555555555555555575755555555555555555555555555555555775555555555555555557555555555555555555555555555555555555555555555ClCCCCCCCCCClCCllClllClllllllllllllllllllolllllolllluullllllollolllllllollllooloolllllllllllllllllllllllllllllllollllllllllllllllCllClllCllCCCCCCC?ClC?CCCCCCCCCC?????>?????>=>>>A?>>>>>>>==>=========# #=555555555555555555555555577557875555555555555555555555755555555555555555555555555555555555555555555555555555555555555555555555555555555755555575555555555555555565555555555555555555555555555555555555555555555555555555555555555555ClCCCCCClllCClCCClCllCllllCllClllllllllllolllllllllluullllllllllllllolloloollllollllllllllllllllllllllllllllllolClCllllllllClllClllllCCllutCCCCCCCC?CCCCCC?C?????A?????>>>>?>>>>>>>>=>>>>=>=>>=========B# #=5555555557555555555555555755555555555555555555555555555555555555555557755555555555575555555555555555555555555555555555555555555555555555555555555555555555555555555555555555755555555555555555555555555555555555555555555555555555555555ClCCCCCCCCClCCCCClClllllClCClCllllllllllollllllllllluullllllllllllollllollollllollolllllllllllllllllllllllllllllllClllllllCClClCClClCClCC{CCCCC?ClCCC????CC??C??>>????A?A?>>>>>>>>>>>>>>>=>==>=>========x# #=5555555555555555555555555555555555555555555555555555555555555555555555555575555555555575755575555555555555555555555555555555555555555575555555555555555555555555555555555555555555555555555555555555555555557555555555555555555555555555555CC?CCCCC?CCCCCCCCCCCCCllCClClllClCllllllllllllllCllluullllllolllllloollolllllllllllllolllollllllllllllllllllllollllllllllllllllllCClClllylCCCCCCCC???CC???C??C????C??>>?A?>>>>>>>>>>>=>>>==>=>==========># ;=55555555555555555555555555555755555557555555575557555555555555555555555555755555555555775555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555565755555555755555555555555555775555555555555555555555575Cl?>C?CCCCCCCCCCCCClCClCllCCllCllllCllCClllllolllllluullllllllllllllllllllllllClllollllllolllllllllllllllllllllllllllllllCCllCCClCCllCCt{CCCC?lCC???CCC?C?C??>>?A???>?A>?>>>>>>>>>>>>==>====>============Z# #=5555555555555755555555555555555555755555555555555555555755555555555755555555555555555755755555555555555555555575555555755575555555555555555555555555555555557555557555557555555557555555555555555555555555555555575555555555555555555555755CC??C??C?CCCCCCCCCCCCCCCCCllCCCCllCCClCllCCClllllllluuCllCCllllolooolllllloooolllllllllllllllllllllllllllllllClCClCllllllllCCCllCCClCCtuCCC??CCCC??lC??CCC??AC?A>>A>?>>>>>>?>>>>=>>>=>>==>===============# #=7555757755555555555555555555555555555555555555555555555555755555555555555555555555555555555555555555555555555655555755555555555555555555555555555755555555555555755555555755555555555555655555555555555555755555555555555555555555555555555555555CCC?CCC?CCCCCCCCCCCCClCCClClCCCllllllllllllllllClllluuCllollllllllllllllllllllllllClllllllllllllllllllllllllCllllCllllCCllCCCCCCCCClCyzCC?CCCCCCC??C????C?????>>??A>>?A?A>>>>>>>>=>>>>==================]# #=55555555557555555555555555755755555555555555555755555555575555555555557555555555555555555555555555755555555555555555555555555555555555555555555555575555555557555555555555555555555555767555555555555555555555575555555555555555555555555555556555ClCCCCCCCCCC??CCCCCCCllCCCClllCCClCCClllCClllllClllltulollClllllllllClllllllllllClllllllllClllllCCllllllllllCCllClllCCCllCClCCClllCCtCCCCCC??C????AC>>??>>>>>>A?>>>>>>?>=>>==>>====>===>>=============B# #=5555555555555755555555555555555555555555755557555555555555555555555555555657555755555555555767555755555555555555575555555555555775556555555555555555555755555555555555555555555775555555755555555555555555555555555555555555555555555555565575555578557CC?>?CC??CCCCCC?CCCCCCCCCCCCCCClCCClllCClCCllCCllllCutlllllllllllllllllllCCllllllllllllllllllllCClllllllClllClClClClCCCCCCCCCCCCCCCCzCCCC?C??C?>CC>?C?A?>A>??A>>>>>>>=>>==>>====>>======>============$Z# #=5555555555755555555555555555555555555555557555575565557555555555555555555555555555555555555555577555655555555557555555555677755775555555555557555555557555565555555655575555575555555555755555555755665555555555555555555555555555555557555555555557555555586CC????CC?C??CC??CCC?CCCCClCCClCCCCCCllllllCllllllllCutllCllllllllllllllllllClCllllCllllllllCllllllCClllClllCllllCllCCCCllCCCClC?CCCllCtC??C?CCA???>?ACC>??>?>A?>?>??>>>>>>>>>==>==>>===================# #=5555578555555555555555555555755555555755775555575575556555555557756555555555555555555575555557755575555557755575575755555557755555555575555555555755555555555555577555577557557755775755555555555556755777555755555555555556555557755755555555555555556575555555CCC????C?CCCCCCCC?CCCCCC?CC?ClCClCCCCCCllCCCCCClllCCttllllCCllllCllllCCllllCllClCllllllllllCClllllCllClllCCCCClCCCCCCCClClCCCCC?CCCtCCt{C????CC??A???>>???>???>>>>>>>>>>>A>==>>==>=====>================[# #=5555556755555555555655555755577555575557855555775555755555555555555555555555555755555555555$############;;########################################################################;###########;########;###############=55655555585557555555555555557555555555CCC?????????CCC??CC?CCCCCCCCCCCCClCCClCCClClCClCCCClttlllllllClllClCllCllllCllllllllllClllllClClCClllCClCCClCCClCllCCCCCCCClCCCCCCCCt??lytC????A?CC?A???>???>?A>>>>>?>>>>>>>>======>>================$$==@_$B# #=55556577777777777777777777777777777777777777877777777777777$77$77777777$77777777777779TTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTT97777777$77$$77$7$777=77787$777$7=7$7CC?????????????CCC??CCC?CCClCCC?CCCCClCCClCCCCCCCCllttlCCClllllClCCCllCllCCClCllClCCllCllllClllClCllCCCCCCllCCCCCCCCCCCCCCCCCCCCCC?CyCC??C???C?CC??>>??>?>>>?A>>>>>>>>>>>=>>>==>>================$===$===„=$=# #=555777;XVUVVXXU:V@VTV:#:VT:VTTT@YT::T:;T:##:TT####:TT#:T#TTT####TT#T#T##TTTTTTTTT###TT#"""""""T""T""""T"TT""T"""T""TT"T""""T""T""T""""T"TT""T"""T""TT"T""""T""T""T""""T"TT""T"""T""TT"T""""T""T""T""""T"TT""T"""T""TT"TTXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXYXXX[C?>A?????>??C?????CC?CC?C?CCCCC?CCClClCCCCCllCCCCCCltlCClllClCCClClllllClllllCllllCllClCCllCClClllCCllCCCCCCCCllCCCCl?ClCClCCC?CC??ltCC??A????C>????A?>>>>=>>>>?>=>===>>=>>=====================$$=$====$$$B# #=57555"TTTTTT"T"TT"TT""T"""""""""""""""TTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTXCA???A>??>??C???CCC??C?C?CCCCCCCCCCCCCCCCCCCClCCCCCttlCCCClClClCCCllllClCCCClllllCClCClllCCClCClCCCCllCCCCCCCCllCC?ClCCCCCC?CCC??CCCCx??????>>A>>>>>?>>?>>>>>>>=>>>>>>>=>=>==============$=$===$$$$$$$$$$Z# #=55565""""""""""""""""""""""""""YC>??????C?????CCC??????C?CC?CC?CCCCCC?CCCCCClCCCCCCttCCCCCCCllCCCCCCCCClCllllCCClCCllCCCCClCCCCClClCCClC?CCCC?CCCC?CC?CC?CC???C???CC??ûtC????A>?>>>>>>>>>?>?>>>>>>>>A>>===>>======================$$==B# ;=55665"YC>A>A>>?????C?????C??C???????CCCCC?CCCC?ClCCCCCCCClttCCClClCCCCCCCClClCCCClCClCClClllCCCCClClCCCCClCCllCCCCCCC?CCC?CCCCCC??CCC??C?C?>>??]ɔ]C??>>??>>>>>>>>>>>>>======>====================$==$$$$===Z# #  =55875"YC???>>>?>????>?????CCC??CCCCCCCC??CC??CCCCCCCC??CCCttllCCCCCCCClCCClClllCCCCCCClCCCCCCllCCCClClCCCCC?CCCCCCC?CCC?CCCCC???CC?C????CCCCC?>??tzttCA?>>A>>>>==>>>>>>>=======================$==$==B]# #=55565"HJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJHVC>>=>>???>>>???>??????CCC??CCCC??CC??CCCCCCC?lCCCCCtCCCC??CClCCCCCCCCCCCClllCCCCClClCClC?ClCllCCCCC?CCClCCCC?CCC?CC?CCCClC???CC????>>>?C??>?CtzÃ]ZC?A>=>>?=====>=>=====================@BZ###=566657JKKKKKKKKKKKKKKKKJJJJJJJJJJJJJJJJJJJJJJHJHHHHHHHHHHHHHHHHHHHHHHHHHGGHHHGGGGGGFGFFFFJKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKJFFFFFFGGHHHHHHHHHHHHGHHHHHHHHHHHHHHHHXC>>>?>>?A>>??>>??CCA???C?????????C?CC??CCCC??CCCCCCttC?CCClCCClC?CCCCCClCCCCCCCCCCClCCC?CCCCCCCCCCC?CCl?C?ClCC?CCCCCCCCC?C?C?????C??????>???>??>Cxƒx]]ZZBAAAAAAAAAAABBBZZZZ]_#9#=55566KKKKKKKKKKKKKJJJJJJJJJJJJJHGGFFFFJKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKJFFFFFGGGHHHHHHJHJJJJJJJJJJJJJJJJJJJJJJJJXC>A>?A>>>>?AA>??>?>A???>?A??C????????CCCC????CC?CCCttCCCCCCC?CCC?CCC??CCClCCCCCCCC?CCCCCCCCCC???CCCCC?CCC??C??????CCCC????A?>????C?>>?C?>??>>>>>>>>>AZ]# #=55665$KKKKKKKKKKKKKJJJJJJJJJJJJHGGGFFFJKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKJFFFFFGGGHHHHHHJJJJJJJJJJJJJJJJJJJJJJJJJJXC>A>>>AA>>>>>A>?>?>A?>??C?>??C??C???CC???CCCCCC??CCtt?ClCCCC?CCCCCC?CCCCCCCCCCCCCCCC???CCCCC??CCCCCC?CCCCCC?C?CC??C?????>>???CA?>????A>>>>>>?>>>>>>A>?A>>AAC]z# ;=555557KKKKKKKKKKKKKKJJJJJJJJJJJJHGGFFFFJKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKJFFFFFGGGGHHHHHJHJJJJJJJJJJJJJJJJJJJJJJJJXC>>>>>>>=>>>>??>>>>?????>?>???C???>?????CCCCC??CCCCltCCCCCC???C?CC?CCCC??CCCC?CCCCC???CCCCCCCCCCCC?CCCCC?C??C?C????????C??>>??AC>?>??>?>>>>>>>A>>?>>A>>>>=>====>==AABCBZZZZ_# #=566667KKKKKKKKKKKKKKJJJJJJJJJJJHGGGFFFJKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKJFFFFFGGGGHHHHHJHJJJJJJJJJJJJJJJJJJJJJJJJXC>==>A>>??>?>>A>>????>??>???????????????C?CC????CC?CtC????C?CCCCCC?CCCCCC?CC??lCCC??CCCCC??C??????>???C??CC??????????>?C???>C>>?>??>>>C>>>?>>>>>>>=>>>>>>>A>======>>>======># #=57556$KKKKKKKKKKKKKJJJJJJJJJJJHGGGFFFJKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKJFFFFFGGGHHHHHHHJJJJJJJJJJJJJJJJJJJJJJJJJXC>>>>>>>A>>?>>>A>>??>>>??C>>>>>????????????C?C?C?CCCt????????CCC??CC??lCCCC??CCC?CCC?CC?CC??C??C???C??C?>?C????C?CC????>A?>??>>???A>>>>>>?>>>>>>>>=>>=>=>>>=>>=======>=====A# #=666657KKKKKKKKKKKKKKKJKJJJJJJJJJHGGGFFFJKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKJFFFFGGGGHHHHHHJHJJJJJJJJJJJJJJJJJJJJJJJJXA=>>>>>>>>>>>>>>?>>>>>>=>?>????>?AC??????CC????????ttCC??CCC?C??>?C?CCC??????CCCC?CC??CCCC??C??C???C??C?>>?C?????C?A??>>?C>>>>?>>?>>>>A>>>>>>>>>>>=>>=>>=========>===>=====A# #=656657KKKKKKKKKKKKKKJJJJJJJJJJJJHGGGFFFJKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKJFFFFFGGGGHHHHHJJJJJJJJJJJJJJJJJJJJJJJJJJX?=>=>>>>>>>>>>>>>>?>??>>>>>>>A??????????>>C??A??>??tt??C?C???C?C?C?CCC???CC???????CC?>??CC?C>>>CC?????CC?????>????????A>??A>>????>>>A>>>>>>>>>>>>>>>>=>>===>===============># #=666667KKKKKKKKKKKKKKKKJJJJJJJJJJHGGGFFFJKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKJFFFFFGGGGHHHHHHJJJJJJJJJJJJJJJJJJJJJJJJJXCA>=?>>>>=>>>>>>>>>>>>>>??>>A>>>>??>??>A?>A?>>>C??CttCCC??>?CCCC?C>?CC????????????>???CC????CC??C???>??C?>>>???>>>>???C>>>???>>>>A>>>>>>>>>>=>>>=>>>>=====>================># #=556667KKKKKKKKKKKKKKJKJJJJJJJJJJHGGFFFFJKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKJFFFFFGGGHHHHHHJJJJJJJJJJJJJJJJJJJJJJJJJJX?==>>>>>>>>>=>>>>>>>>>?>>?>>A?>>>A>>>>A>???>A???>>?Ct??>??????CCC?C?????C???CC??CC??????????????????????>??>>>>??>?>>>AA>>?>>>>A>>>>>>>>>>>>=>>>=>>>>>==>=>===>============> #=666667XbbbbbbXXXXXXWXXXWXXXXXXXWWWWWWWWWWWWWWWWWWWWWWWWWWWWTWTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTWTTWTWTWTTTWTX?=>=>==>=>>=>>>>>??>>>A>>>?>???>?>>>??>>>C?>????>A?CtAA???>>??>?????>??CC?????????C?????>?????>?C?>?A>>A>>C>?>>?>?>>>>>?>>?>>>>>>>>>>=>>>>>>>=>>>>======>>======>==========> #=656667TTTTTTTTTUTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTT"TTT"TTTTT"TTT"TTTTT"""TTT""TTT"""TTT""TTT""TTT"""TTT""TTT""TTT"""TTT""TTT""TTT"""TTT""TTT""TTT"""TTT""TTT""TTT"""TTT""TTT""TTT"""TTT""TTT""TTTT"TTTTTTTTTTTTTTTTTTTTTTTTTTX?=>==>>==>>>>>>>>>>>>>>>>>>>>>A>>>>>??>>>?????>???>?x??????>?>?>??C??C??????C?????C>??A>?C??>CA???>??>A?>>??>A>?>?A?>>>>>>>>>>>>>>>>>>>>===>>>>==>>==>=====>===>===========> #=66565""""""V?=======>==>>>>>>>>>=>>=>>>>>>?>>?>>>AA>?A>>>>>>>>?A?>?C??>?????>??C?>??>???>??A???>>?????>>A>>>?>A>>>?>>??>>>>>>>A>>>>>>>>>>>>>>?>>>=>>>>>>>=>==>=====>==================>_##=666657""Y>>======>>>=>>>>>>>>>>>>>A>>>>>>>A>?>>>>>AAA>A>>>??>xt??>>>>>?>>??A??>>??>>?>>?>>>>>>A???>>>C?>?>???A>>A>>>A>>A>>>=A>>>=>>>>>>>>>>>>>>>==>>>==>===>>=======================@;; =666667"Y>=======>>==>==>>=>>>>>>>>>>>>>>>>>>>?>>>?AA>?>>?>>>C?>>?A?C>>>?>>??>>>???>>?????>???>>>A?>AA>?>??>>>>>>>>>?>>?>>>>>A>>=>>=>>>>>==>>>==>>=>=>>============================@Y =656667"V>========>====>>>>>>>>>>>>>>=>>=>>>>>>>>>>>>>?>>A>>>A]A>>>??>???>A?AA>?A>?>??A??AAA?>>>>>>>>>>>??>>>>>>>>>>?>>>>>?>>>>>>>>>>==>>==>>==>=====>=>========================$==@#=656667"HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHV>===================?=>==>>>>>=>>>>>>>>>>>>>?>>>>>>?>tt>>>>>>>>>>?>>??>>?>>??>>>>>>??>>?>?>>>>?=>>>>>>>A>>>?A>>=>>>>>>>>>>>>>>>>>>====================================$$==@[;[=666667KKKKKKKKKKKKKKKKKKKKKKKKJJJJJJJJJJJJJJJHHHHGFFFFFJKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKJFFFFFFGGGGGHHHHHHHHHHHHHHHHHHHHHHHHJHJJHX>======>==>===>=====>====>>>>>==>>>>>=>>>>>>?>>>>>>>>At?>>>>>>?>>>>>>>>?>>>A>>>??>>AA>A>>>>>A?>>>>>>>>>>>>>>>>>>>>>==>>>=>>>>===>=>=>======>==>===================$===$==@#=666667KKKKKKKKKKKKKKKJJJJJJJJJJHGGGFFFJKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKJFFFFFGGGHHHHHHJJJJJJJJJJJJJJJJJJJJJJJJJJX>=============>=>>===>>=>>=>>=>>>>>==>>>>>=>===?>>>>>>AxCA>>>>>>>>>>>>>>??>A>>>>>>>?>?>>??>?>>>?>>A>>>>=>>>>>>==>>>>>>=>===>=>>=>>================================$=$$$==@_ Y>665667KKKKKKKKKKKKKKKKJJJJJJJJJJHHGFFFFJKKKKKKKJHHHHHHHHHHHHM///MMMMMMMMQ\QQQQQQQQQQQQQQQQQQQQ4Q4444OOOOOOOOOOOOOOOOOOOOOOOOOOOO2VTHHHHHHHHHHHHHHHHHHHHHHJKKKKKKKJFFFFFGGGGHHHHHJHJJJJJJJJJJJJJJJJJJJJJJJJX>=====>===>=========>=======>>>>==>>>>=>>>>>>>>?>>>>>>>Czt>>A>>A>A>>?>>????>A>>>>>A>>>=>A>>A>>A>>>>>>>>>A>>>>==>>>=>>>>=====>===>=>>======>=======================$$$==$@@;Y=666667KKKKKKKKKKKKKKKKKJJJJJJJJJJHGGFFFFJKKKKKKKJO444OOOOOOOOOOO2222222224444444444444*+++++++++++++++++++++&++MKKKKKKKJFFFFFGGGGHHHHHJJJJJJJJJJJJJJJJJJJJJJJJJJX>=================>======>>=>>>=>=>>>>>>>>>>>>=>>>>>>>>>CŖŖŖŖśŖŖŖŖśŖŖŖŖ˄Y  @ =666667KKKKKKKKKKKKKKJJJJJJJJJJJHGGFFFFJKKKKKKKJ444O4OOOOOOOOO2222222222eeeeeeeeee4QQQQQQ\\\QQQ44*+++++++++++++++++++++&+&MKKKKKKKJFFFFFGGGHHHHHHJHJJJJJJJJJJJJJJJJJJJJJJJJX>==========>=============>=>==>==>>=>=>===>>>>>>>===>>=>>A_____[__[[[[[[[_[[[[[[_[[[[[[[[[[ZZZZZZZ[[ZZZZZZZZZZYZYZYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYY@; ##=666667KKKKKKKKKKKKKKKKKJJJJJJJJJJJHGGFFFFJKKKKKKKJO4ee͌4Q4Qhhhhhhhhfgggggca<+&MKKKKKKKJFFFFGGGGGHHHHHJJJJJJJJJJJJJJJJJJJJJJJJJJX>=============================>>>=======>=>>>=>>=>>=>>?>>>=]@$=$=$$$$$$$$$!$$!!!!!!!!!!!!!!!!!!!!!!! ! ! !    ;@=666667KKKKKKKKKKKKKKKKJKJJJJJJJJJJHGGFFFFJKKKKKKKJ44򾌌e4QQ4e˭V&&MKKKKKKKJFFFFFGGGGHHHHHHJJJJJJJJJJJJJJJJJJJJJJJJJX>===============================>====>>>===>>=>>>=>==>>>>>>=At––––––––Y=666667KKKKKKKKKKKKKKKKJJJJJJJJJJJHGGFFFFJKKKKKKKJ44󾌌e4QQ4e\&&MKKKKKKKJFFFFFGGGGHHHHHHJJJJJJJJJJJJJJJJJJJJJJJJJX>==========================>======>=====>>>=>=>>==>>>>>====>>>>AtZ]xzxzzzzzxzzzzzzzzzzzxzzzzzzxzzzxxxzzzzxzzzzzxzzzzzxzxxzxxzxzxxzxxxxxxxxxzxx__xxxxxx__xx____xx___xx__________;=666667KKKKKKKKKKKKKKKKKKJJJJJJJJJJHGGFFFFJKKKKKKKJ44󾌾4QQ4e\&&MKKKKKKKJFFFFFGGGHHHHHHJJJJJJJJJJJJJJJJJJJJJJJJJJX>$==============================>=======>====>>====>=>=>==>>==>>>>=>>=>>>>>>>>>==>=>>=>>>>>==>>>>>>>>==>>==>>>====>=>=>>>=================================$$=$==$$$==$$$$$$$$$$@[ =666667KKKKKKKKKKKKKKKKKJJJJJJJJJJJHGGGFFFJKKKKKKKJ44󾌾4QQ4e^&&MKKKKKKKJFFFFFGGGGHHHHHJJJJJJJJJJJJJJJJJJJJJJJJJJX>=================================>===============>======>===>>====>>==>>>=>==>>>>>=>>=>=====>>==>>=>>>>=======>=============>======================$=====$==$$==$=$$$$$!$$$$$$=ȂY =666667KKKKKKKKKKKKKKKKKKJJJJJJJJJJJJHGGFFFFJKKKKKKKJO4󾌾4QQ4e^&&MKKKKKKKJFFFFFGGGGHHHHHHJJJJJJJJJJJJJJJJJJJJJJJJJX>==$===========================================>==>===>==>===>=>=======>===>>>>=>==>===>=>=>>===>>>===============>====>>================================$=$$$$$$$=$$!$$$$$$$!!$B[___[_______[[_[_[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[Y[[[[Y[[YZYYYYY[YY[YYYYYY[[YYYYY[Y[YYYYYYYYYYYYY[[YYYY[YY@;# =666667KKKKKKKKKKKKKKKKKKJJJJJJJJJJJJHGGFFFFJKKKKKKKJOO󾌌4QQ4e^&&MKKKKKKKJFFFFFGGGGHHHHHJJJJJJJJJJJJJJJJJJJJJJJJJJX>$=$=$$=========================>>====>=====>>=>>========>>=>==========>==>========>==>=>>=>>===>==>================>===========================$==$$$==$=$$==$$=$$$=$$$!$$$!$!!$$$!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!     =666667KKKKKKKKKKKKKKKKKJJJJJJJJJJJJHGGGFFFJKKKKKKKJOO󾌌4QQ4e^&&MKKKKKKKJFFFFFGGGGHHHHHHJJJJJJJJJJJJJJJJJJJJJJJJJX>====$====$$===========================>>=============>=========>=======>>>==>>===>>==>>>=>==>======>>======>====>========================$=========$$==$$$$$$$$$$$$$$$$$$!!!$!$$!!!$!!!!$!!!!!!!!!!!!!!!!!  ! !  !    =666667KKKKKKKKKKKKKKKKKKJKJJJJJJJJJJHGGFFFFJKKKKKKKJOO󾊌4QQ4e\&&MKKKKKKKJFFFFFGGGHHHHHJJJJJJJJJJJJJJJJJJJJJJJJJJJX>$=====$$============$$==========================>==>===========>=====>====>=========>=>>====>====>==========================================$$$==$$=$$===$$==$$$$$!$$$$$!!$!$$!!!!!$!!!!!!!!!!!!!!!!! !! !!   =666667KKKKKKKKKKKKKKKKKKJJJJJJJJJJJHGGGFFFJKKKKKKKJOO󾊌e4QQ4e^&&MKKKKKKKJFFFFFGGGGHHHHJHHJJJJJJJJJJJJJJJJJJJJJJJJX>$$$$$$$$=========$===$====$========================>>===>========>==>===>====>=====>=======>======================>=====================$======$=$$$=$==$$$$$$$$$$$$$!!!$$!!!$!!!!!!!!$!!!!!!!!!!!!!!!!! !!!    =666668KKKKKKKKKKKKKKKKKJJJKJJJJJJJJJJHGGFFFFJKKKKKKKJOO󾊌4QQ4e^&&MKKKKKKKJFFFFFGGGGHHHHHHJJJJJJJJJJJJJJJJJJJJJJJJJX>=$$$$$==$=$==$=$=================================================>===========>=====================================================$=$$==$==$===$$$$===$$$$$!$$$$!$$$!!!$!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!! !!    =666667KKKKKKKKKKKKKKKKKKJJJJJJJJJJJJJHGGGFFFJKKKKKKKJOO󾊌e4QQ4eޭ^&&MKKKKKKKJFFFFGGGGHHHHHHJJJJJJJJJJJJJJJJJJJJJJJJJJX>$$$=$$=$=$$$$$=$================================================>>===============================================================$======$$$$$$==$$$=$$$$!$$$$$$$$$$!$$!!!$!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ! !!!    >666667KKKKKKKKKKKKKKKKKKJJJJJJJJJJJJJHGGGFFFJKKKKKKKJOO󾊌eOQQ3eӨ]&&MKKKKKKKJFFFFFGGGGHHHHHJJJJJJJJJJJJJJJJJJJJJJJJJJX=$$$$$$$$$$$=$$====$$=======$===================================================================================================$$===$=$$$=$$$=$$=$$$$$$=$!$$$$!$$$!!!$!$!$!!!!!!!!!!!!!!!!!!!!!!!! ! ! ! !   =666667KKKKKKKKKKKKKKKKKKKJKKKJJJJJJJJJJJHGGFFFFJKKKKKKKJOO󾊌OQQ3eέ]&&MKKKKKKKJFFFFFGGGGHHHHHJHJJJJJJJJJJJJJJJJJJJJJJJJX=$$$==$$$$$$=$$=$$$========================================================>============================================$=$$======$=$$=$$$$$=$$$$=$$$$$$$$!$$!$!$!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!  ! !    =666667KKKKKKKKKKKKKKKKKKKKKKJKJJJJJJJJJJJHGGGFFFJKKKKKKKJOO󾊌eOQQ3e[&&MKKKKKKKJFFFFFGGGGHHHHHJJJJJJJJJJJJJJJJJJJJJJJJJJX>$$$$$$$$$=$$$$$$$$$$$$$$======$==$======$==$==========================================================================$$=====$$==$$==$==$$==$$$$$$$$=$!$$$$!!$!$!!!$$!!!$$!!!!!!!!!!!!!!!! !! !!!!!    =666667KKKKKKKKKKKKKKKKKKKKKKJJJJJJJJJJJJJHGGFFFFJKKKKKKKJOO󾊌eOQQ3e^&&MKKKKKKKJFFFFFGGGHHHHHHJHJJJJJJJJJJJJJJJJJJJJJJJJX>$$$$!$$$$$$$$$$$=$$==$$===$$$=$=====$======================================================================================$=$=====$$$$$$$$$$$$$$$$$$$$$$!!!$!$!!$$!!$!!!!!!!!!!!!!!!!!!!!!!!!!!! ! !  !     =666668KKKKKKKKKKKKKKKKKKKKKJJJJJJJJJJJJJJHGGFFFFJKKKKKKKJOO󾊌e2QQ3e^&&MKKKKKKKJFFFFGGGGGHHHHHJJJJJJJJJJJJJJJJJJJJJJJJJJX=!$$!$$$$=$$!$$$$$!$$=$$=$$$=$=====$=$=======$==$===================$========================$$=================$==$==$=$=$$$=$===$$==$$$$$!$$$!$$$$$!$$$$$$!$!!$!!$!!!!!!!!!!!!!!!!!!!!!!!!!! ! !  !    =666667KKKKKKKKKKKKKKKKKKKKKKJJJJJJJJJJJJHGGGFFFJKKKKKKKJOO󾇌eOQQ3e^&&MKKKKKKKJFFFFFGGGGHHHHHHJJJJJJJJJJJJJJJJJJJJJJJJJX=$!$$$$$!!$!$$$$$$$$$$$$=$=$=$$$=$$$============$==============$==$=$===$====================================$$$=====$=====$==$==$$$$$$$=$$$$=$$$$!!$$$!!!!!$$!!!!!!$!!!!$!!!!!!!!!!!!!!!!!!! !! !    =666668KKKKKKKKKKKKKKKKKKKKKKJJJJJJJJJJJJJJHGGGFFFJKKKKKKKJOO󾇌eOQQ3e^&&MKKKKKKKJFFFFFGGGGHHHHHHJJJJJJJJJJJJJJJJJJJJJJJJJX=$!!$$$$$$$$$$$$$$=$$$$$=$$$$$$$$$$$$$$==$=$$$===$=$$=============$====$======BBZZZZB@===========$$$==$$====$$==$$=$=$$$$$$=$$==$$=$$$$$$$!$!$!$$$!!$$$$$!!!!!!$!!!!!!!!!!!!!!!!!!!!!!! !!!! ! !!!   =666667KKKKKKKKKKKKKKKKKKKKKKKKJJJJJJJJJJJJJJHHGGGFFFJKKKKKKKJOO󾇌eOQQ3eb&&MKKKKKKKJFFFFFGGGHHHHHHJJJJJJJJJJJJJJJJJJJJJJJJJJX=!!$$$$!!$!!$$$$$!!$$$!$$$$$$$==$$$$$$$==$$$=$$$=$$===$===$$==============Bxȅ_=$===$==========$$$=$$$===$$$$$$$$$$!$$$$$!$$$$$$$$$$$$!!!$!!$!!$$!!$!!!!!!!!!!!!!!!!!!!!!!! !!! ! !     =666668KKKKKKKKKKKKKKKKKKKKKKKKJJJJJJJJJJJJJHHGGGFFFJKKKKKKKJOO󾇌e2QQ3eb&&MKKKKKKKJFFFFFGGGGHHHHHJJJJJJJJJJJJJJJJJJJJJJJJJJX=$!$$!$$!!$!$$$$!$$$!$!$$!$$$$$$$$$$$$$=$$$====$$====$==$===$===$==$$=$=ZυB=====$$$$$$=$$==$==$$$$$=$$$=$$$$$$$$$$$$$!$!$!$!$!!$$!!!!!$$!$!!!!!!!!!!!!!!!$!!!!!!!!!! !!!! !!  !          =666668KKKKKKKKKKKKKKKKKKKKKKKJJJJJJJJJJJJJJJJGGGFFFFJKKKKKKKJO3󾇌e2QQ3e[&&MKKKKKKKJFFFFFGGGGHHHHHHJJJJJJJJJJJJJJJJJJJJJJJJJX=!!!!!!!$!!!$!!$$$!!$$!$=$=$$$$$$=$$$$$$$$==$=$$==$==$$!$=$====$$=====ZA=$$$======$$=$$=$=$$$!$$=$$$$$$$$$$$$$$$$!!$!!$!!!$$!$$!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !    YÕ [[ [ =666667KKKKKKKKKKKKKKKKKKKKKKKJJJJJJJJJJJJJJJJHHGGFFFFJKKKKKKKJO3ee2QQ3e]&&MKKKKKKKJFFFFFGGGGHHHHHJJJJJJJJJJJJJJJJJJJJJJJJJJX=!!!!$$!!!$!$$$!$!$!$$$=$$$!$$$$$$$$$$$$$$$$$==$$=$$==$$$$$===$$$$$=@_=$$=$$$$==$$$$$$$$$=!$!$$$$$$$$$$!!$$$$!!$$!$$$!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!  !   ; #=ii6ii8KKKKKKKKKKKKKKKKKKKKKKKKJJJJJJJJJJJJJJHHGGFFFFJKKKKKKKJ22ee2QQ3eϨ]&&MKKKKKKKJFFFFFGGGGHHHHHHJJJJJJJJJJJJJJJJJJJJJJJJJX=!!!!!!!!!!!$!!!!!$$$$!!$!$$$$$$$$$$!$=$$$$!$==$$=$$==$$$$$$$==$$$$BB=$==$=$==$$$$=$$$$$=$$$$$$!$$$$!$$$$!!!$$!!!!!!!!!!!!$!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ! !     ; #=ii6i68KKKKKKKKKKKKKKKKKKKKKKKKJJJJJJJJJJJJJJJJJHHGGFFFFJKKKKKKKJ22ee2QQ3eӨ]&&MKKKKKKKJEFFFFGGGHHHHHJJJJJJJJJJJJJJJJJJJJJJJJJJJX=!!!!!$!!!!!$$$!!!$$!$!$!!$$$$!$$$$$$$!$$$$$!$$$$!$$$$$$===$$$$$$$ZΖ_BB@@BZB$$$=$$$$$$$$$$$$=$$$$$!$$$!!$!$$!$!!!$!!$$!!!$!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!! ! !   ; #=6iii67KKKKKKKKKKKKKKKKKKKKKKKKJJJJJJJJJJJJJJJJJHHHGGFFFFJKKKKKKKJ22ee2QQ3ḙ\&&MKKKKKKKJFFFFGGGGGHHHHJHHJJJJJJJJJJJJJJJJJJJJJJJJX=!!!!!!!!!!!!!!!$$!!!$$!$!$!$!!$!$$$!!$$$$$$!$!$$$$=$$=$$$==$$$=$YZ=$$$$$$$$$$@]$$$$!$$$$=$$$$$$$$$$!$$$$$$$$!!$$$!$$$$!!$!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ! !      ; #=i6i668KKKKKKKKKKKKKKKKKKKKKKKKKKJJJJJJJJJJJJJJJJJJHHGGFFFFJKKKKKKKJ22󾇌e2QQ3eϭ^&&MKKKKKKKJFFFFFGGGGHHHHHHJJJJJJJJJJJJJJJJJJJJJJJJJX=!!!!!!!!$!!!!!!!!!!!!!$$!$!$!$$$!$$!$$$$$!$!$$$$$$$$!$$!$$$$$$$@Z$$$$!$$$=$$$$$$=_=$$$$$$$=$!$!$$$$$!$$$!$!!$$$$$!!!!!!!$!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!![;! !! !  !  ; #=6ii6i8KKKKKKKKKKKKKKKKKKKKKKKKKKJJJJJJJJJJJJJJJJJJHHGGFFFFJKKKKKKKJ22ee2QQ3e^&&MKKKKKKKJFFFFGGGGHHHHHHJJJJJJJJJJJJJJJJJJJJJJJJJJX=!!!!!!!!!!!!!!!!!!!!$!!!!!$$$$$!!!$!$!$$$$=$$!!$$$$$$$$$=$$$$$@=$!$$$$$=$$$$$$$$$$@_=$$$!$!$$$!$$$$$!$$!!!!$!!$$$!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!@      ; #=iii6i8KKKKKKKKKKKKKKKKKKKKKKKKJJJJJJJJJJJJJJJJJJJJGGGFFFFJKKKKKKKJ22ee2QQ2eޭ^&&MKKKKKKKJFFFFFGGGGHHHHHJJJJJJJJJJJJJJJJJJJJJJJJJJX$!!!!!!!!!!!!!!!$!$$!!!!!!!!!!!!!!!$$$$$$$!!$$!!$$$$$$!!$$$$$!$9$!$$$$$$$$$$$$$$==$$=_[$$$$$=$$$$!!!!$$$!$$$!$$!!!!!!!!$!!!!!$$!!!!!!!!!!!!!!!!!!!!!!!!!!!!  !!@! !    ; # =i666i8KKKKKKKKKKKKKKKKKKKKKKKKKKKKJKJJJJJJJJJJJJJJJJJJJHHGGFFFFJKKKKKKKJ22󾇌e2QQ3eޭ^&&MKKKKKKKJFFFFGGGGGHHHHHJHJJJJJJJJJJJJJJJJJJJJJJJJX$!!!!!!!!!!!!!!!!!!!!!$!!$!!!!!!!!!!!!$$$!!$$!!$$$!!$$$!!$$$$$[_$$$$$!$!$!!!$!$$$$$!!$$$$$!!$$$!!$!!$$!$!!!$$$!$$!!!$$!!!!$!!!!$!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!! [!    ; #=iii6i8JKKKKKKKKKKKKKKKKKKKKKKKKKKJJKJJJJJJJJJJJJJJJJJJHGGGFFFFJKKKKKKKJ22eee2QQ3e^&&MKKKKKKKJFFFFFGGGGHHHHHJJJJJJJJJJJJJJJJJJJJJJJJJJX$!!!!!!!!!!!!!!!!!!!!!!!!!!!$!!$!!!!!!$!!!!!!$!!$!!!$$$$$!$$!9$!$$$!$!!!$$$$$$$!!!$$!$$$$$!$!!!!!$$!!!$!!$!$$!$!!!$!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!! !! [!   ; #=iiiii8JKKKKKKKKKKKKKKKKKKKKKKKKKJJJJJJJJJJJJJJJJJJJJJHHHGGFFFFJKKKKKKKJ22eg2QQ2e׭\&&MKKKKKKKJFFFFFGGGHHHHHHJHJJJJJJJJJJJJJJJJJJJJJJJJX$!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!$!$!!!$!$$!!!!$!!!!!!!$!!_9$!$$!!!$!!$$$$$!!!$!$$$!$!$$$$$$!$!$$$!!!$$!!$!!!!!!!!!!!!!!$!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!! ! ! @   # #=6ii6i8JKKKKKKKKKKKKKKKKKKKKKKKKKKKKKJJJKJJJJJJJJJJJJJJJJJHHGGFFFFJKKKKKKKJ22eg2QQ3eϭ^&&MKKKKKKKJFFFFGGGGGHHHHHJJJJJJJJJJJJJJJJJJJJJJJJJJX$! !!!!!!!!!!!!!!!!!!!!!!!!!!!!$$!!!!!!!!!!!!!!!!$$!!$$!!!!!9B!$$$!!$!$!!!!$!!$$!!!$$!!!!$!!$!!!!!!!!!!!!!!$=@@@@9$!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!! !_9    #[______________________Y  #=66iii8KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKJJJJJJJJJJJJJJJJJJJJHHGGGFFFFJKKKKKKKJ22ee2QU2e^&&MKKKKKKKJFFFFFGGGGHHHHHHJJJJJJJJJJJJJJJJJJJJJJJJJX$ !!!!!!!!!!!!!!!!!!!!!!!!!!!!!$!!!!!!!!!!!!!!!$$$!!!!!!$!!Y!!!$$!!!!!!!$!$$$!!$$!!!!!!!!$!$$!!!!$!!!!!9YÁ@$!!!!!!!$!!!!!!!!!! !!!!!!!! !!!9BB@9! !! !@[9  ; #=6iiii7JKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKJKKKJJJJJJJJJJJJJJJJJJJJJHHHGGFFFFJKKKKKKKJ22eg2QU2e[&&MKKKKKKKJFFFFFGGGGHHHHHHJJJJJJJJJJJJJJJJJJJJJJJJJX$ !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!$$!!!!!!!!!!!!!@!!!$!!$!!!!!!!$!!!!!!!!!!!!$!!!!!!!!!!!!!9[Y!!!!!!!!!!!!9999!!!!99!!!!!!!!@΂;! !! !   ; #=i666i8JKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKJJJJJJJJJJJJJJJJJJJJJJJHHHGGFFFFJKKKKKKKJ22eg2QQ2eޭ^&&MKKKKKKKJFFFFFGGGHHHHHHJJJJJJJJJJJJJJJJJJJJJJJJJJX$ !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!$!!!!!!!!!!$$9$!!$$!!!$$!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!@;!!!!!!!!!Ȗ;!@;!!! !_Y ! ;_ !_  _Ƅ ; Y@@@@@@@@@@@Y=ii6ii8JKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKJJKJJJJJJJJJJJJJJJJJJJJJJHHGGGFFFJKKKKKKKJ22eg2QU2e^&&MKKKKKKKJFFFFGGGGGHHHHHJJJJJJJJJJJJJJJJJJJJJJJJJJX=!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!$!$$!;_!!!!!!!!!!!!$$!!!!!$!!!!!!!!!!!!!!!$!!!!Y@!!!!!!!9[ !! _@ ! [!9YY ; =666ii8JKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKJJJJKJJJJJJJJJJJJJJJJJJJJJJJHHGGGFFFFJKKKKKKKJ22ee2QU2e\&&MKKKKKKKJFFFFGGGGGHHHHHHJJJJJJJJJJJJJJJJJJJJJJJJJX$!! ! ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!B@!!!!!!!!$!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!Z@!!!!!!9@!!!@! [  Y#;Y; =ii68>>JKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKJJJJJJJJJJJJJJJJJJJJJJJJJJHJHGGGFFFFJKKKKKKKJ22e4e2QU0\ޭ^&&MKKKKKKKJFFFFFGGGGHHHHHJJJJJJJJJJJJJJJJJJJJJJJJJJX$  ! ! !! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!![9!!!!!!!!!!!!!!!!!!!!!!!!$$!!!!!!!!!!!!BÁZYZ[;!!!!!9! !Y   [  ; =@YB@=[hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhdBB>==@B[d=[hhhhhBBhhhhhVMghhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhcV$CU,,hhhdA=[dghd^dhhhhhhhhhhhhhhhhhhhhhhhh[_hhhhhhhhhhdd_>[ddgd>[hhhhhBBhhhhhVWhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhgUu !-,,hhhZ>^hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhdZ_hhhhhhhhhhhhd>[hhha>[hhhhhZBhhhhhV-chhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhb-Al\,,,hh[hhhhhhhhhhhgdddhhhdhhddhhhhddghhddhhddhhhdhhhhd>_hhha>[hhhhdZAhhhghVMghhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhgT:$>M,,,hh[>dhhhhhhhhhhfZAAA]hdAZZ>ZhhdZAA[gdZZhdZZfdZZghhhd>_hhha>Zdd_daAAdhhhhVXhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhb-v !^-,,,ghZAdhhhgggghhdCA[_[>ZdA[dggZ>__agdABgg_>ZZA^hgghd>[ghhd>>>>>dghggVchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhg0Ul   vM,,,hdZAdggggghggh_>_hgg[A_>^ghggZ>_dggd>BgggZ[gghhhd>[ghhd>ZddaddA>dghggVThhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhU-C!u^-,,,hg[^ghgggghgg[Adggga>_ZghghhaA>A[dd>Bggg^>hggghd>[ggg^>[ggggdB>dgghgVWhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhcUA  oM,,,,ggd>AdghgggddgZ>aggg[>[Zggggggd_B>^d>BgddZZgdgggd>[dgg^>[gggggC>dggggVchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhT-C !u\,,,gdg[A_dddd[[d_Z^dcAC^Zddddg[^d_>_d?Zdg_>ZZ>_gdgga>[ggg^>[dgdggZAdgddgVUhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhb-l!!v0,,,,ddgd[>AZBA>Zdd]>>A>CadZddddaAA>AadAZddAA^cCAcdgdc>[dgg^?[dgggdBCdgdddV-bhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhgXv$>{:,,,,,dddgg^ZZCBZ^dggd_]Z[ddd[_ddddd^]Z[adcZ[d_]_dd_[^ddddZ_ddda]_ggggd[[dddccVghhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhWن>  C^-,,,ddcdccddcdcdcccdccdddcddcddggcdddcddcdddddddcddddddddcdccdddcgdddccdddgdUUhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhcv==w,dccdcccdcccccccddddgcccccddccccdccddddccccccccdcccdcccdcdddddcdddddccdccU-bhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhUVنl$ =u:dccdcddccddcccgccccdcccdccddcdcccccccdccccccccdcdccdcccdddcdcddccddcccccUghhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhb-^טo= !>uVcccdcdcccddcdcccccccccdccccdccccccdccddccdccccccccccccdcdcdccccccddcccccU WhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhgMaٜyC=!!=l}bcccdcccddddccccccdccccdcccccdcccccdcccdccdccccccdcccccccccccccccdcdcccccT chhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhXӞuC>=$!!! ! ! ! !!!!!!!!! !! !! ! ! ! !!! !!! !!! ! ! ! !! ! !! ! ! !!! ! ! !!!!!! ! ! !!! !! ! !!! ! ! !!! ! !!! !! ! !!!!! !!!! ! ! ! !!!!! !!!! !!!!! ! !!!! !! !!!!!!!!! !! !! !! !!! ! !! !! !!!!!! !! !! !!! ! ! ! ! !!!!!! !!!$=Alv^-ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccT:ghhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhgʞ^-,,,X;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;@bcT XhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhVMa-cbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbccTchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhb^-ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccT:ghhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhgTa^-ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccT-Xhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhb-^VccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccT chhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhgV߅:cccccccccccccbccccccccccccccbbcccccccccccccccccccccccccbbcccccccbbccccccT UhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhX"a,ccbbXXbccccccbccbbbbbbbbbbbcccccccbbcbccccccbbcccccccccbbccbbccbbbbcbccbT-bhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhcVߖV-cbbYXYYbccbbbcbcbXYbbYXY@YYbcbbcccbbbbbbccbbbbbbbbcccbbbcccbcbbccYXbbccbT dhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhT:^0bbbYbbYY[YXYYYYbbYBYYYbY@bY[cbYYbXY@@XYYY[YY@YYYbbXYbYYYYYXY[YYbY@YbbbcbTUghhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhb--Vʂ:bbbYXbBY@Y@@YBXbbYYXYYbYBbYYbbYYYYX@BX@@BYYY@XYYbbY@XB@BYXBYY@BYYYYbbbbbT-bhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhgT VɁ:-bbbbYYYbXXY@YYbbbbYYbXYYYBYbXXBYbYBBYXYYYXXYYbYYbbYYXYBYYbYXXYYXYBYbbbbbTMghhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhX:fa:bbbbbbbXbbXbbbbbXbbbbbbXbbbbbXYbbbbbbbbbbbbbbbbbbbXXbXXbbbXXbbbbbXXbbbbbT Xhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhc   -^ƂVXbbbbbbbbbbXbbbbbbXbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbXbbbbbbXbXbbXbbbbbTchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhW "VɖVXXbXXXXbbbbXbbbbbXXbbbbbXXXXXbbbbbbXbbXXXXXXXXXXXXbbbbXbbbbXXXbbbbbXXXXbTTdhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhc    :Y_ɝ[V:XXXXXXXbbXXXbbXbXXXbbbXbXXXXXXbbbXbXXbXXXXXXXXXXXXXbXXXXXXbXXXbXXXXXXXXXTXhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh:     ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::bhfdacbXXXYVV@@;@YV::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::0-XXXXXXXbXXXXXXXXXXXXXXbXXXXXXXXbXXXXXbXXbXXXXXXXXXXXXXXXbXXXXXXXXXXXXXXXTdhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhb-    TghhhccXXTTXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXUXXXXXXXXXXXXXbXXT Thhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhg       UghhccbXTTTXTTTWXXXXXXXXXXXXUXXXXXXXXXbXXXXXXXXXXXXXXXXXXTTXWTTXXXXWXXXXXXXXXT -bhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhW      UhhhgcbXXT"TTTTTUUTTTXXXXXXXXXXUTTXXXXTXXXTghhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhd                  WhdcbXXTTTTTTTTTTTTTUhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhU                 WhhdcbXXTT -bhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhb                  XhdcbXXTTMghhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhgM                        XhhgcbXVT"""  WhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhX                      XhhgcbXVT""       chhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhd                         XhhdcbXXT"     TghhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhW                          XhdcbXX:""  Xhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhc                              XhhdcbXXT"    chhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh:                             XhhgcbXUT"""     Tghhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhb                                XhhgcbXXT"    XhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhgM                              XhhdcbXXTT"    dhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhX                                     XhhdcbXVT"""T      Uhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhc                                        XhhdcbXUTT"   bhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhg:                              XhhgcbXU:T"UUT:UUUUUU:::TTUUTUUUU:TUUUUTU:T::U::U:U:U:TTU:UTT:U:UUUUU:UTTT:U:U:TT::UUU:T:U:TTU:TTTTT::UU:UTUUUUTT:WhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhcUTTTTTT:UTTTTTTTTTTTTTTTTTT:UTTTTTTTTTTTTTTTTTTTTTTTTTTTTTUTTTTTTTTTTUTTTTT:TTTTTTTUTTTTTTTTTTTTTTTTTTTTTTT:TTTTTTTTTTTTTTTTTTUTTTT:TTTTTTTTTTU:TTTTTTTTTTTTTTTTU:TT::::TUTTTTU:TT:UUTTTTTTTU:TUTTTTU:U::T:UUUU:T:bhdcbXXT"":UU:UT:UU::U:UU:UUUUUU:U:UUUTUUUUUUUU:UUUUUUUU:UUUUUUUU:UU:UUUU:UUUUUUUUUUUUUUU:U:UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhdcbXXT""TghhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhggghghghhghhhhhhhhhhhhhhhhhhhhhhhhghhhhhhhgggggghhhhhgggghgghhhhghghhhhhhhhhhhhghhhhhhhhghhghhhhhhhghgghhhghhhghhggghhhhhhhghhghhhhhhhhhhhhghghhhhhgghhhhhhhhhgghhhhhhhhggggghghgghhhhhghhhghhhhhhhhhhhhhhhhgghhhhhhgghgghhhhhhhhghhhggghhhhghhhhhhhhhhhhhhhhghghhhhhhhghhhhhgghghhhhhhghhghhgghghhhhhhhhhhhghhhhhghhhghghhhghhhhhhhhhghghhghhhhhhhhhggghghgghhhhhhhhhghhhhhhhhhhhhhhhhgghhhhhhhghhghhhhhhhhggggghhhhghghhhhhhhhhhhhhhgcbXXTT""TdghhghghhhhhhghhhhhhhhhhggghhhhhgggghghhhhghhhhhhhhhhhhhhhhhhhhhhhhhhhghhhhhhhghhhhhhhhhhhhgggggghhhhhhhhhhhhghhhhhghhghhhhhhhgghhhhhhhghghhhhhhgghhhghghhhhghhghhhhXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXbXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXbXXXXXXXXXXXXXbXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXbXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXbXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXbXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXbXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXbghhgcbXXT""XXXXXXXXXXXXXbXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXbXXXbXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXbXXXXXXXXXXXXXXXXXXXXbXXXXXXXXXXXXXXXXXXXXXbXXXXXXXXXXXXXXXXXbXXXXXXbXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXbXXXXXXXXbXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXbXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXbXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXbXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXbXXXXXXXXXXghhgcbXXU"""XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXbXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXbXbXXXXXXXXXXXXXXXXXXXXXXXXXXXXXbXXbXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXdhdcbXVT"""XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXchhgcbXUTT"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXVXXVXXXXXXXXVXXXXXXXXXXXXXXXXXXVXXXXXXXXXXXXXXXXXXXXXXXXXXVXVXXWXXUXXXXXXXXXXXXXXXXXXXXXVXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXVXXXXWXXXXXVXVXXXXXVXXXXXXXXXVXXVXXXXXXXXVXXVXXVXXXXVXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXVXXXVXXXXXXXXXXVXXXXXXXXXVXXVXXXXXXXVXXXXXXXXXXXXXXXXXXVXXXXXXXXXXXXXXXXXXXVXVXXVXXVXXXXVXXVXVXXVXXWXXUXXXVXXXXXXXXXXXXXXXVVXXXXXXVXXXUUVUXXXXUXXXXXUXXXchgcbXXTT"WXXVXXUUVXXXXXXVUUXXXXXXXXXXXXXXXXXXXXXVXXXUXXXXXXXVXXXXXXXXXXXXXXXXXXXXXUXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXVXXXXXXXXXVXXXXXXXXXUUUUUVUUXUUVVVXUUUUUXXUUUUUUXXUUUUdccddcccddcdccccccdcdcdccccdccddcdccdcccccccccdddcccccdcdcccdcccccdddccccccdcccddccddcdcccccddcccccccccccdcdcdcccdcccdddccddcdcccccccccdccccccccdcccccddccccccccdccdcccccccdccdccccddddcdccccddcccdcccdccccdcccddcccccccddccddddccccccddccccddccccccccccccdccccccccccccdccccccccccccccccdcdcccccccccccdcccccccddccccccccccdccccccccccccccccddcccccccccccccccdcccccccccccddcccccccccccccccccccccccdccddcccccccddcccccdccccccccccccccghdcbXUT""bcccccccccccccccccccdccccccccccccccdcccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccchhhhhhhhhhhhhhhhhhhhhhhhhhdcbXUTTTghhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhdcbXXTT"ThhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhccbXXTTThhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhdcbXXUT"""ThhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhdcbXXTT""ThhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhdcbXX:T"ThhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhgcbbXTTThhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhgcbXXU""ThhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhdcbXXT"""ThhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhdcbXXT"ThhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhgdbXXTTThhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhdcbXXT"ThhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhdcbXXT""""""ghhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhdcbXXTT""TghhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhdcbXXTTTghhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhdcbXUTTTdhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhdcbXUTT"TghhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhgcbXXT"TdhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhghhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhgcbXX:"TdhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhdcbXXT""TghhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhdcbXXU""TghhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhdcbXUTTT"""TghhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhdcbXUTTTTdhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhghhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhCorsixTH-0.63/CorsixTH/Bitmap/mainmenu480.pal000066400000000000000000000014001347163623700206360ustar00rootroot00000000000000                                               ! $ ! " '#$' *( #&'!$"%(),*, "%#$) "(#)%  + - *!.$.!" &""!&$'!*"-%.")#+$*%-#/$0"0$2%4#/&1&6&1'3'7(2(7)1)4)8+:)9,:&",,.!%#),2 #, !&0)5!!! #'!$'%%% #("%) &-$'*$'+"(.&(+%)-***(*-*,.--+--- '0"*1!*4!+3",4$*1$+4&,2%-5 +7!,8$-8(+/*-2).4,.1+/3(/8'/6'/9*05.02-15.37*09-3:,3;.48,4;11/111025246566/37159/5<56837;37;68969<99::;<;;^AdBkCpHlWnQr\tXnCvJ}L|P~Pn`uf{g|p~qw`/Gk~FZJ[Pa}iEM[RWlkvuwgkhurzwLNċV̑ZҖ]`ƙfٛaśtПrcɡlݠeȦyԤ}fnrq<<"U8fAADDbbKK^p$$r˜զŸȩԬΰӳȩѮֶ̲஀᳇ᶒɵԼǼпῠ¬ºǶмĩͷϱѼѲhhhhghhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhghhhhhhhhhhhhhhhhhhhhhghhhhhhhhgghhhhhhhhhhhhhhhhhhhhhhghhhhhhhhhhhhhhhhhhhhhhhghhhhhhghhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhghhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhghhhhghhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhghhhhhhhhhhhhhhhhhhhhhhhghhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhghhhhhhhhhhhhhhhhhhhhhghhhhhhhhhhhhhhhhhhhhhhhhhhhghhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhghhhhhhhhhhhhhhhghhhhhhghhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhghhhhhhhhhhhhhhhhhhhhhghhhhhhhhhhhhhhhhhhhhhhhhhhhghhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhghhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhghhhhhhhghhhghhhhhhhhhhhhhhhhhhhhhhhghhhhhhhhhhhhghhhhhhhhhhhhhhhhhhhhhhghhhhhhhhhhhhghhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhghhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhghhhhhhhhhhhccbbXXTTTTT"TdhhhhhhhhhhhhhghhhhhhhhhhhhghhhhhhhhhhhhhhhhhhhhhhghhhhhhhhhhhhhhhhhhhhhhhhhghhhhhhhhhhhhhghhhhhhhhghhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhghhhhhhhhhhhhhghhhhhhhhhhhhhhhhhhhhhhghhhhhhhhhhhghhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhghhhhghhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhghhhhhhhhhhhhhhhghghhhhhhhhhhhhhghhhhhhhhhhhhhhhhhhhhhghhhhhhhhhhhhhhhhhhhhhhhghhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhghhhhhhhhhhhhhhhhhhhhhhghghhhhhhhhhhhhhhhhhhhhhhhhhhhhhghhhhhhghhhhhhhhhhhhhhhhhhhhhhghhhhhhhhhghhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhghhhhhhhhhhhhhhhhhhhhghhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhghhhhhhhhhhhhhhhhghhhhhhhhghhhhhhhhhhhhhhhhhhhhhhhhhhhhhhghhhhhhhhhhhhhghhhhhhhhhhhhhhghhhhhhhhhhhhhhhhhhhhhhghhhhhhhhhhhhhhhhhhhhhhhghhhhhhhhghhhhhhhhhhhhhhhhhhhhhhhhhhhhghhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhghhhhhhhhhhhhhhhhhhhhhhghhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhghhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhghhhhhhhhhhhhhgcccXXXTUT"ThhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhghhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhghhhhhhhhhhghhhhhhhhhhhhhhghhhhhhhhhhhhhhhhghhhhhhhhhhhhhhhhhhhhhhhhhhhhhghhhhhhhhhghhhhhhhhhhhhghhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhghhhhhhhhhhhhhhhhhhhhhhghhhhhhhhhghhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhghhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhghhhhhhhhhhghhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhghhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhghhhhhhhhhhhhhghhhhhhhhhhhhhhhghhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhghhhhhhghhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhghhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhghhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhghghhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhghhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhghhhhhhhhhhhghhhhhhhhhhhhhhhhhhhhhhhhhhhghhhhhhhhghghhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhghghhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhghhhhhhhhhhhhhghhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhghhhhhhhhhhhhhhhhhhhhhhhhhhhhhgdcbbXXTTTTTT""T""TghhghhhhhhghghhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhghghhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhghhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhghhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhghhhhhhhghhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhghghhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhghhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhghhhhhhhhhhghhhhhhhghhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhghhhhhghhhhhghghhhhhhhhhhhhhhhhhhhhhghhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhghhhhhhhhhhhhhghhhhhhhhhhghhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhghhhhhhhhhhhhhghhhhhhhhhhhhhhhhhhhghhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhghhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhghhhhhhghhhhhhhhhhhhhhhhhhhhhhhhghhhhhhhhhhhhhhhhhhhghhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhghhhhhhhhhhhhhhhhhhhhhhhhghhhhhhhghhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhghhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhgddcXXXXUTT"""ghhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhghghhhhhhghhhhhhhhghhhhhhhhhhhhhhhhhhhhhghhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhghhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhghhhhhhhhhhhhhghhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhghhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhghhhhhhhhghhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhghhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhghhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhghhhhhhhhhhhhhhhhhhhhhhhghhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhghghhhhghhhhhhhhhhhhhhhhhhghhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhghhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhghhhhghghhhhhhhhhhhhhhhhhhhhhhhhhghhhhhhghhhhhhhhhhhhhhhhhhgcccbXXXTT"T"ThhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhghhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhghhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhghghhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhghhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhghhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhghhhhhhhhhhhhhhhhhhhhhhhhhhhhhhghhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhghhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhghhhhhhghghhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhghhhhhhhhhhhhhhhghhhhghhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhghhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhghhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhghhhhhhghghhhhhhhhhhhhhhhhhhhhhhhccbbXXXTTT"ThhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhghhhhhhhhhhhhhhhhhhghhhhhhhhhhhhhhhhhhhhhhhhhhghhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhghhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhghhhhhghhhhghhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhghhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhghhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhghhhhhhhhhhhhhhghhhhhhhhghhhhhhhhhhhhhhhhhghhhhhghghhhhhhhhhhhhhhhhghhhhhhhhhhhghhhhhhhhhghhhghhhhhhhhhhhhhhhgghhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhghhhhhhhhghhghhhhhhhhhhhhhhhhhhhhhhhhhhhhghhhhhhhhhghhhhhhhhhhhhhhhhhhghhhhhghhhhhhhhghhhhhhhhghhhhhhhhhhhhhhhhhghhhhhhhhhhhhhhhhhhhhhhhghhhhhhhhhhghhhhhhhghhhhhhghhhhhhhhhhhhhhhhhghhhhhhhhhhhhhhhhghhhhhhghhhhhhhhhhhhhhhhhghhhhhhhhhhhhhhhhhghhhhhhhhhhhhhhhhggdbbXXT:T"TdhhhhhhhhhhhhhhhhhhhhhghhhhhghhhhhhhhhhhhhhhhhhhhhhhhhghhhhhhhhghhhhhhhghhhhhhghhhhhhhhhhhhhhhhhghhhhhhhhhhhhhhhhghhhhhhhhhhhhhghhhhhhhhhhghhhhhhhhhhghhhhhhhhhhhhhghhhhhhhhghhhhhhhhghhghhhhhhhhhhhhhhhhhhhhghhhhhhhhhhhhhhhhhghhhhhhhhhhghhhhhhhghhhhhhhghhhhhhghhhhhhhhhhhghhhhhhhhhhhhhhgghhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhghhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhghhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhghghhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhghhhhhhhhhhhhhhhhhhhhhhhhhhhghhhhhhhhhhhhhhghhhhhghhhhhhhhhhhhhhhhhghhhhhhhhhhhhhhhhhghhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhgccXXXXUT"""TTTTghhhhhhhhhhhhhghhhhhhhhhghhhhhghhhhhhhhhhhhhhhhhghhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhghhhhhghhhghghhhhhghhhhhhhhhhhhhhhhhghhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhghhghhhhhhhhhhghhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhghhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhghhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhghhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhghhhhhhhhhhhhhghhhhhhhhhgdccbXXXTT""""dhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhghhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhghhhhhhhhhhhhhhhhhhhhhhhhhhghhhhhhhhhhhhhhhghhhhhhhhhhhhhhhhhhhhhhhhhhhhghhhhhhhhhhhhghhhhhhhhhhhhhhhhhhhhhhhghhhhghhhhhhhhhhhhhhhhhghhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhghhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhghhhhhhhhhhhhhghhhhhhhhhhhhghhhhhhhhhhhhhhhhhhhhhhhghghhhhhhhhhhghhhhhhhhhhhhhhhhhhhhhhhhhhhhhgdcbbXXTTTT"""ThhhhhhhhghhhhhhhhhhhhhhhhhhhhhhghhhhhhhhhhhhhhhghhhhhhhhhghhhhhhhhhhhhhhhhhhhhhhghhhhhhhhhhhhghhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhghhhhghhhhhhhhhhhhhghhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhghhhhhhhhhghhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhghhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhghhhhhhhhhhhhhhhhhhhhhhhhhhhhhghhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhghhhhhhhhhhhhhhhhhhhhhghhhhhhhhhhhhhhhhccbbXXUTTT"gghhhhhhhhhhhhhghhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhghhhhhhhhhhhghhhhhhhhhghhhhhhhhhhhhhhhhhghhhhhhhhhhhhghhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhghghhhhhhhhhhhhhhghhhhhhhhhhhhhhghhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhghhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhdgccbXXTTT"TdhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhghhghhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhghhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhghhhhhhhhhhhhhhhhhhhhhhhhhhghhhhhhhhhhhhhhghhhhhhhhhhhhhhhghhhhhhhhhghhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhgdcbbXXXTTT""""TghhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhghhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhghhhhhhhhhhhhhhhhhhhhhhhhhghhhhhhhhhhhhhhhghhhhhhhhghhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhghhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhghhhhhhhhhhhhhhhhhhhhhhhhghhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhcccbXXUTTT"TghhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhghhhhhhhhhhhhhhhghhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhghhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhghhhhhhhhhhhghhhghhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhddccXXXXTTTT"TghhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhghhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhghhhhghhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhdccbXXXTT""T"""ghhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhdccbXXXUT""T""TThhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhgdccbbXXVTT"""TThhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhgdcXXXTTTTThhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhdccXXXXUTT"ThhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhgccbXXXXTT"""ThhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhddccbXXXTT"T"ThhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhgccXXXUTT"""ThhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhccbbXXXUT"TThhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhgccbbXXTTT"ThhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhgcccbXXUTT"TThhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhdccXXXXU"T"TThhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhdcccbXXXTTT""TTThhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhddcbXXUTTT"T"ThhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhccbXXXXUTTTT"ThhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhgccbbXXXTTT"ThhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhgcccbXXXUTT""ThhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhdcbbXXUTTT""ThhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhdccbbXXTTTTT"ThhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhdcbbbXTTT"""ghhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbhhdcccbXXTTT"""XbbbbbbbbbbbbbbbbbcbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbXbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbUXXXXXXXXXXXXUXXXXXXXXWXXXXXXUXXUUXXUXXXUXXXUUXXXXXXUXXXUXXXXXXXXXXXXXXXXUXXUUXXXXXXUXXUXXXUXXUUXXUUXXUUXXUUXXXXXXXXXXXXXXXXXXXXXXXXXXUUXXUUXXXXWXXXXXUXXXUXXXXUXXUUXXWUXXTXUXXXXXXXXXXXXXXXUUXXUUXXUUXXXXXXUUXXUUXXUVXXUUXXUXXXUUXXXXXXXUXXXXXXUUXXUUXXUUXXUVXTXXXXXXXXXXXXXXXXXXXUXXXXXXXXXXXXXXXUXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXUUXXUUXXXXXXUXXTXXUUXXXXXXUXXXXXXXXXXXXXXXXXXXUUXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXUUXXUVXXUWXXUTUXXXXXXXXXXXXXXXXXXXXUXXUXXXXXXXUUXXXXXXXXXXXXXXXXTXXXXXXXXXXXXXXXXXXXXXXXXXXUXXXXXXUXTXXXXXXXXXXXXXXXXXXXXXXXXXXXUUXXXUXXUWXXXXXXUUXXUUXXUXXXUUXXUXXXXXXXXUXXUUXXUUXXXUXXTXXUXXUUXXUUXXUUXXUXXXUUXXXXXXXXXXXXXXXXXXXXXXXUXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXUVXXTXUUXXXXXXXXXXXXXXUUXXXXXXXUXXXXXXUUXXUUXXUXXXXUXXUUXXUXXXXXXXXUXXUXXXXXWXXXXXWUXXXXXTXXVUXXUXXXXXXXXXXXXXXXUUXXUUXXUVXXUUXXUXXXUUXXVUXXUUXXUUXXXTUXXTTXXXXTUXXXTXUTXUXTXTXTXTXXXTXTUUUXXTXXUXXTUXXXXUTTUUTUXTXXXUTXXTXTXXTTXTXUXhhhcccXXXXTT""T""XUXXUUXXUTTTUUXXXTTXXXUUTUTXXTXTXTXTXXTXUXUXXXXXXUXUXTVXXXUUTXTXUTXXXXTXXUXXUVXUXXUXUXXXXXXUXXXTTXXXXXXUXUXUXTTTXXUXUXUXUXXUXXXXXXXUXXUXUXUXXXXTXXXXXXXUXXUXXXXUXUXXUUXUXUXXTXXXXUXXUTXXTXUXTXUXUXUTTTTTTTUUTTTXUTTTUUTUXTTTTTTTTTXXTTTTTTTTTXXTTTTTTTTTTTTTTXUXTXTTXXTTXTXTXXTXTXXXXTUTUUTXXUUUXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXghhhhgccbXXTTTT"WXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXUXXXXXXXXXXXXXXXUXXXXXXXXXXXWXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXhhhgdcbbXXUTT""T"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXbXXXXXXXXXXXXXXXXXXXXXXXXXXXXXbXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXbXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXbXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXbXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXbXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXbXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXhhdccbbXXUTTT"TTXXXXXXXXXXXXXXXXXbXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXbXXXXXbXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXbXXXXXXXXXXXXXXXXXXXXXXXbXXXXXXXbXXXXXXXXXXXXXXXXXXXXXbXXbXXXXXXXXXXXXXXbXXXXXXXXXXXXXXXXXXXXXXbXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXbXbXXXXXXbXbXXbXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXbXbXXXXbXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXbXXbXXXXXXXXXXXXXXXXXXXXXXXbXXXXXXXXXbXXbXbXXXXXXXXXXXXXXXXXXXXXXXXXXXXbXXXXXXXXXXXXXXXXXXXXbXbXXXXXXXXXXXXXbXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXbXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXbXXXXXXXXXXXXXXXXXXXXXXbXXXXXXXXXXXXXXXXXXXXXXXXXXbXXXXXXXbXXXXXXXXXXXXXXXXXXXbXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXbXXXXXXXXXXXXXXXXXXXXXXXXXXXbXXbXXXXXXXXXXXXXXbXXXXXXXXbXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXbXXXXXXXXXXXXXXXXXXXbXXXXXXXXbXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXbXbXXXXXXXXXXXbXXXXbXXXbXXXXXXXXXXXXXXXXbXXXXXXXXXXXXXXXXXXXXXXXXXXbXXXXXXXXXXXXXXXXXXXXXXXXXXXbXXXXXXXXbXXXbXXbhhhhgccXXXXTT"""XXXXXXbXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXbXbXXXXXXXXXXXXXXXXXXXXXXXXXXXXXbXXXXXbXXbXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXbXbXbXXXXXXXXXXXXXbXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXbXXXbXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXbXXXXXXXXXXXbXXXXbXXXXXXXXXXXXXXXXXXXXXXXXXbXXbXXbXXXXXbXXbXXXXXXXXbXbXXXXXbXXXXXXXXXXXXXbXXbXXXXbXXbXXXXbXXXXXXXXXXXXXXXXbXXXXXXbXXXXXbXXXXXXXbXXXXXXXXXXXXXXXXXXXXXXXXXbXXXXXXbXbXbXXXXbXXbXXXXXXXXXXXXXXXXXXXXbXXXXXXXXXXXXXXXXXXXbXXbXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXbXXbXXbXXXXXXXXXXXXXXXXXXXXXXXXXXbXbXXbXXXXbXXXXXXbXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXbXXXXXXXXXXXbXXXXXXXXbXXXXbXXXXXXXXXXXXXXXXXXbXXbXXXXXXXXXXXXXXXXXXXXXbXXXXXXXXXXXXXXXXXXXXXXbXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXbXXbXXXXXXXXXXXXbXXbXXXXXXXXXXXXbXXXXXXXXXXXXXXXXbXXXXbXXXXbXXXXXbXXXXXXXXXXXXXXXXXXXbXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXbXXbXXXXXXXXXXXXXXXXXXXXXbXXXbXXXbXbXXXXXXXXXbXXXXXXXXXXbXXXXXXXXXXXXXXXXXXXXXbXXXXXXXXXXXXXXbXXXXXXXbXXXbXXXXXXXXXXXbXXbXXXXbXXXbXXXXXXXXXXXXXXXXbXXXXXXXXXXXXbXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXbXXXXXXbXXXXbXXbXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXbXXXXXXXXbXXXXXbXXXXXXXXXXXXXXbXXXXXXXbXXXXXXXbghhhcccbXXXUT""T""XXXXXXXXXXXXbXXXXXXbXXXXXXbXXXXXXXXXXXXXXXXXXXXXXXXXXbXXbXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXbXXbXXbXXXXXXXXXXXXXXXXXbXXXXXXXbXXXXXXXXXXXXbXXbXXXbXXXXXXXXXXXXXXXXXXXXXXXXXbXXXXXbXXbXXbXXXbXXXXXXXbXXXXXXXXXXXbXXbXbXbXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXbhhhgdccbXXXTT""XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXbbcbcbbbbbbbbbbbbbbbbbbbbbbbbbbcbbbbbbbbbbbbbbbbbbbbbbbbbbbbcbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbcbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbcbbbbbbbbbbbbXbbbbbbbbbbbbbbbbcbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbcbbbbbbbbbbbbbbbcbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbccbbbbbbbbbbbbbbbbcbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbcbbbbbbbbbbbbbXbbbbbbcbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbcbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbcbbbcbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbcbbbbbbbbbbbbbbbbbbbbbcbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbcbbbbbbbbbbXbcbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbcbbbbbbbbbbbbbbbbbbbbbbbcbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbcbbchhhhgccXXXXTT""TbbbbbbbbbbbbbbbbbbbbcbcbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbcbbbbbcbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbcbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbcbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbcbbbbbbbbbhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhgccbXXXTTT""TThhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhccccbXXTTT""""ThhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhgcdggggdggcdggggggggggdgcggcgggdggggggccggggggggggcgggggcgdcgggcgggcggggcggcggggdggggggcggcgggggccggcggcgggggdgggggggggggggggggggggggggggggggcggcgcgcggcggggggcgggccggcgdgggggggcggggcgggcgggggggggdgggcgdgcgggggcgcggggggggdgcgggcdggggggggggggggcgggdcdggcgcgggddggggggggcggggggcgggggdgggggggggggggggggddggcgggdggcgdgggggggggdgdgggggggggdggggcdgggdghggggddgdgggggggggggghgddgggggdggggddgggggchggggggggggdcgggdggdggggggdgggggdgggggggcdggghhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhgggggggggggggggddcdggddgchgggggggggggggdgghgggggggchcggggggggggggggggggdgggggdcdgggddggghggggddggggggggghggdgggggghggddggggdghgggdcdgggddgggggggdggggggggggdgggggghcdggggggddggddgggggdggggddghgdghgggggggggggggdggggghggggggdgggggdggggggdggddggggddggggddgdggggcgggggdggggggggcddggddgggdgggghgddgggggdggggggdggggcggggddghhhddbXXXXTT""cgddcggcggcgggggggdcggdcdcgcgcgggddgggggggccggggggcgggggcggggggcgggggggggggggggggggcgggdgcgggggcgggggggcgggcggcggcggggggcgcgggggcgggcggcgggggcgggggggggggggggggggggggggcgggggcgdcgcgcggggggggcggggcggdggcgggcgggcgggccgggcgggggggggggggcggdgggggggdgggggggggggggghgggdgggggggggggggggggggggggcgg-------,------------,-------------------------------,---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------Uhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhb----------------chhddcbbXXXTT"""""--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------,----------------------------,------------,---,--,-----                dhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhg:                                                                chhhgccbXXTUT"",                                Xhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhb                                                                        -chhhccbXXXTTTT""""                 ThhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhU                                                                    -chhdccbbXXUTTT""                chhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhg                                                                         -chhhdcbbXXUTT"TT",,             Xhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhb                                                                         -chhhdccXXXXTT"T"                     dhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhgM                                                            -chhhcccbXXXTTT"" ,              bhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhc                                                           -chhgdccXXXXTT"""                Xghhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh:                                                                 -chgggcbXXXTTT""              dhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhg                                                           -chhgdcbbXXTTT""T"T",,           bhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhX                                                                    -chhhdcbbXXXTT",              Thhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh                                                           chhdccbXXXXTTT            chhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhb                                                          -chgdcbbXXTUT"""",,,,          Xhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh:                                                         -chhhcccbXXVTT"""T,      Tghhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhc                                                           -chhgdcbXXXXTT"T"",,   chhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhU                                           -chhhgcbbXXUTT""",      Xhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhg                                                         -chhhccbbXXUTT""T,     MdhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhX                                                    -chhhgccbXXXTT""""",   bhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhg                                                   -chdccbbXXXTTT, Uhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhc                                                        -bhhhcccbXXXTT",,FTXXXXXXXXXXXXWFXXXXXUTXXX   ghhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhU                                                          -bhhddcbXXXXTTT,TTXXUTTTXXXXXUTTXXXbXXXXXXXXXXXXXXXTTTXXXXXXXXUFUXXXXTXT   -bhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhd                                        -bhddcbbXXXTTT,,TUWWTTTXXTFFTWXXXXXbXXXXXXXXXXXXTXXXXXXXXXXbXXXbbXXXXXXXXXXXXXXXbXbXXXXXXXXTUXWTTXXXXXXXWXXXXXXXXXXXXXXT WhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhW                               XhhhggdbbXXXTT,,,XXXXXXXXXXXXXXXXXXXXXXXXXbXXXXXXXXXXXXXbXXXbXXXXXXXXXXXXXXXXbXXXXXXXXXXXXXXXXXXXXXXXXXTXXXXXXXXXXXXXXXXXXbXXXXT   chhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhd                             -XhhhgccbbXXTTT,,XXXXXXXbXbXXXXXXXXXXXXXXXXXXbXXXXbXXXXXXXXXXXbXbXXXXXbXXXbXXXXXXXXXXXXXXXXXXXXXbXXXXXXXXXXXXXXXXXXXXXXXbXXXXXbXXXXT  bhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhb                                    -XghhhdccbXXXTT",XXbbXXXXbXXXXXXXbXXXXXXXXXbXbXXbXXXbXXXbXXXXXXXXXXXXbXXXbXXXXbXXXXbXbXbXXXXXXXXXXXXXXXXXXbbXXXXXXXXbXXXXXXXXXXbXbXT Thhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhg:                            XghhhhdccbXXXTT,,,,,,,XXXbXXbXXXXXXXXXbbXXXXXXbbXbXXbXXXbXbXbXbXbXXXXXXXbXbbbXXbbbXbXXXXbbXbXXXXXXXXXXXXXXXXXXXXXbXXXXbXbXXXbXbbXXXXXXXXT  chhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhc                         XghhhhhdccXXTTTTT,,,XXXbXXXXbXbXbXXXXbbXbXXXbXbXbbXXXXbXbbbXbXXXXXbXXXXbXbbbXbXXXbXXXXXXbXXXXbXXXbXXbXbbXXXXbXbXXbbXXXXbXbXXbXXbXXbXXXT  XhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhW                    -0:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::":::::::::::::::::::::::::::::::::::::::::::::::::::::::::::":^hhfddac[XXXXXV@TVV;V;;T@@VV:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::M--,,XXXXbXXXXbXXXXXXXbbbbbXbbbXbbbbXXXbbbXbbbbXXXbXXXbXbbbbbbbXbbbXXXXXXXXbXXXXXXXXXXbbbbbXXbbXbbbXXXXbbbbbbbbXXXXXXXbT     Tdhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhg                  :V_ǝ^U",,-----J--,,XXXbXbXbbXXXbbXXbbbbbbXXbbbbbbbbXXbXbXbbbXbXXXXbbXbXbbbbXbXbXbbbbXXbXbXbbXXXXXbXbbbbbbXbbbbbbbbXXXXbbbbbbXbXbXXbbbT chhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhb          Vaǖ^U,F,,KKJKM,,,,,,XbbbXbXbbbbbbbbbXbbbbbXXbbbbXbXXbXXbbbbbbXbbbbbbbbbbXbbbbXbbbbbbbXbbXbXbbbbbbbXbXbbbbbXXbbbbXbXbbXbbXXbbbXbbbbbbbbT  VhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhdM        :^ʝ^:Xbcc,,XbbbbbbbbbbbbbbbXXbbbXbbbbbbXbXbbbbbbXbbXXbbbbbbbb@XbbbbbbbbXbbbbbbbbXbbbbbbbbbbXbXbbXbXXbbbbXXbbbbbbbbbXXbbbbbbXbT  ghhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhb           -Vʗa:-,Xcbccc,,,,,XbbbbbbbccbbYYbbbbXbXXYXbbbbbbXbbY[bbbbYXXbYYbbbXb@YYbbbYYXXbbXbbYXbXbb[bbbY[bbbXXXXXXXYbbbbbXXbbbYbXbXYXXbbbbbbbbT  -bhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhU              -:^Ǜ^-Ubbbbbcg,Xbbbbbbbcbb@B@@YbX;XX@@@YY@bbXbbY@@@bb;@>XYA@BbbXb@@BBb@@@>@Yb@Y@BBbBXY@@bXB@Ybbb@@@XY>@@@YbbY@bX@BBbY>B=YbbbbbbXbTUhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhc          YǂV-,-bXbbbbcgT,,Xbbbbbbbcb@YXbYAbY=Yb=@@YY@bbbbX@Xb@YBYbYB@[b@Ybcc@YcBY@bb@@Bb@@=@@X@YX@@XbY@XbbcY@@X>@@BAYbXA>[Y=B@Y@YbBYbbbbbbbbT  dhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhX           XʖVbbbXbbbdU,,Xbbbbbbbcb>Xbbb@Y@Y@X@YY@Y=YbbbY=YbBY@bb[@@Xb@Ybbb@YY>Y@XY;@@b@Y@[@Y@YY@=YX9YbbbbB@[bBYY@=BXX@YYY@Y@YY@Y>YbbXXbbbbT XhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhgM     [ӔY,,bXbbbbbb:,,,Xbbcbbbbbb@bcbb@BYcYXbBBb[B@bbbY;@BYb@bb[@@bcYYccbY@@YbbY@B@@bYbYBYcYB@Y=Yb@BbXbbX@YbbY@YYBBYXXYcY@YbbY@=XbbbbbccbT Tghhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhb       ^ӛV--XXXbbXbc,,,,XbcbbbcbbbYYbb[@bccbcbbbbbcbccbb@[bbc@XbYY;Yb@YccbbbccccbbbbYbYbbbccbbbcYbbbbbbbbccbcbbbbbcbccbbcbbbcccb@XbbbccccbT   chhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhT   -:ʅ:,,WXXXbXbcKb,,,,,,,Xccbcbccbbb@@@@YcbccccbccccccccbY@@bcX@@@bY@@YbcbccbccccbbbccbXbcccbcbccbbbccbcccbccccbccccccccbccccbbbcBXcbccccbbT  Xhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhb    ^0,MXXXXbbg,,,,,,,IDD,,,XcccbcccbbbbXXcccccbccccbbbcbcbbbcbcbcbbcccbbcccccccbcccbcbbcbbcccccbcccbbbccbcccccbccccbbbcbcbbbcccbcbbXbcbbccccbT TdhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhW  -VזV-,-UbXXXcb,,,,,,,,,DDIDXcccccbcccccbcccccccccccbcbccbccccccccbcbccccbccbbbcccccccbcccccccccccbcccccbcccccccccccbcbccbccccccccbcbccccbccbcT  -chhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhd ʂ,,,,-UXbbbKKKKJJJH--,--,,DIIID,IID,ID,XccccccccccccccccccccccccbbcccbccccccbcbccccccccbbbccccccccccccccccccccccccccccccccccccccbbcccbccccccbcbccccccccccT  WhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhX  VمU,---,,,,,,,,,IIID,DXcbcbcccccccccccccccccccccccccccbcccccccccccccccccccccccccbcccccccbcbcccccccccccccccccccccccccccbcccccccccccccccccT  ghhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhg      ^b-,,,,,,,IIIDIIIII,DXcccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccT -bhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhc- f0,,,,,,,,,,,DDIIID,DIIDD,DIIDDIXcccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccT WhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhW:ٖ:,,,,,,,,,,,,,IDDDDDDIIIIDD,,XcccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccT   dhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhc VٛU,,,,,,,,,,,,,,,,,,,,,,,,DIIIDDDIDDD,,XcccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccT -bhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhgVVߗU,,,,,,,,,,,,,,,,,,,,,,,,,,,IIIIIDXccdccbXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXbcccT   Uhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhf-^V-,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,DDIIIDDIDXcdccc# ;cccT    dhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhb-^\-,,,,,,,,,,,,,,,,,,,,,,,,,,,,,DDDIIDIXcdcdcccccdcccccdcccccccccccdccccccccccccccccccccccccccccccccccccccccccccccccccccdcccccccccccccccccdccccdcccccccccT bhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh:-^׬V,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,DIDXcdccdccdccdccdcdccgcdccccccccccdccccccdccddcccddcccccccdccccccdccccdcccccccccccccdccdcccccccccccddcccdccdccccccccT  UhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhcVҚspplC>>=>====>===========>>>>>>>>>=>>>========>>=======>>==>======>==>>==>>=>==>>>==>=>>==>>==========>===>>=====>==>>>=====>==>>>===========>==>>>>=>=>>==>===>======>>>===>>=====>======>=====>==>>===>>=====>?====A>=>==>A>==>================>=>>======>=>>=>===>==>==>=====>>>>=>>=====>>>>>===>=>>>>===>===>>=>>>=====>>=====>>>>====>=>=>==>>==>A>==>>>==>A>=========>===>==>===>=>>>>>>>==>A>=======>>=======>>>==>======>==>===>=====>A>=>=>>===????llv|}V,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,DIIIXcdcdcccdcdcccdcdcddcdccdccdcccddcccdccdccccccccdcgcccdccdcccccdcccdccdcgccccddcdcccdccdccccdcccdccccddccdccccccccT chhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhWVך}p?=$     !$>lpV,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,DDIIDIDD,XcdcdcccdcdcccdccdcdcdccdccccdcccccdcccgccdcccdccccccdcccdcccdcdcccdccccccccccccccccccddccdcddcccccccccdcdcdccgcccT     WhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhgU٧vl>$    $=l|:,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,DDDDD,II,,XcdcccdcdcdgcdddcccdcdcdccdgccdgddccccdccdccdcddcddccdccddcdcdcdcccdccccdcddccccdcdcccccdcdcdcdgdddccccdcddcccdcccUTghhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhb:Ӓ}o>    !?p}M,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,IIID,DDDDXcdcccdcdcdccddcdccgcdccccdgccccccgdccdcdccccdcdcdcdcdcdcccccddccccccdcdcdcdcddcdcdccdccdcdddcdcccgdcccdcdccccccccUbhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhgMӤ}l$    $C}ٓ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,DDIDDIDIDDDDD,,bcdcccdcdcdcdcccgccdcdcdcdcccdgcddggccgccdcdcdcccdccgccccgdcdcdccccccccdcccdcdccgccccdcdcdddcdgcgcddddcdcdcccdccccUUhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhc--ӐvC$          !?|^-,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,DIIDbccdccdcdcgdccccdcdcccdccccggdcdddcdcgcgdcddcdgddccccgccdcddcddgdccdccccdccdcdccggdcgccdcdcchdcdccddcddddcdccgdgdcUghhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhU^}l!    !l}V,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,DDII,,,XdcgdddddcddccddddcddccdccccddcccgdgdccddccdddgggcdddgdcddddcdddcddddgddcddgdcddcdcddccdcdcdgcgdcggdcddcccddgcgggcUbhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhc:Ҁp=    =p:,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,DIIIIbdgddcddcdhggdc]ZtCBZZadgggggdd[__dggdd[_^cdcdccdcc[][addcc[Z_dh[__ddgcd__[dcdddd_[_dddddd_[_dggggggda[_cdcgdcccU:hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhW0w>   >}ߓ0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,DIIDII,,,,Xcdgdddddgggc[>>>Zcdggd_?>?_dgd>]dddcddd_Z>?[dcdC>Zcc_Zccd_>>ZgdggdgZ?ddgggdBjCdggggggdZ>ddgdccddUghhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhgMfפp$!    =|^-,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,DDDDIIIIID,,,,bgggggdcdgddBAZZZA>Acgd_AAZhdZdgdddddZA>_ddAZdddB>_cc?AdcdggdgZCdgdggdZCddggggggZ?dggdddgdU-bhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhbVl     !l:,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,.,,,,.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,IIIIIIDD,,,bggddggcdgdCA[dgdhddZ>ZdgC^cdcZ_dZdgddddhdB[ddd?ZgdCZdggd>AcZ_ggdgdggZ?dgggggZAdcgddghg]>dggdddgdUUhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhT}>>}0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,.,,,,.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,DDDDIIIID,,,,,bdgggghgghYZdgdhgggddddggZfddhgdBBdZdhgdgghgdgggdAZhdABdgdh[ZZhddggggd]?dggggdBCdgggdggg]dhhgddhgUchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhb^w=>}\,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,DIDIIIIDDDDID,,,,,bggdgggghdCdgghgggggdhdgdBAgggdhg[AcZhdggghgghdZ>[gdAAggdgdCAdgdghgggh[AddhdgdZAdhghggghZdgcgghggUXhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhX:p$         =}M,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,LL,,LL,,,,,,,,,,,,,,,,,.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,IIIIIIIIDDDDDDDDDDD,,,bgdghdhghZcghhhgggdghhggdBZdggggga>a[ghhgghhhdAZdhdABghggg^>_hhghgghhg[AdhggggBAdgghggghZdgghghggUMghhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhd-p!       =qa-,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,L.,,,,,,,.,.,,,,L,,,,,,,,,,,,,,,,,,,,.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,DDIDDID,D,,D,,,,bggggghgdAAhggggghgggghghhZBdhgghhd>dAdggghggdBC[^dhgdABggggh_[ghggghghg]?dghghdZAdgggghhdZdhgghggdUchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhXUq$ =sU,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,LL,,,,,,,,L,.,,,LL,,,,,.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,DID,D,,,,,ID,,,bhghgghgfAZghggghgdhhggghh_>_hhgggBZd[gghhggd>BdhghghdABhghhdA>aghghhghg[?dhghhhBA_d_d_d_dZdhghgghgUWhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhgM-w$  =}f-,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,LLLL,LLL,L,.,L,,,,,,LL,,,L,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,DIID,,,,,,,,,,,,,bdgghgghd>ZhhghhhgghggghghdAA_dddZ_dZdddggd>ZddddhgdBBhggdZ]>ZdhggdhhhZAgghghhBdgghhgggUMghhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhc-V}>         =U,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,LLLL,.LL,,L,,L.,,,L,,,L,,,.L,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,D,,,,,,,,bhhhhhghdAChhhghgghghgghhhhAAA_gd>>>dhhhZAAAdgdAAggh_=Zd_[hghghgg[AgghhhdZ>>>>>dhghghhgT,chhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhW->     ?a-,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,LLLLL,,L,,L,,,,LL,L,,.LLL,,,LLLL,LL,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,bhhhhhhhgZ>dhhhhhhhhhhhhhhhhfZC>>AZ_hhhA>[_Ahhgd[A>>A[gghZ>ZhhdZAZfhh[ABdhhhhhh[AhhhhhgZAdhhhdhdhZ>dhhhhhhgUWhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhdUl   l:,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,LLLLLLLLLLLL,LL,LL,LLLLL.L,LL.,L,L,,,L,,,.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,bhhhhhghh__hhghhhhhhhhhhhhghgddddhhhhhddhhdd^dhhhhhddddghhhdddhhhdddhhhhddhhhhhhhZAhhhhhhCAdhhhghhd[>hhhhhghhUghhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhX-p!     !qa-,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,LLLLLLLLLLLLL.LLLLLLLLLLLL,LL,,L,LL,LL,,,,,L,,,L,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,DD,,,,,bhhhhghhhh>BdhhhhghhhhhhhhhhghhhhhhhghghhhhhhghghhghhghhhghhdddhhhhghhhhhhhhhhhhhhZ>hhhhggBBdghhhhhg[>hhhghghhU-bhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhgM:}$     =}M,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,LLLLLLLLLLLL,,,LLLLLLLLLLL.L,LLLLL,,,,,,,,,L,LLLL,.,,,,L,,,,,,,.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,bhhghhhhhh_=BdhhhhghhhhhghghhhhhhhhhhhhhhhhhhhhhhhhhhhhhghhdA[ghhhhhhhhhhhghhhhhhZ=hhhghhCAfhhhhhhh[>hhhhhhhhUWhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhb-C    l\,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,L,,,.,LLLLLLLLLLLLLLLLLLLLL,LLLLL,,,LLLL,L,L,,L.L,,LLLL.L,,.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,DD,,,,,,,,,,,,,,bhhhhhhhhhhY$BdhghhhhddhghhghghhhhhhhhhhhhhhhhhhhhhhhhhhhhhhB=[hhhhhhhhhhhhhhhhhhhZ>hhhhghBBdhhhhhhh[=hhhhhhhhUdhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhg:p!     !q/,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,L,,,,,,,.L,L,LLLLLLLLLLLLLLLLLLLLLLLLLLL,L.LLLLLL.LL,LL,LLLLL,LL,,,,,L,L,,,,,,,,L,,,,,,,,,,,,,.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,D,,,,,,,,,,,,,,,,bhhhhhhhhhhdZ7=Zbdd_Y>>_hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhfdhhhhhhhhhhhhhhd_[[[A$Z[[_dhBBdhhhhhhhY=hhhhhhhhUbhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhc-U=    >U,,,,,,,,,,,,,,,,,,,,,,,,,,,,L,,,.L,,,.,,,LL,,LLLLLNLLLLLLLLLLLLLLLLLLLLLL,.LLLLLLLLLL,LLLL,LL.,LL,LLL,.,,,,,.,L,LL,,,LL,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,DDD,,,,,,,,,,,,,,,,,,,,-bhhhhhhhhhhhh_@=$$$=[hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhd==7$$$=YhBBdhhhhhhh[=hhhhhhhhUUhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhWo    !v`,,,,,,,,,,,,,,.,,,,,,,,,,,,,L,,,LL,,,,,L,,LL,LNLNLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL.LLL,,LLL,L,,,L,,LL,,,,LLLL,,,,,,,,,,,,,,,,,,,,,,.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,DD,D,,,,,,,,,,,,,,,,,,,,,,,,,-bhhhhhhhhhhhhhd[@=$$=@ZdhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhfYBYBBBBYZYY[h[AZhhhhhhhh[=AhhhhhhhhUchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhgM0}=     >/,,,,,,,,,,,,,,.,,,,,,,,,,L,,,.LLLL,,,,,LLLL,LLLNNLLLLLLNNLLNNLLLNLNLLLLLLLLLLLLLLLLLLL.LLLLLLLLLLLL.LLL,LL,,,,,,,,,L,,LLL,,.,,.,,,,,,,,,,,,,,,,,,.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,-bhhhhhhhhhhhhhhhhhddhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhghhhhhhhhhhhhhhhhhhhhhhhhhhhhhU,,Xhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhb-[l    v\,,,,,,.,,,,,,.,,L,,,,L,,,,,L,LL,LLLL,,,,LLLLLNLNLLLLLLLLLLLLNLLLLNNLLLLLLLLLLLLLLLLLLLLLLLLLLLLL,LLLLL,,LL.L,LLL.,.LL,,LL,L,,,,LL,LL,.,,,,,,,,,,,,,,,,,.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,-chhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhU,MdhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhgM=    >a,,,,,,,,,,,,LLLL,,,LL,,,,LL,,LL,LLLLLLLL,LLLLNLNLLNNNLNLNNLLLLLLNLNNNLLLLNLNNLLLLLLLL.LLLLLLLLLLLLLLLL,LLLLLL,LL,LLL,,.L,LL,L,,.L,LL,.,L,.,.,,L,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,-bhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhU,-chhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhc-l   p/,,,,L,,,L,.LL,,L,LL,L,,LL,,LLL,,LL,LLL.,LLLLNNNNLNNNNNLNLLLLLLNNLLNNLLNNNLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL.LL.LLL,LLLL,L,LL,,L,,L,.,,LL,,L,.L,.,,,,,,,L.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,DD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,bhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhUWhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhU:=    ?P,,,,LLLL,,LL,,,,,L,LLLLLLLLLL,L,LLLLLLLLLLLLNNNNNLNNLLNLLLLLLLLNLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL,LL,,LL,LLLL,L,,LL,LL,LL,,,.,,,,,.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,bhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhUTghhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhc^w!         $\.,,,,L,L,.LLLLL,LLL,LLLLLLLLLLL,,LLLLLLLLLLLLNNNNNNLNNNNNNNLLNNNNLLLLLLLNLLNLLLLLLLLNLLLLLLLLLLNLLLLLLLLLLLLLLLLLLLL,.LLLLLLL.LL,,LLLL,L,,LLLL,L,,,,,..,.,,,,,,,,L,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,-chhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhU,bhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhXC        l.,L,LL,L,LLL.LL,L,LL,,,LLLLLLLL,LLLLLLLLLLLLNNNNNNNLNNNNNNNNNNLLNNNLLLLNNLNNNNLLNLLNNLLLLLLNNLLNLLLLLLNLLLLLLNLLLLLLLLLLLLLL,LLLLLLLLL,L,,LLLLLLLL.,.L..,,,,LL,,L,L,,,.,.L,,,,,,,.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,-bhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhU,,,WhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhM}$      =/,,L,-,LLLLLLL,,LL,,--LLLLLLL,LLLLLLLLLLLL.NNNNLNNNNNNNNNNNNNNNNNNNNNNNNNNNNNLLNLLNNLLNNLNNLLLLNNLLLNLLLLLLNLLLLLLLLLLLLLLLLLLLLLLLLL,LLL,LLLLL,LL.,LLLL,,LLL,L,,L,,,,,LL,,.,..L,,,,.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,bhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhUghhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhcVq     !}U...,-....LL....,.L..,LL.,..L,.L,.LLLLL.-...NNNNNNNNNNNNNLNNNNNLNNNNLNNNNLLLNNNNNLNNNLLLNNNNLLLLLNLLLNLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL,LLLLLLLLLLLLLL,LLLL,,L,L,,,.L,LL,,LL,,L,.L.,,,,,,,,,L.,,,,,,,,,,,,,.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,bhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhU,bhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhW------------------------------------,-----------^C                     of\\\\W\Wb\\\\\\\W\\WXX\\bW\X\W\\\\\\WW\b\\\WNNNNNNNNNNNNNNNNNNNNNNNNLLNLNNLNNNNNLNLNLNNLNNNLLLNLNLLLNNLLLLLLLLLLLLLLNLLLLLLNLLLLLLLLLLLLLLLLLLL.LLLLLLLLL,.L,,L,LLLLL,L.,.,,,,.L,L,,,.,,,LLL,,,,,,L,,,,,,,,,,,,,.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,-MUWWWWWWWUUWUUWUUchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhW-,ThhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhgggggggggggggdggggggggggdgggcccggcgggcggcccggccgccccccccccccccccccccccbbbbbbbbXbbbbbbbbbbbbXbbbbbbbXbXbbbbXbb=                 >NNNNNNNNNNNNNNNNNNNNNNNNLNNNNNNNNNLNNNLNLNNNNNLNLNNLNLNLNNLNLLLLLLNLLLLLLLNLLNLNLLLLLLLLLLLLLLLLLLLLLLLLLLL,L,LL.LLLLLLL,,L,,L,,LLL,,,,L,,..,LL,L,,,,,L,,,,L,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,-XhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhbbbbbbbXWWWWWWWWWWXWWWWXWWWWWWXWWXWWWUUUUUUUUUUTUUTU::::::U:T:::TTTTTTTTTTTTTTUghhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhs$!    =NNNNNNNNNNNNNNNNNNNNNNNLNNNNNNNNNNNNNNLNNNNNNNNLNNNNNNNLNLNNLLNLLNNLLLLLLLLLLLLNNLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL,LL,LLLLL,,LLLLLL,,,LL,,L.,,LL,,,,,,,L,,,,,.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,Wbccccbcbccccccccccccccccccccccccbccccbbcccbcccccccccccccccbbbbbccccccbbbbcccbccccbccbbcbbcbbbbbbbcccbbbcbbccbcbbbbbhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhghhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhp           !wNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNLNNNNNNNNNNNNNNNNNNNNLNNNNNNNNLLLLLNLLLLLNLNLLLLLLLLLLLLLLLLLLLLLLNL.L,LLLLLLLLLLLLLL,LLLLLLLLLLLLLLLLLL,L,LLLL,LL,,,,,,L,L,,,,,,L,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,bdcdddccccccbbbbXXXXbXXXbbXXbXbXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhm            !    !       ! oNNSSNNNNNNNNNSNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNLNNLNNLLLNLNLLLLNLNNNLLLNNLLLLLLNLLLNLLLLNNLLLLLLLLLLLLLLLLL,LLLLLLLLLLLLLLLLLLLLLLLL,LL,,L,,L,,L,,L,L.,LL,,,LL,,,,,,,,,,,,.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,WhdggdgccccccbbbbbXXbXbXbXXbXXXbXbXXXbXbbXXbXbXXbbXbXbXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhC  !                     lNNNNNNNNNNNNNSNNNNNNNNNNNNNNNNNNSNNNNNNNNNNNNNNNNNNNNNNNNLNNNNNLLLNNNLNLNNNLNNLLNNNLNLLLLLLLLLLLLLNLLLLLLLLLLLLLLLLLNLLLNLLLLLLLL.LLLLLLLLL,LL,LLLLL,,LLLL,L,L.LLL,,,,LLLL,,,,,,,,,,.,,,L,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,0dhhhhghggdggdddddgdgcggccddccdccccgccgdccgcddccdgccccdcdcccccccccdccccdccccccccccccccccccccccccccccccccccccchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh=     !     ?NNNNNNNNNNNNNSNNNNNNNNNNNNNNNNNNNNNNNNNNNNLNNNNNNNNNNNNNLNNNNNLNNLNNLNNNNNLNNNLLNNNLNNLLLLLLNLLLLLLLLLLLLLLLLLLLNLLLLLLLLLLLLLLLLLLLLLLLLLLLL,,LLLLL,LLLLLLLLLL.LLL,,LLL,,L,,,,,,L,,,,.,L,,,L,,,,,,,.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,Thhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh}!            ! !        ;;@@;;#    =NSNSSNSNNNNSNNSSSSNNNNNNSNSSSNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNLNNNNNLNNNLLNNNLLLNLNNNNLLLLLNNLNLNLLNLLNNLLNNLLLLLLLLLLLNLLLLLLLLLLLLLLLLLLLLLLLLLLL,LLLLL.LLLL,LLL.,,.L..LL,,,.,,,,LLL.,,,,,L,,LL,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,.,,,,,,,,,,,,,,,,,,,,,,,,Whhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhs  !      ! 9[ĕ_;    ! !    [ā#   ##99;9  ;#   ####;# 9#;#99# 999;9##  Y @;#[  !  $NSSSSSNSNNNNNSSSSNSNSNNSNSSNNNNNSNNSNNNNSNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNLNNNNNNNNNLNNNNNNNNNNNLLLLLLNNNLLLNLLLNLNNLLLLNLLLLLLLNLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL,LLLLLL,LLLLLLLLL.LLL,,,,,,LLLLLL,,,,L,LL.,,,L.,,L,,,,,.,,,.,,,,,,,,,,,,,.,.,,,,,,,,,,,,,,,,,,,,,,-\hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhs            9Y[;  !  ;Y   [ [[#  @ [ @@  _[    }NNSSSSNNNNNNNSSSNNSNSNNSNNSNNNNSNNNNSNNNNNNNNNNNNNNNNNNNNNNSNNNNNNLNNLNNLNNNNNNNNNNNNLLNNNNNNLLLLLNNNNLNNLNLLLLNNLLLLNLLLLLLLLLLLLLLLNLLLLLLLLLLLLLLLLLLLL.LLLLLLLLLLLLLLLL,LLLLLL,.,,,,LLLL,L,L,,L.LL,,,LL,,,,,.LL,,,,,,,,,L,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,-Whhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhs            Y[   ;[    a  YY#Y @  [ wSSNSSSSNNSNNNSSSSNNNSSSNNNSNSNSNNNNNSNNNNSNNSNNNNNNNNNNNSNNNSNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNLNNNLNNNNNLNNNNLLLNNNNNLNLNLNNLLLLNLNLLNLLLLLLLLNNLNNLLLLNLLLLLLLLL.LLLLLLLLLLLLLLLLL,LLL,,LLLLLL,LLL,,LL,LL,L,L,,L,,..L,L,LL,,L,,,,,,LLLL,,,,,,,,,,,,,,,,,,,,,,,,,,/Ughhhhhhhhhhhhhhhhhhhhhhhhhhhhhho !   ! ! !    ! Y[! !!! !! !; !   9# Y  [ @  [   !}SSSNNNSSSSSNNSNNNNSSSNNNSSSSSSNNNSSNNNNSNSSNSNNNNNNNNNNSSSNNNNNNNNNNNNNNNNLNNNNNNNNNNNNNNLLNNNNNLNNLLLLNNNNLLLNNNNNLNLNNNLLLNNNNLLNLLNLLLLLLNLNLNLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL,LLLLLLLLLL,LLLLLL.,LLLLLLL,LLL,.,.L.LL,L.,,,L,,,,LLLLLL,,,,,,,,,,,,,,,,,,,,,,,.,.Mghhdcdddgdddgdggggggfggfgaggfggfggddgggeddgffggfggegggggccddcdccccdcdcdddcdddddcccddddddcccccdcccddcdddddddddcccddddddddcddddcccdddddddcggggggggggggcggggggggggggggggggggggggggcgdgddddddggghhhhhhhl           !  !!  @[  #Y ;@ Y@@  @_ [  pSSSSNSSSSSSSSSSNNSSSSSSSNNSNSSNSSNSNNNNSSSSSSNSNNNSNNNSNNSSNSSNNNNNNNNNNNNNNNNNNNNNNNNNNNLNNNNNNNNNNNLNNNNNNLNNNLNNLLNLNNLLNNLNNNNNNNLLLNLLNNLLNNLNNLLNLLLLLLLL,LLLLLLLLLLLLL.LLL.LLLLLLLLLLLLLLL,LLLL,LLLLLLLL,,LLLL.LLLL,,,L,L,L.,LL.LLL,L,,,,,L,,,,,,,,,,,,,,.,/Whhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhggghghghghdhghhghdghhdddgggdddhgdddddhdddddddddddddddddddddgddgddddddddccb++20002+03+003000+020200020000000+0+0++&+&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&+bccddcccddddddddddddddghddggdddddhddddddddddgddddddddddddddddm           !       ;    ;_  #; Y ;@ @[    phhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhSSSNSSSNSSSSSSNSNSSNSNSNNSSSSSNSSNNSSSSSSSSSNSSNNNSSNNSSSNNNNNNNNNNSSNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNLLNNNNNLNNNLLNNNNNNNNNNNNNLNNLLNNNNNLLLLLLLLLNLLLNLLLLLLLNLLLLLLLLLLLLLLLLLLLLLLLLLLLL,L.LLLLLLL.LLLLLLLLLLLLL.LLLL,,LLLLL,L,L,.,.LL,,L,,,,,,,L,,,,,,Ug"""""""""""""""""+000000202+02002230000020000000+0000+++&&&&&&&&&&&&&+++&(&&&&(+&(++++&(++&(&&&&&&&&&&&&&((&&&((&&&&&&&&&&&&(&&&&&&&&&++&++&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&l          !!       ;_!   ! @      Y#Y@ _[ v""""""""""""""""""""""""""SSNSSNSNSSSSSSSSSSSSSSNSNSNSSNSSNSSSSNSNSSNNNNSSSSSNSSSSNSSNNSSNNNSSNNNSNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNLNNLNNLLNNNNLNNNNNLNNNNLNNLLLNLNLLNLLLNLLNLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL.L,LLLLL,LLLLLLL,L,L,,L,LL,,..,LL,,,,,,,,,,LMb+000002000020202020000200000200000+00222O22222222222222222222222222222222222223*2222022+22222+3+++0002++0++++++++++++++++*&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&o  !        ! !      [‚_[ZY[!  ! ;˄[@;;;Yf_  [ Y_#@# ; [ oSSSSSSSSSSSSNNSSNNNSSSSSSSNSNNNSSSSNNSNNNNNSSNSNSNSSNNNSNNSNSNNNNNSSNNNNNNNNNNNSNNNNNNNNNSNNNSNNNNNNNNLNNNNNNNNLNNNNNNNNNLNNLLLNNNNLLNNNNNLLNNLNLNNLLLLNNNNLLLLLNLLLNLLLLLLLLLNLLLLNLLLNLLL,LLLLLLLLLLLLLLLLLLLLL,L,LLLLLLLL,LL,LLLLLLLLL,,,LLLL,,,,,L,,,LL..Whh  00200000000000000000000000000000000002444434433333333333333333333333333333233322322230220000002020020020+0++++0++++++++++*&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&p   !     !      _тB9!  ! 9@_@ ! 9@ !  #_Y    ; ;_  Y  ;  _[ vSNSSSSSSSSSSSSNSNSSSNNNSSNSSSSSSNNNNNNNSSSSSSNNNSSNSNSSNNSSNSSNNNNSSNNNNNNNNNNNSNNNNNNNNNNNNNNNNNNNNNNNNNLNNNNNNNNNNNNLLLLLLNNNNNNNLLNNLNNLNNLLNNNLNLLLNNLLLLLNLLLLLLLLLNLLLLNLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL,L,,,LLLLLLL,,LLLLLLLLL,LLLLL,L,LLL,,,,,L.,.Mch +0203\VVV\VVVVVUVVVVVVVVVUUVUUUUUUUV3244443344333333333333333333333333333333332222232022022000000000000000+++0+0+++++++++*3M::::033::3:3:03:2:0333M:200000+&&&& l           ! !! !  [   ! @@!! !; !  !!;     @@#Y YY9Y ; _[  pSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSNNNNNNNSSSSSNNSSNNSNSSSNNSSSNSNNNSSSNNNNNNNNNNSNNNNSNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNLNLNNNNNNNNLLNNLNNLNNNNNNNNNNNLLNNNNLLLNLLLLNNLLNLNLLLLLLLNLLLNLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL.LL,,L.LLLLLLLLLLL,,LLLL,L,L,,.,L/W""0200243433333333333333333333333333333333232332*202M22MM00200000000000000000++0+0++++++++3ÛŖ”0&&&&"" o     ! !     ! !  !  !!   !    !!Y! ! ! ! !@Z  !![    @   Y# Y   Y@ _[   pSSSSSSSSSSSSSSNSSSSSSSSNSSSNSSSNNSSNNSNNNNSNNNSSNNSSSSSSNNNNNNNSSNNSNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNSSNNNNNNNNNNNNNNLLLNNNNNLNNNNNLNLNNLNNNNNNNNLLNLNNNLNNNLLLLNNNLLLNLLLLLLNNLLLNNLLLLNLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL,LLLL,LLLLLLL,LLL,LLLLLLLLL,,LL.Pg""00202442QQQQQQQQQQQQQQQQQQQQQQQUQQQQQQQQQQQQ33222Q3Q33QQ3U3333333U333333333333333333*+++3ƝÖ0&&&&"o     !  !    ! !! !! !!!_  !  ! !! ! Y_   ;[ !!  !! ;[    _ Y ;@   @   [    !v""""SSSSSSSSSSSSSSSSSSSSNNSSSSNSSSSSSSSSSSSSSSNNNSNNNSSNNNNNNNNNNSNNSSNSNSSSNNNNNNNNNNNSNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNLLNNLNNNNNNNNNLLLNNNNLLNNNNNNNLNLNLLLLLLLLNNLLNLLLNLLLNNLNLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL.LLLLLLLLLL,LLLLLLLLLLLLLLL./bh""""20202444ߍ322<`+++3ǞǞǞǞ0&&&&""l       !    !      Y@   !   !! 9Y! ! _    ;     _;  Y #;@ _[  pSSSSSSSSSSSSSSSSSSSSNSSNNNSSSSSSSSSSSSNNSSSSNNSNSNNNSSNSNSNNNSSNSSNSSNSNNNNNSSNNNNNSNSNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNLNNNNLNNLLNNNNNNNNLNLNLNNNNLLLLLNNNNNLNLNLLLLLNLLLLLLLLLLNLLLLLLLLLLLLLLLLLLLLLLLLLLL,LLLLLLLL,LLLLLL/Whh""TT02004444ݓ322<۰۰y+++<<&&&&"""" l   !!           ! !    !!;;! ! ! ! ! !!  !_B !!9    !    @[      Y!! Y![; _[p"""SSSSSSSSSSSSNSSSSSSSSSSSNSSSSSSSNNSSSSSNNNNNSSSNSSSSNSNSNSSSNNNNNSNNNSNNNSNNNNNNNNNNSNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNLNNNNNNNNNNNNNNNLNNLLLNNNLNNNNLNLNLNLNNLLLNLNLNLLLLNLLNLLLLLLLLLLLLLLLNLLLLLLLLLLLLLLLLLLLLLLLLMg"""""""T+200O442ڍ323<ԭԭa+++<:&&&&"l     !  ! !!  !!! !!!  !!! !! !9! !   ! !! ! ! @@  !_!     !!  ! ;99  Y_9Y9 ;  [ oSSSSSSSSSSSSSSSSNSSSSSSSSSSSSSSNSNSNSSSSSSNSSSSSNNSSSSNSNNNSSNNSSSNSNNNNNNNNNNNNNNSNNNNSNSNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNLNNNNNNNNNNNNNLLLNNLNNNNNLNNNLNLLNLLLNLNNNLLNNNNLLLNLLLLLLLLLLLLLLLLLLLLLNLLLLLLLLLLLLLLLLL/W"""""""""+0024442ڍ323<ӭԭa+++<Ҩ0&&&&""""""o !  !  !  !  ! ! !  !!!! !  ! 9!!!  !! ! ! !! !  !!!  !!!!!  !Z!  !!! !   9;   !  ! @9; Y _ ;  _[ oSSSSSSSSSSSSSSNSSSSSSSNSSSSSSSSSSSSSSSNSSSSSSSSSNNSNNSNNNSSNNNSSNNSSSNNSNNNNNNNNNNNNSSNNNNSNNNNNNNNNNNSNSSNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNLNLNNLNNNNNNNLLLLLLLNLLNNNNNLLNNNNLNNLLLLLLNNNNNNNNLLLLLLNNNNLNLLLLLLLLLLLLLLL/Pg"""""""""""T"""TT"""+0004442ڍ322<ԭԭۭx+++<0&&&&:""""""T""T"o               ! !  ! !  !!!@9! !! !! ! !!! !   ! ! ! !;!  ! ! !  !  __  !   ## f YY @ _[  pSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSNSNNNSSNNNNSNNSSNNSNSSSNNNSSNNNNNNSNNNNNNNNNNNNNSSNSNNNNNNNNNNSNNNNNNNNNNNNNNNNNNNNNNNLNLLNNLLLLNNNNNLLNLNNNLNNNNNLNLNNNLLLLLNNLLNNLNNNNNNLNLLLLNLNNLLLLLNNNLLNLLLLLLLLPb"TT"""""""""""""""""""TTTTTT"T:00204444ٍ323<^+0+3ǞǞ0&&&&""TTTT"TT""TTo       !       !    ! !!!   ! !!! !!!;! !! !!!  !!!!!  !  !! !  ! !![[ ! !!!  ! ! 9     B Y Y@  _[ p""""""""""""""""""""""""""""""""""""""""""SSSSSSSSSSSSSSSSSSSNSSSSSSSSNSSSSNSSSSNNNNSNSSNSSSSSNNSNSNSNSNSSNNNNNNSNNNSNNNSSNNNNNNNNNNNNNNNNNNNNNSNNNNNNNNNNNNNNNNNNNNNNNNLNNNNLNNNNNNNNNNNNNNNNNNLLLNNNNNLNNLNNNNNLNLLLLNLNLNLLNLLLLLNNLLLNLNLLLL.WhTT"TT"TT"T""TTTT"""""""TTTTTTTTTTTTT+020444Oٍ223<^+0+30&&&&:TTTTTTTTTTTTl     !      ! ! !!    !!!!  ! !!  !! !! !BZ! !!!!! !  ! !!!! ! !!!!!  !! @ !!! ! !! !!!! ! ! !  !   YY Y ; @ _ Y  vTTTT""TT"TTTTTTTTTTTTTTT"TTTTTTT""TTT"TTTTSSSSSSSSSSSSSSSSSSSSSSSSSNSSSSSSSNNSSSSSSSNSSSNNSNNSSSSNSNSSSNNNSSSNNNNSSSNSNNSNSNSSNNNNSNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNLNNNLNLLNNNNLNLNNNNNNNNLNNNNNLLLNLLNLLLLLNLLLLNNLLLLLNLLMcTTTTTTTTTTTTTTTTTTTTTTTTTTTT"""T"TT"T""T"""T"""""""""""T"""T""""""UXXXXXXXXXXXU0000O44Oٍ323QǞ^+0+30&&&&UXXXXXXXXXXXX""""""""l !   ! ! ! ! ! ! ! !!  ! ! ! !! ! !! ! !!! !!!!!!!!!!! !!! ! ! ! !!!!! !  !   !! ! !  ! 9 !      _   Y@@   _ [ pTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTSSSSSSSSSSSSSSSSSNSSSNSSSSNSNSSSSSNNNSNSSNSSSSSSNNNSSNSSSSNNNNNSNSNSNNNSSNSSSNNNNNNNNNNNNNNNNNSNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNLNNNNNNNLNNNNNLNNNNLNNNNNNNNLLNLNLLLNLLLNNNLNNNNNNLNNNLLNLNLLL/bhhUXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXVXXXXXXXXXXUVXVXXXXUUXXXXXXXUUUUTTTUTTTTTTTTTTTTTTTTTTTTTTTTUTTTT:TTT:TTTTTTTWXXXXXXXXXXXW+0004442ٍ223QǞ^+++30&&&&WXXXXXXXXXXXWT"TTTTTTTTTTTTT:T:TTTT:TT:TTTTTTTUT:TTUTTTTTTTTTTT:Tl         !   !   ! !!  !!! !! ! ! ! !!!!!!!@;!! ! ! ! !!!!!!!!! !! !!!!!!  ! ! !! !9!!  ! !   !!!B;    !   @[ Y  @ _[oXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXSSSSSSSSSSSSSSSSSSSSSSSSSSSSSNSSSSSSSSSSSNSSSSNNNSNNSSNSNSNSSSNSSNNSNSSNNNNNNNNNNNNNNNSNNNNSNNNSNNNNNSSNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNLNNNLLNLNNNLNNLNNLNNNLLLNLNNNNNLLLLPghHWWWWKWWWKWWWKJWWJWJWWJWWJJKWJWJJWJJWJJJJJJJJJJJJJJJJJJJJJJHJJJJJJJJJJJJJJJJJJJJJJJJJJJJJHHHHHHHHHHHHHHHHHGGFFFFJKKKKKKKKKKKK00004444ލ2233^00+3{0&&&&JKKKKKKKKKKKHFFFFFFHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHJJHHJJJJJJJJJJJJo  !!!! !! !   !!!! !!   ! !!!!!!!!!!! !! !_!!! !!  !!!!!!!  !!! ! !!!!!!   !! ! !!! !!!! ! ! ! ! ! ;; !!      !_  Y[#@ [  oKJKKKSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSNSNSSNSSSSNSNSNSSNNNSNSSNSSSSNNNSSSSSNSNSSNNNSNNNNSNNSNNSNNNNNNNNNNNNNSNNNNNNNNSNNNNNNNNNNNNNNNNNNNNNNNLNNNNNNNNNNNLNNNNNNNNNNNNLNNNLNNNNNNNLNNNLLL/bcJKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKJKKKJKKKKKKKJKJJJJKJJJJJJKJKJJJJJKJJJKJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJHJJHGHGGFFFFFFJKKKKKKKKKKKK02202444ٍ323<ҧ^0003:&&&&JKKKKKKKKKKKGFFFFFFGGGGGGGHHHHHHHJJHJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJl !  !   !!!!!!  ! !!!!!!!!! ! !!! !!! !!!!!!!!!!!!!!!!!!!! !!!!!!! !!  ! !  !! !!!!!  !!!!! !! ! ! !;B! 9   ! Y  !Y _@_ [  phKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKSSSSSSSSSSSSSSSSSSSSSSSSSNSNNNNSSNSSSSSNNNNNSSSNSNSNSSSSSSNSSNNSNNSNNNSNSNSSSNSSNNNNNNSNNNNNSNSNNNNNSNNNNNNNNNNNNSNNNNNNNNNNLNNNNNNLNNNNNNNNNNNNNNNNNLLNNNLNNNNNNNNNNNLNNLLMJKKKKKKKKKKKKKKKKKKKKJKKKKKKKKKKKKJKKKJKJKJKKKJKKKKKJJJJKJJJJJJJJJKJJKJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJHHHHGGGGFFFFFFJKKKKKKKKKKKK0200O444223Qߍ00+3Ԯ3&&&&JKKKKKKKKKKKGFFFFFFGGGGGGGHHHHHHHHHJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJl    ! !  !!!  ! !!! ! ! !!!!!! !!! !!!!!!!! !!Z! ! !!!!! !! ! ! !!!!!!!!! !!!! !!! ! !!9! ! !!!!!!! ! ! ! !  ;@! !!    9; Y _;@ _[  phKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKSSSSSSSSSSSSSSSSSSSSSSSSSSSSSNSSSNSSSSNSSSSSNNSSNSSNSNSNSNNNNSNNNNNNNNSSNSSSNNSNSSNNNSNNSSNSNSNSNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNLNNNLNLN/JKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKJJKJKKJJKJKKJJJKJJJJJJJJJJJJKJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJHHHHGGGGFFFFFJKKKKKKKKKKKK02004444323Q߾000<Ӱذ:&&&&JKKKKKKKKKKKGFFFFFFFGGGGGHHHHHHHHJJHHJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJl       !  ! ! !!   !!   ! !! ! !!!!!!!!!!! !!! !! !!!@! !!! ! !!!!!!! !!!!!!!!!!!  !!!!!!!! !!!!!!!!!9!  !!!! !!! !!!!!@;! !     !  Y9  Y# ; _[phKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKcdSSSSSSSSSSSSSSSSSSSSSSSSNSSSNSSSNSSSSSSSSSSSSSSSSSSSSNNSNNNSNNSNSNSSNNSNNNNSNNNNSNNSNNSNNNSNNSNNNNNNNNNSNNNNNNNNNNNNNNNNNNNNNNNNNSNNNNNNNNNNNNNNNNLNNLNNNNNNN/JKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKJKJKJJKKJKJKJKJKJKKJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJHJHHGGGGFGFFFFJKKKKKKKKKKKK02024444322Q0203٫ͧ<&&&&JKKKKKKKKKKKGFFFFFFFGGGGGGGHGHHHHHJHJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJl    !  ! ! !!! !!!!! !!  !! !!!!!!  !! !!  !!! !!!!!!! !!!!!!!!!!!!!!! !!!!!!! ! !!!!!!!!!!!!!!!!!!!!! !!! !  !!! !!!!!!Z# !!!!  !_!  Y _ ;  dphKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKecccSSSSSSSSSSSSSSSSSSSSNSSSSSSNSSSSSSSSSSSSSSSSSNSSSNSNNSSNSSSNSNSNSNNNNSSNSSNNNSSSNNNSSNNNNNNNNNNNNNNNNNNNSNNNNNSNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN.JKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKJKKKKKKKKKKKKKKKKKKJKKJJJJJJKJJJJJJJJKJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJHJHHHGGGFFFFFFJKKKKKKKKKKKK0202444O223Qэ000Qذ<&&&&JKKKKKKKKKKKGFFFFFFFFGGGGHHHHHHHHHJHJHJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJl  !   ! ! !  ! ! ! !! !  !!!! !!!!!!!! !! !!! !! !!!!!!9!!! !!! !! !!!!!!!!!!!!!! ! !!!!! !!!!!  !!!!9!! !!! !! !!! !!! ! 9! !Y!!   ! _@    !Y[;;   phKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKcccchSSSSSSSSNSNSSSSSSSSSSSSSNSSSSSNSSSSNSSNNSSNNSSSSNSSSSSSSNNSSNNNNSNNNNNNSSNSSNNSSSSSSSNNNNSSSNNNNNNNNNNNNSNNNNNNNNNNNNNNNNNNNNNNNNNNNNN.JKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKJKKKKKKKKKKKJJKJKJKJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJHHHHGGGFFFFEJKKKKKKKKKKKK0220O444323Qэ0003ϭ<&&&&JKKKKKKKKKKKGEFFFFFFGGGGGGHGGHJHHHJHHJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJl   !   !!  ! ! !! ! ! !  ! ! !!!! !!! !!!!!!! !!!!! !!!!!!!!!!@B!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!! !!!!! !!!!Y!!! !!!! ! !!! ! !!!!! ! !!    Y[  Y;  @   phKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKdcccSSSSSSSSSSSSSSSSSSSSSSSNSNSSSNSSSSSSSSNSSSSSSSSNSSNSSSSNNSNSSSNNNNNNSNSNSNNNSNSSSSNSNSSSNSNNNNNNNNSNNNNSNNNNNNNNNNNNNNNNNNNNSNNNNN.JKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKJKKJKJKJJJJKJJJKJJKJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJHJJHHGGGGFFFFFJKKKKKKKKKKKK02224444322Qэ2003߰<&&&&JKKKKKKKKKKKGFFFFFFGFGGGGGHHHHHJHHJHJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJo !  !! !!! !! !!! !!! !!! !! !! ! !! !!!! ! !!! !!!!!! !!!!Z9!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!! !!!!!!! !!Z!!!!!!!! !!!!!!  !!!!! @ !!!9@ !!    #   Y   @ohKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKeecccSSSSSSSSSSSSNSSSNSSSSSSSSSNSSSSSSSSSSSNSNSNSNNNNSSSSSNSSSSSSSSNSSNNSSSSNSNNSNSNSSNNSNNSNSSSNNNNNNNNNNNNNNSNNNN.JKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKJKKKJKJKJKKKJKKJJKJJJJKJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJHHHGGGGFFFFFFJKKKKKKKKKKKK02224444323Qэ2003ްذ:&&&&JKKKKKKKKKKKGFFFFFFGFGGGGGHHHHHHHHJHJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJp  !!      !! !! !!!!!! !!!!! !!!!!!!!!!! !!!!!!!!!!!!9!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!! !!!!!!!;;! !!!! !!!! !!! !!!!!!![ !!!! ! !  YY !! ! ! !Y @; phKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK>eA`?jcSSSSSSSSSSSSSSSSSSNSSSSSSSSSSSSSSSSSSSSSSNNSSSSSSNSSSSNSSNSNNSSNNSNNNNNSSSSSNSNNNSSSSSNNSNNNNSNNNNNNNNSNNNJKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKJKJKKJJJKJJJKJJJJJJKJKJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJHJJHHGGGFFFFFFJKKKKKKKKKKKK022244323Qэ0033ްϭ3&&&&JKKKKKKKKKKKGFFFFFFGGGGGGHHHHHHHHJJHJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJl !  ! ! ! !!   !  !!! !!! ! !!!!!!!!! ! !!$!!!!!!!!!!!!!!!!!!$!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!! !!@9 !!!9Z! ! ! !!9 !    9Y@  @   vhKKKKKKKKKKKKKKKKKKKKKKKKK^8je?i^e\cNLL.LSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSNSNSSSSNSSSSNSSSSSSNNSSSNNNSSNNSSSSNNNNSNSSNSNNNNNNNNNNSSSNNSSNNJKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKJKKKKKKKKKKKKKKKKKKKKKJKJKJKJJJKJJJKJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJHJHHGGGGFFFFFFJKKKKKKKKKKKK022244323QѾ2003ް3&&&&JKKKKKKKKKKKGEFFFFFFGGGGGGHHGHHHHHHJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJl   !  ! ! ! !!! !!!!!!!!!!!!!!!!!! !!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!ZB!! !! !!!!!!!!! !!!9!!!!!@ !!!!! ! ƖY!  Y #[ @   phKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKj66ii?6ii8Z?88`eC>>`e`?B``BS,DLSSSSSSSSNLLSSSSSSSSSSSSSSSSSSSSSSSNSSNSSSNSSSSSSNNSSSSNSSSSNSSSNSSNNNSSSNSSNNNNNNSNNSNSRSSNN.JKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKJKKKKKJJJJJJJJKJKJKJKJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJHHHHGGGGFFFFFJKKKKKKKKKKKK02224444223Qэ0+03ث<&&&&JKKKKKKKKKKKGFFFFFFGGGGGGHHHHHHHHJJHHJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJo !! ! ! !! !! !!!!! !!! ! !!!!!! !!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!99!!!!! !!!!!!!!!!!!!B ! !@   ! #Z !@ˁ;   Y Y Y;   ohKKKKKKKKKKKKKKKKKKKii6ii66ii6666i66i668^>^8ii^e^8i6i^>ee6?Z\e`e\GDD,NSSSSSSSS.D,SSSSSSSSSSSSSSSSSSNSSSSNSSSSNSQSSNSNSSSSNNSNNPQSSSNNRRSNNNNNSSRSNSN/KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKJKKKKJKJJJKJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJHJHHGGGGFGFFFFJKKKKKKKKKKKK02224444222QѾ2003ϭ<&&&&JKKKKKKKKKKKGFFFFFFFGGGGGGGHHHGHHJHHJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJl!!  !!  ! !! !! ! !!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!$!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!_=!!!!!! !!!!! $!!!_!! !!!@  !  99  @!  Y   Y ## ; ohKKKKKKKKKKKKKKKKKKKKKKKKKKKK666iiiiiiii6ii6i666666i6i68888ii6ii868?8<8i?tZ6??A^iBB^\BGDDD,0Q\SSSSSLD-,NRVSSSSSSSSQSSSSSSSSSNSSSSSNNSNPSS\SSSSNNNSSRNSSSSRSRQSSQNQB\S\SNNNSSSSOQR/JKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKJKKJKJKJKJJJJJJJJKKJJJJJJJJJJJJJJJJJJJJJJJJJJJJJHJHHHGGGFFFFFFJKKKKKKKKKKKK022244323QѾ020Qϭ<&&&&JKKKKKKKKKKKGFFFFFFFFGGGGHHHHHHHHJJHJHJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJl!  !! ! ! !! ! !! !!!!!!! ! !!!!!!!!!!  !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!$!!!!!!!$!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!99!!!!!!!!!!!!!!!!!$_B! !!!!!ρ;!!!9B!  _ !Y  # @  @   phKKKKKKKKKKKKKKKK6i666i66iii666iii6iiii66iii6iii6iiii6iii66iiZZii6ii>i68?CCCii6CCB>Z\B^8^?Z>?^>\^<\EDDFS--,- 0NSB\\\\\SSSLDD/N,.:SSSVQ\SQe``B<\^8^=ED\:" ,- #=Q<\e\e\e\\Q?\`\\QQ\\^Q\Q\QQSQQ?\QMR\S":NRQ\QQ`\BQQSR>8\B\YQ\VVBQSQBUV\QUQQQBV=BV\>\\?88<888BB=JKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKJKKKKKKKKKKKKKKKKKKKKKJJKJJJKJJKKJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJHHJJHHGGGGFFFFEJKKKKKKKKKKKK0222444223Q0223ѭ<&&&&JKKKKKKKKKKKGFFFFFFGFGGGGGHHHHHHHJHJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJl !! !   ! ! !! !!!!!!!!!!!!!! !!!!!$!!! !!!!!!!!!!!!!!!!!!!!!!!!$!!!!!!$$!!!!!!$!!!!!!!!!!!$!!!$$!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!;!!!!!!!! !!![9! !!!!99!! 9!!@@ !   Y Y_ #;  ohKKKKKKKKKKKK66i6i6ii666iii6iiiiii66ii6iii66i6666ii666i6iii66ii6iii6i6i666ii6iiiii6ii6iiiiiii6ii66i66668ZZC8?>86^9ED8Z?8>57==5<<66CB^`B\BZ>8?Y\BZA>6?>Z\Z><\BY^V^\A\^Q<<\8Y\"PY\Y8V8\B88B\YQ>B86>BVBBBA6>8888BB8i?BB66868iV88ii6iiii6iA>A=JKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKJKKKKKKKKKKKKKKKJKJJJJKJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJHHJHHGGGGFGFFFFJKKKKKKKKKKKK/222444322Q2003ް<&&&&JKKKKKKKKKKKGFFFFFFFFGGGGGHHHHHHHHJHJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJp!  !! !!!! !!!! !!!!!!! !!! !!!!!!!! ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!$!!!!9!!!!!!!!!!!!!$!!!!!!!!!!$!$$!!!!!!$$$$$!!!!!!!!!!!!!!!!9΂B9!!!$$$!@x@!!!!! !!!9! ! [!   !Y 9 #  ;   phKKKKKKKKKKKKKKKKiii666iiiii6ii6iii666i6i66ii666i6i66i6i6i6iiiiiii6iiii666iiii6666i6666i6i6i6iiiii6iii66ii66i66i6666i$EDD66ii6666??88i668A>6i88AiZ?66j??i6i688>8886^B8iii8ij\8ZZ8<888>A>??i8\Z8ijiB8>>B\>":B?>Vi8>\>\6iiCB68>8i8ii888i66i86V8ii8Z66888i6ii6iii666iiii686iiiA8666ii6i666iiii8ii6iiiii66i666=JKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKJKJKKJJJJJJKJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJHHHHGGGFFFFFFJKKKKKKKKKKKK/222444323Q202Qϰث3&&&&JKKKKKKKKKKKGFFFFFFGGGGGGHHHHHHHJHHJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJo! !! !! !!! !!!!!! !!!!!!!!!! !!!!!!!!!!!!!!!!$!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!![9!!!!!!!!!!!!!$!!!$!!!!!!!!!!!!!!!$!!!!!!$!!!!!!!!!!!!!!!9„B!!!!!!!!!!@!! !!9 !!Y !;[[;  ohKKKKKKKKKiiiii6i66i6i6i666ii6ii666ii6666ii66666i6i6i6iiiiiiiii66i6ii6i6iiii6i6iii66i6iiii66iii6666i6iii6i6ii6#ED6i66i66ii66i6ii666ii6ii6iii66ii6i666ii666i6iiiiii6iiii6i666iiii666iii66iii6ii66i6Di6666ii6ii666??i6iii666iiii666i6i6666i66iiiii6i666i666iiii6iii6ii6666iii66ii66iiiii6i666666iiii=JKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKJJKJJKKKJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJHHHGGGGFFFFFFJKKKKKKKKKKKK0222444423Qэ222Q߰Ԩ3&&&&JKKKKKKKKKKKGEFFFFFGGGGGGGHHHHHHHHHJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJo !! !! !! !!!!!!! !!!!!!! !!!!!!!!!!!!!!!!!!!!$!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!BB!!!$!!!!!!!!!$!!!!!!!!!!$!!!!!!!!!!!!!!!!!!!!$!$!!!!!!!!!!!!@Y!!!!!!!!! !! !!!!!Y;   9Y [Y #;phKKKKKKKKKKKKKKKi6ii6ii66iii6i6ii6i6i666i6i6i6iii66i6iii666iii666iii6i666iiiii66i6ii666ii6i6i6ii666ii66iiiii6i6i6ii6"EDD 6i6666ii6i66iii6iiiii666ii6i66ii66i6i66iii66i6666i66666i6i666ii66666666666666666iiii66i666i6iii6i6666ii6666i6i6ii66ii6ii6iiii6iiiiii6iiii6ii6iii6i6i6ii66i66iiii6i6i6iii6i66i6i6$JKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKJJJJKJKJJJKJJJJJJJJJJJJJJJJJJJJJJJJJHJHHHGGGGFFFFFJKKKKKKKKKKKK022244323Q0223ϭ:&&&&JKKKKKKKKKKKGFFFFFFGGGGGGGHHHHHHHJJHJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJp! !!! ! !!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!$!!!$!!!!!!!!!!!!!!!!!$!!!!!!$!!$$!!!;!$!$!!!!!!!!!!!!$$$$!!$!!!$$$$!!!!$!!!!$!!!$!!!$!!!$$!!!!!$9B!!!!! !!!!!!!Z; !!! [! ! !Y! @    @     phKKKKK6i6ii66ii6i66iii6i6i666iiiii6i6ii66ii66i6666i6i6i6iiii6i666i66i6666i6ii66iiiii6ii66i6i66i6i66i66iii6EDD i66i6iiii666i666iiiiii66ii666i66i66666i66666i6iiiiiii66i6i6iiii666i6i6iiiii6ii6i66i66ii6i6ii6iiii6i6i6ii6i6666iiii6i6i6iii6ii6i6i66iiiiii6i66iii66i6666iii666i6ii6ii666iiii66iii=JKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKJJJJKJJKJJJJJJJJJJJJJJJJJJJJJJJJJJJJHJHHGGGGFGFFFFJKKKKKKKKKKKK/22244324Q222Q׫<&&&&JKKKKKKKKKKKGFFFFFFFGGGGGGHHHHGHHJHHJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJp!! !!! !!!!!!!! !!!!!!!!!!!!!!!!!!!!!!$!!!!!!!!!!!!!!!!!!!!!!!!!!$!!!$$!$!!!$$!!9$!!!$$$$!!!!$$$$$$!!!!!$!!!!!!!!!$!!!!!!!!!!!!!!!!!!!!!!!!!!9@!!!!!!!!!!!!$ 9_! !! !! !!!! !Y# @;; Ƃ  phKKKKKKKKK666i666i66i66iiiiii66666iii6ii66i6666iiiiiiiiiii6i666666i66i6i66iiii6ii6i6ii666i66iiiii66i6ii66iii66DD!66ii6ii6666iiiii6i66iii6ii6iii6ii66i66ii6iii6iiiii6666i6i6i6ii6666i6666i66i6ii66i"66i6i6666iiii66i6iii6iiii6iiiii66i66iii6iii66i66iiiiiiiiiii666i6ii6ii6iii6666iii6i6i6iii6666iii=JKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKJKKKKKKKKKJJJJJKJJJJJKJJJJJJJJJJJJJJJJJJJJJJHHHHGGGFFFFFFJKKKKKKKKKKKK/22244323Qэ222Q԰<&&&&JKKKKKKKKKKKGFFFFFFFFGGGGHHGHHHHHJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJo! !!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!$!!!$$!!!!!!$!$!!$!!$$!$@!$!!!$$$!!!!$$$!!!!!!!!!!!!!!!!!!!!!!$!!!!!!!!!!!!!!!!!!!$$!!!!Z_9!!!!!!!!!!!!!!!@_;!!!!;_„9!!!! !!!![!   !! !B[! @_9 ! @______!; _[ phKKKK666ii6iii666iiiii66i6i6i6i6iii6ii6ii666iii6ii6666iiiiii66i6iii66ii6iiiiiiiiiii666i66i6ii6iii6i66i6i8ED=iiiiiii6iii6iiii66i6i6iiiiii666666ii6i66ii66iiiii66i6ii6ii666iiii666iii6ii6666i6i"D66i6ii6i6iiiiiiii666i66iii66i66iii66ii6ii6666ii6ii66i6i6i6i666ii666666i6i6iiiii666666i666iii6i6$JKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKJJJKJKKJJKJJJJJJJJJJJJJJJJJJJJJJJJJJJJJHHGHGGGFFFFFFJKKKKKKKKKKKK/222444323QѾ322Qޭ<&&&&JKKKKKKKKKKKGFFFFFFFGGGGGGGHGHHHHHHJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJm! !!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!$!!!!!$$!!$$$!!!!!!!!!$!!!!!$$!$]_!$!!!$$$!!!$!!!!!!!!!!!$!!$!!!!!!!!!!$!!!!$$!!!!!!!!!!!!!!!!$!!!9[ς@!!!!$!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!! ! @΂@ !! !!!!           @ _[   phKKKKKKKK6i6ii66ii666ii6ii66ii6iii6iii6i6iiiiiiiiii66666ii6666iii66iiiiii666iiii6666iiiii66iii6iii66i66i6iii8ED7iiiii666i6ii6666ii6iii6iii6666i6i66i6ii6ii6iiiiii666i6iii6ii66ii6i6iiii6iii6i66i6!6i6i66ii666i66iiiiiiii6i6i6i666iii66iiiii6i66666666iiiiii66iii66i6666ii6i6666666iiii6666ii6ii667KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKJJKJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJHHHGGGGGGFFFFJKKKKKKKKKKKK/22244324Q022Qװ<&&&&JKKKKKKKKKKKGFFFFFFGFGGGGHHHHHHHJHJHJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJo! !!!!!!!!!!!!!!!! !!!!!!!!!!!!=!!!!!!!!!!!$!!!!!!!!!!!!!!!!!!!!$!!!!!!$!!!$$$!!!!9=$!$!!$$!$$$!$$$$!$$!!!=$!!!!!$$$!!$$!!!!$$!!$$$!!!$=$!!$$$!!!$$!$9Z_;!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ! !!$!!! !!!!;Z_Z9!            !; _[   phKKKK666iii6iiiii66iiii6iiiii6iii66666i66i6iiiiii66ii66i666iiii66i6ii66iii6ii66ii66i6i6ii6ii6i66666i66i68FED$iiii66iiii666i6666666i6i66i6ii6ii6iiii6iiii66iiiii6i66ii6iii6ii666666ii6i6iii6iii6i666i6666i6i66i6iiii66i6i6i6666iiiiiii6ii6i6i6i6666ii66i66iii6i6iii6i6i6iii66666iii666i66i6iii$KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKJKKJKKJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJHHHGGGGFFFFFFJKKKKKKKKKKKK022244323QэM2MQԨ<&&&&JKKKKKKKKKKKGFFFFFFFFGGGGGHHHHHHHHHHJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJo! !!!!!!!!! !!!!!!!!!!!!!!$!!!!!!!!!!!!$$!!!!!!!!!$!!!!$!!$!!!!$$$$!!!!!!!!!$$$!!!_!!!!$$$!!!!!!!!!!$$$!$$$$$!!$$$$!!!!!!$!!$!$!!$$$!!!!!!$!$$!!!!!$!!@B_ƖZ@9$!$!!!!!!!!!!$$!!!!!!!!!!!! !!!!!!!!!! ! !!!!!!! !!!!! !!!! !! @[!       ;  [  ohKKKKK66iii66iii6i6i6666ii6i66ii66iii6i6666666666ii66iiii666ii6iii666i666iiiiiiiiiii66ii6i6iii66ii6ii66ii8FED7iii666ii6i66i666i66666iii6666ii6i66i666i66iiiii6iii66iiii66i6i66iii66iiiii66ii66i"Diii6ii6i6i66i6iiiii666666i6666i6iiii6iii6666i6iiiii66666i6i66iiiii6ii6ii6666666i6666iii6iii6ii6$KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKJKKKKKJJJJKKJJJJJJJJJJJJJJJJJJJJJJJHJJHHGGGFFFFFJKKKKKKKKKKKK022244323Q233Qϭ:&&&&JKKKKKKKKKKKGFFFFFFGGGGGGGHHHHHHHJJHJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJo!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!$$$!!!!!!!!!!!!!!!!!!!!!!!!$$$!!!!$$!!!$!!!$$Y@!!$!$$=!!!$!!$!!!$!!$!!!!$$!!$!!!$$$!!!!!$$!!!$!!!!$!!!!!!$!!!!!!!!!!!$$99999!$$!!!!!!!!!!!$!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !! !!!!!!! ! !!B   ! @ [ohK66i66iii6iii6ii6iii66iiiiii66i66i6i666i66i66iiiiiiii6666i6666iii6i6iii66666iiii6ii66i666i6i6i66ii6i7EDD76iiiiiii6ii6666i66iii66i66i66iii6666666i66i6i666ii6iii6666i66i666ii6iiii6iii666i6D6ii66i666i6iiii6iii666i6i6ii66666iii6i666i6i66666i666ii66ii66ii6iii6ii6iiii66iiiiiiii6i6iii66ii=JKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKJJJJJKJJJJJJJJJJJJJJJJJJJJJJJJJJHJHHGGGGFFFFEJKKKKKKKKKKKK/22244323QѾ222Q׫3&&&&JKKKKKKKKKKKGFFFFFFFGGGGGGHHHHHHHHHJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJo!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!$!!$!!!$!!!!!!$!!!!!!!!$!$!$!!!$$$!!!$$$!!!$$$!!!!$$!$$9$$$$$!$!$!$!!$!!!$!!$$!!!!$$!$!!$$$$!!!$!$=$!$$!!!!$$$!!!!!!!$!!!!!!!!$!!$$!$!!!$!!!!!$!!!!!$!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ! !!! !  9        #_[ohKKKKiiiiii66i6i6iii6ii6ii6666666ii666666ii66i6i6ii666iii6iiii66iii6iii6i6iii66iiiiiiiii6iiii6i6iiii6ii6EE76i6i666iii6ii6ii66iiii6iiiii6ii6iii6ii66i6i6666i6666i6666i66ii66iiiii66666i6i6666"iiii6iii6ii666ii6666ii666i66i66i6ii6ii66666i6i666iii6666i6i6iiiii66iii66666i6i66ii6i6iiii6iiiii$KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKJKKJJJJJKJJJJJJJJJJJJJJJJJJJJJJHHHHGGGGFFFFFJKKKKKKKKKKKK/2224432OQ222Qԫ3&&&&JKKKKKKKKKKKGFFFFFFFGGGGGHHHHHHHHJJHHJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJo!!!!!!!!!!$!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!$$!$$!!!!$$!!$$$!!$!!!$!$!!!!!$$$$!!!$[Y$$!!!$$!$!!!$!$!$$==$==!!!!!$$!!$!$$!!=!!!$$$==$$$!$!!=$$=!!!!!$=!!!!$$!!!!!!$!$!!$!!!!!!!!$$$!$$!!!!!!!!!!!! !!!! !!!!!!!!!!!!!!!!!! ! !  !! !@!   !     Y_[   vhiiii66i66i6i6i6iii66666iiiiiiii66666iii6iii6ii666666iii6i6ii6ii6666iiiiiii6iii6i6iii6i6ii6ii6i66ii6!GED86ii6i66i6666ii6666iiiiiii66666iiiiii66ii6i6ii666i6i6i6666i66i6iii6i6ii6i66666ii66"66i6ii6iiiii66ii666i6i66iiiii6666ii66i6iii666i66666i66i66i666i6i66iii6i66ii6i66i6i666i6iiii6iii=JKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKJKJKKKJJJKJJJJJJJJJJJJJJJJJJJJJJJJJHJHHGGGGFGFFFFJKKKKKKKKKKKK/22244424Q232Qέ:&&&&JKKKKKKKKKKKGFFFFFFFGGGGGGGHGHHHHHJHJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJl!!!!!!!!!!! !!!$!!!!!!!!!!!!!!!!!$!!$!!!$$!!!$!!$!!!$$!!$$!!!$!!!!$$!$!$$!!!$!!$$$$=!!$$$!!!@$!!$=$$$!$$!!$!=!$$!$$$$$!!!!!$$$!!$!$$$$$!!$!!!$!!!!$!$!!$!$$!!!$$!$$$!$$!!!!=!!!!$!!!!!!!!!!!!!$!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!! !! ![! ! !     Y _[  ohKi6ii6666i666iii6ii666666i666666i66i666666666666ii6iii66ii6i6666i6iiiiii6666ii6i66666iii6iii666i6666!ED6ii6i6666i66iiii66i6iii66iii6666ii66666i6666ii6ii6i666ii666i6i666i666i66i666i66i6"D!6i66iiiiii66i6i666666i6iii6ii66i6666ii6ii666iiii6i666i6i6i6i66ii6i6ii6ii6ii66ii6iiiiiiii6ii6iii$KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKJKKKKJJJJKKJJJJJJJJJJJJJJJJJJJJJHHHGGGFFFFFFJKKKKKKKKKKKK/22244424Q333Q٫<&&&&JKKKKKKKKKKKGFFFFFFFFGGGGHHHHHHHHHJHJHJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJl!!!!!!!!!!!!!!!!!!!!!!$!!!!!!!!!$$!!!$!!$$!!!$$!!!!!!!$$!$!!!!!!$!!$!$$!$!!!=$$$$$$$$$$$$!$Y=!$$$$$$!$$!$!!$!$$!$$!$$$$$$!!!$!$$$$!$=$!!$!!!$!!$!$!$!$!!$$$!!$$!!$=!!$$!!!!$!$$!!!!!!$!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!! !!!!!!!! !! !9 ! !       Y_[ ohiii666ii66666iiiiii66ii6iiii66i6i6i6666666i666iiiii66i6ii6666i666ii66i66i66i66ii66666i6ii6i666i6i66!EDD$66iiiiii666i6iii66666iiiiii6i6ii6i6i6666i6ii66666iiiiii6ii66i666i6i6ii666i6ii66i"!66i6i6ii6ii6i6ii6ii666i6i6666i6iii6ii6iii66iiiiiiii66iiii66ii666666ii6i66i666ii6iii6i66i66666i6$KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKJJKJJJJJJJJJJJJJJJJJJJJJJJJJJJJHHHGGGFFFFFFJKKKKKKKKKKKK/2224424Q323Qӫ<&&&&JKKKKKKKKKKKGFFFFFFGGGGGGGHGGHJHHHJHHJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJo!!!!!!!!!!!!!!!!!!!!!!!!$!!!!!!!$$!!!$$$!$!$!!!!!!!!$!!!$$!$$!!!$=$!!!$$$$!!!!$$$$!!!$$$!$$$$=9!$$!$$$!!$!$$$!!$!$$!$$$$=$$!!!$$=$!$$$!!!$$$$$!!$$!!!$$$!$!!$!!$$$!$!$$$!$!!$$$$!!!!$=$!!!!!$$!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !! !!!! _9     !     Y_[phK666666i666iii6i66i6i6ii66iii6666iiiii66i6ii6ii6666i666i66i6iiii66i6i6i6i6i666i6666i6iiii6666i6ii666 EDDE7666i6ii66666iiiii66ii6ii666ii6ii6i66666i6iiiii6ii6ii66ii6i66iii6666i6i66i6ii6i6D6i66iiii66ii66iiiii666iii6iii6iii6i666i66666i6666i666iiii666666i6i666iii66ii6666666ii6ii6ii6i6i$KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKJKKKKJJJJJJJJJJJJJJJJJJJJJJJJJJJJJHGGGGGFFFFFJKKKKKKKKKKKK0222444423QѾ230Qϭ<&&&&JKKKKKKKKKKKGFFFFFFGFGGGGGHHHHHJHHJHJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJl!!!!!!!!!!!!!!!!!!!!!!$$!$$$!!$!!!!!!!$!!!!!$!!$!$$$$$$$$!$$!!!$=!!$!$=$$$=$!$!!$$$$$!$=$!$9=!$$!!$$$$!$=$=$$$$$$=$$$$====$$!$=@x@$$$$$$!$==$!$==$!!!!!!$$!=$!$$$=!$$$$!!!!!!!!$$!!$!!!!!!!$$$$!!!!!!!!$!!!!!!!!!!!!!!!! !!!! !! !!!!!!  !!!B!! !!    !!   Y_[   ph66i666i6i6ii66666i6ii6iii66ii6ii6iiiiiii6666ii6ii6i66iii666i6i6i6666i6i6ii66666i6666iiii66iii66i666"ED6ii6i66ii66iii6i66i6iii666iiii6i66i6666666i6iiii6ii66i6iii6i6666ii6iiiiiiii6i6i66i6ii66iii666ii66i6ii6ii6666i6i6i66i666ii66ii66ii6ii66666i66i66i666iii6iii66666i6ii6iiiii6ii6$KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJHGGGGFFFFFFJKKKKKKKKKKKK022244424Q233Qޫ<&&&&JKKKKKKKKKKKGFFFFFFFFGGGGGHHHHHHHHJHJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJo!!!!!!$!!!!!!!!!!!!!!!!!!!$$!!!!!!!!!!!$$!$!!$!!!!$$!$$!$$$$$$$$!=$!$!!=!!$$!$=!!!$=$$$=$!!$$Z@$!$!!$$=$$$!=$$$$$$$$=$!$$=$$!$=]B$!$$$$$$$$$!$$$$!!$!$$=$!!!$$!$!!!!!$$!!$!$$!!!!!$!!!!!!!!!!!!$!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!! !@  ! !      Y_[  phK6i66ii66ii66ii66i66iii6666i6iii6ii666i66ii6i6i666666ii6666666iii6ii666iiii6666i6ii66ii6i6iiiiii6666E 6=7ii66i666i6i66iii6666ii66ii6i666i6ii6666666666i6ii6iii6iiii6ii66iiiii6666666ii66666ii66iii66iii66666666iiii6i66i666iii6ii666i6666i66666iiii666i6ii666i66ii6ii66666ii666i666i6=KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKJJKJJJJKJJJJJJJJJJJJJJJJJJHHHGGGFFFFFFJKKKKKKKKKKKK/22244424Q333QӨ<&&&&JKKKKKKKKKKKGFFFFFFGGGGGGHHHHHHHHJJHJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJv!!!!!!!!!!!!!$!!!!!!!!!!!!!!!!$$!!!$!!!==$!=$$$!!!!$$!=$!!$!$$!==$=$!$!$$!$$$$$$$$$$==$$$$$$$$=_B$$$!$$$=$$$==$!$$$$$$!$$=$$$$=Z=$$$=$!!$!!=$!$$!$!$$$$$$!$$$!$!!!!$$!!$$$$$!!!$!!!!!!!!!!!!!$!!!!$!!!!$$!!!!$!!!!!!!!!!!!!! !!!!!! !!!!!!!!! 9Y!   !      Y_[ohi66666666666i6ii66666i6i666iiiii66666ii6iiii6666666i666666i66i6i6ii666i66i6666i66i6666iii666666iii6"E 66!8i5666666iiii66i6ii66i666iiii6i6i6666i6i66iiiii6iii666i6iiiii6i6i6i66666i6666666iiiii66666666666ii66i66i6666i66i6666666i6i666i6666666iiiiiiii6ii66i66666iiiiiiii6ii66ii666=KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKJKKKKKJKKJJKJJJJJJJJJJJJJJJJJJJJJJJJHHHGGGFFFFFFJKKKKKKKKKKKK/2224O24QѾ333QϨ:&&&&JKKKKKKKKKKKGFFFFFFFGGGGGGHHGHHHHHHJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJv!!!!!!!!!!!!!$$!!!!!!!!!!!!!!!!!!$$$!$=$!$$!$$$$!!=$!!$=$!!$!$!$$!$!$=$$$!$$$$!!$$!!$$!!!$=$$!!!x=$$$$!=$!$$$$$==$$=!$==$$$=Z_==$$=$$$$$=$$==$!$!!!$$$$$$$$$$$!!$$!!!!!!!$$$$!!!!!!$!!!!!!$!!!!!$$!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !! !!!!9[Ƃ@ ! !!! !!! !   ! !!   Y_[ phi6666i66666i66i666666666666ii666iii66ii66ii6666666666i6666ii6i6i66ii666666666666iiiii66666666i66666ED(=!5 65(5i66iii66i6666i6666666666i666ii6i66666i66ii6i66i666ii6666i66666ii6666ii66ii6666ii666ii66i6666ii666666ii6666666i66ii6666ii6iiii666ii6666i666666i666iiiiii666iii666667KKKKKKKKKKKKKKKKKKKKKKJKKKKKJKKKKKKJKJJJJJJJKJJJJJJJJJJJJJJJJHHHHGGGGGFFFEJKKKKKKKKKKKK/2224424QѾ333Qޫ3&&&&JKKKKKKKKKKKGFFFFFFFGGGGGHHHHHHHHJJHHJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJp$!!$!!!!!$!!!!!!!!!!!!!$=!!!!!$$!!!$!$$!!!$!$!!!$!$$$$!$=$=$$=!$$!==$!$$=$===$$$=$=!!$=$=$$$===!=Z=$$=!!!=$!=$$$!$$$=$!$=@Z!$!$!=$$$$!=$$=!==$$=$!$!!$$$!!=$$$$$$$=$==$!!$!!$$!!$$$$=$$!!!!!!!!!$$!!!!!!!!$!!!!!!!$!! !!!!!!!!!!!!!!! !!!! !! ! !        Y_[ vh6666i6666666i666ii666iii6ii666i6i66i6i6ii6i6i6i66ii6666i6ii66ii6666666666iiiii6i6i66i6ii666iii66667DD  (6 i66i6i666i6i6ii66666ii666666666666i6i666ii66i6ii666ii666iii666i6  6i66666iiiiii66iii666666iiii6i6ii6ii6666i66ii666i6666666i6666i666666666i6i6ii66i66i666iiiii66$KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKJKJJJJJJJJJJJJJJJJJJJJJJJJHHHHGGGFFFFFFJKKKKKKKKKKKK/222424QѾ333Qӫ3&&&&JKKKKKKKKKKKGFFFFFFGGGGGGGGHHHGHHJHHJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJp$!!!!!!!!!!!!!!!!!$!$$!!$$!!!!!$$$!!$!$$!$$$!!$$!$=!$$!$!$$$$$$!=$!$$!$$$$!$$=$$$=$$$$$===$!=$$=$$9Z==$$$$$==!$=$$$$$$=BB$$$$=$!!$!$$$$==$$$!=$!=$$$$$$!$$$!$$$$$$$!!!!!$$$!!!$$$!$!!!$$!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !! !    !       Y[ph66666666666666ii66i66iiii6i66666i66ii6iii66666ii6i66666i6i66i6iiii66666i66i66666i6i66i6i6i66i6i6i6 &  && (556i66i6666666iii6i666i666i6666666666i66666ii666666i6i6i6ii6i65( 5666iiiiii6i6i6666666i6i666i666666iiiii6ii6i6i666ii6ii66666i66i666iiii6666i6i6666666iii6i666$KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKJKKKKJKJKJJJJJJJJJJJJJJJJJJJJJJHHGGGFFFFEJKKKKKKKKKKKK022244424Q233Qϭ<&&&&JKKKKKKKKKKKGEFFFFFFFGGGGHHHHHHHHJJHJHJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJp$!!!!!!!!$$!!!!!!$$$$!!!!!$$!!!$!$$!!!$$$$$$!!$$$$!$$$$!!!$$$$$=$!$$!=$$$!$$$$$$$$!==$===$$$$$$=$$=˃Z=$$$=$!===$$$@Z$$=$$=$$!==$$$$$=$$$!$$$$=$!$$=!$$!!$$$$!!!$!!$$$!!$!!$!!$!!!$$$!!!=!!!$!!!!!!!!!!!!$$!!!!!!!!!!!!!! !!!!!!!!!! !!!!! !!  !!      Y[ph666666i6i666666ii6666iii66i6666666i666666666ii6ii66i6i6666iiii6ii66i66ii666666666i666i6i66666i66i6  % 5566666i6i6iii6i666i666i6i66666i6666i666666666iii6i66i666i6   566i6666i6666i6666ii666ii6i666666iiii666666i6ii666ii66i66ii66i666i66i6i666666666i66ii66ii6i=KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKJKJKJKJKJJJKJJJJJJJJJJJJJJJJJJHHHGGGFFFFFFJKKKKKKKKKKKK/222ч4424Q333Q׫<&&&&JKKKKKKKKKKKGEFFFFFFGGGGGGHHHHHHJHJHJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJl!!!!!!!!!!$$$!!!!!$!!!$!!$!$$$$$!!$$!$!!!$$=!!$=====$!=$$$!$$!!!!!$=$$$$$!!!$$$!!!$===$$!!====$$$===Ƃx]ZZZZ_B==$$$$====$$$$$$!$$==$$==$=$$=$====$!=$!$$$$$!!$$!!$$!!$!$$!!!!$!!$$!!!!!!!$!!!!$!!!!!!!!!!!!!!$$!!$!! !!! !!!!!!!!!!!!  !  ! !   Y[!vh66iiii666666i66i66iii6666ii66i666666i6ii666i66666i6i6666i66i66666i66i6i666666ii6ii666iiiii66665 % % %(5666i66iii6i666ii666666666666666i6i66666666i66666i6iii66i6    666ii666666666ii666666i66iii6i66i6i6i666666666i66i6i6i66i666666iiii6iiiii666iii6iii666ii6$KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKJKJJJJJJJJJJJJJJJJJJJJJHHHGGGGFFFFFJKKKKKKKKKKKK/O2244424Q333QӦ<&&&&JKKKKKKKKKKKGFFFFFFGFGGGGGHHHHHHHJHJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJo$$!!!!!!!$!!!$!!!$$!!!$!!$$$$!$!!!!$!$$=$$!$=$!$$$!$$!$$==$==$$!$==$=$$$==========$!$$$$$====$$$$$$$=Z@===$===$!==$===$=$$!$=$$$$!$$$=$$!!$=!$$$!$$$$=$!$$$=$$$!!!!$$$!!$!!!!!!!!$!!!!$$!!!!!!!!!!!!!$!!!!!!!!!!!!!!! !!!!!!! ! ! !!   !   Y _[ ph6666i666iii666i66i6i666666666666ii666666666666i66ii6i66i6666i66666ii6i66666i6666666i66ii666i66(  & %& % 6666i6666ii6i666i66666i66666666666i6666i666666666i6i66666   5666666666i6666iii6i66666i666i666iii6666666i66666ii66666666ii666i6666i6i66666666666i66i66$KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKJJKJJJJJJJJJJJJJJJJJJJJHHHHGGGGFFFFFJKKKKKKKKKKKK/O224424Q333QΨ<&&&&JKKKKKKKKKKKGFFFFFFFFGGGGGHHHHHHHHJHJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJo$!!!!!!!$$!$!!$$!!$$$$!$$$!$$!$$$!==$!$=$!$$$$$$$$$!=$$=$$$$$$=$=$!===$$$==$$$===$$$$$$$==$=$$$=$=$$$==B]$==$$==$$$!$$==$$=$$=$$$$$$!$=$!=$!$$$$!$$$$!$$=$$!!$=$$$$$!!!$$$$!$$$$!!$!!!!!$$!!$!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!! ! ! !! !!! ! !   ! Y_[ ph6666666i6666666ii66ii6i66666666666ii66i666666i66666i666666i6666666666i666ii6iiii666i66666866i % &% % (5i6666666i666666666666i6666666i66i666666i666666i6i6i666   56666i66666i666i66666666666ii66666666666666666666i66666666ii66i666ii6i6666666666666i6i666=KKKKKKKKKKKKKKKKKKKKKKKKKKJKKJKJJJJJJKJJJJJJJJJJJJJJJJJHHGGGFFFFFFJKKKKKKKKKKKK/OO24424Q333Qͧ<&&&&JKKKKKKKKKKKGFFFFFFGGGGGGHHHHHHHJHHJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJo!!!$$$$$!!$$$!!$$$$$$!!!!!$$!$$$$=$=!$$!!!$$$=$=$$!=$$$$$==$!$==$!=$=$!$!$$$$$===$$=========$$=$=$$$==$=]z=$$$!$$==!$=$$$=$!$$$$$==$==$$==$!=!!=$!!!$===$$$$$$!!!$=$!$!$!!$$$!!$=$$$!!!$$!!$!!!!!!!!$$!!!!!!!!!!!!!!!!!! !!!!!!!!!!! !!!!!!!!!!!!  !!! !! !  !Y[Y oh66666i6i666666666666i6i666666666666666666666666666iiii6i666ii666666i66666666666666i6666655 % & % (5i66i6i6666i66i666i66666666i6i66666i6666i66i666666i665     65 6i66i66666i6666i66666iii6i66666ii6iii666i6ii6666666666666666i6ii666666666ii6i666i66=KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKJKJJJJJJJJJJJJJJJJJJJJJJJHGGGGGFFFFFJKKKKKKKKKKKK/O22424Q233Q<&&&&JKKKKKKKKKKKGFFFFFFFGGGGGGHHHHHHHHHJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJo!!!!!!!!!!!!$!!!!!$!!!$$$$$!!!$$$!!$======$$$$$!$==$=$!$=$$$$$==$=$$=$=====$===$$$!!$==$$==$==$$!=========AB===$$$=$====>==$=$$$==$$==$==$!$$$!$$$=$$$==$!!$$!$$$$$$=$!$=!$$!!!$!!!!!!!!$$$!$$$$!!!$$!!!!$!$!$!!!!!$!!!!!!!!!!!!!!!!!!!!!!! ! !   !  !   ;YYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYY@YB  @YYYYYYYYYYYYYYYYY;  @YYYYYYYYYYYYYYYYYY#       phi6666666666ii66i6666666i6666666666i666i6i66ii66666ii6666666666666666666666666iii666i666i667 & % %(5i6666666i6i6i66i6666666666666i6666666i66i66666666665   66666i666666i66i666i6666666i6iii666i666i6666i666i6i666666666i66ii66666i666666666i66=KKKKKKKKKKKKKKKKKKKKKKKKKKKKJKKKKKKJKJJJJJJJJJJJJJJJJJJHHHGGGGFFFFFJKKKKKKKKKKKK/OO24424Q333Q:&&&&JKKKKKKKKKKKGFFFFFFFGGGGGGHHHHHHHJJHJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJo$$$!!$$!!$=!!!!$$!=$$=$$!!$$$$!$$!$$$!!$$$$=$$$$$$$$$$$$!$==$$$$$======$$======$$===$=$===$$====$===$$$==$$=@σB$$=====$=$$$$$$$$==$$$===$$===$$$$$$$=$!$$$=$$$$=$$$$$$=$$$!$$=!!$=!$$!$$!$$!!!$$$!!!!!!!!$$!!$!!!!!$!!!$!!!!!!!!!!!!!$!!! !!!!!!!!!! !!!! ! !!! !!  !  !      ph66666i666i6i6666i66i6i66666666666666666666i666i66i66666i6i66i66ii6i6666666i6666666666666i66(%% & % & 6666666666666666i66666666666666666666i66666i6ii66666   (566666666666666666666666666666666666iiii66ii6666ii6666666ii66i6666i6666iii66666i6666$KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKJJKKKJJJJJJJJJJJJJJJJJJJHHHHGGGGFFFFFJKKKKKKKKKKKK/OO2424Q333Q3&&&&JKKKKKKKKKKKGFFFFFFFGGGGGGHHHHGHHJHHJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJl=$!$$$$!!!$!!$$$$!=$$$$$$!$$$=!$$!$$$!$$!$==$==$!$=$$$$$!!=$$$$====$$=$$$=$==$======$==============$===$=$$=$==ZZ===$=$$=====$==$$$$===$=$$$=$$===!$====$=$$$$$=$$$=$$$$=$$$$$$$$$$$$!$!$$$!$$!$$!$$!$$$!!$$$!$$!!$$!!!!!!!!!!!$!!!$!!!!!$!!!!!!!!!!! !! !!!!!! !! !   !!       oh66i6ii6666ii66i666ii6i6666666666i6iii6666666i666i666666666iiiii6i6i666666666666666i666665((% %& % %& % %(5666i6iii66i6666666i66ii666666666666666666666666i655  6656i6666i6666666666ii66666i6666i6666i6i6666i66666666666666666666666666666666666i6i6$KKKKKKKKKKKKKKKKKKKKKKKKKKKJKKKKKKKJJJJJKJJJKJJJJJJJJJJJJHHGGGGFFFFFJKKKKKKKKKKKK/OOO4O4Q333Q:&&&&JKKKKKKKKKKKGFFFFFFGFGGGGHHGHHHHHJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJo=!!!$!$!=$!!!$$!!$!$$$$$$!!!!=$$=!$==$=$$$$$$=====$!$$$======$$$$$=$$$$===$$$===$!$===$$$$==$=====$===$===========Z]ȅ_B>===$$====$$===============$!=$==$$$$===>=$$$=$$=$!$=$$$!!$!$$$$$!!$=$$$$$!=$$$$!=$!$!!!!$=!!!$!!!$$$!!$$$!!!!$!!!$$!!!!!!!!!!!! !!!!!!!!!!! !!! !    !!!   !         ph666i66i66666i66666i666666666666666i66666i6i6i66666666iii6666666666666iii6i666666ii6666666(%&% % %% % % % %66666i6666ii6666666i66666666666666i6666666666666 (  666ii6666i66666666666666666i666666ii666666666666666666666666i66i66666666666666666=KKKKKKKKKKKKKKKKKKKKKKKKKKKKKJKKJKJKJJJJJJJJJJJJJJJJJJJHJHGGGGFFFFFJKKKKKKKKKKKK/OOO44O4Qэ333Q:&&&&JKKKKKKKKKKKGFFFFFFFGGGGGGGHGHHHHHHJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJo$$!!$$!$$!$$!=$$$$=$!$$$$==$$$=$!$$=!$$=$$$!$$$$!$==$!$$$$===$==$!$$====$$==$$=====$====$$========$======$$=$============9===>$$=======$===$====$$$!===$$=$=====$$=$=>=$=$=$$==$$$$$$=$$=$=$==$$$===$!$!$$!$=$!$!!$$!!$=$$!!!$$!$$$$$!!!!!!!!$$!!!!!!!!!!!!!!!!!!$!!!!!!!!$!!!! !!!!! ! !!!! !             phi66i66666666666i666i6666666666666666i6666i666666666i66666i666666666666666666i6666666i6666% % % % %% % % %(566666666666666666666666666i6i666666666i666666666   66666666666666666666ii666666666666666666666666666666666ii6666i6666666666666666666=KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKJJKJJJJJJJJJJJJJJJJJHHGGGGFFFFFJKKKKKKKKKKKK/OO224Q333Q<&&&&JKKKKKKKKKKKGFFFFFFGFGGGGHHHHHHHJHJHJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJp$$$!!$$!$$$$$$$$$$$$$$$$$!$===!!$=$$=$$$=$=$!=$$$$$$$=$===$=$$$=$=$=====$====$=======$======$======$==$=====$$===$====$======$===================$======$=$$======$=$$$=$$$=====$$=$=$==$==$$===$$$$=$=$$$$$$$$!$$$$$$=$!$$!$!$$$$!!!!!!!!$$!$!!!!!!!$!!!!!!$$!!!!!!!!!!!!!!!!!!!!!! !!!!!! !!!          ph666i6i6666666666666666666666666666666666666666666i666666666666666666666666666i66666666666%% %% && & % % % % % %666666666i6666i6666666i6666i666666666i66666666665(  (%6666i66i6666666666i66666i666666i66666666666666666666i66666666i6666666666666666666$KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKJKKKJJJJJJJJJJJJJJJJHJHGGGGFFFFFJKKKKKKKKKKKK/OOO4O4Q333Q<&&&&JKKKKKKKKKKKGFFFFFFFFGGGGGHHHHHHHHHHJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJv$$$!!$$$$!$$!!!$!!$$$=$$$$=$$$$$$$!$=$==$$==$$=$==$$$===========$======$$===============$=====$$===$==$=====$$===============$====$==============$==================$$!======$=$$==$=$===$===$$==$$$$$$$$$$$==$$$$$==$$$$$$!$!$$$$!!!$!!!$$$$!!!!$!!!!$!!!!!!!$!!!!!!!!!!!!!!!!!!!!!!!!! !!!  ! !! !   !!    ph666666i66666666i66666666i6666666666666666666666666666666666i6666i66666666666666666666666%%%%% % %%%%% %% % %%% % &%6666666i6666666666666666666666666666666666666666(  (66666666666666666666i6i666i666666i66666666666666i66666666666666666i66666666666666=KKKKKKKKKKKKKKKKKKKKKKKKKKKKJKJJJJJJJKJJJJJJJJJJJJJJHHGGGFFFFFJKKKKKKKKKKKK/OOO424Q233Q<&&&&JKKKKKKKKKKKGFFFFFFGGGGGGGHHHHHHHJJHJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJq$!!==$!$$=$!$==$!$!!=$!$$$!!!$$=$$$=>$!=$===$=======!==$$==$$======$$$==$$==$=======$=>=$=$==========$$$=$=====>===============$============$$===$=====$==========$=====$$==$!=$$$==$$=$$$=$=$=====$$$====!$=$==$!$$$$$!$$$=$$$!!$$$$=$$=$!$$!!!$!!!!$!$!!!! !!!!!!!!$!!!!!!!!!!!!!!!! ! ! ! !!  !!  ! ! !            vh666666666666666666666666666666666666666666666666666666666666666666666666666i666i66666668(% % %% %%%% % % % %% %%&%(566i6i66666666666666i66666666i66666666666666666665( 66666666666666666666666666666666666666666666666666666666666666666666i66666666666666$KKKKKKKKKKKKKKKKKKKKKKKKKKKKKJKKKKJJJJJJJJJJJJJJJJJJJHGGGGFFFFFFJKKKKKKKKKKKK/OOO424Qэ333Q:&&&&JKKKKKKKKKKKGFFFFFFFGGGGGGHHHHHHHHHJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJo=$!$!!!$!$$!$$$$$$$$$$!$$$=$$====$$$===$!==$!=$$=$$=$====$=========$=======$==$$==$$=================$========$===$===$====$=>=======$====$$$$$=>=========$==$=$$$=====$$$==$$>>=$=$$===$$$$=$=$$======$$$=$$$$$$!!!!$$!$=!$$$=$$$$$!!!$$!!$$!$$$!$$$$$!!$!!!!!!!$$!!!!!!!!!!!!!!!! ! !!!!!!!!!!!  !!  !                vh6666666666i6666i6666666666666666666666666666666666666i6666666666666666666666666666666666(%% % %% %%%%% %% %% % % %%%%%(66666666666666666666666i6666666666666666i6666666666% 556666666666666666666666666i6666666666666666666666666666666666666666666666666i66666$KKKKKKKKKKKKKKKKKKKKKKJKKKKKKJKJJJJJJJJJJJJJJJJJHJHGGGGFFFFFJKKKKKKKKKKKK/OOO4O4QѾ333Q:&&&&JKKKKKKKKKKKGFFFFFFFGGGGGHHHHHHHHJJHHJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJo=$!$$$$!!$=$$!$$$$!$==!$$$=$$===$$$$====$=$$==$$====$==$$====$=====$==$===================>=$==========>===$=======>==============================$==$=====$==============$===============$$=$====$==$$=$$=$$$$!==$$$$$$$$$$$$!$=$!$$$$!!!!$$!$$!!!$$!!!!$$!!!!!$!!!!!!!$!!!!!!!!!!!! !! !!!!! !  ! !  !    !    ph666666666i666666666i6666666666666666666666666666i666666666666666666666666666666666666666(%% %%%%%%% %%%%%%%%%%% % %%%(66666666666666666666666666666i6666i6666666666666665(% % 66666666666666666666666666666666666666666666666666666666666666666666666666666666$KKKKKKKKKKKKKKKKKKKJKKKKKKJJKKJJKJJJJJJJJJJJJJJJHJHGGGFGFFFFJKKKKKKKKKKKK/OOO424Q333Q:&&&&JKKKKKKKKKKKGFFFFFFFGGGGGGGHGHHHHHJHJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJp=$$$$=$!!$$=$!$==$$=$$$$===$!$=$$$$$$==========$===$====$$===$$==$$$$=================$$===============>=========$===================>============$==$==========$=============$====$$========$$$$=$!$$===$$===$$===$=$$$=$!!$$!$=$!$$!$=$$!!$$!!$!!!!$$$$!$!!$$$$!!!!!!!!!$!!!!!!!!!!!! ! !!!!! ! !           oh66666666666666i666666666666666666666666666666666666666666i666666666666666666666666666665(%%%%%%% % %%%% %%&%& %%%%%%%%% (566666666666666666666666666666666666666666666666665( (56666666666666666666666666666666666666666666666666666666666666666666666666666666$KKKKKKKKKKKKKKKKKKKKKKKKKKKKKJJKKJJJJJKJJJJJJJJJJJHGGGGFFFFFJKKKKKKKKKKKK/OOO24Q333QΨ<&&&&JKKKKKKKKKKKGFFFFFFGFGGGGHHHHHHHHHJHJHJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJp$$$=$!$==$!===$$$!$$$==$!!$!$$$$====$=$$$===!$$====$=======$$$$=====>==>>>=======$========$$=========$$============================>===$=========>==>======>=>=====$==$=$$======$==$!$$==$$$=!$==>=$$=======$$==$$=$$$=$$===$!$=$$!!!$$!!$$!!$$!$!=!$!!$!!!!!$$!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!! !!!!!!!  !   ! !          ph666666666666666666666666666666666666666666666666666666666666666i666666666666666666666665(((%%%%%%%%%%% %%%%%%% % %% %(((566666666666666666666666666666666666666666666666666% (66666666666666666666666666666666666666666666666666666666666666666666666666666666$KKKKKKKKKKKKKKKKKKKKKKKKKKKKKJJKKJKJJJJJJJJJJJJJJJJHHGGGFFFFFFJKKKKKKKKKKKK/OOO24Q333Qͭ<&&&&JKKKKKKKKKKKGFFFFFFFGGGGGGHGGHJHHHJHHJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJp$!$$$$==$$$$$=$!$$==$$==$==$====$$===>==$=$=================>>>============================>=========>>====>====>>=>==========>=========================$=====>=$==========$=$$========$$$==>===$==$==$$!=$$=$$$!$=$$$$$$==$$$$!!$$$=$!!$=$!!$!!$!!!$!!$!$!$!!!$!!!!!!!!! !!!! !!!!!!! ! !!!! !! !! ! !!  ! ! !          ph66666666666i66666666666666666666666666666666666666666666666666666666666666i666666666666655%%%&%%%%%% % % %%% %%% %%%%(55666666666666666666666i666i66666666666666666666666666(% (66666666666666666666666666666666666666666i66666666666666666666666666666666666666$KKKKKKKKKKKKKKKKKKKKKKKJKKKJJJJJJKJJJJJJJJJJJJHHGGGGFFFFFJKKKKKKKKKKKK/OOO4O4Q333Q׫<&&&&JKKKKKKKKKKKGFFFFFFFFGGGGGHHHHHJHHJHJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJo=$$!$$$=$$$$!$$$$$==$$$==$==$$$=======$=>=$====$===========>===$===========$=============$=>==========>==========================================================================$=$$===$=======$$=====$$=$!$$$=$$=$$=$!$==$$$$$$!$$==$!$$$!!$!!$$!$$!!!!$!!$!!$$!!!!!$!!$!!!!!!!!!$!!!!!!!!!!!!!! ! ! !! !   !     ph6666666666666666666666666666666666666666666666666666666666666666666666666666666666666666((%%%%%%%%%%%%%%%%%%%%%% %%%%666666i666666666666666666666666666666666666666666666665 (6666666666666666666666666666666666666666666666666666666666666666666666666666666$KKKKKKKKKKKKKKKKKKKKKKKKKKKKKJJJJKJJJJJJJJJJJJJHJHGGGGFFFFFJKKKKKKKKKKKK/OOO4O4QѾ334Qި<&&&&JKKKKKKKKKKKGFFFFFFFFGGGGGHHHHHHHHJHJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJp$!$$=$$!!$=======$$=$=$=$$=$$!$=$=$$=$====$=======$===================================>>>===============================>=>===========>=========>==>=======================================$$$==$$$$======$$=====$$$$=$$$!$=$$=$$$=$$$$!$$!==$!$=$=$!!!!!$!!$$!!!!!$!!$!$$$!!!!!!!!$$!!!!!!!!!!!!!!!!! !! !!!!!!! !!!!     ph6666666666666666666666i66666666666666666666666666666666666666666666666666666666666666665(%%%%%%%%%%&%%%%%%%%%&%%%%%%%666666666666666666666666666i6666666666666666666666665665( % 5666666666666666666666666666666666666666666666666666666666666666666666666666666$KKKKKKKKKKKKKKKKKKKKKKJKJKKJJJJJJJJJJJJJJJJJJHHGGGGFFFFFJKKKKKKKKKKKK2OOOOQ343Qϭ<&&&&JKKKKKKKKKKKGEFFFFFGGGGGGHHHHHHHHJJHJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJv=$!!$===$$$=$$=$$$$$$$=$$========>===$==$=============$=========>================>============>==>>>======>===$===>==========>======================$===============>=====$======>====$==$=========$=========$$$$$$$=$====$$!$=$$$$$$!!$$$$$!$$$$!$$$$!$$$!!!!!$$!!$!$!!!!!!!!$!!!!!!!!!!!!!!!  !!!!!! !! !!!          !vh6666666i66666666666666666666666666666666666666666666666666666666666666666666666666666666%%%%%%%%%%%%%%%%%%%%%%%%%%%%56666666666666666666666666666666666666666666i6666666666% % % %5666666666666666666666666666666666666666666666666666666666666i66666666666666666=KKKKKKKKKKKKKKKKKKKKKKKKKKKJJJJKKKJJJJJJJJJJJJJJJHGGGFFFFFFJKKKKKKKKKKKK2OOOO4Q343Qװ<&&&&JKKKKKKKKKKKGFFFFFFFGGGGGGHHGHHHHHHJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJp===$=$$=$$$==$==$$==$$==$$==========$========$============$==============>===>=============>===>===>===>===>==$===>==>=============================>=====>===================================$=$======$==$$$==$$===$$====$$$=$$==$=$$=$$$$$$!$$$$$$!$$$$$!$!!!$!!!!!!!!!!!!!!!$!!!!!!!!!!!!!!!!!! !! !!!! ! !!!      ph66666666666666666666666666666666666666666666666666666666666666666666666666666666666666666(%(%%%%%%%%%%%%%%%%%%%%%%%%%%(5666666666666666666666666666666666666666666666666666666% % % %5666666666666666666666666666666666666666666666666666666666666666666666666666666$KKKKKKKKKKKKKKKKKKKKKKKKKKJJJJJJJJKJJJJJJJJJHHGGGGFFFFFJKKKKKKKKKKKK/OOOOQ443Qϭ<&&&&JKKKKKKKKKKKGFFFFFFFGGGGGHHHHHHHHJJHHJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJp==$=$=$$$====$$======$=====$$============$==$===$========================>==================>======>====>============>===>>=============>===========================$=>=================$>===========$$$===$========$==$$$===$$=======$==$$!!$$$!$$!$$$$$!!!!$=$!!!!!!!$!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!! !!! !! !!! !    ph66666666666666666666666666666666666666666666666666666666666666666666666666666666666666666((%%%%%%%%&%%%%%%%%%%%%%%%%(6666666666666666666666666666666666666666666666666666666 % % % 666666666666666666666666666666666666666666666666666666666666666666666666666666$KKKKKKKKKKKKKKKKKKKKKKKKKKKKKJKJJJJJJJJJJJJJJJHGGGGFFFFFJKKKKKKKKKKKK2OOOOQ443Qѭ:&&&&JKKKKKKKKKKKGFFFFFFFGGGGGGGHHHGHHJHHJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJv$$$$!$$!$$$$$==$===========$$===$$======$$=======>=========================>==>>>====>>============>====>==>=>>=>====>=>======>>=====>=>==?>====>=======>====>==============>>===$======$=>======$===========$$=========$=$$$$$=$$$===!$$$$$$$$$==$$!$$!$!!$!$==$!!!!$$!$!!!!!!!!!$$!!!!!!!!!!!!! !!!!! ! !!!!  !! !!  ! !      ph666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666('%%%%%%%%%'%&%%%%%%%%%%%%(56666666666666666666666666666666666666666666666666666666%%%%% % %5666666666666666666666666666666666666666666666666666666666666666666666666666666$KKKKKKKKKKKKKKKKKKKKKJKKJKJKKJKJJJJJJJJJJJJJHGGGGFFFFFJKKKKKKKKKKKK2OOOOQ343Qװ3&&&&JKKKKKKKKKKKGFFFFFFGFGGGGHHHHHHHHJJHJHJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJp=$$=======$=$$=======$=$=======$$$================>======================>>==>>======>==>=======>=======>>====$==>==========>==>>==>>=======>===>==>=>==>==>======================>==$=============================$$$!$===$$$==$!$====$$$===$$$$!$=!!!$$$$$$!!!$$!$$$$!!!!$!!$!!!!!!!!$$!!!!!!!!!!! !! !!!!  !!  ! !    vh666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666(%%%%%%%%%%%%%%%%%%%%%%%%(566666666666666666666666666666666666666666666666666666666%%%%%% % 566666666i666666666666666666666666666666666666i666666666666666666666666666666666=KKKKKKKKKKKKKKKKKKKKKKKKKKKKJKJJJJJJJJJJJJJJJJHHGGGFFFFEJKKKKKKKKKKKK2OOOOQ444Qϭ:&&&&JKKKKKKKKKKKGFFFFFFFGGGGGGHHHHHHJHJHJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJp=$$=======$=====$================$==============$======>===>>=>==================>==============>==>=====>>======>======>==>====>==>>=====>>>======>===============>=======================================>===$====$$==$$====$=$$=$$$=$$=$$$$=$$!$$!$$=$$!$=$!$!!!=$$!!$!!!!!$!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!! ! !! !!! !   ph6666666666666666666666666666666666666666666666666666666666666666666666666666666666666666665(%%'%%%%%%%%%%%%%%%%%%%%(666666666666666666666666666666666666666666666666666666666% % % %% % %% %% % (66666666666666666666666666666666666666666666666666666666666666666666666666666666$KKKKKKKKKKKKKKKKKKKKKKKKKJJJJJJJKJJJJJJJJJHHHGGGGFFFFJKKKKKKKKKKKK/OOOOQ444Q԰<&&&&JKKKKKKKKKKKGFFFFFFFFGGGGGHHHHHHHJHJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJp=======$$=====$$$$==========$=======>$=========$===========?>====================>======>===>==>>=>====>====>>>>===>>>=====>>>===>=>>=>A====>=========>>>======>==>>=====A>===========>>======================$$$=============$$$=$=$$$=$$$$$$=$!$$$$$$=$$$$$$$!!!!$!!$$$!!!!!$!$!!!!$$!!!!!!$!!!!!!!!!!!!!! !!  !! ! !!!        ph666666666666666666666666666666666666666666656666666666666666666666666666666666666666666666655(('%''%%%%%%%%%%%(555666666666666666666666666666666666666666666666666666666666%%%%% %% % % % %% % %((6666666666666666666666666666666666666666666666666666666666666666666666666666666$KKKKKKKKKKKKKKKKKKKJKKKKKJJKJJJJJJJJJJJJJJJJHGGGFFFFFFJKKKKKKKKKKKK2OOOOQ444Qٰ<&&&&JKKKKKKKKKKKGFFFFFFFFGGGGGHHHHHHHHJHJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJv=$$=$$==$$=============$========>===========>===>>>=====>>========>>>==>>>===========>>>==>>==========>===?>===>>========>===>===>==>>===>>====>>===>>===>=>===>===========>==A=====================================$$==$$==$$$$$==$$$=$!$===!$$==$$$!==$!$$!!=$$!!!$!!$$$$$!!!!!!!!$!!!!!!!!!!!!!!!!!!!!!!!!!!! !!! !     !      ph666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666655(%%%((%'%%%%%(566666666666666666666666666666666666665666666666666666666666i65(%% %% % % % % %% %(5(5666666666666666666666666666666666666666666666666666666666666665666666666666666$KKKKKKKKKKKKKKKKKKKKKKKKKKKJJJJKJJJJJJJJJJJJHGGGGFFFFFJKKKKKKKKKKKK24OOOQ444Qۭ<&&&&JKKKKKKKKKKKGFFFFFFGGGGGGHHHHHHHJHHJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJp====$$=$=====$==$$===============$====================================>>>==>>=>===>==>====>====>>>==>==>=>>>=====>==>>===>===>===>===A>>=>=======>===>==================>=========>==>===========>==============$==========$=========$=$=$$$$$$$$$$=$=$$!$$$$$$!$$$!$$!!!!!$$!$$!!!!!!!!!!$!!$!!!!!!!!!!!!!!!! !!!!! !! !!! !  ! vh66666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666655%(55(%%%%%(5666666666666666666666666666666666666656666656666666666666666666665(% % %%% % %% % %%%%(6656666666666666666i8i666666666666666666666666666666666666666666666666666666666666$KKKKKKKKKKKKKKKKKKKKKKKKKJKJJJJJJJJJJJJJJJJJJJHGGGFFFFFFJKKKKKKKKKKKK2O4OOQ444Q԰<&+&+JKKKKKKKKKKKGFFFFFFFGGGGGGHHHHHHHHHJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJv=====$=========================================================>======>>===>====>>>==A=====>>==>=======>==>>=====>>>>A=>>====>====>>==>==>>=====>>>>====>==>===>=========>=>>=====>>>======>===================================$=====$$==$$$$=$$$$==$$$$!$$=$=$$$$$$!!!$>ZZZZZ]ZZ[ZZZZ[ZZZ[ZZZZZZZZZZZYYZZYYZZYYYZYYZYYYYYYZZYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYY@YYYYYYY@YYY@YB@@Y@@@@YYB@@YB@Y@@Y@Y@YYY@@@Y@@@YY@@YY@@@Y@@Y@@@Y@BY@B@@YYYY@@@Y@YY@Y@;#! vh666666666666666666666566665666666666666666666666666666666666666666666666666666666666666666666666655665((88666666666666666666666666666666666666666666666666666666666666666665(%%% %%% %% %% % % % (6666666666666666666666666666666666666666666666666666666666666666666666666666666666$KKKKKKKKKKKKKKKKKKKKKKKJKJJJJKJJJJJJJJJJJJHHGGGGFFFFJKKKKKKKKKKKK244OOQ444Qٰ<&&&&JKKKKKKKKKKKGFFFFFFFGGGGGGHHHHHHHJJHJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJp=$====$===$==$====$======>===========>========>====>===========>=====>=====>>===>====>>====>?>======>>>>===>A>==>=>=>A>A>=>>>=>>>==>========>>====>>==>>>?>>=======>=>=>===================>>=>=======>=======================$===$=$==$====$!$==$==$!=$!$$=!$$=$!=$$!!$Á@  ph66666666i6666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666655666666666666666656666666666666666666666666666666666666666666666666666(%% %%%%%% % %% %% %%%% 55666666666666666666666666666666666666666666666666666666666666666666666666666666666$KKKKKKKKKKKKKKKKKKKKKKKKKKKKKJJJJJJJJJJJJJHHGGGFFFFFFJKKKKKKKKKKKK244OOQэ444Qް<&&&&JKKKKKKKKKKKGFFFFFFFGGGGGGHHHHGHHJHHJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJp==========$==>=======================A=======>==?==>=>=>=================>=>=>====>>=>>>>=====>>==>=>====>=>>?>>?=======>=>===>>==>=>>?>==>A>>>>>>=>>======AA?>>>>=>===>===>==>====>==>>========>=======================$$=$==$===$=>==$!==$=$==$$$$==$$$!$$!$=$!$$$==$=΅@ ph6666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666i66666666666666666666666666666666666666666666666666666666666666666666(% %% % %%%% % % %%%66666666666666666666666666666666666666666666666666666666666666666666666666666666666$KKKKKKKKKKKKKKKKKKKKKKKKKKKKJJJJKJJJJJJJJJJJHHGGGFFFFFJKKKKKKKKKKKK2444OQѾ444Q԰3&&&&JKKKKKKKKKKKGEFFFFFFGGGGGHHGHHHHHJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJp=$$=========================>===============>===>======>===>>==>===>>>>=====>==>>=>====>>====A>>>>>=>>>==>=>>>=>=>>>>>====A=>>>==>=>>>>>>==>>?>==>>=>>>=>==>=====>A>======>>==>=>>=>>===>====>====================================$==$=$$==$$==$$=$$===$$=$$$$$$$$$$$$$=Y  ph6666666666666666666666666666666666666666666666666665666666655666666666666666666666666666666666666666666666666666666666656666666666666666666666666666686666666666666666666666666666% %%%%%%% %%%% % %%%%%55666666665666666666666666686666666666666666666666666666666666666666666666566666666$KKKKKKKKKKKKKKKKKKKKJKKKKKJJKJJJJJJJJJJJJHJHHGGFFFFFFJKKKKKKKKKKKK24OOeOQѾ444QӰ2&&&&JKKKKKKKKKKKGEFFFFFFGGGGGGGHGHHHHHHJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJv===================>====================>===>===>==>========>>>A==>>=>A>==>>>>>>>>>=====>>>=>>>=?>=>>A?>=A>A>>>A>A>>AA>>A>A>AAA>>A>>>A>AAA>>A>A>>AA>>>A>C>>>A>=>A>AA?A>>>AA>>>A>>C>>>>>>>>A>>A>==>>====>==>>=>==>>=>=====>>=>==>=======>====================9==$===99$$9@   ph6666666666666666666666666566666666666666666666666676666656666666666666666666666666666666666666666666666666666666666666666666666666666666666666666665666666666666666666666666666666 % %%%%% %%% %% %%%%%(6666666666666666666686666666666666666666666666666666666666666666666666666666666666$KKKKKKKKKKKKKKKKKKKJKJKJJKJJJJJJJJJJJJJHGGGGFFFFFJKKKKKKKKKKKK2444OQe444Q3&&&&JKKKKKKKKKKKGFFFFFFGFGGGGHHHHHHHJHJHJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJv=====$=========$======>>>>>=========>>=>?>>========>>>>=>>>>====>====>>>>=====>>>=>=>>===>=>>=?tx[   oh6666666666656666666666666666666666666666666666666666666666666866666666666666666666666666666666666686666666666666666666666666666666666666656666666666666656666666666666666666666655(%%%%%%%% %%% %%%% %% 566666666666656666666666666666666666666666666666666666666666666666666666666666666666KKKKKKKKKKKKKKKKKKKKKKKKKKJKJJJJJJJJJJJJJJJHHGGGFFFFFFJKKKKKKKKKKKK2444OQe444Q˭Ğ:&&&&JKKKKKKKKKKKGFFFFFFFFGGGGGHHHHHHHHHHJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJp=====$============$=========>==================>>>=====>>=>===>==>>==>>=>=>>===>>>>>>>>>==>Ct_ZZZZZZZ]ZZ]ZZ]ZZZZZZZZZZYYZZYYZZYYYYZZYYYYYZYYYZYYYBBYBYYYYBYBYYBYBBYBYBYBB@@YB@B@@Y@YBB@@@BB@@B@@@@@@@@@@@@@@@@@B@@@@@@@@@@@@@@@@@@BB@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@Y[_   ph66666556666666666666666666666666666666666666666666666656666666666666666666665666666666666666666666666665666666666666656666666666666666666666566666666666666666666666566666666666(%%%%%%%% %%%%%%%% % %5666666566666666666666666666666666666666666666666666666666666666566666666666666666666$KKKKKKKKKKKKKKKKKKKKKKKKKKJKJJJJJJJJJJJJJJJHHGGGFFFFFJKKKKKKKKKKKK2O44eOQe4444šhhg3&+&&JKKKKKKKKKKKGFFFFFFGGGGGGGHHHHHHHJJHJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJo======$======================>===>=======>===>>>>======>====>=>>>>>==>A>==A>==>=>C>>>>===CxB$!$$$$$$!!!!!$$!$!!$!!!$!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ! !!         #Y  ph666666666666666666666668666666666566666666666656666666566666666666666666666666666666666666666666666666666666666666666666666666566566666666656666666566666666666666666666666665665(5(%%%%%%%%%% % %%% %%(5666666666666566666666666666666666656666666666666666666666666666666666666666666666666$KKKKKKKKKKKKKKKJKKJKKJKJKJKJJKJJJJJJJJJJJJHGGGFFFFFFJKKKKKKKKKKKK244O222222222222222222222222222222222eQO4eeeeeeeeeeeeeeeeeeeaeeeeQ444*+0++++++++++-+++++++++++++++++++++&&+JKKKKKKKKKKKGFFFFFFGGGGGGGHHHHHHHHHJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJp==============================>=====>==>=>==>>>==>>===>====>>==?>=>>=>?>=>>>>>>>>>>>>>==t@=!$=$=$!$$!!!!$!!!!!!!$$$!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!   !      Y_ ph666666666666666666666666666666666666666666666666566666666666666666666656666666656666666666566666666665666666656666666666666666666566666666666666666666666666666566566686566666666665(%%% %% %% %%% %6666666666666666666666666666566666656666666666666666666666666666666666666666666666666$KKKKKKKKKKKKKKKKKKKKKJJJJJKJJJJJJJJJJJHHGGGFFFFFJKKKKKKKKKKKK244444O4OOOOOOOOOOOOOO222222222222222O44444444444444444444*++++++++&+++++++++++++&&++&&+&+&&&+&&JKKKKKKKKKKKGFFFFFFFGGGGGHHHHHHHHJJHHJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJp=$==============>>==>=>==============>>==>===>===AAA>=>=>>=====>=>>>A=>>>=====>>===>?AA]ZZZZZZZYZZZZBBBBYZYBYZZBZZBYBBZYZZBZYBBYYYBBBYBYBBBBBBBBBBBBYYBBBBBB@BB@BB@BBB@B@@B@@@@@@@@@@@;@@@@@@@@@@@@@@@;@@;@@@@;;;@@@;@@;@@@;;@@@@@@@;@;;@@;;@;@@@;;@@;@;;;;9#  [Y ph65665666666665666666666666666656666666666566666665666666666666666666666666666666666666666666656666666666666656666666666666666666666668666666666666666666666566666666666666666666666655((%%%(% %%%%%%56666666566666666686666566666666566666666666666666666666666666666666666666666666666666666$KKKKKKKKKKKKKKKKKKKKKKKKJKKJKJJJJJJJJJJJJJHGGGFFFFFFJKKKKKKKKKKKK24444444OOOOOOOOOOOOOOO22O22222222222O44444444444444444*+++++++++++++&++++++++++++++&&+&&&++&JKKKKKKKKKKKGFFFFFFFGGGGGGGHGHHHHHJHJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJp======================>===>>===>===>=>=>=>>=>>==>=>>=>>=?>=A?>>A=>>>>==>>=??>==>>>=>=CƝŝŝśŝŝŝśŝśśŝŝśśśśŖśŖśŖśŖŖśŖŖŖŖȄ[#  @# ph6666666666666665666866666666665666666666666666666666666666665666666666668666666666666666666666666666666666666666666566666665666666666666566666655666666666666666666665666666666666666655(%7%%%%%%666666566666666665666666666666666666666665666666666666665566666666666666666666666666656656$KKKKKKKKKKKKKKKKKKKKKKKKJJJJKJJJJJJJJJJJHHGGGFFFFFJKKKKKKKKKKKK/O22O222222222222222O2O22222222222222eeeeO4444444444444*+++++++++++++++++++++++++++++++++++++JKKKKKKKKKKKGFFFFFFFFGGGGHHGHHHHHHJHJHJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJ|===============>======>===>===>>===>=>=>==>=?===>===>>>>>>>?>>>>>>>>>=>>>=?>>>>>>>>>CޛxCCACAA=>AC>?A>AACA=>?C>AA>>AAAA>AAAAA>>A>>>>>AA?>AAA>>>A>>A>>>>>A>A>>?>A>>>AA>=>A>>>>==>>>>>>==>>>=A>>====>=>>>>===>>====>>>===============================$===$======9ϕ@#ph6656666666665665666666566566666666666666666656566655656666666656666666666666656666666666666666666566666666565566666666666666666666566666666666666666665666665556666666666665665666666666565( (((6666665666666655666666666686566666666666666666666666666666666666666666666666666666666556666$KKKKKKKKKKKKKKKKKJKJKJJJJJJJJJJJJJJJHHHGGFFFFFFJKKKKKKKKKKKKJJJJJJJJJJJJJJJJJJJJ///0/0000000000004QQ44QQQ4QQ4Q444444444444OO4O4OOOOOOO4O4OO2OOOOOOOOOOOOOO2OOOOOOOOOOOOOOOO2O22O222222XxJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJKKKKKKKKKKKKGFFFFFFFGGGGGGHHHHHHHHJHHJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJ|========>>=====>>=====>=======>==>=======>=>>>>>===>>>>>===>>=>>>>>>>>CC>=>=>A=>=>AC΃t?>>==>>>>>>>>>A>>>C>=>A?>?C>>?>=>=>=>>A>==>>==?>>>>>>>>>>?>>>>>>>>>>>>>CA>>>>>>====>=>==>>>A>========>>==>=>>=>>>==========>=============================$$===$$$$$==$$$=;;; ph66666665666666666666666666666666666666666666666666665666666666666666666566666655666656666666666666566666666666666666666666666666666666666666666666665666666666666656666568666666666666666656658666666665566566655666656666666665666667566666666666666666665666665666666666666566666666656666!KKKKKKKKKKKKKKKKKKKKKKJKJJJJJJJJJJJJJHGGGGFFFFFJKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKGFFFFFFFFGGGGHHGHHHHHJJHJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJv=====================>==>A======>>=>>>>==??==>>>>>=>===>?>>>>>>=>=====C>>>?==?>A>>ACA?>>>?>?>=>>>>>>>=>A>=>>?CA=A>>>>>>>>>>=C?>???>>??C>??>>>>>C>>=A>>>>==>==>>>>=>>====>?>>?>>>==>>====>>=>>>==>>======>>====>=======================>=$========$=$==$$=$===$=YY!vhKKKKKKKKKKKKKKKKKKKKKKK6666676666666666665665666666666665656666666666656666666666666666666666666665666666666566666566656656666665665665666666666666656666666666866666666665666666666666665666666666666666666666666666666666666666666666666666666666666656666666666666666666586666666566666666666666666665666666666666$KKKKKKKKKKKKKKKKKKKKKKKKKJJKJJJJJJJJJJJJJJHHGGGGFFFFFJKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKGFFFFFFFGGGGGGHGHHHHHHJHJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJv==========>>==>>====>>==>A======>>>==>==>>>>>>==>>>?=>>=>>>>>>>=>?>>>=A>>>>A>?>>?>x?C>>>C>>>>?>>>>>CA>>=>>>C?>A>>>A>>>>>???>=?>>>>>>>>>>>>A?>>>>>>A>?>>??>>>=>>>>A=>>A>>=>>>=>===?>=>=>>>A>======>>>>==>==========A===>>======$=======$====$========$====$$===$= #  p6666666656566666666666666666666666666666666656565666666675666666666666666666666666666666666666666666666666665665566666666856666656666666666666666666666666666666655666666666665666666665666666666666666656666666666666666666666666666666566566668666665666666666666666656666666666666666666656$KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKJJJJJJJJJJJJJJJJJJJJHJHHHHHHGGFFFFFFJKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKGFFFFFFFFFGGGGGHGGHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHJHJHJHHHv===>======>>==>>=====>===>====>===>===>>>=>>>===>=>>>>>==>>==>>>>>?>>>>>>>>>>>>>A]tA??>>>>>>>>A??>>>>>>?A>>>C?>>=>>?>>>>>?C>>>>AA>=A?>>>>>=>A??>=>>>>>>>>>>?>>>>>>>>>>>>>>=>>>>===A>>>=>>>>>>===>=>==>==>=======>==>===>==================$==>$====$=$=====$$==$=#Y  p5666666666556666566666666666665666666566666666666666666666556666665666586666565666666666566666666656666666566666666666666666666666666666666666666666666666656655666556666666666666666656566666668666656666666565666666666666666666666666665666666666665666666666665666566666666666666666566866$HHHHHHHHHHGHGHHGHHHHHGHHHHHHHHHGHHHHGHHGFFFFFFHJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJFp===>=>=>======================C>=>===>A>=>>>>==>>>===>AA>>>>>>?>>>?A>>=>>>=>??>>Ct>>>>>>>>>?>>=>>?>A=>?C??>>??>?>AC?>>>>?>>>>CC?>>>??>??>>?>=CA==C>=?>>>>?>A>?>>>?C>>>>==>>>>?>=?>>>>>>>>=>?A>=>>>?A==========>=====>============>=================$======$$$==$=[_p""6666666666666666666666666666565566666665666666566566666666666665665666666666666666666666666666666666666666566666666665666666666666666666666666666566566666666666665866566566666666666666655566666666566665666666566666665665666666555556666665666666666666666666666655666566566666666555566666$   p=============>?==>====>>>>>>>=?>=?>>>>>>>>>=>=>>>?C??>>>>?>>>=>>>??>>?>>>?>?>>>>x]A>>>>>?>>>>>A?>>AC?>>??>?>>>>>?>?C>>>>>>?>>>>>>>>>??>>>>>>>>>>>>A>>?>>>>=A?=A?>>>>>>>>==>?=A>?>=>>=>>?>>>===>>==>>>=====>>========>====>=====>=>========>================$$===$=@!  p""6666666666665666666666666666666556666656665666666566666666656666655666666656666656656666666656666665666666566685566666666655666666666656655656666666666666566666666666666856666666666666666566665666666666566656666666666665666665666666656666655665666666666666665666556666666666566666566666$ v=========>====>==>==>>=>>>=AA=>>=?>>>>>>>>==?>==>>>>>>>?>=>?>>?>>>>??>>>A>>>>>>Cz>C>>>>=AC?>>????>>>>?AA>>?CA>>?>>>C>A???>AAA???>>>>>>>>>>>>>>>>???>>>>>>A>>?=>>>??>>>>>>>>?>>>?>>>>>>>>>=>>==>>>====>>>==A>=>==>==>>=>>====>==>=======>===$======$==$======$===== ;  o""""""""""""6666665566566666566666666666666666665566565666766666666666666666666666666666665666656666656665666665666666665566666656666666565666665666665556666655665665556656666666666666666666666666666666666555665566666666666656666655566666666668866666666666665666666656666666566565665666666686655666$ q==>=========>>>===>====>>>=>>==>>>>=>>>>>>>>?>>>>A>=>>>?>>=?>??>>>>??>>??>>>>>>xC>>>?>?AA?l?>?>??>>>>??>>>>?C?>??>>????????>??CC?>>>>>A?>>>>>>?>>??>>>=>>?>>>>>>=?CA=>A?A>>?>=>>A>>>==A=>=>>>>>>>>===>>>==>=>>>=>==>A>>=================================$$===$====[ Y[p666666665566666666666666666566666666665666665666665666666666666665666556666666666656666666656666666566666666666666666666656666666656666565566666665666656666565666666656666656656765666666665566566666666666686666666666656666565565666665666566666666666656666565666666665665565566666666666$""""" """""""""""""s==>>>==>======>>==>>=>>======>>>>>?>>>>=AA>>?>?A==?>>>>C>>>?>>CACA>?>>?>>>?A>>Az???>>>C?C>?>>>>>>>CA???>>>>>?>C??>???>>>>?>>>>?>?A>>>>?C??CCA>??A?CCA>>>?>>>>>>>>?A>>>?>>=>=??>>?>>>>>C>>==>>==>>=>=>>=>>>===>>=>>==>>============>=======>=======>=============$= 9 v""""""""""""""""""""6655665666565665666666566666566566666666666666665665666665566666665666566656566566566665666565666665666665566666666666666666666565666656666566666666566556666566655556655666556666666655566656666666656556566666656566766557665566665566666666666666656665565666666665666566566686665666665655$"""""""""""""""""""""""""""""""""""""""""|=>=====>===AA>>=>=>=>>>=>?A>>>=>>>=?>>CA>>>=>>=>>?A>??>>>>>>>>A>>>=A?>>>>ACA?>ll?>??>>>>>>>C?>>??>?>>?C>>>???>>>>?>>>?>>>>>>A>>>ACCCC>=>>>CC?>??>>A>?CA>?=A??>>=>A>>>A>>???=A>>>>>==>>>>>A>?>>>?>=>>>>>=>?=>=>>>>>===>>====>>>==>===>=============================[   pTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTT86666666766666665665666666566665665866666556666565565666666666665566666555666666666666666655656665566666666566666666556655556665666666666666666666665656656566675656666566586766666666666666666565665666666666666666666666666655555565666666556656655556666655556665566666656666665666656655$""""""p>>=>==>=>==>>=>=>=>=>>>>>>>>>==>>>==>>>?=>>=??>>>??>>>>>AA>>?A>>>>>>>?>>>>???>x?>>?CCC>?>>???C>??=??>CC??>A??>>?>???>???>A?>C?>>>??A??>C?>>A>>?>>A?>>A>>>>??A=???>>>>>>>>>>>A>>>>>>>>>>?>>=>A>>>>>>?>=>>>=>>>>>>>=>>>=>>===>=>==>===>=====================>=$=====   pXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX666666566656666666666566665665666666666666556666566656566666666656566666666666565666566666656656665665666665666566666565556666666566656656655666655666556656666666666666666666666656566656666667666666666666565666666666656666565666665666656656565565566666666666666666656566666666666656665$"TTTTTTT"T"T"T""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""p>====>===>======>=>=>A?=>>==>=>?>>>=>==>>?>>CAA=A???>>>?>>>>??>>A>>>>>>>>>>??Au>>A?C??CC>>C>?C>????C???CC?>A>>??>???>?CCA>?C????>A?>>CCC?>>?A>?>?C>>>A?A>AC?>>??CA>>>>??=>>AC>=>>>???>>>>>>>>>>===>?A>==>=>>>>>>>>>>>==>===>=====>===>========>==========>========   qh6666565666666566665566656566666566666556656666666666666555665655666566665656666666666666666665666566665666666666666566655666566656666666656666556556666666675686866666666665666556666666666665566666666565565566666666666666655666666565665666665656666665566566665686665665556666666665566665$TTTTTTTTTTUTTUUTTTTT:TTTTUTTTTTTTT:TTTT::T:T:TTTTTTTTTTTTTTTTTTTTTTTTTTTTT"TT"TTTTTTTTT"T"TTT"TTTTTTTT"TTTT""TTTTTTTT""T""TTTTT"T"TTTTT"T"TTTTT"T"TTTTT"T"TTTTT"T"TTTTT"T"TTTTT"T"TTTTT"T"TTTTT"T"TTTTT"T"TTTTT"T"TTTTT"T"TTTTT"T"TTTTT"T"TTTTT"T"TTTTT"T"TTTTT"T"TTTTT"T"TTTTT"T"TTTTT"T"TTTTT"T"TTTTT"T"TTTTTT"TTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTp>==?>==>>>=>=>A>=>?>==>=>>=>>>>>>>>=?>>>>>>>>>>=>>>>>>?C>>?>>>?C??CC?>???C>>>?C???>?>>?>>>?>>?>>>?CC?>>CC?A??>C?>?CC>?C>?C?C>>?C?A>>??C?A?>CC>C?>??>>CC>>>?>>=>>?A>A?>>?>?C>>??>=>>>>>>>=>?>=>>A>>>>>?>>>>>>=====>>>>>===>>>>==A>=======?>====>>============>=====@    ph5666656665665666566666656665666556566555666666866666666666565665665566855666566666665666666665665656665556566566665666666665565656666666566656656656656666666666666566666665666676665566655666666556666565656666666566656566656666666666666656667666665656666556666666656665665556665666656665$WbbbbbbbbbbcbbbbbbbbbbbbXXXXXXXXXWXXXXXWXXXXXXXXXXXXWXWXWWWXWWWWWWWWWWWWWWWWWXWWWWWWWWWWWWWWWWTWTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTWWTTWWTTWWTWTWTWTWTWTp>==>==>===>>=>A>==?>>>>>>>C??>>=>A>?>>???>?C>C?>??>>>A??A>>>>?C??>??>>C?>?A??ACAAA?CC>?>>>???>>??>??CA>??>CCC?>?????>??>??CCA???????>>??>?>??>??C??>?C>>>>>A?>?C?>?>?>??>>?>>A?>?>?>>>>??>?AA>>>?>>=>>>==>>>>=>>=>>==>>>>>>=>=======>=A========>>=================Y ph666656666666566666865668665565666666556666666666666665655666666665655666566566666565666666666656656655566556666665565566655565565556566556666565565665665665566566665565675656665666656665566565565656666665665656566556656656566565565686655556566566665665566566666576556665666655656665666!KKKKKKKKKKKKKKKKKKKJKKKJJKKJJJJJJJJJJJHJHGGGFFFFFFXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXFFFFFFFGGGGGGGHHHHHHHHJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJv>===>=>>=>>>==>=>==>>>>>>?>>A?=>ACA>>A>A>>A?>A?>AA>?=>>>C?>>ACC?A>?????>>>>??AA?>>????C????C????C>?CC??>?A??CCA>C>?CC?>?C??C????>?????>>????>>>?C?A>>??A>>??>>?C?>?>>>???>??>>>>?A>C>>>??>>>>?>>>>>>>A=>>>=>A=>>=>==>>>>=>==>==>====?>=>=====>===>================ oh6676665665666555566666666656556566555566655665665665665666666666566566565566656666566656655666665666855667666656656686556765565665555655566555556656656566556656685655656666655666655655555566665656666666666666667666565656565556566666655665666666556666556666656555665565555665566666$KKKKKKKKKKKKKKKKKKKKJJKKJJJJJJJJJJJJJJJHGGGGFFFFFJKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKHFFFFFFGFGGGGHHHHHHHHJJHJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJv>=>=>>>=>?>>>>>>>>=>>>>>>>>>>>>>>??>>C?>>?>??>>>=AC>>>>>>A?>?>A??>A?????>=???C?>C?>>>C?>?CC>?CCCC>?C????C?>?CC??C?ClCC?>CCCA?>C???C???>?C?C???>??>??>??CCAC?>>??>>>>>>>??>>??>>=A>>A>>>?>>>>>>C>=>?>>>??>?>>>=>>=>=>>=>>=>>>=>>A>=>=>>=>=>==>>====>==>=======>==== ph6666655565566666666655665656656666666666555656866566556566566655656566565565666656666555556855656556667655555555666565656656566566656666666556666666666666665666566866656665866565655565566655655566566665555565666666656665656556566656656665556665566656665665665556666566655656666566566$KKKKKKKKKKKKKKKKKKJKKKJKKKJKJJJJJJJJJJJHJHGGGGFFFFFJKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKGFFFFFFFGGGGGGHHHHHHHHHJJHJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJv??A>=>C>>>=>>==>>>>>>?>=>>?>>=>>==>>?C>>>>A?>>>>>?C?>>??>>A>C?>>>?>>>>CC?>CC?tl?lCCCC?>>??CC?CCC?CC>>??CC?C??>>>A????C?>?C?>>??CCClCC?C?>?CCCC>?C?CC?>>?A>?C?>>>?>>?C?>>>>==>?C>?CA=>>>?>??>>=>>>A?>>>>>>>>>>>>>>>==>>=>==>?>>>>==>====>==>===>====>==============ph556556665556556666556655555766655666566666666566666855555556556656666665655665566656666656566655555576666666666666566665666666666656566656555665666666655565655565556565566666665656656666666666655656666566566666666655656586666566665666656565666655656666565566566666556666655655666566556!KKKKKKKKKKKKKKKKKKKKKKJJJJJJKJJJJJJJJJHHGGGGFFFFFJKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKGFFFFFFFFGGGGGHHGHHJHJJHJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJp=>>>==>>>>>=>>>>>>>>=>>=>>>>>>???>>>>>>?>>>A>>>C>??>>C?C>??>A>>C??>?>>?A>?C??tC>>?CC??C?>>CCCC???l?>?lC?C>????CC?CCC>??>C???CC??>?????C?CC???>?CC?>?C>>??CCCC>>>A?C?>CC>>??ACC?>?CC>>>>??>?AA>A?>>>>>>?>>>>>>>>>>>>>=>>>=A>==>>A===>===>=>===========>=======$==== vh6666556576556656665866666666555656568555555666565666656655666555656666566556655766666665665665666655666666566655656656666666565886656566666655666666566566556666668666666568666555566656666666576565565665566566566556566566686655666666566666665666665566556556666666566656556666565666655$KKKKKKKKKKKKKKKKKKKKKJJKJJJJJJJJJJJJJJJHHGGGGFFFFFJKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKGFFFFFFFFGGGGGHHHHHHHHJHJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJv>==>=>>>=>>=>?>>>>>>>=>?>>>??>???>>>>?>>?>>?>??>?>??>C?C??C>>>?C???AA??>>A?>?t?????C??l???>CC?CC?CC??CCCC????CCCC??C????C>?lCC?>>???CCC?C?>>>>?CC?>CC>???CC????????>>C?>?A?C?A?C>A?>???A>>>???>??>>>>>A>>>>>>>=>>=>>>>>>>A>>=>>>=A>===>=>>=====>==>===============   ph56666656665656667656556566566667566766566565665556665566565665665665566555555555656657556565555566566665665656665565565666566666666655656656655555656665556566566666666656566665565555556655656566565665666566656665656565566666555565565656656666656555555665676666665556666556656666656$KKKKKKKKKKKKKKKKKKKKKKJKKJJJJJJJJJJJJJHHHGGGFFFFFJKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKGFFFFFFGGGGGGHHHHHHHJHJHJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJv==>=>?>>>>>>>>>>==>>?>>??>>?>>>>>>==>?>>ACCCCC?=?A?l??CC??CA?CCCC>CC?C?>???>>CClCCCCC?CCCC?C?>?>>?CC??ClCCC??C?>??>?lCCCC?>C???>CClCCCC>???>???CC???CC???CC?>>?C?C?>C>>??C?>>>>C?>=>?CC>>>>>?C>>>?C>>>>>A?>>>>>???>>>>?>>>>=>??>=A>>====>========>>====>>====>====  oh56665665665655555555555566556665656658655555656556666555656666565756555656568665667666555666566566565556866655665656566556567655566566666655665555566655655566666565565566555665555566566676666665555665557556666655665666566666566665668565566666665556666655566565886765666656565556666565!KKKKKKKKKKKKKKKKKKKKKJJKJJJJJJJJJJJJJJJHHGGGGFFFFFJKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKGFFFFFFFGGGGGGHHHHHHHHJHHJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJq>>=>?>>==>=>>=>>>?>=>?A>?>=>?>?A=?>A?lC>>?>>>????>>?>>???>??C???A?????CCCCC?CtC?>??>??CCCC>CCCC?>>??C????l?CC?CCCCC?C???CCCllC?>?C?CCCCCCClC?CCC?>?CCl?>CC??>>>?CC?>C?CC?ClCACCCC??>>>C????>>A>>>?A>>>>>>A>>>??>=>>A?A=>=>==>>>===>=====>=>>>>==========>========>  ph7666556666655565665655556665556556556665565656565567666666556566665666666666566685666665565586556555666566656686675656555555867866665666566656556665565556556655565566676665565666655555666566555655656655666765665555556655665555556655666655665566656566566665766656665566556568665557555565$KKKKKKKKKKKKKKKKKJKKKJJJJJJJJJJJJJJJJHHHGGGFFFFFJKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKGFFFFFFFGGGGGHHHHHHHJHHJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJq>>=>>>>A>>A?A>>>?A=>>>>A>>A???>>>>???C>?=?>?>>?C>??>????????????CC?CC>C?A?lC>CC>??????C????CCCCC?C?ClC???lCCC?CC????CCCC??CCCC?CCCC>CC????CC??C??C???C??CC??>CCCCA?C>>CC>?CC???A>??>A??>>?C?>>???>?A>>>>>>>>>>??>>=>?=>?>?>=>=>=>>>=>>>>==>=>====>==>=>=>==>=>===>  ph6566555658655555566555657566565565556657655665666566568656665555566666566566655655665656666665565656566655666656655566555556655655665766555565656666665655656566666555656565666656665655556566665575675656565666666665665566556665565655555567565666555555656666565665655565555558666666!KKKKKKKKKKKKKKKKKKKJKJKJKJJJJJJJJJJJJHHGGGGFFFFFJKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKGFFFFFFFGGGGGGGHHHHHHHJHHJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJq>>>===>>>>A>?C>>??>>AA>?>?C??C>>>>??>C??>?>>?????C??C??CC???CC?CCC>CCA???CC?>CCCC??C??A??>CCCCCCCl?CCCCC?lCCCC??C????lCCCCCC?CClCC?CCC>?C????????C?>?C>?CC?>>CCCC>????CC?>????C>>?C??C??>?l?>>??>>C?>>>>>?>>=>?C?==>>=>?>A>=>==?>>>=>>>A>==>=====>=>>>>===========  ph6576565565655566566656665666565565556665555656556866655555566655656566556656655565566556666656555656668656656656665665555566675666665666665555675685565565555566656555666675666656655656665556555675666666555566555555565666556656656656556656666666666556566565666556866655656666555567!KKKKKKKKKKKKKKKKKKKKKJJJKJJJJJJJJJJJJJHHGGGGGFFFFJKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKGEFFFFFGGGGGGHHHHHHHHHJHHJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJ|?>>>>??CA=>>>A?>>??A>>>=>A>>AC??CCCA=?C>?CCCCC????????>>???CCC???C?>>?CCll??CCCCC??CCCClCCC??CC?Cl?>>?CC?C??CC?ClC?CCll?Cl??A??CCCCC?C?ClC>??CCCCC>>A>????C?????CC????>??C?>>CC?>?Cl?C?>>>>>>>C>>?C?>?>>?lC>>>=>>>?A>>>>=>>=>>>A==?>===C>>=>==A=>==>============== ph565555656666666555566666565665655666655556665665555666665556566555666655665556566655566556665655666556566556566556656665556655566566656768565566556566655556666556656556566565655565656655565666656765555565555656557565565566655665556666765656656655666567656555556655565566555655556$KKKKKKKKKKKKKKKKKKKKJKJJJJJJJJJJJJJJJJJJHHGGGFFFFEJKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKGFFFFFFFGGGGGGHHHHGHJHJHJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJ|>>>>>=>A=>?===>>>>>????A?>>>>?>??????C>>C????C???>?>A?CC??>?lCCCCCC?C?C??CClCl??CC?CCCCC??>?Cl??C?CCCllCCl?A?CC??CC??CC>?CCCC????CClC?lCCCClll?CCCCCCCCClC?C?CC?>CC?ClC?>??????CC??????>>??C?>CC>>A>???>>>>=>??>>>>>>A?>>??AA>A?A>=>>>=?===>==>======>=>>>AAAABBBZ  ph67666575555655565565556575656666557665656855567756665666555655665556656566556566565555655555555556655556565666665565655666556656566655556657656566565656665555655665556556657865555556555565556557555565565666556655656556555657556555566555665565666566665657567656655855565657!KKKKKKKKKKKKKKJKKKKKJKJKJJJJJJJJJJJJJHHGGGGFFFFFJKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKGFFFFFFFGGGGGHHHHHHHHHJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJv?>>A>>A>>AA>>>?>>>>>A>??>>?>A>??>CA?C??>?>?C????C???A?CC??????lCCCC?CCC??CCCCtCC?CClCC?CCC?CCC?lC?CC??lCCCCCClCCCCC>lCCCCCl?CC??A?ClC?CCCC??CC?CC?lC?C??Cl?CCCCC??CC?CCC>??C?>?C???>>>?????CCAA?>>?>???>A>>>>>?>>>?A>?>>>>>>A>>>CA>>>>>>>>=A>>>CZ]z oh56655556655675565556765655665555665655556556566555556566666655555656655556585757656555555555656565567555555865656556656555566656657656865556556656666655555555656655656555566655656568655565665665566555685556556556555555555665656667555656665656666665655655656655575665556566666!KKKKKKKKKKKKKKKKKKKJJJJJJJJJJJJJJJJJJHHGGGGFFFFFJKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKGFFFFFFFGGGGGGGGHHHHHHHHHJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJpC>>A>>>A>?C>>A?>AA>>?>?>>??>C>>>>C?>CC?>?>CCC???CCCC>CC?lC>?>>C??C?C???CC?CCCt?C?ClllC?lCCCCCCCCCCCC?CCCCCCCClCC?CCCllClCCC?CCCCC?C?CCC?CC?>>?CCCC?CCC?CC?CCCCC?CCCC??Cl>??CC????>>??>>?C?>CC??>>>C?>>?A????>>>>>>C?>>>?A>>>C>=>>>A>=ACBZx  ph5567565575555565556856566567676656665665565556556676556665556655656655566656556557566655766555656555575865656656555555557656656566555665666865556666566665676556657666656556665555566565565655655566666656555766665666666555665556555755655555565565658656565566565585556565!KKKKKKKKKKKKKKKKKKKJJKJJJJJJJJJJJJJJJJHHGGGFFFFFFJKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKGFFFFFFFFGGGGHHHHHHHHJJHJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJq>>>A>>?A>>?=>>??>?A>>?C?>?A>>ACCA?>>>AA?CCC?>>?C????C?>>CCClCC?>?C?CCl??CC?C?CCCCCCC?C?Cl?>??CC?>?CCC?>??CC?ClllCl????ClCC??CClCCllCllCCCllCC?>>CCCCC?CC>CCCC???C?>>?C>A??CCClCll?ACA??AA>>>>?CCCCl?>=>??CC>>?CC?>=>>>>>>>==>=>?=Cxś   qh856655655665765566555665657555666665566655665586565755566555656555556656555566655666856556555665655566565665655565565656655655555566565556655555555555565566665565656555657565566556555565565655666566566665667655566866665566565656565567666856565766655565565566565556555556666556!KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKJKJJJKJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJHJJJHHHHHHHHHHHHGHHHHGGHGGHGGFFFFFJKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKGFFFFFFFFGFGGGHHGHHHGHGHHHHHHHHHGGHHHHHHHHHHHHHHHHHHHHHHHHHv>A>>>??>>>C>A?=>???>>>???CCC>A?>C?CC?C??????C??C??C>CCCAC?C?CCCCC??CCCCCClC?CtClC??CCCllCCCCllCC??CClCCCCllllC?C?ClClCCCCCCClCC?CCC>CC?CCCC?ClCCCCCCC>CCCl??l??CllCC??CClCCC?CCC?CCC??CCCCCA>>????l????????>>>??C?>>C??>>>?Ct]ŃxtAACA>A>>>>>>====>>==>=>>>=A>>>A>A>AABZ_z!    phJJJJJJJJJJJJJJJJKJJJJKJKKJKKKKKKKKKKKKKKKK655665566556556566656555565655556555575555665665655555565756665566575656555656655566556565556666667666555865555555655556556566655555655556656656566675665655555766655566655687857556655555656555556566658657566555566556556565657576666556666655656655655565755556555655655558556567!JKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKGv?>>>>>A>>>??A>>>A?C?>>>A???C??>>C?CCAA?C>C?C?????CC?ACC?C??CCCClC?>CC?ClCCCCCtCCCCCCCCClCClCllCCCCCCClCCCCCCCCCCCCCClC?lCCC?llC?CCC??CClCCCCCCllCCCC??CCCl?CCC?Cll?Cl?CCCC?C?CC??Cl?CCC>????CC?>>>C??>?A>?C??>?>>C?>?A>>tz̖xttCA>==>>>>>>======>===>==>=>=============$======$=$===BB] o666566655556556686576556675555555555655556856665667555556865566565566755566655556655665655565555565576565855656655665665566657555555666665555565656555566555555666556556566655565656565565568555555565556665555555565557665656556566556555656666855765665566666556567555576555556555$HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH|C>>>===>>C?C?>?>>>??CC>>>?>?????CCC?C????llCCC?>?CCC???CCCCCCCC?CC?lllCC?C?CCt>?ClCC?>?CC?lCCC>ClCClClCCCCC??lllllCCCCClCll?CllClllC?CllCClllCCCCCCC?CCCCCllCCCCC??Cl?CC>?Cl??CCCCClllC>?>CCCC???>?>>>>>>?CCCC>>>C??C]zZAA?=>?>>>>>==?>??==>=====>==>======>==========>======$====$====$=$=Z o56658655855555568575555656555556565766566756566555867555855766555555558555555556656555555556665565565657658555665666555555656686656575565665875656555555655658585565556565756665555655557586855565675556766555567556558665555565555565555656555656555575555555555566665665566555687555! |??CC???>>>>?>?C??C?>>???CC>?CCCC??>ClCCCC?ClC??????llC???lCCC?C?CC?lC?>CCCC?Collll?CClCCCCl??lllCCC?lCClllllCCCCC?lCClll?CC???C??lllCCCC?ClCCll?ClC???>????C?>CC?C?>CC?C?ClC?CCC???>>CCCC?C?>>???CCCCllCCC>>>?>?>Cz̔ytCCA?>?>>>>A>>>=>A===>>>>=>>>>>>=============>======$=====$===>===$$==$!=====Bxp6555655568655556665555666557656556575575556866665566565555865665558556566656556575786655566755555655567555656555555555565665765668556556565555566665666856565555555566556555656665565555665566656656565558756556555555555685567555555575665555556555565555765685555576655556556555566555$""""""""""""v?>A?>?>>>>>?>>?>>?CC>>C?>C>CC??CC>>?????C??CCllCC??C?CCCCC?CCClCCC?CCC?ClClCCtCClClCClClCCCCCCCCClCCllCllCClllCCCCClCCClCClClllCCCCCCCll?CllCCCCCCCllCCCllCClCCCClCCC?CC>CC>CCC?CCCC???CC?lCC???CC??C?????>??CCuzCC??>>>A?>??>>>??>=>>>A==>?>>>====>====>==>==============>=====>$===$==$===$=$$$$$==>]  p""""55865655755656666665555555565556567655557577555665655556556565555565566555665568655655755555565555765655565655667555675555668557565865565556565675765656667555655556555555676656655565655656766556555565556576566556665555565655556555555685555555676556655755555665555766555$""""" ""vC>>A>>A?>>>CA?>C??C?>?C??C?C?>?CC>CC>C>>C??CCCClCCC??ClCCC??CllCCCCCCCCCClClltCCCCClllClCCCCllCCCClCClCllC?CCCCllCCllCCllCllllllC?CCCCllCCllC?CCCC?llCClloC?CCllCCCC??CCCCC?CCC?CCClC?>??C?CC???CC?CC?>>>C?>CޔuC>>???>?>>>??>>>=>>>>>=>>>=>==>>A====>====>==============================$$===$=$$$===$=$$@ !   o""55655655655555655665565555656567655655665756566555555565656575556566555555656666556555565555555765555556556565556557566556575556655657556558575755655667555855765655585757565555555656856566555665565555755655555655565566565555555555665576655565667766555675756556567$""""""""""""""""""""""""""""""pC>>CC>???CCCCC>C?>>>CCCCC>>???C?C?l??C?AA>C??>?C?CC?lCC>ClC?ClCCCClC?ClC?C??CtlCllClCCCCCllllCClC?ll?lCCCCllCllllllClCCClCC?ClllCCCCCCCllCCCCCCllllllCC?ClC???ClC?l??CCCCCC??CCC??C???lC?????CC?>>>CCCC>?CCzߖtC>>C???>CA>>C?>?>>>>>>>>>?>???C?>>?A>=>>>=>AC>AA>====>>========================>=======$=$$=====_ p""""""""""""""65755555555555575575656665685557555555555685556655565566565556555555567555758555755566556565565756656555555555565556655655575555556556557565555565556655685565555567585555568555555675565565555556556556655555875555655656575555575555555555555555556558555555655557658656555!T"""TT"""""""""T"""""""""""""""""""""TT"""T""TTT"TT"""""""""""""""""""""""""""""""""""TqC?>??C??>>?>??>?CCCA>??CCCC?C>A??A?C?CllClCClC?CCC?>lCC?C?CCCCCl??lllClCClCCCtlClC?CCClllClCCllCCClCCCll?CllCClCCll?llClllCCClC?ClCllCCC?CCClCCCC??CClCCCllCCCCClCCCCllCCCC>ClCC?ClC>?C??>>?CC?CCCCC?????{zC>?CCC?>>?>>?A>>>=>>AC>>>>???>>>=>>=>>=?>>>>>>>A======>=>==>>>=>=============$==$$$$=====$=$$$$$$==$@  vT""T""TTTTT""""""""T"TTT"""T"TTT"""T"TT"TT55755555655665555655555656755556565657555567555765757555575555556555576556756655556657555555566755576665665656555555555555557655575555555656555555657555655557575575565555655557575655555555566555556555758566555756786756555555655557555655555567565565555555556565655555$TTTTTTTTT"TT"TTT""TTT"T""T"T"""""""""""""""""""""""""TTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTq?A>C???A>>?>??>???CC?>??CC?CC??CC?CC?CC?CCCCCCCCCC?ClCCCCCC?llCCCCCClCCClCClCtClllClClCllClCClCCCCCllllllClClCClCClllllCllCCllC?ClllllCCCCllCClllCCCCClllCCCClCCC?Cl?lllCCC??llCCCClCClCCCCCCCC??C?CCl?CxCC>>C???>C?>>>A?>>?>?>>?>>?>??=A>=>>>>?==>A>>>>=>?>==>==>======A===============$==$===>$$$=$$$=$$=$$$$$=  pTTTTTTTTTTTTTTTTTTTTTT"TTTTTTTTTTTTTTTTTTT65555655555575558585685555557876555656555578767675558555566556555766565555566555555556555556675666585655655556775566555755556555555675755775556555555555555575565765568555565555655766555555657565566565656555565656556855586555565755555657558675655566555576565555855$TXXXUXXUXXXXUUUUXTXXTXUTTUTXTTUXXTTXTXTXXTUUTTTUTTTUTTTUTTTTTT:TTTUTTTTTUTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTT"""TT""T""""""T""TT""T""""""T""TT""T""""""T""TT""T""""""T""TT""T""""""T""TT""T""""""T""TT""T""""""T""TT""T""""""T""TT""T""""""T""TT""T""""""T""TT""T""""""T""TT"T"TXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXv>?A>?A?>A????>>??CCCC??>?CAlCC?CClC?C???C??l?CC?lCClll?lClCCCCC?lllClCC?CCClClClCCCllllllClCCCCCllClollCllCClllllCllCllllllClllCCCCCCllllCClCClllCllCClllC?CllCCC?ClClllCCC?CloC??ClCCloCClC??C???>?ClttCCCC???A??>A?>??>>?CC???AC>>?>>>==>>=>=A?>>=>==>===>>==?>>=>=======>===>==================$$=$$=====$$!$$$$[     pXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXUXXXXXX755555655555556556555556556556575555565567565855556655555655775756555655555676655557575557556557555566555655555865555567757556856555555555557555565565556555555555655755766555565555556566555555555575555556555555665555655785556557576555555655566866658665756665555555555755558657==9=99===99=9=====9999;===9=9=9$$=9=9===$99=999===9=====9999==9===9999==9=9=9=999==$=$$99==99=9====99=9=999=99=9==$$$99==9$=$!$!!9"TTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTT9$===99==99=;=9=;99;9==;9;9=>;==@=======99=99==9=@=9;>==;9==@qC???>>??C?>?CC?>>??>>A?CCC?CCl??CC>?C?ClC?Cl???????C?ClllClClCC??CllCllCCllCCCloolCC??C?ClolCCllCCClllCCllllCCCClll?ClllllC?CCllloolCCllCClllllllll?CClCCCCC??CCClll?CCCC?CCCCC??CllCC???CCCC?CllC>??t{ll?>??C?A>>CCCCClC>>???>>>A?A>>>>?>A>?A>>>>?>=>A===A?>=>>==>===>=>===========>========$===$$====$=$$=$@@$==$== o{@@A@;;@@@A@;;@;@@@;@@@@@@@;@@;@@@;;@@@@@;@6556555555655555555556655655655555555655665656556555556566555565655556676655665566555655555565658665665565556555555565575778865556555555555555575555768555555656557556575565556555557566655657655567755675575565755555555585555555557875755755555555658655565576556575556555555565665855555555656555555555788567555555565555565575656666565555565657565757555575555555565657555655555656756565675=TTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTT!775555556765555756575765576555565586557555555657555555q>???>CC?>?C??C?CCC?CCCCCCC>?ClClC?CCl?CllC?CC?ClCCCl?ClCCCCllCCClCCCCClCClClltCClCCllCollllClClCClCClollClllClCCllClllCCllCClllCCCCllClCllllCClCClCllCCCCClCClllCCCCClCCCCCCCCC?lCC?CCCClC?lCC?CC??CCl??l?C?>CC???CCA>?CA???>>>?C?>??>?>>>CA>>>>=>>?>>>>A>=>==>>>>>==>>=>======>=========>=======$====$$=====B=$$=$_   py7565555655555555655655575655565555565677587755555588755557755555555555555576565555555555555556555555555555555555555555555555555657577555555558755555558556555755555556555556555556575757555756565555556555855557656555656557566655556556565555555566555555757655555657555556585655575556655556557565555555556677555556565555555655565756855555685675557755557885555556585555565575555575555556556556565757655565655657555565555766575$TTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTUTTTTTTTTTTTTUTTTTTTTTTTTTTTTTTTTTTTT=65565556555558755557555655555555656555785555565555565v??CC?C?>???>?C??CCCCCC??CCC?CCCCC?CCl?CCCCCCC?CClCClCClCCCCllCClCCCllClCClClltlCllCllCollCCllllCCllCllllClllClCClllllllCllCllll?lllllCllCCllCllCClllClCCCllClClll?CCClCCllllCCClCCC?lCClCC?CCCCCC?CCtCC>ACCCl?CC>CC?C>AA?CCA?>>?>??>??>CA>>>A?=>>=>>>C>>A>=>>>>=>>>=>===>===>>=========================$$=$====$$$@py55555555555555565555555555565555557856755555577555556555587555575575555565855755555565555755555566555675655557555555555755755555566565557558855565576555555555557675575566577555557565586575575655555555655565556565565655557555658555555557558555655555555555655656555755555665555555557557555555775655565765555555555555656556555555555566755565575865775657855558755855576655555576555576756555555555556555557555557565565555777777777777777878777777777777777777777777777777777777777777777777777777777777777777777777777777777777777787777777777777777777777777777777777777777755566555577558655578755555775655655756565555555555556555v?CC>>?A>????C??C??CC?>C???CC?CCCll??CllC?llllC?ClCCClll?CCCCClllCCCllCCCCClCltlClllolCClll?CllllllllllCCllCllolllllllllllllllllCllllllollC?ClCCClCClClllllCC?CCllCCCCllllCCCCllCCCC?ClClClC??CCCCClCytC????uɘl????C?ACCCAC?ACC>???C>?C????CC>>>>>>>>>>=>>=>>=>>>>A=====>>===>>==>>>>=============$=$$==$$==$$=$$@   py5558555565565555556555556555555558676555557765765575555555655558855555555557557756755557657555655567655755556555555555566555555775555587557755555565555555555655756565555555755585555556555857575556555855556855555557555565555555556655555557555555575555555755575566565555755557555655585565565555555555555788755555756555555555566557755557555755577555875575855755557557765555656555755555855655555555575557555555555555575555575558555556555555555555555556757555655655555557655555555555555565555555555555755555555555555555555565555555576555575656555757556555555555555555566655587575555655555555555555555585655556578555675555555656555555655555665775555557577vCC?CCC?>?CC>Cl?CCClCCClC?CCCClCC?C?A?CC?>llCCCllCCCCCCC?ClllC?CCClCCCllollClCtlCllClllCCllllllCCllllClCCCllllllClllCClCCllllllllllCllllCClllllllllClllCClllllCCCClCllCCCCCl?C?C?llC?llCCCCC?C??CC?ClylC?ClzlC?CC?C>?CC>?C>>????>>>?>A?>>>?C?C>=>=A>=>>>>?>>?>A?>===>?>=>=>>=>=====>>=>==========>======$====ZB o{5557655567555755566566557555555655655865555555556555755556755555555655555655555555775655655755665555655555655555655655657556575555577555555665555555556565755557575556655575667655758555555555558555676665555555555575555555555665555555555555555668657755855555658555577575655555555565555665577657555575568557555555555655555557555555755565557555758555558555565555785555556655565555555555655555555555555575555555655675567588555566557555555556556755557555555656587865555786555555555557585558567565556555785755556655555657556555675557556755556555555575576565555555558555566555555555655555555655565555557555556565575555557555555567555577555655555568665q?>??????CCC>CC>?CCC??CCCCC????CCClCCllCCClllCCCllCCClClllllCllCllllllllCllCCCulCllClllllllllllllClClllllllllllCCllCClllCllClCllllllClllCClllllClllCCCllllCClolllCllCllCClllCCCCCllllCClCC?llC?ClCCCCyuCCCuuCC??>CCACCC>A?>C?>>C?>CCC>>?C>>??=A?C>??=>??>>>>>=>>>>>=>>===>====>>>=====>=======>===========$==B py55556555856656555555666778555756555555555565555555655555555555655655755566555555555555555555575557755555565556555555555557556685555565555555565655555565555565685566555556655565555556655557555565557557557555555755565557555555555755665555555557555778755575555555555555575555555565656555555556786556775555556575555565555575555655555675765555555555755555575555555565555555555555555555685667556556555557865755565555555555555555655555756555555556555555555555555555555555755555555555757557655558557555555555555655557555555555756556555756556565555575566556555565655565555655655557655555555655556655565765566555555786556777v????>?CCCC??CC?CCCCC?>CCCC??CCCClCClCCCClCCCCCCCCCClllCCllClllCllllllllllllCluCCllCClllllCoCClollllCClllollllllllllllCllllCllllllllllllllllCllClllCCClllllCllllCClCCllCClllCCClCCClCCCCCCCllC?CCClC?tlCCCCCC?ACCC?CC?>>>??????ACCC>C??C>>?>>??>?A>>??>>>>=>>?>A>>>>==>>=>>>>==>>========================$$= py65555555555556555565555565565575555555755665565557567557557555567555555555555557656575667655655757555565555565555757555555575655755565555655555555556555575555775555555558555558557555557556555775655577555556685557555565555577855555555565555557555555555566565556555787766556555555555555555555557555756556575555555556555555555576555555555555555757565575555575555755555555655555555555555766558575577555555555575555767655577555555555557656555757857555555575555567675556655555555655555557555555576555555555555555555555755555756855655555557555555555555555555555557655556555555576755557555555557555655555555665558565575568555577qC?>>??CCC?>?C?ClCCClC?CCCC?llCC?C??CCClClCCClllCC?CllllCCCllCCCllC?CClllCllCColClllllllllllllllClollllllllllCCCoololooloolllllColllllllllllllCCClollllllCllCllllClllCllClCCllCCClClCClC?ClCCCClCCCCC?tzCCCClCA>CC?>CCC>>ClC>>CC>>>C>>>A>?CC>A>=>>>>>>>=>==>>===>>A=>====>=>=========>>=============$===$==x       py557565555555555755565555555575755575555555656875655575555555555575555555555555655555755765555556555555557755556557575557555575555655555555555555555555555555555555556555655557755756555555558575555555555555555555775565655657555555557557555555555555755555655765555555555555557655556556555855555555555555556555577557755557558555555756575555775755756555555685557577555575555855555555556555555555557565655555566567556555555755555555555556556555555555555555555755575555675555555555875555565555555756755755555655555555555555575556867555555555575555555555555755555575565755565555555555555755555555555755656655556|CCCCCC?CCCCCCC??????CClCCCCCCllllCCCCCCllllClClCll?CCClClllCCClllllllCllllllCtlloollClClllCllClllllllCllllllllllollCllCCllllllllllClllClCllolllCClllClllllCllCllCCClllCColllCCCCCllCCCllCCCCCllolCCCCtz>CC?ClC?CCA>Cl?>???>>CC>>>>C?>=?>>>>>>>?>>>>>>>>=>??>=>?A====A>===>==>===>=>>>>=========>=====$====[py55557555555557555755555555555555555555575755555575578555555555775755655557555555555575555555555755555555556557555555555555756755655565555555555555555555556555575555555555555575655555555555556555577555555555555756555555555755555555555555565557555555565555585555555576755555557555555555557555555755555555555555555565575557555655555555555565757555555555555755555555557576555755557555555555555555556557555555755555555555557575555555755555555565565555555557577555565558555755555555758557555555755555555585555575555565555575566567555555555555565555575655555556555757557555555555555555755555555575755557|CCC??CCCCC?lCCCCC?CCCCClCClCClCCllCClCClClllClClllllCllllllCllllllllCClllllClolCllllolCllllllllllllllClllClllCllllllllllolllllllllllllCllCllllCClllCllllClllllllllCClllClllCllllCllllCCllCClCCClCCCClCyu?lC?CCCCCCC?CCC???C?A??>>?C???A?A?>>A=C???>>>?AA>AA?>=>>>>>==?>=>===>>>====>=======================xpy555555555585558555555755555555557555555555555575575555585575557567555655555555755555577557557555557657555655556755565555555678555675555555555557ly855555555555655556776555555555555556555855555557555555755755555555555555555557555585685555555557756557765555555557555565855557655785575557555555557655575555556555755555555555555555555755575555755558555655555655555655555556555557555555556555555555755575555577555555576655755555855655555557555755555755555555555755555567555557555555555575576555555555575555555555555555555675555555555756555555555557755755555555555575555555655555555555555555555565557v?C???CCC??CCC?CCClCCCCCCClCCCCllCCCllCllClCCClColClllllllllllllllllllCllllllluoCllllollolllllllllllllllolllllllllClllloloCCllllllllClllllllllllllllllCllllllllllCCllllllCClllClCCCClllCClCClC?C?CClllCCytClC??CCCCCCClCCC??CCC???>?CC???C?C?>>>??CA>>>??A??A>=A>>>>>>=>>>=>>>>>=>===>========>==============py55556555555555555555556555755656757555555565557555555555555556555577755555555555555576557555557557575555555575555555555755555685555555555555558j7555555555557565555565555557555575557555555575757555555575555757575557555555557555557756557777575557555555555655577555575577565557556555556755555555575555555555755778555555557575575556555575575555555555575555585655555555557655557577555755556555757555755575556555755575555557555587557755755557555556555556555765555555555557555865555557857555557576555555575555555555565555555555565555555565555755577575575655555557555555555575565p?>?CCC?????>CClCClCClCCC?C?CCClCCClCClllClCl?CClCCCCCCllClllCCCCCllllllCCClllulCClllCCCllllllolloooolllllllllopoopollllllllolClllolClllllolllllllCllllllllllllllllCllCCCllClClollllllllCC?CllllCCCClCCCltl?CCl???>C?CCCC???ll??>CCCCC?>?>ACC>A?>>>A>C?>>>=>>>=??>>??>>===>=>>=>A====>>===>===>==============B    py755567557555576555557755576575555555556555555555655555575557655555555655555756655675575675555757555555575755575555555555558755555558555555555557555Ct75555555555755555555575555555875557555555575557555555555555755657755565555555755585555576775555555565655576675555555555575555755575555755577555556565555575555555555555575755755755655555555575755555555555557775555585555755757555655555677556556555555757555555555555575555555565566775755555558755555555555655555755555655567575655555555557555555675555555555555556855755557657755575555555555565565555555558555576555555555555555555555555575755|lC>>CC??CClC?CCClCCCClCCCClllCCllCClllClClll?lllollClllCClllllllllpllllloolllulolllllllllllllollloolllllooolllllllllCllllolllllllllllllllClllolllllllllollllClllollCCClllCClClllllClCCClCCCClClCCClCllCCCllCllCCC??lC?C?C???Cl?CC>CC?C??C>>?C?>A>A?A=?CA>>A>>>>?>>>=>==>>>?>>>==>>=========>>===>=====>====$=  oy5755755555575575555565655556575555555555555556555555575555655757557555555555755556555555555555555555655555555555555557767555755555555556555557675555557555557555755555555555555555775555755657555555555857555555555575555565555555565555577767555555575755575555555775555555555555555555575555555555557555555575775756555555567555555555577555585555755655555555555555555555557555555755755775755555555555555755557555555557555555555755555565575555555555555565555575755555555555565575555555755655555555755555557555755575557555655655555565575555565555555555555555555585555555755555555555555755555555557555|CC?>CC?CClCCCC?ClCCCCClCCCllCCCllClllCCClllCCllllllClllClCClllllllollllllolllolollllllolllllllllllllolllllolllllllllClllllollllllllloollllllllllllllllCllllllollllooClllllllCllCllllCCClllClCCllCCCllClCCCluCCCCClC?l?CC?????CCCCC>CA>CC???>>??A?????=C?A>>??>>>>=>>>>>>=>>>>>>===>=====>>>==========>=======B   py75555555556555555555555555557755755555557555555557555555557655555585555555555557755555555557755555555555555555555555555555575556555575557555555755555555557555555555555577555557555555755555555655555555555565655555575557555557575755555555555756555555776555555765555555555555575555555555555555555555755555555555555675555555555555556755557565555555555557555555555757555577555555555555587577555557765555557555567655555555755555555755555555555555775555575557565555555555555555555557575555555555555555556565555555755565555555555555755555655787555755555555555555555755555555555555555|????lCCClC>ClCCCClCClC?CCCCClC?Cll?CCllCllCllCClCllllllCllCllllllllllllClollltoollllllollollllllllloplllllllllllllolllllllolloollllloolllolllllllllllolllllllollllloollClollllCllllllllllllllClCCClllClllll{lCClCCCCCCClC?C>??CCCC?C>?C??>C?>?>C>CC>C>>>=?>>?>>>>??>>>>=>>>>>>==>>=>>===>=>==>===========>==>  py75555555555555555555575555555575555555555857555555555555555556575755757555557555555555755555555555557555555555555555555755555555555555556575575555555555655755555565555555555555555555555555555555777555555555555555555555765555655575555555555755755575555555555555555755555555555555557555755555555555555575555555557555555555555555555555757755555575555757575555555555575575555555775556557555555555557757555555555555557555555555557557555555555556555555555555556555555555755555575555555555555555555555555555555555557555555575555555555555557555555555655555575555555555555557555|CCCCCCC??CCC?CClCCC??C?llClCCllCllCCllClllllllllCllllllllllolllClllllllCllloluollllollCloolllllCllllllllopoooolllolllplollllllolollCllollolllolCloollllllllCllllllClllollClCllllllCCClClCCCllllllCCCCCCllCClyCCCllCCC>??ll?>CC>???????CC??l?C?>??>CC?CC>AC?AC?>>=>>>>?>>A>>>>>>=>>>===>>==>>>=>==>====>=====x   py75555755855555557557555775557555557555555557575555756755685555557755557555555555555557555555557555555555555555555557555555555555555555575555555555755655555555557555555557555555555555575575555555555555555555555757557755555555755555555555555755555576555555555555557555555555557775555775555555555575555585555555565555555655555565555555557555555555555555555577765575555565555587555555755555755555555555755555555555555555555555555555555556555555556555555557555557557575575557555555555655755555775655555555555555555557557555555575557655555555557655555555555555555775555555}CCCCC?CCCClCllClC?lCClCllCllCllllllClCCClCClClllllCllllllllolllllllollllololCoollllolllClllllololoollolllllllolllllllollloolllllllllllllllolllllCllllollllCllllllollllCloCCllllCllllllCCllCllCCCllCllCCllCCCylC?CCCClC?ClCCClC?C????CC?C?A?C???>>>??AA??>?>>??>>>>>?>>>>>>>>>>>>>=>>=>>===>>==>=====>===>=>A  vy555577555555555555555555565555755575555555556555555557555555775555555555575556557555555575755555555555557555755555555557775585555555555577555557555655555555557755755555555555755555555657555555765555555555555555555855575555555555555555555555555558555755555757557557555555555555555555555555555556755557578755555575755556555755555555555565575557557755555555555555555575755755555555755555555555555755555675557555555555555557575555555756555556755555555557558557558555556555875555555555556555555555555665555557555556555555555555555555555555555555555555555555555555555555657555555555555655555555CCCCCCClC?CllllCCClCClCllClCllColllClCClllCllllllllClllllllolllllllollllollllullllllllollllllllololllolllolllpolllllloollllollllllllollllllllollllllllllllllllllllllolCClCClllllCllllll?llllCCllllllClCClllll{CCCCCllCCCCClCCCC?CCC?CC??C?>????A>A????????>>>?>>?>>>>>?>>>>>==>A>>>>===>=>>====>===>======= vy5555555555557655555555555555655555555555556575557655555755555555855557555555555555555555575577575557555555555555555555555555557555555555555575555555555575555555555555557555555555755556555555555555555555555557555557555555555565555555555555555555555575555555555555555555555555655555755758jj75555555555657655585655555575557555555555555555555655565555555555555555555555555555557555555555655555555555555555555555555555555555555555555557575555555555555555755555555755556575755555575755755555555555755555555557557855555555555558555865555555775555555555556555575555557855555555|C?CCllC?CCllCCllCllllCClCCllllCllllllllClllCllCCllllllllllllpoollllllllllllllulollllllloolllllllllloollllolloollllllllollllllpolollllllllllllllllooollllloollllllCClpllllllllllllllllllClllllllllCllCllCCCCClutCCClCC?lC?lC>>CCCC??CCC??CCC??C?C??C?CCC>>>>>>>>??>>>=?>>>>>>>>=>>>=?A=>A===>=>==>==>======B  py555555555555555555555555555555555555555555555555555555555555555555555555555555555655555555555575575575555757575555555575555555555555555755555555555555555557555555565555555555755555555555555555555555555555555757755555755555755555755555558755575557575575555555555555575555555555558Cw{j555555555555575555555556555555555555755575555555555555555555775555755555555555755555555655555555555555555555555555555555575555575585555555555555555555575555555755555555557875555755555555555555755557555755555755555555555555555555555755555555555555555557555pClCCCCC?ClCCCCCCllCCClllCllCllCCllllllllllllllllllllllllllollllllollopllllllluoolllllolllolCloolllollllolololllllpplloopllollllllolllllllllllolllllllllllllllllloolllloolllClllllolCllllllCllllCCClllCllllCCllllC??CAClCClCCCllCC??lCCCCCl?CCCCCC>>>?C??>>C?C?>CC?>=>>=>>AC?>=>>=>>>>>>=>=>===>=>==>===== py5555755555555555555755555555555557555555555555555555555555555575555755555555555555557555555555565555555555555555555555557555755555555555555555555555757555555575555555555755555755555575555555555555575555555555575555555555755555557555555555555555555555555555555755555558l{{j755555755555555555555555557555575557555555555555555555555755555557755555555555575555555555555555557555555555755575755555555555555555555555555555555557555555555555555575555755555555555555557555575555555555555555555555555555555555555555555555755|lC?ClC?CClCC?ClClllllClllCCllllllllllCllCllClollooollllllllllllllllllolllllooolllllolllllooloolllllloolllllolllolpooollollloolooolllloollllolloloolllllllllloolllolllllllllllllClollllllllCllllllCCllClCCllllluyCllCCCClC?CClCCClCCCCCC>CCl????>A????C>?C?????>>??A>A?A>?>>A>??>>>>=>>>>>>===>>=======>==_    py55555555755555555555755555555555555555755555555555555555555575775556555555555555775555555555555555555555555555757755555557555575555655555555555555555555575555555555555555555555755555555555557555555557555555555555755555555555555555555555557555555555>jC85555555555555555555655557555555555757555555557555555755575555555555555557555555555555555555555555555557555555555557755555555575555555555555555555555555555755555555557555555555555555555555555555555555575555555555557555555555555555555555sl?CllCCCCCCCCClCCllllCClllClllllllllCllllClllllloooolllllllllllllllllllllllolullolllllloolpollloollooollollloolllooollllolloollplllloopllloollolopllllllllloooollClllolllllllllClllllllllllllllllCCClCCClllCCllylCllllCClCCCCC?CllC?CCC>CCCCC??>>?C??????C??>A>>>>>?>??>>>>=>??>>A>=>==>=>===A>====>==>=A vy5555555555555555555555555555555555555557555755555555555755555555575555555575555555555555575555555557655557555555655555555555555557555555555555555555555555755555755555557555555555555555555555555555555555555555575555555555555555575555555555555555557555555588755555555555557555555555775575555555575555555555555555557555555555755555555555555555555555555555555555557555555555555555555575555555555555555555575555555557555557555555555755555555555555755575555575775555555555555755557755sCC?CllllllClllCCCCllCCCllClllCllllllCClllllllClllllloolllllllllllllooloolllllollpooooppoooolloopollollllpplloolllloollololllooopllllllllllllllolllloolllllllllolollopollllllllolllClCllllClllCCllllllllllClCClCClCC?ClCllCCCC??C?ClllCCCCCCCCC?CCC?>??>>>>>?>>>>>>>>>>>>>>>>>>C>>>>==?>==>>>==>>=>A>===   py5555575555555755555555555555555557555555555555555575555555557555555565555555555555555555555555555555555555555555575555555555555555555555575555555555555555555555755755575555555557555555555555555557555555555575755555555755555755755555557555555555555555555555555555555575555555555555555555555555755555557757555555555555557555555555555555555555575755555555555555555555555555555555555555555555575555555555555575555555555555555555555555575555555775555555555555555555557755555555555655555555555557557555557slCCCCCClCCCCllClllllCClllllllollllllCClllllllllllllllloloopolllllllollllollloullllllooolllolllloolloooooopllololoooolooopooolllooolloollooppllollllloopollolllllllllollloolllllllllllllllllllllClllllClllllllllltylCCllCCCCC?CC>CC??????CC??C???>>A>ACCCC?CClCC?A?>>?>>>>>>>C>>?>>=>>>>==>A>>>========>t  py5555557555565575575555555555555555555555555555555555555555557555555555555557555555555755557555555755555555555555555555555555555555555555555555555575555557555555555555555555555555555555555555555555555555555555555555555575555555555577555575555555555557558555555775555555555555555555555555557555555555555555555555555555555555555555555555555555575555555555555555755555555555555555555555555557555555557755655555555575555555555565555555555555555755555555555555555755555555555555755555555555557555555555555555qCCllCCCCllClllllllllllClllllloClllllollllClolllllolllloloooplllloloolllllolloullllllllllllooolooollloopoloolpoooooololoooooolooooollololopollopllllllllllllllooollllpllllollllllllollllllllllllClllllllCCllClllll{tClCClCCllCCCCCC??CC??C???CC???C?A??C????>?C????>>C??>>>>>C>>>>>A>>>=>>>>>>>==>>==>=>vy57555555555555557555555555755555555555555555555555555755555555555555555555555555555555555575757575555555555555555555555557555555555555555555555555555555575555555555555555555555555555555555755555555555555575555557555755555575555555755555575555555555755555555555555555555555555555755555555555555555555555555555555755555555555555555557555555555555555557555575555555555555755575755555557555555555555555555557555555557555555555555555555555557557755555575555555555555555555555555555555555555|CCCllCCClllllCCllllllClllClllllllCllolllllllllllolllllllllloolloololllllloollulllooolllolloooloollolopoolooopooooooolllplllllppoolooopllooolopoollloolloolllllooolllllooolllloolllolllllllCClllllllllllCCCClllllllllCClClCCllCClC?CCCl???????CCC?CC??????>>>A>?CCA>CC?>?>>>?>>>???>=>=?A======>>>>=>=  py555555555755555555555555575755555555555555555555755555555555575555555555555555555557555555755575555555555555555555555555557555555555555555575575555555555555555555555555555555555555555555555555575557755555555555555555555555555557575555555755555555555555555555555555555555557555575555555555555555555555555555557555555555557555555555555555555575555577555555555555555555555555555555555755555555555555555555555555555555555555555555555555555555555555775555555555555555555555555555755555555555555555slCCClCllllClllClllClllllllllllollClllloloollllllollolllllllollllllolooooooooluooloppollloooloolllooooooooooooololloolooooolollllllloppolllpooolopolppoolloplllollloolllCollollllloollllllllllllllllllClllllllClClCuyCClCCllCCCCClClCCll?CCCC?CllC>?CCClCCC?>?C??C?>>??>>>>>>>>>A>>>>?>>A>====>=======B ! oy555555555555555555575555555555555555555555555555555555755555555555555555555555555555575755555557577555555555555555555555575555555555555555555555575555555555555755555555755555555555555555555557755555555555555555555555755557775555555555555555555555555555557555575555555555555555555555555575555555555555555555775557555555555555555555555555555555555755555757555555555555555555555555555555555555555555555555755555555555555555575555555555555575555555555755555555555555555555555555555555555555555575|lClCllCllCClllCCllllllllllCllllllllllollllollolllllollloolloollllooolllllloooupollooooolooooopoooplllopoloooloollooolllloooooolooolllolloloolllooplpploolloololllllolpololllloollllllloloolllolllllllllllClllCllCClytClCCllllClClCC?lCClCCl?CCC?CC?CCCCC???CC>>??AC?>?>>?>AA>>>?>>>>>>A>>>=?>>==>A>=> py55555555555555555555555555555555555555555555555575555555557555555575775555555555555575555555555555555555555555555575555555555555555555557555555555555555555557555555555575555755555555555555555555555557555555555555755555755555555555555555555555555575555555555555555575555555555555555755775555555555555755555575555555555755755555555555555555555555555555555555775555555755557555555575555555555575555555555755555555555557555555555555557555|lllClCClllCllCCllllCClllllllllCllllllllllloolllllllolloooollooloooollllllloooulloooloooloopooooopoolopoolooolpolppoloooloooploolooolllopploollloollooollolloooloollololloolloolllllllllloolllolllllllllllCllllllC?lllllCllClCllCCClCC?lCCCC??C?CCCCCCCC?>?CC?>?CCC>A??>CAA?>?A>>>>>>>>>>>>A>=>=>>>=x py55555555555555555555555555555555555555555575555555555555555575555555555575555555555555555555555555555775555555555555555755555555555555555555555575555555555755755555555555557555555555555755555557555555557555555555555555775555555755555575555555555555555755555555555555557555557555555755557557575555575557555555575557555557555555555555755575575555555555555555775555555555555555555555555557555575555557755575755555555557555555557555575555555555555755555555755sCCClllllllllCCllCCllCllllClllllllllllollllllllloollllopollollooooooollopooooovllopolopolooolooooollooolllpooopolpooooppoppoolloplopppoopoooooolopoollpoloooooploploloooollllollolllllollClllllllllllllllllllllllClCloyllCCCClCCCClllCCC?CClC??CCC?CC?CCCC?>?lC?>?C?>??CCCA>>>??>?>>>>>=??>=>>=>>==>C oy555555557575555555555555555555555755555555555575555555755555555557555555557555755555555555555555755555555555555755555555555555555555555555555555555555555555557555555555555755555555557555555555555555555555555555555555555575555555575755555555755555555555555555555555555555555555555755555557555557557555555557555555555755555557575555557575555555555555555555555555555555757555555555555555555555575555555555555557555555555555555755577755557555557755555555555775555555555555555557|CCClllllllCCloollllCllllllllllloolllllolllolllololloooolllllllllllpoooppollllupllopoolopppollopoollpooolovoloooopppoloopopolloopoloooooloppooploolooopollollopllollooloplloolllooollooooooplllllCllllllolllllllllllllulCllllCllCCCClC?CC??ClCCCCCCC?>C??CC>?C???>?C?>>??>??>>??>>>>>>>=>>>?>A>>>==>   py5555555555555557555555557755575555557755555555755557555555555555555555755555557555555555555555555555555555575555557557555555555755555555555555555557555755755555555755755555557775555555555775555555555555575555555555555575555757555555555555755555555555555755555555555557555555555555555555575555557557555555555555555555555557555555555575575555555555755555555555555555555555555555555555555555755555755555555555555755555555555555555555555575555557555575555555555555555qCllllllllllllllllllClllClollllllllloollllllllloopololllllloloooolllllooooopoluooooloooooooollopoopooopooovolooooooooloooooooooooooopoooloooloopooooooppolplolpooolooollpollooolloolllllolllllllllollllllllllllllollllllllllCllCCCCClCClCCClCC??ClC?C?C??CCC?CCC???????C>AC?>A>>>A?A>>>>A?>=AA=>>=] vy55555555555555557755555555775557555575555555555555555555555557555575555555555555555555555555555555555555555555555555555555555575555555555555555755555555555555555555555755555555555555555555555555555555555555577555555555557555555555555555555555555557555555755555555555555755555757555575555555755555555555555555555555555555755555557555555555555555555555555555555555555555555555555555555755555555555575555555555555555555557555555555555575555757|lllClClllllllllllllllllClooloolllllololllollCollpoollllllooopoloooolloooooooovolpoloooolooooopolovoopoooopoolpolloopolopoooppoloooopoooooolloplooooooopooplooooooooollloolllloollllloolllllolooloplllllllllllClllllllloylllCClllCCCCllCCCCCCCCC??CCCCCCC?CCC?CCCCC??CCCC>C?A?>>?C?>?>>?>>?A=>A>>>A py5555555555555555575555555555555555555555555555555555555555557555555555555555555555555555555555555555555555555575555555555555575555555555555555555555555555555555555555555555755575555555555575555555555555555555555775555555555555555555555555575557555555555555755555555555555555555557555555555555555575555755755555555555555555575555555555555555555555557555555555555555555555555555555555575555555575555557755555555555555555555555555555555555555555555555755575555555555slllCllllllllllllCCllollllllllllllloolooollolllllllolollllllooolopooollooooloouooooopolllooovpoloppooppoolppppvooopvpooppoppplloppoopppoopopooollooloolloppllpoolloooloollllllooollloooollllloololloollllllllllllCllllllvtCCCCClolllCllCCCC?CCllCCC????lCCC?CC?>>CC?CCC???C>>??>>CC>>>>A>=>>>=>?=>z   py555555555555555555555557755557555555555557555755557555555555555555575555557555555555555555555555555555555555555577555555555755555555555555755555555555555555555755555555555555555555555575555555555555555555555555555555755555555555555555555555555555555555555555555555555557555555555555555555555555555755555555755755555555555555555755555555555555555755555555555555555555555555555555555555555575755555555555555575555555557575555555555555555555555555555555555555555555555555sllCCllllCCClClllllllClllllllllollloollooloopooooooollopooollooopooooooplopolouoolooopoooppopploppopoopopppoolvppoppoooloooooopooolopoolooopooplooolooolooollpololllloolllooooololoooollllllllolooloollllllllllllllllllCllClllllCCCllllCllllClCllCCClCCC??>?CC?CCC?CC>>>C?>?CC?AC?>>>>??>>>>>>>=t  py5555555555555555555555555555555755555555555555555555555555555555555555555555555555575555555555555555555555555555555555555555555555555557555555555755555555555555555555755555555555555555557555555755555557555557555555555555555555555555575555555555555555555557555555555555555555555555555555575555555555555555555555755555555555555555555555555555555555555555555555555557555577555755575555555555555555575555555555555555555555575555555555555555557555555555555vCllllllllllllllllllllllllllllloolollolllloolppoloolollolololooopooplloolopooovppooolpppoopoloovooopoopoppooolvpoopppoolooooppoopoloooplloopooopoopooopoooloooooooooopoooooopoollollloollooolllllllllllllllllllllllCllllllylllllClClllllClllCClClC>CCCCCC??CCC?CC?C?>>>??C??>?>>>A>?A>>>>>A>=>>>> py55555555555555555555555555555555555575757757555555755555755555555555555555555557555555575555555555755555555555555555555555555557555555557555555555555557555555557555555555555555755555755575557555555555555555555555555555755555555555555555555555555555555555557575555555575555755755575557555557575575555555755555555557555555555555555555555555555555555555555557555555555755555555555755555555555555555555555555555555555555575555555555|lllllllllllollllllCollollolloloolllllollololopollooolllooopollooooolloloppopouoppooloppooooopopooooooppoopoooopopopploopoopvpoooppolppoloooooooopppoopoooolpopoopopppopppooplooollllloloopplllolllllllllllllllllllllllllluulCllllllClCCCll?ClCClCCClC?CCCCCC?CC???C?>>?C???C>A>>>?C?>>>>?CA=A>>] py555555755555555555555555555555555555555555777555555577555555555555555555555555555557555555555555555555555555557555755555555555555555555555555555555555555555555555557555755555555555555555555555557555555555555555555555755555555575555555555555555555555555555555557555555555555755555555555555555555555555555555555555555555555555555555555555555555555555555555555575555555575755555555555555555555555555555sllllllClllCllllllCCllloololooCllpoolloolollllllopooooppplppollllllppooooopolouoooppoopvppppppppppooloopolpvppooppooooovvooooooppppoopppooloooppoooooopopvplopolopoooolpolllollpooollloolllolooplllloolloololllllllllolCllC{CCCClCllClClCClCCC?CCCllCCCC??????CCCC>?CC??C?>?C?CCCC?>??>>>?A>>>>A oy5755555555555555557555555555555557755555555557555555555555555555555557555755555555557555555555555555555555555555755555755555555555557755555755555755555555555555575555555555555555555555557555555557557555555555575555555755555555555555555555575555555555555555555555555555555555555555555755555555555555555555555555555555555575555555555575555555555555555555555555755555555555555555557555555555555555|llllCCllllCllllllolollollolllllloloolllloooolllooooppooollooooooooplopppoopolvolpppppooopppolooppppppopooppppoooppooppppoppopppppppppolppppooppololoppooppooooooololpoooloopollopppolooloolllollllllooloollloolllollollllllyllClCCClClClllCCCCllCCCC?lCClClCCCCC?>??>?C??CCA>?C??>??A??>>A>?>>  oy55555555555555557555555555555577557755575555755555555555555555555557755555555555757575555555557555555555555555555555555555555555555555555555555555755555555555555555555555555555555775555557555555557555555755555555555555557557755755555555555555555555555555555755555755555555575555555575755555555555755555555555557555555555555555555555557555555557555555555555555555555555slllllllllllollllllloollllolllooooloooolopoloooollooooopoolopppopolooooppplooovppoopppooooppooooopoppoopppopooppoppoopoppoooppppppooppoooppvooopoopoppoooooppplpooloppoloooppooloooopooolooooolloolllloolllllllllllllollooClutlClllCllllClllCCllCClCCCCCClClCC??CC??CC???CCC?AC?>A?C?CC>>>>>?>tpy557555555555555555557555577555555555557555555555555555555555555555555555555555757555755557555555755575555555555555555555555555755555555555555555555555555555555555555555555555555555555555555555555755557555555555555755555555555555555555555555555555555555555555555555555555555555557555575555555555555555555555555555557755575555555555555555555555555555575555557555555555555555555555555555555555555|CllllllllllplllllllllllloolllllooollpooopolooooolopoloppooopppopoloooolopoooovpooopoppooppoopppopopoloppplpolpppoppopooppooppooppoopppoppppppopppopppollpppppopppoppolopoopopoopllloppoolloooolopolllllllollllllllllllloolllylllllllClClClllCCCCCC?CClCC?>?CCC??CCC?Cl??CCCC???>?CCC???>>??>A vy55555555555555755555555555555555555555555575555555555555557755555555555555575755555555555555555555555555557555555555555555555555555555555755555555755555555555555555555555555555555575555555555555577555555555555555555557555555555555555557555555555555557555555555555555555555555555555555555555555555555555555555555555555555555555555555555555575555555775555555555555555555555555555olllollllllollllllolllllllopllllloollooooooooooplololloplooooloppopoooooopppluoppppppoolpvpoppvppopoppppvpppppopopppppppopoopppppoooopppolppppppplpppppoppopllopplopolpplllloolppoloolopppopoolllllpplllllllllllllooollllClllyllllllolllllCllllClllCClCC?ClCllCClC??CCC?C?????>?C>??>??>>>?=x py55555555555555555555555555557555555555555555555555555555555555555555555555555555555555555555555555555555755555555555555555555557555555555557555555555555555555557555555555557555555555555555555555555555555555555555555555555555555555575555555555555555755555555555555555555555555555555575555575555555555555555555755555557555755555555555755555555555555555555555555555555557555555555|llllllllllllllolllllllClopooolololooopolloooolppoooopolpopplooopopppooooppoooupvpooopppooopoopppoovppopppooppoppppppppppopppoppooopppppoopppooopoooppopolpoooppopllopooppppppppooooloolopoloollooolpploollooolppllllllloollllullllCClllllClClCCClClCllCCCCCCClCCC?ClCCCCC?A>?C?>CC>?A>?C???C   py5555555555555755555555755557555555557555555555555555555755555555555575555555555555755555555555555575555555555555755555555555555575555555555555555557555555555555555555555557555555555555555555555555555555555557575555555555555555555755555555555555555575575555555555555555555555555555555555555555555555555555555555555555555555555557555575555555555555555555555575555555555555555755555555555vlllllllllllllolllololloloolooloooloooooooloolpolppooooooppooooppooppoooppppppvpppppoppppoopppopppovvpopooopvpopppppoppppopppppvooopppppppppooooppppppoooooooppoopooovoooooppoppoooooppllooollllopolooollllopolloplllllllolllllllllllllllClClCCCCCllllCllC?CClCCCAClC?CCC??C?AA?CC?CCA???>?  py55555555575555555555775555755755555755755777575575575555555555577555555555555555555555555555555555555575555555555555555555555555555555555755555555555555555555555555755555555555555555555555575555555555555555555555555555755555555555555555555555555555555555555555555555555557555555555555555555555555555555555755555575555555555557575555555555slllloolllloolllloolllloooolollopooooolloolloopolpoooopplpoopvpoolopopppplovvpwoopppoppppopvpppppvppppopoppvvpoopooooooovpoppppvvpppppppvvppppppvpppppoppppppoooppppooopooloploopooloppoooololoooolllloolllllllllollllolllllolllyllllllllllllClllCClCClCllCCC????>???CAClC??l?>>?C?>??>?>>?t  oy55555555555555555555555775575575557555557575555575577755555555555555555755775555575555555557555555557555755577755555575555555555555555555555555577555555555575555555555555775555555555575555575555555555555755755555555555555555555555555555575555575555555555555555555555555555555555555555555575555555555555557555555555555557555555555555555555555555555555sllllooopolollloollloooloollopoollopllllopooooloopooooopooopoopppoopppopppopopvppppvpppppvvpoopvpplop|poppoppoopvpppppppppppopppvpvvpppoppoppppopooppoopopppoopppooppppoopoopoloooololopoollopolllllolloooplloppllllllolllollllluullCllllClCClClllCClCllCCClCCllCCCCCC??CCCCCCCCCCCA>?CC?>A oy55555555575555555557575575755575775555555555555555555555555555555575575555555555555557555555755555555555755555555575555755555555575555555555555555555555555555555555555555555555555555555555555555755555555555555555555555555555575775555555555575555555555555555555555555555555555555555555555555555555555555555755555555555555555555555755755555555555555555555577575}loollllooolllllolooooollllolooooopooooopolpvpooooppooooooppppppppppooppppopoovpppppppoppppvvooppoopvvpppopppoppppppppopovpppppppoopvpoppoopooppvpoppppvoopppopoopoopppppopoooooppololooppooloooolopoopollollooolllllloololllolllooClllCllllllCClllClCCCCCCCClCCCC?CClCCC???C?CCCCC>>???>y  py555555555555555555555555775555557755755555575575555775555555555577575555555555557575555555555555555555555555555555555555555555555555555755555755555555555555555575555555555555555755555555555555555555775555555755555555575555555555555555555555555555555755555555555555575555755555555555575555555555555555555555555555555555555555555555555555555557sloolllllllllllollooooollooolloooollooppolopopppoopppopolpppppoppppooopppppoopvppvpovpppopp|vppppopvppvvppovvovpppppppppoppppvpopppppppppppvpoopppoppvppppppppopppooopoppooolppppppoooooppppooolooooooppolloollloolllpolollllpllloulClllClllllllCClCCClCCC?ClClll?CCC?ClC????C?????CC>>??C   py55555555555555555555555557575755557555775555555555555555555575755555575555755775555555555555555555755555755555555555555555555755555555555555555555555555555555555755555555557557555755555555575555555555755555555555555555555555555557555555555555555575555555755575555755555555555555557575555755555555555555575555555555555555555555555555557555|lllolllllllolllollllloooooloooolollllooloolooooooopppppppopollopppopvppooppppvvppvvvppvooopp|vppppppopppppppovpplopvpppppppppppppvpppoppvpppppoopooppopopploppppppppoppvwoolppooloppvpppoloppplopolllooooopplllloloooooolllllllllyllllllllllllllCllCClCCC?CllCCCllCCC??C?>?Cl??>>?????CC{ vy7555555575555555555777555757577555555555555555555575575577555555555555555555555575555555555555555555555555555555555555555555555555555755555555755557557575755555555555555555555555555555555555555555555555555555755755555575555755555555555555557555555555575555575555555555555555555555sollllllollllllopolpoolooooooplloppoooppooopoppolopopopvpopppppppooppppppppppouvpoppppppoppvvpppppoppppppppppppvvppppppppppppppopppopppppppopvvpppopvpoppppopppooopppoppopppppppplopoppplopolpoloopooopooollloplopllollllllllCoolll{loollllCClllllllllllllClClCCllCllCCCCCCCCCC??C??A>CCC    py5555555755575575755557755555755575555777555555557755555775555555555575555755555755555555555557555555555555555555555555555555557555555555555555555555555555555555555575555555555555555555555555757555755555555555555555555555555555555555555555555555555555|olllllloollollloolpoolpooloopopooopoopoopooppooooopplopoppoppppppopppvppppvpovppppoopvpvpppppppppvppppvvppppvpvvppvvpppppppvppppppvppppppoppppvppoppppopppppopppopoppvpolopppoopoppoopplppoooooooooooplooolloolopollllllllllloolllotoolloolllllllClCllCllCClCCCClCCCCCCCCCCCC??CC??C>Cl   py575555555555777755555575755755555557755755555557555555575555577555555555555555555555555555555555557555577555555775555555555557555555555555555555575755555555555555555555555555555555555555555555755555555555575555555555555555555575555555555557575555555555qolloolllllllllllooololooolooopppooooopooopoopoppoopppooopppppoppppvpvvpopppppvpppppoo|vpppppppppppppvpvvoppv|opppppvppvvpovwvpoppppvpppppppppoppppppppopppppppppppoopvpoopppoppppppoooppppppooopppollloloolopollpolllloolooooooolllyoollllllllllllCCllClCCCClCCClCCCCCCCCCCC??CCC?C???u   py555555755555555555555757555555755755555575755755555755555557555555555555555555575555555555555555555575555555557555555555555555555555555555555555555555555555555555555555555555555555555555557755555575555555555555557555555555555555555557555557555555755555555555555555555755555555555557555qoololllopolloolololloopppppooploopppovpppppoppppppvpppppoovppoopppppppppppppvvppppvvvppppppppppppopvvpppopppvpovwppppppww|pvppvwwpppppppov|vppppppppopppvpppppppoppppooppoopoooooopppppplopoopoooploolooopooolllooolllollllllloollloylClllClolClllllCClClolCCCC?CClCCC?Cl??>??CC?C?C?A  oy55555555555555777757557555755775555555555577757555555755557575555555755755555557557555755755555557555555557755555555557555555555555555555757555555555555555555555555555555555555755555555555555555555555555555555555555555557555555555555557755555555555755555555555|ollooloolllooolooolopopooollopoopooolooppooopoopppppppovppvpppo|ppoooopvpppvpvvppppvpppppvvpppvvppvvpppvppppppvpvpppvvpppppvoopvpp|vvppvpppppppppppppvpvvoppoppopvpooopppoopoovppoovpoovpoolopppoooopopolopppolopoooolloolllollolollulCllllllllllllllllClCCCllCClCllCCCCCCCCCCCl??CC?u  oy5555557555557777557575777575777577555555575555575555555755557555555755555555555555555755555555555555555755555555555575555755555555557555557555555575557555555555555555575555555555555555555555555555555555555555755755555555555555555555555555555755555555555555555555555555775557555555555555555555557sllolollploooooolooooopolopolopooooooopooppolpoopoopppoovppppppoppppoopvppppppwvppppppppppp|pppvvppvppvvvpvppovvpvpppvvpppppvppo|ppvwvppvvppvppvqppppppppppppppppp|poovpppoopppppooopoopppppoooppoooopopoloopoooooooooooololllooloolllllllollllllClllClllClllCCllCCCCCCCCCCCCCCC?A?CC   py57555557575577555555577777757555575757775577575555575557555757555555557555555755555555555555755555555555555555775575755555557555775555755555555555577555555555555555555575757555555557757555557555575555555555557555557555557555575555555555555555555555555555555}oolllllpppoolopolllpoopooppopvopppopvppopppopoppooopoopvpoooopppppppovvpvppopwooppvpvvovppvvpppppppppvwvpv|vpppoppvpvppppp||vvpvvpppppp|ppp|vppppoppppoop|vvpppvvppppvppppppvppooooloppoooppppppolopoloooooooopoolooolpppoolloololllooullllolloolClllClllClllCCllCCCCCllCCC?lC??C?>C{    vy5555555555557557775557757577775755555557577575555755777555555555755555755555555557555555555555575555555555555555555555555757555555555555575555555557555555555555557575755555557555557555557555555575555555555555555555555555575555555555557555555555555755555555555555555555557555555qlllllololllopppppoloolppppopopoooplooopvvpoopppopppppvppppvvpp|ppvwvpvpppvvppvwvp|wvvvpwvvvpopp|w|vppp|vpovvp||vvpppppvpp||pppvvppvppppp|vppppvvpppvvppvppppvppopoovvpppopoppoovvppppppvpoolpoolooppoloppooollopolooolllllolopollollll{oCllollCllolCCClClClCllCCCllCC????llCCCC?CCCC oy55555555755577577557577575577577757777777755557775577555555755555575575577555555555555555555555555555555555555575575555555555555555557775555555555555575555555555555555555555555555555555555555555557755755555555555555555555555775555555555575555575555555555555555555555555555555555555|ololooopooolololpvlppopoppoooloopoopopppoooppppppppplppppppppp|vppvovvppppvppvvpppvvppppppvppppvppppppvvvvvpppvvwpvvvvpvpppvwvpvpvvpvvvppppvvppppvpppp|vpoppppppvpvppopvpppvoppppppppoppppopopoopppppppppooopooopololoolllllooolooollll{ollllolllllolllllllllCllClClllllCClC?Cl?CCCzpy5555555555557577775757757777555775775577557577555555755575775555555555555555575577555555775555555755555575555575557555577555555555555555555555555555555555555555555555555575555555555555555555555555555555555555555575755555577555555555555557555755757575555555555555557555755557slllllooooooooolloplppppoolooplpppooppppooooppoovopppopppppppppvvpppppppppppppvpppvvppppppppppvpvppppvpvppvvppvppvpv||pp|ppp|vppvpppvvvwvpppv|vpppvppppvpvpppppppppvppppvvovvppppoppppoopppppoppoopppopooppoopoooppooloollooloollllopllluuollllllCllolllllllllllllCllCCllCCCC?ClCCCl py5755757555555557757777$77777755777755777775555555557755555577557557555575555575555555555555555555755555575575557575555555555555555555755555555555557555555575555557575555555555555555555555555555555555555555755555555555555555575555555555555555555555555555555555555555|lloolopooopooppolloloppoppppvpvvoovppvppopppppppopvvvvvpoppovoopppvw|pvppppvv}vvvppppp||||vvvwpvp||vpv|povvvpppvppvpppp|ppvvvvpvppppp||pppvppppvpppp|vpvvppvvvpvvppvpopopopwvppvpopvpvp||ppppoopppppopooppppololoppoopoololopoooollllolooollllllllllClCCClCCCCCl?ClClCCCCC?ClCCCC  !px5555555555557555777777777775555775=7777575777555757577577575555555555555757555557575755555755555557575555555555555555555555555555555555555575557555557555555555555555555555575555555557555555557555555555755555755555sopvpoloooooooolopvvooopoopoooppoolpplpppp|popopoovppppppvv|vvwppoppppvvpovvpvwppp|w|vvppppppvw|pv|vvpvvvp|ppvvpvppppp||vp||pvppvpv|vvppppp|pp||pv|wvp||pppvpppoppppvvpppppopooopvvppopppooppppppolpppolppopoopppopolovollpploolllopoolopoooolllllllllllllCllllllllllCCClCCCCCClCCt    oy5575555555757777755777757755777777575755777555555755575755555755557775555555555555555555755555555555555555555555555555555555555555555555555575555555555557555575555555555555555555555555555755555555555555757557sloollloooolpoopooooppppoovpoovopvpopo|opvppovvpvppvoppppvvpppvpppppppp|vpppppvv|vvvpvvpppvvpv|vvvvppppvvvpvvpwvvvvvvpvv|pw|ppvvpvvv|vvvvppvvppvvvvvpppppppvppvpp|vppvpppvpvpppovpppopppvppppopppoppoopopppooopooopooopooopoloolllooololol{lllllllllllllllCllCCllllllllCClCClCCC?lpy555555555555555555557775775777777777575557755757755575575555555555757555555557555555555555555555557555555575555555555555555555555555555555575555577575555557555555755555555555555555557555555555555555555555555555555755555555|loollopooolpolopoopppppoppppppppvpppppppppppvvvvpopppppvvvpvppvvvvvvppvvpp|vpvvvvvpvvvpvvvppppvv|vppvoqvvvppppvv||wvvvvppv|vvvvpppvvpvvvppvvvvvppvpppvppppvpppvpvvppvpppvpvppppvvpoppppvpvoooopvppppvppppplopoolopooooopoloolooloooololllouloolClllllllllllllCllllllCCCCCllClCC?t py5555557555755577777775777577777755755775777577775557777555557555555755557555557555755555555555555555555555555555555555555555555555555555555555555555555755555555557555555555555555555555555555555555555555555555555}polooooooopppopvppploopppoopoloppvpoopvpoppopoppvvpopoppoov|ppppppvppvppppvpvvppppv}w||vvvppwvpv|w|w|pvp|v|}||ppppvppvp|vpppvvvvppppppv||ppvvpvpppppv|vvvwvvvpv|ppvpooppvvv|pppppvpoppvpppp|pppppooppolopppvpolppvoopooolloppopoolllllopppylllllClolllllllllllllC?CllCClCCC??CCC  oy555555555777777757775777777577777777777557557757775555555555555555555755555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555557575757557555555555555555555ӎoooooooolooooooppoolopppppoopopopvpooppplppv|pppopvp|vppvpppppvpppvppvppppv|pwwppp|vpv}vvvpwv|pvvvpppppv}vvvpvw|qvvpp||vpv||vvpv|v|vppppppp||v|pppv|vpppp|ppppvvvvv|v|vpppoppp|povwppopppppppopooopvvpoopoooovpppppollopoooopoopooooloololloooloooollllllolllllloCllCClllllllClt    oy55555555575577775$5777777557557755755555777775555575555575755555557555555555555575555555755555555555575555555555555555555555555555555555555555555755555555555555555555555555755sooooloooooopoopooppopvoppopppppopppppopppvpopvpvpppvvppppvppvppvppvppvvvvpvvpvvvvvvppv|vvvpv||p||p|vvvpv|vvvpvw}pvvvpvvvwv||ppvv|||pvvpvvvvvvv|vvpp||vpppvvvvpvvvpvwvvvpvppppvvpoppwpppvpopppppoopppppoppppoopvpopoooooooloopoopoloplooloolyoolllllllllllllllllllClolCllClllCCly   vx55557555777757777575777755777775757755557775555757557557755555555555555555555555555555555555555555555755555557555555555555555555555555557555555555555555spolopolooopolopppppoopoppplpppppvpppoopppvpopppvppvvppvppwpppv|vpv|pv|pvvp|wpwv||vpvppppv}vppppvppvv|v|wv|}wvvvvvvvvvvv}|vv}vpv|vvvv}|vw}|||ppv}|v|pvwvpppv|vvvp|pppvvpvpppvp|wpopppppvvpopvvvppppvpopppppppoopoopolppooooloplooolloooollpolloollollllCllllllllllllllllllClllCC  py55555555557775775757757775775757755577557755575577577775555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555soooppopvpppplopoooolpolpppoppppppppoppopppvvvvvpppp|wppvvpppppvovvvvv|vppvvv|wvvvvvwvvppvvvv||v}}|}}|ppvvvv|||pvvp|||vvwppvvv}|vv}vppppppppv|ppvwpvppvpv|vppvvpv|pvvwvvpp|vppvvvww}wvwvppvvvvpovpoppppppppolooooopppvpppoppopppollooolllllol{uloolollllllllCCClllCllClllllCClCCl  py555555577755777577575577577777777555575555577555557757557555557555575555555555555555555555555555555555555555755555555555555555555555555555755555555557555555555555555555555|oopoooooooopooppppoopvpppppppppppvpvvpvvpppppppv|vvpvpp|pvwvpvwvpppppvvvp|pvvvv||vvvv|vvvp|vvv|vvvvvpp|v||vvp|vvvvvv|vpvp||vpvvwvv|vvvv|vv||v||vv||wvppvvw|vppvvpvvvwv||vwwvppvvvpvvvvvv|vvvvpp|vvwvvppvpvvpppvvpopppppvoppppoopooopvpoupoololoooloollllCollllllllllCllCCCCllCu    my55555555757775557755577757$7557557777577777775757757555755755757555557555555555755555555557555555555755555555555555555555555555555555555555555555555555555555555555555555555555555|oppoopppolooppooppoppppvppppppppovvvpppvppvvppvvpv|vvppvvv||pp|vvvppppvvvppvvwwv|vvpvv|vvpwvv}vvv|pv|v|v|}vvpqv|pvvvvvv|||vvvvvvv||pv|wv|wv}vvwwvv}wvvvvvv}wvpwwvvvvwvwwvvvvvvwvvvvpvvwvvvvvvvpwwvvwvvvvvvwvpvvvvvvvvpvpppvppoovppooppvppoooo{olloooollllloollllllllCCllCCllllCy  oy555555557775555555755775755575777775=777775777577557777775777577557775555555555575555555555555555555555555555555555555555555555555575555555555555555555555575555555557555555555555555555555~oppooppoopppvvpppppvppoppppppvppovppppopvvvpvoppoppvvpvvpvvvpppp}|v||ppvwv||wwpvv||v}||pp|wv||pw}||w}|v|pvv|vpvvpvw}|v|vvv|www|vvvwvvw}wwvwww|w}wwww}wvvvvvwvv}}w}vvvvw}wvvvv}}vwwvvvvwwvvvvvvvvwvvv}wvvvwvvpvuvvvvvpppupppououvouopopplpuovpvpoolllllooolololllllllllllllClCll  vy555555557757775577577757777755$7777757777775577557775577555555555555555555555555557555555555555555555555555555755555555555555555555555575555555555555555555}oooolloopopoopppoppoppoooppppppppvvv|v|pvpppppvvpv|ppp|vppp|||vvppv}||||vpvppvp|pp|||ww|vvv||}vw|pvvvvvwppvw}|}}|vvwwv|vwwvvvw}wvw}wwwwwwwwvwvvvwwv}wwvvw}}w}w}wv}}}wvwwwww}}wvvwwvv}wvwwvvvvwvvvvvwvvvvvwvwvvvwvuvvvvvvwvvvvvpvvvvvuppopouuuuuoopvpploooollllllllllllllClCClll !py55555557757557577575577777777577577775577555775775757575555555555555555555555555555555555575755555555555555555555575555sooppooopoopoppooppvpovppvpoppvpppvppvppppvpppvpppvwvpvvvvvpv|}|vvv|vvvvvvp|||vv}vvvwvvpw|vpw|vwvpv}|v}|v|v|||vw|}w|w}w|wvvw}}}wwww}}wwww}}vwwwww}}vw}}}ww}}}}vw}}www}wwvwwwwwwwv}wwwwwwwwwwvvwvwwvvvvvvvvvvwvwwwwvvvvvvvvvvvvvvvvvvuuvwupuvopuyvouvpoluoolloopllouolllllllllllC   py555557755757775775555777557757777777757777775577775755555555555555555555555555775555555555555555555555555555557555}ooppoppoopvpppoopvppp|vpvvpppppppppppvpppwpp|vppvpv}pvpvvv|p|||v||vpvvppvvv|vvv|wvvvpvvww||||vvv}vww|www}v}wwvvv}}}w}}w}vwww}}w}ww}}ww}wwwww}}ww}}w}w}w}wwwww}}ww}}}}vwwwwwwww}wvwww}wwwwwvvwwvvvvvwvvvvwvvw}wvywvvvvvvvvvuvvvwvvupwwpvvuuuvvouuuuuuooopuupuloppuollllulllCC py55555555775777755775$777557777777577777775777775757755555555555555555755555555555555555555555555555555555555sppoppoovpppoooopppoloopppoop|ppvppppo|vpp||vv|vw}vv|vpp||wwvvvw|vpp||vvvv||p|}||vvp|wwvppp|pvwvv|wwvww}ww|vwwwvww}}}}ww}}}}w}ww}wwwww}ww}}}}}}}ww}w}}}}w}}}w}}}}wvww}}www}}wvvwvv}w}}ww}}wvw}wwww}wwvvvvwwvvvvvvvvvvvvuwvvvpuvvuuvvvuvvuvwupvvvvvuuuloopuooolllolollllol   vy5577757575757775577775577557775555775755555555755555555555555555555555555557555555555555555555555}poppooopooppppppppvpppvvppvvvvvppvppp|v|ppv}vvvpvvppvvpvvvvvvpp||pp|||vw|p||pwvv||w}}|}vw}}}w}wwwww}}wwww}w}}}}}wwww}}ww}}w}w}w}ww}}www}www}w}}}wwwwwwww}}w}ww}wwwwv}}vww}w}ww}ww}vvw}vw}vwvwwwvvwwwwwwvvwvvvvvvwwvvwwwvvvvvvvvvpuvvvpvpu{vvuuuuuuuppvuoupoouuououooouolll   py5555555757555557757755757755757$757757777777577575555575555555575555555555555555555555555555555555557555555555}ooppooppoopppppppp|ppppppvppv|ppvvppp|pv|pvvvpvvvvppvv|p|vpvvvvvvvp||vv|vpv|vwvv|w|}ww}www}w}}v}}}w}}w}}w}}}}}w}}}w}}}w}}}ww}}}}}}ww}www}}w}}}w}}wwww}}w}w}wwww}ww}}w}wwwwwwwvwwwwww}vwwvvwwvwwvwwwvwvvvwwvvwvvvwwvvvvvvvvvvvvwvvvvvv{vuvvupuuuuuuuuuuuupuuuuuuuuuootl{ py55557555755775557575575555777777775777577557575755555555555555755555555555555555575555555555555555555555|pppppppvppppppoppoppopppvvppvvppp|ppvvvp|vppppvpvpv|ppwv|vvpv|vvv|||vp|www}vvwwv}w|wvw}ww}}}w}}}}wwwww}ww}ww}}}}}ww}}}w}}w}}}}}}}www}}w}}}w}}wwvw}ww}www}}w}}wv}wvwwvwwvwww}}wwwvw}vwvvwwvw}wvw}vvvvvvvwvvvvvvpvvvpw}yvvwvvvuvvpuuuvvuupupuouvvvpuouuuuoupuuy  px5555757557575555577777777575775575555555555555555555555555555555555555555555555555555spopopppppopppppvppwwvvpppppvpvpppvvpvvppvv|ppwppvpv|p|}vvp|p||vvvvv|w|wvvw}||}www}w}ww}}wv}}w}ww}w}}w}ww}}}www}}}}}ww}}ww}}}w}}}}}wwwwww}wwv}}}}w}}wwwwwvww}wwv}ww}w}}www}wvw}wvwwwvw}}v}}wvwvwvwwwwwvvvvvvvvvwvvwvuvwopvuuuu{uwvvvuuvvvvvupvuuuuuuuuuuuuuoluoo  oy555577555755555775777757777755577575775555555555555555555555555555555555555555qpppopppppppppppvvpppvppppvpppv|pppvppppvvvvvpvv|vvp|v||v|vwvvvvvv|wv|||vv}|vv}}ww}}}w}}}}}w}}w}}}w}}}}}}}}}}}}}}}}}}}w}}}}}}}}}}}w}w}}}}}}}}wwww}}w}}w}}}w}}}ww}ww}w}}}wwwvw}}wwww}ww}wwwwwvvwvvwwvwwwwwvwwvvvvvwwvwvvwvvvwpwwpvvwwpvvuvvvuvuupupuuuuuvuupuuoouuouut   py555557557557777775775777777777577777575577555557775555555555555555555555555555555555555555555|vpopppvpppppppppvpppppvpppvvpvvpppvvpvpvvpvvvqvwvvv|||vv|v|vvw}|vvvvwvwvwwwww}ww}}}}}}}}}}w}}}}}ww}}}}}w}}}}w}}}}}}}}}}w}}}}}}}}}}}w}}}}}ww}}w}}}ww}ww}}w}}ww}}w}w}}}wwwwwwwwwvvw}vvvvwwwwwvvvwwvwwvwwvvvwwvvvvvvvvuvvvvvuvvvuvuuvvuuupuuuuuvuuouuuuuuty oy5557775755775777775577777$7777775555555555555spppoopvvppppppoppppppvvvvp|pppvvppvwv|vpppvv||||pp|v}|vvwwvv}}}}ww}}wwvvw}vvw}}}}w}w}w}}}}}}}}}}}ww}}w}w}}}w}}}}w}}w}}}}}wwww}w}}w}}ww}}}ww}}ww}}}vw}}wwwww}}vwwwwwwwvwwwvwwww}wwwwvvwvvvvvvvvvvvvwvvwvvvvpvpvvvwppvvuvuvuuuvvvvpuupuuoppuuuuuuuuuuu    oy5555757577777777757777777775557555555555555555555557qoppppoooppvpvvppppppppp|vppppvvpvvvvp|ppvvp||ppvpvvvv|wvvvww}wvwwvwwww}}}}}}}}}}}}}}ww}}}}}w}}}}}}}w}w}}w}}}}}}}}}}ww}}}}ww}}}}}wwwww}}w}ww}}w}}}v}w}}w}}www}wwwwww}ww}}}www}wwv}vwwvwwww}}wvw}wwwvvvvuvvvvvvwvvpvyuvwvvvuuuvvvuuuvouuuvpuouuupuuuuvpu{ vx555755755775555577777577777775555755555575555555555555555555}ppppppoppppopppppvpppppvpvvvvvppvvvvv|vvvvvv}v|wp|}}vvw}w}}ww}ww}ww}}}}}wwww}w}}ww}}w}w}}}}}}}}}}w}w}}}}}}}w}}}}}}}}}}}}}}}}}}w}}ww}}}}}w}}w}}v}}}www}ww}w}w}ww}wwwwwww}www}vwww}wvwwwvvvwv}wwwvvvvwwvvwvvvvvwvvvvvvvuvvwvuvpvvuuuouuuvpuuuuuuouvuuuuo  py5555775557557777755777557555555555555555555555555575sppppppppppppppppppvppppppvwvvvpv|vvvwp|wwv||v|w}|wvwvwww}}}w}}}}}}w}}}w}}ww}w}}}}ww}w}}}}}}w}}}}}}w}}}w}}}}}}}}}w}}}}}}ww}w}}}ww}www}}}}w}wwvw}}ww}}vw}}wwwwww}w}w}www}wwwvwwwwvvwwwvvyvvwwwwvwwvvvvvvw{vvuvvvvvupvvuuvvvuuuvvpuupvuuuuuouuuu   py57555557775775$775557555755555555555555}ppppvvpppppvvvvvpv|vpp||wvppvqp|vppp|pvvvwwvvvw}wvw}}wvw}w}}wwww}}}}www}}}}w}w}}}www}}ww}}}}}w}}ww}}}}}}}w}w}}}}}}}}}}}}w}}}}}}w}}}wwwwwww}www}w}}}}ww}w}}wwwww}wwwwwvvwww}vvvvwwwvvvwvvvw}wwvvvwvwvywvvpuvyuppuuuuuvvwvuvuuvvoovpuuoootuutu!px57555555777577775577577755555555}oppvppppppppvppppvvpwvppv|ppppp|vpp|wvvpvwww}wwwwwww}w}}}www}}}}}www}}ww}}}}w}}}}}}}}}}}}}}}}w}}}}}}}w}}}}}}}}}}}}}}ww}}}}}}w}w}}}w}}}}}}ww}}}ww}}}}wwww}ww}wwww}wwwwv}v}ww}wvv}wvww}wvvwwwvuvw{wvvvvwvvvvvvvvvvvvpuvvvuuupuoupuuvuluuuvuuuy{{{      vy555555575577575775555555sppvpppppppppvvppvvvpvwpppv|vpvvv|vv|wwvw}vw}wwwww}}www}w}}ww}}w}}}}}}}}}}}}w}}}}}}}}}}}}}}}}}w}}}}}}}w}}}}}}}}}}w}}w}}}}}}}}}}}}}}}}}}}}}}}}}ww}}}}w}w}}w}ww}ww}}wwv}}wwwwwwvwwvwwvvwwvvww}vwwvvv{wvpvvwvvppvvvvvpvupuvvuuvuuuuuvuupuuuuupuopuutluu vy55555575777$7775555555555555}vppppppppppppvpv||p|pv|pp|wvvv|p|}vvwww}}w}}www}w}}wwv}}}w}}}}}}}}}}}wwww}}}}}}}}}}}}}}}}}}}}w}}}}}}}}}}}}}}}}}w}}}}}ww}w}}}w}}}}}w}}}www}ww}wvw}}ww}}wwwwwvwwvwwvvvwvvvwwvwwvvv̘wwwpvvvvvvuvvvupuvvvuvuuuvuvpuuuuuuupuoooououtltuu py5555555577757757$77777575777555555}wvpvppppppvpppppv}vpppvvv}v|}vvwwwwv}w}}}wwwvwwww}w}}}www}}}}}}}}}}}}}}}}}}}}}w}}}}}}}}}}}w}}}}}}}}}}w}}w}}}}}}}w}}}www}w}}}www}ww}}}w}}}}wwwvvww}}w}wwww}wvvvwwvvvwvvvʜ{wvvvvvvvpuuvvvvuvpvvvuuvvuvuuvuouvvpuuuuuuuuuutuoooou  oy55557557777757777777755|pppppppvpppvppppvwvvpvp|w|pwwvvw}wwwwvwv}vw}w}}}}ww}}wwww}ww}}}}ww}}}}}}}}}}}}}}}}}}}w}}}}}}w}}}}}}}}}}}}}}}}}}}}}}w}}}ww}}}}}}}}}wwv}}ww}w}}}}}}}wwwwwwwwww}w}wvwwwvv{vwwvvvvvvvvvvupvvwvvvvuuvvvuuvvuvvpuuuuouppupouuuuputuuoot{    py575757775777555555}ppppppppppvvvppppvvvvwvvwvvwwvww}}w}wwww}w}}}w}}}w}www}}}}}}}}}ww}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}w}}}}}}}}}}w}}}w}}w}}w}}}}w}}}}}}w}}w}www}}ww}}w}}}wvwwwwwww}w}wwvwwwwwwwvwwwvvvvwvvpvvvvvvvvvvvpvvvvvvpvvuvuuvpuuouvvpoupuuupuuuuuoy  py555775777555~pvppppvvpvwvwvp||vvww}vvvvw}}}www}vw}}}w}w}www}}}}}}w}}w}}}}}ww}}}}}}}}}}}}}}}}}}w}}}}}}}}}}}}}}}w}}}w}}w}ww}w}}}}}}ww}w}w}www}}}}}}w}}}}}}wwwww}ww}wvv}wvwwwwvv}wwvvvywvvvvvvvvvwvvpvpuuuvwvuvvvuuuvvpvuuvuuuuuuuvuuouptopuuu py5577777777$755spppvpvvppvvvvvv}wvww}wvwvwwww}w}}www}www}ww}}www}www}w}}}}}}}w}}}}}}}}}}w}}}}}}}}}}}}}}}}}}}}}}}w}}}}}}}}w}}w}}}}}}}w}w}}}}}}w}}w}w}}}wv}}}}w}wwwvw}wvw}}}}ww}wwvwww}vwww}wvvvwwwvvvvwvvvvvvvvvwvvwvvvvvuuvvvuvuoupupuvupvpuuuvpoootuouu   py557777577755|ppvvvppvvvvvvwv}wwvvw}}}www}wwww}ww}}ww}w}}w}}}}www}}w}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}w}}}w}}w}w}}}}}}ww}}}}}}}www}www}}ww}}wwww}vvv}wwvwwvvwvvvvvvwvvvvvwwvvvvvvvvvvvvvpuvvvpvvvppvuuupuuouuouuuuuuouuu  py555757777577755}pppvwvpvvvvvvwvvwwwww}}w}www}wwww}w}}}}w}w}w}}ww}}w}}w}}}}}}w}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}ww}}}}}}w}}}}wwww}www}}}wwww}v}wvw}w}vwwwwwwvwwvwwwvvvvwvvv}vvwvvvvvvvvvvppvvvvppvuvvpupvuuuuuuuuouuuupuoouu  ox5757}vvvpvwwvvwvvwwvvwv}vvwv}}www}}vwww}w}}}}w}}}}ww}}}}}}}}}}}}}}}w}}Ҁ}}}}}}}}}}}}}}}}}}}}}}w}}}}}w}}}}}}}}}ww}w}}w}}ww}ww}wwwwwvw}w}wvww}wwvwwvw}wwwwvvwvvvvvwvvwvvvvyvvvvvvvvvpvvvvuupuuuupppuuuuvvpuuupvoouuuuu  py57757775}vvvvvvvwvv}vww}wwv}wwww}wv}}}}ww}}ww}}}}}ww}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}ww}}}w}w}wwwwwwwvww}}w}}}ww}}wwwwvwww}wwwvvvwwwwwvvvvwvvvwvvpvvvpvvuvvwvpvvvpvvpvpuvuouuuuuuuvpoopuupuoo{u   px57575777555}vvvwvvw}wvwvvw}wwv}}}www}wwww}}ww}}}w}}}}ww}}}}}}w}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}wwww}w}}}}}w}}www}w}w}wvwwwwwwwvvwwwvwwvvvwvvvvvwvpvyvvvvpuvvvppvvvvvuvvuvvupuuvuuuuouuouuuuuu{u  px5$775557}wvvwwww}}wvwwwvwwww}www}}}ww}}}}}ww}}}}}ww}w}}}}w}}}w}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}w}ww}}ww}}}wvwwwwwwwvvwwvvvvvwwv}vwvwwvvvvvvvvvvvvvpuvuvvuvvvuvvpuuvvvvuuuuuuoooopu{u{  py777}}wvvwvvv}}w}}}vvw}w}vww}}}www}wvv}}w}}}}}}}}ww}}w}}w}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}w}}}}}}}}}}}}}}ww}}w}wwww}}}}}}ww}wwwwv}w}w}wwvvvwwwwwwvvwwvvvvvvvvvvvvvvvvuvvvvvpvvvpvpuuvvuuuuppvpuouuuvu{u{  qx5777vvvwwwvvwwwv}}w}}}}wwww}}}}ww}}}w}}w}}ww}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}w}w}}}}}}w}}}}ww}}w}wv}}w}wwww}ww}wwwwwwvvwwvwvwwwvwwwwvvvvvwwwwvvvvvwvvwvvvvuuvvvvpvvvuvvuupupoupuuuuuotyu   px775~vvv}wwwwwwwvw}}w}}www}ww}}}ww}}}ww}}w}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}w}}}}}}w}}}}}ww}}w}wwvw}w}}}wwwv}vvv}wwwwvvwwvvwwvvvvvvwwwvvvvvwvvvvvvvvvvvpuppvvvuvppuuupupuupupuuyu{    vx75~wvv}wvw}wwwww}}vwwvw}w}ww}}ww}}}}}}}}w}}}}}}}}ww}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}ww}}}}}}}}w}w}}}}}}}}}}wwwwwwwwwwwwwwwwvvwvv}vwvvvwvvwvvvvwvwwvvvvvvvvvvpupvvvvuuvvuuvpuuvuppuupvu{  vyӎ}ww}vvwww}}}}w}wwww}w}}}}}}}}www}w}w}w}}}}w}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}ww}}}w}}}}}w}ww}w}wwwwvw}}}ww}}}wvw}}ww}vvvvwvwwvvvvpvvvvvvvvvvvvvvuuvvpuppuppvvuopuuuuuoupupuoouuy !  py5775~wwvwvwwv}wvw}wwww}ww}}w}}}}ww}}}}w}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}w}}}}}}}w}}}w}ww}w}}}}}}wwww}}w}}w}wwww}ww}vvwwvwvvwwwwvvvwwvvwvvvvuvvvvvvvvpvvupvvvvvupuuvvupuuouvuouyv    ox7}vwwwwwwv}wvw}wvw}}w}}}}}}}www}}}}ww}}w}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}w}}}}}}}}}}www}}www}}}www}www}vv}wwwwvvwvwwwvwwvwvvwvvvuvvwvvvpvvvvupvupvuvuuuuuupuuuvuuuyu  py$~vwww}wwvw}wwwww}}w}}w}w}}}wwww}}}ww}w}}}w}}}}}}}}}}}}}}}}}Ҁ}}}}}}}}}}}}}}}}}}}}}w}}}}}}}}}}www}}}}}}}}}}w}w}www}}wvwwwwvwv}wvwwvwvwwwvvvvvvvvvvvvvvvuvvpvvvvvupuuvuuuvpupuuvuuuupvuu    vxՏwvwv}}wvwww}}}}}wwwwwww}}}}}ww}}}}}}w}}}}}}}}}w}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}w}}}}}}}ww}}wwww}}w}w}}}www}}}}}}wvv}vwv}wvvvvvvvwwvvvpvvvpvvvvvvvvvvvvvupuupvvvvvuuuupuvpuuuu py7Տwvvvwwvv}ww}}}www}w}}w}}w}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}w}}}}}}}}w}}}}}}w}}w}}}}}}}www}v}}}wvwvwww}}wvvvwwwwvwvv}vvwwwvvvvvvpvppvvvvvvvvvuupvupvuuuuuuvuuzz    px75$75~vvvwwwww}ww}}}}ww}}}ww}}}}}ww}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}w}}}}w}}}}}}www}}}}ww}wwwv}www}www}wwwwwvvvwvwvvvvwwvvwwwvvvvvpuvvuvvvuvpvuppuuuuupuupouuyottC     vx5}www}}}}wwv}wwww}ww}wvww}}}w}}}}ww}}}w}}}}}}}}w}}}}}}}Ҁ}}}}}}}}}}}}}}}}}}}}}}ww}}}ww}w}}vww}w}}}}}}}wvvvv}wvvvvpvvvwwvwvwvuuupvvvupvvpvvpuuuuuvuoupupvoopuuuyuylltlt    !|y!$~wv}}wwww}}}}ww}}}}}}}}}}}}}}}}}}}www}}}}w}}}}}}}}}}}}}}}}}}}}}}w}}}}}}}ww}}w}w}}}w}}www}ww}www}ww}wwwwwvvvvwwvwwwvwvv}wvwvvvvvvvwwvvvppvuvpuvuvupwvvvpuvoluuuoyuzlltCCtCx!   ox~vwwv}ww}w}}ww}}ww}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}w}}}}}}}w}}}w}}ww}}}}w}ww}}wwwww}wwwwwwwvwwv}wwwvwwwvvwvvvvvvvvvvvvvvuvvvuvvvuvvvuupuppouuuoyuuCltlCltlC  ox~vwwv}}ww}}w}}}w}}ww}}}w}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}w}}wwwwwww}}}w}}}wwww}wwwvww}wvwvwwwvvwwwvvvwvvvvvvvvvvvvvuvvvvuvvuvvppupuppuvuou{oytllltCCCtttt   pxw}}ww}}vwwwwwwv}}ww}}www}}}w}ww}}}w}}}}}}}}}}}Ҁ}}}}}}}}}ٞ}}}}}}}}w}ww}}}}wwww}ww}w}}www}wvvvvwww}vwvvvvvvvvw}wwwvvvvvvvvuvvwyvvvpvvuupvvuuuoovvvv{otlltllClttttltu !    px~v}}w}}}w}}}}}}}w}w}}}}}}}}}}}}}}}}}}}}}}}}}}}}}Ҁ}}}}w}}}}ʐ}}}}}}}}}}}}}}w}w}}}w}}www}www}ww}ww}w}wwwwwvwvvvvvv}wvvvvvvvvvppvvvvvuvvpuuvpppupvuoup{uytotoltlCllCCCCCC!   px~vwww}}}}}}}}}}}}}}w}}}}}}}}}}}}}}}}}}}}}}}}}י}}}}}}}}}}}}}}}w}www}}}}v}wwwww}vw}w}wvw}wwvvwwvvvwvvvvvvvvvwvvvvuvvvvvpppuupvpvupvupuouuߔulttltllCltCCtCCClt   pyՏwvw}}}}wwww}}ww}}}}}}}}w}}w}}}}}}}}}}}}}}}}}}}}}}٤}}}}}}}}}w}}}}w}}w}}w}}}}wvvv}wwwwvwvw}vvwvvvw}vwvvvvwwwwvvvvuvvvvvvpuvupvuvvvuuvvpuvutltolltltlltCCCllCtCu ! px~w}}}wwv}}}}}}www}}w}}w}}}}}}}}}}}}}}}}}}}}}}}}}}ґ}}}}}}}񐀙٘}}}}}}}}}}ww}w}}}ww}}}}}w}}}}w}wvww}wvvvvw}wvvv}vvwwvuvvvvvvvvvvvvvvvvvuuuvuupvvuuoupw{toltltlltCCCtlotltCltlC    qxՑ}w}}}ww}}ww}}}}}}}w}}}}}}}}}}}}}}}}}}}}}}}}}}w}}ٙ}}}}}}}w}w}}w}}w}}}www}}}}wwvwwwwwwwwvwwwwwvvvwwvvwvwvvvvwwvvwvvvwvpvupvvpvpvuuovuupuuotutlltooolllutCCtCltCCCl  pxՏ}ww}}ww}}www}}}}}w}}}}}}}}}}}}}}}}}}}}~}}}}}}ߙ}}}}}ww}}}}}w}}ww}ww}}vw}www}wvw}wwwv}wwwwvwvvwvvvvwvvvvvvvvvvvvuvvvvvpvuuupupvvuuytottotlltouutttllClCtllClCCu ! px$wvvw}}}}}}}w}}w}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}w}}ww}}}}w}ww}}}}w}wvvw}}wwvvvvvvvwwwv}vvvvvvppvuvvpvpvpvvvvpvvppvpvvvu{uvotltoltlCClClllCCtluoltllltlC   pyw}ww}}}}wwww}}w}}}}}}}}}}}w}}}}}}}}}}ґ}}}}}}}}}ߞ}}}}w}}}}w}}}}w}}}}}w}ww}}}}vw}wvwvvw}wwv}wvwwwwvwvvvvvvvvpvvvpvuovuupuvuuupuoyoytouoootluutllooulltttltCCClCCtCt   px$www}}ww}}}w}w}}}}}}}}}}}}}}}}}}}}}}}}}}}ґ}}}}}}}}}}}w}}}}}w}}}ww}}ww}www}}wwvwww}}wwvvvvwvvvvvwvvvvvvvvvvvvwvvvvvvvvvvpvuuvuuyp{ooltluooolltoltttltlolltlClltlCCCtx      pxՎww}w}www}}}}ww}}}}}}}}}}}}}}}}}}}}}}}}}}}ґ}ґ}}}}}}}}}}}}}}ww}}}w}}wwwwwwwwww}vw}w}}vvvvwwvwwvvwwvvvvvvvvvvvvvvwvvvvvvppvvvvpuyuuotuullolollttttuulltlttltCCltttCCCtl!    py~w}wvw}}}}}}}}}}}w}}w}}}}}}}}}}}}}}}}}}}}}}}}ww}wwv}}}w}wwv}}wvw}}wvvvwwwwvvwvwwvv}wvvvwvvvvuuuvvvvvvuvvpvvuvoyv{ulllloloolloltlllollClttlCtltCllCCtlltt!!!!    !py}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}w}}}}}}ww}ww}}wwvwwwwv}}}wvvvw̜wvvvvvvwvvvvvuuupvuuupuuouyvooulluouutootullttllllllltllltllttCCloCCCy!!   ox~}}}w}}}}}}}}}}}}w}}}}}}}}}}}}}}}}}Ҁ}}}}}}}}}}}}}}}}}}}}}}ww}w}wwvwwvww}wwwwwvvvvvvvpvvvvppvvpppppppw{uptouoouutottlollllloltltllttllltltCltClCCtC!!!   ox~}}}}}ww}}}}ww}}}}}}w}}}}ww}}}}}}}}}}}}}}}}w}}}v}}}}ww}}}}www}wvvwwvw̘}wwvvvuvvvvvwvvpvvvppvvpw{ouvoouwuollotllollllouttltlClCCtllClCtCCClClCt!!!    ox~}www}}}}}}}}}}}}}w}}}}}}}}}}}}ـ}}}w}}}}}}}}}ߘww}w}}w}wwwwww}www}wvwwwǐʘwvvwuvvvvvvvvvvvupppvvuluupolooppuuuolouuuouotllltlllCltllltttltCltlCltCtx9!!   !vx}}}}ww}}}}ww}}}}}}}}}}}}}}}}}}}}}}}}}}}}ߙ}w}w}ww}}ww}ww}}ww}wwwސvwwwvvvvvvvuvvvvuupvuvpv{popuououuouoplpulloolluullolttltCltClllllCCCCCtCCC!!!      pxՑw}}}}ww}}}}}}}}}}}}}}}}}}}}}}ґ}}}}}}}}}}}٘w}}}}}}}wwww}wwww}ʐǘ}vvwvvvuvvpvvvvupvpvvvuuvpouuuplopooouuuultooCouultoluolltllCtlCtlClCCCCllCt!!!!  ox$ԏ}}ww}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}ٙ}}wwwwwwww}}w}ww}ט߆vwvwvvwvwwvvpvpvvpovouwuuuouvypuvpoououltpoloooltootolCtololluotllotClCtCCCtClCCtlCCx99!!! !!!    |x}}w}w}}}}}}}}}w}}}}}}}}}}}}}ґ~}}}}}}w}}}}}}}}}}}}w}w}}}vwwwwwww}vvw}ww}w{vwvwvvuvvwvvpppvvvvvvpopvpvpoouwuoopuuoulouuooullpuulltllClltuotlCCCtttllCtolCCCCC!!9! !  !vx~}ww}}}}}}}}}}}}}}}}}}}}}ґ}}}}}}}}}}}}}}w}}}w}}}ww}w}wvvvwwvvwv{wvwvwvvvvvvvovvvpppvouvuuuppoovuuuovuovuouuuooooolotlulllttlolltlllllltClCltCllClu!!!9! !!    px!Տ}}}}}}}}}}}}}}}}}}}}}}}}}Ҁ}}}}}}}}}}}}}}}}}w}}}}w}}}wwwwwvwwvvwwvvvwvwvvvvvvvvvpuvopvouvvvooovuouvououuovpuouuoouoloouttllllltlllCCttlllCCCClCtltCll9!!9!!!! !   px}}}}w}}wwwww}}}}}}}w}}}}}}}}}}}~}}}}}}}}}}}}}}}}}}}}ٙ}}wwwwwvw}}w}wwwvw}}v}wwvwww}vvvvuvvvvuppvwvuoopvoouuuoouvoolllloollouolouuuuollltouullllltCltttlCtCCCCCCACt$!!9!!!! ! !ox!~w}}w}}}}}~}}}}}}}}~}}}}}}}w}w}}}}}w}w}}wwww}}}w}}}}}wwww}vwvvvww}vwvvvvuvvvvvvppoppovvuovvluvuopupouuuuolluuullttlllouollltooolllotlllllltllCCtlCAu9!99! !!    oxӎw}}}}}}}}}}}}}}}}}}}}}}}}}}~}}}}}}}}}}w}}}}}}}}}}}}w}}ww}}}w}ww}wwvvwwwwvwvvvvvvvvpvvuvpuuuppuppvoppuuouvuuoopoooooluololllttoolltooltlltlttltCClttCCCtCCl9!!9!!!9! !! !  px!}w}}w}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}www}}w}}}}w}}v}w}wvw}wwvvwvvvvvvvvuvvvwvvvppuppoppuuupupvuooovpuoltoooolltloottuulCCllltlCllCtlCClCClCCCtCt!!!!!!!9! ! !    pxԑ}}}}}}}w}}}}}}}}}}}}}}}}}}Ҁُ}}}}}}}}}}}}}}}}}w}w}}}}}w}ww}ww}ww}wwvwǜvvwwvwvvvvvvvwvwvvvvvvpvvvpvvvvpvvoouuoopuoouuouuoollllllllolClClouuoltlllClllllutlllCClCCx!!999! !!!!! ! !! px}}}}}}}}}}}}}}}}}}}}}ґ}}}}}}}}}}}}}}}www}}}www}w}}w}vv}wvwwvwvwwwvvwwvvvwppvvuvvvvppvvvvuvuuuuuvupuuuuooolvuouoluuuooolllulllltlCllCCCClllCCCttCCtllCC!!99!!!! !9!! !! ! !  !ox}}}}}}}}}}}}}}}}}}~ґב}}}}}}}}}}}}}w}ww}}w}}}}}w}ww}w}www}wvvww}vvwvwwwvvvvvvuvvvvvvvuupvppvvulvplppvpoouoooopoutoooouuooooloooolllClCClCCtClllCCClCCCtCCt9!99!!!!! !!!!!  px}}}}}}}}}}}}}}}}}}}}ґ}}}}}}}}}}w}}}}}}}}}}}}ww}w}}w}ww}vw}}wwwvvvw}vvvvvvvvvvvvpppvvuuuuupovvuopupopopvvouuoluplllluuuolllltltlttltlCCClttCCCCtlCCCCCCz!!99!9!!! ! !! !!  ox}}}}}}w}}}}}}}}}}}}}}}}}}Ҁ}}}}}}}}}}}}}}}}}}}}}w}}}ww}}vvwv}wvvwwwvvwvvvvvvvvvvvvpopvpvvvvuvupvvooopooouuolouuouoouuooltllotlolllCCltltollCCCCCCtCCCCClCC9!!9!! ! !!! ! !!     px}}}}}}}}}}~}}}}}}~~}}}}}}}}}}}}w}}}w}}w}}}}}}אwwwwww}wvwvwvvvpppvvvvvvvppvvvvpupppvuupuuovoupouoopuooooooouolooltllotltltlllllolCllClltCClClllCt!9!9!!!!!!!!! !   px}}}}}}}}}}}}}}}}ӑ}}}}}}}}}}}}}}w}}}w}}}}www}}}}לwwvvwvvvvvpvvvvvvvvvvvpupuvvvvupuppuvuuuooouuupluutloulloClllooltCooltlltllllCtlCllCClltCC9!99!!!!!!!!! ! ! !   px~}}}}}}}}}}}}}}}}}}}}~}}}}}}}}}}}}}ww}}}}}}}}}}}}w}wvw}wwwvwwvvvvvvvuvvvpppvoovvpvvvpoouvovpouvvoutouoouolououoltlulltlltlllCClCCllCCtCtlCCCCCCCC!!99!!!!! !!!!!!    pxӏ}}}}}}}}~}}}}}}~~}~}}}~}}}}}}}}}}}}}}}}}}ww}www}wߐwwنwwww}vvvvvpvvvvvupvvvvuvvvvuvpoooouoopuuuoooooloupooootlloollooltlltllllllollCCCtlCCCClCCCCCCt$!!99!!!!!!!!! ! ! !   ox~}}}}}}}}}}~}}}}}}}}~葑}}}}}}}}}}}}}}}}}}}w}w}ww}w}ِww}vvww{}vvvvvvwvvvwvvvpvvvvpvwpppopvvuoovupuooopooouuoltooollootllltllltlCltlltllCllClCCCCCCCCCCC9!99!!!!!!! !! ! ! !     oxԏw}}}}}}}}}}~}}}}}~}~}ґ}}}}}}}}}}}}}}w}}}}}}}}ww}}}w}wvwwvvvvvvvvvpvvvwvvpvvvvppvvvvuopvuupvoupopppppuuuuolooloooolllltlltCCCltltlltllCCtllCCltCCCCCt9!99 !!!!! ! !!! ! !!  pxӏ~}}}}}}~}}}}}}}}}}~}}耏}}}}}}}}}}}}}}}}}w}}}}}}}}}}}}朘}ߐwvvvvwvvvvvvvvvvwvppvpppvppvvupvopuooouoooooooolooluouuulololllllllllCCCClCCCCllCCCCCtlCCCCCCx9!;9 !$9!9!!! ! ! !   px~}}}}}}}}}~}}~~~}~~~~~}}}}}}}}}}}}}}}}}www}www}}w}אwvwvvvvwwvvvvwvpvvvppvpvvvvpovoupoppovuouuulluooluuloouloolloolltllltollllolCllltCllCClCCCllCCC9!!9!!9! !! ! ! !!! ! !   oxՑ}}}}}}}}}}~~}~~~~摑}}}}}}}}}}}}}}}}}w}}}}}}}}}}ww}ʘwvvw}vvvvvwwvvvvvvvvvvvvvvvvpupvopuvvvovppooouluouluolltuCoolottttollllulllltllltlCCCllCCtClCCCCCu9!!9!!!!!!!!!!!!!! !! ! ! oxԑ}}}}}}}}}}}}}~~}~~~}}}}}}}}}}}}}}}}}}}}}}ww}}}}}٘wvwwvw}wvvvvvvwvvvvvvvvvvvvvvvupvuvvvvvvoouupoovopptluollupuooltlllCllotlllCCCCCllolCCCtltCCCCCCCCCC!999!!!!!!!!!!!!!! ! !  !      pxՏ}}}}}}}}}}}}~~}~}~}}}}}}}}}}}}}}}ww}}}w}}}}}}}ww}ww}vwvwwwvwvvwwvvvvvvvvvvwvvvpoppuppvvvvoplouovoopuvulouuouvpollllllulllCllllCCuolCCCllllltCCClCCCCCC?CCAt!!!9!!!!!!!! !! !   px~}}}}}}~}}}}}~}~~}}}}}}}}}}}}}}}}}}}}w}}w}}}}}}}}}wwvw}w}vvvvvvvvvwvwvvwwvvvwwvpvvuovvppvvvopvppuovuppooovooplouulooloollltullttllltllllolClClCllCCCClCCC?CC?l9!!9!! !!!! ! !! !! !  px!}}}}}~}}}}}}~~ґߒ}}}}}}}}}}}}}}}w}}}}}}}}w}}}wwww}w}wwwwvvvvvvwwvvvvvvvvvvvvvpvvvvpuovupupvpoopvvooopuuuooouooooooolooollolllColClulllCClClCCCCClCCCCCCCCC!!99!!!!!! !!! !! !!! ! !! vx ӎ}}}~}}~~~~~}}}~~}}}}}}}w}}}}}}}}}w}wvw}}}ww}}}vwwvvwwwvvvvvppvvvvvppvwvpvoouvvvopvvvoouuoouopulouuoouulooololCloolllCtlllulClClCCllClCClCCCCCC?CC!!99!!!!!! !!! ! ! ! !      px ~}}}}~}}}}~}}~}}~~~ّ~}}}}}}}}}}}w}}}}w}}}}}}}wwwvw}}w}}wvvvwwwvvvwvvvvvvpppwvvvvvopopvuooupppppopluullooolopulllooouolllllltlCCllllCClllCClCCCCCCC?CCCCy!999!!!!!! ! ! !!   ! ! ox  Տ}}}}}}~}}~}~}~~}}}}}}}}}}}}}}}}}w}}}}w}}}}}}w}www}wvvwwwwwvvwvvvvwwvwvpwvvpwvpuwvpvopvoppopupoupuuooouooulouoolouotulllllllllllllllllCClCCCCCCCCCCCCCCt9!!9!!!!! !!! ! !  px  Տ}}}}}~}~~}~~~}~ڑ}}}}}}}}}}}}}}}}}}}}}}}}}}}}}ww}}}}wwwvvvw}wwvvwvvvvvvvvvvvvvvvvppvppvpuvuooopoooppupooouololoollloulllllllullllllClllllCtCCCtCCtCtCCCCCy9!99!!!!! 9! !!! !!  !   px  ~~}}}}}}}~~}}~~}}}}}}}}}}}}}ww}ww}}w}}}}wwwvvvvwwvvvww}}vvvwwvvpvvvwvpvvpppvppvvvvpppooouooopulpuoolllouuoloooooltlllllllltllltlCCCllCCCCCCCt̛!!99!!!!! !!! ! ! !!   !    px    ~}}}}}~}}}~}}}ҡऑ}}}}}}}}}}}}}}}}w}}}}}}w}}}}w}vwww}}wvvvvwwwwvwwwvvvvvvvvvpvvpvvpvvvvvpopppvpoppooolpvoopouolotolouollllllollllllltCCClCCCllCCCCCllx!!99!9!! !!!! !! ! ! !  !   ox  ӏ}}}}}~}}}~~~~~}}}}}}}}}}}}}}}}}}~}}}}ww}}}w}ww}}}w}wvwwvvwwvvvvwvvvvvvvvvvvvppvvpppppvovpopupvvoovooploouuoolltoloulllllllllllCtllCllCllCllCClCCtŃ!9!9!9!!!!!!! !! ! !! ! ! !  ox     Տ}}~}}}}}~~~~~ԡࡑ~~}}}}}}}}}}}}}}}}}}}}}ww}ww}}w}}}wwww}wwvvvvvvwvvvvpvwvvvvvvvvpvppvopppvvpooppooowuloluooloolllolluoltopltlltlllltCllllCllCCCCtzz!9$9!!!!! !!! !! ! ! !! !   px  Տ}}}}~}}~~~~~}~~~ҡ}}}}}}}}}}}}}}}}}w}}}}}}}ww}wvw}}}w}wvvvvvvvwvvwvvppvppvvpvpvpovpvvppopvpoppvovopvoooolopuulllllllooullCClltlllCtlCCCllllCt߃!;$9!!!!!! !!!!!! ! !   !    vx   ӏ}~}~~}}}~~~~椡}}}}}}}}}}}}w}}}}}ww}}}}}wwwwvw}wvvwwvvvvwvvwvvvvwvvpvvvvopvvvuoppvppopolopoooooploooooloolllllllllllloCllCCCllCClCl{y!9!9!!!!!!!!! !! !   !  !   px    ӏ}~}}}~~}~~}}~~}}}}}}}}}}}}}}}}}}}}}ww}}}}}w}}wwwwwvvvwwvvvvwwvvvvpwwvpvvvvvpvpvvppvpopvouuoooopoouploolooolollolllllolCltlllClllltCCtz!!!9!!!!!!!!! !! ! ! !! !  ox   Ց}}}}}~}~~}}}}}}}}}}}w}}}}}}}}}}}}w}}}}}w}w}wwvwvwwvvvwvvwvwwvvvvpvwvvvvvvpvvpvvvppooovovvpvouuolooluuuuuolloltooolllllCCllClolCCllߔx$!!9!!!!! !! !! !! !! ! ! !!   !   ox      ~}}}}}}}~}}~}~}~~~ڤ}}}}}}}}}w}}w}}}}w}}wwwwwvvwvww}vvvvvvv|vwwvvvvpvupvvvovpvpopvppooopulpoppopovollloolloollllllllolllolllCCCCxy$$$9!!!! !!!!!! ! !! ! !  ! !  ! ox      ~}}~}~~}~~매~~}}}}}}}}}}}}}w}}www}www}}wwvv}wvvvvvvwwvvwvppvvvwvvwvvpvppppvvvppppppoppouooluuoolouoloulollollllltllllllCt{z!!99!!! !!! ! ! !! !!  !   px      Տ~}~~~~~䥡~}~}}}}}}}}}}}}}}}}}}}}}www}}w}wwwwvv}vvvwwvv}wvvvvvvvvpvvvvwvpvvvppvpovvupopopuoopolopoooloolluollullltCllllllCl{y!9!9!!!!! !!!! !!!! ! !     px      ӏ~}}}}}}}}}~~~~~Ӓ~}}}}}}}}}}}}}}}}}}}}w}w}}}}ww}}wvvw}ww}}wwvvvvvvwwvvvvvpppvvvvvwvoouopppoooppoolooouppouolllolllooolollllltoCty{!!99!!!!!! !!! ! !! ! ! !! !!    vx     ӎ~~}~~~~~~~~~}}}}}}}}}}}}}}}}}}}}}}vvw}}w}}|vwwvv|vvvvvvvvvvvvvvvvpvvpoopvpopvvvpoooooopuopolppoouplloulooolllooClolly$999!!! !!!! !! ! !       !   px  ~}}~~~~~~~~謡~~~~}}}~~}}}}}}}}}}}}}}}}w}ww}}vw}}wvvwwvw|vvpvvwwvvvvvvvvvvvvpvpppvpppvvvpooouppppolloouoouputllotltlltllllyy$9$9!!!! !!!! !!!! ! !     !   ox     Տ}}}~}}~~~~槑~~~}}}}}}}}}}}}}}w}}}}ww}}ww}wvw}wvwwvwvvvvvvvvvvvvvvvvvvvpppvvvvoopvvpoopvuooooooouolopollCllllllllllރ{!9!!!!!!!!!!!! !! !!! ! !   !  !   !px     Տ~~}}}}~~~~~~~ڤ}}~~}}~}}}}}}}}}}}}}}}}}}}}}}}vw}wwv}}wwwvp|}wwvwwvvvvvvwvvppppvvvvvvvvpooopupoopoooooooouollllooloooollloyy$999!!!9!!!! ! ! ! !   !   !      vx ~~~~}}~~~~~~~~~ڤ~~}}}}}}}}}}}}}}}}}}ww}}}wv}}w}ww}wwwww}ww}vvwwvvvwvpvvvvvvvvvppppppoupooouooupouuollolloooooolloollt{{9!!9!!!!!!!!! !!!! ! ! !   !   px   ӎ~~}}~~~~Ԥ~~~~~}}}}}}}}}}}}w}}}}}wv}}}}}}}w}ww}wvvwwwwwwvvwwwvvwvpwvvpvvvvvoppppopvvppoooupvooooooooooolooolllolyy$!!9! !!!!!!! !!!!!!! !    !  px   }~}~~~~~~鬑~~~}~}}~~}}}}}}}}}}}}ww}}ww}}}}wwwvvvwwvwwvv|wvvvvvwwvvvvvvppvvwvppvpppppvpppooovupooopoupolllllolooluy!!!9!!! !!!!!! !!  !!    !   !  !px  ~~~}}}}}~~~~觑~~~}}}}}}}w}}}}}}}}}wvvwww|w}}wwwvvwwvvppvvvvvvvvvvvvpvvpoouvvooopvpopppppvouvppooouoouu{{{!!!9!!!!!!! !!!! !!  !   !   vx    Տ~~}~~}~~~~}}~~}}}}}}}}}}}}}}}}}}w|wwvww}}vvw}vvvvwwvwvvvvwvvvvvpvpvpovwvppovppooouoooooooooooooollollu{=9$9!!!!!9! !!!!!! !!! ! !     ! !px    Տ~~~~}~~~~~~~~ڥ~~~}}}}}}}}}}}}}}}wwwv}}wv}}wwvwwwvvvvvvvvwwvvvvvvvvpvvpopvvppvpvpppopoouolupooollooooooy{!999!!!!!9!!!!!!!! ! !     ! !  !vx!     ~~}~~}~~}~~~ۣӑ~}~~}~}}}}~}}}}}w}}}wwwǘ}}}}}w}}vwvvvwwwvvvvwvvvvvvvvvvvvvpvvpvvvvpoppwppvovpoopvplolouoppv{{!!!9! !! ! !! !! !!  ! !   !      ! !qx!tzt$  Տ}}~~~~~~~~~~鬢}~}}}}}}}}}}}}}}Ǚww}}}vw}w}}wwwwvw}vvv}wvvvwwvpvvwvpvvvvppvvpoopoowouvpouppolppolluǘ=$!!!!!!!!!!!!! ! !!!  !   !   ox=zʖB   Տ~}~~~~}~~~~~~~觤~~~~~}}}~}}}}}}}}}w}}}}}ҙwwwwww}www}}}vvvvvvvvvw|vvvvvwvvvvvvvvuvppvppoppvvoppvooouoooulooov{$!!9!!!!!!!!! ! !! ! !   !  px=x= Տ~~}~~~~~~~~~~~ԣॡ~~}}}}}~}}}}}}w}}}}}ʙw}}wwv}ww}ww}vvwwvvvvvvvvvvpvwvpvvvvvvpvppvvpovvpupvppoolpoololooy!!!9!!!!!!!!! !!! !!   !     !vx=BA   Վ~~~~~~~~~ۣ٤~~~~}}}}}}}}}}}}w}ww}Ӛ}w}w|wwvvwvvw}ww}wwwvvvvvvvvvpppvpppppvwvpoupvvoolpoovvoopvvppuuov!!!9! !!! !!! !!!! ! !   !    !vx Վ~~~}}~~~~~~~~~ԡ}}}}}}}}}}}w}}}}}}}ʐ}w}}ww}}w}wwwwvwwvw}wvvvwwvvvvpvwvppvvpppooppvppopvpopppppvulllopou!999!$!!!! !!! !! !   !  ! ! !   ! !qx  Տ~~~}~}~~觡~~~~}}}}}}}}}}}}}ʐw}www}}|wwwwvvw}vwwwvvvvwvvvvwvvvvvvvpvppvopppopppppuupooupplloplou!!!!!9!!!!!!!! !!!! ! !  !     !  !vx ӏ~~~~~~~~~~ؤ~~~~~}}}~}}}}}}}}}}}}א}}ww}}wvv|wwvvv}vwv|vvpwvvvvwwppvvppvvvvvvpuopovpoloovolpopvoouuolooy!!!9!!!!!!!!!!!!!!!!!! ! !     ! !  !px   ӎ}~}~}~~~~ܦ椡~}~}}~ww}}}}w}w}אww}w}}w}}w}}}wvw}vvvvvpvwvwwvvvvvwwvwvoovvvvopvvppppovvoovvooopoooullouy$=$9!!! !!!!!! ! !      !  !     ! !! px  Տ}~~~~~~~~ڑ~}}~}}}}}}}}}}}}}}א}wwww}}}vww|wwvvvvvvvwwvvpvvvvwvwwpppvovvpvvvoppovpppooluoooluuuloppolloy!!!9!!!99! !!!!!!!! !!!     ! !     px  ԑ~~}~~~~~~~~~}}}}}}}}}}}}}}}}}ِ}ww}w}wv|w}wv|wvwwwvvvvvvwvvvv|pvvvppvvvvvpvvpoppvopppoooooplouullooollolty!!$9!!!!!!!!!!!!!!!!! !   !   !   !px  ՟~~~~~~~~~}~~~~~}}}}}}}}}}}}}}}wِ}w}}}}vww}wwvwvwwwwvvvvvv}wvvpvpvvvvvvpppvoovppvvvoopvvpopppllupullCoololllo!!$9!!!!!!!!! !!! !! !   !    !vx ~}~~~~~~~~~~ۢڤ~~}}~~}~}~}}~}}}}}}}}wߐ}w}vw}}wvwvw|vw}pv}}|vvvwvvvpopvwvpvvvpvvvpppopopvplopopvollopolloolpooololClo$!$9!!! !! !!!!! !!! !    !  !  !!! ! ! !|x  ~}}~~~~~~~~Ԣӡ~~~}~}}}}}}}~}}}}}}}}w}}}www}wwww}vv}vw}wvvvpwwpv|vvvvvvppvpppvpvvpvpopppovooopoooppuoooluolpolllollo$!$9!!!!!!!!!!!! ! ! !! !     !   px  Տ}~~~~~~~~~~ԣ~~~}}}~~}}}}~}}}w}}}v}}}v|vwwwwwvvvw}wvv|v|vvvvvvvvvvvvvvppppvopvvvppopvopoooouulopvooolloooooolotlClu9!=9!!!!!!!!!!!! !! !!!!!!   !     px Տ~~~~~~~~ؤ~}~}}}}}}}w}}}}}}}}}}w}}}}wwwwwwvvvvw}wvvwvvvvvvvvvpoppwvlppuppplovppvolluvlloulppoollluupolloouolu!!$9!!!!!!!!!!!!!! !   !    !   !      !vxՏ~~~~~~~~~~ۢ}}}}}}}}}}}}}}}}}}www}ww}w}w}wvwvwwwwvvvwwvwvvvwwvpovvvppppoovpoopppopoopooovoolooopoolllllolllllllClly$!!9!!!!!!!!! ! ! ! !             px   ա~~~~~ڤ~~~~~~}~}}}}}}}}}}}}}ww}}}ww}vw}w}wwwwwvvvwvwvvwvvvvvvvovvvvvpppppwopppoppoopoooupoooolloooollllllllllllollly$!!9!!!!!!! !! ! !!! !             !qx    Ց}~~~~~~~~~~~~~~~~}}}}}}}}}w}~}}}}wwwwv}}}}}v}}wwv|wwvwvwvvvvvvvvvvvppwpvvvvvvvopvppppvvulolooloullltloooollololollClolClu{$!!99!!!!! !! !!! !!       !    vx  Տ~~~~~~~~~Ԣ٤~}}}}}}}}}~~}}}}}}}}}}}}}}wv}}}w|wvvv|wwwvpvwvvpwwvvpvvvopwvvpoppovvvvppolpoolopololloolllllllloullllllllllCllCC{$$99!!!!!! !!!!!!!!  ! !!! !              vx  Տ~}~~~}~~~~~~}~~}}~}}}}}}}}}}}}|}}}}w}}wv|}ww||vww}wwvv|vpvvvvpvvvvvvvvpovvvvoopouplppopppplolooooooolollllllllllClllCCllCCl$$!9!!!!!!!! !!!! ! !! !           !vx  Տ}~~~~ॡ~~~~}~~~}~~}}}}}}}}}}|}}}w}}}ww}}}}wwwvwwwwvwvvvvvvvvvvpvvpvppovvvppppopppoppououoloploolootollolllllllollClCClClllC$$$9! !!!!!! !!!! !! !       !    ! !vx  Տ}~~~~ۦ~~~}~~}}}}}}}~}}~}~}}}}}wvw}|}}}}ww}wwwwvw}wvwvwvv}wvvvvpvvvpvvvvvppppwppoppoolooouopvoloolllloooopllllCllClllllCltlCCt$!!9! !!! ! !!!! !!! !     ! !         p_     Տ~~~~~~~~~~~ۦ樑~~~~}~~}}}~}}}}}}}}ww|}}}ww|}wv|||vvpvv}|w}w|vvvvvvvvvppvppopopvvoopoppppvvoppullooollolpollllltlCollllllllllCClCCCCCt$!!!!!!!!!!!!!!  ! !!  ! !     !    !   !px  Տ~~~~~~~~~~ۣ֤~~~~~~}}}}}}}}|}}}}}}ww}}ww}}}}wvw}}vvvv|}wv}wvvwvvvvvvwvvpvppvpv|pppooppupoopoopolopllllulollllolllllllllllCClCCCCCllC?Cu!!$9!!!!!!!! !!! !           !px Տ~~~~}~Ԣ楢}~}~}~}~~}}}}}}}}}}}}}}|}}w}}}||www}w|||v|vv}wvvvvvvvvpvvvvpw|opvpvvvuppovpoollovoooluoloollolloollolllCllllClllCClCClCCCCCu!!99!!!!!!!!!!!!! ! !       !    !pxӏ~~}~~ۣԣ~~~~~~}~}}}}}}}~}}}}}}}wv}wvvw}}|w}}vw|vvvvpvvvvppvvvpovpw|ppppppvvvpopopvplupoopppuolllopolltllllllCClolloollllCClCCC?ClCx$!!!!!!!!!!! !!   !          ! !vx Տ~~~~~~~~ۣ楢~~~~~~}~}~}}w}}}}}}w}|}}}}ww}w}w|}|vv|}|v|vvw|vwwvvvvvvvvvvvppvvpppoppooppoopvppooooooououooooolllllllololCCCClllllCClCCCCClCCCt=$$9!!!!! !!!!!!!! !!! !       !    vx ӏ~~~~~~ۣԢ~~~~~~~~~~}}}}}}}}}}w}}w}}|}}}}v|||v|w|wv||vvvwvvvpvvvvpppppvpppopoovppopppovppolloooolollloollllllllllllCCCllllCCCllCC?CCCC$$!9!!!!!!!!! !!!!          !vxՑ~~~~~~ۦ止~~~~~~~}}}~}}}~}}}}}}}}}}|}w|}}wwv}}w|}wvwwvwvvvvvv|pvvvppppvpvpopvpopvpppoppppopvoloplllloolluolloollllllClCCClllllCCClClCCCl!9!9!!!!!!!!!!!! !! !  !  !      !px ԑ~~~~~ۦݢ~~~~~~~}~}~~~~~}|}}}}}}}}}}}ww}}}|wwwwv|}v|wvwv|vpppvvppvpvvpoppopvvvppppopvpolollpoolooopolllolllllpllooolCloolllCCClCClltCCC!=$9!!!!!!!!! !! ! !!!  ! !     pxՏ~~~~~~ۦꨢ~~~~~~~~}~}~}~}}~}}}}w||}}||vw}wvw}}vvvw}vv|}wvvvvvvvwvvvvvvvvvpppppppoooppoolppolooouolloloollllCCoClllllllllCCCltllCCCCCCCC!$!$!!9!! !! !!!!!!               vx~~~~~~~ۣݢ~~~~~~~}}}~~~}}}~}}}}}}}}}||}}www}}|v|}|vwvw|vv||wvvvvvvp|wvvvpwvpppppvopopoovpoooppooppopoloolllloolllllllllCllllllCClClCCCCCCCz{$$!9!!!!! !!!!!!! !! !  !   !    !vx  ӏ~~~~~~ۣ먡~~~}}~}}}}~~}}}}}}|}}}}wwvwvv|}}wv|vvvw|vwvvwpvvvwvpvvvvpppppppvvpvvooooopopooolooplloloolllllllCllCllCCllClCCCCCCCCCx$=!9!!!!!!!!! !! !!!!!!          px Տ}~~~~ۣ樣~~}~~}}~}~}~}}}}}}}}}}w}}||}|}}}wv||}}vv|wv|vv|wvwppvpvvvvvvvwvpvvvvvooovvplooloolooooolololllllllllllllColCllCClCCCC?CCCy{!!!!!$!! !! ! !            |x   Տ~~~~~~ۣݦ~~~~~~~}~}~}}}}~~}~}}}}}}|}w}}wvs}}v|wwvw||wvvvv||vvvvwvvvpvvvvpvpwvovppopooooopo|plvooooooploolllollllllllllCllllClllCCCClCllt!!!$!!!!!!!!! ! !!!  !             ux  Ց~~~~~ۦ~~~}~~~~}}~}}}}}}}}}}}|}}wv|}wvw}}w}|v|vvpvwwvpvpvvv|ppvvppppppppppopppooopowplpoppoooooooollollllllllollClllCClCClClCCCxz!!!9!!!!!!!! !!! !! ! !!        !   px   Ց~~~~ڢ~~~~~~~~~}~}}~~}}}}~}}}}}}||}}}}}}w||www||wwvv|}}|vvpvwppvvvppvvpoopvovvpvvvppvolpolloooloooolloopplloollllllllCllCllClCClCCCt!!!! !!!! !! !!! !!!               !!vx  Տ~~~~~~~~ۦ~~~~~~~}~~~~~~~~}}}~}}}~}}}}}}}|w|}}}||w|wv|}}wvwvp|||pvppvppppvvvpvvpoppppooopppooooopoooopollllloollCllllplllllCCClCClCCCCCzz$!!!!!!!!!!!! ! ! !!  !      !      px  Տ~~~~~~~ۣ㣢~~~~~~}~~~~~}~}}}~~}}}}}}}}}}~|}}|w}wvwww|vvw}wvvvv||vvvpwvp||pvvvpppvopppopppppopoooppoopoooooollloollllllllllllloCCClClCCCCt$$!$!!!!!!!!!!!!! ! !               !vx    Տ~~~~~Ԣ~~~~~~}}~}~}}}}}}}}}}}}}~}||}|vvw}ww|vvv}vvp|vpvvvvp|wvw|pppvppppvvvpppppvpooopooooopoloooollloollllooClllCCllCCCCllCCCxx!!=9!!!! !!!! !! !!            !vx    ӏ~~~~~~~ۣ뢣~~~~~~~}~~~}}~}}}}}}}w}}w}}}|vvv|wv}}}vvvvvvvpvvvwpvvvvppvvpwppppppopooooooppoooooolllolllopolllllloplllCllClCllllCCClt!!$9!!!!!!!!!! !! !         !     !px   Տ~~~~~~ۦݦ~~~~}~~~}}}~~}}}}}ʐ}}}}}}}}wpwwpv}}|}|vv}vvwppppvvvvvpvpppppvppppoooooopoooopollopolllolollllllllClllllClCClllC{u$!!9!!!!!!! !! !! ! !  !          o_    Ց~~~~~~~~ۣ~~~~~~~~~}~~~}~~~}}}~}ߘ}}}}ٜw||}}wvww|w|w}wvvv}vvwvvvvvvvpppppppvpppoppoooooooooloplloooolllllllllllllllllllColCCCClCt!!!9!!!!!!!! !!!! ! ! !           ox    Ց~~~~~~~~ۣ㣢~~~~~~~~~~}}}~}}~~Ӑ}}}w}}}Ґ}}wvww}wvpvv}vvvwvvvwwwvppvpvvppppvpoooppppoooooopoloollollllllollClolCllllCClCollCCCCxt$!!9!!!!!!!!!!!!! !!!           ! px   ԟ~~~~~~ۣ~~~~~}~~~}}}~~~~ߙ}~}}w}ٙw}vvvwwvvpwvvpvvppwvpvppvvpppppoppovpvpvopooloooooooolooollpoollllllllllllllCllllClCu$!!9!!!!!!!!!!  ! !!! !            !vx     Տ~~~ۣ뢢~~~~~~~~~~~~~~~~}~ٞ}}ٙ}}|v}wv|}vvvwwvpvpvvvvpvopvppoppppopopoopoooppolloooloooloolllllllllllllllllCClCCzu!$!9!!!!!!! !! !            !vx    ~~~~~ۦۡ~~~~~~~}}}~}}ә}}ߜ}v|w|||vvvvwwpvvwppvpvvovvpppvpopopopoooooooolooooooolloolllllllllCllCCCllCCllly!$!!!!!!! !!! !! !  ! !             vx     ӏ~~~~~~~~ۦ~~~~~~~~}}}~~ґٚ}wߙwvvvvpvvvvvvvvvpvvvvvpvvpvwvvvppvpoooloolooooollopollllooollllClCllClCCCClll{t!!!9!!!!!!!!!!!!!!! ! !             px       Տ~~~~~~~~ۣڣ~}~~~~~}}}~|v}~w}אwwv|vpvv|vvpppvvvvvpppppvpvpopopopppvpovpolooloollolllloolollollollllllCCC{y$!!9!! !!!! !!!! ! !             ox      Տ~~~~~~ܣ~~~~~~~~ґי}}}}}}|}}}Ӑ}wv|wvwvvpvvpv|vppppvvpovpppppopoppppoopollollolloolllloollllollClCllCCCl{t!!!9!!!!!!!!!!! !  !          !px          ~~~~~~~ܦ룢~~}~~א}}}}}}}}}|}}w}}}}אw}}wvw|vpvvppvvppvvpvpovpppppppoopooppollopololllolollllllllllllllCClCll{{!$!9!!!!!!!!!!!! !              !px       Վ~~~ۦۢ~~~~~~~~}~~ّ~}}}}}}}}|}}}}}}}wאwwpvvvvppvpppvvvvpvpvppvpppvppppoppllloooppolllllllllllloolCClllCCCll{t$$$9!!!!!!!  !! !!           !px             Տ~ܦ~~~~~~~~~}~~}~Ӏ}}}}}}}}}}}}}}}}}|}|||}w}vw}vv|v|vpvpvvppopopoppopoloopoolopoooooopollooploolllllllllllCClly$!$!!!!!! !!!! !!           px       Տ~~~ۦݡ~~~~~~}}~}}}~}}|}}}|w}}}wv}v|w}|}ww|vvvvvvvvopppvpoovpopopvooppoooooooloooooollllllllllllllllCCClC{u$!!$!!!!! !!!!! ! !  !         px        Տ~~~~~~~ۦ~~虀Ӏ}~}~~~}}}}}}}s|w}|w}|}w|}w|vv|w|wvvvvpvvvppppvvvopppvpopvopppoooooppllopoppllllllllllllllllCCllly!!!9!!! !!!!!!! ! !!            px              Տ~~~~~~Ԧ棢~~}~~~}~~褑}}~}}}}}}||}~}}}}}}|}w||w}}}}|w|||}ِwppv|pppp|ppopovppvvppvooloppoopploppllooololClllllllllllllllt!!!9!!!!!!!!!!!!!!!             ox             Տ~~~~~~~~ۣ~~~~~~~ِ~~~~}~}}}}}~}}|}~~}}}w}}}}|}}}v||wʘvppvpvvp|w|vppoppopooplopopppploollllllllllllllllllllllCCCCly!!!9!!!! !! ! ! !!   !        px               Տ~~~~~~ۦ~~~~~~Ӏ~~}}}}}}~}}}}}}}}||}}}}}||}}wvw}}vvvvvwvvvvvpppvvvvpopppopppoopopoopooollllolllllolllollllllClCCCu!!$!!!! !! ! ! !!!!! !           !px                      ӏ~~~ܫڡ~~~~~~}~}}}}~}}}}}}}}}}||}}}}||vw|vv||vvw|vvvwvv|ppppppvvpovpovvppppolpoooooopollpllollplllollClCllllluu!!$!! !!!! !! ! ! ! ! !             vx                        ӏ~~ۢ~~~~~}~}}}}}}}~}}}}|}}}}}}}|www|}w}||vvvvw}}wv}wvw{vv||vvpppoopppvopppppopvollpoooollllllollllllllllllllly!!!!!!!!!!!! !! ! ! !     ox                 Տ~~~ܣ桡~~~~ב~}}}}~}~}}~}}}}s}}}}}}}}w||}}}v|www||}|v}wp|}wvvvvpvvv|vooppoopppoooooooollopplollloollllClollllCty!!!!!!!!!!!!!! !  !           o_                           ~~۫~~駑~}}~}~}}}}}}}}}}}}}}}}}}}||}}}ww|wv|w|wwvv|vv}pwwvvppvvvppopvplpvvooooppllooolollolloolllllllClllCy!!!9!!!!!! !!!!  !!                p_                                 ~~~~ۦ~~~~~~~ّ~~~~}~}}}}}}}|}}}}v}}}}}v}}|vw}}}|w}vww}|vvv}vpvwppppvvppvppopvvoppoolloolpolloollllllllllCCllluu!!!9!!!!!!!!! ! !!            !p_                                        Վ~~~ۣڢ~~~~~~~ّ~~}~~}}}~}~}}}~}}}}}}w}|v}|vw}}}vwpvv|v||vpp||vwv|wpppppopopppoolooopopollopoollooolllCloolCCll{!$!9! !!!! !!!  !!!        !  ox                                   Տ~~~ܦ~~~}~}~}}~}}}~}}}}}}|}}}}}|}}w}}}|}ww|v|wwvvv}||v|vpvvvvwwppoopooppoolpolpppolooooollllollllolClllluy!!!!!! !!!! ! ! ! !            ox                                         ա~~~~~~ۣ롢~~~}~~}~~}}}}}}}}}|}}}}}}}}}}w|w||||vw|vv|w|}vwvpvvvpwyopvpoopplpoooooooooollllllllloolllCllll!!$9!! !!!! !  ! !       px                                Տ~~~~ۦ~~~~}}}~~~~}}}}}}}}~}}~}}}||}}}}}w}}wvvwvpppvvv|w||}}vvwypvvooppollloooollloloollllloollllClCuu!!$! !!!!!!!!!    !      ox                                                    Ց~~ܫ~~~~}}~~~~~}}}}}}~}}~}}}}}}}}}}}}}}w}}w|}}w|}}}|v}}|wvvw|wvvvvwvypoooploppooopoooollllolllllllClCll$!!!!!! !!!! !! !!!       px                                                                  ա~~~۫䢢~~ؤ~~}}}~}}}}~}~}}}}}}}}}}}|}}}|}}}}||w|}}w|||}|w||v|wvvvppwooppopplllplloollolllllllllllloyy!$$9!!!!!!!!!! !!!! !      px                                                                          Տ~ۣ~暤}~~}~}}~~}~}}~~}}}~}}}}|}}ww|||}}}}v|}vwvwwvv}}|vwvvwvvvp|vpvoooollolloooopllllloollllol!!!9!!!!!!!!! !      p_                                                                             Տ~~~~ۦ뫢ґ}~~~~~}}~~~~}}}~}}}}}}}}}}}|||}}w|wvv}}vppv}}vvppvvvvppvooooloppooooollllllllColCCyy!!!9 !! ! !! !     !px                                                                   Տ~~~~~ܦء~।~~~~~}}~~}}}}}s|}}}|}||}}}}}|w|||}w|}}||}|vp||w}||v|vpvv{vppooolllollopllllllllolC!$$9!!!!! !!! !  !            px                                                                                              Տ~~~~~ۦ~ґ~~~~~}}}~}}}}}}}}}~}}||}|}}|}}}|||||||}|||}w|vvvv|||wv|vp|wuooolllolloolllolllloly{!$$9!!!! !!! !  !         px                                                                                                             Տ~~~ۦꡡ~~~٤א~~~~~~~}~~~~~}}}}~~}}}||||}}s}}}}||}|v}|}}w||}|vp|vpvvvw||vߔollloooooClooolollCl!!!9!! !! ! !! !!     px                                                                                                                        Տ~~~~ۦ駤暑~}~~}}}~~~}}~~}|}}}}}|}}}}~}}|}}|}}}|}|v}vv|pvv||vvpv|||wvopo߆vppllllloollllllC!!!!!! !  !! !!         o_                                                                                                          Տ~~ܦ٤ґ~}~}}}}}~~}}~~}}}}}}||}}}}}}}|}|vw}}}|v|p|||v||pvwwpv|pvpߔolloolllllllllu!!$!!!!!!!!! ! !!         p_                                                                                                     Տ~ܫ䡡角ए~~}}~~~~~}}~}}}~}}}~}}}}}|}}}}}}}}}||}}}}|v}vw|pvv|v||vvvpv|p߆ololllllllll$$!!!!!!! !! ! ! ! !      px                                                                                                                           ӏ~~ܩؤ~~~~~}}~~~~}~}}}}}~}}}}|}}|}|}}||}|vv}}|||vv|w|pvpv|v|vvo߃oollClllly!$!!!!!!!!!  !   !      o_                                                                                                                                                       Տ~~~~顑蚤ؑ~~~~}~~}}~~}}}|}}}}}}}}}}v|}|w|vvv||v}}|v||vvvvppp|vppppwv߆uoloool!!9!!!!!  !!!  ! !     p_                                                                                                                                                                Տ~~~~ܦԡӤ暑~~~~~ґ~~~~~~}~}}}~}}}}}}}}}}}}}|}}|}}|w||}||}}v|w|vvvv||vppvvvwvߔolll{$$$!!! !!!! !!       p_                                                                                                                                                    Տ~~~~~~ܦ楚ґ~}~ӑ~~~~~~~~}}}}~}~}}}}}}|}}}~}}}|}|||v}v||vvvv||vwv|wwppvvvwvuu$$!!!! !!!!  ! ! !     px                                                                                                                                                          ՟~~~~~~ۦꡡԥڤ~~~~~~~~}}}~}~}~~}}}}}}}}}|v|}||}v|v|}|}}w}||w}}||w|p|vppwvpp}p!!!9! ! !!!!! !      ox                                                                                                                                                               ԡ~~~ۣڥ鬡~~}~}~~}}}}}}}}}}}}}}}}w}}|}}}}|}||||w|||v|}|vv|w|vv|w|vv{!!!!!!!!!! !! !         o_                                                                                                                                                                 ՠ~~ۣԧؤ~~~~~~~~}}~}}}}}}}}}}~}}s}}}}}}|}}}}}||w||wv||v|wvv|v|}vppvvvvw!$!!!!! !! !! ! !     p_                                                                                                                                                          Ց~~~~ۦڡ蚑~~~~~}~}}~}~~}~~~~}}}}}}||}}}}}w|}}}}}|}|vv||pvvp}v|v|vv|||vppppv|vv!!!!!!!!! ! !! !    px                                                                                                                                                  ֏~~~۫ܢ~~~~~~}~~}}}}}~~~~~~~}}}}~}}}vv|||}}||}}|||}}||vv||pvpppv}vppvv!!!!! !!! !! ! !!     px                                                                                                                                                      ~~~~~~~ۦॡ~~~~~~~}}~}}}~}}}}}}}}}}}}}}|}}w}}|}}||}vvw||||vvvv|vvwvvpppvp!!!9! !!!!!!!! !       q_                                                                                                                                                                 ӎ~~~ۣ槡~~~~~~~}~~}~}~~}}}}}}}|}}}}}||}}}}}}}}||w}w||vv|||||vvvvvv||vppvpvp!!$9! !!! !!! ! !       vx                 @@                                                                                                       9                  Տ~~~~~~ۣ謡~~~~~~~~~~~}}}}~}~~}}}}|}}}|}||}|w|||vv|}}}w||||vww|pvvppvppppvvp!!!9!!!!    !  px          9;                                                                                                         9_@                ~~~ۦ䧡~~}~~}}~}}}~~~~}}}}}}~}}}}}}|}|}}}}}}}}}}}}}vvvwvp|||v|pv|||pppvwv!!!!!!!! !!!! !! !     px              !z;                                                                                                          9Z9             Տ~~~~ۦ~~~~~}~}~}~}}}|}}}}}}}}|}}}s}}}|}}||}||}|v|vvvv||vwvv||vvp|vwv!!!!!! !! !!! ! !     p_           !!                                                                                                                               ~~~~~~~~ۣ~~~~~~~}~~}~~}}}}}}}~}}}}}}}}}}}}}}}}}}||vv|vv|vvvv|vvwvvvvpvv}vwv!$$!!!!!!!! !      px                                                                                                                                                  Տ~~ۣ~~~~~}}~}}~~~~}}|}}}~}|}ww||v||}}}}}v|w}}vv}vv|vpv|vvp|vwp!!!!!  ! ! !!   p_                                                                                                           ~~ۣ~~~~~}~~}~~~~~~~s}}~}}}}}}}}}}|||}}||}}w||||v||vv|vpp||vv|vpvpwp!!!!!! ! !!!   !! !  p_                                                                                                Տ~~~~~ۣ~~~~~~~~~~~}~}}}}}}}}}~|}}}}}}}}}}|}}||||v}}}vvvp|vpvw|pv|vppp{p!!!! !!!! !!! ! !     o_                                                                                                       Տ~~~~~ۣ~~~~~}~~~~~~~}}}}}}}}}}}}}}|}}}}}w}}}vvv}v}}}vv||vvv|||v|ppvvpv!!!!!!! !! !        p_                                                                                                                 ա~~~~ܦ~}~~~~}}}~~~}~}~}}~}}s}|}|}}}|||v||}}}}}vv}ww|v||vvvvppvvwv|wv!! $!!! ! !!   !    p_                                                                                                               ՠ~~~~~ۣ~~~~~~~~}}~}~}}}}|}}}}}}}}~|}}}|||}w}w|}}w}||||vv|v|vwvvqvppp|vp!$!!!!!!! !      p_                                                                                    Տ~~~~~ۣ~~~~~~~~~~~~~}}}}}}|}}}}}}}s}}|}}||}w|}|w||vw||pv|v|vvpwvppvpp!!!! ! !!!!    v_                                                                 Տ~~~~ۦ~~~~~~~}~~~~~~~}~~}|}}}}|}}s||}}}}|w||||vv|vv}v}}pvv|w}|pp|p|vvpv!!!!!! !     !     v_                                                                       Տ~~~~ۦ~~~~~~}}}}~~~}~}~|}}}|}}~}}|v|w}}}|}|||v||vvpvvv|vv|vvvppp!!!! !!!     px                                                               Տ~~~ۣ~~~~~~~~~~~}~~~}}}}~~}}}}}}}}}}}|}}v}ww}||}}|v||||vpvvv|w|vvv|vpp!!!!! !  !      px                                                                    Տ~~~~~~~ۣ~~~~~~~~~~~}~}~~}}}}~~}}|}}}}s}}}|}}|}}|||||||v}|||||wvv||vp||vppv!!!!!!  ! !   p_                                                       Տ~~~~ۦ~~~}~~~}~~}~~}}}}~~~}}s~}}s}}}}vws||}|||vvv}wv|||vvp||vvv||pppvvppvv!!!!!!! !!!!  p_                                Տ~~~~~~~~ۦ~~~~~~~~~~~}}}}}~}~}}}}}}}ww}}}}}w||}||w}}|wvw||w|vpvvvvvpppvpvpp !!!! !       px                              Տ~~~~~~ۦ~~~~~~~~~~~~~~}~}}~~}}}}}}}}}}}}}}}}}||w}}w|}}}||||}||}vvvvpvv|vvvpppw!$!!!!! ! !!    p_                                          Տ~~~~ۣ~~~~~~~~~~~~~~~}~~}}}}}}}}|}}}}|}}|w|}}|||}w|w|v|vv||vvpvvvvv|vppp!!!!!!  !    !v_                                    Տ~ۢ~~~~~~}~~}}~~}}}}s}~}}}s|}}}}}||}}}}v}|v||vw|||||v|wv||wvpppvppv! !!!!  !! p_                                          Տ~~~~~~~ۣ~~~~~~~~}}~}}}}}}~~}}}|}}}}}||w||v}}}}||vvv|p|vp|||pvvvvpvvvw!!!!!!! ! !      p_                 Ց~~~~~~~~~~~~~~~~~~~~~~}}~}}}}}}}}}}}}}}}}}wv}||w}}www}}w}!!!!!!!!!       p_             Տ~~~~ԣ~~~~~}~~~}!!!!!        p_                 Տ~~~~~~~ۣ~~~~~~~~}~~~~}!!!!!!!! !!      p_              ԑ~~~~~ۣ~~~~~}~~~~~~~~!!!!!!  !    p_                Տ~~~~~~~~ۣ~~~~~~~~~~~~!!!!!! ! !  !   p_         Տ~~~~~~~~Ԣ~~~}}}~~}}}~~}}}}~}~}}}}w}}}!!!!!!!  ! ! !      v_       Տ~~~~~~~~~~~~~~~}~~~~~~~~}}~}~~~}}~}|}~}}}}}}}}vw|} !!!!!!   ! !  p_      Տ~~~~ۣ~~~~~~~~~~}~~~}~}}~~}}}}}}s}}}}}}}}}}!!!!!!!! !       p_               Տ~~~~~~~~ۢ~~~~~~~~}~~~~~}}}}~~}}}}}}}}}|}}}}}}!!!!!!!!!   p_              Տ}~~~~~~~~ۢ~~~~~~}~~~~~}}~}}}~}~~}}}}}}}}w|}}}!!!!!  ! !     px         Տ~~~~~~~ԣ~~~~~~~~~}~}~}}~}}}}}}}}}}}|w!! !!!! !!    o_    Տ~}~~~~~ݣ~~~~~~~~~~~~}~}~~~~~}}}}}}}|}|}}}}||}!$!!!! ! ! ! p_              ~~~~}~~~~~ݣ~~~~~~~~~}}~~}~}}~~~~~}}~}}}}}}}}||}}}w!!$!! ! !   !  o_               ~~~~~~~~㣣~~~~~~~}~~~~}~}~}~~~~}}}~~}}}}}~}}~}|}}}w[!!9!!!! !!    p_              ~}~~~~~뫣~~~~~~~~~}~~}~~~}}}}}}}}}}s}}}}}}}}|w}}}@!!@_ ! !!!     p_                     ~~~~~~~~~~~~~~~~~~~~~~~~}~~}~~}~}~}}|}}~}}}}}}}}}}||}}}9!!]Z! !  ! !   p_                    Տ~~~~~~~~~~~~~~~~Ԣ~~~~~~~}}~~~~~~~}~~~}~~}}}}}}}|}~}}}}}}}}w!!!9! ! !      p_                             ԡ~~~~~}~~襢~~~~~~~~~~~~~}}~~~}~}}|}~}||w|}}}||s}Z!!!!! ! !!! !   p_                      Ց~~~~~~~~~~~~~~~~~~~~~~~~~}~}~~~~}}}}~}}}}~}}}}w}|}}}}}$!!@_!!! !!   v_                        Տ~~~~~~~~~~~~~~릣~~~~~~~~~~~~}~~~}~~}}}~}~}}}w}}}}}|}}}|}Y!!@! !  ! !    p_                                    Տ~~~~}}~~~~ݣ~~~~~~~~}~~}~~}}}}}}}|~s}}}}|}}}}}vw}w}!!!B! !!!!! !   o_                                                                   ӏ~}}~~~~~~~~~~~~~ۣ~~~~~}}~~~}}~}~}}~}}}}}|}}}}}w}||w|}9!![!  !!! !     p_                                            Տ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}~~~}}}~~}}}}}}}}}}||}}||}B!!!@!!! !!   !   o_                                                             ~}}~~~~~~~~~}~~~~~~~~~~~~~~}}~~~}}}}~}}}}}~~}~}|}}}}}}|}}}|}[!!@Z !!!!!!!  !p_                                                                     Տ}~~}}~~~~~~~~~Ԣ~~~~~~~~}~}}}~~~~}~}|}}}}}}}}}}}}|v}}||}}}}B!!!!$! ! !!!!    !   o_                                                                    ա~~~~~~~~~~~~~~㨣~~~~~~}~}}~~}~~~}}}~}}~}}}~s}~}}}|}|}}|w9!!!$@ !! !      q_                                                                      ա~~~~~~~~~~~ڨ~~~~~~~~~~~}~~~}~}}~}}~}}}}}}}}}}}}}}}}}}}|}Z9!!!!_ !!!! !     v_                                                                       Տ~~~~~~~~~ݨ}}}}}}w}ww_9!!!!=! ! !!  !!  o_                                                                                 ~~}~~~}~~~~}}~~~~~~~~~~~ÄZ;!!!!$$B9!!!!!! !!!!       p_                                                                                             ~~~~~}~~~~~~~~~~~~~}}|||w}w|w|wvwv|vvpvwww}vvvvvvppvppppvpoppppopvppooooooopppooollollpllolollollCllClClllllCCClCCCC?CCCCCCA?CCA?>>CA>C>>AA>C>>>>>=>>>=>>>>>==>=====$========9$===$9$=$!$$$!!!!9;!! !! ! !! !    v_                                                                                                        ӎ~~~~~~~~~~~~~~~~}w||v|vvvwv||||vppvpvvvppppppvpoppvppppopppolopppooolooloooloollllloClollllllC?llll?ClCCC?C?CCC?C?CCA>CCA>A?>>>?>>>>>>>>>>>>>=====>========>=====$===$===$$=$=$$$!$$!!$$!!9x;  !!! !!        p_                                                                                                              ֏}}}}~~~~~~~~~~~}vvp||w}|pvppvv||vvvvpvvpvvpvpvpvppwpvpppooolpooooloolollplllllllooCllolllllllllCCllC?C???CCCC??C?>C?>>C?CC??>>C???>=>?>>>>>>>=>A>>>============$=======$$$==$$$!=!!=!$=B[9!!! !! !!! !!  !p_                                                                                                         ؏~~~~~~~~~~~~Ҟ$!!!!!!! !!!       v[                                                                                                                  ڏ~~}~~~~}~~~~Y !!!!!!!!! ! !!    |Z                                                                                                          z~~}~~~~~~~~~~~~~~~~~~~~~~~~~}~}~~~~~~}}~}}}}}}}}}}}}|}}}}}}}}}}|v}}}}[!!!!!!!!!!!!! ! !  !}Y                                                                                                            x}}}~}}~~~~~~~~~~~~~~~~~~~~~~~~~~}~~~~~~~}~}~}~~~}~}}}|}}}}}}}}}|||}}|pw}vw΂9!!!!!!!!!!! !!    !Y                                                                                                                    _}}}~~~~~~~}~~~~~~~~~~~~~~~~~~~~~~}~}}}}}}~}}||}}}}}}}}}w}}ww|}s}|}w΂Z9!$ !!!!!!!! ! !!!     !}B                                                                                                                         ]~~~~~}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}~}~~~}}}}}}}}}~}}}}}}}}}}|}}|}||www}w„_@$$$!!!!!!!!!!!!  !   =@                                                                                                                      B~}~~~~}}~~~}~~~~~~~~~~~~~~~}}~}}}}}}}}}}}~}~|}}}|}|w}}}}|||}v|}}}}ww}w}}w}}w}wwwv}wwvvvwvvvvupvvuuvwpvuuvwppvvupuuvvpoovuuuoouuooouolooutototooootlltlolCtllCCCCllCCCClCAACCCCCAACCCAAAACCllAAAAAAAAAAAA>A=AA@@@AAAA=;===@9@@=====@9$!!!!!! !!!!!!!!!!!!! !  !  !   C#                                                                                                                #~~}}}}}~~~~~~~~~~~~~~~~~~~}}}~~}~~~}}}~~}~}~}}}}}|}}}~}}~}}|w}|}}}|}}||vvvv|v|vvwvppv|wwvppvvpppvpppp|}vvoolovvvpllooloollolllloppolllolCllClllClCCCCCllCCCCClC????CC?ClCl??CC>A>?AC?AC???A==>>>>>>>=============>======$=$$==$==$$$!!$=!!!!!$$!!!!!!!!!!!! !!!!!!! !! !!!    l                                                                                                                          }~}~~~~~}~~~~~~~~~~~~~~~~~~~~~~~~}~~~}~}}~}}}}~}s}||}}}}|}}}}||}||||}||||||v}|pv|vp|}v|v|vpvvppvvpv|vpvvppooppppppoppooopoooolpollllllllllllllllllllllCClCCCCllCCCCCCll????C???CC?>?>>=A>>>>A>>>>>==>>=>=======================$$$$$$$==$$!!!!$!!!!!!!!!!!!!! !!! ! !!      p                                                                                                                                             ڏ}}}~~}~}~~~~~~~~~~~~~~~~~~~~~~~~~~}~}}~~~~}}}~}}s}}}}}}~s}}}}}}|}|s}|||w||v||||||vvw|v||vvvvpvvvpvvvpp||p|voppppppopoopoppoooopolololloollllllllllCllllllllCClClllCCCCCCll>CC>AC?>?CC???>=>>>>>>=AA>>=>>==>=>==================$$=$=$!$$$$$$!$!!!!!!$!!!!!!!!!!!! !! !!  !!      w                                                                                                                                      }~}}}}~~}}~~~~~~~~~~~~~~~~~~}~}}~~~~~~~}~~}}}}}}}wv}||}}}|||}}}}}}}}}w||v}}}}sw}}vvp|vppppppvpppvpppppov|pvopopoppoopoppllopooolooololollCClloollllCClCllCCllllCCCCC?CC>?C?>>??>A>>?????A>>>>>>>=>>>>>=>============$=====$=======$$=$$!$==$$$$!!!$!!!!!!!!!!!!! !! ! !!!!   =_                                                                                                                             x~}~~~~~~~~~~~~~~~~~~~~~~~~}~~~~~~~~~~~~~}~~~}}~~~}|}~}}}}~~}}}|}}}|||v|v|v||}}|vv|}|pvvvppv|v|vpvw|vpoppppppoooopvpopoplopooppooooloolpollllllolllllllllCCllCCllCClCClC?lCCC?CClC??C??C>>?>>>>>>>>>=>=>A=>>=====>>====>========$$$$==$$$$$$$$$$$$!$$!!$!!!!!!$!$!!!!!!!!!!! !! !   ! lY                                                                                                                                          ]}~~~~~}~~~~~~~~~~~~~~~~~~~~~~~~~}~~}~}~~}}~}}~}}}}}}}}s}}}}}}|}}}}w}}v|}}}|v||||vv|}v|}vvv|ppvvppvppv|ppp|ppppppopoopopppoopoooplollloolllloollllllllllllllCClllC?CClCCCCCCC>l?>?C???>>A>?C>>A>>>>A>>>==>>=>>=>===========$=====$=$$=$$=$$!=!!$$!$$!$$!!!!!!!!!!!! !!!!      v;                                                                                                                                       @~~~~~}~}~~~~~~~~~~~~~~~~~~~~~~~~~}~}~}}}}}}~}}}}}}}}}}}}}|}}}}wv}|}}}}}}}w||||}|pv}|||||wvvpvvvpvvvvvppppvvpppoooppppppppoooooopollllloollloollllllClllllCllCCCll?CCCCCCClC?>C?>C????C?A??C>>?>=>>A>==>==>=>>>============$=======$$=$!$=$$$$$$!!!$!$$!!$!!!!!!!!!! !!!   !  !!!#                                                                                                                                            }}}~~}~~~~}~~~~}~~~~~~~~~~~~~~~~~}~~}~}}~}}}}}~}}}w|}}v|||}||}w|v||v|}v|v||w}|}|vv|vv}|pvvpppvvpppvpoopppppppvppoopplooolllpplllllloolllllClllllllllClClCC?CCCllCCC???CCC>?C??>A????>=>>>?>?>===>>>C>>======>==============$=====$$$=$$=$$$!!!!!!!$$!!!!!!!!!!!!!!$!!  ! !!    ?                                                                                                                                                  ~}}}}}~~~~~~~~~}~~~~~~~~~~~~~~~~~~~~}}~~~~}}~~}~~~~}}}}}}}~}}}}}}|v}}}}}}|}||||||vv}|||v|||vvqvv|qvp|wpv|pppoppppoovpppppppopooopoooloolooollloollllollllllllCCCCCllllCClCCC?C?>????CCCA??>>???>>==>==>>>>>>>>===>=>A==>====>============$=$!$=$$$$!!!$$!!$!!!!!!!!!! !!!!!! !!  !     o_                                                                                                                                     Zڑ~}}~}~~~}~~~~~~~}~~~~~~~~~~~~~~~~}~~~~~}~}}}}~}}}}}}}}}}}}}|}}|}}}}}||}|w||w|v|vq||||wvpp}vp|vpvpvvvpppppppvppvpppolopppooopopolooloolooololCloollllllllllllCllll??ClCCCCC????CCCC>C?>A?>>?>>>?>=>>>>>>>=>>====>=================$==$$=$$=$$!!$$!!$$$!!!!!!!$!!!!!!! !!!! !   !   $@                                                                                                                                                 #~~~}}}~~~~~~}~~~~}~~~~~~~~}~~}~~~~}}~~~~}}}~~}}}~}~}}w}}}}w}}}v|}}}}|}|}}}}vvpv|p|vpv|vq|vpvwvpovvpwppvpp|wppooppplopppoopppolooooollololllllllllllllllllllCCCC??llCCClClCC??????>CC??C>>>?>>A>=?>>>>===>>==>==>>================$=$$$$$=$!!$!$$!!$$!!!!$$!$!!!!!!!!! !!!! !  !!!   C                                                                                                                                                   ӎ}}}}}}~~~}~~~~~~~~~~~~~~~~~~~~~~~~~~~}~~~~~~~~~}}}~~}}~}}}}}}}}|}}}}}}}w}||w}}w}||vv}vvp||vp||wvppvppppv||vwvpvpvvpppvoooopppppllooopopoloolollollllloollllolllllllCCllCllCCCCCCCCC?CC?>>>??>?>A>CC>>AA=>A>?>==>============>>>>====$====$$====$$$!$$$$$$=$$$!!!!!!!!!!!!!!!!!!!!! !    !|                                                                                                                                             z襏~~}~}~}~~~~~~}~~~~~~~~~~~~~~~~~~}~~~}~}}~}}}}}}}}}|}}}}}}}|}}}}}}|}}}|v|||v||}}w||vvv||vpvvppvvpppppppvpppvppoovvpoppooooolopppolollpllllolllolllllllllCllClCCCClC>CCC>ClCCCC??CC?>?C>>?>C??>>==>>=>>=>A=>=====================$$==$$$=$$$$$!$!!!!!$!!!!!!!!!!!!!!!!!!!! !  ! !   C]                                                                                                                                           YՑ~}~~~~}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}~}~}}~}}}~~}}}|}}}}}}}}}}}}}}}}w}w}}v}}}v|}}||wwvv|vvvvvvvpvvppppppvvpppppppoppopppppooloopoppoolloloollllolllllllllCllCCllCC?lC??CC?CCC????CCCC>AC>?A>>>>C>>>>=>>=>>>===================$$=$=$=$$=$$=$$$$!$$!!!$$!!!!!!!!!!!!!!!!!! !! !  !   |;                                                                                                                                                褏}~}}}~~}}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}~}}~~~~}}}}}}}~}}}|}}}~}}}|~}|}||||vw|vw}}}}|||}vvp||v|vvpv|v}vv|vppppvppppvpooploolpooppoololloooooooolloollllCllClllllllCClCCllCClCCCl?CClCC?>?>>C>>??C?>=>>???>>>==>===>=>>>>==>============$$===$=$!$$=$$$$$$!!!$$!!!!!!!!!!!!!!!!!!!   ! ?                                                                                                                                                xӏ}}}~~}~}}~~}~~~~~~~~~~~~~~~~~}~~~~~~}~}}~~}~~}}}}~}}}}}}}~}}}}|}~w}|v|w||}v}}v||||v|ppv}wpv}|v||vvppv|vvvvvvvpppppopppvvpppp|ollolloppoplllllllllllllllllllllCCCCllllCCCCCCC?C?C??CC?>>?C>??>?>A?C?>>>>>>>C=>>>>>===>====================$$=$$$==$=$$!!!!$$!!!!!!!!!!!!!!!!!! !!  !!!!     $}Z                                                                                                                                                        ;~}~}~}}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}}}~~}|}~}}}}}|}}|}}||}}w|}}}|pw|v|v|||vv||v|p|v|vvppvpppvppvppppppppppopppoooopoopooooollooloolllllolllllllClCClllCClllCCCCCCCCCC>C?????C?>>>?>A>>>>=>>=C>>==>>====>>==>================$$$$!=$$$$$!!$$$!!!!!!!!!$$!!!! !! !!! ! !     l#                                                                                                                                           ء~~~~~~}}}}}~~~~~~~~~~~~~~~~~~~~~~~~~~}~~}}}~}}}~~}~}}}}}}}}}}}}|}s}}}}w}||}}}wv}}vvvw}vv||vv|pv|wp|vpvpppppopvvppoovopooppplpppppopooolollpolpolllllollllllllClllCllClllll?C?CCCC??CC?????C>>>>>>>>>>>>>=>?>=>>=====>>==>=========$=========$!$$$$!=$!$$!$!!$!!!!!!$$!! !! !!! !    $z                                                                                                                                               ]}~~}}~~~~~~~~}~~~~~~~~~~~~~~~~~~~~~~~~~~}}~~~~}~~}~~~}}}}~}}w}}}~}}}}}}}|v|}}|||v|||}w|}}|v|ppvww|vvp|ppvvpppppppvpppvpppvvpppppppppoooopoppllllollllllllllllCCCCCllllllCCClllCCCCC?CCCCCl?>?C?>????CC?CC?>>>==>?>>A===>>=>>>========$==$=====$==$!$$!!!!$=!$!!=$$$!$$!!!!!!!!$$!! ! !!!!   pB                                                                                                                                                     #~}}}}}}}}~~~~}}~~~}~~~~~~~~~~~~~~~~~~~~~~~~~~~}}}~~}~}~}}}}}~}}}}}}}}|}}}~}}}}|||w}||||wv|w||vp||v||vp|pp||pppv|vpvvvppppppooppoppololopolopllllpolpllloooooolllllllllllCClCCCCCC?CC???CCCCCC>A?>>?C>>>>??>>>>=>>A=>>>>>==>=>>====>===========$=$$==$=$$$$$=!!!!$!!!!!!!!!!!!!!$!!!! !!!  !    ?                                                                                                                                                                xՑ~}}}~~~~~~~~~~~}~~}~~~~~~~~~~~~~~}~~~}~~~~~}~}~}}~}}}}}}}}}}}|}}}}}}|}}}}|v|v||v|||p}|v|v||vvppvv|vvpvvvppvvppppppppooppopooplopooloooooooopolllllollllllllllCCCCCllCCClCCCC>CCCCCCCC>>C?>>CAA?>??A>>>>=>>=>>=>>>===>===>=========$==$$==$$$$$$$!$$$!$$$!!$!!$!!!!$!!!!!$!!!!! !!     =}Z                                                                                                                                                                ~|}~}~~~~~~~~~~~~~~~~~~}~~~~~~~~~~~~~~~~~~~~~~}~~~~~}~~~~~~~~~}~~}~}~}}}}}}}}}}}|}}v}}||}|}|}}}|}|}vwwp|}|v|w|wv|wvvvpv||pvvpvpvvpppppppvppppppopoopoopppooopooloolooolllllllllllCCCCCllCllCClCCCCCC?CCCCC?C??CC>>C?>CA?A???A>>>>>A>>==>=======>====>=======$$$==$$$!$$$!!=$$$=!!!$!!!!!!!!!!! !!! !!!!!!!!    !v                                                   Y@                                                                                           x~}~}~~}}}}~~~}}}}}~~~~~~~~~~~~~~~~~~~~}~~~~~~~~~}~~}~~}}}~}}~}|||}}}}}||}}v}}}}|wsv|}}|}}p|}}|v||vvvw|}wvvppppvpv|vvpvppppvppopppppvoopoooolppolllllllloollloolllllllCllllllCCCCCCCC?ClC?????>?CCC?>AC>>?>>>>=>>>A>=====>>==>>==>>============$=======$$===$=$$$!$!!!$$!!!!!!!!!! !!!! !!!!   o[                                                                     ;_#                                                                                              #~}}~}}~}~~~}}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}~~~~}~}}}~}~}}}}}}}}}}|}~~}|}}}}}v||}|}}}||||||v|||vvv|ppv|vppv|vppvvppppvpppppppopppopppppoopooloopolloooolllllllollllClllllClllllllCCCCCCCC?CC??>ACC??>>>?>??>>??=>>>>=>A>================>===$==>==$$$==$!$$$!!!!$$!!!!!$!!!!$$!! !!!!!!!! !!  !  !    C                                                       Y@                                                                                      zْ~}}}}}}~}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}~~}}~}}}}~}}}}}}}~}w}}}}|}}}|||}|v}|v}w|||||v|v||vvvp|v|pvvvvvppvpvppvpppppppooppvoppppopopppoooooolpoolooolllllllllClllllCCClllCCllCCCCC?CCC??CC?CCC???>>>>>>>>>>>=>>>>>>>========>====>====$=====$$===$$$$=!!$!$$!$!!!!!!!!$$!!!!!!!!!!! !!  !!     ?]                                                                                                                                                          #ڒ}}}}}}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}~~}}~}}~}~~}~}}|}}|}s}|}}}|||}}}|vw||v||v|}w|v|vvvvpv|}vp|}|vppp|vpppppvvpppppvpppppppooooppopooolloollCooolllllollllllCClCCClllCCCllCClC?lCCCCCC???C>?C??>>===>>>?A>>>=>?>??>=====>>=========$$$=====$$$$$$=$$$$$$!$!!!!!$!!!!!!!$!!!! !!! ! ! ?#                                                                                                                                                  _ӑ~~~~~~~~}~~~~~}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}~~~~}~~}}}}~}}}~}}}}~~}~~}~}}}}ww}||}}}}}}}|}|||v}|}|vv|}}||w||pvvvpvvpp||vppppvppppoopppooppooppopolooloolplllllllllllllllllllClllllCCCCC?CllCCC?CCCC?A??CC?>CC?>????>?=>>>A??=>>=>===>>=========>===>===$===$$==$$=$$!!!!!$$!!$$!!!!!!!!!!!!!!!!!!  !    >Z                                                                                                                                                   Ԓ~~}~~}}~}~~~~~~~~~}~~~~~~~~~~~~~~~~~~~~~~~~}}~~~}}~}~}}}}}}}}}}}}}}}}}}|}}}}}}|||}}}|v|v||||||vv|v|||pvwvvv|vpppvppvppvvppoppvppppoolpooloollloollollollllloolllllClllCllllllCCCCCClCCCC?>>??CCC???>>>>AC?>?>>?>>>=>>====>=======>==========$======$==$$$$$$$$$!!!!!!!!$!!!!!!!!!!!!!!!! !!!! !   C                                                                                                                                                                          Yڒ~~~~~}~}}~~~~~~~~}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}~~~}}}}}~~~}}}}}}}}}|}|s}|}}}}}}|}v|}}||wpv||v}}|pvvv|pv|vvvv|vppppvpppppvppppopppopooppoploooooollllollllllloollCllolClllllllllCCCCCCCCCC??CC>??C>>>>?A>??A>?>>A?>>>=>====>>============$======$==$$$==$!$$!!=$$!$$!$!!!$!!!!!!!!!!!! !! ! !! !!      C@                                                                                                                                                      zڤ}}~}~}~~~~~}}~~~~~~~~~~~~~~~~~~~~~~~~~~}~~~~}}}}}~}}}~~}}}~}}}|}}}}}}}v}|v}}}}|v|}|||v|}|pw}|vv|||pv|ppppppppvv|vpppppvpooooppoopppopoolppoppollllllllllloloolllllllCC?CCCllCCCCC?CCCCCCCC?>??>>?CCC>>>>?C>>=>>>>>>A?=>>>>=>>============>=====$$$$$=$=$=$==$!$$$=$$!!!!!!!!!!$!!!!!! ! !!!  !  !ox                                                                                                                                                                   #ॏ~~}}}}}~~}}~}}}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}~~~~~~~~~}}}}}~}~~}}|}~}}}}}|}}}}|}v|}||v|wvv||v}}|wv|vp||||pvvvv|vpppppvvvppppppppppoopppooppoolopoollopooollllloollllollCllllllCCCCCCCCClCCll??CCC??>?C?>CCA>??>>>??>>>>>=>=>>===>================$=====$=$!$$$==$!$$!!$!!$!!!!!!!!!!!!!!!!!!!!!!!! !     =v                                                                                                                                                        [觏~}}~~}~~~}~}~~~~~~~~~}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}~~~~~}~~}~}}~}}}~}}}}|}}}}}|}}w|}}w}v|}}||}|||p|||}||}vpv}vv|vvvpvvvvvvpvpppppppppppppppoopopppooppollolooloplollllllolClllCllllCllCCCCllC?C??Cl??CC??C??C?>A?>>>>>>>A>>>>==>=>>>>==>>======>==============$$=$==$$$!$$!!$!!!$!$!!!!!!!!!!! !!!!! !!!!  !  >}B                                                                                                                                                                 zӑ}~}~}}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}~~}~~~~~~}}~}~~}}}}~}}~}}}~}}}}|w~}}|}}||||||}|w}||}}wv|v|v}||w}vv}vv||vpvpvvpvvpppppppppppppopppoopppopoopooooooolloolololllllllllllllllllllCCCllCCCCCCCC?CC??CC????A>??>>>AC=>>>==>?=>>===>=>======>================$===$$!!=$$$!$!!!$$!!!!!!!!!!!!!!!!! !      $mx                                                                                                                                                           #ਏ~~}~~~~~}~}}~~}~~~~}~~~~~~~~~~~~~~~~~~~~~~~~~~~}~~}}~~}~}}}}~~~~}}~~}~}~}}~}}}}}~~}|}}}}}}}}}|}}||}|w}|p||||vvp|vvpv|||vvp|ppvpvvppvppvpvpppvppvpooppoppploopoolppoooooolllllllllllllllllllllllllllllC?ClllCCCCClC?C??>>CC>???C?>>=>>=CA=>>=>=>=>A=================$$$=$===$==!$=$!!$=!!$$!!!!!!!!!!!!!!!!!!!! !! !    !l}ك                                                                                                                                                      @ג~~~}~~~~~~~~~~~~~}~~~~~~~~~~~~~~~~~~~~~}~~~~~~~~}~~~~~~~}~~}~}}}}}}}}}}}}}}}}}}}|}}||}}|}|s}}}|v}}||w||||ww|w||vvvpppvpv|pppppvppppppppvppppppppooopopoppololloolooooolllllllllllllllllllllllCClCCClC???CCClC>??CC?>>>A?C>??>>CC>C>=>=>>>>==A>=============$$==$=====$!$===$$$$$$!!!$!!!!!!!!!!!!!!!! !!!! !     !?q;                                                                                                                                                            ]謒~~}}~~~~~~~~~}~~~}~~~~~~~~~~~~~~~~~~~~~~~~~}~~~~}~~~~}~}~~}}~~}}}}}}}w}}}}}w}|}}|}}||}}}}|}|}}|w}|}|||||||vvv||vvqpvv|vv|vvpppppppppvppppopppppppoopoolpooloplolllloolllollllllllllClClCllllCCClCClCCC?>CC??C??CC?C>>????>>?>A?>>>>=>=>>=>>=>>================$=====$!$$==$$$=$!!=!!!!!!!!!!!!!!!!!! !!  !!  !  !    >vY                                                                                                                                                                   z欒}~}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}~~~~}~~~~}}~~~}~~}}}}}|}}}}||}|}~}s}}}}}}}}||}|}||}}v|w}|}|vpv|vvvvpw||vpw}vppvppvvvvpppppopppppppoooooopopooooolllllollllloolllllllllCCllCCClCClllCCCCC??C>>?C?CC?>>>??>>>>>AC>=>>>>>=>=>>>========>============$$==$$==$!$$!$$$$=$!!!!!!!!!!!!!!!!!!!!! !! !   !!Cpx                                                                                                                                                            Ӥ~~}}~}~}}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}~~}~}~~~~~~~~~}~~~~~}}}}}}}}}}}~}~}}}|~}}w}}||}}||}}}}||||p|}}|vvvppp||vwv||||pvvppppvvp|vppppppvvppppopoopppoloppolloollolollloollllllClClollllloClC?ClCCCCCCll?ClC?CCC?>?C?>>>?>>>>?>=?>?A>>>?>==>>=>>>=====>=$=======>>==$$$$!$$$!$!!=$!$!!!!$!!$!!!!!!!!!! !!!! ! ! !>m}z                                                                                                                                                               #ڧ~}}~~~~~~~}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}~~~~~}~~}}}~}}}~}}}~}}}~~}}}}}~}}|}}}}}}}|}}}}}}|||w|}|}}}}}|}w|}|||vvv}vpvvvvvppvppppppppvpppppppppvpoppooppooppooooooooooollooolollooollollllllCllCCCCCCllCCCCCCCCC???C??>>CC???C>???>>==>>>>=>A==>>==>=======>====>=$==$====$$$$!$$$$$!$!$=!$$$!!!!!!$!!!!!!!!!!!!!!!! !   !>lvك#                                                                                                                                                         #ا~~~~~}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}~~}~~}}}~}}}}~~}}}~}}s}}}}}}}|}}}}}}}|}|p}||}|}|}}||||||v|||pv|vvvpvv|vvppvppvpppppppppo|poppopppoopppolpooopoolllooollllollllollllllCClClCCCClll??CCllC??C>CCC??CC>???>>A?>>>=>>>=>>>=>>>>===>>===$===============$$=$==$$$$$!!$$!$!$!!!!!!$!!!!!!!!!!!!!!!! !   !!$=Clp}ٔ#                                                                                                                                           ;ӧ~~~~~~~~~~~~~~}~~~~~~~~~~~~~~~~~s~}}~}s}~ss~~s}~~sss}ss~~~~~~~}ss~}ssss}s~ssss}}s}q}}s}qsss}s||}s|s|qq|}s|qqqqssqq}}qqqqs|qqqqqsqqqqpq|qqqqqqqqqspoqqqvqqqqqqspqqqpqpv|qqqs|pqqqqqpppppoppvqpopvpppppppvvvppppoppppomppomppppmopppomplmppmlmmmmmlmlpmmmmlmpmmmjmlmommmlmlmmmmmmmmmpv|wߔ#                                                                                                                                          @ԭҬҬҬҬҬҬҬҬҬҬҬҬҬҬҬҬҬӬҬҬӬҬӬӬӬӬլӬӬӬӬӬӬӬӬӬӬӬӬӬӬҬҬӬҬӬӬҬҬҬҬҬҬҬҬҬҬҭٛ;                                                                                                                                                  @ٖ;                                                                                                                                      @ٔ;                                                                                                                                   #׃#                                                                                                                     #ӂ                                                                                                                       zʁ                                                                                                           [ٝZ                                                                                                                       @ה;                                                                                                                         #zx                                                                                                  [ٝY                                                                                                               #x#                                                                                                         Yה@                                                                                   xٝ[                                                  ;                                ;zםx#                                            T                                     #zםx#                                                                                           #xל_                                                                      [Ǜ[                                                                         @xӛx;                                                                      @ǝ@                                                                ;[zӛz];                                                                        #]zǝzY#                                                                       #@[_xxzzǝzzxx_Z;                                                             bhhhhhdccbXXXXTTT""""""""""""""                                                                  bhhhhdccbXXXXTTT"                                                            bhhhhhhccccbXXVTTT                                                           bhhhhhggccbXXTUTTT                                                       XghhhggccbXXXXTTTT                                                 XhhhhhhgcccXbXTXTT"                              bhhhhhgccbXXXXTTT                              XghhhhhdccbXXXTTT                         bhhhccccbXXUTT"                          bhhhdccbXXXUTT                                bhhhhdccXXXXTT                           bhhhcccbXXVTTT                        bhhhgccbbXXTTT"                          bhhdccbXXXTTT                         ^hhhdcbXXXTTTT                        chgcccbbXTTT""             bhhhgccXXXXTTT""T                        chhdgcbXXXTTT"TT             dhgdccXXXXTTT             chggcccbXVUTTT"""      ;# dhhgcccbXXTTTT"TT        #cYdhhgcccXXXTTTT       Y@ chhgdccbXXTTT"         chgdccXXXXTT""          chhgcccXXXUTTT"T            chhgcccbXXTTTT        chhhdccXXXXTTT"""TT               chhhhdccbXXTTT"T              chhhgcbbXXXTT"T"T            chhdccbbXXXTTTT""        chhhdcccXXXTTT""T     chhhdgccbXXXTT"T"T"   chhgdccbXXXTTT"T"   bhhhdcbXXXTTTT"     chhhdcbXXXXTT""T"  #[Y   dhhgdccXXXTTTT"T""    "[Y    chhhcccbXXTTTT          bhhgdccbXXXTT"T"         chhgdccXXXXTTT         chhhdccXXXXUTT"     chhhgcbbXXXTT""""    dhhhgcbbXXXTTT""""    chhgdccbXXTTTT     chgccbXXXUXT"   chgcccbXXTTTTT      chhhdhcbXXXUTTT"T   CorsixTH-0.63/CorsixTH/Bitmap/mainmenu720.dat000066400000000000000000034100001347163623700206320ustar00rootroot00000000000000    chhhdhcbXXXUTTT"T     chgcccbXXTTTTT    chgccbXXXUXT"   chhgdccbXXTTTT     dhhhgcbbXXXTTT""""      chhhgcbbXXXTT""""       chhhdccXXXXUTT"        chhgdccXXXXTTT           bhhgdccbXXXTT"T"   "[Y    chhhcccbXXTTTT     #[Y   dhhgdccXXXTTTT"T""      chhhdcbXXXXTT""T"  bhhhdcbXXXTTTT"    chhgdccbXXXTTT"T"     chhhdgccbXXXTT"T"T"      chhhdcccXXXTTT""T         chhdccbbXXXTTTT""               chhhgcbbXXXTT"T"T               chhhhdccbXXTTT"T         chhhdccXXXXTTT"""TT         chhgcccbXXTTTT       chhgcccXXXUTTT"T              chgdccXXXXTT""       Y@ chhgdccbXXTTT"          #cYdhhgcccXXXTTTT        ;# dhhgcccbXXTTTT"TT         chggcccbXVUTTT"""           dhgdccXXXXTTT                     chhdgcbXXXTTT"TT             bhhhgccXXXXTTT""T                      chgcccbbXTTT""                    ^hhhdcbXXXTTTT                            bhhdccbXXXTTT                           bhhhgccbbXXTTT"                          bhhhcccbXXVTTT                                 bhhhhdccXXXXTT                             bhhhdccbXXXUTT                    bhhhccccbXXUTT"                      XghhhhhdccbXXXTTT                                 bhhhhhgccbXXXXTTT                                                    XhhhhhhgcccXbXTXTT"                                               XghhhggccbXXXXTTTT                                                            bhhhhhggccbXXTUTTT                                                                bhhhhhhccccbXXVTTT                                                       bhhhhdccbXXXXTTT"                                                                 bhhhhhdccbXXXXTTT""""""""""""""                                                                                   #@[_xxzzǝzzxx_Z;                                                                         #]zǝzY#                                                                    ;[zӛz];                                                                @ǝ@                                                                    @xӛx;                                                                           [Ǜ[                                                                                        #xל_                                           T                                     #zםx#                                                    ;                                ;zםx#                                                                                  xٝ[                                                                                                       Yה@                                                                                                       #x#                                                                                                   [ٝY                                                                                                                                  #zx                                                                                                                      @ה;                                                                                                       [ٝZ                                                                                                                       zʁ                                                                                                                       #ӂ                                                                                                                               #׃#                                                                                                                                    @ٔ;                                                                                                                                                     @ٖ;                                                                                                                                        @ԭҬҬҬҬҬҬҬҬҬҬҬҬҬҬҬҬҬӬҬҬӬҬӬӬӬӬլӬӬӬӬӬӬӬӬӬӬӬӬӬӬҬҬӬҬӬӬҬҬҬҬҬҬҬҬҬҬҭٛ;                                                                                                                                          ;ӧ~~~~~~~~~~~~~~}~~~~~~~~~~~~~~~~~s~}}~}s}~ss~~s}~~sss}ss~~~~~~~}ss~}ssss}s~ssss}}s}q}}s}qsss}s||}s|s|qq|}s|qqqqssqq}}qqqqs|qqqqqsqqqqpq|qqqqqqqqqspoqqqvqqqqqqspqqqpqpv|qqqs|pqqqqqpppppoppvqpopvpppppppvvvppppoppppomppomppppmopppomplmppmlmmmmmlmlpmmmmlmpmmmjmlmommmlmlmmmmmmmmmpv|wߔ#                                                                                                                                                        #ا~~~~~}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}~~}~~}}}~}}}}~~}}}~}}s}}}}}}}|}}}}}}}|}|p}||}|}|}}||||||v|||pv|vvvpvv|vvppvppvpppppppppo|poppopppoopppolpooopoolllooollllollllollllllCClClCCCClll??CCllC??C>CCC??CC>???>>A?>>>=>>>=>>>=>>>>===>>===$===============$$=$==$$$$$!!$$!$!$!!!!!!$!!!!!!!!!!!!!!!! !   !!$=Clp}ٔ#                                                                                                                                                               #ڧ~}}~~~~~~~}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}~~~~~}~~}}}~}}}~}}}~}}}~~}}}}}~}}|}}}}}}}|}}}}}}|||w|}|}}}}}|}w|}|||vvv}vpvvvvvppvppppppppvpppppppppvpoppooppooppooooooooooollooolollooollollllllCllCCCCCCllCCCCCCCCC???C??>>CC???C>???>>==>>>>=>A==>>==>=======>====>=$==$====$$$$!$$$$$!$!$=!$$$!!!!!!$!!!!!!!!!!!!!!!! !   !>lvك#                                                                                                                                                               Ӥ~~}}~}~}}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}~~}~}~~~~~~~~~}~~~~~}}}}}}}}}}}~}~}}}|~}}w}}||}}||}}}}||||p|}}|vvvppp||vwv||||pvvppppvvp|vppppppvvppppopoopppoloppolloollolollloollllllClClollllloClC?ClCCCCCCll?ClC?CCC?>?C?>>>?>>>>?>=?>?A>>>?>==>>=>>>=====>=$=======>>==$$$$!$$$!$!!=$!$!!!!$!!$!!!!!!!!!! !!!! ! ! !>m}z                                                                                                                                                                    z欒}~}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}~~~~}~~~~}}~~~}~~}}}}}|}}}}||}|}~}s}}}}}}}}||}|}||}}v|w}|}|vpv|vvvvpw||vpw}vppvppvvvvpppppopppppppoooooopopooooolllllollllloolllllllllCCllCCClCClllCCCCC??C>>?C?CC?>>>??>>>>>AC>=>>>>>=>=>>>========>============$$==$$==$!$$!$$$$=$!!!!!!!!!!!!!!!!!!!!! !! !   !!Cpx                                                                                                                                                            ]謒~~}}~~~~~~~~~}~~~}~~~~~~~~~~~~~~~~~~~~~~~~~}~~~~}~~~~}~}~~}}~~}}}}}}}w}}}}}w}|}}|}}||}}}}|}|}}|w}|}|||||||vvv||vvqpvv|vv|vvpppppppppvppppopppppppoopoolpooloplolllloolllollllllllllClClCllllCCClCClCCC?>CC??C??CC?C>>????>>?>A?>>>>=>=>>=>>=>>================$=====$!$$==$$$=$!!=!!!!!!!!!!!!!!!!!! !!  !!  !  !    >vY                                                                                                                                                      @ג~~~}~~~~~~~~~~~~~}~~~~~~~~~~~~~~~~~~~~~}~~~~~~~~}~~~~~~~}~~}~}}}}}}}}}}}}}}}}}}}|}}||}}|}|s}}}|v}}||w||||ww|w||vvvpppvpv|pppppvppppppppvppppppppooopopoppololloolooooolllllllllllllllllllllllCClCCClC???CCClC>??CC?>>>A?C>??>>CC>C>=>=>>>>==A>=============$$==$=====$!$===$$$$$$!!!$!!!!!!!!!!!!!!!! !!!! !     !?q;                                                                                                                                                               #ਏ~~}~~~~~}~}}~~}~~~~}~~~~~~~~~~~~~~~~~~~~~~~~~~~}~~}}~~}~}}}}~~~~}}~~}~}~}}~}}}}}~~}|}}}}}}}}}|}}||}|w}|p||||vvp|vvpv|||vvp|ppvpvvppvppvpvpppvppvpooppoppploopoolppoooooolllllllllllllllllllllllllllllC?ClllCCCCClC?C??>>CC>???C?>>=>>=CA=>>=>=>=>A=================$$$=$===$==!$=$!!$=!!$$!!!!!!!!!!!!!!!!!!!! !! !    !l}ك                                                                                                                                                                  zӑ}~}~}}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}~~}~~~~~~}}~}~~}}}}~}}~}}}~}}}}|w~}}|}}||||||}|w}||}}wv|v|v}||w}vv}vv||vpvpvvpvvpppppppppppppopppoopppopoopooooooolloolololllllllllllllllllllCCCllCCCCCCCC?CC??CC????A>??>>>AC=>>>==>?=>>===>=>======>================$===$$!!=$$$!$!!!$$!!!!!!!!!!!!!!!!! !      $mx                                                                                                                                                      [觏~}}~~}~~~}~}~~~~~~~~~}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}~~~~~}~~}~}}~}}}~}}}}|}}}}}|}}w|}}w}v|}}||}|||p|||}||}vpv}vv|vvvpvvvvvvpvpppppppppppppppoopopppooppollolooloplollllllolClllCllllCllCCCCllC?C??Cl??CC??C??C?>A?>>>>>>>A>>>>==>=>>>>==>>======>==============$$=$==$$$!$$!!$!!!$!$!!!!!!!!!!! !!!!! !!!!  !  >}B                                                                                                                                                                   #ॏ~~}}}}}~~}}~}}}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}~~~~~~~~~}}}}}~}~~}}|}~}}}}}|}}}}|}v|}||v|wvv||v}}|wv|vp||||pvvvv|vpppppvvvppppppppppoopppooppoolopoollopooollllloollllollCllllllCCCCCCCCClCCll??CCC??>?C?>CCA>??>>>??>>>>>=>=>>===>================$=====$=$!$$$==$!$$!!$!!$!!!!!!!!!!!!!!!!!!!!!!!! !     =v                                                                                                                                                    zڤ}}~}~}~~~~~}}~~~~~~~~~~~~~~~~~~~~~~~~~~}~~~~}}}}}~}}}~~}}}~}}}|}}}}}}}v}|v}}}}|v|}|||v|}|pw}|vv|||pv|ppppppppvv|vpppppvpooooppoopppopoolppoppollllllllllloloolllllllCC?CCCllCCCCC?CCCCCCCC?>??>>?CCC>>>>?C>>=>>>>>>A?=>>>>=>>============>=====$$$$$=$=$=$==$!$$$=$$!!!!!!!!!!$!!!!!! ! !!!  !  !ox                                                                                                                                                                          Yڒ~~~~~}~}}~~~~~~~~}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}~~~}}}}}~~~}}}}}}}}}|}|s}|}}}}}}|}v|}}||wpv||v}}|pvvv|pv|vvvv|vppppvpppppvppppopppopooppoploooooollllollllllloollCllolClllllllllCCCCCCCCCC??CC>??C>>>>?A>??A>?>>A?>>>=>====>>============$======$==$$$==$!$$!!=$$!$$!$!!!$!!!!!!!!!!!! !! ! !! !!      C@                                                                                                                                                     Ԓ~~}~~}}~}~~~~~~~~~}~~~~~~~~~~~~~~~~~~~~~~~~}}~~~}}~}~}}}}}}}}}}}}}}}}}}|}}}}}}|||}}}|v|v||||||vv|v|||pvwvvv|vpppvppvppvvppoppvppppoolpooloollloollollollllloolllllClllCllllllCCCCCClCCCC?>>??CCC???>>>>AC?>?>>?>>>=>>====>=======>==========$======$==$$$$$$$$$!!!!!!!!$!!!!!!!!!!!!!!!! !!!! !   C                                                                                                                                                   _ӑ~~~~~~~~}~~~~~}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}~~~~}~~}}}}~}}}~}}}}~~}~~}~}}}}ww}||}}}}}}}|}|||v}|}|vv|}}||w||pvvvpvvpp||vppppvppppoopppooppooppopolooloolplllllllllllllllllllClllllCCCCC?CllCCC?CCCC?A??CC?>CC?>????>?=>>>A??=>>=>===>>=========>===>===$===$$==$$=$$!!!!!$$!!$$!!!!!!!!!!!!!!!!!!  !    >Z                                                                                                                                                          #ڒ}}}}}}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}~~}}~}}~}~~}~}}|}}|}s}|}}}|||}}}|vw||v||v|}w|v|vvvvpv|}vp|}|vppp|vpppppvvpppppvpppppppooooppopooolloollCooolllllollllllCClCCClllCCCllCClC?lCCCCCC???C>?C??>>===>>>?A>>>=>?>??>=====>>=========$$$=====$$$$$$=$$$$$$!$!!!!!$!!!!!!!$!!!! !!! ! ! ?#                                                    Y@                                                                                      zْ~}}}}}}~}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}~~}}~}}}}~}}}}}}}~}w}}}}|}}}|||}|v}|v}w|||||v|v||vvvp|v|pvvvvvppvpvppvpppppppooppvoppppopopppoooooolpoolooolllllllllClllllCCClllCCllCCCCC?CCC??CC?CCC???>>>>>>>>>>>=>>>>>>>========>====>====$=====$$===$$$$=!!$!$$!$!!!!!!!!$$!!!!!!!!!!! !!  !!     ?]                                                                 ;_#                                                                                              #~}}~}}~}~~~}}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}~~~~}~}}}~}~}}}}}}}}}}|}~~}|}}}}}v||}|}}}||||||v|||vvv|ppv|vppv|vppvvppppvpppppppopppopppppoopooloopolloooolllllllollllClllllClllllllCCCCCCCC?CC??>ACC??>>>?>??>>??=>>>>=>A>================>===$==>==$$$==$!$$$!!!!$$!!!!!$!!!!$$!! !!!!!!!! !!  !  !    C                                                       Y@                                                                                           x~}~}~~}}}}~~~}}}}}~~~~~~~~~~~~~~~~~~~~}~~~~~~~~~}~~}~~}}}~}}~}|||}}}}}||}}v}}}}|wsv|}}|}}p|}}|v||vvvw|}wvvppppvpv|vvpvppppvppopppppvoopoooolppolllllllloollloolllllllCllllllCCCCCCCC?ClC?????>?CCC?>AC>>?>>>>=>>>A>=====>>==>>==>>============$=======$$===$=$$$!$!!!$$!!!!!!!!!! !!!! !!!!   o[                                                                                                                                                                ~|}~}~~~~~~~~~~~~~~~~~~}~~~~~~~~~~~~~~~~~~~~~~}~~~~~}~~~~~~~~~}~~}~}~}}}}}}}}}}}|}}v}}||}|}|}}}|}|}vwwp|}|v|w|wv|wvvvpv||pvvpvpvvpppppppvppppppopoopoopppooopooloolooolllllllllllCCCCCllCllCClCCCCCC?CCCCC?C??CC>>C?>CA?A???A>>>>>A>>==>=======>====>=======$$$==$$$!$$$!!=$$$=!!!$!!!!!!!!!!! !!! !!!!!!!!    !v                                                                                                                                                            xՑ~}}}~~~~~~~~~~~}~~}~~~~~~~~~~~~~~}~~~}~~~~~}~}~}}~}}}}}}}}}}}|}}}}}}|}}}}|v|v||v|||p}|v|v||vvppvv|vvpvvvppvvppppppppooppopooplopooloooooooopolllllollllllllllCCCCCllCCClCCCC>CCCCCCCC>>C?>>CAA?>??A>>>>=>>=>>=>>>===>===>=========$==$$==$$$$$$$!$$$!$$$!!$!!$!!!!$!!!!!$!!!!! !!     =}Z                                                                                                                                                       #~}}}}}}}}~~~~}}~~~}~~~~~~~~~~~~~~~~~~~~~~~~~~~}}}~~}~}~}}}}}~}}}}}}}}|}}}~}}}}|||w}||||wv|w||vp||v||vp|pp||pppv|vpvvvppppppooppoppololopolopllllpolpllloooooolllllllllllCClCCCCCC?CC???CCCCCC>A?>>?C>>>>??>>>>=>>A=>>>>>==>=>>====>===========$=$$==$=$$$$$=!!!!$!!!!!!!!!!!!!!$!!!! !!!  !    ?                                                                                                                                                   ]}~~}}~~~~~~~~}~~~~~~~~~~~~~~~~~~~~~~~~~~}}~~~~}~~}~~~}}}}~}}w}}}~}}}}}}}|v|}}|||v|||}w|}}|v|ppvww|vvp|ppvvpppppppvpppvpppvvpppppppppoooopoppllllollllllllllllCCCCCllllllCCClllCCCCC?CCCCCl?>?C?>????CC?CC?>>>==>?>>A===>>=>>>========$==$=====$==$!$$!!!!$=!$!!=$$$!$$!!!!!!!!$$!! ! !!!!   pB                                                                                                                                          ء~~~~~~}}}}}~~~~~~~~~~~~~~~~~~~~~~~~~~}~~}}}~}}}~~}~}}}}}}}}}}}}|}s}}}}w}||}}}wv}}vvvw}vv||vv|pv|wp|vpvpppppopvvppoovopooppplpppppopooolollpolpolllllollllllllClllCllClllll?C?CCCC??CC?????C>>>>>>>>>>>>>=>?>=>>=====>>==>=========$=========$!$$$$!=$!$$!$!!$!!!!!!$$!! !! !!! !    $z                                                                                                                                                     ;~}~}~}}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}}}~~}|}~}}}}}|}}|}}||}}w|}}}|pw|v|v|||vv||v|p|v|vvppvpppvppvppppppppppopppoooopoopooooollooloolllllolllllllClCClllCClllCCCCCCCCCC>C?????C?>>>?>A>>>>=>>=C>>==>>====>>==>================$$$$!=$$$$$!!$$$!!!!!!!!!$$!!!! !! !!! ! !     l#                                                                                                                                                   xӏ}}}~~}~}}~~}~~~~~~~~~~~~~~~~~}~~~~~~}~}}~~}~~}}}}~}}}}}}}~}}}}|}~w}|v|w||}v}}v||||v|ppv}wpv}|v||vvppv|vvvvvvvpppppopppvvpppp|ollolloppoplllllllllllllllllllllCCCCllllCCCCCCC?C?C??CC?>>?C>??>?>A?C?>>>>>>>C=>>>>>===>====================$$=$$$==$=$$!!!!$$!!!!!!!!!!!!!!!!!! !!  !!!!     $}Z                                                                                                                                                 褏}~}}}~~}}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}~}}~~~~}}}}}}}~}}}|}}}~}}}|~}|}||||vw|vw}}}}|||}vvp||v|vvpv|v}vv|vppppvppppvpooploolpooppoololloooooooolloollllCllClllllllCClCCllCClCCCl?CClCC?>?>>C>>??C?>=>>???>>>==>===>=>>>>==>============$$===$=$!$$=$$$$$$!!!$$!!!!!!!!!!!!!!!!!!!   ! ?                                                                                                                                             YՑ~}~~~~}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}~}~}}~}}}~~}}}|}}}}}}}}}}}}}}}}w}w}}v}}}v|}}||wwvv|vvvvvvvpvvppppppvvpppppppoppopppppooloopoppoolloloollllolllllllllCllCCllCC?lC??CC?CCC????CCCC>AC>?A>>>>C>>>>=>>=>>>===================$$=$=$=$$=$$=$$$$!$$!!!$$!!!!!!!!!!!!!!!!!! !! !  !   |;                                                                                                                                                z襏~~}~}~}~~~~~~}~~~~~~~~~~~~~~~~~~}~~~}~}}~}}}}}}}}}|}}}}}}}|}}}}}}|}}}|v|||v||}}w||vvv||vpvvppvvpppppppvpppvppoovvpoppooooolopppolollpllllolllolllllllllCllClCCCClC>CCC>ClCCCC??CC?>?C>>?>C??>>==>>=>>=>A=>=====================$$==$$$=$$$$$!$!!!!!$!!!!!!!!!!!!!!!!!!!! !  ! !   C]                                                                                                                                                  ӎ}}}}}}~~~}~~~~~~~~~~~~~~~~~~~~~~~~~~~}~~~~~~~~~}}}~~}}~}}}}}}}}|}}}}}}}w}||w}}w}||vv}vvp||vp||wvppvppppv||vwvpvpvvpppvoooopppppllooopopoloolollollllloollllolllllllCCllCllCCCCCCCCC?CC?>>>??>?>A>CC>>AA=>A>?>==>============>>>>====$====$$====$$$!$$$$$$=$$$!!!!!!!!!!!!!!!!!!!!! !    !|                                                                                                                                             #~~~}}}~~~~~~}~~~~}~~~~~~~~}~~}~~~~}}~~~~}}}~~}}}~}~}}w}}}}w}}}v|}}}}|}|}}}}vvpv|p|vpv|vq|vpvwvpovvpwppvpp|wppooppplopppoopppolooooollololllllllllllllllllllCCCC??llCCClClCC??????>CC??C>>>?>>A>=?>>>>===>>==>==>>================$=$$$$$=$!!$!$$!!$$!!!!$$!$!!!!!!!!! !!!! !  !!!   C                                                                                                                                   Zڑ~}}~}~~~}~~~~~~~}~~~~~~~~~~~~~~~~}~~~~~}~}}}}~}}}}}}}}}}}}}|}}|}}}}}||}|w||w|v|vq||||wvpp}vp|vpvpvvvpppppppvppvpppolopppooopopolooloolooololCloollllllllllllCllll??ClCCCCC????CCCC>C?>A?>>?>>>?>=>>>>>>>=>>====>=================$==$$=$$=$$!!$$!!$$$!!!!!!!$!!!!!!! !!!! !   !   $@                                                                                                                                                   ~}}}}}~~~~~~~~~}~~~~~~~~~~~~~~~~~~~~}}~~~~}}~~}~~~~}}}}}}}~}}}}}}|v}}}}}}|}||||||vv}|||v|||vvqvv|qvp|wpv|pppoppppoovpppppppopooopoooloolooollloollllollllllllCCCCCllllCClCCC?C?>????CCCA??>>???>>==>==>>>>>>>>===>=>A==>====>============$=$!$=$$$$!!!$$!!$!!!!!!!!!! !!!!!! !!  !     o_                                                                                                                                             }}}~~}~~~~}~~~~}~~~~~~~~~~~~~~~~~}~~}~}}~}}}}}~}}}w|}}v|||}||}w|v||v|}v|v||w}|}|vv|vv}|pvvpppvvpppvpoopppppppvppoopplooolllpplllllloolllllClllllllllClClCC?CCCllCCC???CCC>?C??>A????>=>>>?>?>===>>>C>>======>==============$=====$$$=$$=$$$!!!!!!!$$!!!!!!!!!!!!!!$!!  ! !!    ?                                                                                                                                       @~~~~~}~}~~~~~~~~~~~~~~~~~~~~~~~~~}~}~}}}}}}~}}}}}}}}}}}}}|}}}}wv}|}}}}}}}w||||}|pv}|||||wvvpvvvpvvvvvppppvvpppoooppppppppoooooopollllloollloollllllClllllCllCCCll?CCCCCCClC?>C?>C????C?A??C>>?>=>>A>==>==>=>>>============$=======$$=$!$=$$$$$$!!!$!$$!!$!!!!!!!!!! !!!   !  !!!#                                                                                                                                        ]}~~~~~}~~~~~~~~~~~~~~~~~~~~~~~~~}~~}~}~~}}~}}~}}}}}}}}s}}}}}}|}}}}w}}v|}}}|v||||vv|}v|}vvv|ppvvppvppv|ppp|ppppppopoopopppoopoooplollloolllloollllllllllllllCClllC?CClCCCCCCC>l?>?C???>>A>?C>>A>>>>A>>>==>>=>>=>===========$=====$=$$=$$=$$!=!!$$!$$!$$!!!!!!!!!!!! !!!!      v;                                                                                                                              x~}~~~~~~~~~~~~~~~~~~~~~~~~}~~~~~~~~~~~~~}~~~}}~~~}|}~}}}}~~}}}|}}}|||v|v|v||}}|vv|}|pvvvppv|v|vpvw|vpoppppppoooopvpopoplopooppooooloolpollllllolllllllllCCllCCllCClCClC?lCCC?CClC??C??C>>?>>>>>>>>>=>=>A=>>=====>>====>========$$$$==$$$$$$$$$$$$!$$!!$!!!!!!$!$!!!!!!!!!!! !! !   ! lY                                                                                                                                          }~}}}}~~}}~~~~~~~~~~~~~~~~~~}~}}~~~~~~~}~~}}}}}}}wv}||}}}|||}}}}}}}}}w||v}}}}sw}}vvp|vppppppvpppvpppppov|pvopopoppoopoppllopooolooololollCClloollllCClCllCCllllCCCCC?CC>?C?>>??>A>>?????A>>>>>>>=>>>>>=>============$=====$=======$$=$$!$==$$$$!!!$!!!!!!!!!!!!! !! ! !!!!   =_                                                                                                                                               ڏ}}}~~}~}~~~~~~~~~~~~~~~~~~~~~~~~~~}~}}~~~~}}}~}}s}}}}}}~s}}}}}}|}|s}|||w||v||||||vvw|v||vvvvpvvvpvvvpp||p|voppppppopoopoppoooopolololloollllllllllCllllllllCClClllCCCCCCll>CC>AC?>?CC???>=>>>>>>=AA>>=>>==>=>==================$$=$=$!$$$$$$!$!!!!!!$!!!!!!!!!!!! !! !!  !!      w                                                                                                                         }~}~~~~~}~~~~~~~~~~~~~~~~~~~~~~~~}~~~}~}}~}}}}~}s}||}}}}|}}}}||}||||}||||||v}|pv|vp|}v|v|vpvvppvvpv|vpvvppooppppppoppooopoooolpollllllllllllllllllllllCClCCCCllCCCCCCll????C???CC?>?>>=A>>>>A>>>>>==>>=>=======================$$$$$$$==$$!!!!$!!!!!!!!!!!!!! !!! ! !!      p                                                                                                                  #~~}}}}}~~~~~~~~~~~~~~~~~~~}}}~~}~~~}}}~~}~}~}}}}}|}}}~}}~}}|w}|}}}|}}||vvvv|v|vvwvppv|wwvppvvpppvpppp|}vvoolovvvpllooloollolllloppolllolCllClllClCCCCCllCCCCClC????CC?ClCl??CC>A>?AC?AC???A==>>>>>>>=============>======$=$$==$==$$$!!$=!!!!!$$!!!!!!!!!!!! !!!!!!! !! !!!    l                                                                                                                   B~}~~~~}}~~~}~~~~~~~~~~~~~~~}}~}}}}}}}}}}}~}~|}}}|}|w}}}}|||}v|}}}}ww}w}}w}}w}wwwv}wwvvvwvvvvupvvuuvwpvuuvwppvvupuuvvpoovuuuoouuooouolooutototooootlltlolCtllCCCCllCCCClCAACCCCCAACCCAAAACCllAAAAAAAAAAAA>A=AA@@@AAAA=;===@9@@=====@9$!!!!!! !!!!!!!!!!!!! !  !  !   C#                                                                                                                   ]~~~~~}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}~}~~~}}}}}}}}}~}}}}}}}}}}|}}|}||www}w„_@$$$!!!!!!!!!!!!  !   =@                                                                                                                        _}}}~~~~~~~}~~~~~~~~~~~~~~~~~~~~~~}~}}}}}}~}}||}}}}}}}}}w}}ww|}s}|}w΂Z9!$ !!!!!!!! ! !!!     !}B                                                                                                                x}}}~}}~~~~~~~~~~~~~~~~~~~~~~~~~~}~~~~~~~}~}~}~~~}~}}}|}}}}}}}}}|||}}|pw}vw΂9!!!!!!!!!!! !!    !Y                                                                                                         z~~}~~~~~~~~~~~~~~~~~~~~~~~~~}~}~~~~~~}}~}}}}}}}}}}}}|}}}}}}}}}}|v}}}}[!!!!!!!!!!!!! ! !  !}Y                                                                                                                  ڏ~~}~~~~}~~~~Y !!!!!!!!! ! !!    |Z                                                                                                         ؏~~~~~~~~~~~~Ҟ$!!!!!!! !!!       v[                                                                                                             ֏}}}}~~~~~~~~~~~}vvp||w}|pvppvv||vvvvpvvpvvpvpvpvppwpvpppooolpooooloolollplllllllooCllolllllllllCCllC?C???CCCC??C?>C?>>C?CC??>>C???>=>?>>>>>>>=>A>>>============$=======$$$==$$$!=!!=!$=B[9!!! !! !!! !!  !p_                                                                                                          ӎ~~~~~~~~~~~~~~~~}w||v|vvvwv||||vppvpvvvppppppvpoppvppppopppolopppooolooloooloollllloClollllllC?llll?ClCCC?C?CCC?C?CCA>CCA>A?>>>?>>>>>>>>>>>>>=====>========>=====$===$===$$=$=$$$!$$!!$$!!9x;  !!! !!        p_                                                                                                 ~~~~~}~~~~~~~~~~~~~}}|||w}w|w|wvwv|vvpvwww}vvvvvvppvppppvpoppppopvppooooooopppooollollpllolollollCllClClllllCCClCCCC?CCCCCCA?CCA?>>CA>C>>AA>C>>>>>=>>>=>>>>>==>=====$========9$===$9$=$!$$$!!!!9;!! !! ! !! !    v_                                                                                  ~~}~~~}~~~~}}~~~~~~~~~~~ÄZ;!!!!$$B9!!!!!! !!!!       p_                                                                       Տ~~~~~~~~~ݨ}}}}}}w}ww_9!!!!=! ! !!  !!  o_                                                                      ա~~~~~~~~~~~ڨ~~~~~~~~~~~}~~~}~}}~}}~}}}}}}}}}}}}}}}}}}}|}Z9!!!!_ !!!! !     v_                                                                   ա~~~~~~~~~~~~~~㨣~~~~~~}~}}~~}~~~}}}~}}~}}}~s}~}}}|}|}}|w9!!!$@ !! !      q_                                                                        Տ}~~}}~~~~~~~~~Ԣ~~~~~~~~}~}}}~~~~}~}|}}}}}}}}}}}}|v}}||}}}}B!!!!$! ! !!!!    !   o_                                                             ~}}~~~~~~~~~}~~~~~~~~~~~~~~}}~~~}}}}~}}}}}~~}~}|}}}}}}|}}}|}[!!@Z !!!!!!!  !p_                                              Տ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}~~~}}}~~}}}}}}}}}}||}}||}B!!!@!!! !!   !   o_                                                                       ӏ~}}~~~~~~~~~~~~~ۣ~~~~~}}~~~}}~}~}}~}}}}}|}}}}}w}||w|}9!![!  !!! !     p_                                    Տ~~~~}}~~~~ݣ~~~~~~~~}~~}~~}}}}}}}|~s}}}}|}}}}}vw}w}!!!B! !!!!! !   o_                          Տ~~~~~~~~~~~~~~릣~~~~~~~~~~~~}~~~}~~}}}~}~}}}w}}}}}|}}}|}Y!!@! !  ! !    p_                   Ց~~~~~~~~~~~~~~~~~~~~~~~~~}~}~~~~}}}}~}}}}~}}}}w}|}}}}}$!!@_!!! !!   v_                             ԡ~~~~~}~~襢~~~~~~~~~~~~~}}~~~}~}}|}~}||w|}}}||s}Z!!!!! ! !!! !   p_                      Տ~~~~~~~~~~~~~~~~Ԣ~~~~~~~}}~~~~~~~}~~~}~~}}}}}}}|}~}}}}}}}}w!!!9! ! !      p_                   ~~~~~~~~~~~~~~~~~~~~~~~~}~~}~~}~}~}}|}}~}}}}}}}}}}||}}}9!!]Z! !  ! !   p_               ~}~~~~~뫣~~~~~~~~~}~~}~~~}}}}}}}}}}s}}}}}}}}|w}}}@!!@_ ! !!!     p_                ~~~~~~~~㣣~~~~~~~}~~~~}~}~}~~~~}}}~~}}}}}~}}~}|}}}w[!!9!!!! !!    p_             ~~~~}~~~~~ݣ~~~~~~~~~}}~~}~}}~~~~~}}~}}}}}}}}||}}}w!!$!! ! !   !  o_     Տ~}~~~~~ݣ~~~~~~~~~~~~}~}~~~~~}}}}}}}|}|}}}}||}!$!!!! ! ! ! p_          Տ~~~~~~~ԣ~~~~~~~~~}~}~}}~}}}}}}}}}}}|w!! !!!! !!    o_              Տ}~~~~~~~~ۢ~~~~~~}~~~~~}}~}}}~}~~}}}}}}}}w|}}}!!!!!  ! !     px            Տ~~~~~~~~ۢ~~~~~~~~}~~~~~}}}}~~}}}}}}}}}|}}}}}}!!!!!!!!!   p_      Տ~~~~ۣ~~~~~~~~~~}~~~}~}}~~}}}}}}s}}}}}}}}}}!!!!!!!! !       p_         Տ~~~~~~~~~~~~~~~}~~~~~~~~}}~}~~~}}~}|}~}}}}}}}}vw|} !!!!!!   ! !  p_         Տ~~~~~~~~Ԣ~~~}}}~~}}}~~}}}}~}~}}}}w}}}!!!!!!!  ! ! !      v_                Տ~~~~~~~~ۣ~~~~~~~~~~~~!!!!!! ! !  !   p_             ԑ~~~~~ۣ~~~~~}~~~~~~~~!!!!!!  !    p_                 Տ~~~~~~~ۣ~~~~~~~~}~~~~}!!!!!!!! !!      p_            Տ~~~~ԣ~~~~~}~~~}!!!!!        p_               Ց~~~~~~~~~~~~~~~~~~~~~~}}~}}}}}}}}}}}}}}}}}wv}||w}}www}}w}!!!!!!!!!       p_                                           Տ~~~~~~~ۣ~~~~~~~~}}~}}}}}}~~}}}|}}}}}||w||v}}}}||vvv|p|vp|||pvvvvpvvvw!!!!!!! ! !      p_                                     Տ~ۢ~~~~~~}~~}}~~}}}}s}~}}}s|}}}}}||}}}}v}|v||vw|||||v|wv||wvpppvppv! !!!!  !! p_                                         Տ~~~~ۣ~~~~~~~~~~~~~~~}~~}}}}}}}}|}}}}|}}|w|}}|||}w|w|v|vv||vvpvvvvv|vppp!!!!!!  !    !v_                               Տ~~~~~~ۦ~~~~~~~~~~~~~~}~}}~~}}}}}}}}}}}}}}}}}||w}}w|}}}||||}||}vvvvpvv|vvvpppw!$!!!!! ! !!    p_                            Տ~~~~~~~~ۦ~~~~~~~~~~~}}}}}~}~}}}}}}}ww}}}}}w||}||w}}|wvw||w|vpvvvvvpppvpvpp !!!! !       px                                                    Տ~~~~ۦ~~~}~~~}~~}~~}}}}~~~}}s~}}s}}}}vws||}|||vvv}wv|||vvp||vvv||pppvvppvv!!!!!!! !!!!  p_                                                                     Տ~~~~~~~ۣ~~~~~~~~~~~}~}~~}}}}~~}}|}}}}s}}}|}}|}}|||||||v}|||||wvv||vp||vppv!!!!!!  ! !   p_                                                               Տ~~~ۣ~~~~~~~~~~~}~~~}}}}~~}}}}}}}}}}}|}}v}ww}||}}|v||||vpvvv|w|vvv|vpp!!!!! !  !      px                                                                        Տ~~~~ۦ~~~~~~}}}}~~~}~}~|}}}|}}~}}|v|w}}}|}|||v||vvpvvv|vv|vvvppp!!!! !!!     px                                                                 Տ~~~~ۦ~~~~~~~}~~~~~~~}~~}|}}}}|}}s||}}}}|w||||vv|vv}v}}pvv|w}|pp|p|vvpv!!!!!! !     !     v_                                                                                   Տ~~~~~ۣ~~~~~~~~~~~~~}}}}}}|}}}}}}}s}}|}}||}w|}|w||vw||pv|v|vvpwvppvpp!!!! ! !!!!    v_                                                                                                          ՠ~~~~~ۣ~~~~~~~~}}~}~}}}}|}}}}}}}}~|}}}|||}w}w|}}w}||||vv|v|vwvvqvppp|vp!$!!!!!!! !      p_                                                                                                             ա~~~~ܦ~}~~~~}}}~~~}~}~}}~}}s}|}|}}}|||v||}}}}}vv}ww|v||vvvvppvvwv|wv!! $!!! ! !!   !    p_                                                                                                         Տ~~~~~ۣ~~~~~}~~~~~~~}}}}}}}}}}}}}}|}}}}}w}}}vvv}v}}}vv||vvv|||v|ppvvpv!!!!!!! !! !        p_                                                                                                   Տ~~~~~ۣ~~~~~~~~~~~}~}}}}}}}}}~|}}}}}}}}}}|}}||||v}}}vvvp|vpvw|pv|vppp{p!!!! !!!! !!! ! !     o_                                                                                                           ~~ۣ~~~~~}~~}~~~~~~~s}}~}}}}}}}}}}|||}}||}}w||||v||vv|vpp||vv|vpvpwp!!!!!! ! !!!   !! !  p_                                                                                                                                                 Տ~~ۣ~~~~~}}~}}~~~~}}|}}}~}|}ww||v||}}}}}v|w}}vv}vv|vpv|vvp|vwp!!!!!  ! ! !!   p_           !!                                                                                                                               ~~~~~~~~ۣ~~~~~~~}~~}~~}}}}}}}~}}}}}}}}}}}}}}}}}}||vv|vv|vvvv|vvwvvvvpvv}vwv!$$!!!!!!!! !      px            !z;                                                                                                          9Z9             Տ~~~~ۦ~~~~~}~}~}~}}}|}}}}}}}}|}}}s}}}|}}||}||}|v|vvvv||vwvv||vvp|vwv!!!!!! !! !!! ! !     p_           9;                                                                                                         9_@                ~~~ۦ䧡~~}~~}}~}}}~~~~}}}}}}~}}}}}}|}|}}}}}}}}}}}}}vvvwvp|||v|pv|||pppvwv!!!!!!!! !!!! !! !     px               @@                                                                                                       9                  Տ~~~~~~ۣ謡~~~~~~~~~~~}}}}~}~~}}}}|}}}|}||}|w|||vv|}}}w||||vww|pvvppvppppvvp!!!9!!!!    !  px                                                                                                                                                             ӎ~~~ۣ槡~~~~~~~}~~}~}~~}}}}}}}|}}}}}||}}}}}}}}||w}w||vv|||||vvvvvv||vppvpvp!!$9! !!! !!! ! !       vx                                                                                                                                                        ~~~~~~~ۦॡ~~~~~~~}}~}}}~}}}}}}}}}}}}}}|}}w}}|}}||}vvw||||vvvv|vvwvvpppvp!!!9! !!!!!!!! !       q_                                                                                                                                                    ֏~~~۫ܢ~~~~~~}~~}}}}}~~~~~~~}}}}~}}}vv|||}}||}}|||}}||vv||pvpppv}vppvv!!!!! !!! !! ! !!     px                                                                                                                                                         Ց~~~~ۦڡ蚑~~~~~}~}}~}~~}~~~~}}}}}}||}}}}}w|}}}}}|}|vv||pvvp}v|v|vv|||vppppv|vv!!!!!!!!! ! !! !    px                                                                                                                                                             ՠ~~ۣԧؤ~~~~~~~~}}~}}}}}}}}}}~}}s}}}}}}|}}}}}||w||wv||v|wvv|v|}vppvvvvw!$!!!!! !! !! ! !     p_                                                                                                                                                              ԡ~~~ۣڥ鬡~~}~}~~}}}}}}}}}}}}}}}}w}}|}}}}|}||||w|||v|}|vv|w|vv|w|vv{!!!!!!!!!! !! !         o_                                                                                                                                                             ՟~~~~~~ۦꡡԥڤ~~~~~~~~}}}~}~}~~}}}}}}}}}|v|}||}v|v|}|}}w}||w}}||w|p|vppwvpp}p!!!9! ! !!!!! !      ox                                                                                                                                                     Տ~~~~~~ܦ楚ґ~}~ӑ~~~~~~~~}}}}~}~}}}}}}|}}}~}}}|}|||v}v||vvvv||vwv|wwppvvvwvuu$$!!!! !!!!  ! ! !     px                                                                                                                                                                Տ~~~~ܦԡӤ暑~~~~~ґ~~~~~~}~}}}~}}}}}}}}}}}}}|}}|}}|w||}||}}v|w|vvvv||vppvvvwvߔolll{$$$!!! !!!! !!       p_                                                                                                                                                          Տ~~~~顑蚤ؑ~~~~}~~}}~~}}}|}}}}}}}}}}v|}|w|vvv||v}}|v||vvvvppp|vppppwv߆uoloool!!9!!!!!  !!!  ! !     p_                                                                                                                              ӏ~~ܩؤ~~~~~}}~~~~}~}}}}}~}}}}|}}|}|}}||}|vv}}|||vv|w|pvpv|v|vvo߃oollClllly!$!!!!!!!!!  !   !      o_                                                                                                     Տ~ܫ䡡角ए~~}}~~~~~}}~}}}~}}}~}}}}}|}}}}}}}}}||}}}}|v}vw|pvv|v||vvvpv|p߆ololllllllll$$!!!!!!! !! ! ! ! !      px                                                                                                         Տ~~ܦ٤ґ~}~}}}}}~~}}~~}}}}}}||}}}}}}}|}|vw}}}|v|p|||v||pvwwpv|pvpߔolloolllllllllu!!$!!!!!!!!! ! !!         p_                                                                                                                     Տ~~~~ۦ駤暑~}~~}}}~~~}}~~}|}}}}}|}}}}~}}|}}|}}}|}|v}vv|pvv||vvpv|||wvopo߆vppllllloollllllC!!!!!! !  !! !!         o_                                                                                                                 Տ~~~ۦꡡ~~~٤א~~~~~~~}~~~~~}}}}~~}}}||||}}s}}}}||}|v}|}}w||}|vp|vpvvvw||vߔollloooooClooolollCl!!!9!! !! ! !! !!     px                                                                                                 Տ~~~~~ۦ~ґ~~~~~}}}~}}}}}}}}}~}}||}|}}|}}}|||||||}|||}w|vvvv|||wv|vp|wuooolllolloolllolllloly{!$$9!!!! !!! !  !         px                                                                   Տ~~~~~ܦء~।~~~~~}}~~}}}}}s|}}}|}||}}}}}|w|||}w|}}||}|vp||w}||v|vpvv{vppooolllollopllllllllolC!$$9!!!!! !!! !  !            px                                                                              Տ~~~~ۦ뫢ґ}~~~~~}}~~~~}}}~}}}}}}}}}}}|||}}w|wvv}}vppv}}vvppvvvvppvooooloppooooollllllllColCCyy!!!9 !! ! !! !     !px                                                                          Տ~ۣ~暤}~~}~}}~~}~}}~~}}}~}}}}|}}ww|||}}}}v|}vwvwwvv}}|vwvvwvvvp|vpvoooollolloooopllllloollllol!!!9!!!!!!!!! !      p_                                                                       ա~~~۫䢢~~ؤ~~}}}~}}}}~}~}}}}}}}}}}}|}}}|}}}}||w|}}w|||}|w||v|wvvvppwooppopplllplloollolllllllllllloyy!$$9!!!!!!!!!! !!!! !      px                                                       Ց~~ܫ~~~~}}~~~~~}}}}}}~}}~}}}}}}}}}}}}}}w}}w|}}w|}}}|v}}|wvvw|wvvvvwvypoooploppooopoooollllolllllllClCll$!!!!!! !!!! !! !!!       px                              Տ~~~~ۦ~~~~}}}~~~~}}}}}}}}~}}~}}}||}}}}}w}}wvvwvpppvvv|w||}}vvwypvvooppollloooollloloollllloollllClCuu!!$! !!!!!!!!!    !      ox                                      ա~~~~~~ۣ롢~~~}~~}~~}}}}}}}}}|}}}}}}}}}}w|w||||vw|vv|w|}vwvpvvvpwyopvpoopplpoooooooooollllllllloolllCllll!!$9!! !!!! !  ! !       px                                    Տ~~~ܦ~~~}~}~}}~}}}~}}}}}}|}}}}}|}}w}}}|}ww|v|wwvvv}||v|vpvvvvwwppoopooppoolpolpppolooooollllollllolClllluy!!!!!! !!!! ! ! ! !            ox                                           Վ~~~ۣڢ~~~~~~~ّ~~}~~}}}~}~}}}~}}}}}}w}|v}|vw}}}vwpvv|v||vpp||vwv|wpppppopopppoolooopopollopoollooolllCloolCCll{!$!9! !!!! !!!  !!!        !  ox                                 ~~~~ۦ~~~~~~~ّ~~~~}~}}}}}}}|}}}}v}}}}}v}}|vw}}}|w}vww}|vvv}vpvwppppvvppvppopvvoppoolloolpolloollllllllllCCllluu!!!9!!!!!!!!! ! !!            !p_                            ~~۫~~駑~}}~}~}}}}}}}}}}}}}}}}}}}||}}}ww|wv|w|wwvv|vv}pwwvvppvvvppopvplpvvooooppllooolollolloolllllllClllCy!!!9!!!!!! !!!!  !!                p_                 Տ~~~ܣ桡~~~~ב~}}}}~}~}}~}}}}s}}}}}}}}w||}}}v|www||}|v}wp|}wvvvvpvvv|vooppoopppoooooooollopplollloollllClollllCty!!!!!!!!!!!!!! !  !           o_                      ӏ~~ۢ~~~~~}~}}}}}}}~}}}}|}}}}}}}|www|}w}||vvvvw}}wv}wvw{vv||vvpppoopppvopppppopvollpoooollllllollllllllllllllly!!!!!!!!!!!! !! ! ! !     ox                        ӏ~~~ܫڡ~~~~~~}~}}}}~}}}}}}}}}}||}}}}||vw|vv||vvw|vvvwvv|ppppppvvpovpovvppppolpoooooopollpllollplllollClCllllluu!!$!! !!!! !! ! ! ! ! !             vx                 Տ~~~~~~ۦ~~~~~~Ӏ~~}}}}}}~}}}}}}}}||}}}}}||}}wvw}}vvvvvwvvvvvpppvvvvpopppopppoopopoopooollllolllllolllollllllClCCCu!!$!!!! !! ! ! !!!!! !           !px             Տ~~~~~~~~ۣ~~~~~~~ِ~~~~}~}}}}}~}}|}~~}}}w}}}}|}}}v||wʘvppvpvvp|w|vppoppopooplopopppploollllllllllllllllllllllCCCCly!!!9!!!! !! ! ! !!   !        px              Տ~~~~~~Ԧ棢~~}~~~}~~褑}}~}}}}}}||}~}}}}}}|}w||w}}}}|w|||}ِwppv|pppp|ppopovppvvppvooloppoopploppllooololClllllllllllllllt!!!9!!!!!!!!!!!!!!!             ox        Տ~~~~~~~ۦ~~虀Ӏ}~}~~~}}}}}}}s|w}|w}|}w|}w|vv|w|wvvvvpvvvppppvvvopppvpopvopppoooooppllopoppllllllllllllllllCCllly!!!9!!! !!!!!!! ! !!            px       Տ~~~ۦݡ~~~~~~}}~}}}~}}|}}}|w}}}wv}v|w}|}ww|vvvvvvvvopppvpoovpopopvooppoooooooloooooollllllllllllllllCCClC{u$!!$!!!!! !!!!! ! !  !         px           Տ~ܦ~~~~~~~~~}~~}~Ӏ}}}}}}}}}}}}}}}}}|}|||}w}vw}vv|v|vpvpvvppopopoppopoloopoolopoooooopollooploolllllllllllCClly$!$!!!!!! !!!! !!           px       Վ~~~ۦۢ~~~~~~~~}~~ّ~}}}}}}}}|}}}}}}}wאwwpvvvvppvpppvvvvpvpvppvpppvppppoppllloooppolllllllllllloolCClllCCCll{t$$$9!!!!!!!  !! !!           !px            ~~~~~~~ܦ룢~~}~~א}}}}}}}}}|}}w}}}}אw}}wvw|vpvvppvvppvvpvpovpppppppoopooppollopololllolollllllllllllllCClCll{{!$!9!!!!!!!!!!!! !              !px      Տ~~~~~~ܣ~~~~~~~~ґי}}}}}}|}}}Ӑ}wv|wvwvvpvvpv|vppppvvpovpppppopoppppoopollollolloolllloollllollClCllCCCl{t!!!9!!!!!!!!!!! !  !          !px       Տ~~~~~~~~ۣڣ~}~~~~~}}}~|v}~w}אwwv|vpvv|vvpppvvvvvpppppvpvpopopopppvpovpolooloollolllloolollollollllllCCC{y$!!9!! !!!! !!!! ! !             ox     ӏ~~~~~~~~ۦ~~~~~~~~}}}~~ґٚ}wߙwvvvvpvvvvvvvvvpvvvvvpvvpvwvvvppvpoooloolooooollopollllooollllClCllClCCCClll{t!!!9!!!!!!!!!!!!!!! ! !             px    ~~~~~ۦۡ~~~~~~~}}}~}}ә}}ߜ}v|w|||vvvvwwpvvwppvpvvovvpppvpopopopoooooooolooooooolloolllllllllCllCCCllCCllly!$!!!!!!! !!! !! !  ! !             vx    Տ~~~ۣ뢢~~~~~~~~~~~~~~~~}~ٞ}}ٙ}}|v}wv|}vvvwwvpvpvvvvpvopvppoppppopopoopoooppolloooloooloolllllllllllllllllCClCCzu!$!9!!!!!!! !! !            !vx   ԟ~~~~~~ۣ~~~~~}~~~}}}~~~~ߙ}~}}w}ٙw}vvvwwvvpwvvpvvppwvpvppvvpppppoppovpvpvopooloooooooolooollpoollllllllllllllCllllClCu$!!9!!!!!!!!!!  ! !!! !            !vx     Ց~~~~~~~~ۣ㣢~~~~~~~~~~}}}~}}~~Ӑ}}}w}}}Ґ}}wvww}wvpvv}vvvwvvvwwwvppvpvvppppvpoooppppoooooopoloollollllllollClolCllllCClCollCCCCxt$!!9!!!!!!!!!!!!! !!!           ! px    Ց~~~~~~~~ۣ~~~~~~~~~}~~~}~~~}}}~}ߘ}}}}ٜw||}}wvww|w|w}wvvv}vvwvvvvvvvpppppppvpppoppoooooooooloplloooolllllllllllllllllllColCCCClCt!!!9!!!!!!!! !!!! ! ! !           ox   Տ~~~~~~ۦݦ~~~~}~~~}}}~~}}}}}ʐ}}}}}}}}wpwwpv}}|}|vv}vvwppppvvvvvpvpppppvppppoooooopoooopollopolllolollllllllClllllClCClllC{u$!!9!!!!!!! !! !! ! !  !          o_    ӏ~~~~~~~ۣ뢣~~~~~~~}~~~}}~}}}}}}}w}}w}}}|vvv|wv}}}vvvvvvvpvvvwpvvvvppvvpwppppppopooooooppoooooolllolllopolllllloplllCllClCllllCCClt!!$9!!!!!!!!!! !! !         !     !px    Տ~~~~~Ԣ~~~~~~}}~}~}}}}}}}}}}}}}~}||}|vvw}ww|vvv}vvp|vpvvvvp|wvw|pppvppppvvvpppppvpooopooooopoloooollloollllooClllCCllCCCCllCCCxx!!=9!!!! !!!! !! !!            !vx  Տ~~~~~~~ۣ㣢~~~~~~}~~~~~}~}}}~~}}}}}}}}}}~|}}|w}wvwww|vvw}wvvvv||vvvpwvp||pvvvpppvopppopppppopoooppoopoooooollloollllllllllllloCCClClCCCCt$$!$!!!!!!!!!!!!! ! !               !vx  Տ~~~~~~~~ۦ~~~~~~~}~~~~~~~~}}}~}}}~}}}}}}}|w|}}}||w|wv|}}wvwvp|||pvppvppppvvvpvvpoppppooopppooooopoooopollllloollCllllplllllCCClCClCCCCCzz$!!!!!!!!!!!! ! ! !!  !      !      px   Ց~~~~ڢ~~~~~~~~~}~}}~~}}}}~}}}}}}||}}}}}}w||www||wwvv|}}|vvpvwppvvvppvvpoopvovvpvvvppvolpolloooloooolloopplloollllllllCllCllClCClCCCt!!!! !!!! !! !!! !!!               !!vx  Ց~~~~~ۦ~~~}~~~~}}~}}}}}}}}}}}|}}wv|}wvw}}w}|v|vvpvwwvpvpvvv|ppvvppppppppppopppooopowplpoppoooooooollollllllllollClllCClCClClCCCxz!!!9!!!!!!!! !!! !! ! !!        !   px   Տ~~~~~~ۣݦ~~~~~~~}~}~}}}}~~}~}}}}}}|}w}}wvs}}v|wwvw||wvvvv||vvvvwvvvpvvvvpvpwvovppopooooopo|plvooooooploolllollllllllllCllllClllCCCClCllt!!!$!!!!!!!!! ! !!!  !             ux Տ}~~~~ۣ樣~~}~~}}~}~}~}}}}}}}}}}w}}||}|}}}wv||}}vv|wv|vv|wvwppvpvvvvvvvwvpvvvvvooovvplooloolooooolololllllllllllllColCllCClCCCC?CCCy{!!!!!$!! !! ! !            |x  ӏ~~~~~~ۣ먡~~~}}~}}}}~~}}}}}}|}}}}wwvwvv|}}wv|vvvw|vwvvwpvvvwvpvvvvpppppppvvpvvooooopopooolooplloloolllllllCllCllCCllClCCCCCCCCCx$=!9!!!!!!!!! !! !!!!!!          px~~~~~~~ۣݢ~~~~~~~}}}~~~}}}~}}}}}}}}}||}}www}}|v|}|vwvw|vv||wvvvvvvp|wvvvpwvpppppvopopoovpoooppooppopoloolllloolllllllllCllllllCClClCCCCCCCz{$$!9!!!!! !!!!!!! !! !  !   !    !vxՏ~~~~~~ۦꨢ~~~~~~~~}~}~}~}}~}}}}w||}}||vw}wvw}}vvvw}vv|}wvvvvvvvwvvvvvvvvvpppppppoooppoolppolooouolloloollllCCoClllllllllCCCltllCCCCCCCC!$!$!!9!! !! !!!!!!               vx ԑ~~~~~ۦݢ~~~~~~~}~}~~~~~}|}}}}}}}}}}}ww}}}|wwwwv|}v|wvwv|vpppvvppvpvvpoppopvvvppppopvpolollpoolooopolllolllllpllooolCloolllCCClCClltCCC!=$9!!!!!!!!! !! ! !!!  ! !     pxՑ~~~~~~ۦ止~~~~~~~}}}~}}}~}}}}}}}}}}|}w|}}wwv}}w|}wvwwvwvvvvvv|pvvvppppvpvpopvpopvpppoppppopvoloplllloolluolloollllllClCCClllllCCClClCCCl!9!9!!!!!!!!!!!! !! !  !  !      !px ӏ~~~~~~ۣԢ~~~~~~~~~~}}}}}}}}}}w}}w}}|}}}}v|||v|w|wv||vvvwvvvpvvvvpppppvpppopoovppopppovppolloooolollloollllllllllllCCCllllCCCllCC?CCCC$$!9!!!!!!!!! !!!!          !vx Տ~~~~~~~~ۣ楢~~~~~~}~}~}}w}}}}}}w}|}}}}ww}w}w|}|vv|}|v|vvw|vwwvvvvvvvvvvvppvvpppoppooppoopvppooooooououooooolllllllololCCCClllllCClCCCCClCCCt=$$9!!!!! !!!!!!!! !!! !       !    vxӏ~~}~~ۣԣ~~~~~~}~}}}}}}}~}}}}}}}wv}wvvw}}|w}}vw|vvvvpvvvvppvvvpovpw|ppppppvvvpopopvplupoopppuolllopolltllllllCClolloollllCClCCC?ClCx$!!!!!!!!!!! !!   !          ! !vx Տ~~~~}~Ԣ楢}~}~}~}~~}}}}}}}}}}}}}}|}}w}}}||www}w|||v|vv}wvvvvvvvvpvvvvpw|opvpvvvuppovpoollovoooluoloollolloollolllCllllClllCClCClCCCCCu!!99!!!!!!!!!!!!! ! !       !    !px  Տ~~~~~~~~~~ۣ֤~~~~~~}}}}}}}}|}}}}}}ww}}ww}}}}wvw}}vvvv|}wv}wvvwvvvvvvwvvpvppvpv|pppooppupoopoopolopllllulollllolllllllllllCClCCCCCllC?Cu!!$9!!!!!!!! !!! !           !px     Տ~~~~~~~~~~~ۦ樑~~~~}~~}}}~}}}}}}}}ww|}}}ww|}wv|||vvpvv}|w}w|vvvvvvvvvppvppopopvvoopoppppvvoppullooollolpollllltlCollllllllllCClCCCCCt$!!!!!!!!!!!!!!  ! !!  ! !     !    !   !px  Տ}~~~~ۦ~~~}~~}}}}}}}~}}~}~}}}}}wvw}|}}}}ww}wwwwvw}wvwvwvv}wvvvvpvvvpvvvvvppppwppoppoolooouopvoloolllloooopllllCllClllllCltlCCt$!!9! !!! ! !!!! !!! !     ! !         p_  Տ}~~~~ॡ~~~~}~~~}~~}}}}}}}}}}|}}}w}}}ww}}}}wwwvwwwwvwvvvvvvvvvvpvvpvppovvvppppopppoppououoloploolootollolllllllollClCClClllC$$$9! !!!!!! !!!! !! !       !    ! !vx  Տ~}~~~}~~~~~~}~~}}~}}}}}}}}}}}}|}}}}w}}wv|}ww||vww}wwvv|vpvvvvpvvvvvvvvpovvvvoopouplppopppplolooooooolollllllllllClllCCllCCl$$!9!!!!!!!! !!!! ! !! !           !vx  Տ~~~~~~~~~Ԣ٤~}}}}}}}}}~~}}}}}}}}}}}}}}wv}}}w|wvvv|wwwvpvwvvpwwvvpvvvopwvvpoppovvvvppolpoolopololloolllllllloullllllllllCllCC{$$99!!!!!! !!!!!!!!  ! !!! !              vx    Ց}~~~~~~~~~~~~~~~~}}}}}}}}}w}~}}}}wwwwv}}}}}v}}wwv|wwvwvwvvvvvvvvvvvppwpvvvvvvvopvppppvvulolooloullltloooollololollClolClu{$!!99!!!!! !! !!! !!       !    vx   ա~~~~~ڤ~~~~~~}~}}}}}}}}}}}}}ww}}}ww}vw}w}wwwwwvvvwvwvvwvvvvvvvovvvvvpppppwopppoppoopoooupoooolloooollllllllllllollly$!!9!!!!!!! !! ! !!! !             !qxՏ~~~~~~~~~~ۢ}}}}}}}}}}}}}}}}}}www}ww}w}w}wvwvwwwwvvvwwvwvvvwwvpovvvppppoovpoopppopoopooovoolooopoolllllolllllllClly$!!9!!!!!!!!! ! ! ! !             px Տ~~~~~~~~ؤ~}~}}}}}}}w}}}}}}}}}}w}}}}wwwwwwvvvvw}wvvwvvvvvvvvvpoppwvlppuppplovppvolluvlloulppoollluupolloouolu!!$9!!!!!!!!!!!!!! !   !    !   !      !vx  Տ}~~~~~~~~~~ԣ~~~}}}~~}}}}~}}}w}}}v}}}v|vwwwwwvvvw}wvv|v|vvvvvvvvvvvvvvppppvopvvvppopvopoooouulopvooolloooooolotlClu9!=9!!!!!!!!!!!! !! !!!!!!   !     px  ~}}~~~~~~~~Ԣӡ~~~}~}}}}}}}~}}}}}}}}w}}}www}wwww}vv}vw}wvvvpwwpv|vvvvvvppvpppvpvvpvpopppovooopoooppuoooluolpolllollo$!$9!!!!!!!!!!!! ! ! !! !     !   px ~}~~~~~~~~~~ۢڤ~~}}~~}~}~}}~}}}}}}}}wߐ}w}vw}}wvwvw|vw}pv}}|vvvwvvvpopvwvpvvvpvvvpppopopvplopopvollopolloolpooololClo$!$9!!! !! !!!!! !!! !    !  !  !!! ! ! !|x  ՟~~~~~~~~~}~~~~~}}}}}}}}}}}}}}}wِ}w}}}}vww}wwvwvwwwwvvvvvv}wvvpvpvvvvvvpppvoovppvvvoopvvpopppllupullCoololllo!!$9!!!!!!!!! !!! !! !   !    !vx  ԑ~~}~~~~~~~~~}}}}}}}}}}}}}}}}}ِ}ww}w}wv|w}wv|wvwwwvvvvvvwvvvv|pvvvppvvvvvpvvpoppvopppoooooplouullooollolty!!$9!!!!!!!!!!!!!!!!! !   !   !   !px  Տ}~~~~~~~~ڑ~}}~}}}}}}}}}}}}}}א}wwww}}}vww|wwvvvvvvvwwvvpvvvvwvwwpppvovvpvvvoppovpppooluoooluuuloppolloy!!!9!!!99! !!!!!!!! !!!     ! !     px   ӎ}~}~}~~~~ܦ椡~}~}}~ww}}}}w}w}אww}w}}w}}w}}}wvw}vvvvvpvwvwwvvvvvwwvwvoovvvvopvvppppovvoovvooopoooullouy$=$9!!! !!!!!! ! !      !  !     ! !! px ӏ~~~~~~~~~~ؤ~~~~~}}}~}}}}}}}}}}}}א}}ww}}wvv|wwvvv}vwv|vvpwvvvvwwppvvppvvvvvvpuopovpoloovolpopvoouuolooy!!!9!!!!!!!!!!!!!!!!!! ! !     ! !  !px  Տ~~~}~}~~觡~~~~}}}}}}}}}}}}}ʐw}www}}|wwwwvvw}vwwwvvvvwvvvvwvvvvvvvpvppvopppopppppuupooupplloplou!!!!!9!!!!!!!! !!!! ! !  !     !  !vx Վ~~~}}~~~~~~~~~ԡ}}}}}}}}}}}w}}}}}}}ʐ}w}}ww}}w}wwwwvwwvw}wvvvwwvvvvpvwvppvvpppooppvppopvpopppppvulllopou!999!$!!!! !!! !! !   !  ! ! !   ! !qx=BA   Վ~~~~~~~~~ۣ٤~~~~}}}}}}}}}}}}w}ww}Ӛ}w}w|wwvvwvvw}ww}wwwvvvvvvvvvpppvpppppvwvpoupvvoolpoovvoopvvppuuov!!!9! !!! !!! !!!! ! !   !    !vx=x= Տ~~}~~~~~~~~~~~ԣॡ~~}}}}}~}}}}}}w}}}}}ʙw}}wwv}ww}ww}vvwwvvvvvvvvvvpvwvpvvvvvvpvppvvpovvpupvppoolpoololooy!!!9!!!!!!!!! !!! !!   !     !vx=zʖB   Տ~}~~~~}~~~~~~~觤~~~~~}}}~}}}}}}}}}w}}}}}ҙwwwwww}www}}}vvvvvvvvvw|vvvvvwvvvvvvvvuvppvppoppvvoppvooouoooulooov{$!!9!!!!!!!!! ! !! ! !   !  px!tzt$  Տ}}~~~~~~~~~~鬢}~}}}}}}}}}}}}}}Ǚww}}}vw}w}}wwwwvw}vvv}wvvvwwvpvvwvpvvvvppvvpoopoowouvpouppolppolluǘ=$!!!!!!!!!!!!! ! !!!  !   !   ox!     ~~}~~}~~}~~~ۣӑ~}~~}~}}}}~}}}}}w}}}wwwǘ}}}}}w}}vwvvvwwwvvvvwvvvvvvvvvvvvvpvvpvvvvpoppwppvovpoopvplolouoppv{{!!!9! !! ! !! !! !!  ! !   !      ! !qx    Տ~~~~}~~~~~~~~ڥ~~~}}}}}}}}}}}}}}}wwwv}}wv}}wwvwwwvvvvvvvvwwvvvvvvvvpvvpopvvppvpvpppopoouolupooollooooooy{!999!!!!!9!!!!!!!! ! !     ! !  !vx    Տ~~}~~}~~~~}}~~}}}}}}}}}}}}}}}}}}w|wwvww}}vvw}vvvvwwvwvvvvwvvvvvpvpvpovwvppovppooouoooooooooooooollollu{=9$9!!!!!9! !!!!!! !!! ! !     ! !px  ~~~}}}}}~~~~觑~~~}}}}}}}w}}}}}}}}}wvvwww|w}}wwwvvwwvvppvvvvvvvvvvvvpvvpoouvvooopvpopppppvouvppooouoouu{{{!!!9!!!!!!! !!!! !!  !   !   vx   }~}~~~~~~鬑~~~}~}}~~}}}}}}}}}}}}ww}}ww}}}}wwwvvvwwvwwvv|wvvvvvwwvvvvvvppvvwvppvpppppvpppooovupooopoupolllllolooluy!!!9!!! !!!!!! !!  !!    !   !  !px   ӎ~~}}~~~~Ԥ~~~~~}}}}}}}}}}}}w}}}}}wv}}}}}}}w}ww}wvvwwwwwwvvwwwvvwvpwvvpvvvvvoppppopvvppoooupvooooooooooolooolllolyy$!!9! !!!!!!! !!!!!!! !    !  px ~~~~}}~~~~~~~~~ڤ~~}}}}}}}}}}}}}}}}}}ww}}}wv}}w}ww}wwwww}ww}vvwwvvvwvpvvvvvvvvvppppppoupooouooupouuollolloooooolloollt{{9!!9!!!!!!!!! !!!! ! ! !   !   px     Տ~~}}}}~~~~~~~ڤ}}~~}}~}}}}}}}}}}}}}}}}}}}}}}}vw}wwv}}wwwvp|}wwvwwvvvvvvwvvppppvvvvvvvvpooopupoopoooooooouollllooloooollloyy$999!!!9!!!! ! ! ! !   !   !      vx     Տ}}}~}}~~~~槑~~~}}}}}}}}}}}}}}w}}}}ww}}ww}wvw}wvwwvwvvvvvvvvvvvvvvvvvvvpppvvvvoopvvpoopvuooooooouolopollCllllllllllރ{!9!!!!!!!!!!!! !! !!! ! !   !  !   !px  ~}}~~~~~~~~謡~~~~}}}~~}}}}}}}}}}}}}}}}w}ww}}vw}}wvvwwvw|vvpvvwwvvvvvvvvvvvvpvpppvpppvvvpooouppppolloouoouputllotltlltllllyy$9$9!!!! !!!! !!!! ! !     !   ox     ӎ~~}~~~~~~~~~}}}}}}}}}}}}}}}}}}}}}}vvw}}w}}|vwwvv|vvvvvvvvvvvvvvvvpvvpoopvpopvvvpoooooopuopolppoouplloulooolllooClolly$999!!! !!!! !! ! !       !   px      ӏ~}}}}}}}}}~~~~~Ӓ~}}}}}}}}}}}}}}}}}}}}w}w}}}}ww}}wvvw}ww}}wwvvvvvvwwvvvvvpppvvvvvwvoouopppoooppoolooouppouolllolllooolollllltoCty{!!99!!!!!! !!! ! !! ! ! !! !!    vx      Տ~}~~~~~䥡~}~}}}}}}}}}}}}}}}}}}}}}www}}w}wwwwvv}vvvwwvv}wvvvvvvvvpvvvvwvpvvvppvpovvupopopuoopolopoooloolluollullltCllllllCl{y!9!9!!!!! !!!! !!!! ! !     px      ~}}~}~~}~~매~~}}}}}}}}}}}}}w}}www}www}}wwvv}wvvvvvvwwvvwvppvvvwvvwvvpvppppvvvppppppoppouooluuoolouoloulollollllltllllllCt{z!!99!!! !!! ! ! !! !!  !   px      ~}}}}}}}~}}~}~}~~~ڤ}}}}}}}}}w}}w}}}}w}}wwwwwvvwvww}vvvvvvv|vwwvvvvpvupvvvovpvpopvppooopulpoppopovollloolloollllllllolllolllCCCCxy$$$9!!!! !!!!!! ! !! ! !  ! !  ! ox   Ց}}}}}~}~~}}}}}}}}}}}w}}}}}}}}}}}}w}}}}}w}w}wwvwvwwvvvwvvwvwwvvvvpvwvvvvvvpvvpvvvppooovovvpvouuolooluuuuuolloltooolllllCCllClolCCllߔx$!!9!!!!! !! !! !! !! ! ! !!   !   ox    ӏ}~}}}~~}~~}}~~}}}}}}}}}}}}}}}}}}}}}ww}}}}}w}}wwwwwvvvwwvvvvwwvvvvpwwvpvvvvvpvpvvppvpopvouuoooopoouploolooolollolllllolCltlllClllltCCtz!!!9!!!!!!!!! !! ! ! !! !  ox   ӏ}~}~~}}}~~~~椡}}}}}}}}}}}}w}}}}}ww}}}}}wwwwvw}wvvwwvvvvwvvwvvvvwvvpvvvvopvvvuoppvppopolopoooooploooooloolllllllllllloCllCCCllCClCl{y!9!9!!!!!!!!! !! !   !  !   px  Տ}}}}~}}~~~~~}~~~ҡ}}}}}}}}}}}}}}}}}w}}}}}}}ww}wvw}}}w}wvvvvvvvwvvwvvppvppvvpvpvpovpvvppopvpoppvovopvoooolopuulllllllooullCClltlllCtlCCCllllCt߃!;$9!!!!!! !!!!!! ! !   !    vx     Տ}}~}}}}}~~~~~ԡࡑ~~}}}}}}}}}}}}}}}}}}}}}ww}ww}}w}}}wwww}wwvvvvvvwvvvvpvwvvvvvvvvpvppvopppvvpooppooowuloluooloolllolluoltopltlltlllltCllllCllCCCCtzz!9$9!!!!! !!! !! ! ! !! !   px  ӏ}}}}}~}}}~~~~~}}}}}}}}}}}}}}}}}}~}}}}ww}}}w}ww}}}w}wvwwvvwwvvvvwvvvvvvvvvvvvppvvpppppvovpopupvvoovooploouuoolltoloulllllllllllCtllCllCllCllCClCCtŃ!9!9!9!!!!!!! !! ! !! ! ! !  ox    ~}}}}}~}}}~}}}ҡऑ}}}}}}}}}}}}}}}}w}}}}}}w}}}}w}vwww}}wvvvvwwwwvwwwvvvvvvvvvpvvpvvpvvvvvpopppvpoppooolpvoopouolotolouollllllollllllltCCClCCCllCCCCCllx!!99!9!! !!!! !! ! ! !  !   ox  ~~}}}}}}}~~}}~~}}}}}}}}}}}}}ww}ww}}w}}}}wwwvvvvwwvvvww}}vvvwwvvpvvvwvpvvpppvppvvvvpppooouooopulpuoolllouuoloooooltlllllllltllltlCCCllCCCCCCCt̛!!99!!!!! !!! ! ! !!   !    px  Տ}}}}}~}~~}~~~}~ڑ}}}}}}}}}}}}}}}}}}}}}}}}}}}}}ww}}}}wwwvvvw}wwvvwvvvvvvvvvvvvvvvvppvppvpuvuooopoooppupooouololoollloulllllllullllllClllllCtCCCtCCtCtCCCCCy9!99!!!!! 9! !!! !!  !   px  Տ}}}}}}~}}~}~}~~}}}}}}}}}}}}}}}}}w}}}}w}}}}}}w}www}wvvwwwwwvvwvvvvwwvwvpwvvpwvpuwvpvopvoppopupoupuuooouooulouoolouotulllllllllllllllllCClCCCCCCCCCCCCCCt9!!9!!!!! !!! ! !  px ~}}}}~}}}}~}}~}}~~~ّ~}}}}}}}}}}}w}}}}w}}}}}}}wwwvw}}w}}wvvvwwwvvvwvvvvvvpppwvvvvvopopvuooupppppopluullooolopulllooouolllllltlCCllllCClllCClCCCCCCC?CCCCy!999!!!!!! ! ! !!   ! ! ox ӎ}}}~}}~~~~~}}}~~}}}}}}}w}}}}}}}}}w}wvw}}}ww}}}vwwvvwwwvvvvvppvvvvvppvwvpvoouvvvopvvvoouuoouopulouuoouulooololCloolllCtlllulClClCCllClCClCCCCCC?CC!!99!!!!!! !!! ! ! ! !      px!}}}}}~}}}}}}~~ґߒ}}}}}}}}}}}}}}}w}}}}}}}}w}}}wwww}w}wwwwvvvvvvwwvvvvvvvvvvvvvpvvvvpuovupupvpoopvvooopuuuooouooooooolooollolllColClulllCClClCCCCClCCCCCCCCC!!99!!!!!! !!! !! !!! ! !! vx~}}}}}}~}}}}}~}~~}}}}}}}}}}}}}}}}}}}}w}}w}}}}}}}}}wwvw}w}vvvvvvvvvwvwvvwwvvvwwvpvvuovvppvvvopvppuovuppooovooplouulooloollltullttllltllllolClClCllCCCClCCC?CC?l9!!9!! !!!! ! !! !! !  pxՏ}}}}}}}}}}}}~~}~}~}}}}}}}}}}}}}}}ww}}}w}}}}}}}ww}ww}vwvwwwvwvvwwvvvvvvvvvvwvvvpoppuppvvvvoplouovoopuvulouuouvpollllllulllCllllCCuolCCCllllltCCClCCCCCC?CCAt!!!9!!!!!!!! !! !   pxԑ}}}}}}}}}}}}}~~}~~~}}}}}}}}}}}}}}}}}}}}}}ww}}}}}٘wvwwvw}wvvvvvvwvvvvvvvvvvvvvvvupvuvvvvvvoouupoovopptluollupuooltlllCllotlllCCCCCllolCCCtltCCCCCCCCCC!999!!!!!!!!!!!!!! ! !  !      pxՑ}}}}}}}}}}~~}~~~~摑}}}}}}}}}}}}}}}}}w}}}}}}}}}}ww}ʘwvvw}vvvvvwwvvvvvvvvvvvvvvvvpupvopuvvvovppooouluouluolltuCoolottttollllulllltllltlCCCllCCtClCCCCCu9!!9!!!!!!!!!!!!!! !! ! ! ox~}}}}}}}}}~}}~~~}~~~~~}}}}}}}}}}}}}}}}}www}www}}w}אwvwvvvvwwvvvvwvpvvvppvpvvvvpovoupoppovuouuulluooluuloouloolloolltllltollllolCllltCllCClCCCllCCC9!!9!!9! !! ! ! !!! ! !   oxӏ~}}}}}}~}}}}}}}}}}~}}耏}}}}}}}}}}}}}}}}}w}}}}}}}}}}}}朘}ߐwvvvvwvvvvvvvvvvwvppvpppvppvvupvopuooouoooooooolooluouuulololllllllllCCCClCCCCllCCCCCtlCCCCCCx9!;9 !$9!9!!! ! ! !   pxԏw}}}}}}}}}}~}}}}}~}~}ґ}}}}}}}}}}}}}}w}}}}}}}}ww}}}w}wvwwvvvvvvvvvpvvvwvvpvvvvppvvvvuopvuupvoupopppppuuuuolooloooolllltlltCCCltltlltllCCtllCCltCCCCCt9!99 !!!!! ! !!! ! !!  px~}}}}}}}}}}~}}}}}}}}~葑}}}}}}}}}}}}}}}}}}}w}w}ww}w}ِww}vvww{}vvvvvvwvvvwvvvpvvvvpvwpppopvvuoovupuooopooouuoltooollootllltllltlCltlltllCllClCCCCCCCCCCC9!99!!!!!!! !! ! ! !     oxӏ}}}}}}}}~}}}}}}~~}~}}}~}}}}}}}}}}}}}}}}}}ww}www}wߐwwنwwww}vvvvvpvvvvvupvvvvuvvvvuvpoooouoopuuuoooooloupooootlloollooltlltllllllollCCCtlCCCClCCCCCCt$!!99!!!!!!!!! ! ! !   ox~}}}}}}}}}}}}}}}}}}}}~}}}}}}}}}}}}}ww}}}}}}}}}}}}w}wvw}wwwvwwvvvvvvvuvvvpppvoovvpvvvpoouvovpouvvoutouoouolououoltlulltlltlllCClCCllCCtCtlCCCCCCCC!!99!!!!! !!!!!!    px}}}}}}}}}}}}}}}}ӑ}}}}}}}}}}}}}}w}}}w}}}}www}}}}לwwvvwvvvvvpvvvvvvvvvvvpupuvvvvupuppuvuuuooouuupluutloulloClllooltCooltlltllllCtlCllCClltCC9!99!!!!!!!!! ! ! !   px}}}}}}}}}}~}}}}}}~~}}}}}}}}}}}}w}}}w}}w}}}}}}אwwwwww}wvwvwvvvpppvvvvvvvppvvvvpupppvuupuuovoupouoopuooooooouolooltllotltltlllllolCllClltCClClllCt!9!9!!!!!!!!! !   px}}}}}}w}}}}}}}}}}}}}}}}}}Ҁ}}}}}}}}}}}}}}}}}}}}}w}}}ww}}vvwv}wvvwwwvvwvvvvvvvvvvvvpopvpvvvvuvupvvooopooouuolouuouoouuooltllotlolllCCltltollCCCCCCtCCCCClCC9!!9!! ! !!! ! !!     px}}}}}}}}}}}}}}}}}}}}ґ}}}}}}}}}}w}}}}}}}}}}}}ww}w}}w}ww}vw}}wwwvvvw}vvvvvvvvvvvvpppvvuuuuupovvuopupopopvvouuoluplllluuuolllltltlttltlCCClttCCCCtlCCCCCCz!!99!9!!! ! !! !!  ox}}}}}}}}}}}}}}}}}}~ґב}}}}}}}}}}}}}w}ww}}w}}}}}w}ww}w}www}wvvww}vvwvwwwvvvvvvuvvvvvvvuupvppvvulvplppvpoouoooopoutoooouuooooloooolllClCClCCtClllCCClCCCtCCt9!99!!!!! !!!!!  px}}}}}}}}}}}}}}}}}}}}}ґ}}}}}}}}}}}}}}}www}}}www}w}}w}vv}wvwwvwvwwwvvwwvvvwppvvuvvvvppvvvvuvuuuuuvupuuuuooolvuouoluuuooolllulllltlCllCCCClllCCCttCCtllCC!!99!!!! !9!! !! ! !  !oxԑ}}}}}}}w}}}}}}}}}}}}}}}}}}Ҁُ}}}}}}}}}}}}}}}}}w}w}}}}}w}ww}ww}ww}wwvwǜvvwwvwvvvvvvvwvwvvvvvvpvvvpvvvvpvvoouuoopuoouuouuoollllllllolClClouuoltlllClllllutlllCClCCx!!999! !!!!! ! !! px!}w}}w}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}www}}w}}}}w}}v}w}wvw}wwvvwvvvvvvvvuvvvwvvvppuppoppuuupupvuooovpuoltoooolltloottuulCCllltlCllCtlCClCClCCCtCt!!!!!!!9! ! !    pxӎw}}}}}}}}}}}}}}}}}}}}}}}}}}~}}}}}}}}}}w}}}}}}}}}}}}w}}ww}}}w}ww}wwvvwwwwvwvvvvvvvvpvvuvpuuuppuppvoppuuouvuuoopoooooluololllttoolltooltlltlttltCClttCCCtCCl9!!9!!!9! !! !  px!~w}}w}}}}}~}}}}}}}}~}}}}}}}w}w}}}}}w}w}}wwww}}}w}}}}}wwww}vwvvvww}vwvvvvuvvvvvvppoppovvuovvluvuopupouuuuolluuullttlllouollltooolllotlllllltllCCtlCAu9!99! !!    ox}}}}w}}wwwww}}}}}}}w}}}}}}}}}}}~}}}}}}}}}}}}}}}}}}}}ٙ}}wwwwwvw}}w}wwwvw}}v}wwvwww}vvvvuvvvvuppvwvuoopvoouuuoouvoolllloollouolouuuuollltouullllltCltttlCtCCCCCCACt$!!9!!!! ! !ox!Տ}}}}}}}}}}}}}}}}}}}}}}}}}Ҁ}}}}}}}}}}}}}}}}}w}}}}w}}}wwwwwvwwvvwwvvvwvwvvvvvvvvvpuvopvouvvvooovuouvououuovpuouuoouoloouttllllltlllCCttlllCCCClCtltCll9!!9!!!! !   px~}ww}}}}}}}}}}}}}}}}}}}}}ґ}}}}}}}}}}}}}}w}}}w}}}ww}w}wvvvwwvvwv{wvwvwvvvvvvvovvvpppvouvuuuppoovuuuovuovuouuuooooolotlulllttlolltlllllltClCltCllClu!!!9! !!    px}}w}w}}}}}}}}}w}}}}}}}}}}}}}ґ~}}}}}}w}}}}}}}}}}}}w}w}}}vwwwwwww}vvw}ww}w{vwvwvvuvvwvvpppvvvvvvpopvpvpoouwuoopuuoulouuooullpuulltllClltuotlCCCtttllCtolCCCCC!!9! !  !vx$ԏ}}ww}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}ٙ}}wwwwwwww}}w}ww}ט߆vwvwvvwvwwvvpvpvvpovouwuuuouvypuvpoououltpoloooltootolCtololluotllotClCtCCCtClCCtlCCx99!!! !!!    |xՑw}}}}ww}}}}}}}}}}}}}}}}}}}}}}ґ}}}}}}}}}}}٘w}}}}}}}wwww}wwww}ʐǘ}vvwvvvuvvpvvvvupvpvvvuuvpouuuplopooouuuultooCouultoluolltllCtlCtlClCCCCllCt!!!!  ox}}}}ww}}}}ww}}}}}}}}}}}}}}}}}}}}}}}}}}}}ߙ}w}w}ww}}ww}ww}}ww}wwwސvwwwvvvvvvvuvvvvuupvuvpv{popuououuouoplpulloolluullolttltCltClllllCCCCCtCCC!!!      px~}www}}}}}}}}}}}}}w}}}}}}}}}}}}ـ}}}w}}}}}}}}}ߘww}w}}w}wwwwww}www}wvwwwǐʘwvvwuvvvvvvvvvvvupppvvuluupolooppuuuolouuuouotllltlllCltllltttltCltlCltCtx9!!   !vx~}}}}}ww}}}}ww}}}}}}w}}}}ww}}}}}}}}}}}}}}}}w}}}v}}}}ww}}}}www}wvvwwvw̘}wwvvvuvvvvvwvvpvvvppvvpw{ouvoouwuollotllollllouttltlClCCtllClCtCCClClCt!!!    ox~}}}w}}}}}}}}}}}}w}}}}}}}}}}}}}}}}}Ҁ}}}}}}}}}}}}}}}}}}}}}}ww}w}wwvwwvww}wwwwwvvvvvvvpvvvvppvvpppppppw{uptouoouutottlollllloltltllttllltltCltClCCtC!!!   ox}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}w}}}}}}ww}ww}}wwvwwwwv}}}wvvvw̜wvvvvvvwvvvvvuuupvuuupuuouyvooulluouutootullttllllllltllltllttCCloCCCy!!   ox~w}wvw}}}}}}}}}}}w}}w}}}}}}}}}}}}}}}}}}}}}}}}ww}wwv}}}w}wwv}}wvw}}wvvvwwwwvvwvwwvv}wvvvwvvvvuuuvvvvvvuvvpvvuvoyv{ulllloloolloltlllollClttlCtltCllCCtlltt!!!!    !pyՎww}w}www}}}}ww}}}}}}}}}}}}}}}}}}}}}}}}}}}ґ}ґ}}}}}}}}}}}}}}ww}}}w}}wwwwwwwwww}vw}w}}vvvvwwvwwvvwwvvvvvvvvvvvvvvwvvvvvvppvvvvpuyuuotuullolollttttuulltlttltCCltttCCCtl!    py$www}}ww}}}w}w}}}}}}}}}}}}}}}}}}}}}}}}}}}ґ}}}}}}}}}}}w}}}}}w}}}ww}}ww}www}}wwvwww}}wwvvvvwvvvvvwvvvvvvvvvvvvwvvvvvvvvvvpvuuvuuyp{ooltluooolltoltttltlolltlClltlCCCtx      pxw}ww}}}}wwww}}w}}}}}}}}}}}w}}}}}}}}}}ґ}}}}}}}}}ߞ}}}}w}}}}w}}}}w}}}}}w}ww}}}}vw}wvwvvw}wwv}wvwwwwvwvvvvvvvvpvvvpvuovuupuvuuupuoyoytouoootluutllooulltttltCCClCCtCt   px$wvvw}}}}}}}w}}w}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}w}}ww}}}}w}ww}}}}w}wvvw}}wwvvvvvvvwwwv}vvvvvvppvuvvpvpvpvvvvpvvppvpvvvu{uvotltoltlCClClllCCtluoltllltlC   pyՏ}ww}}ww}}www}}}}}w}}}}}}}}}}}}}}}}}}}}~}}}}}}ߙ}}}}}ww}}}}}w}}ww}ww}}vw}www}wvw}wwwv}wwwwvwvvwvvvvwvvvvvvvvvvvvuvvvvvpvuuupupvvuuytottotlltouutttllClCtllClCCu ! pxՑ}w}}}ww}}ww}}}}}}}w}}}}}}}}}}}}}}}}}}}}}}}}}}w}}ٙ}}}}}}}w}w}}w}}w}}}www}}}}wwvwwwwwwwwvwwwwwvvvwwvvwvwvvvvwwvvwvvvwvpvupvvpvpvuuovuupuuotutlltooolllutCCtCltCCCl  px~w}}}wwv}}}}}}www}}w}}w}}}}}}}}}}}}}}}}}}}}}}}}}}ґ}}}}}}}񐀙٘}}}}}}}}}}ww}w}}}ww}}}}}w}}}}w}wvww}wvvvvw}wvvv}vvwwvuvvvvvvvvvvvvvvvvvuuuvuupvvuuoupw{toltltlltCCCtlotltCltlC    qxՏwvw}}}}wwww}}ww}}}}}}}}w}}w}}}}}}}}}}}}}}}}}}}}}}٤}}}}}}}}}w}}}}w}}w}}w}}}}wvvv}wwwwvwvw}vvwvvvw}vwvvvvwwwwvvvvuvvvvvvpuvupvuvvvuuvvpuvutltolltltlltCCCllCtCu ! px~vwww}}}}}}}}}}}}}}w}}}}}}}}}}}}}}}}}}}}}}}}}י}}}}}}}}}}}}}}}w}www}}}}v}wwwww}vw}w}wvw}wwvvwwvvvwvvvvvvvvvwvvvvuvvvvvpppuupvpvupvupuouuߔulttltllCltCCtCCClt   py~v}}w}}}w}}}}}}}w}w}}}}}}}}}}}}}}}}}}}}}}}}}}}}}Ҁ}}}}w}}}}ʐ}}}}}}}}}}}}}}w}w}}}w}}www}www}ww}ww}w}wwwwwvwvvvvvv}wvvvvvvvvvppvvvvvuvvpuuvpppupvuoup{uytotoltlCllCCCCCC!   pxw}}ww}}vwwwwwwv}}ww}}www}}}w}ww}}}w}}}}}}}}}}}Ҁ}}}}}}}}}ٞ}}}}}}}}w}ww}}}}wwww}ww}w}}www}wvvvvwww}vwvvvvvvvvw}wwwvvvvvvvvuvvwyvvvpvvuupvvuuuoovvvv{otlltllClttttltu !    px~vwwv}}ww}}w}}}w}}ww}}}w}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}w}}wwwwwww}}}w}}}wwww}wwwvww}wvwvwwwvvwwwvvvwvvvvvvvvvvvvvuvvvvuvvuvvppupuppuvuou{oytllltCCCtttt   px~vwwv}ww}w}}ww}}ww}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}w}}}}}}}w}}}w}}ww}}}}w}ww}}wwwww}wwwwwwwvwwv}wwwvwwwvvwvvvvvvvvvvvvvvuvvvuvvvuvvvuupuppouuuoyuuCltlCltlC  ox!$~wv}}wwww}}}}ww}}}}}}}}}}}}}}}}}}}www}}}}w}}}}}}}}}}}}}}}}}}}}}}w}}}}}}}ww}}w}w}}}w}}www}ww}www}ww}wwwwwvvvvwwvwwwvwvv}wvwvvvvvvvwwvvvppvuvpuvuvupwvvvpuvoluuuoyuzlltCCtCx!   ox5}www}}}}wwv}wwww}ww}wvww}}}w}}}}ww}}}w}}}}}}}}w}}}}}}}Ҁ}}}}}}}}}}}}}}}}}}}}}}ww}}}ww}w}}vww}w}}}}}}}wvvvv}wvvvvpvvvwwvwvwvuuupvvvupvvpvvpuuuuuvuoupupvoopuuuyuylltlt    !|y75$75~vvvwwwww}ww}}}}ww}}}ww}}}}}ww}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}w}}}}w}}}}}}www}}}}ww}wwwv}www}www}wwwwwvvvwvwvvvvwwvvwwwvvvvvpuvvuvvvuvpvuppuuuuupuupouuyottC     vx7Տwvvvwwvv}ww}}}www}w}}w}}w}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}w}}}}}}}}w}}}}}}w}}w}}}}}}}www}v}}}wvwvwww}}wvvvwwwwvwvv}vvwwwvvvvvvpvppvvvvvvvvvuupvupvuuuuuuvuuzz    pxՏwvwv}}wvwww}}}}}wwwwwww}}}}}ww}}}}}}w}}}}}}}}}w}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}w}}}}}}}ww}}wwww}}w}w}}}www}}}}}}wvv}vwv}wvvvvvvvwwvvvpvvvpvvvvvvvvvvvvvupuupvvvvvuuuupuvpuuuu py$~vwww}wwvw}wwwww}}w}}w}w}}}wwww}}}ww}w}}}w}}}}}}}}}}}}}}}}}Ҁ}}}}}}}}}}}}}}}}}}}}}w}}}}}}}}}}www}}}}}}}}}}w}w}www}}wvwwwwvwv}wvwwvwvwwwvvvvvvvvvvvvvvvuvvpvvvvvupuuvuuuvpupuuvuuuupvuu    vx7}vwwwwwwv}wvw}wvw}}w}}}}}}}www}}}}ww}}w}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}w}}}}}}}}}}www}}www}}}www}www}vv}wwwwvvwvwwwvwwvwvvwvvvuvvwvvvpvvvvupvupvuvuuuuuupuuuvuuuyu  py5775~wwvwvwwv}wvw}wwww}ww}}w}}}}ww}}}}w}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}w}}}}}}}w}}}w}ww}w}}}}}}wwww}}w}}w}wwww}ww}vvwwvwvvwwwwvvvwwvvwvvvvuvvvvvvvvpvvupvvvvvupuuvvupuuouvuouyv    oxӎ}ww}vvwww}}}}w}wwww}w}}}}}}}}www}w}w}w}}}}w}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}ww}}}w}}}}}w}ww}w}wwwwvw}}}ww}}}wvw}}ww}vvvvwvwwvvvvpvvvvvvvvvvvvvvuuvvpuppuppvvuopuuuuuoupupuoouuy !  py75~wvv}wvw}wwwww}}vwwvw}w}ww}}ww}}}}}}}}w}}}}}}}}ww}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}ww}}}}}}}}w}w}}}}}}}}}}wwwwwwwwwwwwwwwwvvwvv}vwvvvwvvwvvvvwvwwvvvvvvvvvvpupvvvvuuvvuuvpuuvuppuupvu{  vy775~vvv}wwwwwwwvw}}w}}www}ww}}}ww}}}ww}}w}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}w}}}}}}w}}}}}ww}}w}wwvw}w}}}wwwv}vvv}wwwwvvwwvvwwvvvvvvwwwvvvvvwvvvvvvvvvvvpuppvvvuvppuuupupuupupuuyu{    vx5777vvvwwwvvwwwv}}w}}}}wwww}}}}ww}}}w}}w}}ww}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}w}w}}}}}}w}}}}ww}}w}wv}}w}wwww}ww}wwwwwwvvwwvwvwwwvwwwwvvvvvwwwwvvvvvwvvwvvvvuuvvvvpvvvuvvuupupoupuuuuuotyu   px777}}wvvwvvv}}w}}}vvw}w}vww}}}www}wvv}}w}}}}}}}}ww}}w}}w}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}w}}}}}}}}}}}}}}ww}}w}wwww}}}}}}ww}wwwwv}w}w}wwvvvwwwwwwvvwwvvvvvvvvvvvvvvvvuvvvvvpvvvpvpuuvvuuuuppvpuouuuvu{u{  qx5$775557}wvvwwww}}wvwwwvwwww}www}}}ww}}}}}ww}}}}}ww}w}}}}w}}}w}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}w}ww}}ww}}}wvwwwwwwwvvwwvvvvvwwv}vwvwwvvvvvvvvvvvvvpuvuvvuvvvuvvpuuvvvvuuuuuuoooopu{u{  py57575777555}vvvwvvw}wvwvvw}wwv}}}www}wwww}}ww}}}w}}}}ww}}}}}}w}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}wwww}w}}}}}w}}www}w}w}wvwwwwwwwvvwwwvwwvvvwvvvvvwvpvyvvvvpuvvvppvvvvvuvvuvvupuuvuuuuouuouuuuuu{u  px57757775}vvvvvvvwvv}vww}wwv}wwww}wv}}}}ww}}ww}}}}}ww}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}ww}}}w}w}wwwwwwwvww}}w}}}ww}}wwwwvwww}wwwvvvwwwwwvvvvwvvvwvvpvvvpvvuvvwvpvvvpvvpvpuvuouuuuuuuvpoopuupuoo{u   px5757}vvvpvwwvvwvvwwvvwv}vvwv}}www}}vwww}w}}}}w}}}}ww}}}}}}}}}}}}}}}w}}Ҁ}}}}}}}}}}}}}}}}}}}}}}w}}}}}w}}}}}}}}}ww}w}}w}}ww}ww}wwwwwvw}w}wvww}wwvwwvw}wwwwvvwvvvvvwvvwvvvvyvvvvvvvvvpvvvvuupuuuupppuuuuvvpuuupvoouuuuu  py555757777577755}pppvwvpvvvvvvwvvwwwww}}w}www}wwww}w}}}}w}w}w}}ww}}w}}w}}}}}}w}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}ww}}}}}}w}}}}wwww}www}}}wwww}v}wvw}w}vwwwwwwvwwvwwwvvvvwvvv}vvwvvvvvvvvvvppvvvvppvuvvpupvuuuuuuuuouuuupuoouu  ox557777577755|ppvvvppvvvvvvwv}wwvvw}}}www}wwww}ww}}ww}w}}w}}}}www}}w}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}w}}}w}}w}w}}}}}}ww}}}}}}}www}www}}ww}}wwww}vvv}wwvwwvvwvvvvvvwvvvvvwwvvvvvvvvvvvvvpuvvvpvvvppvuuupuuouuouuuuuuouuu  py5577777777$755spppvpvvppvvvvvv}wvww}wvwvwwww}w}}www}www}ww}}www}www}w}}}}}}}w}}}}}}}}}}w}}}}}}}}}}}}}}}}}}}}}}}w}}}}}}}}w}}w}}}}}}}w}w}}}}}}w}}w}w}}}wv}}}}w}wwwvw}wvw}}}}ww}wwvwww}vwww}wvvvwwwvvvvwvvvvvvvvvwvvwvvvvvuuvvvuvuoupupuvupvpuuuvpoootuouu   py555775777555~pvppppvvpvwvwvp||vvww}vvvvw}}}www}vw}}}w}w}www}}}}}}w}}w}}}}}ww}}}}}}}}}}}}}}}}}}w}}}}}}}}}}}}}}}w}}}w}}w}ww}w}}}}}}ww}w}w}www}}}}}}w}}}}}}wwwww}ww}wvv}wvwwwwvv}wwvvvywvvvvvvvvvwvvpvpuuuvwvuvvvuuuvvpvuuvuuuuuuuvuuouptopuuu py575757775777555555}ppppppppppvvvppppvvvvwvvwvvwwvww}}w}wwww}w}}}w}}}w}www}}}}}}}}}ww}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}w}}}}}}}}}}w}}}w}}w}}w}}}}w}}}}}}w}}w}www}}ww}}w}}}wvwwwwwww}w}wwvwwwwwwwvwwwvvvvwvvpvvvvvvvvvvvpvvvvvvpvvuvuuvpuuouvvpoupuuupuuuuuoy  py557557777757777777755|pppppppvpppvppppvwvvpvp|w|pwwvvw}wwwwvwv}vw}w}}}}ww}}wwww}ww}}}}ww}}}}}}}}}}}}}}}}}}}w}}}}}}w}}}}}}}}}}}}}}}}}}}}}}w}}}ww}}}}}}}}}wwv}}ww}w}}}}}}}wwwwwwwwww}w}wvwwwvv{vwwvvvvvvvvvvupvvwvvvvuuvvvuuvvuvvpuuuuouppupouuuuputuuoot{    py555555577757757$77777575777555555}wvpvppppppvpppppv}vpppvvv}v|}vvwwwwv}w}}}wwwvwwww}w}}}www}}}}}}}}}}}}}}}}}}}}}w}}}}}}}}}}}w}}}}}}}}}}w}}w}}}}}}}w}}}www}w}}}www}ww}}}w}}}}wwwvvww}}w}wwww}wvvvwwvvvwvvvʜ{wvvvvvvvpuuvvvvuvpvvvuuvvuvuuvuouvvpuuuuuuuuuutuoooou  oy555555575777$7775555555555555}vppppppppppppvpv||p|pv|pp|wvvv|p|}vvwww}}w}}www}w}}wwv}}}w}}}}}}}}}}}wwww}}}}}}}}}}}}}}}}}}}}w}}}}}}}}}}}}}}}}}w}}}}}ww}w}}}w}}}}}w}}}www}ww}wvw}}ww}}wwwwwvwwvwwvvvwvvvwwvwwvvv̘wwwpvvvvvvuvvvupuvvvuvuuuvuvpuuuuuuupuoooououtltuu py55555575577575775555555sppvpppppppppvvppvvvpvwpppv|vpvvv|vv|wwvw}vw}wwwww}}www}w}}ww}}w}}}}}}}}}}}}w}}}}}}}}}}}}}}}}}w}}}}}}}w}}}}}}}}}}w}}w}}}}}}}}}}}}}}}}}}}}}}}}}ww}}}}w}w}}w}ww}ww}}wwv}}wwwwwwvwwvwwvvwwvvww}vwwvvv{wvpvvwvvppvvvvvpvupuvvuuvuuuuuvuupuuuuupuopuutluu vy57555555777577775577577755555555}oppvppppppppvppppvvpwvppv|ppppp|vpp|wvvpvwww}wwwwwww}w}}}www}}}}}www}}ww}}}}w}}}}}}}}}}}}}}}}w}}}}}}}w}}}}}}}}}}}}}}ww}}}}}}w}w}}}w}}}}}}ww}}}ww}}}}wwww}ww}wwww}wwwwv}v}ww}wvv}wvww}wvvwwwvuvw{wvvvvwvvvvvvvvvvvvpuvvvuuupuoupuuvuluuuvuuuy{{{      vy557555557775775$775557555755555555555555}ppppvvpppppvvvvvpv|vpp||wvppvqp|vppp|pvvvwwvvvw}wvw}}wvw}w}}wwww}}}}www}}}}w}w}}}www}}ww}}}}}w}}ww}}}}}}}w}w}}}}}}}}}}}}w}}}}}}w}}}wwwwwww}www}w}}}}ww}w}}wwwww}wwwwwvvwww}vvvvwwwvvvwvvvw}wwvvvwvwvywvvpuvyuppuuuuuvvwvuvuuvvoovpuuoootuutu!px5555775557557777755777557555555555555555555555555575sppppppppppppppppppvppppppvwvvvpv|vvvwp|wwv||v|w}|wvwvwww}}}w}}}}}}w}}}w}}ww}w}}}}ww}w}}}}}}w}}}}}}w}}}w}}}}}}}}}w}}}}}}ww}w}}}ww}www}}}}w}wwvw}}ww}}vw}}wwwwww}w}w}www}wwwvwwwwvvwwwvvyvvwwwwvwwvvvvvvw{vvuvvvvvupvvuuvvvuuuvvpuupvuuuuuouuuu   py55755755775555577777577777775555755555575555555555555555555}ppppppoppppopppppvpppppvpvvvvvppvvvvv|vvvvvv}v|wp|}}vvw}w}}ww}ww}ww}}}}}wwww}w}}ww}}w}w}}}}}}}}}}w}w}}}}}}}w}}}}}}}}}}}}}}}}}}w}}ww}}}}}w}}w}}v}}}www}ww}w}w}ww}wwwwwww}www}vwww}wvwwwvvvwv}wwwvvvvwwvvwvvvvvwvvvvvvvuvvwvuvpvvuuuouuuvpuuuuuuouvuuuuo  py55555757577777777757777777775557555555555555555555557qoppppoooppvpvvppppppppp|vppppvvpvvvvp|ppvvp||ppvpvvvv|wvvvww}wvwwvwwww}}}}}}}}}}}}}}ww}}}}}w}}}}}}}w}w}}w}}}}}}}}}}ww}}}}ww}}}}}wwwww}}w}ww}}w}}}v}w}}w}}www}wwwwww}ww}}}www}wwv}vwwvwwww}}wvw}wwwvvvvuvvvvvvwvvpvyuvwvvvuuuvvvuuuvouuuvpuouuupuuuuvpu{ vx55557775755775777775577777$7777775555555555555spppoopvvppppppoppppppvvvvp|pppvvppvwv|vpppvv||||pp|v}|vvwwvv}}}}ww}}wwvvw}vvw}}}}w}w}w}}}}}}}}}}}ww}}w}w}}}w}}}}w}}w}}}}}wwww}w}}w}}ww}}}ww}}ww}}}vw}}wwwww}}vwwwwwwwvwwwvwwww}wwwwvvwvvvvvvvvvvvvwvvwvvvvpvpvvvwppvvuvuvuuuvvvvpuupuuoppuuuuuuuuuuu    oy557557777775775777777777577777575577555557775555555555555555555555555555555555555555555|vpopppvpppppppppvpppppvpppvvpvvpppvvpvpvvpvvvqvwvvv|||vv|v|vvw}|vvvvwvwvwwwww}ww}}}}}}}}}}w}}}}}ww}}}}}w}}}}w}}}}}}}}}}w}}}}}}}}}}}w}}}}}ww}}w}}}ww}ww}}w}}ww}}w}w}}}wwwwwwwwwvvw}vvvvwwwwwvvvwwvwwvwwvvvwwvvvvvvvvuvvvvvuvvvuvuuvvuuupuuuuuvuuouuuuuuty oy577555755555775777757777755577575775555555555555555555555555555555555555555qpppopppppppppppvvpppvppppvpppv|pppvppppvvvvvpvv|vvp|v||v|vwvvvvvv|wv|||vv}|vv}}ww}}}w}}}}}w}}w}}}w}}}}}}}}}}}}}}}}}}}w}}}}}}}}}}}w}w}}}}}}}}wwww}}w}}w}}}w}}}ww}ww}w}}}wwwvw}}wwww}ww}wwwwwvvwvvwwvwwwwwvwwvvvvvwwvwvvwvvvwpwwpvvwwpvvuvvvuvuupupuuuuuvuupuuoouuouut   py555557757557575555577777777575775575555555555555555555555555555555555555555555555555555spopopppppopppppvppwwvvpppppvpvpppvvpvvppvv|ppwppvpv|p|}vvp|p||vvvvv|w|wvvw}||}www}w}ww}}wv}}w}ww}w}}w}ww}}}www}}}}}ww}}ww}}}w}}}}}wwwwww}wwv}}}}w}}wwwwwvww}wwv}ww}w}}www}wvw}wvwwwvw}}v}}wvwvwvwwwwwvvvvvvvvvwvvwvuvwopvuuuu{uwvvvuuvvvvvupvuuuuuuuuuuuuuoluoo  oy555557555755775557575575555777777775777577557575755555555555555755555555555555555575555555555555555555555|pppppppvppppppoppoppopppvvppvvppp|ppvvvp|vppppvpvpv|ppwv|vvpv|vvv|||vp|www}vvwwv}w|wvw}ww}}}w}}}}wwwww}ww}ww}}}}}ww}}}w}}w}}}}}}}www}}w}}}w}}wwvw}ww}www}}w}}wv}wvwwvwwvwww}}wwwvw}vwvvwwvw}wvw}vvvvvvvwvvvvvvpvvvpw}yvvwvvvuvvpuuuvvuupupuouvvvpuouuuuoupuuy  px5555757555557757755757755757$757757777777577575555575555555575555555555555555555555555555555555557555555555}ooppooppoopppppppp|ppppppvppv|ppvvppp|pv|pvvvpvvvvppvv|p|vpvvvvvvvp||vv|vpv|vwvv|w|}ww}www}w}}v}}}w}}w}}w}}}}}w}}}w}}}w}}}ww}}}}}}ww}www}}w}}}w}}wwww}}w}w}wwww}ww}}w}wwwwwwwvwwwwww}vwwvvwwvwwvwwwvwvvvwwvvwvvvwwvvvvvvvvvvvvwvvvvvv{vuvvupuuuuuuuuuuuupuuuuuuuuuootl{ py55577757575757775577775577557775555775755555555755555555555555555555555555557555555555555555555555}poppooopooppppppppvpppvvppvvvvvppvppp|v|ppv}vvvpvvppvvpvvvvvvpp||pp|||vw|p||pwvv||w}}|}vw}}}w}wwwww}}wwww}w}}}}}wwww}}ww}}w}w}w}ww}}www}www}w}}}wwwwwwww}}w}ww}wwwwv}}vww}w}ww}ww}vvw}vw}vwvwwwvvwwwwwwvvwvvvvvvwwvvwwwvvvvvvvvvpuvvvpvpu{vvuuuuuuuppvuoupoouuououooouolll   py5555555555775777755775$777557777777577777775777775757755555555555555555755555555555555555555555555555555555555sppoppoovpppoooopppoloopppoop|ppvppppo|vpp||vv|vw}vv|vpp||wwvvvw|vpp||vvvv||p|}||vvp|wwvppp|pvwvv|wwvww}ww|vwwwvww}}}}ww}}}}w}ww}wwwww}ww}}}}}}}ww}w}}}}w}}}w}}}}wvww}}www}}wvvwvv}w}}ww}}wvw}wwww}wwvvvvwwvvvvvvvvvvvvuwvvvpuvvuuvvvuvvuvwupvvvvvuuuloopuooolllolollllol   vy557755757775775555777557757777777757777775577775755555555555555555555555555775555555555555555555555555555557555}ooppoppoopvpppoopvppp|vpvvpppppppppppvpppwpp|vppvpv}pvpvvv|p|||v||vpvvppvvv|vvv|wvvvpvvww||||vvv}vww|www}v}wwvvv}}}w}}w}vwww}}w}ww}}ww}wwwww}}ww}}w}w}w}wwwww}}ww}}}}vwwwwwwww}wvwww}wwwwwvvwwvvvvvwvvvvwvvw}wvywvvvvvvvvvuvvvwvvupwwpvvuuuvvouuuuuuooopuupuloppuollllulllCC py555557757557577575577777777577577775577555775775757575555555555555555555555555555555555575755555555555555555555575555sooppooopoopoppooppvpovppvpoppvpppvppvppppvpppvpppvwvpvvvvvpv|}|vvv|vvvvvvp|||vv}vvvwvvpw|vpw|vwvpv}|v}|v|v|||vw|}w|w}w|wvvw}}}wwww}}wwww}}vwwwww}}vw}}}ww}}}}vw}}www}wwvwwwwwwwv}wwwwwwwwwwvvwvwwvvvvvvvvvvwvwwwwvvvvvvvvvvvvvvvvvvuuvwupuvopuyvouvpoluoolloopllouolllllllllllC   py55555557757775577577757777755$7777757777775577557775577555555555555555555555555557555555555555555555555555555755555555555555555555555575555555555555555555}oooolloopopoopppoppoppoooppppppppvvv|v|pvpppppvvpv|ppp|vppp|||vvppv}||||vpvppvp|pp|||ww|vvv||}vw|pvvvvvwppvw}|}}|vvwwv|vwwvvvw}wvw}wwwwwwwwvwvvvwwv}wwvvw}}w}w}wv}}}wvwwwww}}wvvwwvv}wvwwvvvvwvvvvvwvvvvvwvwvvvwvuvvvvvvwvvvvvpvvvvvuppopouuuuuoopvpploooollllllllllllllClCClll !py55555557775555555755775755575777775=777775777577557777775777577557775555555555575555555555555555555555555555555555555555555555555575555555555555555555555575555555557555555555555555555555~oppooppoopppvvpppppvppoppppppvppovppppopvvvpvoppoppvvpvvpvvvpppp}|v||ppvwv||wwpvv||v}||pp|wv||pw}||w}|v|pvv|vpvvpvw}|v|vvv|www|vvvwvvw}wwvwww|w}wwww}wvvvvvwvv}}w}vvvvw}wvvvv}}vwwvvvvwwvvvvvvvvwvvv}wvvvwvvpvuvvvvvpppupppououvouopopplpuovpvpoolllllooolololllllllllllllClCll  vy555555757775557755577757$7557557777577777775757757555755755757555557555555555755555555557555555555755555555555555555555555555555555555555555555555555555555555555555555555555555|oppoopppolooppooppoppppvppppppppovvvpppvppvvppvvpv|vvppvvv||pp|vvvppppvvvppvvwwv|vvpvv|vvpwvv}vvv|pv|v|v|}vvpqv|pvvvvvv|||vvvvvvv||pv|wv|wv}vvwwvv}wvvvvvv}wvpwwvvvvwvwwvvvvvvwvvvvpvvwvvvvvvvpwwvvwvvvvvvwvpvvvvvvvvpvpppvppoovppooppvppoooo{olloooollllloollllllllCCllCCllllCy  oy5555555577755777577575577577777777555575555577555557757557555557555575555555555555555555555555555555555555555755555555555555555555555555555755555555557555555555555555555555|oopoooooooopooppppoopvpppppppppppvpvvpvvpppppppv|vvpvpp|pvwvpvwvpppppvvvp|pvvvv||vvvv|vvvp|vvv|vvvvvpp|v||vvp|vvvvvv|vpvp||vpvvwvv|vvvv|vv||v||vv||wvppvvw|vppvvpvvvwv||vwwvppvvvpvvvvvv|vvvvpp|vvwvvppvpvvpppvvpopppppvoppppoopooopvpoupoololoooloollllCollllllllllCllCCCCllCu    my555555557775775757757775775757755577557755575577577775555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555soooppopvpppplopoooolpolpppoppppppppoppopppvvvvvpppp|wppvvpppppvovvvvv|vppvvv|wvvvvvwvvppvvvv||v}}|}}|ppvvvv|||pvvp|||vvwppvvv}|vv}vppppppppv|ppvwpvppvpv|vppvvpv|pvvwvvpp|vppvvvww}wvwvppvvvvpovpoppppppppolooooopppvpppoppopppollooolllllol{uloolollllllllCCClllCllClllllCClCCl  py55555555777757777575777755777775757755557775555757557557755555555555555555555555555555555555555555555755555557555555555555555555555555557555555555555555spolopolooopolopppppoopoppplpppppvpppoopppvpopppvppvvppvppwpppv|vpv|pv|pvvp|wpwv||vpvppppv}vppppvppvv|v|wv|}wvvvvvvvvvvv}|vv}vpv|vvvv}|vw}|||ppv}|v|pvwvpppv|vvvp|pppvvpvpppvp|wpopppppvvpopvvvppppvpopppppppoopoopolppooooloplooolloooollpolloollollllCllllllllllllllllllClllCC  py555555555575577775$5777777557557755755555777775555575555575755555557555555555555575555555755555555555575555555555555555555555555555555555555555555755555555555555555555555555755sooooloooooopoopooppopvoppopppppopppppopppvpopvpvpppvvppppvppvppvppvppvvvvpvvpvvvvvvppv|vvvpv||p||p|vvvpv|vvvpvw}pvvvpvvvwv||ppvv|||pvvpvvvvvvv|vvpp||vpppvvvvpvvvpvwvvvpvppppvvpoppwpppvpopppppoopppppoppppoopvpopoooooooloopoopoloplooloolyoolllllllllllllllllllClolCllClllCCly   vx5555755777777757775777777577777777777557557757775555555555555555555755555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555557575757557555555555555555555ӎoooooooolooooooppoolopppppoopopopvpooppplppv|pppopvp|vppvpppppvpppvppvppppv|pwwppp|vpv}vvvpwv|pvvvpppppv}vvvpvw|qvvpp||vpv||vvpv|v|vppppppp||v|pppv|vpppp|ppppvvvvv|v|vpppoppp|povwppopppppppopooopvvpoopoooovpppppollopoooopoopooooloololloooloooollllllolllllloCllCClllllllClt    oy55555555577777775777577777755755775777577775557777555557555555755557555557555755555555555555555555555555555555555555555555555555555555555555555555755555555557555555555555555555555555555555555555555555555555}polooooooopppopvppploopppoopoloppvpoopvpoppopoppvvpopoppoov|ppppppvppvppppvpvvppppv}w||vvvppwvpv|w|w|pvp|v|}||ppppvppvp|vpppvvvvppppppv||ppvvpvpppppv|vvvwvvvpv|ppvpooppvvv|pppppvpoppvpppp|pppppooppolopppvpolppvoopooolloppopoolllllopppylllllClolllllllllllllC?CllCClCCC??CCC  oy555555555557775775777777777575557755757755575575555555555757555555557555555555555555555557555555575555555555555555555555555555555575555577575555557555555755555555555555555557555555555555555555555555555555755555555|loollopooolpolopoopppppoppppppppvpppppppppppvvvvpopppppvvvpvppvvvvvvppvvpp|vpvvvvvpvvvpvvvppppvv|vppvoqvvvppppvv||wvvvvppv|vvvvpppvvpvvvppvvvvvppvpppvppppvpppvpvvppvpppvpvppppvvpoppppvpvoooopvppppvppppplopoolopooooopoloolooloooololllouloolClllllllllllllCllllllCCCCCllClCC?t py5555557555755557777755777757755777777575755777555555755575755555755557775555555555555555555755555555555555555555555555555555555555555555555555575555555555557555575555555555555555555555555555755555555555555757557sloollloooolpoopooooppppoovpoovopvpopo|opvppovvpvppvoppppvvpppvpppppppp|vpppppvv|vvvpvvpppvvpv|vvvvppppvvvpvvpwvvvvvvpvv|pw|ppvvpvvv|vvvvppvvppvvvvvpppppppvppvpp|vppvpppvpvpppovpppopppvppppopppoppoopopppooopooopooopooopoloolllooololol{lllllllllllllllCllCCllllllllCClCClCCC?lpy555555555555555555777777777775555775=7777575777555757577577575555555555555757555557575755555755555557575555555555555555555555555555555555555575557555557555555555555555555555575555555557555555557555555555755555755555sopvpoloooooooolopvvooopoopoooppoolpplpppp|popopoovppppppvv|vvwppoppppvvpovvpvwppp|w|vvppppppvw|pv|vvpvvvp|ppvvpvppppp||vp||pvppvpv|vvppppp|pp||pv|wvp||pppvpppoppppvvpppppopooopvvppopppooppppppolpppolppopoopppopolovollpploolllopoolopoooolllllllllllllCllllllllllCCClCCCCCClCCt    oy557555555577757777$77777755777755777775555555557755555577557557555575555575555555555555555555755555575575557575555555555555555555755555555555557555555575555557575555555555555555555555555555555555555555755555555555555555575555555555555555555555555555555555555555|lloolopooopooppolloloppoppppvpvvoovppvppopppppppopvvvvvpoppovoopppvw|pvppppvv}vvvppppp||||vvvwpvp||vpv|povvvpppvppvpppp|ppvvvvpvppppp||pppvppppvpppp|vpvvppvvvpvvppvpopopopwvppvpopvpvp||ppppoopppppopooppppololoppoopoololopoooollllolooollllllllllClCCClCCCCCl?ClClCCCCC?ClCCCC  !px55555555555575557577775757757777555775775577557577555555755575775555555555555555575577555555775555555755555575555575557555577555555555555555555555555555555555555555555555555575555555555555555555555555555555555555555575755555577555555555555557555755757575555555555555557555755557slllllooooooooolloplppppoolooplpppooppppooooppoovopppopppppppppvvpppppppppppppvpppvvppppppppppvpvppppvpvppvvppvppvpv||pp|ppp|vppvpppvvvwvpppv|vpppvppppvpvpppppppppvppppvvovvppppoppppoopppppoppoopppopooppoopoooppooloollooloollllopllluuollllllCllolllllllllllllCllCCllCCCC?ClCCCl py57557575555555577577557577575577577757777777755557775577555555755555575575577555555555555555555555555555555555555575575555555555555555557775555555555555575555555555555555555555555555555555555555555557755755555555555555555555555775555555555575555575555555555555555555555555555555555555|ololooopooolololpvlppopoppoooloopoopopppoooppppppppplppppppppp|vppvovvppppvppvvpppvvppppppvppppvppppppvvvvvpppvvwpvvvvpvpppvwvpvpvvpvvvppppvvppppvpppp|vpoppppppvpvppopvpppvoppppppppoppppopopoopppppppppooopooopololoolllllooolooollll{ollllolllllolllllllllCllClClllllCClC?Cl?CCCzpy5555555555557557775557757577775755555557577575555755777555555555755555755555555557555555555555575555555555555555555555555757555555555555575555555557555555555555557575755555557555557555557555555575555555555555555555555555575555555555557555555555555755555555555555555555557555555qlllllololllopppppoloolppppopopoooplooopvvpoopppopppppvppppvvpp|ppvwvpvpppvvppvwvp|wvvvpwvvvpopp|w|vppp|vpovvp||vvpppppvpp||pppvvppvppppp|vppppvvpppvvppvppppvppopoovvpppopoppoovvppppppvpoolpoolooppoloppooollopolooolllllolopollollll{oCllollCllolCCClClClCllCCCllCC????llCCCC?CCCC oy5555555575557575577555555577777757555575757775577575555575557555757555555557555555755555555555555755555555555555555775575755555557555775555755555555555577555555555555555555575757555555557757555557555575555555555557555557555557555575555555555555555555555555555555}oolllllpppoolopolllpoopooppopvopppopvppopppopoppooopoopvpoooopppppppovvpvppopwooppvpvvovppvvpppppppppvwvpv|vpppoppvpvppppp||vvpvvpppppp|ppp|vppppoppppoop|vvpppvvppppvppppppvppooooloppoooppppppolopoloooooooopoolooolpppoolloololllooullllolloolClllClllClllCCllCCCCCllCCC?lC??C?>C{    vy55555555555557555557777557575777575777577555555575555575555555755557555555755555555555555555755555555555555555755555555555575555755555555557555557555555575557555555555555555575555555555555555555555555555555555555555755755555555555555555555555555555755555555555555555555555555775557555555555555555555557sllolollploooooolooooopolopolopooooooopooppolpoopoopppoovppppppoppppoopvppppppwvppppppppppp|pppvvppvppvvvpvppovvpvpppvvpppppvppo|ppvwvppvvppvppvqppppppppppppppppp|poovpppoopppppooopoopppppoooppoooopopoloopoooooooooooololllooloolllllllollllllClllClllClllCCllCCCCCCCCCCCCCCC?A?CC   py5755555777757557555755775555555555577757555555755557575555555755755555557557555755755555557555555557755555555557555555555555555555757555555555555555555555555555555555555755555555555555555555555555555555555555555557555555555555557755555555555755555555555|ollooloolllooolooolopopooollopoopooolooppooopoopppppppovppvpppo|ppoooopvpppvpvvppppvpppppvvpppvvppvvpppvppppppvpvpppvvpppppvoopvpp|vvppvpppppppppppppvpvvoppoppopvpooopppoopoovppoovpoovpoolopppoooopopolopppolopoooolloolllollolollulCllllllllllllllllClCCCllCClCllCCCCCCCCCCCl??CC?u  oy55555757555555755755555575755755555755555557555555555555555555575555555555555555555575555555557555555555555555555555555555555555555555555555555555555555555555555555555555557755555575555555555555557555555555555555555557555557555555755555555555555555555755555555555557555qoololllopolloolololloopppppooploopppovpppppoppppppvpppppoovppoopppppppppppppvvppppvvvppppppppppppopvvpppopppvpovwppppppww|pvppvwwpppppppov|vppppppppopppvpppppppoppppooppoopoooooopppppplopoopoooploolooopooolllooolllollllllloollloylClllClolClllllCClClolCCCC?CClCCC?Cl??>??CC?C?C?A  oy555555555555555777755555575755755555557755755555557555555575555577555555555555555555555555555555555557555577555555775555555555557555555555555555555575755555555555555555555555555555555555555555555755555555555575555555555555555555575555555555557575555555555qolloolllllllllllooololooolooopppooooopooopoopoppoopppooopppppoppppvpvvpopppppvpppppoo|vpppppppppppppvpvvoppv|opppppvppvvpovwvpoppppvpppppppppoppppppppopppppppppppoopvpoopppoppppppoooppppppooopppollloloolopollpolllloolooooooolllyoollllllllllllCCllClCCCClCCClCCCCCCCCCCC??CCC?C???u   py55555575555555555555575575755557755555755575555777555555557755555775555555555575555755555755555555555557555555555555555555555555555555557555555555555555555555555555555555555575555555555555555555555555757555755555555555555555555555555555555555555555555555555555|olllllloollollloolpoolpooloopopooopoopoopooppooooopplopoppoppppppopppvppppvpovppppoopvpvpppppppppvppppvvppppvpvvppvvpppppppvppppppvppppppoppppvppoppppopppppopppopoppvpolopppoopoppoopplppoooooooooooplooolloolopollllllllllloolllotoolloolllllllClCllCllCClCCCClCCCCCCCCCCCC??CC??C>Cl   py57555555555555555777555757577555555555555555555575575577555555555555555555555575555555555555555555555555555555555555555555555555555755555555755557557575755555555555555555555555555555555555555555555555555555755755555575555755555555555555557555555555575555575555555555555555555555sollllllollllllopolpoolooooooplloppoooppooopoppolopopopvpopppppppooppppppppppouvpoppppppoppvvpppppoppppppppppppvvppppppppppppppopppopppppppopvvpppopvpoppppopppooopppoppopppppppplopoppplopolpoloopooopooollloplopllollllllllCoolll{loollllCClllllllllllllClClCCllCllCCCCCCCCCC??C??A>CCC    py555555575557575755557555775555555555555555555575755555575555755775555555555555555555755555755555555555555555555755555555555555555555555555555555555755555555557557555755555555575555555555755555555555555555555555555557555555555555555575555555755575555755555555555555557575555755555555555555575555555555555555555555555555557555|lllolllllllolllollllloooooloooolollllooloolooooooopppppppopollopppopvppooppppvvppvvvppvooopp|vppppppopppppppovpplopvpppppppppppppvpppoppvpppppoopooppopopploppppppppoppvwoolppooloppvpppoloppplopolllooooopplllloloooooolllllllllyllllllllllllllCllCClCCC?CllCCCllCCC??C?>?Cl??>>?????CC{ vy755555557555555775555557755755555575575555775555555555577575555555555557575555555555555555555555555555555555555555555555555555755555755555555555555555575555555555555555755555555555555555555775555555755555555575555555555555555555555555555555755555555555555575555755555555555575555555555555555555555555555555555555555555555555555555557sloolllllllllllollooooollooolloooollooppolopopppoopppopolpppppoppppooopppppoopvppvpovpppopp|vppppopvppvvppovvovpppppppppoppppvpopppppppppppvpoopppoppvppppppppopppooopoppooolppppppoooooppppooolooooooppolloollloolllpolollllpllloulClllClllllllCClCCClCCC?ClClll?CCC?ClC????C?????CC>>??C   py5555555555555555555555555557575575755575775555555555555555555555555555555575575555555555555557555555755555555555755555555575555755555555575555555555555555555555555555555555555555555555555555555555555555755555555555555555555555555555575775555555555575555555555555555555555555555555555555555555555555555555555555555755555555555555555555555755755555555555555555555577575}loollllooolllllolooooollllolooooopooooopolpvpooooppooooooppppppppppooppppopoovpppppppoppppvvooppoopvvpppopppoppppppppopovpppppppoopvpoppoopooppvpoppppvoopppopoopoopppppopoooooppololooppooloooolopoopollollooolllllloololllolllooClllCllllllCClllClCCCCCCCClCCCC?CClCCC???C?CCCCC>>???>y  py55555555555555555555555775575575557555557575555575577755555555555555555755775555575555555557555555557555755577755555575555555555555555555555555577555555555575555555555555775555555555575555575555555555555755755555555555555555555555555555575555575555555555555555555555555555555555555555555575555555555555557555555555555557555555555555555555555555555555sllllooopolollloollloooloollopoollopllllopooooloopooooopooopoopppoopppopppopopvppppvpppppvvpoopvpplop|poppoppoopvpppppppppppopppvpvvpppoppoppppopooppoopopppoopppooppppoopoopoloooololopoollopolllllolloooplloppllllllolllollllluullCllllClCClClllCClCllCCClCCllCCCCCC??CCCCCCCCCCCA>?CC?>A oy5555555557555555555775555755755555755755777575575575555555555577555555555555555555555555555555555555575555555555555555555555555555555555755555555555555555555555555755555555555555555555555575555555555555555555555555555755555555555555555555555555555555555555555555555555557555555555555555555555555555555555755555575555555555557575555555555slllloolllloolllloolllloooolollopooooolloolloopolpoooopplpoopvpoolopopppplovvpwoopppoppppopvpppppvppppopoppvvpoopooooooovpoppppvvpppppppvvppppppvpppppoppppppoooppppooopooloploopooloppoooololoooolllloolllllllllollllolllllolllyllllllllllllClllCClCClCllCCC????>???CAClC??l?>>?C?>??>?>>?t  oy555555555555555555555555755557555555557555555555555555555755555555555575555555555555755555555555555575555555555555755555555555555575555555555555555557555555555555555555555557555555555555555555555555555555555557575555555555555555555755555555555555555575575555555555555555555555555555555555555555555555555555555555555555555555555557555575555555555555555555555575555555555555555755555555555vlllllllllllllolllololloloolooloooloooooooloolpolppooooooppooooppooppoooppppppvpppppoppppoopppopppovvpopooopvpopppppoppppopppppvooopppppppppooooppppppoooooooppoopooovoooooppoppoooooppllooollllopolooollllopolloplllllllolllllllllllllllClClCCCCCllllCllC?CClCCCAClC?CCC??C?AA?CC?CCA???>?  py55555555575555555555555557555555555555555555555555555555555555555555555555555555555555555555555555555755555555555555555555557555555555557555555555555555555557555555555557555555555555555555555555555555555555555555555555555555555575555555555555555755555555555555555555555555555555575555575555555555555555555755555557555755555555555755555555555555555555555555555555557555555555|llllllllllllllolllllllClopooolololooopolloooolppoooopolpopplooopopppooooppoooupvpooopppooopoopppoovppopppooppoppppppppppopppoppooopppppoopppooopoooppopolpoooppopllopooppppppppooooloolopoloollooolpploollooolppllllllloollllullllCClllllClClCCClClCllCCCCCCClCCC?ClCCCCC?A>?C?>CC>?A>?C???C   py555555555555575555555555555555555555575555555555555557755555555555555575755555555555555555555555555557555555555555555555555555555555755555555755555555555555555555555555555555575555555555555577555555555555555555557555555555555555557555555555555557555555555555555555555555555555555555555555555555555555555555555555555555555555555555555575555555775555555555555555555555555555olllollllllollllllolllllllopllllloollooooooooooplololloplooooloppopoooooopppluoppppppoolpvpoppvppopoppppvpppppopopppppppopoopppppoooopppolppppppplpppppoppopllopplopolpplllloolppoloolopppopoolllllpplllllllllllllooollllClllyllllllolllllCllllClllCClCC?ClCllCClC??CCC?C?????>?C>??>??>>>?=x py5555555555555555555555555557555577555555555557555555555555555555555555555555555555555757555755557555555755575555555555555555555555555755555555555555555555555555555555555555555555555555555555555555555555755557555555555555755555555555555555555555555555555555555555555555555555555555555557555575555555555555555555555555555557755575555555555555555555555555555575555557555555555555555555555555555555555555|CllllllllllplllllllllllloolllllooollpooopolooooolopoloppooopppopoloooolopoooovpooopoppooppoopppopopoloppplpolpppoppopooppooppooppoopppoppppppopppopppollpppppopppoppolopoopopoopllloppoolloooolopolllllllollllllllllllloolllylllllllClClClllCCCCCC?CClCC?>?CCC??CCC?Cl??CCCC???>?CCC???>>??>A vy55555555555555755555555557555555555555577557755575555755555555555555555555557755555555555757575555555557555555555555555555555555555555555555555555555555555755555555555555555555555555555555775555557555555557555555755555555555555557557755755555555555555555555555555555755555755555555575555555575755555555555755555555555557555555555555555555555557555555557555555555555555555555555slllllllllllollllllloollllolllooooloooolopoloooollooooopoolopppopolooooppplooovppoopppooooppooooopoppoopppopooppoppoopoppoooppppppooppoooppvooopoopoppoooooppplpooloppoloooppooloooopooolooooolloolllloolllllllllllllollooClutlClllCllllClllCCllCClCCCCCClClCC??CC??CC???CCC?AC?>A?C?CC>>>>>?>tpy5575555555555555555557755555555557555555555555555555555557555755555555557555555555555555555555555555755555755555555555557755555755555755555555555555575555555555555555555555557555555557557555555555575555555755555555555555555555575555555555555555555555555555555555555555555755555555555555555555555555555555555575555555555575555555555555555555555555755555555555555555557555555555555555|llllCCllllCllllllolollollolllllloloolllloooolllooooppooollooooooooplopppoopolvolpppppooopppolooppppppopooppppoooppooppppoppopppppppppolppppooppololoppooppooooooololpoooloopollopppolooloolllollllllooloollloolllollollllllyllClCCClClClllCCCCllCCCC?lCClClCCCCC?>??>?C??CCA>?C??>??A??>>A>?>>  oy55555555555555555555555555777555555577555555555555555555555555555557555555555555555555555555557555755555555555555555555555555555555555555555555555557555755555555555555555555555557555555555555555555555755555555575555555555555555555555555555555557555555555555755555555555555555555555555555555555555555555555555555555555555555555555555555555555575555555575755555555555555555555555555555sllllllClllCllllllCCllloololooCllpoolloolollllllopooooppplppollllllppooooopolouoooppoopvppppppppppooloopolpvppooppooooovvooooooppppoopppooloooppoooooopopvplopolopoooolpolllollpooollloolllolooplllloolloololllllllllolCllC{CCCClCllClClCClCCC?CCCllCCCC??????CCCC>?CC??C?>?C?CCCC?>??>>>?A>>>>A oy57555555555555555575555555555575757757555555755555755555555555555555555557555555575555555555755555555555555555555555555557555555557555555555555557555555557555555555555555755555755575557555555555555555555555555555755555555555555555555555555555555555557575555555575555755755575557555557575575555555755555555557555555555555555555555555555555555555555557555555555755555555555755555555555555555555555555555555555555575555555555|lllllllllllollllllCollollolloloolllllollololopollooolllooopollooooolloloppopouoppooloppooooopopooooooppoopoooopopopploopoopvpoooppolppoloooooooopppoopoooolpopoopopppopppooplooollllloloopplllolllllllllllllllllllllllllluulCllllllClCCCll?ClCClCCClC?CCCCCC?CC???C?>>?C???C>A>>>?C?>>>>?CA=A>>] py555555755555555555555555555555555755555555555555555555555555555555555555555555555555575555555555555555555555555555555555555555555555555557555555555755555555555555555555755555555555555555557555555755555557555557555555555555555555555555575555555555555555555557555555555555555555555555555555575555555555555555555555755555555555555555555555555555555555555555555555555557555577555755575555555555555555575555555555555555555555575555555555555555557555555555555vCllllllllllllllllllllllllllllloolollolllloolppoloolollolololooopooplloolopooovppooolpppoopoloovooopoopoppooolvpoopppoolooooppoopoloooplloopooopoopooopoooloooooooooopoooooopoollollloollooolllllllllllllllllllllllCllllllylllllClClllllClllCClClC>CCCCCC??CCC?CC?C?>>>??C??>?>>>A>?A>>>>>A>=>>>> py5555555555555555555555555555555557755557555555555557555755557555555555555555575555557555555555555555555555555555555555555577555555555755555555555555755555555555555555555755555555555555555555555575555555555555555555555555555555755555555555555555555555555555555555555555555555555557555555555555555555555555555755555555755755555555555555555755555555555555555755555555555555555555555555555555555555555575755555555555555575555555557575555555555555555555555555555555555555555555555555sllCCllllCCClClllllllClllllllllollloollooloopooooooollopooollooopooooooplopolouoolooopoooppopploppopoopopppoolvppoppoooloooooopooolopoolooopooplooolooolooollpololllloolllooooololoooollllllllolooloollllllllllllllllllCllClllllCCCllllCllllClCllCCClCCC??>?CC?CCC?CC>>>C?>?CC?AC?>>>>??>>>>>>>=t  py5555555555555555555555555555555555555555555555555555555555555555557555555555555555555555555555555555555555555555555575555555555555575555555555555555555555555555555555555555555555755575555555555575555555555555555555555775555555555555555555555555575557555555555555755555555555555555555557555555555555555575555755755555555555555555575555555555555555555555557555555555555555555555555555555555575555555575555557755555555555555555555555555555555555555555555555755575555555555slllCllllllllllllCCllollllllllllllloolooollolllllllolollllllooolopooollooooloouooooopolllooovpoloppooppoolppppvooopvpooppoppplloppoopppoopopooollooloolloppllpoolloooloollllllooollloooollllloololloollllllllllllCllllllvtCCCCClolllCllCCCC?CCllCCC????lCCC?CC?>>CC?CCC???C>>??>>CC>>>>A>=>>>=>?=>z   py555555555555555555555575557555575555555555555555555555557555575555555555555555555555555555555555555555555555555555555555575555555555555555755555555555555555555555755555555555555555555555555555555555555577555555555557555555555555555555555555557555555755555555555555755555757555575555555755555555555555555555555555555755555557555555555555555555555555555555555555555555555555555555755555555555575555555555555555555557555555555555575555757|lllClClllllllllllllllllClooloolllllololllollCollpoollllllooopoloooolloooooooovolpoloooolooooopolovoopoooopoolpolloopolopoooppoloooopoooooolloplooooooopooplooooooooollloolllloollllloolllllolooloplllllllllllClllllllloylllCClllCCCCllCCCCCCCCC??CCCCCCC?CCC?CCCCC??CCCC>C?A?>>?C?>?>>?>>?A=>A>>>A py5555555555555555575555555555557755555555755557555555555555555555755555557555555555555555555555555555575555557557555555555755555555555555555557555755755555555755755555557775555555555775555555555555575555555555555575555757555555555555755555555555555755555555555557555555555555555555575555557557555555555555555555555557555555555575575555555555755555555555555555555555555555555555555555755555755555555555555755555555555555555555555575555557555575555555555555555qCllllllllllllllllllClllClollllllllloollllllllloopololllllloloooolllllooooopoluooooloooooooollopoopooopooovolooooooooloooooooooooooopoooloooloopooooooppolplolpooolooollpollooolloolllllolllllllllollllllllllllllollllllllllCllCCCCClCClCCClCC??ClC?C?C??CCC?CCC???????C>AC?>A>>>A?A>>>>A?>=AA=>>=] vy5555555555555555775555555575555755555555555575555555755555555557555555557555755555555555555555755555555555555755555555555555555555555555555555555555555555557555555555555755555555557555555555555555555555555555555555555575555555575755555555755555555555555555555555555555555555555755555557555557557555555557555555555755555557575555557575555555555555555555555555555555757555555555555555555555575555555555555557555555555555555755577755557555557755555555555775555555555555555557|CCClllllllCCloollllCllllllllllloolllllolllolllololloooolllllllllllpoooppollllupllopoolopppollopoollpooolovoloooopppoloopopolloopoloooooloppooploolooopollollopllollooloplloolllooollooooooplllllCllllllolllllllllllllulCllllCllCCCClC?CC??ClCCCCCCC?>C??CC>?C???>?C?>>??>??>>??>>>>>>>=>>>?>A>>>==>   py55555555555555575555555577555755555555555575555555555555555575555555555575555555555555555555555555555775555555555555555755555555555555555555555575555555555755755555555555557555555555555755555557555555557555555555555555775555555755555575555555555555555755555555555555557555557555555755557557575555575557555555575557555557555555555555755575575555555555555555775555555555555555555555555557555575555557755575755555555557555555557555575555555555555755555555755sCCClllllllllCCllCCllCllllClllllllllllollllllllloollllopollollooooooollopooooovllopolopolooolooooollooolllpooopolpooooppoppoolloplopppoopoooooolopoollpoloooooploploloooollllollolllllollClllllllllllllllllllllllClCloyllCCCClCCCClllCCC?CClC??CCC?CC?CCCC?>?lC?>?C?>??CCCA>>>??>?>>>>>=??>=>>=>>==>C oy55555555757555555555555555555555555555555555575555555557555555575775555555555555575555555555555555555555555555575555555555555555555557555555555555555555557555555555575555755555555555555555555555557555555555555755555755555555555555555555555555575555555555555555575555555555555555755775555555555555755555575555555555755755555555555555555555555555555555555775555555755557555555575555555555575555555555755555555555557555555555555557555|lllClCClllCllCCllllCClllllllllCllllllllllloolllllllolloooollooloooollllllloooulloooloooloopooooopoolopoolooolpolppoloooloooploolooolllopploollloollooollolloooloollololloolloolllllllllloolllolllllllllllCllllllC?lllllCllClCllCCClCC?lCCCC??C?CCCCCCCC?>?CC?>?CCC>A??>CAA?>?A>>>>>>>>>>>>A>=>=>>>=x py55555555555555555555555555555555555555555555555555555755555555555555555555555555555575755555557577555555555555555555555575555555555555555555555575555555555555755555555755555555555555555555557755555555555555555555555755557775555555555555555555555555555557555575555555555555555555555555575555555555555555555775557555555555555555555555555555555555755555757555555555555555555555555555555555555555555555555755555555555555555575555555555555575555555555755555555555555555555555555555555555555555575|lClCllCllCClllCCllllllllllCllllllllllollllollolllllollloolloollllooolllllloooupollooooolooooopoooplllopoloooloollooolllloooooolooolllolloloolllooplpploolloololllllolpololllloollllllloloolllolllllllllllClllCllCClytClCCllllClClCC?lCClCCl?CCC?CC?CCCCC???CC>>??AC?>?>>?>AA>>>?>>>>>>A>>>=?>>==>A>=> py555555555555555555555555555555555555555555555555755555555555575555555555555555555557555555755575555555555555555555555555557555555555555555575575555555555555555555555555555555555555555555555555575557755555555555555555555555555557575555555755555555555555555555555555555555557555575555555555555555555555555555557555555555557555555555555555555575555577555555555555555555555555555555555755555555555555555555555555555555555555555555555555555555555555775555555555555555555555555555755555555555555555slCCClCllllClllClllClllllllllllollClllloloollllllollolllllllollllllolooooooooluooloppollloooloolllooooooooooooololloolooooolollllllloppolllpooolopolppoolloplllollloolllCollollllloollllllllllllllllllClllllllClClCuyCClCCllCCCCClClCCll?CCCC?CllC>?CCClCCC?>?C??C?>>??>>>>>>>>>A>>>>?>>A>====>=======B ! oy555555555555555555575555555555555555555555555555555555555755555555555555555555555555555555555575757575555555555555555555555557555555555555555555555555555555575555555555555555555555555555555555755555555555555575555557555755555575555555755555575555555555755555555555555555555555555555755555555555555555555555555555555755555555555555555557555555555555555557555575555555555555755575755555557555555555555555555557555555557555555555555555555555557557755555575555555555555555555555555555555555555|CCCllCCClllllCCllllllClllClllllllCllolllllllllllolllllllllloolloololllllloollulllooolllolloooloollolopoolooopooooooolllplllllppoolooopllooolopoollloolloolllllooolllllooolllloolllolllllllCClllllllllllCCCClllllllllCClClCCllCClC?CCCl???????CCC?CC??????>>>A>?CCA>CC?>?>>>?>>>???>=>=?A======>>>>=>=  py555555555755555555555555575755555555555555555555555555555557555555555555557555555555755557555555755555555555555555555555555555555555555555555555575555557555555555555555555555555555555555555555555555555555555555555555575555555555577555575555555555557558555555775555555555555555555555555557555555555555555555555555555555555555555555555555555575555555555555555755555555555555555555555555557555555557755655555555575555555555565555555555555555755555555555555555755555555555555755555555555557555555555555555qCCllCCCCllClllllllllllClllllloClllllollllClolllllolllloloooplllloloolllllolloullllllllllllooolooollloopoloolpoooooololoooooolooooollololopollopllllllllllllllooollllpllllollllllllollllllllllllClllllllCCllClllll{tClCClCCllCCCCCC??CC??C???CC???C?A??C????>?C????>>C??>>>>>C>>>>>A>>>=>>>>>>>==>>==>=>vy5755555555555555755555555575555557555555555555555575555555557555555565555555555555555555555555555555555555555555575555555555555555555555575555555555555555555555755755575555555557555555555555555557555555555575755555555755555755755555557555555555555555555555555555555575555555555555555555555555755555557757555555555555557555555555555555555555575755555555555555555555555555555555555555555555575555555555555575555555555555555555555555575555555775555555555555555555557755555555555655555555555557557555557slCCCCCClCCCCllClllllCClllllllollllllCClllllllllllllllloloopolllllllollllollloullllllooolllolllloolloooooopllololoooolooopooolllooolloollooppllollllloopollolllllllllollloolllllllllllllllllllllClllllClllllllllltylCCllCCCCC?CC>CC??????CC??C???>>A>ACCCC?CClCC?A?>>?>>>>>>>C>>?>>=>>>>==>A>>>========>t  py55555575555655755755555555555555555555555555555557555755555555555755555555575555555575555555555555575555555557655557555555655555555555555557555555555555555555555555755555755555557555555555555555555555555555555555555555575555555555555555575555555555555555557555555588755555555555557555555555775575555555575555555555555555557555555555755555555555555555555555555555555555557555555555555555555575555555555555555555575555555557555557555555555755555555555555755575555575775555555555555755557755sCC?CllllllClllCCCCllCCCllClllCllllllCClllllllClllllloolllllllllllllooloolllllollpooooppoooolloopollollllpplloolllloollololllooopllllllllllllllolllloolllllllllolollopollllllllolllClCllllClllCCllllllllllClCClCClCC?ClCllCCCC??C?ClllCCCCCCCCC?CCC?>??>>>>>?>>>>>>>>>>>>>>>>>>C>>>>==?>==>>>==>>=>A>===   py5555575555555755555555555555555555555555755555555555555555555575775556555555555555775555555555555555555555555555757755555557555575555655555555555555555555575555555555555555555555755555555555557555555557555555555555755555555555555555555555557555555555>jC85555555555555555555655557555555555757555555557555555755575555555555555557555555555555555555555555555557555555555557755555555575555555555555555555555555555755555555557555555555555555555555555555555555575555555555557555555555555555555555sl?CllCCCCCCCCClCCllllCClllClllllllllCllllClllllloooolllllllllllllllllllllllolullolllllloolpollloollooollollloolllooollllolloollplllloopllloollolopllllllllloooollClllolllllllllClllllllllllllllllCCClCCClllCCllylCllllCClCCCCC?CllC?CCC>CCCCC??>>?C??????C??>A>>>>>?>??>>>>=>??>>A>=>==>=>===A>====>==>=A vy55555555555555555555555555555555555555555555555555575555755555555555555557555555555565555555555555555555555557555755555555555555555555555757555555575555555555755555755555575555555555555575555555555575555555555755555557555555555555555555555555555555755555558l{{j755555755555555555555555557555575557555555555555555555555755555557755555555555575555555555555555557555555555755575755555555555555555555555555555555557555555555555555575555755555555555555557555575555555555555555555555555555555555555555555555755|lC?ClC?CClCC?ClClllllClllCCllllllllllCllCllClollooollllllllllllllllllolllllooolllllolllllooloolllllloolllllolllolpooollollloolooolllloollllolloloolllllllllloolllolllllllllllllClollllllllCllllllCCllClCCllllluyCllCCCClC?CClCCClCCCCCC>CCl????>A????C>?C?????>>??A>A?A>?>>A>??>>>>=>>>>>>===>>=======>==_    py555555557555555555557555555555555555555555555555555555555555555555555555655555555555575575575555757575555555575555555555555555755555555555555555557555555565555555555755555555555555555555555555555555757755555755555755555755555558755575557575575555555555555575555555555558Cw{j555555555555575555555556555555555555755575555555555555555555775555755555555555755555555655555555555555555555555555555555575555575585555555555555555555575555555755555555557875555755555555555555755557555755555755555555555555555555555755555555555555555557555pClCCCCC?ClCCCCCCllCCClllCllCllCCllllllllllllllllllllllllllollllllollopllllllluoolllllolllolCloolllollllolololllllpplloopllollllllolllllllllllolllllllllllllllllloolllloolllClllllolCllllllCllllCCClllCllllCCllllC??CAClCClCCCllCC??lCCCCCl?CCCCCC>>>?C??>>C?C?>CC?>=>>=>>AC?>=>>=>>>>>>=>=>===>=>==>===== py555575555555555555575555555555555755555555555556575557655555755555555855557555555555555555555575577575557555555555555555555555555557555555555555575555555555575555555555555557555555555755556555555555555555555555557555557555555555565555555555555555555555575555555555555555555555555655555755758jj75555555555657655585655555575557555555555555555555655565555555555555555555555555555557555555555655555555555555555555555555555555555555555555557575555555555555555755555555755556575755555575755755555555555755555555557557855555555555558555865555555775555555555556555575555557855555555|C?CCllC?CCllCCllCllllCClCCllllCllllllllClllCllCCllllllllllllpoollllllllllllllulollllllloolllllllllloollllolloollllllllollllllpolollllllllllllllllooollllloollllllCClpllllllllllllllllllClllllllllCllCllCCCCClutCCClCC?lC?lC>>CCCC??CCC??CCC??C?C??C?CCC>>>>>>>>??>>>=?>>>>>>>>=>>>=?A=>A===>=>==>==>======B  py55555555555555555555555555555555555555555556555555557555555775555555555575556557555555575755555555555557555755555555557775585555555555577555557555655555555557755755555555555755555555657555555765555555555555555555855575555555555555555555555555558555755555757557557555555555555555555555555555556755557578755555575755556555755555555555565575557557755555555555555555575755755555555755555555555555755555675557555555555555557575555555756555556755555555557558557558555556555875555555555556555555555555665555557555556555555555555555555555555555555555555555555555555555555657555555555555655555555CCCCCCClC?CllllCCClCClCllClCllColllClCClllCllllllllClllllllolllllllollllollllullllllllollllllllololllolllolllpolllllloollllollllllllollllllllollllllllllllllllllllllolCClCClllllCllllll?llllCCllllllClCClllll{CCCCCllCCCCClCCCC?CCC?CC??C?>????A>A????????>>>?>>?>>>>>?>>>>>==>A>>>>===>=>>====>===>======= vy55555555555576555555555555556555555557575555756755685555557755557555555555555557555555557555555555555555555557555555555555555555575555555555755655555555557555555557555555555555575575555555555555555555555757557755555555755555555555555755555576555555555555557555555555557775555775555555555575555585555555565555555655555565555555557555555555555555555577765575555565555587555555755555755555555555755555555555555555555555555555555556555555556555555557555557557575575557555555555655755555775655555555555555555557557555555575557655555555557655555555555555555775555555}CCCCC?CCCClCllClC?lCClCllCllCllllllClCCClCClClllllCllllllllolllllllollllololCoollllolllClllllololoollolllllllolllllllollloolllllllllllllllolllllCllllollllCllllllollllCloCCllllCllllllCCllCllCCCllCllCCllCCCylC?CCCClC?ClCCClC?C????CC?C?A?C???>>>??AA??>?>>??>>>>>?>>>>>>>>>>>>>=>>=>>===>>==>=====>===>=>A  vy555577555555555555555555565555755575555555857555555555555555556575755757555557555555555755555555555557555555555555555555755555555555555556575575555555555655755555565555555555555555555555555555555777555555555555555555555765555655575555555555755755575555555555555555755555555555555557555755555555555555575555555557555555555555555555555757755555575555757575555555555575575555555775556557555555555557757555555555555557555555555557557555555555556555555555555556555555555755555575555555555555555555555555555555555557555555575555555555555557555555555655555575555555555555557555|CCCCCCC??CCC?CClCCC??C?llClCCllCllCCllClllllllllCllllllllllolllClllllllCllloluollllollCloolllllCllllllllopoooolllolllplollllllolollCllollolllolCloollllllllCllllllClllollClCllllllCCClClCCCllllllCCCCCCllCClyCCCllCCC>??ll?>CC>???????CC??l?C?>??>CC?CC>AC?AC?>>=>>>>?>>A>>>>>>=>>>===>>==>>>=>==>====>=====x   py7555575585555555755755577555755555755557555555557555555557655555585555555555557755555555557755555555555555555555555555555575556555575557555555755555555557555555555555577555557555555755555555655555555555565655555575557555557575755555555555756555555776555555765555555555555575555555555555555555555755555555555555675555555555555556755557565555555555557555555555757555577555555555555587577555557765555557555567655555555755555555755555555555555775555575557565555555555555555555557575555555555555555556565555555755565555555555555755555655787555755555555555555555755555555555555555|????lCCClC>ClCCCClCClC?CCCCClC?Cll?CCllCllCllCClCllllllCllCllllllllllllClollltoollllllollollllllllloplllllllllllllolllllllolloollllloolllolllllllllllolllllllollllloollClollllCllllllllllllllClCCClllClllll{lCClCCCCCCClC?C>??CCCC?C>?C??>C?>?>C>CC>C>>>=?>>?>>>>??>>>>=>>>>>>==>>=>>===>=>==>===========>==>  py755555555555555555555755555555755555555556555555575555655757557555555555755556555555555555555555655555555555555557767555755555555556555557675555557555557555755555555555555555775555755657555555555857555555555575555565555555565555577767555555575755575555555775555555555555555555575555555555557555555575775756555555567555555555577555585555755655555555555555555555557555555755755775755555555555555755557555555557555555555755555565575555555555555565555575755555555555565575555555755655555555755555557555755575557555655655555565575555565555555555555555555585555555755555555555555755555555557555|CC?>CC?CClCCCC?ClCCCCClCCCllCCCllClllCCClllCCllllllClllClCClllllllollllllolllolollllllolllllllllllllolllllolllllllllClllllollllllllloollllllllllllllllCllllllollllooClllllllCllCllllCCClllClCCllCCCllClCCCluCCCCClC?l?CC?????CCCCC>CA>CC???>>??A?????=C?A>>??>>>>=>>>>>>=>>>>>>===>=====>>>==========>=======B   py755555555565555555555555555577557555555555555655555575557655555555655555756655675575675555757555555575755575555555555558755555558555555555557555Ct75555555555755555555575555555875557555555575557555555555555755657755565555555755585555576775555555565655576675555555555575555755575555755577555556565555575555555555555575755755755655555555575755555555555557775555585555755757555655555677556556555555757555555555555575555555565566775755555558755555555555655555755555655567575655555555557555555675555555555555556855755557657755575555555555565565555555558555576555555555555555555555555575755|lC>>CC??CClC?CCClCCCClCCCClllCCllCClllClClll?lllollClllCClllllllllpllllloolllulolllllllllllllollloolllllooolllllllllCllllolllllllllllllllClllolllllllllollllClllollCCClllCClClllllClCCClCCCClClCCClCllCCCllCllCCC??lC?C?C???Cl?CC>CC?C??C>>?C?>A>A?A=?CA>>A>>>>?>>>=>==>>>?>>>==>>=========>>===>=====>====$=  oy575575555557557555556565555657555555556757555555565557555555555555556555577755555555555555576557555557557575555555575555555555755555685555555555555558j7555555555557565555565555557555575557555555575757555555575555757575557555555557555557756557777575557555555555655577555575577565557556555556755555555575555555555755778555555557575575556555575575555555555575555585655555555557655557577555755556555757555755575556555755575555557555587557755755557555556555556555765555555555557555865555557857555557576555555575555555555565555555555565555555565555755577575575655555557555555555575565p?>?CCC?????>CClCClCClCCC?C?CCClCCClCClllClCl?CClCCCCCCllClllCCCCCllllllCCClllulCClllCCCllllllolloooolllllllllopoopollllllllolClllolClllllolllllllCllllllllllllllllCllCCCllClClollllllllCC?CllllCCCClCCCltl?CCl???>C?CCCC???ll??>CCCCC?>?>ACC>A?>>>A>C?>>>=>>>=??>>??>>===>=>>=>A====>>===>===>==============B    py75556755755557655555775557657555555555655555555575575555585575557567555655555555755555577557557555557657555655556755565555555678555675555555555557ly855555555555655556776555555555555556555855555557555555755755555555555555555557555585685555555557756557765555555557555565855557655785575557555555557655575555556555755555555555555555555755575555755558555655555655555655555556555557555555556555555555755575555577555555576655755555855655555557555755555755555555555755555567555557555555555575576555555555575555555555555555555675555555555756555555555557755755555555555575555555655555555555555555555565557v?C???CCC??CCC?CCClCCCCCCClCCCCllCCCllCllClCCClColClllllllllllllllllllCllllllluoCllllollolllllllllllllllolllllllllClllloloCCllllllllClllllllllllllllllCllllllllllCCllllllCClllClCCCClllCClCClC?C?CClllCCytClC??CCCCCCClCCC??CCC???>?CC???C?C?>>>??CA>>>??A??A>=A>>>>>>=>>>=>>>>>=>===>========>==============py55556555555555555555556555755655555575755555575578555555555775755655557555555555575555555555755555555556557555555555555756755655565555555555555555555556555575555555555555575655555555555556555577555555555555756555555555755555555555555565557555555565555585555555576755555557555555555557555555755555555555555555565575557555655555555555565757555555555555755555555557576555755557555555555555555556557555555755555555555557575555555755555555565565555555557577555565558555755555555758557555555755555555585555575555565555575566567555555555555565555575655555556555757557555555555555555755555555575755557|CCC??CCCCC?lCCCCC?CCCCClCClCClCCllCClCClClllClClllllCllllllCllllllllCClllllClolCllllolCllllllllllllllClllClllCllllllllllolllllllllllllCllCllllCClllCllllClllllllllCClllClllCllllCllllCCllCClCCClCCCClCyu?lC?CCCCCCC?CCC???C?A??>>?C???A?A?>>A=C???>>>?AA>AA?>=>>>>>==?>=>===>>>====>=======================xpy555555555585558555555755555555557555575555555656875655575555555555575555555555555655555755765555556555555557755556557575557555575555655555555555555555555555555555555556555655557755756555555558575555555555555555555775565655657555555557557555555555555755555655765555555555555557655556556555855555555555555556555577557755557558555555756575555775755756555555685557577555575555855555555556555555555557565655555566567556555555755555555555556556555555555555555555755575555675555555555875555565555555756755755555655555555555555575556867555555555575555555555555755555575565755565555555555555755555555555755656655556|CCCCCC?CCCCCCC??????CClCCCCCCllllCCCCCCllllClClCll?CCClClllCCClllllllCllllllCtlloollClClllCllClllllllCllllllllllollCllCCllllllllllClllClCllolllCClllClllllCllCllCCClllCColllCCCCCllCCCllCCCCCllolCCCCtz>CC?ClC?CCA>Cl?>???>>CC>>>>C?>=?>>>>>>>?>>>>>>>>=>??>=>?A====A>===>==>===>=>>>>=========>=====$====[py5555755555555755575555555555555555555755665565557567557557555567555555555555557656575667655655757555565555565555757555555575655755565555655555555556555575555775555555558555558557555557556555775655577555556685557555565555577855555555565555557555555555566565556555787766556555555555555555555557555756556575555555556555555555576555555555555555757565575555575555755555555655555555555555766558575577555555555575555767655577555555555557656555757857555555575555567675556655555555655555557555555576555555555555555555555755555756855655555557555555555555555555555557655556555555576755557555555557555655555555665558565575568555577qC?>>??CCC?>?C?ClCCClC?CCCC?llCC?C??CCClClCCClllCC?CllllCCCllCCCllC?CClllCllCColClllllllllllllllClollllllllllCCCoololooloolllllColllllllllllllCCClollllllCllCllllClllCllClCCllCCClClCClC?ClCCCClCCCCC?tzCCCClCA>CC?>CCC>>ClC>>CC>>>C>>>A>?CC>A>=>>>>>>>=>==>>===>>A=>====>=>=========>>=============$===$==x       py5575655555555557555655555555757555555565555555655555555555655655755566555555555555555555575557755555565556555555555557556685555565555555565655555565555565685566555556655565555556655557555565557557557555555755565557555555555755665555555557555778755575555555555555575555555565656555555556786556775555556575555565555575555655555675765555555555755555575555555565555555555555555555685667556556555557865755565555555555555555655555756555555556555555555555555555555555755555555555757557655558557555555555555655557555555555756556555756556565555575566556555565655565555655655557655555555655556655565765566555555786556777v????>?CCCC??CC?CCCCC?>CCCC??CCCClCClCCCClCCCCCCCCCClllCCllClllCllllllllllllCluCCllCClllllCoCClollllCClllollllllllllllCllllCllllllllllllllllCllClllCCClllllCllllCClCCllCClllCCClCCClCCCCCCCllC?CCClC?tlCCCCCC?ACCC?CC?>>>??????ACCC>C??C>>?>>??>?A>>??>>>>=>>?>A>>>>==>>=>>>>==>>========================$$= py65555555555556555565555565565575555555555556555755556755555555655555655555555775655655755665555655555655555655655657556575555577555555665555555556565755557575556655575667655758555555555558555676665555555555575555555555665555555555555555668657755855555658555577575655555555565555665577657555575568557555555555655555557555555755565557555758555558555565555785555556655565555555555655555555555555575555555655675567588555566557555555556556755557555555656587865555786555555555557585558567565556555785755556655555657556555675557556755556555555575576565555555558555566555555555655555555655565555557555556565575555557555555567555577555655555568665q?>??????CCC>CC>?CCC??CCCCC????CCClCCllCCClllCCCllCCClClllllCllCllllllllCllCCCulCllClllllllllllllClClllllllllllCCllCClllCllClCllllllClllCClllllClllCCCllllCClolllCllCllCClllCCCCCllllCClCC?llC?ClCCCCyuCCCuuCC??>CCACCC>A?>C?>>C?>CCC>>?C>>??=A?C>??=>??>>>>>=>>>>>=>>===>====>>>=====>=======>===========$==B py5555655585665655555566677855575655555555557765765575555555655558855555555557557756755557657555655567655755556555555555566555555775555587557755555565555555555655756565555555755585555556555857575556555855556855555557555565555555556655555557555555575555555755575566565555755557555655585565565555555555555788755555756555555555566557755557555755577555875575855755557557765555656555755555855655555555575557555555555555575555575558555556555555555555555556757555655655555557655555555555555565555555555555755555555555555555555565555555576555575656555757556555555555555555566655587575555655555555555555555585655556578555675555555656555555655555665775555557577vCC?CCC?>?CC>Cl?CCClCCClC?CCCClCC?C?A?CC?>llCCCllCCCCCCC?ClllC?CCClCCCllollClCtlCllClllCCllllllCCllllClCCCllllllClllCClCCllllllllllCllllCClllllllllClllCClllllCCCClCllCCCCCl?C?C?llC?llCCCCC?C??CC?ClylC?ClzlC?CC?C>?CC>?C>>????>>>?>A?>>>?C?C>=>=A>=>>>>?>>?>A?>===>?>=>=>>=>=====>>=>==========>======$====ZB o{5557655567555755566566557555555655655865755555577555556555587555575575555565855755555565555755555566555675655557555555555755755555566565557558855565576555555555557675575566577555557565586575575655555555655565556565565655557555658555555557558555655555555555655656555755555665555555557557555555775655565765555555555555656556555555555566755565575865775657855558755855576655555576555576756555555555556555557555557565565555777777777777777878777777777777777777777777777777777777777777777777777777777777777777777777777777777777777787777777777777777777777777777777777777777755566555577558655578755555775655655756565555555555556555v?CC>>?A>????C??C??CC?>C???CC?CCCll??CllC?llllC?ClCCClll?CCCCClllCCCllCCCCClCltlClllolCClll?CllllllllllCCllCllolllllllllllllllllCllllllollC?ClCCClCClClllllCC?CCllCCCCllllCCCCllCCCC?ClClClC??CCCCClCytC????uɘl????C?ACCCAC?ACC>???C>?C????CC>>>>>>>>>>=>>=>>=>>>>A=====>>===>>==>>>>=============$=$$==$$==$$=$$@   py55585555655655555565555565555555586765587755555588755557755555555555555576565555555555555556555555555555555555555555555555555657577555555558755555558556555755555556555556555556575757555756565555556555855557656555656557566655556556565555555566555555757655555657555556585655575556655556557565555555556677555556565555555655565756855555685675557755557885555556585555565575555575555556556556565757655565655657555565555766575$TTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTUTTTTTTTTTTTTUTTTTTTTTTTTTTTTTTTTTTTT=65565556555558755557555655555555656555785555565555565v??CC?C?>???>?C??CCCCCC??CCC?CCCCC?CCl?CCCCCCC?CClCClCClCCCCllCClCCCllClCClClltlCllCllCollCCllllCCllCllllClllClCClllllllCllCllll?lllllCllCCllCllCClllClCCCllClClll?CCClCCllllCCClCCC?lCClCC?CCCCCC?CCtCC>ACCCl?CC>CC?C>AA?CCA?>>?>??>??>CA>>>A?=>>=>>>C>>A>=>>>>=>>>=>===>===>>=========================$$=$====$$$@py555555555555555655555555555655555578566556555555655555555556655655655555555655665656556555556566555565655556676655665566555655555565658665665565556555555565575778865556555555555555575555768555555656557556575565556555557566655657655567755675575565755555555585555555557875755755555555658655565576556575556555555565665855555555656555555555788567555555565555565575656666565555565657565757555575555555565657555655555656756565675=TTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTT!775555556765555756575765576555565586557555555657555555q>???>CC?>?C??C?CCC?CCCCCCC>?ClClC?CCl?CllC?CC?ClCCCl?ClCCCCllCCClCCCCClCClClltCClCCllCollllClClCClCClollClllClCCllClllCCllCClllCCCCllClCllllCClCClCllCCCCClCClllCCCCClCCCCCCCCC?lCC?CCCClC?lCC?CC??CCl??l?C?>CC???CCA>?CA???>>>?C?>??>?>>>CA>>>>=>>?>>>>A>=>==>>>>>==>>=>======>=========>=======$====$$=====B=$$=$_   py7565555655555555655655575655565555565677755555655555556556555556556556575555565567565855556655555655775756555655555676655557575557556557555566555655555865555567757556856555555555557555565565556555555555655755766555565555556566555555555575555556555555665555655785556557576555555655566866658665756665555555555755558657==9=99===99=9=====9999;===9=9=9$$=9=9===$99=999===9=====9999==9===9999==9=9=9=999==$=$$99==99=9====99=9=999=99=9==$$$99==9$=$!$!!9"TTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTT9$===99==99=;=9=;99;9==;9;9=>;==@=======99=99==9=@=9;>==;9==@qC???>>??C?>?CC?>>??>>A?CCC?CCl??CC>?C?ClC?Cl???????C?ClllClClCC??CllCllCCllCCCloolCC??C?ClolCCllCCClllCCllllCCCClll?ClllllC?CCllloolCCllCClllllllll?CClCCCCC??CCClll?CCCC?CCCCC??CllCC???CCCC?CllC>??t{ll?>??C?A>>CCCCClC>>???>>>A?A>>>>?>A>?A>>>>?>=>A===A?>=>>==>===>=>===========>========$===$$====$=$$=$@@$==$== o{@@A@;;@@@A@;;@;@@@;@@@@@@@;@@;@@@;;@@@@@;@65555655555575558585685555557876555656555578767675558555566556555766565555566555555556555556675666585655655556775566555755556555555675755775556555555555555575565765568555565555655766555555657565566565656555565656556855586555565755555657558675655566555576565555855$TXXXUXXUXXXXUUUUXTXXTXUTTUTXTTUXXTTXTXTXXTUUTTTUTTTUTTTUTTTTTT:TTTUTTTTTUTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTT"""TT""T""""""T""TT""T""""""T""TT""T""""""T""TT""T""""""T""TT""T""""""T""TT""T""""""T""TT""T""""""T""TT""T""""""T""TT""T""""""T""TT""T""""""T""TT""T""""""T""TT"T"TXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXv>?A>?A?>A????>>??CCCC??>?CAlCC?CClC?C???C??l?CC?lCClll?lClCCCCC?lllClCC?CCClClClCCCllllllClCCCCCllClollCllCClllllCllCllllllClllCCCCCCllllCClCClllCllCClllC?CllCCC?ClClllCCC?CloC??ClCCloCClC??C???>?ClttCCCC???A??>A?>??>>?CC???AC>>?>>>==>>=>=A?>>=>==>===>>==?>>=>=======>===>==================$$=$$=====$$!$$$$[     pXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXUXXXXXX55755555655665555655555656755556565657555567555765757555575555556555576556756655556657555555566755576665665656555555555555557655575555555656555555657555655557575575565555655557575655555555566555556555758566555756786756555555655557555655555567565565555555556565655555$TTTTTTTTT"TT"TTT""TTT"T""T"T"""""""""""""""""""""""""TTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTq?A>C???A>>?>??>???CC?>??CC?CC??CC?CC?CC?CCCCCCCCCC?ClCCCCCC?llCCCCCClCCClCClCtClllClClCllClCClCCCCCllllllClClCClCClllllCllCCllC?ClllllCCCCllCClllCCCCClllCCCClCCC?Cl?lllCCC??llCCCClCClCCCCCCCC??C?CCl?CxCC>>C???>C?>>>A?>>?>?>>?>>?>??=A>=>>>>?==>A>>>>=>?>==>==>======A===============$==$===>$$$=$$$=$$=$$$$$=  pTTTTTTTTTTTTTTTTTTTTTT"TTTTTTTTTTTTTTTTTTT65755555555555575575656665685557555555555685556655565566565556555555567555758555755566556565565756656555555555565556655655575555556556557565555565556655685565555567585555568555555675565565555556556556655555875555655656575555575555555555555555556558555555655557658656555!T"""TT"""""""""T"""""""""""""""""""""TT"""T""TTT"TT"""""""""""""""""""""""""""""""""""TqC?>??C??>>?>??>?CCCA>??CCCC?C>A??A?C?CllClCClC?CCC?>lCC?C?CCCCCl??lllClCClCCCtlClC?CCClllClCCllCCClCCCll?CllCClCCll?llClllCCClC?ClCllCCC?CCClCCCC??CClCCCllCCCCClCCCCllCCCC>ClCC?ClC>?C??>>?CC?CCCCC?????{zC>?CCC?>>?>>?A>>>=>>AC>>>>???>>>=>>=>>=?>>>>>>>A======>=>==>>>=>=============$==$$$$=====$=$$$$$$==$@  vT""T""TTTTT""""""""T"TTT"""T"TTT"""T"TT"TT55655655655555655665565555656567655655665756566555555565656575556566555555656666556555565555555765555556556565556557566556575556655657556558575755655667555855765655585757565555555656856566555665565555755655555655565566565555555555665576655565667766555675756556567$""""""""""""""""""""""""""""""pC>>CC>???CCCCC>C?>>>CCCCC>>???C?C?l??C?AA>C??>?C?CC?lCC>ClC?ClCCCClC?ClC?C??CtlCllClCCCCCllllCClC?ll?lCCCCllCllllllClCCClCC?ClllCCCCCCCllCCCCCCllllllCC?ClC???ClC?l??CCCCCC??CCC??C???lC?????CC?>>>CCCC>?CCzߖtC>>C???>CA>>C?>?>>>>>>>>>?>???C?>>?A>=>>>=>AC>AA>====>>========================>=======$=$$=====_ p""""""""""""""55865655755656666665555555565556567655557577555665655556556565555565566555665568655655755555565555765655565655667555675555668557565865565556565675765656667555655556555555676656655565655656766556555565556576566556665555565655556555555685555555676556655755555665555766555$""""" ""vC>>A>>A?>>>CA?>C??C?>?C??C?C?>?CC>CC>C>>C??CCCClCCC??ClCCC??CllCCCCCCCCCClClltCCCCClllClCCCCllCCCClCClCllC?CCCCllCCllCCllCllllllC?CCCCllCCllC?CCCC?llCClloC?CCllCCCC??CCCCC?CCC?CCClC?>??C?CC???CC?CC?>>>C?>CޔuC>>???>?>>>??>>>=>>>>>=>>>=>==>>A====>====>==============================$$===$=$$$===$=$$@ !   o""6555655568655556665555666557656556575575556866665566565555865665558556566656556575786655566755555655567555656555555555565665765668556556565555566665666856565555555566556555656665565555665566656656565558756556555555555685567555555575665555556555565555765685555576655556556555566555$""""""""""""v?>A?>?>>>>>?>>?>>?CC>>C?>C>CC??CC>>?????C??CCllCC??C?CCCCC?CCClCCC?CCC?ClClCCtCClClCClClCCCCCCCCClCCllCllCClllCCCCClCCClCClClllCCCCCCCll?CllCCCCCCCllCCCllCClCCCClCCC?CC>CC>CCC?CCCC???CC?lCC???CC??C?????>??CCuzCC??>>>A?>??>>>??>=>>>A==>?>>>====>====>==>==============>=====>$===$==$===$=$$$$$==>]  p""""56658655855555568575555656555556565766566756566555867555855766555555558555555556656555555556665565565657658555665666555555656686656575565665875656555555655658585565556565756665555655557586855565675556766555567556558665555565555565555656555656555575555555555566665665566555687555! |??CC???>>>>?>?C??C?>>???CC>?CCCC??>ClCCCC?ClC??????llC???lCCC?C?CC?lC?>CCCC?Collll?CClCCCCl??lllCCC?lCClllllCCCCC?lCClll?CC???C??lllCCCC?ClCCll?ClC???>????C?>CC?C?>CC?C?ClC?CCC???>>CCCC?C?>>???CCCCllCCC>>>?>?>Cz̔ytCCA?>?>>>>A>>>=>A===>>>>=>>>>>>=============>======$=====$===>===$$==$!=====Bxp666566655556556686576556675555555555655556856665667555556865566565566755566655556655665655565555565576565855656655665665566657555555666665555565656555566555555666556556566655565656565565568555555565556665555555565557665656556566556555656666855765665566666556567555576555556555$HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH|C>>>===>>C?C?>?>>>??CC>>>?>?????CCC?C????llCCC?>?CCC???CCCCCCCC?CC?lllCC?C?CCt>?ClCC?>?CC?lCCC>ClCClClCCCCC??lllllCCCCClCll?CllClllC?CllCClllCCCCCCC?CCCCCllCCCCC??Cl?CC>?Cl??CCCCClllC>?>CCCC???>?>>>>>>?CCCC>>>C??C]zZAA?=>?>>>>>==?>??==>=====>==>======>==========>======$====$====$=$=Z o655665566556556566656555565655556555575555665665655555565756665566575656555656655566556565556666667666555865555555655556556566655555655556656656566675665655555766655566655687857556655555656555556566658657566555566556556565657576666556666655656655655565755556555655655558556567!JKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKGv?>>>>>A>>>??A>>>A?C?>>>A???C??>>C?CCAA?C>C?C?????CC?ACC?C??CCCClC?>CC?ClCCCCCtCCCCCCCCClCClCllCCCCCCClCCCCCCCCCCCCCClC?lCCC?llC?CCC??CClCCCCCCllCCCC??CCCl?CCC?Cll?Cl?CCCC?C?CC??Cl?CCC>????CC?>>>C??>?A>?C??>?>>C?>?A>>tz̖xttCA>==>>>>>>======>===>==>=>=============$======$=$===BB] o856655655665765566555665657555666665566655665586565755566555656555556656555566655666856556555665655566565665655565565656655655555566565556655555555555565566665565656555657565566556555565565655666566566665667655566866665566565656565567666856565766655565565566565556555556666556!KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKJKJJJKJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJHJJJHHHHHHHHHHHHGHHHHGGHGGHGGFFFFFJKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKGFFFFFFFFGFGGGHHGHHHGHGHHHHHHHHHGGHHHHHHHHHHHHHHHHHHHHHHHHHv>A>>>??>>>C>A?=>???>>>???CCC>A?>C?CC?C??????C??C??C>CCCAC?C?CCCCC??CCCCCClC?CtClC??CCCllCCCCllCC??CClCCCCllllC?C?ClClCCCCCCClCC?CCC>CC?CCCC?ClCCCCCCC>CCCl??l??CllCC??CClCCC?CCC?CCC??CCCCCA>>????l????????>>>??C?>>C??>>>?Ct]ŃxtAACA>A>>>>>>====>>==>=>>>=A>>>A>A>AABZ_z!    phJJJJJJJJJJJJJJJJKJJJJKJKKJKKKKKKKKKKKKKKKK5567565575555565556856566567676656665665565556556676556665556655656655566656556557566655766555656555575865656656555555557656656566555665666865556666566665676556657666656556665555566565565655655566666656555766665666666555665556555755655555565565658656565566565585556565!KKKKKKKKKKKKKKKKKKKJJKJJJJJJJJJJJJJJJJHHGGGFFFFFFJKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKGFFFFFFFFGGGGHHHHHHHHJJHJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJq>>>A>>?A>>?=>>??>?A>>?C?>?A>>ACCA?>>>AA?CCC?>>?C????C?>>CCClCC?>?C?CCl??CC?C?CCCCCCC?C?Cl?>??CC?>?CCC?>??CC?ClllCl????ClCC??CClCCllCllCCCllCC?>>CCCCC?CC>CCCC???C?>>?C>A??CCClCll?ACA??AA>>>>?CCCCl?>=>??CC>>?CC?>=>>>>>>>==>=>?=Cxś   qh56655556655675565556765655665555665655556556566555556566666655555656655556585757656555555555656565567555555865656556656555566656657656865556556656666655555555656655656555566655656568655565665665566555685556556556555555555665656667555656665656666665655655656655575665556566666!KKKKKKKKKKKKKKKKKKKJJJJJJJJJJJJJJJJJJHHGGGGFFFFFJKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKGFFFFFFFGGGGGGGGHHHHHHHHHJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJpC>>A>>>A>?C>>A?>AA>>?>?>>??>C>>>>C?>CC?>?>CCC???CCCC>CC?lC>?>>C??C?C???CC?CCCt?C?ClllC?lCCCCCCCCCCCC?CCCCCCCClCC?CCCllClCCC?CCCCC?C?CCC?CC?>>?CCCC?CCC?CC?CCCCC?CCCC??Cl>??CC????>>??>>?C?>CC??>>>C?>>?A????>>>>>>C?>>>?A>>>C>=>>>A>=ACBZx  ph67666575555655565565556575656666557665656855567756665666555655665556656566556566565555655555555556655556565666665565655666556656566655556657656566565656665555655665556556657865555556555565556557555565565666556655656556555657556555566555665565666566665657567656655855565657!KKKKKKKKKKKKKKJKKKKKJKJKJJJJJJJJJJJJJHHGGGGFFFFFJKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKGFFFFFFFGGGGGHHHHHHHHHJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJv?>>A>>A>>AA>>>?>>>>>A>??>>?>A>??>CA?C??>?>?C????C???A?CC??????lCCCC?CCC??CCCCtCC?CClCC?CCC?CCC?lC?CC??lCCCCCClCCCCC>lCCCCCl?CC??A?ClC?CCCC??CC?CC?lC?C??Cl?CCCCC??CC?CCC>??C?>?C???>>>?????CCAA?>>?>???>A>>>>>?>>>?A>?>>>>>>A>>>CA>>>>>>>>=A>>>CZ]z oh565555656666666555566666565665655666655556665665555666665556566555666655665556566655566556665655666556566556566556656665556655566566656768565566556566655556666556656556566565655565656655565666656765555565555656557565565566655665556666765656656655666567656555556655565566555655556$KKKKKKKKKKKKKKKKKKKKJKJJJJJJJJJJJJJJJJJJHHGGGFFFFEJKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKGFFFFFFFGGGGGGHHHHGHJHJHJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJ|>>>>>=>A=>?===>>>>>????A?>>>>?>??????C>>C????C???>?>A?CC??>?lCCCCCC?C?C??CClCl??CC?CCCCC??>?Cl??C?CCCllCCl?A?CC??CC??CC>?CCCC????CClC?lCCCClll?CCCCCCCCClC?C?CC?>CC?ClC?>??????CC??????>>??C?>CC>>A>???>>>>=>??>>>>>>A?>>??AA>A?A>=>>>=?===>==>======>=>>>AAAABBBZ  ph6576565565655566566656665666565565556665555656556866655555566655656566556656655565566556666656555656668656656656665665555566675666665666665555675685565565555566656555666675666656655656665556555675666666555566555555565666556656656656556656666666666556566565666556866655656666555567!KKKKKKKKKKKKKKKKKKKKKJJJKJJJJJJJJJJJJJHHGGGGGFFFFJKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKGEFFFFFGGGGGGHHHHHHHHHJHHJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJ|?>>>>??CA=>>>A?>>??A>>>=>A>>AC??CCCA=?C>?CCCCC????????>>???CCC???C?>>?CCll??CCCCC??CCCClCCC??CC?Cl?>>?CC?C??CC?ClC?CCll?Cl??A??CCCCC?C?ClC>??CCCCC>>A>????C?????CC????>??C?>>CC?>?Cl?C?>>>>>>>C>>?C?>?>>?lC>>>=>>>?A>>>>=>>=>>>A==?>===C>>=>==A=>==>============== ph6566555658655555566555657566565565556657655665666566568656665555566666566566655655665656666665565656566655666656655566555556655655665766555565656666665655656566666555656565666656665655556566665575675656565666666665665566556665565655555567565666555555656666565665655565555558666666!KKKKKKKKKKKKKKKKKKKJKJKJKJJJJJJJJJJJJHHGGGGFFFFFJKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKGFFFFFFFGGGGGGGHHHHHHHJHHJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJq>>>===>>>>A>?C>>??>>AA>?>?C??C>>>>??>C??>?>>?????C??C??CC???CC?CCC>CCA???CC?>CCCC??C??A??>CCCCCCCl?CCCCC?lCCCC??C????lCCCCCC?CClCC?CCC>?C????????C?>?C>?CC?>>CCCC>????CC?>????C>>?C??C??>?l?>>??>>C?>>>>>?>>=>?C?==>>=>?>A>=>==?>>>=>>>A>==>=====>=>>>>===========  ph7666556666655565665655556665556556556665565656565567666666556566665666666666566685666665565586556555666566656686675656555555867866665666566656556665565556556655565566676665565666655555666566555655656655666765665555556655665555556655666655665566656566566665766656665566556568665557555565$KKKKKKKKKKKKKKKKKJKKKJJJJJJJJJJJJJJJJHHHGGGFFFFFJKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKGFFFFFFFGGGGGHHHHHHHJHHJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJq>>=>>>>A>>A?A>>>?A=>>>>A>>A???>>>>???C>?=?>?>>?C>??>????????????CC?CC>C?A?lC>CC>??????C????CCCCC?C?ClC???lCCC?CC????CCCC??CCCC?CCCC>CC????CC??C??C???C??CC??>CCCCA?C>>CC>?CC???A>??>A??>>?C?>>???>?A>>>>>>>>>>??>>=>?=>?>?>=>=>=>>>=>>>>==>=>====>==>=>=>==>=>===>  ph56665665665655555555555566556665656658655555656556666555656666565756555656568665667666555666566566565556866655665656566556567655566566666655665555566655655566666565565566555665555566566676666665555665557556666655665666566666566665668565566666665556666655566565886765666656565556666565!KKKKKKKKKKKKKKKKKKKKKJJKJJJJJJJJJJJJJJJHHGGGGFFFFFJKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKGFFFFFFFGGGGGGHHHHHHHHJHHJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJq>>=>?>>==>=>>=>>>?>=>?A>?>=>?>?A=?>A?lC>>?>>>????>>?>>???>??C???A?????CCCCC?CtC?>??>??CCCC>CCCC?>>??C????l?CC?CCCCC?C???CCCllC?>?C?CCCCCCClC?CCC?>?CCl?>CC??>>>?CC?>C?CC?ClCACCCC??>>>C????>>A>>>?A>>>>>>A>>>??>=>>A?A=>=>==>>>===>=====>=>>>>==========>========>  ph56666656665656667656556566566667566766566565665556665566565665665665566555555555656657556565555566566665665656665565565666566666666655656656655555656665556566566666666656566665565555556655656566565665666566656665656565566666555565565656656666656555555665676666665556666556656666656$KKKKKKKKKKKKKKKKKKKKKKJKKJJJJJJJJJJJJJHHHGGGFFFFFJKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKGFFFFFFGGGGGGHHHHHHHJHJHJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJv==>=>?>>>>>>>>>>==>>?>>??>>?>>>>>>==>?>>ACCCCC?=?A?l??CC??CA?CCCC>CC?C?>???>>CClCCCCC?CCCC?C?>?>>?CC??ClCCC??C?>??>?lCCCC?>C???>CClCCCC>???>???CC???CC???CC?>>?C?C?>C>>??C?>>>>C?>=>?CC>>>>>?C>>>?C>>>>>A?>>>>>???>>>>?>>>>=>??>=A>>====>========>>====>>====>====  oh6666556576556656665866666666555656568555555666565666656655666555656666566556655766666665665665666655666666566655656656666666565886656566666655666666566566556666668666666568666555566656666666576565565665566566566556566566686655666666566666665666665566556556666666566656556666565666655$KKKKKKKKKKKKKKKKKKKKKJJKJJJJJJJJJJJJJJJHHGGGGFFFFFJKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKGFFFFFFFFGGGGGHHHHHHHHJHJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJv>==>=>>>=>>=>?>>>>>>>=>?>>>??>???>>>>?>>?>>?>??>?>??>C?C??C>>>?C???AA??>>A?>?t?????C??l???>CC?CC?CC??CCCC????CCCC??C????C>?lCC?>>???CCC?C?>>>>?CC?>CC>???CC????????>>C?>?A?C?A?C>A?>???A>>>???>??>>>>>A>>>>>>>=>>=>>>>>>>A>>=>>>=A>===>=>>=====>==>===============   ph556556665556556666556655555766655666566666666566666855555556556656666665655665566656666656566655555576666666666666566665666666666656566656555665666666655565655565556565566666665656656666666666655656666566566666666655656586666566665666656565666655656666565566566666556666655655666566556!KKKKKKKKKKKKKKKKKKKKKKJJJJJJKJJJJJJJJJHHGGGGFFFFFJKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKGFFFFFFFFGGGGGHHGHHJHJJHJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJp=>>>==>>>>>=>>>>>>>>=>>=>>>>>>???>>>>>>?>>>A>>>C>??>>C?C>??>A>>C??>?>>?A>?C??tC>>?CC??C?>>CCCC???l?>?lC?C>????CC?CCC>??>C???CC??>?????C?CC???>?CC?>?C>>??CCCC>>>A?C?>CC>>??ACC?>?CC>>>>??>?AA>A?>>>>>>?>>>>>>>>>>>>>=>>>=A>==>>A===>===>=>===========>=======$==== vh6666655565566666666655665656656666666666555656866566556566566655656566565565666656666555556855656556667655555555666565656656566566656666666556666666666666665666566866656665866565655565566655655566566665555565666666656665656556566656656665556665566656665665665556666566655656666566566$KKKKKKKKKKKKKKKKKKJKKKJKKKJKJJJJJJJJJJJHJHGGGGFFFFFJKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKGFFFFFFFGGGGGGHHHHHHHHHJJHJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJv??A>=>C>>>=>>==>>>>>>?>=>>?>>=>>==>>?C>>>>A?>>>>>?C?>>??>>A>C?>>>?>>>>CC?>CC?tl?lCCCC?>>??CC?CCC?CC>>??CC?C??>>>A????C?>?C?>>??CCClCC?C?>?CCCC>?C?CC?>>?A>?C?>>>?>>?C?>>>>==>?C>?CA=>>>?>??>>=>>>A?>>>>>>>>>>>>>>>==>>=>==>?>>>>==>====>==>===>====>==============ph6676665665666555566666666656556566555566655665665665665666666666566566565566656666566656655666665666855667666656656686556765565665555655566555556656656566556656685655656666655666655655555566665656666666666666667666565656565556566666655665666666556666556666656555665565555665566666$KKKKKKKKKKKKKKKKKKKKJJKKJJJJJJJJJJJJJJJHGGGGFFFFFJKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKHFFFFFFGFGGGGHHHHHHHHJJHJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJv>=>=>>>=>?>>>>>>>>=>>>>>>>>>>>>>>??>>C?>>?>??>>>=AC>>>>>>A?>?>A??>A?????>=???C?>C?>>>C?>?CC>?CCCC>?C????C?>?CC??C?ClCC?>CCCA?>C???C???>?C?C???>??>??>??CCAC?>>??>>>>>>>??>>??>>=A>>A>>>?>>>>>>C>=>?>>>??>?>>>=>>=>=>>=>>=>>>=>>A>=>=>>=>=>==>>====>==>=======>==== ph666656666666566666865668665565666666556666666666666665655666666665655666566566666565666666666656656655566556666665565566655565565556566556666565565665665665566566665565675656665666656665566565565656666665665656566556656656566565565686655556566566665665566566666576556665666655656665666!KKKKKKKKKKKKKKKKKKKJKKKJJKKJJJJJJJJJJJHJHGGGFFFFFFXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXFFFFFFFGGGGGGGHHHHHHHHJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJv>===>=>>=>>>==>=>==>>>>>>?>>A?=>ACA>>A>A>>A?>A?>AA>?=>>>C?>>ACC?A>?????>>>>??AA?>>????C????C????C>?CC??>?A??CCA>C>?CC?>?C??C????>?????>>????>>>?C?A>>??A>>??>>?C?>?>>>???>??>>>>?A>C>>>??>>>>?>>>>>>>A=>>>=>A=>>=>==>>>>=>==>==>====?>=>=====>===>================ oh5666656665665666566666656665666556566555666666866666666666565665665566855666566666665666666665665656665556566566665666666665565656666666566656656656656666666666666566666665666676665566655666666556666565656666666566656566656666666666666656667666665656666556666666656665665556665666656665$WbbbbbbbbbbcbbbbbbbbbbbbXXXXXXXXXWXXXXXWXXXXXXXXXXXXWXWXWWWXWWWWWWWWWWWWWWWWWXWWWWWWWWWWWWWWWWTWTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTWWTTWWTTWWTWTWTWTWTWTp>==>==>===>>=>A>==?>>>>>>>C??>>=>A>?>>???>?C>C?>??>>>A??A>>>>?C??>??>>C?>?A??ACAAA?CC>?>>>???>>??>??CA>??>CCC?>?????>??>??CCA???????>>??>?>??>??C??>?C>>>>>A?>?C?>?>?>??>>?>>A?>?>?>>>>??>?AA>>>?>>=>>>==>>>>=>>=>>==>>>>>>=>=======>=A========>>=================Y ph6666565666666566665566656566666566666556656666666666666555665655666566665656666666666666666665666566665666666666666566655666566656666666656666556556666666675686866666666665666556666666666665566666666565565566666666666666655666666565665666665656666665566566665686665665556666666665566665$TTTTTTTTTTUTTUUTTTTT:TTTTUTTTTTTTT:TTTT::T:T:TTTTTTTTTTTTTTTTTTTTTTTTTTTTT"TT"TTTTTTTTT"T"TTT"TTTTTTTT"TTTT""TTTTTTTT""T""TTTTT"T"TTTTT"T"TTTTT"T"TTTTT"T"TTTTT"T"TTTTT"T"TTTTT"T"TTTTT"T"TTTTT"T"TTTTT"T"TTTTT"T"TTTTT"T"TTTTT"T"TTTTT"T"TTTTT"T"TTTTT"T"TTTTT"T"TTTTT"T"TTTTT"T"TTTTT"T"TTTTT"T"TTTTT"T"TTTTTT"TTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTp>==?>==>>>=>=>A>=>?>==>=>>=>>>>>>>>=?>>>>>>>>>>=>>>>>>?C>>?>>>?C??CC?>???C>>>?C???>?>>?>>>?>>?>>>?CC?>>CC?A??>C?>?CC>?C>?C?C>>?C?A>>??C?A?>CC>C?>??>>CC>>>?>>=>>?A>A?>>?>?C>>??>=>>>>>>>=>?>=>>A>>>>>?>>>>>>=====>>>>>===>>>>==A>=======?>====>>============>=====@    ph666666566656666666666566665665666666666666556666566656566666666656566666666666565666566666656656665665666665666566666565556666666566656656655666655666556656666666666666666666666656566656666667666666666666565666666666656666565666665666656656565565566666666666666666656566666666666656665$"TTTTTTT"T"T"T""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""p>====>===>======>=>=>A?=>>==>=>?>>>=>==>>?>>CAA=A???>>>?>>>>??>>A>>>>>>>>>>??Au>>A?C??CC>>C>?C>????C???CC?>A>>??>???>?CCA>?C????>A?>>CCC?>>?A>?>?C>>>A?A>AC?>>??CA>>>>??=>>AC>=>>>???>>>>>>>>>>===>?A>==>=>>>>>>>>>>>==>===>=====>===>========>==========>========   qh86666666766666665665666666566665665866666556666565565666666666665566666555666666666666666655656665566666666566666666556655556665666666666666666666665656656566675656666566586766666666666666666565665666666666666666666666666655555565666666556656655556666655556665566666656666665666656655$""""""p>>=>==>=>==>>=>=>=>=>>>>>>>>>==>>>==>>>?=>>=??>>>??>>>>>AA>>?A>>>>>>>?>>>>???>x?>>?CCC>?>>???C>??=??>CC??>A??>>?>???>???>A?>C?>>>??A??>C?>>A>>?>>A?>>A>>>>??A=???>>>>>>>>>>>A>>>>>>>>>>?>>=>A>>>>>>?>=>>>=>>>>>>>=>>>=>>===>=>==>===>=====================>=$=====   pXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX6655665666565665666666566666566566666666666666665665666665566666665666566656566566566665666565666665666665566666666666666666666565666656666566666666566556666566655556655666556666666655566656666666656556566666656566766557665566665566666666666666656665565666666665666566566686665666665655$"""""""""""""""""""""""""""""""""""""""""|=>=====>===AA>>=>=>=>>>=>?A>>>=>>>=?>>CA>>>=>>=>>?A>??>>>>>>>>A>>>=A?>>>>ACA?>ll?>??>>>>>>>C?>>??>?>>?C>>>???>>>>?>>>?>>>>>>A>>>ACCCC>=>>>CC?>??>>A>?CA>?=A??>>=>A>>>A>>???=A>>>>>==>>>>>A>?>>>?>=>>>>>=>?=>=>>>>>===>>====>>>==>===>=============================[   pTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTT666666665566666666666666666566666666665666665666665666666666666665666556666666666656666666656666666566666666666666666666656666666656666565566666665666656666565666666656666656656765666666665566566666666666686666666666656666565565666665666566666666666656666565666666665665565566666666666$""""" """""""""""""s==>>>==>======>>==>>=>>======>>>>>?>>>>=AA>>?>?A==?>>>>C>>>?>>CACA>?>>?>>>?A>>Az???>>>C?C>?>>>>>>>CA???>>>>>?>C??>???>>>>?>>>>?>?A>>>>?C??CCA>??A?CCA>>>?>>>>>>>>?A>>>?>>=>=??>>?>>>>>C>>==>>==>>=>=>>=>>>===>>=>>==>>============>=======>=======>=============$= 9 v""""""""""""""""""""6666665566566666566666666666666666665566565666766666666666666666666666666666665666656666656665666665666666665566666656666666565666665666665556666655665665556656666666666666666666666666666666666555665566666666666656666655566666666668866666666666665666666656666666566565665666666686655666$ q==>=========>>>===>====>>>=>>==>>>>=>>>>>>>>?>>>>A>=>>>?>>=?>??>>>>??>>??>>>>>>xC>>>?>?AA?l?>?>??>>>>??>>>>?C?>??>>????????>??CC?>>>>>A?>>>>>>?>>??>>>=>>?>>>>>>=?CA=>A?A>>?>=>>A>>>==A=>=>>>>>>>>===>>>==>=>>>=>==>A>>=================================$$===$====[ Y[p6666666666665666666666666666666556666656665666666566666666656666655666666656666656656666666656666665666666566685566666666655666666666656655656666666666666566666666666666856666666666666666566665666666666566656666666666665666665666666656666655665666666666666665666556666666666566666566666$ v=========>====>==>==>>=>>>=AA=>>=?>>>>>>>>==?>==>>>>>>>?>=>?>>?>>>>??>>>A>>>>>>Cz>C>>>>=AC?>>????>>>>?AA>>?CA>>?>>>C>A???>AAA???>>>>>>>>>>>>>>>>???>>>>>>A>>?=>>>??>>>>>>>>?>>>?>>>>>>>>>=>>==>>>====>>>==A>=>==>==>>=>>====>==>=======>===$======$==$======$===== ;  o""""""""""""6666666666666666666666666666565566666665666666566566666666666665665666666666666666666666666666666666666666566666666665666666666666666666666666666566566666666666665866566566666666666666655566666666566665666666566666665665666666555556666665666666666666666666666655666566566666666555566666$   p=============>?==>====>>>>>>>=?>=?>>>>>>>>>=>=>>>?C??>>>>?>>>=>>>??>>?>>>?>?>>>>x]A>>>>>?>>>>>A?>>AC?>>??>?>>>>>?>?C>>>>>>?>>>>>>>>>??>>>>>>>>>>>>A>>?>>>>=A?=A?>>>>>>>>==>?=A>?>=>>=>>?>>>===>>==>>>=====>>========>====>=====>=>========>================$$===$=@!  p""5666666666556666566666666666665666666566666666666666666666556666665666586666565666666666566666666656666666566666666666666666666666666666666666666666666666656655666556666666666666666656566666668666656666666565666666666666666666666666665666666666665666666666665666566666666666666666566866$HHHHHHHHHHGHGHHGHHHHHGHHHHHHHHHGHHHHGHHGFFFFFFHJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJFp===>=>=>======================C>=>===>A>=>>>>==>>>===>AA>>>>>>?>>>?A>>=>>>=>??>>Ct>>>>>>>>>?>>=>>?>A=>?C??>>??>?>AC?>>>>?>>>>CC?>>>??>??>>?>=CA==C>=?>>>>?>A>?>>>?C>>>>==>>>>?>=?>>>>>>>>=>?A>=>>>?A==========>=====>============>=================$======$$$==$=[_p""6666666656566666666666666666666666666666666656565666666675666666666666666666666666666666666666666666666666665665566666666856666656666666666666666666666666666666655666666666665666666665666666666666666656666666666666666666666666666666566566668666665666666666666666656666666666666666666656$KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKJJJJJJJJJJJJJJJJJJJJHJHHHHHHGGFFFFFFJKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKGFFFFFFFFFGGGGGHGGHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHJHJHJHHHv===>======>>==>>=====>===>====>===>===>>>=>>>===>=>>>>>==>>==>>>>>?>>>>>>>>>>>>>A]tA??>>>>>>>>A??>>>>>>?A>>>C?>>=>>?>>>>>?C>>>>AA>=A?>>>>>=>A??>=>>>>>>>>>>?>>>>>>>>>>>>>>=>>>>===A>>>=>>>>>>===>=>==>==>=======>==>===>==================$==>$====$=$=====$$==$=#Y  p6666676666666666665665666666666665656666666666656666666666666666666666666665666666666566666566656656666665665665666666666666656666666666866666666665666666666666665666666666666666666666666666666666666666666666666666666666666656666666666666666666586666666566666666666666666665666666666666$KKKKKKKKKKKKKKKKKKKKKKKKKJJKJJJJJJJJJJJJJJHHGGGGFFFFFJKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKGFFFFFFFGGGGGGHGHHHHHHJHJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJv==========>>==>>====>>==>A======>>>==>==>>>>>>==>>>?=>>=>>>>>>>=>?>>>=A>>>>A>?>>?>x?C>>>C>>>>?>>>>>CA>>=>>>C?>A>>>A>>>>>???>=?>>>>>>>>>>>>A?>>>>>>A>?>>??>>>=>>>>A=>>A>>=>>>=>===?>=>=>>>A>======>>>>==>==========A===>>======$=======$====$========$====$$===$= #  p66666665666666666666666666666666666666666666666666665666666666666666666566666655666656666666666666566666666666666666666666666666666666666666666666665666666666666656666568666666666666666656658666666665566566655666656666666665666667566666666666666666665666665666666666666566666666656666!KKKKKKKKKKKKKKKKKKKKKKJKJJJJJJJJJJJJJHGGGGFFFFFJKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKGFFFFFFFFGGGGHHGHHHHHJJHJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJv=====================>==>A======>>=>>>>==??==>>>>>=>===>?>>>>>>=>=====C>>>?==?>A>>ACA?>>>?>?>=>>>>>>>=>A>=>>?CA=A>>>>>>>>>>=C?>???>>??C>??>>>>>C>>=A>>>>==>==>>>>=>>====>?>>?>>>==>>====>>=>>>==>>======>>====>=======================>=$========$=$==$$=$===$=YY!vhKKKKKKKKKKKKKKKKKKKKKKK6656666666665665666666566566666666666666666656566655656666666656666666666666656666666666666666666566666666565566666666666666666666566666666666666666665666665556666666666665665666666666565( (((6666665666666655666666666686566666666666666666666666666666666666666666666666666666666556666$KKKKKKKKKKKKKKKKKJKJKJJJJJJJJJJJJJJJHHHGGFFFFFFJKKKKKKKKKKKKJJJJJJJJJJJJJJJJJJJJ///0/0000000000004QQ44QQQ4QQ4Q444444444444OO4O4OOOOOOO4O4OO2OOOOOOOOOOOOOO2OOOOOOOOOOOOOOOO2O22O222222XxJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJKKKKKKKKKKKKGFFFFFFFGGGGGGHHHHHHHHJHHJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJ|========>>=====>>=====>=======>==>=======>=>>>>>===>>>>>===>>=>>>>>>>>CC>=>=>A=>=>AC΃t?>>==>>>>>>>>>A>>>C>=>A?>?C>>?>=>=>=>>A>==>>==?>>>>>>>>>>?>>>>>>>>>>>>>CA>>>>>>====>=>==>>>A>========>>==>=>>=>>>==========>=============================$$===$$$$$==$$$=;;; ph6666666666666665666866666666665666666666666666666666666666665666666666668666666666666666666666666666666666666666666566666665666666666666566666655666666666666666666665666666666666666655(%7%%%%%%666666566666666665666666666666666666666665666666666666665566666666666666666666666666656656$KKKKKKKKKKKKKKKKKKKKKKKKJJJJKJJJJJJJJJJJHHGGGFFFFFJKKKKKKKKKKKK/O22O222222222222222O2O22222222222222eeeeO4444444444444*+++++++++++++++++++++++++++++++++++++JKKKKKKKKKKKGFFFFFFFFGGGGHHGHHHHHHJHJHJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJ|===============>======>===>===>>===>=>=>==>=?===>===>>>>>>>?>>>>>>>>>=>>>=?>>>>>>>>>CޛxCCACAA=>AC>?A>AACA=>?C>AA>>AAAA>AAAAA>>A>>>>>AA?>AAA>>>A>>A>>>>>A>A>>?>A>>>AA>=>A>>>>==>>>>>>==>>>=A>>====>=>>>>===>>====>>>===============================$===$======9ϕ@#ph65665666666665666666666666666656666666666566666665666666666666666666666666666666666666666666656666666666666656666666666666666666666668666666666666666666666566666666666666666666666655((%%%(% %%%%%%56666666566666666686666566666666566666666666666666666666666666666666666666666666666666666$KKKKKKKKKKKKKKKKKKKKKKKKJKKJKJJJJJJJJJJJJJHGGGFFFFFFJKKKKKKKKKKKK24444444OOOOOOOOOOOOOOO22O22222222222O44444444444444444*+++++++++++++&++++++++++++++&&+&&&++&JKKKKKKKKKKKGFFFFFFFGGGGGGGHGHHHHHJHJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJp======================>===>>===>===>=>=>=>>=>>==>=>>=>>=?>=A?>>A=>>>>==>>=??>==>>>=>=CƝŝŝśŝŝŝśŝśśŝŝśśśśŖśŖśŖśŖŖśŖŖŖŖȄ[#  @# ph666666666666666666666666666666666666666666666666566666666666666666666656666666656666666666566666666665666666656666666666666666666566666666666666666666666666666566566686566666666665(%%% %% %% %%% %6666666666666666666666666666566666656666666666666666666666666666666666666666666666666$KKKKKKKKKKKKKKKKKKKKKJJJJJKJJJJJJJJJJJHHGGGFFFFFJKKKKKKKKKKKK244444O4OOOOOOOOOOOOOO222222222222222O44444444444444444444*++++++++&+++++++++++++&&++&&+&+&&&+&&JKKKKKKKKKKKGFFFFFFFGGGGGHHHHHHHHJJHHJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJp=$==============>>==>=>==============>>==>===>===AAA>=>=>>=====>=>>>A=>>>=====>>===>?AA]ZZZZZZZYZZZZBBBBYZYBYZZBZZBYBBZYZZBZYBBYYYBBBYBYBBBBBBBBBBBBYYBBBBBB@BB@BB@BBB@B@@B@@@@@@@@@@@;@@@@@@@@@@@@@@@;@@;@@@@;;;@@@;@@;@@@;;@@@@@@@;@;;@@;;@;@@@;;@@;@;;;;9#  [Y ph666666666666666666666668666666666566666666666656666666566666666666666666666666666666666666666666666666666666666666666666666666566566666666656666666566666666666666666666666665665(5(%%%%%%%%%% % %%% %%(5666666666666566666666666666666666656666666666666666666666666666666666666666666666666$KKKKKKKKKKKKKKKJKKJKKJKJKJKJJKJJJJJJJJJJJJHGGGFFFFFFJKKKKKKKKKKKK244O222222222222222222222222222222222eQO4eeeeeeeeeeeeeeeeeeeaeeeeQ444*+0++++++++++-+++++++++++++++++++++&&+JKKKKKKKKKKKGFFFFFFGGGGGGGHHHHHHHHHJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJp==============================>=====>==>=>==>>>==>>===>====>>==?>=>>=>?>=>>>>>>>>>>>>>==t@=!$=$=$!$$!!!!$!!!!!!!$$$!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!   !      Y_ ph66666556666666666666666666666666666666666666666666666656666666666666666666665666666666666666666666666665666666666666656666666666666666666666566666666666666666666666566666666666(%%%%%%%% %%%%%%%% % %5666666566666666666666666666666666666666666666666666666666666666566666666666666666666$KKKKKKKKKKKKKKKKKKKKKKKKKKJKJJJJJJJJJJJJJJJHHGGGFFFFFJKKKKKKKKKKKK2O44eOQe4444šhhg3&+&&JKKKKKKKKKKKGFFFFFFGGGGGGGHHHHHHHJJHJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJo======$======================>===>=======>===>>>>======>====>=>>>>>==>A>==A>==>=>C>>>>===CxB$!$$$$$$!!!!!$$!$!!$!!!$!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ! !!         #Y  ph6666666666656666666666666666666666666666666666666666666666666866666666666666666666666666666666666686666666666666666666666666666666666666656666666666666656666666666666666666666655(%%%%%%%% %%% %%%% %% 566666666666656666666666666666666666666666666666666666666666666666666666666666666666KKKKKKKKKKKKKKKKKKKKKKKKKKJKJJJJJJJJJJJJJJJHHGGGFFFFFFJKKKKKKKKKKKK2444OQe444Q˭Ğ:&&&&JKKKKKKKKKKKGFFFFFFFFGGGGGHHHHHHHHHHJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJp=====$============$=========>==================>>>=====>>=>===>==>>==>>=>=>>===>>>>>>>>>==>Ct_ZZZZZZZ]ZZ]ZZ]ZZZZZZZZZZYYZZYYZZYYYYZZYYYYYZYYYZYYYBBYBYYYYBYBYYBYBBYBYBYBB@@YB@B@@Y@YBB@@@BB@@B@@@@@@@@@@@@@@@@@B@@@@@@@@@@@@@@@@@@BB@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@Y[_   ph6666666666666666666666666566666666666666666666666676666656666666666666666666666666666666666666666666666666666666666666666666666666666666666666666665666666666666666666666666666666 % %%%%% %%% %% %%%%%(6666666666666666666686666666666666666666666666666666666666666666666666666666666666$KKKKKKKKKKKKKKKKKKKJKJKJJKJJJJJJJJJJJJJHGGGGFFFFFJKKKKKKKKKKKK2444OQe444Q3&&&&JKKKKKKKKKKKGFFFFFFGFGGGGHHHHHHHJHJHJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJv=====$=========$======>>>>>=========>>=>?>>========>>>>=>>>>====>====>>>>=====>>>=>=>>===>=>>=?tx[   oh6666666666666666666666666666666666666666666666666665666666655666666666666666666666666666666666666666666666666666666666656666666666666666666666666666686666666666666666666666666666% %%%%%%% %%%% % %%%%%55666666665666666666666666686666666666666666666666666666666666666666666666566666666$KKKKKKKKKKKKKKKKKKKKJKKKKKJJKJJJJJJJJJJJJHJHHGGFFFFFFJKKKKKKKKKKKK24OOeOQѾ444QӰ2&&&&JKKKKKKKKKKKGEFFFFFFGGGGGGGHGHHHHHHJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJv===================>====================>===>===>==>========>>>A==>>=>A>==>>>>>>>>>=====>>>=>>>=?>=>>A?>=A>A>>>A>A>>AA>>A>A>AAA>>A>>>A>AAA>>A>A>>AA>>>A>C>>>A>=>A>AA?A>>>AA>>>A>>C>>>>>>>>A>>A>==>>====>==>>=>==>>=>=====>>=>==>=======>====================9==$===99$$9@   ph6666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666i66666666666666666666666666666666666666666666666666666666666666666666(% %% % %%%% % % %%%66666666666666666666666666666666666666666666666666666666666666666666666666666666666$KKKKKKKKKKKKKKKKKKKKKKKKKKKKJJJJKJJJJJJJJJJJHHGGGFFFFFJKKKKKKKKKKKK2444OQѾ444Q԰3&&&&JKKKKKKKKKKKGEFFFFFFGGGGGHHGHHHHHJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJp=$$=========================>===============>===>======>===>>==>===>>>>=====>==>>=>====>>====A>>>>>=>>>==>=>>>=>=>>>>>====A=>>>==>=>>>>>>==>>?>==>>=>>>=>==>=====>A>======>>==>=>>=>>===>====>====================================$==$=$$==$$==$$=$$===$$=$$$$$$$$$$$$$=Y  ph66666666i6666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666655666666666666666656666666666666666666666666666666666666666666666666666(%% %%%%%% % %% %% %%%% 55666666666666666666666666666666666666666666666666666666666666666666666666666666666$KKKKKKKKKKKKKKKKKKKKKKKKKKKKKJJJJJJJJJJJJJHHGGGFFFFFFJKKKKKKKKKKKK244OOQэ444Qް<&&&&JKKKKKKKKKKKGFFFFFFFGGGGGGHHHHGHHJHHJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJp==========$==>=======================A=======>==?==>=>=>=================>=>=>====>>=>>>>=====>>==>=>====>=>>?>>?=======>=>===>>==>=>>?>==>A>>>>>>=>>======AA?>>>>=>===>===>==>====>==>>========>=======================$$=$==$===$=>==$!==$=$==$$$$==$$$!$$!$=$!$$$==$=΅@ ph666666666666666666666566665666666666666666666666666666666666666666666666666666666666666666666666655665((88666666666666666666666666666666666666666666666666666666666666666665(%%% %%% %% %% % % % (6666666666666666666666666666666666666666666666666666666666666666666666666666666666$KKKKKKKKKKKKKKKKKKKKKKKJKJJJJKJJJJJJJJJJJJHHGGGGFFFFJKKKKKKKKKKKK244OOQ444Qٰ<&&&&JKKKKKKKKKKKGFFFFFFFGGGGGGHHHHHHHJJHJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJp=$====$===$==$====$======>===========>========>====>===========>=====>=====>>===>====>>====>?>======>>>>===>A>==>=>=>A>A>=>>>=>>>==>========>>====>>==>>>?>>=======>=>=>===================>>=>=======>=======================$===$=$==$====$!$==$==$!=$!$$=!$$=$!=$$!!$Á@  ph66666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666655%(55(%%%%%(5666666666666666666666666666666666666656666656666666666666666666665(% % %%% % %% % %%%%(6656666666666666666i8i666666666666666666666666666666666666666666666666666666666666$KKKKKKKKKKKKKKKKKKKKKKKKKJKJJJJJJJJJJJJJJJJJJJHGGGFFFFFFJKKKKKKKKKKKK2O4OOQ444Q԰<&+&+JKKKKKKKKKKKGFFFFFFFGGGGGGHHHHHHHHHJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJv=====$=========================================================>======>>===>====>>>==A=====>>==>=======>==>>=====>>>>A=>>====>====>>==>==>>=====>>>>====>==>===>=========>=>>=====>>>======>===================================$=====$$==$$$$=$$$$==$$$$!$$=$=$$$$$$!!!$>ZZZZZ]ZZ[ZZZZ[ZZZ[ZZZZZZZZZZZYYZZYYZZYYYZYYZYYYYYYZZYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYY@YYYYYYY@YYY@YB@@Y@@@@YYB@@YB@Y@@Y@Y@YYY@@@Y@@@YY@@YY@@@Y@@Y@@@Y@BY@B@@YYYY@@@Y@YY@Y@;#! vh666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666655(%%%((%'%%%%%(566666666666666666666666666666666666665666666666666666666666i65(%% %% % % % % %% %(5(5666666666666666666666666666666666666666666666666666666666666665666666666666666$KKKKKKKKKKKKKKKKKKKKKKKKKKKJJJJKJJJJJJJJJJJJHGGGGFFFFFJKKKKKKKKKKKK24OOOQ444Qۭ<&&&&JKKKKKKKKKKKGFFFFFFGGGGGGHHHHHHHJHHJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJp====$$=$=====$==$$===============$====================================>>>==>>=>===>==>====>====>>>==>==>=>>>=====>==>>===>===>===>===A>>=>=======>===>==================>=========>==>===========>==============$==========$=========$=$=$$$$$$$$$$=$=$$!$$$$$$!$$$!$$!!!!!$$!$$!!!!!!!!!!$!!$!!!!!!!!!!!!!!!! !!!!! !! !!! !  ! vh666666666666666666666666666666666666666666656666666666666666666666666666666666666666666666655(('%''%%%%%%%%%%%(555666666666666666666666666666666666666666666666666666666666%%%%% %% % % % %% % %((6666666666666666666666666666666666666666666666666666666666666666666666666666666$KKKKKKKKKKKKKKKKKKKJKKKKKJJKJJJJJJJJJJJJJJJJHGGGFFFFFFJKKKKKKKKKKKK2OOOOQ444Qٰ<&&&&JKKKKKKKKKKKGFFFFFFFFGGGGGHHHHHHHHJHJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJv=$$=$$==$$=============$========>===========>===>>>=====>>========>>>==>>>===========>>>==>>==========>===?>===>>========>===>===>==>>===>>====>>===>>===>=>===>===========>==A=====================================$$==$$==$$$$$==$$$=$!$===!$$==$$$!==$!$$!!=$$!!!$!!$$$$$!!!!!!!!$!!!!!!!!!!!!!!!!!!!!!!!!!!! !!! !     !      ph6666666666666666666666666666666666666666666666666666666666666666666666666666666666666666665(%%'%%%%%%%%%%%%%%%%%%%%(666666666666666666666666666666666666666666666666666666666% % % %% % %% %% % (66666666666666666666666666666666666666666666666666666666666666666666666666666666$KKKKKKKKKKKKKKKKKKKKKKKKKJJJJJJJKJJJJJJJJJHHHGGGGFFFFJKKKKKKKKKKKK/OOOOQ444Q԰<&&&&JKKKKKKKKKKKGFFFFFFFFGGGGGHHHHHHHJHJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJp=======$$=====$$$$==========$=======>$=========$===========?>====================>======>===>==>>=>====>====>>>>===>>>=====>>>===>=>>=>A====>=========>>>======>==>>=====A>===========>>======================$$$=============$$$=$=$$$=$$$$$$=$!$$$$$$=$$$$$$$!!!!$!!$$$!!!!!$!$!!!!$$!!!!!!$!!!!!!!!!!!!!! !!  !! ! !!!        ph666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666(%%%%%%%%%%%%%%%%%%%%%%%%(566666666666666666666666666666666666666666666666666666666%%%%%% % 566666666i666666666666666666666666666666666666i666666666666666666666666666666666=KKKKKKKKKKKKKKKKKKKKKKKKKKKKJKJJJJJJJJJJJJJJJJHHGGGFFFFEJKKKKKKKKKKKK2OOOOQ444Qϭ:&&&&JKKKKKKKKKKKGFFFFFFFGGGGGGHHHHHHJHJHJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJp=$$=======$=====$================$==============$======>===>>=>==================>==============>==>=====>>======>======>==>====>==>>=====>>>======>===============>=======================================>===$====$$==$$====$=$$=$$$=$$=$$$$=$$!$$!$$=$$!$=$!$!!!=$$!!$!!!!!$!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!! ! !! !!! !   ph666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666('%%%%%%%%%'%&%%%%%%%%%%%%(56666666666666666666666666666666666666666666666666666666%%%%% % %5666666666666666666666666666666666666666666666666666666666666666666666666666666$KKKKKKKKKKKKKKKKKKKKKJKKJKJKKJKJJJJJJJJJJJJJHGGGGFFFFFJKKKKKKKKKKKK2OOOOQ343Qװ3&&&&JKKKKKKKKKKKGFFFFFFGFGGGGHHHHHHHHJJHJHJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJp=$$=======$=$$=======$=$=======$$$================>======================>>==>>======>==>=======>=======>>====$==>==========>==>>==>>=======>===>==>=>==>==>======================>==$=============================$$$!$===$$$==$!$====$$$===$$$$!$=!!!$$$$$$!!!$$!$$$$!!!!$!!$!!!!!!!!$$!!!!!!!!!!! !! !!!!  !!  ! !    vh66666666666666666666666666666666666666666666666666666666666666666666666666666666666666666((%%%%%%%%&%%%%%%%%%%%%%%%%(6666666666666666666666666666666666666666666666666666666 % % % 666666666666666666666666666666666666666666666666666666666666666666666666666666$KKKKKKKKKKKKKKKKKKKKKKKKKKKKKJKJJJJJJJJJJJJJJJHGGGGFFFFFJKKKKKKKKKKKK2OOOOQ443Qѭ:&&&&JKKKKKKKKKKKGFFFFFFFGGGGGGGHHHGHHJHHJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJv$$$$!$$!$$$$$==$===========$$===$$======$$=======>=========================>==>>>====>>============>====>==>=>>=>====>=>======>>=====>=>==?>====>=======>====>==============>>===$======$=>======$===========$$=========$=$$$$$=$$$===!$$$$$$$$$==$$!$$!$!!$!$==$!!!!$$!$!!!!!!!!!$$!!!!!!!!!!!!! !!!!! ! !!!!  !! !!  ! !      ph66666666666666666666666666666666666666666666666666666666666666666666666666666666666666666(%(%%%%%%%%%%%%%%%%%%%%%%%%%%(5666666666666666666666666666666666666666666666666666666% % % %5666666666666666666666666666666666666666666666666666666666666666666666666666666$KKKKKKKKKKKKKKKKKKKKKKKKKKJJJJJJJJKJJJJJJJJJHHGGGGFFFFFJKKKKKKKKKKKK/OOOOQ443Qϭ<&&&&JKKKKKKKKKKKGFFFFFFFGGGGGHHHHHHHHJJHHJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJp==$=$=$$$====$$======$=====$$============$==$===$========================>==================>======>====>============>===>>=============>===========================$=>=================$>===========$$$===$========$==$$$===$$=======$==$$!!$$$!$$!$$$$$!!!!$=$!!!!!!!$!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!! !!! !! !!! !    ph6666666i66666666666666666666666666666666666666666666666666666666666666666666666666666666%%%%%%%%%%%%%%%%%%%%%%%%%%%%56666666666666666666666666666666666666666666i6666666666% % % %5666666666666666666666666666666666666666666666666666666666666i66666666666666666=KKKKKKKKKKKKKKKKKKKKKKKKKKKJJJJKKKJJJJJJJJJJJJJJJHGGGFFFFFFJKKKKKKKKKKKK2OOOO4Q343Qװ<&&&&JKKKKKKKKKKKGFFFFFFFGGGGGGHHGHHHHHHJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJp===$=$$=$$$==$==$$==$$==$$==========$========$============$==============>===>=============>===>===>===>===>==$===>==>=============================>=====>===================================$=$======$==$$$==$$===$$====$$$=$$==$=$$=$$$$$$!$$$$$$!$$$$$!$!!!$!!!!!!!!!!!!!!!$!!!!!!!!!!!!!!!!!! !! !!!! ! !!!      ph6666666666666666666666i66666666666666666666666666666666666666666666666666666666666666665(%%%%%%%%%%&%%%%%%%%%&%%%%%%%666666666666666666666666666i6666666666666666666666665665( % 5666666666666666666666666666666666666666666666666666666666666666666666666666666$KKKKKKKKKKKKKKKKKKKKKKJKJKKJJJJJJJJJJJJJJJJJJHHGGGGFFFFFJKKKKKKKKKKKK2OOOOQ343Qϭ<&&&&JKKKKKKKKKKKGEFFFFFGGGGGGHHHHHHHHJJHJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJv=$!!$===$$$=$$=$$$$$$$=$$========>===$==$=============$=========>================>============>==>>>======>===$===>==========>======================$===============>=====$======>====$==$=========$=========$$$$$$$=$====$$!$=$$$$$$!!$$$$$!$$$$!$$$$!$$$!!!!!$$!!$!$!!!!!!!!$!!!!!!!!!!!!!!!  !!!!!! !! !!!          !vh6666666666666666666666666666666666666666666666666666666666666666666666666666666666666666((%%%%%%%%%%%%%%%%%%%%%% %%%%666666i666666666666666666666666666666666666666666666665 (6666666666666666666666666666666666666666666666666666666666666666666666666666666$KKKKKKKKKKKKKKKKKKKKKKKKKKKKKJJJJKJJJJJJJJJJJJJHJHGGGGFFFFFJKKKKKKKKKKKK/OOO4O4QѾ334Qި<&&&&JKKKKKKKKKKKGFFFFFFFFGGGGGHHHHHHHHJHJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJp$!$$=$$!!$=======$$=$=$=$$=$$!$=$=$$=$====$=======$===================================>>>===============================>=>===========>=========>==>=======================================$$$==$$$$======$$=====$$$$=$$$!$=$$=$$$=$$$$!$$!==$!$=$=$!!!!!$!!$$!!!!!$!!$!$$$!!!!!!!!$$!!!!!!!!!!!!!!!!! !! !!!!!!! !!!!     ph66666666666i66666666666666666666666666666666666666666666666666666666666666i666666666666655%%%&%%%%%% % % %%% %%% %%%%(55666666666666666666666i666i66666666666666666666666666(% (66666666666666666666666666666666666666666i66666666666666666666666666666666666666$KKKKKKKKKKKKKKKKKKKKKKKJKKKJJJJJJKJJJJJJJJJJJJHHGGGGFFFFFJKKKKKKKKKKKK/OOO4O4Q333Q׫<&&&&JKKKKKKKKKKKGFFFFFFFFGGGGGHHHHHJHHJHJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJo=$$!$$$=$$$$!$$$$$==$$$==$==$$$=======$=>=$====$===========>===$===========$=============$=>==========>==========================================================================$=$$===$=======$$=====$$=$!$$$=$$=$$=$!$==$$$$$$!$$==$!$$$!!$!!$$!$$!!!!$!!$!!$$!!!!!$!!$!!!!!!!!!$!!!!!!!!!!!!!! ! ! !! !   !     ph666666666666666666666666666666666666666666666666666666666666666i666666666666666666666665(((%%%%%%%%%%% %%%%%%% % %% %(((566666666666666666666666666666666666666666666666666% (66666666666666666666666666666666666666666666666666666666666666666666666666666666$KKKKKKKKKKKKKKKKKKKKKKKKKKKKKJJKKJKJJJJJJJJJJJJJJJJHHGGGFFFFFFJKKKKKKKKKKKK/OOO24Q333Qͭ<&&&&JKKKKKKKKKKKGFFFFFFFGGGGGGHGGHJHHHJHHJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJp$!$$$$==$$$$$=$!$$==$$==$==$====$$===>==$=$=================>>>============================>=========>>====>====>>=>==========>=========================$=====>=$==========$=$$========$$$==>===$==$==$$!=$$=$$$!$=$$$$$$==$$$$!!$$$=$!!$=$!!$!!$!!!$!!$!$!$!!!$!!!!!!!!! !!!! !!!!!!! ! !!!! !! !! ! !!  ! ! !          ph66666666666666i666666666666666666666666666666666666666666i666666666666666666666666666665(%%%%%%% % %%%% %%&%& %%%%%%%%% (566666666666666666666666666666666666666666666666665( (56666666666666666666666666666666666666666666666666666666666666666666666666666666$KKKKKKKKKKKKKKKKKKKKKKKKKKKKKJJKKJJJJJKJJJJJJJJJJJHGGGGFFFFFJKKKKKKKKKKKK/OOO24Q333QΨ<&&&&JKKKKKKKKKKKGFFFFFFGFGGGGHHHHHHHHHJHJHJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJp$$$=$!$==$!===$$$!$$$==$!!$!$$$$====$=$$$===!$$====$=======$$$$=====>==>>>=======$========$$=========$$============================>===$=========>==>======>=>=====$==$=$$======$==$!$$==$$$=!$==>=$$=======$$==$$=$$$=$$===$!$=$$!!!$$!!$$!!$$!$!=!$!!$!!!!!$$!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!! !!!!!!!  !   ! !          ph666666666i666666666i6666666666666666666666666666i666666666666666666666666666666666666666(%% %%%%%%% %%%%%%%%%%% % %%%(66666666666666666666666666666i6666i6666666666666665(% % 66666666666666666666666666666666666666666666666666666666666666666666666666666666$KKKKKKKKKKKKKKKKKKKJKKKKKKJJKKJJKJJJJJJJJJJJJJJJHJHGGGFGFFFFJKKKKKKKKKKKK/OOO424Q333Q:&&&&JKKKKKKKKKKKGFFFFFFFGGGGGGGHGHHHHHJHJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJp=$$$$=$!!$$=$!$==$$=$$$$===$!$=$$$$$$==========$===$====$$===$$==$$$$=================$$===============>=========$===================>============$==$==========$=============$====$$========$$$$=$!$$===$$===$$===$=$$$=$!!$$!$=$!$$!$=$$!!$$!!$!!!!$$$$!$!!$$$$!!!!!!!!!$!!!!!!!!!!!! ! !!!!! ! !           oh6666666666i6666i6666666666666666666666666666666666666i6666666666666666666666666666666666(%% % %% %%%%% %% %% % % %%%%%(66666666666666666666666i6666666666666666i6666666666% 556666666666666666666666666i6666666666666666666666666666666666666666666666666i66666$KKKKKKKKKKKKKKKKKKKKKKJKKKKKKJKJJJJJJJJJJJJJJJJJHJHGGGGFFFFFJKKKKKKKKKKKK/OOO4O4QѾ333Q:&&&&JKKKKKKKKKKKGFFFFFFFGGGGGHHHHHHHHJJHHJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJo=$!$$$$!!$=$$!$$$$!$==!$$$=$$===$$$$====$=$$==$$====$==$$====$=====$==$===================>=$==========>===$=======>==============================$==$=====$==============$===============$$=$====$==$$=$$=$$$$!==$$$$$$$$$$$$!$=$!$$$$!!!!$$!$$!!!$$!!!!$$!!!!!$!!!!!!!$!!!!!!!!!!!! !! !!!!! !  ! !  !    !    ph666666666666666666666666666666666666666666666666666666666666666666666666666i666i66666668(% % %% %%%% % % % %% %%&%(566i6i66666666666666i66666666i66666666666666666665( 66666666666666666666666666666666666666666666666666666666666666666666i66666666666666$KKKKKKKKKKKKKKKKKKKKKKKKKKKKKJKKKKJJJJJJJJJJJJJJJJJJJHGGGGFFFFFFJKKKKKKKKKKKK/OOO424Qэ333Q:&&&&JKKKKKKKKKKKGFFFFFFFGGGGGGHHHHHHHHHJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJo=$!$!!!$!$$!$$$$$$$$$$!$$$=$$====$$$===$!==$!=$$=$$=$====$=========$=======$==$$==$$=================$========$===$===$====$=>=======$====$$$$$=>=========$==$=$$$=====$$$==$$>>=$=$$===$$$$=$=$$======$$$=$$$$$$!!!!$$!$=!$$$=$$$$$!!!$$!!$$!$$$!$$$$$!!$!!!!!!!$$!!!!!!!!!!!!!!!! ! !!!!!!!!!!!  !!  !                vh666666i66666666i66666666i6666666666666666666666666666666666i6666i66666666666666666666666%%%%% % %%%%% %% % %%% % &%6666666i6666666666666666666666666666666666666666(  (66666666666666666666i6i666i666666i66666666666666i66666666666666666i66666666666666=KKKKKKKKKKKKKKKKKKKKKKKKKKKKJKJJJJJJJKJJJJJJJJJJJJJJHHGGGFFFFFJKKKKKKKKKKKK/OOO424Q233Q<&&&&JKKKKKKKKKKKGFFFFFFGGGGGGGHHHHHHHJJHJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJq$!!==$!$$=$!$==$!$!!=$!$$$!!!$$=$$$=>$!=$===$=======!==$$==$$======$$$==$$==$=======$=>=$=$==========$$$=$=====>===============$============$$===$=====$==========$=====$$==$!=$$$==$$=$$$=$=$=====$$$====!$=$==$!$$$$$!$$$=$$$!!$$$$=$$=$!$$!!!$!!!!$!$!!!! !!!!!!!!$!!!!!!!!!!!!!!!! ! ! ! !!  !!  ! ! !            vh666i6i6666666666666666666666666666666666666666666i666666666666666666666666666i66666666666%% %% && & % % % % % %666666666i6666i6666666i6666i666666666i66666666665(  (%6666i66i6666666666i66666i666666i66666666666666666666i66666666i6666666666666666666$KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKJKKKJJJJJJJJJJJJJJJJHJHGGGGFFFFFJKKKKKKKKKKKK/OOO4O4Q333Q<&&&&JKKKKKKKKKKKGFFFFFFFFGGGGGHHHHHHHHHHJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJv$$$!!$$$$!$$!!!$!!$$$=$$$$=$$$$$$$!$=$==$$==$$=$==$$$===========$======$$===============$=====$$===$==$=====$$===============$====$==============$==================$$!======$=$$==$=$===$===$$==$$$$$$$$$$$==$$$$$==$$$$$$!$!$$$$!!!$!!!$$$$!!!!$!!!!$!!!!!!!$!!!!!!!!!!!!!!!!!!!!!!!!! !!!  ! !! !   !!    phi66i66666666666i666i6666666666666666i6666i666666666i66666i666666666666666666i6666666i6666% % % % %% % % %(566666666666666666666666666i6i666666666i666666666   66666666666666666666ii666666666666666666666666666666666ii6666i6666666666666666666=KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKJJKJJJJJJJJJJJJJJJJJHHGGGGFFFFFJKKKKKKKKKKKK/OO224Q333Q<&&&&JKKKKKKKKKKKGFFFFFFGFGGGGHHHHHHHJHJHJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJp$$$!!$$!$$$$$$$$$$$$$$$$$!$===!!$=$$=$$$=$=$!=$$$$$$$=$===$=$$$=$=$=====$====$=======$======$======$==$=====$$===$====$======$===================$======$=$$======$=$$$=$$$=====$$=$=$==$==$$===$$$$=$=$$$$$$$$!$$$$$$=$!$$!$!$$$$!!!!!!!!$$!$!!!!!!!$!!!!!!$$!!!!!!!!!!!!!!!!!!!!!! !!!!!! !!!          ph666i66i66666i66666i666666666666666i66666i6i6i66666666iii6666666666666iii6i666666ii6666666(%&% % %% % % % %66666i6666ii6666666i66666666666666i6666666666666 (  666ii6666i66666666666666666i666666ii666666666666666666666666i66i66666666666666666=KKKKKKKKKKKKKKKKKKKKKKKKKKKKKJKKJKJKJJJJJJJJJJJJJJJJJJJHJHGGGGFFFFFJKKKKKKKKKKKK/OOO44O4Qэ333Q:&&&&JKKKKKKKKKKKGFFFFFFFGGGGGGGHGHHHHHHJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJo$$!!$$!$$!$$!=$$$$=$!$$$$==$$$=$!$$=!$$=$$$!$$$$!$==$!$$$$===$==$!$$====$$==$$=====$====$$========$======$$=$============9===>$$=======$===$====$$$!===$$=$=====$$=$=>=$=$=$$==$$$$$$=$$=$=$==$$$===$!$!$$!$=$!$!!$$!!$=$$!!!$$!$$$$$!!!!!!!!$$!!!!!!!!!!!!!!!!!!$!!!!!!!!$!!!! !!!!! ! !!!! !             ph66i6ii6666ii66i666ii6i6666666666i6iii6666666i666i666666666iiiii6i6i666666666666666i666665((% %& % %& % %(5666i6iii66i6666666i66ii666666666666666666666666i655  6656i6666i6666666666ii66666i6666i6666i6i6666i66666666666666666666666666666666666i6i6$KKKKKKKKKKKKKKKKKKKKKKKKKKKJKKKKKKKJJJJJKJJJKJJJJJJJJJJJJHHGGGGFFFFFJKKKKKKKKKKKK/OOO4O4Q333Q:&&&&JKKKKKKKKKKKGFFFFFFGFGGGGHHGHHHHHJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJo=!!!$!$!=$!!!$$!!$!$$$$$$!!!!=$$=!$==$=$$$$$$=====$!$$$======$$$$$=$$$$===$$$===$!$===$$$$==$=====$===$===========Z]ȅ_B>===$$====$$===============$!=$==$$$$===>=$$$=$$=$!$=$$$!!$!$$$$$!!$=$$$$$!=$$$$!=$!$!!!!$=!!!$!!!$$$!!$$$!!!!$!!!$$!!!!!!!!!!!! !!!!!!!!!!! !!! !    !!!   !         ph66666i666i6i6666i66i6i66666666666666666666i666i66i66666i6i66i66ii6i6666666i6666666666666i66(%% & % & 6666666666666666i66666666666666666666i66666i6ii66666   (566666666666666666666666666666666666iiii66ii6666ii6666666ii66i6666i6666iii66666i6666$KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKJJKKKJJJJJJJJJJJJJJJJJJJHHHHGGGGFFFFFJKKKKKKKKKKKK/OO2424Q333Q3&&&&JKKKKKKKKKKKGFFFFFFFGGGGGGHHHHGHHJHHJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJl=$!$$$$!!!$!!$$$$!=$$$$$$!$$$=!$$!$$$!$$!$==$==$!$=$$$$$!!=$$$$====$$=$$$=$==$======$==============$===$=$$=$==ZZ===$=$$=====$==$$$$===$=$$$=$$===!$====$=$$$$$=$$$=$$$$=$$$$$$$$$$$$!$!$$$!$$!$$!$$!$$$!!$$$!$$!!$$!!!!!!!!!!!$!!!$!!!!!$!!!!!!!!!!! !! !!!!!! !! !   !!       ohi6666666666ii66i6666666i6666666666i666i6i66ii66666ii6666666666666666666666666iii666i666i667 & % %(5i6666666i6i6i66i6666666666666i6666666i66i66666666665   66666i666666i66i666i6666666i6iii666i666i6666i666i6i666666666i66ii66666i666666666i66=KKKKKKKKKKKKKKKKKKKKKKKKKKKKJKKKKKKJKJJJJJJJJJJJJJJJJJJHHHGGGGFFFFFJKKKKKKKKKKKK/OO24424Q333Q:&&&&JKKKKKKKKKKKGFFFFFFFGGGGGGHHHHHHHJJHJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJo$$$!!$$!!$=!!!!$$!=$$=$$!!$$$$!$$!$$$!!$$$$=$$$$$$$$$$$$!$==$$$$$======$$======$$===$=$===$$====$===$$$==$$=@σB$$=====$=$$$$$$$$==$$$===$$===$$$$$$$=$!$$$=$$$$=$$$$$$=$$$!$$=!!$=!$$!$$!$$!!!$$$!!!!!!!!$$!!$!!!!!$!!!$!!!!!!!!!!!!!$!!! !!!!!!!!!! !!!! ! !!! !!  !  !      ph66666i6i666666666666i6i666666666666666666666666666iiii6i666ii666666i66666666666666i6666655 % & % (5i66i6i6666i66i666i66666666i6i66666i6666i66i666666i665     65 6i66i66666i6666i66666iii6i66666ii6iii666i6ii6666666666666666i6ii666666666ii6i666i66=KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKJKJJJJJJJJJJJJJJJJJJJJJJJHGGGGGFFFFFJKKKKKKKKKKKK/O22424Q233Q<&&&&JKKKKKKKKKKKGFFFFFFFGGGGGGHHHHHHHHHJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJo!!!!!!!!!!!!$!!!!!$!!!$$$$$!!!$$$!!$======$$$$$!$==$=$!$=$$$$$==$=$$=$=====$===$$$!!$==$$==$==$$!=========AB===$$$=$====>==$=$$$==$$==$==$!$$$!$$$=$$$==$!!$$!$$$$$$=$!$=!$$!!!$!!!!!!!!$$$!$$$$!!!$$!!!!$!$!$!!!!!$!!!!!!!!!!!!!!!!!!!!!!! ! !   !  !   ;YYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYY@YB  @YYYYYYYYYYYYYYYYY;  @YYYYYYYYYYYYYYYYYY#       ph6666666i6666666ii66ii6i66666666666ii66i666666i66666i666666i6666666666i666ii6iiii666i66666866i % &% % (5i6666666i666666666666i6666666i66i666666i666666i6i6i666   56666i66666i666i66666666666ii66666666666666666666i66666666ii66i666ii6i6666666666666i6i666=KKKKKKKKKKKKKKKKKKKKKKKKKKJKKJKJJJJJJKJJJJJJJJJJJJJJJJJHHGGGFFFFFFJKKKKKKKKKKKK/OO24424Q333Qͧ<&&&&JKKKKKKKKKKKGFFFFFFGGGGGGHHHHHHHJHHJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJo!!!$$$$$!!$$$!!$$$$$$!!!!!$$!$$$$=$=!$$!!!$$$=$=$$!=$$$$$==$!$==$!=$=$!$!$$$$$===$$=========$$=$=$$$==$=]z=$$$!$$==!$=$$$=$!$$$$$==$==$$==$!=!!=$!!!$===$$$$$$!!!$=$!$!$!!$$$!!$=$$$!!!$$!!$!!!!!!!!$$!!!!!!!!!!!!!!!!!! !!!!!!!!!!! !!!!!!!!!!!!  !!! !! !  !Y[Y oh6666i666iii666i66i6i666666666666ii666666666666i66ii6i66i6666i66666ii6i66666i6666666i66ii666i66(  & %& % 6666i6666ii6i666i66666i66666666666i6666i666666666i6i66666   5666666666i6666iii6i66666i666i666iii6666666i66666ii66666666ii666i6666i6i66666666666i66i66$KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKJJKJJJJJJJJJJJJJJJJJJJJHHHHGGGGFFFFFJKKKKKKKKKKKK/O224424Q333QΨ<&&&&JKKKKKKKKKKKGFFFFFFFFGGGGGHHHHHHHHJHJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJo$!!!!!!!$$!$!!$$!!$$$$!$$$!$$!$$$!==$!$=$!$$$$$$$$$!=$$=$$$$$$=$=$!===$$$==$$$===$$$$$$$==$=$$$=$=$$$==B]$==$$==$$$!$$==$$=$$=$$$$$$!$=$!=$!$$$$!$$$$!$$=$$!!$=$$$$$!!!$$$$!$$$$!!$!!!!!$$!!$!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!! ! ! !! !!! ! !   ! Y_[ ph66iiii666666i66i66iii6666ii66i666666i6ii666i66666i6i6666i66i66666i66i6i666666ii6ii666iiiii66665 % % %(5666i66iii6i666ii666666666666666i6i66666666i66666i6iii66i6    666ii666666666ii666666i66iii6i66i6i6i666666666i66i6i6i66i666666iiii6iiiii666iii6iii666ii6$KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKJKJJJJJJJJJJJJJJJJJJJJJHHHGGGGFFFFFJKKKKKKKKKKKK/O2244424Q333QӦ<&&&&JKKKKKKKKKKKGFFFFFFGFGGGGGHHHHHHHJHJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJo$$!!!!!!!$!!!$!!!$$!!!$!!$$$$!$!!!!$!$$=$$!$=$!$$$!$$!$$==$==$$!$==$=$$$==========$!$$$$$====$$$$$$$=Z@===$===$!==$===$=$$!$=$$$$!$$$=$$!!$=!$$$!$$$$=$!$$$=$$$!!!!$$$!!$!!!!!!!!$!!!!$$!!!!!!!!!!!!!$!!!!!!!!!!!!!!! !!!!!!! ! ! !!   !   Y _[ ph666666i6i666666ii6666iii66i6666666i666666666ii6ii66i6i6666iiii6ii66i66ii666666666i666i6i66666i66i6  % 5566666i6i6iii6i666i666i6i66666i6666i666666666iii6i66i666i6   566i6666i6666i6666ii666ii6i666666iiii666666i6ii666ii66i66ii66i666i66i6i666666666i66ii66ii6i=KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKJKJKJKJKJJJKJJJJJJJJJJJJJJJJJJHHHGGGFFFFFFJKKKKKKKKKKKK/222ч4424Q333Q׫<&&&&JKKKKKKKKKKKGEFFFFFFGGGGGGHHHHHHJHJHJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJl!!!!!!!!!!$$$!!!!!$!!!$!!$!$$$$$!!$$!$!!!$$=!!$=====$!=$$$!$$!!!!!$=$$$$$!!!$$$!!!$===$$!!====$$$===Ƃx]ZZZZ_B==$$$$====$$$$$$!$$==$$==$=$$=$====$!=$!$$$$$!!$$!!$$!!$!$$!!!!$!!$$!!!!!!!$!!!!$!!!!!!!!!!!!!!$$!!$!! !!! !!!!!!!!!!!!  !  ! !   Y[!vh66666666666666ii66i66iiii6i66666i66ii6iii66666ii6i66666i6i66i6iiii66666i66i66666i6i66i6i6i66i6i6i6 &  && (556i66i6666666iii6i666i666i6666666666i66666ii666666i6i6i6ii6i65( 5666iiiiii6i6i6666666i6i666i666666iiiii6ii6i6i666ii6ii66666i66i666iiii6666i6i6666666iii6i666$KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKJKKKKJKJKJJJJJJJJJJJJJJJJJJJJJJHHGGGFFFFEJKKKKKKKKKKKK022244424Q233Qϭ<&&&&JKKKKKKKKKKKGEFFFFFFFGGGGHHHHHHHHJJHJHJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJp$!!!!!!!!$$!!!!!!$$$$!!!!!$$!!!$!$$!!!$$$$$$!!$$$$!$$$$!!!$$$$$=$!$$!=$$$!$$$$$$$$!==$===$$$$$$=$$=˃Z=$$$=$!===$$$@Z$$=$$=$$!==$$$$$=$$$!$$$$=$!$$=!$$!!$$$$!!!$!!$$$!!$!!$!!$!!!$$$!!!=!!!$!!!!!!!!!!!!$$!!!!!!!!!!!!!! !!!!!!!!!! !!!!! !!  !!      Y[ph6666i6666666i666ii666iii6ii666i6i66i6i6ii6i6i6i66ii6666i6ii66ii6666666666iiiii6i6i66i6ii666iii66667DD  (6 i66i6i666i6i6ii66666ii666666666666i6i666ii66i6ii666ii666iii666i6  6i66666iiiiii66iii666666iiii6i6ii6ii6666i66ii666i6666666i6666i666666666i6i6ii66i66i666iiiii66$KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKJKJJJJJJJJJJJJJJJJJJJJJJJJHHHHGGGFFFFFFJKKKKKKKKKKKK/222424QѾ333Qӫ3&&&&JKKKKKKKKKKKGFFFFFFGGGGGGGGHHHGHHJHHJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJp$!!!!!!!!!!!!!!!!!$!$$!!$$!!!!!$$$!!$!$$!$$$!!$$!$=!$$!$!$$$$$$!=$!$$!$$$$!$$=$$$=$$$$$===$!=$$=$$9Z==$$$$$==!$=$$$$$$=BB$$$$=$!!$!$$$$==$$$!=$!=$$$$$$!$$$!$$$$$$$!!!!!$$$!!!$$$!$!!!$$!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !! !    !       Y[phi6666i66666i66i666666666666ii666iii66ii66ii6666666666i6666ii6i6i66ii666666666666iiiii66666666i66666ED(=!5 65(5i66iii66i6666i6666666666i666ii6i66666i66ii6i66i666ii6666i66666ii6666ii66ii6666ii666ii66i6666ii666666ii6666666i66ii6666ii6iiii666ii6666i666666i666iiiiii666iii666667KKKKKKKKKKKKKKKKKKKKKKJKKKKKJKKKKKKJKJJJJJJJKJJJJJJJJJJJJJJJJHHHHGGGGGFFFEJKKKKKKKKKKKK/2224424QѾ333Qޫ3&&&&JKKKKKKKKKKKGFFFFFFFGGGGGHHHHHHHHJJHHJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJp$!!$!!!!!$!!!!!!!!!!!!!$=!!!!!$$!!!$!$$!!!$!$!!!$!$$$$!$=$=$$=!$$!==$!$$=$===$$$=$=!!$=$=$$$===!=Z=$$=!!!=$!=$$$!$$$=$!$=@Z!$!$!=$$$$!=$$=!==$$=$!$!!$$$!!=$$$$$$$=$==$!!$!!$$!!$$$$=$$!!!!!!!!!$$!!!!!!!!$!!!!!!!$!! !!!!!!!!!!!!!!! !!!! !! ! !        Y_[ vhi66666666666i6ii66666i6i666iiiii66666ii6iiii6666666i666666i66i6i6ii666i66i6666i66i6666iii666666iii6"E 66!8i5666666iiii66i6ii66i666iiii6i6i6666i6i66iiiii6iii666i6iiiii6i6i6i66666i6666666iiiii66666666666ii66i66i6666i66i6666666i6i666i6666666iiiiiiii6ii66i66666iiiiiiii6ii66ii666=KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKJKKKKKJKKJJKJJJJJJJJJJJJJJJJJJJJJJJJHHHGGGFFFFFFJKKKKKKKKKKKK/2224O24QѾ333QϨ:&&&&JKKKKKKKKKKKGFFFFFFFGGGGGGHHGHHHHHHJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJv!!!!!!!!!!!!!$$!!!!!!!!!!!!!!!!!!$$$!$=$!$$!$$$$!!=$!!$=$!!$!$!$$!$!$=$$$!$$$$!!$$!!$$!!!$=$$!!!x=$$$$!=$!$$$$$==$$=!$==$$$=Z_==$$=$$$$$=$$==$!$!!!$$$$$$$$$$$!!$$!!!!!!!$$$$!!!!!!$!!!!!!$!!!!!$$!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !! !!!!9[Ƃ@ ! !!! !!! !   ! !!   Y_[ ph6i66ii66ii66ii66i66iii6666i6iii6ii666i66ii6i6i666666ii6666666iii6ii666iiii6666i6ii66ii6i6iiiiii6666E 6=7ii66i666i6i66iii6666ii66ii6i666i6ii6666666666i6ii6iii6iiii6ii66iiiii6666666ii66666ii66iii66iii66666666iiii6i66i666iii6ii666i6666i66666iiii666i6ii666i66ii6ii66666ii666i666i6=KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKJJKJJJJKJJJJJJJJJJJJJJJJJJHHHGGGFFFFFFJKKKKKKKKKKKK/22244424Q333QӨ<&&&&JKKKKKKKKKKKGFFFFFFGGGGGGHHHHHHHHJJHJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJv!!!!!!!!!!!!!$!!!!!!!!!!!!!!!!$$!!!$!!!==$!=$$$!!!!$$!=$!!$!$$!==$=$!$!$$!$$$$$$$$$$==$$$$$$$$=_B$$$!$$$=$$$==$!$$$$$$!$$=$$$$=Z=$$$=$!!$!!=$!$$!$!$$$$$$!$$$!$!!!!$$!!$$$$$!!!$!!!!!!!!!!!!!$!!!!$!!!!$$!!!!$!!!!!!!!!!!!!! !!!!!! !!!!!!!!! 9Y!   !      Y_[oh66i666i6i6ii66666i6ii6iii66ii6ii6iiiiiii6666ii6ii6i66iii666i6i6i6666i6i6ii66666i6666iiii66iii66i666"ED6ii6i66ii66iii6i66i6iii666iiii6i66i6666666i6iiii6ii66i6iii6i6666ii6iiiiiiii6i6i66i6ii66iii666ii66i6ii6ii6666i6i6i66i666ii66ii66ii6ii66666i66i66i666iii6iii66666i6ii6iiiii6ii6$KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJHGGGGFFFFFFJKKKKKKKKKKKK022244424Q233Qޫ<&&&&JKKKKKKKKKKKGFFFFFFFFGGGGGHHHHHHHHJHJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJo!!!!!!$!!!!!!!!!!!!!!!!!!!$$!!!!!!!!!!!$$!$!!$!!!!$$!$$!$$$$$$$$!=$!$!!=!!$$!$=!!!$=$$$=$!!$$Z@$!$!!$$=$$$!=$$$$$$$$=$!$$=$$!$=]B$!$$$$$$$$$!$$$$!!$!$$=$!!!$$!$!!!!!$$!!$!$$!!!!!$!!!!!!!!!!!!$!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!! !@  ! !      Y_[  phK666666i666iii6i66i6i6ii66iii6666iiiii66i6ii6ii6666i666i66i6iiii66i6i6i6i6i666i6666i6iiii6666i6ii666 EDDE7666i6ii66666iiiii66ii6ii666ii6ii6i66666i6iiiii6ii6ii66ii6i66iii6666i6i66i6ii6i6D6i66iiii66ii66iiiii666iii6iii6iii6i666i66666i6666i666iiii666666i6i666iii66ii6666666ii6ii6ii6i6i$KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKJKKKKJJJJJJJJJJJJJJJJJJJJJJJJJJJJJHGGGGGFFFFFJKKKKKKKKKKKK0222444423QѾ230Qϭ<&&&&JKKKKKKKKKKKGFFFFFFGFGGGGGHHHHHJHHJHJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJl!!!!!!!!!!!!!!!!!!!!!!$$!$$$!!$!!!!!!!$!!!!!$!!$!$$$$$$$$!$$!!!$=!!$!$=$$$=$!$!!$$$$$!$=$!$9=!$$!!$$$$!$=$=$$$$$$=$$$$====$$!$=@x@$$$$$$!$==$!$==$!!!!!!$$!=$!$$$=!$$$$!!!!!!!!$$!!$!!!!!!!$$$$!!!!!!!!$!!!!!!!!!!!!!!!! !!!! !! !!!!!!  !!!B!! !!    !!   Y_[   phiii666ii66666iiiiii66ii6iiii66i6i6i6666666i666iiiii66i6ii6666i666ii66i66i66i66ii66666i6ii6i666i6i66!EDD$66iiiiii666i6iii66666iiiiii6i6ii6i6i6666i6ii66666iiiiii6ii66i666i6i6ii666i6ii66i"!66i6i6ii6ii6i6ii6ii666i6i6666i6iii6ii6iii66iiiiiiii66iiii66ii666666ii6i66i666ii6iii6i66i66666i6$KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKJJKJJJJJJJJJJJJJJJJJJJJJJJJJJJJHHHGGGFFFFFFJKKKKKKKKKKKK/2224424Q323Qӫ<&&&&JKKKKKKKKKKKGFFFFFFGGGGGGGHGGHJHHHJHHJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJo!!!!!!!!!!!!!!!!!!!!!!!!$!!!!!!!$$!!!$$$!$!$!!!!!!!!$!!!$$!$$!!!$=$!!!$$$$!!!!$$$$!!!$$$!$$$$=9!$$!$$$!!$!$$$!!$!$$!$$$$=$$!!!$$=$!$$$!!!$$$$$!!$$!!!$$$!$!!$!!$$$!$!$$$!$!!$$$$!!!!$=$!!!!!$$!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !! !!!! _9     !     Y_[phKi6ii6666i666iii6ii666666i666666i66i666666666666ii6iii66ii6i6666i6iiiiii6666ii6i66666iii6iii666i6666!ED6ii6i6666i66iiii66i6iii66iii6666ii66666i6666ii6ii6i666ii666i6i666i666i66i666i66i6"D!6i66iiiiii66i6i666666i6iii6ii66i6666ii6ii666iiii6i666i6i6i6i66ii6i6ii6ii6ii66ii6iiiiiiii6ii6iii$KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKJKKKKJJJJKKJJJJJJJJJJJJJJJJJJJJJHHHGGGFFFFFFJKKKKKKKKKKKK/22244424Q333Q٫<&&&&JKKKKKKKKKKKGFFFFFFFFGGGGHHHHHHHHHJHJHJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJl!!!!!!!!!!!!!!!!!!!!!!$!!!!!!!!!$$!!!$!!$$!!!$$!!!!!!!$$!$!!!!!!$!!$!$$!$!!!=$$$$$$$$$$$$!$Y=!$$$$$$!$$!$!!$!$$!$$!$$$$$$!!!$!$$$$!$=$!!$!!!$!!$!$!$!$!!$$$!!$$!!$=!!$$!!!!$!$$!!!!!!$!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!! !!!!!!!! !! !9 ! !       Y_[ ohiiii66i66i6i6i6iii66666iiiiiiii66666iii6iii6ii666666iii6i6ii6ii6666iiiiiii6iii6i6iii6i6ii6ii6i66ii6!GED86ii6i66i6666ii6666iiiiiii66666iiiiii66ii6i6ii666i6i6i6666i66i6iii6i6ii6i66666ii66"66i6ii6iiiii66ii666i6i66iiiii6666ii66i6iii666i66666i66i66i666i6i66iii6i66ii6i66i6i666i6iiii6iii=JKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKJKJKKKJJJKJJJJJJJJJJJJJJJJJJJJJJJJJHJHHGGGGFGFFFFJKKKKKKKKKKKK/22244424Q232Qέ:&&&&JKKKKKKKKKKKGFFFFFFFGGGGGGGHGHHHHHJHJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJl!!!!!!!!!!! !!!$!!!!!!!!!!!!!!!!!$!!$!!!$$!!!$!!$!!!$$!!$$!!!$!!!!$$!$!$$!!!$!!$$$$=!!$$$!!!@$!!$=$$$!$$!!$!=!$$!$$$$$!!!!!$$$!!$!$$$$$!!$!!!$!!!!$!$!!$!$$!!!$$!$$$!$$!!!!=!!!!$!!!!!!!!!!!!!$!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!! !! ![! ! !     Y _[  ohKiiiiii66i6i6iii6ii6ii6666666ii666666ii66i6i6ii666iii6iiii66iii6iii6i6iii66iiiiiiiii6iiii6i6iiii6ii6EE76i6i666iii6ii6ii66iiii6iiiii6ii6iii6ii66i6i6666i6666i6666i66ii66iiiii66666i6i6666"iiii6iii6ii666ii6666ii666i66i66i6ii6ii66666i6i666iii6666i6i6iiiii66iii66666i6i66ii6i6iiii6iiiii$KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKJKKJJJJJKJJJJJJJJJJJJJJJJJJJJJJHHHHGGGGFFFFFJKKKKKKKKKKKK/2224432OQ222Qԫ3&&&&JKKKKKKKKKKKGFFFFFFFGGGGGHHHHHHHHJJHHJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJo!!!!!!!!!!$!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!$$!$$!!!!$$!!$$$!!$!!!$!$!!!!!$$$$!!!$[Y$$!!!$$!$!!!$!$!$$==$==!!!!!$$!!$!$$!!=!!!$$$==$$$!$!!=$$=!!!!!$=!!!!$$!!!!!!$!$!!$!!!!!!!!$$$!$$!!!!!!!!!!!! !!!! !!!!!!!!!!!!!!!!!! ! !  !! !@!   !     Y_[   vh66i66iii6iii6ii6iii66iiiiii66i66i6i666i66i66iiiiiiii6666i6666iii6i6iii66666iiii6ii66i666i6i6i66ii6i7EDD76iiiiiii6ii6666i66iii66i66i66iii6666666i66i6i666ii6iii6666i66i666ii6iiii6iii666i6D6ii66i666i6iiii6iii666i6i6ii66666iii6i666i6i66666i666ii66ii66ii6iii6ii6iiii66iiiiiiii6i6iii66ii=JKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKJJJJJKJJJJJJJJJJJJJJJJJJJJJJJJJJHJHHGGGGFFFFEJKKKKKKKKKKKK/22244323QѾ222Q׫3&&&&JKKKKKKKKKKKGFFFFFFFGGGGGGHHHHHHHHHJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJo!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!$!!$!!!$!!!!!!$!!!!!!!!$!$!$!!!$$$!!!$$$!!!$$$!!!!$$!$$9$$$$$!$!$!$!!$!!!$!!$$!!!!$$!$!!$$$$!!!$!$=$!$$!!!!$$$!!!!!!!$!!!!!!!!$!!$$!$!!!$!!!!!$!!!!!$!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ! !!! !  9        #_[ohKKKK66iii66iii6i6i6666ii6i66ii66iii6i6666666666ii66iiii666ii6iii666i666iiiiiiiiiii66ii6i6iii66ii6ii66ii8FED7iii666ii6i66i666i66666iii6666ii6i66i666i66iiiii6iii66iiii66i6i66iii66iiiii66ii66i"Diii6ii6i6i66i6iiiii666666i6666i6iiii6iii6666i6iiiii66666i6i66iiiii6ii6ii6666666i6666iii6iii6ii6$KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKJKKKKKJJJJKKJJJJJJJJJJJJJJJJJJJJJJJHJJHHGGGFFFFFJKKKKKKKKKKKK022244323Q233Qϭ:&&&&JKKKKKKKKKKKGFFFFFFGGGGGGGHHHHHHHJJHJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJo!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!$$$!!!!!!!!!!!!!!!!!!!!!!!!$$$!!!!$$!!!$!!!$$Y@!!$!$$=!!!$!!$!!!$!!$!!!!$$!!$!!!$$$!!!!!$$!!!$!!!!$!!!!!!$!!!!!!!!!!!$$99999!$$!!!!!!!!!!!$!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !! !!!!!!! ! !!B   ! @ [ohK666iii6iiiii66iiii6iiiii6iii66666i66i6iiiiii66ii66i666iiii66i6ii66iii6ii66ii66i6i6ii6ii6i66666i66i68FED$iiii66iiii666i6666666i6i66i6ii6ii6iiii6iiii66iiiii6i66ii6iii6ii666666ii6i6iii6iii6i666i6666i6i66i6iiii66i6i6i6666iiiiiii6ii6i6i6i6666ii66i66iii6i6iii6i6i6iii66666iii666i66i6iii$KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKJKKJKKJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJHHHGGGGFFFFFFJKKKKKKKKKKKK022244323QэM2MQԨ<&&&&JKKKKKKKKKKKGFFFFFFFFGGGGGHHHHHHHHHHJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJo! !!!!!!!!! !!!!!!!!!!!!!!$!!!!!!!!!!!!$$!!!!!!!!!$!!!!$!!$!!!!$$$$!!!!!!!!!$$$!!!_!!!!$$$!!!!!!!!!!$$$!$$$$$!!$$$$!!!!!!$!!$!$!!$$$!!!!!!$!$$!!!!!$!!@B_ƖZ@9$!$!!!!!!!!!!$$!!!!!!!!!!!! !!!!!!!!!! ! !!!!!!! !!!!! !!!! !! @[!       ;  [  ohKKKKK6i6ii66ii666ii6ii66ii6iii6iii6i6iiiiiiiiii66666ii6666iii66iiiiii666iiii6666iiiii66iii6iii66i66i6iii8ED7iiiii666i6ii6666ii6iii6iii6666i6i66i6ii6ii6iiiiii666i6iii6ii66ii6i6iiii6iii6i66i6!6i6i66ii666i66iiiiiiii6i6i6i666iii66iiiii6i66666666iiiiii66iii66i6666ii6i6666666iiii6666ii6ii667KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKJJKJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJHHHGGGGGGFFFFJKKKKKKKKKKKK/22244324Q022Qװ<&&&&JKKKKKKKKKKKGFFFFFFGFGGGGHHHHHHHJHJHJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJo! !!!!!!!!!!!!!!!! !!!!!!!!!!!!=!!!!!!!!!!!$!!!!!!!!!!!!!!!!!!!!$!!!!!!$!!!$$$!!!!9=$!$!!$$!$$$!$$$$!$$!!!=$!!!!!$$$!!$$!!!!$$!!$$$!!!$=$!!$$$!!!$$!$9Z_;!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ! !!$!!! !!!!;Z_Z9!            !; _[   phKKKK666ii6iii666iiiii66i6i6i6i6iii6ii6ii666iii6ii6666iiiiii66i6iii66ii6iiiiiiiiiii666i66i6ii6iii6i66i6i8ED=iiiiiii6iii6iiii66i6i6iiiiii666666ii6i66ii66iiiii66i6ii6ii666iiii666iii6ii6666i6i"D66i6ii6i6iiiiiiii666i66iii66i66iii66ii6ii6666ii6ii66i6i6i6i666ii666666i6i6iiiii666666i666iii6i6$JKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKJJJKJKKJJKJJJJJJJJJJJJJJJJJJJJJJJJJJJJJHHGHGGGFFFFFFJKKKKKKKKKKKK/222444323QѾ322Qޭ<&&&&JKKKKKKKKKKKGFFFFFFFGGGGGGGHGHHHHHHJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJm! !!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!$!!!!!$$!!$$$!!!!!!!!!$!!!!!$$!$]_!$!!!$$$!!!$!!!!!!!!!!!$!!$!!!!!!!!!!$!!!!$$!!!!!!!!!!!!!!!!$!!!9[ς@!!!!$!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!! ! @΂@ !! !!!!           @ _[   phKKKKKKKK666i666i66i66iiiiii66666iii6ii66i6666iiiiiiiiiii6i666666i66i6i66iiii6ii6i6ii666i66iiiii66i6ii66iii66DD!66ii6ii6666iiiii6i66iii6ii6iii6ii66i66ii6iii6iiiii6666i6i6i6ii6666i6666i66i6ii66i"66i6i6666iiii66i6iii6iiii6iiiii66i66iii6iii66i66iiiiiiiiiii666i6ii6ii6iii6666iii6i6i6iii6666iii=JKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKJKKKKKKKKKJJJJJKJJJJJKJJJJJJJJJJJJJJJJJJJJJJHHHHGGGFFFFFFJKKKKKKKKKKKK/22244323Qэ222Q԰<&&&&JKKKKKKKKKKKGFFFFFFFFGGGGHHGHHHHHJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJo! !!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!$!!!$$!!!!!!$!$!!$!!$$!$@!$!!!$$$!!!!$$$!!!!!!!!!!!!!!!!!!!!!!$!!!!!!!!!!!!!!!!!!!$$!!!!Z_9!!!!!!!!!!!!!!!@_;!!!!;_„9!!!! !!!![!   !! !B[! @_9 ! @______!; _[ phKKKK6i6ii66ii6i66iii6i6i666iiiii6i6ii66ii66i6666i6i6i6iiii6i666i66i6666i6ii66iiiii6ii66i6i66i6i66i66iii6EDD i66i6iiii666i666iiiiii66ii666i66i66666i66666i6iiiiiii66i6i6iiii666i6i6iiiii6ii6i66i66ii6i6ii6iiii6i6i6ii6i6666iiii6i6i6iii6ii6i6i66iiiiii6i66iii66i6666iii666i6ii6ii666iiii66iii=JKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKJJJJKJJKJJJJJJJJJJJJJJJJJJJJJJJJJJJJHJHHGGGGFGFFFFJKKKKKKKKKKKK/22244324Q222Q׫<&&&&JKKKKKKKKKKKGFFFFFFFGGGGGGHHHHGHHJHHJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJp!! !!! !!!!!!!! !!!!!!!!!!!!!!!!!!!!!!$!!!!!!!!!!!!!!!!!!!!!!!!!!$!!!$$!$!!!$$!!9$!!!$$$$!!!!$$$$$$!!!!!$!!!!!!!!!$!!!!!!!!!!!!!!!!!!!!!!!!!!9@!!!!!!!!!!!!$ 9_! !! !! !!!! !Y# @;; Ƃ  phKKKKKKKKKi6ii6ii66iii6i6ii6i6i666i6i6i6iii66i6iii666iii666iii6i666iiiii66i6ii666ii6i6i6ii666ii66iiiii6i6i6ii6"EDD 6i6666ii6i66iii6iiiii666ii6i66ii66i6i66iii66i6666i66666i6i666ii66666666666666666iiii66i666i6iii6i6666ii6666i6i6ii66ii6ii6iiii6iiiiii6iiii6ii6iii6i6i6ii66i66iiii6i6i6iii6i66i6i6$JKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKJJJJKJKJJJKJJJJJJJJJJJJJJJJJJJJJJJJJHJHHHGGGGFFFFFJKKKKKKKKKKKK022244323Q0223ϭ:&&&&JKKKKKKKKKKKGFFFFFFGGGGGGGHHHHHHHJJHJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJp! !!! ! !!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!$!!!$!!!!!!!!!!!!!!!!!$!!!!!!$!!$$!!!;!$!$!!!!!!!!!!!!$$$$!!$!!!$$$$!!!!$!!!!$!!!$!!!$!!!$$!!!!!$9B!!!!! !!!!!!!Z; !!! [! ! !Y! @    @     phKKKKKiiiii6i66i6i6i666ii6ii666ii6666ii66666i6i6i6iiiiiiiii66i6ii6i6iiii6i6iii66i6iiii66iii6666i6iii6i6ii6#ED6i66i66ii66i6ii666ii6ii6iii66ii6i666ii666i6iiiiii6iiii6i666iiii666iii66iii6ii66i6Di6666ii6ii666??i6iii666iiii666i6i6666i66iiiii6i666i666iiii6iii6ii6666iii66ii66iiiii6i666666iiii=JKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKJJKJJKKKJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJHHHGGGGFFFFFFJKKKKKKKKKKKK0222444423Qэ222Q߰Ԩ3&&&&JKKKKKKKKKKKGEFFFFFGGGGGGGHHHHHHHHHJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJo !! !! !! !!!!!!! !!!!!!! !!!!!!!!!!!!!!!!!!!!$!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!BB!!!$!!!!!!!!!$!!!!!!!!!!$!!!!!!!!!!!!!!!!!!!!$!$!!!!!!!!!!!!@Y!!!!!!!!! !! !!!!!Y;   9Y [Y #;phKKKKKKKKKKKKKKKiii666iiiii6ii6iii666i6i66ii666i6i66i6i6i6iiiiiii6iiii666iiii6666i6666i6i6i6iiiii6iii66ii66i66i6666i$EDD66ii6666??88i668A>6i88AiZ?66j??i6i688>8886^B8iii8ij\8ZZ8<888>A>??i8\Z8ijiB8>>B\>":B?>Vi8>\>\6iiCB68>8i8ii888i66i86V8ii8Z66888i6ii6iii666iiii686iiiA8666ii6i666iiii8ii6iiiii66i666=JKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKJKJKKJJJJJJKJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJHHHHGGGFFFFFFJKKKKKKKKKKKK/222444323Q202Qϰث3&&&&JKKKKKKKKKKKGFFFFFFGGGGGGHHHHHHHJHHJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJo! !! !! !!! !!!!!! !!!!!!!!!! !!!!!!!!!!!!!!!!$!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!![9!!!!!!!!!!!!!$!!!$!!!!!!!!!!!!!!!$!!!!!!$!!!!!!!!!!!!!!!9„B!!!!!!!!!!@!! !!9 !!Y !;[[;  ohKKKKKKKKK66i6i6ii666iii6iiiiii66ii6iii66i6666ii666i6iii66ii6iii6i6i666ii6iiiii6ii6iiiiiii6ii66i66668ZZC8?>86^9ED8Z?8>57==5<<66CB^`B\BZ>8?Y\BZA>6?>Z\Z><\BY^V^\A\^Q<<\8Y\"PY\Y8V8\B88B\YQ>B86>BVBBBA6>8888BB8i?BB66868iV88ii6iiii6iA>A=JKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKJKKKKKKKKKKKKKKKJKJJJJKJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJHHJHHGGGGFGFFFFJKKKKKKKKKKKK/222444322Q2003ް<&&&&JKKKKKKKKKKKGFFFFFFFFGGGGGHHHHHHHHJHJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJp!  !! !!!! !!!! !!!!!!! !!! !!!!!!!! ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!$!!!!9!!!!!!!!!!!!!$!!!!!!!!!!$!$$!!!!!!$$$$$!!!!!!!!!!!!!!!!9΂B9!!!$$$!@x@!!!!! !!!9! ! [!   !Y 9 #  ;   phKKKKKKKKKKKKKKKKi666iiiii66iii6iii6ii6iiiii666i6iiiii6i6i666iiiiiiiii66i6?i?ii6i66iZ?e``B<\^8^=ED\:" ,- #=Q<\e\e\e\\Q?\`\\QQ\\^Q\Q\QQSQQ?\QMR\S":NRQ\QQ`\BQQSR>8\B\YQ\VVBQSQBUV\QUQQQBV=BV\>\\?88<888BB=JKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKJKKKKKKKKKKKKKKKKKKKKKJJKJJJKJJKKJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJHHJJHHGGGGFFFFEJKKKKKKKKKKKK0222444223Q0223ѭ<&&&&JKKKKKKKKKKKGFFFFFFGFGGGGGHHHHHHHJHJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJl !! !   ! ! !! !!!!!!!!!!!!!! !!!!!$!!! !!!!!!!!!!!!!!!!!!!!!!!!$!!!!!!$$!!!!!!$!!!!!!!!!!!$!!!$$!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!;!!!!!!!! !!![9! !!!!99!! 9!!@@ !   Y Y_ #;  ohKKKKKKKKKKKK6i666i66iii666iii6iiii66iii6iii6iiii6iii66iiZZii6ii>i68?CCCii6CCB>Z\B^8^?Z>?^>\^<\EDDFS--,- 0NSB\\\\\SSSLDD/N,.:SSSVQ\SQ^8ii^e^8i6i^>ee6?Z\e`e\GDD,NSSSSSSSS.D,SSSSSSSSSSSSSSSSSSNSSSSNSSSSNSQSSNSNSSSSNNSNNPQSSSNNRRSNNNNNSSRSNSN/KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKJKKKKJKJJJKJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJHJHHGGGGFGFFFFJKKKKKKKKKKKK02224444222QѾ2003ϭ<&&&&JKKKKKKKKKKKGFFFFFFFGGGGGGGHHHGHHJHHJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJl!!  !!  ! !! !! ! !!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!$!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!_=!!!!!! !!!!! $!!!_!! !!!@  !  99  @!  Y   Y ## ; ohKKKKKKKKKKKKKKKKKKKKKKKKKKKKj66ii?6ii8Z?88`eC>>`e`?B``BS,DLSSSSSSSSNLLSSSSSSSSSSSSSSSSSSSSSSSNSSNSSSNSSSSSSNNSSSSNSSSSNSSSNSSNNNSSSNSSNNNNNNSNNSNSRSSNN.JKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKJKKKKKJJJJJJJJKJKJKJKJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJHHHHGGGGFFFFFJKKKKKKKKKKKK02224444223Qэ0+03ث<&&&&JKKKKKKKKKKKGFFFFFFGGGGGGHHHHHHHHJJHHJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJo !! ! ! !! !! !!!!! !!! ! !!!!!! !!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!99!!!!! !!!!!!!!!!!!!B ! !@   ! #Z !@ˁ;   Y Y Y;   ohKKKKKKKKKKKKKKKKKKK^8je?i^e\cNLL.LSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSNSNSSSSNSSSSNSSSSSSNNSSSNNNSSNNSSSSNNNNSNSSNSNNNNNNNNNNSSSNNSSNNJKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKJKKKKKKKKKKKKKKKKKKKKKJKJKJKJJJKJJJKJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJHJHHGGGGFFFFFFJKKKKKKKKKKKK022244323QѾ2003ް3&&&&JKKKKKKKKKKKGEFFFFFFGGGGGGHHGHHHHHHJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJl   !  ! ! ! !!! !!!!!!!!!!!!!!!!!! !!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!ZB!! !! !!!!!!!!! !!!9!!!!!@ !!!!! ! ƖY!  Y #[ @   phKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK>eA`?jcSSSSSSSSSSSSSSSSSSNSSSSSSSSSSSSSSSSSSSSSSNNSSSSSSNSSSSNSSNSNNSSNNSNNNNNSSSSSNSNNNSSSSSNNSNNNNSNNNNNNNNSNNNJKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKJKJKKJJJKJJJKJJJJJJKJKJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJHJJHHGGGFFFFFFJKKKKKKKKKKKK022244323Qэ0033ްϭ3&&&&JKKKKKKKKKKKGFFFFFFGGGGGGHHHHHHHHJJHJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJl !  ! ! ! !!   !  !!! !!! ! !!!!!!!!! ! !!$!!!!!!!!!!!!!!!!!!$!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!! !!@9 !!!9Z! ! ! !!9 !    9Y@  @   vhKKKKKKKKKKKKKKKKKKKKKKKKKeecccSSSSSSSSSSSSNSSSNSSSSSSSSSNSSSSSSSSSSSNSNSNSNNNNSSSSSNSSSSSSSSNSSNNSSSSNSNNSNSNSSNNSNNSNSSSNNNNNNNNNNNNNNSNNNN.JKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKJKKKJKJKJKKKJKKJJKJJJJKJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJHHHGGGGFFFFFFJKKKKKKKKKKKK02224444323Qэ2003ްذ:&&&&JKKKKKKKKKKKGFFFFFFGFGGGGGHHHHHHHHJHJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJp  !!      !! !! !!!!!! !!!!! !!!!!!!!!!! !!!!!!!!!!!!9!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!! !!!!!!!;;! !!!! !!!! !!! !!!!!!![ !!!! ! !  YY !! ! ! !Y @; phKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKdcccSSSSSSSSSSSSSSSSSSSSSSSNSNSSSNSSSSSSSSNSSSSSSSSNSSNSSSSNNSNSSSNNNNNNSNSNSNNNSNSSSSNSNSSSNSNNNNNNNNSNNNNSNNNNNNNNNNNNNNNNNNNNSNNNNN.JKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKJKKJKJKJJJJKJJJKJJKJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJHJJHHGGGGFFFFFJKKKKKKKKKKKK02224444322Qэ2003߰<&&&&JKKKKKKKKKKKGFFFFFFGFGGGGGHHHHHJHHJHJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJo !  !! !!! !! !!! !!! !!! !! !! ! !! !!!! ! !!! !!!!!! !!!!Z9!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!! !!!!!!! !!Z!!!!!!!! !!!!!!  !!!!! @ !!!9@ !!    #   Y   @ohKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKcccchSSSSSSSSNSNSSSSSSSSSSSSSNSSSSSNSSSSNSSNNSSNNSSSSNSSSSSSSNNSSNNNNSNNNNNNSSNSSNNSSSSSSSNNNNSSSNNNNNNNNNNNNSNNNNNNNNNNNNNNNNNNNNNNNNNNNNN.JKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKJKKKKKKKKKKKJJKJKJKJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJHHHHGGGFFFFEJKKKKKKKKKKKK0220O444323Qэ0003ϭ<&&&&JKKKKKKKKKKKGEFFFFFFGGGGGGHGGHJHHHJHHJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJl   !   !!  ! ! !! ! ! !  ! ! !!!! !!! !!!!!!! !!!!! !!!!!!!!!!@B!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!! !!!!! !!!!Y!!! !!!! ! !!! ! !!!!! ! !!    Y[  Y;  @   phKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKecccSSSSSSSSSSSSSSSSSSSSNSSSSSSNSSSSSSSSSSSSSSSSSNSSSNSNNSSNSSSNSNSNSNNNNSSNSSNNNSSSNNNSSNNNNNNNNNNNNNNNNNNNSNNNNNSNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN.JKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKJKKKKKKKKKKKKKKKKKKJKKJJJJJJKJJJJJJJJKJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJHJHHHGGGFFFFFFJKKKKKKKKKKKK0202444O223Qэ000Qذ<&&&&JKKKKKKKKKKKGFFFFFFFFGGGGHHHHHHHHHJHJHJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJl  !   ! ! !  ! ! ! !! !  !!!! !!!!!!!! !! !!! !! !!!!!!9!!! !!! !! !!!!!!!!!!!!!! ! !!!!! !!!!!  !!!!9!! !!! !! !!! !!! ! 9! !Y!!   ! _@    !Y[;;   phKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKcdSSSSSSSSSSSSSSSSSSSSSSSSNSSSNSSSNSSSSSSSSSSSSSSSSSSSSNNSNNNSNNSNSNSSNNSNNNNSNNNNSNNSNNSNNNSNNSNNNNNNNNNSNNNNNNNNNNNNNNNNNNNNNNNNNSNNNNNNNNNNNNNNNNLNNLNNNNNNN/JKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKJKJKJJKKJKJKJKJKJKKJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJHJHHGGGGFGFFFFJKKKKKKKKKKKK02024444322Q0203٫ͧ<&&&&JKKKKKKKKKKKGFFFFFFFGGGGGGGHGHHHHHJHJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJl    !  ! ! !!! !!!!! !!  !! !!!!!!  !! !!  !!! !!!!!!! !!!!!!!!!!!!!!! !!!!!!! ! !!!!!!!!!!!!!!!!!!!!! !!! !  !!! !!!!!!Z# !!!!  !_!  Y _ ;  dphKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKSSSSSSSSSSSSSSSSSSSSSSSSSSSSSNSSSNSSSSNSSSSSNNSSNSSNSNSNSNNNNSNNNNNNNNSSNSSSNNSNSSNNNSNNSSNSNSNSNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNLNNNLNLN/JKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKJJKJKKJJKJKKJJJKJJJJJJJJJJJJKJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJHHHHGGGGFFFFFJKKKKKKKKKKKK02004444323Q߾000<Ӱذ:&&&&JKKKKKKKKKKKGFFFFFFFGGGGGHHHHHHHHJJHHJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJl       !  ! ! !!   !!   ! !! ! !!!!!!!!!!! !!! !! !!!@! !!! ! !!!!!!! !!!!!!!!!!!  !!!!!!!! !!!!!!!!!9!  !!!! !!! !!!!!@;! !     !  Y9  Y# ; _[phKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKSSSSSSSSSSSSSSSSSSSSSSSSSNSNNNNSSNSSSSSNNNNNSSSNSNSNSSSSSSNSSNNSNNSNNNSNSNSSSNSSNNNNNNSNNNNNSNSNNNNNSNNNNNNNNNNNNSNNNNNNNNNNLNNNNNNLNNNNNNNNNNNNNNNNNLLNNNLNNNNNNNNNNNLNNLLMJKKKKKKKKKKKKKKKKKKKKJKKKKKKKKKKKKJKKKJKJKJKKKJKKKKKJJJJKJJJJJJJJJKJJKJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJHHHHGGGGFFFFFFJKKKKKKKKKKKK0200O444223Qߍ00+3Ԯ3&&&&JKKKKKKKKKKKGFFFFFFGGGGGGGHHHHHHHHHJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJl    ! !  !!!  ! !!! ! ! !!!!!! !!! !!!!!!!! !!Z! ! !!!!! !! ! ! !!!!!!!!! !!!! !!! ! !!9! ! !!!!!!! ! ! ! !  ;@! !!    9; Y _;@ _[  phKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSNSNSSNSSSSNSNSNSSNNNSNSSNSSSSNNNSSSSSNSNSSNNNSNNNNSNNSNNSNNNNNNNNNNNNNSNNNNNNNNSNNNNNNNNNNNNNNNNNNNNNNNLNNNNNNNNNNNLNNNNNNNNNNNNLNNNLNNNNNNNLNNNLLL/bcJKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKJKKKJKKKKKKKJKJJJJKJJJJJJKJKJJJJJKJJJKJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJHJJHGHGGFFFFFFJKKKKKKKKKKKK02202444ٍ323<ҧ^0003:&&&&JKKKKKKKKKKKGFFFFFFGGGGGGGHHHHHHHJJHJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJl !  !   !!!!!!  ! !!!!!!!!! ! !!! !!! !!!!!!!!!!!!!!!!!!!! !!!!!!! !!  ! !  !! !!!!!  !!!!! !! ! ! !;B! 9   ! Y  !Y _@_ [  phKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKSSSSSSSSSSSSSSSSSSSSSSSSSSSSSNSSSSSSSSSSSNSSSSNNNSNNSSNSNSNSSSNSSNNSNSSNNNNNNNNNNNNNNNSNNNNSNNNSNNNNNSSNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNLNNNLLNLNNNLNNLNNLNNNLLLNLNNNNNLLLLPghHWWWWKWWWKWWWKJWWJWJWWJWWJJKWJWJJWJJWJJJJJJJJJJJJJJJJJJJJJJHJJJJJJJJJJJJJJJJJJJJJJJJJJJJJHHHHHHHHHHHHHHHHHGGFFFFJKKKKKKKKKKKK00004444ލ2233^00+3{0&&&&JKKKKKKKKKKKHFFFFFFHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHJJHHJJJJJJJJJJJJo  !!!! !! !   !!!! !!   ! !!!!!!!!!!! !! !_!!! !!  !!!!!!!  !!! ! !!!!!!   !! ! !!! !!!! ! ! ! ! ! ;; !!      !_  Y[#@ [  oKJKKKSSSSSSSSSSSSSSSSSNSSSNSSSSNSNSSSSSNNNSNSSNSSSSSSNNNSSNSSSSNNNNNSNSNSNNNSSNSSSNNNNNNNNNNNNNNNNNSNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNLNNNNNNNLNNNNNLNNNNLNNNNNNNNLLNLNLLLNLLLNNNLNNNNNNLNNNLLNLNLLL/bhhUXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXVXXXXXXXXXXUVXVXXXXUUXXXXXXXUUUUTTTUTTTTTTTTTTTTTTTTTTTTTTTTUTTTT:TTT:TTTTTTTWXXXXXXXXXXXW+0004442ٍ223QǞ^+++30&&&&WXXXXXXXXXXXWT"TTTTTTTTTTTTT:T:TTTT:TT:TTTTTTTUT:TTUTTTTTTTTTTT:Tl         !   !   ! !!  !!! !! ! ! ! !!!!!!!@;!! ! ! ! !!!!!!!!! !! !!!!!!  ! ! !! !9!!  ! !   !!!B;    !   @[ Y  @ _[oXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXSSSSSSSSSSSSSSSSSSSSSSSSSNSSSSSSSNNSSSSSSSNSSSNNSNNSSSSNSNSSSNNNSSSNNNNSSSNSNNSNSNSSNNNNSNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNLNNNLNLLNNNNLNLNNNNNNNNLNNNNNLLLNLLNLLLLLNLLLLNNLLLLLNLLMcTTTTTTTTTTTTTTTTTTTTTTTTTTTT"""T"TT"T""T"""T"""""""""""T"""T""""""UXXXXXXXXXXXU0000O44Oٍ323QǞ^+0+30&&&&UXXXXXXXXXXXX""""""""l !   ! ! ! ! ! ! ! !!  ! ! ! !! ! !! ! !!! !!!!!!!!!!! !!! ! ! ! !!!!! !  !   !! ! !  ! 9 !      _   Y@@   _ [ pTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTSSSSSSSSSSSSSSSSSSSNSSSSSSSSNSSSSNSSSSNNNNSNSSNSSSSSNNSNSNSNSNSSNNNNNNSNNNSNNNSSNNNNNNNNNNNNNNNNNNNNNSNNNNNNNNNNNNNNNNNNNNNNNNLNNNNLNNNNNNNNNNNNNNNNNNLLLNNNNNLNNLNNNNNLNLLLLNLNLNLLNLLLLLNNLLLNLNLLLL.WhTT"TT"TT"T""TTTT"""""""TTTTTTTTTTTTT+020444Oٍ223<^+0+30&&&&:TTTTTTTTTTTTl     !      ! ! !!    !!!!  ! !!  !! !! !BZ! !!!!! !  ! !!!! ! !!!!!  !! @ !!! ! !! !!!! ! ! !  !   YY Y ; @ _ Y  vTTTT""TT"TTTTTTTTTTTTTTT"TTTTTTT""TTT"TTTTSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSNSNNNSSNNNNSNNSSNNSNSSSNNNSSNNNNNNSNNNNNNNNNNNNNSSNSNNNNNNNNNNSNNNNNNNNNNNNNNNNNNNNNNNLNLLNNLLLLNNNNNLLNLNNNLNNNNNLNLNNNLLLLLNNLLNNLNNNNNNLNLLLLNLNNLLLLLNNNLLNLLLLLLLLPb"TT"""""""""""""""""""TTTTTT"T:00204444ٍ323<^+0+3ǞǞ0&&&&""TTTT"TT""TTo       !       !    ! !!!   ! !!! !!!;! !! !!!  !!!!!  !  !! !  ! !![[ ! !!!  ! ! 9     B Y Y@  _[ p""""""""""""""""""""""""""""""""""""""""""SSSSSSSSSSSSSSNSSSSSSSNSSSSSSSSSSSSSSSNSSSSSSSSSNNSNNSNNNSSNNNSSNNSSSNNSNNNNNNNNNNNNSSNNNNSNNNNNNNNNNNSNSSNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNLNLNNLNNNNNNNLLLLLLLNLLNNNNNLLNNNNLNNLLLLLLNNNNNNNNLLLLLLNNNNLNLLLLLLLLLLLLLLL/Pg"""""""""""T"""TT"""+0004442ڍ322<ԭԭۭx+++<0&&&&:""""""T""T"o               ! !  ! !  !!!@9! !! !! ! !!! !   ! ! ! !;!  ! ! !  !  __  !   ## f YY @ _[  pSSSSSSSSSSSSSSSSNSSSSSSSSSSSSSSNSNSNSSSSSSNSSSSSNNSSSSNSNNNSSNNSSSNSNNNNNNNNNNNNNNSNNNNSNSNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNLNNNNNNNNNNNNNLLLNNLNNNNNLNNNLNLLNLLLNLNNNLLNNNNLLLNLLLLLLLLLLLLLLLLLLLLLNLLLLLLLLLLLLLLLLL/W"""""""""+0024442ڍ323<ӭԭa+++<Ҩ0&&&&""""""o !  !  !  !  ! ! !  !!!! !  ! 9!!!  !! ! ! !! !  !!!  !!!!!  !Z!  !!! !   9;   !  ! @9; Y _ ;  _[ oSSSSSSSSSSSSNSSSSSSSSSSSNSSSSSSSNNSSSSSNNNNNSSSNSSSSNSNSNSSSNNNNNSNNNSNNNSNNNNNNNNNNSNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNLNNNNNNNNNNNNNNNLNNLLLNNNLNNNNLNLNLNLNNLLLNLNLNLLLLNLLNLLLLLLLLLLLLLLLNLLLLLLLLLLLLLLLLLLLLLLLLMg"""""""T+200O442ڍ323<ԭԭa+++<:&&&&"l     !  ! !!  !!! !!!  !!! !! !9! !   ! !! ! ! @@  !_!     !!  ! ;99  Y_9Y9 ;  [ oSSSSSSSSSSSSSSSSSSSSNSSNNNSSSSSSSSSSSSNNSSSSNNSNSNNNSSNSNSNNNSSNSSNSSNSNNNNNSSNNNNNSNSNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNLNNNNLNNLLNNNNNNNNLNLNLNNNNLLLLLNNNNNLNLNLLLLLNLLLLLLLLLLNLLLLLLLLLLLLLLLLLLLLLLLLLLL,LLLLLLLL,LLLLLL/Whh""TT02004444ݓ322<۰۰y+++<<&&&&"""" l   !!           ! !    !!;;! ! ! ! ! !!  !_B !!9    !    @[      Y!! Y![; _[p"""SSSSSSSSSSSSSSSSSSSSNNSSSSNSSSSSSSSSSSSSSSNNNSNNNSSNNNNNNNNNNSNNSSNSNSSSNNNNNNNNNNNSNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNLLNNLNNNNNNNNNLLLNNNNLLNNNNNNNLNLNLLLLLLLLNNLLNLLLNLLLNNLNLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL.LLLLLLLLLL,LLLLLLLLLLLLLLL./bh""""20202444ߍ322<`+++3ǞǞǞǞ0&&&&""l       !    !      Y@   !   !! 9Y! ! _    ;     _;  Y #;@ _[  pSSSSSSSSSSSSSSNSSSSSSSSNSSSNSSSNNSSNNSNNNNSNNNSSNNSSSSSSNNNNNNNSSNNSNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNSSNNNNNNNNNNNNNNLLLNNNNNLNNNNNLNLNNLNNNNNNNNLLNLNNNLNNNLLLLNNNLLLNLLLLLLNNLLLNNLLLLNLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL,LLLL,LLLLLLL,LLL,LLLLLLLLL,,LL.Pg""00202442QQQQQQQQQQQQQQQQQQQQQQQUQQQQQQQQQQQQ33222Q3Q33QQ3U3333333U333333333333333333*+++3ƝÖ0&&&&"o     !  !    ! !! !! !!!_  !  ! !! ! Y_   ;[ !!  !! ;[    _ Y ;@   @   [    !v""""SSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSNNNNNNNSSSSSNNSSNNSNSSSNNSSSNSNNNSSSNNNNNNNNNNSNNNNSNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNLNLNNNNNNNNLLNNLNNLNNNNNNNNNNNLLNNNNLLLNLLLLNNLLNLNLLLLLLLNLLLNLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL.LL,,L.LLLLLLLLLLL,,LLLL,L,L,,.,L/W""0200243433333333333333333333333333333333232332*202M22MM00200000000000000000++0+0++++++++3ÛŖ”0&&&&"" o     ! !     ! !  !  !!   !    !!Y! ! ! ! !@Z  !![    @   Y# Y   Y@ _[   pSNSSSSSSSSSSSSNSNSSSNNNSSNSSSSSSNNNNNNNSSSSSSNNNSSNSNSSNNSSNSSNNNNSSNNNNNNNNNNNSNNNNNNNNNNNNNNNNNNNNNNNNNLNNNNNNNNNNNNLLLLLLNNNNNNNLLNNLNNLNNLLNNNLNLLLNNLLLLLNLLLLLLLLLNLLLLNLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL,L,,,LLLLLLL,,LLLLLLLLL,LLLLL,L,LLL,,,,,L.,.Mch +0203\VVV\VVVVVUVVVVVVVVVUUVUUUUUUUV3244443344333333333333333333333333333333332222232022022000000000000000+++0+0+++++++++*3M::::033::3:3:03:2:0333M:200000+&&&& l           ! !! !  [   ! @@!! !; !  !!;     @@#Y YY9Y ; _[  pSSSSSSSSSSSSNNSSNNNSSSSSSSNSNNNSSSSNNSNNNNNSSNSNSNSSNNNSNNSNSNNNNNSSNNNNNNNNNNNSNNNNNNNNNSNNNSNNNNNNNNLNNNNNNNNLNNNNNNNNNLNNLLLNNNNLLNNNNNLLNNLNLNNLLLLNNNNLLLLLNLLLNLLLLLLLLLNLLLLNLLLNLLL,LLLLLLLLLLLLLLLLLLLLL,L,LLLLLLLL,LL,LLLLLLLLL,,,LLLL,,,,,L,,,LL..Whh  00200000000000000000000000000000000002444434433333333333333333333333333333233322322230220000002020020020+0++++0++++++++++*&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&p   !     !      _тB9!  ! 9@_@ ! 9@ !  #_Y    ; ;_  Y  ;  _[ vSSNSSNSNSSSSSSSSSSSSSSNSNSNSSNSSNSSSSNSNSSNNNNSSSSSNSSSSNSSNNSSNNNSSNNNSNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNLNNLNNLLNNNNLNNNNNLNNNNLNNLLLNLNLLNLLLNLLNLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL.L,LLLLL,LLLLLLL,L,L,,L,LL,,..,LL,,,,,,,,,,LMb+000002000020202020000200000200000+00222O22222222222222222222222222222222222223*2222022+22222+3+++0002++0++++++++++++++++*&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&o  !        ! !      [‚_[ZY[!  ! ;˄[@;;;Yf_  [ Y_#@# ; [ oSSSNSSSNSSSSSSNSNSSNSNSNNSSSSSNSSNNSSSSSSSSSNSSNNNSSNNSSSNNNNNNNNNNSSNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNLLNNNNNLNNNLLNNNNNNNNNNNNNLNNLLNNNNNLLLLLLLLLNLLLNLLLLLLLNLLLLLLLLLLLLLLLLLLLLLLLLLLLL,L.LLLLLLL.LLLLLLLLLLLLL.LLLL,,LLLLL,L,L,.,.LL,,L,,,,,,,L,,,,,,Ug"""""""""""""""""+000000202+02002230000020000000+0000+++&&&&&&&&&&&&&+++&(&&&&(+&(++++&(++&(&&&&&&&&&&&&&((&&&((&&&&&&&&&&&&(&&&&&&&&&++&++&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&l          !!       ;_!   ! @      Y#Y@ _[ v""""""""""""""""""""""""""SSSSNSSSSSSSSSSNNSSSSSSSNNSNSSNSSNSNNNNSSSSSSNSNNNSNNNSNNSSNSSNNNNNNNNNNNNNNNNNNNNNNNNNNNLNNNNNNNNNNNLNNNNNNLNNNLNNLLNLNNLLNNLNNNNNNNLLLNLLNNLLNNLNNLLNLLLLLLLL,LLLLLLLLLLLLL.LLL.LLLLLLLLLLLLLLL,LLLL,LLLLLLLL,,LLLL.LLLL,,,L,L,L.,LL.LLL,L,,,,,L,,,,,,,,,,,,,,.,/Whhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhggghghghghdhghhghdghhdddgggdddhgdddddhdddddddddddddddddddddgddgddddddddccb++20002+03+003000+020200020000000+0+0++&+&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&+bccddcccddddddddddddddghddggdddddhddddddddddgddddddddddddddddm           !       ;    ;_  #; Y ;@ @[    phhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhSSSNNNSSSSSNNSNNNNSSSNNNSSSSSSNNNSSNNNNSNSSNSNNNNNNNNNNSSSNNNNNNNNNNNNNNNNLNNNNNNNNNNNNNNLLNNNNNLNNLLLLNNNNLLLNNNNNLNLNNNLLLNNNNLLNLLNLLLLLLNLNLNLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL,LLLLLLLLLL,LLLLLL.,LLLLLLL,LLL,.,.L.LL,L.,,,L,,,,LLLLLL,,,,,,,,,,,,,,,,,,,,,,,.,.Mghhdcdddgdddgdggggggfggfgaggfggfggddgggeddgffggfggegggggccddcdccccdcdcdddcdddddcccddddddcccccdcccddcdddddddddcccddddddddcddddcccdddddddcggggggggggggcggggggggggggggggggggggggggcgdgddddddggghhhhhhhl           !  !!  @[  #Y ;@ Y@@  @_ [  pSSNSSSSNNSNNNSSSSNNNSSSNNNSNSNSNNNNNSNNNNSNNSNNNNNNNNNNNSNNNSNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNLNNNLNNNNNLNNNNLLLNNNNNLNLNLNNLLLLNLNLLNLLLLLLLLNNLNNLLLLNLLLLLLLLL.LLLLLLLLLLLLLLLLL,LLL,,LLLLLL,LLL,,LL,LL,L,L,,L,,..L,L,LL,,L,,,,,,LLLL,,,,,,,,,,,,,,,,,,,,,,,,,,/Ughhhhhhhhhhhhhhhhhhhhhhhhhhhhhho !   ! ! !    ! Y[! !!! !! !; !   9# Y  [ @  [   !}NNSSSSNNNNNNNSSSNNSNSNNSNNSNNNNSNNNNSNNNNNNNNNNNNNNNNNNNNNNSNNNNNNLNNLNNLNNNNNNNNNNNNLLNNNNNNLLLLLNNNNLNNLNLLLLNNLLLLNLLLLLLLLLLLLLLLNLLLLLLLLLLLLLLLLLLLL.LLLLLLLLLLLLLLLL,LLLLLL,.,,,,LLLL,L,L,,L.LL,,,LL,,,,,.LL,,,,,,,,,L,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,-Whhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhs            Y[   ;[    a  YY#Y @  [ wNSSSSSNSNNNNNSSSSNSNSNNSNSSNNNNNSNNSNNNNSNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNLNNNNNNNNNLNNNNNNNNNNNLLLLLLNNNLLLNLLLNLNNLLLLNLLLLLLLNLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL,LLLLLL,LLLLLLLLL.LLL,,,,,,LLLLLL,,,,L,LL.,,,L.,,L,,,,,.,,,.,,,,,,,,,,,,,.,.,,,,,,,,,,,,,,,,,,,,,,-\hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhs            9Y[;  !  ;Y   [ [[#  @ [ @@  _[    }NSNSSNSNNNNSNNSSSSNNNNNNSNSSSNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNLNNNNNLNNNLLNNNLLLNLNNNNLLLLLNNLNLNLLNLLNNLLNNLLLLLLLLLLLNLLLLLLLLLLLLLLLLLLLLLLLLLLL,LLLLL.LLLL,LLL.,,.L..LL,,,.,,,,LLL.,,,,,L,,LL,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,.,,,,,,,,,,,,,,,,,,,,,,,,Whhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhs  !      ! 9[ĕ_;    ! !    [ā#   ##99;9  ;#   ####;# 9#;#99# 999;9##  Y @;#[  !  $NNNNNNNNNNNNNSNNNNNNNNNNNNNNNNNNNNNNNNNNNNLNNNNNNNNNNNNNLNNNNNLNNLNNLNNNNNLNNNLLNNNLNNLLLLLLNLLLLLLLLLLLLLLLLLLLNLLLLLLLLLLLLLLLLLLLLLLLLLLLL,,LLLLL,LLLLLLLLLL.LLL,,LLL,,L,,,,,,L,,,,.,L,,,L,,,,,,,.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,Thhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh}!            ! !        ;;@@;;#    =NNNNNNNNNNNNNSNNNNNNNNNNNNNNNNNNSNNNNNNNNNNNNNNNNNNNNNNNNLNNNNNLLLNNNLNLNNNLNNLLNNNLNLLLLLLLLLLLLLNLLLLLLLLLLLLLLLLLNLLLNLLLLLLLL.LLLLLLLLL,LL,LLLLL,,LLLL,L,L.LLL,,,,LLLL,,,,,,,,,,.,,,L,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,0dhhhhghggdggdddddgdgcggccddccdccccgccgdccgcddccdgccccdcdcccccccccdccccdccccccccccccccccccccccccccccccccccccchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh=     !     ?NNSSNNNNNNNNNSNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNLNNLNNLLLNLNLLLLNLNNNLLLNNLLLLLLNLLLNLLLLNNLLLLLLLLLLLLLLLLL,LLLLLLLLLLLLLLLLLLLLLLLL,LL,,L,,L,,L,,L,L.,LL,,,LL,,,,,,,,,,,,.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,WhdggdgccccccbbbbbXXbXbXbXXbXXXbXbXXXbXbbXXbXbXXbbXbXbXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhC  !                     lNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNLNNNNNNNNNNNNNNNNNNNNLNNNNNNNNLLLLLNLLLLLNLNLLLLLLLLLLLLLLLLLLLLLLNL.L,LLLLLLLLLLLLLL,LLLLLLLLLLLLLLLLLL,L,LLLL,LL,,,,,,L,L,,,,,,L,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,bdcdddccccccbbbbXXXXbXXXbbXXbXbXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhm            !    !       ! oNNNNNNNNNNNNNNNNNNNNNNNLNNNNNNNNNNNNNNLNNNNNNNNLNNNNNNNLNLNNLLNLLNNLLLLLLLLLLLLNNLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL,LL,LLLLL,,LLLLLL,,,LL,,L.,,LL,,,,,,,L,,,,,.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,Wbccccbcbccccccccccccccccccccccccbccccbbcccbcccccccccccccccbbbbbccccccbbbbcccbccccbccbbcbbcbbbbbbbcccbbbcbbccbcbbbbbhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhghhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhp           !wNNNNNNNNNNNNNNNNNNNNNNNNLNNNNNNNNNLNNNLNLNNNNNLNLNNLNLNLNNLNLLLLLLNLLLLLLLNLLNLNLLLLLLLLLLLLLLLLLLLLLLLLLLL,L,LL.LLLLLLL,,L,,L,,LLL,,,,L,,..,LL,L,,,,,L,,,,L,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,-XhchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhbbbbbbbXWWWWWWWWWWXWWWWXWWWWWWXWWXWWWUUUUUUUUUUTUUTU::::::U:T:::TTTTTTTTTTTTTTUghhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhs$!    =NNNNNNNNNNNNNNNNNNNNNNNNLLNLNNLNNNNNLNLNLNNLNNNLLLNLNLLLNNLLLLLLLLLLLLLLNLLLLLLNLLLLLLLLLLLLLLLLLLL.LLLLLLLLL,.L,,L,LLLLL,L.,.,,,,.L,L,,,.,,,LLL,,,,,,L,,,,,,,,,,,,,.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,-MUWWWWWWWUUWUUWUUchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhW-,ThhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhgggggggggggggdggggggggggdgggcccggcgggcggcccggccgccccccccccccccccccccccbbbbbbbbXbbbbbbbbbbbbXbbbbbbbXbXbbbbXbb=                 >NNNNNNNNNNNNNLNNNNNLNNNNLNNNNLLLNNNNNLNNNLLLNNNNLLLLLNLLLNLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL,LLLLLLLLLLLLLL,LLLL,,L,L,,,.L,LL,,LL,,L,.L.,,,,,,,,,L.,,,,,,,,,,,,,.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,bhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhU,bhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhW------------------------------------,-----------^C                     of\\\\W\Wb\\\\\\\W\\WXX\\bW\X\W\\\\\\WW\b\\\WNNNNLNNNNNNNNNNNNNNNNNNNNNNNNNNNNNLLNLLNNLLNNLNNLLLLNNLLLNLLLLLLNLLLLLLLLLLLLLLLLLLLLLLLLL,LLL,LLLLL,LL.,LLLL,,LLL,L,,L,,,,,LL,,.,..L,,,,.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,bhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhUghhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhcVq     !}U...,-....LL....,.L..,LL.,..L,.L,.LLLLL.-...NNNNNNNLNNNNNNNNNNLLNNNLLLLNNLNNNNLLNLLNNLLLLLLNNLLNLLLLLLNLLLLLLNLLLLLLLLLLLLLL,LLLLLLLLL,L,,LLLLLLLL.,.L..,,,,LL,,L,L,,,.,.L,,,,,,,.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,-bhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhU,,,WhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhM}$      =/,,L,-,LLLLLLL,,LL,,--LLLLLLL,LLLLLLLLLLLL.LNNNNNNLNNNNNNNLLNNNNLLLLLLLNLLNLLLLLLLLNLLLLLLLLLLNLLLLLLLLLLLLLLLLLLLL,.LLLLLLL.LL,,LLLL,L,,LLLL,L,,,,,..,.,,,,,,,,L,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,-chhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhU,bhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhXC        l.,L,LL,L,LLL.LL,L,LL,,,LLLLLLLL,LLLLLLLLLLLLNNNNNLNNLLNLLLLLLLLNLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL,LL,,LL,LLLL,L,,LL,LL,LL,,,.,,,,,.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,bhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhUTghhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhc^w!         $\.,,,,L,L,.LLLLL,LLL,LLLLLLLLLLL,,LLLLLLLLLLLNNNNLNNNNNLNLLLLLLNNLLNNLLNNNLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL.LL.LLL,LLLL,L,LL,,L,,L,.,,LL,,L,.L,.,,,,,,,L.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,DD,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,bhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhUWhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhU:=    ?P,,,,LLLL,,LL,,,,,L,LLLLLLLLLL,L,LLLLLLLLLLLLNLNLLNNNLNLNNLLLLLLNLNNNLLLLNLNNLLLLLLLL.LLLLLLLLLLLLLLLL,LLLLLL,LL,LLL,,.L,LL,L,,.L,LL,.,L,.,.,,L,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,-bhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhU,-chhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhc-l   p/,,,,L,,,L,.LL,,L,LL,L,,LL,,LLL,,LL,LLL.,LLLLNLNLLLLLLLLLLLLNLLLLNNLLLLLLLLLLLLLLLLLLLLLLLLLLLLL,LLLLL,,LL.L,LLL.,.LL,,LL,L,,,,LL,LL,.,,,,,,,,,,,,,,,,,.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,-chhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhU,MdhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhgM=    >a,,,,,,,,,,,,LLLL,,,LL,,,,LL,,LL,LLLLLLLL,LLLLLLNNLLLLLLNNLLNNLLLNLNLLLLLLLLLLLLLLLLLLL.LLLLLLLLLLLL.LLL,LL,,,,,,,,,L,,LLL,,.,,.,,,,,,,,,,,,,,,,,,.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,-bhhhhhhhhhhhhhhhhhddhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhghhhhhhhhhhhhhhhhhhhhhhhhhhhhhU,,Xhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhb-[l    v\,,,,,,.,,,,,,.,,L,,,,L,,,,,L,LL,LLLL,,,,LLLLLNLNLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL.LLL,,LLL,L,,,L,,LL,,,,LLLL,,,,,,,,,,,,,,,,,,,,,,.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,DD,D,,,,,,,,,,,,,,,,,,,,,,,,,-bhhhhhhhhhhhhhd[@=$$=@ZdhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhfYBYBBBBYZYY[h[AZhhhhhhhh[=AhhhhhhhhUchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhgM0}=     >/,,,,,,,,,,,,,,.,,,,,,,,,,L,,,.LLLL,,,,,LLLL,LLLLLNLLLLLLLLLLLLLLLLLLLLLL,.LLLLLLLLLL,LLLL,LL.,LL,LLL,.,,,,,.,L,LL,,,LL,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,DDD,,,,,,,,,,,,,,,,,,,,-bhhhhhhhhhhhh_@=$$$=[hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhd==7$$$=YhBBdhhhhhhh[=hhhhhhhhUUhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhWo    !v`,,,,,,,,,,,,,,.,,,,,,,,,,,,,L,,,LL,,,,,L,,LL,LLLLLLLLLLLLLLLLLLLLLLLLLLLL,L.LLLLLL.LL,LL,LLLLL,LL,,,,,L,L,,,,,,,,L,,,,,,,,,,,,,.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,D,,,,,,,,,,,,,,,,bhhhhhhhhhhdZ7=Zbdd_Y>>_hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhfdhhhhhhhhhhhhhhd_[[[A$Z[[_dhBBdhhhhhhhY=hhhhhhhhUbhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhc-U=    >U,,,,,,,,,,,,,,,,,,,,,,,,,,,,L,,,.L,,,.,,,LL,,LLLLLLLLLLLLLLLLLLLLLL,LLLLL,,,LLLL,L,L,,L.L,,LLLL.L,,.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,DD,,,,,,,,,,,,,,bhhhhhhhhhhY$BdhghhhhddhghhghghhhhhhhhhhhhhhhhhhhhhhhhhhhhhhB=[hhhhhhhhhhhhhhhhhhhZ>hhhhghBBdhhhhhhh[=hhhhhhhhUdhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhg:p!     !q/,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,L,,,,,,,.L,L,LLLLLLLLLLLL,,,LLLLLLLLLLL.L,LLLLL,,,,,,,,,L,LLLL,.,,,,L,,,,,,,.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,bhhghhhhhh_=BdhhhhghhhhhghghhhhhhhhhhhhhhhhhhhhhhhhhhhhhghhdA[ghhhhhhhhhhhghhhhhhZ=hhhghhCAfhhhhhhh[>hhhhhhhhUWhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhb-C    l\,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,L,,,.,LLLLLLLLLLLLL.LLLLLLLLLLLL,LL,,L,LL,LL,,,,,L,,,L,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,DD,,,,,bhhhhghhhh>BdhhhhghhhhhhhhhhghhhhhhhghghhhhhhghghhghhghhhghhdddhhhhghhhhhhhhhhhhhhZ>hhhhggBBdghhhhhg[>hhhghghhU-bhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhgM:}$     =}M,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,LLLLLLLLLLLL,LL,LL,LLLLL.L,LL.,L,L,,,L,,,.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,bhhhhhghh__hhghhhhhhhhhhhhghgddddhhhhhddhhdd^dhhhhhddddghhhdddhhhdddhhhhddhhhhhhhZAhhhhhhCAdhhhghhd[>hhhhhghhUghhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhX-p!     !qa-,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,LLLLL,,L,,L,,,,LL,L,,.LLL,,,LLLL,LL,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,bhhhhhhhgZ>dhhhhhhhhhhhhhhhhfZC>>AZ_hhhA>[_Ahhgd[A>>A[gghZ>ZhhdZAZfhh[ABdhhhhhh[AhhhhhgZAdhhhdhdhZ>dhhhhhhgUWhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhdUl   l:,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,LLLL,.LL,,L,,L.,,,L,,,L,,,.L,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,D,,,,,,,,bhhhhhghdAChhhghgghghgghhhhAAA_gd>>>dhhhZAAAdgdAAggh_=Zd_[hghghgg[AgghhhdZ>>>>>dhghghhgT,chhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhW->     ?a-,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,LLLL,LLL,L,.,L,,,,,,LL,,,L,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,DIID,,,,,,,,,,,,,bdgghgghd>ZhhghhhgghggghghdAA_dddZ_dZdddggd>ZddddhgdBBhggdZ]>ZdhggdhhhZAgghghhBdgghhgggUMghhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhc-V}>         =U,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,LL,,,,,,,,L,.,,,LL,,,,,.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,DID,D,,,,,ID,,,bhghgghgfAZghggghgdhhggghh_>_hhgggBZd[gghhggd>BdhghghdABhghhdA>aghghhghg[?dhghhhBA_d_d_d_dZdhghgghgUWhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhgM-w$  =}f-,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,L.,,,,,,,.,.,,,,L,,,,,,,,,,,,,,,,,,,,.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,DDIDDID,D,,D,,,,bggggghgdAAhggggghgggghghhZBdhgghhd>dAdggghggdBC[^dhgdABggggh_[ghggghghg]?dghghdZAdgggghhdZdhgghggdUchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhXUq$ =sU,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,LL,,LL,,,,,,,,,,,,,,,,,.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,IIIIIIIIDDDDDDDDDDD,,,bgdghdhghZcghhhgggdghhggdBZdggggga>a[ghhgghhhdAZdhdABghggg^>_hhghgghhg[AdhggggBAdgghggghZdgghghggUMghhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhd-p!       =qa-,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,DIDIIIIDDDDID,,,,,bggdgggghdCdgghgggggdhdgdBAgggdhg[AcZhdggghgghdZ>[gdAAggdgdCAdgdghgggh[AddhdgdZAdhghggghZdgcgghggUXhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhX:p$         =}M,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,.,,,,.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,DDDDIIIID,,,,,bdgggghgghYZdgdhgggddddggZfddhgdBBdZdhgdgghgdgggdAZhdABdgdh[ZZhddggggd]?dggggdBCdgggdggg]dhhgddhgUchhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhb^w=>}\,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,.,,,,.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,IIIIIIDD,,,bggddggcdgdCA[dgdhddZ>ZdgC^cdcZ_dZdgddddhdB[ddd?ZgdCZdggd>AcZ_ggdgdggZ?dgggggZAdcgddghg]>dggdddgdUUhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhT}>>}0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,DDDDIIIIID,,,,bgggggdcdgddBAZZZA>Acgd_AAZhdZdgdddddZA>_ddAZdddB>_cc?AdcdggdgZCdgdggdZCddggggggZ?dggdddgdU-bhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhbVl     !l:,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,DIIDII,,,,Xcdgdddddgggc[>>>Zcdggd_?>?_dgd>]dddcddd_Z>?[dcdC>Zcc_Zccd_>>ZgdggdgZ?ddgggdBjCdggggggdZ>ddgdccddUghhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhgMfפp$!    =|^-,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,DIIIIbdgddcddcdhggdc]ZtCBZZadgggggdd[__dggdd[_^cdcdccdcc[][addcc[Z_dh[__ddgcd__[dcdddd_[_dddddd_[_dggggggda[_cdcgdcccU:hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhW0w>   >}ߓ0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,DDII,,,XdcgdddddcddccddddcddccdccccddcccgdgdccddccdddgggcdddgdcddddcdddcddddgddcddgdcddcdcddccdcdcdgcgdcggdcddcccddgcgggcUbhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhc:Ҁp=    =p:,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,DIIDbccdccdcdcgdccccdcdcccdccccggdcdddcdcgcgdcddcdgddccccgccdcddcddgdccdccccdccdcdccggdcgccdcdcchdcdccddcddddcdccgdgdcUghhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhU^}l!    !l}V,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,DDIDDIDIDDDDD,,bcdcccdcdcdcdcccgccdcdcdcdcccdgcddggccgccdcdcdcccdccgccccgdcdcdccccccccdcccdcdccgccccdcdcdddcdgcgcddddcdcdcccdccccUUhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhc--ӐvC$          !?|^-,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,IIID,DDDDXcdcccdcdcdccddcdccgcdccccdgccccccgdccdcdccccdcdcdcdcdcdcccccddccccccdcdcdcdcddcdcdccdccdcdddcdcccgdcccdcdccccccccUbhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhgMӤ}l$    $C}ٓ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,DDDDD,II,,XcdcccdcdcdgcdddcccdcdcdccdgccdgddccccdccdccdcddcddccdccddcdcdcdcccdccccdcddccccdcdcccccdcdcdcdgdddccccdcddcccdcccUTghhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhb:Ӓ}o>    !?p}M,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,DDIIDIDD,XcdcdcccdcdcccdccdcdcdccdccccdcccccdcccgccdcccdccccccdcccdcccdcdcccdccccccccccccccccccddccdcddcccccccccdcdcdccgcccT     WhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhgU٧vl>$    $=l|:,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,DIIIXcdcdcccdcdcccdcdcddcdccdccdcccddcccdccdccccccccdcgcccdccdcccccdcccdccdcgccccddcdcccdccdccccdcccdccccddccdccccccccT chhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhWVך}p?=$     !$>lpV,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,DIDXcdccdccdccdccdcdccgcdccccccccccdccccccdccddcccddcccccccdccccccdccccdcccccccccccccdccdcccccccccccddcccdccdccccccccT  UhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhcVҚspplC>>=>====>===========>>>>>>>>>=>>>========>>=======>>==>======>==>>==>>=>==>>>==>=>>==>>==========>===>>=====>==>>>=====>==>>>===========>==>>>>=>=>>==>===>======>>>===>>=====>======>=====>==>>===>>=====>?====A>=>==>A>==>================>=>>======>=>>=>===>==>==>=====>>>>=>>=====>>>>>===>=>>>>===>===>>=>>>=====>>=====>>>>====>=>=>==>>==>A>==>>>==>A>=========>===>==>===>=>>>>>>>==>A>=======>>=======>>>==>======>==>===>=====>A>=>=>>===????llv|}V,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,DDDIIDIXcdcdcccccdcccccdcccccccccccdccccccccccccccccccccccccccccccccccccccccccccccccccccdcccccccccccccccccdccccdcccccccccT bhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh:-^׬V,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,DDIIIDDIDXcdccc# ;cccT    dhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhb-^\-,,,,,,,,,,,,,,,,,,,,,,,,IIIIIDXccdccbXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXbcccT   Uhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhf-^V-,,,,,,,,,,,,,,,,,,,,,,DIIIDDDIDDD,,XcccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccT -bhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhgVVߗU,,,,,,,,,,,,,,,,,IDDDDDDIIIIDD,,XcccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccT   dhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhc VٛU,,,,,,,,,,,,,,DDIIID,DIIDD,DIIDDIXcccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccT WhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhW:ٖ:,,,,,,,,,,IIIDIIIII,DXcccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccT -bhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhc- f0,,,,,,,,,IIID,DXcbcbcccccccccccccccccccccccccccbcccccccccccccccccccccccccbcccccccbcbcccccccccccccccccccccccccccbcccccccccccccccccT  ghhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhg      ^b-,,,DIIID,IID,ID,XccccccccccccccccccccccccbbcccbccccccbcbccccccccbbbccccccccccccccccccccccccccccccccccccccbbcccbccccccbcbccccccccccT  WhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhX  VمU,---,,,,,,,,,,,,DDIDXcccccbcccccbcccccccccccbcbccbccccccccbcbccccbccbbbcccccccbcccccccccccbcccccbcccccccccccbcbccbccccccccbcbccccbccbcT  -chhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhd ʂ,,,,-UXbbbKKKKJJJH--,--,,,,,,IDD,,,XcccbcccbbbbXXcccccbccccbbbcbcbbbcbcbcbbcccbbcccccccbcccbcbbcbbcccccbcccbbbccbcccccbccccbbbcbcbbbcccbcbbXbcbbccccbT TdhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhW  -VזV-,-UbXXXcb,,,,,,Xccbcbccbbb@@@@YcbccccbccccccccbY@@bcX@@@bY@@YbcbccbccccbbbccbXbcccbcbccbbbccbcccbccccbccccccccbccccbbbcBXcbccccbbT  Xhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhb    ^0,MXXXXbbg,,,,,XbcbbbcbbbYYbb[@bccbcbbbbbcbccbb@[bbc@XbYY;Yb@YccbbbccccbbbbYbYbbbccbbbcYbbbbbbbbccbcbbbbbcbccbbcbbbcccb@XbbbccccbT   chhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhT   -:ʅ:,,WXXXbXbcKb,,,,Xbbcbbbbbb@bcbb@BYcYXbBBb[B@bbbY;@BYb@bb[@@bcYYccbY@@YbbY@B@@bYbYBYcYB@Y=Yb@BbXbbX@YbbY@YYBBYXXYcY@YbbY@=XbbbbbccbT Tghhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhb       ^ӛV--XXXbbXbc,,Xbbbbbbbcb>Xbbb@Y@Y@X@YY@Y=YbbbY=YbBY@bb[@@Xb@Ybbb@YY>Y@XY;@@b@Y@[@Y@YY@=YX9YbbbbB@[bBYY@=BXX@YYY@Y@YY@Y>YbbXXbbbbT XhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhgM     [ӔY,,bXbbbbbb:,,Xbbbbbbbcb@YXbYAbY=Yb=@@YY@bbbbX@Xb@YBYbYB@[b@Ybcc@YcBY@bb@@Bb@@=@@X@YX@@XbY@XbbcY@@X>@@BAYbXA>[Y=B@Y@YbBYbbbbbbbbT  dhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhX           XʖVbbbXbbbdUXbbbbbbbcbb@B@@YbX;XX@@@YY@bbXbbY@@@bb;@>XYA@BbbXb@@BBb@@@>@Yb@Y@BBbBXY@@bXB@Ybbb@@@XY>@@@YbbY@bX@BBbY>B=YbbbbbbXbTUhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhc          YǂV-,-bXbbbbcgT,,,,XbbbbbbbccbbYYbbbbXbXXYXbbbbbbXbbY[bbbbYXXbYYbbbXb@YYbbbYYXXbbXbbYXbXbb[bbbY[bbbXXXXXXXYbbbbbXXbbbYbXbXYXXbbbbbbbbT  -bhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhU              -:^Ǜ^-Ubbbbbcg,,,XbbbbbbbbbbbbbbbXXbbbXbbbbbbXbXbbbbbbXbbXXbbbbbbbb@XbbbbbbbbXbbbbbbbbXbbbbbbbbbbXbXbbXbXXbbbbXXbbbbbbbbbXXbbbbbbXbT  ghhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhb           -Vʗa:-,Xcbccc,,,,,,XbbbXbXbbbbbbbbbXbbbbbXXbbbbXbXXbXXbbbbbbXbbbbbbbbbbXbbbbXbbbbbbbXbbXbXbbbbbbbXbXbbbbbXXbbbbXbXbbXbbXXbbbXbbbbbbbbT  VhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhdM        :^ʝ^:Xbcc,,XXXbXbXbbXXXbbXXbbbbbbXXbbbbbbbbXXbXbXbbbXbXXXXbbXbXbbbbXbXbXbbbbXXbXbXbbXXXXXbXbbbbbbXbbbbbbbbXXXXbbbbbbXbXbXXbbbT chhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhb          Vaǖ^U,F,,KKJKM,XXXXbXXXXbXXXXXXXbbbbbXbbbXbbbbXXXbbbXbbbbXXXbXXXbXbbbbbbbXbbbXXXXXXXXbXXXXXXXXXXbbbbbXXbbXbbbXXXXbbbbbbbbXXXXXXXbT     Tdhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhg                  :V_ǝ^U",,-----J--,,XXXbXXXXbXbXbXXXXbbXbXXXbXbXbbXXXXbXbbbXbXXXXXbXXXXbXbbbXbXXXbXXXXXXbXXXXbXXXbXXbXbbXXXXbXbXXbbXXXXbXbXXbXXbXXbXXXT  XhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhW                    -0:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::":::::::::::::::::::::::::::::::::::::::::::::::::::::::::::":^hhfddac[XXXXXV@TVV;V;;T@@VV:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::M--,,,,,XXXbXXbXXXXXXXXXbbXXXXXXbbXbXXbXXXbXbXbXbXbXXXXXXXbXbbbXXbbbXbXXXXbbXbXXXXXXXXXXXXXXXXXXXXXbXXXXbXbXXXbXbbXXXXXXXXT  chhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhc                         XghhhhhdccXXTTTTT,,XXbbXXXXbXXXXXXXbXXXXXXXXXbXbXXbXXXbXXXbXXXXXXXXXXXXbXXXbXXXXbXXXXbXbXbXXXXXXXXXXXXXXXXXXbbXXXXXXXXbXXXXXXXXXXbXbXT Thhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhg:                            XghhhhdccbXXXTT,,,,,,XXXXXXXbXbXXXXXXXXXXXXXXXXXXbXXXXbXXXXXXXXXXXbXbXXXXXbXXXbXXXXXXXXXXXXXXXXXXXXXbXXXXXXXXXXXXXXXXXXXXXXXbXXXXXbXXXXT  bhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhb                                    -XghhhdccbXXXTT",,XXXXXXXXXXXXXXXXXXXXXXXXXbXXXXXXXXXXXXXbXXXbXXXXXXXXXXXXXXXXbXXXXXXXXXXXXXXXXXXXXXXXXXTXXXXXXXXXXXXXXXXXXbXXXXT   chhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhd                             -XhhhgccbbXXTTTTUWWTTTXXTFFTWXXXXXbXXXXXXXXXXXXTXXXXXXXXXXbXXXbbXXXXXXXXXXXXXXXbXbXXXXXXXXTUXWTTXXXXXXXWXXXXXXXXXXXXXXT WhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhW                               XhhhggdbbXXXTT,TTXXUTTTXXXXXUTTXXXbXXXXXXXXXXXXXXXTTTXXXXXXXXUFUXXXXTXT   -bhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhd                                        -bhddcbbXXXTTT,,,FTXXXXXXXXXXXXWFXXXXXUTXXX   ghhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhU                                                          -bhhddcbXXXXTTT,, Uhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhc                                                        -bhhhcccbXXXTT",   bhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhg                                                   -chdccbbXXXTTT,     MdhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhX                                                    -chhhgccbXXXTT""""",      Xhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhg                                                         -chhhccbbXXUTT""T,   chhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhU                                           -chhhgcbbXXUTT""",      Tghhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhc                                                           -chhgdcbXXXXTT"T"",,          Xhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh:                                                         -chhhcccbXXVTT"""T,            chhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhb                                                          -chgdcbbXXTUT"""",,,              Thhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh                                                           chhdccbXXXXTTT,           bhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhX                                                                    -chhhdcbbXXXTT",              dhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhg                                                           -chhgdcbbXXTTT""T"T",                Xghhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh:                                                                 -chgggcbXXXTTT""              bhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhc                                                           -chhgdccXXXXTT"""                    dhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhgM                                                            -chhhcccbXXXTTT"" ,,,             Xhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhb                                                                         -chhhdccXXXXTT"T"                 chhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhg                                                                         -chhhdcbbXXUTT"TT"               ThhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhU                                                                    -chhdccbbXXUTTT""                                Xhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhb                                                                        -chhhccbXXXTTTT""""                  dhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhg:                                                                chhhgccbXXTUT"",-------,------------,-------------------------------,---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------Uhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhb----------------chhddcbbXXXTT"""""--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------,----------------------------,------------,---,--,-----gcdggggdggcdggggggggggdgcggcgggdggggggccggggggggggcgggggcgdcgggcgggcggggcggcggggdggggggcggcgggggccggcggcgggggdgggggggggggggggggggggggggggggggcggcgcgcggcggggggcgggccggcgdgggggggcggggcgggcgggggggggdgggcgdgcgggggcgcggggggggdgcgggcdggggggggggggggcgggdcdggcgcgggddggggggggcggggggcgggggdgggggggggggggggggddggcgggdggcgdgggggggggdgdgggggggggdggggcdgggdghggggddgdgggggggggggghgddgggggdggggddgggggchggggggggggdcgggdggdggggggdgggggdgggggggcdggghhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhgggggggggggggggddcdggddgchgggggggggggggdgghgggggggchcggggggggggggggggggdgggggdcdgggddggghggggddggggggggghggdgggggghggddggggdghgggdcdgggddgggggggdggggggggggdgggggghcdggggggddggddgggggdggggddghgdghgggggggggggggdggggghggggggdgggggdggggggdggddggggddggggddgdggggcgggggdggggggggcddggddgggdgggghgddgggggdggggggdggggcggggddghhhddbXXXXTT""cgddcggcggcgggggggdcggdcdcgcgcgggddgggggggccggggggcgggggcggggggcgggggggggggggggggggcgggdgcgggggcgggggggcgggcggcggcggggggcgcgggggcgggcggcgggggcgggggggggggggggggggggggggcgggggcgdcgcgcggggggggcggggcggdggcgggcgggcgggccgggcgggggggggggggcggdgggggggdgggggggggggggghgggdgggggggggggggggggggggggcgghhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhccccbXXTTT""""ThhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhgccbXXXTTT""TThhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhbbcbcbbbbbbbbbbbbbbbbbbbbbbbbbbcbbbbbbbbbbbbbbbbbbbbbbbbbbbbcbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbcbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbcbbbbbbbbbbbbXbbbbbbbbbbbbbbbbcbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbcbbbbbbbbbbbbbbbcbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbccbbbbbbbbbbbbbbbbcbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbcbbbbbbbbbbbbbXbbbbbbcbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbcbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbcbbbcbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbcbbbbbbbbbbbbbbbbbbbbbcbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbcbbbbbbbbbbXbcbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbcbbbbbbbbbbbbbbbbbbbbbbbcbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbcbbchhhhgccXXXXTT""TbbbbbbbbbbbbbbbbbbbbcbcbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbcbbbbbcbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbcbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbcbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbcbbbbbbbbbXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXbhhhgdccbXXXTT""XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXbXXXXXXXXXXXbXXXXbXXXXXXXXXXXXXXXXXXXXXXXXXbXXbXXbXXXXXbXXbXXXXXXXXbXbXXXXXbXXXXXXXXXXXXXbXXbXXXXbXXbXXXXbXXXXXXXXXXXXXXXXbXXXXXXbXXXXXbXXXXXXXbXXXXXXXXXXXXXXXXXXXXXXXXXbXXXXXXbXbXbXXXXbXXbXXXXXXXXXXXXXXXXXXXXbXXXXXXXXXXXXXXXXXXXbXXbXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXbXXbXXbXXXXXXXXXXXXXXXXXXXXXXXXXXbXbXXbXXXXbXXXXXXbXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXbXXXXXXXXXXXbXXXXXXXXbXXXXbXXXXXXXXXXXXXXXXXXbXXbXXXXXXXXXXXXXXXXXXXXXbXXXXXXXXXXXXXXXXXXXXXXbXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXbXXbXXXXXXXXXXXXbXXbXXXXXXXXXXXXbXXXXXXXXXXXXXXXXbXXXXbXXXXbXXXXXbXXXXXXXXXXXXXXXXXXXbXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXbXXbXXXXXXXXXXXXXXXXXXXXXbXXXbXXXbXbXXXXXXXXXbXXXXXXXXXXbXXXXXXXXXXXXXXXXXXXXXbXXXXXXXXXXXXXXbXXXXXXXbXXXbXXXXXXXXXXXbXXbXXXXbXXXbXXXXXXXXXXXXXXXXbXXXXXXXXXXXXbXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXbXXXXXXbXXXXbXXbXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXbXXXXXXXXbXXXXXbXXXXXXXXXXXXXXbXXXXXXXbXXXXXXXbghhhcccbXXXUT""T""XXXXXXXXXXXXbXXXXXXbXXXXXXbXXXXXXXXXXXXXXXXXXXXXXXXXXbXXbXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXbXXbXXbXXXXXXXXXXXXXXXXXbXXXXXXXbXXXXXXXXXXXXbXXbXXXbXXXXXXXXXXXXXXXXXXXXXXXXXbXXXXXbXXbXXbXXXbXXXXXXXbXXXXXXXXXXXbXXbXbXbXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXbXXXXXbXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXbXXXXXXXXXXXXXXXXXXXXXXXbXXXXXXXbXXXXXXXXXXXXXXXXXXXXXbXXbXXXXXXXXXXXXXXbXXXXXXXXXXXXXXXXXXXXXXbXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXbXbXXXXXXbXbXXbXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXbXbXXXXbXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXbXXbXXXXXXXXXXXXXXXXXXXXXXXbXXXXXXXXXbXXbXbXXXXXXXXXXXXXXXXXXXXXXXXXXXXbXXXXXXXXXXXXXXXXXXXXbXbXXXXXXXXXXXXXbXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXbXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXbXXXXXXXXXXXXXXXXXXXXXXbXXXXXXXXXXXXXXXXXXXXXXXXXXbXXXXXXXbXXXXXXXXXXXXXXXXXXXbXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXbXXXXXXXXXXXXXXXXXXXXXXXXXXXbXXbXXXXXXXXXXXXXXbXXXXXXXXbXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXbXXXXXXXXXXXXXXXXXXXbXXXXXXXXbXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXbXbXXXXXXXXXXXbXXXXbXXXbXXXXXXXXXXXXXXXXbXXXXXXXXXXXXXXXXXXXXXXXXXXbXXXXXXXXXXXXXXXXXXXXXXXXXXXbXXXXXXXXbXXXbXXbhhhhgccXXXXTT"""XXXXXXbXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXbXbXXXXXXXXXXXXXXXXXXXXXXXXXXXXXbXXXXXbXXbXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXbXbXbXXXXXXXXXXXXXbXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXbXXXbXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXbXXXXXXXXXXXXXXXXXXXXXXXXXXXXXbXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXbXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXbXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXbXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXbXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXbXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXhhdccbbXXUTTT"TTXXXXXXXXXXXXXXXXXbXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXhhhgdcbbXXUTT""T"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXghhhhgccbXXTTTT"WXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXUXXXXXXXXXXXXXXXUXXXXXXXXXXXWXXXXUXXXXXXXXXXXXUXXXXXXXXWXXXXXXUXXUUXXUXXXUXXXUUXXXXXXUXXXUXXXXXXXXXXXXXXXXUXXUUXXXXXXUXXUXXXUXXUUXXUUXXUUXXUUXXXXXXXXXXXXXXXXXXXXXXXXXXUUXXUUXXXXWXXXXXUXXXUXXXXUXXUUXXWUXXTXUXXXXXXXXXXXXXXXUUXXUUXXUUXXXXXXUUXXUUXXUVXXUUXXUXXXUUXXXXXXXUXXXXXXUUXXUUXXUUXXUVXTXXXXXXXXXXXXXXXXXXXUXXXXXXXXXXXXXXXUXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXUUXXUUXXXXXXUXXTXXUUXXXXXXUXXXXXXXXXXXXXXXXXXXUUXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXUUXXUVXXUWXXUTUXXXXXXXXXXXXXXXXXXXXUXXUXXXXXXXUUXXXXXXXXXXXXXXXXTXXXXXXXXXXXXXXXXXXXXXXXXXXUXXXXXXUXTXXXXXXXXXXXXXXXXXXXXXXXXXXXUUXXXUXXUWXXXXXXUUXXUUXXUXXXUUXXUXXXXXXXXUXXUUXXUUXXXUXXTXXUXXUUXXUUXXUUXXUXXXUUXXXXXXXXXXXXXXXXXXXXXXXUXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXUVXXTXUUXXXXXXXXXXXXXXUUXXXXXXXUXXXXXXUUXXUUXXUXXXXUXXUUXXUXXXXXXXXUXXUXXXXXWXXXXXWUXXXXXTXXVUXXUXXXXXXXXXXXXXXXUUXXUUXXUVXXUUXXUXXXUUXXVUXXUUXXUUXXXTUXXTTXXXXTUXXXTXUTXUXTXTXTXTXXXTXTUUUXXTXXUXXTUXXXXUTTUUTUXTXXXUTXXTXTXXTTXTXUXhhhcccXXXXTT""T""XUXXUUXXUTTTUUXXXTTXXXUUTUTXXTXTXTXTXXTXUXUXXXXXXUXUXTVXXXUUTXTXUTXXXXTXXUXXUVXUXXUXUXXXXXXUXXXTTXXXXXXUXUXUXTTTXXUXUXUXUXXUXXXXXXXUXXUXUXUXXXXTXXXXXXXUXXUXXXXUXUXXUUXUXUXXTXXXXUXXUTXXTXUXTXUXUXUTTTTTTTUUTTTXUTTTUUTUXTTTTTTTTTXXTTTTTTTTTXXTTTTTTTTTTTTTTXUXTXTTXXTTXTXTXXTXTXXXXTUTUUTXXUUUbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbhhdcccbXXTTT"""XbbbbbbbbbbbbbbbbbcbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbXbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhdcbbbXTTT"""ghhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhdccbbXXTTTTT"ThhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhdcbbXXUTTT""ThhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhgcccbXXXUTT""ThhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhgccbbXXXTTT"ThhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhccbXXXXUTTTT"ThhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhddcbXXUTTT"T"ThhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhdcccbXXXTTT""TTThhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhdccXXXXU"T"TThhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhgcccbXXUTT"TThhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhgccbbXXTTT"ThhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhccbbXXXUT"TThhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhgccXXXUTT"""ThhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhddccbXXXTT"T"ThhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhgccbXXXXTT"""ThhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhdccXXXXUTT"ThhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhgdcXXXTTTTThhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhgdccbbXXVTT"""TThhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhdccbXXXUT""T""TThhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhdccbXXXTT""T"""ghhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhddccXXXXTTTT"TghhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhghhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhghhhhghhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhcccbXXUTTT"TghhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhghhhhhhhhhhhhhhhghhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhghhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhghhhhhhhhhhhghhhghhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhgdcbbXXXTTT""""TghhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhghhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhghhhhhhhhhhhhhhhhhhhhhhhhhghhhhhhhhhhhhhhhghhhhhhhhghhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhghhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhghhhhhhhhhhhhhhhhhhhhhhhhghhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhdgccbXXTTT"TdhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhghhghhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhghhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhghhhhhhhhhhhhhhhhhhhhhhhhhhghhhhhhhhhhhhhhghhhhhhhhhhhhhhhghhhhhhhhhghhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhghhhhhhhhhhhhhhhhhhhhhhhhhhhhhghhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhghhhhhhhhhhhhhhhhhhhhhghhhhhhhhhhhhhhhhccbbXXUTTT"gghhhhhhhhhhhhhghhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhghhhhhhhhhhhghhhhhhhhhghhhhhhhhhhhhhhhhhghhhhhhhhhhhhghhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhghghhhhhhhhhhhhhhghhhhhhhhhhhhhhghhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhghhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhghhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhghhhhhhhhhhhhhghhhhhhhhhhhhghhhhhhhhhhhhhhhhhhhhhhhghghhhhhhhhhhghhhhhhhhhhhhhhhhhhhhhhhhhhhhhgdcbbXXTTTT"""ThhhhhhhhghhhhhhhhhhhhhhhhhhhhhhghhhhhhhhhhhhhhhghhhhhhhhhghhhhhhhhhhhhhhhhhhhhhhghhhhhhhhhhhhghhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhghhhhghhhhhhhhhhhhhghhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhghhhhhhhhhghhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhghhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhghhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhghhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhghhhhhhhhhhhhhghhhhhhhhhgdccbXXXTT""""dhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhghhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhghhhhhhhhhhhhhhhhhhhhhhhhhhghhhhhhhhhhhhhhhghhhhhhhhhhhhhhhhhhhhhhhhhhhhghhhhhhhhhhhhghhhhhhhhhhhhhhhhhhhhhhhghhhhghhhhhhhhhhhhhhhhhghhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhghhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhghhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhghghhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhghhhhhhhhhhhhhhhhhhhhhhhhhhhghhhhhhhhhhhhhhghhhhhghhhhhhhhhhhhhhhhhghhhhhhhhhhhhhhhhhghhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhgccXXXXUT"""TTTTghhhhhhhhhhhhhghhhhhhhhhghhhhhghhhhhhhhhhhhhhhhhghhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhghhhhhghhhghghhhhhghhhhhhhhhhhhhhhhhghhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhghhghhhhhhhhhhghhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhghhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhghhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhghhhhhhhhhhhhhhghhhhhhhhghhhhhhhhhhhhhhhhhghhhhhghghhhhhhhhhhhhhhhhghhhhhhhhhhhghhhhhhhhhghhhghhhhhhhhhhhhhhhgghhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhghhhhhhhhghhghhhhhhhhhhhhhhhhhhhhhhhhhhhhghhhhhhhhhghhhhhhhhhhhhhhhhhhghhhhhghhhhhhhhghhhhhhhhghhhhhhhhhhhhhhhhhghhhhhhhhhhhhhhhhhhhhhhhghhhhhhhhhhghhhhhhhghhhhhhghhhhhhhhhhhhhhhhhghhhhhhhhhhhhhhhhghhhhhhghhhhhhhhhhhhhhhhhghhhhhhhhhhhhhhhhhghhhhhhhhhhhhhhhhggdbbXXT:T"TdhhhhhhhhhhhhhhhhhhhhhghhhhhghhhhhhhhhhhhhhhhhhhhhhhhhghhhhhhhhghhhhhhhghhhhhhghhhhhhhhhhhhhhhhhghhhhhhhhhhhhhhhhghhhhhhhhhhhhhghhhhhhhhhhghhhhhhhhhhghhhhhhhhhhhhhghhhhhhhhghhhhhhhhghhghhhhhhhhhhhhhhhhhhhhghhhhhhhhhhhhhhhhhghhhhhhhhhhghhhhhhhghhhhhhhghhhhhhghhhhhhhhhhhghhhhhhhhhhhhhhgghhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhghhhhhhhhhhhhhhhhhhhhhhhhhhhhhhghhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhghhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhghhhhhhghghhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhghhhhhhhhhhhhhhhghhhhghhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhghhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhghhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhghhhhhhghghhhhhhhhhhhhhhhhhhhhhhhccbbXXXTTT"ThhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhghhhhhhhhhhhhhhhhhhghhhhhhhhhhhhhhhhhhhhhhhhhhghhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhghhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhghhhhhghhhhghhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhghhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhghhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhghhhhhhhhghhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhghhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhghhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhghhhhhhhhhhhhhhhhhhhhhhhghhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhghghhhhghhhhhhhhhhhhhhhhhhghhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhghhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhghhhhghghhhhhhhhhhhhhhhhhhhhhhhhhghhhhhhghhhhhhhhhhhhhhhhhhgcccbXXXTT"T"ThhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhghhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhghhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhghghhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhghhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhghhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhghhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhghhhhhhhhhhghhhhhhhghhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhghhhhhghhhhhghghhhhhhhhhhhhhhhhhhhhhghhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhghhhhhhhhhhhhhghhhhhhhhhhghhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhghhhhhhhhhhhhhghhhhhhhhhhhhhhhhhhhghhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhghhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhghhhhhhghhhhhhhhhhhhhhhhhhhhhhhhghhhhhhhhhhhhhhhhhhhghhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhghhhhhhhhhhhhhhhhhhhhhhhhghhhhhhhghhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhghhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhgddcXXXXUTT"""ghhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhghghhhhhhghhhhhhhhghhhhhhhhhhhhhhhhhhhhhghhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhghhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhghhhhhhhhhhhhhghhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhghhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhghhhhhhhhhhghhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhghhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhghhhhhhhhhhhhhghhhhhhhhhhhhhhhghhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhghhhhhhghhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhghhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhghhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhghghhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhghhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhghhhhhhhhhhhghhhhhhhhhhhhhhhhhhhhhhhhhhhghhhhhhhhghghhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhghghhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhghhhhhhhhhhhhhghhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhghhhhhhhhhhhhhhhhhhhhhhhhhhhhhgdcbbXXTTTTTT""T""TghhghhhhhhghghhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhghghhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhghhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhghhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhghhhhhhhghhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhghghhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhghhhhhhhhhhhhhhhghghhhhhhhhhhhhhghhhhhhhhhhhhhhhhhhhhhghhhhhhhhhhhhhhhhhhhhhhhghhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhghhhhhhhhhhhhhhhhhhhhhhghghhhhhhhhhhhhhhhhhhhhhhhhhhhhhghhhhhhghhhhhhhhhhhhhhhhhhhhhhghhhhhhhhhghhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhghhhhhhhhhhhhhhhhhhhhghhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhghhhhhhhhhhhhhhhhghhhhhhhhghhhhhhhhhhhhhhhhhhhhhhhhhhhhhhghhhhhhhhhhhhhghhhhhhhhhhhhhhghhhhhhhhhhhhhhhhhhhhhhghhhhhhhhhhhhhhhhhhhhhhhghhhhhhhhghhhhhhhhhhhhhhhhhhhhhhhhhhhhghhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhghhhhhhhhhhhhhhhhhhhhhhghhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhghhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhghhhhhhhhhhhhhgcccXXXTUT"ThhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhghhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhghhhhhhhhhhghhhhhhhhhhhhhhghhhhhhhhhhhhhhhhghhhhhhhhhhhhhhhhhhhhhhhhhhhhhghhhhhhhhhghhhhhhhhhhhhghhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhghhhhhhhhhhhhhhhhhhhhhhghhhhhhhhhghhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhghhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhghhhhhhhhhhhhhhhhhhhhhghhhhhhhhgghhhhhhhhhhhhhhhhhhhhhhghhhhhhhhhhhhhhhhhhhhhhhghhhhhhghhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhghhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhghhhhghhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhghhhhhhhhhhhhhhhhhhhhhhhghhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhghhhhhhhhhhhhhhhhhhhhhghhhhhhhhhhhhhhhhhhhhhhhhhhhghhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhghhhhhhhhhhhhhhhghhhhhhghhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhghhhhhhhhhhhhhhhhhhhhhghhhhhhhhhhhhhhhhhhhhhhhhhhhghhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhghhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhghhhhhhhghhhghhhhhhhhhhhhhhhhhhhhhhhghhhhhhhhhhhhghhhhhhhhhhhhhhhhhhhhhhghhhhhhhhhhhhghhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhghhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhghhhhhhhhhhhccbbXXTTTTT"TdhhhhhhhhhhhhhghhhhhhhhhhhhghhhhhhhhhhhhhhhhhhhhhhghhhhhhhhhhhhhhhhhhhhhhhhhghhhhhhhhhhhhhghhhhhhhhghhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhghhhhhhhhhhhhhghhhhhhhhhhhhhhhhhhhhhhghhhhhhhhhhhghhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhghhhhghhhhhhhhhhhhCorsixTH-0.63/CorsixTH/Bitmap/mainmenu720.pal000066400000000000000000000014001347163623700206330ustar00rootroot00000000000000                                               ! $ ! " '#$' *( #&'!$"%(),*, "%#$) "(#)%  + - *!.$.!" &""!&$'!*"-%.")#+$*%-#/$0"0$2%4#/&1&6&1'3'7(2(7)1)4)8+:)9,:&",,.!%#),2 #, !&0)5!!! #'!$'%%% #("%) &-$'*$'+"(.&(+%)-***(*-*,.--+--- '0"*1!*4!+3",4$*1$+4&,2%-5 +7!,8$-8(+/*-2).4,.1+/3(/8'/6'/9*05.02-15.37*09-3:,3;.48,4;11/111025246566/37159/5<56837;37;68969<99::;<;; ".. "") print("Converts a bitmap which contains multiple glyphs (arranged in a ".. "grid) into a sprite sheet (.tab and .dat) and a palette (.pal).") return end package.path = (debug.getinfo(1, "S").source:match("@(.*[" .. package.config :sub(1, 1) .. "])") or "") .. "lib_" .. package.config:sub(5, 5) .. ".lua" .. package.config:sub(3, 3) .. package.path require("bmp") require("spritesheet") local bitmap_name, cell_width, cell_height, space_width = ... cell_width = assert(tonumber(cell_width), "cell width must be a number") cell_height = assert(tonumber(cell_height), "cell height must be a number") space_width = tonumber(space_width) or cell_width local bitmap = assert(bmp.open(bitmap_name)) local ncells_x = bitmap.width / cell_width assert(ncells_x % 1 == 0, "Bitmap width must be a multiple of the cell width") local ncells_y = bitmap.height / cell_height assert(ncells_y % 1 == 0, "Bitmap height must be a multiple of the cell height") local filename_base = bitmap_name:match"^(.*%.)[^.]*$" local ss = spritesheet.open(filename_base .. "tab", filename_base .. "dat", true) local pal = assert(io.open(filename_base .. "pal", "wb")) pal:write(bitmap.palette) pal:close() ss:writeDummy() for y = 0, ncells_y - 1 do for x = 0, ncells_x - 1 do if x == 0 and y == 0 then ss:write(space_width, 1, bitmap:getSubPixels(0, 0, space_width, 1)) else local x, y = x * cell_width, y * cell_height local w, h = cell_width, cell_height while h > 1 do local is_empty = true for d = 0, w - 1 do if bitmap:getPixel(x + d, y + h - 1) ~= "\255" then is_empty = false end end if is_empty then h = h - 1 else break end end while w > 1 do local is_empty = true for d = 0, h - 1 do if bitmap:getPixel(x + w - 1, y + d) ~= "\255" then is_empty = false end end if is_empty then w = w - 1 else break end end if w == 1 and h == 1 and bitmap:getPixel(x, y) == "\255" then ss:writeDummy() else ss:write(w, cell_height, bitmap:getSubPixels(x, y, w, cell_height)) end end end end ss:close() CorsixTH-0.63/CorsixTH/Bitmap/mkraw.lua000066400000000000000000000037761347163623700177410ustar00rootroot00000000000000--[[ Copyright (c) 2010 Manuel "Roujin" Wolf 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. --]] if not ... then print "Usage: lua mkraw.lua " print "Converts a bitmap into a raw .dat file and a .pal file" return end package.path = (debug.getinfo(1, "S").source:match("@(.*[" .. package.config :sub(1, 1) .. "])") or "") .. "lib_" .. package.config:sub(5, 5) .. ".lua" .. package.config:sub(3, 3) .. package.path require("bmp") local filename = ... if not filename:match("%.bmp$") then print("Error: Extension must must be .bmp") return end local filename_base = filename:match"^(.*%.)[^.]*$" local dat, pal = filename_base .."dat", filename_base .. "pal" local bitmap = assert(bmp.open(filename)) dat = assert(io.open(dat, "wb")) pal = assert(io.open(pal, "wb")) -- palette pal:write(bitmap.palette) -- image data dat:write(assert(bitmap:getPixels())) if bitmap.pal_size ~= 256 then print("Warning: palette size is " .. bitmap.pal_size .. ". Currently only palettes of size 256 will work in CorsixTH.") end CorsixTH-0.63/CorsixTH/Bitmap/mksheet.lua000066400000000000000000000053621347163623700202510ustar00rootroot00000000000000--[[ Copyright (c) 2009 Peter "Corsix" Cawley 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. --]] if not ... then print "Usage: lua mksheet.lua " print "Converts a number of bitmaps into a sprite sheet using the given spec" return end package.path = (debug.getinfo(1, "S").source:match("@(.*[" .. package.config :sub(1, 1) .. "])") or "") .. "lib_" .. package.config:sub(5, 5) .. ".lua" .. package.config:sub(3, 3) .. package.path require("bmp") require("spritesheet") local specfile = ... specfile = assert(loadfile(specfile)) local spec = {} setfenv(specfile, spec)() assert(type(spec.sprites) == "table", "spec is missing sprite list") local required_fields = { palette = { ["from bitmap"] = true, }, complex = { [true] = true, -- [false] = true, -- Not yet supported }, rnc = { -- [true] = true, -- Not yet supported [false] = true, }, output_tab = true, output_dat = true, } for field, options in pairs(required_fields) do assert(spec[field] ~= nil, "spec is missing '" .. field .. "' field") if options ~= true then assert(options[spec[field]], "spec field '" .. field .. "' is invalid") end end local ss = spritesheet.open(spec.output_tab, spec.output_dat, spec.complex) for i = 0, table.maxn(spec.sprites) do local filename = spec.sprites[i] if not filename then ss:writeDummy() else local function err(msg, ...) error("Error processing " .. filename .. ":\n" .. msg:format(...)) end local bitmap, e = bmp.open(filename) if not bitmap then err(e) end local width, height = bitmap.width, bitmap.height if width > 0xFF or height > 0xFF then err "Image too big (maximum size is 255x255)" end ss:write(width, height, bitmap:getPixels()) end end ss:close() CorsixTH-0.63/CorsixTH/Bitmap/readme.txt000066400000000000000000000021471347163623700201020ustar00rootroot00000000000000Almost all graphics resources are loaded from the original Theme Hospital data files, which is why there are only a few files in this directory. build_room_dialog_close.bmp : this sprite is missing from the game's REQ09V.DAT map_cell_outline.bmp : there is no nice outline tile in the game's VBLK-0.DAT flag_*.bmp : used as debug overlays fullscreen_border_*.bmp : used as borders as 640x480 "fullscreen" backgrounds bootstrap_font.bmp : a homemade bitmap font which can be used for drawing text before the original data files are loaded. aux_ui sprite sheet (main palette) #01 - build_room_dialog_close.bmp #02 - map_cell_outline.bmp #03 - flag_passable.bmp #04 - flag_travel_north.bmp #05 - flag_travel_east.bmp #06 - flag_travel_south.bmp #07 - flag_travel_west.bmp #08 - flag_hospital.bmp #09 - flag_buildable.bmp #10 - fullscreen_border_topleft.bmp #11 - fullscreen_border_top.bmp #12 - fullscreen_border_topright.bmp #13 - fullscreen_border_left.bmp #14 - fullscreen_border_right.bmp #15 - fullscreen_border_bottomleft.bmp #16 - fullscreen_border_bottom.bmp #17 - fullscreen_border_bottomright.bmp CorsixTH-0.63/CorsixTH/Bitmap/tree_collapsed.bmp000066400000000000000000000023361347163623700215710ustar00rootroot00000000000000BM6( CorsixTH-0.63/CorsixTH/Bitmap/tree_ctrl.dat000066400000000000000000000003341347163623700205550ustar00rootroot00000000000000JQQQQQQBJQQQMQQBJNBA@@@@A@BMQBJNBA@A@@A@A@BMQBCorsixTH-0.63/CorsixTH/Bitmap/tree_ctrl.pal000066400000000000000000000014001347163623700205540ustar00rootroot00000000000000?????CorsixTH-0.63/CorsixTH/Bitmap/tree_ctrl.spec000066400000000000000000000005441347163623700207420ustar00rootroot00000000000000-- Bitmaps to create sprite sheet from sprites = {} sprites[ 1] = "tree_level.bmp" sprites[ 2] = "tree_leaf.bmp" sprites[ 3] = "tree_collapsed.bmp" sprites[ 4] = "tree_expanded.bmp" -- Palette options palette = "from bitmap" -- Compression options complex = true rnc = false -- Output filenames output_tab = "tree_ctrl.tab" output_dat = "tree_ctrl.dat" CorsixTH-0.63/CorsixTH/Bitmap/tree_ctrl.tab000066400000000000000000000000361347163623700205520ustar00rootroot00000000000000  D  CorsixTH-0.63/CorsixTH/Bitmap/tree_expanded.bmp000066400000000000000000000023361347163623700214130ustar00rootroot00000000000000BM6( CorsixTH-0.63/CorsixTH/Bitmap/tree_leaf.bmp000066400000000000000000000023361347163623700205320ustar00rootroot00000000000000BM6( CorsixTH-0.63/CorsixTH/Bitmap/tree_level.bmp000066400000000000000000000023361347163623700207320ustar00rootroot00000000000000BM6( CorsixTH-0.63/CorsixTH/CMakeLists.txt000066400000000000000000000235411347163623700174310ustar00rootroot00000000000000# Sanity check if(CORSIX_TH_DONE_TOP_LEVEL_CMAKE) else() message(FATAL_ERROR "Please run cmake on the top-level directory, not this one.") endif() # Project Declaration project(CorsixTH) if(APPLE) add_subdirectory(SDLMain) elseif(MSVC) # We want to bind against the very latest versions of the MSVC runtimes add_definitions(/D "_BIND_TO_CURRENT_VCLIBS_VERSION=1") endif() if(USE_SOURCE_DATADIRS) set(CORSIX_TH_DATADIR ${CMAKE_CURRENT_SOURCE_DIR}) set(CORSIX_TH_INTERPRETER_PATH ${CORSIX_TH_DATADIR}/CorsixTH.lua) elseif(MSVC) set(CORSIX_TH_DATADIR CorsixTH) set(CORSIX_TH_INTERPRETER_PATH CorsixTH.lua) elseif(APPLE) set(CORSIX_TH_DATADIR CorsixTH.app/Contents/Resources/) set(CORSIX_TH_INTERPRETER_PATH ${CMAKE_INSTALL_PREFIX}/${CORSIX_TH_DATADIR}/CorsixTH.lua) else() set(CORSIX_TH_DATADIR ${CMAKE_INSTALL_DATADIR}/corsix-th) set(CORSIX_TH_INTERPRETER_PATH ${CMAKE_INSTALL_FULL_DATADIR}/corsix-th/CorsixTH.lua) endif() # Modify the config.h based upon our selection of options configure_file(${CMAKE_SOURCE_DIR}/CorsixTH/Src/config.h.in ${CMAKE_BINARY_DIR}/CorsixTH/Src/config.h) include_directories(${CMAKE_BINARY_DIR}/CorsixTH/Src/) # Generate source files list # Note: Done after generating config.h file(GLOB_RECURSE corsixth_source_files ${CMAKE_SOURCE_DIR}/CorsixTH/SrcUnshared/*.cpp ${CMAKE_SOURCE_DIR}/CorsixTH/SrcUnshared/*.c ${CMAKE_SOURCE_DIR}/CorsixTH/SrcUnshared/*.h ${CMAKE_SOURCE_DIR}/CorsixTH/SrcUnshared/*.hpp ${CMAKE_SOURCE_DIR}/CorsixTH/Src/*.cpp ${CMAKE_SOURCE_DIR}/CorsixTH/Src/*.c ${CMAKE_SOURCE_DIR}/CorsixTH/Src/*.hpp ${CMAKE_SOURCE_DIR}/CorsixTH/Src/*.h ${CMAKE_SOURCE_DIR}/common/rnc.cpp ${CMAKE_SOURCE_DIR}/common/rnc.h ${CMAKE_SOURCE_DIR}/CorsixTH/Src/shaders/*.psh ${CMAKE_BINARY_DIR}/CorsixTH/Src/config.h ${CMAKE_SOURCE_DIR}/CorsixTH/Lua/api_version.lua ${CMAKE_SOURCE_DIR}/CorsixTH/CorsixTH.rc ${CMAKE_SOURCE_DIR}/LFS/*.c ${CMAKE_SOURCE_DIR}/LPEG/*.c ) # Declaration of the executable if(APPLE) set(corsixth_icon_file ${CMAKE_SOURCE_DIR}/CorsixTH/Icon.icns) set_source_files_properties( ${corsixth_icon_file} PROPERTIES MACOSX_PACKAGE_LOCATION Resources ) set(MACOSX_BUNDLE_ICON_FILE Icon.icns) add_executable(CorsixTH MACOSX_BUNDLE ${corsixth_source_files} ${corsixth_icon_file}) set_target_properties(CorsixTH PROPERTIES LINK_FLAGS_MINSIZEREL "-dead_strip") set_target_properties(CorsixTH PROPERTIES XCODE_ATTRIBUTE_LD_RUNPATH_SEARCH_PATHS "@executable_path/../Frameworks") target_link_libraries(CorsixTH SDL2main) include_directories(${CMAKE_BINARY_DIR}/CorsixTH/SDLMain/) else() add_executable(CorsixTH ${corsixth_source_files}) endif() if(UNIX AND NOT APPLE) set_target_properties(CorsixTH PROPERTIES OUTPUT_NAME corsix-th) endif() # Set language standard set_property(TARGET CorsixTH PROPERTY CXX_STANDARD 11) set_property(TARGET CorsixTH PROPERTY CXX_EXTENSIONS OFF) set_property(TARGET CorsixTH PROPERTY CXX_STANDARD_REQUIRED ON) # Add an extra step to copy built DLLs on MSVC if(USE_VCPKG_DEPS) include(CopyVcpkgLua) ENDIF() ## Finding libraries # Find SDL if(MSVC AND USE_VCPKG_DEPS) find_package(SDL2 CONFIG REQUIRED) target_link_libraries(CorsixTH SDL2::SDL2) target_link_libraries(CorsixTH SDL2::SDL2main) else() find_package(SDL2 REQUIRED) if(SDL_FOUND) include_directories(${SDL_INCLUDE_DIR}) if(SDLMAIN_LIBRARY STREQUAL "") message(FATAL_ERROR "Error: SDL was found but SDLmain was not") message("Make sure the path is correctly defined or set the environment variable SDLDIR to the correct location") endif() # No need to specify sdlmain separately, the FindSDL.cmake file will take care of that. If not we get an error about it target_link_libraries(CorsixTH ${SDL_LIBRARY}) message(" SDL found") else() message(FATAL_ERROR "Error: SDL library not found, it is required to build. Make sure the path is correctly defined or set the environment variable SDLDIR to the correct location") endif() endif() # Find Lua find_package(Lua REQUIRED) if(Lua_FOUND) target_link_libraries(CorsixTH ${LUA_LIBRARY}) include_directories(${LUA_INCLUDE_DIR}) # Special link flags needed on OSX/64bit, according to: http://luajit.org/install.html # If these are not specified, luaL_newstate() returns NULL and we get this: # Fatal error starting CorsixTH: Cannot open Lua state. if(${CMAKE_SYSTEM_NAME} MATCHES "Darwin" AND LUA_INTERPRETER_TYPE STREQUAL "LuaJIT" AND CMAKE_SIZEOF_VOID_P EQUAL 8) target_link_libraries(CorsixTH "-pagezero_size 10000" "-image_base 100000000") endif() message(" ${LUA_INTERPRETER_TYPE} found") else() message(FATAL_ERROR "Error: Lua library not found, it is required to build") endif() # Add threading library find_package(Threads) target_link_libraries(CorsixTH ${CMAKE_THREAD_LIBS_INIT}) # Find SDL_mixer if(CORSIX_TH_USE_SDL_MIXER) find_package(SDL2_mixer REQUIRED) if(SDLMIXER_FOUND) target_link_libraries(CorsixTH ${SDLMIXER_LIBRARY}) include_directories(${SDLMIXER_INCLUDE_DIR}) message(" SDL_mixer found") else() message(FATAL_ERROR "Error: SDL_mixer library not found, even though it was selected to be included") endif() endif() message(STATUS "CMAKE_MODULE_PATH=${CMAKE_MODULE_PATH}") # Find FFMPEG if(CORSIX_TH_USE_FFMPEG) find_package(FFmpeg COMPONENTS AVFORMAT AVCODEC AVUTIL SWSCALE SWRESAMPLE REQUIRED) if(FFMPEG_FOUND) target_link_libraries(CorsixTH ${FFMPEG_LIBRARIES}) include_directories(${FFMPEG_INCLUDE_DIRS}) if(APPLE) target_link_libraries(CorsixTH libz.dylib) endif() message(" FFmpeg found") else() message(FATAL_ERROR "Error: FFmpeg library not found, even though it was selected to be included") endif() endif() if(CORSIX_TH_USE_LIBAV) find_package(LibAV COMPONENTS AVFORMAT AVCODEC AVRESAMPLE AVUTIL SWSCALE REQUIRED) if(LIBAV_FOUND) target_link_libraries(CorsixTH ${LIBAV_LIBRARIES}) include_directories(${LIBAV_INCLUDE_DIRS}) if(APPLE) target_link_libraries(CorsixTH libz.dylib) endif() message(" LibAV found") else() message(FATAL_ERROR "Error: LibAV library not found, even though it was selected to be included") endif() endif() # Find Freetype2 if(CORSIX_TH_USE_FREETYPE2) find_package(Freetype REQUIRED) if(FREETYPE_FOUND) target_link_libraries(CorsixTH ${FREETYPE_LIBRARIES}) include_directories(${FREETYPE_INCLUDE_DIRS}) if(APPLE) target_link_libraries(CorsixTH libz.dylib) target_link_libraries(CorsixTH libbz2.dylib) endif() message(" FreeType2 found") else() message(FATAL_ERROR "Error: FreeType2 library not found, even though it was selected to be used") endif() endif() if(MSVC AND CORSIX_TH_USE_VLD) find_package(VLD REQUIRED) if(VLD_FOUND) target_link_libraries(CorsixTH ${VLD_LIBRARY}) include_directories(CorsixTH ${VLD_INCLUDE_DIR}) message(" VLD found") else() message(FATAL_ERROR "Error: VLD Library not found, it is required to build when USE_VLD is set") endif() endif() # Launch script to facilitate out of source builds if(USE_SOURCE_DATADIRS) #do not generate launch script. The default is fine for this case. elseif(XCODE) message(WARNING "By default you will not be able to run CorsixTH from Xcode. If you do not plan to deploy then run cmake with -DUSE_SOURCE_DATADIRS. If you want to both run and deploy from Xcode then set the command line arguments in your run scheme to --interpreter=${CMAKE_CURRENT_SOURCE_DIR}/CorsixTH.lua") elseif(APPLE) configure_file(${CMAKE_CURRENT_SOURCE_DIR}/run-corsix-th-dev.sh.in.apple ${CMAKE_CURRENT_BINARY_DIR}/run-corsixth-dev.sh @ONLY) elseif(UNIX) configure_file(${CMAKE_CURRENT_SOURCE_DIR}/run-corsix-th-dev.sh.in ${CMAKE_CURRENT_BINARY_DIR}/run-corsixth-dev.sh @ONLY) elseif(MSVC) configure_file(${CMAKE_CURRENT_SOURCE_DIR}/CorsixTH.vcxproj.user.in ${CMAKE_CURRENT_BINARY_DIR}/CorsixTH.vcxproj.user @ONLY) endif() # Declaration of the install process if(NOT USE_SOURCE_DATADIRS) if(APPLE) #Just use the prefix as it's sufficient to just set the prefix to /Applications on Mac. install(TARGETS CorsixTH BUNDLE DESTINATION .) elseif(MSVC) install(TARGETS CorsixTH RUNTIME DESTINATION ${CORSIX_TH_DATADIR} LIBRARY DESTINATION ${CORSIX_TH_DATADIR} ARCHIVE DESTINATION ${CORSIX_TH_DATADIR} ) install(FILES CorsixTH.ico DESTINATION ${CORSIX_TH_DATADIR}) # install dependencies file(GLOB DLL_DEPS "${CMAKE_CURRENT_BINARY_DIR}/*.dll") install(FILES ${DLL_DEPS} DESTINATION ${CORSIX_TH_DATADIR}) file(GLOB LUA_DEPS "${CMAKE_CURRENT_BINARY_DIR}/*.lua") install(FILES ${LUA_DEPS} DESTINATION ${CORSIX_TH_DATADIR}) if(EXISTS "${CMAKE_CURRENT_BINARY_DIR}/mime") install(DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/mime" "${CMAKE_CURRENT_BINARY_DIR}/socket" DESTINATION ${CORSIX_TH_DATADIR}) endif() else() install(TARGETS CorsixTH RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR} ) endif() install(DIRECTORY Campaigns Lua Levels DESTINATION ${CORSIX_TH_DATADIR}) install(DIRECTORY Bitmap DESTINATION ${CORSIX_TH_DATADIR} FILES_MATCHING REGEX ".*\\.(tab|pal|dat|png)$" ) install(FILES CorsixTH.lua ../LICENSE.txt DESTINATION ${CORSIX_TH_DATADIR}) if(UNIX AND NOT APPLE) install(FILES corsix-th.6 DESTINATION ${CMAKE_INSTALL_MANDIR}/man6) install(FILES com.corsixth.CorsixTH.appdata.xml DESTINATION ${CMAKE_INSTALL_DATADIR}/metainfo) install(FILES com.corsixth.CorsixTH.desktop DESTINATION ${CMAKE_INSTALL_DATADIR}/applications) install(FILES Original_Logo.svg DESTINATION ${CMAKE_INSTALL_DATADIR}/icons/hicolor/scalable/apps RENAME corsix-th.svg) endif() if(APPLE) # Fix the OS X bundle to include required libraries (create a redistributable app) install(CODE " INCLUDE(BundleUtilities) SET(BU_CHMOD_BUNDLE_ITEMS ON) FIXUP_BUNDLE(${CMAKE_INSTALL_PREFIX}/CorsixTH.app \"\" \"\") ") endif() endif() CorsixTH-0.63/CorsixTH/Campaigns/000077500000000000000000000000001347163623700165665ustar00rootroot00000000000000CorsixTH-0.63/CorsixTH/Campaigns/ChrizmanTV.campaign000066400000000000000000000043571347163623700223250ustar00rootroot00000000000000--[[ Copyright (c) 2013 Chris "ChrizmanTV" Wilkinson 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.--]] name = "ChrizmanTV and beyond" description = "Hello and welcome to the first CorsixTH Custom Campaign, created by Chris Wilkinson! " .. "Do not lose your patients as you play through 12 levels of hospital hysteria and " .. "comedic challenges. Starting at Coffalot, you will be introduced to the basic " .. "functionality of CorsixTH before finally progressing to the last challenge " .. "at Royal Hospital. The Ministry of Health will be monitoring you along the way, " .. "as you will be met with bizarre illnesses and a multitude of sick patients who need " .. "your attention. Have fun!" levels = { "coffalot.level", "holby.level", "writhe.level", "greyhamgardens.level", "snuffitsands.level", "upperpukington.level", "fourcorners.level", "wishinwell.level", "hoppalong.level", "tufflook.level", "dethsdaw.level", "royalhospital.level", } winning_text = "Exceptional work! You have made it to the top! The mansion is yours, and public money galore is flowing into your Swiss bank account as we speak. Now you can relax - your days of running hospitals is finally over. Thanks for playing!" CorsixTH-0.63/CorsixTH/Campaigns/Coffalot.map000066400000000000000000005001541347163623700210270ustar00rootroot00000000000000?????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? ?Axy<Az<A|<Ax<Az<A|<Ax<Az<A|<Ax<Az<A|<Ax<Ax<Az<A|<Ax<Az<A|<Ax<Az<A|<Ax<Az<A|<Ax<q????????????????????????????????????????????????????????????????????????????????????????????????????? ?A{<A<A<A<A<A<A<A<A<A<A<A<A<A<A<A<A<A<A<A<A<A<A<A<A<A<s????????????????????????????????????????????????????????????????????????????????????????????????????? ?A}<A<A<A<A<A<A<A<A<A<A<A<A<A<A<A<A<A<A<A<A<A<A<A<A<A<u????????????????????????????????????????????????????????????????????????????????????????????????????? ?Ay<A<A<A<A<A<A<A<A<A<A<A<A<A<A<A<A<A<A<A<A<A<A<A<A<A<q????????????????????????????????????????????????????????????????????????????????????????????????????? ?A{<A<A<A<A<A<A<A<A<A<A<A<A<A<A<A<A<A<A<A<A<A<A<A<A<A<s????????????????????????????????????????????????????????????????????????????????????????????????????? ?A}<A<A<A<A<A<A<A<A<A<A<A<A<A<A<A<A<A<A<A<A<A<A<A<A<A<u????????????????????????????????????????????????????????????????????????????????????????????????????? ?Ay<A<A<A<A<A<A<A<A<A<A<A<A<A<A<A<A<A<A<A<A<A<A<A<A<A<q????????????????????????????????????????????????????????????????????????????????????????????????????? ?A{<A<A<A<A<A<A<A<A<A<A<A<A<A<A<A<A<A<A<A<A<A<A<A<A<A<s????????????????????????????????????????????????????????????????????????????????????????????????????? ?A}<A<A<A<A<A<A<A<A<A<A<A<A<A<A<A<A<A<A<A<A<A<A<A<A<A<u????????????????????????????????????????????????????????????????????????????????????????????????????? ?Ay<A<A<A<A<A<A<A<A<A<A<A<A<A<A<A<A<A<A<A<A<A<A<A<A<A<q????????????????????????????????????????????????????????????????????????????????????????????????????? ? p? r? t? p? r? t? p? r? t?=p?Ay<A<A<A<A<A<q??????????????????????????????????????????????????????????????????????????????????????????????????????????????????? ?Axy<Az<A|<Az<A|<Ax<A<A<A<A<A<A<Ax<Az<A|<Az<A|<Ax<q????????????????????????????????????????????????????????????????????????????????????????????????????????????? ?A{<A<A<A<A<A<A<A<A<A<A<A<A<A<A<A<A<A<s????????????????????????????????????????????????????????????????????????????????????????????????????????????? ?A}<A<A<A<A<A<A<A<A<A<A<A<A<A<A<A<A<A<u????????????????????????????????????????????????????????????????????????????????????????????????????????????? ?Ay<A<A<A<A<A<A<A<A<A<A<A<A<A<A<A<A<A<>q??????????????????????????????????????????????????????????????????????????????????????????????????????????? ?Axy<Ax<A<A<A<A<A<A<A<A<A<A<A<A<A<A<A<A<A<A<Ax<Ax<q????????????????????????????????????????????????????????????????????????????????????????????????????????? ?Ay<A<A<A<A<A<A<A<A<A<A<A<A<A<A<A<A<A<A<A<A<A<>q????????????????????????????????????????????????????????????????????????????????????????????????????? ?Axy<Az<A|<Ax<A<A<A<A<A<A<A<A<A<A<A<A<A<A<A<A<A<A<A<A<A<A<Ax<Az<A|<Ax<q????????????????????????????????????????????????????????????????????????????????????????????????? ?A{<A<A<A<A<A<A<A<A<A<A<A<A<A<A<A<A<A<A<A<A<A<A<A<A<A<A<A<A<A<s????????????????????????????????????????????????????????????????????????????????????????????????? ?A}<A<A<A<A<A<A<A<A<A<A<A<A<A<A<A<A<A<A<A<A<A<A<A<A<A<A<A<A<A<u????????????????????????????????????????????????????????????????????????????????????????????????? ?Ay<A<A<A<A<A<A<A<A<A<A<A<A<A<A<A<A<A<A<A<A<A<A<A<A<A<A<A<A<A<>q??????????????????????????????????????????????????????????????????????????????????????????????? ?Axy<Ax<A<A<A<A<A<A<A<A<A<A<A<A<A<A<A<A<A<A<A<A<A<A<A<A<A<A<A<A<A<A<Ax<Ax<q????????????????????????????????????????????????????????????????????????????????????????????? ?A{<A<A<A<A<A<A<A<A<A<A<A<A<A<A<A<A<A<A<A<A<A<A<A<A<A<A<A<A<A<A<A<A<A<s????????????????????????????????????????????????????????????????????????????????????????????? ?A}<A<A<A<A<A<A<A<A<A<A<A<A<A<A<A<A<A<A<A<A<A<A<A<A<A<A<A<A<A<A<A<A<A<u????????????????????????????????????????????????????????????????????????????????????????????? ?Ay<A<A<A<A<A<A<A<A<A<A<A<A<A<A<A<A<A<A<A<A<A<A<A<A<A<A<A<A<A<A<A<A<A<q????????????????????????????????????????????????????????????????????????????????????????????? ?A{<A<A<A<A<A<A<A<A<A<A<A<A<A<A<A<A<A<A<A<A<A<A<A<A<A<A<A<A<A<A<A<A<A<s????????????????????????????????????????????????????????????????????????????????????????????? ?A}<A<A<A<A<A<A<A<A<A<A<A<A<A<A<A<A<A<A<A<A<A<A<A<A<A<A<A<A<A<A<A<A<A<u????????????????????????????????????????????????????????????????????????????????????????????? ?Ay<A<A<A<A<A<A<A<A<A<A<A<A<A<A<A<A<A<A<A<A<A<A<A<A<A<A<A<A<A<A<A<A<A<q????????????????????????????????????????????????????????????????????????????????????????????? ?A{<A<A<A<A<A<A<A<A<A<A<A<A<A<A<A<A<A<A<A<A<A<A<A<A<A<A<A<A<A<A<A<A<A<s????????????????????????????????????????????????????????????????????????????????????????????? ?A}<A<A<A<A<A<A<A<A<A<A<A<A<A<A<A<A<A<A<A<A<A<A<A<A<A<A<A<A<A<A<A<A<A<u????????????????????????????????????????????????????????????????????????????????????????????? ?Ay<A<A<A<A<A<A<A<A<A<A<A<A<A<A<A<A<A<A<A<A<A<A<A<A<A<A<A<A<A<A<A<A<A<q????????????????????????????????????????????????????????????????????????????????????????????? ? p?=p?Ay<A<A<A<A<A<A<A<A<A<A<A<A<A<A<A<A<A<A<A<A<A<A<A<A<A<A<A<A<A<A>A>A<A<A>A>A>A<A<A<A<A<q????????????????????????????????????????????????????????????????????????????????????????????????????????????? ? p? p? r? t?=p?:>;>>;>>>>? ?>>>??????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? ?>>>? ?>>>??????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? ?>>>? ?>>>??????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? ?>>>>? ?>>>>?????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? ?>>>>>>>>>>????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? ?>>>>>>>>>>????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? ?>>>>>>>>>>????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? ?>>><? ? ?=?>>>????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? ?>>>??? ?>>>????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? ?>>>??? ?>>>????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? ?>>>>??? ?>>>????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? ?>>>>>>>>>>????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? ?>>>>>>>>>>????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? ?>>>>>>>>>>????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? ? ? ?=?>>>><? ? ? ???????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? ?>>>>??????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? ?>>>>??????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? ?>>>>??????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? ?>>>>??????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? ?>>>>??????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? ?>>>>??????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? ?>>>>??????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? ?>>>>??????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? ?>>>>??????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? ?>>>>??????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? ?>>>>??????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? ?>>>>??????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? ?>>>>??????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? ?>>>>??????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? ?>>>>??????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? ?>>>>??????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? ?>>>>??????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? ?>>>>??????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? ?>>>>??????????????????????????????????????????????????????????????@-CorsixTH-0.63/CorsixTH/Campaigns/Dethsdaw.map000066400000000000000000005001541347163623700210350ustar00rootroot00000000000000???????????????????????????????????????????????????????????? ?>>>>>>????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? ?>>>>>>????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? ?>>>>>>????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? ?>>>>>>????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? ?>>>>>>????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? ?>>>>>>????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? ?>>>>>>????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? ?>>>>>>????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? ?>>>>>>????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? ?>>>>>>????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? ?>>>>>>?????????????????????????????????????????????????????????????????????????????????????????????????????N?;?;?:????????????????? ?>>>>>>>?????????????????N?;?;?:?????????????????????????????????????????????????????????????????????????????????M?DF?DH?@? ?xyz|z|z|z|z|xq>>>>>>>>>>>>>xyz|z|z|z|z|xq?M?DH?DG?@?????????????????????????????????????????????????????????????????????????????????M?DG?DF?@? ?{s>>>>>>>>>>>>>{s?M?DF?DH?@??????????????????????????????????????????????????????????????? ?xyz|z|z|z|z|z|z|xq?L?C?C?O? ?}u>>>>>>>>>>>>>}u?L?C?C?O? ?xyz|z|z|z|z|z|z|x>q???????????????????????????????????????????? ?xy>q????? ?ys>>>>>>>>>>>>>{>q????? ?yx>q?????????????????????????????????????????? ?xyxz|z|xu>>>><? ? ?=?>>>>>}xz|z|xx>q???????????????????????????????????????? ?xyq>>>>??? ?>>>>>yx>q?????????????????????????????????????? ?xy>>>>??? ?>>>>>:>q??????????????????????????????? ?xyz|z|xq????? ?y;>>>>>??? ?>>>>>;>q????? ?yxz|z|xq????????????????????????? ?{>q????? ?y>>>>>??? ?>>>>>>q????? ?ys????????????????????????? ?}xz|z|xq>>>>??? ?>>>>>yxz|z|xu????????????????????????? ?{q>>>>??? ?>>>>>ys????????????????????????? ?}>>>>??? ?>>>>>:>>>>>??? ?>>>>>;>q????? ?yq????????????????????????? ? p? r? t? r? t?=p?y>q????? ?y>>>>>??? ?>>>>>>q????? ?y>>>??? ?>>>>>yxz|z|x>>>>??? ?>>>>>{>>>>>>>>>>>>}>>>>>>>>>>>>{s????? ?{>>>>>>>>>>>>}u????? ?}s??????M?D?D?DG?@?????????????????????????M?DH?D?D?@?????? ?}s????? ?yq>>>>>>>>>>>>>yq????? ?{u??????M?DH?D?DF?@?????????????????????????M?D?D?DF?@?????? ?yu????? ? p? r? t? r? t? r? t? r? t? r? t? p?=?>>>>>>>>>>>><? p? r? t? r? t? r? t? r? t? r? t? p? ????? ?}>q??????M?DF?D?D?@?????????????????????????M?DF?DG?DH?@????? ?xys?????????????????? ?=?>>>>>>>>>><? ?????????????????? ?{x>q?????M?DG?D?DH?@?????????????????????????L?C?C?C?O???? ?xyu??????????????????? ?=?>>>>>>>><? ??????????????????? ?}x>q????L?C?C?C?O???????????????????????????????? ?xys???????????????????? ?=?>>>>>><? ???????????????????? ?{x>q?????????????????????????????????????? ?xyu????????????????????? ?>>>>>>????????????????????? ?}x>q??????????????????????????????? ?xyz|z|xs????????????????????? ?>>>>>>????????????????????? ?{xz|z|xq????????????????????????? ?{u????????????????????? ?>>>>>>????????????????????? ?}s????????????????????????? ?}q????????????????????? ?>>>>>>>????????????????????? ?yu????????????????????????? ?{s???????????????? ?xyz|z|:>;>:>;>z|z|xq???????????????? ?{s????????????????????????? ?}u???????????????? ?{s???????????????? ?}u????????????????????????? ?ys???????????????? ?}u???????????????? ?{q????????????????????????? ? p? r? t? r? t?=p?yu???????????????? ?{s???????????????? ?}>>>>??? ?=p?ys???????????????? ?}u???????????????? ?{>>>>??????????????????????? ?>>>>>???? ?=p?yu???????????????? ?y>q???????????????? ?}>>>>??????????????????????? ?>>>>>????? ?{s??????????????? ?xyx>q??????????????? ?{s????? ?>>>>>??????????????????????? ?>>>>>????? ?}u?????????????? ?xyx>q?????????????? ?}u????? ?>>>>>??????????????????????? ?>>>>>????? ?yq????????????? ?xyxq????????????? ?yq????? ?>>>>>??????????????????????? ?=?>>><? ????? ?=p?:>;>>;>>;>>;>>>><? ???????????????????????? ?>>>??????? ?>>>??????? ?>>>?????????????? ?}u?????????????? ?>>>??????? ?>>>??????? ?>>>????????????????????????? ?>>>>??????? ?>>>>??????? ?>>>>?????????????? ?y>q?????????????? ?>>>>??????? ?>>>>??????? ?>>>>?????????????>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>:>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>;>s??? ?{;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>u??? ?}>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>:>s??? ?{:>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>;>u??? ?};>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>q??? ?y>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?=?>>>><? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?=?yxz|x<q? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?=?>>>><? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??????????????????????????? ?>>>>????????????????????? ?{s????????????????????? ?>>>>????????????????????????????????????????????????????? ?>>>>????????????????????? ?}u????????????????????? ?>>>>?????????????????????????????????????? ?xyz|z|z|z|z|xq?? ?>>>>????????????????????? ?yq????????????????????? ?>>>>?? ?xyz|z|z|z|z|xq??????????????????????? ?{s?? ?>>>>????????????????????? ?=p?y>>>?? ?{s??????????????????????? ?}u?? ?>>>>?????????????????????? ?=p?y>>>?? ?}u??????????????????????? ?{s?? ?>>>>??????????????????????? ? p? r? t?=p?y>>>?? ?{s??????????????????????? ?}u?? ?>>>>??????? ?xyz|z|z|x>q??????????? ?=p?yq??????? ?>>>>?? ?}u??????????????????????? ?{s?? ?>>>>?????? ?xyx>q??????????? ?=p?yq?????? ?>>>>?? ?{s??????????????????????? ?}u?? ?>>>>????? ?xyx>q??????????? ?:>;>>:>;>>??????????? ?xyx>q????? ?>>>>?? ?}u??????????????????????? ?{s?? ?>>>>???? ?xyx>q?????????? ?>>>>>>?????????? ?xyx>q???? ?>>>>?? ?{s??????????????????????? ?}u?? ?>>>>>??? ?xyx>q????????? ?>>>>>>>????????? ?xyx>q??? ?>>>>?? ?}u??????????????????????? ?{s?? ?>>>>>>>>:>:>>>>>>>>>>>>>>>>>>>>>>>>>>:>:>>>>>>>>?? ?{s??????????????????????? ?}u?? ?>>>>>>>>;>;>>>>>>>>>>>>>>>>>>>>>>>>>>;>;>>>>>>>>?? ?}u??????????????????????? ?{s?? ?>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>?? ?{s??????????????????????? ?}u?? ?>>>>>>>>:>:>>>>>>>>>>>>>>>>>>>>>>>>>>:>:>>>>>>>>?? ?}u??????????????????????? ?{s?? ?>>>>>>>>;>;>>>>>>>>>>>>>>>>>>>>>>>>>>;>;>>>>>>>>?? ?{s??????????????????????? ?}u?? ?>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>?? ?}u??????????????????????? ?{s?? ?>>>><? ? ?=?y<q? ? ? ? ? ? ? ? ?=?>>>>>><? ? ? ? ? ? ? ? ?=?y<q? ? ?=?>>>>?? ?{s??????????????????????? ?}u?? ?>>>>??? ?=p?y>>>>>????????? ?=p?y>>>?? ?}u??????????????????????? ?yq?? ?>>>>???? ?=p?y>>>>>?????????? ?=p?y>>>?? ?yq??????????????????????? ? p? p?=p?:>;>>:>;>>>>>????? ?=p?y>>>>>??????????? ?=p?y>>>?? ? p? p?=p?:>;>>:>;>>>>>>>????? ?>>>>?????? ?=p?y>>>>>???????????? ?=p?y>>>????? ?>>>>>>????????????????????????????? ?>>>>>>>????? ?>>>>??????? ? p? r? t? r? t? r? t? p? ????????????? ?>>>>>>????????????? ? p? r? t? r? t? r? t? p? ??????? ?>>>>>????? ?>>>>>>????????????????????????????? ?>>>>>>>>>>>>>>>>????????????????????????????? ?>>>>>>????????????????????????????? ?>>>>>>>>>>>>>>>>????????????????????????????? ?>>>>>>>>>>>>>>>>????????????????????????????? ?>>>>>>????????????????????????????? ?>>>>>>>>>>>>>>>>????????????????????????????? ?>>>>>>>>>>>>>>>>????????????????????????????? ?>>>>>>????????????????????????????? ?>>>>>>>>>>>>>>>>????????????????????????????? ?>>>>>>>>>>>>>>>>????????????????????????????? ?>>>>>>????????????????????????????? ?>>>>>>>>>>>>>>>>????????????????????????????? ?>>>>>><? ? ? ? ?=?>>>>????????????????????????????? ?>>>>>>????????????????????????????? ?>>>><? ? ? ? ?=?>>>>>>????????????????????????????? ?>>>>>>????? ?>>>>>????????????????????????????? ?>>>>>>>????????????????????????????? ?>>>>????? ?>>>>>>????????????????????????????? ?>>>>>>>????? ?>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>????? ?>>>>>>>?????????????????????????? ?ExyExEx:E>;E>E:E>;E>EExExExq?? ?>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>?? ?ExyExEx:E>;E>E:E>;E>EExExExq??????????????????????? ?E{EEEEEEEEEEEs?? ?>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>?? ?E{EEEEEEEEEEEs??????????????????????? ?E}EEEEEEEEEEEu?? ?>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>?? ?E}EEEEEEEEEEEu??????????????????????? ?E{EEEEEEEEEEEs?? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?=?>>>><? ? ? ? ? ? ? ? ? ?=?>>>>>><? ? ? ? ? ? ? ? ? ?=?>>>><? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?? ?E{EEEEEEEEEEEs??????????????????????? ?E}EEEEEEEEEEEu????????????????????? ?>>>>>?????????? ?>>>>>>?????????? ?>>>>>????????????????????? ?E}EEEEEEEEEEEu??????????????????????? ?E{EEEEEEEEEEE>q???????????????????? ?>>>>>>>????????? ?>>>>>>????????? ?>>>>>>>???????????????????? ?EyEEEEEEEEEEEs??????????????????????? ?E}EEEEEEEEEEEExEzE|EzE|Exq??????? ?xyz|z|xq>>>>>>>>xyz|z|xq?? ?>>>>>>?? ?xyz|z|xq>>>>>>>>xyz|z|xq??????? ?ExyEzE|EzE|ExEEEEEEEEEEEEu??????????????????????? ?E{EEEEEEEEEEEEEEEEEs??????? ?{xq>>>>>>xys?? ?>>>>>>?? ?{xq>>>>>>xys??????? ?E{EEEEEEEEEEEEEEEEEs??????????????????????? ?E}EEEEEEEEEEEEEEEEEu??????? ?}:>;>:>;>u?? ?>>>>>>?? ?}:>;>:>;>u??????? ?E}EEEEEEEEEEEEEEEEEu??????????????????????? ?E{EEEEEEEEEEEEEEEEEs??????? ?{s?? ?>>>>>>?? ?{s??????? ?E{EEEEEEEEEEEEEEEEEs??????????????????????? ?E}EEEEEEEEEEEEEEEEEu??????? ?}u?? ?>>>>>>?? ?}u??????? ?E}EEEEEEEEEEEEEEEEEu??????????????????????? ?E{EEEEEEEEEEEEEEEEEs??????? ?{s?? ?>>>>>>?? ?{s??????? ?E{EEEEEEEEEEEEEEEEEs??????????????????????? ?E}EEEEEEEEEEEEEEEEEu??????? ?}u?? ?>>>>>>?? ?}u??????? ?E}EEEEEEEEEEEEEEEEEu??????????????????????? ?E{EEEEEEEEEEEEEEEEEs??????? ?{s?? ?>>>>>>?? ?{s??????? ?E{EEEEEEEEEEEEEEEEEs??????????????????????? ?E}EEEEEEEEEEEEEEEEEu??????? ?}u?? ?>>>>>>?? ?}u??????? ?E}EEEEEEEEEEEEEEEEEu??????????????????????? ?E{EEEEEEEEEEEEEEEEEs??????? ?{s?? ?>>>>>>?? ?{s??????? ?E{EEEEEEEEEEEEEEEEEs??????????????????????? ?E}EEEEEEEEEEEEEEEEEu??????? ?}u?? ?>>>>>>?? ?}u??????? ?E}EEEEEEEEEEEEEEEEEu??????????????????????? ?EyEEEEEEEEEEEEEEEEEq??????? ?{s?? ?>>>>>>?? ?{s??????? ?EyEEEEEEEEEEEEEEEEEq??????????????????????? ? p? r? t? r? t? r? t? r? t? r? t? r? t? r? t? r? t? p? ??????? ?}u?? ?>>>>>>?? ?}u??????? ? p? r? t? r? t? r? t? r? t? r? t? r? t? r? t? r? t? p? ????????????????????????????????????????????????? ?{s?? ?>>>>>>?? ?{s??????????????????????????????????????????????????????????????????????????? ?}>>>>>?? ?}>>>>>?? ?y>>>>>?? ? p? r? t? r? t? p? ??????? ? p? r? t? r? t? p? ?????????????????????????????????????????????????????????????????????????????????????????????????? ?>>>>>>????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? ?>>>>>>????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? ?>>>>>>????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? ?>>>>>>????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? ?>>>>>>????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? ?>>>>>>????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? ?>>>>>>????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? ?>>>>>>????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? ?>>>>>>????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? ?>>>>>>????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? ?>>>>>>????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? ?>>>>>>????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? ?>>>>>>????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? ?>>>>>>?????????????????????????????????????????????????????????????                                  ACorsixTH-0.63/CorsixTH/Campaigns/Four Corners.map000066400000000000000000005001541347163623700216010ustar00rootroot00000000000000??????????????????????????????????????????????????????????? ?>>>>>>>>??????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? ?>>>>>>>>??????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? ?>>>>>>>>??????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? ?>>>>>>>>??????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? ?>>>>>>>>??????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? ?>>>>>>>>??????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? ?>>>>>>>>??????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? ?>>>>>>>>??????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? ?>>>>>>>>??????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? ?>>>>>>>>??????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? ?>>>>>>>>??????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? ?>>>>>>>>??????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? ?>>>>>>>>??????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? ?>>>>>>>>??????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? ?>>>>>>>>??????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? ?>>>>>>>>??????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? ?>>>>>>>>??????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? ?>>>>>>>>??????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? ?>>>>>>>>??????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? ?>>>>>>>>??????????????????????????????????????????????????????????????????????????????????????????????????????????????????N?;?;?;?:? ?>><? ? ?=?>>?N?;?;?;?:?????????????????????????????????????????????????????????????????????????????????????????????????????????????M?D?DF?DG?@? ?>>??? ?>>?M?DH?DF?DG?@?????????????????????????????????????????????????????????????????????????????????????????????????????????????M?D?DG?D?@? ?>>??? ?>>?M?DF?D?D?@?????????????????????????????????????????????????????????????????????????????????????????????????????????????M?DF?D?D?@? ?>>??? ?>>?M?D?D?DH?@?????????????????????????????????????????????????????????????????????????????????????????????????????????????M?DG?D?DH?@? ?>>??? ?>>?M?D?DG?DF?@?????????????????????????????????????????????????????????????????????????????????????????????????????????????M?D?D?DF?@? ?>>??? ?>>?M?DF?D?D?@?????????????????????????????????????????????????????????????????????????????????????????????????????????????M?D?DG?D?@? ?>>??? ?>>?M?D?D?DG?@?????????????????????????????????????????????????????????????????????????????????????????????????????????????M?DF?D?DH?@? ?>>??? ?>>?M?DG?D?DF?@?????????????????????????????????????????????????????????????????????????????????????????????????????????????L?C?C?C?O? ?>>??? ?>>?L?C?C?C?O?????????????????????????????????????????????????????????????????????????????????????????????????????????????????? ?>>>??? ?>>>???????????????????????????????????????????????????????????????????????????????????? ?>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>????????????????????????????????????????????????? ?>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>????????????????????????????????????????????????? ?>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>????????????????????????????????????????????????? ?>>><? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?=?>>><? ? ? ?=?>>><? ? ? ? ? ? ? ? ? ? ?=?>>><? ? ? ?=?>>><? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?=?>>>????????????????????????????????????????????????? ?>>>?????????????????? ?>>>???? ?>>>??????????? ?>>>???? ?>>>?????????????????? ?>>>????????????????????????????????????????????????? ?>>>?????????????????? ?>???? ?>??????????? ?>???? ?>?????????????????? ?>>>????????????????????????????????????????????????? ?>>>?? ?xyz|z|z|z|z|z|z|x:>;>xq?? ?xy:>;>xz|z|z|z|z|x:>;>xq?? ?xy:>;>xz|z|z|z|z|z|z|xq?? ?>>>????????????????????????????????????????????????? ?>>>?? ?{s?? ?{s?? ?{s?? ?>>>????????????????????????????????????????????????? ?>>>?? ?}u?? ?}u?? ?}u?? ?>>>????????????????????????????????????????????????? ?>>>?? ?{s?? ?{s?? ?{s?? ?>>>????????????????????????????????????????????????? ?>>>?? ?}u?? ?}u?? ?}u?? ?>>>????????????????????????????????????????????????? ?>>>?? ?{s?? ?{s?? ?{s?? ?>>>????????????????????????????????????????????????? ?>>>?? ?}u?? ?}u?? ?}u?? ?>>>????????????????????????????????????????????????? ?>>>?? ?{s?? ?{s?? ?{s?? ?>>>????????????????????????????????????????????????? ?>>>?? ?}u?? ?}u?? ?}u?? ?>>>????????????????????????????????????????????????? ?>>>?? ?{s?? ?{s?? ?{s?? ?>>>????????????????????????????????????????????????? ?>>>?? ?}u?? ?}u?? ?}u?? ?>>>????????????????????????????????????????????????? ?>>>?? ?{s?? ?{s?? ?{s?? ?>>>????????????????????????????????????????????????? ?>>>?? ?}u?? ?}u?? ?}u?? ?>>>????????????????????????????????????????????????? ?>>>?? ?{s?? ?{s?? ?{s?? ?>>>????????????????????????????????????????????????? ?>>>?? ?}u?? ?}u?? ?}u?? ?>>>????????????????????????????????????????????????? ?>>>>?? ?y>q?? ?y>q?? ?y>q?? ?>>>????????????????????????????????????????????????? ?>>>>>:>:>>:>:>>:>:>>>>>>????????????????????????????????????????????????? ?>>>>>;>;>>;>;>>;>;>>>>>>????????????????????????????????????????????????? ?>>>>>>>>>>>>>>>????????????????????????????????????????????????? ?>>><? ?=?y<q? ?=?y<q? ?=?y<q? ?=?>>>????????????????????????????????????????????????? ?>>>?? ? p? r? t? r? t? r? t? r? t? r? t? r? t? r? t?=p?:>;>>;>>;>>;>>>>????????????????????????????????????????????????? ?>>>?????????????????? ?>>>???? ?>>>??????????? ?>>>???? ?>>>?????????????????? ?>>>????????????????????????????????????????????????? ?>>>?????????????????? ?>???? ?>??????????? ?>???? ?>?????????????????? ?>>>????????????????????????????????????????????????? ?>>>>?? ?xyz|z|z|z|z|z|z|x:>;>x>q?? ?xy:>;>xz|z|z|z|z|x:>;>x>q?? ?xy:>;>xz|z|z|z|z|z|z|x>q?? ?>>>????????????????????????????????????????????????? ?>>>>>:>:>>:>:>>:>:>>>>>>????????????????????????????????????????????????? ?>>>>>;>;>>;>;>>;>;>>>>>>????????????????????????????????????????????????? ?>>>>>>>>>>>>>>>????????????????????????????????????????????????? ?>>><? ?=?y<q? ?=?y<q? ?=?y<q? ?=?>>>????????????????????????????????????????????????? ?>>>?? ?{s?? ?{s?? ?{s?? ?>>>????????????????????????????????????????????????? ?>>>?? ?}u?? ?}u?? ?}u?? ?>>>????????????????????????????????????????????????? ?>>>?? ?{s?? ?{s?? ?{s?? ?>>>????????????????????????????????????????????????? ?>>>?? ?}u?? ?}u?? ?}u?? ?>>>????????????????????????????????????????????????? ?>>>?? ?{s?? ?{s?? ?{s?? ?>>>????????????????????????????????????????????????? ?>>>?? ?}u?? ?}u?? ?}u?? ?>>>????????????????????????????????????????????????? ?>>>?? ?{s?? ?{s?? ?{s?? ?>>>????????????????????????????????????????????????? ?>>>?? ?}u?? ?}u?? ?}u?? ?>>>????????????????????????????????????????????????? ?>>>?? ?{s?? ?{s?? ?{s?? ?>>>????????????????????????????????????????????????? ?>>>?? ?}u?? ?}u?? ?}u?? ?>>>????????????????????????????????????????????????? ?>>>>?? ?y>q?? ?y>q?? ?y>q?? ?>>>????????????????????????????????????????????????? ?>>>>>:>:>>:>:>>:>:>>>>>>????????????????????????????????????????????????? ?>>>>>;>;>>;>;>>;>;>>>>>>????????????????????????????????????????????????? ?>>>>>>>>>>>>>>>????????????????????????????????????????????????? ?>>><? ?=?y<q? ?=?y<q? ?=?y<q? ?=?>>>????????????????????????????????????????????????? ?>>>?? ? p? r? t? r? t? r? t? r? t? r? t? r? t? r? t?=p?:>;>>;>>;>>;>>>>????????????????????????????????????????????????? ?>>>?????????????????? ?>>>???? ?>>>??????????? ?>>>???? ?>>>?????????????????? ?>>>????????????????????????????????????????????????? ?>>>?????????????????? ?>???? ?>??????????? ?>???? ?>?????????????????? ?>>>????????????????????????????????????????????????? ?>>>>?? ?xyz|z|z|z|z|z|z|x:>;>x>q?? ?xy:>;>xz|z|z|z|z|x:>;>x>q?? ?xy:>;>xz|z|z|z|z|z|z|x>q?? ?>>>????????????????????????????????????????????????? ?>>>>>:>:>>:>:>>:>:>>>>>>????????????????????????????????????????????????? ?>>>>>;>;>>;>;>>;>;>>>>>>????????????????????????????????????????????????? ?>>>>>>>>>>>>>>>????????????????????????????????????????????????? ?>>><? ?=?y<q? ?=?y<q? ?=?y<q? ?=?>>>????????????????????????????????????????????????? ?>>>?? ?{s?? ?{s?? ?{s?? ?>>>????????????????????????????????????????????????? ?>>>?? ?}u?? ?}u?? ?}u?? ?>>>????????????????????????????????????????????????? ?>>>?? ?{s?? ?{s?? ?{s?? ?>>>????????????????????????????????????????????????? ?>>>?? ?}u?? ?}u?? ?}u?? ?>>>????????????????????????????????????????????????? ?>>>?? ?{s?? ?{s?? ?{s?? ?>>>????????????????????????????????????????????????? ?>>>?? ?}u?? ?}u?? ?}u?? ?>>>????????????????????????????????????????????????? ?>>>?? ?{s?? ?{s?? ?{s?? ?>>>????????????????????????????????????????????????? ?>>>?? ?}u?? ?}u?? ?}u?? ?>>>????????????????????????????????????????????????? ?>>>?? ?{s?? ?{s?? ?{s?? ?>>>????????????????????????????????????????????????? ?>>>?? ?}u?? ?}u?? ?}u?? ?>>>????????????????????????????????????????????????? ?>>>?? ?{s?? ?{s?? ?{s?? ?>>>????????????????????????????????????????????????? ?>>>?? ?}u?? ?}u?? ?}u?? ?>>>????????????????????????????????????????????????? ?>>>?? ?{s?? ?{s?? ?{s?? ?>>>????????????????????????????????????????????????? ?>>>?? ?}u?? ?}u?? ?}u?? ?>>>????????????????????????????????????????????????? ?>>>?? ?yq?? ?yq?? ?yq?? ?>>>????????????????????????????????????????????????? ?>>>?? ? p? r? t? r? t? r? t? r? t? r? t? r? t? r? t?=p?:>;>>;>>;>>;>>>>????????????????????????????????????????????????? ?>>>?????????????????? ?>>>???? ?>>>??????????? ?>>>???? ?>>>?????????????????? ?>>>????????????????????????????????????????????????? ?>>>>?????????????????? ?>>>>???? ?>>>>??????????? ?>>>>???? ?>>>>?????????????????? ?>>>????????????????????????????????????????????????? ?>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>????????????????????????????????????????????????? ?>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>????????????????????????????????????????????????? ?>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>????????????????????????????????????????????????? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?=?>><? ? ?=?>><? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ???????????????????????????????????????????????????????????????????????????????N?;?;?;?:? ?>>??? ?>>?N?;?;?;?:?????????????????????????????????????????????????????????????????????????????????????????????????????????????M?DG?D?DF?@? ?>>??? ?>>?M?DF?DG?D?@?????????????????????????????????????????????????????????????????????????????????????????????????????????????M?DF?D?DH?@? ?>>??? ?>>?M?DH?D?DF?@?????????????????????????????????????????????????????????????????????????????????????????????????????????????M?D?D?D?@? ?>>??? ?>>?M?D?DF?D?@?????????????????????????????????????????????????????????????????????????????????????????????????????????????M?DH?DF?DG?@? ?>>??? ?>>?M?D?D?DG?@?????????????????????????????????????????????????????????????????????????????????????????????????????????????M?D?D?D?@? ?>>??? ?>>?M?DG?D?DH?@?????????????????????????????????????????????????????????????????????????????????????????????????????????????M?DG?D?DF?@? ?>>??? ?>>?M?D?DH?DF?@?????????????????????????????????????????????????????????????????????????????????????????????????????????????M?DF?DH?DG?@? ?>>??? ?>>?M?DF?DG?D?@?????????????????????????????????????????????????????????????????????????????????????????????????????????????L?C?C?C?O? ?>>>??? ?>>?L?C?C?C?O?????????????????????????????????????????????????????????????????????????????????????????????????????????????????? ?>>>>>>>>??????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? ?>>>>>>>>??????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? ?>>>>>>>>??????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? ?>>>>>>>>??????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? ?>>>>>>>>??????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? ?>>>>>>>>??????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? ?>>>>>>>>??????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? ?>>>>>>>>??????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? ?>>>>>>>>??????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? ?>>>>>>>>????????????????????????????????????????????????????????????                        A4CorsixTH-0.63/CorsixTH/Campaigns/Greyham Gardens.map000066400000000000000000005001541347163623700222320ustar00rootroot00000000000000??????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? ?xyz|z|z|xq??????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? ?{s??????????????????????????????????????????????????????????????????????????????????????????????????????? ?xyz|xz|xz|xq????? ?}u????? ?xyz|xz|xz|xq??????????????????????????????????????????????????????????????????????????????????????? ?{s????? ?{s????? ?{s??????????????????????????????????????????????????????????????????????????????????????? ?}u????? ?}u????? ?}u??????????????????????????????????????????????????????????????????????????????????????? ?ys????? ?{s????? ?{q??????????????????????????????????????????????????????????????????????????????????????? ?{u????? ?}u????? ?}s??????????????????????????????????????????????????????????????????????????????????????? ?}>q????? ?y>q????? ?yu??????????????????????????????????????????????????????????????????????????????????????? ?yxz|z|xxz|z|xq??????????????????????????????????????????????????????????????????????????????????????? ?{s??????????????????????????????????????????????????????????????????????????????????????? ?}u??????????????????????????????????????????????????????????????????????????????????????? ?yq??????????????????????????????????????????????????????????????????????????????????????? ?{q??????? ?{s??????????????????????????????????????????????????????????????????????????????????????? ?}u?????? ?xyx>q?????? ?}u??????????????????????????????????????????????????????????????????????????????????????? ?yq????? ?xyx>q????? ?yq??????????????????????????????????????????????????????????????????????????????????????? ? p? r? t? p? r? t? p? r? t? p? ??? ?xyxxxq??? ? p? r? t? p? r? t? p? r? t? p? ????????????????????????????????????????????????????????????????????????????????????????????????????? ?{s??????????????????????????????????????????????????????????????????????????????????????????????????????????????????? ?}u??????????????????????????????????????????????????????????????????????????????????????????????????????????????????? ?yq??????????????????????????????????????????????????????????????????????????????????????????????????????????????????? ?yq??????????????????????????????????????????????????????????????????????????????????????????????????????????????????? ?{s??????????????????????????????????????????????????????????????????????????????????????????????????????????????????? ?}u??????????????????????????????????????????????????????????????????????????????????????????????????????????????????? ?yq??????????????????????????????????????????????????????????????????????????????????????????????????????????????????? ?yq??????????????????????????????????????????????????????????????????????????????????????????????????????????????????? ?{s??????????????????????????????????????????????????????????????????????????????????????????????????????????????????? ?}u??????????????????????????????????????????????????????????????????????????????????????????????????????????????????? ?y>q?????????????????????????????????????????????????????????????????????????????????????????????????????????????? ?xyzzzxx|||xq????????????????????????????????????????????????????????????????????????????????????????????????????????? ?{s????????????????????????????????????????????????????????????????????????????????????????????????????????? ?}u????????????????????????????????????????????????????????????????????????????????????????????????????????? ?yq??????????????? ?y>q???????????????????????????????????????????????????????????????????????????????????????????????????????? ?xyxz|xxz|xxz|xxz|xxq??????????????????????????????????????????????????????????????????????????????????????????????????????? ?}s?????????????????????????????????????????????????????????????????????????????????????????? ?>>>>>>??????? ?}s?N?;?;?;?;?;?;?;?;?;?;?;?:????????????????????????????????????????????????????????????????????????????? ?>>>>>>>>>>>>:>s?M?DF?D?D?DG?D?D?DG?D?DF?D?DH?@????????????????????????????????????????????????????????????????????????????? ?>>>>>>>>>>>>;>q?M?DG?D?DH?D?D?DF?D?D?D?DG?DF?@????????????????????????????????????????????????????????????????????????????? ?>>>>>>>>>>>>u?M?D?DH?DF?D?DG?D?D?DH?D?DF?D?@????????????????????????????????????????????????????????????????????????????? ?>>>>><? ? ? ? ? ? ?=?{u?L?C?C?C?C?C?C?C?C?C?C?C?O????????????????????????????????????????????????????????????????????????????? ? ? ? ? ? ? ??????? ?{u??????????????????????????????????????????????????????????????????????????????????????????????????????? ?yq??????????????????????????????????????????????????????????????????????????????????????????????????????? ? p? r? r? r?=p?yq??????? ?y>q??????????????????????????????????????????????????????????????????????????????????????????????? ?xyz|xxz|x>q???????? ?xyxz|z|z|xxq???????? ?xyz|xxz|xq????????????????????????????????????????????????????????????????????????????? ?{x>q??????? ?y>q??????? ?xys????????????????????????????????????????????????????????????????????????????? ?}xz|z|z|xxz|z|z|xu????????????????????????????????????????????????????????????????????????????? ?yq????????????????????????????????????????????????????????????????????????????? ?yq????????????????????????????????????????????????????????????????????????????? ?{q???????? ?{q????????????????????????????????????????????????????????????????????????????? ?{u??? ?>>>>:>:>>>>>??? ?}s????????????????????????????????????????????????????????????????????????????? ?}q??? ?>>>>;>;>>>>>??? ?yu????????????????????????????????????????????????????????????????????????????? ?yq??? ?>>>>>>>>>??? ?yq????????????????????????????????????????????????????????????????????????????? ?{s??? ?>>><?=?y<q?=?>>>??? ?{s????????????????????????????????????????????????????????????????????????????? ?}u??? ?>>>? ?{s? ?>>>??? ?}u????????????????????????????????????????????????????????????????????????????? ?yq??? ?>>>? ?}u? ?>>>??? ?yq????????????????????????????????????????????????????????????????????????????? ?yq??? ?>>>? ?yq? ?>>>??? ?yq????????????????????????????????????????????????????????????????????????????? ?{s??? ?>>>? ? p? r? t? p? r? t? p? r? t? p? r? t? p? r? t? p? ? ?>>>??? ?{s????????????????????????????????????????????????????????????????????????????? ?}u??? ?>>>??????????????????? ?>>>??? ?}u????????????????????????????????????????????????????????????????????????????? ?yq??? ?>>>?????? ?>>>>>>>?????? ?>>>??? ?yq????????????????????????????????????????????????????????????????????????????? ? p? r? t? p? p? r? t? p? ??? ?>>>????? ?>>>>>>>>>????? ?>>>??? ? p? r? t? p? p? r? t? p? ????????????????????????????????????????????????????????????????????????????????????????? ?>>>>???? ?>>>>>>>>>>>???? ?>>>????????????????????????????????????????????????????????????????????????????????????????????????????? ?>>>>>>>>>>>>>>>>>>>>>>>>>>????????????????????????????????????????????????????????????????????????????????????????????????????? ?>>>>>>>>>>>>>>>>>>>>>>>>>>????????????????????????????????????????????????????????????????????????????????????????????????????? ? ? ? ? ? ? ? ?=?>>>>>>>>>><? ? ? ? ? ? ? ? ????????????????????????????????????????????????????????????????????????????????????????????????????????????? ?=?>>>>>>>><? ?????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? ?=?>>>>>><? ???????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? ?=?>>>><? ?????????????????????????????????????????????????????????????????????????????????????????????????????????????????????N?;?;?;?:? ?>>>>?N?;?;?;?:?????????????????????????????????????????????????????????????????????????????????????????????????????????????????M?DG?DF?DH?@? ?>>>>?M?DF?D?DH?@?????????????????????????????????????????????????????????????????????????????????????????????????????????????????M?D?D?DF?@? ?>>>>?M?D?DF?DF?@?????????????????????????????????????????????????????????????????????????????????????????????????????????????????M?DH?D?D?@? ?>>>>?M?DG?D?DG?@?????????????????????????????????????????????????????????????????????????????????????????????????????????????????M?D?D?DG?@? ?>>>>?M?D?D?D?@?????????????????????????????????????????????????????????????????????????????????????????????????????????????????M?D?DF?D?@? ?>>>>?M?D?DF?D?@?????????????????????????????????????????????????????????????????????????????????????????????????????????????????M?DG?D?D?@? ?>>>>?M?D?D?DH?@?????????????????????????????????????????????????????????????????????????????????????????????????????????????????M?D?DH?D?@? ?>>>>?M?D?DG?D?@?????????????????????????????????????????????????????????????????????????????????????????????????????????????????M?D?D?DF?@? ?>>>>?M?D?D?D?@?????????????????????????????????????????????????????????????????????????????????????????????????????????????????M?D?D?D?@? ?>>>>?M?DF?DH?DF?@?????????????????????????????????????????????????????????????????????????????????????????????????????????????????M?D?DG?DH?@? ?>>>>?M?D?DG?D?@?????????????????????????????????????????????????????????????????????????????????????????????????????????????????M?DF?D?D?@? ?>>>>?M?DG?D?DH?@?????????????????????????????????????????????????????????????????????????????????????????????????????????????????M?DH?D?D?@? ?>>>>?M?D?D?DF?@?????????????????????????????????????????????????????????????????????????????????????????????????????????????????M?D?D?DF?@? ?>>>>?M?DH?D?D?@?????????????????????????????????????????????????????????????????????????????????????????????????????????????????M?D?D?DG?@? ?>>>>?M?D?D?DG?@?????????????????????????????????????????????????????????????????????????????????????????????????????????????????M?DG?D?DH?@? ?>>>>?M?D?DF?D?@?????????????????????????????????????????????????????????????????????????????????????????????????????????????????M?D?DF?D?@? ?>>>>?M?DG?D?D?@?????????????????????????????????????????????????????????????????????????????????????????????????????????????????M?D?D?D?@? ?>>>>?M?D?D?DH?@?????????????????????????????????????????????????????????????????????????????????????????????????????????????????M?DH?D?DG?@? ?>>>>?M?DF?D?D?@?????????????????????????????????????????????????????????????????????????????????????????????????????????????????M?DF?D?D?@? ?>>>>?M?DH?D?DG?@?????????????????????????????????????????????????????????????????????????????????????????????????????????????????L?C?C?C?O? ?>>>>?L?C?C?C?O?????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? ?>>>>??????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? ?>>>>??????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? ?>>>>??????????????????????????????????????????????????????????????-"CorsixTH-0.63/CorsixTH/Campaigns/Holby.map000066400000000000000000005001541347163623700203470ustar00rootroot00000000000000???????????????????????????????????????????????????????????? ?>>>>>>????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? ?>>>>>>????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? ?>>>>>>????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? ?>>>>>>????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? ?>>>>>>????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? ?>>>>>>????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? ?>>>>>>????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? ?>>>>>>????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? ?>>>>>>????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? ?>>>>>>????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? ?>>>>>>????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? ?>>>>>>????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? ?>>>>>>????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? ?>>>>>>????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? ?>>>>>>????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? ?>>>>>>????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? ?>>>>>>????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? ?>>>>>>????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? ?>>>>>>????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? ?>>>>>>????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? ?>>>>>>????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? ?>>>>>>????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? ?>>>>>>????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? ?>>>>>>????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? ?>>>>>>????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? ?>>>>>>????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? ?>>>>>>????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? ?>>>>>>????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? ?>>>>>>????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? ?>>>>>>????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? ?>>>>>>????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? ?>>>>>>????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? ?>>>>>>????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? ?>>>>>>????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? ?>>>>>>????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? ?>>>>>>????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? ?>>>>>>????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? ?>>>>>>????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? ?>>>>>>????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? ?>>>>>>>???????????????????????????????????????????????????????????????????????????????????????????????????? ?xyz|z|z|z|z|z|z|z|xq>>>>>>>>>>>xyz|z|z|xz|z|z|xq?????????????????????????????????????????????????????????????????????????????????? ?{s>>>>>>>>>>>{s?????????????????????????????????????????????????????????????????????????????????? ?}u>>>>>>>>>>>}u?????????????????????????????????????????????????????????????????????????????????? ?{s>>>>>>>>>>>{s?????????????????????????????????????????????????????????????????????????????????? ?}u>>><? ? ?=?>>>>}u?????????????????????????????????????????????????????????????????????????????????? ?{q>>>??? ?>>>>ys?????????????????????????????????????????????????????????????????????????????????? ?}:>>>>??? ?>>>>:>u?????????????????????????????????????????????????????????????????????????????????? ?y;>>>>??? ?>>>>;>q?????????????????????????????????????????????????????????????????????????????????? ?{>>>??? ?>>>>s?????????????????????????????????????????????????????????????????????????????????? ?}q>>>??? ?>>>>yu?????????????????????????????????????????????????????????????????????????????????? ?{s>>>>??? ?>>>>{s?????????????????????????????????????????????????????????????????????????????????? ?}u>>>>>>>>>>>}u?????????????????????????????????????????????????????????????????????????????????? ?{s>>>>>>>>>>>{s?????????????????????????????????????????????????????????????????????????????????? ?}u>>>>>>>>>>>}u?????????????????????????????????????????????????????????????????????????????????? ?yq>>>>>>>>>>>yq?????????????????????????????????????????????????????????????????????????????????? ?=p?y>>>>>>>>>>>>>>>>>>>>>>?? ?{s??????????????????????????????????????????????????????????????????????????????????????? ?}u????????????? ?>>>>>>>>>>>>?? ?}u??????????????????????????????????????????????????????????????????????????????????????? ?{>q????????????? ?>>>>>>>>>>>>?? ?{s??????????????????????????????????????????????????????????????????????????????????????? ?}x|||xq? ?>>>>>? ?>>>>>>>>>>>>?? ?}u??????????????????????????????????????????????????????????????????????????????????????? ?{s? ?>>>>>? ?>>>>>>>>>>>>?? ?{s??????????????????????????????????????????????????????????????????????????????????????? ?}u? ?>>>>>? ?>>>>>>>>>>>>?? ?}u??????????????????????????????????????????????????????????????????????????????????????? ?{s? ?>>>>>? ?>>>>>>>>>>>>?? ?{s??????????????????????????????????????????????????????????????????????????????????????? ?}u? ?>>>>>? ?>>>>>>>>>>>>?? ?}u??????????????????????????????????????????????????????????????????????????????????????? ?{s? ?=?>>><? ? ?>>>>>>>>>>>>?? ?{s??????????????????????????????????????????????????????????????????????????????????????? ?}u?? ?>>>>?? ?>>>>>>>>>>>>?? ?}u??????????????????????????????????????????????????????????????????????????????????????? ?{s?? ?>>>>>>>>>>>>>>>>>>?? ?{s??????????????????????????????????????????????????????????????????????????????????????? ?}u?? ?>>>>>>>>>>>>>>>>>>?? ?}u??????????????????????????????????????????????????????????????????????????????????????? ?{q?? ?>>>>>>>>>>>>>>>>>>?? ?{s??????????????????????????????????????????????????????????????????????????????????????? ?}>>>>>>>>>>>?? ?}u??????????????????????????????????????????????????????????????????????????????????????? ?{s????????????? ?>>>>>>>>>>>>?? ?{s??????????????????????????????????????????????????????????????????????????????????????? ?}u????????????? ?>>>>>>>>>>>>?? ?}u??????????????????????????????????????????????????????????????????????????????????????? ?y>q????????????? ?>>>>>>>>>>>>>?? ?y>q?????????????????????????????????????????????????????????????????????????????????????? ?xyxz|z|z|z|z|z|xq>>>>>>>>>>>>zyx|xz|xq?????????????????????????????????????????????????????????????????????????????????? ?{s>>>>>>>>>>>>{s?????????????????????????????????????????????????????????????????????????????????? ?}u>>>>>>>>>>>>}u?????????????????????????????????????????????????????????????????????????????????? ?{s>>>>>>>>>>>>{s?????????????????????????????????????????????????????????????????????????????????? ?}u>>>><? ? ?=?>>>>}u?????????????????????????????????????????????????????????????????????????????????? ?{q>>>>??? ?>>>>ys?????????????????????????????????????????????????????????????????????????????????? ?}:>>>>??? ?>>>>:>u?????????????????????????????????????????????????????????????????????????????????? ?y;>>>>??? ?>>>>;>q?????????????????????????????????????????????????????????????????????????????????? ?{>>>>??? ?>>>>s?????????????????????????????????????????????????????????????????????????????????? ?}q>>>>??? ?>>>>yu?????????????????????????????????????????????????????????????????????????????????? ?{s>>>>>??? ?>>>>{s?????????????????????????????????????????????????????????????????????????????????? ?}u>>>>>>>>>>>>}u?????????????????????????????????????????????????????????????????????????????????? ?{s>>>>>>>>>>>>{s?????????????????????????????????????????????????????????????????????????????????? ?}u>>>>>>>>>>>>}u?????????????????????????????????????????????????????????????????????????????????? ?yq>>>>>>>>>>>>yq?????????????????????????????????????????????????????????????????????????????????? ? p? r? t? r? t? r? t? r? t? r? t? r? t? r? t? r? t? p? ? ?=?>>>>>><? ? ? p? r? t? r? t? r? t? p? r? t? r? t? r? t? p? ??????????????????????????????????????????????????????????????????????????????????????????????????????? ?>>>>>>????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? ?>>>>>>????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? ?>>>>>>????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? ?>>>>>>????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? ?>>>>>>????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? ?>>>>>>????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? ?>>>>>>????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? ?>>>>>>????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? ?>>>>>>????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? ?>>>>>>????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? ?>>>>>>????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? ?>>>>>>????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? ?>>>>>>????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? ?>>>>>>????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? ?>>>>>>????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? ?>>>>>>????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? ?>>>>>>????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? ?>>>>>>????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? ?>>>>>>????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? ?>>>>>>????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? ?>>>>>>????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? ?>>>>>>????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? ?>>>>>>????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? ?>>>>>>????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? ?>>>>>>????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? ?>>>>>>????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? ?>>>>>>????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? ?>>>>>>????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? ?>>>>>>????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? ?>>>>>>????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? ?>>>>>>????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? ?>>>>>>????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? ?>>>>>>????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? ?>>>>>>????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? ?>>>>>>????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? ?>>>>>>????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? ?>>>>>>????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? ?>>>>>>????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? ?>>>>>>?????????????????????????????????????????????????????????????%CorsixTH-0.63/CorsixTH/Campaigns/Hoppalong.map000066400000000000000000005001541347163623700212210ustar00rootroot00000000000000?????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? ?>>>>>>?????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? ?>>>>>>>>>>????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? ?>>>>>>>>>>????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? ?>>>>>>>>>>????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? ?>>>>><?=?>>>????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? ? ? ? ? ? ? ? ?>>>???????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? ?>>>???????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? ?>???????????????????????????????????????????????????????????????????????????????????????????????????????????????????? ?KxyKzK|KzK|KzK|Kx:K>;K>KKxq??????????????????????????????????????????????????????????????????????????????????????????????????????????????????? ?K{KKKKKKKKKKKs??????????????????????????????????????????????????????????????????????????????????????????????????????????????????? ?K}KKKKKKKKKKKu????????????????????????????????????????????????????????????????????? ?KxyKzK|KzK|KzK|KxKzK|KzK|KzK|Kxq??????? ?KxyKzK|KzK|KzK|KzK|Kx>q???????????? ?KyKKKKKKKKKKK>q???????????? ?KxyKzK|KzK|KzK|KzK|Kxq??????? ?KxyKzK|KzK|KzK|KxKzK|KzK|KzK|Kxq??????????????????????? ?K{KKKKKKKKKKKKKKs??????? ?K{KKKKKKKKKKxKzK|KxKzK|KxKzK|KxKzK|KxKKKKKKKKKKKKKxKzK|KxKzK|KxKzK|KxKzK|KxKKKKKKKKKKs??????? ?K{KKKKKKKKKKKKKKs??????????????????????? ?K}KKKKKKKKKKKKKKu??????? ?K}KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKu??????? ?K}KKKKKKKKKKKKKKu??????????????????????? ?K{KKKKKKKKKKKKKKs??????? ?K{KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKs??????? ?K{KKKKKKKKKKKKKKs??????????????????????? ?K}KKKKKKKKKKKKKKu??????? ?K}KKKKKKKKKq??????? ?KyKKKKKKKKKs???????????? ?K{KKKKKKKKKKKs???????????? ?K{KKKKKKKKK>q??????? ?KyKKKKKKKKKKKKKKs??????????????????????? ?K}KKKKKKKKKKKKKKKxKzK|KzK|KzK|KxKKKKKKKKKKu???????????? ?K}KKKKKKKKKKKu???????????? ?K}KKKKKKKKKKxKzK|KzK|KzK|KxKKKKKKKKKKKKKKKu??????????????????????? ?K{KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKs???????????? ?KyKKKKKKKKKKKq???????????? ?K{KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKs??????????????????????? ?K}KKKKKKKKKKKKKKKKu??? ?K}KKKKKKKKKKKs???????????????? ?K{KKKs???????????????? ?K{KKKKKKKKKKK>u??? ?K}KKKKKKKKKKKKKKKKs??????????????????????? ?K}KKKKKKKKKKKKKKKKKzK|KzK|KKKKKKKKKKKKu?????? ?KxyKzK|KzK|Kxq??? ?K}KKKu??? ?KxyKzK|KzK|Kxq?????? ?K}KKKKKKKKKKKKzK|KzK|KKKKKKKKKKKKKKKKKu??????????????????????? ?K{KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKs?????? ?KyKKKKK>q??? ?KyKKK>q??? ?KyKKKKK>q?????? ?K{KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKs??????????????????????? ?K}KKKKKKKKKKKKKK;>>;>>p>???? ?=p?:>;>>;>>>>??????????????????? ?>>>???? ?>KyKKKKKKKKKKKKKKKKKKKKKKKq>>>???? ?>>>??????????????????? ?>>>??????????????????????????????????? ?>>>>??????????????????? ?>>>>??? ?>>:K>KKKKKKKKKKKKKKKKKKKKKKK:>>>>??? ?>>>>??????????????????? ?>>>>??????????????????>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>;K>KKKKKKKKKKKKKKKKKKKKKKK;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>KKKKKKKKKKKKKKKKKKKKKKKK>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>:K>KKKKKKKKKKKKKKKKKKKKKKK:>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>;K>KKKKKKKKKKKKKKKKKKKKKKK;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?=?>>><? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?=?>>><? ? ?=?>>KKKKKKKKKKKKKKKKKKKKKKKK>>><? ? ?=?>>><? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?=?>>><? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?????????????????? ?>>>??????????????????? ?>>>??? ?=?>KyKKKKKKKKKKKKKKKKKKKKKKKq>><? ??? ?>>>??????????????????? ?>>>??????????????????????????????????? ?>????????N?;?;?:???????? ?>???? ?=?KyKKKKKKKKKKKKKKKKKKKKKKKq>><? ???? ?>????????N?;?;?:???????? ?>????????????????????????????? ?KxyKzK|KzK|Kx:K>;K>KKxKzK|KzK|Kxq??M?DH?DF?@?? ?KxyKzK|KzK|Kx:K>;K>KKxq???? ?KxyKxKKKKKKKKKKKKKKKKKKKKKKKKKxKxq???? ?Kxy:K>;K>KKxKzK|KzK|Kxq??M?D?DF?@?? ?KxyKzK|KzK|Kx:K>;K>KKxKzK|KzK|Kxq??????????????????????? ?K{KKKKKKKKKKKKKKs??M?D?DG?@?? ?K{KKKKKKKKKs???? ?K{KKKKKKKKKKKKKKKKKKKKKKKKKKKs???? ?K{KKKKKKKKKs??M?DG?D?@?? ?K{KKKKKKKKKKKKKKs??????????????????????? ?K}KKKKKKKKKKKKKKu??M?DF?DG?@?? ?K}KKKKKKKKKu???? ?K}KKKKKKKKKKKKKKKKKKKKKKKKKKKu???? ?K}KKKKKKKKKu??M?DF?DG?@?? ?K}KKKKKKKKKKKKKKu??????????????????????? ?K{KKKKKKKKKKKKKKs??L?C?C?O?? ?K{KKKKKKKKKs???? ?K{KKKKKKKKKKKKKKKKKKKKKKKKKKKs???? ?K{KKKKKKKKKs??L?C?C?O?? ?K{KKKKKKKKKKKKKKs??????????????????????? ?K}KKKKKKKKKKKKKKu??????? ?K}KKKKKKKKKu???? ?K}KKKKKKKKKKKKKKKKKKKKKKKKKKKu???? ?K}KKKKKKKKKu??????? ?K}KKKKKKKKKKKKKKu??????????????????????? ?K{KKKKKKKKKKKKKK>q??????? ?KyKKKKKKKKKs???? ?KyKKKKKKKKKKKKKKKKKKKKKKKKKKKq???? ?K{KKKKKKKKK>q??????? ?KyKKKKKKKKKKKKKKs??????????????????????? ?K}KKKKKKKKKKKKKKKxKzK|KzK|KzK|KxKKKKKKKKKKu???? ? p?=p?KyKKKKKu??? ?K}KKKKKKKKKKKs???????????????? ?KyKKK>q???????????????? ?K{KKKKKKKKKKK>u??? ?K}KKKKKKKKKKKKKKKKs??????????????????????? ?K}KKKKKKKKKKKKKKKKKzK|KzK|KKKKKKKKKKKKu???????????? ?KxyKzK|KxKKKKKxKzK|Kxq???????????? ?K}KKKKKKKKKKKKzK|KzK|KKKKKKKKKKKKKKKKKu??????????????????????? ?K{KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKs???????????? ?K{KKKKKKKKKKKs???????????? ?K{KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKs??????????????????????? ?K}KKKKKKKKKKKKKKq???????????? ?KyKKKKKKKKKKK>q???????????? ?KyKKKKKKKKKs??????? ?K{KKKKKKKKKKKKKKs??????????????????????? ?K}KKKKKKKKKKKKKKu??????? ?K}KKKKKKKKKKxKzK|KxKzK|KxKzK|KxKzK|KxKKKKKKKKKKKKKxKzK|KxKzK|KxKzK|KxKzK|KxKKKKKKKKKKu??????? ?K}KKKKKKKKKKKKKKu??????????????????????? ?K{KKKKKKKKKKKKKKs??????? ?K{KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKs??????? ?K{KKKKKKKKKKKKKKs??????????????????????? ?K}KKKKKKKKKKKKKKu??????? ?K}KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKu??????? ?K}KKKKKKKKKKKKKKu??????????????????????? ?KyKKKKKKKKKKKKKKq??????? ?KyKKKKKKKKK>>>>>????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? ?>>>>>>????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? ?>>>>>>????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? ?>>>>>>????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? ?>>>>>>????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? ?>>>>>>????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? ?>>>>>>????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? ?>>>>>>????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? ?>>>>>>????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? ?>>>>>>????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? ?>>>>>>????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? ?>>>>>>????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? ?>>>>>>????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? ?>>>>>>?????????????????????????????????????????????????????????????????????????? ?ExyEzE|Ex:>>>>>>>>>>:Ax>AzA|AzA|AzA|AzA|AzA|Axq?N?;?:? ?xyz|z|z|z|z|xq?? ?>>>>>>?? ?xyz|z|z|z|z|xq?N?;?:? ?AxyAzA|AzA|AzA|AzA|AzA|Ax:>>>>>>>>>>:Ex>EzE|Exq??????????????????????????? ?E{EEE;>>>>>>>>>>;A>AAAAAAAAAAAs?M?DF?@? ?{s?? ?>>>>>>?? ?{s?M?DF?@? ?A{AAAAAAAAAAA;>>>>>>>>>>;E>EEEs??????????????????????????? ?E}EEE>>>>>>>>>>AAAAAAAAAAAAu?L?C?O? ?}u?? ?>>>>>>?? ?}u?L?C?O? ?A}AAAAAAAAAAA>>>>>>>>>>EEEEu??????????????????????????? ?E{EEE<q? ? ? ? ? ? ? ? ? ? ? p?=p?AyAAAAAAAAA>q???? ?y>q?? ?>>>>>>>?? ?y>q???? ?AyAAAAAAAAA>:>:>>>>>>>>>>>:>:>>:Ax>AxAAAAAAAAAAs???????????? ?E{EEEu??????????????????????????? ?E{EEEu???????????? ?A}AAAAAAAAAAA;>>;>;>>>>>>>>>>>;>;>>;A>AAAAAAAAAAAu???????????? ?E}EEEs??????????????????????????? ?E}EEE>q???????????? ?AyAAAAAAAAAAA>>>>>>>>>>>>>>>AAAAAAAAAAAAq???????????? ?EyEEEu??????????????????????????? ?E{EEEExEzE|EzE|EzE|Exq???? ? p? r? t? r? t? r? t? r? t? r? t? p? ? ? ? p? r? t? r? t? r? t? r? t? r? t? p? ? ?=?>>>>>><? ? ? p? r? t? r? t? r? t? r? t? r? t? p? ? ? ? p? r? t? r? t? r? t? r? t? r? t? p? ???? ?ExyEzE|EzE|EzE|ExEEEEs??????????????????????????? ?E}EEEEEEEEEEEs?????????????????????????????????? ?>>>>>>?????????????????????????????????? ?E{EEEEEEEEEEEu??????????????????????????? ?E{EEEEEEEEEEEu??????????????????? ?xyz|xz|xz|xz|xq? ?>>>>>>? ?xyz|xz|xz|xz|xq??????????????????? ?E}EEEEEEEEEEEs??????????????????????????? ?E}EEEEEEEEEEEs?? ?xyz|z|z|z|z|z|xq?? ?{s? ?>>>>>>? ?{s?? ?xyz|z|z|z|z|z|xq?? ?E{EEEEEEEEEEEu??????????????????????????? ?E{EEEEEEEEEEEu?? ?{s?? ?}u? ?>>>>>>? ?}u?? ?{s?? ?E}EEEEEEEEEEEs??????????????????????????? ?E}EEEEEEEEEEEs?? ?}u?? ?{s? ?>>>>>>? ?{s?? ?}u?? ?E{EEEEEEEEEEEu??????????????????????????? ?E{EEEEEEEEEEEu?? ?{s?? ?}u? ?>>>>>>? ?}u?? ?{s?? ?E}EEEEEEEEEEEs??????????????????????????? ?E}EEEEEEEEEEEs?? ?}u?? ?{s? ?>>>>>>? ?{s?? ?}u?? ?E{EEEEEEEEEEEu??????????????????????????? ?E{EEEEEEEEEEEu?? ?{s?? ?}u? ?>>>>>>? ?}u?? ?{s?? ?E}EEEEEEEEEEEs??????????????????????????? ?E}EEEEEEEEEEEs?? ?}u?? ?{s? ?>>>>>>? ?{s?? ?}u?? ?E{EEEEEEEEEEEu??????????????????????????? ?E{EEEEEEEEEEEu?? ?{s?? ?}u? ?>>>>>>? ?}u?? ?{s?? ?E}EEEEEEEEEEEs??????????????????????????? ?E}EEEEEEEEEEEs?? ?}u?? ?{s? ?>>>>>>? ?{s?? ?}u?? ?E{EEEEEEEEEEEu??????????????????????????? ?E{EEEEEEEEEEEu?? ?{s?? ?}u? ?>>>>>>? ?}u?? ?{s?? ?E}EEEEEEEEEEEs??????????????????????????? ?E}EEEEEEEEEEEs?? ?}u?? ?yq? ?>>>>>>? ?yq?? ?}u?? ?E{EEEEEEEEEEEu??????????????????????????? ?E{EEEEEEEEEEEu?? ?{s?? ?y>>>>>? ? p? r? t? r? t? r? t?=p?yq?? ?{s?? ?E}EEEEEEEEEEEs??????????????????????????? ?E}EEEEEEEEEEEs?? ?}u?? ?{s????????? ?>>>>>>????????? ?{s?? ?}u?? ?E{EEEEEEEEEEEu??????????????????????????? ?E{EEEEEEEEEEEu?? ?{s?? ?{s????????? ?>>>>>>????????? ?{s?? ?{s?? ?E}EEEEEEEEEEEs??????????????????????????? ?E}EEEEEEEEEEEs?? ?}u?? ?{s?? ?>>>>>? ?>>>>>>? ?>>>>>?? ?{s?? ?}u?? ?E{EEEEEEEEEEEu??????????????????????????? ?E{EEEEEEEEEEE>u?? ?y>q?? ?yq?? ?>>>>>? ?>>>>>>? ?>>>>>?? ?y>q?? ?y>q?? ?E}EEEEEEEEEEEs??????????????????????????? ?E}EEEEEEEEEEEs>>>p>:>;>>p>r>t>r>t>p>:>;>>p>>>>p>:>;>>p>?? ?>>>>>? ?>>>>>>? ?>>>>>?? ?p>:>;>>p>>>>p>:>;>>p>r>t>r>t>p>:>;>>p>>>>E{EEEEEEEEEEEu??????????????????????????? ?E{EEEEEEEEEEEu>>>>>>>>>>>>>>>>>>>>>>>>>?? ?>>>>>? ?>>>>>>? ?>>>>>?? ?>>>>>>>>>>>>>>>>>>>>>>>>>E}EEEEEEEEEEEs??????????????????????????? ?E}EEEEEEEEEEEs>>>>>>>>>>>>>>>>>>>>>>>>>?? ?>>>>>? ?>>>>>>? ?>>>>>?? ?>>>>>>>>>>>>>>>>>>>>>>>>>E{EEEEEEEEEEEu??????????????????????????? ?E{EEEEEEEEEEEu>>><? ? ? ? ? ? ? ? ? ? ? ? ?=?>>>>>>>>?? ?=?>>><? ? ?>>>>>>? ?=?>>><? ?? ?>>>>>>>><? ? ? ? ? ? ? ? ? ? ? ? ?=?>>>E}EEEEEEEEEEEs??????????????????????????? ?E}EEEEEEEEEEEq>>>????????????? ?>>>>>>>>>??? ?>>>>?? ?>>>>>>>?? ?>>>>??? ?>>>>>>>>????????????? ?>>>EyEEEEEEEEEEEu??????????????????????????? ?E{EEEEE;>>>>>????????????? ?>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>????????????? ?>>>:>;>>>>>>>?? ?KxyKzK|KzK|KzK|Kxq?? ?>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>?? ?KxyKzK|KzK|KzK|Kxq?? ?>>>>>>?? ?E{EEEEEu??????????????????????????? ?E{EEEEEu?? ?>>>>>>?? ?K{KKKKKKKs?? ?>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>?? ?K{KKKKKKKs?? ?>>>>>>?? ?E}EEEEEs??????????????????????????? ?E}EEEEEs?? ? ? ?=?>>>?? ?K}KKKKKKKu?? ?>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>?? ?K}KKKKKKKu?? ?>>><? ? ? ?? ?E{EEEEEu??????????????????????????? ?E{EEEEEu????? ?>>>?? ?K{KKKKKKKs?? ?>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>?? ?K{KKKKKKKs?? ?>>>????? ?E}EEEEEs??????????????????????????? ?E}EEEEE>q????? ?>>>?? ?K}KKKKKKKu?? ?>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>?? ?K}KKKKKKKu?? ?>>>????? ?EyEEEEEu??????????????????????????? ?E{EEEEEExExExq?? ?>>>?? ?K{KKKKKKKs?? ?>><? ? ?=?>><? ? ? ? ? ? ? ? ?=?>>>>>><? ? ? ? ? ? ? ? ?=?>><? ? ?=?>>?? ?K{KKKKKKKs?? ?>>>?? ?ExyExExEEEEEEs??????????????????????????? ?E}EEEEEEEEs?? ?>>>?? ?K}KKKKKKKu?? ?>>??? ?>>????????? ?>>>>>>????????? ?>>??? ?>>?? ?K}KKKKKKKu?? ?>>>?? ?E{EEEEEEEEu??????????????????????????? ?E{EEEEEEEEu?? ?>>>?? ?K{KKKKKKKq?? ?>>??? ?>>??N?;?;?:???? ?????N?;?;?:?? ?>>??? ?>>?? ?KyKKKKKKKs?? ?>>>?? ?E}EEEEEEEEs??????????????????????????? ?E}EEEEEEEEq?? ?>>>?? ?K}KKKKKKK>q?? ?>>??? ?>>??M?DF?DG?@???? ?:Ay>;A>A:A>;A>Aq????M?DF?DG?@?? ?>>??? ?>>>?? ?KyKKKKKKKu?? ?>>>?? ?EyEEEEEEEEu??????????????????????????? ?E{EEEEEEEEs?? ?>>>?? ?K{KKKKKKK:>>>>>??? ?>>??M?DG?DF?@???? ?AyAAAAAq????M?DG?DF?@?? ?>>??? ?>>>>:K>KKKKKKKs?? ?>>>?? ?E{EEEEEEEEs??????????????????????????? ?E}EEEEEEEEu?? ?>>>?? ?K}KKKKKKK;>>>>>??? ?>>??L?C?C?O???? ?AyAAAAAq????L?C?C?O?? ?>>??? ?>>>>;K>KKKKKKKu?? ?>>>?? ?E}EEEEEEEEu??????????????????????????? ?EyEEEEEEEEq?? ?>>>?? ?KyKKKKKKK>>>>>??? ?>>????????? ?AyAAAAAq????????? ?>>??? ?>>>>KKKKKKKKq?? ?>>>?? ?EyEEEEEEEEq??????????????????????????? ? p? r? t? p? p? p? r? t? p? ?? ?>>>?? ? p? r? t? r? t? r? t? p? ? ?=?>>??? ?>>????????? ?AyAAAAA>q????????? ?>>??? ?>><? ? ? p? r? t? r? t? r? t? p? ?? ?>>>?? ? p? r? t? p? p? p? r? t? p? ??????????????????????????????????????? ?>>>????????????? ?>>??? ?>>??????? ?AxyAxAAAAAAAxAxq??????? ?>>??? ?>>????????????? ?>>>??????????????????????????????????????????????????? ?>>>>????????????? ?>>>??? ?>>>??????? ?AyAAAAAAAAA>q??????? ?>>>??? ?>>>????????????? ?>>>>??????????????????????????>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>:Ax>AxAxAxAxAAAAAAAAAAAxAxAxAxAx:>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>;A>AAAAAAAAAAAAAAAAAAA;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>AAAAAAAAAAAAAAAAAAAA>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>:A>AAAAAAAAAAAAAAAAAAA:>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>;A>AAAAAAAAAAAAAAAAAAA;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>AAAAAAAAAAAAAAAAAAAA>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?=?>>><? ? ? ? ? ? ?=?>>><? ? ? ? ? ? ?=?>><? ? ?=?>><? ? ? p? p? p? p?=p?AyAAAAAAAAA><? ? ?=?>><? ? ? ? ? ? ?=?>>><? ? ? ? ? ? ?=?>>><? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ????????????????????? ?>>>??????? ?>>>??????? ?>>??? ?>>??????? ?AyAAAAAAAAAq??????? ?>>??? ?>>??????? ?>>>??????? ?>>>????????????????????????????????????????? ?>>>??????? ?>>>??????? ?>>??? ?>>??????? ? p?=p?AyAAAAA>??? ?>>??????? ?>>>??????? ?>>>????????????????????????????????????????? ?>??????? ?>??????? ?>>??? ?>>????????? ?AyAAAAAq????????? ?>>??? ?>>??????? ???????? ?>??????????????????????????????????? ?xyz|z|x:>;>xz|z|xq? ?:y>;>xz|xxq?? ?>>??? ?>>??N?;?;?:???? ?AyAAAAAq????N?;?;?:?? ?>>??? ?>>?? ?xyxz|x:>;>q? ?xyz|z|x:>;>xz|z|xq????????????????????????????? ?{s? ?{s?? ?>>??? ?>>??M?DG?DF?@???? ?AyAAAAAq????M?DF?DG?@?? ?>>??? ?>>?? ?{s? ?{s????????????????????????????? ?}u? ?}u?? ?>>??? ?>>??M?DF?DG?@???? ?AyAAAAAq????M?DG?DF?@?? ?>>??? ?>>?? ?}u? ?}u????????????????????????????? ?yq? ?yq?? ?>>??? ?>>??L?C?C?O???? ?:>;>>:>;>>????L?C?C?O?? ?>>??? ?>>?? ?yq? ?yq????????????????????????????? ?{q? ?yq?? ?>>??? ?>>????????? ?>>>>>>????????? ?>>??? ?>>?? ?yq? ?ys????????????????????????????? ?}q? ?yq?? ?>>>??? ?>>>????????? ?>>>>>>>????????? ?>>>??? ?>>?? ?yq? ?yu????????????????????????????? ?ys? ?{s?? ?>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>?? ?{s? ?{q????????????????????????????? ?{u? ?}u?? ?>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>?? ?}u? ?}s????????????????????????????? ?}>q? ?y>q?? ?>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>?? ?y>q? ?yu????????????????????????????? ?y:>:>:>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>:>:>:>q????????????????????????????? ?{;>;>;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>;>;>;>s????????????????????????????? ?}>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>u????????????????????????????? ?y>><? ? ? ? ? ? ? ? ? ? ? ? ?=?>>>>>><? ? ? ? ? ? ? ? ? ? ? ? ?=?>>><? ? ? ? p? r? t? r? t? r? t? p? ? ? p? r? t? p? p? p? r? t?=p?yq????????????????????????????? ?{s?????????????????????? ?>>>????????????? ?>>>>>>????????????? ?>>>?????????????????????? ?{s????????????????????????????? ?}u?N?;?;?:?????????????????? ?>>>????????????? ?>>>>>>????????????? ?>>>??????????????????N?;?;?:? ?}u????????????????????????????? ?ys?M?D?DG?@? ?xyz|z|z|xz|z|z|xq? ?>>>>?? ?xyz|z|z|x>q?? ?>>>>>>>?? ?xyz|z|z|x>q?? ?>>>? ?xyz|z|z|xz|z|z|xq?M?DG?D?@? ?{q????????????????????????????? ?yu?M?DF?D?@? ?{s? ?>>>>>:>:>>>>>>>>>>>:>:>>>>>>? ?{s?M?D?DH?@? ?}q????????????????????????????? ?ys?M?DH?D?@? ?}u? ?>>>>>;>;>>>>>>>>>>>;>;>>>>>>? ?}u?M?DH?DF?@? ?{q????????????????????????????? ?{u?M?D?DF?@? ?{s? ?>>>>>>>>>>>>>>>>>>>>>>? ?{s?M?D?D?@? ?}s????????????????????????????? ?}s?M?D?DG?@? ?}u? ?>>><? ?=?y<q? ?=?>>>>>><? ?=?y<q? ?=?>>>? ?}u?M?D?DG?@? ?{u????????????????????????????? ?yu?M?DG?D?@? ?{s? ?>>>?? ?{s?? ?>>>>>>?? ?{s?? ?>>>? ?{s?M?DF?D?@? ?}q????????????????????????????? ?{s?M?DF?DH?@? ?}u? ?>>>?? ?}u?? ?>>>>>>?? ?}u?? ?>>>? ?}u?M?DH?DF?@? ?{s????????????????????????????? ?}u?L?C?C?O? ?{s? ?>>>?? ?{s?? ?>>>>>>?? ?{s?? ?>>>? ?{s?L?C?C?O? ?}u????????????????????????????? ?ys????? ?}u? ?>>>?? ?}u?? ?>>>>>>?? ?}u?? ?>>>? ?}u????? ?{q????????????????????????????? ?{u????? ?y>q? ??? ?{s?? ?>>>>>>?? ?{s?? ?>? ?y>q????? ?}s????????????????????????????? ?}>q?? ?xyxxxx:>;>s?? ?}u?? ?>>>>>>?? ?}u?? ?:{>;>xxxxx>q?? ?yu????????????????????????????? ?y:>>:>u?? ?{s?? ?>>>>>>?? ?{s?? ?}:>>:>q????????????????????????????? ?{;>>;>q?? ?}u?? ?>>>>>>?? ?}u?? ?y;>>;>s????????????????????????????? ?}>>s?? ?{s?? ?>>>>>>?? ?{s?? ?{>>u????????????????????????????? ?y<q? ?=?yu?? ?}u?? ?>>>>>>?? ?}u?? ?}<q? ?=?yq????????????????????????????? ?{s?? ? p? p?=p?y;>>?? ?{s?? ?>>>>>>?? ?{s?? ?:>;>>>>?? ?}u?? ?>>>>>>?? ?}u?? ?>>>? ?{s????? ?}u????????????????????????????? ?y>q????? ?}u? ?>>>?? ?{s?? ?>>>>>>?? ?{s?? ?>>>? ?}u????? ?y>q???????????????????????????? ?xyxxxq?? ?{s? ?>>>?? ?}u?? ?>>>>>>?? ?}u?? ?>>>? ?{s?? ?xyxxxq??????????????????????????? ?{s?? ?}u? ?>>>?? ?{s?? ?>>>>>>?? ?{s?? ?>>>? ?}u?? ?{s??????????????????????????? ?}u?? ?{s? ?>>>?? ?}u?? ?>>>>>>?? ?}u?? ?>>>? ?{s?? ?}u??????????????????????????? ?{s?? ?}u? ?>>>>?? ?y>q?? ?>>>>>>>?? ?y>q?? ?>>>? ?}u?? ?{s??????????????????????????? ?}u?? ?{s? ?>>>>>:>:>>>>>>>>>>>:>:>>>>>>? ?{s?? ?}u??????????????????????????? ?{s?? ?}u? ?>>>>>;>;>>>>>>>>>>>;>;>>>>>>? ?}u?? ?{s??????????????????????????? ?}u?? ?yq? ?>>>>>>>>>>>>>>>>>>>>>>? ?yq?? ?}u??????????????????????????? ?{s?? ? p? r? t? r? t? r? t? p? r? t? r? t? r? t? p? ? ? ? ? ? ? ?=?y<q? ?=?>>>>>><? ?=?y<q? ? ? ? ? ? ? ? p? r? t? r? t? r? t? p? r? t? r? t? r? t? p? ?? ?{s??????????????????????????? ?}u????????????????????????? ? p? r? t? r? t? r? t? p? ?? ?>>>>>>?? ? p? r? t? r? t? r? t? p? ????????????????????????? ?}u??????????????????????????? ?yq???????????????????????????????????? ?>>>>>>???????????????????????????????????? ?yq??????????????????????????? ? p? r? t? r? t? r? t? r? t? p? ???????????????????????????????????? ?>>>>>>???????????????????????????????????? ? p? r? t? r? t? r? t? r? t? p? ?????????????????????????????????????????????????????????????????????????? ?>>>>>>????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? ?>>>>>>????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? ?>>>>>>????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? ?>>>>>>????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? ?>>>>>>????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? ?>>>>>>????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? ?>>>>>>????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? ?>>>>>>????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? ?>>>>>>????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? ?>>>>>>????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? ?>>>>>>????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? ?>>>>>>????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? ?>>>>>>?????????????????????????????????????????????????????????????                                               @ 8CorsixTH-0.63/CorsixTH/Campaigns/Snuffit Sands.map000066400000000000000000005001541347163623700217410ustar00rootroot00000000000000D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?DF?D?D?D?D?DF?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?DH?DF?D?D?D?D?D?D?D?D?D?D?D?D?D?DF?D?D?D?D?D?D?DF?D?D?D?D?DF?D?D?D?DF?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?DF?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?DF?D?D?D?DF?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?DG?D?D?D?D?D?D?D?DG?D?D?D?D?D?DH?D?DG?D?D?D?DF?D?D?D?D?D?D?D?D?D?D?D?DG?D?DF?D?D?D?D?D?D?D?DG?D?D?D?DG?D?D?D?DF?D?D?D?D?D?DH?D?DG?D?D?DH?D?D?DG?D?DH?D?DF?D?D?DH?D?D?D?D?D?D?D?D?DH?D?D?D?D?DF?D?D?D?DH?D?DF?D?D?DG?D?D?D?D?D?D?D?D?D?DF?D?D?D?D?D?D?DH?D?D?D?D?D?D?D?D?D?D?D?D?D?D?DF?D?D?DF?D?DH?D?DF?D?D?D?DF?D?D?D?D?D?DF?D?D?D?D?D?D?D?D?D?DG?D?DF?D?DG?D?D?D?D?D?D?DG?D?DG?D?D?DG?DF?D?D?DH?D?D?D?DF?D?D?D?D?D?D?D?D?D?D?D?D?DF?D?D?D?D?D?D?D?D?DF?D?D?D?DG?D?D?DG?DF?D?D?DF?D?DG?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?DH?D?D?DG?D?D?D?D?D?D?DF?D?D?D?D?DG?D?D?D?DF?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?DG?D?D?D?D?DG?D?DG?D?D?D?DG?D?DG?D?D?DG?D?D?D?D?D?D?D?DF?DG?D?D?DG?D?D?D?DF?D?D?D?D?D?DF?D?DG?D?D?D?D?D?D?DG?D?D?D?DF?D?D?D?D?D?D?D?D?D?DG?D?DG?D?D?D?DG?DF?D?D?D?D?D?D?D?D?DG?D?D?DG?D?DG?D?D?D?DG?D?D?D?DG?D?D?D?D?DF?D?D?D?D?D?DG?D?D?D?D?D?D?D?D?D?D?D?D?D?D?DG?D?D?D?D?D?DG?D?D?DG?D?D?D?DF?D?DH?D?DF?D?DG?DG?D?D?DG?DF?D?D?D?D?D?DF?D?D?D?D?DH?D?D?DG?D?D?D?DG?D?DH?D?DG?D?D?DG?D?D?D?D?D?DG?D?D?DH?D?D?D?DG?D?D?D?DG?D?D?DH?D?D?DG?DF?DG?D?D?D?DG?D?D?D?DH?D?D?DG?D?D?DG?D?DF?D?DH?D?DF?DG?D?D?D?DH?DF?D?D?DF?D?D?DG?D?D?D?D?DG?D?DF?D?D?D?DG?D?D?DG?D?D?DF?DG?D?D?DG?D?D?DH?D?DF?D?D?DF?D?D?DF?D?D?D?D?D?D?D?D?D?D?DF?D?D?D?D?DH?D?D?D?D?D?D?DG?D?D?D?D?DF?D?D?D?D?DF?D?D?D?D?D?D?D?D?D?DF?D?D?D?D?D?DF?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?DH?D?D?D?D?D?D?DH?D?D?D?D?DH?D?D?D?DF?D?D?DH?D?D?D?D?D?D?DF?D?C?C?C?C?C?C?C?C?C?C?C?C?C?C?C?C?C?C?C?C?C?C?C?C?C?C?C?C?C?C?C?C?C?C?C?C?C?C?C?C?C?C?C?C?C?C?C?C?C?C?C?C?C?C?C?C?C?C?C?C?C?C?C?C?C?C?C?C?C?C?C?C?C?C?C?C?C?C?C?C?C?C?C?C?C?C?C?C?C?C?C?C?C?C?C?C?C?C?C?C?C?C?C?C?C?C?C?C?C?C?C?C?C?C?C?C?C?C?C?C?C?C?C?C?C?C?C?C?????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? ?ExyEzE|ExEzE|ExEzE|ExEzE|Exq?????????????????????????????????????????????????????????????????????????????????????????????????????????????????? ?E{EEEEEEEEEEEEs???????????????????? ?ExyEzE|ExExEzE|ExExEzE|Exq??? ?ExyEzE|ExEzE|ExEzE|ExEzE|ExEzE|Exq????????????????????????????????????????????????????????????? ?E{EEEEEEEEEEEEu???????????????????? ?E{EEEEEEEEEEEs??? ?E{EEEEEEEEEEEEEEEs????????????????????????????????????????????????????????????? ?E{EEq?????? ?E{EEs???????????????????? ?EyEEEEEEEEEEEq??? ?EyEEEEEEEEEEEEEEEq????????????????????????????????????????????????????????? ?ExyEzE|ExEEEExEzE|Exq?? ?E}EEu???????????????????? ?E{EEEEEEEEEEEs??? ?E{EEEEEq???????????????????? ?E}EEEEEEEEEEEu??? ?E}EEEEE>u??? ?E}EEEEEu????????????????????????????????????????????????????????? ?E{EEEEEEEEEEu?? ?E}EEExEzE|ExExEzE|ExExExEzE|ExExEzE|Ex>q??? ?EyEEEEEEEEEEEq??? ?E{EEEEEEzE|EzE|EEEEEEq????????????????????????????????????????????????????????? ?E{EEEEEEEEEEq?? ?E{EEEEEEEEEEEEEEEEEEEExEzE|ExEEEEEEEEEEEEs??? ?E}EEEEEEEEEEEEEEEs????????????????????????????????????????????????????????? ?EyEEEEEEEEEEq?? ?E}EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEu??? ?EyEEEEEEEEEEEEEEEu????????????????????????????????????????????????????? ?>>>:E>EEEEEEEEEEs?? ?E{EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEq??? ?E{EEEEEEEEEEEEEEEq???????????????????????????????????????????????????? ?>>>>;E>EEEEEEEEEEu?? ?E}EEEEEEEEEEEEEEEEEEE>>>>EEEEEEEEEEEq?? ?E{EEEEEEEEEEEEEEEEEEE>q??????????????????? ?EyEEEEE>u??? ?E}EEEEEu????????????????????????????????>>>>>>>>>>>>>>>>>>>>>>>>>EyEEEEEEEEEEq?? ?E}EEEEEEEEEEEEEEEEEEEExEzE|ExExEzE|ExExEzE|ExExEzE|ExExEzE|ExEEEEEEEzE|EzE|EEEEEEq????????????????????????????????>>>>>>>>>>>>>>>>>>>>>>>>>E{EEEEEEEEEEs?? ?E{EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEs????????????????????????????????>>>>>>>>>>>>>>>>>>>>>>>>>E}EEEEEEEEEEu?? ?E}EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEu????????????????????????????????>>>>>>>>>>>>>>>>>>>>>>>>>EyEEEEEEEEEEq?? ?E{EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEq???????????????????????????????? ? ? ? ? ? ? ? ? ? ? ? ?=?>>><? ? ?=?>>>>>:E>EEEEEEEEEEq?? ?E}EEEEEEEEEEEEEEEEEEE>>??? ?=?>>>>;E>EEEEEEEEEEs?? ?E{EEEEEEEEEEEEEEEEEEE>q??????????????????? ?E{EEEEE>u??? ?E}EEEEEu???????????????????????????????????????????? ?>>>>???? ?=?>>>EEEEEEEEEEEu?? ?E}EEEEEEEEEEEEEEEEEEEExEzE|ExExEzE|ExExEzE|ExExEzE|Exq??? ?E}EEEEEEzE|EzE|EEEEEEq??????????????????????????????????????????? ?>>>>>???? ? ? ? ?=?EyEEEEEEEEEEq?? ?E{EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEs??? ?EyEEEEEEEEEEEEEEEs??????????????????????????????????????????? ?>>>>>???????? ?E}EEEEEEEEEEq?? ?E}EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEu??? ?E{EEEEEEEEEEEEEEEu??????????????????????????????????????????? ?>>>>>???????? ?E}EEEEEEEEEEs?? ?E{EEEEEEEEEEEEEEEEEEE>>>>???????? ?E}EEEEEEEEEEu?? ?E}EE>>>>???????? ?EyEEEEEEEEEEq?? ?E{EEs???????????????????? ?E}EEEEEEEEEEEu??? ?E}EEEEE>u??? ?E}EEEEEu??????????????????????????????????????????? ? ? ? ? ? ? ???????? ? p? r? t?=p?EyEEq?????? ?EyEEq???????????????????? ?E{EEEEEEEEEEEs??? ?E{EEEEEEEEEEEEEEEs????????????????????????????????????????????????????????????? ?E}EEExEzE|ExEzE|ExEEEs???????????????????? ?E}EEEEEEEEEEEu??? ?E}EEEEEEEEEEEEEEEu????????????????????????????????????????????????????????????? ?E}EEEEEEEEEEEEu???????????????????? ?EyEEEEEEEEEEEq??? ?EyEEEEEEEEEEEEEEEq????????????????????????????????????????????????????????????? ?EyEEEEEEEEEEEEq???????????????????? ? p? r? t? p? p? r? t? p? p? r? t? p? ??? ? p? r? t? p? r? t? p? r? t? p? r? t? p? r? t? p? ????????????????????????????????????????????????????????????? ? p? r? t? p? r? t? p? r? t? p? r? t? p? ?????????????????????????????????????????????????????????????????????????????????????;?;?;?;?;?;?;?;?;?;?;?;?;?;?;?;?;?;?;?;?;?;?;?;?;?;?;?;?;?;?;?;?;?;?;?;?;?;?;?;?;?;?;?;?;?;?;?;?;?;?;?;?;?;?;?;?;?;?;?;?;?;?;?;?;?;?;?;?;?;?;?;?;?;?;?;?;?;?;?;?;?;?;?;?;?;?;?;?;?;?;?;?;?;?;?;?;?;?;?;?;?;?;?;?;?;?;?;?;?;?;?;?;?;?;?;?;?;?;?;?;?;?;?;?;?;?;?;?D?DG?D?D?D?D?D?D?DH?D?D?D?D?D?DH?D?D?D?D?D?D?DH?D?D?D?D?D?D?D?DG?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?DF?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?DG?D?D?D?D?D?D?D?D?DG?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?DH?D?D?D?DF?D?D?D?D?D?D?D?D?DF?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?DG?D?D?D?D?D?DF?D?D?D?D?DG?D?D?D?D?D?DH?D?D?D?D?DG?D?D?DG?DH?D?D?D?D?D?D?D?D?D?D?D?D?DG?D?DH?D?DF?D?D?DH?D?D?DF?D?D?DH?D?D?D?D?DF?D?D?D?D?D?D?D?DG?D?DH?D?D?DH?D?DG?D?D?D?D?DG?D?DH?D?DG?D?D?D?DG?D?DF?D?DH?D?D?D?DF?D?D?D?D?D?D?D?D?D?DG?D?D?D?DG?D?D?D?D?DG?D?D?D?DG?DG?D?DH?DF?D?D?DG?D?D?D?D?DH?DF?D?D?DG?D?D?D?D?D?D?D?D?DF?D?DG?D?D?D?D?DG?D?DG?D?DF?D?D?D?D?DG?D?D?D?D?DG?D?D?DH?DG?D?D?D?D?D?D?DG?D?D?D?D?D?DG?D?D?D?DG?DG?D?D?D?D?D?DG?DG?DG?D?D?D?D?D?DF?D?D?D?D?DG?D?DF?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?DG?D?DG?D?D?D?D?D?D?D?D?D?D?DG?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?DG?D?D?DG?D?DG?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?DF?D?DH?D?D?D?D?DF?D?D?D?D?DG?D?DG?D?D?D?D?D?D?D?D?D?DH?D?D?D?D?DH?D?DF?D?D?D?D?D?D?D?DG?D?D?D?D?D?DG?D?D?D?D?D?D?DG?D?D?DH?DF?D?D?DG?DF?D?DH?D?D?D?D?D?D?D?D?DH?D?DF?D?DH?D?D?D?D?D?DF?D?D?DH?DH?D?D?D?DH?D?D?D?DH?D?DF?D?DG?D?D?D?DH?D?D?D?D?D?D?D?D?DH?D?D?D?D?D?DF?D?D?DH?D?D?D?D?D?DG?DG?D?D?D?D?D?D?D?DH?D?D?D?D?D?D?D?D?DF?D?D?D?DH?D?D?DF?D?D?D?D?D?D?D?D?D?D?D?D?DH?D?DF?D?D?D?D?D?DH?D?D?D?D?D?DH?D?D?D?DF?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?DF?D?D?D?D?D?D?D?D?D?DF?D?D?DH?D?D?DF?D?D?D?D?DH?D?D?D?D?D?DF?D?D?D?D?D?DF?D?D?D?D?D?DF?D?D?D?D?DH?D?DF?D?D?D?D?D?D?D?D?D?D?D?D?D?D?DF?D?D?D?DH?D?D?D?D?D?D?D?D?D?D?D?D?D?DF?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?DF?D?D?D?DF?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D? #CorsixTH-0.63/CorsixTH/Campaigns/Tufflook.map000066400000000000000000005001541347163623700210630ustar00rootroot00000000000000????????????????????????????????????????????????????????????? ?>>>>??????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? ?>>>>??????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? ?>>>>?????????????????????????????????????????????????????????????????????????????????????????????????????????????????????N?;?;?;?;?:? ?>>>>?N?;?;?;?;?:???????????????????????????????????????????????????????????????????????????????????????????????????????????????M?D?D?DF?D?@? ?>>>>?M?DF?D?DG?D?@???????????????????????????????????????????????????????????????????????????????????????????????????????????????M?D?D?D?D?@? ?>>>>?M?D?D?D?D?@???????????????????????????????????????????????????????????????????????????????????????????????????????????????M?D?DG?D?DG?@? ?>>>>?M?D?D?DH?D?@???????????????????????????????????????????????????????????????????????????????????????????????????????????????M?D?D?D?D?@? ?>>>>?M?DG?D?DF?D?@???????????????????????????????????????????????????????????????????????????????????????????????????????????????M?D?DF?DH?D?@? ?>>>>?M?D?D?D?D?@???????????????????????????????????????????????????????????????????????????????????????????????????????????????M?D?D?D?DF?@? ?>>>>?M?D?DF?D?DH?@???????????????????????????????????????????????????????????????????????????????????????????????????????????????M?DF?D?D?D?@? ?>>>>?M?D?D?D?DF?@???????????????????????????????????????????????????????????????????????????????????????????????????????????????M?D?D?D?DG?@? ?>>>>?M?D?D?DG?D?@??????????????????????????????????????????????????????????????????????????????????????? ?ExyEzE|EzE|EzE|EzE|EzE|EzE|EzE|EzE|EzE|Exq???M?D?DG?D?D?@? ?>>>>?M?D?DF?D?D?@??? ?ExyEzE|EzE|EzE|EzE|EzE|EzE|EzE|EzE|EzE|Exq??????????????????????????????????????????????????????????????? ?E{EEEEEEEEEEEEEEEEEEEs???M?D?D?DF?D?@? ?>>>>?M?DG?D?D?DF?@??? ?E{EEEEEEEEEEEEEEEEEEEs??????????????????????????????????????????????????????????????? ?E}EEEEEEEEEEEEEEEEEEEu???M?D?DH?D?D?@? ?>>>>?M?D?D?DH?D?@??? ?E}EEEEEEEEEEEEEEEEEEEu??????????????????????????????????????????????????????????????? ?E{EEEEEEEEEEEEEEEEEEEs???M?DF?D?D?D?@? ?>>>>?M?DF?D?D?D?@??? ?E{EEEEEEEEEEEEEEEEEEEs??????????????????????????????????????????????????????????????? ?E}EEEEEEEEEEEEEEEEEEEu???M?D?D?DG?D?@? ?>>>>?M?D?D?DG?D?@??? ?E}EEEEEEEEEEEEEEEEEEEu??????????????????????????????????????????????????????????????? ?E{EEEEEEEEEEEEEEEEEEEs???M?DG?D?D?D?@? ?>>>>?M?D?D?D?D?@??? ?E{EEEEEEEEEEEEEEEEEEEs??????????????????????????????????????????????????????????????? ?E}EEEEEEEEEEEEEEEEEEEu???M?D?D?DF?D?@? ?>>>>?M?DG?D?DF?D?@??? ?E}EEEEEEEEEEEEEEEEEEEu??????????????????????????????????????????????????????????????? ?EyEEEEEEEEEEEEEEEEEEEq???M?D?D?D?D?@? ?>>>>?M?D?D?D?D?@??? ?EyEEEEEEEEEEEEEEEEEEEq??????????????????????????????????????????????????????????????? ?E{EEEEEEEEEEEEEEEEEEEs???M?D?DF?D?DG?@? ?>>>>?M?D?D?DG?D?@??? ?E{EEEEEEEEEEEEEEEEEEEs??????????????????????????????????????????????????????????????? ?E}EEEEEEEEEEEEEEEEEEEu???M?D?D?D?D?@? ?>>>>?M?D?DF?D?D?@??? ?E}EEEEEEEEEEEEEEEEEEEu??????????????????????????????????????????????????????????????? ?E{EEEEEEEEEEEEEEEEEEEs???M?DG?D?DH?DF?@? ?>>>>?M?DG?D?D?DG?@??? ?E{EEEEEEEEEEEEEEEEEEEs??????????????????????????????????????????????????????????????? ?E}EEEEEEEEEEEEEEEEEEEu???L?C?C?C?C?O? ?>>>>?L?C?C?C?C?O??? ?E}EEEEEEEEEEEEEEEEEEEu??????????????????????????????????????????????????????????????? ?E{EEEEEEEEEEEEEEEEEEEs????????? ?>>>>>????????? ?E{EEEEEEEEEEEEEEEEEEEs???????????????????????????????????????????? ?ExyEzE|EzE|EzE|EzE|EzE|EzE|EzE|Exq?? ?E}EEEEEEEEEEEEEEEEEEEu???????? ?>>>>>>>???????? ?E}EEEEEEEEEEEEEEEEEEEu?? ?ExyEzE|EzE|EzE|EzE|EzE|EzE|EzE|Exq????????????????????????? ?E{EEEEEEEEEEEEEEEs?? ?EyEEEEEEEEEEEEEEEEEEEq??????? ?>>>>>>>>>??????? ?EyEEEEEEEEEEEEEEEEEEEq?? ?E{EEEEEEEEEEEEEEEs????????????????????????? ?E}EEEEEEEEEEEEEEEu?? ? p? r? t? p? r? t? r? t? p? r? t? r? t? p? r? t?=p?EyEEq?????? ?>>>>>>>>>>>?????? ?EyEE>>>>>>>>>>>>????? ?E{EEs??????????????????? ?E{EEEEEEEEEEEEEEEs????????????????????????? ?E}EEEEEEEEEEEEEEEu??????????????????? ?E}EEu???? ?>>>>>>>>>>>>>>>???? ?E}EEu??????????????????? ?E}EEEEEEEEEEEEEEEu????????????????????????? ?E{EEEEEEEEEEEEEEE>q??????????????????? ?E{EEs??? ?>>>>>>>>>>>>>>>>??? ?E{EEs??????????????????? ?EyEEEEEEEEEEEEEEEs????????????????????????? ?E}EEEEEEEEEEEEEEEExq?????????????????? ?E}EEu??? ?>>>>>>>>>>>>>>>>??? ?E}EEu?????????????????? ?ExyEEEEEEEEEEEEEEEEu????????????????????????? ?E{EEEEEEEEEEEEEEEE>q?????????????????? ?EyEE>q??? ?>??? ?EyEE>q?????????????????? ?EyEEEEEEEEEEEEEEEEs????????????????????????? ?E}EEEEEEEEEEEEEEEEExq????????????? ?ExyEzE|ExEEEExEzE|Ex:E>;E>EExEzE|EzE|EzE|EzE|Ex:E>;E>EExEzE|ExEEEExEzE|Exq????????????? ?ExyEEEEEEEEEEEEEEEEEu????????????????????????? ?E{EEEEEEEEEEEEEEEEE>q????????????? ?EyEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE>q????????????? ?EyEEEEEEEEEEEEEEEEEs????????????????????????? ?E}EEEEEEEEEEEEEEEEEExq??????????? ?ExyEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEExq??????????? ?ExyEEEEEEEEEEEEEEEEEEu????????????????????????? ?E{EEEEEEEEEEEEEEEEEE>q??????????? ?EyEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE>q??????????? ?EyEEEEEEEEEEEEEEEEEEs????????????????????????? ?E}EEEEEEEEEEEEEEEEEEExEzE|EzE|EzE|EzE|EzE|ExEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEExEzE|EzE|EzE|EzE|EzE|ExEEEEEEEEEEEEEEEEEEEu????????????????????????? ?E{EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEs????????????????????????? ?E}EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEu????????????????????????? ?E{EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEs????????????????????????? ?E}EEEEEEEEEEEEEEEEEE;>>prtrtrtrtp:>;>>>>>>>>>>>>>>>>>??????????????? ?E{EEEs????? ?EyEEEEEEEEEEEEEEEEs????????????????????????? ?E}EEEEEEEEEEEEEEE>>>>>>>>>>>>>>>??????????????? ?E}EEEu????? ?=p?EyEEEEEEEEEEEEEEEu????????????????????????? ?E{EEEEEEEEEEEEEEEs?????? ?EyEEEq??????????????? ?=?>>>>>>>>>>>>>><? ??????????????? ?EyEEEq?????? ?E{EEEEEEEEEEEEEEEs????????????????????????? ?E}EEEEEEEEEEEEEEEu?????? ?E{EEEs???????????????? ?=?>>>>>>>>>>>><? ???????????????? ?E{EEEs?????? ?E}EEEEEEEEEEEEEEEu????????????????????????? ?E{EEEEEEEEEEEEEEEs?????? ?E}EEEu????????????????? ?=?>>>>>>>>>><? ????????????????? ?E}EEEu?????? ?E{EEEEEEEEEEEEEEEs????????????????????????? ?E}EEEEEEEEEEEEEEEu?????? ?E{EEEs?????????????????? ?=?>>>>>>>><? ?????????????????? ?E{EEEs?????? ?E}EEEEEEEEEEEEEEEu????????????????????????? ?EyEEEEEEEEEEEEEEEq?????? ?E}EEEu??????????????????? ?=?>>>>>><? ??????????????????? ?E}EEEu?????? ?EyEEEEEEEEEEEEEEEq????????????????????????? ? p? r? t?=p?EyEEEEEEE>>><? ???????????????????? ?E{EEEs?????? ? p? r? t?=p?EyEEEEEEE>>>????????????????????? ?E}EEEu?????????? ? p?=p?EyEEEq????????????????????? ?>>>>????????????????????? ?EyEEE>q???????????? ?E{EEEs????????????????????????????????????? ?E}EEEu?????????? ?ExyExEEEEExEx>q??????????????????? ?>>>>??????????????????? ?ExyExEEEEExEx>q?????????? ?E}EEEu????????????????????????????????????? ?E{EEEs???????? ?ExyExEEEEEEEEExEx>q????????????????? ?>>>>????????????????? ?ExyExEEEEEEEEExEx>q???????? ?E{EEEs????????????????????????????????????? ?E}EEEu???? ?ExyEzE|ExEEEEEEEEEEEEExEzE|Exq????? ?>>>>>?? ?>>>>?? ?>>>>>????? ?ExyEzE|ExEEEEEEEEEEEEExEzE|Exq???? ?E}EEEu????????????????????????????????????? ?E{EEEs???? ?E{EEEEEEEEEEEEEEEEEEEs????? ?>>>>>?? ?>>>>?? ?>>>>>????? ?E{EEEEEEEEEEEEEEEEEEEs???? ?E{EEEs????????????????????????????????????? ?E}EEEu???? ?E}EEEEEEEEEEEEEEEEEEEu????? ?>>>>>?? ?>>>>?? ?>>>>>????? ?E}EEEEEEEEEEEEEEEEEEEu???? ?E}EEEu????????????????????????????????????? ?E{EEE>q???? ?EyEEEEEEEEEEEEEEEEEEEs????? ?>>>>>?? ?>>>>?? ?>>>>>????? ?E{EEEEEEEEEEEEEEEEEEE>q???? ?EyEEEs????????????????????????????????????? ?E}EEEExEzEzEzExEEEEEEEEEEEEEEEEEEEEu????? ?>>>>>?? ?>>>>?? ?>>>>>????? ?E}EEEEEEEEEEEEEEEEEEEExE|E|E|ExEEEEu????????????????????????????????????? ?E{EEEEEEEEEEEEEEEEEEEEEEEEEEEEs????? ?=?>>><? ?? ?>>>>?? ?=?>>><? ????? ?E{EEEEEEEEEEEEEEEEEEEEEEEEEEEEs????????????????????????????????????? ?E}EEEEEEEEEEEEEEEEEEEEEEEEEEEEu?????? ?>>>??? ?>>>>??? ?>>>?????? ?E}EEEEEEEEEEEEEEEEEEEEEEEEEEEEu????????????????????????????????????? ?E{EEEEEEEEEEEEEEEEEEEEEEEEEEEE>q?????? ?>>>>??? ?>>>>>??? ?>>>>?????? ?EyEEEEEEEEEEEEEEEEEEEEEEEEEEEEs????????????????????????????????????? ?E}EEE>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>:E>EEEEEEEEEEEEEEEEEEE>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>;E>EEEEEEEEEEEEEEEEEEEs???? ?E{EEEs????????????????????????????????????? ?E}EEEu???? ?E}EEEEEEEEEEEEEEEEEEE>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>EEEEEEEEEEEEEEEEEEEEu???? ?E}EEEu????????????????????????????????????? ?E{EEEs???? ?EyEEEEEEEEEEEEEEEEEEE<q? ? ? ? ? ? ? ? ? ? ? ? ?=?>>>><? ? ? ? ? ? ? ? ? ? ? ? ?=?EyEEEEEEEEEEEEEEEEEEEq???? ?E{EEEs????????????????????????????????????? ?E}EEEu???? ? p? r? t?=p?EyEEEEEEEEEEE>>>????????????? ? p? r? t?=p?EyEEEEEEEEEEE>>>????????????????? ? p?=p?EyEEEEEEE>>>??????????????????? ? p?=p?EyEEEq???????????? ?E{EEEs????????????????????? ?>>>>????????????????????? ?E{EEEs???????????? ?EyEEE>q??????????????????????????????????? ?ExyExEEEEExEx>q?????????? ?E}EEEu????????????????????? ?>>>>>????????????????????? ?E}EEEu?????????? ?ExyExEEEEExEx>q????????????????????????????? ?ExyEzE|ExEEEEEEEEExEzE|Exq?????? ?E{EEEs???????????????????? ?>>>>>>>???????????????????? ?E{EEEs?????? ?ExyEzE|ExEEEEEEEEExEzE|Exq????????????????????????? ?E{EEEEEEEEEEEEEEEs?????? ?E}EEEu??????????????????? ?>>>>>>>>>??????????????????? ?E}EEEu?????? ?E{EEEEEEEEEEEEEEEs????????????????????????? ?E}EEEEEEEEEEEEEEEu?????? ?E{EEEs?????????????????? ?>>>>>>>>>>>?????????????????? ?E{EEEs?????? ?E}EEEEEEEEEEEEEEEu????????????????????????? ?E{EEEEEEEEEEEEEEEs?????? ?E}EEEu????????????????? ?>>>>>>>>>>>>>????????????????? ?E}EEEu?????? ?E{EEEEEEEEEEEEEEEs????????????????????????? ?E}EEEEEEEEEEEEEEEu?????? ?EyEEEq???????????????? ?>>>>>>>>>>>>>>>???????????????? ?EyEEEq?????? ?E}EEEEEEEEEEEEEEEu????????????????????????? ?E{EEEEEEEEEEEEEEE>q?????? ?E{EEEs??????????????? ?>>>>>>>>>>>>>>>>??????????????? ?E{EEEs?????? ?EyEEEEEEEEEEEEEEEs????????????????????????? ?E}EEEEEEEEEEEEEEEExq????? ?E}EEEu??????????????? ?>>>>>>>>>>>>>>>>??????????????? ?E}EEEu????? ?ExyEEEEEEEEEEEEEEEEu????????????????????????? ?E{EEEEEEEEEEEEEEEE>q????? ?E{EEEs??????????????? ?>??????????????? ?E{EEEs????? ?EyEEEEEEEEEEEEEEEEs????????????????????????? ?E}EEEEEEEEEEEEEEEEExq???? ?E}EEEu???? ?ExyEzE|EzE|ExEzE|EzE|Ex:E>;E>EExEzE|EzE|EzE|EzE|Ex:E>;E>EExEzE|EzE|ExEzE|EzE|Exq???? ?E}EEEu???? ?ExyEEEEEEEEEEEEEEEEEu????????????????????????? ?E{EEEEEEEEEEEEEEEEE>q???? ?E{EEEs???? ?EyEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE>q???? ?E{EEEs???? ?EyEEEEEEEEEEEEEEEEEs????????????????????????? ?E}EEEEEEEEEEEEEEEEEExq??? ?E}EEEu??? ?ExyEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEExq??? ?E}EEEu??? ?ExyEEEEEEEEEEEEEEEEEEu????????????????????????? ?E{EEEEEEEEEEEEEEEEEE>q??? ?EyEEE>q??? ?EyEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE>q??? ?EyEEE>q??? ?EyEEEEEEEEEEEEEEEEEEs????????????????????????? ?E}EEEEEEEEEEEEEEEEEEExEzE|ExEEEEExEzE|ExEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEExEzE|ExEEEEExEzE|ExEEEEEEEEEEEEEEEEEEEu????????????????????????? ?E{EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEs????????????????????????? ?E}EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEu????????????????????????? ?E{EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEs????????????????????????? ?E}EEEEEEEEEEEEEEEEEE;>>prtrtrtrtp:>;>>>>>>>>>>>>>>>>>??? ?E{EEs?????????????????? ?EyEEEEEEEEEEEEEEEEs????????????????????????? ?E}EEEEEEEEEEEEEEE>>>>>>>>>>>>>>>??? ?E}EEu?????????????????? ?=p?EyEEEEEEEEEEEEEEEu????????????????????????? ?E{EEEEEEEEEEEEEEEs??????????????????? ?E{EEs??? ?=?>>>>>>>>>>>>>><? ??? ?E{EEs??????????????????? ?E{EEEEEEEEEEEEEEEs????????????????????????? ?E}EEEEEEEEEEEEEEEu??????????????????? ?E}EEu???? ?=?>>>>>>>>>>>><? ???? ?E}EEu??????????????????? ?E}EEEEEEEEEEEEEEEu????????????????????????? ?E{EEEEEEEEEEEEEEEs??????????????????? ?EyEEq????? ?=?>>>>>>>>>><? ????? ?EyEE>q??????????????????? ?E{EEEEEEEEEEEEEEEs????????????????????????? ?E}EEEEEEEEEEEEEEEu?? ?ExyEzE|ExEzE|EzE|ExEzE|EzE|ExEzE|ExEEEq?????? ?=?>>>>>>>><? ?????? ?EyEEExEzE|ExEzE|EzE|ExEzE|EzE|ExEzE|Exq?? ?E}EEEEEEEEEEEEEEEu????????????????????????? ?EyEEEEEEEEEEEEEEEq?? ?E{EEEEEEEEEEEEEEEEEEEs??????? ?=?>>>>>><? ??????? ?E{EEEEEEEEEEEEEEEEEEEs?? ?EyEEEEEEEEEEEEEEEq????????????????????????? ? p? r? t? r? t? r? t? r? t? r? t? r? t? r? t? p? ?? ?E}EEEEEEEEEEEEEEEEEEEu???????? ?=?>>>><? ???????? ?E}EEEEEEEEEEEEEEEEEEEu?? ? p? r? t? r? t? r? t? r? t? r? t? r? t? r? t? p? ???????????????????????????????????????????? ?E{EEEEEEEEEEEEEEEEEEEs???N?;?;?;?;?:? ?>>>>?N?;?;?;?;?:??? ?E{EEEEEEEEEEEEEEEEEEEs??????????????????????????????????????????????????????????????? ?E}EEEEEEEEEEEEEEEEEEEu???M?DG?D?D?D?@? ?>>>>?M?D?D?D?DH?@??? ?E}EEEEEEEEEEEEEEEEEEEu??????????????????????????????????????????????????????????????? ?E{EEEEEEEEEEEEEEEEEEEs???M?DF?D?D?DG?@? ?>>>>?M?D?DG?D?D?@??? ?E{EEEEEEEEEEEEEEEEEEEs??????????????????????????????????????????????????????????????? ?E}EEEEEEEEEEEEEEEEEEEu???M?D?D?DF?D?@? ?>>>>?M?D?D?D?DF?@??? ?E}EEEEEEEEEEEEEEEEEEEu??????????????????????????????????????????????????????????????? ?EyEEEEEEEEEEEEEEEEEEEq???M?D?DH?D?D?@? ?>>>>?M?D?D?D?D?@??? ?EyEEEEEEEEEEEEEEEEEEEq??????????????????????????????????????????????????????????????? ?E{EEEEEEEEEEEEEEEEEEEs???M?DG?D?D?DG?@? ?>>>>?M?D?DF?D?DG?@??? ?E{EEEEEEEEEEEEEEEEEEEs??????????????????????????????????????????????????????????????? ?E}EEEEEEEEEEEEEEEEEEEu???M?D?D?DF?D?@? ?>>>>?M?D?D?D?D?@??? ?E}EEEEEEEEEEEEEEEEEEEu??????????????????????????????????????????????????????????????? ?E{EEEEEEEEEEEEEEEEEEEs???M?D?D?D?D?@? ?>>>>?M?D?DG?D?D?@??? ?E{EEEEEEEEEEEEEEEEEEEs??????????????????????????????????????????????????????????????? ?E}EEEEEEEEEEEEEEEEEEEu???M?D?D?DG?D?@? ?>>>>?M?D?D?D?DF?@??? ?E}EEEEEEEEEEEEEEEEEEEu??????????????????????????????????????????????????????????????? ?E{EEEEEEEEEEEEEEEEEEEs???M?DF?D?D?D?@? ?>>>>?M?D?DF?D?D?@??? ?E{EEEEEEEEEEEEEEEEEEEs??????????????????????????????????????????????????????????????? ?E}EEEEEEEEEEEEEEEEEEEu???M?D?D?D?DF?@? ?>>>>?M?D?D?D?DG?@??? ?E}EEEEEEEEEEEEEEEEEEEu??????????????????????????????????????????????????????????????? ?EyEEEEEEEEEEEEEEEEEEEq???M?D?DG?D?D?@? ?>>>>?M?D?DG?D?D?@??? ?EyEEEEEEEEEEEEEEEEEEEq??????????????????????????????????????????????????????????????? ? p? r? t? r? t? r? t? r? t? r? t? r? t? r? t? r? t? r? t? p? ???M?D?D?D?DG?@? ?>>>>?M?DF?D?D?DF?@??? ? p? r? t? r? t? r? t? r? t? r? t? r? t? r? t? r? t? r? t? p? ???????????????????????????????????????????????????????????????????????????????????????M?DG?D?DF?D?@? ?>>>>?M?D?D?DG?D?@???????????????????????????????????????????????????????????????????????????????????????????????????????????????M?D?D?D?DH?@? ?>>>>?M?DG?D?D?D?@???????????????????????????????????????????????????????????????????????????????????????????????????????????????M?DF?D?D?D?@? ?>>>>?M?D?D?D?DF?@???????????????????????????????????????????????????????????????????????????????????????????????????????????????M?D?D?DG?DF?@? ?>>>>?M?D?DF?D?DH?@???????????????????????????????????????????????????????????????????????????????????????????????????????????????M?D?D?D?D?@? ?>>>>?M?D?D?D?D?@???????????????????????????????????????????????????????????????????????????????????????????????????????????????M?DG?D?DF?D?@? ?>>>>?M?DH?D?DG?D?@???????????????????????????????????????????????????????????????????????????????????????????????????????????????M?D?DH?D?D?@? ?>>>>?M?D?DF?D?DG?@???????????????????????????????????????????????????????????????????????????????????????????????????????????????L?C?C?C?C?O? ?>>>>?L?C?C?C?C?O????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? ?>>>>??????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? ?>>>>??????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? ?>>>>??????????????????????????????????????????????????????????????                                                                                 @18CorsixTH-0.63/CorsixTH/Campaigns/Upper Pukington.map000066400000000000000000005001541347163623700223240ustar00rootroot00000000000000?????????????????????????? ?>>>1>*>(>2>9>>>>??????????????????????? ?>>>>??????????????????????? ?>>>1>*>(>2>9>>>>????????????????????????????????????????????????????? ?>>>1>*>(>2>9>>>>??????????????????????? ?>>>>??????????????????????? ?>>>1>*>(>2>9>>>>????????????????????????????????????????????????????? ?>>>1>*>(>2>9>>>>??????????????????????? ?>>>>??????????????????????? ?>>>1>*>(>2>9>>>>????????????????????????????????????????????????????? ?>>>1>*>(>2>9>>>>??????????????????????? ?>>>>??????????????????????? ?>>>1>*>(>2>9>>>>????????????????????????????????????????????????????? ?>>>1>*>(>2>9>>>>??????????????????????? ?>>>>??????????????????????? ?>>>1>*>(>2>9>>>>????????????????????????????????????????????????????? ?>>>1>*>(>2>9>>>>??????????????????????? ?>>>>??????????????????????? ?>>>1>*>(>2>9>>>>????????????????????????????????????????????????????? ?>>>1>*>(>2>9>>>>??????????????????????? ?>>>>??????????????????????? ?>>>1>*>(>2>9>>>>????????????????????????????????????????????????????? ?>>>1>*>(>2>9>>>>??????????????????????? ?>>>>??????????????????????? ?>>>1>*>(>2>9>>>>????????????????????????????????????????????????????? ?>>>1>*>(>2>9>>>>??????????????????????? ?>>>>??????????????????????? ?>>>1>*>(>2>9>>>>????????????????????????????????????????????????????? ?>>>1>*>(>2>9>>>>??????????????????????? ?>>>>??????????????????????? ?>>>1>*>(>2>9>>>>????????????????????????????????????????????????????? ?>>>1>*>(>2>9>>>>??????????????????????? ?>>>>??????????????????????? ?>>>1>*>(>2>9>>>>????????????????????????????????????????????????????? ?>>>1>*>(>2>9>>>>??????????????????????? ?>>>>??????????????????????? ?>>>1>*>(>2>9>>>>????????????????????????????????????????????????????? ?>>>1>*>(>2>9>>>>??????????????????????? ?>>>>??????????????????????? ?>>>1>*>(>2>9>>>>????????????????????????????????????????????????????? ?>>>1>*>(>2>9>>>>??????????????????????? ?>>>>??????????????????????? ?>>>1>*>(>2>9>>>>????????????????????????????????????????????????????? ?>>>1>*>(>2>9>>>>??????????????????????? ?>>>>??????????????????????? ?>>>1>*>(>2>9>>>>????????????????????????????????????????????????????? ?>>>1>*>(>2>9>>>>>??????????????????????? ?>>>>>??????????????????????? ?>>>1>*>(>2>9>>>>????????????????????????????????????????????????????? ?>>>1>*>(>2>9>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>1>*>(>2>9>>>>????????????????????????????????????????????????????? ?>>>1>*>(>2>9>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>1>*>(>2>9>>>>????????????????????????????????????????????????????? ?>>>1>*>(>2>9>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>1>*>(>2>9>>>>????????????????????????????????????????????????????? ?>>>1>*>(>2>9>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>1>*>(>2>9>>>>????????????????????????????????????????????????????? ?>>>1>*>(>2>9>>>><? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?=?>>>>>><? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?=?>>>1>*>(>2>9>>>>????????????????????????????????????????????????????? ?>>>1>*>(>2>9>>>>?????????????????????? ?>>>>>>?????????????????????? ?>>>1>*>(>2>9>>>>????????????????????????????????????????????????????? ?>>>1>*>(>2>9>>>>?????????????????????? ??????????????????????? ?>>>1>*>(>2>9>>>>????????????????????????????????????????????????????? ?>>>1>*>(>2>9>>>>?????????????????????? ?:Ay>;A>A:A>;A>Aq?????????????????????? ?>>>1>*>(>2>9>>>>????????????????????????????????????????????????????? ?>>>1>*>(>2>9>>>>?????????????????????? ?A}AAAAAu?????????????????????? ?>>>1>*>(>2>9>>>>????????????????????????????????????????????????????? ?>>>1>*>(>2>9>>>>?????????????????????? ?A}AAAAAu?????????????????????? ?>>>1>*>(>2>9>>>>????????????????????????????????????????????????????? ?>>>1>*>(>2>9>>>>?????????????????????? ?A}AAAAAu?????????????????????? ?>>>1>*>(>2>9>>>>????????????????????????????????????????????????????? ?>>>1>*>(>2>9>>>>?????????????????????? ?AyAAAAA>q?????????????????????? ?>>>1>*>(>2>9>>>>????????????????????????????????????????????????????? ?>>>1>*>(>2>9>>>>????? ?AxyAzA|AxAxAzA|AxAxAxAzA|AxAxAzA|AxAAAAAAAxAzA|AxAxAzA|AxAxAxAzA|AxAxAzA|Axq????? ?>>>1>*>(>2>9>>>>????????????????????????????????????????????????????? ?>>>1>*>(>2>9>>>>????? ?A{AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAs????? ?>>>1>*>(>2>9>>>>????????????????????????????????????????????????????? ?>>>1>*>(>2>9>>>>????? ?A}AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAu????? ?>>>1>*>(>2>9>>>>????????????????????????????????????????????????????? ?>>>1>*>(>2>9>>>>????? ?AyAAAAAAAAA>>1>*>(>2>9>>>>????????????????????????????????????????????????????? ?>>>1>*>(>2>9>>>>????? ?A{AAAAAAAAAs??? ?A{AAAAAAAAAAAs??? ?A{AAAAAAAAAs????? ?>>>1>*>(>2>9>>>>????????????????????????????????????????????????????? ?>>>1>*>(>2>9>>>>????? ?A}AAAAAAAAAu??? ?A}AAAAAAAAAAAu??? ?A}AAAAAAAAAu????? ?>>>1>*>(>2>9>>>>????????????????????????????????????????????????????? ?>>>1>*>(>2>9>>>>????? ?AyAAAAAAAAAq??? ?AyAAAAAAAAAAAq??? ?AyAAAAAAAAAq????? ?>>>1>*>(>2>9>>>>????????????????????????????????????????????????????? ?>>>1>*>(>2>9>>>>????? ?A{AAAAAAAAAs??? ?A{AAAAAAAAAAAs??? ?A{AAAAAAAAAs????? ?>>>1>*>(>2>9>>>>????????????????????????????????????????????????????? ?>>>1>*>(>2>9>>>>????? ?A}AAAAAAAAAu??? ?A}AAAAAAAAAAAu??? ?A}AAAAAAAAAu????? ?>>>1>*>(>2>9>>>>????????????????????????????????????????????????????? ?>>>1>*>(>2>9>>>>????? ?AyAAAAAAAAAq??? ?AyAAAAAAAAAAAq??? ?AyAAAAAAAAAq????? ?>>>1>*>(>2>9>>>>????????????????????????????????????????????????????? ?>>>1>*>(>2>9>>>>????? ?A{AAAAAAAAAs??? ?A{AAAAAAAAAAAs??? ?A{AAAAAAAAAs????? ?>>>1>*>(>2>9>>>>????????????????????????????????????????????????????? ?>>>1>*>(>2>9>>>>????? ?A}AAAAAAAAAu??? ?A}AAAAAAAAAAAu??? ?A}AAAAAAAAAu????? ?>>>1>*>(>2>9>>>>????????????????????????????????????????????????????? ?>>>1>*>(>2>9>>>>????? ?AyAAAAAAAAA>q??? ?AyAAAAAAAAAAA>q??? ?AyAAAAAAAAAq????? ?>>>1>*>(>2>9>>>>????????????????????????????????????????????????????? ?>>>1>*>(>2>9>>>>????? ?A{AAAAAAAAAAxAzA|AxAAAAAAAAAAAAAxAzA|AxAAAAAAAAAAs????? ?>>>1>*>(>2>9>>>>????????????????????????????????????????????????????? ?>>>1>*>(>2>9>>>>????? ?A}AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAu????? ?>>>1>*>(>2>9>>>>????????????????????????????????????????????????????? ?>>>1>*>(>2>9>>>>????? ?AyAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAq????? ?>>>1>*>(>2>9>>>>????????????????????????????????????????????????????? ?>>>1>*>(>2>9>>>>????? ? p? r? t? p? p? r? t? p? r? t? p? r? t? p? p? r? t?=p?AyAAA>>1>*>(>2>9>>>>????????????????????????????????????????????????????? ?>>>1>*>(>2>9>>>>??????????????????????? ?A{AAAs??????????????????????? ?>>>1>*>(>2>9>>>>????????????????????????????????????????????????????? ?>>>1>*>(>2>9>>>>??????????????????????? ?A}AAAu??????????????????????? ?>>>1>*>(>2>9>>>>????????????????????????????????????????????????????? ?>>>1>*>(>2>9>>>>??????????????????????? ?A{AAAs??????????????????????? ?>>>1>*>(>2>9>>>>????????????????????????????????????????????????????? ?>>>1>*>(>2>9>>>>??????????????????????? ?A}AAAu??????????????????????? ?>>>1>*>(>2>9>>>>????????????????????????????????????????????????????? ?>>>1>*>(>2>9>>>>?? ?AxyAzA|AxAzA|AxAzA|AxAzA|AxAzA|AxAzA|Ax>q? ?AyAAA>q? ?AxyAzA|AxAzA|AxAzA|AxAzA|AxAzA|AxAzA|Axq?? ?>>>1>*>(>2>9>>>>????????????????????????????????????????????????????? ?>>>1>*>(>2>9>>>>?? ?A{AAAAAAAAAAAAAAAAAAAxAxAAAAAxAxAAAAAAAAAAAAAAAAAAAs?? ?>>>1>*>(>2>9>>>>????????????????????????????????????????????????????? ?>>>1>*>(>2>9>>>>?? ?A}AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAu?? ?>>>1>*>(>2>9>>>>????????????????????????????????????????????????????? ?>>>1>*>(>2>9>>>>?? ?A{AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAs?? ?>>>1>*>(>2>9>>>>????????????????????????????????????????????????????? ?>>>1>*>(>2>9>>>>?? ?A}AAAAAAAAAAAAAAAAAA>>1>*>(>2>9>>>>????????????????????????????????????????????????????? ?>>>1>*>(>2>9>>>>?? ?A{AAAAAAAAAAAAAAAAAAs??????? ?A{AAAAAAAAAAAAAAAAAAs?? ?>>>1>*>(>2>9>>>>????????????????????????????????????????????????????? ?>>>1>*>(>2>9>>>>?? ?A}AAAAAAAAAAAAAAAAAAu??????? ?A}AAAAAAAAAAAAAAAAAAu?? ?>>>1>*>(>2>9>>>>????????????????????????????????????????????????????? ?>>>1>*>(>2>9>>>>?? ?A{AAAAAAAAAAAAAAAAAA>q??????? ?AyAAAAAAAAAAAAAAAAAAs?? ?>>>1>*>(>2>9>>>>????????????????????????????????????????????????????? ?>>>1>*>(>2>9>>>>?? ?A}AAAAAAAAAAAAAAAAAAAxAzA|AzA|AzA|AxAAAAAAAAAAAAAAAAAAAu?? ?>>>1>*>(>2>9>>>>????????????????????????????????????????????????????? ?>>>1>*>(>2>9>>>>?? ?A{AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAs?? ?>>>1>*>(>2>9>>>>????????????????????????????????????????????????????? ?>>>1>*>(>2>9>>>>?? ?A}AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAu?? ?>>>1>*>(>2>9>>>>????????????????????????????????????????????????????? ?>>>1>*>(>2>9>>>>>?? ?AyAAAAAAAAAAAAAAAAAAq?? ?>>>1>*>(>2>9>>>>????????????????????????????????????????????????????? ?>>>1>*>(>2>9>>>>>>>p:>;>p;>p>>>>>>1>*>(>2>9>>>>????????????????????????????????????????????????????? ?>>>1>*>(>2>9>>>>>>>>>>>>?? ?A{AAAAAs?N?;?;?;?;?;?;?;?;?;?;?;?;?;?;?:? ?A{AAAAAs?? ?>>>>>>>>>>>1>*>(>2>9>>>>????????????????????????????????????????????????????? ?>>>1>*>(>2>9>>>>>>>>>>>>?? ?A}AAAAAu?M?DF?D?D?DG?D?DH?DF?D?D?DG?D?DH?D?DF?@? ?A}AAAAAu?? ?>>>>>>>>>>>1>*>(>2>9>>>>????????????????????????????????????????????????????? ?>>>1>*>(>2>9>>>>>>>>>>>>?? ?A{AAAAAs?M?DH?D?DG?D?DF?D?D?DG?DH?D?DF?D?DG?D?@? ?A{AAAAAs?? ?>>>>>>>>>>>1>*>(>2>9>>>>????????????????????????????????????????????????????? ?>>>1>*>(>2>9>>>>>>>>>>>>?? ?A}AAAAAu?L?C?C?C?C?C?C?C?C?C?C?C?C?C?C?O? ?A}AAAAAu?? ?>>>>>>>>>>>1>*>(>2>9>>>>????????????????????????????????????????????????????? ?>>>1>*>(>2>9>>>>>>>>?? ?AyAAAAA>q????????????????? ?AyAAAAA>q?? ?>>>>>>1>*>(>2>9>>>>????????????????????????????????????????????????????? ?>>>1>*>(>2>9>>>><? ?=?Axy:A>;A>AAxAzA|AxAAAAAAAxA|A|A|Ax>q??????? ?AxyAzAzAzAxAAAAAAAxAzA|Ax:A>;A>AAx<q? ?=?>>>1>*>(>2>9>>>>????????????????????????????????????????????????????? ?>>>1>*>(>2>9>>>>?? ?A{AAAAAAAAAAAAAAAAAAAxAzA|AzA|AzA|AxAAAAAAAAAAAAAAAAAAAs?? ?>>>1>*>(>2>9>>>>????????????????????????????????????????????????????? ?>>>1>*>(>2>9>>>>?? ?A}AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAu?? ?>>>1>*>(>2>9>>>>????????????????????????????????????????????????????? ?>>>1>*>(>2>9>>>>?? ?A{AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAs?? ?>>>1>*>(>2>9>>>>????????????????????????????????????????????????????? ?>>>1>*>(>2>9>>>>?? ?A}AAAAAAAAAAAAAAAAAA>>1>*>(>2>9>>>>????????????????????????????????????????????????????? ?>>>1>*>(>2>9>>>>?? ?A{AAAAAAAAAAAAAAAAAAs??????? ?A{AAAAAAAAAAAAAAAAAAs?? ?>>>1>*>(>2>9>>>>????????????????????????????????????????????????????? ?>>>1>*>(>2>9>>>>?? ?A}AAAAAAAAAAAAAAAAAAu??????? ?A}AAAAAAAAAAAAAAAAAAu?? ?>>>1>*>(>2>9>>>>????????????????????????????????????????????????????? ?>>>1>*>(>2>9>>>>?? ?A{AAAAAAAAAAAAAAAAAA>q??????? ?AyAAAAAAAAAAAAAAAAAAs?? ?>>>1>*>(>2>9>>>>????????????????????????????????????????????????????? ?>>>1>*>(>2>9>>>>?? ?A}AAAAAAAAAAAAAAAAAAAxAzA|AzA|AzA|AxAAAAAAAAAAAAAAAAAAAu?? ?>>>1>*>(>2>9>>>>????????????????????????????????????????????????????? ?>>>1>*>(>2>9>>>>?? ?A{AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAs?? ?>>>1>*>(>2>9>>>>????????????????????????????????????????????????????? ?>>>1>*>(>2>9>>>>?? ?A}AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAu?? ?>>>1>*>(>2>9>>>>????????????????????????????????????????????????????? ?>>>1>*>(>2>9>>>>?? ?AyAAAAAAAAAAAAAAAAAA>>1>*>(>2>9>>>>????????????????????????????????????????????????????? ?>>>1>*>(>2>9>>>>?? ? p? r? t? p? r? t? p? r? t? p? r? t? p? r? t? p? r? t? p? ? ?A{AAAs? ? p? r? t? p? r? t? p? r? t? p? r? t? p? r? t? p? r? t? p? ?? ?>>>1>*>(>2>9>>>>????????????????????????????????????????????????????? ?>>>1>*>(>2>9>>>>??????????????????????? ?A}AAAu??????????????????????? ?>>>1>*>(>2>9>>>>????????????????????????????????????????????????????? ?>>>1>*>(>2>9>>>>??????????????????????? ?A{>A>A>A>s??????????????????????? ?>>>1>*>(>2>9>>>>????????????????????????????????????????????????????? ?>>>1>*>(>2>9>>>>??????????????????????? ?A}>A>A>A>u??????????????????????? ?>>>1>*>(>2>9>>>>????????????????????????????????????????????????????? ?>>>1>*>(>2>9>>>>??????????????????????? ?AyAAA>q??????????????????????? ?>>>1>*>(>2>9>>>>????????????????????????????????????????????????????? ?>>>1>*>(>2>9>>>>????? ?AxyAzA|AxAxAzA|AxAzA|AxAzA|AxAxAzA|AxAAAAAxAzA|AxAxAzA|AxAzA|AxAzA|AxAxAzA|Axq????? ?>>>1>*>(>2>9>>>>????????????????????????????????????????????????????? ?>>>1>*>(>2>9>>>>????? ?A{AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAs????? ?>>>1>*>(>2>9>>>>????????????????????????????????????????????????????? ?>>>1>*>(>2>9>>>>????? ?A}AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAu????? ?>>>1>*>(>2>9>>>>????????????????????????????????????????????????????? ?>>>1>*>(>2>9>>>>????? ?AyAAAAAAAAA>>1>*>(>2>9>>>>????????????????????????????????????????????????????? ?>>>1>*>(>2>9>>>>????? ?A{AAAAAAAAAs??? ?A{AAAAAAAAAAAs??? ?A{AAAAAAAAAs????? ?>>>1>*>(>2>9>>>>????????????????????????????????????????????????????? ?>>>1>*>(>2>9>>>>????? ?A}AAAAAAAAAu??? ?A}AAAAAAAAAAAu??? ?A}AAAAAAAAAu????? ?>>>1>*>(>2>9>>>>????????????????????????????????????????????????????? ?>>>1>*>(>2>9>>>>????? ?AyAAAAAAAAAq??? ?AyAAAAAAAAAAAq??? ?AyAAAAAAAAAq????? ?>>>1>*>(>2>9>>>>????????????????????????????????????????????????????? ?>>>1>*>(>2>9>>>>????? ?A{AAAAAAAAAs??? ?A{AAAAAAAAAAAs??? ?A{AAAAAAAAAs????? ?>>>1>*>(>2>9>>>>????????????????????????????????????????????????????? ?>>>1>*>(>2>9>>>>????? ?A}AAAAAAAAAu??? ?A}AAAAAAAAAAAu??? ?A}AAAAAAAAAu????? ?>>>1>*>(>2>9>>>>????????????????????????????????????????????????????? ?>>>1>*>(>2>9>>>>????? ?AyAAAAAAAAAq??? ?AyAAAAAAAAAAAq??? ?AyAAAAAAAAAq????? ?>>>1>*>(>2>9>>>>????????????????????????????????????????????????????? ?>>>1>*>(>2>9>>>>????? ?A{AAAAAAAAAs??? ?A{AAAAAAAAAAAs??? ?A{AAAAAAAAAs????? ?>>>1>*>(>2>9>>>>????????????????????????????????????????????????????? ?>>>1>*>(>2>9>>>>????? ?A}AAAAAAAAAu??? ?A}AAAAAAAAAAAu??? ?A}AAAAAAAAAu????? ?>>>1>*>(>2>9>>>>????????????????????????????????????????????????????? ?>>>1>*>(>2>9>>>>????? ?AyAAAAAAAAA>q??? ?AyAAAAAAAAAAA>q??? ?AyAAAAAAAAAq????? ?>>>1>*>(>2>9>>>>????????????????????????????????????????????????????? ?>>>1>*>(>2>9>>>>????? ?A{AAAAAAAAAAxAzA|AxAAAAAAAAAAAAAxAzA|AxAAAAAAAAAAs????? ?>>>1>*>(>2>9>>>>????????????????????????????????????????????????????? ?>>>1>*>(>2>9>>>>????? ?A}AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAu????? ?>>>1>*>(>2>9>>>>????????????????????????????????????????????????????? ?>>>1>*>(>2>9>>>>????? ?AyAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAq????? ?>>>1>*>(>2>9>>>>????????????????????????????????????????????????????? ?>>>1>*>(>2>9>>>>????? ? p? r? t? p? p? r? t? p? p? p? r? t? p? p? r? t?=p?AyAAAAA>>1>*>(>2>9>>>>????????????????????????????????????????????????????? ?>>>1>*>(>2>9>>>>?????????????????????? ?A{AAAAAs?????????????????????? ?>>>1>*>(>2>9>>>>????????????????????????????????????????????????????? ?>>>1>*>(>2>9>>>>?????????????????????? ?A{AAAAAs?????????????????????? ?>>>1>*>(>2>9>>>>????????????????????????????????????????????????????? ?>>>1>*>(>2>9>>>>?????????????????????? ?A{AAAAAs?????????????????????? ?>>>1>*>(>2>9>>>>????????????????????????????????????????????????????? ?>>>1>*>(>2>9>>>>?????????????????????? ?AyAAAAAq?????????????????????? ?>>>1>*>(>2>9>>>>????????????????????????????????????????????????????? ?>>>1>*>(>2>9>>>>?????????????????????? ?:>;>>:>;>>?????????????????????? ?>>>1>*>(>2>9>>>>????????????????????????????????????????????????????? ?>>>1>*>(>2>9>>>>?????????????????????? ?>>>>>>?????????????????????? ?>>>1>*>(>2>9>>>>????????????????????????????????????????????????????? ?>>>1>*>(>2>9>>>>>?????????????????????? ?>>>>>>>?????????????????????? ?>>>1>*>(>2>9>>>>????????????????????????????????????????????????????? ?>>>1>*>(>2>9>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>1>*>(>2>9>>>>????????????????????????????????????????????????????? ?>>>1>*>(>2>9>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>1>*>(>2>9>>>>????????????????????????????????????????????????????? ?>>>1>*>(>2>9>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>1>*>(>2>9>>>>????????????????????????????????????????????????????? ?>>>1>*>(>2>9>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>1>*>(>2>9>>>>????????????????????????????????????????????????????? ?>>>1>*>(>2>9>>>><? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?=?>>>><? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?=?>>>1>*>(>2>9>>>>????????????????????????????????????????????????????? ?>>>1>*>(>2>9>>>>??????????????????????? ?>>>>??????????????????????? ?>>>1>*>(>2>9>>>>????????????????????????????????????????????????????? ?>>>1>*>(>2>9>>>>??????????????????????? ?>>>>??????????????????????? ?>>>1>*>(>2>9>>>>????????????????????????????????????????????????????? ?>>>1>*>(>2>9>>>>??????????????????????? ?>>>>??????????????????????? ?>>>1>*>(>2>9>>>>????????????????????????????????????????????????????? ?>>>1>*>(>2>9>>>>??????????????????????? ?>>>>??????????????????????? ?>>>1>*>(>2>9>>>>????????????????????????????????????????????????????? ?>>>1>*>(>2>9>>>>??????????????????????? ?>>>>??????????????????????? ?>>>1>*>(>2>9>>>>????????????????????????????????????????????????????? ?>>>1>*>(>2>9>>>>??????????????????????? ?>>>>??????????????????????? ?>>>1>*>(>2>9>>>>????????????????????????????????????????????????????? ?>>>1>*>(>2>9>>>>??????????????????????? ?>>>>??????????????????????? ?>>>1>*>(>2>9>>>>????????????????????????????????????????????????????? ?>>>1>*>(>2>9>>>>??????????????????????? ?>>>>??????????????????????? ?>>>1>*>(>2>9>>>>????????????????????????????????????????????????????? ?>>>1>*>(>2>9>>>>??????????????????????? ?>>>>??????????????????????? ?>>>1>*>(>2>9>>>>????????????????????????????????????????????????????? ?>>>1>*>(>2>9>>>>??????????????????????? ?>>>>??????????????????????? ?>>>1>*>(>2>9>>>>????????????????????????????????????????????????????? ?>>>1>*>(>2>9>>>>??????????????????????? ?>>>>??????????????????????? ?>>>1>*>(>2>9>>>>????????????????????????????????????????????????????? ?>>>1>*>(>2>9>>>>??????????????????????? ?>>>>??????????????????????? ?>>>1>*>(>2>9>>>>????????????????????????????????????????????????????? ?>>>1>*>(>2>9>>>>??????????????????????? ?>>>>??????????????????????? ?>>>1>*>(>2>9>>>>????????????????????????????????????????????????????? ?>>>1>*>(>2>9>>>>??????????????????????? ?>>>>??????????????????????? ?>>>1>*>(>2>9>>>>????????????????????????????????????????????????????? ?>>>1>*>(>2>9>>>>??????????????????????? ?>>>>??????????????????????? ?>>>1>*>(>2>9>>>>???????????????????????????.!CorsixTH-0.63/CorsixTH/Campaigns/Wishinwell.map000066400000000000000000005001541347163623700214170ustar00rootroot00000000000000?????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? ?xyz|z|z|z|z|z|z|z|z|z|z|z|xq????????????????????????????????????????????????????????????????????????????????????????????????????? ?{s????????????????????????????????????????????????????????????????????????????? ?xyz|z|z|z|z|z|z|z|xq????? ?}u????? ?xyz|z|z|z|z|z|z|z|xq????????????????????????????????????????????????????? ?{s????? ?{s????? ?{s????????????????????????????????????????????????????? ?}u????? ?}u????? ?}u????????????????????????????????????????????????????? ?{s????? ?{s????? ?{s????????????????????????????????????????????????????? ?}u????? ?}u????? ?}u????????????????????????????????????????????????????? ?{>q????? ?y>q????? ?ys????????????????????????????????????????????????????? ?}xz|z|xu??? ?}>u??? ?}s????????????????????????????????????????????????????? ?};>>:>;>>>>>>>???????????????????????? ?}u????????????????????????????????????????????????????? ?{s???????????????????????? ?>>>>>>???????????????????????? ?{s????????????????????????????????????????????????????? ?}u???????????????????????? ?=?>>>><? ???????????????????????? ?}u????????????????????????????????????????????????????? ?yq????????????????????????? ?>>>>????????????????????????? ?yq????????????????????????????????????????????????????? ? p? p?=p?y>>>????????????????????????? ? p? p?=p?y>>>???????????????????????????? ?{s??????????????????????????????????????????????????????????? ?}u???????????????????????????? ?>>>>???????????????????????????? ?}u??????????????????????????????????????????????????????????? ?{s???????????????????????????? ?>>>>???????????????????????????? ?{s??????????????????????????????????????????????????????????? ?}u???????????????????????????? ?>>>>???????????????????????????? ?}u??????????????????????????????????????????????????????????? ?y>q???????????????????????????? ?>>>>???????????????????????????? ?y>q??????????????????????????????????????????????????? ?xyz|z|z|xxz|z|z|z|x>q?????????????????? ?>>>>?????????????????? ?xyz|z|z|z|xxz|z|z|xq??????????????????????????????????????????? ?{:>>>>>>???????????? ?>>>>???????????? ?>>>>>:>s??????????????????????????????????????????? ?};>>>>>>???????????? ?>>>>???????????? ?>>>>>;>u??????????????????????????????????????????? ?{>>>>>>???????????? ?>>>>???????????? ?>>>>>s??????????????????????????????????????????? ?}<q? ?=?>>>???????????? ?>>>>???????????? ?>>><? ?=?yu??????????????????????????????????????????? ?{>>???????????? ?>>>>???????????? ?>>>?? ? p? r? t? r? t? r? t?=p?ys??????????????????????????????????????????? ?}q?????????? ?>>>???????????? ?>>>>???????????? ?>>>?????????? ?yu??????????????????????????????????????????? ?{s? ?>>>>>>??? ?>>>>???????????? ?>>>>>???????????? ?>>>??N?;?;?;?;?;?:?? ?{s??????????????????????????????????????????? ?}u? ?>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>??M?D?DH?DF?DG?DH?@?? ?}u??????????????????????????????????????????? ?yq? ?>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>??M?DF?D?D?D?D?@?? ?yq??????????????????????????????????????????? ?{s? ?>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>??M?D?DG?D?DH?DF?@?? ?{s??????????????????????????????????????????? ?}u? ?>>>>><? ? ?=?>>><? ? ? ? ? ? ? ? ? ? ? ?=?>>>><? ? ? ? ? ? ? ? ? ? ? ?=?>>>??L?C?C?C?C?C?O?? ?}u??????????????????????????????????????????? ?{q? ? ? ? ? ? ? ??? ?>>>???????????? ?>>>>???????????? ?>>>?????????? ?ys??????????????????????????????????????????? ?}>q?????????? ?>>>???????????? ?>>>>???????????? ?>>>?????????? ?yu??????????????????????????????????????????? ?{xz|z|z|x>q?? ?>>>???????????? ?>>>>???????????? ?>>>>?? ?xyz|z|z|xs??????????????????????????????????????????? ?}:>>>>>>???????????? ?>>>>???????????? ?>>>>>:>u??????????????????????????????????????????? ?{;>>>>>>???????????? ?>>>>???????????? ?>>>>>;>s??????????????????????????????????????????? ?}>>>>>>???????????? ?>>>>???????????? ?>>>>>u??????????????????????????????????????????? ?y<q? ? ? ? ? ? ???????????? ?>>>>???????????? ? ? ? ? ? ?=?yq??????????????????????????????????????????? ?=p?y>>>?????????????????? ? p? r? t? r? t? r? t? r? t? r? t? r? t? r? t?=p?y>>>?????????????????????????????????? ?{s????????????????????????????????????????????? ?}u?????????????????????????????????? ?>>>>?????????????????????????????????? ?}u????????????????????????????????????????????? ?y>q?????????????????????????????????? ?>>>>?????????????????????????????????? ?y>q??????????????????????????????????????? ?xyz|z|xxz|z|z|z|z|z|z|z|z|z|xq???????????? ?>>>>???????????? ?xyz|z|z|z|z|z|z|z|z|z|xxz|z|xq????????????????????????????????? ?{s???????????? ?>>>>???????????? ?{s????????????????????????????????? ?}u???????????? ?>>>>???????????? ?}u????????????????????????????????? ?{s???????????? ?>>>>???????????? ?{s????????????????????????????????? ?}u???????????? ?>>>>???????????? ?}u????????????????????????????????? ?{s???????????? ?>>>>???????????? ?{s????????????????????????????????? ?}u???????????? ?>>>>???????????? ?}u????????????????????????????????? ?yq???????????? ?>>>>???????????? ?yq????????????????????????????????? ? p? r? t? r? t? r? t? r? t? r? t? r? t? r? t? r? t? r? t? r? t? r? t? r? t? r? t? r? t? r? t? p? ???????????? ?>>>>???????????? ? p? r? t? r? t? r? t? r? t? r? t? r? t? r? t? r? t? r? t? r? t? r? t? r? t? r? t? r? t? r? t? p? ?????????????????????????????????????????????????????????????????????????????? ?>>>>??????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? ?>>>>??????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? ?>>>>??????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? ?>>>>??????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? ?>>>>??????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? ?>>>>??????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? ?>>>>??????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? ?>>>>??????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? ?>>>>??????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? ?>>>>??????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? ?>>>>??????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? ?>>>>??????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? ?>>>>??????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? ?>>>>??????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? ?>>>>??????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? ?>>>>??????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? ?>>>>??????????????????????????????????????????????????????????????',CorsixTH-0.63/CorsixTH/Campaigns/Writhe.map000066400000000000000000005001541347163623700205340ustar00rootroot00000000000000??????????????????? ?>>1>*>(>2>9>>1>*>(>2>9>>>>??????????????????????????????????????????????????????? ?>>>???????????????????????????????????????????????????? ?>>1>*>(>2>9>>1>*>(>2>9>>>>??????????????????????????????????????????????????????? ?>>>???????????????????????????????????????????????????? ?>>1>*>(>2>9>>1>*>(>2>9>>>>??????????????????????????????????????????????????????? ?>>>???????????????????????????????????????????????????? ?>>1>*>(>2>9>>1>*>(>2>9>>>>??????????????????????????????????????????????????????? ?>>>???????????????????????????????????????????????????? ?>>1>*>(>2>9>>1>*>(>2>9>>>>??????????????????????????????????????????????????????? ?>>>???????????????????????????????????????????????????? ?>>1>*>(>2>9>>1>*>(>2>9>>>>??????????????????????????????????????????????????????? ?>>>???????????????????????????????????????????????????? ?>>1>*>(>2>9>>1>*>(>2>9>>>>??????????????????????????????????????????????????????? ?>>>???????????????????????????????????????????????????? ?>>1>*>(>2>9>>1>*>(>2>9>>>>??????????????????????????????????????????????????????? ?>>>???????????????????????????????????????????????????? ?>>1>*>(>2>9>>1>*>(>2>9>>>>??????????????????????????????????????????????????????? ?>>>???????????????????????????????????????????????????? ?>>1>*>(>2>9>>1>*>(>2>9>>>>??????????????????????????????????????????????????????? ?>>>???????????????????????????????????????????????????? ?>>1>*>(>2>9>>1>*>(>2>9>>>>??????????????????????????????????????????????????????? ?>>>???????????????????????????????????????????????????? ?>>1>*>(>2>9>>1>*>(>2>9>>>>??????????????????????????????????????????????????????? ?>>>???????????????????????????????????????????????????? ?>>1>*>(>2>9>>1>*>(>2>9>>>>??????????????????????????????????????????????????????? ?>>>???????????????????????????????????????????????????? ?>>1>*>(>2>9>>1>*>(>2>9>>>>??????????????????????????????????????????????????????? ?>>>???????????????????????????????????????????????????? ?>>1>*>(>2>9>>1>*>(>2>9>>>>??????????????????????????????????????????????????????? ?>>>???????????????????????????????????????????????????? ?>>1>*>(>2>9>>1>*>(>2>9>>>>??????????????????????????????????????????????????????? ?>>>???????????????????????????????????????????????????? ?>>1>*>(>2>9>>1>*>(>2>9>>>>??????????????????????????????????????????????????????? ?>>>???????????????????????????????????????????????????? ?>>1>*>(>2>9>>1>*>(>2>9>>>>??????????????????????????????????????????????????????? ?>>>???????????????????????????????????????????????????? ?>>1>*>(>2>9>>1>*>(>2>9>>>>??????????????????????????????????????????????????????? ?>>>???????????????????????????????????????????????????? ?>>1>*>(>2>9>>1>*>(>2>9>>>>??????????????????????????????????????????????????????? ?>>>???????????????????????????????????????????????????? ?>>1>*>(>2>9>>1>*>(>2>9>>>>??????????????????????????????????????????????????????? ?>>>???????????????????????????????????????????????????? ?>>1>*>(>2>9>>1>*>(>2>9>>>>??????????????????????????????????????????????????????? ?>>>???????????????????????????????????????????????????? ?>>1>*>(>2>9>>1>*>(>2>9>>>>??????????????????????????????????????????????????????? ?>>>???????????????????????????????????????????????????? ?>>1>*>(>2>9>>1>*>(>2>9>>>>??????????????????????????????????????????????????????? ?>>>???????????????????????????????????????????????????? ?>>1>*>(>2>9>>1>*>(>2>9>>>>??????????????????????????????????????????????????????? ?>>>???????????????????????????????????????????????????? ?>>1>*>(>2>9>>1>*>(>2>9>>>>??????????????????????????????????????????????????????? ?>>>???????????????????????????????????????????????????? ?>>1>*>(>2>9>>1>*>(>2>9>>>>??????????????????????????????????????????????????????? ?>>>???????????????????????????????????????????????????? ?>>1>*>(>2>9>>1>*>(>2>9>>>>??????????????????????????????????????????????????????? ?>>>???????????????????????????????????????????????????? ?>>1>*>(>2>9>>1>*>(>2>9>>>>??????????????????????????????????????????????????????? ?>>>???????????????????????????????????????????????????? ?>>1>*>(>2>9>>1>*>(>2>9>>>>??????????????????????????????????????????????????????? ?>>>???????????????????????????????????????????????????? ?>>1>*>(>2>9>>1>*>(>2>9>>>>>??????????????????????????????????????????????????????? ?>>>???????????????????????????????????????????????????? ?>>1>*>(>2>9>>1>*>(>2>9>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>???????????????????????????????????????????????????? ?>>1>*>(>2>9>>1>*>(>2>9>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>???????????????????????????????????????????????????? ?>>1>*>(>2>9>>1>*>(>2>9>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>???????????????????????????????????????????????????? ?>>1>*>(>2>9>>1>*>(>2>9>>>><? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?=?>>><? ? ? ? ? ? ? ? ? ? ? ? ?=?>>><? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?=?>>>???????????????????????????????????????????????????? ?>>1>*>(>2>9>>1>*>(>2>9>>>>????????????????? ?>>>????????????? ?>>>????????????????? ?>>>???????????????????????????????????????????????????? ?>>1>*>(>2>9>>1>*>(>2>9>>>>????????????????? ?>>>????????????? ?>>>????????????????? ?>>>???????????????????????????????????????????????????? ?>>1>*>(>2>9>>1>*>(>2>9>>>>????????????????? ?>>>????????????? ?>>>????????????????? ?>>>???????????????????????????????????????????????????? ?>>1>*>(>2>9>>1>*>(>2>9>>>>????????????????? ?>????????????? ?>????????????????? ?>>>???????????????????????????????????????????????????? ?>>1>*>(>2>9>>1>*>(>2>9>>>>???????????????? ?xy:>;>xz|xz|xxz|xz|x:>;>xq???????????????? ?>>>???????????????????????????????????????????????????? ?>>1>*>(>2>9>>1>*>(>2>9>>>>???????????????? ?{s???????????????? ?>>>???????????????????????????????????????????????????? ?>>1>*>(>2>9>>1>*>(>2>9>>>>???????????????? ?}u???????????????? ?>>>???????????????????????????????????????????????????? ?>>1>*>(>2>9>>1>*>(>2>9>>>>???????????????? ?{s???????????????? ?>>>???????????????????????????????????????????????????? ?>>1>*>(>2>9>>1>*>(>2>9>>>>???????????????? ?}u???????????????? ?>>>???????????????????????????????????????????????????? ?>>1>*>(>2>9>>1>*>(>2>9>>>>???????????????? ?{s???????????????? ?>>>???????????????????????????????????????????????????? ?>>1>*>(>2>9>>1>*>(>2>9>>>>???????????????? ?}u???????????????? ?>>>???????????????????????????????????????????????????? ?>>1>*>(>2>9>>1>*>(>2>9>>>>???????????????? ?{s???????????????? ?>>>???????????????????????????????????????????????????? ?>>1>*>(>2>9>>1>*>(>2>9>>>>???????????????? ?}u???????????????? ?>>>???????????????????????????????????????????????????? ?>>1>*>(>2>9>>1>*>(>2>9>>>>???????????????? ?{s???????????????? ?>>>???????????????????????????????????????????????????? ?>>1>*>(>2>9>>1>*>(>2>9>>>>???????????????? ?}u???????????????? ?>>>???????????????????????????????????????????????????? ?>>1>*>(>2>9>>1>*>(>2>9>>>>???????????????? ?yq???????????????? ?>>>???????????????????????????????????????????????????? ?>>1>*>(>2>9>>1>*>(>2>9>>>>???????????????? ? p? r? t? p? p? r? t?=p?y>>???????????????????????????????????????????????????? ?>>1>*>(>2>9>>1>*>(>2>9>>>>???????????????????????? ?yq???????????????????????? ?>>>???????????????????????????????????????????????????? ?>>1>*>(>2>9>>1>*>(>2>9>>>>>???????????????????????? ?y>q???????????????????????? ?>>>???????????????????????????????????????????????????? ?>>1>*>(>2>9>>1>*>(>2>9>>>>>>>>:x>z|xxz|xxz|xxz|xxz|xxz|xxz|xxz|xxz|xxz|x:>>>>>>>>???????????????????????????????????????????????????? ?>>1>*>(>2>9>>1>*>(>2>9>>>>>>>>;>;>>>>>>>>???????????????????????????????????????????????????? ?>>1>*>(>2>9>>1>*>(>2>9>>>>>>>>>>>>>>>>???????????????????????????????????????????????????? ?>>1>*>(>2>9>>1>*>(>2>9>>>><? ? ? ? ? p? r? t?=p?y>>???????????????????????????????????????????????????? ?>>1>*>(>2>9>>1>*>(>2>9>>>>???????? ?yq???????? ?>>>???????????????????????????????????????????????????? ?>>1>*>(>2>9>>1>*>(>2>9>>>>???????? ? p? r? t?=p?y>>???????????????????????????????????????????????????? ?>>1>*>(>2>9>>1>*>(>2>9>>>>???????????? ?{s???????????? ?>>>???????????????????????????????????????????????????? ?>>1>*>(>2>9>>1>*>(>2>9>>>>????N?;?;?;?;?:??? ?}u???N?;?;?;?;?:???? ?>>>???????????????????????????????????????????????????? ?>>1>*>(>2>9>>1>*>(>2>9>>>>????M?DG?D?D?DF?@??? ?yq???M?DF?D?DG?D?@???? ?>>>???????????????????????????????????????????????????? ?>>1>*>(>2>9>>1>*>(>2>9>>>>????M?DF?D?D?DG?@??? ?{s???M?D?D?D?DF?@???? ?>>>???????????????????????????????????????????????????? ?>>1>*>(>2>9>>1>*>(>2>9>>>>????M?D?D?D?D?@??? ?}u???M?D?DH?D?D?@???? ?>>>???????????????????????????????????????????????????? ?>>1>*>(>2>9>>1>*>(>2>9>>>>????M?D?DH?DF?DH?@??? ?yq???M?DG?DF?D?DH?@???? ?>>>???????????????????????????????????????????????????? ?>>1>*>(>2>9>>1>*>(>2>9>>>>????L?C?C?C?C?O??? ?{s???L?C?C?C?C?O???? ?>>>???????????????????????????????????????????????????? ?>>1>*>(>2>9>>1>*>(>2>9>>>>???????????? ?}u???????????? ?>>>???????????????????????????????????????????????????? ?>>1>*>(>2>9>>1>*>(>2>9>>>>???????????? ?y>q???????????? ?>>>???????????????????????????????????????????????????? ?>>1>*>(>2>9>>1>*>(>2>9>>>>???????? ?xyz|xxz|xq???????? ?>>>???????????????????????????????????????????????????? ?>>1>*>(>2>9>>1>*>(>2>9>>>>>???????? ?y>q???????? ?>>>???????????????????????????????????????????????????? ?>>1>*>(>2>9>>1>*>(>2>9>>>>>>>>:x>z|xxz|x:>>>>>>>>???????????????????????????????????????????????????? ?>>1>*>(>2>9>>1>*>(>2>9>>>>>>>>;>;>>>>>>>>???????????????????????????????????????????????????? ?>>1>*>(>2>9>>1>*>(>2>9>>>>>>>>>>>>>>>>???????????????????????????????????????????????????? ?>>1>*>(>2>9>>1>*>(>2>9>>>><? ? ? ? ? p? r? t? p? p? r? t? p? p? r? t? p? p? r? t? p? p? r? t?=p?y>>???????????????????????????????????????????????????? ?>>1>*>(>2>9>>1>*>(>2>9>>>>???????????????????????? ?yq???????????????????????? ?>>>???????????????????????????????????????????????????? ?>>1>*>(>2>9>>1>*>(>2>9>>>>???????????????????????? ?y>q???????????????????????? ?>>>???????????????????????????????????????????????????? ?>>1>*>(>2>9>>1>*>(>2>9>>>>???????????????? ?xyz|xxz|xxz|xxz|xq???????????????? ?>>>???????????????????????????????????????????????????? ?>>1>*>(>2>9>>1>*>(>2>9>>>>???????????????? ?{s???????????????? ?>>>???????????????????????????????????????????????????? ?>>1>*>(>2>9>>1>*>(>2>9>>>>????? ?>>>>>????? ?}u???????????????? ?>>>???????????????????????????????????????????????????? ?>>1>*>(>2>9>>1>*>(>2>9>>>>????? ?>>>>>????? ?{s???????????????? ?>>>???????????????????????????????????????????????????? ?>>1>*>(>2>9>>1>*>(>2>9>>>>????? ?>>>>>????? ?}u???????????????? ?>>>???????????????????????????????????????????????????? ?>>1>*>(>2>9>>1>*>(>2>9>>>>????? ?>>>>>????? ?{s???????????????? ?>>>???????????????????????????????????????????????????? ?>>1>*>(>2>9>>1>*>(>2>9>>>>????? ?>>>>>????? ?}u???????????????? ?>>>???????????????????????????????????????????????????? ?>>1>*>(>2>9>>1>*>(>2>9>>>>????? ?=?>>><? ????? ?{s???????????????? ?>>>???????????????????????????????????????????????????? ?>>1>*>(>2>9>>1>*>(>2>9>>>>?????? ?>>>?????? ?}u???????????????? ?>>>???????????????????????????????????????????????????? ?>>1>*>(>2>9>>1>*>(>2>9>>>>?????? ?>>>?????? ?{s???????????????? ?>>>???????????????????????????????????????????????????? ?>>1>*>(>2>9>>1>*>(>2>9>>>>?????? ?>>>?????? ?}u???????????????? ?>>>???????????????????????????????????????????????????? ?>>1>*>(>2>9>>1>*>(>2>9>>>>?????? ?>>>?????? ?yq???????????????? ?>>>???????????????????????????????????????????????????? ?>>1>*>(>2>9>>1>*>(>2>9>>>>?????? ?>>>?????? ?=p?:>;>>;>>>>???????????????????????????????????????????????????? ?>>1>*>(>2>9>>1>*>(>2>9>>>>?????? ?>>>??????? ?>>>????????????? ?>>>????????????????? ?>>>???????????????????????????????????????????????????? ?>>1>*>(>2>9>>1>*>(>2>9>>>>?????? ?>>>??????? ?>>>????????????? ?>>>????????????????? ?>>>???????????????????????????????????????????????????? ?>>1>*>(>2>9>>1>*>(>2>9>>>>?????? ?>>>??????? ?>>>????????????? ?>>>????????????????? ?>>>???????????????????????????????????????????????????? ?>>1>*>(>2>9>>1>*>(>2>9>>>>>?????? ?>>>>??????? ?>>>>????????????? ?>>>>????????????????? ?>>>???????????????????????????????????????????????????? ?>>1>*>(>2>9>>1>*>(>2>9>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>???????????????????????????????????????????????????? ?>>1>*>(>2>9>>1>*>(>2>9>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>???????????????????????????????????????????????????? ?>>1>*>(>2>9>>1>*>(>2>9>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>???????????????????????????????????????????????????? ?>>1>*>(>2>9>>1>*>(>2>9>>>><? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?=?>>>???????????????????????????????????????????????????? ?>>1>*>(>2>9>>1>*>(>2>9>>>>??????????????????????????????????????????????????????? ?>>>???????????????????????????????????????????????????? ?>>1>*>(>2>9>>1>*>(>2>9>>>>??????????????????????????????????????????????????????? ?>>>???????????????????????????????????????????????????? ?>>1>*>(>2>9>>1>*>(>2>9>>>>??????????????????????????????????????????????????????? ?>>>???????????????????????????????????????????????????? ?>>1>*>(>2>9>>1>*>(>2>9>>>>??????????????????????????????????????????????????????? ?>>>???????????????????????????????????????????????????? ?>>1>*>(>2>9>>1>*>(>2>9>>>>??????????????????????????????????????????????????????? ?>>>???????????????????????????????????????????????????? ?>>1>*>(>2>9>>1>*>(>2>9>>>>??????????????????????????????????????????????????????? ?>>>???????????????????????????????????????????????????? ?>>1>*>(>2>9>>1>*>(>2>9>>>>??????????????????????????????????????????????????????? ?>>>???????????????????????????????????????????????????? ?>>1>*>(>2>9>>1>*>(>2>9>>>>??????????????????????????????????????????????????????? ?>>>???????????????????????????????????????????????????? ?>>1>*>(>2>9>>1>*>(>2>9>>>>??????????????????????????????????????????????????????? ?>>>???????????????????????????????????????????????????? ?>>1>*>(>2>9>>1>*>(>2>9>>>>??????????????????????????????????????????????????????? ?>>>???????????????????????????????????????????????????? ?>>1>*>(>2>9>>1>*>(>2>9>>>>??????????????????????????????????????????????????????? ?>>>???????????????????????????????????????????????????? ?>>1>*>(>2>9>>1>*>(>2>9>>>>??????????????????????????????????????????????????????? ?>>>???????????????????????????????????????????????????? ?>>1>*>(>2>9>>1>*>(>2>9>>>>??????????????????????????????????????????????????????? ?>>>???????????????????????????????????????????????????? ?>>1>*>(>2>9>>1>*>(>2>9>>>>??????????????????????????????????????????????????????? ?>>>???????????????????????????????????????????????????? ?>>1>*>(>2>9>>1>*>(>2>9>>>>??????????????????????????????????????????????????????? ?>>>???????????????????????????????????????????????????? ?>>1>*>(>2>9>>1>*>(>2>9>>>>??????????????????????????????????????????????????????? ?>>>???????????????????????????????????????????????????? ?>>1>*>(>2>9>>1>*>(>2>9>>>>??????????????????????????????????????????????????????? ?>>>???????????????????????????????????????????????????? ?>>1>*>(>2>9>>1>*>(>2>9>>>>??????????????????????????????????????????????????????? ?>>>???????????????????????????????????????????????????? ?>>1>*>(>2>9>>1>*>(>2>9>>>>??????????????????????????????????????????????????????? ?>>>???????????????????????????????????????????????????? ?>>1>*>(>2>9>>1>*>(>2>9>>>>??????????????????????????????????????????????????????? ?>>>???????????????????????????????????????????????????? ?>>1>*>(>2>9>>1>*>(>2>9>>>>??????????????????????????????????????????????????????? ?>>>???????????????????????????????????????????????????? ?>>1>*>(>2>9>>1>*>(>2>9>>>>??????????????????????????????????????????????????????? ?>>>???????????????????????????????????????????????????? ?>>1>*>(>2>9>>1>*>(>2>9>>>>??????????????????????????????????????????????????????? ?>>>???????????????????????????????????????????????????? ?>>1>*>(>2>9>>1>*>(>2>9>>>>??????????????????????????????????????????????????????? ?>>>???????????????????????????????????????????????????? ?>>1>*>(>2>9>>1>*>(>2>9>>>>??????????????????????????????????????????????????????? ?>>>???????????????????????????????????????????????????? ?>>1>*>(>2>9>>1>*>(>2>9>>>>??????????????????????????????????????????????????????? ?>>>???????????????????????????????????????????????????? ?>>1>*>(>2>9>>1>*>(>2>9>>>>??????????????????????????????????????????????????????? ?>>>???????????????????????????????????????????????????? ?>>1>*>(>2>9>>1>*>(>2>9>>>>??????????????????????????????????????????????????????? ?>>>???????????????????????????????????????????????????? ?>>1>*>(>2>9>>1>*>(>2>9>>>>??????????????????????????????????????????????????????? ?>>>???????????????????????????????????????????????????? ?>>1>*>(>2>9>>1>*>(>2>9>>>>??????????????????????????????????????????????????????? ?>>>????????????????????????????????? (CorsixTH-0.63/CorsixTH/Campaigns/coffalot.level000066400000000000000000000243321347163623700214200ustar00rootroot00000000000000Copyright (c) 2013 Chris "ChrizmanTV" Wilkinson 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. ---------------------- General Information ------------------------- %Name = "Coffalot" %MapFile = "Coffalot.map" %LevelBriefing = "In the cosy town of Coffalot, some very ill patients are in need of medical attention. Luckily, you have been recruited by the Ministry of Health to operate a chain of hospitals in the nation. You have the job of running this quaint clinic on their behalf. To win the level, cure 50 patients, have a bank balance of $25,000, treat 50% of your visitors and have a hospital worth $50,000. We wish you the best of luck!" %LevelDebriefing = "Good work! The Ministry of Health thinks that you have done extremely well in handling your first hospital, but now, a managerial position has opened up at a new location. Would you be interested in running Holby Hospital?" Town properties InterestRate is defined as centiprocent to allow for two decimals precision, i.e. 300 means 3 % #town.StartCash.InterestRate 30000 300 -------------------- Disease Configuration ------------------------- When a drug is researched, what effectiveness does it have #gbv.StartRating 100 The following table contains all diagnoses and treatments that shows up inte drug casebook in the game. Known specifies whether it should show up from the beginning of the level and RschReqd how much research is required to discover the treatment room for the disease. #expertise[1].Known.RschReqd 1 0 GENERAL_PRACTICE #expertise[2].Known.RschReqd 0 40000 BLOATY_HEAD #expertise[3].Known.RschReqd 0 40000 HAIRYITUS #expertise[4].Known.RschReqd 0 60000 ELVIS #expertise[5].Known.RschReqd 0 60000 INVIS #expertise[6].Known.RschReqd 0 60000 RADIATION #expertise[7].Known.RschReqd 0 40000 SLACK_TONGUE #expertise[8].Known.RschReqd 0 60000 ALIEN #expertise[9].Known.RschReqd 0 20000 BROKEN_BONES #expertise[10].Known.RschReqd 0 40000 BALDNESS #expertise[11].Known.RschReqd 0 40000 DISCRETE_ITCHING #expertise[12].Known.RschReqd 0 40000 JELLYITUS #expertise[13].Known.RschReqd 0 40000 SLEEPING_ILLNESS #expertise[14].Known.RschReqd 0 30000 PREGNANT #expertise[15].Known.RschReqd 0 40000 TRANSPARENCY #expertise[16].Known.RschReqd 0 20000 UNCOMMON_COLD #expertise[17].Known.RschReqd 0 60000 BROKEN_WIND #expertise[18].Known.RschReqd 0 20000 SPARE_RIBS #expertise[19].Known.RschReqd 0 20000 KIDNEY_BEANS #expertise[20].Known.RschReqd 0 20000 BROKEN_HEART #expertise[21].Known.RschReqd 0 20000 RUPTURED_NODULES #expertise[22].Known.RschReqd 0 40000 MULTIPLE_TV_PERSONALITIES #expertise[23].Known.RschReqd 0 60000 INFECTIOUS_LAUGHTER #expertise[24].Known.RschReqd 0 40000 CORRUGATED_ANKLES #expertise[25].Known.RschReqd 1 40000 CHRONIC_NOSEHAIR #expertise[26].Known.RschReqd 0 40000 3RD_DEGREE_SIDEBURNS #expertise[27].Known.RschReqd 0 40000 FAKE_BLOOD #expertise[28].Known.RschReqd 0 40000 GASTRIC_EJECTIONS #expertise[29].Known.RschReqd 0 20000 THE_SQUITS #expertise[30].Known.RschReqd 0 20000 IRON_LUNGS #expertise[31].Known.RschReqd 1 40000 SWEATY_PALMS #expertise[32].Known.RschReqd 1 20000 HEAPED_PILES #expertise[33].Known.RschReqd 0 20000 GUT_ROT #expertise[34].Known.RschReqd 0 20000 GOLF_STONES #expertise[35].Known.RschReqd 0 20000 UNEXPECTED_SWELLING #expertise[36].Known.RschReqd 0 40000 I_D_SCANNER DIAGNOSIS #expertise[37].Known.RschReqd 0 50000 I_D_BLOOD_MACHINE DIAGNOSIS #expertise[38].Known.RschReqd 0 20000 I_D_CARDIO DIAGNOSIS #expertise[39].Known.RschReqd 0 30000 I_D_XRAY DIAGNOSIS #expertise[40].Known.RschReqd 0 60000 I_D_ULTRASCAN DIAGNOSIS #expertise[41].Known.RschReqd 1 20000 I_D_STANDARD DIAGNOSIS #expertise[42].Known.RschReqd 1 20000 I_D_WARD DIAGNOSIS #expertise[43].Known.RschReqd 1 20000 I_D_SHRINK DIAGNOSIS | Objects available | Available from the start | Strength | Available for this level | Comment #objects[9].StartAvail.StartStrength.AvailableForLevel 1 8 1 Inflator Machine #objects[13].StartAvail.StartStrength.AvailableForLevel 0 13 0 Cardiogram #objects[14].StartAvail.StartStrength.AvailableForLevel 0 12 0 Scanner #objects[22].StartAvail.StartStrength.AvailableForLevel 0 9 0 Ultrascan #objects[23].StartAvail.StartStrength.AvailableForLevel 0 7 0 DNA Restorer #objects[24].StartAvail.StartStrength.AvailableForLevel 0 11 0 Cast Remover #objects[25].StartAvail.StartStrength.AvailableForLevel 0 8 0 Hair restorer #objects[26].StartAvail.StartStrength.AvailableForLevel 0 10 0 Slicer for slack tongues #objects[27].StartAvail.StartStrength.AvailableForLevel 0 12 0 X-Ray #objects[30].StartAvail.StartStrength.AvailableForLevel 0 12 0 Operating Table #objects[37].StartAvail.StartStrength.AvailableForLevel 0 0 0 Projector #objects[42].StartAvail.StartStrength.AvailableForLevel 0 10 0 Blood Machine #objects[46].StartAvail.StartStrength.AvailableForLevel 0 8 0 Electrolysis Machine #objects[47].StartAvail.StartStrength.AvailableForLevel 0 7 0 Jellyitus Moulding Machine #objects[54].StartAvail.StartStrength.AvailableForLevel 0 10 0 Decontamination Shower #objects[55].StartAvail.StartStrength.AvailableForLevel 0 10 0 Autopsy Research Machine | Diseases available | Value property to be determined | Comment #visuals[0] 1 I_BLOATY_HEAD #visuals[1] 0 I_HAIRYITUS #visuals[2] 0 I_ELVIS #visuals[3] 0 I_INVIS #visuals[4] 0 I_RADIATION #visuals[5] 0 I_SLACK_TONGUE #visuals[6] 0 I_ALIEN #visuals[7] 0 I_BROKEN_BONES #visuals[8] 0 I_BALDNESS #visuals[9] 1 I_DISCRETE_ITCHING #visuals[10] 0 I_JELLYITUS #visuals[11] 1 I_SLEEPING_ILLNESS #visuals[12] 0 I_PREGNANT #visuals[13] 0 I_TRANSPARENCY #non_visuals[0] 1 I_UNCOMMON_COLD #non_visuals[1] 1 I_BROKEN_WIND #non_visuals[2] 0 I_SPARE_RIBS #non_visuals[3] 0 I_KIDNEY_BEANS #non_visuals[4] 0 I_BROKEN_HEART #non_visuals[5] 0 I_RUPTURED_NODULES #non_visuals[6] 1 I_MULTIPLE_TV_PERSONALITIES #non_visuals[7] 1 I_INFECTIOUS_LAUGHTER #non_visuals[8] 0 I_CORRUGATED_ANKLES #non_visuals[9] 1 I_CHRONIC_NOSEHAIR #non_visuals[10] 0 I_3RD_DEGREE_SIDEBURNS #non_visuals[11] 0 I_FAKE_BLOOD #non_visuals[12] 1 I_GASTRIC_EJECTIONS #non_visuals[13] 1 I_THE_SQUITS #non_visuals[14] 0 I_IRON_LUNGS #non_visuals[15] 1 I_SWEATY_PALMS #non_visuals[16] 1 I_HEAPED_PILES #non_visuals[17] 0 I_GUT_ROT #non_visuals[18] 0 I_GOLF_STONES #non_visuals[19] 0 I_UNEXPECTED_SWELLING ---------------------- Staff Configuration ------------------------- Each entry states how many staff members of each category are available a given month. The number of entries is not fixed. | A list | Month it gets active (start at 0) | Each group | #staff_levels[0].Month.Nurses.Doctors.Handymen.Receptionists 0 8 8 3 2 #staff_levels[1].Month.Nurses.Doctors.Handymen.Receptionists 3 7 5 5 3 #staff_levels[2].Month.Nurses.Doctors.Handymen.Receptionists 5 5 8 7 4 The minimum salary for each staff type #staff[0].MinSalary 60 Nurse #staff[1].MinSalary 75 Doctor #staff[2].MinSalary 30 Handyman #staff[3].MinSalary 30 Receptionist Salary modifiers for different doctor attributes #gbv.SalaryAdd[3] -30 Junior #gbv.SalaryAdd[4] 30 Doctor #gbv.SalaryAdd[5] 50 Surgeon #gbv.SalaryAdd[6] 40 Psychiatrist #gbv.SalaryAdd[7] 100 Consultant #gbv.SalaryAdd[8] 20 Researcher How much the skill of the doctor adds to the salary. skill * 1000 / divisor #gbv.SalaryAbilityDivisor 10 #gbv.LandCostPerTile 10 #gbv.TrainingRate 50 #gbv.AbilityThreshold[0] 80 Surgeon #gbv.AbilityThreshold[1] 60 Psychiatrist #gbv.AbilityThreshold[2] 50 Researcher #gbv.TrainingValue[0] 30 Projector #gbv.TrainingValue[1] 30 Skeleton #gbv.TrainingValue[2] 30 Bookcase #quake_control[0].StartMonth.EndMonth.Severity 18 20 1 #quake_control[1].StartMonth.EndMonth.Severity 30 32 2 #quake_control[2].StartMonth.EndMonth.Severity 42 44 3 --------------------- Research Configuration ----------------------- Divides research input to get the amount of research points. must be > 0 #gbv.ResearchPointsDivisor 5 ---------------------- Awards and Trophies ------------------------- #awards_trophies.CansofCoke 2500 #awards_trophies.CansofCokeBonus 5000 #awards_trophies.Reputation 2500 #awards_trophies.TrophyReputationBonus 20000 #awards_trophies.TrophyDeathBonus 10000 ------------------ Winning and Losing Conditions ------------------- 1 Total reputation 2 Balance total 3 Percentage people your hospital has handled 4 Percentage people have been cured 5 Percentage people have been killed 6 Hospital value #win_criteria[0].Criteria.MaxMin.Value.Group.Bound 2 1 25000 1 0 #win_criteria[1].Criteria.MaxMin.Value.Group.Bound 3 1 50 1 0 #win_criteria[2].Criteria.MaxMin.Value.Group.Bound 4 1 50 1 0 #win_criteria[3].Criteria.MaxMin.Value.Group.Bound 6 1 50000 1 0 #win_criteria[4].Criteria.MaxMin.Value.Group.Bound 0 0 0 0 0 #win_criteria[5].Criteria.MaxMin.Value.Group.Bound 0 0 0 0 0 #lose_criteria[0].Criteria.MaxMin.Value.Group.Bound 5 1 50 1 0 #lose_criteria[1].Criteria.MaxMin.Value.Group.Bound 0 0 0 0 0 #lose_criteria[2].Criteria.MaxMin.Value.Group.Bound 0 0 0 0 0 #lose_criteria[3].Criteria.MaxMin.Value.Group.Bound 0 0 0 0 0 #lose_criteria[4].Criteria.MaxMin.Value.Group.Bound 0 0 0 0 0 #lose_criteria[5].Criteria.MaxMin.Value.Group.Bound 0 0 0 0 0 --------------------- Competitor Information ----------------------- | Index in the away "computer" | Is that opponent playing? | 1 is yes, 0 no | Comment | #computer[12].Playing 1 CORSIX #computer[13].Playing 1 ROUJIN #computer[14].Playing 1 EDVIN CorsixTH-0.63/CorsixTH/Campaigns/dethsdaw.level000066400000000000000000000320061347163623700214230ustar00rootroot00000000000000Copyright (c) 2013 Chris "ChrizmanTV" Wilkinson 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. ---------------------- General ------------------------- %Name = "Dethsdaw" %MapFile = "Dethsdaw.map" %LevelBriefing = "The end is almost in sight, but first, some of the residents of Dethsdaw are coming down with a wobbly kind of illness. As always, the pinnacle of medical technologies are available to you as top scientists have created a new invention called the Atom Analyser. To move on to the final level, we want 900 cures, 90% treated, $450,000 in the bank, $750,000 worth of hospital and a reputation of 900. The Ministry expects total perfection!" %LevelDebriefing = "Exemplary! On the eve of your final mission, you've received a note from the Ministry of Health saying that they're putting you in charge of the largest and most complex hospital of them all! A country mansion awaits you... after you've finished Royal Hospital." #town.StartCash.InterestRate 80000 1400 #gbv.StartRating 70 When a drug is researched, what effectiveness does it have #gbv.DrugImproveRate 5 #gbv.StartCost 100 #gbv.MinDrugCost 50 #gbv.LandCostPerTile 45 Cost to buy a single map square #gbv.RschImproveCostPercent 10 How many percent of the original research points that are required to improve the machine. #gbv.RschImproveIncrementPercent 10 How many additional percentage points are added to the above value for each upgrade. #gbv.MaxObjectStrength 20 Maximum strength value an object can be improved to (by research) #gbv.ResearchIncrement 2 Increase object strength by this amount when researching #gbv.AutopsyRschPercent 33 % of research completed for an autopsy #gbv.AutopsyRepHitPercent 25 % rep hit for discovered autopsy ---------------------- Diseases ------------------------- The following table contains all diagnoses and treatments that shows up in the drug casebook in the game. Known specifies whether it should show up from the beginning of the level and RschReqd how much research is required to discover the treatment room for the disease. #expertise[1].Known.RschReqd 1 0 #expertise[2].Known.RschReqd 1 40000 #expertise[3].Known.RschReqd 1 40000 #expertise[4].Known.RschReqd 1 60000 #expertise[5].Known.RschReqd 1 60000 #expertise[6].Known.RschReqd 0 60000 #expertise[7].Known.RschReqd 1 40000 #expertise[8].Known.RschReqd 0 60000 #expertise[9].Known.RschReqd 1 20000 #expertise[10].Known.RschReqd 1 40000 #expertise[11].Known.RschReqd 1 40000 #expertise[12].Known.RschReqd 0 40000 #expertise[13].Known.RschReqd 1 40000 #expertise[14].Known.RschReqd 1 30000 #expertise[15].Known.RschReqd 1 40000 #expertise[16].Known.RschReqd 1 20000 #expertise[17].Known.RschReqd 1 60000 #expertise[18].Known.RschReqd 1 20000 #expertise[19].Known.RschReqd 1 20000 #expertise[20].Known.RschReqd 1 20000 #expertise[21].Known.RschReqd 1 20000 #expertise[22].Known.RschReqd 1 40000 #expertise[23].Known.RschReqd 1 60000 #expertise[24].Known.RschReqd 1 40000 #expertise[25].Known.RschReqd 1 40000 #expertise[26].Known.RschReqd 1 40000 #expertise[27].Known.RschReqd 1 40000 #expertise[28].Known.RschReqd 1 40000 #expertise[29].Known.RschReqd 1 20000 #expertise[30].Known.RschReqd 1 20000 #expertise[31].Known.RschReqd 1 40000 #expertise[32].Known.RschReqd 1 20000 #expertise[33].Known.RschReqd 1 20000 #expertise[34].Known.RschReqd 1 20000 #expertise[35].Known.RschReqd 1 20000 #expertise[36].Known.RschReqd 0 40000 #expertise[37].Known.RschReqd 0 50000 #expertise[38].Known.RschReqd 1 20000 #expertise[39].Known.RschReqd 0 30000 #expertise[40].Known.RschReqd 0 60000 #expertise[41].Known.RschReqd 1 20000 #expertise[42].Known.RschReqd 1 20000 #expertise[43].Known.RschReqd 1 20000 #expertise[44].Known.RschReqd 0 0 #expertise[45].Known.RschReqd 0 0 #expertise[46].Known.RschReqd 0 0 | Diseases available | Value property to be determined | Comment #visuals[0] 1 #visuals[1] 1 #visuals[2] 1 #visuals[3] 1 #visuals[4] 1 #visuals[5] 1 #visuals[6] 0 #visuals[7] 1 #visuals[8] 1 #visuals[9] 1 #visuals[10] 1 #visuals[11] 1 #visuals[12] 1 #visuals[13] 1 #non_visuals[0] 1 #non_visuals[1] 1 #non_visuals[2] 1 #non_visuals[3] 1 #non_visuals[4] 1 #non_visuals[5] 1 #non_visuals[6] 1 #non_visuals[7] 1 #non_visuals[8] 1 #non_visuals[9] 1 #non_visuals[10] 1 #non_visuals[11] 1 #non_visuals[12] 1 #non_visuals[13] 1 #non_visuals[14] 1 #non_visuals[15] 1 #non_visuals[16] 1 #non_visuals[17] 1 #non_visuals[18] 1 #non_visuals[19] 1 #visuals_available[0] 0 #visuals_available[1] 12 #visuals_available[2] 3 #visuals_available[3] 12 #visuals_available[4] 18 #visuals_available[5] 6 #visuals_available[6] 0 #visuals_available[7] 6 #visuals_available[8] 12 #visuals_available[9] 0 #visuals_available[10] 18 #visuals_available[11] 0 #visuals_available[12] 0 #visuals_available[13] 6 ---------------------- Objects ------------------------- | Objects available | Available from the start | Strength | Available for this level | Comment #objects[1].StartAvail.StartStrength.AvailableForLevel.RschReqd 1 10 1 0 #objects[2].StartAvail.StartStrength.AvailableForLevel.RschReqd 1 10 1 0 #objects[3].StartAvail.StartStrength.AvailableForLevel.RschReqd 1 10 1 0 #objects[4].StartAvail.StartStrength.AvailableForLevel.RschReqd 1 10 1 0 #objects[5].StartAvail.StartStrength.AvailableForLevel.RschReqd 1 10 1 0 #objects[6].StartAvail.StartStrength.AvailableForLevel.RschReqd 1 10 1 0 #objects[7].StartAvail.StartStrength.AvailableForLevel.RschReqd 1 10 1 0 #objects[8].StartAvail.StartStrength.AvailableForLevel.RschReqd 1 10 1 20000 #objects[9].StartAvail.StartStrength.AvailableForLevel.RschReqd 1 8 1 40000 #objects[10].StartAvail.StartStrength.AvailableForLevel.RschReqd 1 10 1 0 #objects[11].StartAvail.StartStrength.AvailableForLevel.RschReqd 1 10 1 0 #objects[12].StartAvail.StartStrength.AvailableForLevel.RschReqd 1 10 1 0 #objects[13].StartAvail.StartStrength.AvailableForLevel.RschReqd 1 13 1 20000 #objects[14].StartAvail.StartStrength.AvailableForLevel.RschReqd 0 12 1 40000 #objects[15].StartAvail.StartStrength.AvailableForLevel.RschReqd 1 10 1 0 #objects[16].StartAvail.StartStrength.AvailableForLevel.RschReqd 1 10 1 0 #objects[17].StartAvail.StartStrength.AvailableForLevel.RschReqd 1 10 1 0 #objects[18].StartAvail.StartStrength.AvailableForLevel.RschReqd 1 10 1 20000 #objects[19].StartAvail.StartStrength.AvailableForLevel.RschReqd 1 10 1 0 #objects[20].StartAvail.StartStrength.AvailableForLevel.RschReqd 1 10 1 20000 #objects[21].StartAvail.StartStrength.AvailableForLevel.RschReqd 1 10 1 0 #objects[22].StartAvail.StartStrength.AvailableForLevel.RschReqd 0 9 1 60000 #objects[23].StartAvail.StartStrength.AvailableForLevel.RschReqd 0 7 0 60000 #objects[24].StartAvail.StartStrength.AvailableForLevel.RschReqd 0 11 1 20000 #objects[25].StartAvail.StartStrength.AvailableForLevel.RschReqd 0 8 1 40000 #objects[26].StartAvail.StartStrength.AvailableForLevel.RschReqd 1 10 1 40000 #objects[27].StartAvail.StartStrength.AvailableForLevel.RschReqd 1 12 1 30000 #objects[28].StartAvail.StartStrength.AvailableForLevel.RschReqd 1 10 1 0 #objects[29].StartAvail.StartStrength.AvailableForLevel.RschReqd 1 10 1 0 #objects[30].StartAvail.StartStrength.AvailableForLevel.RschReqd 1 12 1 20000 #objects[31].StartAvail.StartStrength.AvailableForLevel.RschReqd 1 10 1 0 #objects[32].StartAvail.StartStrength.AvailableForLevel.RschReqd 1 10 1 0 #objects[33].StartAvail.StartStrength.AvailableForLevel.RschReqd 1 10 1 0 #objects[34].StartAvail.StartStrength.AvailableForLevel.RschReqd 1 10 1 0 #objects[35].StartAvail.StartStrength.AvailableForLevel.RschReqd 1 10 1 0 #objects[36].StartAvail.StartStrength.AvailableForLevel.RschReqd 1 10 1 0 #objects[37].StartAvail.StartStrength.AvailableForLevel.RschReqd 1 0 1 20000 #objects[38].StartAvail.StartStrength.AvailableForLevel.RschReqd 1 10 1 0 #objects[39].StartAvail.StartStrength.AvailableForLevel.RschReqd 1 10 1 20000 #objects[40].StartAvail.StartStrength.AvailableForLevel.RschReqd 1 1 1 30000 #objects[41].StartAvail.StartStrength.AvailableForLevel.RschReqd 0 1 1 30000 #objects[42].StartAvail.StartStrength.AvailableForLevel.RschReqd 0 10 1 50000 #objects[43].StartAvail.StartStrength.AvailableForLevel.RschReqd 1 10 1 0 #objects[44].StartAvail.StartStrength.AvailableForLevel.RschReqd 1 10 1 0 #objects[45].StartAvail.StartStrength.AvailableForLevel.RschReqd 1 10 1 0 #objects[46].StartAvail.StartStrength.AvailableForLevel.RschReqd 0 8 1 40000 #objects[47].StartAvail.StartStrength.AvailableForLevel.RschReqd 0 7 1 40000 #objects[48].StartAvail.StartStrength.AvailableForLevel.RschReqd 1 10 1 0 #objects[49].StartAvail.StartStrength.AvailableForLevel.RschReqd 1 10 1 0 #objects[50].StartAvail.StartStrength.AvailableForLevel.RschReqd 1 10 1 0 #objects[51].StartAvail.StartStrength.AvailableForLevel.RschReqd 1 10 1 0 #objects[52].StartAvail.StartStrength.AvailableForLevel.RschReqd 1 10 1 0 #objects[53].StartAvail.StartStrength.AvailableForLevel.RschReqd 1 10 1 0 #objects[54].StartAvail.StartStrength.AvailableForLevel.RschReqd 0 10 1 60000 #objects[55].StartAvail.StartStrength.AvailableForLevel.RschReqd 1 10 1 0 #objects[56].StartAvail.StartStrength.AvailableForLevel.RschReqd 1 10 1 0 #objects[57].StartAvail.StartStrength.AvailableForLevel.RschReqd 1 57 1 0 #objects[58].StartAvail.StartStrength.AvailableForLevel.RschReqd 1 10 1 0 #objects[59].StartAvail.StartStrength.AvailableForLevel.RschReqd 1 10 1 0 #objects[60].StartAvail.StartStrength.AvailableForLevel.RschReqd 1 10 1 0 #objects[61].StartAvail.StartStrength.AvailableForLevel.RschReqd 1 10 1 0 ---------------------- Staff Configuration ------------------------- The minimum salary for each staff type #staff[0].MinSalary 60 #staff[1].MinSalary 75 #staff[2].MinSalary 30 #staff[3].MinSalary 30 Salary modifiers for different doctor attributes #gbv.SalaryAdd[3] -30 #gbv.SalaryAdd[4] 25 #gbv.SalaryAdd[5] 75 #gbv.SalaryAdd[6] 50 #gbv.SalaryAdd[7] 120 #gbv.SalaryAdd[8] 30 Each entry states how many staff members of each category are available a given month. The number of entries is not fixed. | A list | Month it gets active (start at 0) | Each group | #staff_levels[0].Month.Nurses.Doctors.Handymen.Receptionists.ShrkRate.SurgRate.RschRate.ConsRate.JrRate 0 8 8 3 2 10 10 10 10 3 #staff_levels[1].Month.Nurses.Doctors.Handymen.Receptionists.ShrkRate.SurgRate.RschRate.ConsRate.JrRate 3 7 5 5 3 10 10 10 10 3 #staff_levels[2].Month.Nurses.Doctors.Handymen.Receptionists.ShrkRate.SurgRate.RschRate.ConsRate.JrRate 5 5 8 7 4 10 10 10 10 3 #gbv.TrainingRate 45 #gbv.AbilityThreshold[0] 75 Surgeon #gbv.AbilityThreshold[1] 60 Psychiatrist #gbv.AbilityThreshold[2] 45 Researcher #gbv.TrainingValue[0] 10 Projector #gbv.TrainingValue[1] 25 Skeleton #gbv.TrainingValue[2] 30 Bookcase ----------------------- Emergency Control -------------------------- #emergency_control[0].Random 0 ----------------------- Quake Control -------------------------- #quake_control[0].StartMonth.EndMonth.Severity 10 12 6 #quake_control[1].StartMonth.EndMonth.Severity 22 24 7 #quake_control[2].StartMonth.EndMonth.Severity 34 36 8 #quake_control[3].StartMonth.EndMonth.Severity 46 48 7 #quake_control[4].StartMonth.EndMonth.Severity 58 60 6 #quake_control[5].StartMonth.EndMonth.Severity 70 72 6 ----------------------- Population Growth ---------------------------- #popn[0].Month.Change 0 4 #popn[1].Month.Change 1 1 ---------------------- Awards and Trophies ------------------------- #awards_trophies.CansofCoke 2500 #awards_trophies.CansofCokeBonus 5000 #awards_trophies.Reputation 2500 #awards_trophies.TrophyReputationBonus 20000 #awards_trophies.TrophyDeathBonus 10000 ------------------ Winning and Losing Conditions ------------------- 1 Total reputation 2 Balance total 3 Percentage people your hospital has handled 4 Cure count 5 Percentage people have been killed 6 Hospital value #win_criteria[0].Criteria.MaxMin.Value.Group.Bound 1 1 900 1 0 #win_criteria[1].Criteria.MaxMin.Value.Group.Bound 2 1 450000 1 0 #win_criteria[2].Criteria.MaxMin.Value.Group.Bound 3 1 90 1 0 #win_criteria[3].Criteria.MaxMin.Value.Group.Bound 4 1 900 1 0 #win_criteria[4].Criteria.MaxMin.Value.Group.Bound 6 1 750000 1 0 #lose_criteria[0].Criteria.MaxMin.Value.Group.Bound 1 0 450 1 500 #lose_criteria[1].Criteria.MaxMin.Value.Group.Bound 2 0 -40000 2 -20000 #lose_criteria[2].Criteria.MaxMin.Value.Group.Bound 5 1 20 3 10 CorsixTH-0.63/CorsixTH/Campaigns/example.campaign000066400000000000000000000005441347163623700217250ustar00rootroot00000000000000name = "Example campaign" description = "This is an example campaign where you get the chance to play " .. "through some of the levels shipped with CorsixTH. Happy gaming!" levels = { "finisham.level", "avatar.level", "confined_v5.level", "st.peter's.level", } winning_text = "Congratulations! You have successfully completed all the levels." CorsixTH-0.63/CorsixTH/Campaigns/fourcorners.level000066400000000000000000000247451347163623700222020ustar00rootroot00000000000000Copyright (c) 2013 Chris "ChrizmanTV" Wilkinson 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. ---------------------- General Information ------------------------- %Name = "Four Corners" %MapFile = "Four Corners.map" %LevelBriefing = "New advances in technology has allowed for improved research - you now have access to the Computer. Also, there is a tragic new condition involving gleaming foreheads and a new piece of diagnosis equipment to research. Your hospital, too, is strange since it is made up of nine cubes, so you will have to deal with it as best you can. Cure 600 people, treat 75% of them, have $200,000 in the bank, have a hospital worth $300,000 and a reputation of 750 to win." %LevelDebriefing = "Spectacular! The Ministry of Health is in good standing with the public thanks to you, but they feel as though one hospital is not moving forward enough. There is a hair-raisingly good opportunity available to you at Hoppalong Hospital, will you take the offer?" Town properties InterestRate is defined as centiprocent to allow for two decimals precision, i.e. 300 means 3 % #town.StartCash.InterestRate 50000 1000 -------------------- Disease Configuration ------------------------- When a drug is researched, what effectiveness does it have #gbv.StartRating 80 The following table contains all diagnoses and treatments that shows up inte drug casebook in the game. Known specifies whether it should show up from the beginning of the level and RschReqd how much research is required to discover the treatment room for the disease. #expertise[1].Known.RschReqd 1 0 GENERAL_PRACTICE #expertise[2].Known.RschReqd 1 40000 BLOATY_HEAD #expertise[3].Known.RschReqd 0 40000 HAIRYITUS #expertise[4].Known.RschReqd 0 60000 ELVIS #expertise[5].Known.RschReqd 1 60000 INVIS #expertise[6].Known.RschReqd 0 60000 RADIATION #expertise[7].Known.RschReqd 0 40000 SLACK_TONGUE #expertise[8].Known.RschReqd 0 60000 ALIEN #expertise[9].Known.RschReqd 0 20000 BROKEN_BONES #expertise[10].Known.RschReqd 0 40000 BALDNESS #expertise[11].Known.RschReqd 1 40000 DISCRETE_ITCHING #expertise[12].Known.RschReqd 0 40000 JELLYITUS #expertise[13].Known.RschReqd 1 40000 SLEEPING_ILLNESS #expertise[14].Known.RschReqd 0 30000 PREGNANT #expertise[15].Known.RschReqd 0 40000 TRANSPARENCY #expertise[16].Known.RschReqd 1 20000 UNCOMMON_COLD #expertise[17].Known.RschReqd 1 60000 BROKEN_WIND #expertise[18].Known.RschReqd 1 20000 SPARE_RIBS #expertise[19].Known.RschReqd 1 20000 KIDNEY_BEANS #expertise[20].Known.RschReqd 0 20000 BROKEN_HEART #expertise[21].Known.RschReqd 0 20000 RUPTURED_NODULES #expertise[22].Known.RschReqd 1 40000 MULTIPLE_TV_PERSONALITIES #expertise[23].Known.RschReqd 1 60000 INFECTIOUS_LAUGHTER #expertise[24].Known.RschReqd 1 40000 CORRUGATED_ANKLES #expertise[25].Known.RschReqd 1 40000 CHRONIC_NOSEHAIR #expertise[26].Known.RschReqd 1 40000 3RD_DEGREE_SIDEBURNS #expertise[27].Known.RschReqd 1 40000 FAKE_BLOOD #expertise[28].Known.RschReqd 1 40000 GASTRIC_EJECTIONS #expertise[29].Known.RschReqd 1 20000 THE_SQUITS #expertise[30].Known.RschReqd 0 20000 IRON_LUNGS #expertise[31].Known.RschReqd 1 40000 SWEATY_PALMS #expertise[32].Known.RschReqd 1 20000 HEAPED_PILES #expertise[33].Known.RschReqd 1 20000 GUT_ROT #expertise[34].Known.RschReqd 1 20000 GOLF_STONES #expertise[35].Known.RschReqd 0 20000 UNEXPECTED_SWELLING #expertise[36].Known.RschReqd 0 40000 I_D_SCANNER DIAGNOSIS #expertise[37].Known.RschReqd 0 50000 I_D_BLOOD_MACHINE DIAGNOSIS #expertise[38].Known.RschReqd 1 20000 I_D_CARDIO DIAGNOSIS #expertise[39].Known.RschReqd 0 30000 I_D_XRAY DIAGNOSIS #expertise[40].Known.RschReqd 0 60000 I_D_ULTRASCAN DIAGNOSIS #expertise[41].Known.RschReqd 1 20000 I_D_STANDARD DIAGNOSIS #expertise[42].Known.RschReqd 1 20000 I_D_WARD DIAGNOSIS #expertise[43].Known.RschReqd 1 20000 I_D_SHRINK DIAGNOSIS | Objects available | Available from the start | Strength | Available for this level | Comment #objects[9].StartAvail.StartStrength.AvailableForLevel 1 8 1 Inflator Machine #objects[13].StartAvail.StartStrength.AvailableForLevel 1 13 1 Cardiogram #objects[14].StartAvail.StartStrength.AvailableForLevel 0 12 1 Scanner #objects[22].StartAvail.StartStrength.AvailableForLevel 0 9 0 Ultrascan #objects[23].StartAvail.StartStrength.AvailableForLevel 0 7 0 DNA Restorer #objects[24].StartAvail.StartStrength.AvailableForLevel 0 11 1 Cast Remover #objects[25].StartAvail.StartStrength.AvailableForLevel 0 8 1 Hair restorer #objects[26].StartAvail.StartStrength.AvailableForLevel 0 10 1 Slicer for slack tongues #objects[27].StartAvail.StartStrength.AvailableForLevel 0 12 1 X-Ray #objects[30].StartAvail.StartStrength.AvailableForLevel 1 12 1 Operating Table #objects[37].StartAvail.StartStrength.AvailableForLevel 1 0 1 Projector #objects[42].StartAvail.StartStrength.AvailableForLevel 0 10 1 Blood Machine #objects[46].StartAvail.StartStrength.AvailableForLevel 0 8 0 Electrolysis Machine #objects[47].StartAvail.StartStrength.AvailableForLevel 0 7 0 Jellyitus Moulding Machine #objects[54].StartAvail.StartStrength.AvailableForLevel 0 10 0 Decontamination Shower #objects[55].StartAvail.StartStrength.AvailableForLevel 1 10 1 Autopsy Research Machine | Diseases available | Value property to be determined | Comment #visuals[0] 1 I_BLOATY_HEAD #visuals[1] 0 I_HAIRYITUS #visuals[2] 1 I_ELVIS #visuals[3] 1 I_INVIS #visuals[4] 0 I_RADIATION #visuals[5] 1 I_SLACK_TONGUE #visuals[6] 0 I_ALIEN #visuals[7] 1 I_BROKEN_BONES #visuals[8] 1 I_BALDNESS #visuals[9] 1 I_DISCRETE_ITCHING #visuals[10] 0 I_JELLYITUS #visuals[11] 1 I_SLEEPING_ILLNESS #visuals[12] 0 I_PREGNANT #visuals[13] 0 I_TRANSPARENCY #non_visuals[0] 1 I_UNCOMMON_COLD #non_visuals[1] 1 I_BROKEN_WIND #non_visuals[2] 1 I_SPARE_RIBS #non_visuals[3] 1 I_KIDNEY_BEANS #non_visuals[4] 1 I_BROKEN_HEART #non_visuals[5] 1 I_RUPTURED_NODULES #non_visuals[6] 1 I_MULTIPLE_TV_PERSONALITIES #non_visuals[7] 1 I_INFECTIOUS_LAUGHTER #non_visuals[8] 1 I_CORRUGATED_ANKLES #non_visuals[9] 1 I_CHRONIC_NOSEHAIR #non_visuals[10] 1 I_3RD_DEGREE_SIDEBURNS #non_visuals[11] 1 I_FAKE_BLOOD #non_visuals[12] 1 I_GASTRIC_EJECTIONS #non_visuals[13] 1 I_THE_SQUITS #non_visuals[14] 1 I_IRON_LUNGS #non_visuals[15] 1 I_SWEATY_PALMS #non_visuals[16] 1 I_HEAPED_PILES #non_visuals[17] 1 I_GUT_ROT #non_visuals[18] 1 I_GOLF_STONES #non_visuals[19] 1 I_UNEXPECTED_SWELLING ---------------------- Staff Configuration ------------------------- Each entry states how many staff members of each category are available a given month. The number of entries is not fixed. | A list | Month it gets active (start at 0) | Each group | #staff_levels[0].Month.Nurses.Doctors.Handymen.Receptionists 0 8 8 3 2 #staff_levels[1].Month.Nurses.Doctors.Handymen.Receptionists 3 7 5 5 3 #staff_levels[2].Month.Nurses.Doctors.Handymen.Receptionists 5 5 8 7 4 The minimum salary for each staff type #staff[0].MinSalary 60 Nurse #staff[1].MinSalary 75 Doctor #staff[2].MinSalary 30 Handyman #staff[3].MinSalary 30 Receptionist Salary modifiers for different doctor attributes #gbv.SalaryAdd[3] -30 Junior #gbv.SalaryAdd[4] 30 Doctor #gbv.SalaryAdd[5] 50 Surgeon #gbv.SalaryAdd[6] 40 Psychiatrist #gbv.SalaryAdd[7] 100 Consultant #gbv.SalaryAdd[8] 20 Researcher How much the skill of the doctor adds to the salary. skill * 1000 / divisor #gbv.SalaryAbilityDivisor 10 #gbv.LandCostPerTile 30 #gbv.TrainingRate 50 #gbv.AbilityThreshold[0] 80 Surgeon #gbv.AbilityThreshold[1] 60 Psychiatrist #gbv.AbilityThreshold[2] 50 Researcher #gbv.TrainingValue[0] 30 Projector #gbv.TrainingValue[1] 30 Skeleton #gbv.TrainingValue[2] 30 Bookcase #quake_control[0].StartMonth.EndMonth.Severity 10 12 4 #quake_control[1].StartMonth.EndMonth.Severity 22 24 5 #quake_control[2].StartMonth.EndMonth.Severity 34 36 6 #quake_control[3].StartMonth.EndMonth.Severity 46 48 5 #quake_control[4].StartMonth.EndMonth.Severity 58 60 4 #quake_control[5].StartMonth.EndMonth.Severity 70 72 4 --------------------- Research Configuration ----------------------- Divides research input to get the amount of research points. must be > 0 #gbv.ResearchPointsDivisor 5 ---------------------- Awards and Trophies ------------------------- #awards_trophies.CansofCoke 2500 #awards_trophies.CansofCokeBonus 5000 #awards_trophies.Reputation 2500 #awards_trophies.TrophyReputationBonus 20000 #awards_trophies.TrophyDeathBonus 10000 ------------------ Winning and Losing Conditions ------------------- 1 Total reputation 2 Balance total 3 Percentage people your hospital has handled 4 Percentage people have been cured 5 Percentage people have been killed 6 Hospital value #win_criteria[0].Criteria.MaxMin.Value.Group.Bound 1 1 750 1 0 #win_criteria[1].Criteria.MaxMin.Value.Group.Bound 2 1 200000 1 0 #win_criteria[2].Criteria.MaxMin.Value.Group.Bound 3 1 75 1 0 #win_criteria[3].Criteria.MaxMin.Value.Group.Bound 4 1 600 1 0 #win_criteria[4].Criteria.MaxMin.Value.Group.Bound 6 1 300000 1 0 #win_criteria[5].Criteria.MaxMin.Value.Group.Bound 0 0 0 0 0 #lose_criteria[0].Criteria.MaxMin.Value.Group.Bound 1 0 400 1 450 #lose_criteria[1].Criteria.MaxMin.Value.Group.Bound 5 1 25 2 0 #lose_criteria[2].Criteria.MaxMin.Value.Group.Bound 0 0 0 0 0 #lose_criteria[3].Criteria.MaxMin.Value.Group.Bound 0 0 0 0 0 #lose_criteria[4].Criteria.MaxMin.Value.Group.Bound 0 0 0 0 0 #lose_criteria[5].Criteria.MaxMin.Value.Group.Bound 0 0 0 0 0 --------------------- Competitor Information ----------------------- | Index in the away "computer" | Is that opponent playing? | 1 is yes, 0 no | Comment | #computer[12].Playing 1 CORSIX #computer[13].Playing 1 ROUJIN #computer[14].Playing 1 EDVIN CorsixTH-0.63/CorsixTH/Campaigns/greyhamgardens.level000066400000000000000000000256411347163623700226270ustar00rootroot00000000000000Copyright (c) 2013 Chris "ChrizmanTV" Wilkinson 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. ---------------------- General Information ------------------------- %Name = "Greyham Gardens" %MapFile = "Greyham Gardens.map" %LevelBriefing = "Dr Greybags, a local scientist, has invested his time and effort in researching new machinery to combat the strange new afflictions in this rural area. He has kindly donated his expertise to you in the hope that you can cure more people. You now have access to the research room and training, among other rooms. Victory shall be yours if you cure 250 patients, amass $100,000, treat 60% of patients and have $125,000 worth of hospital value. We are confident you can do it!" %LevelDebriefing = "Brilliant! In an ever changing world of comical afflictions, the Ministry of Health deems you a valued employee. You now get to go to the beach... to run your next hospital. Will you fill the job vacancy going at Snuffit Sands Hospital?" Town properties InterestRate is defined as centiprocent to allow for two decimals precision, i.e. 300 means 3 % #town.StartCash.InterestRate 40000 600 -------------------- Disease Configuration ------------------------- When a drug is researched, what effectiveness does it have #gbv.StartRating 95 The following table contains all diagnoses and treatments that shows up inte drug casebook in the game. Known specifies whether it should show up from the beginning of the level and RschReqd how much research is required to discover the treatment room for the disease. #expertise[1].Known.RschReqd 1 0 GENERAL_PRACTICE #expertise[2].Known.RschReqd 0 40000 BLOATY_HEAD #expertise[3].Known.RschReqd 0 40000 HAIRYITUS #expertise[4].Known.RschReqd 0 60000 ELVIS #expertise[5].Known.RschReqd 0 60000 INVIS #expertise[6].Known.RschReqd 0 60000 RADIATION #expertise[7].Known.RschReqd 0 40000 SLACK_TONGUE #expertise[8].Known.RschReqd 0 60000 ALIEN #expertise[9].Known.RschReqd 0 20000 BROKEN_BONES #expertise[10].Known.RschReqd 0 40000 BALDNESS #expertise[11].Known.RschReqd 1 40000 DISCRETE_ITCHING #expertise[12].Known.RschReqd 0 40000 JELLYITUS #expertise[13].Known.RschReqd 1 40000 SLEEPING_ILLNESS #expertise[14].Known.RschReqd 0 30000 PREGNANT #expertise[15].Known.RschReqd 0 40000 TRANSPARENCY #expertise[16].Known.RschReqd 1 20000 UNCOMMON_COLD #expertise[17].Known.RschReqd 1 60000 BROKEN_WIND #expertise[18].Known.RschReqd 0 20000 SPARE_RIBS #expertise[19].Known.RschReqd 0 20000 KIDNEY_BEANS #expertise[20].Known.RschReqd 0 20000 BROKEN_HEART #expertise[21].Known.RschReqd 0 20000 RUPTURED_NODULES #expertise[22].Known.RschReqd 0 40000 MULTIPLE_TV_PERSONALITIES #expertise[23].Known.RschReqd 1 60000 INFECTIOUS_LAUGHTER #expertise[24].Known.RschReqd 0 40000 CORRUGATED_ANKLES #expertise[25].Known.RschReqd 1 40000 CHRONIC_NOSEHAIR #expertise[26].Known.RschReqd 0 40000 3RD_DEGREE_SIDEBURNS #expertise[27].Known.RschReqd 0 40000 FAKE_BLOOD #expertise[28].Known.RschReqd 0 40000 GASTRIC_EJECTIONS #expertise[29].Known.RschReqd 1 20000 THE_SQUITS #expertise[30].Known.RschReqd 0 20000 IRON_LUNGS #expertise[31].Known.RschReqd 1 40000 SWEATY_PALMS #expertise[32].Known.RschReqd 1 20000 HEAPED_PILES #expertise[33].Known.RschReqd 0 20000 GUT_ROT #expertise[34].Known.RschReqd 0 20000 GOLF_STONES #expertise[35].Known.RschReqd 0 20000 UNEXPECTED_SWELLING #expertise[36].Known.RschReqd 0 40000 I_D_SCANNER DIAGNOSIS #expertise[37].Known.RschReqd 0 50000 I_D_BLOOD_MACHINE DIAGNOSIS #expertise[38].Known.RschReqd 1 20000 I_D_CARDIO DIAGNOSIS #expertise[39].Known.RschReqd 0 30000 I_D_XRAY DIAGNOSIS #expertise[40].Known.RschReqd 0 60000 I_D_ULTRASCAN DIAGNOSIS #expertise[41].Known.RschReqd 1 20000 I_D_STANDARD DIAGNOSIS #expertise[42].Known.RschReqd 1 20000 I_D_WARD DIAGNOSIS #expertise[43].Known.RschReqd 1 20000 I_D_SHRINK DIAGNOSIS | Objects available | Available from the start | Strength | Available for this level | Comment #objects[9].StartAvail.StartStrength.AvailableForLevel 1 8 1 Inflator Machine #objects[13].StartAvail.StartStrength.AvailableForLevel 1 13 1 Cardiogram #objects[14].StartAvail.StartStrength.AvailableForLevel 0 12 0 Scanner #objects[22].StartAvail.StartStrength.AvailableForLevel 0 9 0 Ultrascan #objects[23].StartAvail.StartStrength.AvailableForLevel 0 7 0 DNA Restorer #objects[24].StartAvail.StartStrength.AvailableForLevel 0 11 0 Cast Remover #objects[25].StartAvail.StartStrength.AvailableForLevel 0 8 0 Hair restorer #objects[26].StartAvail.StartStrength.AvailableForLevel 0 10 0 Slicer for slack tongues #objects[27].StartAvail.StartStrength.AvailableForLevel 0 12 1 X-Ray #objects[30].StartAvail.StartStrength.AvailableForLevel 1 12 1 Operating Table #objects[37].StartAvail.StartStrength.AvailableForLevel 1 0 1 Projector #objects[42].StartAvail.StartStrength.AvailableForLevel 0 10 0 Blood Machine #objects[46].StartAvail.StartStrength.AvailableForLevel 0 8 0 Electrolysis Machine #objects[47].StartAvail.StartStrength.AvailableForLevel 0 7 0 Jellyitus Moulding Machine #objects[54].StartAvail.StartStrength.AvailableForLevel 0 10 0 Decontamination Shower #objects[55].StartAvail.StartStrength.AvailableForLevel 1 10 1 Autopsy Research Machine | Diseases available | Value property to be determined | Comment #visuals[0] 1 I_BLOATY_HEAD #visuals[1] 0 I_HAIRYITUS #visuals[2] 0 I_ELVIS #visuals[3] 1 I_INVIS #visuals[4] 0 I_RADIATION #visuals[5] 0 I_SLACK_TONGUE #visuals[6] 0 I_ALIEN #visuals[7] 0 I_BROKEN_BONES #visuals[8] 0 I_BALDNESS #visuals[9] 1 I_DISCRETE_ITCHING #visuals[10] 0 I_JELLYITUS #visuals[11] 1 I_SLEEPING_ILLNESS #visuals[12] 0 I_PREGNANT #visuals[13] 0 I_TRANSPARENCY #non_visuals[0] 1 I_UNCOMMON_COLD #non_visuals[1] 1 I_BROKEN_WIND #non_visuals[2] 1 I_SPARE_RIBS #non_visuals[3] 1 I_KIDNEY_BEANS #non_visuals[4] 0 I_BROKEN_HEART #non_visuals[5] 0 I_RUPTURED_NODULES #non_visuals[6] 1 I_MULTIPLE_TV_PERSONALITIES #non_visuals[7] 1 I_INFECTIOUS_LAUGHTER #non_visuals[8] 1 I_CORRUGATED_ANKLES #non_visuals[9] 1 I_CHRONIC_NOSEHAIR #non_visuals[10] 1 I_3RD_DEGREE_SIDEBURNS #non_visuals[11] 1 I_FAKE_BLOOD #non_visuals[12] 1 I_GASTRIC_EJECTIONS #non_visuals[13] 1 I_THE_SQUITS #non_visuals[14] 0 I_IRON_LUNGS #non_visuals[15] 1 I_SWEATY_PALMS #non_visuals[16] 1 I_HEAPED_PILES #non_visuals[17] 1 I_GUT_ROT #non_visuals[18] 1 I_GOLF_STONES #non_visuals[19] 0 I_UNEXPECTED_SWELLING ---------------------- Staff Configuration ------------------------- Each entry states how many staff members of each category are available a given month. The number of entries is not fixed. | A list | Month it gets active (start at 0) | Each group | #staff_levels[0].Month.Nurses.Doctors.Handymen.Receptionists 0 8 8 3 2 #staff_levels[1].Month.Nurses.Doctors.Handymen.Receptionists 3 7 5 5 3 #staff_levels[2].Month.Nurses.Doctors.Handymen.Receptionists 5 5 8 7 4 The minimum salary for each staff type #staff[0].MinSalary 60 Nurse #staff[1].MinSalary 75 Doctor #staff[2].MinSalary 30 Handyman #staff[3].MinSalary 30 Receptionist Salary modifiers for different doctor attributes #gbv.SalaryAdd[3] -30 Junior #gbv.SalaryAdd[4] 30 Doctor #gbv.SalaryAdd[5] 50 Surgeon #gbv.SalaryAdd[6] 40 Psychiatrist #gbv.SalaryAdd[7] 100 Consultant #gbv.SalaryAdd[8] 20 Researcher How much the skill of the doctor adds to the salary. skill * 1000 / divisor #gbv.SalaryAbilityDivisor 10 #gbv.LandCostPerTile 20 #gbv.TrainingRate 50 #gbv.AbilityThreshold[0] 80 Surgeon #gbv.AbilityThreshold[1] 60 Psychiatrist #gbv.AbilityThreshold[2] 50 Researcher #gbv.TrainingValue[0] 30 Projector #gbv.TrainingValue[1] 30 Skeleton #gbv.TrainingValue[2] 30 Bookcase #quake_control[0].StartMonth.EndMonth.Severity 18 20 2 #quake_control[1].StartMonth.EndMonth.Severity 30 32 3 #quake_control[2].StartMonth.EndMonth.Severity 42 44 4 --------------------- Research Configuration ----------------------- Divides research input to get the amount of research points. must be > 0 #gbv.ResearchPointsDivisor 5 ---------------------- Awards and Trophies ------------------------- #awards_trophies.CansofCoke 2500 #awards_trophies.CansofCokeBonus 5000 #awards_trophies.Reputation 2500 #awards_trophies.TrophyReputationBonus 20000 #awards_trophies.TrophyDeathBonus 10000 ------------------ Winning and Losing Conditions ------------------- 1 Total reputation 2 Balance total 3 Percentage people your hospital has handled 4 Percentage people have been cured 5 Percentage people have been killed 6 Hospital value #win_criteria[0].Criteria.MaxMin.Value.Group.Bound 2 1 100000 1 0 #win_criteria[1].Criteria.MaxMin.Value.Group.Bound 3 1 60 1 0 #win_criteria[2].Criteria.MaxMin.Value.Group.Bound 4 1 250 1 0 #win_criteria[3].Criteria.MaxMin.Value.Group.Bound 6 1 125000 1 0 #win_criteria[4].Criteria.MaxMin.Value.Group.Bound 0 0 0 0 0 #win_criteria[5].Criteria.MaxMin.Value.Group.Bound 0 0 0 0 0 #lose_criteria[0].Criteria.MaxMin.Value.Group.Bound 5 1 40 1 0 #lose_criteria[1].Criteria.MaxMin.Value.Group.Bound 0 0 0 0 0 #lose_criteria[2].Criteria.MaxMin.Value.Group.Bound 0 0 0 0 0 #lose_criteria[3].Criteria.MaxMin.Value.Group.Bound 0 0 0 0 0 #lose_criteria[4].Criteria.MaxMin.Value.Group.Bound 0 0 0 0 0 #lose_criteria[5].Criteria.MaxMin.Value.Group.Bound 0 0 0 0 0 --------------------- Competitor Information ----------------------- | Index in the away "computer" | Is that opponent playing? | 1 is yes, 0 no | Comment | #computer[12].Playing 1 CORSIX #computer[13].Playing 1 ROUJIN #computer[14].Playing 1 EDVIN ----------------------- Emergency Control -------------------------- #emergency_control[0].StartMonth.EndMonth.Min.Max.Illness.PercWin.Bonus 4 6 3 5 16 60 1000 #emergency_control[1].StartMonth.EndMonth.Min.Max.Illness.PercWin.Bonus 8 10 4 6 32 60 1500 #emergency_control[2].StartMonth.EndMonth.Min.Max.Illness.PercWin.Bonus 12 14 4 6 11 60 2000 #emergency_control[3].StartMonth.EndMonth.Min.Max.Illness.PercWin.Bonus 16 18 4 6 13 60 2000 #emergency_control[4].StartMonth.EndMonth.Min.Max.Illness.PercWin.Bonus 20 22 4 6 23 60 2000 #emergency_control[5].StartMonth.EndMonth.Min.Max.Illness.PercWin.Bonus 24 26 4 6 25 60 2000CorsixTH-0.63/CorsixTH/Campaigns/holby.level000066400000000000000000000251441347163623700207420ustar00rootroot00000000000000Copyright (c) 2013 Chris "ChrizmanTV" Wilkinson 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. ---------------------- General Information ------------------------- %Name = "Holby" %MapFile = "Holby.map" %LevelBriefing = "Your next mission is to treat the City of Holby. The odd diseases are travelling fast and it is up to you to cure 100 people, stockpile $50,000 in the bank, look after 50% of patients and have a hospital worth $75,000. You have been given a hospital which has the ability to be expanded in size, so use this to your advantage. Efficient planning and a well-run clinic will help in the event of an emergency. Make us proud at the Ministry!" %LevelDebriefing = "Great job! Now that you have your own office, the Ministry of Health is expecting bigger and better things. It's just a shame you're not getting any bigger and better cash bonuses to quench your lavish tastes. Will you be able to cope at Writhe Hospital?" Town properties InterestRate is defined as centiprocent to allow for two decimals precision, i.e. 300 means 3 % #town.StartCash.InterestRate 30000 400 -------------------- Disease Configuration ------------------------- When a drug is researched, what effectiveness does it have #gbv.StartRating 100 The following table contains all diagnoses and treatments that shows up inte drug casebook in the game. Known specifies whether it should show up from the beginning of the level and RschReqd how much research is required to discover the treatment room for the disease. #expertise[1].Known.RschReqd 1 0 GENERAL_PRACTICE #expertise[2].Known.RschReqd 0 40000 BLOATY_HEAD #expertise[3].Known.RschReqd 0 40000 HAIRYITUS #expertise[4].Known.RschReqd 0 60000 ELVIS #expertise[5].Known.RschReqd 0 60000 INVIS #expertise[6].Known.RschReqd 0 60000 RADIATION #expertise[7].Known.RschReqd 0 40000 SLACK_TONGUE #expertise[8].Known.RschReqd 0 60000 ALIEN #expertise[9].Known.RschReqd 0 20000 BROKEN_BONES #expertise[10].Known.RschReqd 0 40000 BALDNESS #expertise[11].Known.RschReqd 0 40000 DISCRETE_ITCHING #expertise[12].Known.RschReqd 0 40000 JELLYITUS #expertise[13].Known.RschReqd 0 40000 SLEEPING_ILLNESS #expertise[14].Known.RschReqd 0 30000 PREGNANT #expertise[15].Known.RschReqd 0 40000 TRANSPARENCY #expertise[16].Known.RschReqd 1 20000 UNCOMMON_COLD #expertise[17].Known.RschReqd 1 60000 BROKEN_WIND #expertise[18].Known.RschReqd 0 20000 SPARE_RIBS #expertise[19].Known.RschReqd 0 20000 KIDNEY_BEANS #expertise[20].Known.RschReqd 0 20000 BROKEN_HEART #expertise[21].Known.RschReqd 0 20000 RUPTURED_NODULES #expertise[22].Known.RschReqd 0 40000 MULTIPLE_TV_PERSONALITIES #expertise[23].Known.RschReqd 0 60000 INFECTIOUS_LAUGHTER #expertise[24].Known.RschReqd 0 40000 CORRUGATED_ANKLES #expertise[25].Known.RschReqd 1 40000 CHRONIC_NOSEHAIR #expertise[26].Known.RschReqd 0 40000 3RD_DEGREE_SIDEBURNS #expertise[27].Known.RschReqd 0 40000 FAKE_BLOOD #expertise[28].Known.RschReqd 0 40000 GASTRIC_EJECTIONS #expertise[29].Known.RschReqd 0 20000 THE_SQUITS #expertise[30].Known.RschReqd 0 20000 IRON_LUNGS #expertise[31].Known.RschReqd 1 40000 SWEATY_PALMS #expertise[32].Known.RschReqd 1 20000 HEAPED_PILES #expertise[33].Known.RschReqd 0 20000 GUT_ROT #expertise[34].Known.RschReqd 0 20000 GOLF_STONES #expertise[35].Known.RschReqd 0 20000 UNEXPECTED_SWELLING #expertise[36].Known.RschReqd 0 40000 I_D_SCANNER DIAGNOSIS #expertise[37].Known.RschReqd 0 50000 I_D_BLOOD_MACHINE DIAGNOSIS #expertise[38].Known.RschReqd 0 20000 I_D_CARDIO DIAGNOSIS #expertise[39].Known.RschReqd 0 30000 I_D_XRAY DIAGNOSIS #expertise[40].Known.RschReqd 0 60000 I_D_ULTRASCAN DIAGNOSIS #expertise[41].Known.RschReqd 1 20000 I_D_STANDARD DIAGNOSIS #expertise[42].Known.RschReqd 1 20000 I_D_WARD DIAGNOSIS #expertise[43].Known.RschReqd 1 20000 I_D_SHRINK DIAGNOSIS | Objects available | Available from the start | Strength | Available for this level | Comment #objects[9].StartAvail.StartStrength.AvailableForLevel 1 8 1 Inflator Machine #objects[13].StartAvail.StartStrength.AvailableForLevel 0 13 0 Cardiogram #objects[14].StartAvail.StartStrength.AvailableForLevel 0 12 0 Scanner #objects[22].StartAvail.StartStrength.AvailableForLevel 0 9 0 Ultrascan #objects[23].StartAvail.StartStrength.AvailableForLevel 0 7 0 DNA Restorer #objects[24].StartAvail.StartStrength.AvailableForLevel 0 11 0 Cast Remover #objects[25].StartAvail.StartStrength.AvailableForLevel 0 8 0 Hair restorer #objects[26].StartAvail.StartStrength.AvailableForLevel 0 10 0 Slicer for slack tongues #objects[27].StartAvail.StartStrength.AvailableForLevel 0 12 0 X-Ray #objects[30].StartAvail.StartStrength.AvailableForLevel 0 12 0 Operating Table #objects[37].StartAvail.StartStrength.AvailableForLevel 0 0 0 Projector #objects[42].StartAvail.StartStrength.AvailableForLevel 0 10 0 Blood Machine #objects[46].StartAvail.StartStrength.AvailableForLevel 0 8 0 Electrolysis Machine #objects[47].StartAvail.StartStrength.AvailableForLevel 0 7 0 Jellyitus Moulding Machine #objects[54].StartAvail.StartStrength.AvailableForLevel 0 10 0 Decontamination Shower #objects[55].StartAvail.StartStrength.AvailableForLevel 0 10 0 Autopsy Research Machine | Diseases available | Value property to be determined | Comment #visuals[0] 1 I_BLOATY_HEAD #visuals[1] 0 I_HAIRYITUS #visuals[2] 0 I_ELVIS #visuals[3] 0 I_INVIS #visuals[4] 0 I_RADIATION #visuals[5] 0 I_SLACK_TONGUE #visuals[6] 0 I_ALIEN #visuals[7] 0 I_BROKEN_BONES #visuals[8] 0 I_BALDNESS #visuals[9] 1 I_DISCRETE_ITCHING #visuals[10] 0 I_JELLYITUS #visuals[11] 1 I_SLEEPING_ILLNESS #visuals[12] 0 I_PREGNANT #visuals[13] 0 I_TRANSPARENCY #non_visuals[0] 1 I_UNCOMMON_COLD #non_visuals[1] 1 I_BROKEN_WIND #non_visuals[2] 0 I_SPARE_RIBS #non_visuals[3] 0 I_KIDNEY_BEANS #non_visuals[4] 0 I_BROKEN_HEART #non_visuals[5] 0 I_RUPTURED_NODULES #non_visuals[6] 1 I_MULTIPLE_TV_PERSONALITIES #non_visuals[7] 1 I_INFECTIOUS_LAUGHTER #non_visuals[8] 1 I_CORRUGATED_ANKLES #non_visuals[9] 1 I_CHRONIC_NOSEHAIR #non_visuals[10] 0 I_3RD_DEGREE_SIDEBURNS #non_visuals[11] 0 I_FAKE_BLOOD #non_visuals[12] 1 I_GASTRIC_EJECTIONS #non_visuals[13] 1 I_THE_SQUITS #non_visuals[14] 0 I_IRON_LUNGS #non_visuals[15] 1 I_SWEATY_PALMS #non_visuals[16] 1 I_HEAPED_PILES #non_visuals[17] 1 I_GUT_ROT #non_visuals[18] 0 I_GOLF_STONES #non_visuals[19] 0 I_UNEXPECTED_SWELLING ---------------------- Staff Configuration ------------------------- Each entry states how many staff members of each category are available a given month. The number of entries is not fixed. | A list | Month it gets active (start at 0) | Each group | #staff_levels[0].Month.Nurses.Doctors.Handymen.Receptionists 0 8 8 3 2 #staff_levels[1].Month.Nurses.Doctors.Handymen.Receptionists 3 7 5 5 3 #staff_levels[2].Month.Nurses.Doctors.Handymen.Receptionists 5 5 8 7 4 The minimum salary for each staff type #staff[0].MinSalary 60 Nurse #staff[1].MinSalary 75 Doctor #staff[2].MinSalary 30 Handyman #staff[3].MinSalary 30 Receptionist Salary modifiers for different doctor attributes #gbv.SalaryAdd[3] -30 Junior #gbv.SalaryAdd[4] 30 Doctor #gbv.SalaryAdd[5] 50 Surgeon #gbv.SalaryAdd[6] 40 Psychiatrist #gbv.SalaryAdd[7] 100 Consultant #gbv.SalaryAdd[8] 20 Researcher How much the skill of the doctor adds to the salary. skill * 1000 / divisor #gbv.SalaryAbilityDivisor 10 #gbv.LandCostPerTile 10 #gbv.TrainingRate 50 #gbv.AbilityThreshold[0] 80 Surgeon #gbv.AbilityThreshold[1] 60 Psychiatrist #gbv.AbilityThreshold[2] 50 Researcher #gbv.TrainingValue[0] 30 Projector #gbv.TrainingValue[1] 30 Skeleton #gbv.TrainingValue[2] 30 Bookcase #quake_control[0].StartMonth.EndMonth.Severity 18 20 1 #quake_control[1].StartMonth.EndMonth.Severity 30 32 2 #quake_control[2].StartMonth.EndMonth.Severity 42 44 3 --------------------- Research Configuration ----------------------- Divides research input to get the amount of research points. must be > 0 #gbv.ResearchPointsDivisor 5 ---------------------- Awards and Trophies ------------------------- #awards_trophies.CansofCoke 2500 #awards_trophies.CansofCokeBonus 5000 #awards_trophies.Reputation 2500 #awards_trophies.TrophyReputationBonus 20000 #awards_trophies.TrophyDeathBonus 10000 ------------------ Winning and Losing Conditions ------------------- 1 Total reputation 2 Balance total 3 Percentage people your hospital has handled 4 Percentage people have been cured 5 Percentage people have been killed 6 Hospital value #win_criteria[0].Criteria.MaxMin.Value.Group.Bound 2 1 50000 1 0 #win_criteria[1].Criteria.MaxMin.Value.Group.Bound 3 1 50 1 0 #win_criteria[2].Criteria.MaxMin.Value.Group.Bound 4 1 100 1 0 #win_criteria[3].Criteria.MaxMin.Value.Group.Bound 6 1 75000 1 0 #win_criteria[4].Criteria.MaxMin.Value.Group.Bound 0 0 0 0 0 #win_criteria[5].Criteria.MaxMin.Value.Group.Bound 0 0 0 0 0 #lose_criteria[0].Criteria.MaxMin.Value.Group.Bound 5 1 50 1 0 #lose_criteria[1].Criteria.MaxMin.Value.Group.Bound 0 0 0 0 0 #lose_criteria[2].Criteria.MaxMin.Value.Group.Bound 0 0 0 0 0 #lose_criteria[3].Criteria.MaxMin.Value.Group.Bound 0 0 0 0 0 #lose_criteria[4].Criteria.MaxMin.Value.Group.Bound 0 0 0 0 0 #lose_criteria[5].Criteria.MaxMin.Value.Group.Bound 0 0 0 0 0 --------------------- Competitor Information ----------------------- | Index in the away "computer" | Is that opponent playing? | 1 is yes, 0 no | Comment | #computer[12].Playing 1 CORSIX #computer[13].Playing 1 ROUJIN #computer[14].Playing 1 EDVIN ----------------------- Emergency Control -------------------------- #emergency_control[0].StartMonth.EndMonth.Min.Max.Illness.PercWin.Bonus 6 8 3 5 17 60 500 #emergency_control[1].StartMonth.EndMonth.Min.Max.Illness.PercWin.Bonus 12 14 4 6 31 60 1000 #emergency_control[2].StartMonth.EndMonth.Min.Max.Illness.PercWin.Bonus 18 20 4 6 16 60 1000CorsixTH-0.63/CorsixTH/Campaigns/hoppalong.level000066400000000000000000000317561347163623700216220ustar00rootroot00000000000000Copyright (c) 2013 Chris "ChrizmanTV" Wilkinson 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. ---------------------- General ------------------------- %Name = "Hoppalong" %MapFile = "Hoppalong.map" %LevelBriefing = "A strange disease which makes people hairy is running rampant around the city of Wishinwell. According to our top scientists, it can only be removed by electroconvulsive therapy. Aside from that, you may find yourself out of room and out of cash, so plan ahead carefully. To win the level, cure 700 patients, treat 80% of visitors, amass $250,000 in the kitty, have a hospital worth $400,000 and gain a reputation of 800." %LevelDebriefing = "Perfect! Though you've done well here, a recent emergency has led to the creation of a makeshift hospital and your new boss, Mr B. Hind, is desperate for someone to run it. Don't let the public down! Will you take the challenge at Tufflook Hospital?" #town.StartCash.InterestRate 60000 1100 #gbv.StartRating 75 When a drug is researched, what effectiveness does it have #gbv.DrugImproveRate 5 #gbv.StartCost 100 #gbv.MinDrugCost 50 #gbv.LandCostPerTile 35 Cost to buy a single map square #gbv.RschImproveCostPercent 10 How many percent of the original research points that are required to improve the machine. #gbv.RschImproveIncrementPercent 10 How many additional percentage points are added to the above value for each upgrade. #gbv.MaxObjectStrength 20 Maximum strength value an object can be improved to (by research) #gbv.ResearchIncrement 2 Increase object strength by this amount when researching #gbv.AutopsyRschPercent 33 % of research completed for an autopsy #gbv.AutopsyRepHitPercent 25 % rep hit for discovered autopsy ---------------------- Diseases ------------------------- The following table contains all diagnoses and treatments that shows up in the drug casebook in the game. Known specifies whether it should show up from the beginning of the level and RschReqd how much research is required to discover the treatment room for the disease. #expertise[1].Known.RschReqd 1 0 #expertise[2].Known.RschReqd 1 40000 #expertise[3].Known.RschReqd 0 40000 #expertise[4].Known.RschReqd 1 60000 #expertise[5].Known.RschReqd 1 60000 #expertise[6].Known.RschReqd 0 60000 #expertise[7].Known.RschReqd 0 40000 #expertise[8].Known.RschReqd 0 60000 #expertise[9].Known.RschReqd 0 20000 #expertise[10].Known.RschReqd 0 40000 #expertise[11].Known.RschReqd 1 40000 #expertise[12].Known.RschReqd 0 40000 #expertise[13].Known.RschReqd 1 40000 #expertise[14].Known.RschReqd 0 30000 #expertise[15].Known.RschReqd 0 40000 #expertise[16].Known.RschReqd 1 20000 #expertise[17].Known.RschReqd 1 60000 #expertise[18].Known.RschReqd 1 20000 #expertise[19].Known.RschReqd 1 20000 #expertise[20].Known.RschReqd 1 20000 #expertise[21].Known.RschReqd 0 20000 #expertise[22].Known.RschReqd 1 40000 #expertise[23].Known.RschReqd 1 60000 #expertise[24].Known.RschReqd 1 40000 #expertise[25].Known.RschReqd 1 40000 #expertise[26].Known.RschReqd 1 40000 #expertise[27].Known.RschReqd 1 40000 #expertise[28].Known.RschReqd 1 40000 #expertise[29].Known.RschReqd 1 20000 #expertise[30].Known.RschReqd 0 20000 #expertise[31].Known.RschReqd 1 40000 #expertise[32].Known.RschReqd 1 20000 #expertise[33].Known.RschReqd 1 20000 #expertise[34].Known.RschReqd 1 20000 #expertise[35].Known.RschReqd 1 20000 #expertise[36].Known.RschReqd 0 40000 #expertise[37].Known.RschReqd 0 50000 #expertise[38].Known.RschReqd 1 20000 #expertise[39].Known.RschReqd 0 30000 #expertise[40].Known.RschReqd 0 60000 #expertise[41].Known.RschReqd 1 20000 #expertise[42].Known.RschReqd 1 20000 #expertise[43].Known.RschReqd 1 20000 #expertise[44].Known.RschReqd 0 0 #expertise[45].Known.RschReqd 0 0 #expertise[46].Known.RschReqd 0 0 | Diseases available | Value property to be determined | Comment #visuals[0] 1 #visuals[1] 1 #visuals[2] 1 #visuals[3] 1 #visuals[4] 0 #visuals[5] 1 #visuals[6] 0 #visuals[7] 1 #visuals[8] 1 #visuals[9] 1 #visuals[10] 0 #visuals[11] 1 #visuals[12] 1 #visuals[13] 1 #non_visuals[0] 1 #non_visuals[1] 1 #non_visuals[2] 1 #non_visuals[3] 1 #non_visuals[4] 1 #non_visuals[5] 1 #non_visuals[6] 1 #non_visuals[7] 1 #non_visuals[8] 1 #non_visuals[9] 1 #non_visuals[10] 1 #non_visuals[11] 1 #non_visuals[12] 1 #non_visuals[13] 1 #non_visuals[14] 1 #non_visuals[15] 1 #non_visuals[16] 1 #non_visuals[17] 1 #non_visuals[18] 1 #non_visuals[19] 1 #visuals_available[0] 0 #visuals_available[1] 12 #visuals_available[2] 3 #visuals_available[3] 12 #visuals_available[4] 18 #visuals_available[5] 6 #visuals_available[6] 0 #visuals_available[7] 6 #visuals_available[8] 12 #visuals_available[9] 0 #visuals_available[10] 18 #visuals_available[11] 0 #visuals_available[12] 0 #visuals_available[13] 6 ---------------------- Objects ------------------------- | Objects available | Available from the start | Strength | Available for this level | Comment #objects[1].StartAvail.StartStrength.AvailableForLevel.RschReqd 1 10 1 0 #objects[2].StartAvail.StartStrength.AvailableForLevel.RschReqd 1 10 1 0 #objects[3].StartAvail.StartStrength.AvailableForLevel.RschReqd 1 10 1 0 #objects[4].StartAvail.StartStrength.AvailableForLevel.RschReqd 1 10 1 0 #objects[5].StartAvail.StartStrength.AvailableForLevel.RschReqd 1 10 1 0 #objects[6].StartAvail.StartStrength.AvailableForLevel.RschReqd 1 10 1 0 #objects[7].StartAvail.StartStrength.AvailableForLevel.RschReqd 1 10 1 0 #objects[8].StartAvail.StartStrength.AvailableForLevel.RschReqd 1 10 1 20000 #objects[9].StartAvail.StartStrength.AvailableForLevel.RschReqd 1 8 1 40000 #objects[10].StartAvail.StartStrength.AvailableForLevel.RschReqd 1 10 1 0 #objects[11].StartAvail.StartStrength.AvailableForLevel.RschReqd 1 10 1 0 #objects[12].StartAvail.StartStrength.AvailableForLevel.RschReqd 1 10 1 0 #objects[13].StartAvail.StartStrength.AvailableForLevel.RschReqd 1 13 1 20000 #objects[14].StartAvail.StartStrength.AvailableForLevel.RschReqd 0 12 1 40000 #objects[15].StartAvail.StartStrength.AvailableForLevel.RschReqd 1 10 1 0 #objects[16].StartAvail.StartStrength.AvailableForLevel.RschReqd 1 10 1 0 #objects[17].StartAvail.StartStrength.AvailableForLevel.RschReqd 1 10 1 0 #objects[18].StartAvail.StartStrength.AvailableForLevel.RschReqd 1 10 1 20000 #objects[19].StartAvail.StartStrength.AvailableForLevel.RschReqd 1 10 1 0 #objects[20].StartAvail.StartStrength.AvailableForLevel.RschReqd 1 10 1 20000 #objects[21].StartAvail.StartStrength.AvailableForLevel.RschReqd 1 10 1 0 #objects[22].StartAvail.StartStrength.AvailableForLevel.RschReqd 0 9 0 60000 #objects[23].StartAvail.StartStrength.AvailableForLevel.RschReqd 0 7 0 60000 #objects[24].StartAvail.StartStrength.AvailableForLevel.RschReqd 0 11 1 20000 #objects[25].StartAvail.StartStrength.AvailableForLevel.RschReqd 0 8 1 40000 #objects[26].StartAvail.StartStrength.AvailableForLevel.RschReqd 1 10 1 40000 #objects[27].StartAvail.StartStrength.AvailableForLevel.RschReqd 0 12 1 30000 #objects[28].StartAvail.StartStrength.AvailableForLevel.RschReqd 1 10 1 0 #objects[29].StartAvail.StartStrength.AvailableForLevel.RschReqd 1 10 1 0 #objects[30].StartAvail.StartStrength.AvailableForLevel.RschReqd 1 12 1 20000 #objects[31].StartAvail.StartStrength.AvailableForLevel.RschReqd 1 10 1 0 #objects[32].StartAvail.StartStrength.AvailableForLevel.RschReqd 1 10 1 0 #objects[33].StartAvail.StartStrength.AvailableForLevel.RschReqd 1 10 1 0 #objects[34].StartAvail.StartStrength.AvailableForLevel.RschReqd 1 10 1 0 #objects[35].StartAvail.StartStrength.AvailableForLevel.RschReqd 1 10 1 0 #objects[36].StartAvail.StartStrength.AvailableForLevel.RschReqd 1 10 1 0 #objects[37].StartAvail.StartStrength.AvailableForLevel.RschReqd 1 0 1 20000 #objects[38].StartAvail.StartStrength.AvailableForLevel.RschReqd 1 10 1 0 #objects[39].StartAvail.StartStrength.AvailableForLevel.RschReqd 1 10 1 20000 #objects[40].StartAvail.StartStrength.AvailableForLevel.RschReqd 1 10 1 30000 #objects[41].StartAvail.StartStrength.AvailableForLevel.RschReqd 0 10 0 30000 #objects[42].StartAvail.StartStrength.AvailableForLevel.RschReqd 0 10 1 50000 #objects[43].StartAvail.StartStrength.AvailableForLevel.RschReqd 1 10 1 0 #objects[44].StartAvail.StartStrength.AvailableForLevel.RschReqd 1 10 1 0 #objects[45].StartAvail.StartStrength.AvailableForLevel.RschReqd 1 10 1 0 #objects[46].StartAvail.StartStrength.AvailableForLevel.RschReqd 0 8 1 40000 #objects[47].StartAvail.StartStrength.AvailableForLevel.RschReqd 0 7 0 40000 #objects[48].StartAvail.StartStrength.AvailableForLevel.RschReqd 1 10 1 0 #objects[49].StartAvail.StartStrength.AvailableForLevel.RschReqd 1 10 1 0 #objects[50].StartAvail.StartStrength.AvailableForLevel.RschReqd 1 10 1 0 #objects[51].StartAvail.StartStrength.AvailableForLevel.RschReqd 1 10 1 0 #objects[52].StartAvail.StartStrength.AvailableForLevel.RschReqd 1 10 1 0 #objects[53].StartAvail.StartStrength.AvailableForLevel.RschReqd 1 10 1 0 #objects[54].StartAvail.StartStrength.AvailableForLevel.RschReqd 0 10 0 60000 #objects[55].StartAvail.StartStrength.AvailableForLevel.RschReqd 1 10 1 0 #objects[56].StartAvail.StartStrength.AvailableForLevel.RschReqd 1 10 1 0 #objects[57].StartAvail.StartStrength.AvailableForLevel.RschReqd 0 10 1 0 #objects[58].StartAvail.StartStrength.AvailableForLevel.RschReqd 1 10 1 0 #objects[59].StartAvail.StartStrength.AvailableForLevel.RschReqd 1 10 1 0 #objects[60].StartAvail.StartStrength.AvailableForLevel.RschReqd 1 10 1 0 #objects[61].StartAvail.StartStrength.AvailableForLevel.RschReqd 1 10 1 0 ---------------------- Staff Configuration ------------------------- The minimum salary for each staff type #staff[0].MinSalary 60 #staff[1].MinSalary 75 #staff[2].MinSalary 30 #staff[3].MinSalary 30 Salary modifiers for different doctor attributes #gbv.SalaryAdd[3] -30 #gbv.SalaryAdd[4] 30 #gbv.SalaryAdd[5] 50 #gbv.SalaryAdd[6] 40 #gbv.SalaryAdd[7] 100 #gbv.SalaryAdd[8] 20 Each entry states how many staff members of each category are available a given month. The number of entries is not fixed. | A list | Month it gets active (start at 0) | Each group | #staff_levels[0].Month.Nurses.Doctors.Handymen.Receptionists.ShrkRate.SurgRate.RschRate.ConsRate.JrRate 0 8 8 3 2 10 10 10 10 4 #staff_levels[1].Month.Nurses.Doctors.Handymen.Receptionists.ShrkRate.SurgRate.RschRate.ConsRate.JrRate 3 7 5 5 3 10 10 10 10 4 #staff_levels[2].Month.Nurses.Doctors.Handymen.Receptionists.ShrkRate.SurgRate.RschRate.ConsRate.JrRate 5 5 8 7 4 10 10 10 10 4 #gbv.TrainingRate 45 #gbv.AbilityThreshold[0] 75 Surgeon #gbv.AbilityThreshold[1] 60 Psychiatrist #gbv.AbilityThreshold[2] 45 Researcher #gbv.TrainingValue[0] 10 Projector #gbv.TrainingValue[1] 25 Skeleton #gbv.TrainingValue[2] 30 Bookcase ----------------------- Emergency Control -------------------------- #emergency_control[0].Random 0 ----------------------- Quake Control -------------------------- #quake_control[0].StartMonth.EndMonth.Severity 10 12 6 #quake_control[1].StartMonth.EndMonth.Severity 22 24 7 #quake_control[2].StartMonth.EndMonth.Severity 34 36 8 #quake_control[3].StartMonth.EndMonth.Severity 46 48 7 #quake_control[4].StartMonth.EndMonth.Severity 58 60 6 #quake_control[5].StartMonth.EndMonth.Severity 70 72 6 ----------------------- Population Growth ---------------------------- #popn[0].Month.Change 0 4 #popn[1].Month.Change 1 1 ---------------------- Awards and Trophies ------------------------- #awards_trophies.CansofCoke 2500 #awards_trophies.CansofCokeBonus 5000 #awards_trophies.Reputation 2500 #awards_trophies.TrophyReputationBonus 20000 #awards_trophies.TrophyDeathBonus 10000 ------------------ Winning and Losing Conditions ------------------- 1 Total reputation 2 Balance total 3 Percentage people your hospital has handled 4 Cure count 5 Percentage people have been killed 6 Hospital value #win_criteria[0].Criteria.MaxMin.Value.Group.Bound 1 1 800 1 0 #win_criteria[1].Criteria.MaxMin.Value.Group.Bound 2 1 250000 1 0 #win_criteria[2].Criteria.MaxMin.Value.Group.Bound 3 1 80 1 0 #win_criteria[3].Criteria.MaxMin.Value.Group.Bound 4 1 700 1 0 #win_criteria[4].Criteria.MaxMin.Value.Group.Bound 6 1 400000 1 0 #lose_criteria[0].Criteria.MaxMin.Value.Group.Bound 1 0 400 1 450 #lose_criteria[1].Criteria.MaxMin.Value.Group.Bound 2 0 -50000 2 -30000 #lose_criteria[2].Criteria.MaxMin.Value.Group.Bound 5 1 25 3 10 CorsixTH-0.63/CorsixTH/Campaigns/royalhospital.level000066400000000000000000000321001347163623700225050ustar00rootroot00000000000000Copyright (c) 2013 Chris "ChrizmanTV" Wilkinson 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. ---------------------- General ------------------------- %Name = "Royal Hospital" %MapFile = "Royal Hospital.map" %LevelBriefing = "This is your final assignment. The Ministry has granted you $100,000 to set up and operate the largest and most demanding hospital in the world. This is going to be a huge task, but we are certain that you'll succeed. We expect nothing less than perfection - gain a reputation of 950, amass $500,000 in the bank, have a hospital worth $1,000,000, treat 90% of all patients and cure 1000 visitors to finish. Good luck!" #town.StartCash.InterestRate 100000 1500 #gbv.StartRating 70 When a drug is researched, what effectiveness does it have #gbv.DrugImproveRate 5 #gbv.StartCost 100 #gbv.MinDrugCost 50 #gbv.LandCostPerTile 50 Cost to buy a single map square #gbv.RschImproveCostPercent 10 How many percent of the original research points that are required to improve the machine. #gbv.RschImproveIncrementPercent 10 How many additional percentage points are added to the above value for each upgrade. #gbv.MaxObjectStrength 20 Maximum strength value an object can be improved to (by research) #gbv.ResearchIncrement 2 Increase object strength by this amount when researching #gbv.AutopsyRschPercent 33 % of research completed for an autopsy #gbv.AutopsyRepHitPercent 25 % rep hit for discovered autopsy ---------------------- Diseases ------------------------- The following table contains all diagnoses and treatments that shows up in the drug casebook in the game. Known specifies whether it should show up from the beginning of the level and RschReqd how much research is required to discover the treatment room for the disease. #expertise[1].Known.RschReqd 1 0 #expertise[2].Known.RschReqd 1 40000 #expertise[3].Known.RschReqd 1 40000 #expertise[4].Known.RschReqd 1 60000 #expertise[5].Known.RschReqd 1 60000 #expertise[6].Known.RschReqd 1 60000 #expertise[7].Known.RschReqd 1 40000 #expertise[8].Known.RschReqd 1 60000 #expertise[9].Known.RschReqd 1 20000 #expertise[10].Known.RschReqd 1 40000 #expertise[11].Known.RschReqd 1 40000 #expertise[12].Known.RschReqd 1 40000 #expertise[13].Known.RschReqd 1 40000 #expertise[14].Known.RschReqd 1 30000 #expertise[15].Known.RschReqd 1 40000 #expertise[16].Known.RschReqd 1 20000 #expertise[17].Known.RschReqd 1 60000 #expertise[18].Known.RschReqd 1 20000 #expertise[19].Known.RschReqd 1 20000 #expertise[20].Known.RschReqd 1 20000 #expertise[21].Known.RschReqd 1 20000 #expertise[22].Known.RschReqd 1 40000 #expertise[23].Known.RschReqd 1 60000 #expertise[24].Known.RschReqd 1 40000 #expertise[25].Known.RschReqd 1 40000 #expertise[26].Known.RschReqd 1 40000 #expertise[27].Known.RschReqd 1 40000 #expertise[28].Known.RschReqd 1 40000 #expertise[29].Known.RschReqd 1 20000 #expertise[30].Known.RschReqd 1 20000 #expertise[31].Known.RschReqd 1 40000 #expertise[32].Known.RschReqd 1 20000 #expertise[33].Known.RschReqd 1 20000 #expertise[34].Known.RschReqd 1 20000 #expertise[35].Known.RschReqd 1 20000 #expertise[36].Known.RschReqd 0 40000 #expertise[37].Known.RschReqd 0 50000 #expertise[38].Known.RschReqd 1 20000 #expertise[39].Known.RschReqd 0 30000 #expertise[40].Known.RschReqd 0 60000 #expertise[41].Known.RschReqd 1 20000 #expertise[42].Known.RschReqd 1 20000 #expertise[43].Known.RschReqd 1 20000 #expertise[44].Known.RschReqd 0 0 #expertise[45].Known.RschReqd 0 0 #expertise[46].Known.RschReqd 0 0 | Diseases available | Value property to be determined | Comment #visuals[0] 1 #visuals[1] 1 #visuals[2] 1 #visuals[3] 1 #visuals[4] 1 #visuals[5] 1 #visuals[6] 1 #visuals[7] 1 #visuals[8] 1 #visuals[9] 1 #visuals[10] 1 #visuals[11] 1 #visuals[12] 1 #visuals[13] 1 #non_visuals[0] 1 #non_visuals[1] 1 #non_visuals[2] 1 #non_visuals[3] 1 #non_visuals[4] 1 #non_visuals[5] 1 #non_visuals[6] 1 #non_visuals[7] 1 #non_visuals[8] 1 #non_visuals[9] 1 #non_visuals[10] 1 #non_visuals[11] 1 #non_visuals[12] 1 #non_visuals[13] 1 #non_visuals[14] 1 #non_visuals[15] 1 #non_visuals[16] 1 #non_visuals[17] 1 #non_visuals[18] 1 #non_visuals[19] 1 #visuals_available[0] 0 #visuals_available[1] 12 #visuals_available[2] 3 #visuals_available[3] 12 #visuals_available[4] 18 #visuals_available[5] 6 #visuals_available[6] 0 #visuals_available[7] 6 #visuals_available[8] 12 #visuals_available[9] 0 #visuals_available[10] 18 #visuals_available[11] 0 #visuals_available[12] 0 #visuals_available[13] 6 ---------------------- Objects ------------------------- | Objects available | Available from the start | Strength | Available for this level | Comment #objects[1].StartAvail.StartStrength.AvailableForLevel.RschReqd 1 10 1 0 #objects[2].StartAvail.StartStrength.AvailableForLevel.RschReqd 1 10 1 0 #objects[3].StartAvail.StartStrength.AvailableForLevel.RschReqd 1 10 1 0 #objects[4].StartAvail.StartStrength.AvailableForLevel.RschReqd 1 10 1 0 #objects[5].StartAvail.StartStrength.AvailableForLevel.RschReqd 1 10 1 0 #objects[6].StartAvail.StartStrength.AvailableForLevel.RschReqd 1 10 1 0 #objects[7].StartAvail.StartStrength.AvailableForLevel.RschReqd 1 10 1 0 #objects[8].StartAvail.StartStrength.AvailableForLevel.RschReqd 1 10 1 20000 #objects[9].StartAvail.StartStrength.AvailableForLevel.RschReqd 1 8 1 40000 #objects[10].StartAvail.StartStrength.AvailableForLevel.RschReqd 1 10 1 0 #objects[11].StartAvail.StartStrength.AvailableForLevel.RschReqd 1 10 1 0 #objects[12].StartAvail.StartStrength.AvailableForLevel.RschReqd 1 10 1 0 #objects[13].StartAvail.StartStrength.AvailableForLevel.RschReqd 1 13 1 20000 #objects[14].StartAvail.StartStrength.AvailableForLevel.RschReqd 0 12 1 40000 #objects[15].StartAvail.StartStrength.AvailableForLevel.RschReqd 1 10 1 0 #objects[16].StartAvail.StartStrength.AvailableForLevel.RschReqd 1 10 1 0 #objects[17].StartAvail.StartStrength.AvailableForLevel.RschReqd 1 10 1 0 #objects[18].StartAvail.StartStrength.AvailableForLevel.RschReqd 1 10 1 20000 #objects[19].StartAvail.StartStrength.AvailableForLevel.RschReqd 1 10 1 0 #objects[20].StartAvail.StartStrength.AvailableForLevel.RschReqd 1 10 1 20000 #objects[21].StartAvail.StartStrength.AvailableForLevel.RschReqd 1 10 1 0 #objects[22].StartAvail.StartStrength.AvailableForLevel.RschReqd 0 9 1 60000 #objects[23].StartAvail.StartStrength.AvailableForLevel.RschReqd 0 7 1 60000 #objects[24].StartAvail.StartStrength.AvailableForLevel.RschReqd 1 11 1 20000 #objects[25].StartAvail.StartStrength.AvailableForLevel.RschReqd 1 8 1 40000 #objects[26].StartAvail.StartStrength.AvailableForLevel.RschReqd 1 10 1 40000 #objects[27].StartAvail.StartStrength.AvailableForLevel.RschReqd 1 12 1 30000 #objects[28].StartAvail.StartStrength.AvailableForLevel.RschReqd 1 10 1 0 #objects[29].StartAvail.StartStrength.AvailableForLevel.RschReqd 1 10 1 0 #objects[30].StartAvail.StartStrength.AvailableForLevel.RschReqd 1 12 1 20000 #objects[31].StartAvail.StartStrength.AvailableForLevel.RschReqd 1 10 1 0 #objects[32].StartAvail.StartStrength.AvailableForLevel.RschReqd 1 10 1 0 #objects[33].StartAvail.StartStrength.AvailableForLevel.RschReqd 1 10 1 0 #objects[34].StartAvail.StartStrength.AvailableForLevel.RschReqd 1 10 1 0 #objects[35].StartAvail.StartStrength.AvailableForLevel.RschReqd 1 10 1 0 #objects[36].StartAvail.StartStrength.AvailableForLevel.RschReqd 1 10 1 0 #objects[37].StartAvail.StartStrength.AvailableForLevel.RschReqd 1 0 1 20000 #objects[38].StartAvail.StartStrength.AvailableForLevel.RschReqd 1 10 1 0 #objects[39].StartAvail.StartStrength.AvailableForLevel.RschReqd 1 10 1 20000 #objects[40].StartAvail.StartStrength.AvailableForLevel.RschReqd 1 1 1 30000 #objects[41].StartAvail.StartStrength.AvailableForLevel.RschReqd 1 1 1 30000 #objects[42].StartAvail.StartStrength.AvailableForLevel.RschReqd 0 10 1 50000 #objects[43].StartAvail.StartStrength.AvailableForLevel.RschReqd 1 10 1 0 #objects[44].StartAvail.StartStrength.AvailableForLevel.RschReqd 1 10 1 0 #objects[45].StartAvail.StartStrength.AvailableForLevel.RschReqd 1 10 1 0 #objects[46].StartAvail.StartStrength.AvailableForLevel.RschReqd 0 8 1 40000 #objects[47].StartAvail.StartStrength.AvailableForLevel.RschReqd 0 7 1 40000 #objects[48].StartAvail.StartStrength.AvailableForLevel.RschReqd 1 10 1 0 #objects[49].StartAvail.StartStrength.AvailableForLevel.RschReqd 1 10 1 0 #objects[50].StartAvail.StartStrength.AvailableForLevel.RschReqd 1 10 1 0 #objects[51].StartAvail.StartStrength.AvailableForLevel.RschReqd 1 10 1 0 #objects[52].StartAvail.StartStrength.AvailableForLevel.RschReqd 1 10 1 0 #objects[53].StartAvail.StartStrength.AvailableForLevel.RschReqd 1 10 1 0 #objects[54].StartAvail.StartStrength.AvailableForLevel.RschReqd 0 10 1 60000 #objects[55].StartAvail.StartStrength.AvailableForLevel.RschReqd 1 10 1 0 #objects[56].StartAvail.StartStrength.AvailableForLevel.RschReqd 1 10 1 0 #objects[57].StartAvail.StartStrength.AvailableForLevel.RschReqd 1 57 1 0 #objects[58].StartAvail.StartStrength.AvailableForLevel.RschReqd 1 10 1 0 #objects[59].StartAvail.StartStrength.AvailableForLevel.RschReqd 1 10 1 0 #objects[60].StartAvail.StartStrength.AvailableForLevel.RschReqd 1 10 1 0 #objects[61].StartAvail.StartStrength.AvailableForLevel.RschReqd 1 10 1 0 ---------------------- Staff Configuration ------------------------- The minimum salary for each staff type #staff[0].MinSalary 60 #staff[1].MinSalary 75 #staff[2].MinSalary 25 #staff[3].MinSalary 20 Salary modifiers for different doctor attributes #gbv.SalaryAdd[3] -30 #gbv.SalaryAdd[4] 30 #gbv.SalaryAdd[5] 75 #gbv.SalaryAdd[6] 50 #gbv.SalaryAdd[7] 100 #gbv.SalaryAdd[8] 25 Each entry states how many staff members of each category are available a given month. The number of entries is not fixed. | A list | Month it gets active (start at 0) | Each group | #staff_levels[0].Month.Nurses.Doctors.Handymen.Receptionists.ShrkRate.SurgRate.RschRate.ConsRate.JrRate 0 8 8 3 2 10 10 10 10 3 #staff_levels[1].Month.Nurses.Doctors.Handymen.Receptionists.ShrkRate.SurgRate.RschRate.ConsRate.JrRate 3 7 5 5 3 10 10 10 10 3 #staff_levels[2].Month.Nurses.Doctors.Handymen.Receptionists.ShrkRate.SurgRate.RschRate.ConsRate.JrRate 5 5 8 7 4 10 10 10 10 3 #gbv.TrainingRate 45 #gbv.AbilityThreshold[0] 75 Surgeon #gbv.AbilityThreshold[1] 60 Psychiatrist #gbv.AbilityThreshold[2] 45 Researcher #gbv.TrainingValue[0] 10 Projector #gbv.TrainingValue[1] 25 Skeleton #gbv.TrainingValue[2] 30 Bookcase ----------------------- Emergency Control -------------------------- #emergency_control[0].Random 0 ----------------------- Quake Control -------------------------- #quake_control[0].StartMonth.EndMonth.Severity 5 10 10 #quake_control[1].StartMonth.EndMonth.Severity 15 20 10 #quake_control[2].StartMonth.EndMonth.Severity 25 30 10 #quake_control[3].StartMonth.EndMonth.Severity 35 40 10 #quake_control[4].StartMonth.EndMonth.Severity 45 50 10 #quake_control[5].StartMonth.EndMonth.Severity 55 60 10 #quake_control[6].StartMonth.EndMonth.Severity 65 70 10 #quake_control[7].StartMonth.EndMonth.Severity 75 80 10 #quake_control[8].StartMonth.EndMonth.Severity 85 90 10 #quake_control[9].StartMonth.EndMonth.Severity 95 100 10 #quake_control[10].StartMonth.EndMonth.Severity 105 110 10 #quake_control[11].StartMonth.EndMonth.Severity 125 130 10 ----------------------- Population Growth ---------------------------- #popn[0].Month.Change 0 4 #popn[1].Month.Change 1 1 ---------------------- Awards and Trophies ------------------------- #awards_trophies.CansofCoke 2500 #awards_trophies.CansofCokeBonus 5000 #awards_trophies.Reputation 2500 #awards_trophies.TrophyReputationBonus 20000 #awards_trophies.TrophyDeathBonus 10000 ------------------ Winning and Losing Conditions ------------------- 1 Total reputation 2 Balance total 3 Percentage people your hospital has handled 4 Cure count 5 Percentage people have been killed 6 Hospital value #win_criteria[0].Criteria.MaxMin.Value.Group.Bound 1 1 950 1 0 #win_criteria[1].Criteria.MaxMin.Value.Group.Bound 2 1 500000 1 0 #win_criteria[2].Criteria.MaxMin.Value.Group.Bound 3 1 90 1 0 #win_criteria[3].Criteria.MaxMin.Value.Group.Bound 4 1 1000 1 0 #win_criteria[4].Criteria.MaxMin.Value.Group.Bound 6 1 1000000 1 0 #lose_criteria[0].Criteria.MaxMin.Value.Group.Bound 1 0 450 1 500 #lose_criteria[1].Criteria.MaxMin.Value.Group.Bound 2 0 -30000 2 -15000 #lose_criteria[2].Criteria.MaxMin.Value.Group.Bound 5 1 20 3 10 CorsixTH-0.63/CorsixTH/Campaigns/snuffitsands.level000066400000000000000000000262571347163623700223420ustar00rootroot00000000000000Copyright (c) 2013 Chris "ChrizmanTV" Wilkinson 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. ---------------------- General Information ------------------------- %Name = "Snuffit Sands" %MapFile = "Snuffit Sands.map" %LevelBriefing = "You are now highly regarded in the hospital community for your excellent services and care, so you now have a reputation to maintain as well. Also, your surgeons may see a couple of new merry maladies to take care of in the operating theatre. Hopefully, you can accomplish these goals for the cheery land of Snuffit Sands. Cure 300 patients, treat 70% of patients, accumulate $125,000 in the bank, have a hospital worth $150,000 and maintain a reputation of 600." %LevelDebriefing = "Wonderful! Things have become hectic since you've been away. The Ministry has immediately assigned you to your next task in a dilapidated old clinic, and watch out for the tongues! Can you help the sick people of Upper Pukington Hospital?" Town properties InterestRate is defined as centiprocent to allow for two decimals precision, i.e. 300 means 3 % #town.StartCash.InterestRate 45000 700 -------------------- Disease Configuration ------------------------- When a drug is researched, what effectiveness does it have #gbv.StartRating 90 The following table contains all diagnoses and treatments that shows up inte drug casebook in the game. Known specifies whether it should show up from the beginning of the level and RschReqd how much research is required to discover the treatment room for the disease. #expertise[1].Known.RschReqd 1 0 GENERAL_PRACTICE #expertise[2].Known.RschReqd 1 40000 BLOATY_HEAD #expertise[3].Known.RschReqd 0 40000 HAIRYITUS #expertise[4].Known.RschReqd 0 60000 ELVIS #expertise[5].Known.RschReqd 0 60000 INVIS #expertise[6].Known.RschReqd 0 60000 RADIATION #expertise[7].Known.RschReqd 0 40000 SLACK_TONGUE #expertise[8].Known.RschReqd 0 60000 ALIEN #expertise[9].Known.RschReqd 0 20000 BROKEN_BONES #expertise[10].Known.RschReqd 0 40000 BALDNESS #expertise[11].Known.RschReqd 1 40000 DISCRETE_ITCHING #expertise[12].Known.RschReqd 0 40000 JELLYITUS #expertise[13].Known.RschReqd 1 40000 SLEEPING_ILLNESS #expertise[14].Known.RschReqd 0 30000 PREGNANT #expertise[15].Known.RschReqd 0 40000 TRANSPARENCY #expertise[16].Known.RschReqd 1 20000 UNCOMMON_COLD #expertise[17].Known.RschReqd 1 60000 BROKEN_WIND #expertise[18].Known.RschReqd 0 20000 SPARE_RIBS #expertise[19].Known.RschReqd 0 20000 KIDNEY_BEANS #expertise[20].Known.RschReqd 0 20000 BROKEN_HEART #expertise[21].Known.RschReqd 0 20000 RUPTURED_NODULES #expertise[22].Known.RschReqd 1 40000 MULTIPLE_TV_PERSONALITIES #expertise[23].Known.RschReqd 1 60000 INFECTIOUS_LAUGHTER #expertise[24].Known.RschReqd 0 40000 CORRUGATED_ANKLES #expertise[25].Known.RschReqd 1 40000 CHRONIC_NOSEHAIR #expertise[26].Known.RschReqd 0 40000 3RD_DEGREE_SIDEBURNS #expertise[27].Known.RschReqd 0 40000 FAKE_BLOOD #expertise[28].Known.RschReqd 0 40000 GASTRIC_EJECTIONS #expertise[29].Known.RschReqd 1 20000 THE_SQUITS #expertise[30].Known.RschReqd 0 20000 IRON_LUNGS #expertise[31].Known.RschReqd 1 40000 SWEATY_PALMS #expertise[32].Known.RschReqd 1 20000 HEAPED_PILES #expertise[33].Known.RschReqd 0 20000 GUT_ROT #expertise[34].Known.RschReqd 0 20000 GOLF_STONES #expertise[35].Known.RschReqd 0 20000 UNEXPECTED_SWELLING #expertise[36].Known.RschReqd 0 40000 I_D_SCANNER DIAGNOSIS #expertise[37].Known.RschReqd 0 50000 I_D_BLOOD_MACHINE DIAGNOSIS #expertise[38].Known.RschReqd 1 20000 I_D_CARDIO DIAGNOSIS #expertise[39].Known.RschReqd 0 30000 I_D_XRAY DIAGNOSIS #expertise[40].Known.RschReqd 0 60000 I_D_ULTRASCAN DIAGNOSIS #expertise[41].Known.RschReqd 1 20000 I_D_STANDARD DIAGNOSIS #expertise[42].Known.RschReqd 1 20000 I_D_WARD DIAGNOSIS #expertise[43].Known.RschReqd 1 20000 I_D_SHRINK DIAGNOSIS | Objects available | Available from the start | Strength | Available for this level | Comment #objects[9].StartAvail.StartStrength.AvailableForLevel 1 8 1 Inflator Machine #objects[13].StartAvail.StartStrength.AvailableForLevel 1 13 1 Cardiogram #objects[14].StartAvail.StartStrength.AvailableForLevel 0 12 0 Scanner #objects[22].StartAvail.StartStrength.AvailableForLevel 0 9 0 Ultrascan #objects[23].StartAvail.StartStrength.AvailableForLevel 0 7 0 DNA Restorer #objects[24].StartAvail.StartStrength.AvailableForLevel 0 11 0 Cast Remover #objects[25].StartAvail.StartStrength.AvailableForLevel 0 8 0 Hair restorer #objects[26].StartAvail.StartStrength.AvailableForLevel 0 10 0 Slicer for slack tongues #objects[27].StartAvail.StartStrength.AvailableForLevel 0 12 1 X-Ray #objects[30].StartAvail.StartStrength.AvailableForLevel 1 12 1 Operating Table #objects[37].StartAvail.StartStrength.AvailableForLevel 1 0 1 Projector #objects[42].StartAvail.StartStrength.AvailableForLevel 0 10 0 Blood Machine #objects[46].StartAvail.StartStrength.AvailableForLevel 0 8 0 Electrolysis Machine #objects[47].StartAvail.StartStrength.AvailableForLevel 0 7 0 Jellyitus Moulding Machine #objects[54].StartAvail.StartStrength.AvailableForLevel 0 10 0 Decontamination Shower #objects[55].StartAvail.StartStrength.AvailableForLevel 1 10 1 Autopsy Research Machine | Diseases available | Value property to be determined | Comment #visuals[0] 1 I_BLOATY_HEAD #visuals[1] 0 I_HAIRYITUS #visuals[2] 1 I_ELVIS #visuals[3] 1 I_INVIS #visuals[4] 0 I_RADIATION #visuals[5] 0 I_SLACK_TONGUE #visuals[6] 0 I_ALIEN #visuals[7] 0 I_BROKEN_BONES #visuals[8] 0 I_BALDNESS #visuals[9] 1 I_DISCRETE_ITCHING #visuals[10] 0 I_JELLYITUS #visuals[11] 1 I_SLEEPING_ILLNESS #visuals[12] 0 I_PREGNANT #visuals[13] 0 I_TRANSPARENCY #non_visuals[0] 1 I_UNCOMMON_COLD #non_visuals[1] 1 I_BROKEN_WIND #non_visuals[2] 1 I_SPARE_RIBS #non_visuals[3] 1 I_KIDNEY_BEANS #non_visuals[4] 1 I_BROKEN_HEART #non_visuals[5] 0 I_RUPTURED_NODULES #non_visuals[6] 1 I_MULTIPLE_TV_PERSONALITIES #non_visuals[7] 1 I_INFECTIOUS_LAUGHTER #non_visuals[8] 1 I_CORRUGATED_ANKLES #non_visuals[9] 1 I_CHRONIC_NOSEHAIR #non_visuals[10] 1 I_3RD_DEGREE_SIDEBURNS #non_visuals[11] 1 I_FAKE_BLOOD #non_visuals[12] 1 I_GASTRIC_EJECTIONS #non_visuals[13] 1 I_THE_SQUITS #non_visuals[14] 0 I_IRON_LUNGS #non_visuals[15] 1 I_SWEATY_PALMS #non_visuals[16] 1 I_HEAPED_PILES #non_visuals[17] 1 I_GUT_ROT #non_visuals[18] 1 I_GOLF_STONES #non_visuals[19] 1 I_UNEXPECTED_SWELLING ---------------------- Staff Configuration ------------------------- Each entry states how many staff members of each category are available a given month. The number of entries is not fixed. | A list | Month it gets active (start at 0) | Each group | #staff_levels[0].Month.Nurses.Doctors.Handymen.Receptionists 0 8 8 3 2 #staff_levels[1].Month.Nurses.Doctors.Handymen.Receptionists 3 7 5 5 3 #staff_levels[2].Month.Nurses.Doctors.Handymen.Receptionists 5 5 8 7 4 The minimum salary for each staff type #staff[0].MinSalary 60 Nurse #staff[1].MinSalary 75 Doctor #staff[2].MinSalary 30 Handyman #staff[3].MinSalary 30 Receptionist Salary modifiers for different doctor attributes #gbv.SalaryAdd[3] -30 Junior #gbv.SalaryAdd[4] 30 Doctor #gbv.SalaryAdd[5] 50 Surgeon #gbv.SalaryAdd[6] 40 Psychiatrist #gbv.SalaryAdd[7] 100 Consultant #gbv.SalaryAdd[8] 20 Researcher How much the skill of the doctor adds to the salary. skill * 1000 / divisor #gbv.SalaryAbilityDivisor 10 #gbv.LandCostPerTile 25 #gbv.TrainingRate 50 #gbv.AbilityThreshold[0] 80 Surgeon #gbv.AbilityThreshold[1] 60 Psychiatrist #gbv.AbilityThreshold[2] 50 Researcher #gbv.TrainingValue[0] 30 Projector #gbv.TrainingValue[1] 30 Skeleton #gbv.TrainingValue[2] 30 Bookcase #quake_control[0].StartMonth.EndMonth.Severity 18 20 3 #quake_control[1].StartMonth.EndMonth.Severity 30 32 4 #quake_control[2].StartMonth.EndMonth.Severity 42 44 5 --------------------- Research Configuration ----------------------- Divides research input to get the amount of research points. must be > 0 #gbv.ResearchPointsDivisor 5 ---------------------- Awards and Trophies ------------------------- #awards_trophies.CansofCoke 2500 #awards_trophies.CansofCokeBonus 5000 #awards_trophies.Reputation 2500 #awards_trophies.TrophyReputationBonus 20000 #awards_trophies.TrophyDeathBonus 10000 ------------------ Winning and Losing Conditions ------------------- 1 Total reputation 2 Balance total 3 Percentage people your hospital has handled 4 Percentage people have been cured 5 Percentage people have been killed 6 Hospital value #win_criteria[0].Criteria.MaxMin.Value.Group.Bound 1 1 600 1 0 #win_criteria[1].Criteria.MaxMin.Value.Group.Bound 2 1 125000 1 0 #win_criteria[2].Criteria.MaxMin.Value.Group.Bound 3 1 70 1 0 #win_criteria[3].Criteria.MaxMin.Value.Group.Bound 4 1 300 1 0 #win_criteria[4].Criteria.MaxMin.Value.Group.Bound 6 1 150000 1 0 #win_criteria[5].Criteria.MaxMin.Value.Group.Bound 0 0 0 0 0 #lose_criteria[0].Criteria.MaxMin.Value.Group.Bound 1 0 400 1 450 #lose_criteria[1].Criteria.MaxMin.Value.Group.Bound 5 1 30 2 0 #lose_criteria[2].Criteria.MaxMin.Value.Group.Bound 0 0 0 0 0 #lose_criteria[3].Criteria.MaxMin.Value.Group.Bound 0 0 0 0 0 #lose_criteria[4].Criteria.MaxMin.Value.Group.Bound 0 0 0 0 0 #lose_criteria[5].Criteria.MaxMin.Value.Group.Bound 0 0 0 0 0 --------------------- Competitor Information ----------------------- | Index in the away "computer" | Is that opponent playing? | 1 is yes, 0 no | Comment | #computer[12].Playing 1 CORSIX #computer[13].Playing 1 ROUJIN #computer[14].Playing 1 EDVIN ----------------------- Emergency Control -------------------------- #emergency_control[0].StartMonth.EndMonth.Min.Max.Illness.PercWin.Bonus 4 6 4 6 2 70 1000 #emergency_control[1].StartMonth.EndMonth.Min.Max.Illness.PercWin.Bonus 8 10 5 8 16 70 2000 #emergency_control[2].StartMonth.EndMonth.Min.Max.Illness.PercWin.Bonus 12 14 5 8 22 70 2500 #emergency_control[3].StartMonth.EndMonth.Min.Max.Illness.PercWin.Bonus 16 18 5 8 13 70 2500 #emergency_control[4].StartMonth.EndMonth.Min.Max.Illness.PercWin.Bonus 20 22 5 8 23 70 2500 #emergency_control[5].StartMonth.EndMonth.Min.Max.Illness.PercWin.Bonus 24 26 5 8 29 70 2500 #emergency_control[6].StartMonth.EndMonth.Min.Max.Illness.PercWin.Bonus 28 30 5 8 17 70 2500 #emergency_control[7].StartMonth.EndMonth.Min.Max.Illness.PercWin.Bonus 32 34 5 8 11 70 2500 #emergency_control[8].StartMonth.EndMonth.Min.Max.Illness.PercWin.Bonus 36 38 5 8 4 70 2500CorsixTH-0.63/CorsixTH/Campaigns/tufflook.level000066400000000000000000000320201347163623700214450ustar00rootroot00000000000000Copyright (c) 2013 Chris "ChrizmanTV" Wilkinson 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. ---------------------- General ------------------------- %Name = "Tufflook" %MapFile = "Tufflook.map" %LevelBriefing = "Disaster! A nuclear meltdown at the local power station has rendered a curious new form of radiation sickness to develop within the city. The Ministry has set up this hospital, filled with all the latest equipment, to help you cure them of their ailments. To succeed, cure 800 and treat at least 80% of patients, gather $300,000 in your account, construct a hospital worth $500,000 and gain a sterling reputation of 850. We are confident you can do it!" %LevelDebriefing = "Marvellous! You've come a long way since your humble beginnings, but the Ministry thinks that it is time to bring you back to earth and back to work. There's a job with a jelly... sorry, jolly good salary for you at Dethsdaw Hospital. Will you go for it?" #town.StartCash.InterestRate 70000 1250 #gbv.StartRating 75 When a drug is researched, what effectiveness does it have #gbv.DrugImproveRate 5 #gbv.StartCost 100 #gbv.MinDrugCost 50 #gbv.LandCostPerTile 40 Cost to buy a single map square #gbv.RschImproveCostPercent 10 How many percent of the original research points that are required to improve the machine. #gbv.RschImproveIncrementPercent 10 How many additional percentage points are added to the above value for each upgrade. #gbv.MaxObjectStrength 20 Maximum strength value an object can be improved to (by research) #gbv.ResearchIncrement 2 Increase object strength by this amount when researching #gbv.AutopsyRschPercent 33 % of research completed for an autopsy #gbv.AutopsyRepHitPercent 25 % rep hit for discovered autopsy ---------------------- Diseases ------------------------- The following table contains all diagnoses and treatments that shows up in the drug casebook in the game. Known specifies whether it should show up from the beginning of the level and RschReqd how much research is required to discover the treatment room for the disease. #expertise[1].Known.RschReqd 1 0 #expertise[2].Known.RschReqd 1 40000 #expertise[3].Known.RschReqd 0 40000 #expertise[4].Known.RschReqd 1 60000 #expertise[5].Known.RschReqd 1 60000 #expertise[6].Known.RschReqd 0 60000 #expertise[7].Known.RschReqd 1 40000 #expertise[8].Known.RschReqd 0 60000 #expertise[9].Known.RschReqd 0 20000 #expertise[10].Known.RschReqd 0 40000 #expertise[11].Known.RschReqd 1 40000 #expertise[12].Known.RschReqd 0 40000 #expertise[13].Known.RschReqd 1 40000 #expertise[14].Known.RschReqd 1 30000 #expertise[15].Known.RschReqd 0 40000 #expertise[16].Known.RschReqd 1 20000 #expertise[17].Known.RschReqd 1 60000 #expertise[18].Known.RschReqd 1 20000 #expertise[19].Known.RschReqd 1 20000 #expertise[20].Known.RschReqd 1 20000 #expertise[21].Known.RschReqd 1 20000 #expertise[22].Known.RschReqd 1 40000 #expertise[23].Known.RschReqd 1 60000 #expertise[24].Known.RschReqd 1 40000 #expertise[25].Known.RschReqd 1 40000 #expertise[26].Known.RschReqd 1 40000 #expertise[27].Known.RschReqd 1 40000 #expertise[28].Known.RschReqd 1 40000 #expertise[29].Known.RschReqd 1 20000 #expertise[30].Known.RschReqd 1 20000 #expertise[31].Known.RschReqd 1 40000 #expertise[32].Known.RschReqd 1 20000 #expertise[33].Known.RschReqd 1 20000 #expertise[34].Known.RschReqd 1 20000 #expertise[35].Known.RschReqd 1 20000 #expertise[36].Known.RschReqd 0 40000 #expertise[37].Known.RschReqd 0 50000 #expertise[38].Known.RschReqd 1 20000 #expertise[39].Known.RschReqd 0 30000 #expertise[40].Known.RschReqd 0 60000 #expertise[41].Known.RschReqd 1 20000 #expertise[42].Known.RschReqd 1 20000 #expertise[43].Known.RschReqd 1 20000 #expertise[44].Known.RschReqd 0 0 #expertise[45].Known.RschReqd 0 0 #expertise[46].Known.RschReqd 0 0 | Diseases available | Value property to be determined | Comment #visuals[0] 1 #visuals[1] 1 #visuals[2] 1 #visuals[3] 1 #visuals[4] 1 #visuals[5] 1 #visuals[6] 0 #visuals[7] 1 #visuals[8] 1 #visuals[9] 1 #visuals[10] 0 #visuals[11] 1 #visuals[12] 1 #visuals[13] 1 #non_visuals[0] 1 #non_visuals[1] 1 #non_visuals[2] 1 #non_visuals[3] 1 #non_visuals[4] 1 #non_visuals[5] 1 #non_visuals[6] 1 #non_visuals[7] 1 #non_visuals[8] 1 #non_visuals[9] 1 #non_visuals[10] 1 #non_visuals[11] 1 #non_visuals[12] 1 #non_visuals[13] 1 #non_visuals[14] 1 #non_visuals[15] 1 #non_visuals[16] 1 #non_visuals[17] 1 #non_visuals[18] 1 #non_visuals[19] 1 #visuals_available[0] 0 #visuals_available[1] 12 #visuals_available[2] 3 #visuals_available[3] 12 #visuals_available[4] 18 #visuals_available[5] 6 #visuals_available[6] 0 #visuals_available[7] 6 #visuals_available[8] 12 #visuals_available[9] 0 #visuals_available[10] 18 #visuals_available[11] 0 #visuals_available[12] 0 #visuals_available[13] 6 ---------------------- Objects ------------------------- | Objects available | Available from the start | Strength | Available for this level | Comment #objects[1].StartAvail.StartStrength.AvailableForLevel.RschReqd 1 10 1 0 #objects[2].StartAvail.StartStrength.AvailableForLevel.RschReqd 1 10 1 0 #objects[3].StartAvail.StartStrength.AvailableForLevel.RschReqd 1 10 1 0 #objects[4].StartAvail.StartStrength.AvailableForLevel.RschReqd 1 10 1 0 #objects[5].StartAvail.StartStrength.AvailableForLevel.RschReqd 1 10 1 0 #objects[6].StartAvail.StartStrength.AvailableForLevel.RschReqd 1 10 1 0 #objects[7].StartAvail.StartStrength.AvailableForLevel.RschReqd 1 10 1 0 #objects[8].StartAvail.StartStrength.AvailableForLevel.RschReqd 1 10 1 20000 #objects[9].StartAvail.StartStrength.AvailableForLevel.RschReqd 1 8 1 40000 #objects[10].StartAvail.StartStrength.AvailableForLevel.RschReqd 1 10 1 0 #objects[11].StartAvail.StartStrength.AvailableForLevel.RschReqd 1 10 1 0 #objects[12].StartAvail.StartStrength.AvailableForLevel.RschReqd 1 10 1 0 #objects[13].StartAvail.StartStrength.AvailableForLevel.RschReqd 1 13 1 20000 #objects[14].StartAvail.StartStrength.AvailableForLevel.RschReqd 0 12 1 40000 #objects[15].StartAvail.StartStrength.AvailableForLevel.RschReqd 1 10 1 0 #objects[16].StartAvail.StartStrength.AvailableForLevel.RschReqd 1 10 1 0 #objects[17].StartAvail.StartStrength.AvailableForLevel.RschReqd 1 10 1 0 #objects[18].StartAvail.StartStrength.AvailableForLevel.RschReqd 1 10 1 20000 #objects[19].StartAvail.StartStrength.AvailableForLevel.RschReqd 1 10 1 0 #objects[20].StartAvail.StartStrength.AvailableForLevel.RschReqd 1 10 1 20000 #objects[21].StartAvail.StartStrength.AvailableForLevel.RschReqd 1 10 1 0 #objects[22].StartAvail.StartStrength.AvailableForLevel.RschReqd 0 9 1 60000 #objects[23].StartAvail.StartStrength.AvailableForLevel.RschReqd 0 7 0 60000 #objects[24].StartAvail.StartStrength.AvailableForLevel.RschReqd 0 11 1 20000 #objects[25].StartAvail.StartStrength.AvailableForLevel.RschReqd 0 8 1 40000 #objects[26].StartAvail.StartStrength.AvailableForLevel.RschReqd 1 10 1 40000 #objects[27].StartAvail.StartStrength.AvailableForLevel.RschReqd 0 12 1 30000 #objects[28].StartAvail.StartStrength.AvailableForLevel.RschReqd 1 10 1 0 #objects[29].StartAvail.StartStrength.AvailableForLevel.RschReqd 1 10 1 0 #objects[30].StartAvail.StartStrength.AvailableForLevel.RschReqd 1 12 1 20000 #objects[31].StartAvail.StartStrength.AvailableForLevel.RschReqd 1 10 1 0 #objects[32].StartAvail.StartStrength.AvailableForLevel.RschReqd 1 10 1 0 #objects[33].StartAvail.StartStrength.AvailableForLevel.RschReqd 1 10 1 0 #objects[34].StartAvail.StartStrength.AvailableForLevel.RschReqd 1 10 1 0 #objects[35].StartAvail.StartStrength.AvailableForLevel.RschReqd 1 10 1 0 #objects[36].StartAvail.StartStrength.AvailableForLevel.RschReqd 1 10 1 0 #objects[37].StartAvail.StartStrength.AvailableForLevel.RschReqd 1 0 1 20000 #objects[38].StartAvail.StartStrength.AvailableForLevel.RschReqd 1 10 1 0 #objects[39].StartAvail.StartStrength.AvailableForLevel.RschReqd 1 10 1 20000 #objects[40].StartAvail.StartStrength.AvailableForLevel.RschReqd 0 10 1 30000 #objects[41].StartAvail.StartStrength.AvailableForLevel.RschReqd 0 10 0 30000 #objects[42].StartAvail.StartStrength.AvailableForLevel.RschReqd 0 10 1 50000 #objects[43].StartAvail.StartStrength.AvailableForLevel.RschReqd 1 10 1 0 #objects[44].StartAvail.StartStrength.AvailableForLevel.RschReqd 1 10 1 0 #objects[45].StartAvail.StartStrength.AvailableForLevel.RschReqd 1 10 1 0 #objects[46].StartAvail.StartStrength.AvailableForLevel.RschReqd 0 8 1 40000 #objects[47].StartAvail.StartStrength.AvailableForLevel.RschReqd 0 7 0 40000 #objects[48].StartAvail.StartStrength.AvailableForLevel.RschReqd 1 10 1 0 #objects[49].StartAvail.StartStrength.AvailableForLevel.RschReqd 1 10 1 0 #objects[50].StartAvail.StartStrength.AvailableForLevel.RschReqd 1 10 1 0 #objects[51].StartAvail.StartStrength.AvailableForLevel.RschReqd 1 10 1 0 #objects[52].StartAvail.StartStrength.AvailableForLevel.RschReqd 1 10 1 0 #objects[53].StartAvail.StartStrength.AvailableForLevel.RschReqd 1 10 1 0 #objects[54].StartAvail.StartStrength.AvailableForLevel.RschReqd 0 10 1 60000 #objects[55].StartAvail.StartStrength.AvailableForLevel.RschReqd 1 10 1 0 #objects[56].StartAvail.StartStrength.AvailableForLevel.RschReqd 1 10 1 0 #objects[57].StartAvail.StartStrength.AvailableForLevel.RschReqd 0 10 1 0 #objects[58].StartAvail.StartStrength.AvailableForLevel.RschReqd 1 10 1 0 #objects[59].StartAvail.StartStrength.AvailableForLevel.RschReqd 1 10 1 0 #objects[60].StartAvail.StartStrength.AvailableForLevel.RschReqd 1 10 1 0 #objects[61].StartAvail.StartStrength.AvailableForLevel.RschReqd 1 10 1 0 ---------------------- Staff Configuration ------------------------- The minimum salary for each staff type #staff[0].MinSalary 60 #staff[1].MinSalary 75 #staff[2].MinSalary 30 #staff[3].MinSalary 30 Salary modifiers for different doctor attributes #gbv.SalaryAdd[3] -30 #gbv.SalaryAdd[4] 30 #gbv.SalaryAdd[5] 50 #gbv.SalaryAdd[6] 40 #gbv.SalaryAdd[7] 100 #gbv.SalaryAdd[8] 20 Each entry states how many staff members of each category are available a given month. The number of entries is not fixed. | A list | Month it gets active (start at 0) | Each group | #staff_levels[0].Month.Nurses.Doctors.Handymen.Receptionists.ShrkRate.SurgRate.RschRate.ConsRate.JrRate 0 8 8 3 2 10 10 10 10 4 #staff_levels[1].Month.Nurses.Doctors.Handymen.Receptionists.ShrkRate.SurgRate.RschRate.ConsRate.JrRate 3 7 5 5 3 10 10 10 10 4 #staff_levels[2].Month.Nurses.Doctors.Handymen.Receptionists.ShrkRate.SurgRate.RschRate.ConsRate.JrRate 5 5 8 7 4 10 10 10 10 4 #gbv.TrainingRate 45 #gbv.AbilityThreshold[0] 75 Surgeon #gbv.AbilityThreshold[1] 60 Psychiatrist #gbv.AbilityThreshold[2] 45 Researcher #gbv.TrainingValue[0] 10 Projector #gbv.TrainingValue[1] 25 Skeleton #gbv.TrainingValue[2] 30 Bookcase ----------------------- Emergency Control -------------------------- #emergency_control[0].Random 0 ----------------------- Quake Control -------------------------- #quake_control[0].StartMonth.EndMonth.Severity 10 12 7 #quake_control[1].StartMonth.EndMonth.Severity 22 24 8 #quake_control[2].StartMonth.EndMonth.Severity 34 36 9 #quake_control[3].StartMonth.EndMonth.Severity 46 48 8 #quake_control[4].StartMonth.EndMonth.Severity 58 60 7 #quake_control[5].StartMonth.EndMonth.Severity 70 72 7 ----------------------- Population Growth ---------------------------- #popn[0].Month.Change 0 4 #popn[1].Month.Change 1 1 ---------------------- Awards and Trophies ------------------------- #awards_trophies.CansofCoke 2500 #awards_trophies.CansofCokeBonus 5000 #awards_trophies.Reputation 2500 #awards_trophies.TrophyReputationBonus 20000 #awards_trophies.TrophyDeathBonus 10000 ------------------ Winning and Losing Conditions ------------------- 1 Total reputation 2 Balance total 3 Percentage people your hospital has handled 4 Cure count 5 Percentage people have been killed 6 Hospital value #win_criteria[0].Criteria.MaxMin.Value.Group.Bound 1 1 850 1 0 #win_criteria[1].Criteria.MaxMin.Value.Group.Bound 2 1 300000 1 0 #win_criteria[2].Criteria.MaxMin.Value.Group.Bound 3 1 80 1 0 #win_criteria[3].Criteria.MaxMin.Value.Group.Bound 4 1 800 1 0 #win_criteria[4].Criteria.MaxMin.Value.Group.Bound 6 1 500000 1 0 #lose_criteria[0].Criteria.MaxMin.Value.Group.Bound 1 0 400 1 450 #lose_criteria[1].Criteria.MaxMin.Value.Group.Bound 2 0 -50000 2 -30000 #lose_criteria[2].Criteria.MaxMin.Value.Group.Bound 5 1 25 3 10 CorsixTH-0.63/CorsixTH/Campaigns/upperpukington.level000066400000000000000000000247271347163623700227250ustar00rootroot00000000000000Copyright (c) 2013 Chris "ChrizmanTV" Wilkinson 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. ---------------------- General Information ------------------------- %Name = "Upper Pukington" %MapFile = "Upper Pukington.map" %LevelBriefing = "The Ministry of Health has recently acquired this old hospital in Upper Pukington, but has found it to be unsatisfactory in standards. There is a new tongue swelling disorder going around too, so watch out! Whilst you will not be dealing with emergencies, the layout is somewhat archaic, but we are sure you can reach the targets of 400 cures, 70% patient treatment, $150,000 in the kitty, $200,000 hospital value and a reputation of 650. Good luck!" %LevelDebriefing = "Excellent! The Ministry sees that your climbing the ranks in this career, but watch you don't fall and break a leg! You wouldn't want to ruin your new Italian shoes now... so could you assist the ill patients in need of treatment at Wishinwell Hospital?" Town properties InterestRate is defined as centiprocent to allow for two decimals precision, i.e. 300 means 3 % #town.StartCash.InterestRate 45000 800 -------------------- Disease Configuration ------------------------- When a drug is researched, what effectiveness does it have #gbv.StartRating 90 The following table contains all diagnoses and treatments that shows up inte drug casebook in the game. Known specifies whether it should show up from the beginning of the level and RschReqd how much research is required to discover the treatment room for the disease. #expertise[1].Known.RschReqd 1 0 GENERAL_PRACTICE #expertise[2].Known.RschReqd 1 40000 BLOATY_HEAD #expertise[3].Known.RschReqd 0 40000 HAIRYITUS #expertise[4].Known.RschReqd 0 60000 ELVIS #expertise[5].Known.RschReqd 0 60000 INVIS #expertise[6].Known.RschReqd 0 60000 RADIATION #expertise[7].Known.RschReqd 0 40000 SLACK_TONGUE #expertise[8].Known.RschReqd 0 60000 ALIEN #expertise[9].Known.RschReqd 0 20000 BROKEN_BONES #expertise[10].Known.RschReqd 0 40000 BALDNESS #expertise[11].Known.RschReqd 1 40000 DISCRETE_ITCHING #expertise[12].Known.RschReqd 0 40000 JELLYITUS #expertise[13].Known.RschReqd 1 40000 SLEEPING_ILLNESS #expertise[14].Known.RschReqd 0 30000 PREGNANT #expertise[15].Known.RschReqd 0 40000 TRANSPARENCY #expertise[16].Known.RschReqd 1 20000 UNCOMMON_COLD #expertise[17].Known.RschReqd 1 60000 BROKEN_WIND #expertise[18].Known.RschReqd 0 20000 SPARE_RIBS #expertise[19].Known.RschReqd 0 20000 KIDNEY_BEANS #expertise[20].Known.RschReqd 0 20000 BROKEN_HEART #expertise[21].Known.RschReqd 0 20000 RUPTURED_NODULES #expertise[22].Known.RschReqd 1 40000 MULTIPLE_TV_PERSONALITIES #expertise[23].Known.RschReqd 1 60000 INFECTIOUS_LAUGHTER #expertise[24].Known.RschReqd 1 40000 CORRUGATED_ANKLES #expertise[25].Known.RschReqd 1 40000 CHRONIC_NOSEHAIR #expertise[26].Known.RschReqd 0 40000 3RD_DEGREE_SIDEBURNS #expertise[27].Known.RschReqd 0 40000 FAKE_BLOOD #expertise[28].Known.RschReqd 1 40000 GASTRIC_EJECTIONS #expertise[29].Known.RschReqd 1 20000 THE_SQUITS #expertise[30].Known.RschReqd 0 20000 IRON_LUNGS #expertise[31].Known.RschReqd 1 40000 SWEATY_PALMS #expertise[32].Known.RschReqd 1 20000 HEAPED_PILES #expertise[33].Known.RschReqd 1 20000 GUT_ROT #expertise[34].Known.RschReqd 0 20000 GOLF_STONES #expertise[35].Known.RschReqd 0 20000 UNEXPECTED_SWELLING #expertise[36].Known.RschReqd 0 40000 I_D_SCANNER DIAGNOSIS #expertise[37].Known.RschReqd 0 50000 I_D_BLOOD_MACHINE DIAGNOSIS #expertise[38].Known.RschReqd 1 20000 I_D_CARDIO DIAGNOSIS #expertise[39].Known.RschReqd 0 30000 I_D_XRAY DIAGNOSIS #expertise[40].Known.RschReqd 0 60000 I_D_ULTRASCAN DIAGNOSIS #expertise[41].Known.RschReqd 1 20000 I_D_STANDARD DIAGNOSIS #expertise[42].Known.RschReqd 1 20000 I_D_WARD DIAGNOSIS #expertise[43].Known.RschReqd 1 20000 I_D_SHRINK DIAGNOSIS | Objects available | Available from the start | Strength | Available for this level | Comment #objects[9].StartAvail.StartStrength.AvailableForLevel 1 8 1 Inflator Machine #objects[13].StartAvail.StartStrength.AvailableForLevel 1 13 1 Cardiogram #objects[14].StartAvail.StartStrength.AvailableForLevel 0 12 1 Scanner #objects[22].StartAvail.StartStrength.AvailableForLevel 0 9 0 Ultrascan #objects[23].StartAvail.StartStrength.AvailableForLevel 0 7 0 DNA Restorer #objects[24].StartAvail.StartStrength.AvailableForLevel 0 11 0 Cast Remover #objects[25].StartAvail.StartStrength.AvailableForLevel 0 8 0 Hair restorer #objects[26].StartAvail.StartStrength.AvailableForLevel 0 10 1 Slicer for slack tongues #objects[27].StartAvail.StartStrength.AvailableForLevel 0 12 1 X-Ray #objects[30].StartAvail.StartStrength.AvailableForLevel 1 12 1 Operating Table #objects[37].StartAvail.StartStrength.AvailableForLevel 1 0 1 Projector #objects[42].StartAvail.StartStrength.AvailableForLevel 0 10 0 Blood Machine #objects[46].StartAvail.StartStrength.AvailableForLevel 0 8 0 Electrolysis Machine #objects[47].StartAvail.StartStrength.AvailableForLevel 0 7 0 Jellyitus Moulding Machine #objects[54].StartAvail.StartStrength.AvailableForLevel 0 10 0 Decontamination Shower #objects[55].StartAvail.StartStrength.AvailableForLevel 1 10 1 Autopsy Research Machine | Diseases available | Value property to be determined | Comment #visuals[0] 1 I_BLOATY_HEAD #visuals[1] 0 I_HAIRYITUS #visuals[2] 1 I_ELVIS #visuals[3] 1 I_INVIS #visuals[4] 0 I_RADIATION #visuals[5] 1 I_SLACK_TONGUE #visuals[6] 0 I_ALIEN #visuals[7] 0 I_BROKEN_BONES #visuals[8] 0 I_BALDNESS #visuals[9] 1 I_DISCRETE_ITCHING #visuals[10] 0 I_JELLYITUS #visuals[11] 1 I_SLEEPING_ILLNESS #visuals[12] 0 I_PREGNANT #visuals[13] 0 I_TRANSPARENCY #non_visuals[0] 1 I_UNCOMMON_COLD #non_visuals[1] 1 I_BROKEN_WIND #non_visuals[2] 1 I_SPARE_RIBS #non_visuals[3] 1 I_KIDNEY_BEANS #non_visuals[4] 1 I_BROKEN_HEART #non_visuals[5] 0 I_RUPTURED_NODULES #non_visuals[6] 1 I_MULTIPLE_TV_PERSONALITIES #non_visuals[7] 1 I_INFECTIOUS_LAUGHTER #non_visuals[8] 1 I_CORRUGATED_ANKLES #non_visuals[9] 1 I_CHRONIC_NOSEHAIR #non_visuals[10] 1 I_3RD_DEGREE_SIDEBURNS #non_visuals[11] 1 I_FAKE_BLOOD #non_visuals[12] 1 I_GASTRIC_EJECTIONS #non_visuals[13] 1 I_THE_SQUITS #non_visuals[14] 0 I_IRON_LUNGS #non_visuals[15] 1 I_SWEATY_PALMS #non_visuals[16] 1 I_HEAPED_PILES #non_visuals[17] 1 I_GUT_ROT #non_visuals[18] 1 I_GOLF_STONES #non_visuals[19] 1 I_UNEXPECTED_SWELLING ---------------------- Staff Configuration ------------------------- Each entry states how many staff members of each category are available a given month. The number of entries is not fixed. | A list | Month it gets active (start at 0) | Each group | #staff_levels[0].Month.Nurses.Doctors.Handymen.Receptionists 0 8 8 3 2 #staff_levels[1].Month.Nurses.Doctors.Handymen.Receptionists 3 7 5 5 3 #staff_levels[2].Month.Nurses.Doctors.Handymen.Receptionists 5 5 8 7 4 The minimum salary for each staff type #staff[0].MinSalary 60 Nurse #staff[1].MinSalary 75 Doctor #staff[2].MinSalary 30 Handyman #staff[3].MinSalary 30 Receptionist Salary modifiers for different doctor attributes #gbv.SalaryAdd[3] -30 Junior #gbv.SalaryAdd[4] 30 Doctor #gbv.SalaryAdd[5] 50 Surgeon #gbv.SalaryAdd[6] 40 Psychiatrist #gbv.SalaryAdd[7] 100 Consultant #gbv.SalaryAdd[8] 20 Researcher How much the skill of the doctor adds to the salary. skill * 1000 / divisor #gbv.SalaryAbilityDivisor 10 #gbv.LandCostPerTile 25 #gbv.TrainingRate 50 #gbv.AbilityThreshold[0] 80 Surgeon #gbv.AbilityThreshold[1] 60 Psychiatrist #gbv.AbilityThreshold[2] 50 Researcher #gbv.TrainingValue[0] 30 Projector #gbv.TrainingValue[1] 30 Skeleton #gbv.TrainingValue[2] 30 Bookcase #quake_control[0].StartMonth.EndMonth.Severity 10 12 3 #quake_control[1].StartMonth.EndMonth.Severity 22 24 4 #quake_control[2].StartMonth.EndMonth.Severity 34 36 5 #quake_control[3].StartMonth.EndMonth.Severity 46 48 4 #quake_control[4].StartMonth.EndMonth.Severity 58 60 3 #quake_control[5].StartMonth.EndMonth.Severity 70 72 4 --------------------- Research Configuration ----------------------- Divides research input to get the amount of research points. must be > 0 #gbv.ResearchPointsDivisor 5 ---------------------- Awards and Trophies ------------------------- #awards_trophies.CansofCoke 2500 #awards_trophies.CansofCokeBonus 5000 #awards_trophies.Reputation 2500 #awards_trophies.TrophyReputationBonus 20000 #awards_trophies.TrophyDeathBonus 10000 ------------------ Winning and Losing Conditions ------------------- 1 Total reputation 2 Balance total 3 Percentage people your hospital has handled 4 Percentage people have been cured 5 Percentage people have been killed 6 Hospital value #win_criteria[0].Criteria.MaxMin.Value.Group.Bound 1 1 650 1 0 #win_criteria[1].Criteria.MaxMin.Value.Group.Bound 2 1 150000 1 0 #win_criteria[2].Criteria.MaxMin.Value.Group.Bound 3 1 70 1 0 #win_criteria[3].Criteria.MaxMin.Value.Group.Bound 4 1 400 1 0 #win_criteria[4].Criteria.MaxMin.Value.Group.Bound 6 1 200000 1 0 #win_criteria[5].Criteria.MaxMin.Value.Group.Bound 0 0 0 0 0 #lose_criteria[0].Criteria.MaxMin.Value.Group.Bound 1 0 400 1 450 #lose_criteria[1].Criteria.MaxMin.Value.Group.Bound 5 1 30 2 0 #lose_criteria[2].Criteria.MaxMin.Value.Group.Bound 0 0 0 0 0 #lose_criteria[3].Criteria.MaxMin.Value.Group.Bound 0 0 0 0 0 #lose_criteria[4].Criteria.MaxMin.Value.Group.Bound 0 0 0 0 0 #lose_criteria[5].Criteria.MaxMin.Value.Group.Bound 0 0 0 0 0 --------------------- Competitor Information ----------------------- | Index in the away "computer" | Is that opponent playing? | 1 is yes, 0 no | Comment | #computer[12].Playing 1 CORSIX #computer[13].Playing 1 ROUJIN #computer[14].Playing 1 EDVIN CorsixTH-0.63/CorsixTH/Campaigns/wishinwell.level000066400000000000000000000265041347163623700220130ustar00rootroot00000000000000Copyright (c) 2013 Chris "ChrizmanTV" Wilkinson 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. ---------------------- General Information ------------------------- %Name = "Wishinwell" %MapFile = "Wishinwell.map" %LevelBriefing = "There are a couple of new conditions in the town of Wishinwell which require your attention, and youll be dealing with broken bones, so do not forget to prioritise research to cure rooms. You will also be dealing with a fair share of emergencies too. To win, gain a reputation of 700, treat 500 patients, cure 75% of your visitors, amass $175,000 in the bank and have a hospital worth $250,000. We at the Ministry wish you the best of luck!" %LevelDebriefing = "Outstanding! Now that you're on first name terms with your new boss, Mr I. Leggitt, you've been given a new project. He has noticed that you constantly stare at all four walls of your office, so do you think you can operate Four Corners Hospital?" Town properties InterestRate is defined as centiprocent to allow for two decimals precision, i.e. 300 means 3 % #town.StartCash.InterestRate 50000 900 -------------------- Disease Configuration ------------------------- When a drug is researched, what effectiveness does it have #gbv.StartRating 85 The following table contains all diagnoses and treatments that shows up inte drug casebook in the game. Known specifies whether it should show up from the beginning of the level and RschReqd how much research is required to discover the treatment room for the disease. #expertise[1].Known.RschReqd 1 0 GENERAL_PRACTICE #expertise[2].Known.RschReqd 1 40000 BLOATY_HEAD #expertise[3].Known.RschReqd 0 40000 HAIRYITUS #expertise[4].Known.RschReqd 0 60000 ELVIS #expertise[5].Known.RschReqd 0 60000 INVIS #expertise[6].Known.RschReqd 0 60000 RADIATION #expertise[7].Known.RschReqd 0 40000 SLACK_TONGUE #expertise[8].Known.RschReqd 0 60000 ALIEN #expertise[9].Known.RschReqd 0 20000 BROKEN_BONES #expertise[10].Known.RschReqd 0 40000 BALDNESS #expertise[11].Known.RschReqd 1 40000 DISCRETE_ITCHING #expertise[12].Known.RschReqd 0 40000 JELLYITUS #expertise[13].Known.RschReqd 1 40000 SLEEPING_ILLNESS #expertise[14].Known.RschReqd 0 30000 PREGNANT #expertise[15].Known.RschReqd 0 40000 TRANSPARENCY #expertise[16].Known.RschReqd 1 20000 UNCOMMON_COLD #expertise[17].Known.RschReqd 1 60000 BROKEN_WIND #expertise[18].Known.RschReqd 0 20000 SPARE_RIBS #expertise[19].Known.RschReqd 0 20000 KIDNEY_BEANS #expertise[20].Known.RschReqd 0 20000 BROKEN_HEART #expertise[21].Known.RschReqd 0 20000 RUPTURED_NODULES #expertise[22].Known.RschReqd 1 40000 MULTIPLE_TV_PERSONALITIES #expertise[23].Known.RschReqd 1 60000 INFECTIOUS_LAUGHTER #expertise[24].Known.RschReqd 1 40000 CORRUGATED_ANKLES #expertise[25].Known.RschReqd 1 40000 CHRONIC_NOSEHAIR #expertise[26].Known.RschReqd 1 40000 3RD_DEGREE_SIDEBURNS #expertise[27].Known.RschReqd 1 40000 FAKE_BLOOD #expertise[28].Known.RschReqd 1 40000 GASTRIC_EJECTIONS #expertise[29].Known.RschReqd 1 20000 THE_SQUITS #expertise[30].Known.RschReqd 0 20000 IRON_LUNGS #expertise[31].Known.RschReqd 1 40000 SWEATY_PALMS #expertise[32].Known.RschReqd 1 20000 HEAPED_PILES #expertise[33].Known.RschReqd 1 20000 GUT_ROT #expertise[34].Known.RschReqd 0 20000 GOLF_STONES #expertise[35].Known.RschReqd 0 20000 UNEXPECTED_SWELLING #expertise[36].Known.RschReqd 0 40000 I_D_SCANNER DIAGNOSIS #expertise[37].Known.RschReqd 0 50000 I_D_BLOOD_MACHINE DIAGNOSIS #expertise[38].Known.RschReqd 1 20000 I_D_CARDIO DIAGNOSIS #expertise[39].Known.RschReqd 0 30000 I_D_XRAY DIAGNOSIS #expertise[40].Known.RschReqd 0 60000 I_D_ULTRASCAN DIAGNOSIS #expertise[41].Known.RschReqd 1 20000 I_D_STANDARD DIAGNOSIS #expertise[42].Known.RschReqd 1 20000 I_D_WARD DIAGNOSIS #expertise[43].Known.RschReqd 1 20000 I_D_SHRINK DIAGNOSIS | Objects available | Available from the start | Strength | Available for this level | Comment #objects[9].StartAvail.StartStrength.AvailableForLevel 1 8 1 Inflator Machine #objects[13].StartAvail.StartStrength.AvailableForLevel 1 13 1 Cardiogram #objects[14].StartAvail.StartStrength.AvailableForLevel 0 12 1 Scanner #objects[22].StartAvail.StartStrength.AvailableForLevel 0 9 0 Ultrascan #objects[23].StartAvail.StartStrength.AvailableForLevel 0 7 0 DNA Restorer #objects[24].StartAvail.StartStrength.AvailableForLevel 0 11 1 Cast Remover #objects[25].StartAvail.StartStrength.AvailableForLevel 0 8 1 Hair restorer #objects[26].StartAvail.StartStrength.AvailableForLevel 1 10 1 Slicer for slack tongues #objects[27].StartAvail.StartStrength.AvailableForLevel 0 12 1 X-Ray #objects[30].StartAvail.StartStrength.AvailableForLevel 1 12 1 Operating Table #objects[37].StartAvail.StartStrength.AvailableForLevel 1 0 1 Projector #objects[42].StartAvail.StartStrength.AvailableForLevel 0 10 1 Blood Machine #objects[46].StartAvail.StartStrength.AvailableForLevel 0 8 0 Electrolysis Machine #objects[47].StartAvail.StartStrength.AvailableForLevel 0 7 0 Jellyitus Moulding Machine #objects[54].StartAvail.StartStrength.AvailableForLevel 0 10 0 Decontamination Shower #objects[55].StartAvail.StartStrength.AvailableForLevel 1 10 1 Autopsy Research Machine | Diseases available | Value property to be determined | Comment #visuals[0] 1 I_BLOATY_HEAD #visuals[1] 0 I_HAIRYITUS #visuals[2] 1 I_ELVIS #visuals[3] 1 I_INVIS #visuals[4] 0 I_RADIATION #visuals[5] 1 I_SLACK_TONGUE #visuals[6] 0 I_ALIEN #visuals[7] 1 I_BROKEN_BONES #visuals[8] 1 I_BALDNESS #visuals[9] 1 I_DISCRETE_ITCHING #visuals[10] 0 I_JELLYITUS #visuals[11] 1 I_SLEEPING_ILLNESS #visuals[12] 0 I_PREGNANT #visuals[13] 0 I_TRANSPARENCY #non_visuals[0] 1 I_UNCOMMON_COLD #non_visuals[1] 1 I_BROKEN_WIND #non_visuals[2] 1 I_SPARE_RIBS #non_visuals[3] 1 I_KIDNEY_BEANS #non_visuals[4] 1 I_BROKEN_HEART #non_visuals[5] 1 I_RUPTURED_NODULES #non_visuals[6] 1 I_MULTIPLE_TV_PERSONALITIES #non_visuals[7] 1 I_INFECTIOUS_LAUGHTER #non_visuals[8] 1 I_CORRUGATED_ANKLES #non_visuals[9] 1 I_CHRONIC_NOSEHAIR #non_visuals[10] 1 I_3RD_DEGREE_SIDEBURNS #non_visuals[11] 1 I_FAKE_BLOOD #non_visuals[12] 1 I_GASTRIC_EJECTIONS #non_visuals[13] 1 I_THE_SQUITS #non_visuals[14] 1 I_IRON_LUNGS #non_visuals[15] 1 I_SWEATY_PALMS #non_visuals[16] 1 I_HEAPED_PILES #non_visuals[17] 1 I_GUT_ROT #non_visuals[18] 1 I_GOLF_STONES #non_visuals[19] 1 I_UNEXPECTED_SWELLING ---------------------- Staff Configuration ------------------------- Each entry states how many staff members of each category are available a given month. The number of entries is not fixed. | A list | Month it gets active (start at 0) | Each group | #staff_levels[0].Month.Nurses.Doctors.Handymen.Receptionists 0 8 8 3 2 #staff_levels[1].Month.Nurses.Doctors.Handymen.Receptionists 3 7 5 5 3 #staff_levels[2].Month.Nurses.Doctors.Handymen.Receptionists 5 5 8 7 4 The minimum salary for each staff type #staff[0].MinSalary 60 Nurse #staff[1].MinSalary 75 Doctor #staff[2].MinSalary 30 Handyman #staff[3].MinSalary 30 Receptionist Salary modifiers for different doctor attributes #gbv.SalaryAdd[3] -30 Junior #gbv.SalaryAdd[4] 30 Doctor #gbv.SalaryAdd[5] 50 Surgeon #gbv.SalaryAdd[6] 40 Psychiatrist #gbv.SalaryAdd[7] 100 Consultant #gbv.SalaryAdd[8] 20 Researcher How much the skill of the doctor adds to the salary. skill * 1000 / divisor #gbv.SalaryAbilityDivisor 10 #gbv.LandCostPerTile 30 #gbv.TrainingRate 50 #gbv.AbilityThreshold[0] 80 Surgeon #gbv.AbilityThreshold[1] 60 Psychiatrist #gbv.AbilityThreshold[2] 50 Researcher #gbv.TrainingValue[0] 30 Projector #gbv.TrainingValue[1] 30 Skeleton #gbv.TrainingValue[2] 30 Bookcase #quake_control[0].StartMonth.EndMonth.Severity 10 12 4 #quake_control[1].StartMonth.EndMonth.Severity 22 24 5 #quake_control[2].StartMonth.EndMonth.Severity 34 36 6 #quake_control[3].StartMonth.EndMonth.Severity 46 48 5 #quake_control[4].StartMonth.EndMonth.Severity 58 60 4 #quake_control[5].StartMonth.EndMonth.Severity 70 72 4 --------------------- Research Configuration ----------------------- Divides research input to get the amount of research points. must be > 0 #gbv.ResearchPointsDivisor 5 ---------------------- Awards and Trophies ------------------------- #awards_trophies.CansofCoke 2500 #awards_trophies.CansofCokeBonus 5000 #awards_trophies.Reputation 2500 #awards_trophies.TrophyReputationBonus 20000 #awards_trophies.TrophyDeathBonus 10000 ------------------ Winning and Losing Conditions ------------------- 1 Total reputation 2 Balance total 3 Percentage people your hospital has handled 4 Percentage people have been cured 5 Percentage people have been killed 6 Hospital value #win_criteria[0].Criteria.MaxMin.Value.Group.Bound 1 1 700 1 0 #win_criteria[1].Criteria.MaxMin.Value.Group.Bound 2 1 175000 1 0 #win_criteria[2].Criteria.MaxMin.Value.Group.Bound 3 1 75 1 0 #win_criteria[3].Criteria.MaxMin.Value.Group.Bound 4 1 500 1 0 #win_criteria[4].Criteria.MaxMin.Value.Group.Bound 6 1 250000 1 0 #win_criteria[5].Criteria.MaxMin.Value.Group.Bound 0 0 0 0 0 #lose_criteria[0].Criteria.MaxMin.Value.Group.Bound 1 0 400 1 450 #lose_criteria[1].Criteria.MaxMin.Value.Group.Bound 5 1 25 2 0 #lose_criteria[2].Criteria.MaxMin.Value.Group.Bound 0 0 0 0 0 #lose_criteria[3].Criteria.MaxMin.Value.Group.Bound 0 0 0 0 0 #lose_criteria[4].Criteria.MaxMin.Value.Group.Bound 0 0 0 0 0 #lose_criteria[5].Criteria.MaxMin.Value.Group.Bound 0 0 0 0 0 --------------------- Competitor Information ----------------------- | Index in the away "computer" | Is that opponent playing? | 1 is yes, 0 no | Comment | #computer[12].Playing 1 CORSIX #computer[13].Playing 1 ROUJIN #computer[14].Playing 1 EDVIN ----------------------- Emergency Control -------------------------- #emergency_control[0].StartMonth.EndMonth.Min.Max.Illness.PercWin.Bonus 4 6 4 6 2 80 2000 #emergency_control[1].StartMonth.EndMonth.Min.Max.Illness.PercWin.Bonus 8 10 5 8 16 80 2500 #emergency_control[2].StartMonth.EndMonth.Min.Max.Illness.PercWin.Bonus 12 14 5 8 22 80 3000 #emergency_control[3].StartMonth.EndMonth.Min.Max.Illness.PercWin.Bonus 16 18 5 8 13 80 3000 #emergency_control[4].StartMonth.EndMonth.Min.Max.Illness.PercWin.Bonus 20 22 5 8 23 80 3000 #emergency_control[5].StartMonth.EndMonth.Min.Max.Illness.PercWin.Bonus 24 26 5 8 29 80 3000 #emergency_control[6].StartMonth.EndMonth.Min.Max.Illness.PercWin.Bonus 28 30 5 8 17 80 3000 #emergency_control[7].StartMonth.EndMonth.Min.Max.Illness.PercWin.Bonus 32 34 5 8 11 80 3000 #emergency_control[8].StartMonth.EndMonth.Min.Max.Illness.PercWin.Bonus 36 38 5 8 4 80 3000CorsixTH-0.63/CorsixTH/Campaigns/writhe.level000066400000000000000000000256301347163623700211270ustar00rootroot00000000000000Copyright (c) 2013 Chris "ChrizmanTV" Wilkinson 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. ---------------------- General Information ------------------------- %Name = "Writhe" %MapFile = "Writhe.map" %LevelBriefing = "The Ministry has, so far, been impressed by your hospital running abilities and has issued you another challenge. Here at Writhe, the citizens of this small town are in desperate need of a new, efficient hospital. There are a couple of new ailments that will require the attention of your psychiatrists, so keep your wits scalpel sharp! To succeed, cure 200 patients, accrue $75,000, see to 60% of your customers and have a $100,000 hospital value. We are counting on you!" %LevelDebriefing = "Superb! People at the Ministry speak glowingly of you now that Mr L. Bow, your boss, has promoted you. Just don't overdo the top hat and tails, the public need you! There's a job at Greyham Gardens Hospital with your name on it, will you accept?" Town properties InterestRate is defined as centiprocent to allow for two decimals precision, i.e. 300 means 3 % #town.StartCash.InterestRate 40000 500 -------------------- Disease Configuration ------------------------- When a drug is researched, what effectiveness does it have #gbv.StartRating 100 The following table contains all diagnoses and treatments that shows up inte drug casebook in the game. Known specifies whether it should show up from the beginning of the level and RschReqd how much research is required to discover the treatment room for the disease. #expertise[1].Known.RschReqd 1 0 GENERAL_PRACTICE #expertise[2].Known.RschReqd 0 40000 BLOATY_HEAD #expertise[3].Known.RschReqd 0 40000 HAIRYITUS #expertise[4].Known.RschReqd 0 60000 ELVIS #expertise[5].Known.RschReqd 0 60000 INVIS #expertise[6].Known.RschReqd 0 60000 RADIATION #expertise[7].Known.RschReqd 0 40000 SLACK_TONGUE #expertise[8].Known.RschReqd 0 60000 ALIEN #expertise[9].Known.RschReqd 0 20000 BROKEN_BONES #expertise[10].Known.RschReqd 0 40000 BALDNESS #expertise[11].Known.RschReqd 0 40000 DISCRETE_ITCHING #expertise[12].Known.RschReqd 0 40000 JELLYITUS #expertise[13].Known.RschReqd 0 40000 SLEEPING_ILLNESS #expertise[14].Known.RschReqd 0 30000 PREGNANT #expertise[15].Known.RschReqd 0 40000 TRANSPARENCY #expertise[16].Known.RschReqd 1 20000 UNCOMMON_COLD #expertise[17].Known.RschReqd 1 60000 BROKEN_WIND #expertise[18].Known.RschReqd 0 20000 SPARE_RIBS #expertise[19].Known.RschReqd 0 20000 KIDNEY_BEANS #expertise[20].Known.RschReqd 0 20000 BROKEN_HEART #expertise[21].Known.RschReqd 0 20000 RUPTURED_NODULES #expertise[22].Known.RschReqd 0 40000 MULTIPLE_TV_PERSONALITIES #expertise[23].Known.RschReqd 1 60000 INFECTIOUS_LAUGHTER #expertise[24].Known.RschReqd 0 40000 CORRUGATED_ANKLES #expertise[25].Known.RschReqd 1 40000 CHRONIC_NOSEHAIR #expertise[26].Known.RschReqd 0 40000 3RD_DEGREE_SIDEBURNS #expertise[27].Known.RschReqd 0 40000 FAKE_BLOOD #expertise[28].Known.RschReqd 0 40000 GASTRIC_EJECTIONS #expertise[29].Known.RschReqd 1 20000 THE_SQUITS #expertise[30].Known.RschReqd 0 20000 IRON_LUNGS #expertise[31].Known.RschReqd 1 40000 SWEATY_PALMS #expertise[32].Known.RschReqd 1 20000 HEAPED_PILES #expertise[33].Known.RschReqd 0 20000 GUT_ROT #expertise[34].Known.RschReqd 0 20000 GOLF_STONES #expertise[35].Known.RschReqd 0 20000 UNEXPECTED_SWELLING #expertise[36].Known.RschReqd 0 40000 I_D_SCANNER DIAGNOSIS #expertise[37].Known.RschReqd 0 50000 I_D_BLOOD_MACHINE DIAGNOSIS #expertise[38].Known.RschReqd 1 20000 I_D_CARDIO DIAGNOSIS #expertise[39].Known.RschReqd 0 30000 I_D_XRAY DIAGNOSIS #expertise[40].Known.RschReqd 0 60000 I_D_ULTRASCAN DIAGNOSIS #expertise[41].Known.RschReqd 1 20000 I_D_STANDARD DIAGNOSIS #expertise[42].Known.RschReqd 1 20000 I_D_WARD DIAGNOSIS #expertise[43].Known.RschReqd 1 20000 I_D_SHRINK DIAGNOSIS | Objects available | Available from the start | Strength | Available for this level | Comment #objects[9].StartAvail.StartStrength.AvailableForLevel 1 8 1 Inflator Machine #objects[13].StartAvail.StartStrength.AvailableForLevel 1 13 1 Cardiogram #objects[14].StartAvail.StartStrength.AvailableForLevel 0 12 0 Scanner #objects[22].StartAvail.StartStrength.AvailableForLevel 0 9 0 Ultrascan #objects[23].StartAvail.StartStrength.AvailableForLevel 0 7 0 DNA Restorer #objects[24].StartAvail.StartStrength.AvailableForLevel 0 11 0 Cast Remover #objects[25].StartAvail.StartStrength.AvailableForLevel 0 8 0 Hair restorer #objects[26].StartAvail.StartStrength.AvailableForLevel 0 10 0 Slicer for slack tongues #objects[27].StartAvail.StartStrength.AvailableForLevel 0 12 0 X-Ray #objects[30].StartAvail.StartStrength.AvailableForLevel 0 12 0 Operating Table #objects[37].StartAvail.StartStrength.AvailableForLevel 0 0 0 Projector #objects[42].StartAvail.StartStrength.AvailableForLevel 0 10 0 Blood Machine #objects[46].StartAvail.StartStrength.AvailableForLevel 0 8 0 Electrolysis Machine #objects[47].StartAvail.StartStrength.AvailableForLevel 0 7 0 Jellyitus Moulding Machine #objects[54].StartAvail.StartStrength.AvailableForLevel 0 10 0 Decontamination Shower #objects[55].StartAvail.StartStrength.AvailableForLevel 0 10 0 Autopsy Research Machine | Diseases available | Value property to be determined | Comment #visuals[0] 1 I_BLOATY_HEAD #visuals[1] 0 I_HAIRYITUS #visuals[2] 0 I_ELVIS #visuals[3] 0 I_INVIS #visuals[4] 0 I_RADIATION #visuals[5] 0 I_SLACK_TONGUE #visuals[6] 0 I_ALIEN #visuals[7] 0 I_BROKEN_BONES #visuals[8] 0 I_BALDNESS #visuals[9] 1 I_DISCRETE_ITCHING #visuals[10] 0 I_JELLYITUS #visuals[11] 1 I_SLEEPING_ILLNESS #visuals[12] 0 I_PREGNANT #visuals[13] 0 I_TRANSPARENCY #non_visuals[0] 1 I_UNCOMMON_COLD #non_visuals[1] 1 I_BROKEN_WIND #non_visuals[2] 0 I_SPARE_RIBS #non_visuals[3] 0 I_KIDNEY_BEANS #non_visuals[4] 0 I_BROKEN_HEART #non_visuals[5] 0 I_RUPTURED_NODULES #non_visuals[6] 1 I_MULTIPLE_TV_PERSONALITIES #non_visuals[7] 1 I_INFECTIOUS_LAUGHTER #non_visuals[8] 1 I_CORRUGATED_ANKLES #non_visuals[9] 1 I_CHRONIC_NOSEHAIR #non_visuals[10] 1 I_3RD_DEGREE_SIDEBURNS #non_visuals[11] 1 I_FAKE_BLOOD #non_visuals[12] 1 I_GASTRIC_EJECTIONS #non_visuals[13] 1 I_THE_SQUITS #non_visuals[14] 0 I_IRON_LUNGS #non_visuals[15] 1 I_SWEATY_PALMS #non_visuals[16] 1 I_HEAPED_PILES #non_visuals[17] 1 I_GUT_ROT #non_visuals[18] 0 I_GOLF_STONES #non_visuals[19] 0 I_UNEXPECTED_SWELLING ---------------------- Staff Configuration ------------------------- Each entry states how many staff members of each category are available a given month. The number of entries is not fixed. | A list | Month it gets active (start at 0) | Each group | #staff_levels[0].Month.Nurses.Doctors.Handymen.Receptionists 0 8 8 3 2 #staff_levels[1].Month.Nurses.Doctors.Handymen.Receptionists 3 7 5 5 3 #staff_levels[2].Month.Nurses.Doctors.Handymen.Receptionists 5 5 8 7 4 The minimum salary for each staff type #staff[0].MinSalary 60 Nurse #staff[1].MinSalary 75 Doctor #staff[2].MinSalary 30 Handyman #staff[3].MinSalary 30 Receptionist Salary modifiers for different doctor attributes #gbv.SalaryAdd[3] -30 Junior #gbv.SalaryAdd[4] 30 Doctor #gbv.SalaryAdd[5] 50 Surgeon #gbv.SalaryAdd[6] 40 Psychiatrist #gbv.SalaryAdd[7] 100 Consultant #gbv.SalaryAdd[8] 20 Researcher How much the skill of the doctor adds to the salary. skill * 1000 / divisor #gbv.SalaryAbilityDivisor 10 #gbv.LandCostPerTile 10 #gbv.TrainingRate 50 #gbv.AbilityThreshold[0] 80 Surgeon #gbv.AbilityThreshold[1] 60 Psychiatrist #gbv.AbilityThreshold[2] 50 Researcher #gbv.TrainingValue[0] 30 Projector #gbv.TrainingValue[1] 30 Skeleton #gbv.TrainingValue[2] 30 Bookcase #quake_control[0].StartMonth.EndMonth.Severity 18 20 2 #quake_control[1].StartMonth.EndMonth.Severity 30 32 3 #quake_control[2].StartMonth.EndMonth.Severity 42 44 4 --------------------- Research Configuration ----------------------- Divides research input to get the amount of research points. must be > 0 #gbv.ResearchPointsDivisor 5 ---------------------- Awards and Trophies ------------------------- #awards_trophies.CansofCoke 2500 #awards_trophies.CansofCokeBonus 5000 #awards_trophies.Reputation 2500 #awards_trophies.TrophyReputationBonus 20000 #awards_trophies.TrophyDeathBonus 10000 ------------------ Winning and Losing Conditions ------------------- 1 Total reputation 2 Balance total 3 Percentage people your hospital has handled 4 Percentage people have been cured 5 Percentage people have been killed 6 Hospital value #win_criteria[0].Criteria.MaxMin.Value.Group.Bound 2 1 75000 1 0 #win_criteria[1].Criteria.MaxMin.Value.Group.Bound 3 1 60 1 0 #win_criteria[2].Criteria.MaxMin.Value.Group.Bound 4 1 200 1 0 #win_criteria[3].Criteria.MaxMin.Value.Group.Bound 6 1 100000 1 0 #win_criteria[4].Criteria.MaxMin.Value.Group.Bound 0 0 0 0 0 #win_criteria[5].Criteria.MaxMin.Value.Group.Bound 0 0 0 0 0 #lose_criteria[0].Criteria.MaxMin.Value.Group.Bound 5 1 50 1 0 #lose_criteria[1].Criteria.MaxMin.Value.Group.Bound 0 0 0 0 0 #lose_criteria[2].Criteria.MaxMin.Value.Group.Bound 0 0 0 0 0 #lose_criteria[3].Criteria.MaxMin.Value.Group.Bound 0 0 0 0 0 #lose_criteria[4].Criteria.MaxMin.Value.Group.Bound 0 0 0 0 0 #lose_criteria[5].Criteria.MaxMin.Value.Group.Bound 0 0 0 0 0 --------------------- Competitor Information ----------------------- | Index in the away "computer" | Is that opponent playing? | 1 is yes, 0 no | Comment | #computer[12].Playing 1 CORSIX #computer[13].Playing 1 ROUJIN #computer[14].Playing 1 EDVIN ----------------------- Emergency Control -------------------------- #emergency_control[0].StartMonth.EndMonth.Min.Max.Illness.PercWin.Bonus 4 6 3 5 17 60 1000 #emergency_control[1].StartMonth.EndMonth.Min.Max.Illness.PercWin.Bonus 10 12 4 6 22 60 1500 #emergency_control[2].StartMonth.EndMonth.Min.Max.Illness.PercWin.Bonus 16 18 4 6 24 60 2000 #emergency_control[3].StartMonth.EndMonth.Min.Max.Illness.PercWin.Bonus 22 24 4 6 26 60 2000 #emergency_control[4].StartMonth.EndMonth.Min.Max.Illness.PercWin.Bonus 28 30 4 6 31 60 2000 #emergency_control[5].StartMonth.EndMonth.Min.Max.Illness.PercWin.Bonus 34 36 4 6 33 60 2000CorsixTH-0.63/CorsixTH/CorsixTH.ico000066400000000000000000004057721347163623700171020ustar00rootroot00000000000000 |v (j}@@ (B00 %  b  hPNG  IHDR\rfsRGBgAMA a pHYsttfx|IDATx^dU5oDGAPrF$ HP M&d$Jf@QDec`Ptc(I1eFǟ٧޳ks n###Jvj`!> d>>@/_?Ovu@;7O4~xq~?/|ۏ>xH;)s,r!C?9lߏn&dɒɤO&6h>nϫ^IlY'McRu]w2Ygu&Y{'ZkMxIyVptd; .__-`ˊ+hR#P.`{˗?Y1(h<u>Y,`0O0 ?_@pg|Kפ.vd(|#i+cy gU}n/$A([4U0T ~! |ng|* j0ƏysI?lKCT>|0XI2MPLcUAl U04L TzK'* \pafS$yAQ *KW y"D=&&i*0C h'(  jE: Wu` . / "YKx,{9ӋqM  T|K_zWUY!1_2|>^1F^Uykxl& 0WXP%(dg  X1h{kf'BQ B)q-"6 ـOHoȪ,:PjQe~NlOy<~z) "ui )^]KU ^⬺ ԑ']~:̓򳗫;K{ѹK/T]qꚫu7\nFu7[nEznSwq;4DK5tƟ& ^]  "3Pvp!4j?c7ꍺ zlZW g}uqY g4U[ 몱5#R1nԴ[9VɌEKFCzMcK$HHP%UP(Xe(H0@?*{GgjR׏8W\sj_sj] 0z ڪuFK5O98spC8 v@l%b3!tYg1oQ`a}pU҃U@.0YTwo?猨N$<6\sNk5cmp NJe8.lƹ8g9D }(&(L @Қl (2@ Md*,Y+ï0~ƝS{xs#&qs,pA@p@}8,xދs)B 90I@P d ҃E`?e ڋqW yBxgY.VWH6K/0lh. ] PUzpP (k>1" ck`45 䱙`&Lـa+,! hi[@fΞ " v *3{0oV00U0; V-Ad00 Wh  !A3 !DP`VbYYl +CP% ʄ }k zчin6#q $0X` f ƒH0ĄB8^dq* & ZS H?_8}^Ib.0p:4e gH`d ti&"@/@B^@Y\`fY^<~m?oKUmƟt*0Ь "}btIZ H4z ]i PTT( @hN iƟEE J#km˶eM1&6 0060`*Q$] يNUDA!"U>`)~Ն /^ KT}<x 5#h !A*l] `2*YmXCu =8K&D~y@&ȋu_jTw;H { "6 !K,[i>A@B^! Y79܎[P~ ؀;Uغ )ڮ`,jN)@ $0,tiphQG%ő. PW۫ 7ŋg%Jai k=7+PV t?54\|}uooq7͞I`w'xBv밶;`x0CM~ AX[ dHK AVd]oz|@pm00@/CPU_e|RbI5Zh{0lc^!}}ɬ~Mfh $m@`iRDh8ـqP2~ۺEB V2k=H(Pxm1 {m>o?5#SPm ܨxOIw1H[Mug E~Vc"! N!jäZ-#zZ0L -)S5 ZO /+4@Y"Rb1`kEh~#ٜTcy7׵-`ni g>0SGGB9.@&V CK,0,2pѴ5/C {4tRm d(PPLLJ ZS+bSv|?1zo|qѐ@LnnB5-`>` p6 y@p]wt۞9&>:["@p0HD@m \  s0q<c\ $A '2| 7|D\oA7+[ TDemI4ϊ(9y /s=T}Q]3>E@\шX}m4=mE`Sb^_޺eT{VƨYLt !( (h@{ V:K( H`Xͳ`0NFMڕ ?:;.،4IiCU@AHZPU6~_/c.c}ܔLEmBCE]>xoAXng;qN ׼5 [ C=?9m5rq.=slP)8Äl d BZgYr6(j54"[!ۣqN ^o1} Lk*  ~m+6$/_<9Q.GPAS{`X&s}szNǨK͹@ 1@ 3pLX( E<=Ș(4|im(*[;D|Or!]0(Ē5LPwXR(P5*(>Fo|'_f׎מ_Kn6j:+i{f)Bqy^WGVsaS^> ]2*hV`zN]!@䖞-~{Rsw ~ үg9p2w 6iX PuV,o7 5#0(1zwQ{uԇahE#/8-1;3T F < ~m ;찃z5<1Uf]^HF`فaY@Hm , GRt@P']Yoii eXjC5ރ+^<,Ȳ6P$("V E|wMת6bFzInjCT[zƮ0zf 8?oo,hgyfx@Ǯ1| mnmPpl Йfޅ(j%kO`?pXdrn'4@] 5)eA 2+PD, :'h/+ޯ5?LF-Q|j7~-u _ڧ#[l!W@9fL l "a0A_0VxxnT2|ڛQt.h^ $i}q(R#8fd(0UXW7 YI0(E _0 ?4_ )Skuj#p+ho׾> c3_B E@  7J1mT<2{p1o< e*vk B1"Nï; PS@l~ܭ H\tד/8\`QlmC,{@fG3/ J 1@GY0,~ћ[ouvWHy?1淄>ח=Ơq;h`S҃ ~'AB t  Δ8l&E>RC1jL sȪLt&{JT7~_7ϻ[NM\fgU44~7h2On Ե%gq} ȯ#Fg pQ-Ua(ˉmM@7PaOAӅ@PAw LWy @ 2[ xKY-KX"P@ b{?Z?X-C$H}~^~iMc;^/龈3 m?[uow v@ jdqTJl1fB qc#(2u1F >bX4IȬx&#  'wA),ςdRR% Q@??$ kӟ9'xb_M ~N㷼~h1-/݋Z1YjFx,& YBG- k'TmOaK(n{t0G5d$7@12$a@Vc%Y E҂`ve  3 d>^?K7_{wPh M9KOoewˠqہ%Co}{g`@< 46 Ar,aIƏ`L J1fX 0ǩ0fu)`lbun8()fexW`/p^(J<5|ᄏn[/# Gm?4H䳽ۥ7efCA$dw6r6DC)ӆ>`ln 87,:gԌT \b Y, U@W,lu`RF@lY]_O:rlPmnsx&u{޸[_6C^?Aa@xʙ@jiT#Am_,MuXnT],V7^[{xB7GuUo bg{S+{DmέSLeh14|ߏgY2bhS%p' w;$3 ~m x-=ҋtBF)iz`֑Uc],* VJ4ɚ0 0Y6  *;r@^?/bbPYE*+'64T2 2f5'V# -Ro/D'#&LJ.-SCÔ(ڠGjEke dj؋ܿ.¢6 U h1 `\5 # g&=Ser55ijYo{|hM'A+/?է{_#/T8?c. ?KQ(`tZl&`GFX3u[a)Z)N0XAYPS,g>Bg?}&}(?-:]. p8e6XsHd`ƅɌ(DMfRpZ@RypRJV"{aYӌ{ ?㽑"RZ]?,?;~CoGnL87X[m6hus) &`Zy^5f؞Fϳ>T5 TB`Q` "%8* eGI#&\F ƔLa5`0' qB٘/}߰Gz;?;(e.b׷i٣U~mlŝC6'u13}4t(sc"GH|,gQPWaP0@dVrhR {14$I o .b-5G{M՟UG_ K)c GFG'`k.%ǚ`J|aADhyP0&tY, `Eɲd R`>b`/*صh31|ǁ:&f -?WÏksN/?;OӸC׆cG<'ص)DcxFOo?cR-|(0/e> e2Da3 H H3-DB3l-Bشđl V% c (!@UO8CTk&u3?a3Lp3}ACc53|zhbFn؀ayuFރyfPtOA<48" Ԡk dmȱ]A%' iAv`t 8J}$)O0 my2Fo7͠fn' &Ɇ;ofiQkⱌaKwyn1 {-a@u51cB}Vj/au҈! X݃>3MC, =#l@ڸ0`؞=lbӈ=2W ߯lu/=WyRUMm#E ?VWO {|xw0s0Ϗӱ>S=b@!`V ZEsPR==*)1 ,fL&  \i3?_z}5~Dfg״NoUg4/yb_ˆm@H-A.9Ւ%K43<2]i(ENu8oC`OGpf2¡AfHO=,B8ǐD;P9z~Kr[\;ւE-&/-qci>gO8!2zWi;? ^\4( =`T݂0@tf(ʢ UEu=+q8͘va|4qa@RQ d O?'(vQ*˪?{G{V'=Tܮ,d  Ko?Ƙ\[=P;="ub2# ==3 j6U@ և9ۃ% pjw6r6 23RI(o@/@0YTD^?E@w#f45Wwz\K7\ ?$PTQt;A 7iGr,k!^A.1Ъ l@HD c6@:˂Ecdt4ò@*F!HL 3 ( I~y^? _G{cܡԴm.rWˎh^;[|?NŨz/ Vg0@/F]BaY@LPk1BtQPW:0IAzY B* A:--S!8p@Ay"x} M K*-KOTӏ)|!pip52e/nfĤ$ C3Јah:\4` M N( Nai DN6 by޿O9 Pzz P~b? 2{;;frtgY0C3`לt`X%B lQfg`LEGZ2]j M0Q)0+ИIPi nf=oVe66όΦ /q3,;[~9wݳu@7 08' `:!ޥ#'I!P=p%Vd Y^xA~]v%ؾm[:ëZ 5&(.l!TCcu*7=B-1POA0̌] @WAXE&`~D&KE3#hw`n:q V\>`A <ltVNm5k?GZ.9?i60 1]uQ`WL@c{E RL%vnG+ E\ pdfZ:@T`ҁ$!Lg DŽyf[T`c?M\ݱ1 ߜa i O=n$ ޿J7`׼E 3y2f8`Sq_H e4x 0->lDO"XhzkulLU X6P$H ƌVñtX[bN~3%@^D{a^z%HmÌThϕq ~w/Oj odkBKH䥰 +&]sJpqn w' apB}\PU#,z ϣ'Q~? _^{$,j#bXCtjP?X3$0@>pDO%̙?h0praQYp518؀T'LYZ ?_cY8!,v@PvLXaC_z|.`s0egt!۴\_kN[F?9T`A a@(#1aa@z] Zڱ0|bPñ_#A / 1! _tk0 6B79hqH`Ӽcƀ/ #hYGƂϣq:@G@Wg '/kR֠Ԧ(HɈss  y `B ED PEi!vm*¹ <O04"n X@{Ol1]3 |H~2:Z4(P T?cxFƟ>]`@ &?OϗǟwUW)R8 c]2'k`JZ? Tԡ2/ ;X U@/Y d1ۂ-U{6p4|}ik`V MvEc4wzT-. lT<.uڎ$sSZcv0",pӄ\@ Pt 0 t[(^ <cH, O^=?iOjc^q樮Bn y٣Bp`" p !@sZc8!݁r, ZI3$C~g6]A L!ЧЫ_U?M2~+|` b{'jWJ.k-5kkƶ 5g Ķ`jЄq0فIT$3@YG/j.g9hQtfo_}ji@{m!pAys@hc5u:Jh ( (4E93} s̫Ûv2@4' I( f[yR_3+h~L8Ϻǝ gUI$L55o<]i@W V v ]"`h.rSްfnY#$y0Mm@`{xx LY'@헞?o#᢭c>KQF~> Xq'#`;r'`{,$O%M^q!P6/Kzs>iWǚ ꪹ7F]a]@rT5% M JtU…@js\7X@&g($!V Lbd]ue \Y|+_b-fXyx#G|ɞXJP}=%Ԃ T̶NG7`hD%`"osyթ#dhy0@թ0?Cjv l (X" l AkPcLM˕94\"@D="ܷ0$q،G0 0 H6P$ GbH t1~@?Gx|Z2Lq~BPk&e>_-@p%pHk1\gt UTz.YAUm+~:a3A2JKE_V<:$=l-|o q6ﻖv&fz^Sop3P{#aaځS zT h"{@!Ppdb͗XY~{ *(E"z]9f{!ο|< ,&Gs]{=ւL{MدOXBZs[j追2\d.\/  @Z <aڶvrO ,[ 8jO}S:=ހ81:fn Nt?YuچUdڂa]:dpl s$XP#MH6@ U 8t _D|A;?,a_3:|%!Iư9jS{Zˀ.79?HeʑKB@ڗ`ϡ9C\OvaxC=7'ow_@6`@ ]`O?w1PtTL`BE)B ,cIb5]ٚh,ХK6lrJކ%!^3Xp, dx04j=l^  i)d77sm@2/n{wcJb}[7 ׊010&Qgv9I ,qFǭk)4@j6'r!Ax.M p @0dBYd4Ae5+x@w5Э:ӃTPiXJЪwUf 7g2aX_X8ĿfjL (VGj0{ f7 X^ r4 Ӆ,#~=ή!3Q S Z u:On&rEOGd@" p Z@BK,͕곖X P@m͚ 1 ? fdzD0O } .9 ZN-P`EB.DL`rS-p1I .@ވyob/&]~9\ Y@TdN(Áa44{)f@3 랞N5v)7?W!^_a!$xlC`-^jmX|'N%VL AO["af) Dk/[ Y(riYBV3U߾aK Sz&鰬y]% B]#73YF~׬C!~TQefDVIߞNF+d+751Akm8o(-qf U\a@eSR ϺPZ@G65ZI &vap@yf6 ݀Vo ~'1\ `L;IZ KD kWމ!8yhQ d*)浯 Xydh@~P]5, @,# 7[Lzf cb`Twpplb:tʝ H:oօM`5L@{4/,.* 2,4ƸH9L4mm˹;0z=>ku56~`[7]?PD34/ׁU@8d,e P i`c堘6Dg8A&Y`&  0%&-T!+,'ڴ]NN3"zbκp G?aۯl5YY+b-͢p\p%8ORR%f.SQxT6A w}w - a@T`(HlT |4v k!H0"fw{x$?ߐ'7)@f\ 0h`:_Q`sC`mo?@V1z̘hX\clagxXS3Uq1Srh]_(tٴHE?&`ab,[g% Xg@H: Ȭ9f^M뮻 *m- d50DWۢ*fP+`l<Ƙjl G-;"g5C0F4vXY ~B/^'Z+ @8O! Ӏ*Z?)ܯyIB liGxypRZ 8ZSkBn0vh>cT}?Qٶy\ Zۂ(Bkp-Nǂq_]Ÿ7'R2ЬR`Ȣ ޟ%S @< A}C:A;fʿ[$4B̀.HH|{hV5Au5266h#ߪ:6N;ˮZ]z7RcjװSc bO/S_]/LO?gZ H0  R "Y9 ,@ y3†! BtɏtPO?=jQvu;[wVnP`-W]nNuܥs:蚼z">SC?Eٯ5_o%_RO9% cM@^T080,[o XZA.t L+;d9' %0.x]޸dX9o=M;?{cUsU}zuDS=QK;?,O0Ÿ=  PV N9+`idjCoLJ C.E6brO"d01oS\~:3Nimv>.}]Gf 'B/~>VLӏ=GIv'J~ Jre|YY> ciBHJڡ=vs/2{=y;}g~R^\mxY .LtL*[Ưs/F?3_b_/+3//OH[Oj) dZg?`| Kp" \z@ tU `0UwvPCHy^51kB>Bu㭷ϩ[s_>?=!C+s/T|Y:eڰ=z]?_?!?z3_Yρ aΟSQ`y 󈀽, @yC^yt0 I H$Lqv`xbjeQjK ARgY,d ‚04ƒ6>]r#-B^N;\uB/Hv[Ϫ[KSwssλHwilZbsi8Ni }u9b,@ݿ=?Kgo0~N9^@/Sw4] H `:@00=dK+@*A6l҃bp GnBA'[Vx?9@1D46;@9Gb! 2r>3BЮaY46^DSڭFk|wtMA~E\y&2!lÏZ u|<~K-x#S~f؇T%$.Qi>5^$rOA ʆyI, oF -?xʷ/QN1hz  CN6`8bLշ.yeql!(YB0ܯ66 7ouʙhcKu>w v}SվZm,Xev&U3rW$柣ȯ;b+dz֨7q h# k5[`]؎ByMYgj !p {w5HuPCN ^xe/[8r ꈣSmjhb{bXP?:@0  ?(ӂPXpX04;:  t}sK4|Ӷ|F0<5`qu>ӏ t1RPMڨFHH/=17><#GA?Z5z6--cB4Q۩?RY[8{S0<(-8´)kޤ`1<`s$Xw~6 0-ٞ?DBcPC:~P xK}(/4Č?HHk p>twa74z.<48i  Ĥ뛊?R{޿Ym_{E^_L 7P42!TfUc=U z$4L (C0079-(g!:@-r|6mfh(2|3ߔ(g[bNh. 5 j:X ~OJSg~?`3 D.(wL( I +@ wyQZP 0@ G፰St5| u&4xgy" S~1CLeCD8X FSEGsioAVi~؟?(2ԟlDUo &w ) ( tZp -3P5Xwѩ',s5}j-\L96ѥ=<2Ɨw^~U4nuyqgt7 z2E@` hoIҼ-AJSL7@Ј@`! "`YHc_;if#<6A4׾<ۿY eIn >ZxVEkdo49ګ# )7:r `cU}f vEش+~]c~v՟Ʃ?߇@=, oZpP vXaX[>UHωtc4^Spz4OCeSy"1>cfly4u kw}kcUn+b[Ib,&a#Ҙ_G?sLl2~R7?S5 p04ryIB4_ VyoXjIO[80QmI߄HmuXk O=}t&]!u_ H0;QQ'>$VZO~'acJCi׬B \o~P}æF)K|m pL:  a63X]SSִ_G[;dOoU鿪@  aki) fsH ʂ@6 JOm E50gr"$A#/zz7zUw8CK.?9~6nDdPD2K sY\>@|+Bg1UIˣ{.&V E2 iFz"e]Fzw=,hӍFm FϢW/; 0OG}WP.vM+Y` xS[ ?ZkaǠ9#oT,PtIe UAg=\iKÏ0zO3|z|8/3̓ci;j f?Ъi%#E]TEi^?C=g_וG 6` N,|úŖ :oz={A񍷗i=(~} ìq Qӣť?`N9‚Q8l! ޟ2@7gVg@)Mdi`V8 ~ ST׍b=-c7ucq>fǦ?uK/iEcO<g`;(&yIm2~ QX R5(o 2*Xw-7v#W#5= 6Jx^4| _LՔ?`~nKcITx8@@cr/Tk p_h4*H(P @ee7i`wڭ,;ekog :?G1|_FOc8t20   \uU: @&}z7o{]OG8ē|QtAb^܎Ӽ27._Ja6aUkH:}oxxU!{~{˯b|'~H;Ə~Li~'0OO!E?_ ?f2( |A W֠}~_^z(24l&O1xCU?c8ߢk?] p@Vz)ԟO RNIP% Hʂ@6Rö @+.XɎ\'ip^|ᛍaU?HܢбTL4*,? '/B2 P% }yVmI ê=Qۇ)=ie/~KLѩvC=>\^Muyp ?Y@*^@6P&# VV3+Kx'T&0 t a"@0hf9`V$sLᎌ볼 ݗڮ1R hQj2?h?llB dh" *N[-Ft O )+Ous=W7138bc<Ëc}S{C#`mwm?>B`Ѿ~iqfeJ`U -YiJ+V<upm㶽y}k=4D 7O ~=!(q)ț3HeIZ?ME&mw@pV@ `y@/ =3[]v#2lI2r)ޥ"G)$S%݂zaeUK D`W@`5Ah4~s@`@0`|ӭ5 X Q#Zt:B'^Is H<'?(__> i`@ /#Sy_gUַGr)Mk08}XCC7nh= >ۛ[an [rYǿhܟVKNI0@5r,i}^#|߃Ï:Ζn B)ndC{P|ӇF4Fo@8PwFM?N4Ī?-U}$@؝R :ip* H3Vw<9tSv#]T]^{C`Cƺwk=Qѯ/ߏ)ٹ0!(7Y@!A60kԾ7?kMwF5^gƞcFu.:87=o5_U?\ <*2Zy^RO~]{p \C鍂ߕ3>0z#n..i<V̟5*0y?B@```A'$i1Nk?4 d7.q2R2^F _†zWiimE~Uo~s3<PF k̸Oo?Ǩ[Ƌ'}oue\i<2k?"y{0&r`-w}9}P|U6_Z_ZK9gOYLxtBPfi,`@ #(5^}?x@̮R\{;e q^pGc!?ŭҨoş/&/S,TpT@0U#R$7^<}Ǎq.Ha4T7~__H_U_2\e2O, AA/|(|3n{hKO/^'ǟWIU'y3D@)|RABu~P0%^S|i<PCL2|[2</?OEo?@,Yit0)5+ >X9>,9a obyO/_?sqj@cs QUPAx93\6 DU2 PVii6S0`ƣ['},?N0>?W    @ް W z2yiCjn>4N0k}.2|;W&o{)*oگl c.42`PF<1ܢϑo뮻77;ޡ O3al@0(fc7M0ȣ-CR{mK/ ߳3ehϟTMv)r7 R@Y|A /eYFdzgVoctxȫۆ{HOo= ;hϣxwx*?6a߀@!I'-;|@@k0ce}M<0w[ǼCCg/eK7onwԃ>)*?O64ѯWMzqO0 ,i4S0"2[b-0N \9=9KO3z G0,Wb]kѤe6E*.T@!A6PQrKЗšeqàc4rslϞu$M͉5/oaE*T^{@T`X@ /T |W {e}zs@4eYi>痆yDj*W/I `@  E''|r mr? 0}-{WA}~yb-2'd>a`ǰ}k/`uހqƁ%)oݫ-+mY!AU  j`tRh9gwxF@)=y0{|TMeSdot fFiM6#x1{ P~l`W4_1M~iq0RpOljsn Y6gB;po ~h6ϫR,Kd@,l(C/{A6'l)6P*5/"0*%@d ^)`p 1DoXaxOs K){Wx\ > 0l@Pn A{4G@ٌS&u׫ɭBoefJT ?o_V}Өo?Wx`|'S$ڲufE֜]-vhW,F3U?o.4׿D@| +K VU@{'>Pfq4@$kI*5U~Idn/l@PF/( Eԟlc$C  ׄj)JҌ?M/J /~@`*!25 N0~qj}a6.qUԿ0  /6PS{ᄅE%P g5te>M=y~_!\o6P^kIOhiQ;UXH2~;ϪE 1^$|j|#$l5NiPNO|JS XSs~x,/sUIW`|aa?|ՠ60z1Se+?U_?7 NI@aU"{}<|s>O:V/nzȬ/yrJ+K A@2S z EIn6exNm@RU/~Y1my}y?-_ @4H*A OX3,Jí굎eb~Q b:j"a E_{)[6 Vzi (2˓a*ĢvmxF{Wi> ;>U}>ƟydPz EDäUky5h~+Öaq*ƟKg6k  z~_;6z{fbXQj<Vo{^+^T/I  :,[,^?dl悓eXz-?oW/A@s }FU|P4  f -h'} EsK T yC0 Ýz׀3,Ժ*Y $! o0OEa"*<|k\xᅺDҲ @ ɊLUvo__J b.( W^yeP>2hLg{ 24xG>~bhB<',#B/a @JZjc7Wy " `m oX~6v p\T("PW?'}p:,XTӾﳟl3֥ g}Apj ogu@}~V?T-*"T C9"a1feAᓟd`)6~u&@8M7pn \^һ( |@0ohw0ob/t|;ȥr >,4|P`8qnc֨i(jϷ"A{!P4ey`ñ`P`P7l?wɮ8\,jx.zu >=/Ou_( n*ÄVUbvO*Az eXAU"b@p_?YH2 H~oxqW5oCaz0/0=Y*:kw{;k/.41 pP?U=i>h⧕$z` 7Gnsh08$"Q)$z30G"E2֯gu Cc T&d1^i ?Oԥ^.]?jy-h" 0k0= Bocn jH6^S~x*I.,۞czWUOj欙QИP6Cx@a(aX=;лs3?~Bl80^{}_$fϟ; Di +9HFWsx_r!j Wv+b -U[`um =- ̳q6Cfbzh.r(5}|=9gQd38aqi=~4(}<&k齢U5\ `&z)gP&,(eÄcͪ62GQ_mݦ;G,,ROPE/B{ GxF4oKw}cU|_ rڷ3Ԩ$Gvۇž}UH3UTJ׻S p.oE_p&l TU4haIݜPh~?㯦L`?_7I`v^\p$@?Ã^,Cg F_$OR0U9L`}{4~/@z?;w>`(`/0Y YЫ#[f}Eh~UJl8c{~G>D7,,q,6P4<("iPꕡ dfѧAK7o$:;1|x7%|^Dq=r˧N;>OO<3:l,*r8iǫ{;笳:igמL:kdYx,ZhufvYE>0/S}v77 :  IJ%HRxMqm@|NV̚x=/z 0hzgp <:p.縼+>GᓙƔ$0HXd_@( ƐyZ@ ky> ?}f=C$5[T;@xv>@x`+N8s O8KO81oNYz7{]P_0ƗKE<|t^u~ct[U f/ I~RJoU}NkmN1Wb>]ޞĹg*>(_cռ| >-ugK*5廮]s+|3p 8L|dԸ[IENDB`( Y/_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxČČČČċċċċĉĉĉĉĈĈĈĈĈĈĈĈĈĈĈććććććććććććććććććććććććććććććććuuu;;; - ()___˺---iii񽽽 aaac bbb aaa <<<0 kkkwwwd ...    ioiCMC3?3/;/+9+'6'#3#       ZaZ'0' $ 0 <L\`aabccdeeb`YOF<4+   ),)2N`fjjjjjjjjjjjjjjjjjjjjjjibJ,   ada - Mfjjjjjjjjjjjjjjjjjjjjjjjjjjjjjj`/  '-'5cjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjh]j9   fhf9iMYjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjbW  yyy0Oajjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjj  .1. % ijjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjj  ### - jjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjb    bjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjj- gig5jjjjjjjjjjjjjjjjjjjjjjjjjjjjjjV "Tjjjjjjjjjjjjjjjjjjjjjjjjjjjjh   $ gjjjjjjjjjjjjjjjjjjjjjjjjjjjF JMJ>jjjjjjjjjjjjjjjjjjjjjjjjjje Yjjjjjjjjjjjjjjjjjjjjjjjjj6  ( hjjjjjjjjjjjjjjjjjjjjjjj] EJEDjjjjjjjjjjjjjjjjjjjjjjj'  "_jjjjjjjjjjjjjjjjjjjjjQ  - ijjjjjjjjjjjjjjjjjjjg AHAJjjjjjjjjjjjjjjjjjjjC %bjjjjjjjjjjjjjjjjjd 2jjjjjjjjjjjjjjjjj2  /8/Ojjjjjjjjjjjjjjj[ ejjjjjjjjjjjjji% LNL8mmmmllkjjjjjjO   \pppoonmmlkjg cdc=tssrrqqponmS  .vuuuuttsrqp> $9$pyxxwwvuuts,  GNGb|{{zzyxwvu.  7@7l~}}|||{zyxH!!!  %y~}||{g!!!  ACA A ~|v  mnm + ~kR=  .3. 1 F h      ~|  )4)w            $0!!!  +8+z              (=!!!!!!  ,;,}                ,C"""!!!!!!  ->-              1J""""""!!!  .A.           6Q  ###"""!!!!!!  /D/        <T  ###""""""!!!!!!   /F/      CQ  ######""""""!!! 8H -E-          JI$$$######"""!!!!!!  !^mi* =?=svs+A+         RB$$$$$$###"""""" Hsrolc - H $Y]Y*=*           [8 $$$$$$###### .oxvtqnkL  j  Q %@D@)8(             d2 %%%$$$"""  \|zwtrolj,  {|{ 3 Z (-1-&3&               n+%%%A~|yvtqnkd   u   d ,.3.#-#       ?(7'1@0'N   y#  't  }{xuroljM  ]^] :        k /.5.'      n 3;2++*443322HFE330/     X    |yvtqnjj.   ~           q 2080!     &2&,,,MKI))(URO00,K    j      }{xtroljd !!!@A@ B              v G      N""";97~y}}|yur221c`Z&         |yvtpmjjK !!!                       :%%%VTO}y333rpk+++qoj$         }zwurnkji& !!!)*) J                      @775ECAA@>221xtp(         ~|xusoljj_   !!!                        m01/++*[YY{zwYXV""!a_\1           |zvtqmjjj= !!!363 T                         +FC@322ccb"(!            }{wurnkjjg !!!%                        &653,,+666==;# [              ~|xusoljjjT !!!!!!          -+,+_               ~{j.  !c         0-.-W               ~{xu_'  595/        2-.-P                  ~{wuqmV!  N         4...J                }zwtqmjiP  >@>% w           6...C                 }zvtpljjjhF   ?             9--->                 |zvspljjjj6  LML d                  ;---:               |yusoljjjd NTN 4                 =...6                 ~|xurnkjjj4# Y_Y U                      3---.                ~{wuqnjjjb) &                   q ' !!!  <             }zwtpmjjj2&  ;                  8).)***""""""- v           |yvspljj`& #,# n                       _ / 444131#/#+  !!! " b          ~|xurokjj/( )                   4252111%Q    t6"""1       }{wuqnjj_# CHC R                      )222!3        k#  h      |zvtpmjj-)                       %...X            Y  I    ~|xurolj]  rsr 8                    )%&%*              ; 5      }zwuqnjj+*  j                  ] J                 &W     |yvsplj] '                `  ;                   U }{wtrokj)+  585 M              ~ 9  F                   R|yvtpmj[             F , H                 ) Oy{xtrolj(*  kmk 5          _ ++MMM E                0* HrtqmjZ  e       } 0, " GJG@               8<  @jlj%!  $   E %+#mmm=             <M   :R 9;9 H  f  %oqo9             ;R       P ,   :<:5            :U   qqqS 3         AN 7        FH :        IB =         M= !B           Q6  (G'              ~V  6J6 ~     ~{xtmd\TMF?92# qxq@@!A!#A#'B')C)-C-/C/3D2        c ///aaa0 lll'''jjj |s bbb4  bbb```ɽ!!!!!!!!!!!! ---lll } 󊊊. '[wxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxĕĔĔĔĔēēēđđđđđĐĐĐĐĐĐďďďččččČČČČČČČċċĉĉĈĈĈĈĈĈĈĈććććććććĆaaa&&&  u2(@ 9@@@@@@@@@@@@@@@@@@@@@@@@@@@GGGGGGGGGGGGFFFFFFEEEEEECCCCCCCCCBBBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA< |||뿿(((:  9}}} AAA@ AAA@vvGnG*]*POP20/-+) AAA @BYBCUgjjjjjjjjjjjb;" AAA @C^jjjjjjjjjjjjjjjjM& AAA @2 ? jjjjjjjjjjjjjjjj AAA@?jjjjjjjjjjjjjjjX AAA@EZEejjjjjjjjjjjjjj% AAA@DjjjjjjjjjjjjjH   AAA@Sjjjjjjjjjjjh AAA@/H/hjjjjjjjjjj7 AAA@Ajjjjjjjjj_   AAA@akaYjjjjjjjj* AAA@";"ijjjjjjQ AAA@ F onmlji! AAA@4U4utsrpY AAA@lwlrzxwuJ AAA@XpX~~|{g  AAA@eneO|.# BBB@B q    D  BBB@W        K!!!!  CCC@]     U0"""!!!  CCC@ b   c4###"""!!! &! CCC@ d   z'$$$"""!!!8kW   CCC@X !Q!k{kc      $$$)bxsm5 CCC@*V) P\o\c   z)W' a   (L{upi CCC@ t     W]s\`  mCFBfed441K  @   ~ysmX   EEE@&Z%          1>/`_\B@>6B2    {uoj/ EEE@ ~           4E2[ZX|zQPN9G6     }wrkd EEE@!^!            x472NPL{    ztmj< EEE@||             $        |uoji EEE@b          &        |vpj`   EEE@nn        &        ~xqF   EEE@3_2{       &        j5 EEE@!S!    &        W"   EEE@^u^i  &         = EEE@gedXWUb  wog ,,,ހps        !r,3+(V%     zqjC ,,,ހp@x?        9      |tjY ,,,ހpg       ;      }sA  ,,,ހp)d'    "<"      m/ #  ,,,ހpllp   %<%      \  ,,,ހp*O*   (@'     ~E ,,,ހpB^B   +F+       Y+ ,,,ހp)c'  -K,       ~ulK '  +++ހpsru     /N. w     |uki  +++ހp%e$      3G2 B      {sjC* ***~~~p~         }-?-2K21#O    ypi" ***~~~p;g;       i*=*   : # ~vm?  ***~~~pi     E      yL {sh ***}}}p^x^    O(\       ' Hso:   )))}}}p$\# X8W     9 " > )))}}}p)@)tt&a$  6 (((}}}p0r/   0 (((}}}p6w6    + (((}}}pUT!m $k"&j%FA<7 (((}}}g 000sss  !!!z::::::999888777777555444333222111000///---,,,******)))((((((000ؒT hppppppppppppppppppppŊŊʼnʼnŇŇņņŅńńłŁŀŀ~~~}}}}}}}}}sssR( @ NeeejjjllllllnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnqqqqqqoooooonnnmmmkkkkkkkkkkkkkkkkkkkkkqqqŠNP '''ኊggg    qqqpppvvba^ a hru kkkrrrS|R      * kkktttTS   > kkktttSR   F  0]kkkvvv[#b"ooRP     F $ Pyr[kkkxxxPuO   !elkLL  3a3@I?> Q;}vn<kkkyyym     w PPN??< y   zrikkkyyyEtE        EGDZZXRSO ~   |ulOkkk{{{t         $m ,5+ i    woj#mmm}}};t;      9     yqi/nnn`         :      {a( nnnā:m8   9     L#  nnnā,q* 8    :   oooā(J(    7       y@ oooā/[.   $;#    |T) oooāl  (>'     {sjKoooāIpH       *A*      zqjF oooā7j6      7=7A    xoi% oooāl      +]*.A-%\#E(A }umC! nnnWuV       !G &V%    N # {  {si nnn}}} ^     S]      ~?vwo> nnn{{{~   n>JNJj     <ej mmmyyy4_4v 7UhUc   4  & kkkyyydodh  * kkkxxx%t#   ! kkkvvv(r'     z kkkoooa`dcgf + %    mmmM (((mmmJoootttvvvvvvxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxzzzxxxxxxwwwvvvuuusssrrrqqqooonnnmmmkkkmmmkkk&(0 "UUUSSSRRRQQQNNNMMMMMMMMMMMMMMMfff[[[r fff6z5*u) pXX* MMM̫nn     > MMM̬pp Q  AMMM̮``3s2ll    U3fp.MMM̰r  1w0@r? $r#FNE#H jU ubMMM̳WW      /E-?F<  zoCNNN̵}      ,5,+o*   }siNNN̶QP     G   ua#PPP̸gf     G   S( QQQ̸B@  !F     @   RRR̸9b8 #H#   s< RRR̺.o, 'M'    wR. RRR̸~  +Q+    ujB RRR̸gg      5B58   ~sf* RRR̸%n%     %h#*P) x 6 A {p=QQQ̶    q_    m fwg PPP̵@u?  Peoes    !8\4  NNN̳*V*XqWo  4  NNṈw   ) MMM̮!l v p d\T MMM̖ WWW ]]]\\\[[[ZZZXXXUUUSSSQQQNNNMMMTTTJJJR(  NNN^ȱ˲̲̲̲̲̲888666333111000000222PPPɱWWHHM6 222β  X  000ѲSR hPR 000Բhh 21 HSF!R st?000ղ    9E8)f& zd222زih   \   ~V"333ٲZY![  I  666ٲ@x> $["   o2 666ٲ̻)&  '^%   m9666ٲ    -E,5z {`(666زEC  ^  V Iu< 333ղyduu  ) +T222Բý| * 000б98*) XN   111VVV^ϱѲҲԲԲԲҲAAA@@@===:::777222111vvvCorsixTH-0.63/CorsixTH/CorsixTH.lua000066400000000000000000000105161347163623700170750ustar00rootroot00000000000000---- CorsixTH bootstrap code ------------------------------------------------- -- This is not a configuration file and should not be edited. See config.txt -- for CorsixTH configuration options. -- Basic sanity check that the file hasn't been invoked by the standard Lua -- interpreter (as then various packages would be missing and SDLmain would not -- have run). if (package and package.preload and package.preload.TH) == nil then error "This file must be invoked by the CorsixTH executable" end -- Parse script parameters: local run_debugger = false for _, arg in ipairs({...}) do if arg:match("^%-%-connect%-lua%-dbgp") then run_debugger = true end end -- Redefine dofile such that it adds the direction name and file extension, and -- won't redo a file which it has previously done. local pathsep = package.config:sub(1, 1) local base_dir = debug.getinfo(1, "S").source:sub(2, -13) local code_dir = base_dir .. "Lua" .. pathsep package.cpath = base_dir .. '?.so;' .. package.cpath for _, arg in ipairs{...} do local dir = arg:match"^%-%-lua%-dir=(.*)$" if dir then code_dir = dir .. pathsep end end package.path = code_dir .. "?.lua;" .. code_dir .. "?/init.lua;" .. package.path local done_files = {} local persist = require("persist") local save_results if table.pack then -- Lua 5.2 save_results = function(t, k, ...) t[k] = table.pack(...) return ... end else -- Lua 5.1 save_results = function(t, k, ...) t[k] = {n = select('#', ...), ...} return ... end end _G['corsixth'] = {} --! Loads and runs a lua file. -- Similar to the built in require function with three important differenes: -- * This function searches for --[[persistance: comments and maps the -- following function into the persistence table. -- * This function only searches in the Lua code directory -- * This function is only able to load lua source files (not C modules or -- compiled lua. --!param name (string) -- The name of the lua source file to run. Use dots to seperate directories, -- and do not include the .lua file extension. --!return The return value of whatever source file is opened. corsixth.require = function(name) name = name:gsub("%.", pathsep) if done_files[name] then local results = done_files[name] return unpack(results, 1, results.n) end done_files[name] = true return save_results(done_files, name, persist.dofile(code_dir .. name .. ".lua")) end -- Load standard library extensions corsixth.require("utility") -- If requested run a Lua DBGp Debugger Client: if run_debugger then dofile("run_debugger")() end -- Check Lua version if _VERSION ~= "Lua 5.1" then if _VERSION == "Lua 5.2" or _VERSION == "Lua 5.3" then -- Compatibility: Keep the global unpack function unpack = table.unpack -- Compatibility: Provide a replacement for deprecated ipairs() -- NB: It might be wiser to migrate away from ipairs entirely, but the -- following works as an immediate band-aid local rawget, error, type = rawget, error, type if not pcall(ipairs, {}) then local function next_int(t, i) i = i + 1 local v = rawget(t, i) if v ~= nil then return i, v end end function ipairs(t) if type(t) ~= "table" then error("table expected, got " .. type(t)) end return next_int, t, 0 end end else error "Please recompile CorsixTH and link against Lua version 5.1, 5.2 or 5.3" end end -- -- A DBGp debugger can debug this file if you start a CorsixTH DBGp client & connect -- it to a running server, using this CorsixTH startup arg: -debugger -- Enable strict mode corsixth.require("strict") require = destrict(require) dofile = destrict(dofile) -- Load the class system (required for App) corsixth.require("class") -- Load the main App class corsixth.require("app") -- Create an instance of the App class and transfer control to it strict_declare_global "TheApp" TheApp = App() TheApp:setCommandLine( "--bitmap-dir=" ..base_dir.. "Bitmap", "--config-file=" .. select(1, corsixth.require("config_finder")), "--hotkeys-file=" .. select(3, corsixth.require("config_finder")), -- If a command line option is given twice, the later one is used, hence -- if the user gave one of the above, that will be used instead. ... ) assert(TheApp:init()) return TheApp:run() --[[!file ! Application bootstrap code ]] CorsixTH-0.63/CorsixTH/CorsixTH.rc000066400000000000000000000031041347163623700167130ustar00rootroot00000000000000// Microsoft Visual C++ generated resource script. // #include "resource.h" #define APSTUDIO_READONLY_SYMBOLS ///////////////////////////////////////////////////////////////////////////// // // Generated from the TEXTINCLUDE 2 resource. // #include "WinResrc.h" ///////////////////////////////////////////////////////////////////////////// #undef APSTUDIO_READONLY_SYMBOLS ///////////////////////////////////////////////////////////////////////////// // English (U.K.) resources #if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENG) #ifdef _WIN32 LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_UK #pragma code_page(1252) #endif //_WIN32 #ifdef APSTUDIO_INVOKED ///////////////////////////////////////////////////////////////////////////// // // TEXTINCLUDE // 1 TEXTINCLUDE BEGIN "resource.h\0" END 2 TEXTINCLUDE BEGIN "#include ""WinResrc.h""\r\n" "\0" END 3 TEXTINCLUDE BEGIN "\r\n" "\0" END #endif // APSTUDIO_INVOKED ///////////////////////////////////////////////////////////////////////////// // // Icon // // Icon with lowest ID value placed first to ensure application icon // remains consistent on all systems. IDI_CORSIXTH ICON "CorsixTH.ico" #endif // English (U.K.) resources ///////////////////////////////////////////////////////////////////////////// #ifndef APSTUDIO_INVOKED ///////////////////////////////////////////////////////////////////////////// // // Generated from the TEXTINCLUDE 3 resource. // ///////////////////////////////////////////////////////////////////////////// #endif // not APSTUDIO_INVOKED CorsixTH-0.63/CorsixTH/CorsixTH.vcxproj.user.in000066400000000000000000000005451347163623700213720ustar00rootroot00000000000000 --interpreter=@CMAKE_CURRENT_SOURCE_DIR@/CorsixTH.lua WindowsLocalDebugger CorsixTH-0.63/CorsixTH/Graphics/000077500000000000000000000000001347163623700164245ustar00rootroot00000000000000CorsixTH-0.63/CorsixTH/Graphics/file_mapping.txt000066400000000000000000000022261347163623700216210ustar00rootroot00000000000000--[[ Copyright (c) 2013 Edvin "Lego3" Linge 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. --]] -- This table specifies the custom animation files to load. file_mapping = { "plant_anim.dat" } CorsixTH-0.63/CorsixTH/Icon.icns000066400000000000000000002727201347163623700164440ustar00rootroot00000000000000icnsuTOC @is32s8mkil32 l8mkit32t8mk@ic08is32,),*,2420.,($%k  !-J  **L0 ,c -& -G-=  -$"2 -" ,7 ,+"  (N  +Q*p (,),)+122/-,($%u" !-pg  *怄q&C-pgi{u3 -ipB-咙M.om8 -t|Nys. -ԃ^(@ ,~J ,V' +\\; (uL_`& +wiOE'p(,),*,2420.,($%k  !-E  *$H*  ,a  - -B  -;  -3 - ,2 ,+ (L  +K! p (s8mkJXUWS\HJWVWWWWWWWWWUWGil32 &D=?=<;:976323.9)t9E?@?=<<:966/FWo  OID+ >   ASc   ?/Y    A !  Bo2  C  Cd   DQ  DN E\   E   E] #  E #:`  E[q#!  D{   D| C  C7  B @;6  ?   ?     ?E s  ?r  >+ AۺB   = n  Y% g@ICDCB@?>A:Xl%C<>=<;:976323.9(w=I@@?=<<:966/FWiO{bBC$ >z:  Astx~?   ?vtc]0.R+   AqX[f3cvlR B`IkELtgd1 Ccu/{n`R Cla{rhW DგW}nA DΈ`~( Et_}g1  ElazrfA E[?yj`R ErAG^pgb  EnsmLy4lrj;  DӐ}oAQ D|g C_t}W Cdu] BQpH @;]WZY   ?IaT_C   ?H^X[V^'   ?gQYTYY[P ?y;eY`ZZWb3 >ZTNMTYVR5 AֻS!   = l  Y% iBJDDCB@?>A:Xl&E=?=<;:976323.9)s9E>@?=<<:966/FWp  OE?'  >  APb    ?+X    AZ    Bl  C    Ce    DN     DJ    EW  E     E[ "    E =h  EZn  Dz  Dy  C  C6 B  @;2   ?  ?'   ?C9  ?r >$1Aܺ@   = n  Y% g@HCDCB@?>A:Xll8mk*3122222223/9!!+223222222222222222222222323(it32   6?<=<;;:9877665322/.!  \ V`?IEFEDCCBAA@?>=<;9987896H! G@ X Fقڃۃ݉މ߇G    = D    ~% V߂F  ,d ߂ H    ̛ E    L    \fgmqv{x'           ~!      i      ^    T     K      D    7=V<      FT/         !)          1       m b6                  ?                               k                    I                  *                          a                h!        >           4        |    2      y      1       q       }       j                 (        ;       S          &"    u           O             J        '     G  #/ Y        %,K3 ee      E "Eh     4r5soO'    N  'c6H        ;H"D    (\ Lp'0%<       % Q #     $iO       Q       W    <m                 }       x      s     n     h     q!       f        |J      C       )     z            w       J              [              >                  `                  `                   b            ߁%      q      ߀       ނ>     ߂     ހ߃w      ށ߃      ݂߄    ܁݃߄    ܂݃߅ C    ܃ރ߇_    ۂ܃݅ߍ ͥp>   ۃ܄݆߉αzX@0! ڀۃ܅݊߃ 7   قۄ܆ݎB  ڃۄ܉މ߁߂ ? فڃۆܗ݂ @  i׃ڄۈܕ݁? !ߜ4؄مڠ? H ܀܀݂݁ޕ߁< RҀӀԀԁՂՕ B   f9D8';<=><@65 T    6?<=<;;:9877665322/.!  \ V`?IEFEDCCBAA@?>=<;9987896H! G@ X Fقڃۃ݉މ߇G    = D    ~% V߂ F  ,d ߂H    ̛  D    O     blkpruyu#     "'cNSMKGEAHH@:51-)%#     ~W~|xvpsY      lRw||{zy{zyxvusrrnuW&'     b]~|zxxrzX)'     Ya}|{yxr|W*'     Rf~}|{u~V-%     Ki}}vT/#    1:[FoyT2     B U=xzS6     - X;|S7      Uv?9$$~T85          B<2xi9v|yvtqolifc^[YW(    1l?R 'z}{wurpmjgd`]X^B     )[3{'!\zI <~|yvspnkhdb][XY(   ~$1L68( .l}zwtroliec^\V_@      uv-% >p}{xurpmjfd_\ZYY$     W>0XO~|yvspmkgea\[V_=    )-Q~|zwtqnlhdb]ZYYX     d.a-}zwtroliec^ZZV`:     :g)\ /~{xurpljfc_[YYXZ   ~8Z6%~|yvspmjgd`\Y[W\;      -w/V<}zvtpmkgd`]ZWY_R     xH-RB}zwtqnkhfb[X^X6  +.OG}zwtqnlic`b[;    u O,MM}zwtrpjfjdB      ,!+JV}{xvplpmL      ip0HZ}{wrvuW$    y*E\}{x|b-   b(q)C]}|q8   y<$A`{B   )~%>c|}d3   %m#=e}z{l@    6Z)=h}zuvtR*    NA&;j}zxsptc9    )~(:m}zvtqlmkK&    -[)9n~|xvspnjej[2    vQ.8p~{xuspmjgbaaE"    !48u}{wurolifd_Y^W3    LK-5n}zwtqolifc^\WY^J    #9~~|yvtqnkhdb^ZTa$   EK.w" E~{xuspmjgea]YZX]F    -B&X}zwtroljfc`\YYXY   CJ,A5 ]g~|yvtqnlifc_[ZW^6   0w*,K6 kd&}{xuspmkgea][YZQ   @H7\%Im s~|zwtqoljfd`\ZW]"  M[;u5usT'c}{xvspnlhec^\W]A  DG8[h,f8Me~|zwtromjgda][YV   D wD% Z#CH(Dv{}~~zwusqnlifc_]W_-   FV)BFlKb)3(:f(_xzwtromjgeb_Y]F     Dg?KLe($&gz& 1nvstpnkifda]YX    >e}|6HMmdhr-Gvxoomjgeb_Y^.   AUu, KOl. #Zvniifca[]F    < g QPg-$ 2foddc^[W   9=fP~c.%Gie^Z^,   Q|^/$$Wa^F    8RzX1# 7T   ~S~xS4     yS~~|}wM3    tT|~~}|zzt~I1   pV{~}|{zwxr{F-    kNw~}}|{zyxwuvq{A*   oUz{{|{zzxwvvussmt:"     cPeyyxwvvutsrqrnx8    wG pvuutssrqpok_Y"   ;%|pusrrqpopkr9      ,Uxnrpoonmmjj   u5}hpmmlklhnO     *yfmkjjhidl=     q/vckhggefak8    H=qage cd_f=    ^dcbb`_\`L     Vm[c__^]]\\X\       W] \\[[ZYZW]E    9,eU\Y ZW]!    _UZY ZX\I    B^WZYZW^&    [dT[YZX[M    XWY ZV_.     9`VZYW     \cU[YZW]@    WXZY ZW]!    8`VZYX[N     ^cT[YZW_2     WXZYXY    ߁#7`V[YZW]B    lcT[YZW^#     ߀SY[N     ނ9.cU[Y ZW_1    ߂ZWZYW   ހ߃vSZYZV^3    ށ߃ =A_WZYZW^6   ݂߄  x41]Y\ZY ZW^(% ܁݃߄ $^b\UTUXZ[ZZYZXV9^Q  ܂݃߅B'ObdaZUTTUUWXXYZYXWXZ^aM  ܃ރ߇[ ,@Saecca^[ZZYXWX YZ\]^_\RC'  ۂ܃݅ߌˠnC+%39ALSTVWY[\[ZXWSMG?-   ۃ܄݆߉'ˬx[G=2.,)'  ڀۃ܅݊߃$Ǽ4    قۄ܆ݎـD   ڃۄ܉މ߁> فڃۆܗ݂ @  i׃ڄۈܕ݁? !ߜ4؄مڠ? H ܀܀݂݁ޕ߁< RҀӀԀԁՂՕ B   f9D8';<=><@65 T    6?<=<;;:9877665322/.!  \ V`?IEFEDCCBAA@?>=<;9987896H! G@ X Fقڃۃ݉މ߇G    = D    ~% V߂F  ,d ߂ H    ̛ E     L    [egmrv{y'          ~       i       ]       S      J       C      7>V<       FS.        (            0         m  a7                   @                         l                   J                      *                                 b                       h         >                  4        |      2        y          2          r          ~         j                         '        ;         S                    '         u                   O                    J         )      G  '3]          (,O7 hk        E   "#Kp        8z5wwV+       O    *l8O!           @K$K    (\    Lp   (2&B         &  Q "%        j  O         Q           W       <m                      ~         x      r    m     h    q       f       |I      D          (       {          w     J          \            ?             `             a         !    c         ߁&    q    ߀     ނ>   ߂    ހ߃w    ށ߃   ݂߄  ܁݃߄  ܂݃߅ C  ܃ރ߇` ۂ܃݅ߍ Φq=  ۃ܄݆߉α{X?. ڀۃ܅݊߃ 8  قۄ܆ݎB ڃۄ܉މ߁߂ ? فڃۆܗ݂܀@  i׃ڄۈܕ݁? !ߜ4؄مڠ? H ܀܀݂݁ޕ߁< RҀӀԀԁՂՕ B   f9D8';<=><@65 T t8mk@ӂ0:;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;<9@002u#r/^2<>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>=>9*~.Q!6Mic08PNG  IHDR\rf$iCCPICC Profile8UoT>oR? XGůUS[IJ*$:7鶪O{7@Hkk?<kktq݋m6nƶد-mR;`zv x#=\% oYRڱ#&?>ҹЪn_;j;$}*}+(}'}/LtY"$].9⦅%{_a݊]hk5'SN{<_ t jM{-4%TńtY۟R6#v\喊x:'HO3^&0::m,L%3:qVE t]~Iv6Wٯ) |ʸ2]G4(6w‹$"AEv m[D;Vh[}چN|3HS:KtxU'D;77;_"e?Yqxl+@IDATx%Gu.Z'&hFY,BB`lL4gmy5a\þ(40ē WתNUw}Ι ޵j媮U]]OOl z#qǨlRMR1.%r幹:b333LNװcksiV4ؖVRoӣX../Sy `#_cl ?-t!R2)\Ng^R,v%U,wy^;ؾ$l\b@y8j1nJnM:(QuG/N_wuk,c|\wdrMu7㩣W]%[Ec]U4N5'}W_}g?cnzd$F2l$Sm~y p(7zJ`VlS>7hS_pU]MO5UdzzU{i{~_|>t(66h@_ <;L9|ɚ)t˯M𨾟)yuAFMtUTW;GS nϞ=oM7t/a6)ʕ+9r0409 ?wg&T4(5Xw˯zS8?n KNvk_r%jU8EKr&Rocq9q9UXGy\p_'xq__} c/So˿W=9z(LL|VprܚDw0sM}Kz Sy7eS<)\,cr,_b}K=ӟkn?}qW_ve?opoߴ\:b+9Nv|SNŰܔ"cnQuHvxF6[:}uMclY8c׫^^~g`V>pg>}c۠λ#ȑVk#˩48nUOBY|a,UGo xR8O)~pJ 5lذ+ⱍ7zk^s~/N }n@= w\uUsCXSmʧW ^}RߚuOfQOMmޔ?ŗY݄S<)\,g)|-y9\y:صk]tiy!]c1Ϡi8۔_^7[bW6m=)^mn*JKJRFnbuԵmr-8?]}͚5//QJxܟvsR7Hj5QnxUά]+`̭ ꧶_799|N7_ yr̟*2ll@JRp?E[l?3{/ ,3XATb *y]ׄG_;m]7hn)֧z*S_TwUޔ7ŗۊyRzbҡ<1MwGk@_7?DS6ma.) pZc9f]kҀMxh)yؘ4h!ձӭ=*ZW͛AywT.c>ƾ5e^ʏ.aNWXv;wn-[ԿW)%Tp;xI!oS>jW5"6Vst6U&ʓUK)IS8+1-[8cƲ5s=!_N, p𣃱J׼-5ϦtZ=/'ڷbl(.֫xMMu䭾O^dM± [p,xOZ~ȏ, $uYwUӄWMt5*ZygI}y/e3Y>S)9yRS1O\NX\HMqC,c. )V& _7:U_5ȫ1_ʺY]q]sT;7Ց+ԧ>`e0~+z-,2$Y*6!k/Z5F}ZKTkW.6[o{|,xvb=XUpʞV7X%B,Ç^%JpaMxi&z!+G[Uwźn:UG,çIp9ضK!Nc{UUsw rNAςN)p}G8>x ~ʃlk#<~\kjf9'F/Aո~@> A,.66x,= u۲LrIV.NkMb[zro;^Ύon`x =ۉn^w>2 <$ 0 ;4?T^5?]m9ݓ =7Z`)" rTHcm‰SQ%`L1-WV#z=J:=-Xl֜_]>ك8h0(5Y8ł4,^ h8x`v[k!|3ۺ]lYݱyOLVc~[Nr Vn`>MRu.蠍|O*ga-sN7=vcu%v@&li4SG°b?4=eH&-N1m6L%bX=-Qn8]C^qY3"iΖd-Jv1:o{?B.m{fRwk7_U|f#xS8 D!v@x `]ԧzl@ ;p,GTZNlHq̽-:]Vޜ\ܩշYw}6+Px׀eQaOwgWa>Q_dQ-R)X&:nUbZ\z,ٲL܋LNw[HV1Gdyc>Ҫ䯣+O>jw%mr| J9cKƘ]iSp4((}"C^0`?*,sրO^A AE= I-=UVWUe.Vs]YSѰ5^"PE#o|S1ifͤi|&T^9tYq= ; rܷrCP*KƶsQxG 6l&\ol\VYr URh&:Թn:/e;#܉'%O|]ռW|; y{%sD/>u)``9(cfG1Ķ #;O]Pߐb4rUq9Wb=TfmY+Ox@))*(yxM_MRw.Y= w\sM5vMr7~{[9<-:r˯;bęM"R=) [a7 '^JT0]LJ 90vX^XniQke--O /,`g*6Iٵ^7kŲ^t>g 7.Um7.]r%oUԖcX޾}{!@)i2tCd*\rƥ,tAdg GmA@A7B)@֧.6N_5V\2VQ7j )nԛݺx /;c1 _|-E@ ڐs7<~$Т@eHnC]A*g "k@d^:+D^^R3',KƴDRYqY] ( H+m^E#bMvtU_cJ-ѵVȳ&<邸:iЭzͨ[ :?ϸg?lJm#Pkq aj-9t116#S9̑?of6ODX-~jjڵ޽qA.tf|q`+c?7T:@i \ESN>WQK=):V&tcnrGgׯpc&NpnN7/;R+q<{h{O1׽8pٙLيct DyF=% E,A9>kUԾ/na5y[<#hj)Y]% f*+/>kYv+_ 9^GRQJџ*,oVԧ|uȠ{(*Ar?e#n-fCw`8-8 ^w`}T;9"0x'uӁLL"C]!1ـ!J <+_@7Ht8OsKo4[Cg97vf]}ȱ^b)_2cSoم12W2RE:zbӣZi{^Ykއ#?-0I6LNi5_VA0u'hZ8?]3>򑏸?}k_ݐz}_ַ%Ago hZ@TFP .yJG>؋<f)EAO7"If B]/x@^1= L@< P,=.S{+|I7.!׍#~![qNNRe7)m)J,s*߬}YBJqJ^ӄOL9} Zͅ7a^ϋ2 JbpBl??y3+oO|A78@ g`\\Z ڲ)UЋL.~ե]IrS#ꯓZ9?я[oU^l0 AF BAN$?֢/rCgoM{pG+ <]w% >wm:蠴0ޅIC#o@|PGa${G^^"ë8e]2Xc7d(|̠_f<蝃8wCۯ=~0!s@Kb4GBA,Jfw;ܕPBc,\b Mi JUZt*hU:JV5iKus~5YX;~ BѶ_L8m܂njw&Խ8jίk--L |V[SaS!_ +#` <2 rs{ ^d줱1GG|Pp_ъB:""\td-#N?NG:pŭ,`ߔcP2@KmҝE}5>@PJW G@\f+J/誳)3{ڌxbFI_Tڙ8Ntnɛ-8y;B7~^$OT6d #<^AD2PHgw4:: @=/qkn`-HPAm.ר(oWZ^Y\"̪A ᦍUYc\X8+~@c+-`jJ/yMy:j//-z&4$l6v<$iAmF+(W$+nTs8VBKB`0*X<*G'e/HAG'@|,#/Ȥݔ- k@+܇E9⋨: Cl,#&B ۀAJkY-0hgerr8 J *[GoʣuEyą?>~;#gliCjp ~&#$܌ -N x mv=ߟSJJ:YB&| i"]ِSJC?lPT:cNC?_|`UVIq!P['3槶|c͊bdBA'x],57N)1)4E;ΛX> re+ca>: ' xs15]#l ~žZȰHjtCzQtNǥȳ! Dmrѯ>#_V (_KDĽ\7) M\C/0AgRn,K,3 U Ưv> t΢ּ/K973ToQ8 ,j[ A_+xOGmI6} %˔DX8ku3uҫ0'C*Zz]_뮓;xǟBt&it :*Bp*T 2@v\?9'+֭s۟ƿ8fλTL%YHL`4̹yXțeƍoµuJp%WS? 1'mf%6_"ޙǣ,(Ŝ sQ$yP`p fۊ;Yf \U^iI*; sGGwE9$Gj H%A%;G=a!%nדn;d{ n=nwq^Je5h!n< 3Cu{ G{pek׺wNNrcH vWu, ^ A,3˝ e`͝@ }X [.}[_ t+ca+[n܍H@PO4V$l\__7sGLa&JyQو`(X-N}V6(něKf_3w=1qF7ss>MǴ<tMkM[Z9DE2f{{snbvyk;pI77"]_G/SuӵL;tHg1/2 \LyZ6#0OifdV #49r*?dz^]Sw~Y>1o_KS v61sBA {aA`M0<I7'L?8¯Um7)=#v9#]1785ǡTxb7{&pK o7?gz衎 m۶n _dT̫ >DߔQ>q@ *"|mc'Q@"peO(?r9puAt}j^i9[*;[#P;cQ' *,#3B cݚs{p۸2tln{όы3of]7SmOvvou[vu>߹w<8˕xX 6dϴ'9~mrEZ Iyǫ m7<)Y(* 7)N>v |P[2\LON[OR3NMtYİS)9~蕖~UWk k0=U"2m|PDq3pN^?{dJi&G}{rnWP&rׂr{3~9<#nd `r=vgcd#M WVWŖ}xD'"goaAEļ~aпKcAX|PXXcuUGUN[70^[;mXAޑءɗv߻M>8vydu^sf:0pl\[Qx?W"ƍRxN/`QW.!"G%צ!LV?B]U9L0\Dۘk o#Э^ ӟTj“q2Ie?*ZN\:?ǵ6p4ċ;FBN!8"; rq?aWm;_b `J'xZ;iwLٹY72;ZC{Xvz?WÍFxUM^< zHBn!qԁ@lsˉG`" e1_L a.~q?0Ytww6%PPr [KQ4᪔ ʜ\OU:&tvvrt<.Q\dFRR1J&ԁYtUvt-Gl|`DKHǿv`9֭Y'oapguH.ٷ͏=n 0}N16%YW{'[gH!ZG8ClG !gR݁8K_&GvMcбذ<9d %*44sz *Zlٲ}ojc_LC V4s SqqI 2ď-[X̉׎̲YfqA|H1ni_Sn!ᚷ~;m?19!ϞYEs1;:Avr 8cD?_+(W~b8ea3(ۛJP",' ,`k`3{`IT5 JK`fʻS&gJ_t&K/Uy]?\//;bUHW,Pp䎪 a5x#Ѳ Npksc};larmA`ݏGu⌑g`QmPjL3G  ҋF~:ɇ&(V K;qݽ|9PR82 -s~|bfr99ulY7 wW%İJ(Nds`_5~b1 A+Ϥ8WP_euj$kWBx8V?"]ezM(fhP,@m  N)gbctz "u8OQV׼ӷ˃|Y/6g?Xl`Li[X-lƽ/B ~^;uFZdIe=4y<;YHr%'*.vc/+*@XوŻQ~38"c/6RW{@}6؛/VExOdJ'IdH 0פz̜|L4DYCP~w/d#XUtΜ&X{]4Z\ݧkʙQP8v d&":-! j0P1cJD66E~+?\`z07QFCFQM~-=!(lϖ6UXST" An;KCpJ ݵ+Rn*s ڳ}>έlav|CGգ:ܛx&-(S/9+9ݨ"N-oΕ~Snd Iu) y (i#NX:q(NA{A1|WP1)1(  e[_lv˟ҡ!E\K t*+MoznGǵ;/u7՚0EUOlhΩQt쀏T_.LyaO}$QW=XmJo0P ?T,dܧG C*jq [sW.M\ t)nŘm[ru"oWs[fSߘu{alA}V 6 e b OpjPe(ZYi-? eL^7O :_7ya aY|D.jt呲ψ H^Odc\,:x7 ~OfRDŽD[Nr ~1_դ'o XZ?|Au&c} R(Rƅ>.ķs`-~rR/5KTњ ʜΟS'xꪫ_\| 1ڧBg `MbQ|t@Sd'/;[s5,}/ 3)eQĖQ.@b<1#XPCew<28ǩSUTvK@~j r9|kJNJǯ;qg}6޹λݟ+pЧhW䖇p*NoyKJl!M@Gy|}2 WL` UhA8  z>/GxS0'yEw 5h WV\)E GM9YdwU;c@.0sӕ rHc:S11\s o )TlTS e9KR2̔MyX_!E@M\}JT/ u @1$"NdI`ɒ5cۍ(.~])|Cp <:ۆ˙lp[淄:8g4O)5iK1;o38o5/f3vf#?:.t';%˹IRVGn <&B~mXSu uW8le,I&*'V^pPӫɂ];` ? իAU}˨ٯh 06\U^R?'Cs3<?p|ah?rO W) uwF}ڴdFA_r⾮r'o\7Y2!%PYwGk@|/Gɥ\]x1F6-~_wc! |rTB y-hA}P鼢O~Rj%d<'d @ptTb_B gxGA)bK(Ņ97}#{8߿ ~A9_jU9 4#ԂbwHuZrL Vh̟ӛWfMÅk׾OWcmvb%jԀQ ʧxyt$Ȧ b NPHYfJoN&ɫH!׀n—pهoFQ׷otp̷nƉx򥎖sy׻MN:Yn(?4~&e"KEkPL8ЁƢ.$lW7 @dK"WY~fx'Wǘ&\Kwg woI(i£hGrUӛtiWg>Sf|xf8w=nXwY&$J9^-!^΀|!j)ERm0p'.\C){F|~&;|D u% OI`?r~`r[vY*ݽҨ&{+kf_hc͡-..mMfbP)L廰D7fkxwӷM=wys_5~Mx@K2,9FSE\Glku|`^oy('wmEDH/ 2Sr#P799)| G1>Wĕx9Z>_._0e<8)np99rxڬNΖ~ߟ )|VkYǘǙCLW_dj&էFkO<-7-ryر1Z,8y]2n߼UhuS^s=]qҡ#;_k݃W+3Œzsu/wón'>|ߚ-oWUVT?h5{NR4x7zU*Yg#%{=??jorJphydhVy uzKXT7ȬyMݸ1/l'*-폲oᦶTԍRt[UquokڳXN}qi_qÒ1͖X^ #J9R"Җ0sM0na:\ ܂sҏC./ӛSJ,gyG?Q7 AnQ7z1>5eqpjGT EuD+fg$HX'7P_NA=4C-p |c5Lݏo)oa/jH5 )z\oUv}c}{ۺukǹu2:;y]`j ,&xY:,^Gefi I.J*3z0'[qç+|ЈO9\p׎984.;~O iޱNhHYu WU/8>nmn̖[!{ RǴCG:^_9W1 R?NZReg[5{g:>w}}+q}LCL|Ν$:f#x }-ۉ^*֍Oj)@)npc8ҟ[H7w豣@PV8ӡ DG"!(e+=@3)5iUz8HEe<, xRv~|xnS7M!o~&@ d}>TչP`)ijlnop F߇k*>Y@ѿ W֠ 6[9哀JЩ]ylQ` 69PHVOIz@Q=.+: m:lM|k㉾nm?m-ˁ`9,Sg@*rA ,Vgϔ?=\Xr~7<\#Pl)z4 ScGR%aG5vscB|Qz@ Gx|s| Q7u'<-y 64+Zi6 ȗҙtAerrR޽۵bq lF|C2ك}Y4ŽSi%,kR)>eei'hayyO|~w?? ?| űwqݯuQ%k̮UGG^D~եiZoT&hu fc?7݁ p`ӂ'1<۳8șg򁠄F-f9 kPAnᗁ[o8??FË!|G3, 4@ȣ"(+@;RTp xzpMBvQJdAg`ز<J ?Z'{~Cx ߍ2f<-%o bXLns `ShzȽot_E: zXSxSX_@GR7i |.WRB4u@S"L~: JYX %*h Fi!<$h{pN d CGc{J l `KjGe/}V\y7z5٥;h' GH5":Ha$UlqY񚓮<֮Jyn)% |8iPU\0sOL:S4Q,_<1lBBpكh^ #ӏSs1wGCb60]OSA]{_ANF`4 FRE^ @IQ)(.E7CeX(]>ڣ>yTa'W}2#Q`R| -4uQ;'(xUq62a-{ŶIfK}fcu&hRzK_'d4`C +eR],kR> 2G.+hoa+p"_3qcy bM@^;G = EܿAx9 @/ю\aZjS_[] lP0iKx# mt>l0>T RU6̞ThBH آ% e  `W$ e. |zvt~OQTL_U´I Z8:D58vGt}S1q=@j9_X < (:r\gZȝF:}\-LG@RV-[.KhÝ GǏC9lIAH? ,/%reCYK`KKf.:0 +o;C}"C,!bГؙ¶s,y4ĠF[۲Y;^[[LΚيMpL=S|uS?Ӕ*1a"ʫn`|\.x#`@$Y;u.>T(ǔ^ D15i)R]rg5 rE yLX#(ZK-!|tG=X|QF㊸CکAVg֜'NC0Ϸv8f#!uxkàHB?s{Q  L+˒ZЂ%*A~џO7 4@~V5Mnrgf E ^[S)=/YÚ o[7\ÜnKn0Q>MqlZs[ok_7'o8F`9 㥢8Bu2xV'G7ޛZD'~<PPA;'l,NРO _y搛6vf46:wԩyb>:. |O%h[P?걝e ^Lhc9$7:2>ؾq lڴ=u׸wg$`T7(9W~}_Bm%X#+p@hc)B@b#o z(zٯSk˩ a:S~yN" N$z*x£[U\;<ŌhKAwGy;^q+ |G>Y7/y_Ʀw̩fu&TBeBBAG47&W^2'_zG 9<8ɣ?&>L#MRMu#˛fa7whB!:a- 'IbK\ "c#YD$:X@+TMr5mvZv!uwu[n{/Խ/w/xыs/z;ꨣg?;nv}sw qY mOOp| _ʣ%7Hvz)Z҉ʪor5 FrTp:re6 Z3qߡ:5iѩga ܢT袰,+b1DB"[G# ia 5׸ٙY SO;~{!qgy;Ywi կs;c6̐F꯷CT9> /E?4$ :Te )*Y`թJ|~ ㅿ\H,=dmZx-ur:[ =ZK \znnAat 1GqW{>߹LdgSHG*DYv\M|>g* [߭\ʝ|54?lX6_֮]'u>a|a؜scv%ky"<-DF^ꢬi=#a*|o>J$ƻނWE S-J/Kbu/W|[oYr>ɎÞ;T[)+flM:PjG vL ZMQf#Of(Ws8H,hS 7H[֭F^qfzMnя605޷.)३16:֬Z'B;v|53؊ I p 8^vx%J:<,}.t< :! %)iJ2Vn[l+X:ӿCsnᄑron />\yfsqǟp":=ޔ1#W`zz탌eK#YIBO-_*xA"VpȾSTHy| J0i~>V(brkMu](K4kȽn9ԍ{w8>2< ?‡"ћXGTو"amRhK,S=u;Vm9j`#p{ -58pk֬q{'mâjwᇻ~Tc ػg.y3޹Ӎc8j_ ~U9ro B(Cl'kNAx| R˅B! JnQTf-DS\߳x /bZâO.i@No9=9_sq|cWBv0i|@e8,d7uˌv?>x駟.r򗿜v:;6}16/h/Mʢ)n#\r錳vG ~?|֭zJF[7m'm8oiۤ|xc98}J[6#X Њ/rcdAsԤ@P5|tXU؍nyh{܋_b<(q>>|6 4|%GYQ rn7fyxَǍ(vw{ի^c1Y$ )evNw7㹀#zK}|=;N<Ï: p{G즶[!TY ABs#yG"k1 :ᆟkB!/5Hလ#! A9hH܃ ?`Z5.499X &<*;R+99|Nwhљ_Gd/vW]us ⛂A@~N*BAPvR Xܻ SNwW"~}Iz4ωC3h`r``/ryJsL:&nt;?cvkkqSr}:ԂTmJUA \~cs͸{I6 Vᦡ㱂(Ϸiu`$D&a?MZn9^vJ;m̓nA5/*:b,4 t0L՗# 0)\xWc>hc/zыܿ뿺pD=7 SDZ[g1psSoG`z|GJMۏc .@A/Ii9LAA7/0H/dEՑx0縇0?/r;ǫ3Cn|-rrO0uxt B{;*PX6/S;3Sr-,B-i< . Xjѹ*bEwL @sԺPXU-◿}sUtr~P 0cE%A0`ٹG!E݋>TQEg%X8 4qN"xO &p3ڮ` 8ďJ?͡<~Կ':^=!K$L9|.8s9<}hdGmh#p]v^ʖDeME8E,]h "Dmmod_uP2HGufrW 8lށ9 3p'!-MIWYVJ{*繺tgt5@jv5~/zr2d _NljanMeb2V>Zk,KZ|U@ IG/Lf輿tSF(lձPZr&K|'ILfIqP'3an1_31u_`ҿ/ [np'o":--%86duiy?C)y5iAkNa DX]uhXe/a4 a)b <%bOe'?CޢIL~f19 Rp/GGOq7k.׵)O >LgVG}&4MoaT RtTt/ @?@uBf`#{6P1hY]290S.r_%kw[ CQ07gBbs6,փX8ǟk߶:[@r.@(sxr6dh3l6V7c9`O̖M #|aju3H+^xG}a,SMOMRS.+oa˟[-R Pv; ΎҘ ITSpr0`{5VS/3ƚ *H |\:y!)Ui, Nf9zk*i9]9=TNX*rxul^ҙR~_)աTGm|m) 2@P~!ϲ@=?)JY8UNW7^ [~p. 4RଓK9S%C=UrJg^Unȫ)N20tNe`AmK^C~Ou 2sF,EHr)nge,l-ly$l}PKU'W]9yT͜}x|c1ZcZo3}Vډ;- t,nUzM 9jմ]Gp``8TSءԱ6%m %\dCY[w/- 9ǒmi EFV*@3R0t.[`jM+v g2|eއ#L٨NmNaTYtq@`L&>竤>t(v.OhF9'b\ڄD[x2i#'^환#m#٬ҟŵe='k -Ubs8)j3'^}RLVX ڪnbf%VC;Zӏ.XtյjvYm>vlo)|*hyDgL`UgBlvhLK8Oi|]EJ3$91jmRSrs*h 8I*)'g9m|DZn4uY˪;l=p-[j^, /⫈ hZ?v ~}=jE+.kGOL6#lcr[M}lɵ>@GqZ;1/\}淿msM75O7ַ?p ͵^r-' ŷ/xW/,zx?70 ,Ƿ7kOۮ>[nU\xyZQu'uNpҊ zr)I a#'ɐsmRiGkGo|6x;{>Xrڱw`$*I+ڊ/s9n_тw!:e]z5&KmGSJ).r;xLm8p<)r9Pң\+TZZ}E]~%/yIeNH\Oy-?odyqO3y3`C,xUsy{*ћx+WTtVuJ{9bkqj+Yz_jojg)9`C]&J1jo~e8H|m2&_rI?NXϜ/N۷MԳȰh?Wcs:zFV`<HɡI 6:~G_Qk^|ͥ^46Id"eb[zMz@[;؊Aox뮏~JzwORrm>eʵ^ '\#v9ےcDX_3=f'e],_h֞Gқ&:sےCn`kͪ}CWU=x| [S{O|(6)z6|LL|>_`Kzbjpr2ݷy; 'qI;F&0ۉ]~=L3AF8_?10{~|󙲫Q)^6J+_詫h(: :ɕ& "Ԯ W\.6JƏ[riLNxlO0Ґnk7pp]N±yHr^yP{SZ{:#%Q{#_ljHХ, JƔju##Q} "Ӎ3w%FybG2Z_6oS~x~܎yO.~iZ9ťlRuBpSR&:FJbljf޴{me ɫINVL4ǵ؉  ŭ=icؤb|E2OLiby^쫃}7(h O!3km_YvGe+Y(cL#̮XUVUc}*{=O9뒞8]v9SZ}{vjbji}'"H%YI)ۚI gXs1Z35³kך]{,1ePHNv4ڄbZelcql&{~^XtN)&u5q@R:4HuS#5|Ќ5nӟ4,7 xL Ş@{@8EAb~T Æ2 KcJLĤӑǐ(,j~ _S{QZ1ti?U`r-5@ \ xڰ|+Ռ/~=_zI 4y4&oM\ҏ'kBV܊x^u=ġ: S^ǷڤMU=(t%6ڽ\b=M[=f#ymtn}Lx%.!555A[-&=9` `>Ī-guW^V69:o*$ةsh8w|twYzkko gL[Mg' .Jt}(&GH6iΕ%uBՏ}qj8*ڭ?lC:j$~V=|vmڃ?-j>6|l8~ :!3z|oLh5z Mb{짥f,=AxZm8^ywZ+]룏 }O2F2ao3/=p( [ЎTߌ/9pv.-FFіT/ؕ=m8b/=vlin_c<_)꿯N}x:S8a,la?1@|D2`Y6Zv8]&@V*NJ'|kكfe;Co[l_Lu&U;!ӨI'9ė|M9VvJcC[SSrI0=ε}xK7~RʣvOԧ>/igp83Ijrd{+WMq=X^yjeQ\ FL "” E~=o>4sc{0g ?^mQ"O 26O>==_«z/6gWSҹWCg':%R)A,53yL1lDxhSO59k7_x+ *\z{ے^9y^hSrNlj0: Kzbj2ɀ~7گ γ;lY'~"F$kKdڦ{^KX[kW5eVzj l/abgɠ/lF}СYfO`ɏP0 _{/sY}ys~s:ڗY?5@ ,ٗCRcKmk?!7Ǯ?ni^,V,v2rv>Nb"!yŒzV=>dZrHZ=ھ7PH ɨc1'uW}ug.R,^h..dA|` ۀA|m[X>rÇ7W]uU3cۉ}9-ƒ+(\nka"Y&:ϫ_O+ViD(O`jp]/ۨmGmO5}l2;_ n+"45@ 2Y|>烾jq/f;ZSwg?hr ݉ A۷\6gRJ:B%XkM{?+Gv63NJ>'Ϛq|0^ySJ{=߇1dDAcciN`\IJ .vZ}]˛#G4ll]? v"T\w >$R>WxuIO\~<VH~i@(:16Fm;jۅvJt/宿SRCԎ2O{99].Grvtr@ Jzt0I_Ӗǖ&^kZuMcOzlO7a{2dmq~x^u*ڀ具ۨ?☘|D2Y/a6b"@5m3ΨT>78oYҸ,ث\l({M?IDAT[9VHz}0%AyU^iJod# (HLnjX([ӏ~p ;bw +İ"G'9JF}9l\tÓQNv`I!vi>+6]qOMi_2:!&N֌iFٰOj*#lN0T탌p5 Dn0/M%f?O4o'q7ˤT`6ʆz%vss*1u``}ke"/Жןjw䮿.7`$ 'K˨TcK[Q[նDS+90h 2/aq"2cwM{D/OGwfiiCv\=QLFe_4a/}?bAyJ7Da`1O_3f^YPخCrW_ ^`]a<4s:A7@s,-\F*t~=zoK~G,RG>*8vyMR5q]k<`qA}pܵJd9?_⽯6OMF;]:~s8 t2Gg\]j|?qǮ\Gm/eA.g1T퀋d)=}7o'>TfRyIW6Ԍuya@k|ۗtFm/{~9{ٴդKul?VH~U5RAG}g!J,쉯ɉ@7/>}oO{`{A ?-X>())޾VI~&\A}S.XMmj _Bկ~_`{X+kl[ib/aJP3?ZlrRmJuymG_&nJ7pjnhYM;jh E׾ ζav9͸&s36awޝ\EdCM+[iZ?(<=e9mtӰ`ɯe 8h[3uY]y^!u;;CbJƷځV>,hNi{9 /Ve"O⬥\c`"Z^}i>KA׵ځo|5}r aB'~k{i6.ayk2=]vSS~A8`uF=<6@&Ug~R4q|+7x d86nwĂ?iO>ciWDmҸY "ZF5cy#FzȼCq-%J-nu}22hd>ۋw/4^!,3Zi&-kfCi%9NdF${{|I>Ə l²\ػЮ7\&QBEu)EvN~19`0JŒMe]ՅRGR6f9k_m#<61Xp"bkq!|7mX낛u2OIwv5uF߿[馛sRG>jeC*WIɏ~NLCB]) ] }w_keۡcĘgO>c5uO$dX(.ӒtR4&`m״A;~o6Z`2s:)?F6Yi?v_I| )mo粍dYjX{0\R 4eO?cM5Yj yƼҏ5uYk}f1M_|\?đ GT>C[GtUj p=fйfi_fe&K#[e'o}ٻw?qybb5=mOu.^uU:]"-$KEIlN'=D?ۉHRdlv~4V_#LN&^_?8p`7,]&Xt]jY f=f>>-ԾMF[}ݻ;lG}Հ_O?cg5krNuM*ws}tKD+xVu=;s.v^97=<}7IQy!Hhvh.;vEG٘XzX8@G;%|ruyr1AEcJOS%vcWӿם{cvH8N[ Ϗהooye]?m 2rauYԍroTfi5~j9 u5mg}-k$)-\?9ӟꮻHd\t@̒ cIvwⳟ萀8}`7]yAL۽ _ c3vU”cGB 񻔨-1^vַ sžSm_f<MhN ~ %I{ݣxŎ#s98뛌}gT"_[M5ylpo;^/Z]S^JR}նv;;&;R\ӳ#5{No$ۜƬ-%ƫ[y-%wIjqğGV/'R n&fj|O7xoʿ-?:zٯ.U++:p՘9wA2˖%0];&vt]Fkw6k.nX}C*QʻLY{ -^n92&yk0𥥏o'6 lY/~>ٵmx]j8vmKԑ#G^wuɾW$ໆ~g=gYedGbst<\8u \>i5@N3=\gz]g 52  KyAKAKAKAKAKAKAKAKq AyAAAAMqD@AyAAAAq  AyKAKAKAKAKAKAKAKAq AyAAAALqCOAyAAAAq <= K{AKAKAKAKAKAKAKAKq AyAAAAAxAxAxAAAAAq   A}KAKAKAKAKAKAKAKAq AyAAAAAAAAAAAAq         KyAKAKAKAKAKAKAKAKq AyAAAAAAAAAAAAq  AyKAKAKAKAKAKAKAKAq AyAAAAAAAAAAAAq  K{AKAKAKAKAKAKAKAKq AyAAAAAAAAAAAAq  A}KAKq > KyAKAq AyAAAAAAAAAAAAAxAxAxAxKxAxKzA|KxAx:K;AKAxKxAxKxAKAKq AyAAAAAAAAAAAAAAAAAKAKAKAKAKAKAKAKAq  p p p p p p p p p p p p p p p p=pK{AKAKAKAKAKAKAKAKs A}KAKAKAKAKAKAKAKAu KyAKAKAKAKAKAKAKAK>q:AKAKAKAKAKAKAKAKA:;KAKAKAKAKAKAKAKAK;AKAKAKAKAKAKAKAKA                                                   =KyAKAKAKAKAKAKAKAK<q                                                           AyKAKAKAKAKAKAKAKAs KyAKAKAKAKAKAKAKAKu A{KAKAKAKAKAKAKAKAq K}AKAKAKAKAKAKAKAKs AyKAKAKAKAKAKAKAKAu KyAKAKAKAKAKAKAKAKq  p p r t p=p:; 0 #gbv.ResearchPointsDivisor 1 ---------------------- Awards and Trophies ------------------------- #awards_trophies.CansofCoke 200 #awards_trophies.CansofCokeBonus 10000 #awards_trophies.Reputation 850 #awards_trophies.TrophyReputationBonus 20000 ------------------ Winning and Losing Conditions ------------------- 1 Total reputation 2 Balance total 3 Percentage people your hospital has handled 4 Percentage people have been cured 5 Percentage people have been killed 6 Hospital value #win_criteria[0].Criteria.MaxMin.Value.Group.Bound 2 1 50000 1 0 #win_criteria[1].Criteria.MaxMin.Value.Group.Bound 0 0 0 0 0 #win_criteria[2].Criteria.MaxMin.Value.Group.Bound 0 0 0 0 0 #win_criteria[3].Criteria.MaxMin.Value.Group.Bound 0 0 0 0 0 #win_criteria[4].Criteria.MaxMin.Value.Group.Bound 0 0 0 0 0 #win_criteria[5].Criteria.MaxMin.Value.Group.Bound 0 0 0 0 0 #lose_criteria[0].Criteria.MaxMin.Value.Group.Bound 0 0 0 0 0 #lose_criteria[1].Criteria.MaxMin.Value.Group.Bound 0 0 0 0 0 #lose_criteria[2].Criteria.MaxMin.Value.Group.Bound 0 0 0 0 0 #lose_criteria[3].Criteria.MaxMin.Value.Group.Bound 0 0 0 0 0 #lose_criteria[4].Criteria.MaxMin.Value.Group.Bound 0 0 0 0 0 #lose_criteria[5].Criteria.MaxMin.Value.Group.Bound 0 0 0 0 0 --------------------- Competitor Information ----------------------- | Index in the away "computer" | Is that opponent playing? | 1 is yes, 0 no | Comment | #computer[12].Playing 1 CORSIX #computer[13].Playing 1 ROUJIN #computer[14].Playing 1 EDVIN CorsixTH-0.63/CorsixTH/Levels/avatar.map000066400000000000000000005001541347163623700201000ustar00rootroot00000000000000                                           >   < = <  = < N;: = MD@  >LCO  x{xz|xz|xxq >  }s xyxz|xxxxz|xxq xyxz|xxxxz|xxq >  yu {q ys  {q }q yu  }q y>q y>q > ys {xz|xxx:< =:u }; ;>q y> xxz|xxq  p p p p=pyLCO  }s yq yu >  yu  p r t=p:; yq >  yq  yq  {s   p p r t=p:;  yq    p r t p r t p r t p p   <     =       >     =<     :y;xz|xxxz|x:;q  {s  }u  yq  {s  }u  yq   p p r t p r t p r t p r t p p                                   CorsixTH-0.63/CorsixTH/Levels/confined_v5.level000066400000000000000000000247051347163623700213560ustar00rootroot00000000000000Copyright (c) 2010 Edvin "Lego3" Linge 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. ---------------------- General Information ------------------------- %Name = "Confined" %MapFile = "confined_v5.map" %LevelBriefing = "You have been tasked to build a hospital in an area where only a few apartments are for sale. Land prices around here are astronomical, so you will have to live with a very confined space until you have earned enough money to expand." %LevelDebriefing = "Great job! You never really noticed the space issue, right?" Town properties InterestRate is defined as centiprocent to allow for two decimals precision, i.e. 300 means 3 % #town.StartCash.InterestRate 15000 1000 -------------------- Disease Configuration ------------------------- When a drug is researched, what effectiveness does it have #gbv.StartRating 100 The following table contains all diagnoses and treatments that shows up in the drug casebook in the game. Known specifies whether it should show up from the beginning of the level and RschReqd how much research is required to discover the treatment room for the disease, MaxDiagDiff is how hard it is to diagnose (don't apply to diag rooms). #expertise[1].Known.RschReqd 1 0 GENERAL_PRACTICE #expertise[2].Known.RschReqd.MaxDiagDiff 1 40000 500 BLOATY_HEAD #expertise[3].Known.RschReqd.MaxDiagDiff 1 40000 150 HAIRYITUS #expertise[4].Known.RschReqd.MaxDiagDiff 1 60000 150 ELVIS #expertise[5].Known.RschReqd.MaxDiagDiff 1 60000 150 INVIS #expertise[6].Known.RschReqd.MaxDiagDiff 1 60000 750 RADIATION #expertise[7].Known.RschReqd.MaxDiagDiff 1 40000 150 SLACK_TONGUE #expertise[8].Known.RschReqd.MaxDiagDiff 1 60000 350 ALIEN #expertise[9].Known.RschReqd.MaxDiagDiff 1 20000 100 BROKEN_BONES #expertise[10].Known.RschReqd.MaxDiagDiff 1 40000 150 BALDNESS #expertise[11].Known.RschReqd.MaxDiagDiff 1 40000 500 DISCRETE_ITCHING #expertise[12].Known.RschReqd.MaxDiagDiff 1 40000 450 JELLYITUS #expertise[13].Known.RschReqd.MaxDiagDiff 1 40000 500 SLEEPING_ILLNESS #expertise[14].Known.RschReqd.MaxDiagDiff 1 30000 300 PREGNANT #expertise[15].Known.RschReqd.MaxDiagDiff 1 40000 250 TRANSPARENCY #expertise[16].Known.RschReqd.MaxDiagDiff 1 20000 250 UNCOMMON_COLD #expertise[17].Known.RschReqd.MaxDiagDiff 1 60000 750 BROKEN_WIND #expertise[18].Known.RschReqd.MaxDiagDiff 1 20000 250 SPARE_RIBS #expertise[19].Known.RschReqd.MaxDiagDiff 1 20000 500 KIDNEY_BEANS #expertise[20].Known.RschReqd.MaxDiagDiff 1 20000 500 BROKEN_HEART #expertise[21].Known.RschReqd.MaxDiagDiff 1 20000 600 RUPTURED_NODULES #expertise[22].Known.RschReqd.MaxDiagDiff 1 40000 250 MULTIPLE_TV_PERSONALITIES #expertise[23].Known.RschReqd.MaxDiagDiff 1 60000 250 INFECTIOUS_LAUGHTER #expertise[24].Known.RschReqd.MaxDiagDiff 1 40000 500 CORRUGATED_ANKLES #expertise[25].Known.RschReqd.MaxDiagDiff 1 40000 600 CHRONIC_NOSEHAIR #expertise[26].Known.RschReqd.MaxDiagDiff 1 40000 300 3RD_DEGREE_SIDEBURNS #expertise[27].Known.RschReqd.MaxDiagDiff 1 40000 300 FAKE_BLOOD #expertise[28].Known.RschReqd.MaxDiagDiff 1 40000 500 GASTRIC_EJECTIONS #expertise[29].Known.RschReqd.MaxDiagDiff 1 20000 750 THE_SQUITS #expertise[30].Known.RschReqd.MaxDiagDiff 1 20000 700 IRON_LUNGS #expertise[31].Known.RschReqd.MaxDiagDiff 1 40000 750 SWEATY_PALMS #expertise[32].Known.RschReqd.MaxDiagDiff 1 20000 500 HEAPED_PILES #expertise[33].Known.RschReqd.MaxDiagDiff 1 20000 750 GUT_ROT #expertise[34].Known.RschReqd.MaxDiagDiff 1 20000 500 GOLF_STONES #expertise[35].Known.RschReqd.MaxDiagDiff 1 20000 500 UNEXPECTED_SWELLING #expertise[36].Known.RschReqd 1 40000 I_D_SCANNER DIAGNOSIS #expertise[37].Known.RschReqd 1 50000 I_D_BLOOD_MACHINE DIAGNOSIS #expertise[38].Known.RschReqd 1 20000 I_D_CARDIO DIAGNOSIS #expertise[39].Known.RschReqd 1 30000 I_D_XRAY DIAGNOSIS #expertise[40].Known.RschReqd 1 60000 I_D_ULTRASCAN DIAGNOSIS #expertise[41].Known.RschReqd 1 20000 I_D_STANDARD DIAGNOSIS #expertise[42].Known.RschReqd 1 20000 I_D_WARD DIAGNOSIS #expertise[43].Known.RschReqd 1 20000 I_D_SHRINK DIAGNOSIS | Objects available | Available from the start | Strength | Available for this level | Comment #objects[9].StartAvail.StartStrength.AvailableForLevel 1 8 1 Inflator Machine #objects[13].StartAvail.StartStrength.AvailableForLevel 1 13 1 Cardiogram #objects[14].StartAvail.StartStrength.AvailableForLevel 1 12 1 Scanner #objects[22].StartAvail.StartStrength.AvailableForLevel 1 9 1 Ultrascan #objects[23].StartAvail.StartStrength.AvailableForLevel 1 7 1 DNA Restorer #objects[24].StartAvail.StartStrength.AvailableForLevel 1 11 1 Cast Remover #objects[25].StartAvail.StartStrength.AvailableForLevel 1 8 1 Hair restorer #objects[26].StartAvail.StartStrength.AvailableForLevel 1 10 1 Slicer for slack tongues #objects[27].StartAvail.StartStrength.AvailableForLevel 1 12 1 X-Ray #objects[30].StartAvail.StartStrength.AvailableForLevel 1 12 1 Operating Table #objects[37].StartAvail.StartStrength.AvailableForLevel 1 0 1 Projector #objects[42].StartAvail.StartStrength.AvailableForLevel 1 10 1 Blood Machine #objects[46].StartAvail.StartStrength.AvailableForLevel 1 8 1 Electrolysis Machine #objects[47].StartAvail.StartStrength.AvailableForLevel 1 7 1 Jellyitus Moulding Machine #objects[54].StartAvail.StartStrength.AvailableForLevel 1 10 1 Decontamination Shower #objects[55].StartAvail.StartStrength.AvailableForLevel 1 10 1 Autopsy Research Machine | Diseases available | Value property to be determined | Comment #visuals[0] 1 I_BLOATY_HEAD #visuals[1] 1 I_HAIRYITUS #visuals[2] 1 I_ELVIS #visuals[3] 1 I_INVIS #visuals[4] 1 I_RADIATION #visuals[5] 1 I_SLACK_TONGUE #visuals[6] 1 I_ALIEN #visuals[7] 1 I_BROKEN_BONES #visuals[8] 1 I_BALDNESS #visuals[9] 1 I_DISCRETE_ITCHING #visuals[10] 1 I_JELLYITUS #visuals[11] 1 I_SLEEPING_ILLNESS #visuals[12] 1 I_PREGNANT #visuals[13] 1 I_TRANSPARENCY #non_visuals[0] 1 I_UNCOMMON_COLD #non_visuals[1] 1 I_BROKEN_WIND #non_visuals[2] 1 I_SPARE_RIBS #non_visuals[3] 1 I_KIDNEY_BEANS #non_visuals[4] 1 I_BROKEN_HEART #non_visuals[5] 1 I_RUPTURED_NODULES #non_visuals[6] 1 I_MULTIPLE_TV_PERSONALITIES #non_visuals[7] 1 I_INFECTIOUS_LAUGHTER #non_visuals[8] 1 I_CORRUGATED_ANKLES #non_visuals[9] 1 I_CHRONIC_NOSEHAIR #non_visuals[10] 1 I_3RD_DEGREE_SIDEBURNS #non_visuals[11] 1 I_FAKE_BLOOD #non_visuals[12] 1 I_GASTRIC_EJECTIONS #non_visuals[13] 1 I_THE_SQUITS #non_visuals[14] 1 I_IRON_LUNGS #non_visuals[15] 1 I_SWEATY_PALMS #non_visuals[16] 1 I_HEAPED_PILES #non_visuals[17] 1 I_GUT_ROT #non_visuals[18] 1 I_GOLF_STONES #non_visuals[19] 1 I_UNEXPECTED_SWELLING ---------------------- Staff Configuration ------------------------- Each entry states how many staff members of each category are available a given month. The number of entries is not fixed. | A list | Month it gets active (start at 0) | Each group | #staff_levels[0].Month.Nurses.Doctors.Handymen.Receptionists.ShrkRate.SurgRate.RschRate.ConsRate.JrRate 0 8 8 3 2 10 10 10 10 5 #staff_levels[1].Month.Nurses.Doctors.Handymen.Receptionists 3 7 5 5 3 #staff_levels[2].Month.Nurses.Doctors.Handymen.Receptionists 5 5 8 7 4 The minimum salary for each staff type #staff[0].MinSalary 60 Nurse #staff[1].MinSalary 75 Doctor #staff[2].MinSalary 25 Handyman #staff[3].MinSalary 20 Receptionist Salary modifiers for different doctor attributes #gbv.SalaryAdd[3] -30 Junior #gbv.SalaryAdd[4] 30 Doctor #gbv.SalaryAdd[5] 40 Surgeon #gbv.SalaryAdd[6] 30 Psychiatrist #gbv.SalaryAdd[7] 100 Consultant #gbv.SalaryAdd[8] 20 Researcher How much the skill of the doctor adds to the salary. skill * 1000 / divisor #gbv.SalaryAbilityDivisor 10 #gbv.LandCostPerTile 150 #gbv.TrainingRate 40 #gbv.AbilityThreshold[0] 75 Surgeon #gbv.AbilityThreshold[1] 60 Psychiatrist #gbv.AbilityThreshold[2] 45 Researcher #gbv.TrainingValue[0] 10 Projector #gbv.TrainingValue[1] 15 Skeleton #gbv.TrainingValue[2] 20 Bookcase --------------------- Research Configuration ----------------------- Divides research input to get the amount of research points. must be > 0 #gbv.ResearchPointsDivisor 5 ---------------------- Awards and Trophies ------------------------- #awards_trophies.CansofCoke 200 #awards_trophies.CansofCokeBonus 10000 #awards_trophies.Reputation 850 #awards_trophies.TrophyReputationBonus 20000 ------------------ Winning and Losing Conditions ------------------- 1 Total reputation 2 Balance total 3 Percentage people your hospital has handled 4 Percentage people have been cured 5 Percentage people have been killed 6 Hospital value #win_criteria[0].Criteria.MaxMin.Value.Group.Bound 1 1 500 1 0 #win_criteria[1].Criteria.MaxMin.Value.Group.Bound 2 1 50000 1 0 #win_criteria[2].Criteria.MaxMin.Value.Group.Bound 3 1 50 1 0 #win_criteria[3].Criteria.MaxMin.Value.Group.Bound 4 1 50 1 0 #win_criteria[4].Criteria.MaxMin.Value.Group.Bound 6 1 100000 1 0 #lose_criteria[0].Criteria.MaxMin.Value.Group.Bound 1 0 250 1 300 #lose_criteria[1].Criteria.MaxMin.Value.Group.Bound 2 0 -20000 2 0 #lose_criteria[2].Criteria.MaxMin.Value.Group.Bound 5 1 50 3 40 --------------------- Competitor Information ----------------------- | Index in the away "computer" | Is that opponent playing? | 1 is yes, 0 no | Comment | #computer[12].Playing 1 CORSIX #computer[13].Playing 1 ROUJIN #computer[14].Playing 1 EDVIN ----------------------- Emergency Control -------------------------- #emergency_control[0].StartMonth.EndMonth.Min.Max.Illness.PercWin.Bonus 4 5 4 6 16 75 400 #emergency_control[1].StartMonth.EndMonth.Min.Max.Illness.PercWin.Bonus 8 10 3 5 32 75 500 CorsixTH-0.63/CorsixTH/Levels/confined_v5.map000066400000000000000000005001541347163623700210210ustar00rootroot00000000000000???????????????????????????????? ?>>9>*>(>2>*>(>2>1>>>????????????????????????????????????????????????????? ?>>9>*>(>2>1>>>???????????????????????????????????????????????????? ?>>9>*>(>2>*>(>2>1>>>????????????????????????????????????????????????????? ?>>9>*>(>2>1>>>???????????????????????????????????????????????????? ?>>9>*>(>2>*>(>2>1>>>????????????????????????????????????????????????????? ?>>9>*>(>2>1>>>???????????????????????????????????????????????????? ?>>9>*>(>2>*>(>2>1>>>????????????????????????????????????????????????????? ?>>9>*>(>2>1>>>???????????????????????????????????????????????????? ?>>9>*>(>2>*>(>2>1>>>????????????????????????????????????????????????????? ?>>9>*>(>2>1>>>???????????????????????????????????????????????????? ?>>9>*>(>2>*>(>2>1>>>????????????????????????????????????????????????????? ?>>9>*>(>2>1>>>???????????????????????????????????????????????????? ?>>9>*>(>2>*>(>2>1>>>????????????????????????????????????????????????????? ?>>9>*>(>2>1>>>???????????????????????????????????????????????????? ?>>9>*>(>2>*>(>2>1>>>????????????????????????????????????????????????????? ?>>9>*>(>2>1>>>???????????????????????????????????????????????????? ?>>9>*>(>2>*>(>2>1>>>????????????????????????????????????????????????????? ?>>9>*>(>2>1>>>???????????????????????????????????????????????????? ?>>9>*>(>2>*>(>2>1>>>????????????????????????????????????????????????????? ?>>9>*>(>2>1>>>???????????????????????????????????????????????????? ?>>9>*>(>2>*>(>2>1>>>????????????????????????????????????????????????????? ?>>9>*>(>2>1>>>???????????????????????????????????????????????????? ?>>9>*>(>2>*>(>2>1>>>????????????????????????????????????????????????????? ?>>9>*>(>2>1>>>???????????????????????????????????????????????????? ?>>9>*>(>2>*>(>2>1>>>????????????????????????????????????????????????????? ?>>9>*>(>2>1>>>???????????????????????????????????????????????????? ?>>9>*>(>2>*>(>2>1>>>????????????????????????????????????????????????????? ?>>9>*>(>2>1>>>???????????????????????????????????????????????????? ?>>9>*>(>2>*>(>2>1>>>????????????????????????????????????????????????????? ?>>9>*>(>2>1>>>???????????????????????????????????????????????????? ?>>9>*>(>2>*>(>2>1>>>????????????????????????????????????????????????????? ?>>9>*>(>2>1>>>???????????????????????????????????????????????????? ?>>9>*>(>2>*>(>2>1>>>????????????????????????????????????????????????????? ?>>9>*>(>2>1>>>???????????????????????????????????????????????????? ?>>9>*>(>2>*>(>2>1>>>????????????????????????????????????????????????????? ?>>9>*>(>2>1>>>???????????????????????????????????????????????????? ?>>9>*>(>2>*>(>2>1>>>????????????????????????????????????????????????????? ?>>9>*>(>2>1>>>???????????????????????????????????????????????????? ?>>9>*>(>2>*>(>2>1>>>????????????????????????????????????????????????????? ?>>9>*>(>2>1>>>???????????????????????????????????????????????????? ?>>9>*>(>2>*>(>2>1>>>????????????????????????????????????????????????????? ?>>9>*>(>2>1>>>???????????????????????????????????????????????????? ?>>9>*>(>2>*>(>2>1>>>????????????????????????????????????????????????????? ?>>9>*>(>2>1>>>???????????????????????????????????????????????????? ?>>9>*>(>2>*>(>2>1>>>????????????????????????????????????????????????????? ?>>9>*>(>2>1>>>???????????????????????????????????????????????????? ?>>9>*>(>2>*>(>2>1>>>????????????????????????????????????????????????????? ?>>9>*>(>2>1>>>???????????????????????????????????????????????????? ?>>9>*>(>2>*>(>2>1>>>????????????????????????????????????????????????????? ?>>9>*>(>2>1>>>???????????????????????????????????????????????????? ?>>9>*>(>2>*>(>2>1>>>????????????????????????????????????????????????????? ?>>9>*>(>2>1>>>???????????????????????????????????????????????????? ?>>9>*>(>2>*>(>2>1>>>????????????????????????????????????????????????????? ?>>9>*>(>2>1>>>???????????????????????????????????????????????????? ?>>9>*>(>2>*>(>2>1>>>????????????????????????????????????????????????????? ?>>9>*>(>2>1>>>???????????????????????????????????????????????????? ?>>9>*>(>2>*>(>2>1>>>????????????????????????????????????????????????????? ?>>9>*>(>2>1>>>???????????????????????????????????????????????????? ?>>9>*>(>2>*>(>2>1>>>????????????????????????????????????????????????????? ?>>9>*>(>2>1>>>???????????????????????????????????????????????????? ?>>9>*>(>2>*>(>2>1>>>????????????????????????????????????????????????????? ?>>9>*>(>2>1>>>???????????????????????????????????????????????????? ?>>9>*>(>2>*>(>2>1>>>????????????????????????????????????????????????????? ?>>9>*>(>2>1>>>???????????????????????????????????????????????????? ?>>9>*>(>2>*>(>2>1>>>????????????????????????????????????????????????????? ?>>9>*>(>2>1>>>???????????????????????????????????????????????????? ?>>9>*>(>2>*>(>2>1>>>????????????????????????????????????????????????????? ?>>9>*>(>2>1>>>???????????????????????????????????????????????????? ?>>9>*>(>2>*>(>2>1>>>????????????????????????????????????????????????????? ?>>9>*>(>2>1>>>???????????????????????????????????????????????????? ?>>9>*>(>2>*>(>2>1>>>>????????????????????????????????????????????????????? ?>>9>*>(>2>1>>>???????????????????????????????????????????????????? ?>>9>*>(>2>*>(>2>1>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>9>*>(>2>1>>>???????????????????????????????????????????????????? ?>>9>*>(>2>*>(>3>1>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>9>)>(>2>1>>>???????????????????????????????????????????????????? ?>>9>*>(>2>*>(>2>1>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>9>*>(>2>1>>>???????????????????????????????????????????????????? ?>>9>*>(>2>*>(>2>1>>><? ? ? ? ? ? ? ? ?=?>>><? ? ? ? ? ? ? ? ? ? ? ? ? ?=?>>><? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?=?>>9>*>(>2>1>>>???????????????????????????????????????????????????? ?>>9>*>(>2>*>(>2>1>>>????????? ?>>>?????????????? ?>>>?????????????????????? ?>>9>*>(>2>1>>>???????????????????????????????????????????????????? ?>>9>*>(>2>*>(>2>1>>>????????? ??????????????? ??????????????????????? ?>>9>*>(>2>1>>>???????????????????????????????????????????????????? ?>>9>*>(>2>*>(>2>1>>>??????xyz|x:>;>z|q????????xyz|xx:>;>xxz|xq????????????????? ?>>9>*>(>2>1>>>???????????????????????????????????????????????????? ?>>9>*>(>2>*>(>2>1>>>??????{s????????yq????????????????? ?>>9>*>(>2>1>>>???????????????????????????????????????????????????? ?>>9>*>(>2>*>(>2>1>>>??????}u????????yq????????????????? ?>>9>*>(>2>1>>>???????????????????????????????????????????????????? ?>>9>*>(>2>*>(>2>1>>>??????yq????????yq????????????????? ?>>9>*>(>2>1>>>???????????????????????????????????????????????????? ?>>9>*>(>2>*>(>2>1>>>??????yq????????yq????????????????? ?>>9>*>(>2>1>>>???????????????????????????????????????????????????? ?>>9>*>(>2>*>(>2>1>>>??????yq????????p?p?t?p?ypq?r?t?p?????????????????? ?>>9>*>(>2>1>>>???????????????????????????????????????????????????? ?>>9>*>(>2>*>(>2>1>>>??????{s????????????{s????????????????????? ?>>9>*>(>2>1>>>???????????????????????????????????????????????????? ?>>9>*>(>2>*>(>2>1>>>??????}u????????????}u????????????????????? ?>>9>*>(>2>1>>>???????????????????????????????????????????????????? ?>>9>*>(>2>*>(>2>1>>>??????yq????????????yq????????????????????? ?>>9>*>(>2>1>>>???????????????????????????????????????????????????? ?>>9>*>(>2>*>(>2>1>>>??????yq????????????yq????????????????????? ?>>9>*>(>2>1>>>???????????????????????????????????????????????????? ?>>9>*>(>2>*>(>2>1>>>??????p?r?t?p?p?p?r?t?p?????????????r?t?p?r?t?????????????????????? ?>>9>*>(>2>1>>>???????????????????????????????????????????????????? ?>>9>*>(>2>*>(>2>1>>>????????????????????????????????????????????????????? ?>>9>*>(>2>1>>>???????????????????????????????????????????????????? ?>>9>*>(>2>*>(>2>1>>>????????????????????????????????????????????????????? ?>>9>*>(>2>1>>>???????????????????????????????????????????????????? ?>>9>*>(>2>*>(>2>1>>>????????????????????????????????????????????????????? ?>>9>*>(>2>1>>>???????????????????????????????????????????????????? ?>>9>*>(>2>*>(>2>1>>>??????????????????????????????????????????xyxz|xxz|xxq? ?>>9>*>(>2>1>>>???????????????????????????????????????????????????? ?>>9>*>(>2>*>(>2>1>>>??????????????????????????????????????????ys? ?>>9>*>(>2>1>>>???????????????????????????????????????????????????? ?>>9>*>(>2>*>(>2>1>>>??????????????????????????????????????????{u? ?>>9>*>(>2>1>>>???????????????????????????????????????????????????? ?>>9>*>(>2>*>(>2>1>>>??????????????????????????????????????????}q? ?>>9>*>(>2>1>>>???????????????????????????????????????????????????? ?>>9>*>(>2>*>(>2>1>>>??????????????????????????????????????????ys? ?>>9>*>(>2>1>>>???????????????????????????????????????????????????? ?>>9>*>(>2>*>(>2>1>>>??????????????????????????????????????????yu? ?>>9>*>(>2>1>>>???????????????????????????????????????????????????? ?>>9>*>(>2>*>(>2>1>>>??????????????????????????????????????????: ?;>?p?{:? ?>>9>*>(>2>1>>>???????????????????????????????????????????????????? ?>>9>*>(>2>*>(>2>1>>>?????????????????????????????????????????? ?>??};>>>>9>)>(>2>1>>>???????????????????????????????????????????????????? ?>>9>*>(>2>*>(>2>1>>>?????????????????????????????????????????? ?>??y ?=?>>9>*>(>2>1>>>???????????????????????????????????????????????????? ?>>9>*>(>2>*>(>2>1>>>?????????????????????????????????????????? ?>??ys? ?>>9>*>(>2>1>>>???????????????????????????????????????????????????? ?>>9>*>(>2>*>(>2>1>>>?????????????????????????????????????????? ?>??{u? ?>>9>*>(>2>1>>>???????????????????????????????????????????????????? ?>>9>*>(>2>*>(>2>1>>>?????????????????????????????????????????? ?>??}q? ?>>9>*>(>2>1>>>???????????????????????????????????????????????????? ?>>9>*>(>2>*>(>2>1>>>?????????????????????????????????????????? ?>??ys? ?>>9>*>(>2>1>>>???????????????????????????????????????????????????? ?>>9>*>(>2>*>(>2>1>>>?????????????????????????????????????????? ?>??yu? ?>>9>*>(>2>1>>>???????????????????????????????????????????????????? ?>>9>*>(>2>*>(>2>1>>>?????????????????????????????????????????? ?>??yq? ?>>9>*>(>2>1>>>???????????????????????????????????????????????????? ?>>9>*>(>2>*>(>2>1>>>?????????????????????????????????????????? ?>??p?p?r?t?p?p?? ?>>9>*>(>2>1>>>???????????????????????????????????????????????????? ?>>9>*>(>2>*>(>2>1>>>?????????????????????????????????????????? ?>>????????? ?>>9>*>(>2>1>>>???????????????????????????????????????????????????? ?>>9>*>(>2>*>(>2>1>>>?????????????????????????????????????????? ?>>>>>>>>>>>>>9>*>(>2>1>>>???????????????????????????????????????????????????? ?>>9>*>(>2>*>(>2>1>>>?????????????????????????????????????????? ? ? ? ? ? ? ? ? ? ? ?=?>>9>*>(>2>1>>>???????????????????????????????????????????????????? ?>>9>*>(>2>*>(>2>1>>>????????????????????????????????????????????????????? ?>>9>*>(>2>1>>>???????????????????????????????????????????????????? ?>>9>*>(>2>*>(>2>1>>>????????????????????????????????????????????????????? ?>>9>*>(>2>1>>>???????????????????????????????????????????????????? ?>>9>*>(>2>*>(>2>1>>>????????????????????????????????????????????????????? ?>>9>*>(>2>1>>>???????????????????????????????????????????????????? ?>>9>*>(>2>*>(>2>1>>>????????????????????????????????????????????????????? ?>>9>*>(>2>1>>>???????????????????????????????????????????????????? ?>>9>*>(>2>*>(>2>1>>>????????????????????????????????????????????????????? ?>>9>*>(>2>1>>>???????????????????????????????????????????????????? ?>>9>*>(>2>*>(>2>1>>>????????????????????????????????????????????????????? ?>>9>*>(>2>1>>>???????????????????????????????????????????????????? ?>>9>*>(>2>*>(>2>1>>>????????????????????????????????????????????????????? ?>>9>*>(>2>1>>>???????????????????????????????????????????????????? ?>>9>*>(>2>*>(>2>1>>>????????????????????????????????????????????????????? ?>>9>*>(>2>1>>>???????????????????????????????????????????????????? ?>>9>*>(>2>*>(>2>1>>>????????????????????????????????????????????????????? ?>>9>*>(>2>1>>>???????????????????????????????????????????????????? ?>>9>*>(>2>*>(>2>1>>>????????????????????????????????????????????????????? ?>>9>*>(>2>1>>>???????????????????????????????????????????????????? ?>>9>*>(>2>*>(>2>1>>>????????????????????????????????????????????????????? ?>>9>*>(>2>1>>>???????????????????????????????????????????????????? ?>>9>*>(>2>*>(>2>1>>>????????????????????????????????????????????????????? ?>>9>*>(>2>1>>>???????????????????????????????????????????????????? ?>>9>*>(>2>*>(>2>1>>>????????????????????????????????????????????????????? ?>>9>*>(>2>1>>>???????????????????????????????????????????????????? ?>>9>*>(>2>*>(>2>1>>>????????????????????????????????????????????????????? ?>>9>*>(>2>1>>>???????????????????????????????????????????????????? ?>>9>*>(>2>*>(>2>1>>>????????????????????????????????????????????????????? ?>>9>*>(>2>1>>>???????????????????????????????????????????????????? ?>>9>*>(>2>*>(>2>1>>>????????????????????????????????????????????????????? ?>>9>*>(>2>1>>>???????????????????????????????????????????????????? ?>>9>*>(>2>*>(>2>1>>>????????????????????????????????????????????????????? ?>>9>*>(>2>1>>>???????????????????????????????????????????????????? ?>>9>*>(>2>*>(>2>1>>>????????????????????????????????????????????????????? ?>>9>*>(>2>1>>>???????????????????????????????????????????????????? ?>>9>*>(>2>*>(>2>1>>>????????????????????????????????????????????????????? ?>>9>*>(>2>1>>>???????????????????????????????????????????????????? ?>>9>*>(>2>*>(>2>1>>>????????????????????????????????????????????????????? ?>>9>*>(>2>1>>>???????????????????????????????????????????????????? ?>>9>*>(>2>*>(>2>1>>>????????????????????????????????????????????????????? ?>>9>*>(>2>1>>>???????????????????????????????????????????????????? ?>>9>*>(>2>*>(>2>1>>>????????????????????????????????????????????????????? ?>>9>*>(>2>1>>>???????????????????????????????????????????????????? ?>>9>*>(>2>*>(>2>1>>>????????????????????????????????????????????????????? ?>>9>*>(>2>1>>>???????????????????????????????????????????????????? ?>>9>*>(>2>*>(>2>1>>>????????????????????????????????????????????????????? ?>>9>*>(>2>1>>>???????????????????????????????????????????????????? ?>>9>*>(>2>*>(>2>1>>>????????????????????????????????????????????????????? ?>>9>*>(>2>1>>>???????????????????????????????????????????????????? ?>>9>*>(>2>*>(>2>1>>>????????????????????????????????????????????????????? ?>>9>*>(>2>1>>>???????????????????????????????????????????????????? ?>>9>*>(>2>*>(>2>1>>>????????????????????????????????????????????????????? ?>>9>*>(>2>1>>>???????????????????????????????????????????????????? ?>>9>*>(>2>*>(>2>1>>>????????????????????????????????????????????????????? ?>>9>*>(>2>1>>>???????????????????????????????????????????????????? ?>>9>*>(>2>*>(>2>1>>>????????????????????????????????????????????????????? ?>>9>*>(>2>1>>>???????????????????????????????????????????????????? ?>>9>*>(>2>*>(>2>1>>>????????????????????????????????????????????????????? ?>>9>*>(>2>1>>>???????????????????????????????????????????????????? ?>>9>*>(>2>*>(>2>1>>>????????????????????????????????????????????????????? ?>>9>*>(>2>1>>>???????????????????????????????????????????????????? ?>>9>*>(>2>*>(>2>1>>>????????????????????????????????????????????????????? ?>>9>*>(>2>1>>>???????????????????????????????????????????????????? ?>>9>*>(>2>*>(>2>1>>>????????????????????????????????????????????????????? ?>>9>*>(>2>1>>>???????????????????????????????????????????????????? ?>>9>*>(>2>*>(>2>1>>>????????????????????????????????????????????????????? ?>>9>*>(>2>1>>>???????????????????????????????????????????????????? ?>>9>*>(>2>*>(>2>1>>>????????????????????????????????????????????????????? ?>>9>*>(>2>1>>>???????????????????????????????????????????????????? ?>>9>*>(>2>*>(>2>1>>>????????????????????????????????????????????????????? ?>>9>*>(>2>1>>>???????????????????????????????????????????????????? ?>>9>*>(>2>*>(>2>1>>>????????????????????????????????????????????????????? ?>>9>*>(>2>1>>>???????????????????????????????????????????????????? ?>>9>*>(>2>*>(>2>1>>>????????????????????????????????????????????????????? ?>>9>*>(>2>1>>>???????????????????????????????????????????????????? ?>>9>*>(>2>*>(>2>1>>>????????????????????????????????????????????????????? ?>>9>*>(>2>1>>>???????????????????????????????????????????????????? ?>>9>*>(>2>*>(>2>1>>>????????????????????????????????????????????????????? ?>>9>*>(>2>1>>>???????????????????????????????????????????????????? ?>>9>*>(>2>*>(>2>1>>>????????????????????????????????????????????????????? ?>>9>*>(>2>1>>>???????????????????????????????????????????????????? ?>>9>*>(>2>*>(>2>1>>>????????????????????????????????????????????????????? ?>>9>*>(>2>1>>>???????????????????????????????????????????????????? ?>>9>*>(>2>*>(>2>1>>>????????????????????????????????????????????????????? ?>>9>*>(>2>1>>>???????????????????????????????????????????????????? ?>>9>*>(>2>*>(>2>1>>>????????????????????????????????????????????????????? ?>>9>*>(>2>1>>>???????????????????????????????????????????????????? ?>>9>*>(>2>*>(>2>1>>>????????????????????????????????????????????????????? ?>>9>*>(>2>1>>>???????????????????????????????????????????????????? ?>>9>*>(>2>*>(>2>1>>>????????????????????????????????????????????????????? ?>>9>*>(>2>1>>>???????????????????????????????????????????????????? ?>>9>*>(>2>*>(>2>1>>>????????????????????????????????????????????????????? ?>>9>*>(>2>1>>>???????????????????????????????????????????????????? ?>>9>*>(>2>*>(>2>1>>>????????????????????????????????????????????????????? ?>>9>*>(>2>1>>>???????????????????????????????????????????????????? ?>>9>*>(>2>*>(>2>1>>>????????????????????????????????????????????????????? ?>>9>*>(>2>1>>>???????????????????????????????????????????????????? ?>>9>*>(>2>*>(>2>1>>>????????????????????????????????????????????????????? ?>>9>*>(>2>1>>>???????????????????????????????????????????????????? ?>>9>*>(>2>*>(>2>1>>>????????????????????????????????????????????????????? ?>>9>*>(>2>1>>>???????????????????????????????????????????????????? ?>>9>*>(>2>*>(>2>1>>>????????????????????????????????????????????????????? ?>>9>*>(>2>1>>>???????????????????????????????????????????????????? ?>>9>*>(>2>*>(>2>1>>>????????????????????????????????????????????????????? ?>>9>*>(>2>1>>>????????????????????CorsixTH-0.63/CorsixTH/Levels/demo.level000066400000000000000000000120301347163623700200670ustar00rootroot00000000000000Copyright (c) 2010-2014 Edvin "Lego3" Linge 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. ---------------------- General Information ------------------------- %Name = "Demo Town" %MapFile = "LEVEL.L1" %LevelBriefing = "This is the only map available as long as you use the Theme Hospital Demo files." %LevelDebriefing = "That was not too hard right? Time to get the real deal?" #town.StartCash 60000 -------------------- Disease Configuration ------------------------- When a drug is researched, what effectiveness does it have #gbv.StartRating 100 #expertise[2].Known.RschReqd 1 40000 BLOATY_HEAD #expertise[4].Known.RschReqd 1 60000 ELVIS #expertise[5].Known.RschReqd 1 60000 INVIS #expertise[7].Known.RschReqd 0 40000 SLACK_TONGUE #expertise[10].Known.RschReqd 0 40000 BALDNESS #expertise[11].Known.RschReqd 1 40000 DISCRETE_ITCHING #expertise[13].Known.RschReqd 0 40000 SLEEPING_ILLNESS #expertise[15].Known.RschReqd 0 40000 TRANSPARENCY #expertise[16].Known.RschReqd 0 20000 UNCOMMON_COLD #expertise[17].Known.RschReqd 0 60000 BROKEN_WIND #expertise[18].Known.RschReqd 0 20000 SPARE_RIBS #expertise[19].Known.RschReqd 0 20000 KIDNEY_BEANS #expertise[20].Known.RschReqd 0 20000 BROKEN_HEART #expertise[22].Known.RschReqd 1 40000 MULTIPLE_TV_PERSONALITIES #expertise[23].Known.RschReqd 0 60000 INFECTIOUS_LAUGHTER #expertise[24].Known.RschReqd 0 40000 CORRUGATED_ANKLES #expertise[25].Known.RschReqd 0 40000 CHRONIC_NOSEHAIR #expertise[28].Known.RschReqd 0 40000 GASTRIC_EJECTIONS #expertise[29].Known.RschReqd 0 20000 THE_SQUITS #expertise[31].Known.RschReqd 0 40000 SWEATY_PALMS #expertise[32].Known.RschReqd 0 20000 HEAPED_PILES #expertise[33].Known.RschReqd 0 20000 GUT_ROT #expertise[34].Known.RschReqd 0 20000 GOLF_STONES #expertise[35].Known.RschReqd 0 20000 UNEXPECTED_SWELLING #expertise[36].Known.RschReqd 1 40000 I_D_SCANNER DIAGNOSIS #expertise[38].Known.RschReqd 1 20000 I_D_CARDIO DIAGNOSIS #expertise[39].Known.RschReqd 0 30000 I_D_XRAY DIAGNOSIS #expertise[41].Known.RschReqd 1 20000 I_D_STANDARD DIAGNOSIS #expertise[42].Known.RschReqd 1 20000 I_D_WARD DIAGNOSIS #expertise[43].Known.RschReqd 1 20000 I_D_SHRINK DIAGNOSIS #objects[9].StartAvail.StartStrength.AvailableForLevel 1 8 1 Inflator Machine #objects[13].StartAvail.StartStrength.AvailableForLevel 1 13 1 Cardiogram #objects[14].StartAvail.StartStrength.AvailableForLevel 0 12 1 Scanner #objects[25].StartAvail.StartStrength.AvailableForLevel 0 8 1 Hair restorer #objects[26].StartAvail.StartStrength.AvailableForLevel 1 10 1 Slicer for slack tongues #objects[27].StartAvail.StartStrength.AvailableForLevel 0 12 1 X-Ray #objects[30].StartAvail.StartStrength.AvailableForLevel 0 12 1 Operating Table #objects[55].StartAvail.StartStrength.AvailableForLevel 1 10 1 Autopsy Research Machine #visuals[0] 1 I_BLOATY_HEAD #visuals[2] 1 I_ELVIS #visuals[3] 1 I_INVIS #visuals[5] 1 I_SLACK_TONGUE #visuals[8] 1 I_BALDNESS #visuals[9] 1 I_DISCRETE_ITCHING #visuals[11] 1 I_SLEEPING_ILLNESS #visuals[13] 1 I_TRANSPARENCY #non_visuals[0] 1 I_UNCOMMON_COLD #non_visuals[1] 1 I_BROKEN_WIND #non_visuals[2] 1 I_SPARE_RIBS #non_visuals[3] 1 I_KIDNEY_BEANS #non_visuals[4] 1 I_BROKEN_HEART #non_visuals[6] 1 I_MULTIPLE_TV_PERSONALITIES #non_visuals[7] 1 I_INFECTIOUS_LAUGHTER #non_visuals[8] 1 I_CORRUGATED_ANKLES #non_visuals[9] 1 I_CHRONIC_NOSEHAIR #non_visuals[12] 1 I_GASTRIC_EJECTIONS #non_visuals[13] 1 I_THE_SQUITS #non_visuals[15] 1 I_SWEATY_PALMS #non_visuals[16] 1 I_HEAPED_PILES #non_visuals[17] 1 I_GUT_ROT #non_visuals[19] 1 I_UNEXPECTED_SWELLING #win_criteria[0].Criteria.MaxMin.Value.Group.Bound 1 1 700 1 0 #win_criteria[1].Criteria.MaxMin.Value.Group.Bound 2 1 100000 1 0 #win_criteria[2].Criteria.MaxMin.Value.Group.Bound 3 1 75 1 0 #win_criteria[3].Criteria.MaxMin.Value.Group.Bound 6 1 70000 1 0 #lose_criteria[0].Criteria.MaxMin.Value.Group.Bound 1 0 300 1 350 #lose_criteria[1].Criteria.MaxMin.Value.Group.Bound 5 1 40 2 0 --------------------- Competitor Information ----------------------- #computer[12].Playing 1 CORSIX #computer[13].Playing 1 ROUJIN #computer[14].Playing 1 EDVIN CorsixTH-0.63/CorsixTH/Levels/example.level000066400000000000000000000273661347163623700206200ustar00rootroot00000000000000Copyright (c) 2010 Edvin "Lego3" Linge 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. Only lines beginning with % or # as explained below will be considered by the game. Each line beginning with a %-sign is a directive to use when loading the game, such as the name of the level and where to find the map file. Available commands: - Name: What the level should be called (within quotes) - MapFile: The name of the binary map file to load. First the Levels directory of the original game will be searched, and then the Levels directory of CorsixTH. - LevelBriefing: The body of text shown before you start a custom scenario, and as first information when you have just started a new level. Everything between the citation marks will get included. If you use new lines: One new line is simply discarded, while two new lines in a row creates a new paragraph. So does the special expression // (legacy from Theme Hospital) - LevelDebriefing: Text shown in the fax when you win a level. Lines that begin with # defines all parameters for the level. By default there are no diseases and only some basic rooms are available. ---------------------- General Information ------------------------- %Name = "Example Town" %MapFile = "Example.map" Everything within citation marks will be the briefing/debriefing. Two new lines creates a new paragraph, but additional new lines in a row are discarded. %LevelBriefing = "This is an example map that shows aspiring map makers what can be done when making new fantastic creations!" %LevelDebriefing = "Congratulations! You played through the example map. Time to do your own?" Town properties InterestRate is defined as centiprocent to allow for two decimals precision, i.e. 300 means 3 % #town.StartCash.InterestRate 100000 300 -------------------- Disease Configuration ------------------------- When a drug is researched, what effectiveness does it have #gbv.StartRating 100 The following table contains all diagnoses and treatments that shows up in the drug casebook in the game. Known specifies whether it should show up from the beginning of the level and RschReqd how much research is required to discover the treatment room for the disease, MaxDiagDiff is how hard it is to diagnose (don't apply to diag rooms). #expertise[1].Known.RschReqd 1 0 GENERAL_PRACTICE #expertise[2].Known.RschReqd.MaxDiagDiff 1 40000 500 BLOATY_HEAD #expertise[3].Known.RschReqd.MaxDiagDiff 1 40000 150 HAIRYITUS #expertise[4].Known.RschReqd.MaxDiagDiff 1 60000 150 ELVIS #expertise[5].Known.RschReqd.MaxDiagDiff 1 60000 150 INVIS #expertise[6].Known.RschReqd.MaxDiagDiff 1 60000 750 RADIATION #expertise[7].Known.RschReqd.MaxDiagDiff 1 40000 150 SLACK_TONGUE #expertise[8].Known.RschReqd.MaxDiagDiff 1 60000 350 ALIEN #expertise[9].Known.RschReqd.MaxDiagDiff 1 20000 100 BROKEN_BONES #expertise[10].Known.RschReqd.MaxDiagDiff 1 40000 150 BALDNESS #expertise[11].Known.RschReqd.MaxDiagDiff 1 40000 500 DISCRETE_ITCHING #expertise[12].Known.RschReqd.MaxDiagDiff 1 40000 450 JELLYITUS #expertise[13].Known.RschReqd.MaxDiagDiff 1 40000 500 SLEEPING_ILLNESS #expertise[14].Known.RschReqd.MaxDiagDiff 1 30000 300 PREGNANT #expertise[15].Known.RschReqd.MaxDiagDiff 1 40000 250 TRANSPARENCY #expertise[16].Known.RschReqd.MaxDiagDiff 1 20000 250 UNCOMMON_COLD #expertise[17].Known.RschReqd.MaxDiagDiff 1 60000 750 BROKEN_WIND #expertise[18].Known.RschReqd.MaxDiagDiff 1 20000 250 SPARE_RIBS #expertise[19].Known.RschReqd.MaxDiagDiff 1 20000 500 KIDNEY_BEANS #expertise[20].Known.RschReqd.MaxDiagDiff 1 20000 500 BROKEN_HEART #expertise[21].Known.RschReqd.MaxDiagDiff 1 20000 600 RUPTURED_NODULES #expertise[22].Known.RschReqd.MaxDiagDiff 1 40000 250 MULTIPLE_TV_PERSONALITIES #expertise[23].Known.RschReqd.MaxDiagDiff 1 60000 250 INFECTIOUS_LAUGHTER #expertise[24].Known.RschReqd.MaxDiagDiff 1 40000 500 CORRUGATED_ANKLES #expertise[25].Known.RschReqd.MaxDiagDiff 1 40000 600 CHRONIC_NOSEHAIR #expertise[26].Known.RschReqd.MaxDiagDiff 1 40000 300 3RD_DEGREE_SIDEBURNS #expertise[27].Known.RschReqd.MaxDiagDiff 1 40000 300 FAKE_BLOOD #expertise[28].Known.RschReqd.MaxDiagDiff 1 40000 500 GASTRIC_EJECTIONS #expertise[29].Known.RschReqd.MaxDiagDiff 1 20000 750 THE_SQUITS #expertise[30].Known.RschReqd.MaxDiagDiff 1 20000 700 IRON_LUNGS #expertise[31].Known.RschReqd.MaxDiagDiff 1 40000 750 SWEATY_PALMS #expertise[32].Known.RschReqd.MaxDiagDiff 1 20000 500 HEAPED_PILES #expertise[33].Known.RschReqd.MaxDiagDiff 1 20000 750 GUT_ROT #expertise[34].Known.RschReqd.MaxDiagDiff 1 20000 500 GOLF_STONES #expertise[35].Known.RschReqd.MaxDiagDiff 1 20000 500 UNEXPECTED_SWELLING #expertise[36].Known.RschReqd 1 40000 I_D_SCANNER DIAGNOSIS #expertise[37].Known.RschReqd 1 50000 I_D_BLOOD_MACHINE DIAGNOSIS #expertise[38].Known.RschReqd 1 20000 I_D_CARDIO DIAGNOSIS #expertise[39].Known.RschReqd 1 30000 I_D_XRAY DIAGNOSIS #expertise[40].Known.RschReqd 1 60000 I_D_ULTRASCAN DIAGNOSIS #expertise[41].Known.RschReqd 1 20000 I_D_STANDARD DIAGNOSIS #expertise[42].Known.RschReqd 1 20000 I_D_WARD DIAGNOSIS #expertise[43].Known.RschReqd 1 20000 I_D_SHRINK DIAGNOSIS | Objects available | Available from the start | Strength | Available for this level | Comment #objects[9].StartAvail.StartStrength.AvailableForLevel 1 8 1 Inflator Machine #objects[13].StartAvail.StartStrength.AvailableForLevel 1 13 1 Cardiogram #objects[14].StartAvail.StartStrength.AvailableForLevel 1 12 1 Scanner #objects[22].StartAvail.StartStrength.AvailableForLevel 1 9 1 Ultrascan #objects[23].StartAvail.StartStrength.AvailableForLevel 1 7 1 DNA Restorer #objects[24].StartAvail.StartStrength.AvailableForLevel 1 11 1 Cast Remover #objects[25].StartAvail.StartStrength.AvailableForLevel 1 8 1 Hair restorer #objects[26].StartAvail.StartStrength.AvailableForLevel 1 10 1 Slicer for slack tongues #objects[27].StartAvail.StartStrength.AvailableForLevel 1 12 1 X-Ray #objects[30].StartAvail.StartStrength.AvailableForLevel 1 12 1 Operating Table #objects[37].StartAvail.StartStrength.AvailableForLevel 1 0 1 Projector #objects[42].StartAvail.StartStrength.AvailableForLevel 1 10 1 Blood Machine #objects[46].StartAvail.StartStrength.AvailableForLevel 1 8 1 Electrolysis Machine #objects[47].StartAvail.StartStrength.AvailableForLevel 1 7 1 Jellyitus Moulding Machine #objects[54].StartAvail.StartStrength.AvailableForLevel 1 10 1 Decontamination Shower #objects[55].StartAvail.StartStrength.AvailableForLevel 1 10 1 Autopsy Research Machine | Diseases available | Value property to be determined | Comment #visuals[0] 1 I_BLOATY_HEAD #visuals[1] 1 I_HAIRYITUS #visuals[2] 1 I_ELVIS #visuals[3] 1 I_INVIS #visuals[4] 1 I_RADIATION #visuals[5] 1 I_SLACK_TONGUE #visuals[6] 1 I_ALIEN #visuals[7] 1 I_BROKEN_BONES #visuals[8] 1 I_BALDNESS #visuals[9] 1 I_DISCRETE_ITCHING #visuals[10] 1 I_JELLYITUS #visuals[11] 1 I_SLEEPING_ILLNESS #visuals[12] 1 I_PREGNANT #visuals[13] 1 I_TRANSPARENCY #non_visuals[0] 1 I_UNCOMMON_COLD #non_visuals[1] 1 I_BROKEN_WIND #non_visuals[2] 1 I_SPARE_RIBS #non_visuals[3] 1 I_KIDNEY_BEANS #non_visuals[4] 1 I_BROKEN_HEART #non_visuals[5] 1 I_RUPTURED_NODULES #non_visuals[6] 1 I_MULTIPLE_TV_PERSONALITIES #non_visuals[7] 1 I_INFECTIOUS_LAUGHTER #non_visuals[8] 1 I_CORRUGATED_ANKLES #non_visuals[9] 1 I_CHRONIC_NOSEHAIR #non_visuals[10] 1 I_3RD_DEGREE_SIDEBURNS #non_visuals[11] 1 I_FAKE_BLOOD #non_visuals[12] 1 I_GASTRIC_EJECTIONS #non_visuals[13] 1 I_THE_SQUITS #non_visuals[14] 1 I_IRON_LUNGS #non_visuals[15] 1 I_SWEATY_PALMS #non_visuals[16] 1 I_HEAPED_PILES #non_visuals[17] 1 I_GUT_ROT #non_visuals[18] 1 I_GOLF_STONES #non_visuals[19] 1 I_UNEXPECTED_SWELLING ---------------------- Staff Configuration ------------------------- Each entry states how many staff members of each category are available a given month. The number of entries is not fixed. | A list | Month it gets active (start at 0) | Each group | #staff_levels[0].Month.Nurses.Doctors.Handymen.Receptionists.ShrkRate.SurgRate.RschRate.ConsRate.JrRate 0 8 8 3 2 10 10 10 10 5 #staff_levels[1].Month.Nurses.Doctors.Handymen.Receptionists 3 7 5 5 3 #staff_levels[2].Month.Nurses.Doctors.Handymen.Receptionists 5 5 8 7 4 The minimum salary for each staff type #staff[0].MinSalary 60 Nurse #staff[1].MinSalary 75 Doctor #staff[2].MinSalary 25 Handyman #staff[3].MinSalary 20 Receptionist Salary modifiers for different doctor attributes #gbv.SalaryAdd[3] -30 Junior #gbv.SalaryAdd[4] 30 Doctor #gbv.SalaryAdd[5] 40 Surgeon #gbv.SalaryAdd[6] 30 Psychiatrist #gbv.SalaryAdd[7] 100 Consultant #gbv.SalaryAdd[8] 20 Researcher How much the skill of the doctor adds to the salary. skill * 1000 / divisor #gbv.SalaryAbilityDivisor 10 #gbv.TrainingRate 40 #gbv.AbilityThreshold[0] 75 Surgeon #gbv.AbilityThreshold[1] 60 Psychiatrist #gbv.AbilityThreshold[2] 45 Researcher #gbv.TrainingValue[0] 10 Projector #gbv.TrainingValue[1] 15 Skeleton #gbv.TrainingValue[2] 20 Bookcase --------------------- Research Configuration ----------------------- Divides research input to get the amount of research points. must be > 0 #gbv.ResearchPointsDivisor 5 ---------------------- Awards and Trophies ------------------------- #awards_trophies.CansofCoke 200 #awards_trophies.CansofCokeBonus 10000 #awards_trophies.Reputation 850 #awards_trophies.TrophyReputationBonus 20000 ------------------ Winning and Losing Conditions ------------------- But we don't want any such conditions on the example level! 1 Total reputation 2 Balance total 3 Percentage people your hospital has handled 4 Percentage people have been cured 5 Percentage people have been killed 6 Hospital value #win_criteria[0].Criteria.MaxMin.Value.Group.Bound 0 0 0 0 0 #win_criteria[1].Criteria.MaxMin.Value.Group.Bound 0 0 0 0 0 #win_criteria[2].Criteria.MaxMin.Value.Group.Bound 0 0 0 0 0 #win_criteria[3].Criteria.MaxMin.Value.Group.Bound 0 0 0 0 0 #win_criteria[4].Criteria.MaxMin.Value.Group.Bound 0 0 0 0 0 #win_criteria[5].Criteria.MaxMin.Value.Group.Bound 0 0 0 0 0 #lose_criteria[0].Criteria.MaxMin.Value.Group.Bound 0 0 0 0 0 #lose_criteria[1].Criteria.MaxMin.Value.Group.Bound 0 0 0 0 0 #lose_criteria[2].Criteria.MaxMin.Value.Group.Bound 0 0 0 0 0 #lose_criteria[3].Criteria.MaxMin.Value.Group.Bound 0 0 0 0 0 #lose_criteria[4].Criteria.MaxMin.Value.Group.Bound 0 0 0 0 0 #lose_criteria[5].Criteria.MaxMin.Value.Group.Bound 0 0 0 0 0 --------------------- Competitor Information ----------------------- | Index in the away "computer" | Is that opponent playing? | 1 is yes, 0 no | Comment | #computer[12].Playing 1 CORSIX #computer[13].Playing 1 ROUJIN #computer[14].Playing 1 EDVIN ----------------------- Emergency Control -------------------------- #emergency_control[0].StartMonth.EndMonth.Min.Max.Illness.PercWin.Bonus 4 5 4 6 16 75 400 #emergency_control[1].StartMonth.EndMonth.Min.Max.Illness.PercWin.Bonus 8 10 3 5 32 75 500 CorsixTH-0.63/CorsixTH/Levels/finisham.level000066400000000000000000000330041347163623700207450ustar00rootroot00000000000000Copyright (c) 2013 Mark "MarkL" Lawlor 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. ---------------------- General Information ------------------------- %Name = "Finisham" %MapFile = "finisham.map" %LevelBriefing = "The Ministry of Health wants you to run his newest hospital in the holiday resort of Finisham. This hospital is located in a popular tourist spot and they are opening a Theme Park nearby next year, so expect seasonal peaks in visitors. You are expected to run a superb hospital with the highest of standards; he expects nothing less than perfection. You should aim to keep queues to a minimum and keep your staff happy at the same time. Get a reputation of at least 700, treat 85% of your visitors, cure 900 patients, amass $500,000 in the bank and have a hospital worth $400,000 to keep the Minister happy and make him a big wad of cash at the same time." %LevelDebriefing = "Extremely good work! Where to next?" Town properties InterestRate is defined as centiprocent to allow for two decimals precision, i.e. 300 means 3 % #town.StartCash.InterestRate 30000 1200 -------------------- Disease Configuration ------------------------- When a drug is researched, what effectiveness does it have #gbv.StartRating 80 The following table contains all diagnoses and treatments that shows up inthe drug casebook in the game. Known specifies whether it should show up from the beginning of the level and RschReqd how much research is required to discover the treatment room for the disease. #expertise[1].Known.RschReqd 1 0 GENERAL_PRACTICE #expertise[2].Known.RschReqd 1 40000 BLOATY_HEAD #expertise[3].Known.RschReqd 0 40000 HAIRYITUS #expertise[4].Known.RschReqd 0 60000 ELVIS #expertise[5].Known.RschReqd 0 60000 INVIS #expertise[6].Known.RschReqd 0 60000 RADIATION #expertise[7].Known.RschReqd 0 40000 SLACK_TONGUE #expertise[8].Known.RschReqd 0 60000 ALIEN #expertise[9].Known.RschReqd 0 20000 BROKEN_BONES #expertise[10].Known.RschReqd 0 40000 BALDNESS #expertise[11].Known.RschReqd 0 40000 DISCRETE_ITCHING #expertise[12].Known.RschReqd 0 40000 JELLYITUS #expertise[13].Known.RschReqd 0 40000 SLEEPING_ILLNESS #expertise[14].Known.RschReqd 0 30000 PREGNANT #expertise[15].Known.RschReqd 0 40000 TRANSPARENCY #expertise[16].Known.RschReqd 0 20000 UNCOMMON_COLD #expertise[17].Known.RschReqd 0 60000 BROKEN_WIND #expertise[18].Known.RschReqd 0 20000 SPARE_RIBS #expertise[19].Known.RschReqd 0 20000 KIDNEY_BEANS #expertise[20].Known.RschReqd 0 20000 BROKEN_HEART #expertise[21].Known.RschReqd 0 20000 RUPTURED_NODULES #expertise[22].Known.RschReqd 0 40000 MULTIPLE_TV_PERSONALITIES #expertise[23].Known.RschReqd 1 60000 INFECTIOUS_LAUGHTER #expertise[24].Known.RschReqd 0 40000 CORRUGATED_ANKLES #expertise[25].Known.RschReqd 0 40000 CHRONIC_NOSEHAIR #expertise[26].Known.RschReqd 0 40000 3RD_DEGREE_SIDEBURNS #expertise[27].Known.RschReqd 0 40000 FAKE_BLOOD #expertise[28].Known.RschReqd 0 40000 GASTRIC_EJECTIONS #expertise[29].Known.RschReqd 1 20000 THE_SQUITS #expertise[30].Known.RschReqd 0 20000 IRON_LUNGS #expertise[31].Known.RschReqd 0 40000 SWEATY_PALMS #expertise[32].Known.RschReqd 0 20000 HEAPED_PILES #expertise[33].Known.RschReqd 0 20000 GUT_ROT #expertise[34].Known.RschReqd 0 20000 GOLF_STONES #expertise[35].Known.RschReqd 0 20000 UNEXPECTED_SWELLING #expertise[36].Known.RschReqd 0 40000 I_D_SCANNER DIAGNOSIS #expertise[37].Known.RschReqd 0 50000 I_D_BLOOD_MACHINE DIAGNOSIS #expertise[38].Known.RschReqd 0 20000 I_D_CARDIO DIAGNOSIS #expertise[39].Known.RschReqd 0 30000 I_D_XRAY DIAGNOSIS #expertise[40].Known.RschReqd 0 60000 I_D_ULTRASCAN DIAGNOSIS #expertise[41].Known.RschReqd 1 20000 I_D_STANDARD DIAGNOSIS #expertise[42].Known.RschReqd 1 20000 I_D_WARD DIAGNOSIS #expertise[43].Known.RschReqd 1 20000 I_D_SHRINK DIAGNOSIS | Objects available | Available from the start | Strength | Available for this level | Comment #objects[9].StartAvail.StartStrength.AvailableForLevel 1 8 1 Inflator Machine #objects[13].StartAvail.StartStrength.AvailableForLevel 1 13 1 Cardiogram #objects[14].StartAvail.StartStrength.AvailableForLevel 0 12 1 Scanner #objects[22].StartAvail.StartStrength.AvailableForLevel 0 9 1 Ultrascan #objects[23].StartAvail.StartStrength.AvailableForLevel 0 7 1 DNA Restorer #objects[24].StartAvail.StartStrength.AvailableForLevel 0 11 1 Cast Remover #objects[25].StartAvail.StartStrength.AvailableForLevel 0 8 1 Hair restorer #objects[26].StartAvail.StartStrength.AvailableForLevel 0 10 1 Slicer for slack tongues #objects[27].StartAvail.StartStrength.AvailableForLevel 0 12 1 X-Ray #objects[30].StartAvail.StartStrength.AvailableForLevel 1 12 1 Operating Table #objects[37].StartAvail.StartStrength.AvailableForLevel 1 0 1 Projector #objects[40].StartAvail.StartStrength.AvailableForLevel 0 1 1 Research Computer #objects[41].StartAvail.StartStrength.AvailableForLevel 0 1 1 Chemical Mixer #objects[42].StartAvail.StartStrength.AvailableForLevel 0 10 1 Blood Machine #objects[46].StartAvail.StartStrength.AvailableForLevel 0 8 1 Electrolysis Machine #objects[47].StartAvail.StartStrength.AvailableForLevel 0 7 1 Jellyitus Moulding Machine #objects[54].StartAvail.StartStrength.AvailableForLevel 0 10 1 Decontamination Shower #objects[55].StartAvail.StartStrength.AvailableForLevel 1 10 1 Autopsy Research Machine #objects[57].StartAvail.StartStrength.AvailableForLevel 0 57 1 Video Game #visuals[0] 1 I_BLOATY_HEAD #visuals[1] 21 I_HAIRYITUS #visuals[2] 7 I_ELVIS #visuals[3] 9 I_INVIS #visuals[4] 23 I_RADIATION #visuals[5] 11 I_SLACK_TONGUE #visuals[6] 41 I_ALIEN #visuals[7] 11 I_BROKEN_BONES #visuals[8] 12 I_BALDNESS #visuals[9] 5 I_DISCRETE_ITCHING #visuals[10] 12 I_JELLYITUS #visuals[11] 1 I_SLEEPING_ILLNESS #visuals[12] 18 I_PREGNANT #visuals[13] 16 I_TRANSPARENCY #non_visuals[0] 1 I_UNCOMMON_COLD #non_visuals[1] 3 I_BROKEN_WIND #non_visuals[2] 19 I_SPARE_RIBS #non_visuals[3] 31 I_KIDNEY_BEANS #non_visuals[4] 25 I_BROKEN_HEART #non_visuals[5] 18 I_RUPTURED_NODULES #non_visuals[6] 1 I_MULTIPLE_TV_PERSONALITIES #non_visuals[7] 14 I_INFECTIOUS_LAUGHTER #non_visuals[8] 21 I_CORRUGATED_ANKLES #non_visuals[9] 15 I_CHRONIC_NOSEHAIR #non_visuals[10] 1 I_3RD_DEGREE_SIDEBURNS #non_visuals[11] 31 I_FAKE_BLOOD #non_visuals[12] 13 I_GASTRIC_EJECTIONS #non_visuals[13] 6 I_THE_SQUITS #non_visuals[14] 9 I_IRON_LUNGS #non_visuals[15] 9 I_SWEATY_PALMS #non_visuals[16] 15 I_HEAPED_PILES #non_visuals[17] 18 I_GUT_ROT #non_visuals[18] 7 I_GOLF_STONES #non_visuals[19] 5 I_UNEXPECTED_SWELLING ---------------------- Staff Configuration ------------------------- Each entry states how many staff members of each category are available a given month. The number of entries is not fixed. | A list | Month it gets active (start at 0) | Each group | #staff_levels[0].Month.Nurses.Doctors.Handymen.Receptionists 0 8 8 3 2 #staff_levels[1].Month.Nurses.Doctors.Handymen.Receptionists 3 7 5 5 3 #staff_levels[2].Month.Nurses.Doctors.Handymen.Receptionists 5 5 8 7 4 The minimum salary for each staff type #staff[0].MinSalary 60 Nurse #staff[1].MinSalary 75 Doctor #staff[2].MinSalary 25 Handyman #staff[3].MinSalary 20 Receptionist Salary modifiers for different doctor attributes #gbv.SalaryAdd[3] -30 Junior #gbv.SalaryAdd[4] 30 Doctor #gbv.SalaryAdd[5] 40 Surgeon #gbv.SalaryAdd[6] 30 Psychiatrist #gbv.SalaryAdd[7] 100 Consultant #gbv.SalaryAdd[8] 20 Researcher How much the skill of the doctor adds to the salary. skill * 1000 / divisor #gbv.SalaryAbilityDivisor 10 #gbv.LandCostPerTile 75 #gbv.TrainingRate 40 #gbv.AbilityThreshold[0] 75 Surgeon #gbv.AbilityThreshold[1] 60 Psychiatrist #gbv.AbilityThreshold[2] 45 Researcher #gbv.TrainingValue[0] 10 Projector #gbv.TrainingValue[1] 15 Skeleton #gbv.TrainingValue[2] 20 Bookcase #popn[0].Month.Change 0 2 #popn[1].Month.Change 3 0 #popn[2].Month.Change 18 20 #popn[3].Month.Change 21 -58 #popn[4].Month.Change 22 0 #popn[5].Month.Change 30 25 #popn[6].Month.Change 33 -76 #popn[7].Month.Change 34 0 #popn[8].Month.Change 42 28 #popn[9].Month.Change 45 -85 #popn[10].Month.Change 46 0 #popn[11].Month.Change 54 30 #popn[12].Month.Change 57 -90 #popn[13].Month.Change 58 0 #popn[14].Month.Change 66 30 #popn[15].Month.Change 69 -90 #popn[16].Month.Change 70 0 #popn[17].Month.Change 78 30 #popn[18].Month.Change 81 -90 #popn[19].Month.Change 82 0 #popn[20].Month.Change 90 30 #popn[21].Month.Change 93 -90 #popn[22].Month.Change 94 0 #popn[23].Month.Change 102 30 #popn[24].Month.Change 105 -90 #popn[25].Month.Change 106 0 #popn[26].Month.Change 114 30 #popn[27].Month.Change 117 -65 #popn[28].Month.Change 118 0 #quake_control[0].StartMonth.EndMonth.Severity 5 10 1 #quake_control[1].StartMonth.EndMonth.Severity 15 20 2 #quake_control[2].StartMonth.EndMonth.Severity 25 30 4 #quake_control[3].StartMonth.EndMonth.Severity 35 40 5 #quake_control[4].StartMonth.EndMonth.Severity 45 50 1 #quake_control[5].StartMonth.EndMonth.Severity 55 60 2 #quake_control[6].StartMonth.EndMonth.Severity 65 70 4 #quake_control[7].StartMonth.EndMonth.Severity 75 80 6 #quake_control[8].StartMonth.EndMonth.Severity 85 90 1 #quake_control[9].StartMonth.EndMonth.Severity 95 100 2 #quake_control[10].StartMonth.EndMonth.Severity 105 110 4 #quake_control[11].StartMonth.EndMonth.Severity 125 130 8 #emergency_control[0].StartMonth.EndMonth.Min.Max.Illness.PercWin.Bonus 4 8 4 6 23 75 1500 #emergency_control[1].StartMonth.EndMonth.Min.Max.Illness.PercWin.Bonus 12 16 8 10 2 75 1000 #emergency_control[2].StartMonth.EndMonth.Min.Max.Illness.PercWin.Bonus 20 24 5 9 27 75 1000 #emergency_control[3].StartMonth.EndMonth.Min.Max.Illness.PercWin.Bonus 28 32 10 14 33 75 500 #emergency_control[4].StartMonth.EndMonth.Min.Max.Illness.PercWin.Bonus 36 40 4 5 8 75 2500 #emergency_control[5].StartMonth.EndMonth.Min.Max.Illness.PercWin.Bonus 44 48 2 2 30 75 1800 #emergency_control[6].StartMonth.EndMonth.Min.Max.Illness.PercWin.Bonus 52 56 7 12 12 75 1200 #emergency_control[7].StartMonth.EndMonth.Min.Max.Illness.PercWin.Bonus 60 64 5 9 8 75 2000 #emergency_control[8].StartMonth.EndMonth.Min.Max.Illness.PercWin.Bonus 68 72 4 5 21 75 1600 #emergency_control[9].StartMonth.EndMonth.Min.Max.Illness.PercWin.Bonus 76 80 9 13 26 75 550 #emergency_control[10].StartMonth.EndMonth.Min.Max.Illness.PercWin.Bonus 84 88 6 8 3 75 1300 #emergency_control[11].StartMonth.EndMonth.Min.Max.Illness.PercWin.Bonus 92 96 7 11 8 75 2000 #emergency_control[12].StartMonth.EndMonth.Min.Max.Illness.PercWin.Bonus 100 104 4 6 20 75 2000 #emergency_control[13].StartMonth.EndMonth.Min.Max.Illness.PercWin.Bonus 108 112 10 14 28 75 700 #emergency_control[14].StartMonth.EndMonth.Min.Max.Illness.PercWin.Bonus 116 120 6 11 6 75 2000 #emergency_control[15].StartMonth.EndMonth.Min.Max.Illness.PercWin.Bonus 124 128 9 13 8 75 2000 #emergency_control[16].StartMonth.EndMonth.Min.Max.Illness.PercWin.Bonus 132 136 14 18 31 75 800 #emergency_control[17].StartMonth.EndMonth.Min.Max.Illness.PercWin.Bonus 140 144 4 7 34 75 1600 #emergency_control[18].StartMonth.EndMonth.Min.Max.Illness.PercWin.Bonus 148 152 8 14 17 75 1400 #emergency_control[19].StartMonth.EndMonth.Min.Max.Illness.PercWin.Bonus 156 160 18 20 4 75 5000 --------------------- Research Configuration ----------------------- Divides research input to get the amount of research points. must be > 0 #gbv.ResearchPointsDivisor 5 ---------------------- Awards and Trophies ------------------------- #awards_trophies.CansofCoke 200 #awards_trophies.CansofCokeBonus 10000 #awards_trophies.Reputation 850 #awards_trophies.TrophyReputationBonus 20000 #awards_trophies.TrophyDeathBonus 10000 ------------------ Winning and Losing Conditions ------------------- But we don't want any such conditions on the example level! 1 Total reputation 2 Balance total 3 Percentage people your hospital has handled 4 Percentage people have been cured 5 Percentage people have been killed 6 Hospital value #win_criteria[0].Criteria.MaxMin.Value.Group.Bound 1 1 700 1 0 #win_criteria[1].Criteria.MaxMin.Value.Group.Bound 2 1 500000 1 0 #win_criteria[2].Criteria.MaxMin.Value.Group.Bound 3 1 85 1 0 #win_criteria[3].Criteria.MaxMin.Value.Group.Bound 4 1 900 1 0 #win_criteria[4].Criteria.MaxMin.Value.Group.Bound 6 1 400000 1 0 #lose_criteria[0].Criteria.MaxMin.Value.Group.Bound 1 0 400 1 450 #lose_criteria[1].Criteria.MaxMin.Value.Group.Bound 2 0 -20000 2 -10000 #lose_criteria[2].Criteria.MaxMin.Value.Group.Bound 5 1 20 3 15 --------------------- Competitor Information ----------------------- | Index in the away "computer" | Is that opponent playing? | 1 is yes, 0 no | Comment | #computer[12].Playing 1 CORSIX #computer[13].Playing 1 ROUJIN #computer[14].Playing 1 EDVIN CorsixTH-0.63/CorsixTH/Levels/finisham.map000066400000000000000000005001541347163623700204200ustar00rootroot000000000000001>*>(>2>9>1>?????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? ?>??1>*>(>2>9>1>?????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? ?>??1>*>(>2>9>1>?????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? ?>??1>*>(>2>9>1>?????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? ?>??1>)>(>3>9>1>?????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? ?>??1>*>(>2>9>1>?????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? ?>??1>*>(>2>9>1>?????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? ?>??1>*>(>2>9>1>?????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? ?>??1>*>(>2>9>1>?????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? ?>??1>*>(>2>9>1>?????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? ?>??1>*>(>2>9>1>?????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? ?>??1>*>(>2>9>1>?????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? ?>??1>*>(>2>9>1>?????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? ?>??1>*>(>2>9>1>?????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? ?>??1>*>(>2>9>1>?????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? ?>??1>*>(>2>9>1>?????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? ?>??1>*>(>2>9>1>?????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? ?>??1>*>(>2>9>1>?????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? ?>??1>*>(>2>9>1>?????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? ?>??1>*>(>2>9>1>?????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? ?>??1>*>(>2>9>1>?????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? ?>??1>*>(>2>9>1>?????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? ?>??1>)>(>3>9>1>?????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? ?>??1>*>(>2>9>1>?????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? ?>??1>*>(>2>9>1>?????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? ?>??1>*>(>2>9>1>?????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? ?>??1>*>(>2>9>1>?????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? ?>??1>*>(>2>9>1>?????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? ?>??1>*>(>2>9>1>?????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? ?>??1>*>(>2>9>1>?????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? ?>??1>*>(>2>9>1>?????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? ?>??1>*>(>2>9>1>?????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? ?>??1>*>(>2>9>1>?????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? ?>??1>*>(>2>9>1>?????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? ?>??1>*>(>2>9>1>?????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? ?>??1>*>(>2>9>1>?????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? ?>??1>*>(>2>9>1>?????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? ?>??1>)>(>3>9>1>?????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? ?>??1>*>(>2>9>1>?????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? ?>??1>*>(>2>9>1>?????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? ?>??1>*>(>2>9>1>?????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? ?>??1>*>(>2>9>1>??????????????????????????????????? ?xyxxxxz|xxxxz|xxxxz|xxxxxz|xq???? ?zy|x|xxz|xxz|xxxz|xxxz|xxq?????????????????????????? ?>??1>*>(>2>9>1>??????????????????????????????????? ?yq???? ?yq?????????????????????????? ?>??1>*>(>2>9>1>??????????????????????????????????? ?ys???? ?{q?????????????????????????? ?>??1>*>(>2>9>1>??????????????????????????????????? ?{??1>*>(>2>9>1>??????????????????????????????????? ?}q???? ?yq???? ?yu?????????????????????????? ?>??1>*>(>2>9>1>??????????????????????????????????? ?yq???? ?y>q???? ?yq?????????????????????????? ?>??1>*>(>2>9>1>??????????????????????????????????? ?ys???? ?yxz|xxq?????????????????????????? ?>??1>*>(>2>9>1>??????????????????????????????????? ?yu???? ?{q?????????????????????????? ?>??1>*>(>2>9>1>??????????????????????????????????? ?yq???? ?}q?????????????????????????? ?>??1>*>(>2>9>1>??????????????????????????????????? ?yq???? ?y??1>*>(>2>9>1>??????????????????????????????????? ?yq???? ?yq??? ?yu?????????????????????????? ?>??1>*>(>2>9>1>??????????????????????????????????? ?yq???? ?yq??? ?{q?????????????????????????? ?>??1>*>(>2>9>1>??????????????????????????????????? ?{q???? ?yq??? ?}q?????????????????????????? ?>??1>)>(>3>9>1>??????????????????????????????????? ?}q? ?xyxxq??? ?y??1>->(>2>9>1>??????????????????????????????????? ?ys? ?{s??? ?yq????????????????????????????????????? ?>??1>/>(>2>9>1>??????????????????????????????????? ?yu? ?}u??? ?ys????????????????????????????????????? ?>??1>0>(>2>9>1>??????????????????????????????????? ?yq? ?yq??? ?yu????????????????????????????????????? ?>??1>0>(>2>9>1>??????????????????????????????????? ?yq? ? p? p?=p?yq??? ?yq??? ?xyxz|xxxz|xxxz|xxxxq??????????????? ?>??1>0>(>2>9>1>??????????????????????????????????? ?yq???? ?{q??? ?{q??? ?yq??????????????? ?>??1>0>(>2>9>1>??????????????????????????????????? ? p? p? r? t? p? p? p? p? r? t? p? p? p? p? r? t? p? p? p? ???? ?}q??? ?}s??? ?yq??????????????? ?>??1>0>(>2>9>1>??????????????????????????????????????????????????????????? ?yq??? ?yu??? ?{s??????????????? ?>??1>0>(>2>9>1>??????????????????????????????????????????????????????????? ?yq??? ?yq??? ?}u??????????????? ?>??1>0>(>2>9>1>??????????????????????????????????????????????????????????? ?yq??? ? p? r? t? p? p? p?=p?yq??? ?yq??????????????? ?>??1>0>(>2>9>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>:s?????????? ?yq??? ?yq??????????????? ?>??1>0>(>2>9>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>;u?????????? ?y>q??? ?yq??????????????? ?>>??1>0>(>2>9>1> ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?=?q?????????? ?{xxxxq??????????????? ?>>>1>0>(>2>9>1>??????????????????????????????????????????????????????????? ?yq?????????? ?}q??????????????? ?>>>1>0>(>2>9>1>??????????????????????????????????????????????????????????? ?{q?????????? ?ys??????????????? ?><? ?1>0>(>2>9>1>??????????????????????????????????????????????????????????? ?}q?????????? ?y??1>0>(>2>9>1>??????????????????????????????????? ?xyxz|xxxz|xxxz|xxz|xq???? ?yq?????????? ?yq??? ?yq??????????????? ?>??1>0>(>2>9>1>??????????????????????????????????? ?yq? ?xyxxq??? ?xyxxxz|xq??? ?yq??????????????? ?>??1>.>(>2>9>1>??????????????????????????????????? ?yq? ?{q??? ?ys??? ? p? p? r? t? p? p? p? p? r? t? p? p? p? p? p? r? t? p? ??????????????? ?>??1>+>(>2>9>1>??????????????????????????????????? ?{q? ?}s??? ?yu????????????????????????????????????? ?>??1>)>(>3>9>1>??????????????????????????????????? ?}q? ?yu??? ?{q????????????????????????????????????? ?>??1>*>(>2>9>1>??????????????????????????????????? ?yq? ? p? p?=p?yq??? ?}>q????????????????????????????????????? ?>??1>*>(>2>9>1>??????????????????????????????????? ?ys???? ?yq??? ?yxxxxxz|xxq???????????????????????????? ?>??1>*>(>2>9>1>??????????????????????????????????? ?yu???? ?y>q??? ?yq???????????????????????????? ?>??1>*>(>2>9>1>??????????????????????????????????? ?yq???? ?{xxxxq???????????????????????????? ?>??1>*>(>2>9>1>??????????????????????????????????? ?yq???? ?}s???????????????????????????? ?>??1>*>(>2>9>1>??????????????????????????????????? ?yq???? ?yu???????????????????????????? ?>??1>*>(>2>9>1>??????????????????????????????????? ?y>q???? ?y??1>*>(>2>9>1>??????????????????????????????????? ?{xxz|xq???? ?yq???????????????????????????? ?>??1>*>(>2>9>1>??????????????????????????????????? ?}s???? ?{s???????????????????????????? ?>??1>*>(>2>9>1>??????????????????????????????????? ?yq???? ?yu???????????????????????????? ?>??1>*>(>2>9>1>??????????????????????????????????? ?yq???? ?yq???????????????????????????? ?>??1>*>(>2>9>1>??????????????????????????????????? ? p? p? r? t? p? p? p? p? p? r? t? p? p? p? p? r? t? p? p?=p?:>;>>??1>*>(>2>9>1>??????????????????????????????????????????????????????? ?>>>??????????????????????????????????????????????????????????? ?>??1>*>(>2>9>1>??????????????????????????????????????????????????????? ?>>>??????????????????????????????????????????????????????????? ?>??1>*>(>2>9>1>??????????????????????????????????????????????????????? ?>>>??????????????????????????????????????????????????????????? ?>??1>*>(>2>9>1>??????????????????????????????????????????????????????? ?>>>??????????????????????????????????????????????????????????? ?>??1>)>(>3>9>1>??????????????????????????????????????????????????????? ?>>>??????????????????????????????????????????????????????????? ?>??1>*>(>2>9>1>??????????????????????????????????????????????????????? ?>>>??????????????????????????????????????????????????????????? ?>??1>*>(>2>9>1>?????????????????????????????????????? ?>>>>>????N?;?;?:???? ?>>>??????????????????????????????????????????????????????????? ?>??1>*>(>2>9>1>?????????????????????????????????????? ?>>>>>????M?D?DH?@???? ?>>>??????????????????????????????????????????????????????????? ?>??1>*>(>2>9>1>?????????????????????????????????????? ?>>>>>????M?DH?D?@???? ?>>>??????????????????????????????????????????????????????????? ?>??1>*>(>2>9>1>?????????????????????????????????????? ?>>>>>????M?D?DH?@???? ?>>>??????????????????????????????????????????????????????????? ?>??1>*>(>2>9>1>?????????????????????????????????????? ?>>>>>????M?DH?D?@???? ?>>>??????????????????????????????????????????????????????????? ?>??1>*>(>2>9>1>?????????????????????????????????????? ? ?=?><? ? ????L?C?C?O???? ?>>>??????????????????????????????????????????????????????????? ?>??1>*>(>2>9>1>???????????????????????????????????????? ?>????????????? ?>>>??????????????????????????????????????????????????????????? ?>??1>*>(>2>9>1>???????????????????????????????????????? ?>????????????? ?>>>??????????????????????????????????????????????????????????? ?>??1>*>(>2>9>1>???????????????????????????????????????? ?>????????????? ?>>>??????????????????????????????????????????????????????????? ?>??1>*>(>2>9>1>???????????????????????????????????????? ?>????????????? ?>>>??????????????????????????????????????????????????????????? ?>??1>*>(>2>9>1>???????????????????????????????????????? ?>>????????????? ?>>>??????????????????????????????????????????????????????????? ?>??1>*>(>2>9>1>???????????????????????????????????????? ?>>>>>>>>>>>>>>>>>>??????????????????????????????????????????????????????????? ?>??1>*>(>2>9>1>???????????????????????????????????????? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??????????????????????????????????????????????????????????? ?>??1>)>(>3>9>1>?????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? ?>??1>*>(>2>9>1>?????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? ?>??1>*>(>2>9>1>?????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? ?>??1>*>(>2>9>1>?????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? ?>??1>*>(>2>9>1>?????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? ?>??1>*>(>2>9>1>?????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? ?>??1>*>(>2>9>1>?????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? ?>??1>*>(>2>9>1>?????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? ?>??1>*>(>2>9>1>?????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? ?>??1>*>(>2>9>1>?????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? ?>??1>*>(>2>9>1>?????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? ?>??1>*>(>2>9>1>?????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? ?>??1>*>(>2>9>1>?????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? ?>??1>)>(>3>9>1>?????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? ?>??1>*>(>2>9>1>?????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? ?>??1>*>(>2>9>1>?????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? ?>??1>*>(>2>9>1>?????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? ?>??1>*>(>2>9>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>??1>*>(>2>9>1> ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?=?>??1>*>(>2>9>1>?????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? ?>??1>*>(>2>9>1>?????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? ?>??1>*>(>2>9>1>?????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? ?>??/CorsixTH-0.63/CorsixTH/Levels/original05.level000066400000000000000000000032041347163623700211170ustar00rootroot00000000000000Copyright (c) 2010 Edwin "Dutchy" Smulders 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. -- This is an extra configuration file loaded at Level 5 from the original game. -- It needs some starting doctors, and to also make it possible for others to do -- this in the future some new variables are added, as seen below. -- Skill is skill * 100 (to work in integers) #start_staff[1].Doctor.Shrink.Consultant.Skill 1 1 1 100 #start_staff[2].Doctor.Surgeon.Consultant.Skill 1 1 1 100 #start_staff[3].Doctor.Researcher.Consultant.Skill 1 1 1 100 These lines equal something like this: Doctor.Nurse.Handyman.Receptionist.Shrink.Surgeon.Researcher.Junior.Consultant.Skill 1 0 0 0 1 0 0 0 1 100 CorsixTH-0.63/CorsixTH/Levels/original07.level000066400000000000000000000026471347163623700211330ustar00rootroot00000000000000Copyright (c) 2010 Edvin "Lego3" Linge 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. -- This is an extra configuration file loaded at level 7 from the original game. -- The second to last emergency (number 9) does in error create Hairyitis patients. -- That disease is not available until level 8. -- Change the disease to Elvis Syndrome instead. (Illnes previously 3, now 4) #emergency_control[9].StartMonth.EndMonth.Min.Max.Illness.PercWin.Bonus 60 70 5 8 4 75 1000CorsixTH-0.63/CorsixTH/Levels/original08.level000066400000000000000000000032561347163623700211310ustar00rootroot00000000000000Copyright (c) 2013 Mark "MarkL" Lawlor 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. -- This is an extra configuration file loaded at level 8 from the original game. -- The win and lose on repution would appear to be the wrong way round #win_criteria[0].Criteria.MaxMin.Value.Group.Bound 2 1 300000 1 0 #win_criteria[1].Criteria.MaxMin.Value.Group.Bound 3 1 55 1 0 #win_criteria[2].Criteria.MaxMin.Value.Group.Bound 4 1 500 1 0 #win_criteria[3].Criteria.MaxMin.Value.Group.Bound 6 1 180000 1 0 #lose_criteria[0].Criteria.MaxMin.Value.Group.Bound 1 0 200 1 400 #lose_criteria[1].Criteria.MaxMin.Value.Group.Bound 2 0 -1000 2 10000 #lose_criteria[2].Criteria.MaxMin.Value.Group.Bound 5 1 25 3 20 CorsixTH-0.63/CorsixTH/Levels/original11.level000066400000000000000000000024421347163623700211170ustar00rootroot00000000000000Copyright (c) 2012 Edvin "Lego3" Linge 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. -- This is an extra configuration file loaded at level 11 from the original game. -- For some reason Alien DNA is set to be unavailable at this level even though -- it evidently should be. -- Make it available after 12 months. #visuals[6] 10 I_ALIENCorsixTH-0.63/CorsixTH/Levels/original12.level000066400000000000000000000024421347163623700211200ustar00rootroot00000000000000Copyright (c) 2012 Edvin "Lego3" Linge 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. -- This is an extra configuration file loaded at level 12 from the original game. -- For some reason Alien DNA is set to be unavailable at this level even though -- it evidently should be. -- Make it available after 12 months. #visuals[6] 10 I_ALIENCorsixTH-0.63/CorsixTH/Levels/st.peter's.level000066400000000000000000000470551347163623700211600ustar00rootroot00000000000000Copyright (c) 2014 Mark "MarkL" Lawlor 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. This level file and map have been put together with epidemics in mind. Wherever there are values that have not been used previously there are some notes to assist map makers. ---------------------- General Information ------------------------- %Name = "St. Peter's near Cawley" %MapFile = "st.peter's.map" %LevelBriefing = "The St Peter's hospital is near the small town of Cawley in the beautiful English countryside. Use all your knowledge to set up a well-run hospital which makes a healthy profit and can deal with anything the sickly public can throw up in it. You'll need to be aware that the atmosphere around here is particularly good at carrying germs and infections. The nearby swamp will add to your troubles, so you should expect frequent epidemics. You are expected to run a superb hospital with the highest of standards; the Minister of Health expects nothing less than perfection here. You should aim to keep queues to a minimum as this will help you combat epidemics and keep your staff happy at the same time. Get a reputation of at least 600, treat 80% of your visitors, cure 400 patients, amass $600,000 in the bank and have a hospital worth $275,000." %LevelDebriefing = "Congratulations, you made it! Now you can sit back and enjoy life." Town properties InterestRate is defined as centiprocent to allow for two decimals precision, i.e. 300 means 3 % #town.StartCash.InterestRate 30000 200 If contagious how much - rand up to this figure. higher = more contagious. must be > 0 #gbv.HowContagious 25 0-100 Higher equals more chance of spreading. #gbv.ContagiousSpreadFactor 35 Reduces cont illnesses until X months have passed #gbv.ReduceContMonths 4 Reduces cont illnesses until X peep have arrived #gbv.ReduceContPeepCount 20 If epidemic coverup fails - how much per person you are fined #gbv.EpidemicFine 2500 If an epidemic coverup succeeds how much compensation is received - lowest value #gbv.EpidemicCompLo 5000 If an epidemic coverup succeeds how much compensation is received - highest value #gbv.EpidemicCompHi 30000 Cost per vaccination #gbv.VacCost 50 How many patients still infected cause a reputation loss as well as a fine. if less than EpidemicEvacMinimum then this will be ignored #gbv.EpidemicRepLossMinimum 5 How many patients still infected and not-cured cause the hospital to be evacuated #gbv.EpidemicEvacMinimum 10 -------------------- Disease Configuration ------------------------- When a drug is first researched, what effectiveness does it have #gbv.StartRating 80 The following table contains all diagnoses and treatments that shows up inthe drug casebook in the game. ContRate is whether this is contagious (lower the number the greater the chances of it appearing, 0 means never) and Known specifies whether it should show up from the beginning of the level and RschReqd how much research is required to discover the treatment room for the disease. NOTE: Most visual diseases cannot currently be part of an epidemic. Which can be included can be checked in the disease files #expertise[1].ContRate.Known.RschReqd 0 1 0 GENERAL_PRACTICE #expertise[2].ContRate.Known.RschReqd 0 1 40000 BLOATY_HEAD #expertise[3].ContRate.Known.RschReqd 0 0 40000 HAIRYITUS #expertise[4].ContRate.Known.RschReqd 0 0 60000 ELVIS #expertise[5].ContRate.Known.RschReqd 0 0 60000 INVIS #expertise[6].ContRate.Known.RschReqd 10 0 60000 RADIATION #expertise[7].ContRate.Known.RschReqd 0 0 40000 SLACK_TONGUE #expertise[8].ContRate.Known.RschReqd 0 0 60000 ALIEN #expertise[9].ContRate.Known.RschReqd 0 0 20000 BROKEN_BONES #expertise[10].ContRate.Known.RschReqd 0 0 40000 BALDNESS #expertise[11].ContRate.Known.RschReqd 10 0 40000 DISCRETE_ITCHING #expertise[12].ContRate.Known.RschReqd 10 0 40000 JELLYITUS #expertise[13].ContRate.Known.RschReqd 20 0 40000 SLEEPING_ILLNESS #expertise[14].ContRate.Known.RschReqd 0 0 30000 PREGNANT #expertise[15].ContRate.Known.RschReqd 10 0 40000 TRANSPARENCY #expertise[16].ContRate.Known.RschReqd 10 0 20000 UNCOMMON_COLD #expertise[17].ContRate.Known.RschReqd 10 0 60000 BROKEN_WIND #expertise[18].ContRate.Known.RschReqd 20 0 20000 SPARE_RIBS #expertise[19].ContRate.Known.RschReqd 30 0 20000 KIDNEY_BEANS #expertise[20].ContRate.Known.RschReqd 10 0 20000 BROKEN_HEART #expertise[21].ContRate.Known.RschReqd 10 0 20000 RUPTURED_NODULES #expertise[22].ContRate.Known.RschReqd 10 0 40000 MULTIPLE_TV_PERSONALITIES #expertise[23].ContRate.Known.RschReqd 10 1 60000 INFECTIOUS_LAUGHTER #expertise[24].ContRate.Known.RschReqd 20 0 40000 CORRUGATED_ANKLES #expertise[25].ContRate.Known.RschReqd 10 0 40000 CHRONIC_NOSEHAIR #expertise[26].ContRate.Known.RschReqd 50 0 40000 3RD_DEGREE_SIDEBURNS #expertise[27].ContRate.Known.RschReqd 20 0 40000 FAKE_BLOOD #expertise[28].ContRate.Known.RschReqd 10 0 40000 GASTRIC_EJECTIONS #expertise[29].ContRate.Known.RschReqd 20 1 20000 THE_SQUITS #expertise[30].ContRate.Known.RschReqd 30 0 20000 IRON_LUNGS #expertise[31].ContRate.Known.RschReqd 10 0 40000 SWEATY_PALMS #expertise[32].ContRate.Known.RschReqd 15 0 20000 HEAPED_PILES #expertise[33].ContRate.Known.RschReqd 10 0 20000 GUT_ROT #expertise[34].ContRate.Known.RschReqd 20 0 20000 GOLF_STONES #expertise[35].ContRate.Known.RschReqd 20 0 20000 UNEXPECTED_SWELLING #expertise[36].Known.RschReqd 0 60000 I_D_SCANNER DIAGNOSIS #expertise[37].Known.RschReqd 0 50000 I_D_BLOOD_MACHINE DIAGNOSIS #expertise[38].Known.RschReqd 0 20000 I_D_CARDIO DIAGNOSIS #expertise[39].Known.RschReqd 0 50000 I_D_XRAY DIAGNOSIS #expertise[40].Known.RschReqd 0 60000 I_D_ULTRASCAN DIAGNOSIS #expertise[41].Known.RschReqd 1 20000 I_D_STANDARD DIAGNOSIS #expertise[42].Known.RschReqd 1 20000 I_D_WARD DIAGNOSIS #expertise[43].Known.RschReqd 1 20000 I_D_SHRINK DIAGNOSIS | Objects available | Available from the start | Strength | Available for this level | Comment #objects[9].StartAvail.StartStrength.AvailableForLevel 1 8 1 Inflator Machine #objects[13].StartAvail.StartStrength.AvailableForLevel 1 13 1 Cardiogram #objects[14].StartAvail.StartStrength.AvailableForLevel 0 12 1 Scanner #objects[22].StartAvail.StartStrength.AvailableForLevel 0 9 1 Ultrascan #objects[23].StartAvail.StartStrength.AvailableForLevel 0 7 1 DNA Restorer #objects[24].StartAvail.StartStrength.AvailableForLevel 0 11 1 Cast Remover #objects[25].StartAvail.StartStrength.AvailableForLevel 0 8 1 Hair restorer #objects[26].StartAvail.StartStrength.AvailableForLevel 0 10 1 Slicer for slack tongues #objects[27].StartAvail.StartStrength.AvailableForLevel 0 12 1 X-Ray #objects[30].StartAvail.StartStrength.AvailableForLevel 0 12 1 Operating Table #objects[37].StartAvail.StartStrength.AvailableForLevel 1 0 1 Projector #objects[40].StartAvail.StartStrength.AvailableForLevel 0 1 1 Research Computer #objects[41].StartAvail.StartStrength.AvailableForLevel 0 1 1 Chemical Mixer #objects[42].StartAvail.StartStrength.AvailableForLevel 0 10 1 Blood Machine #objects[46].StartAvail.StartStrength.AvailableForLevel 0 8 1 Electrolysis Machine #objects[47].StartAvail.StartStrength.AvailableForLevel 0 7 1 Jellyitus Moulding Machine #objects[54].StartAvail.StartStrength.AvailableForLevel 0 10 1 Decontamination Shower #objects[55].StartAvail.StartStrength.AvailableForLevel 1 10 1 Autopsy Research Machine #objects[57].StartAvail.StartStrength.AvailableForLevel 1 57 1 VideoGame Value represents the proportions of the disease - not implemented #visuals[0] 1 I_BLOATY_HEAD #visuals[1] 21 I_HAIRYITUS #visuals[2] 7 I_ELVIS #visuals[3] 9 I_INVIS #visuals[4] 23 I_RADIATION #visuals[5] 11 I_SLACK_TONGUE #visuals[6] 41 I_ALIEN #visuals[7] 11 I_BROKEN_BONES #visuals[8] 12 I_BALDNESS #visuals[9] 5 I_DISCRETE_ITCHING #visuals[10] 12 I_JELLYITUS #visuals[11] 1 I_SLEEPING_ILLNESS #visuals[12] 18 I_PREGNANT #visuals[13] 16 I_TRANSPARENCY #non_visuals[0] 4 I_UNCOMMON_COLD #non_visuals[1] 8 I_BROKEN_WIND #non_visuals[2] 9 I_SPARE_RIBS #non_visuals[3] 3 I_KIDNEY_BEANS #non_visuals[4] 2 I_BROKEN_HEART #non_visuals[5] 1 I_RUPTURED_NODULES #non_visuals[6] 9 I_MULTIPLE_TV_PERSONALITIES #non_visuals[7] 4 I_INFECTIOUS_LAUGHTER #non_visuals[8] 2 I_CORRUGATED_ANKLES #non_visuals[9] 5 I_CHRONIC_NOSEHAIR #non_visuals[10] 1 I_3RD_DEGREE_SIDEBURNS #non_visuals[11] 3 I_FAKE_BLOOD #non_visuals[12] 3 I_GASTRIC_EJECTIONS #non_visuals[13] 6 I_THE_SQUITS #non_visuals[14] 1 I_IRON_LUNGS #non_visuals[15] 9 I_SWEATY_PALMS #non_visuals[16] 5 I_HEAPED_PILES #non_visuals[17] 8 I_GUT_ROT #non_visuals[18] 7 I_GOLF_STONES #non_visuals[19] 5 I_UNEXPECTED_SWELLING You can use either or neither of these two to hold back the appearance of visual diseases Hold all visual illnesses until x months. 0 never hold #gbv.HoldVisualMonths 9 Hold all visual illnesses until x peeps have arrived. 0 never hold #gbv.HoldVisualPeepCount 60 Value represents the month this disease becomes available (when they will first appear in-game) hold all visuals (above) take precedence #visuals_available[0] 0 I_BLOATY_HEAD #visuals_available[1] 31 I_HAIRYITUS #visuals_available[2] 7 I_ELVIS #visuals_available[3] 9 I_INVIS #visuals_available[4] 43 I_RADIATION #visuals_available[5] 11 I_SLACK_TONGUE #visuals_available[6] 60 I_ALIEN #visuals_available[7] 11 I_BROKEN_BONES #visuals_available[8] 22 I_BALDNESS #visuals_available[9] 5 I_DISCRETE_ITCHING #visuals_available[10] 32 I_JELLYITUS #visuals_available[11] 19 I_SLEEPING_ILLNESS #visuals_available[12] 28 I_PREGNANT #visuals_available[13] 16 I_TRANSPARENCY ---------------------- Staff Configuration ------------------------- Each entry states how many staff members of each category are available a given month. The number of entries is not fixed. | A list | Month it gets active (start at 0) | Each group | #staff_levels[0].Month.Nurses.Doctors.Handymen.Receptionists 0 8 8 3 2 #staff_levels[1].Month.Nurses.Doctors.Handymen.Receptionists 3 7 5 5 3 #staff_levels[2].Month.Nurses.Doctors.Handymen.Receptionists 5 5 8 7 4 The minimum salary for each staff type #staff[0].MinSalary 60 Nurse #staff[1].MinSalary 75 Doctor #staff[2].MinSalary 25 Handyman #staff[3].MinSalary 20 Receptionist Salary modifiers for different doctor attributes #gbv.SalaryAdd[3] -30 Junior #gbv.SalaryAdd[4] 30 Doctor #gbv.SalaryAdd[5] 40 Surgeon #gbv.SalaryAdd[6] 30 Psychiatrist #gbv.SalaryAdd[7] 100 Consultant #gbv.SalaryAdd[8] 20 Researcher How much the skill of the doctor adds to the salary. skill * 1000 / divisor #gbv.SalaryAbilityDivisor 10 #gbv.LandCostPerTile 50 #gbv.TrainingRate 40 #gbv.AbilityThreshold[0] 75 Surgeon #gbv.AbilityThreshold[1] 60 Psychiatrist #gbv.AbilityThreshold[2] 45 Researcher #gbv.TrainingValue[0] 10 Projector #gbv.TrainingValue[1] 15 Skeleton #gbv.TrainingValue[2] 20 Bookcase #popn[0].Month.Change 0 2 #popn[1].Month.Change 6 0 #popn[2].Month.Change 12 2 #popn[4].Month.Change 15 0 #popn[5].Month.Change 23 1 #popn[6].Month.Change 28 0 Set severity to 0 if you don't want any earthquakes #quake_control[0].StartMonth.EndMonth.Severity 5 10 0 #emergency_control[0].StartMonth.EndMonth.Min.Max.Illness.PercWin.Bonus 4 8 4 6 23 75 1500 #emergency_control[1].StartMonth.EndMonth.Min.Max.Illness.PercWin.Bonus 12 16 8 10 2 75 1000 #emergency_control[2].StartMonth.EndMonth.Min.Max.Illness.PercWin.Bonus 20 24 5 9 27 75 1000 #emergency_control[3].StartMonth.EndMonth.Min.Max.Illness.PercWin.Bonus 28 32 10 14 33 75 500 #emergency_control[4].StartMonth.EndMonth.Min.Max.Illness.PercWin.Bonus 36 40 4 5 8 75 2500 #emergency_control[5].StartMonth.EndMonth.Min.Max.Illness.PercWin.Bonus 44 48 2 2 30 75 1800 #emergency_control[6].StartMonth.EndMonth.Min.Max.Illness.PercWin.Bonus 52 56 7 12 12 75 1200 #emergency_control[7].StartMonth.EndMonth.Min.Max.Illness.PercWin.Bonus 60 64 5 9 8 75 2000 #emergency_control[8].StartMonth.EndMonth.Min.Max.Illness.PercWin.Bonus 68 72 4 5 21 75 1600 #emergency_control[9].StartMonth.EndMonth.Min.Max.Illness.PercWin.Bonus 76 80 9 13 26 75 550 #emergency_control[10].StartMonth.EndMonth.Min.Max.Illness.PercWin.Bonus 84 88 6 8 3 75 1300 #emergency_control[11].StartMonth.EndMonth.Min.Max.Illness.PercWin.Bonus 92 96 7 11 8 75 2000 #emergency_control[12].StartMonth.EndMonth.Min.Max.Illness.PercWin.Bonus 100 104 4 6 20 75 2000 #emergency_control[13].StartMonth.EndMonth.Min.Max.Illness.PercWin.Bonus 108 112 10 14 28 75 700 #emergency_control[14].StartMonth.EndMonth.Min.Max.Illness.PercWin.Bonus 116 120 6 11 6 75 2000 #emergency_control[15].StartMonth.EndMonth.Min.Max.Illness.PercWin.Bonus 124 128 9 13 8 75 2000 #emergency_control[16].StartMonth.EndMonth.Min.Max.Illness.PercWin.Bonus 132 136 14 18 31 75 800 #emergency_control[17].StartMonth.EndMonth.Min.Max.Illness.PercWin.Bonus 140 144 4 7 34 75 1600 #emergency_control[18].StartMonth.EndMonth.Min.Max.Illness.PercWin.Bonus 148 152 8 14 17 75 1400 #emergency_control[19].StartMonth.EndMonth.Min.Max.Illness.PercWin.Bonus 156 160 18 20 4 75 5000 --------------------- Research Configuration ----------------------- Divides research input to get the amount of research points. must be > 0 #gbv.ResearchPointsDivisor 2 ---------------------- Awards and Trophies ------------------------- Trophy win conditions #awards_trophies.RatKillsAbsolute 25 #awards_trophies.CansofCoke 100 #awards_trophies.Reputation 400 #awards_trophies.Plant 80 #awards_trophies.TrophyStaffHappiness 85 #awards_trophies.RatKillsPercentage 11 #awards_trophies.TrophyMayor 25 Trophy win bonuses #awards_trophies.RatKillsAbsoluteBonus 4 #awards_trophies.CansofCokeBonus 1000 #awards_trophies.TrophyReputationBonus 1500 #awards_trophies.PlantBonus 4 #awards_trophies.TrophyStaffHappinessBonus 5 #awards_trophies.RatKillsPercentageBonus 4000 #awards_trophies.TrophyDeathBonus 6000 #awards_trophies.TrophyCuresBonus 4000 #awards_trophies.TrophyMayorBonus 4 Award win criteria #awards_trophies.CuresAward 50 #awards_trophies.CuresPoor 10 #awards_trophies.DeathsAward 10 #awards_trophies.DeathsPoor 25 #awards_trophies.PopulationPercentageAward 50 #awards_trophies.PopulationPercentagePoor 15 #awards_trophies.CuresVDeathsAward 5 #awards_trophies.CuresVDeathsPoor 1 #awards_trophies.ReputationAward 500 #awards_trophies.ReputationPoor 200 #awards_trophies.HospValueAward 150000 #awards_trophies.HospValuePoor 50000 #awards_trophies.CleanlinessAward 5 #awards_trophies.CleanlinessPoor 40 #awards_trophies.EmergencyAwardv 90 #awards_trophies.EmergencyPoor 50 #awards_trophies.StaffHappinessAward 75 #awards_trophies.StaffHappinessPoor 25 #awards_trophies.PeepHappinessAward 75 #awards_trophies.PeepHappinessPoor 25 #awards_trophies.WaitingTimesAward 25 #awards_trophies.WaitingTimesPoor 75 #awards_trophies.WellKeptTechAward 20 #awards_trophies.WellKeptTechPoor 70 Award win bonuses or penalties #awards_trophies.CuresBonus 1500 #awards_trophies.CuresPenalty -4000 #awards_trophies.DeathsBonus 2500 #awards_trophies.DeathsPenalty -6000 #awards_trophies.PopulationPercentageBonus 4 #awards_trophies.PopulationPercentagePenalty -6 #awards_trophies.CuresVDeathsBonus 3000 #awards_trophies.CuresVDeathsPenalty -5000 #awards_trophies.AwardReputationBonus 2000 #awards_trophies.AwardReputationPenalty -5000 #awards_trophies.HospValueBonus 3 #awards_trophies.HospValuePenalty -6 #awards_trophies.CleanlinessBonus 5 #awards_trophies.CleanlinessPenalty -12 #awards_trophies.EmergencyBonus 6 #awards_trophies.EmergencyPenalty -11 #awards_trophies.AwardStaffHappinessBonus 3 #awards_trophies.AwardStaffHappinessPenalty -10 #awards_trophies.PeepHappinessBonus 3 #awards_trophies.PeepHappinessPenalty -9 #awards_trophies.WaitingTimesBonus 2 #awards_trophies.WaitingTimesPenalty -6 #awards_trophies.WellKeptTechBonus 7 #awards_trophies.WellKeptTechPenalty -5 #awards_trophies.NewTechAward 1500 #awards_trophies.NewTechPoor 0 #awards_trophies.ResearchBonus 3 #awards_trophies.ResearchPenalty -7 ------------------ Winning and Losing Conditions ------------------- But we don't want any such conditions on the example level! 1 Total reputation 2 Balance total 3 Percentage people your hospital has handled 4 Percentage people have been cured 5 Percentage people have been killed 6 Hospital value #win_criteria[0].Criteria.MaxMin.Value.Group.Bound 1 1 600 1 0 #win_criteria[1].Criteria.MaxMin.Value.Group.Bound 2 1 600000 1 0 #win_criteria[2].Criteria.MaxMin.Value.Group.Bound 3 1 80 1 0 #win_criteria[3].Criteria.MaxMin.Value.Group.Bound 4 1 400 1 0 #win_criteria[4].Criteria.MaxMin.Value.Group.Bound 6 1 275000 1 0 #lose_criteria[0].Criteria.MaxMin.Value.Group.Bound 1 0 400 1 450 #lose_criteria[1].Criteria.MaxMin.Value.Group.Bound 2 0 -20000 2 -10000 #lose_criteria[2].Criteria.MaxMin.Value.Group.Bound 5 1 10 3 5 --------------------- Competitor Information ----------------------- | Index in the away "computer" | Is that opponent playing? | 1 is yes, 0 no | Comment | #computer[12].Playing 1 Corsix #computer[13].Playing 1 Roujin #computer[14].Playing 1 Edvin CorsixTH-0.63/CorsixTH/Levels/st.peter's.map000066400000000000000000005001541347163623700206200ustar00rootroot00000000000000?? ?1>*>(>2>9>?????????????????????????????????????????????????????????????????????????????????????????????????????????????? ?>*>(>2>>>>???? ?1>*>(>2>9>?????????????????????????????????????????????????????????????????????????????????????????????????????????????? ?>*>(>2>>>>???? ?1>*>(>2>9>?????????????????????????????????????????????????????????????????????????????????????????????????????????????? ?>*>(>2>>>>???? ?1>*>(>2>9>?????????????????????????????????????????????????????????????????????????????????????????????????????????????? ?>*>(>2>>>>???? ?1>)>(>3>9>?????????????????????????????????????????????????????????????????????????????????????????????????????????????? ?>*>(>2>>>>???? ?1>*>(>2>9>?????????????????????????????????????????????????????????????????????????????????????????????????????????????? ?>*>(>2>>>>???? ?1>*>(>2>9>?????????????????????????????????????????????????????????????????????????????????????????????????????????????? ?>*>(>2>>>>???? ?1>*>(>2>9>?????????????????????????????????????????????????????????????????????????????????????????????????????????????? ?>*>(>2>>>>???? ?1>*>(>2>9>?????????????????????????????????????????????????????????????????????????????????????????????????????????????? ?>*>(>2>>>>???? ?1>)>(>3>9>?????????????????????????????????????????????????????????????????????????????????????????????????????????????? ?>*>(>5>>>>???? ?1>*>(>2>9>?????????????????????????????????????????????????????????????????????????????????????????????????????????????? ?>*>(>2>>>>???? ?1>*>(>2>9>?????????????????????????????????????????????????????????????????????????????????????????????????????????????? ?>*>(>2>>>>???? ?1>*>(>2>9>?????????????????????????????????????????????????????????????????????????????????????????????????????????????? ?>*>(>2>>>>???? ?1>*>(>2>9>?????????????????????????????????????????????????????????????????????????????????????????????????????????????? ?>*>(>2>>>>???? ?1>)>(>3>9>?????????????????????????????????????????????????????????????????????????????????????????????????????????????? ?>*>(>2>>>>???? ?1>*>(>2>9>?????????????????????????????????????????????????????????????????????????????????????????????????????????????? ?>*>(>2>>>>???? ?1>*>(>2>9>?????????????????????????????????????????????????????????????????????????????????????????????????????????????? ?>*>(>2>>>>???? ?1>*>(>2>9>?????????????????????????????????????????????????????????????????????????????????????????????????????????????? ?>*>(>2>>>>???? ?1>*>(>2>9>?????????????????????????????????????????????????????????????????????????????????????????????????????????????? ?>*>(>2>>>>???? ?1>)>(>3>9>?????????????????????????????????????????????????????????????????????????????????????????????????????????????? ?>*>(>5>>>>???? ?1>*>(>2>9>?????????????????????????????????????????????????????????????????????????????????????????????????????????????? ?>*>(>2>>>>???? ?1>*>(>2>9>?????????????????????????????????????????????????????????????????????????????????????????????????????????????? ?>*>(>2>>>>???? ?1>*>(>2>9>?????????????????????????????????????????????????????????????????????????????????????????????????????????????? ?>*>(>2>>>>???? ?1>*>(>2>9>>?????????????????????????????????????????????????????????????????????????????????????????????????????????????? ?>*>(>2>>>>???? ?1>)>(>3>9>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>???????????????????????????????????????????????????????????????????????? ?>*>(>2>>>>???? ?1>*>(>2>9>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>???????????????????????????????????????????????????????????????????????? ?>*>(>2>>>>???? ?1>*>(>2>9><? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?=?>>???????????????????????????????????????????????????????????????????????? ?>*>(>2>>>>???? ?1>*>(>2>9>??????????????????????????????????? ?>>???????????????????????????????????????????????????????????????????????? ?>*>(>2>>>>???? ?1>*>(>2>9>??????????????????????????????????? ?>>???????????????????????????????????????????????????????????????????????? ?>*>(>2>>>>???? ?1>)>(>3>9>??????????????????????????????????? ?>>???????????????????????????????????????????????????????????????????????? ?>*>(>5>>>>???? ?1>*>(>2>9>??????????????????????????????????? ?>>???????????????????????????????????????????????????????????????????????? ?>*>(>2>>>>???? ?1>*>(>2>9>??????????????????????????????????? ?>>???????????????????????????????????????????????????????????????????????? ?>*>(>2>>>>???? ?1>*>(>2>9>??????????????????????????????????? ?>>???????????????????????????????????????????????????????????????????????? ?>*>(>2>>>>???? ?1>*>(>2>9>??????????????????????????????????? ?>>???????????????????????????????????????????????????????????????????????? ?>*>(>2>>>>???? ?1>)>(>3>9>??????????????????????????????????? ?>>?? ?xyz|xz|xxz|xxz|xxxx:>>>>? ?xyz|xz|xxz|xz|xxq?????????????????????????????? ?>*>(>2>>>>???? ?1>*>(>2>9>??????????????????????????????????? ?>>?? ?{;>>>>? ?yu?????????????????????????????? ?>*>(>2>>>>???? ?1>*>(>2>9>??????????????????????????????????? ?>>?? ?}>>>>? ?{q?????????????????????????????? ?>*>(>2>>>>???? ?1>*>(>2>9>??????????????????????????????????? ?>>?? ?y<q?=?>>? ?}s?????????????????????????????? ?>*>(>2>>>>???? ?1>*>(>2>9>??????????????????????????????????? ?>>?? ?{q? ?>>? ?yu?????????????????????????????? ?>*>(>2>>>>???? ?1>)>(>3>9>??????????????????????????????????? ?>>?? ?}s? ?>>? ?yq?????????????????????????????? ?>*>(>5>>>>???? ?1>*>(>2>9>??????????????????????????????????? ?>>?? ?yu? ?>>? ?yq?????????????????????????????? ?>*>(>2>>>>???? ?1>*>(>2>9>??????????????????????????????????? ?>>?? ?yq? ?>>? ?{s?????????????????????????????? ?>*>(>2>>>>???? ?1>*>(>2>9>??????????????????????????????????? ?>>?? ?{q? ?>>? ?}u?????????????????????????????? ?>*>(>2>>>>???? ?1>*>(>2>9>??????????????????????????????????? ?>>?? ?}s? ?>>? ?yq?????????????????????????????? ?>*>(>2>>>>???? ?1>)>(>3>9>??????????????????????????????????? ?>>?? ?yu? ?>>? ?yq?????????????????????????????? ?>*>(>2>>>>???? ?1>*>(>2>9>??????????????????????????????????? ?>>?? ?yq? ?>>? ?{s?????????????????????????????? ?>*>(>2>>>>???? ?1>*>(>2>9>??????????????????????????????????? ?>>?? ? p? r? t? p? p? r? t? p? p? p? r? t? p? p? r? t? p? p? ? ?>>? ?}u?????????????????????????????? ?>*>(>2>>>>???? ?1>*>(>2>9>??????????????????????????????????? ?>>?????????????????????? ?>? ?yq?????????????????????????????? ?>*>(>2>>>>???? ?1>*>(>2>9>??????????????????????????????????? ?>>?? ?xyz|zxz|zxz|zxz|zxz|z:;xq?????????????????????????????? ?>*>(>2>>>>???? ?1>)>(>3>9>??????????????????????????????????? ?>>?? ?}s?????????????????????????????? ?>*>(>5>>>>???? ?1>*>(>2>9>??????????????????????????????????? ?>>?? ?yu?????????????????????????????? ?>*>(>2>>>>???? ?1>*>(>2>9>??????????????????????????????????? ?>>?? ?{*>(>2>>>>???? ?1>*>(>2>9>??????????????????????????????????? ?>>?? ?}s?????????? ?{q?????????????????????????????? ?>*>(>2>>>>???? ?1>*>(>2>9>??????????????????????????????????? ?>>?? ?yu?????????? ?}s?????????????????????????????? ?>*>(>2>>>>???? ?1>)>(>3>9>??????????????????????????????????? ?>>?? ?ys?????????? ?yu?????????????????????????????? ?>*>(>2>>>>???? ?1>*>(>2>9>??????????????????????????????????? ?>>?? ?}s?? ?>>>>>?? ?{q?????????????????????????????? ?>*>(>2>>>>???? ?1>*>(>2>9>??????????????????????????????????? ?>>?? ?yq?? ?>>>>>?? ?}s?????????????????????????????? ?>*>(>2>>>>???? ?1>*>(>2>9>??????????????????????????????????? ?>>?? ?{s?? ?>>>>>?? ?yu?????????????????????????????? ?>*>(>2>>>>???? ?1>*>(>2>9>??????????????????????????????????? ?>>?? ?}u?? ?>>>>>?? ?yq?????????????????????????????? ?>*>(>2>>>>???? ?1>)>(>3>9>??????????????????????????????????? ?>>?? ?yq?? ?>>>>>?? ? p? r? t? p? r? t? p? r? t? p? r? p? r? t? p? ?????????????????????????????? ?>*>(>5>>>>???? ?1>*>(>2>9>??????????????????????????????????? ?>>?? ? p?=p?:>;>>><? ? ???????????????????????????????????????????????? ?>*>(>2>>>>???? ?1>*>(>2>9>??????????????????????????????????? ?>>>???? ?>>>>??????????? ?>>>?????????????????????????????????????????????????? ?>*>(>2>>>>???? ?1>*>(>2>9>??????????????????????????????????? ?>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>*>(>2>>>>???? ?1>*>(>2>9>??????????????????????????????????? ?>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>*>(>2>>>>???? ?1>)>(>3>9>??????????????????????????????????? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?=?>><? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?=?>*>(>2>>>>???? ?1>*>(>2>9>????????????????????????????????????????????????????????? ?>>?????????????????????????????????????????????????? ?>*>(>2>>>>???? ?1>*>(>2>9>????????????????????????????????????????????????????????? ?>>?????????????????????????????????????????????????? ?>*>(>2>>>>???? ?1>*>(>2>9>???????????????????????????????????????? ?xyxz|xxz|xxz|xxq?? ?>>?? ?xyz|xxz|xz|xxz|xxxq?????????????????????????????? ?>*>(>2>>>>???? ?1>*>(>2>9>???????????????????????????????????????? ?ys?? ?>>?? ?{s?????????????????????????????? ?>*>(>2>>>>???? ?1>)>(>3>9>???????????????????????????????????????? ?{q?? ?>>?? ?}u?????????????????????????????? ?>*>(>5>>>>???? ?1>*>(>2>9>???????????????????????????????????????? ?}q?? ?>>?? ?ys?????????????????????????????? ?>*>(>2>>>>???? ?1>*>(>2>9>???????????????????????????????????????? ?ys?? ?>>?? ?{q?????????????????????????????? ?>*>(>2>>>>???? ?1>*>(>2>9>???????????????????????????????????????? ?{u?? ?>>?? ?}s?????????????????????????????? ?>*>(>2>>>>???? ?1>*>(>2>9>???????????????????????????????????????? ?}q?? ?>>?? ?yu?????????????????????????????? ?>*>(>2>>>>???? ?1>)>(>3>9>???????????????????????????????????????? ?ys?? ?>>?? ?{s?????????????????????????????? ?>*>(>2>>>>???? ?1>*>(>2>9>???????????????????????????????????????? ?{q?? ?>>?? ?}q?????????????????????????????? ?>*>(>2>>>>???? ?1>*>(>2>9>???????????????????????????????????????? ?}q?? ?>>?? ?ys?????????????????????????????? ?>*>(>2>>>>???? ?1>*>(>2>9>???????????????????????????????????????? ?ys?? ?>>?? ?{u?????????????????????????????? ?>*>(>2>>>>???? ?1>*>(>2>9>???????????????????????????????????????? ?{u?? ?>>?? ?}s?????????????????????????????? ?>*>(>2>>>>???? ?1>)>(>3>9>???????????????????????????????????????? ?}q?? ?>>?? ?yq?????????????????????????????? ?>*>(>5>>>>???? ?1>*>(>2>9>???????????????????????????????????????? ?yq?? ?>>?? ?ys?????????????????????????????? ?>*>(>2>>>>???? ?1>*>(>2>9>???????????????????????????????????????? ? p? r? t?=p?y>?? ? p? r? t? p? p? r? t? p? p? r? t? p? t? p?=p?yu?????????????????????????????? ?>*>(>2>>>>???? ?1>*>(>2>9>???????????????????????????????????????????? ?{q?????????? ?>>????????????????? ?}s?????????????????????????????? ?>*>(>2>>>>???? ?1>*>(>2>9>???????????????????????????????????????????? ?}q?????????? ?>>????????????????? ?yq?????????????????????????????? ?>*>(>2>>>>???? ?1>)>(>3>9>???????????????????????????????????????????? ?y>q?????????? ?>????????????????? ?{s?????????????????????????????? ?>*>(>2>>>>???? ?1>*>(>2>9>???????????????????????????????????????????? ?yxxz|zxz|zx|:>;>z|zxz|zxz|zxz|xq? ?}u?????????????????????????????? ?>*>(>2>>>>???? ?1>*>(>2>9>???????????????????????????????????????????? ?{s? ?ys?????????????????????????????? ?>*>(>2>>>>???? ?1>*>(>2>9>???????????????????????????????????????????? ?}u? ?{q?????????????????????????????? ?>*>(>2>>>>???? ?1>*>(>2>9>???????????????????????????????????????????? ?ys? ?}s?????????????????????????????? ?>*>(>2>>>>???? ?1>)>(>3>9>???????????????????????????????????????? ?xyz|xq? ?yu?????????????????????????????? ?>*>(>5>>>>???? ?1>*>(>2>9>???????????????????????????????????????? ?{s? ?{s?????????????????????????????? ?>*>(>2>>>>???? ?1>*>(>2>9>???????????????????????????????????????? ?}u? ?}q?????????????????????????????? ?>*>(>2>>>>???? ?1>*>(>2>9>???????????????????????????????????????? ?y>q? ?ys?????????????????????????????? ?>*>(>2>>>>???? ?1>*>(>2>9>???????????????????????????????????????? ?{xxu?????????????????????????????? ?>*>(>2>>>>???? ?1>)>(>3>9>???????????????????????????????????????? ?yq?????????????????????????????? ?>*>(>2>>>>???? ?1>*>(>2>9>???????????????????????????????????????? ?{*>(>2>>>>???? ?1>*>(>2>9>???????????????????????????????????????? ?}s?????????????????????????????????? ?>*>(>2>>>>???? ?1>*>(>2>9>???????????????????????????????????????? ?yu?????????????????????????????????? ?>*>(>2>>>>???? ?1>*>(>2>9>???????????????????????????????????????? ? p? r? t? p? r? t? r? p? r? p? r? t? r? p? r? t? p?=p?:Ay>;A>A*>(>2>>>>???? ?1>)>(>3>9>?????????????????????????????????????????????????????????? ?A}AAs???????????????????????????????????????????????? ?>*>(>5>>>>???? ?1>*>(>2>9>?????????????????????????????????????????????????????????? ?A}AAs???????????????????????????????????????????????? ?>*>(>2>>>>???? ?1>*>(>2>9>?????????????????????????????????????????????????????????? ?A}AAu???????????????????????????????????????????????? ?>*>(>2>>>>???? ?1>*>(>2>9>>?????????????????????????????????????????????????????????? ?AyAA>q???????????????????????????????????????????????? ?>*>(>2>>>>???? ?1>*>(>2>9>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>:>;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>*>(>2>>>>???? ?1>)>(>3>9>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>*>(>2>>>>???? ?1>*>(>2>9>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>*>(>2>>>>???? ?1>*>(>2>9><? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?=?>*>(>2>>>>???? ?1>*>(>2>9>?????????????????????????????????????????????????????????????????????????????????????????????????????????????? ?>*>(>2>>>>???? ?1>*>(>2>9>?????????????????????????????????????????????????????????????????????????????????????????????????????????????? ?>*>(>2>>>>???? ?1>)>(>3>9>???????????????????????????????????????????N?;?;?;?;?;?;?;?;?;?;?;?;?;?;?;?;?;?;?;?;?;?;?;?;?;?;?;?;?;?;?;?;?;?;?;?;?:?????????????????????????????? ?>*>(>5>>>>???? ?1>*>(>2>9>???????????????????????????????????????????M?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?@?????????????????????????????? ?>*>(>2>>>>???? ?1>*>(>2>9>???????????????????????????????????????????M?D?D?DG?DG?D?D?D?D?D?D?D?DH?DH?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?DG?D?D?D?D?@?????????????????????????????? ?>*>(>2>>>>???? ?1>*>(>2>9>???????????????????????????????????????????M?D?D?DG?DG?D?D?D?D?DH?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?DH?D?D?DH?DH?D?DG?D?D?D?D?@?????????????????????????????? ?>*>(>2>>>>???? ?1>*>(>2>9>???????????????????????????????????????????M?D?D?D?D?D?DH?DF?D?D?D?D?D?D?D?D?D?D?DH?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?@?????????????????????????????? ?>*>(>2>>>>>???? ?1>)>(>3>9>???????????????????????????????????????????M?D?D?D?D?D?D?D?D?D?D?D?DH?D?D?DF?D?D?D?D?D?D?D?D?DG?DG?D?D?D?D?D?D?D?D?D?D?D?@?????????????????????????????? ?>*>(>2>>>>>>?? ?1>*>(>2>9>???????????????????????????????????????????M?D?D?DG?D?D?D?D?D?D?D?D?D?D?D?D?DF?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?DH?D?@?????????????????????????????? ?>*>(>2>>>>>>?? ?1>*>(>2>9>???????????????????????????????????????????M?D?D?D?D?D?DH?D?D?D?DG?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?DG?DG?D?D?D?DG?D?D?D?@?????????????????????????????? ?>*>(>2>>>><? ??? ?1>*>(>2>9>???????????????????????????????????????????M?D?D?D?DH?D?D?D?DH?DH?D?D?D?D?D?D?D?D?D?D?D?D?D?DF?D?D?D?D?DG?DG?D?D?D?D?D?D?D?@?????????????????????????????? ?>*>(>2>>>>???? ?1>*>(>2>9>???????????????????????????????????????????M?D?D?D?D?D?DF?D?D?D?D?D?DH?D?DG?DG?DG?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?@?????????????????????????????? ?>*>(>2>>>>???? ?1>)>(>3>9>???????????????????????????????????????????M?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?DG?D?DH?D?@?????????????????????????????? ?>*>(>5>>>>???? ?1>*>(>2>9>???????????????????????????????????????????M?D?D?D?DG?D?D?DH?D?D?DH?D?D?D?D?D?DH?D?D?D?D?DH?D?D?D?D?D?D?DF?D?D?D?D?DH?D?D?D?@?????????????????????????????? ?>*>(>2>>>>???? ?1>*>(>2>9>???????????????????????????????????????????M?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?DG?DG?D?D?D?D?D?D?D?DH?D?D?D?@?????????????????????????????? ?>*>(>2>>>>???? ?1>*>(>2>9>???????????????????????????????????????????M?D?D?D?D?D?D?D?D?D?D?D?D?D?D?DH?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?D?@?????????????????????????????? ?>*>(>2>>>>???? ?1>*>(>2>9>???????????????????????????????????????????L?C?C?C?C?C?C?C?C?C?C?C?C?C?C?C?C?C?C?C?C?C?C?C?C?C?C?C?C?C?C?C?C?C?C?C?C?O?????????????????????????????? ?>*>(>2>>>>???? ?1>)>(>3>9>?????????????????????????????????????????????????????????????????????????????????????????????????????????????? ?>*>(>2>>>>???? ?1>*>(>2>9>?????????????????????????????????????????????????????????????????????????????????????????????????????????????? ?>*>(>2>>>>???? ?1>*>(>2>9>?????????????????????????????????????????????????????????????????????????????????????????????????????????????? ?>*>(>2>>>>???? ?1>*>(>2>9>?????????????????????????????????????????????????????????????????????????????????????????????????????????????? ?>*>(>2>>>>??F0CorsixTH-0.63/CorsixTH/Lua/000077500000000000000000000000001347163623700154055ustar00rootroot00000000000000CorsixTH-0.63/CorsixTH/Lua/announcer.lua000066400000000000000000000177031347163623700201100ustar00rootroot00000000000000--[[ Copyright (c) 2018 Rick "Feanathiel" Megens 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. --]] --! Pr local AnnouncementPriority = { Critical = 1, High = 2, Normal = 3, Low = 4 } strict_declare_global "AnnouncementPriority" _G["AnnouncementPriority"] = AnnouncementPriority local default_announcement_priority = AnnouncementPriority.Normal local default_announcement_decay_hours = { [AnnouncementPriority.Critical] = -1, -- never decay [AnnouncementPriority.High] = 365*24, [AnnouncementPriority.Normal] = 31*24, [AnnouncementPriority.Low] = 7*24 } --! An announcement queue based on priority class "AnnouncementQueue" ---@type AnnouncementQueue local AnnouncementQueue = _G["AnnouncementQueue"] --! Creates an announcement queue: a collection of announcements with queue semantics. function AnnouncementQueue:AnnouncementQueue() -- might want to use a single table for this self.priorities = { [AnnouncementPriority.Critical] = {}, [AnnouncementPriority.High] = {}, [AnnouncementPriority.Normal] = {}, [AnnouncementPriority.Low] = {} } self.count = 0 end --! Adds the announcement entry to the queue. --!param priority (int) the priority of the announcement --!param entry (AnnouncementEntry) the announcement entry function AnnouncementQueue:push(priority, entry) local entries = self.priorities[priority] table.insert(entries, entry) self.count = self.count + 1 end --! Dequeues the announcement with the highest priority, nil if the queue is empty. function AnnouncementQueue:pop() for _, entries in ipairs(self.priorities) do if entries[1] ~= nil then local entry = table.remove(entries, 1) self.count = self.count - 1 return entry end end return nil end --! Returns true if the queue is empty, false otherwise. function AnnouncementQueue:isEmpty() return self.count == 0 end --! An announcement. class "AnnouncementEntry" ---@type AnnouncementEntry local AnnouncementEntry = _G["AnnouncementEntry"] --! Creates an announcement function AnnouncementEntry:AnnouncementEntry() self.name = nil -- filename to play self.priority = default_announcement_priority self.created_tick = nil -- when it has been created self.decay_ticks = nil -- how long until the announcement isn't relevant anymore self.played_callback = nil -- call me whenever the sound was played, ... self.played_callback_delay = nil -- but not until delay has passed end --! Announces audible messages to the player. --! The announcer plays announcements based on their priority. If the caller requests an -- announcement to be played, it will be played directly if there are no announcements -- currently being announced. Note that announcements are only played if there is -- a worker at the reception desk and announcements are enabled in the settings. class "Announcer" ---@type Announcer local Announcer = _G["Announcer"] --! Constructor. --!param app (App) The CorsixTH app function Announcer:Announcer(app) self.app = app self.entries = AnnouncementQueue() self.playing = false self.ticks_since_last_announcement = 0 self:_setRandomAnnouncementTarget() end --! Requests the announcer to play an announcement. --!param name (string) The filename to play. --!param priority (int | nil) The priority of the announcement. See AnnouncementPriority. --!param decay_hours (float | nil) After this amount of hours the announcement should be considered irrelevant. -- Provide nil for a decay time based on the provided priority. --!param played_callback (function | nil) The callback to trigger when the announcement was successfully played. --!param played_callback_delay (int | nil) Delay the callback with this amount of milliseconds. function Announcer:playAnnouncement(name, priority, decay_hours, played_callback, played_callback_delay) -- Announcements use the in-game time instead of ticks. -- For example, if an employee is sacked, the announcement should -- have played in a reasonable amount of time (on his way out). -- We don't want the game to play the announcement if it took too long to -- actually start it, as more important announcements must be played before that. -- It doesn't make sense to play the sacked announcement when the employee -- already has had several other jobs and has died already [joke]. local new_priority = priority or default_announcement_priority local created_date = self.app.world.game_date:clone() local new_decay_hours = decay_hours or default_announcement_decay_hours[new_priority] local entry = AnnouncementEntry() entry.name = name entry.priority = new_priority entry.created_date = created_date entry.decay_hours = new_decay_hours entry.played_callback = played_callback entry.played_callback_delay = played_callback_delay self.entries:push(new_priority, entry) end --! The announcer's (game) tick handler. -- Plays the actual sound of the announcements, if available. -- Also queues random announcements if no announcements have been played for a while. function Announcer:onTick() if not self.app.world:isCurrentSpeed("Pause") then local ticks_since_last_announcement = self.ticks_since_last_announcement if ticks_since_last_announcement >= self.random_announcement_ticks_target then self:playAnnouncement("rand*.wav", AnnouncementPriority.Low) self:_setRandomAnnouncementTarget() else self.ticks_since_last_announcement = ticks_since_last_announcement + 1 end end -- Delay until someone is available at the desk if self.app.world:getLocalPlayerHospital():hasStaffedDesk() then while not self.playing and not self.entries:isEmpty() do local entry = self.entries:pop() local game_date = self.app.world.game_date if entry.decay_hours == -1 or game_date <= entry.created_date:plusHours(entry.decay_hours) then if self.app.config.play_announcements then self:_play(entry) end -- Drain the queue otherwise end end end end --! Private function. Sets the new time (in ticks) when a random announcement should be played. function Announcer:_setRandomAnnouncementTarget() -- Note that random announcement are measured in ticks. -- This ensures that on fast game speeds random announcements aren't -- spammed, or on lower game speeds random announcements are never played. -- Every tick is 30ms, so 2000 ticks is 1 minute. self.random_announcement_ticks_target = math.random(8000, 12000) end --! Private function. Plays the actual sound of an announcement. --!param entry (AnnouncementEntry) The announcement to play. function Announcer:_play(entry) self.playing = true self.app.audio:playSound(entry.name, nil, true, function () self:_onPlayed(entry) end, entry.played_callback_delay) self.ticks_since_last_announcement = 0 end --! Private function. Handles the playSound completed event. Also calls the callback of the announcement. --!param entry (AnnouncementEntry) The announcement that has been played. function Announcer:_onPlayed(entry) self.playing = false if entry.played_callback ~= nil then entry.played_callback() end end CorsixTH-0.63/CorsixTH/Lua/api_version.lua000066400000000000000000000033611347163623700204310ustar00rootroot00000000000000#ifdef _ /* Copyright (c) 2009-2017 Peter "Corsix" Cawley et al. --[[ 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. This file is used to ensure that the compiled binary being used by Lua is up to date. Without this system, if the binary was not recent enough, then the user would get a confusing error message along the lines of attemping to call a nil value (as new API functions are nil in older binaries). When a new API call is added to the C++ source, the version number in this file should be incremented. Traditionally, the version number will be similar to the SVN revision number. Likewise, if an existing function is changed in a way incompatible with old Lua code, then the version number needs to change. Note: This file compiles as both Lua and C++. */ #endif /*]]--*/ return 2678; CorsixTH-0.63/CorsixTH/Lua/app.lua000066400000000000000000001537051347163623700167030ustar00rootroot00000000000000--[[ Copyright (c) 2009 Peter "Corsix" Cawley 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. --]] local pathsep = package.config:sub(1, 1) local rnc = require("rnc") local lfs = require("lfs") local TH = require("TH") local SDL = require("sdl") local runDebugger = corsixth.require("run_debugger") -- Increment each time a savegame break would occur -- and add compatibility code in afterLoad functions local SAVEGAME_VERSION = 134 class "App" ---@type App local App = _G["App"] function App:App() self.command_line = {} self.config = {} self.hotkeys = {} self.runtime_config = {} self.running = false self.key_modifiers = {} self.gfx = {} self.last_dispatch_type = "" self.eventHandlers = { frame = self.drawFrame, timer = self.onTick, keydown = self.onKeyDown, keyup = self.onKeyUp, textediting = self.onEditingText, textinput = self.onTextInput, buttonup = self.onMouseUp, buttondown = self.onMouseDown, mousewheel = self.onMouseWheel, motion = self.onMouseMove, active = self.onWindowActive, window_resize = self.onWindowResize, music_over = self.onMusicOver, movie_over = self.onMovieOver, sound_over = self.onSoundOver, multigesture = self.onMultiGesture } self.strings = {} self.savegame_version = SAVEGAME_VERSION self.check_for_updates = true end --! Starts a Lua DBGp client & connects it to a DBGp server. --!return error_message (String) Returns an error message or nil. function App:connectDebugger() return runDebugger() end function App:setCommandLine(...) self.command_line = {...} for _, arg in ipairs(self.command_line) do local setting, value = arg:match("^%-%-([^=]*)=(.*)$") --setting=value if value then self.command_line[setting] = value end end end function App:init() -- App initialisation 1st goal: Get the loading screen up print("") print("") print("---------------------------------------------------------------") print("") print("Welcome to CorsixTH " .. self:getVersion() .. "!") print("") print("---------------------------------------------------------------") print("") print("This window will display useful information if an error occurs.") print("") print("---------------------------------------------------------------") print("") -- Prereq 1: Config file (for screen width / height / TH folder) -- Note: These errors cannot be translated, as the config file specifies the language local conf_path = self.command_line["config-file"] or "config.txt" local conf_chunk, conf_err = loadfile_envcall(conf_path) if not conf_chunk then error("Unable to load the config file. Please ensure that CorsixTH " .. "has permission to read/write " .. conf_path .. ", or use the " .. "--config-file=filename command line option to specify a writable file. " .. "For reference, the error loading the config file was: " .. conf_err) else conf_chunk(self.config) end self:fixConfig() corsixth.require("filesystem") local good_install_folder, error_message = self:checkInstallFolder() self.good_install_folder = good_install_folder -- self:checkLanguageFile() self.level_dir = debug.getinfo(1, "S").source:sub(2, -12) .. "Levels" .. pathsep self:initUserLevelDir() self:initSavegameDir() self:initScreenshotsDir() -- Create the window if not SDL.init("audio", "video", "timer") then return false, "Cannot initialise SDL" end local compile_opts = TH.GetCompileOptions() local api_version = corsixth.require("api_version") if api_version ~= compile_opts.api_version then api_version = api_version or 0 compile_opts.api_version = compile_opts.api_version or 0 if api_version < compile_opts.api_version then print("Notice: Compiled binary is more recent than Lua scripts.") elseif api_version > compile_opts.api_version then print("Warning: Compiled binary is out of date. CorsixTH will likely" .. " fail to run until you recompile the binary.") end end local modes = {} if compile_opts.renderer == "OpenGL" then modes[#modes + 1] = "opengl" end self.fullscreen = false if self.config.fullscreen then self.fullscreen = true modes[#modes + 1] = "fullscreen" end if self.config.track_fps then modes[#modes + 1] = "present immediate" end self.modes = modes self.video = assert(TH.surface(self.config.width, self.config.height, unpack(modes))) self.video:setBlueFilterActive(false) SDL.wm.setIconWin32() self:setCaptureMouse() local caption_descs = {self.video:getRendererDetails()} if compile_opts.jit then caption_descs[#caption_descs + 1] = compile_opts.jit else caption_descs[#caption_descs + 1] = _VERSION end if compile_opts.arch_64 then caption_descs[#caption_descs + 1] = "64 bit" end self.caption = "CorsixTH (" .. table.concat(caption_descs, ", ") .. ")" self.video:setCaption(self.caption) -- Prereq 2: Load and initialise the graphics subsystem corsixth.require("persistance") corsixth.require("graphics") self.gfx = Graphics(self) -- Put up the loading screen if good_install_folder then self.video:startFrame() self.gfx:loadRaw("Load01V", 640, 480):draw(self.video, math.floor((self.config.width - 640) / 2), math.floor((self.config.height - 480) / 2)) self.video:endFrame() -- Add some notices to the loading screen local notices = {} local font = self.gfx:loadBuiltinFont() if TH.freetype_font and self.gfx:hasLanguageFont("unicode") then notices[#notices + 1] = TH.freetype_font.getCopyrightNotice() font = self.gfx:loadLanguageFont("unicode", font:getSheet()) end notices = table.concat(notices) if notices ~= "" then self.video:startFrame() self.gfx:loadRaw("Load01V", 640, 480):draw(self.video, math.floor((self.config.width - 640) / 2), math.floor((self.config.height - 480) / 2)) font:drawWrapped(self.video, notices, 32, math.floor((self.config.height + 400) / 2), math.floor(self.config.width - 64), "center") self.video:endFrame() end end -- App initialisation 2nd goal: Load remaining systems and data in an appropriate order math.randomseed(os.time() + SDL.getTicks()) -- Add math.n_random globally. It generates pseudo random normally distributed -- numbers using the Box-Muller transform. strict_declare_global "math.n_random" math.n_random = function(mean, variance) return mean + math.sqrt(-2 * math.log(math.random())) * math.cos(2 * math.pi * math.random()) * variance end -- Also add the nice-to-have function math.round strict_declare_global "math.round" math.round = function(input) return math.floor(input + 0.5) end -- Load audio corsixth.require("audio") self.audio = Audio(self) self.audio:init() -- Load movie player corsixth.require("movie_player") self.moviePlayer = MoviePlayer(self, self.audio, self.video) if good_install_folder then self.moviePlayer:init() end -- Load strings before UI and before additional Lua corsixth.require("strings") corsixth.require("string_extensions") self.strings = Strings(self) self.strings:init() local language_load_success = self:initLanguage() if (self.command_line.dump or ""):match("strings") then -- Specify --dump=strings on the command line to dump strings -- (or insert "true or" after the "if" in the above) self:dumpStrings() end -- Load/setup hotkeys. local hotkeys_path = self.command_line["hotkeys-file"] or "hotkeys.txt" local hotkeys_chunk, hotkeys_err = loadfile_envcall(hotkeys_path) if not hotkeys_chunk then error(_S.hotkeys_file_err.file_err_01 .. hotkeys_path .. _S.hotkeys_file_err.file_err_02 .. hotkeys_err ) else hotkeys_chunk(self.hotkeys) end self:fixHotkeys() -- Load map before world corsixth.require("map") -- Load additional Lua before world if good_install_folder then self.anims = self.gfx:loadAnimations("Data", "V") self.animation_manager = AnimationManager(self.anims) self.walls = self:loadLuaFolder("walls") corsixth.require("entity") corsixth.require("entities.humanoid") corsixth.require("entities.object") corsixth.require("entities.machine") local objects = self:loadLuaFolder("objects") self.objects = self:loadLuaFolder("objects/machines", nil, objects) -- Doors are in their own folder to ensure that the swing doors (which -- depend on the door) are loaded after the door object. self.objects = self:loadLuaFolder("objects/doors", nil, objects) for _, v in ipairs(self.objects) do if v.slave_id then v.slave_type = self.objects[v.slave_id] v.slave_type.master_type = v end Object.processTypeDefinition(v) end corsixth.require("room") self.rooms = self:loadLuaFolder("rooms") corsixth.require("humanoid_action") self.humanoid_actions = self:loadLuaFolder("humanoid_actions") local diseases = self:loadLuaFolder("diseases") self.diseases = self:loadLuaFolder("diagnosis", nil, diseases) -- Load world before UI corsixth.require("world") end -- Load UI corsixth.require("ui") if good_install_folder then corsixth.require("game_ui") self.ui = UI(self, true) else self.ui = UI(self, true) self.ui:setMenuBackground() local function callback(path) TheApp.config.theme_hospital_install = path TheApp:saveConfig() debug.getregistry()._RESTART = true TheApp.running = false end self.ui:addWindow(UIDirectoryBrowser(self.ui, nil, _S.install.th_directory, "InstallDirTreeNode", callback)) return true end -- Load main menu (which creates UI) local function callback_after_movie() self:loadMainMenu() -- If we couldn't properly load the language, show an information dialog if not language_load_success then -- At this point we know the language is english, so no use having -- localized strings. self.ui:addWindow(UIInformation(self.ui, {"The game language has been reverted" .. " to English because the desired language could not be loaded. " .. "Please make sure you have specified a font file in the config file."})) end -- If a savegame was specified, load it if self.command_line.load then local status, err = pcall(self.load, self, self.savegame_dir .. self.command_line.load) if not status then err = _S.errors.load_prefix .. err print(err) self.ui:addWindow(UIInformation(self.ui, {err})) end end -- There might also be a message from the earlier initialization process that should be shown. -- Show it using the built-in font in case the game's font is messed up. if error_message then self.ui:addWindow(UIInformation(self.ui, error_message, true)) end end if self.config.play_intro then self.moviePlayer:playIntro(callback_after_movie) else callback_after_movie() end return true end --! Tries to initialize the user and built in level directories, returns true on --! success and false on failure. function App:initUserLevelDir() local conf_path = self.command_line["config-file"] or "config.txt" self.user_level_dir = self.config.levels or conf_path:match("^(.-)[^" .. pathsep .. "]*$") .. "Levels" if self.user_level_dir:sub(-1, -1) == pathsep then self.user_level_dir = self.user_level_dir:sub(1, -2) end if lfs.attributes(self.user_level_dir, "mode") ~= "directory" then if not lfs.mkdir(self.user_level_dir) then print("Notice: Level directory does not exist and could not be created.") return false end end if self.user_level_dir:sub(-1, -1) ~= pathsep then self.user_level_dir = self.user_level_dir .. pathsep end return true end --! Tries to initialize the savegame directory, returns true on success and --! false on failure. function App:initSavegameDir() local conf_path = self.command_line["config-file"] or "config.txt" self.savegame_dir = self.config.savegames or conf_path:match("^(.-)[^" .. pathsep .. "]*$") .. "Saves" if self.savegame_dir:sub(-1, -1) == pathsep then self.savegame_dir = self.savegame_dir:sub(1, -2) end if lfs.attributes(self.savegame_dir, "mode") ~= "directory" then if not lfs.mkdir(self.savegame_dir) then print("Notice: Savegame directory does not exist and could not be created.") return false end end if self.savegame_dir:sub(-1, -1) ~= pathsep then self.savegame_dir = self.savegame_dir .. pathsep end return true end function App:initScreenshotsDir() local conf_path = self.command_line["config-file"] or "config.txt" self.screenshot_dir = self.config.screenshots or conf_path:match("^(.-)[^" .. pathsep .. "]*$") .. "Screenshots" if self.screenshot_dir:sub(-1, -1) == pathsep then self.screenshot_dir = self.screenshot_dir:sub(1, -2) end if lfs.attributes(self.screenshot_dir, "mode") ~= "directory" then if not lfs.mkdir(self.screenshot_dir) then print("Notice: Screenshot directory does not exist and could not be created.") return false end end if self.screenshot_dir:sub(-1, -1) ~= pathsep then self.screenshot_dir = self.screenshot_dir .. pathsep end return true end function App:initLanguage() -- Make sure that we can actually show the desired language. -- If we can't, then the player probably didn't specify a font file -- in the config file properly. local success = true local language = self.config.language local font = self.strings:getFont(language) if self.gfx:hasLanguageFont(font) then self.gfx.language_font = font else -- Otherwise revert to english. self.gfx.language_font = self.strings:getFont("english") language = "english" self.config.language = "english" success = false end local strings, speech_file = self.strings:load(language) strict_declare_global "_S" strict_declare_global "_A" local old_S = _S _S = strings -- For immediate compatibility: getmetatable(_S).__call = function(_, sec, str, ...) assert(_S.deprecated[sec] and _S.deprecated[sec][str], "_S(" .. sec .. ", " .. str .. ") does not exist!") str = _S.deprecated[sec][str] if ... then str = str:format(...) end return str end if old_S then unpermanent "_S" end _S = permanent("_S", TH.stringProxy(_S)) if old_S then TH.stringProxy.reload(old_S, _S) end _A = self.strings:setupAdviserMessage(_S.adviser) self.gfx:onChangeLanguage() if self.ui then self.ui:onChangeLanguage() end self.audio:initSpeech(speech_file) return success end function App:worldExited() self.audio:clearCallbacks() end function App:loadMainMenu(message) if self.world then self:worldExited() end -- Make sure there is no blue filter active. self.video:setBlueFilterActive(false) -- Unload ui, world and map self.ui = nil self.world = nil self.map = nil self.ui = UI(self) self.ui:setMenuBackground() self.ui:addWindow(UIMainMenu(self.ui)) self.ui:addWindow(UITipOfTheDay(self.ui)) -- Show update window if there's an update self:checkForUpdates() -- If a message was supplied, show it if message then self.ui:addWindow(UIInformation(self.ui, message)) end end --! Sets the mouse capture to the state set within --! app.config.capture_mouse function App:setCaptureMouse() self.video:setCaptureMouse(self.config.capture_mouse) end --! Loads the first level of the specified campaign and prepares the world --! to be able to progress through that campaign. --!param campaign_file (string) Name of a CorsixTH Campaign definition Lua file. function App:loadCampaign(campaign_file) local campaign_info, level_info, errors, _ campaign_info, errors = self:readCampaignFile(campaign_file) if not campaign_info then self.ui:addWindow(UIInformation(self.ui, {_S.errors.could_not_load_campaign:format(errors)})) return end level_info, errors = self:readLevelFile(campaign_info.levels[1]) if not level_info then self.ui:addWindow(UIInformation(self.ui, {_S.errors.could_not_find_first_campaign_level:format(errors)})) return end _, errors = self:readMapDataFile(level_info.map_file) if errors then self.ui:addWindow(UIInformation(self.ui, {errors})) return end self:loadLevel(campaign_info.levels[1], nil, level_info.name, level_info.map_file, level_info.briefing) -- The new world needs to know which campaign to continue on. self.world.campaign_info = campaign_info end --! Reads the given file name as a Lua chunk from the Campaigns folder in the CorsixTH install directory. --! A correct campaign definition contains "name", "description", "levels", and "winning_text". --!param campaign_file (string) Name of the file to read. --!return (table) Definitions found in the campaign file. function App:readCampaignFile(campaign_file) local local_path = debug.getinfo(1, "S").source:sub(2, -12) local dir = "Campaigns" .. pathsep local path = local_path .. dir local chunk, err = loadfile_envcall(path .. campaign_file) if not chunk then return nil, "Error loading " .. path .. campaign_file .. ":\n" .. tostring(err) else local result = {} chunk(result) return result end end --! Opens the given file name and returns all Level definitions in a table. --! Values in the returned table: "path", "level_file", "name", "map_file", "briefing", and "end_praise". --!param level (string) Name of the file to read. --!return (table) Level info found in the file. function App:readLevelFile(level) local filename = self:getAbsolutePathToLevelFile(level) local file, err = io.open(filename and filename or "") if not file then return nil, "Could not open the specified level file (" .. level .. "): " .. err end local contents = file:read("*all") file:close() local level_info = {} level_info.path = filename level_info.level_file = level level_info.name = contents:match("%Name ?= ?\"(.-)\"") or "Unknown name" level_info.map_file = contents:match("%MapFile ?= ?\"(.-)\"") if not level_info.map_file then -- The old way of defining the Map File has been deprecated, but a warning is enough. level_info.map_file = contents:match("%LevelFile ?= ?\"(.-)\"") if level_info.map_file then print("\nWarning: The level '" .. level_info.name .. "' contains a deprecated variable definition in the level file." .. "'%LevelFile' has been renamed to '%MapFile'. Please advise the map creator to update the level.\n") end level_info.deprecated_variable_used = true end level_info.briefing = contents:match("%LevelBriefing ?= ?\"(.-)\"") level_info.end_praise = contents:match("%LevelDebriefing ?= ?\"(.-)\"") return level_info end --! Searches for the given level file in the "Campaigns" and "Levels" folder of the --! CorsixTH install directory. --!param level (string) Filename to search for. --!return (string, error) Returns the found absolute path, or nil if not found. Then --! a second variable is returned with an error message. function App:getAbsolutePathToLevelFile(level) local path = debug.getinfo(1, "S").source:sub(2, -12) -- First look in Campaigns. If not found there, fall back to Levels. local list_of_possible_paths = {self.user_level_dir, path .. "Campaigns", self.level_dir} for _, parent_path in ipairs(list_of_possible_paths) do local check_path = parent_path .. pathsep .. level local file, _ = io.open(check_path, "rb") if file then file:close() return check_path end end return nil, "Level not found: " .. level end -- Loads the specified level. If a string is passed it looks for the file with the same name -- in the "Levels" folder of CorsixTH, if it is a number it tries to load that level from -- the original game. function App:loadLevel(level, difficulty, level_name, level_file, level_intro, map_editor) if self.world then self:worldExited() end -- Check that we can load the data before unloading current map local new_map = Map(self) local map_objects, errors = new_map:load(level, difficulty, level_name, level_file, level_intro, map_editor) if not map_objects then self.world.ui:addWindow(UIInformation(self.ui, {errors})) return end -- If going from another level, save progress. local carry_to_next_level if self.world and self.world.campaign_info then carry_to_next_level = { world = { room_built = self.world.room_built, campaign_info = self.world.campaign_info, }, hospital = { player_salary = self.ui.hospital.player_salary, message_popup = self.ui.hospital.message_popup, hospital_littered = self.ui.hospital.hospital_littered, has_seen_pay_rise = self.ui.hospital.has_seen_pay_rise, }, } end -- Make sure there is no blue filter active. self.video:setBlueFilterActive(false) -- Unload ui, world and map self.ui = nil self.world = nil self.map = nil -- Load map self.map = new_map self.map:setBlocks(self.gfx:loadSpriteTable("Data", "VBlk-0")) self.map:setDebugFont(self.gfx:loadFont("QData", "Font01V")) -- Load world self.world = World(self) self.world:createMapObjects(map_objects) -- Enable / disable SoundEffects self.audio:playSoundEffects(self.config.play_sounds) -- Load UI self.ui = GameUI(self, self.world:getLocalPlayerHospital(), map_editor) self.world:setUI(self.ui) -- Function call allows world to set up its keyHandlers if tonumber(level) then self.moviePlayer:playAdvanceMovie(level) end -- Now restore progress from previous levels. if carry_to_next_level then self.world:initFromPreviousLevel(carry_to_next_level) end end -- This is a useful debug and development aid function App:dumpStrings() -- Accessors to reach through the userdata proxies on strings local LUT = debug.getregistry().StringProxyValues local function val(o) if type(o) == "userdata" then return LUT[o] else return o end end local function is_table(o) return type(val(o)) == "table" end local dir = self.command_line["config-file"] or "" dir = string.sub(dir, 0, -11) local fi = assert(io.open(dir .. "debug-strings-orig.txt", "w")) for i, sec in ipairs(_S.deprecated) do for j, str in ipairs(sec) do fi:write("[" .. i .. "," .. j .. "] " .. ("%q\n"):format(val(str))) end fi:write("\n") end fi:close() local function dump_by_line(file, obj, prefix) for n, o in pairs(obj) do if n ~= "deprecated" then local new_prefix if type(n) == "number" then new_prefix = prefix .. "[" .. n .. "]" else new_prefix = (prefix == "") and n or (prefix .. "." .. n) end if is_table(o) then dump_by_line(file, o, new_prefix) else file:write(new_prefix .. " = " .. "\"" .. val(o) .. "\"\n") end end end end local function dump_grouped(file, obj, prefix) for n, o in pairs(obj) do if n ~= "deprecated" then if type(n) == "number" then n = "[" .. n .. "]" end if is_table(o) then file:write(prefix .. n .. " = {\n") dump_grouped(file, o, prefix .. " ") file:write(prefix .. "}") else file:write(prefix .. n .. " = " .. "\"" .. val(o) .. "\"") end if prefix ~= "" then file:write(",") end file:write("\n") end end end fi = assert(io.open(dir .. "debug-strings-new-lines.txt", "w")) dump_by_line(fi, _S, "") fi:close() fi = assert(io.open(dir .. "debug-strings-new-grouped.txt", "w")) dump_grouped(fi, _S, "") fi:close() self:checkMissingStringsInLanguage(dir, self.config.language) -- Uncomment these lines to get diffs for all languages in the game -- for _, lang in ipairs(self.strings.languages_english) do -- self:checkMissingStringsInLanguage(dir, lang) -- end print("") print("------------------------------------------------------") print("Dumped strings to default configuration file directory") print("------------------------------------------------------") print("") end --! Compares strings provided by language file of given language WITHOUT inheritance -- with strings provided by english language with inheritance (i.e. all strings). -- This will give translators an idea which strings are missing in their translation. --!param dir The directory where the file to write to should be. --!param language The language to check against. function App:checkMissingStringsInLanguage(dir, language) -- Accessors to reach through the userdata proxies on strings local LUT = debug.getregistry().StringProxyValues local function val(o) if type(o) == "userdata" then return LUT[o] else return o end end local function is_table(o) return type(val(o)) == "table" end local ltc = self.strings.language_to_chunk if ltc[language] ~= ltc["english"] then local str_en = self.strings:load("english", true) local str_cur = self.strings:load(language, true, true) local function dump_diff(file, obj1, obj2, prefix) for n, o in pairs(obj1) do if n ~= "deprecated" then local new_prefix if type(n) == "number" then new_prefix = prefix .. "[" .. n .. "]" else new_prefix = (prefix == "") and n or (prefix .. "." .. n) end if is_table(o) then -- if obj2 is already nil (i.e. whole table does not exist in current language), carry over nil dump_diff(file, o, obj2 and obj2[n], new_prefix) else if not (obj2 and obj2[n]) then -- does not exist in current language file:write(new_prefix .. " = " .. "\"" .. val(o) .. "\"\n") end end end end end -- if possible, use the English name of the language for the file name. local language_english = language for _, lang_eng in ipairs(self.strings.languages_english) do if ltc[language] == ltc[lang_eng:lower()] then language_english = lang_eng break end end local fi = assert(io.open(dir .. "debug-strings-diff-" .. language_english:lower() .. ".txt", "w")) fi:write("------------------------------------\n") fi:write("MISSING STRINGS IN LANGUAGE \"" .. language:upper() .. "\":\n") fi:write("------------------------------------\n") dump_diff(fi, str_en, str_cur, "") fi:write("------------------------------------\n") fi:write("SUPERFLUOUS STRINGS IN LANGUAGE \"" .. language:upper() .. "\":\n") fi:write("------------------------------------\n") dump_diff(fi, str_cur, str_en, "") fi:close() end end function App:fixConfig() -- Fill in default values for things which don't exist local config_defaults = select(2, corsixth.require("config_finder")) for k, v in pairs(config_defaults) do if self.config[k] == nil then self.config[k] = v end end for key, value in pairs(self.config) do -- Trim whitespace from beginning and end string values - it shouldn't be -- there (at least in any current configuration options). if type(value) == "string" then if value:match("^[%s]") or value:match("[%s]$") then self.config[key] = value:match("^[%s]*(.-)[%s]*$") end end -- For language, make language name lower case if key == "language" and type(value) == "string" then self.config[key] = value:lower() end -- For resolution, check that resolution is at least 640x480 if key == "width" and type(value) == "number" and value < 640 then self.config[key] = 640 end if key == "height" and type(value) == "number" and value < 480 then self.config[key] = 480 end if (key == "scroll_speed" or key == "shift_scroll_speed") and type(value) == "number" then if value > 10 then self.config[key] = 10 elseif value < 1 then self.config[key] = 1 end end end end function App:saveConfig() -- Load lines from config file local fi = io.open(self.command_line["config-file"] or "config.txt", "r") local lines = {} local handled_ids = {} if fi then for line in fi:lines() do lines[#lines + 1] = line if not (string.find(line, "^%s*$") or string.find(line, "^%s*%-%-")) then -- empty lines or comments -- Look for identifiers we want to save local _, _, identifier, value = string.find(line, "^%s*([_%a][_%w]*)%s*=%s*(.-)%s*$") if identifier then local _, temp -- Trim possible trailing comment from value _, _, temp = string.find(value, "^(.-)%s*%-%-.*") value = temp or value -- Remove enclosing [[]], if necessary _, _, temp = string.find(value, "^%[%[(.*)%]%]$") value = temp or value -- If identifier also exists in runtime options, compare their values and -- replace the line, if needed handled_ids[identifier] = true if value ~= tostring(self.config[identifier]) then local new_value = self.config[identifier] if type(new_value) == "string" then new_value = string.format("[[%s]]", new_value) else new_value = tostring(new_value) end lines[#lines] = string.format("%s = %s", identifier, new_value) end end end end fi:close() end -- Append options that were not found for identifier, value in pairs(self.config) do if not handled_ids[identifier] then if type(value) == "string" then value = string.format("[[%s]]", value) else value = tostring(value) end lines[#lines + 1] = string.format("%s = %s", identifier, value) end end -- Trim trailing newlines while lines[#lines] == "" do lines[#lines] = nil end fi = io.open(self.command_line["config-file"] or "config.txt", "w") for _, line in ipairs(lines) do fi:write(line .. "\n") end fi:close() end function App:fixHotkeys() -- Fill in default values for things which don't exist local hotkeys_defaults = select(4, corsixth.require("config_finder")) for k, v in pairs(hotkeys_defaults) do if self.hotkeys[k] == nil then self.hotkeys[k] = v end end for key, value in pairs(self.hotkeys) do -- Trim whitespace from beginning and end string values - it shouldn't be -- there (at least in any current configuration options). if type(value) == "string" then if value:match("^[%s]") or value:match("[%s]$") then self.hotkeys[key] = value:match("^[%s]*(.-)[%s]*$") end end end end function App:saveHotkeys() -- Load lines from config file local fi = io.open(self.command_line["hotkeys-file"] or "hotkeys.txt", "r") local lines = {} local handled_ids = {} if fi then for line in fi:lines() do lines[#lines + 1] = line if not (string.find(line, "^%s*$") or string.find(line, "^%s*%-%-")) then -- empty lines or comments -- Look for identifiers we want to save local _, _, identifier, value = string.find(line, "^%s*([_%a][_%w]*)%s*=%s*(.-)%s*$") if identifier then local _, temp -- Trim possible trailing comment from value _, _, temp = string.find(value, "^(.-)%s*%-%-.*") value = temp or value -- Remove enclosing [[]], if necessary _, _, temp = string.find(value, "^%[%[(.*)%]%]$") value = temp or value -- If identifier also exists in runtime options, compare their values and -- replace the line, if needed handled_ids[identifier] = true if value ~= serialize(self.hotkeys[identifier]) then local new_value = self.hotkeys[identifier] if type(new_value) == "string" then new_value = string.format("[[%s]]", new_value) else new_value = serialize(new_value) end lines[#lines] = string.format("%s = %s", identifier, new_value) end end end end fi:close() end -- Append options that were not found for identifier, value in pairs(self.hotkeys) do if not handled_ids[identifier] then if type(value) == "string" then value = string.format("[[%s]]", value) else value = tostring(value) end lines[#lines + 1] = string.format("%s = %s", identifier, value) end end -- Trim trailing newlines while lines[#lines] == "" do lines[#lines] = nil end fi = io.open(self.command_line["hotkeys-file"] or "hotkeys.txt", "w") for _, line in ipairs(lines) do fi:write(line .. "\n") end fi:close() end function App:run() -- The application "main loop" is an SDL event loop written in C, which calls -- a coroutine whenever an event occurs. Initially it may seem odd to involve -- coroutines, but it does give a few advantages: -- 1) Lua can signal the main loop to exit by finishing the coroutine -- 2) If an error occurs, the call stack is preserved in the coroutine, so -- Lua can query or print the call stack as required, rather than -- hardcoding error behaviour in C. local co = coroutine.create(function(app) local yield = coroutine.yield local dispatch = app.dispatch local repaint = true while app.running do repaint = dispatch(app, yield(repaint)) end end) if self.config.track_fps then SDL.trackFPS(true) SDL.limitFPS(false) end self.running = true do local num_iterations = 0 self.resetInfiniteLoopChecker = function() num_iterations = 0 end debug.sethook(co, function() num_iterations = num_iterations + 1 if num_iterations == 100 then error("Suspected infinite loop", 2) end end, "", 1e7) end coroutine.resume(co, self) local e, where = SDL.mainloop(co) debug.sethook(co, nil) self.running = false if e ~= nil then if where then -- Errors from an asynchronous callback done on the dispatcher coroutine -- will end up here. As the error didn't originate from a dispatched -- event, self.last_dispatch_type is wrong. Therefore, an extra value is -- returned from mainloop(), meaning that where == "callback". self.last_dispatch_type = where end print("An error has occurred!") print("Almost anything can be the cause, but the detailed information " .. "below can help the developers find the source of the error.") print("Running: The " .. self.last_dispatch_type .. " handler.") print("A stack trace is included below, and the handler has been disconnected.") print(debug.traceback(co, e, 0)) print("") if self.world then self.world:gameLog("Error in " .. self.last_dispatch_type .. " handler: ") self.world:gameLog(debug.traceback(co, e, 0)) self.world:dumpGameLog() end if self.world and self.last_dispatch_type == "timer" and self.world.current_tick_entity then -- Disconnecting the tick handler is quite a drastic measure, so give -- the option of just disconnecting the offending entity and attempting -- to continue. local handler = self.eventHandlers[self.last_dispatch_type] local entity = self.world.current_tick_entity self.world.current_tick_entity = nil if class.is(entity, Patient) then self.ui:addWindow(UIPatient(self.ui, entity)) elseif class.is(entity, Staff) then self.ui:addWindow(UIStaff(self.ui, entity)) end self.ui:addWindow(UIConfirmDialog(self.ui, "Sorry, but an error has occurred. There can be many reasons - see the " .. "log window for details. Would you like to attempt a recovery?", --[[persistable:app_attempt_recovery]] function() self.world:gameLog("Recovering from error in timer handler...") entity.ticks = false self.eventHandlers.timer = handler end )) end self.eventHandlers[self.last_dispatch_type] = nil if self.last_dispatch_type ~= "frame" then -- If it wasn't the drawing code which failed, then it would be useful -- to ensure that a draw happens, as with events disconnected, a frame -- might not otherwise be drawn for a while. pcall(self.drawFrame, self) end return self:run() end end local done_no_handler_warning = {} function App:dispatch(evt_type, ...) local handler = self.eventHandlers[evt_type] if handler then self:resetInfiniteLoopChecker() self.last_dispatch_type = evt_type return handler(self, ...) else if not done_no_handler_warning[evt_type] then print("Warning: No event handler for " .. evt_type) done_no_handler_warning[evt_type] = true end return false end end function App:onTick(...) if(not self.moviePlayer.playing) then if self.world then self.world:onTick(...) end self.ui:onTick(...) end return true -- tick events always result in a repaint end local fps_history = {} -- Used to average FPS over the last thirty frames for i = 1, 30 do fps_history[i] = 0 end local fps_sum = 0 -- Sum of fps_history array local fps_next = 1 -- Used to loop through fps_history when [over]writing function App:drawFrame() self.video:startFrame() if(self.moviePlayer.playing) then self.key_modifiers = {} self.moviePlayer:refresh() else self.key_modifiers = SDL.getKeyModifiers() self.ui:draw(self.video) end self.video:endFrame() if self.config.track_fps then fps_sum = fps_sum - fps_history[fps_next] fps_history[fps_next] = SDL.getFPS() fps_sum = fps_sum + fps_history[fps_next] fps_next = (fps_next % #fps_history) + 1 end end function App:getFPS() if self.config.track_fps then return fps_sum / #fps_history end end function App:onKeyDown(...) return self.ui:onKeyDown(...) end function App:onKeyUp(...) return self.ui:onKeyUp(...) end function App:onEditingText(...) return self.ui:onEditingText(...) end function App:onTextInput(...) return self.ui:onTextInput(...) end function App:onMouseUp(...) return self.ui:onMouseUp(...) end function App:onMouseDown(...) return self.ui:onMouseDown(...) end function App:onMouseMove(...) return self.ui:onMouseMove(...) end function App:onMouseWheel(...) return self.ui:onMouseWheel(...) end function App:onWindowActive(...) return self.ui:onWindowActive(...) end --! Window has been resized by the user --! Call the UI to handle the new window size function App:onWindowResize(...) return self.ui:onWindowResize(...) end function App:onMusicOver(...) return self.audio:onMusicOver(...) end function App:onMovieOver(...) self.moviePlayer:onMovieOver(...) end function App:onSoundOver(...) return self.audio:onSoundPlayed(...) end function App:onMultiGesture(...) return self.ui:onMultiGesture(...) end function App:checkInstallFolder() self.fs = FileSystem() local status, _ if self.config.theme_hospital_install then status, _ = self.fs:setRoot(self.config.theme_hospital_install) end local message = "Please make sure that you point the game to" .. " a valid copy of the data files from the original game," .. " as said files are required for graphics and sounds." if not status then -- If the given directory didn't exist, then likely the config file hasn't -- been changed at all from the default, so we continue to initialise the -- app, and give the user a dialog asking for the correct directory. return false end -- Check that a few core files are present local missing = {} local function check(path) if not self.fs:readContents(path) then missing[#missing + 1] = path end end check("Data" .. pathsep .. "VBlk-0.tab") check("Levels" .. pathsep .. "Level.L1") check("QData" .. pathsep .. "SPointer.dat") if #missing ~= 0 then missing = table.concat(missing, ", ") message = "Invalid Theme Hospital folder specified in config file, " .. "as at least the following files are missing: " .. missing .. ".\n" .. message print(message) print("Trying to let the user select a new one.") return false, {message} end -- Check for demo version if self.fs:readContents("DataM", "Demo.dat") then self.using_demo_files = true print("Notice: Using data files from demo version of Theme Hospital.") print("Consider purchasing a full copy of the game to support EA.") end -- Do a few more checks to make sure that commonly corrupted files are OK. local corrupt = {} local function check_corrupt(path, correct_size) local real_path = self.fs:getFilePath(path) -- If the file exists but is smaller than usual it is probably corrupt if real_path then local real_size = lfs.attributes(real_path, "size") if real_size + 1024 < correct_size or real_size - 1024 > correct_size then corrupt[#corrupt + 1] = path .. " (Size: " .. math.floor(real_size/1024) .. " kB / Correct: about " .. math.floor(correct_size/1024) .. " kB)" end else corrupt[#corrupt + 1] = path .. " (This file is missing)" end end if self.using_demo_files then check_corrupt("ANIMS" .. pathsep .. "WINLEVEL.SMK", 243188) check_corrupt("LEVELS" .. pathsep .. "LEVEL.L1", 163948) check_corrupt("DATA" .. pathsep .. "BUTTON01.DAT", 252811) else check_corrupt("ANIMS" .. pathsep .. "AREA01V.SMK", 251572) check_corrupt("ANIMS" .. pathsep .. "WINGAME.SMK", 2066656) check_corrupt("ANIMS" .. pathsep .. "WINLEVEL.SMK", 335220) check_corrupt("INTRO" .. pathsep .. "INTRO.SM4", 33616520) check_corrupt("QDATA" .. pathsep .. "FONT00V.DAT", 1024) check_corrupt("ANIMS" .. pathsep .. "LOSE1.SMK", 1009728) end if #corrupt ~= 0 then table.insert(corrupt, 1, "There appears to be corrupt files in your Theme Hospital folder, " .. "so don't be surprised if CorsixTH crashes. At least the following files are wrong:") table.insert(corrupt, message) end return true, #corrupt ~= 0 and corrupt or nil end --! Get the directory containing the bitmap files. --!return Name of the directory containing the bitmap files, ending with a -- directory path separator. function App:getBitmapDir() return (self.command_line["bitmap-dir"] or "Bitmap") .. pathsep end -- Load bitmap data into memory. --!param filename Name of the file to load. --!return The loaded data. function App:readBitmapDataFile(filename) filename = self:getBitmapDir() .. filename local file = assert(io.open(filename, "rb")) local data = file:read("*a") file:close() if data:sub(1, 3) == "RNC" then data = assert(rnc.decompress(data)) end return data end -- Read a data file of the application into memory (possibly with decompression). --!param dir (string) Directory to read from. "Bitmap" and "Levels" are -- meta-directories, and get resolved to real directories in the function. --!param filename (string or nil) If specified, the file to load. If 'nil', the -- 'dir' parameter is the filename in the "Data" directory. function App:readDataFile(dir, filename) if dir == "Bitmap" then return self:readBitmapDataFile(filename) elseif dir == "Levels" then return self:readMapDataFile(filename) end if filename == nil then dir, filename = "Data", dir end local data = assert(self.fs:readContents(dir .. pathsep .. filename)) if data:sub(1, 3) == "RNC" then data = assert(rnc.decompress(data)) end return data end --! Get a level file. --!param filename (string) Name of the level file. --!return If the file could be found, the data of the file, else a -- tuple 'nil', and an error description function App:readMapDataFile(filename) -- First look in the original install directory, if not found there -- look in the CorsixTH directories "Levels" and "Campaigns". local data = self.fs:readContents("Levels" .. pathsep .. filename) if not data then local absolute_path = self:getAbsolutePathToLevelFile(filename) if absolute_path then local file = io.open(absolute_path, "rb") if file then data = file:read("*a") file:close() end end end if data then if data:sub(1, 3) == "RNC" then data = assert(rnc.decompress(data)) end else -- Could not find the file return nil, _S.errors.map_file_missing:format(filename) end return data end function App:loadLuaFolder(dir, no_results, append_to) local ourpath = debug.getinfo(1, "S").source:sub(2, -8) dir = dir .. pathsep local path = ourpath .. dir local results = no_results and "" or (append_to or {}) for file in lfs.dir(path) do if file:match("%.lua$") then local status, result = pcall(corsixth.require, dir .. file:sub(1, -5)) if not status then print("Error loading " .. dir .. file .. ":\n" .. tostring(result)) else if result == nil then if not no_results then print("Warning: " .. dir .. file .. " returned no value") end else if no_results then print("Warning: " .. dir .. file .. " returned a value:", result) else if type(result) == "table" and result.id then results[result.id] = result elseif type(result) == "function" then results[file:match("(.*)%.")] = result end results[#results + 1] = result end end end end end if no_results then return else return results end end --! Returns the version number (name) of the local copy of the game based on --! which save game version it is. This was added after the Beta 8 --! release, which is why the checks prior to that version aren't made. --!param version An optional value if you want to find what game version -- a specific savegame verion is from. function App:getVersion(version) local ver = version or self.savegame_version if ver > 134 then return "Trunk" elseif ver > 127 then return "v0.63" elseif ver > 122 then return "v0.62" elseif ver > 111 then return "v0.61" elseif ver > 105 then return "v0.60" elseif ver > 91 then return "0.50" elseif ver > 78 then return "0.40" elseif ver > 72 then return "0.30" elseif ver > 66 then return "0.21" elseif ver > 54 then return "0.20" elseif ver > 53 then return "0.11" elseif ver > 51 then return "0.10" elseif ver > 45 then return "0.01" else return "Beta 8 or earlier" end end function App:save(filename) return SaveGameFile(filename) end -- Omit the usual file extension so this file cannot be seen from the normal load and save screen and cannot be overwritten function App:quickSave() local filename = "quicksave" return SaveGameFile(self.savegame_dir .. filename) end function App:load(filepath) if self.world then self:worldExited() end return LoadGameFile(filepath) end function App:quickLoad() local filename = "quicksave" if lfs.attributes(self.savegame_dir .. filename) then self:load(filename) else self:quickSave() self.ui:addWindow(UIInformation(self.ui, {_S.errors.load_quick_save})) end end --! Restarts the current level (offers confirmation window first) function App:restart() assert(self.map, "Trying to restart while no map is loaded.") self.ui:addWindow(UIConfirmDialog(self.ui, _S.confirmation.restart_level, --[[persistable:app_confirm_restart]] function() self:worldExited() local level = self.map.level_number local difficulty = self.map.difficulty local name, file, intro if not tonumber(level) then name = self.map.level_name file = self.map.map_file intro = self.map.level_intro end if level and name and not file then self.ui:addWindow(UIInformation(self.ui, {_S.information.cannot_restart})) return end local status, err = pcall(self.loadLevel, self, level, difficulty, name, file, intro) if not status then err = "Error while loading level: " .. err print(err) self.ui:addWindow(UIInformation(self.ui, {err})) end end)) end --! Begin the map editor function App:mapEdit() self:loadLevel("", nil, nil, nil, nil, true) end --! Exits the game completely (no confirmation window) function App:exit() -- Save config before exiting self:saveConfig() self.running = false end --! Exits the game completly without saving the config i.e. Alt+F4 for Quit Application function App:abandon() self.running = false end --! This function is automatically called after loading a game and serves for compatibility. function App:afterLoad() self.ui:addOrRemoveDebugModeKeyHandlers() local old = self.world.savegame_version or 0 local new = self.savegame_version if old == 0 then -- Game log was not present before introduction of savegame versions, so create it now. self.world.game_log = {} self.world:gameLog("Created Gamelog on load of old (pre-versioning) savegame.") end if not self.world.original_savegame_version then self.world.original_savegame_version = old end local first = self.world.original_savegame_version if new == old then self.world:gameLog("Savegame version is " .. new .. " (" .. self:getVersion() .. "), originally it was " .. first .. " (" .. self:getVersion(first) .. ")") self.world:playLoadedEntitySounds() elseif new > old then self.world:gameLog("Savegame version changed from " .. old .. " (" .. self:getVersion(old) .. ") to " .. new .. " (" .. self:getVersion() .. "). The save was created using " .. first .. " (" .. self:getVersion(first) .. ")") else -- TODO: This should maybe be forbidden completely. self.world:gameLog("Warning: loaded savegame version " .. old .. " (" .. self:getVersion(old) .. ")" .. " in older version " .. new .. " (" .. self:getVersion() .. ").") end self.world.savegame_version = new if old < 87 then local new_object = corsixth.require("objects.gates_to_hell") Object.processTypeDefinition(new_object) self.objects[new_object.id] = new_object self.world:newObjectType(new_object) end if old < 114 then local rathole_type = corsixth.require("objects.rathole") Object.processTypeDefinition(rathole_type) self.objects[rathole_type.id] = rathole_type self.world:newObjectType(rathole_type) end self.map:afterLoad(old, new) self.ui:afterLoad(old, new) self.world:afterLoad(old, new) end function App:checkForUpdates() -- Only check for updates once per application launch if not self.check_for_updates or not self.config.check_for_updates then return end self.check_for_updates = false -- Default language to use for the changelog if no localised version is available local default_language = "en" local update_url = 'http://www.corsixth.com/check-for-updates' local current_version = self:getVersion() -- Only URLs that match this list of trusted domains will be accepted. local trusted_domains = { 'corsixth.com', 'code.google.com' } -- Only check for updates against released versions if current_version == "Trunk" then print("Will not check for updates since this is the Trunk version.") return end local success, _ = pcall(require, "socket") if not success then -- LuaSocket is not available, just return print("Cannot check for updates since LuaSocket is not available.") return else self.lua_socket_available = true end local http = require("socket.http") local url = require("socket.url") print("Checking for CorsixTH updates...") local update_body, status, _ = http.request(update_url) if not update_body or not (status == 200) then print("Couldn't check for updates. Server returned code: " .. status) print("Check that you have an active internet connection and that CorsixTH is allowed in your firewall.") return end local update_table = loadstring_envcall(update_body, "@updatechecker"){} local changelog = update_table["changelog_" .. default_language] local new_version = update_table["major"] .. '.' .. update_table["minor"] .. update_table["revision"] if (new_version <= current_version) then print("You are running the latest version of CorsixTH.") return end -- Check to make sure download URL is trusted local download_url = url.parse(update_table["download_url"]) local valid_url = false for _,v in ipairs(trusted_domains) do if download_url.host == v then valid_url = true break end end if not valid_url then print("Update download url is not on the trusted domains list (" .. update_table["download_url"] .. ")") return end -- Check to see if there's a changelog in the user's language local current_langs = self.strings:getLanguageNames(self.config.language) for _, v in ipairs(current_langs) do if (update_table["changelog_" .. v]) then changelog = update_table["changelog_" .. v] break end end print("New version found: " .. new_version) -- Display the update window self.ui:addWindow(UIUpdate(self.ui, current_version, new_version, changelog, update_table["download_url"])) end -- Free up / stop any resources relying on the current video object function App:prepareVideoUpdate() self.video:endFrame() self.moviePlayer:deallocatePictureBuffer() end -- Update / start any resources relying on a video object function App:finishVideoUpdate() self.gfx:updateTarget(self.video) self.moviePlayer:updateRenderer() self.moviePlayer:allocatePictureBuffer() self.video:startFrame() end -- Do not remove, for savegame compatibility < r1891 local app_confirm_quit_stub = --[[persistable:app_confirm_quit]] function() end CorsixTH-0.63/CorsixTH/Lua/audio.lua000066400000000000000000000542441347163623700172220ustar00rootroot00000000000000--[[ Copyright (c) 2009 Peter "Corsix" Cawley 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. --]] local pathsep = package.config:sub(1, 1) local rnc = require("rnc") local lfs = require("lfs") local SDL = require("sdl") local TH = require("TH") local ipairs = ipairs --! Layer which handles the Lua-facing side of loading and playing audio. class "Audio" ---@type Audio local Audio = _G["Audio"] function Audio:Audio(app) self.app = app self.has_bg_music = false self.not_loaded = not app.config.audio self.unused_played_callback_id = 0 self.played_sound_callbacks = {} self.entities_waiting_for_sound_to_be_enabled = {} end function Audio:clearCallbacks() self.unused_played_callback_id = 0 self.played_sound_callbacks = {} self.entities_waiting_for_sound_to_be_enabled = {} end local function GetFileData(path) local f, e = io.open(path, "rb") if not f then return f, e end e = f:read"*a" f:close() return e end function Audio:init() self.background_playlist = { -- {title = "", filename = "", enabled = true, music = nil}, } if self.not_loaded then return end if not SDL.audio.loaded then print("Notice: Audio system not loaded as CorsixTH compiled without it") self.not_loaded = true return end local music = self.app.config.audio_music or self.app.config.audio_mp3 local music_dir if music then music_dir = music if music_dir:sub(-1) ~= pathsep then music_dir = music_dir .. pathsep end end local music_array = {} local function musicFileTable(filename) filename = filename:upper() local t = music_array[filename] if t == nil then t = {} music_array[filename] = t end return t end --[[ Find the music files on disk. ----------------------------- - Will search through all the files in music_dir. - Adds most files supported by SDL2_mixer (regardless of local library's ability) - Prefers waveform audio (eg mp3) over instructional (eg midi) - Uses titles from MIDI.TXT if found, else the filename. --]] local midi_txt -- File name of midi.txt file, if any. local waveform = { MP3=true, OGG=true, WAV=true, AIFF=true, VOC=true, FLAC=true } local instructional = { MID=true, MOD=true, XM=true, XMI=true } local _f, _s, _v if music_dir then _f, _s, _v = lfs.dir(music_dir) else _f, _s, _v = pairs(self.app.fs:listFiles("Sound", "Midi") or {}) end for file in _f, _s, _v do local info local filename, ext = file:match"^(.+)%.([^.]+)$" ext = ext and ext:upper() if waveform[ext] or instructional[ext] then info = musicFileTable(filename) -- This title might be replaced later by the midi_txt. info.title = filename end if instructional[ext] and not music_dir then info.filename = table.concat({"Sound", "Midi", file}, pathsep) -- User supplied music file found elseif waveform[ext] then info.filename_music = music_dir .. file -- Waveform can overwrite instructional, but not vice versa elseif instructional[ext] and not info.filename_music then info.filename_music = music_dir .. file elseif ext == "TXT" and (file:sub(1, 4):upper() == "MIDI" or file:sub(1, 5):upper() == "NAMES") then -- If it Looks like the midi.txt or equiv, then remember it for later. midi_txt = file end end -- Enable music files and add them to the playlist. for _, info in pairs(music_array) do info.enabled = true self.background_playlist[#self.background_playlist + 1] = info end -- This is later. If we found a midi.txt, go through it and add the titles to the files we know if midi_txt then local data if music_dir then data = assert(GetFileData(music_dir .. midi_txt)) else data = assert(self.app.fs:readContents("Sound", "Midi", midi_txt)) end for file, title in data:gmatch"([^\r\n\26]+).-([^\r\n\26]+)" do local info = musicFileTable(file:match"^(.*)%." or file) if next(info) ~= nil then info.title = title else print('Notice: Background track "'.. file ..'" named in list file, '.. 'but it does not exist.') end end end if #self.background_playlist == 0 and self.app.good_install_folder then print("Notice: Audio system loaded, but found no background tracks") self.has_bg_music = false else self.has_bg_music = true end local status, err = SDL.audio.init(self.app.config.audio_frequency, self.app.config.audio_channels, self.app.config.audio_buffer_size) if status then -- NB: Playback will not start if play_music is set to false self:playRandomBackgroundTrack() else print("Notice: Audio system could not initialise (SDL error: " .. tostring(err) .. ")") self.not_loaded = true self.has_bg_music = false self.background_playlist = {} return end end function Audio:initSpeech(speech_file) self.sound_archive = nil self.sound_fx = nil if self.not_loaded then return end local function load_sound_file(file) return self.app.fs:readContents("Sound", "Data", file) end speech_file = speech_file or "Sound-0.dat" if self.speech_file_name == speech_file then return end local archive_data, err = load_sound_file(speech_file) -- If sound file not found and language chosen is not English, -- maybe we can have more chance loading English sounds if not archive_data and speech_file ~= "Sound-0.dat" and self.app.good_install_folder then if self.speech_file_name == "Sound-0.dat" then return end print("Notice: Attempt to load English sounds as no SOUND/DATA/" .. speech_file .. " file found") speech_file = "Sound-0.dat" archive_data = load_sound_file(speech_file) end if not archive_data then if self.app.good_install_folder then print("Notice: No sound effects as no SOUND/DATA/".. speech_file .. " file could be found / opened.") print("The reported error was: ".. err) end else if archive_data:sub(1, 3) == "RNC" then archive_data = assert(rnc.decompress(archive_data)) end self.sound_archive = TH.soundArchive() if not self.sound_archive:load(archive_data) then print("Notice: No sound effects as SOUND/DATA/" .. speech_file .. " could not be loaded") if #self.background_playlist == 0 then self.not_loaded = true end else self.speech_file_name = speech_file self.sound_fx = TH.soundEffects() self.sound_fx:setSoundArchive(self.sound_archive) local w, h = self.app.config.width / 2, self.app.config.height / 2 self.sound_fx:setCamera(math.floor(w), math.floor(h), math.floor((w^2 + h^2)^0.5)) --self:dumpSoundArchive[[E:\CPP\2K8\CorsixTH\DataRaw\Sound\]] end end end function Audio:dumpSoundArchive(out_dir) local info,warning = io.open(out_dir .. "info.csv", "w") if info == nil then print("Error: Audio dump failed because info.csv couldn't be created and/or opened in the dump directory:" .. out_dir) print(warning) return end for i = 1, #self.sound_archive - 1 do local filename = self.sound_archive:getFilename(i) info:write(i, ",", filename, ",", self.sound_archive:getDuration(i), ",\n") local file = io.open(out_dir .. i .. "_" .. filename, "wb") file:write(self.sound_archive:getFileData(i)) file:close() print("".. i .. "/" .. #self.sound_archive - 1) end info:close() print("Sounds dumped to: " .. out_dir) end local wilcard_cache = permanent "audio_wildcard_cache" {} function Audio:playSound(name, where, is_announcement, played_callback, played_callback_delay) local sound_fx = self.sound_fx if sound_fx then if name:find("*") then -- Resolve wildcard to one particular sound local list = self:cacheSoundFilenamesAssociatedWithName(name) name = list[1] and list[math.random(1, #list)] or name end local _, warning local volume = is_announcement and self.app.config.announcement_volume or self.app.config.sound_volume local x, y local played_callbacks_id if played_callback then played_callbacks_id = self.unused_played_callback_id self.unused_played_callback_id = self.unused_played_callback_id + 1 self.played_sound_callbacks[tostring(played_callbacks_id)] = played_callback end if where then x, y = Map:WorldToScreen(where.tile_x, where.tile_y) local dx, dy = where.th:getPosition() local ui = self.app.ui x = x + dx - ui.screen_offset_x y = y + dy - ui.screen_offset_y end _, warning = sound_fx:play(name, volume, x, y, played_callbacks_id, played_callback_delay) if warning then -- Indicates something happened self.app.world:gameLog("Audio:playSound - Warning: " .. warning) end end end function Audio:cacheSoundFilenamesAssociatedWithName(name) local list = wilcard_cache[name] if not list then local filename list = {} wilcard_cache[name] = list local pattern = ("^" .. name:gsub("%*",".*") .. "$"):upper() for i = 1, #self.sound_archive - 1 do filename = self.sound_archive:getFilename(i):upper() if filename:find(pattern) then list[#list + 1] = filename end end end return list end --[[ This function's integer array parameters for the min and max silence lengths should provide lengths for this game's different speeds, indexed as follows: [1] Slowest [2] Slow [3] Normal [4] Fast [5] Maximum !param min_silence_lengths (integer array) The desired minimum silence lengths for this game's different speeds. !param max_silence_lengths (integer array) The desired maximum silence lengths for this game's different speeds. !param num_silences (integer) How many silence lengths should be in the returned table of generated lengths. !return (table) A table of randomly ordered integers for the generated silence lengths. --]] local function getSilenceLengths(min_silence_lengths, max_silence_lengths, num_silences) local min_silence = min_silence_lengths[TheApp.world.tick_rate] local max_silence = max_silence_lengths[TheApp.world.tick_rate] local silences = {} if min_silence == max_silence then silences[1] = min_silence else for i = 1, num_silences do silences[i] = math.random(min_silence, max_silence) end end return silences end --[[ Plays related sounds at an entity in a random sequence, with random length silences between the sounds. This function's integer array parameters for the min and max silence lengths should provide lengths for this game's different speeds, indexed as follows: [1] Slowest [2] Slow [3] Normal [4] Fast [5] Maximum Speed !param names (string) A name pattern for the sequence of related sounds to be played for example: LAVA00*.wav !param entity : Where the sounds will be played at, the player won't hear the sounds being played at the entity when it isn't in their view. !param min_silence_lengths (integer array) The desired minimum silence lengths for this game's different speeds. !param max_silence_lengths (integer array) The desired maximum silence lengths for this game's different speeds. !param num_silences (integer) How many different silence lengths should be used, this can be a nil parameter. --]] function Audio:playEntitySounds(names, entity, min_silence_lengths, max_silence_lengths, num_silences) if self.sound_fx then self:cacheSoundFilenamesAssociatedWithName(names) local silences = getSilenceLengths(min_silence_lengths, max_silence_lengths, num_silences) self:entitySoundsHandler(wilcard_cache[names], entity, silences, 1) end end local function canSoundsBePlayed() return TheApp.config.play_sounds and not TheApp.world:isPaused() end --[[ Called by the above function. This function's integer array parameters for the min and max silence lengths should provide lengths for this game's different speeds, indexed as follows: [1] Slowest [2] Slow [3] Normal [4] Fast [5] Maximum Speed !param sounds (string) A name pattern for the sequence of related sounds to be played for example: LAVA00*.wav !param entity : Where the sounds will be played at, the player won't hear the sounds being played at the entity when it isn't in their view. !param silences (integer array) the different pause durations to be used between the played sounds. !param silences_pointer (integer) the index for the pause duration which should be used after this call's sound has been played. --]] function Audio:entitySoundsHandler(sounds, entity, silences, silences_pointer) if entity.playing_sounds_in_random_sequence then local sound_played_callback = function() self:entitySoundsHandler(sounds, entity, silences, silences_pointer) end if canSoundsBePlayed() then local x, y = Map:WorldToScreen(entity.tile_x, entity.tile_y) local dx, dy = entity.th:getPosition() x = x + dx - self.app.ui.screen_offset_x y = y + dy - self.app.ui.screen_offset_y self.played_sound_callbacks[tostring(self.unused_played_callback_id)] = sound_played_callback self.sound_fx:play(sounds[math.random(1,#sounds)], self.app.config.sound_volume, x, y, self.unused_played_callback_id, silences_pointer) self.unused_played_callback_id = self.unused_played_callback_id + 1 if #silences > 1 then silences_pointer = (silences_pointer % #silences) + 1 end --If the sound can't be played now: else self.entities_waiting_for_sound_to_be_enabled[entity] = sound_played_callback entity:setWaitingForSoundEffectsToBeTurnedOn(true) end else if self.entities_waiting_for_sound_to_be_enabled[entity] then self.entities_waiting_for_sound_to_be_enabled[entity] = nil end end end function Audio:onEndPause() if TheApp.config.play_sounds then self:tellInterestedEntitiesTheyCanNowPlaySounds() end end function Audio:onSoundPlayed(played_callbacks_id) if TheApp.world ~= nil then if self.played_sound_callbacks[tostring(played_callbacks_id)] then self.played_sound_callbacks[tostring(played_callbacks_id)]() self.played_sound_callbacks[tostring(played_callbacks_id)] = nil end end end --! Returns whether the given sound (either a string or a number) --! exists in the sound archive --!param sound The sound to look for, either a string (name) or a -- number (position in the list of sounds) function Audio:soundExists(sound) if self.sound_archive then return self.sound_archive:soundExists(sound) else return false end end function Audio:playRandomBackgroundTrack() if self.not_loaded or #self.background_playlist == 0 then return end local enabled = {} for i, info in ipairs(self.background_playlist) do if info.enabled then enabled[#enabled + 1] = i end end if not enabled[1] then return end local index = enabled[math.random(1, #enabled)] self:playBackgroundTrack(index) end function Audio:findIndexOfCurrentTrack() for i, info in ipairs(self.background_playlist) do if info.music == self.background_music then return i end end return 1 end function Audio:playNextOrPreviousBackgroundTrack(direction) if self.not_loaded or #self.background_playlist == 0 then return end if not self.background_music then self:playRandomBackgroundTrack() return end local index = self:findIndexOfCurrentTrack() -- Find next/previous track for i = 1, #self.background_playlist do i = ((index + direction * i - 1) % #self.background_playlist) + 1 if self.background_playlist[i].enabled then self:playBackgroundTrack(i) return end end end function Audio:playNextBackgroundTrack() self:playNextOrPreviousBackgroundTrack(1) end function Audio:playPreviousBackgroundTrack() self:playNextOrPreviousBackgroundTrack(-1) end --! Pauses or unpauses background music depending on the current state. --! Returns whether music is currently paused or not after the call. --! If nil is returned music might either be playing or completely stopped. function Audio:pauseBackgroundTrack() assert(self.background_music, "Trying to pause music while music is stopped") -- TODO: There is a bug in SDL for Windows that makes all sound, not just music stop -- when pausing. For the time being, stop the music instead to prevent this. self:stopBackgroundTrack() return false ------------------------------------------------- -- Real pause logic ------------------------------------------------- --[[local status if self.background_paused then self.background_paused = nil status = SDL.audio.resumeMusic() else status = SDL.audio.pauseMusic() self.background_paused = true end -- NB: Explicit false check, as old C side returned nil in all cases if status == false then -- SDL doesn't seem to support pausing/resuming for this format/driver, -- so just stop the music instead. self:stopBackgroundTrack() self.background_paused = nil else -- SDL can also be odd and report music as paused even though it is still -- playing. If it really is paused, then there is no harm in muting it. -- If it wasn't really paused, then muting it is the next best thing that -- we can do (even though it'll continue playing). if self.background_paused then self.old_bg_music_volume = self.app.config.music_volume SDL.audio.setMusicVolume(0) else self.app.config.music_volume = self.old_bg_music_volume SDL.audio.setMusicVolume(self.old_bg_music_volume) self.old_bg_music_volume = nil end end self:notifyJukebox() return self.background_paused--]] end --! Stops playing background music for the time being. --! Does not affect the configuration setting play_music. function Audio:stopBackgroundTrack() if self.background_paused then -- unpause first in order to clear the backupped volume self:pauseBackgroundTrack() end SDL.audio.stopMusic() self.background_music = nil self:notifyJukebox() end --! Plays a given background track. --! Playback will only start if the configuration says it's ok. (play_music = true) --!param index Index of the track to play in the playlist. function Audio:playBackgroundTrack(index) local info = self.background_playlist[index] assert(info, "Index not valid") if self.app.config.play_music then local music = info.music if not music then local data if info.filename_music then data = assert(GetFileData(info.filename_music)) else data = assert(self.app.fs:readContents(info.filename)) end if data:sub(1, 3) == "RNC" then data = assert(rnc.decompress(data)) end if not info.filename_music then data = SDL.audio.transcodeXmiToMid(data) end -- Loading of music files can incur a slight pause, which is why it is -- done asynchronously. -- Someone might want to stop the player from -- starting to play once it's loaded though. self.load_music = true SDL.audio.loadMusicAsync(data, function(music_data, e) if music_data == nil then error("Could not load music file \'" .. (info.filename_music or info.filename) .. "\'" .. (e and (" (" .. e .. ")" or ""))) else info.music = music_data -- Do we still want it to play? if self.load_music then return self:playBackgroundTrack(index) end end end) return end SDL.audio.setMusicVolume(self.app.config.music_volume) assert(SDL.audio.playMusic(music)) self.background_music = music self:notifyJukebox() end end function Audio:onMusicOver() if self.not_loaded or #self.background_playlist == 0 or self.background_music == nil then return end self:playNextBackgroundTrack() end function Audio:setBackgroundVolume(volume) if self.background_paused then self.old_bg_music_volume = volume else self.app.config.music_volume = volume SDL.audio.setMusicVolume(volume) end end function Audio:setSoundVolume(volume) self.app.config.sound_volume = volume if self.sound_fx then -- Since some sounds are played automatically (using computers etc) -- we need to set a value on C level too. self.sound_fx:setSoundVolume(volume) end end function Audio:playSoundEffects(play_effects) self.app.config.play_sounds = play_effects if self.sound_fx then -- As above. self.sound_fx:setSoundEffectsOn(play_effects) end if canSoundsBePlayed() then self:tellInterestedEntitiesTheyCanNowPlaySounds() end end function Audio:tellInterestedEntitiesTheyCanNowPlaySounds() if table_length(self.entities_waiting_for_sound_to_be_enabled) > 0 then for entity, callback in pairs(self.entities_waiting_for_sound_to_be_enabled) do callback() self.entities_waiting_for_sound_to_be_enabled[entity] = nil end end end function Audio:entityNoLongerWaitingForSoundsToBeTurnedOn(entity) self.entities_waiting_for_sound_to_be_enabled[entity] = nil end function Audio:setAnnouncementVolume(volume) self.app.config.announcement_volume = volume end -- search for jukebox and notify it to update its play button function Audio:notifyJukebox() local jukebox = self.app.ui:getWindow(UIJukebox) if jukebox then jukebox:updatePlayButton() end end function Audio:reserveChannel() if self.sound_fx then return self.sound_fx:reserveChannel() else return -1 end end function Audio:releaseChannel(channel) if self.sound_fx and channel > -1 then self.sound_fx:releaseChannel(channel) end end CorsixTH-0.63/CorsixTH/Lua/base_config.lua000066400000000000000000000671071347163623700203620ustar00rootroot00000000000000--[[ Copyright (c) 2010 Edvin "Lego3" Linge 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. --]] -- To keep in line with the original, tables start their indexing at 0. -- NOTE: This makes index iterations over tables omit the first element! local configuration = { ----------------------------------------------------------- -- New configuration values added in CorsixTH -- ----------------------------------------------------------- town = { InterestRate = 0.01, StartCash = 40000, }, -- New value, but should only be defined if starting staff is included. --start_staff = { -- {Doctor = 0, Shrink = 0, Skill = 0}, --}, ----------------------------------------------------------- -- Original configuration values -- ----------------------------------------------------------- staff = { [0] = {MinSalary = 60}, -- Nurse {MinSalary = 75}, -- Doctor {MinSalary = 25}, -- Handyman {MinSalary = 20}, -- Receptionist }, gbv = { SalaryAdd = { {}, {}, -30, -- Junior 30, -- Doctor 40, -- Surgeon 30, -- Psychiatrist 100, -- Consultant 20, -- Research }, -- Divides ability to find an extra salary addition. must be > 0 SalaryAbilityDivisor = 10, -- Divides research input to arrive at research points. must be > 0 ResearchPointsDivisor = 5, -- When a drug is researched what rating does it have StartRating = 100, -- When a drug is researched how much does it cost StartCost = 100, -- Minimum Drug Cost MinDrugCost = 50, -- If contagious how much - rand up to this figure. higher = more contagious. must be > 0 HowContagious = 25, -- 0-100 Higher equals more chance of spreading. ContagiousSpreadFactor = 25, -- Reduce cont illnesses until X months have passed ReduceContMonths = 14, -- Reduce cont illnesses until X peep have arrived ReduceContPeepCount = 20, -- Rate to reduce cont illneses to - 0 means do not produce contagious illnesses at all ReduceContRate = 0, -- Hold all visual illnesses until x months. 0 never hold HoldVisualMonths = 2, -- Hold all visual illnesses until x peeps have arrived. 0 never hold HoldVisualPeepCount = 6, -- Maximum strength value an object can be improved to (by research) MaxObjectStrength = 20, -- Increase object strength by this amount when researching ResearchIncrement = 2, -- x Start Score for level = ceiling for normal score increases (2 dp) ScoreMaxInc = 300, -- Cost per vaccination VacCost = 50, -- If epidemic coverup fails - how much per person you are fined max 20000 EpidemicFine = 2000, -- If an epidemic coverup succeeds how much compensation is received - lo value EpidemicCompLo = 1000, -- If an epidemic coverup succeeds how much compensation is received - hi value max 20000 EpidemicCompHi = 15000, -- How many patients still infected cause a reputation loss as well as a fine if less than EpidemicEvacMinimum then ignored EpidemicRepLossMinimum = 5, -- How many patients still infected and not-cured cause the hospital to be evacuated EpidemicEvacMinimum = 10, --How many epidemics can exists at the same time - both active and quietly in the background EpidemicConcurrentLimit = 1, -- % of research completed for an autopsy AutopsyRschPercent = 33, -- % rep hit for discovered autopsy AutopsyRepHitPercent = 25, -- Frequency of Mayor visits. Lower is more frequent. MayorLaunch = 150, -- Add to student doctor's ability when being taught MIN 1 MAX 255 TrainingRate = 40, -- MIN 1 MAX 100 (Percentage) DrugImproveRate = 5, -- How many months until population allocation is done for real AllocDelay = 3, AbilityThreshold = { [0] = {Value = 75}, -- SURGEON {Value = 60}, -- PSYCHIATRIST {Value = 45}, -- RESEARCHER }, TrainingValue = { [0] = {Value = 10}, -- Projector {Value = 15}, -- Skeleton {Value = 20}, -- Bookcase }, -- >This value gives doctor DoctorThreshold = 250, -- >This value gives consultant ConsultantThreshold = 750, -- % of original rsch cost required to improve RschImproveCostPercent = 10, -- %-point increase in improve cost per improvement RschImproveIncrementPercent = 10, }, towns = { {StartCash = 40000, InterestRate = 100}, -- Level 1 {StartCash = 40000, InterestRate = 200}, -- Level 2 {StartCash = 50000, InterestRate = 300}, -- Level 3 {StartCash = 50000, InterestRate = 400}, -- Level 4 {StartCash = 50000, InterestRate = 500}, -- Level 5 {StartCash = 50000, InterestRate = 600}, -- Level 6 {StartCash = 50000, InterestRate = 700}, -- Level 7 {StartCash = 60000, InterestRate = 700}, -- Level 8 {StartCash = 60000, InterestRate = 800}, -- Level 9 {StartCash = 60000, InterestRate = 800}, -- Level 10 {StartCash = 70000, InterestRate = 900}, -- Level 11 {StartCash = 70000, InterestRate = 900}, -- Level 12 {StartCash = 70000, InterestRate = 900}, -- Level 12 }, popn = { [0] = {Month = 0, Change = 4}, -- Standard: 4 patients the first month. [1] = {Month = 1, Change = 1}, -- Then increase by one per month. }, expertise = { {StartPrice = 100, Known = 1, RschReqd = 0}, -- GENERAL_PRACTICE {StartPrice = 850, Known = 0, RschReqd = 40000, MaxDiagDiff = 700}, -- BLOATY_HEAD {StartPrice = 1150, Known = 0, RschReqd = 40000, MaxDiagDiff = 250}, -- HAIRYITUS {StartPrice = 1600, Known = 0, RschReqd = 60000, MaxDiagDiff = 250}, -- ELVIS {StartPrice = 1400, Known = 0, RschReqd = 60000, MaxDiagDiff = 250}, -- INVIS {StartPrice = 1800, Known = 0, RschReqd = 60000, MaxDiagDiff = 250}, -- RADIATION {StartPrice = 900, Known = 0, RschReqd = 40000, MaxDiagDiff = 250}, -- SLACK_TONGUE {StartPrice = 2000, Known = 0, RschReqd = 60000, MaxDiagDiff = 350}, -- ALIEN {StartPrice = 450, Known = 0, RschReqd = 20000, MaxDiagDiff = 250}, -- BROKEN_BONES {StartPrice = 950, Known = 0, RschReqd = 40000, MaxDiagDiff = 250}, -- BALDNESS {StartPrice = 700, Known = 0, RschReqd = 40000, MaxDiagDiff = 700}, -- DISCRETE_ITCHING {StartPrice = 1000, Known = 0, RschReqd = 40000, MaxDiagDiff = 1000}, -- JELLYITUS {StartPrice = 750, Known = 0, RschReqd = 40000, MaxDiagDiff = 700}, -- SLEEPING_ILLNESS {StartPrice = 0, Known = 0, RschReqd = 5000, MaxDiagDiff = 400}, -- PREGNANT {StartPrice = 800, Known = 0, RschReqd = 40000, MaxDiagDiff = 350}, -- TRANSPARENCY {StartPrice = 300, Known = 0, RschReqd = 20000, MaxDiagDiff = 350}, -- UNCOMMON_COLD {StartPrice = 1300, Known = 0, RschReqd = 60000, MaxDiagDiff = 1000}, -- BROKEN_WIND {StartPrice = 1100, Known = 0, RschReqd = 20000, MaxDiagDiff = 350}, -- SPARE_RIBS {StartPrice = 1050, Known = 0, RschReqd = 20000, MaxDiagDiff = 700}, -- KIDNEY_BEANS {StartPrice = 1900, Known = 0, RschReqd = 20000, MaxDiagDiff = 700}, -- BROKEN_HEART {StartPrice = 1600, Known = 0, RschReqd = 20000, MaxDiagDiff = 700}, -- RUPTURED_NODULES {StartPrice = 800, Known = 0, RschReqd = 40000, MaxDiagDiff = 350}, -- MULTIPLE_TV_PERSONALITIES {StartPrice = 1500, Known = 0, RschReqd = 60000, MaxDiagDiff = 350}, -- INFECTIOUS_LAUGHTER {StartPrice = 800, Known = 0, RschReqd = 40000, MaxDiagDiff = 700}, -- CORRUGATED_ANKLES {StartPrice = 800, Known = 0, RschReqd = 40000, MaxDiagDiff = 700}, -- CHRONIC_NOSEHAIR {StartPrice = 550, Known = 0, RschReqd = 40000, MaxDiagDiff = 700}, -- 3RD_DEGREE_SIDEBURNS {StartPrice = 800, Known = 0, RschReqd = 40000, MaxDiagDiff = 350}, -- FAKE_BLOOD {StartPrice = 650, Known = 0, RschReqd = 40000, MaxDiagDiff = 700}, -- GASTRIC_EJECTIONS {StartPrice = 400, Known = 0, RschReqd = 20000, MaxDiagDiff = 1000}, -- THE_SQUITS {StartPrice = 1700, Known = 0, RschReqd = 20000, MaxDiagDiff = 700}, -- IRON_LUNGS {StartPrice = 600, Known = 0, RschReqd = 40000, MaxDiagDiff = 1000}, -- SWEATY_PALMS {StartPrice = 400, Known = 0, RschReqd = 20000, MaxDiagDiff = 700}, -- HEAPED_PILES {StartPrice = 350, Known = 0, RschReqd = 20000, MaxDiagDiff = 1000}, -- GUT_ROT {StartPrice = 1600, Known = 0, RschReqd = 20000, MaxDiagDiff = 700}, -- GOLF_STONES {StartPrice = 500, Known = 0, RschReqd = 20000, MaxDiagDiff = 700}, -- UNEXPECTED_SWELLING {StartPrice = 300, Known = 0, RschReqd = 40000}, -- I_D_SCANNER {StartPrice = 250, Known = 0, RschReqd = 50000}, -- I_D_BLOOD_MACHINE DIAGNOSIS {StartPrice = 150, Known = 0, RschReqd = 20000}, -- I_D_CARDIO DIAGNOSIS {StartPrice = 200, Known = 0, RschReqd = 30000}, -- I_D_XRAY DIAGNOSIS {StartPrice = 250, Known = 0, RschReqd = 60000}, -- I_D_ULTRASCAN DIAGNOSIS {StartPrice = 150, Known = 0, RschReqd = 20000}, -- I_D_STANDARD DIAGNOSIS {StartPrice = 100, Known = 0, RschReqd = 20000}, -- I_D_WARD DIAGNOSIS {StartPrice = 200, Known = 0, RschReqd = 20000}, -- I_D_SHRINK DIAGNOSIS {StartPrice = 500, Known = 0, RschReqd = 15000}, -- I_X_RESEARCH virtual treatment,auto autopsy {StartPrice = 500, Known = 0, RschReqd = 30000}, -- I_X_MIXER virtual treatment,atom analyser {StartPrice = 500, Known = 0, RschReqd = 30000}, -- I_X_COMPUTER virtual treatment,research computer }, objects = { {StartCost = 100, StartAvail = 1, WhenAvail = 0, StartStrength = 10, AvailableForLevel = 1}, -- 1 Desk {StartCost = 100, StartAvail = 1, WhenAvail = 0, StartStrength = 10, AvailableForLevel = 1}, -- 2 Cabinet {StartCost = 0, StartAvail = 1, WhenAvail = 0, StartStrength = 10, AvailableForLevel = 1}, -- 3 Door {StartCost = 40, StartAvail = 1, WhenAvail = 0, StartStrength = 10, AvailableForLevel = 1}, -- 4 Bench {StartCost = 60, StartAvail = 1, WhenAvail = 0, StartStrength = 10, AvailableForLevel = 1}, -- 5 Table {StartCost = 20, StartAvail = 1, WhenAvail = 0, StartStrength = 10, AvailableForLevel = 1}, -- 6 Chair {StartCost = 500, StartAvail = 1, WhenAvail = 0, StartStrength = 10, AvailableForLevel = 1}, -- 7 Drinks {StartCost = 200, StartAvail = 1, WhenAvail = 0, StartStrength = 10, AvailableForLevel = 1}, -- 8 Bed {StartCost = 2500, StartAvail = 0, WhenAvail = 0, StartStrength = 8, AvailableForLevel = 0}, -- 9 Inflator Machine {StartCost = 150, StartAvail = 1, WhenAvail = 0, StartStrength = 10, AvailableForLevel = 1}, -- 10 Snooker Table {StartCost = 150, StartAvail = 1, WhenAvail = 0, StartStrength = 10, AvailableForLevel = 1}, -- 11 New Receptionists Station {StartCost = 5, StartAvail = 1, WhenAvail = 0, StartStrength = 10, AvailableForLevel = 1}, -- 12 Build Room Tressle Table {StartCost = 1000, StartAvail = 0, WhenAvail = 0, StartStrength = 13, AvailableForLevel = 0}, -- 13 Cardiogram {StartCost = 5000, StartAvail = 0, WhenAvail = 0, StartStrength = 12, AvailableForLevel = 0}, -- 14 Scanner {StartCost = 3000, StartAvail = 1, WhenAvail = 0, StartStrength = 10, AvailableForLevel = 1}, -- 15 Scanner Console {StartCost = 30, StartAvail = 1, WhenAvail = 0, StartStrength = 10, AvailableForLevel = 1}, -- 16 Screen {StartCost = 5000, StartAvail = 0, WhenAvail = 0, StartStrength = 10, AvailableForLevel = 0}, -- 17 Jukebox {StartCost = 100, StartAvail = 1, WhenAvail = 0, StartStrength = 10, AvailableForLevel = 1}, -- 18 Couch {StartCost = 150, StartAvail = 1, WhenAvail = 0, StartStrength = 10, AvailableForLevel = 1}, -- 19 Sofa {StartCost = 250, StartAvail = 1, WhenAvail = 0, StartStrength = 10, AvailableForLevel = 1}, -- 20 Crash Trolley {StartCost = 50, StartAvail = 1, WhenAvail = 0, StartStrength = 10, AvailableForLevel = 1}, -- 21 TV set {StartCost = 6000, StartAvail = 0, WhenAvail = 0, StartStrength = 9, AvailableForLevel = 0}, -- 22 Ultrascan {StartCost = 10000, StartAvail = 0, WhenAvail = 0, StartStrength = 7, AvailableForLevel = 0}, -- 23 DNA Restorer {StartCost = 2000, StartAvail = 0, WhenAvail = 0, StartStrength = 11, AvailableForLevel = 0}, -- 24 Cast Remover {StartCost = 1000, StartAvail = 0, WhenAvail = 0, StartStrength = 8, AvailableForLevel = 0}, -- 25 Hair restorer {StartCost = 1500, StartAvail = 0, WhenAvail = 0, StartStrength = 10, AvailableForLevel = 0}, -- 26 Slicer for slack tongues {StartCost = 4000, StartAvail = 0, WhenAvail = 0, StartStrength = 12, AvailableForLevel = 0}, -- 27 X-Ray {StartCost = 2000, StartAvail = 1, WhenAvail = 0, StartStrength = 10, AvailableForLevel = 1}, -- 28 Radiation Shield {StartCost = 500, StartAvail = 1, WhenAvail = 0, StartStrength = 10, AvailableForLevel = 1}, -- 29 X-Ray Viewer {StartCost = 5000, StartAvail = 0, WhenAvail = 0, StartStrength = 12, AvailableForLevel = 0}, -- 30 Operating Table {StartCost = 2000, StartAvail = 1, WhenAvail = 0, StartStrength = 10, AvailableForLevel = 1}, -- 31 Lamp {StartCost = 30, StartAvail = 1, WhenAvail = 0, StartStrength = 10, AvailableForLevel = 1}, -- 32 Bathroom Sink {StartCost = 50, StartAvail = 1, WhenAvail = 0, StartStrength = 10, AvailableForLevel = 1}, -- 33 Op Sink 1 {StartCost = 50, StartAvail = 1, WhenAvail = 0, StartStrength = 10, AvailableForLevel = 1}, -- 34 Op Sink 2 {StartCost = 200, StartAvail = 1, WhenAvail = 0, StartStrength = 10, AvailableForLevel = 1}, -- 35 Surgeon Screen {StartCost = 50, StartAvail = 1, WhenAvail = 0, StartStrength = 10, AvailableForLevel = 1}, -- 36 Lecture Chair {StartCost = 100, StartAvail = 0, WhenAvail = 0, StartStrength = 10, AvailableForLevel = 0}, -- 37 Projector {StartCost = 200, StartAvail = 1, WhenAvail = 0, StartStrength = 10, AvailableForLevel = 1}, -- 38 Bed Screen Open {StartCost = 1000, StartAvail = 1, WhenAvail = 0, StartStrength = 10, AvailableForLevel = 1}, -- 39 Pharmacy Cabinet {StartCost = 5000, StartAvail = 0, WhenAvail = 0, StartStrength = 10, AvailableForLevel = 0}, -- 40 Research Computer {StartCost = 10000, StartAvail = 0, WhenAvail = 0, StartStrength = 10, AvailableForLevel = 0}, -- 41 Chemical Mixer {StartCost = 3000, StartAvail = 0, WhenAvail = 0, StartStrength = 10, AvailableForLevel = 0}, -- 42 Blood Machine {StartCost = 25, StartAvail = 1, WhenAvail = 0, StartStrength = 10, AvailableForLevel = 1}, -- 43 Fire Extinguisher {StartCost = 20, StartAvail = 1, WhenAvail = 0, StartStrength = 10, AvailableForLevel = 1}, -- 44 Radiator {StartCost = 5, StartAvail = 1, WhenAvail = 0, StartStrength = 10, AvailableForLevel = 1}, -- 45 Plant1 {StartCost = 3500, StartAvail = 0, WhenAvail = 0, StartStrength = 8, AvailableForLevel = 0}, -- 46 Electrolysis Machine {StartCost = 6500, StartAvail = 0, WhenAvail = 0, StartStrength = 7, AvailableForLevel = 0}, -- 47 Jellyitus Moulding Machine {StartCost = 0, StartAvail = 1, WhenAvail = 0, StartStrength = 10, AvailableForLevel = 1}, -- 48 Gates to Hell {StartCost = 200, StartAvail = 1, WhenAvail = 0, StartStrength = 10, AvailableForLevel = 1}, -- 49 Bed Screen Closed {StartCost = 5, StartAvail = 1, WhenAvail = 0, StartStrength = 10, AvailableForLevel = 1}, -- 50 Bin {StartCost = 300, StartAvail = 1, WhenAvail = 0, StartStrength = 10, AvailableForLevel = 1}, -- 51 Toilet {StartCost = 0, StartAvail = 1, WhenAvail = 0, StartStrength = 10, AvailableForLevel = 1}, -- 52 Double Door Part #1 {StartCost = 0, StartAvail = 1, WhenAvail = 0, StartStrength = 10, AvailableForLevel = 1}, -- 53 Double Door Part #2 {StartCost = 6500, StartAvail = 0, WhenAvail = 0, StartStrength = 10, AvailableForLevel = 0}, -- 54 Decontamination Shower {StartCost = 4000, StartAvail = 0, WhenAvail = 0, StartStrength = 10, AvailableForLevel = 0}, -- 55 Autopsy Research Machine {StartCost = 350, StartAvail = 1, WhenAvail = 0, StartStrength = 10, AvailableForLevel = 1}, -- 56 Bookcase {StartCost = 200, StartAvail = 0, WhenAvail = 0, StartStrength = 10, AvailableForLevel = 0}, -- 57 Video Game {StartCost = 0, StartAvail = 1, WhenAvail = 0, StartStrength = 10, AvailableForLevel = 1}, -- 58 Entrance Left Door {StartCost = 0, StartAvail = 1, WhenAvail = 0, StartStrength = 10, AvailableForLevel = 1}, -- 59 Entrance Right Door {StartCost = 450, StartAvail = 1, WhenAvail = 0, StartStrength = 10, AvailableForLevel = 1}, -- 60 Skeleton {StartCost = 100, StartAvail = 1, WhenAvail = 0, StartStrength = 10, AvailableForLevel = 1}, -- 61 Comfy Chair }, -- Cost for the room itself without any objects. -- For some reason it starts at 7, -- but that must be retained in order to work with the original. rooms = { [7] = {Cost = 2280}, -- GP_OFFICE [8] = {Cost = 2270}, -- PSYCHO [9] = {Cost = 1700}, -- WARD [10] = {Cost = 2250}, -- OP_THEATRE [11] = {Cost = 500}, -- PHARMACY [12] = {Cost = 470}, -- CARDIO [13] = {Cost = 3970}, -- SCANNER [14] = {Cost = 2000}, -- ULTRASCAN [15] = {Cost = 3000}, -- BLOOD_MACHINE [16] = {Cost = 2000}, -- XRAY [17] = {Cost = 1500}, -- INFLATOR [18] = {Cost = 7000}, -- ALIEN [19] = {Cost = 500}, -- HAIR_RESTORER [20] = {Cost = 1500}, -- SLACK_TONGUE [21] = {Cost = 500}, -- FRACTURE [22] = {Cost = 1850}, -- TRAINING [23] = {Cost = 500}, -- ELECTRO [24] = {Cost = 4500}, -- JELLY_VAT [25] = {Cost = 1350}, -- STAFF ROOM [26] = {Cost = 5}, -- TV ?? [27] = {Cost = 720}, -- GENERAL_DIAG [28] = {Cost = 800}, -- RESEARCH [29] = {Cost = 1170}, -- TOILETS [30] = {Cost = 5500}, -- DECON_SHOWER }, visuals = { [0] = {Value = 0}, -- I_BLOATY_HEAD {Value = 0}, -- I_HAIRYITUS {Value = 0}, -- I_ELVIS {Value = 0}, -- I_INVIS {Value = 0}, -- I_RADIATION {Value = 0}, -- I_SLACK_TONGUE {Value = 0}, -- I_ALIEN {Value = 0}, -- I_BROKEN_BONES {Value = 0}, -- I_BALDNESS {Value = 0}, -- I_DISCRETE_ITCHING {Value = 0}, -- I_JELLYITUS {Value = 0}, -- I_SLEEPING_ILLNESS {Value = 0}, -- I_PREGNANT {Value = 0}, -- I_TRANSPARENCY }, non_visuals = { [0] = {Value = 0}, -- I_UNCOMMON_COLD {Value = 0}, -- I_BROKEN_WIND {Value = 0}, -- I_SPARE_RIBS {Value = 0}, -- I_KIDNEY_BEANS {Value = 0}, -- I_BROKEN_HEART {Value = 0}, -- I_RUPTURED_NODULES {Value = 0}, -- I_MULTIPLE_TV_PERSONALITIES {Value = 0}, -- I_INFECTIOUS_LAUGHTER {Value = 0}, -- I_CORRUGATED_ANKLES {Value = 0}, -- I_CHRONIC_NOSEHAIR {Value = 0}, -- I_3RD_DEGREE_SIDEBURNS {Value = 0}, -- I_FAKE_BLOOD {Value = 0}, -- I_GASTRIC_EJECTIONS {Value = 0}, -- I_THE_SQUITS {Value = 0}, -- I_IRON_LUNGS {Value = 0}, -- I_SWEATY_PALMS {Value = 0}, -- I_HEAPED_PILES {Value = 0}, -- I_GUT_ROT {Value = 0}, -- I_GOLF_STONES {Value = 0}, -- I_UNEXPECTED_SWELLING }, visuals_available = { [0] = {Value = 0}, -- I_BLOATY_HEAD {Value = 12}, -- I_HAIRYITUS {Value = 3}, -- I_ELVIS {Value = 12}, -- I_INVIS {Value = 18}, -- I_RADIATION {Value = 6}, -- I_SLACK_TONGUE {Value = 0}, -- I_ALIEN {Value = 6}, -- I_BROKEN_BONES {Value = 12}, -- I_BALDNESS {Value = 0}, -- I_DISCRETE_ITCHING {Value = 18}, -- I_JELLYITUS {Value = 0}, -- I_SLEEPING_ILLNESS {Value = 0}, -- I_PREGNANT {Value = 6}, -- I_TRANSPARENCY }, win_criteria = { [0] = {Criteria = 0, MaxMin = 0, Value = 0, Group = 0, Bound = 0}, {Criteria = 0, MaxMin = 0, Value = 0, Group = 0, Bound = 0}, {Criteria = 0, MaxMin = 0, Value = 0, Group = 0, Bound = 0}, {Criteria = 0, MaxMin = 0, Value = 0, Group = 0, Bound = 0}, {Criteria = 0, MaxMin = 0, Value = 0, Group = 0, Bound = 0}, {Criteria = 0, MaxMin = 0, Value = 0, Group = 0, Bound = 0}, }, lose_criteria = { [0] = {Criteria = 0, MaxMin = 0, Value = 0, Group = 0, Bound = 0}, {Criteria = 0, MaxMin = 0, Value = 0, Group = 0, Bound = 0}, {Criteria = 0, MaxMin = 0, Value = 0, Group = 0, Bound = 0}, {Criteria = 0, MaxMin = 0, Value = 0, Group = 0, Bound = 0}, {Criteria = 0, MaxMin = 0, Value = 0, Group = 0, Bound = 0}, {Criteria = 0, MaxMin = 0, Value = 0, Group = 0, Bound = 0}, }, staff_levels = { [0] = {Month = 0, Nurses = 8, Doctors = 8, Handymen = 3, Receptionists = 2, ShrkRate = 10, SurgRate = 10, RschRate = 10, ConsRate = 10, JrRate = 5}, }, emergency_control = { [0] = {StartMonth = 0, EndMonth = 0, Min = 0, Max = 0, Illness = 0, PercWin = 0, Bonus = 0}, }, computer = { [0] = {Playing = 0}, -- ORAC {Playing = 0}, -- COLOSSUS {Playing = 0}, -- HAL {Playing = 0}, -- MULTIVAC {Playing = 0}, -- HOLLY {Playing = 0}, -- DEEP THOUGHT {Playing = 0}, -- ZEN {Playing = 0}, -- SKYNET {Playing = 0}, -- MARVIN {Playing = 0}, -- CEREBRO {Playing = 0}, -- MOTHER {Playing = 0}, -- JAYNE {Playing = 0}, -- CORSIX {Playing = 0}, -- ROUJIN {Playing = 0}, -- EDVIN }, awards_trophies = { -- Trophy win conditions -- Kill more than this number of rats in a year to win this award -- MIN 0 RatKillsAbsolute = 25, -- Sell more than this number of cans to win the award MIN 0 CansofCoke = 100, -- If player's reputation is >x all through the year then win trophy MIN 0 MAX 1000 Reputation = 400, -- Percentage - keep your plants >x or more watered MIN 0 MAX 100 Plant = 80, -- Percentage - keep mean staff happiness >x throughout the year to win the trophy -- MIN 0 MAX 100 TrophyStaffHappiness = 85, -- Percentage - Rats shot:Rats killed - only valid if player kills at least -- half the number of rats needed to win the other rats trophy RatKillsPercentage = 11, -- TODO: this one is hard to understand! percentage of what exactly? -- Percentage (0-100) low is good needs at 2 mayor visits to be triggered -- So for now, it is super visits that will trigger this prize -- Please all of the VIPs that visit your hospital during the year -- you will have to get a super feedback for each visit -- TrophyMayor = 25, -- Trophy win bonuses -- Bonus - MIN 0 MAX 255 (REP BONUS) REP BONUSES ARE NOW PERCENTAGES RatKillsAbsoluteBonus = 5, -- Bonus - MIN 0 MAX 65535 (MONEY BONUS) RatKillsPercentageBonus = 5000, -- Bonus - MIN 0 (MONEY BONUS) CansofCokeBonus = 1000, -- Bonus - MIN 0 (MONEY BONUS) TrophyReputationBonus = 2000, -- Bonus - MIN 0 MAX 255 (REP BONUS) PlantBonus = 5, -- Bonus - MIN 0 MAX 255 (REP BONUS) TrophyStaffHappinessBonus = 5, -- Bonus to money for NO DEATHS in the year (MONEY BONUS) TrophyDeathBonus = 10000, -- Bonus to money for approximately 100% Cure Rate in the year (MONEY BONUS) TrophyCuresBonus = 6000, -- Bonus to reputation for pleasing VIPs in the year (REPUTATION BONUS) TrophyMayorBonus = 5, ------------------- Award win/loss criteria ------------------- -- >x to win the award MIN 0 MAX 255 CuresAward = 50, -- x to win the award MIN 0 MAX 255 DeathsPoor = 25, -- >x Percentage - to win the award MIN 0 MAX 100 PopulationPercentageAward = 50, -- x to win the award MIN 0 MAX 100 CuresVDeathsAward = 5, -- x to win the award MIN 0 MAX 1000 ReputationAward = 500, -- x to win the award MIN 0 MAX 2000000 HospValueAward = 150000, -- x Percentage - to win the award MIN 0 MAX 100 - high is bad (ie high amount of litter per square) CleanlinessPoor = 40, -- >x Percentage - to win the award MIN 0 MAX 100 - percentage of peeps saved in emergencies - at least two emergencies per year to qualify EmergencyAward = 90, -- x Percentage - to win the award MIN 0 MAX 100 - staff mean happiness throughout the year StaffHappinessAward = 75, -- x Percentage - to win the award MIN 0 MAX 100 - peeps mean happiness throughout the year PeepHappinessAward = 75, -- x Percentage - to win the award MIN 0 MAX 100 - percentage of BAL_LC_LEAVE - gbv.LeaveMax - high is bad, low is good WaitingTimesAward = 25, -- true -- class.is(variable, base) --> true -- class.is(variable, something_else) --> false function class.is(instance, class) local typ = type(instance) if typ ~= "table" and typ ~= "userdata" then return false end local methods = instance while methods do if methods == class then return true end local mt = getmetatable(methods) methods = mt and mt.__index end return false end -- class.name - Get the name of a class -- For example: -- class "something" -- class.name(something) --> "something" function class.name(class) local mt = getmetatable(class) return mt and mt.__class_name end -- class.superclass - Get the superclass of a class -- For example: -- class "something" (base) -- class.superclass(something) --> base function class.superclass(class) return getmetatable(class).__index end -- class.type - Get the typename of a class instance -- For example: -- class "something" (base) -- variable = something() -- class.type(variable) --> "something" function class.type(instance) local mt = getmetatable(instance) if not mt then return nil end local methods_mt = getmetatable(mt.__index) if not methods_mt then return nil end return methods_mt.__class_name end CorsixTH-0.63/CorsixTH/Lua/config_finder.lua000066400000000000000000001142151347163623700207100ustar00rootroot00000000000000--[[ Copyright (c) 2010 Peter "Corsix" Cawley 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. --]] local config_path, config_name local pathsep = package.config:sub(1, 1) local ourpath = debug.getinfo(1, "S").source:sub(2, -22) local function pathconcat(a, b) if a:sub(-1) == pathsep then return a .. b else return a .. pathsep .. b end end -- Decide on a sensible place to put config.txt, etc. if pathsep == "\\" then -- Windows config_path = os.getenv("AppData") or ourpath else -- Linux, OS X, etc. config_path = os.getenv("XDG_CONFIG_HOME") or pathconcat(os.getenv("HOME") or "~", ".config") end if config_path ~= ourpath then config_path = pathconcat(config_path, "CorsixTH") end -- Config filename. config_name = "config.txt" -- Check for config.path.txt local fi = io.open(pathconcat(ourpath, "config.path.txt"), "r") if fi then local contents = fi:read"*a" contents = contents:match("^%s*(.-)%s*$") fi:close() if #contents ~= 0 then config_path = contents if config_path:sub(-4, -1):lower() == ".txt" then config_name = config_path:match("([^" .. pathsep .. "]*)$") config_path = config_path:sub(1, -1-#config_name) end end end -- Check / create config_path local lfs = require("lfs") local function check_dir_exists(path) if path:sub(-1) == pathsep then path = path:sub(1, -2) end if lfs.attributes(path, "mode") == "directory" then return true else local subpath = path:match("^(.*)[" .. pathsep .. "]") if subpath then return check_dir_exists(subpath) and lfs.mkdir(path) else return false end end end if not check_dir_exists(config_path) then config_path = ourpath end -- Config file with full path as string. local config_filename = pathconcat(config_path, config_name) -- Create config.txt if it doesn't exist local config_defaults = { -- This directory is deliberately obscure so that it doesn't exist by default --[[ NOTE to developers When adding new fields, please try and keep the end results user friendly They are all grouped into the places they can be changed in game and then into a group that can only be changed here. Currently the player name is at the bottom of the list for the config as it this is where it always ends up when the file is recreated. for ease of reference I have also ordered the fields into the same order]] fullscreen = false, width = 800, height = 600, language = [[English]], audio = true, free_build_mode = false, play_sounds = true, sound_volume = 0.5, play_announcements = true, announcement_volume = 0.5, play_music = true, music_volume = 0.5, prevent_edge_scrolling = false, capture_mouse = true, adviser_disabled = false, scrolling_momentum = 0.8, twentyfour_hour_clock = true, warmth_colors_display_default = 1, grant_wage_increase = false, movies = true, play_intro = true, allow_user_actions_while_paused = false, volume_opens_casebook = false, alien_dna_only_by_emergency = true, alien_dna_must_stand = true, alien_dna_can_knock_on_doors = false, disable_fractured_bones_females = true, enable_avg_contents = false, audio_frequency = 22050, audio_channels = 2, audio_buffer_size = 2048, theme_hospital_install = [[F:\ThemeHospital\hospital]], debug = false, DBGp_client_idehost = nil, DBGp_client_ideport = nil, DBGp_client_idekey = nil, DBGp_client_transport = nil, DBGp_client_platform = nil, DBGp_client_workingdir = nil, track_fps = false, zoom_speed = 80, scroll_speed = 2, shift_scroll_speed = 4, new_graphics_folder = nil, use_new_graphics = false, check_for_updates = true, } fi = io.open(config_filename, "r") local config_values = {} local needs_rewrite = false for key, value in pairs(config_defaults) do config_values[key] = value end if fi then -- Read all the values from the config file and put them in config_values. If at least one value is missing rewrite the configuration file. local file_contents = fi:read("*all") fi:close() for key, value in pairs(config_defaults) do local ind = string.find(file_contents, "\n" .. "%s*" .. key .. "%s*=") if not ind then needs_rewrite = true else ind = ind + (string.find(file_contents, key, ind) - ind) + string.len(key) ind = string.find(file_contents, "=", ind) + 1 if type(value) ~= "string" then ind = string.find(file_contents, "[%a%d]", ind) config_values[key] = string.sub(file_contents, ind, string.find(file_contents, "[ \n-]", ind + 1) - 1) else ind = string.find(file_contents, "[", ind + 1, true) + 1 config_values[key] = string.sub(file_contents, ind + 1, string.find(file_contents, "]", ind, true) - 1) end end end else needs_rewrite = true end if needs_rewrite then fi = io.open(config_filename, "w") if fi then fi:write([=[ ----------------------------------------- CorsixTH configuration file ------------------------------------------- -- Lines starting with two dashes (like this one) are ignored. -- Text settings should have their values between double square braces, e.g. -- setting = [[value]] -- Number settings should not have anything around their value, -- e.g. setting = 42 -- -------------------------------------------- SETTINGS MENU --------------------------------------------- -- These settings can also be changed from within the game from the settings menu ------------------------------------------------------------------------------------------------------------------------- -- Screen size. Must be at least 640x480. Larger sizes will require better -- hardware in order to maintain a playable framerate. The fullscreen setting -- can be true or false, and the game will run windowed if not fullscreen. -- ]=] .. '\n' .. 'fullscreen = ' .. tostring(config_values.fullscreen) .. '\n' .. '\n' .. 'width = ' .. tostring(config_values.width) .. '\n' .. 'height = ' .. tostring(config_values.height) .. '\n' .. [=[ ------------------------------------------------------------------------------------------------------------------------- -- Language to use for ingame text. Between the square braces should be one of: -- Brazilian Portuguese / pt_br / br -- Chinese (simplified) / zh(s) / chi(s) -- Chinese (traditional) / zh(t) / chi(t) -- Czech / cs / cze -- Danish / da / dk -- Dutch / Nederlands / nl / dut / nld -- English / en / eng -- Finnish / Suomi / fi / fin -- French / fr / fre / fra -- German / de / ger / deu -- Hungarian / hu / hun -- Italian / it / ita -- Korean / kor / ko -- Norwegian / nb / nob -- Polish / pl / pol -- Portuguese / pt / por -- Russian / ru / rus -- Spanish / es / spa -- Swedish / sv / swe -- ]=] .. '\n' .. 'language = [['.. config_values.language ..']]' .. '\n' .. [=[ ------------------------------------------------------------------------------------------------------------------------- -- Audio global on/off switch. -- Note that audio will also be disabled if CorsixTH was compiled without the -- SDL_mixer library. -- ]=] .. '\n' .. 'audio = ' .. tostring(config_values.audio) .. '\n' .. [=[ --------------------------------------------- CUSTOM GAME MENU ---------------------------------------------- -- These settings can also be changed from the opening menu screen in the custom games menu ------------------------------------------------------------------------------------------------------------------------- -- Free Build or Sandbox mode -- You cannot win or lose custom made maps if this is set to true. -- You also don't have to worry about money. -- This setting does not apply to any of the campaign maps. -- ]=] .. '\n' .. 'free_build_mode = ' .. tostring(config_values.free_build_mode) .. '\n' .. [=[ ----------------------------------------------- OPTIONS MENU --------------------------------------------------- --These settings can also be changed from within the game from the options menu ------------------------------------------------------------------------------------------------------------------------- -- Sounds: By default enabled and set at level 0.5 -- ]=] .. '\n' .. 'play_sounds = ' .. tostring(config_values.play_sounds) .. '\n' .. 'sound_volume = ' .. tostring(config_values.sound_volume) .. '\n' .. [=[ ------------------------------------------------------------------------------------------------------------------------- -- Announcements: By default set at level 0.5 -- ]=] .. '\n' .. 'play_announcements = ' .. tostring(config_values.play_announcements) .. '\n' .. 'announcement_volume = ' .. tostring(config_values.announcement_volume) .. '\n' .. [=[ ------------------------------------------------------------------------------------------------------------------------- -- Background music: By default enabled and set at level 0.5 -- ]=] .. '\n' .. 'play_music = ' .. tostring(config_values.play_music) .. '\n' .. 'music_volume = ' .. tostring(config_values.music_volume) .. '\n' .. [=[ ------------------------------------------------------------------------------------------------------------------------- -- Edge scrolling: By default enabled (prevent_edge_scrolling = false). -- ]=] .. '\n' .. 'prevent_edge_scrolling = ' .. tostring(config_values.prevent_edge_scrolling) .. '\n' .. [=[ ------------------------------------------------------------------------------------------------------------------------- -- Capture mouse: By default enabled (capture mouse = true). -- ]=] .. '\n' .. 'capture_mouse = ' .. tostring(config_values.capture_mouse) .. '\n' .. [=[ ------------------------------------------------------------------------------------------------------------------------- -- Adviser on/off: If you set this to true the adviser will no longer -- pop up. -- ]=] .. '\n' .. 'adviser_disabled = ' .. tostring(config_values.adviser_disabled) .. '\n' .. [=[ ------------------------------------------------------------------------------------------------------------------------- -- Scrolling Momentum. -- Determines the amount of momentum when scrolling the map with the mouse. -- This should be a value between 0 and 1 where 0 is no momentum -- ]=] .. '\n' .. 'scrolling_momentum = ' .. tostring(config_values.scrolling_momentum) .. '\n' .. [=[ ------------------------------------------------------------------------------------------------------------------------- -- Top menu clock is by default is always on -- setting to true will give you a twentyfour hours display -- change to false if you want AM / PM time displayed. -- ]=] .. '\n' .. 'twentyfour_hour_clock = ' .. tostring(config_values.twentyfour_hour_clock) .. '\n' .. [=[ ------------------------------------------------------------------------------------------------------------------------- -- Automatically check for updates. -- If set to true, CorsixTH will automatically check for and alert you to newer -- versions on startup. -- ]=] .. '\n' .. 'check_for_updates = ' .. tostring(config_values.check_for_updates) .. '\n' .. [=[ ------------------------------------------------------------------------------------------------------------------------- -- Warmth Colors display settings. -- This specifies which display method is set for warmth colours by default. -- Possible values: 1 (Red), 2 (Blue Green Red) and 3 (Yellow Orange Red). -- ]=] .. '\n' .. 'warmth_colors_display_default = ' .. tostring(config_values.warmth_colors_display_default) .. '\n' .. [=[ --------------------------------------------- CUSTOMISE SETTINGS -------------------------------------------- -- These settings can also be changed from the Customise Menu ------------------------------------------------------------------------------- -- Wage increase request settings. -- If set to true when wage increase requests expire automatically grant them -- otherwise let the staff member quit. -- ]=] .. '\n' .. 'grant_wage_increase = ' .. tostring(config_values.grant_wage_increase) .. '\n' .. [=[ ------------------------------------------------------------------------------------------------------------------------- -- Movie global on/off switch. -- Note that movies will also be disabled if CorsixTH was compiled without the -- FFMPEG library. -- ]=] .. '\n' .. 'movies = ' .. tostring(config_values.movies) .. '\n' .. [=[ -- Intro movie: By default enabled -- ]=] .. '\n' .. 'play_intro = ' .. tostring(config_values.play_intro) .. '\n' .. [=[ ------------------------------------------------------------------------------------------------------------------------- -- Allow user actions while game is paused -- In Theme Hospital the player would only be allowed to use the top menu if -- the game was paused. That is the default setting in CorsixTH too, but by -- setting this to true everything is allowed while the game is paused. -- ]=] .. '\n' .. 'allow_user_actions_while_paused = ' .. tostring(config_defaults.allow_user_actions_while_paused) .. '\n' .. [=[ ------------------------------------------------------------------------------------------------------------------------- -- VOLUME CONTROL IS OPENING THE DRUG CASEBOOK? -- If your keyboard volume control opens the Drug Casebook at the same time -- then change this to true. From then on you will have to use Shift + C to open -- the Casebook and volume down will not open it. -- For example for shift + C to open casebook change the setting below to = true -- ]=] .. '\n' .. 'volume_opens_casebook = ' .. tostring(config_values.volume_opens_casebook) .. '\n' .. [=[ ------------------------------------------------------------------------------------------------------------------------- -- To allow patients with Alien DNA to visit your hospital other than by an emergency change -- the settings below. Understand that there are no animations for sitting down, opening -- or knocking on doors etc. -- So, like with Theme Hospital to do these things they will appear to change to normal -- looking and then change back. -- ]=] .. '\n' .. 'alien_dna_only_by_emergency = ' .. tostring(config_values.alien_dna_only_by_emergency) .. '\n' .. 'alien_dna_must_stand = ' .. tostring(config_values.alien_dna_must_stand) .. '\n' .. 'alien_dna_can_knock_on_doors = ' .. tostring(config_values.alien_dna_can_knock_on_doors) .. '\n' .. [=[ -- To allow female patients with fractured bones, which are by default disabled due to poor -- animation that skips and jumps a bit -- ]=] .. '\n' .. 'disable_fractured_bones_females = ' .. tostring(config_values.disable_fractured_bones_females) .. '\n' .. [=[ ------------------------------------------------------------------------------------------------------------------------- -- By default the player selects any extra objects they want for each room they build. -- If you would like the game to remember what you usually add, then change this option to true. -- ]=] .. '\n' .. 'enable_avg_contents = ' .. tostring(config_values.enable_avg_contents) .. '\n' .. [=[ ----------------------------------------------- FOLDER SETTINGS ---------------------------------------------- -- These settings can also be changed from the Folders Menu ------------------------------------------------------------------------------------------------------------------------- ------------------------------------------------------------------------------------------------------------------------- -- Theme hospital install folder: original game data files are loaded from this -- folder. Between the square braces should be the folder which contains the -- original HOSPITAL.EXE and/or HOSP95.EXE file. This can point to a copy of -- the Theme Hospital demo, though a full install of the original game is -- preferred. -- ]=] .. '\n' .. 'theme_hospital_install = [[' .. config_values.theme_hospital_install ..']]' .. '\n' .. [=[ ------------------------------------------------------------------------------------------------------------------------- -- Font file setting. Can be changed from main game menu -- Specify a font file here if you wish to play the game in a language not -- present in the original game. Examples include Russian, Chinese and Polish. -- unicode_font = nil -- [[X:\ThemeHospital\font.ttc]] ------------------------------------------------------------------------------------------------------------------------- -- Savegames. By default, the "Saves" directory alongside this config file will -- be used for storing saved games in. Should this not be suitable, then -- uncomment the following line, and point it to a directory which exists and -- is more suitable. -- savegames = nil -- [[X:\ThemeHospital\Saves]] ------------------------------------------------------------------------------------------------------------------------- -- Levels. By default, the "Levels" directory alongside this config file will -- be used for storing new maps / levels in. Should this not be suitable, then -- uncomment the following line, and point it to a directory which exists and -- is more suitable. -- levels = nil -- [[X:\ThemeHospital\Levels]] ------------------------------------------------------------------------------------------------------------------------ -- Use new graphics. Whether to use the original graphics from Theme Hospital -- or use new graphics created by the CorsixTH project. use_new_graphics = false ------------------------------------------------------------------------------------------------------------------------- -- Graphics folder. All graphics are initially taken from the original Theme Hospital, -- but the game can also try to find new graphics in the specified folder below. -- Some graphics are shipped with CorsixTH, and they will be used if you just switch -- on new graphics. If you however have acquired graphics from somewhere else, then -- uncomment the following line and point it to the directory which contains the new -- graphics. new_graphics_folder = nil -- [[X:\ThemeHospital\Graphics]] ------------------------------------------------------------------------------------------------------------------------- -- Screenshots. By default, the "Screenshots" directory alongside this config -- file will be used for saving screenshots. Should this not be suitable, then -- uncomment the following line, and point it to a directory which exists and -- is more suitable. -- screenshots = nil -- [[X:\ThemeHospital\Screenshots]] ------------------------------------------------------------------------------------------------------------------------- -- If you want to listen to non-Theme-Hospital music, then follow these steps: -- 1) Find updated versions of the original tracks (for example the remixes by ZR -- from http://www.a-base.dds.nl/temp/ThemeHospital_ZRRemix.zip ) or any -- other music you want to listen to. -- 2) Uncomment the next line and point it to where the music files are. -- 3) If you want to change the names of songs ingame, make a file called -- "names.txt" and write the file name on one row, followed by the desired -- ingame name on the next row. -- audio_music = nil -- [[X:\ThemeHospital\Music]] ----------------------------------------------- SPECIAL SETTINGS ---------------------------------------------- -- These settings can only be changed here ------------------------------------------------------------------------------------------------------------------------- -- Audio playback settings. -- These can be commented out to use the default values from the game binary. -- Note: On some platforms, these settings may not effect MIDI playback - only -- sound effects and music audio. If you are experiencing poor audio playback, -- then try doubling the buffer size. -- ]=] .. '\n' .. 'audio_frequency = ' .. tostring(config_values.audio_frequency) .. '\n' .. 'audio_channels = ' .. tostring(config_values.audio_channels) .. '\n' .. 'audio_buffer_size = ' .. tostring(config_values.audio_buffer_size) .. '\n' .. [=[ ------------------------------------------------------------------------------------------------------------------------ -- Debug settings. -- If set to true more detailed information will be printed in the terminal -- and a debug menu will be visible. -- ]=] .. '\n' .. 'debug = ' .. tostring(config_values.debug) .. '\n' .. [=[ --Optional settings for CorsixTH's Lua DBGp client. --Default settings are nil values, platform & workingdir will be autodected if nil. --https://wiki.eclipse.org/LDT/User_Area/User_Guides/User_Guide_1.2#Attach_session -- ]=] .. '\n' .. 'idehost = ' .. tostring(config_values.DBGp_client_idehost) .. '\n' .. 'ideport = ' .. tostring(config_values.DBGp_client_ideport) .. '\n' .. 'idekey = ' .. tostring(config_values.DBGp_client_idekey) .. '\n' .. 'transport = ' .. tostring(config_values.DBGp_client_transport) .. '\n' .. 'platform = ' .. tostring(config_values.DBGp_platform) .. '\n' .. 'workingdir = ' .. tostring(config_values.DBGp_workingdir) .. '\n' .. [=[ -- If set to true, the FPS, Lua memory usage, and entity count will be shown -- in the dynamic information bar. Note that setting this to true also turns -- off the FPS limiter, causing much higher CPU utilisation, but resulting in -- more useful FPS values, as they are not artificially capped. -- ]=] .. '\n' .. 'track_fps = ' .. tostring(config_values.track_fps) .. '\n' .. [=[ ------------------------------------------------------------------------------------------------------------------------- -- Zoom Speed: By default this is set at 80 -- Any number value between 10 and 1000, 10 is very slow and 1000 is very fast! -- ]=] .. '\n' .. 'zoom_speed = ' .. tostring(config_values.zoom_speed) .. '\n' .. [=[ ------------------------------------------------------------------------------------------------------------------------- -- Scroll Speeds: The speed of scrolling with and without shift being held. -- Any number value between 1 and 10, 1 is very slow and 10 is fast! -- ]=] .. '\n' .. 'scroll_speed = ' .. tostring(config_values.scroll_speed) .. '\n' .. 'shift_scroll_speed = ' .. tostring(config_values.shift_scroll_speed) .. '\n' .. [=[ ------------------------------------------------------------------------------------------------------------------------- ------------------------------------------------ CAMPAIGN MENU ----------------------------------------------- -- By default your computer log in will be your name in the game. You can change it in the -- campaign menu or between the brace brackets below [[YOUR NAME]]. -- Note: space is limited in the game, so don't enter a name that is too long! -- -- If you have specified any other locations for things like saves, music or screenshots you will find these below. If -- you change your mind and wish to go back to the default folders, just delete the relevant line. -- -- If you wish to go back to the default settings for everything, you can delete this text file and it will be re-created -- you play the game. ------------------------------------------------------------------------------------------------------------------------- ]=]) fi:close() end end -- Hotkey filename. local hotkeys_name = "hotkeys.txt" -- Hotkey file with full path as string. local hotkeys_filename = pathconcat(config_path, hotkeys_name) -- Defaults for hotkeys. local hotkeys_defaults = { global_confirm = "return", global_confirm_alt = "e", global_cancel = "escape", global_cancel_alt = "q", global_fullscreen_toggle = {"alt", "return"}, global_exitApp = {"alt", "f4"}, global_resetApp = {"shift", "f10"}, global_releaseMouse = {"ctrl", "f10"}, global_connectDebugger = {"ctrl", "c"}, global_showLuaConsole = "f12", global_runDebugScript = {"shift", "d"}, global_screenshot = {"ctrl", "s"}, global_stop_movie = "escape", global_window_close = "escape", global_stop_movie_alt = "q", global_window_close_alt = "q", ingame_showmenubar = "escape", ingame_showCheatWindow = "f11", ingame_pause = "p", ingame_gamespeed_slowest = "1", ingame_gamespeed_slower = "2", ingame_gamespeed_normal = "3", ingame_gamespeed_max = "4", ingame_gamespeed_thensome = "5", ingame_gamespeed_speedup = "z", ingame_scroll_up = "up", ingame_scroll_down = "down", ingame_scroll_left = "left", ingame_scroll_right = "right", ingame_scroll_shift = "shift", ingame_zoom_in = "=", ingame_zoom_in_more = {"shift", "="}, ingame_zoom_out = "-", ingame_zoom_out_more = {"shift", "-"}, ingame_setTransparent = "x", ingame_toggleAdvisor = {"shift", "a"}, ingame_poopLog = {"ctrl", "d"}, ingame_poopStrings = {"ctrl", "t"}, ingame_toggleAnnouncements = {"alt", "a"}, ingame_toggleSounds = {"alt", "s"}, ingame_toggleMusic = {"alt", "m"}, ingame_panel_bankManager = "f1", ingame_panel_bankStats = "f2", ingame_panel_staffManage = "f3", ingame_panel_townMap = "f4", ingame_panel_casebook = "f5", ingame_panel_research = "f6", ingame_panel_status = "f7", ingame_panel_charts = "f8", ingame_panel_policy = "f9", ingame_panel_map_alt = "t", ingame_panel_research_alt = "r", ingame_panel_casebook_alt = "c", ingame_panel_casebook_alt02 = {"shift", "c"}, ingame_panel_buildRoom = "f", ingame_panel_furnishCorridor = "g", ingame_panel_editRoom = "v", ingame_panel_hireStaff = "b", ingame_loadMenu = {"shift", "l"}, ingame_saveMenu = {"shift", "s"}, ingame_restartLevel = {"shift", "r"}, ingame_quitLevel = {"shift", "q"}, ingame_quickSave = {"alt", "shift", "s"}, ingame_quickLoad = {"alt", "shift", "l"}, ingame_openFirstMessage = "m", ingame_toggleInfo = "i", ingame_jukebox = "j", ingame_rotateobject = "space", ingame_patient_gohome = "h", ingame_storePosition_1 = {"alt", "1"}, ingame_storePosition_2 = {"alt", "2"}, ingame_storePosition_3 = {"alt", "3"}, ingame_storePosition_4 = {"alt", "4"}, ingame_storePosition_5 = {"alt", "5"}, ingame_storePosition_6 = {"alt", "6"}, ingame_storePosition_7 = {"alt", "7"}, ingame_storePosition_8 = {"alt", "8"}, ingame_storePosition_9 = {"alt", "9"}, ingame_storePosition_0 = {"alt", "0"}, ingame_recallPosition_1 = {"ctrl", "1"}, ingame_recallPosition_2 = {"ctrl", "2"}, ingame_recallPosition_3 = {"ctrl", "3"}, ingame_recallPosition_4 = {"ctrl", "4"}, ingame_recallPosition_5 = {"ctrl", "5"}, ingame_recallPosition_6 = {"ctrl", "6"}, ingame_recallPosition_7 = {"ctrl", "7"}, ingame_recallPosition_8 = {"ctrl", "8"}, ingame_recallPosition_9 = {"ctrl", "9"}, ingame_recallPosition_0 = {"ctrl", "0"}, } -- Clear the loaded file variable. fi = io.open(hotkeys_filename, "r") local hotkeys_values = {} local hotkeys_needs_rewrite = false for key, value in pairs(hotkeys_defaults) do hotkeys_values[key] = serialize(value) end -- If the file opened succesfully... if fi then local file_contents = fi:read("*all") fi:close() for key, _ in pairs(hotkeys_defaults) do local ind = string.find(file_contents, "\n" .. "%s*" .. key .. "%s*=") -- If we couldn't find the key in the hotkeys.txt file... if not ind then hotkeys_needs_rewrite = true else ind = ind + (string.find(file_contents, key, ind) - ind) + string.len(key) ind = string.find(file_contents, "=", ind) + 1 ind = string.find(file_contents, "[%[{]", ind) hotkeys_values[key] = string.sub(file_contents, ind, string.find(file_contents, "[\n]", ind + 1) - 1) end end else hotkeys_needs_rewrite = true end -- if hotkeys_needs_rewrite then -- The config file that will be written is divided into seperate strings, which are concatenated when they are written into the file. -- This is done to avoid a "Too many C levels" error. local string_01 = [=[ --------------------------CorsixTH Hotkey Mappings File------------------------- -- Lines starting with two dashes (like this one) are ignored. -- Text settings should have their values between double square braces, e.g. -- Number settings should not have anything around their value, and complex -- settings should be surrounded by curly brackets. -- -- EXAMPLES -- setting = [[value]] -- setting = 42 -- setting = { 42, [[value]] } -----------------------------------Global Keys---------------------------------- -- These are global keys to be used at anytime while the application is open. --]=] .. '\n' .. 'global_confirm = ' .. hotkeys_values.global_confirm .. '\n' .. 'global_confirm_alt = ' .. hotkeys_values.global_confirm_alt .. '\n' .. 'global_cancel = ' .. hotkeys_values.global_cancel .. '\n' .. 'global_cancel_alt = ' .. hotkeys_values.global_cancel_alt .. '\n' .. 'global_fullscreen_toggle = ' .. hotkeys_values.global_fullscreen_toggle .. '\n' .. 'global_exitApp = ' .. hotkeys_values.global_exitApp .. '\n' .. 'global_resetApp = ' .. hotkeys_values.global_resetApp .. '\n' .. 'global_releaseMouse = ' .. hotkeys_values.global_releaseMouse .. '\n' .. 'global_connectDebugger = ' .. hotkeys_values.global_connectDebugger .. '\n' .. 'global_showLuaConsole = ' .. hotkeys_values.global_showLuaConsole .. '\n' .. 'global_runDebugScript = ' .. hotkeys_values.global_runDebugScript .. '\n' .. 'global_screenshot = ' .. hotkeys_values.global_screenshot .. '\n' .. 'global_stop_movie = ' .. hotkeys_values.global_stop_movie .. '\n' .. 'global_window_close = ' .. hotkeys_values.global_window_close .. '\n' .. 'global_stop_movie_alt =' .. hotkeys_values.global_stop_movie_alt .. '\n' .. 'global_window_close_alt =' .. hotkeys_values.global_window_close_alt .. '\n' .. [=[ -----------------------------------Scroll Keys---------------------------------- -- These are the keys to be used to scroll the camera around in-game. -- ]=] .. '\n' .. 'ingame_scroll_up = ' .. hotkeys_values.ingame_scroll_up .. '\n' .. 'ingame_scroll_down = ' .. hotkeys_values.ingame_scroll_down .. '\n' .. 'ingame_scroll_left = ' .. hotkeys_values.ingame_scroll_left .. '\n' .. 'ingame_scroll_right = ' .. hotkeys_values.ingame_scroll_right .. '\n' .. 'ingame_scroll_shift = ' .. hotkeys_values.ingame_scroll_shift .. '\n' .. [=[ --------------------------------------Zoom-------------------------------------- -- These are keys used to zoom the camera in and out. -- ]=] .. '\n' .. 'ingame_zoom_in = '.. hotkeys_values.ingame_zoom_in .. '\n' .. 'ingame_zoom_in_more = ' .. hotkeys_values.ingame_zoom_in_more .. '\n' .. 'ingame_zoom_out = ' .. hotkeys_values.ingame_zoom_out .. '\n' .. 'ingame_zoom_out_more = ' .. hotkeys_values.ingame_zoom_out_more .. '\n' .. [=[ ----------------------------------In-Game Menus--------------------------------- -- These are quick keys to show the in-game menu bar and some other windows. -- ]=] .. '\n' .. 'ingame_showmenubar = ' .. hotkeys_values.ingame_showmenubar .. '\n' .. 'ingame_showCheatWindow = ' .. hotkeys_values.ingame_showCheatWindow .. '\n' .. 'ingame_loadMenu = ' .. hotkeys_values.ingame_loadMenu .. '\n' .. 'ingame_saveMenu = ' .. hotkeys_values.ingame_saveMenu .. '\n' .. 'ingame_jukebox = ' .. hotkeys_values.ingame_jukebox .. '\n' .. 'ingame_openFirstMessage = ' .. hotkeys_values.ingame_openFirstMessage .. '\n' .. [=[]=] local string_02 = [=[ ----------------------------------Speed Control--------------------------------- -- These pause and control the speed of the game. -- ]=] .. '\n' .. 'ingame_pause = ' .. hotkeys_values.ingame_pause .. '\n' .. 'ingame_gamespeed_slowest = ' .. hotkeys_values.ingame_gamespeed_slowest .. '\n' .. 'ingame_gamespeed_slower = ' .. hotkeys_values.ingame_gamespeed_slower .. '\n' .. 'ingame_gamespeed_normal = ' .. hotkeys_values.ingame_gamespeed_normal .. '\n' .. 'ingame_gamespeed_max = ' .. hotkeys_values.ingame_gamespeed_max .. '\n' .. 'ingame_gamespeed_thensome = ' .. hotkeys_values.ingame_gamespeed_thensome .. '\n' .. 'ingame_gamespeed_speedup = ' .. hotkeys_values.ingame_gamespeed_speedup .. '\n' .. [=[ ------------------------------In-Game Bottom Panel------------------------------ -- These open in-game panel windows like the town map or the "build room" dialog. -- ]=] .. '\n' .. 'ingame_panel_bankManager = ' .. hotkeys_values.ingame_panel_bankManager .. '\n' .. 'ingame_panel_bankStats = ' .. hotkeys_values.ingame_panel_bankStats .. '\n' .. 'ingame_panel_staffManage = ' .. hotkeys_values.ingame_panel_staffManage .. '\n' .. 'ingame_panel_townMap = ' .. hotkeys_values.ingame_panel_townMap .. '\n' .. 'ingame_panel_casebook = ' .. hotkeys_values.ingame_panel_casebook .. '\n' .. 'ingame_panel_research = ' .. hotkeys_values.ingame_panel_research .. '\n' .. 'ingame_panel_status = ' .. hotkeys_values.ingame_panel_status .. '\n' .. 'ingame_panel_charts = ' .. hotkeys_values.ingame_panel_charts .. '\n' .. 'ingame_panel_policy = ' .. hotkeys_values.ingame_panel_policy .. '\n' .. 'ingame_panel_map_alt = ' .. hotkeys_values.ingame_panel_map_alt .. '\n' .. 'ingame_panel_research_alt = ' .. hotkeys_values.ingame_panel_research_alt .. '\n' .. 'ingame_panel_casebook_alt = ' .. hotkeys_values.ingame_panel_casebook_alt .. '\n' .. 'ingame_panel_casebook_alt02 = ' .. hotkeys_values.ingame_panel_casebook_alt02 .. '\n' .. 'ingame_panel_buildRoom = ' .. hotkeys_values.ingame_panel_buildRoom .. '\n' .. 'ingame_panel_furnishCorridor = ' .. hotkeys_values.ingame_panel_furnishCorridor .. '\n' .. 'ingame_panel_editRoom = ' .. hotkeys_values.ingame_panel_editRoom .. '\n' .. 'ingame_panel_hireStaff = ' .. hotkeys_values.ingame_panel_hireStaff .. '\n' .. [=[ ----------------------------------Rotate Object--------------------------------- -- This key rotates objects while they are being placed. -- ]=] .. '\n' .. 'ingame_rotateobject = ' .. hotkeys_values.ingame_rotateobject .. '\n' .. [=[ -----------------------------------Quick Keys----------------------------------- -- These are keys for quick saving and loading, and for quickly restarting and quitting the level. -- ]=] .. '\n' .. 'ingame_quickSave = ' .. hotkeys_values.ingame_quickSave .. '\n' .. 'ingame_quickLoad = ' .. hotkeys_values.ingame_quickLoad .. '\n' .. 'ingame_restartLevel = ' .. hotkeys_values.ingame_restartLevel .. '\n' .. 'ingame_quitLevel = ' .. hotkeys_values.ingame_quitLevel .. '\n' .. [=[ ---------------------------------Set Transparent-------------------------------- -- While held down any walls will be transparent, allowing you to see behind them. -- ]=] .. '\n' .. 'ingame_setTransparent = ' .. hotkeys_values.ingame_setTransparent .. '\n' .. [=[ ]=] local string_03 = [=[ ----------------------------Store and Recall Position--------------------------- -- These keys store and recall camera positions. If you press the key(s) that correspond to -- "ingame_recallPosition_1" while looking over the operating room, for instance, and then -- you move the camera away from there, you can press "ingame_recallPosition_1" whenever -- you want to go back to the operating room instantly. -- ]=] .. '\n' .. 'ingame_storePosition_1 = ' .. hotkeys_values.ingame_storePosition_1 .. '\n' .. 'ingame_storePosition_2 = ' .. hotkeys_values.ingame_storePosition_2 .. '\n' .. 'ingame_storePosition_3 = ' .. hotkeys_values.ingame_storePosition_3 .. '\n' .. 'ingame_storePosition_4 = ' .. hotkeys_values.ingame_storePosition_4 .. '\n' .. 'ingame_storePosition_5 = ' .. hotkeys_values.ingame_storePosition_5 .. '\n' .. 'ingame_storePosition_6 = ' .. hotkeys_values.ingame_storePosition_6 .. '\n' .. 'ingame_storePosition_7 = ' .. hotkeys_values.ingame_storePosition_7 .. '\n' .. 'ingame_storePosition_8 = ' .. hotkeys_values.ingame_storePosition_8 .. '\n' .. 'ingame_storePosition_9 = ' .. hotkeys_values.ingame_storePosition_9 .. '\n' .. 'ingame_storePosition_0 = ' .. hotkeys_values.ingame_storePosition_0 .. '\n' .. 'ingame_recallPosition_1 = ' .. hotkeys_values.ingame_recallPosition_1 .. '\n' .. 'ingame_recallPosition_2 = ' .. hotkeys_values.ingame_recallPosition_2 .. '\n' .. 'ingame_recallPosition_3 = ' .. hotkeys_values.ingame_recallPosition_3 .. '\n' .. 'ingame_recallPosition_4 = ' .. hotkeys_values.ingame_recallPosition_4 .. '\n' .. 'ingame_recallPosition_5 = ' .. hotkeys_values.ingame_recallPosition_5 .. '\n' .. 'ingame_recallPosition_6 = ' .. hotkeys_values.ingame_recallPosition_6 .. '\n' .. 'ingame_recallPosition_7 = ' .. hotkeys_values.ingame_recallPosition_7 .. '\n' .. 'ingame_recallPosition_8 = ' .. hotkeys_values.ingame_recallPosition_8 .. '\n' .. 'ingame_recallPosition_9 = ' .. hotkeys_values.ingame_recallPosition_9 .. '\n' .. 'ingame_recallPosition_0 = ' .. hotkeys_values.ingame_recallPosition_0 .. '\n' .. [=[ ---------------------------------Toggle Various--------------------------------- -- These toggle various things. The names tell all. -- ]=] .. '\n' .. 'ingame_toggleAnnouncements = ' .. hotkeys_values.ingame_toggleAnnouncements .. '\n' .. 'ingame_toggleSounds = ' .. hotkeys_values.ingame_toggleSounds .. '\n' .. 'ingame_toggleMusic = ' .. hotkeys_values.ingame_toggleMusic .. '\n' .. 'ingame_toggleAdvisor = ' .. hotkeys_values.ingame_toggleAdvisor .. '\n' .. 'ingame_toggleInfo = ' .. hotkeys_values.ingame_toggleInfo .. '\n' .. [=[ ------------------------------------Dump Log------------------------------------ -- These keys dump logs. And strings, if too much fiber was taken. -- ]=] .. '\n' .. 'ingame_poopLog = ' .. hotkeys_values.ingame_poopLog .. '\n' .. 'ingame_poopStrings = ' .. hotkeys_values.ingame_poopStrings .. '\n' .. [=[ --------------------------------Patient, Go Home-------------------------------- -- This sends a patient home. Also a good anime episode name. -- ]=] .. '\n' .. 'ingame_patient_gohome = ' .. hotkeys_values.ingame_patient_gohome .. '\n' .. [=[ ]=] fi = io.open(hotkeys_filename, "w") if fi then fi:write(string_01 .. string_02 .. string_03) fi:close() end end for k, str_val in pairs(hotkeys_values) do local status, lua_val = pcall(loadstring_envcall('return ' .. str_val), {}) if status then hotkeys_values[k] = lua_val end end return config_filename, config_values, hotkeys_filename, hotkeys_values, hotkeys_defaults CorsixTH-0.63/CorsixTH/Lua/date.lua000066400000000000000000000174151347163623700170350ustar00rootroot00000000000000--[[ Copyright (c) 2018 Pavel "sofo" Schoffer 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. --]] --[[ Date class is meant to encapsulate logic around months, years, days, hours. It should be able to do adjustments with regards to days in given month and so on. Date objects should be immutable and that is why date adjustments return new objects instead of modifying the current one. ]] class "Date" ---@type Date local Date = _G["Date"] local month_length = { 31, -- Jan 28, -- Feb (29 in leap years, but TH doesn't have leap years) 31, -- Mar 30, -- Apr 31, -- May 30, -- Jun 31, -- Jul 31, -- Aug 30, -- Sep 31, -- Oct 30, -- Nov 31, -- Dec } local hours_per_day = 50 -- STATIC --[[ Method returns the number of game hours in one day ! This should be use everywhere we query this information !return (number) number of hours in a day. ]] function Date.hoursPerDay() return hours_per_day end -- PUBLIC --[[ Date constructor ! Date is initialized by setting year, month day and hour in this order the default day is 1-01-01T00 - if any of the components isn't set the default value is used. !param year (number) year of the new date !param month (number) month of the new date !param day (number) day of the new date !param hour (number) hour of the new date !return (Date) created object. ]] function Date:Date(year, month, day, hour) self._year = year or 1 self._month = month or 1 self._day = day or 1 self._hour = hour or 0 self:_adjustOverflow() end --[[ Returns the last day of the current month ! This method finds the correct last day for current month of self. This number is also the number of days within a month. Ignores leap years. !return (number) ]] function Date:lastDayOfMonth() return month_length[self._month] end --[[ Adds months ! Creates a copy of self with adjusted months. !param increment (number) number to adjust, can be negative !return (Date) ]] function Date:plusMonths(increment) local new_month = self._month + increment return Date(self._year, new_month, self._day, self._hour) end --[[ Adds days ! Creates a copy of self with adjusted days. !param increment (number) number to adjust, can be negative !return (Date) ]] function Date:plusDays(increment) local new_day = self._day + increment return Date(self._year, self._month, new_day, self._hour) end --[[ Adds years ! Creates a copy of self with adjusted years. !param increment (number) number to adjust, can be negative !return (Date) ]] function Date:plusYears(increment) local new_year = self._year + increment return Date(new_year, self._month, self._day, self._hour) end --[[ Adds hours ! Creates a copy of self with adjusted hours. !param increment (number) number to adjust, can be negative !return (Date) ]] function Date:plusHours(increment) local new_hour = self._hour + increment return Date(self._year, self._month, self._day, new_hour) end --[[ Returns the month of year ! Finds out what is a month of this year (1-12) !return (number) ]] function Date:monthOfYear() return self._month end --[[ Returns the day of month ! Finds out what is a current day in a date (1-31) !return (number) ]] function Date:dayOfMonth() return self._day end --[[ Returns the year ! Finds out what is a current year of this date (1-X) !return (number) ]] function Date:year() return self._year end --[[ Returns the hour of the day ! Finds out what is an hour of this date starting on 0 !return (number) ]] function Date:hourOfDay() return self._hour end --[[ Return string representation ! Returns string representation of the date in format y-mm-ddThh !return (string) ]] function Date:tostring() return string.format("%d-%02d-%02dT%02d", self._year, self._month, self._day, self._hour) end --[[ Checks if date is a last day of a month ! Finds out if the current day is a last day in current month with respect to different month lengths. !return (boolean) ]] function Date:isLastDayOfMonth() return self._day == self:lastDayOfMonth() end --[[ Checks if date is a last day of a year ! Finds out if the current day is a last day in current month and current month is a last month in a year. !return (boolean) ]] function Date:isLastDayOfYear() return self:isLastDayOfMonth() and self._month == 12 end --[[ Returns the month of the game ! Returns the number of months started since the start of the game. This converts all the years to months and add them together with the started months. !return (number) ]] function Date:monthOfGame() return (self._year - 1) * 12 + self._month end --[[ Clone the date ! Creates another instance of date with a same value !return (Date) ]] function Date:clone() return Date(self._year, self._month, self._day, self._hour) end --[[ Checks the date ! Checks the date with another passed as a parameter, but ignores time !param other (Date) The other day to be compared !return (boolean) ]] function Date:isSameDay(other) return self._year == other._year and self._month == other._month and self._day == other._day end -- METAMETHODS local Date_mt = Date._metatable function Date_mt.__eq(one, other) return one:isSameDay(other) and one._hour == other._hour end function Date_mt.__lt(one, other) if one._year == other._year then if one._month == other._month then if one._day == other._day then return one._hour < other._hour end return one._day < other._day end return one._month < other._month end return one._year < other._year end -- PRIVATE --[[ PRIVATE Adjusts the hours overflows ! Method to deal with hour being more or less than valid value ]] function Date:_adjustHoursOverflow() while self._hour < 0 do self._hour = self._hour + hours_per_day self._day = self._day - 1 end while self._hour >= hours_per_day do self._hour = self._hour - hours_per_day self._day = self._day + 1 end self:_adjustDayOverflow() end --[[ PRIVATE Adjusts the days overflows ! Method to deal with day being more or less than valid value ]] function Date:_adjustDayOverflow() while self._day < 1 do self._month = self._month - 1 self:_adjustMonthOverflow() self._day = self._day + self:lastDayOfMonth() end while self._day > self:lastDayOfMonth() do self._day = self._day - self:lastDayOfMonth() self._month = self._month + 1 self:_adjustMonthOverflow() end end --[[ PRIVATE Adjusts the months overflows ! Method to deal with month being more or less than valid value ]] function Date:_adjustMonthOverflow() local monthIx = self._month - 1 self._year = self._year + math.floor(monthIx / 12) self._month = monthIx % 12 + 1 end --[[ PRIVATE Adjusts all the overflows ! Normalize date to fix all the overflows of hours, days and months. This method is a key to date adjustments. ]] function Date:_adjustOverflow() self:_adjustMonthOverflow() self:_adjustDayOverflow() self:_adjustHoursOverflow() end CorsixTH-0.63/CorsixTH/Lua/debug_script.lua000066400000000000000000000012441347163623700205630ustar00rootroot00000000000000--- -- Calling "execute script" while CorsixTH is running will execute the latest -- code in this script so you don't need to restart CorsixTH. -- -- This script's execution key command and the key commands for the debug console -- & connecting a Lua DBGp server can be used anywhere at any time in CorsixTH -- when debug mode is enabled. -- -- Like with the console you can reference clicked humanoids with the underscore -- global variable so for example: _:die() will make a clicked patient die. -- -- The run time App class instance can be referenced with its global variable -- "TheApp", with it you can reference other run time class instances like: -- TheApp.world --- CorsixTH-0.63/CorsixTH/Lua/diagnosis/000077500000000000000000000000001347163623700173655ustar00rootroot00000000000000CorsixTH-0.63/CorsixTH/Lua/diagnosis/diag_blood_machine.lua000066400000000000000000000024231347163623700236400ustar00rootroot00000000000000--[[ Copyright (c) 2010 Edvin "Lego3" Linge 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. --]] local disease = {} disease.id = "diag_blood_machine" disease.expertise_id = 37 disease.name = _S.diseases.diag_blood_machine.name disease.cure_price = 250 disease.pseudo = true disease.requires_machine = true return disease CorsixTH-0.63/CorsixTH/Lua/diagnosis/diag_cardiogram.lua000066400000000000000000000024161347163623700231670ustar00rootroot00000000000000--[[ Copyright (c) 2009 Manuel "Roujin" Wolf 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. --]] local disease = {} disease.id = "diag_cardiogram" disease.expertise_id = 38 disease.name = _S.diseases.diag_cardiogram.name disease.cure_price = 150 disease.pseudo = true disease.requires_machine = true return disease CorsixTH-0.63/CorsixTH/Lua/diagnosis/diag_general_diag.lua000066400000000000000000000023661347163623700234640ustar00rootroot00000000000000--[[ Copyright (c) 2010 Miika-Petteri Matikainen 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. --]] local disease = {} disease.id = "diag_general_diag" disease.expertise_id = 41 disease.name = _S.diseases.diag_general_diag.name disease.cure_price = 150 disease.pseudo = true return disease CorsixTH-0.63/CorsixTH/Lua/diagnosis/diag_gp.lua000066400000000000000000000023471347163623700214700ustar00rootroot00000000000000--[[ Copyright (c) 2009 Peter "Corsix" Cawley 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. --]] local disease = {} disease.id = "diag_gp" disease.expertise_id = 1 disease.name = _S.diseases.general_practice.name disease.cure_price = 100 disease.pseudo = true return disease CorsixTH-0.63/CorsixTH/Lua/diagnosis/diag_psych.lua000066400000000000000000000024231347163623700222030ustar00rootroot00000000000000--[[ Copyright (c) 2009 Manuel "Roujin" Wolf 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. --]] local disease = {} disease.id = "diag_psych" disease.expertise_id = 43 disease.name = _S.diseases.diag_psych.name disease.cure_price = 200 -- http://www.eudoxus.demon.co.uk/thc/tech.htm disease.pseudo = true return disease CorsixTH-0.63/CorsixTH/Lua/diagnosis/diag_scanner.lua000066400000000000000000000024101347163623700225020ustar00rootroot00000000000000--[[ Copyright (c) 2010 Manuel "Roujin" Wolf 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. --]] local disease = {} disease.id = "diag_scanner" disease.expertise_id = 36 disease.name = _S.diseases.diag_scanner.name disease.cure_price = 300 disease.pseudo = true disease.requires_machine = true return disease CorsixTH-0.63/CorsixTH/Lua/diagnosis/diag_ultrascan.lua000066400000000000000000000024201347163623700230460ustar00rootroot00000000000000--[[ Copyright (c) 2010 Miika-Petteri Matikainen 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. --]] local disease = {} disease.id = "diag_ultrascan" disease.expertise_id = 40 disease.name = _S.diseases.diag_ultrascan.name disease.cure_price = 250 disease.pseudo = true disease.requires_machine = true return disease CorsixTH-0.63/CorsixTH/Lua/diagnosis/diag_ward.lua000066400000000000000000000023411347163623700220110ustar00rootroot00000000000000--[[ Copyright (c) 2010 Edvin "Lego3" Linge 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. --]] local disease = {} disease.id = "diag_ward" disease.expertise_id = 42 disease.name = _S.diseases.diag_ward.name disease.cure_price = 100 disease.pseudo = true return disease CorsixTH-0.63/CorsixTH/Lua/diagnosis/diag_x_ray.lua000066400000000000000000000024101347163623700221730ustar00rootroot00000000000000--[[ Copyright (c) 2010 Miika-Petteri Matikainen 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. --]] local disease = {} disease.id = "diag_x_ray" disease.expertise_id = 39 disease.name = _S.diseases.diag_x_ray.name disease.cure_price = 200 disease.pseudo = true disease.requires_machine = true return disease CorsixTH-0.63/CorsixTH/Lua/dialogs/000077500000000000000000000000001347163623700170275ustar00rootroot00000000000000CorsixTH-0.63/CorsixTH/Lua/dialogs/adviser.lua000066400000000000000000000211751347163623700211750ustar00rootroot00000000000000--[[ Copyright (c) 2009 Peter "Corsix" Cawley 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. --]] local TH = require("TH") --! The (ideally) helpful advisor who pops up from the bottom dialog during a game. class "UIAdviser" (Window) ---@type UIAdviser local UIAdviser = _G["UIAdviser"] function UIAdviser:UIAdviser(ui) self:Window() local app = ui.app self.esc_closes = false self.modal_class = "adviser" self.tick_rate = app.world.tick_rate self.tick_timer = self.tick_rate -- Initialize tick timer self.frame = 1 -- Current frame self.number_frames = 4 -- Used for playing animation only once self.speech = nil -- Store what adviser is going to say self.queued_messages = {} -- There might be many messages in a row self.timer = nil -- Timer which hides adviser at the end -- There are 5 phases the adviser might be in on a given time point. -- Not visible, getting up, talking, idling, getting_down. self.phase = 0 self.ui = ui self.width = 80 self.height = 74 self.x = 378 self.y = -16 self.balloon_width = 0 self.panel_sprites = app.gfx:loadSpriteTable("Data", "Panel02V", true) self.black_font = app.gfx:loadFont("QData", "Font50V") local th = TH.animation() self.th = th end -- Shows the adviser by running the "popup" animation. -- Then moves on to the next phase automatically. function UIAdviser:show() self.phase = 1 self.th:setAnimation(self.ui.app.world.anims, 438) self.frame = 1 self.number_frames = 4 end -- Displays the text bubble along with the next message -- from the queue. function UIAdviser:talk() self.phase = 2 self.th:setAnimation(self.ui.app.world.anims, 460) self.frame = 1 self.timer = nil -- Reset the idle timer self.number_frames = 45 -- Fetch the next message from the queue. local best = 1 if self.queued_messages[1].priority then for i = 1, #self.queued_messages do if best ~= i and self.queued_messages[best].priority < self.queued_messages[i].priority then best = i end end end local speech = self.queued_messages[best].speech self.stay_up = self.queued_messages[best].stay_up table.remove(self.queued_messages, best) self.speech = speech -- Calculate number of lines needed for the text. -- Each "/" at end of string indicates a blank line local number_lines = 3 local speech_trimmed = speech:gsub("/*$", "") number_lines = number_lines - (#speech - #speech_trimmed) speech = speech_trimmed -- Calculate balloon width from string length self.balloon_width = math.floor(#speech / number_lines) * 7 if self.balloon_width >= 420 then -- Balloon too large self.balloon_width = 420 elseif self.balloon_width <= 40 then -- Balloon too small self.balloon_width = 40 end end -- Makes the adviser idle for a while before disappearing. -- This means that the text bubble is removed. function UIAdviser:idle() self.phase = 3 -- Remove the bubble and start a timer for disappearance -- unless he should stay up until the next message. if not self.stay_up then self.speech = nil self.timer = 150 end end -- Hides the adviser by running the appropriate animation. function UIAdviser:hide() self.timer = nil self.phase = 4 self.th:setAnimation(self.ui.app.world.anims, 440) self.frame = 1 self.number_frames = 4 end -- Makes the adviser say something --!param speech The table containing the text he should say and the priority. --!param talk_until_next_announce Whether he should stay up -- until the next say() call is made. Useful for the tutorial. --!param override_current Cancels previous messages (if any) immediately -- and shows this new one instead. function UIAdviser:say(speech, talk_until_next_announce, override_current) assert(type(speech) == "table") if not self.ui.app.config.adviser_disabled then -- Queue the new message self.queued_messages[#self.queued_messages + 1] = { speech = speech.text, stay_up = talk_until_next_announce, priority = speech.priority } if self.phase == 0 then -- The adviser is not active at all at the moment. self:show() elseif self.phase == 3 then -- He's not talking, so we can show the new message. self:talk() elseif self.phase == 4 then -- He's getting down. Let him do that and then tell him -- to go up again. self.up_again = true elseif override_current then -- He was saying/was about to say something else. Discard those messages. while #self.queued_messages > 1 do table.remove(self.queued_messages, 2) end -- Now say the new thing instead. self:talk() end -- If none of the above apply the message is now queued and will be shown in -- due time. end end function UIAdviser:draw(canvas, x, y) Window.draw(self, canvas, x, y) x, y = x + self.x, y + self.y self.th:draw(canvas, x + 200, y) if self.phase == 2 then -- Draw ballon only in the "talk" phase. local x_left_sprite for dx = 0, self.balloon_width, 16 do x_left_sprite = x + 139 - dx self.panel_sprites:draw(canvas, 38, x_left_sprite, y - 25) end self.panel_sprites:draw(canvas, 37, x_left_sprite - 16, y - 25) self.panel_sprites:draw(canvas, 39, x + 155, y - 40) -- Draw text self.black_font:drawWrapped(canvas, self.speech, x_left_sprite - 8, y - 20, self.balloon_width + 60) end end function UIAdviser:onMouseDown(button, x, y) -- If the adviser is not up, don't do anything. if self.phase == 0 or self.phase == 4 then return Window.onMouseDown(self, button, x, y) end -- Normal operation outside the adviser bounds if x + self.balloon_width < 128 or x > 200 or y + self.y > 0 or y + self.y + 40 < 0 then if x < self.x - 200 or y < self.y - 40 or x > self.x - 200 + self.width or y > self.y + self.height - 40 then return Window.onMouseDown(self, button, x, y) end end -- Dismiss the current message if left click. If right click, -- dismiss the whole queue. if button == "left" then if #self.queued_messages > 0 then self:talk() else self:hide() end elseif button == "right" then self:hide() self.queued_messages = {} end end function UIAdviser:onTick() if self.timer == 0 then self:hide() -- Timer ends, so we hide the adviser elseif self.timer ~= nil then self.timer = self.timer - 1 end if self.frame < self.number_frames then if self.tick_timer == 0 then -- Used for making a smooth animation self.tick_timer = self.tick_rate -- If no animation set (adviser not being shown already) if self.th:getAnimation() ~= 0 then self.th:tick() self.frame = self.frame + 1 end else self.tick_timer = self.tick_timer - 1 end elseif self.frame == self.number_frames then if self.phase == 1 then -- Adviser is now up, let him speak. self:talk() elseif self.phase == 2 then -- Adviser finished to talk so make him idle unless -- there's another message waiting. if #self.queued_messages > 0 then -- Show the next queued message self:talk() elseif not self.stay_up then -- Continue to talk if stay_up is set self:idle() end elseif self.phase == 4 then -- The adviser is getting down so we want to hide him, but we have -- to wait until the animation ends. if self.up_again then -- Another message arrived while getting down. self:show() self.up_again = false else self.phase = 0 self.th:makeInvisible() end end end end function UIAdviser:afterLoad(old, new) if old < 47 then self.enabled = true end Window.afterLoad(self, old, new) end CorsixTH-0.63/CorsixTH/Lua/dialogs/bottom_panel.lua000066400000000000000000000707651347163623700222340ustar00rootroot00000000000000--[[ Copyright (c) 2009 Peter "Corsix" Cawley 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. --]] --! The multi-purpose panel for launching dialogs / screens and dynamic information. class "UIBottomPanel" (Window) ---@type UIBottomPanel local UIBottomPanel = _G["UIBottomPanel"] function UIBottomPanel:UIBottomPanel(ui) self:Window() local app = ui.app self.ui = ui self.world = app.world self.on_top = false self.width = 640 self.height = 48 self:setDefaultPosition(0.5, -0.1) self.panel_sprites = app.gfx:loadSpriteTable("Data", "Panel02V", true) self.money_font = app.gfx:loadFont("QData", "Font05V") self.date_font = app.gfx:loadFont("QData", "Font16V") self.white_font = app.gfx:loadFont("QData", "Font01V", 0, -2) self.pause_font = app.gfx:loadFont("QData", "Font124V") -- State relating to fax notification messages self.show_animation = true self.factory_counter = 22 self.factory_direction = 0 self.message_windows = {} self.message_queue = {} self.default_button_sound = "selectx.wav" self.countdown = 0 self.bank_button = self:addPanel( 1, 0, 0):makeToggleButton(6, 6, 35, 36, 2, self.dialogBankManager, nil, self.dialogBankStats):setTooltip(_S.tooltip.toolbar.bank_button) self:addPanel( 3, 40, 0) -- Background for balance, rep and date self:addPanel( 4, 206, 0):makeButton(6, 6, 35, 36, 5, self.dialogBuildRoom):setTooltip(_S.tooltip.toolbar.rooms) self:addPanel( 6, 248, 0):makeButton(1, 6, 35, 36, 7, self.dialogFurnishCorridor):setTooltip(_S.tooltip.toolbar.objects) self:addPanel( 8, 285, 0):makeButton(1, 6, 35, 36, 9, self.editRoom) :setSound():setTooltip(_S.tooltip.toolbar.edit) -- Remove default sound for this button self:addPanel(10, 322, 0):makeButton(1, 6, 35, 36, 11, self.dialogHireStaff):setTooltip(_S.tooltip.toolbar.hire) -- The dynamic info bar self:addPanel(12, 364, 0) for x = 377, 630, 10 do self:addPanel(13, x, 0) end self:addPanel(14, 627, 0) -- Buttons that are shown instead of the dynamic info bar when hovering over it. local panels = {} local buttons = {} panels[1] = self:addPanel(15, 364, 0) -- Staff management button buttons[1] = panels[1]:makeToggleButton(6, 6, 35, 36, 16, self.dialogStaffManagement):setTooltip(_S.tooltip.toolbar.staff_list) panels[2] = self:addPanel(17, 407, 0) -- Town map button buttons[2] = panels[2]:makeToggleButton(1, 6, 35, 36, 18, self.dialogTownMap):setTooltip(_S.tooltip.toolbar.town_map) panels[3] = self:addPanel(19, 445, 0) -- Casebook button buttons[3] = panels[3]:makeToggleButton(1, 6, 35, 36, 20, self.dialogDrugCasebook):setTooltip(_S.tooltip.toolbar.casebook) panels[4] = self:addPanel(21, 483, 0) -- Research button buttons[4] = panels[4]:makeToggleButton(1, 6, 35, 36, 22, self.dialogResearch) :setSound():setTooltip(_S.tooltip.toolbar.research) -- Remove default sound for this button panels[5] = self:addPanel(23, 521, 0) -- Status button buttons[5] = panels[5]:makeToggleButton(1, 6, 35, 36, 24, self.dialogStatus):setTooltip(_S.tooltip.toolbar.status) panels[6] = self:addPanel(25, 559, 0) -- Charts button buttons[6] = panels[6]:makeToggleButton(1, 6, 35, 36, 26, self.dialogCharts):setTooltip(_S.tooltip.toolbar.charts) panels[7] = self:addPanel(27, 597, 0) -- Policy button buttons[7] = panels[7]:makeToggleButton(1, 6, 35, 36, 28, self.dialogPolicy):setTooltip(_S.tooltip.toolbar.policy) for _, panel in ipairs(panels) do panel.visible = false end self.additional_panels = panels self.additional_buttons = buttons self:makeTooltip(_S.tooltip.toolbar.balance, 41, 5, 137, 28) self:makeTooltip(_S.tooltip.toolbar.date, 140, 5, 200, 42) self:makeDynamicTooltip(--[[persistable:reputation_tooltip]] function() return _S.tooltip.toolbar.reputation .. " (" .. self.ui.hospital.reputation .. ")" end, 41, 30, 137, 42) self:registerKeyHandlers() end function UIBottomPanel:registerKeyHandlers() local ui = self.ui local buttons = self.additional_buttons -- The bottom panel hotkeys. ui:addKeyHandler("ingame_panel_bankManager", self.bank_button, self.bank_button.handleClick, "left") -- bank manager ui:addKeyHandler("ingame_panel_bankStats", self.bank_button, self.bank_button.handleClick, "right") -- bank stats ui:addKeyHandler("ingame_panel_staffManage", buttons[1], buttons[1].handleClick, "left") -- staff management ui:addKeyHandler("ingame_panel_townMap", buttons[2], buttons[2].handleClick, "left") -- town map ui:addKeyHandler("ingame_panel_casebook", buttons[3], buttons[3].handleClick, "left") -- casebook ui:addKeyHandler("ingame_panel_research", buttons[4], buttons[4].handleClick, "left") -- research ui:addKeyHandler("ingame_panel_status", buttons[5], buttons[5].handleClick, "left") -- status ui:addKeyHandler("ingame_panel_charts", buttons[6], buttons[6].handleClick, "left") -- charts ui:addKeyHandler("ingame_panel_policy", buttons[7], buttons[7].handleClick, "left") -- policy -- Hotkeys for building a room, furnishing the corridor, editing a room, and hiring staff. ui:addKeyHandler("ingame_panel_buildRoom", self, self.dialogBuildRoom) -- Build room. ui:addKeyHandler("ingame_panel_furnishCorridor", self, self.dialogFurnishCorridor) -- Furnish corridor. ui:addKeyHandler("ingame_panel_editRoom", self, self.editRoom) -- Edit room. ui:addKeyHandler("ingame_panel_hireStaff", self, self.dialogHireStaff) -- Hire staff. -- Alternate keyboard shortcuts for some of the fullscreen windows. ui:addKeyHandler("ingame_panel_map_alt", buttons[2], buttons[2].handleClick, "left") -- town map ui:addKeyHandler("ingame_panel_research_alt", buttons[4], buttons[4].handleClick, "left") -- research local config = ui.app.config if not config.volume_opens_casebook then ui:addKeyHandler("ingame_panel_casebook_alt", buttons[3], buttons[3].handleClick, "left") -- casebook else ui:addKeyHandler("ingame_panel_casebook_alt02", buttons[3], buttons[3].handleClick, "left") -- casebook end ui:addKeyHandler("ingame_loadMenu", self, self.openLoad) -- load saved game menu ui:addKeyHandler("ingame_saveMenu", self, self.openSave) -- load create save menu ui:addKeyHandler("ingame_restartLevel", self, self.restart) -- restart the level ui:addKeyHandler("ingame_quitLevel", self, self.quit) -- quit the game and return to main menu ui:addKeyHandler("ingame_quickSave", self, self.quickSave) -- quick save ui:addKeyHandler("ingame_quickLoad", self, self.quickLoad) -- load last quick save -- misc. keyhandlers ui:addKeyHandler("ingame_openFirstMessage", self, self.openFirstMessage) -- message ui:addKeyHandler("ingame_toggleInfo", self, self.toggleInformation) -- information when you first build ui:addKeyHandler("ingame_jukebox", self, self.openJukebox) -- jukebox end function UIBottomPanel:openJukebox() self.ui:addWindow(UIJukebox(self.ui.app)) end function UIBottomPanel:openSave() self.ui:addWindow(UISaveGame(self.ui)) end function UIBottomPanel:openLoad() self.ui:addWindow(UILoadGame(self.ui, "game")) end function UIBottomPanel:quickSave() self.ui.app:quickSave() end function UIBottomPanel:quickLoad() self.ui.app:quickLoad() end function UIBottomPanel:restart() self.ui.app:restart() end function UIBottomPanel:quit() self.ui:quit() end function UIBottomPanel:draw(canvas, x, y) Window.draw(self, canvas, x, y) x, y = x + self.x, y + self.y self.money_font:draw(canvas, ("%7i"):format(self.ui.hospital.balance), x + 44, y + 9) local month, day = self.world:getDate() self.date_font:draw(canvas, _S.date_format.daymonth:format(day, month), x + 140, y + 20, 60, 0) -- Draw possible information in the dynamic info bar if not self.additional_panels[1].visible then self:drawDynamicInfo(canvas, x + 364, y) end if self.show_animation then if self.factory_counter >= 1 then self.panel_sprites:draw(canvas, 40, x + 177, y + 1) end if self.factory_counter > 1 and self.factory_counter <= 22 then for dx = 0, self.factory_counter do self.panel_sprites:draw(canvas, 41, x + 179 + dx, y + 1) end end if self.factory_counter == 22 then self.panel_sprites:draw(canvas, 42, x + 201, y + 1) end end self:drawReputationMeter(canvas, x + 55, y + 35) end function UIBottomPanel:setPosition(x, y) -- Lock to bottom of screen return Window.setPosition(self, x, -0.1) end -- Draws the hospital reputation meter on canvas. -- x_left is the leftmost x-coordinate of the reputation meter -- y is the y-coordinate of the reputation meter function UIBottomPanel:drawReputationMeter(canvas, x_left, y) local width = 65 -- Reputation meter width local step = width / (self.ui.hospital.reputation_max - self.ui.hospital.reputation_min) self.panel_sprites:draw(canvas, 36, x_left + math.floor(step * (self.ui.hospital.reputation - self.ui.hospital.reputation_min)), y) end function UIBottomPanel:drawDynamicInfo(canvas, x, y) if self.world:isCurrentSpeed("Pause") and not self.world.user_actions_allowed then self.pause_font:drawWrapped(canvas, _S.misc.pause, x + 10, y + 14, 255, "center") return end if not (self.dynamic_info and self.dynamic_info["text"]) then return end local info = self.dynamic_info local font = self.white_font for i, text in ipairs(info["text"]) do font:drawWrapped(canvas, text, x + 20, y + 10 * i, 240) if i == #info["text"] and info["progress"] then local white = canvas:mapRGB(255, 255, 255) local black = canvas:mapRGB(0, 0, 0) local orange = canvas:mapRGB(221, 83, 0) canvas:drawRect(white, x + 165, y + 10 * i, 100, 10) canvas:drawRect(black, x + 166, y + 1 + 10 * i, 98, 8) canvas:drawRect(orange, x + 166, y + 1 + 10 * i, math.floor(98 * info["progress"]), 8) if info["dividers"] then for _, value in ipairs(info["dividers"]) do canvas:drawRect(white, x + 165 + math.floor(value * 100), y + 10 * i, 1, 10) end end end end end --! Update the information shown in the information box on the panel. --! --! If the info is nil then a cooldown timer is used before removing the --! information from the display. --! --!param info (table) A table containing the information to display. The text --! key is required and contains an array of lines to show. An optional --! progress key may be given to draw a progress bar, following the text and --! and an array of dividers may be provided to draw extra vertical lines in --! the progress bar. --! --! info = { --! text: { "He's not the saviour", "He's very naughty boy" }, --! progress: 50, --! dividers: { 25, 50, 75 } --! } function UIBottomPanel:setDynamicInfo(info) if info and not info["text"] then self.world:gameLog("") self.world:gameLog("Dynamic info is missing text!") self.world:gameLog("Please report this issue including the call stack below.") self.world:gameLog(debug.traceback()) return end if not info then self.countdown = 25 else self.countdown = nil self.dynamic_info = info end end function UIBottomPanel:onMouseMove(x, y, dx, dy) local repaint = Window.onMouseMove(self, x, y, dx, dy) if self:showAdditionalButtons(x, y) then repaint = true end return repaint end function UIBottomPanel:showAdditionalButtons(x, y) local panels = self.additional_panels if self:hitTest(x, y) then -- Inside the panel if not panels[1].visible then -- Are the buttons already shown? for _, panel in ipairs(panels) do panel.visible = true end end else -- Outside the rectangle if panels[1].visible then -- Are the buttons already invisible? for _, panel in ipairs(panels) do panel.visible = false end end end end function UIBottomPanel:hitTest(x, y, x_offset) return x >= (x_offset and x_offset or 0) and y >= 0 and x < self.width and y < self.height end --! Queue a fax notification message to appear. --! The arguments specify a message, which is added to a FIFO queue, and will -- appear on screen once there is space. --!param type (string) The type of message, can be: "emergency", "epidemy", "personality", "information", "disease", "report" or "strike" --!param message (table or number) If type == "strike", the amount of pay rise. Else a list of texts to display, including a "choices" table with choices. See below for structure. --!param owner (humanoid or nil) Some messages are related to one staff or patient. Otherwise this is nil. --!param timeout (number or nil) If given, the message will expire after that many world ticks and be removed. --!param default_choice (number or nil) If given, the choice with this number will be executed on expiration of the message. --!param callback (function or nil) If given, it will be called when the message is closed. --! Structure of message (except strike): -- message = { -- { text = "first line of text", offset (integer, optional) } -- { text = "second line of text", offset (integer, optional) } -- ... -- choices = { -- { text = "first choice", choice = "choice_type", enabled = true or false (optional, defaults to true) } -- ... -- } -- } function UIBottomPanel:queueMessage(type, message, owner, timeout, default_choice, callback) -- Show a helpful message if there has been no messages before - only in campaign though if not self.ui.hospital.message_popup and tonumber(self.world.map.level_number) then self.world.ui.adviser:say(_A.information.fax_received) self.ui.hospital.message_popup = true end local fax = { type = type, message = message, owner = owner, timeout = timeout, default_choice = default_choice, callback = callback, } if self:canQueueFax(fax) then self.message_queue[#self.message_queue + 1] = fax -- create reference to message in owner if owner then owner.message = message end else self:cancelFax(fax.type) end end --[[ A fax can be queued if the event the fax causes does not affect an event caused by any other fax that is queued. i.e both emergency and epidemics use the timer, so both faxes cannot appear at the same time. @param fax (table) the fax we want to determine if can be queued. @return true if fax can be queued, false otherwise (boolean) ]] function UIBottomPanel:canQueueFax(fax) --[[ Determine if fax of a particular type is queued either in the message queue or the message window (ui) @param fax_type (string) the fax type to check if any queued @return true if any of fax_type is queued false otherwise (boolean) ]] local function isFaxTypeQueued(fax_type) -- Check the queued messages for _, fax_msg in ipairs(self.message_queue) do if fax_msg.type == fax_type then return true end end -- Then the messages displayed on the bottom bar for _, fax_msg in ipairs(self.message_windows) do if fax_msg.type == fax_type then return true end end return false end if fax.type == "epidemy" then if isFaxTypeQueued("emergency") then return false end elseif fax.type == "emergency" then if isFaxTypeQueued("epidemy") then return false end end return true end --[[ Cancels a fax of a particular type currently only "emergency" and "epidemy" Handles the cancelling of the event which the fax pertains to. @param fax_type (string) type of fax event to be cancelled]] function UIBottomPanel:cancelFax(fax_type) local hospital = self.ui.hospital if fax_type == "epidemy" then hospital.epidemic:clearAllInfectedPatients() hospital.epidemic = nil elseif fax_type == "emergency" then self.world:nextEmergency() end end -- Opens the last available message. Currently used to open the level completed message. function UIBottomPanel:openLastMessage() if #self.message_queue > 0 then self:createMessageWindow(#self.message_queue) table.remove(self.message_queue, #self.message_queue) end self.message_windows[#self.message_windows]:openMessage() end --! Trigger a message to be moved from the queue into a actual window, after -- first performing the necessary animation. function UIBottomPanel:showMessage() if self.factory_direction ~= -1 then self.factory_direction = -1 if self.factory_counter < 0 then -- Factory is already opened so don't wait to show the message self.show_animation = false self.factory_counter = 9 else -- Delay the appearance of the message to when the factory is opened self.factory_direction = -1 self.factory_counter = 22 self.show_animation = true end end end -- Opens the first available message in the list of message_windows. function UIBottomPanel:openFirstMessage() if #self.message_windows > 0 then self.message_windows[1]:openMessage() end end -- Removes a message from the message queue (for example if a room is built before the player -- says what to do with the patient. function UIBottomPanel:removeMessage(owner) for i, msg_info in ipairs(self.message_queue) do if msg_info.owner == owner then -- TODO: restructure message_queue to contain UIMessage objects already, so this special handling isn't required owner.message = nil table.remove(self.message_queue, i) return true end end for _, window in ipairs(self.message_windows) do if window.owner == owner then window:removeMessage() return true end end return false end --! Pop the message with the given index from the message queue and turn it into an actual -- message window; if no index is provided the first message in the queue is popped. function UIBottomPanel:createMessageWindow(index) local --[[persistable:bottom_panel_message_window_close]] function onClose(window, out_of_time) local index_to_remove for i, win in ipairs(self.message_windows) do if index_to_remove ~= nil then win:setXLimit(1 + (i - 2) * 30) elseif win == window then index_to_remove = i if win.callback then win.callback() end end end table.remove(self.message_windows, index_to_remove) end if not index then index = 1 end local message_windows = self.message_windows local message_info = self.message_queue[index] if not message_info then return end local alert_window = UIMessage(self.ui, 175, 1 + #message_windows * 30, onClose, message_info.type, message_info.message, message_info.owner, message_info.timeout, message_info.default_choice, message_info.callback) message_windows[#message_windows + 1] = alert_window self:addWindow(alert_window) self.factory_direction = 1 self.show_animation = true self.factory_counter = -50 -- Delay close of message factory table.remove(self.message_queue, index) -- Delete the last element of the queue end function UIBottomPanel:onTick() -- Advance the animation on the message factory if self.factory_direction == 1 then -- Close factory animation if self.factory_counter < 22 then self.factory_counter = self.factory_counter + 1 end elseif self.factory_direction == -1 then if #self.message_queue == 0 then -- Message was removed before we could display it. Reset. self.factory_direction = 1 self.factory_counter = 22 end -- Open factory animation if self.factory_counter >= 0 then if self.factory_counter == 0 then -- Animation ends so we can now show the message self:createMessageWindow() end self.factory_counter = self.factory_counter - 1 end end -- The dynamic info bar is there a while longer when hovering an entity has stopped if self.countdown then if self.countdown < 1 then self.dynamic_info = nil -- If there is no info to display, and the app is tracking FPS, show that local fps = self.ui.app:getFPS() if fps then self.dynamic_info = {text = { ("FPS: %i"):format(math.floor(fps + 0.5) or 0), ("Lua GC: %.1f Kb"):format(collectgarbage("count") or 0), ("Entities: %i"):format(#self.ui.app.world.entities or 0), }} self.countdown = 1 end else self.countdown = self.countdown - 1 end end -- Move an item out of the message queue if there is room if #self.message_windows < 5 and #self.message_queue > 0 then self:showMessage() end Window.onTick(self) end function UIBottomPanel:dialogBankManager(enable) self:dialogBankCommon(enable) end function UIBottomPanel:dialogBankStats(enable) self:dialogBankCommon(enable, true) end function UIBottomPanel:dialogBankCommon(enable, stats) if not self.world.user_actions_allowed then self:updateButtonStates() return end if enable then self:addDialog("UIBankManager", stats and "showStatistics") else local w = self.ui:getWindow(UIBankManager) if w then if not stats and w.showingStatistics then w:hideStatistics() elseif stats and not w.showingStatistics then w:showStatistics() else w:close() end self:updateButtonStates() end end end function UIBottomPanel:dialogBuildRoom() if self.world.user_actions_allowed then local w = self.ui:getWindow(UIBuildRoom) local fullscreen = self.ui:getWindow(UIFullscreen) if w then if fullscreen then fullscreen:close() else w:close() end else if fullscreen then fullscreen:close() end local dlg = UIBuildRoom(self.ui) self.ui:setEditRoom(false) self.ui:addWindow(dlg) self.ui:tutorialStep(3, 1, 2) end end end function UIBottomPanel:dialogFurnishCorridor() if self.world.user_actions_allowed then local w = self.ui:getWindow(UIFurnishCorridor) local fullscreen = self.ui:getWindow(UIFullscreen) if w then if fullscreen then fullscreen:close() else w:close() end else if fullscreen then fullscreen:close() end local dlg = UIFurnishCorridor(self.ui) self.ui:setEditRoom(false) self.ui:addWindow(dlg) self.ui:tutorialStep(1, 1, 2) end end end function UIBottomPanel:dialogHireStaff() if self.world.user_actions_allowed then local w = self.ui:getWindow(UIHireStaff) local fullscreen = self.ui:getWindow(UIFullscreen) if w then if fullscreen then fullscreen:close() else w:close() end else if fullscreen then fullscreen:close() end local dlg = UIHireStaff(self.ui) self.ui:setEditRoom(false) self.ui:addWindow(dlg) self.ui:tutorialStep(2, 1, 2) self.ui:tutorialStep(4, 1, 2) end end end function UIBottomPanel:dialogStaffManagement(enable) if not self.world.user_actions_allowed then self:updateButtonStates() return end if enable then self:addDialog("UIStaffManagement") else local w = self.ui:getWindow(UIStaffManagement) if w then w:close() end end end function UIBottomPanel:dialogTownMap(enable) if not self.world.user_actions_allowed then self:updateButtonStates() return end if enable then self:addDialog("UITownMap") else local w = self.ui:getWindow(UITownMap) if w then w:close() end end end function UIBottomPanel:dialogDrugCasebook(enable) if not self.world.user_actions_allowed then self:updateButtonStates() return end if enable then self:addDialog("UICasebook") else local w = self.ui:getWindow(UICasebook) if w then w:close() end end end function UIBottomPanel:dialogResearch(enable) if not self.world.user_actions_allowed then self:updateButtonStates() return end if self.ui.hospital.research_dep_built then if enable then self:addDialog("UIResearch") else local w = self.ui:getWindow(UIResearch) if w then w:close() end end self.ui:playSound("selectx.wav") else self.ui:playSound("wrong2.wav") self:updateButtonStates() self:giveResearchAdvice() end end function UIBottomPanel:giveResearchAdvice() local can_build_research = false for _, room in ipairs(self.ui.app.world.available_rooms) do if room.class == "ResearchRoom" then can_build_research = true break end end local msg = can_build_research and _A.warnings.research_screen_open_1 or _A.warnings.research_screen_open_2 self.ui.adviser:say(msg) end function UIBottomPanel:dialogStatus(enable) if not self.world.user_actions_allowed then self:updateButtonStates() return end if enable then self:addDialog("UIProgressReport") else local w = self.ui:getWindow(UIProgressReport) if w then w:close() end end end function UIBottomPanel:dialogCharts(enable) if not self.world.user_actions_allowed then self:updateButtonStates() return end if enable then self:addDialog("UIGraphs") else local w = self.ui:getWindow(UIGraphs) if w then w:close() end end end function UIBottomPanel:dialogPolicy(enable) if not self.world.user_actions_allowed then self:updateButtonStates() return end if enable then self:addDialog("UIPolicy") else local w = self.ui:getWindow(UIPolicy) if w then w:close() end end end function UIBottomPanel:toggleInformation() self.world:toggleInformation() end local fullscreen_dialogs = { "UIStaffManagement", "UITownMap", "UICasebook", "UIResearch", "UIProgressReport", "UIGraphs", "UIPolicy", } function UIBottomPanel:updateButtonStates() for i, button in ipairs(self.additional_buttons) do button:setToggleState(not not self.ui:getWindow(_G[fullscreen_dialogs[i]])) end self.bank_button:setToggleState(not not self.ui:getWindow(UIBankManager)) end function UIBottomPanel:addDialog(dialog_class, extra_function) local edit_window = self.ui:getWindow(UIEditRoom) -- If we are currently editing a room, ask for abortion before adding any dialog. if edit_window then self.ui:addWindow(UIConfirmDialog(self.ui, _S.confirmation.abort_edit_room, --[[persistable:abort_edit_room_confirm_dialog]]function() self.ui:setEditRoom(false) local dialog = _G[dialog_class](self.ui) if extra_function then _G[dialog_class][extra_function](dialog) end self.ui:addWindow(dialog) self:updateButtonStates() end )) self:updateButtonStates() else self.ui:setEditRoom(false) local dialog = _G[dialog_class](self.ui) self.ui:addWindow(dialog) if extra_function then _G[dialog_class][extra_function](dialog) end self:updateButtonStates() end end -- Do not remove, for savegame compatibility < r1878 local --[[persistable:abort_edit_room_cancel_dialog]]function stub() end function UIBottomPanel:editRoom() local ui = self.ui if ui.editing_allowed then self.ui:playSound("selectx.wav") if ui.edit_room then ui:setEditRoom(false) else ui:setEditRoom(true) end else -- no editing is allowed when other dialogs are open self.ui:playSound("wrong2.wav") end end function UIBottomPanel:afterLoad(old, new) if old < 40 then -- Find the graph dialog and enable it for _, button in ipairs(self.buttons) do if not button.on_click then button.on_click = self.dialogCharts button.enabled = true end end end if old < 58 then self.pause_font = TheApp.gfx:loadFont("QData", "Font124V") end if old < 62 then -- renamed additional_buttons to additional_panels -- additional_buttons are now the actual buttons self.additional_panels = self.additional_buttons self.additional_buttons = {} for i = 1, 7 do self.additional_buttons[i] = self.buttons[5 + i]:makeToggle() -- made them toggle buttons end self.bank_button = self.buttons[1]:makeToggle() end self:registerKeyHandlers() Window.afterLoad(self, old, new) end CorsixTH-0.63/CorsixTH/Lua/dialogs/build_room.lua000066400000000000000000000173061347163623700216740ustar00rootroot00000000000000--[[ Copyright (c) 2009 Peter "Corsix" Cawley 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. --]] local TH = require("TH") class "UIBuildRoom" (Window) ---@type UIBuildRoom local UIBuildRoom = _G["UIBuildRoom"] function UIBuildRoom:UIBuildRoom(ui) self:Window() local app = ui.app self.ui = ui self.modal_class = "main" self.esc_closes = true self.width = 297 self.height = 294 self:setDefaultPosition(0.5, 0.5) self.panel_sprites = app.gfx:loadSpriteTable("QData", "Req09V", true) self.white_font = app.gfx:loadFont("QData", "Font01V") self.blue_font = app.gfx:loadFont("QData", "Font02V") self.category_index = 0 self.list_hover_index = 0 self.preview_anim = false self.default_button_sound = "selectx.wav" local function cat(n) return --[[persistable:build_room_set_category]] function(window) return window:setCategory(n) end end local room_n = 1 local function rm() local n = room_n room_n = room_n + 1 return --[[persistable:build_room_build_room]] function(window) return window:buildRoom(n) end end self:addPanel(210, 0, 0):makeButton(9, 9, 129, 32, 211, cat(1)):setTooltip(_S.tooltip.build_room_window.room_classes.diagnosis) self:addPanel(212, 0, 41):makeButton(9, 0, 129, 31, 213, cat(2)):setTooltip(_S.tooltip.build_room_window.room_classes.treatment) -- Clinics should really be at y=73, but TH skips a pixel here -- so that the left and right columns are the same height self:addPanel(214, 0, 72):makeButton(9, 0, 129, 32, 215, cat(3)):setTooltip(_S.tooltip.build_room_window.room_classes.clinic) self:addPanel(216, 0, 104):makeButton(9, 0, 129, 32, 217, cat(4)):setTooltip(_S.tooltip.build_room_window.room_classes.facilities) self:addPanel(218, 0, 146) -- Grid top for y = 179, 249, 10 do self:addPanel(219, 0, y) -- Grid body end self:addPanel(220, 0, 259) -- Grid bottom self:addPanel(221, 146, 0) -- List top for y = 34, 205, 19 do self:addPanel(222, 146, y):makeButton(12, 0, 126, 19, 223, rm()) -- List body .enabled = false end -- The close button has no sprite for when pressed, so it has to be custom drawn local build_room_dialog_close = TheApp.gfx:loadSpriteTable("Bitmap", "aux_ui", true) self:addPanel(224, 146, 224):makeButton(8, 34, 134, 27, 224, self.close):setTooltip(_S.tooltip.build_room_window.close) .panel_for_sprite.custom_draw = --[[persistable:build_room_draw_close_button]] function(panel, canvas, x, y) x = x + panel.x y = y + panel.y panel.window.panel_sprites:draw(canvas, panel.sprite_index, x, y) local btn = panel.window.active_button if btn and btn.panel_for_sprite == panel and btn.active then build_room_dialog_close:draw(canvas, 1, x + 8, y + 34) end end self.list_title = _S.build_room_window.pick_department self.cost_box = _S.build_room_window.cost .. "0" self.list = {} self.category_titles = { _S.room_classes.diagnosis, _S.room_classes.treatment, _S.room_classes.clinics, _S.room_classes.facilities } self.category_rooms = { } for i, category in ipairs({"diagnosis", "treatment", "clinics", "facilities"}) do local rooms = {} self.category_rooms[i] = rooms for _, room in ipairs(app.world.available_rooms) do -- NB: Unimplemented rooms are hidden unless in debug mode if (app.config.debug or room.class) and room.categories[category] and ui.hospital.discovered_rooms[room] then rooms[#rooms + 1] = room end end table.sort(rooms, function(r1, r2) return r1.categories[category] < r2.categories[category] end) end self:makeTooltip(_S.tooltip.build_room_window.cost, 160, 228, 282, 242) end local cat_label_y = {21, 53, 84, 116} function UIBuildRoom:draw(canvas, x, y) Window.draw(self, canvas, x, y) x, y = self.x + x, self.y + y self.white_font:draw(canvas, self.list_title, x + 163, y + 18) for i = 1, 4 do (i == self.category_index and self.blue_font or self.white_font) :draw(canvas, self.category_titles[i], x + 19, y + cat_label_y[i]) end for i, room in ipairs(self.list) do (i == self.list_hover_index and self.blue_font or self.white_font) :draw(canvas, room.name, x + 163, y + 21 + i * 19) end self.white_font:draw(canvas, self.cost_box, x + 163, y + 232) if self.preview_anim then self.preview_anim:draw(canvas, x + 70, y + 200) end end function UIBuildRoom:setCategory(index) if index == 1 then self.ui:tutorialStep(3, 2, 3) else self.ui:tutorialStep(3, 3, 2) end self.category_index = index self.list_title = _S.build_room_window.pick_room_type self.list = self.category_rooms[index] local last = #self.list + 5 for i = 5, 14 do self.buttons[i].enabled = i < last if i < last then self.buttons[i]:setTooltip(self.list[i - 4].tooltip) else self.buttons[i]:setTooltip() end end end function UIBuildRoom:buildRoom(index) local hosp = self.ui.hospital local world = self.ui.app.world if index == 1 then self.ui:tutorialStep(3, 3, 4) end local cost = world.free_build_mode and 0 or hosp.research.research_progress[self.list[index]].build_cost if world.free_build_mode or hosp.balance >= cost then -- Close any full screen window currently open. local fullscreen = self.ui:getWindow(UIFullscreen) if fullscreen then fullscreen:close() end local edit_dlg = UIEditRoom(self.ui, self.list[index]) self.ui:addWindow(edit_dlg) else -- give visual warning that player doesn't have enough $ to build self.ui.adviser:say(_A.warnings.money_very_low_take_loan, false, true) self.ui:playSound("Wrong2.wav") end end function UIBuildRoom:onMouseMove(x, y, dx, dy) local repaint = Window.onMouseMove(self, x, y, dx, dy) local hover_idx = 0 if 156 <= x and x < 287 and 31 <= y and y < 226 then for i = 5, 14 do local btn = self.buttons[i] if btn.enabled and btn.x <= x and x < btn.r and btn.y <= y and y < btn.b then hover_idx = i - 4 break end end end if hover_idx ~= self.list_hover_index then self.ui:playSound("HLightP2.wav") if hover_idx == 0 then self.cost_box = _S.build_room_window.cost .. "0" self.preview_anim = false else local hosp = self.ui.hospital local world = self.ui.app.world local cost = world.free_build_mode and 0 or hosp.research.research_progress[self.list[hover_idx]].build_cost self.cost_box = _S.build_room_window.cost .. cost self.preview_anim = TH.animation() self.preview_anim:setAnimation(self.ui.app.anims, self.list[hover_idx].build_preview_animation) end self.list_hover_index = hover_idx repaint = true end return repaint end function UIBuildRoom:close() self.ui:tutorialStep(3, {2, 3}, 1) return Window.close(self) end CorsixTH-0.63/CorsixTH/Lua/dialogs/confirm_dialog.lua000066400000000000000000000071451347163623700225150ustar00rootroot00000000000000--[[ Copyright (c) 2009 Peter "Corsix" Cawley 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. --]] --! Dialog for "Are you sure you want to quit?" and similar yes/no questions. class "UIConfirmDialog" (Window) ---@type UIConfirmDialog local UIConfirmDialog = _G["UIConfirmDialog"] function UIConfirmDialog:UIConfirmDialog(ui, text, callback_ok, callback_cancel) self:Window() local app = ui.app self.modal_class = "information" self.esc_closes = true self.on_top = true self.ui = ui self.width = 183 self.height = 199 self:setDefaultPosition(0.5, 0.5) self.panel_sprites = app.gfx:loadSpriteTable("QData", "Req04V", true) self.white_font = app.gfx:loadFont("QData", "Font01V") self.text = text self.callback_ok = callback_ok -- Callback function to launch if user chooses ok self.callback_cancel = callback_cancel -- Callback function to launch if user chooses cancel -- Check how "high" the dialog must be local w, h = self.white_font:sizeOf(text) self:addPanel(357, 0, 0) -- Dialog header local last_y = 22 -- Rough estimate of how many rows it will be when drawn. for y = 22, h * (w / 160) * 1.4, 11 do -- Previous value: 136 self:addPanel(358, 0, y) -- Dialog background self.height = self.height + 11 last_y = last_y + 11 end self:addPanel(359, 0, last_y) -- Dialog footer self:addPanel(360, 0, last_y + 10):makeButton(8, 10, 82, 34, 361, self.cancel) :setTooltip(_S.tooltip.window_general.cancel):setSound"No4.wav" self:addPanel(362, 90, last_y + 10):makeButton(0, 10, 82, 34, 363, self.ok) :setTooltip(_S.tooltip.window_general.confirm):setSound"YesX.wav" self:registerKeyHandlers() end function UIConfirmDialog:registerKeyHandlers() self:addKeyHandler("global_confirm", self.ok) self:addKeyHandler("global_confirm_alt", self.ok) end function UIConfirmDialog:cancel() self:close(false) end function UIConfirmDialog:ok() self:close(true) end --! Closes the confirm dialog --!param ok (boolean or nil) whether to call the confirm callback (true) or cancel callback (false/nil) function UIConfirmDialog:close(ok) -- NB: Window is closed before executing the callback in order to not save the confirmation dialog in a savegame Window.close(self) if ok then if self.callback_ok then self.callback_ok() end else if self.callback_cancel then self.callback_cancel() end end end function UIConfirmDialog:draw(canvas, x, y) Window.draw(self, canvas, x, y) x, y = x + self.x, y + self.y self.white_font:drawWrapped(canvas, self.text, x + 17, y + 17, 153) end function UIConfirmDialog:afterLoad(old, new) Window.afterLoad(self, old, new) self:registerKeyHandlers() end CorsixTH-0.63/CorsixTH/Lua/dialogs/edit_room.lua000066400000000000000000001463721347163623700215300ustar00rootroot00000000000000--[[ Copyright (c) 2009 Peter "Corsix" Cawley 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. --]] corsixth.require("dialogs.place_objects") class "UIEditRoom" (UIPlaceObjects) ---@type UIEditRoom local UIEditRoom = _G["UIEditRoom"] function UIEditRoom:UIEditRoom(ui, room_type) -- NB: UIEditRoom:onCursorWorldPositionChange is called by the UIPlaceObjects -- constructor, hence the initialisation of required fields prior to the call. self.UIPlaceObjects(self, ui) local app = ui.app local blue_red_swap = self.anims.Alt32_BlueRedSwap -- Set alt palette on wall blueprint to make it red self.anims:setAnimationGhostPalette(124, app.gfx:loadGhost("QData", "Ghost1.dat", 6), blue_red_swap) -- Set on door and window blueprints too self.anims:setAnimationGhostPalette(126, app.gfx:loadGhost("QData", "Ghost1.dat", 6), blue_red_swap) self.anims:setAnimationGhostPalette(130, app.gfx:loadGhost("QData", "Ghost1.dat", 6), blue_red_swap) self.cell_outline = TheApp.gfx:loadSpriteTable("Bitmap", "aux_ui", true) if not room_type.room_info then self.blueprint_rect = { x = 1, y = 1, w = 0, h = 0, } if room_type.swing_doors then self.blueprint_door = {anim = {}, old_anim = {}, old_flags = {}} else self.blueprint_door = {} end self.phase = "walls" --> "door" --> "windows" --> "clear_area" --> "objects" --> "closed" self.room_type = room_type self.title_text = room_type.name self.desc_text = _S.place_objects_window.drag_blueprint else self.phase = "objects" self.room_type = room_type.room_info self.title_text = room_type.room_info.name self.room = room_type self.desc_text = _S.place_objects_window.confirm_or_buy_objects self.paid = true self.blueprint_rect = { x = room_type.x, y = room_type.y, w = room_type.width, h = room_type.height, } if room_type.room_info.swing_doors then self.blueprint_door = {anim = {}, old_anim = {}, old_flags = {}} else self.blueprint_door = {} end self.ui:setWorldHitTest(self.room) self.pickup_button:enable(true) self.purchase_button:enable(true) self:checkEnableConfirm() end self.blueprint_wall_anims = { } self.blueprint_window = { } self.mouse_down_x = false self.mouse_down_y = false self.mouse_cell_x = 0 self.mouse_cell_y = 0 self:registerKeyHandlers() end function UIEditRoom:registerKeyHandlers() self:addKeyHandler("global_confirm", self.confirm) -- UIPlaceObjects does not need this self:addKeyHandler("global_confirm_alt", self.confirm) end function UIEditRoom:close(...) if self.phase == "objects" and self.confirm_button.enabled then if not self.closed_cleanly then self:confirm(true) end else while self.phase ~= "walls" do self:cancel() end end for k, obj in pairs(self.blueprint_wall_anims) do if obj.setTile then obj:setTile(nil) else for _, anim in pairs(obj) do anim:setTile(nil) end end self.blueprint_wall_anims[k] = nil end self.phase = "closed" -- No longer editing a room self.ui.edit_room = false self:setBlueprintRect(1, 1, 0, 0) self.ui:tutorialStep(3, {4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15}, 1) -- not all of these links may be needed, but to be safe... return UIPlaceObjects.close(self, ...) end --[[ Called when building/editing of the room is about to stop because another dialog is being opened. If the room is in the objects phase and all required objects have been placed it will be completed. Otherwise it is cancelled instead. --]] function UIEditRoom:verifyOrAbortRoom() if self.phase == "objects" and self.confirm_button.enabled then -- The room can be finished self:close() else -- The room will have to be cancelled self:abortRoom() end end function UIEditRoom:abortRoom() if self.paid then -- Return half the cost. local progress = self.ui.hospital.research.research_progress local cost = math.floor(progress[self.room.room_info].build_cost/2) -- TODO: Return also the cost for additional objects. -- Decrease the hospital value by the whole room build cost local valueChange = progress[self.room.room_info].build_cost for obj, num in pairs(self.room.room_info.objects_needed) do -- Get how much this item costs. local obj_cost = self.ui.hospital:getObjectBuildCost(obj) cost = cost - math.floor(obj_cost)/2 valueChange = valueChange - num * obj_cost end self.ui.hospital:receiveMoney(cost, _S.transactions.sell_object, valueChange) end -- Close the dialog self:close() -- Finally remove the room from the world (close() needs the reference) if self.room then self.room:deactivate() -- TODO: may be superfluous since already called in Room:tryToEdit self.world.rooms[self.room.id] = nil end end function UIEditRoom:cancel() if self.confirm_dialog_open then -- Don't do anything as long as the confirm dialog is open. return end if self.phase == "walls" then if self.paid then -- While the confirmation window is open, don't allow the player to click the confirm button. self.confirm_button:enable(false) self.confirm_dialog_open = true -- Ask if the user really wish to sell this room self.ui:addWindow(UIConfirmDialog(self.ui, _S.confirmation.delete_room, --[[persistable:delete_room_confirm_dialog]]function() self:abortRoom() end, --[[persistable:delete_room_confirm_dialog_cancel]]function() self.confirm_button:enable(true) self.confirm_dialog_open = nil end )) else self:close() end self.ui:setCursor(self.ui.default_cursor) elseif self.phase == "objects" then self:stopPickupItems() self:returnToDoorPhase() self.world:resetSideObjects() else if self.phase == "clear_area" then self.ui:setDefaultCursor(nil) self.check_for_clear_area_timer = nil self.humanoids_to_watch = nil end self.phase = "walls" self:returnToWallPhase() end end function UIEditRoom:confirm(force) -- double check if confirm is allowed (for being called e.g. by hotkey) if not force and not self.confirm_button.enabled then return end self:stopPickupItems() if self.phase == "walls" then self.mouse_down_x = false self.mouse_down_y = false self.move_rect_x = false self.move_rect_y = false self.phase = "door" self:enterDoorPhase() elseif self.phase == "door" then self.phase = "windows" self:enterWindowsPhase() elseif self.phase == "windows" then self.phase = "clear_area" self:clearArea() elseif self.phase == "clear_area" then self.ui:setDefaultCursor(nil) self.phase = "objects" self:finishRoom() self.world:resetSideObjects() self:enterObjectsPhase() else -- Pay for room (subtract cost of needed objects, which were already paid for) if not self.paid then local progress = self.ui.hospital.research.research_progress local cost = progress[self.room.room_info].build_cost for obj, num in pairs(self.room.room_info.objects_needed) do -- Get how much this item costs. local obj_cost = self.ui.hospital:getObjectBuildCost(obj) cost = cost - num * obj_cost end self.ui.hospital:spendMoney(cost, _S.transactions.build_room .. ": " .. self.title_text, cost) self.paid = true end self.world:markRoomAsBuilt(self.room) self.closed_cleanly = true -- If information dialogs are disabled, go ahead. if self.ui:getWindow(UIInformation) then self.ui:tutorialStep(3, 15, 16) else self.ui:tutorialStep(3, 15, "next") end self:close() end end local function isHumanoidObscuringArea(humanoid, x1, x2, y1, y2) if humanoid.tile_x then if x1 <= humanoid.tile_x and humanoid.tile_x <= x2 and y1 <= humanoid.tile_y and humanoid.tile_y <= y2 then if (x1 == humanoid.tile_x or x2 == humanoid.tile_x) or (y1 == humanoid.tile_y or y2 == humanoid.tile_y) then -- Humanoid not in the rectangle, but might be walking into it local action = humanoid:getCurrentAction() if action.name ~= "walk" then return false end if action.path_x then -- in a (rare) special case, path_x is nil (see action_walk_start) local next_x = action.path_x[action.path_index] local next_y = action.path_y[action.path_index] if x1 >= next_x or next_x >= x2 or y1 >= next_y or next_y >= y2 then return false end end end return true end end return false end function UIEditRoom:clearArea() self.confirm_button:enable(false) local rect = self.blueprint_rect local world = self.ui.app.world world:clearCaches() -- To invalidate idle tiles in case we need to move people local humanoids_to_watch = setmetatable({}, {__mode = "k"}) do local x1 = rect.x - 1 local x2 = rect.x + rect.w local y1 = rect.y - 1 local y2 = rect.y + rect.h for _, entity in ipairs(world.entities) do if class.is(entity, Humanoid) and isHumanoidObscuringArea(entity, x1, x2, y1, y2) then humanoids_to_watch[entity] = true -- Try to make the humanoid leave the area local current_action = entity:getCurrentAction() local meander = entity.action_queue[2] if meander and meander.name == "meander" then -- Interrupt the idle or walk, which will cause a new meander target -- to be chosen, which will be outside the blueprint rectangle meander.can_idle = false local on_interrupt = current_action.on_interrupt if on_interrupt then current_action.on_interrupt = nil on_interrupt(current_action, entity) end elseif current_action.name == "seek_room" or (meander and meander.name == "seek_room") then -- Make sure that the humanoid doesn't stand idle waiting within the blueprint if current_action.name == "seek_room" then entity:queueAction(MeanderAction():setCount(1):setMustHappen(true), 0) else meander.done_walk = false end else -- Look for a queue action and re-arrange the people in it, which -- should cause anyone queueing within the blueprint to move for _, action in ipairs(entity.action_queue) do if action.name == "queue" then for _, humanoid in ipairs(action.queue) do local callbacks = action.queue.callbacks[humanoid] if callbacks then callbacks:onChangeQueuePosition(humanoid) end end break end end -- TODO: Consider any other actions which might be causing the -- humanoid to be staying within the rectangle for a long time. end end end end if next(humanoids_to_watch) == nil then -- No humanoids within the area, so continue with the room placement self:confirm(true) return end self.check_for_clear_area_timer = 10 self.humanoids_to_watch = humanoids_to_watch self.ui:setCursor(self.ui.waiting_cursor) end function UIEditRoom:onTick() UIFurnishCorridor.onTick(self) if self.check_for_clear_area_timer then self.check_for_clear_area_timer = self.check_for_clear_area_timer - 1 if self.check_for_clear_area_timer == 0 then local rect = self.blueprint_rect local x1 = rect.x - 1 local x2 = rect.x + rect.w local y1 = rect.y - 1 local y2 = rect.y + rect.h for humanoid in pairs(self.humanoids_to_watch) do -- The person might be dying (this check should probably be moved into -- isHumanoidObscuringArea, but I don't want to change too much right -- before a release). if humanoid:getCurrentAction().name == "die" then if not humanoid.hospital then self.humanoids_to_watch[humanoid] = nil end elseif not isHumanoidObscuringArea(humanoid, x1, x2, y1, y2) then self.humanoids_to_watch[humanoid] = nil end end if next(self.humanoids_to_watch) then self.check_for_clear_area_timer = 10 else self.check_for_clear_area_timer = nil self.humanoids_to_watch = nil self:confirm(true) end end end end function UIEditRoom:finishRoom() local room_type = self.room_type local wall_type = self.ui.app.walls[room_type.wall_type] local world = self.ui.app.world local map = self.ui.app.map.th local rect = self.blueprint_rect local door, door2 -- Add the transparency flag if it is set. local flag = 0 if self.ui.transparent_walls then flag = 1024 end local function check_external_window(x, y, layer) -- If a wall is built which is normal to an external window, then said -- window needs to be removed, otherwise it looks odd (see issue #59). local block = map:getCell(x, y, layer) local dir = world:getWallDirFromBlockId(block) local tiles = self.ui.app.walls.external[world:getWallSetFromBlockId(block)] if dir == "north_window_1" then if x ~= rect.x then map:setCell(x, y, layer, flag + tiles.north) if map:getCell(x + 1, y, layer) ~= 0 then map:setCell(x + 1, y, layer, flag + tiles.north) end end elseif dir == "north_window_2" then if x == rect.x then if map:getCell(x - 1, y, layer) ~= 0 then map:setCell(x - 1, y, layer, flag + tiles.north) end map:setCell(x, y, layer, flag + tiles.north) end elseif dir == "west_window_1" then if y == rect.y then map:setCell(x, y, layer, flag + tiles.west) if map:getCell(x, y - 1, layer) ~= 0 then map:setCell(x, y - 1, layer, flag + tiles.west) end end elseif dir == "west_window_2" then if y ~= rect.y then if map:getCell(x, y + 1, layer) ~= 0 then map:setCell(x, y + 1, layer, flag + tiles.west) end map:setCell(x, y, layer, flag + tiles.west) end end end for x, obj in pairs(self.blueprint_wall_anims) do for y, anim in pairs(obj) do if x == rect.x and y == rect.y then local _, east, north = map:getCell(x, y) if world:getWallIdFromBlockId(east) == "external" then check_external_window(x, y, 2) elseif world:getWallSetFromBlockId(east) == "window_tiles" then map:setCell(x, y, 2, flag + wall_type.window_tiles.north) else map:setCell(x, y, 2, flag + wall_type.inside_tiles.north) end if world:getWallIdFromBlockId(north) == "external" then check_external_window(x, y, 3) elseif world:getWallSetFromBlockId(north) == "window_tiles" then map:setCell(x, y, 3, flag + wall_type.window_tiles.west) else map:setCell(x, y, 3, flag + wall_type.inside_tiles.west) end else repeat local tiles = "outside_tiles" local tag = anim:getTag() if tag == "nothing" or tag == "swing_slave" then tiles = "swing_outside_tiles" end local dir = (anim:getFlag() % 2 == 1) and "west" or "north" local layer = dir == "north" and 2 or 3 if world:getWallIdFromBlockId(map:getCell(x, y, layer)) == "external" then if layer == 2 then if (x == rect.x or x == rect.x + rect.w - 1) and (y == rect.y or y == rect.y + rect.h) then check_external_window(x, y, 2) end else if (x == rect.x or x == rect.x + rect.w) and (y == rect.y or y == rect.y + rect.h - 1) then check_external_window(x, y, 3) end end break end local existing = world:getWallSetFromBlockId(map:getCell(x, y, layer)) if rect.x <= x and x < rect.x + rect.w and rect.y <= y and y < rect.y + rect.h then if tag == "nothing" or tag == "swing_slave" then tiles = "swing_inside_tiles" else tiles = "inside_tiles" end elseif existing then break end if tag == "window" or existing == "window_tiles" then tiles = "window_tiles" end local suffixes = {"_left", "_right"} local num = dir == "north" and 1 or 0 if tag == "door" then door = world:newObject("door", x, y, dir) elseif tag == "swing_master" then door = world:newObject("swing_door_right", x, y, dir) elseif tag == "swing_slave" then door2 = world:newObject("swing_door_left", x, y, dir) map:setCell(x, y, layer, flag + wall_type[tiles][dir .. suffixes[2 - num]]) elseif tag == "nothing" then map:setCell(x, y, layer, flag + wall_type[tiles][dir .. suffixes[num + 1]]) else map:setCell(x, y, layer, flag + wall_type[tiles][dir]) end until true end anim:setTile(nil) end self.blueprint_wall_anims[x] = nil end -- If there is already a room, e.g. it is being moved, don't make a new one. if self.room then self.room:initRoom(rect.x, rect.y, rect.w, rect.h, door, door2) else self.room = self.world:newRoom(rect.x, rect.y, rect.w, rect.h, room_type, door, door2) end end function UIEditRoom:purchaseItems() self.visible = false self.place_objects = false self:stopPickupItems() local cfg_objects = self.world.map.level_config.objects local research = self.ui.hospital.research local object_list = {} -- transform set to list for i, o in ipairs(self.room.room_info.objects_additional) do -- Don't show the object if it hasn't been researched yet. local object = TheApp.objects[o] local avail = cfg_objects[object.thob].AvailableForLevel if avail == 1 and (not research.research_progress[object] or research.research_progress[object].discovered) then -- look up current quantity local cur_qty = 0 for _, p in ipairs(self.objects) do if p.object.id == o then cur_qty = p.qty end end -- look up minimum quantity (required objects list) local min_qty = self.room.room_info.objects_needed[o] or 0 -- subtract number of objects in room from minimum quantity for obj, _ in pairs(self.room.objects) do if min_qty == 0 then break end if obj.object_type.id == o then min_qty = min_qty - 1 end end object_list[i] = { object = TheApp.objects[o], qty = cur_qty, min_qty = min_qty } end end self.ui:addWindow(UIFurnishCorridor(self.ui, object_list, self)) end -- callback for item pick up button function UIEditRoom:pickupItems() if self.in_pickup_mode then self:stopPickupItems() else self.in_pickup_mode = true self.ui:setCursor(self.ui.grab_cursor) self.place_objects = false self.active_index = 0 self.object_cell_x = nil self.object_cell_y = nil self:clearBlueprint() end end function UIEditRoom:stopPickupItems() if self.in_pickup_mode then self.in_pickup_mode = false self.ui:setCursor(self.ui.default_cursor) self.pickup_button:setToggleState(false) end end function UIEditRoom:returnToWallPhase(early) self.ui:tutorialStep(3, {9, 10, 11, 12}, 4) if not early then self.desc_text = _S.place_objects_window.drag_blueprint self.confirm_button:enable(true) for k, obj in pairs(self.blueprint_wall_anims) do for _, anim in pairs(obj) do anim:setTile(nil) end self.blueprint_wall_anims[k] = nil end end local rect = self.blueprint_rect local x, y, w, h = rect.x, rect.y, rect.w, rect.h self:setBlueprintRect(1, 1, 0, 0) self:setBlueprintRect(x, y, w, h) if self.room_type.swing_doors then self.blueprint_door = {anim = {}, old_anim = {}, old_flags = {}} else self.blueprint_door = {} end end function UIEditRoom:returnToDoorPhase() self.ui:tutorialStep(3, {13, 14, 15}, 9) local map = self.ui.app.map.th local room = self.room room.built = false if room.door and room.door.queue then room.door.queue:rerouteAllPatients(SeekRoomAction(room.room_info.id)) end self.purchase_button:enable(false) self.pickup_button:enable(false) -- Remove any placed objects (add them to list again) for x = room.x, room.x + room.width - 1 do for y = room.y, room.y + room.height - 1 do while true do local obj = self.world:getObject(x, y) if not obj or obj == room.door or class.is(obj, SwingDoor) then break end if obj.object_type.id == "litter" then -- Silently remove litter from the world. obj:remove() break end local obj_state = obj:getState() self.world:destroyEntity(obj) if not obj.master then self:addObjects({{ object = TheApp.objects[obj.object_type.id], state = obj_state, qty = 1 }}) end end end end self.world:destroyEntity(self.room.door) if self.room.door2 then self.world:destroyEntity(self.room.door2) end -- backup list of objects self.objects_backup = {} for k, o in pairs(self.objects) do self.objects_backup[k] = { object = o.object, qty = o.qty, state = o.state } end UIPlaceObjects.removeAllObjects(self, true) -- Remove walls local function remove_wall_line(x, y, step_x, step_y, n_steps, layer, neigh_x, neigh_y) for _ = 1, n_steps do local existing = map:getCell(x, y, layer) -- Possibly add transparency. local flag = 0 if self.ui.transparent_walls then flag = 1024 end if self.world:getWallIdFromBlockId(existing) ~= "external" then local neighbour = self.world:getRoom(x + neigh_x, y + neigh_y) if neighbour then if neigh_x ~= 0 or neigh_y ~= 0 then local set = self.world:getWallSetFromBlockId(existing) local dir = self.world:getWallDirFromBlockId(existing) if set == "inside_tiles" then set = "outside_tiles" end map:setCell(x, y, layer, flag + self.world.wall_types[neighbour.room_info.wall_type][set][dir]) end else map:setCell(x, y, layer, flag) end end x = x + step_x y = y + step_y end end remove_wall_line(room.x, room.y, 0, 1, room.height, 3, -1, 0) remove_wall_line(room.x, room.y, 1, 0, room.width , 2, 0, -1) remove_wall_line(room.x + room.width, room.y , 0, 1, room.height, 3, 0, 0) remove_wall_line(room.x, room.y + room.height, 1, 0, room.width , 2, 0, 0) -- Reset floor tiles and flags self.world.map.th:unmarkRoom(room.x, room.y, room.width, room.height) -- Re-create blueprint local rect = self.blueprint_rect local old_w, old_h = rect.w, rect.h rect.w = 0 rect.h = 0 self:setBlueprintRect(rect.x, rect.y, old_w, old_h) -- We've gone all the way back to wall phase, so step forward to door phase self.phase = "door" self:enterDoorPhase() end function UIEditRoom:screenToWall(x, y) local cellx, celly = self.ui:ScreenToWorld(x, y) cellx = math.floor(cellx) celly = math.floor(celly) local rect = self.blueprint_rect if cellx == rect.x or cellx == rect.x - 1 or cellx == rect.x + rect.w or cellx == rect.x + rect.w - 1 or celly == rect.y or celly == rect.y - 1 or celly == rect.y + rect.h or celly == rect.y + rect.h - 1 then else return end -- NB: Doors and windows cannot be placed on corner tiles, hence walls of corner tiles -- are never returned, and the nearest non-corner wall is returned instead. If they -- could be placed on corner tiles, then you would have to consider the interaction of -- wall shadows with windows and doors, amonst other things. -- Swing doors are allowed to be adjacent everywhere except the top corner. local modifier = 0 local swinging = false if self.room_type.swing_doors and self.phase == "door" then modifier = 1 swinging = true end if cellx == rect.x and celly == rect.y then -- top corner local x_, _ = self.ui:WorldToScreen(cellx, celly) if x >= x_ then -- correctly reflects (at least origin version) of TH. -- Swing doors in top corner to the east, actually skip another tile if swinging then return cellx + 2 + modifier, celly, "north" else return cellx + 1 + modifier, celly, "north" end else return cellx, celly + 1 + modifier, "west" end elseif cellx == rect.x + rect.w - 1 and celly == rect.y + rect.h - 1 then -- bottom corner local x_, _ = self.ui:WorldToScreen(cellx, celly) if x >= x_ then return cellx, celly - 1, "east" else return cellx - 1, celly, "south" end elseif cellx == rect.x and celly == rect.y + rect.h - 1 then -- left corner local _, y_ = self.ui:WorldToScreen(cellx, celly) if y >= y_ + 16 then if swinging and cellx <= rect.x + 2 then return cellx + 1 + modifier, celly, "south" else return cellx + 1, celly, "south" end else return cellx, celly - 1, "west" end elseif cellx == rect.x + rect.w - 1 and celly == rect.y then -- right corner local _, y_ = self.ui:WorldToScreen(cellx, celly) if y >= y_ + 16 then if swinging and celly <= rect.y + 2 then return cellx, celly + 1 + modifier, "east" else return cellx, celly + 1, "east" end else return cellx - 1, celly, "north" end elseif (cellx == rect.x - 1 or cellx == rect.x) and rect.y <= celly and celly < rect.y + rect.h then -- west edge if celly == rect.y then celly = rect.y + 1 elseif celly == rect.y + rect.h - 1 then celly = rect.y + rect.h - 2 end if swinging and celly <= rect.y + 1 then celly = celly + 1 end return rect.x, celly, "west" elseif (celly == rect.y - 1 or celly == rect.y) and rect.x <= cellx and cellx < rect.x + rect.w then -- north edge -- correctly reflects (at least origin version) of TH. -- Swing doors in top corner to the east, actually skip another tile if swinging and cellx <= rect.x + 2 then cellx = rect.x + 3 elseif cellx == rect.x then cellx = rect.x + 1 + modifier elseif cellx == rect.x + rect.w - 1 then cellx = rect.x + rect.w - 2 end return cellx, rect.y, "north" elseif (cellx == rect.x + rect.w or cellx == rect.x + rect.w - 1) and rect.y <= celly and celly < rect.y + rect.h then -- east edge if swinging and celly <= rect.y + 1 then celly = rect.y + 2 elseif celly == rect.y then celly = rect.y + 1 elseif celly == rect.y + rect.h - 1 then celly = rect.y + rect.h - 2 end return rect.x + rect.w - 1, celly, "east" elseif (celly == rect.y + rect.h or celly == rect.y + rect.h - 1) and rect.x <= cellx and cellx < rect.x + rect.w then -- south edge if swinging and cellx <= rect.x + 1 then cellx = rect.x + 2 elseif cellx == rect.x then cellx = rect.x + 1 elseif cellx == rect.x + rect.w - 1 then cellx = rect.x + rect.w - 2 end return cellx, rect.y + rect.h - 1, "south" end end -- Function to check if the tiles adjacent to the room are still reachable from each other. -- NB: the passable flags of the room have to be set to false already before calling this function function UIEditRoom:checkReachability() local map = self.ui.app.map.th local world = self.ui.app.world local rect = self.blueprint_rect local prev_x, prev_y local x, y = rect.x, rect.y - 1 local flags = {} local function check(flag) if map:getCellFlags(x, y, flags).passable and flags[flag] then if prev_x and not world:getPathDistance(prev_x, prev_y, x, y) then return false end prev_x, prev_y = x, y end return true end while x < rect.x + rect.w do if not check("travelSouth") then return false end x = x + 1 end y = y + 1 while y < rect.y + rect.h do if not check("travelWest") then return false end y = y + 1 end x = x - 1 while x >= rect.x do if not check("travelNorth") then return false end x = x - 1 end y = y - 1 while y >= rect.y do if not check("travelEast") then return false end y = y - 1 end return true end function UIEditRoom:enterDoorPhase() self.ui:tutorialStep(3, 8, 9) -- make tiles impassable for y = self.blueprint_rect.y, self.blueprint_rect.y + self.blueprint_rect.h - 1 do for x = self.blueprint_rect.x, self.blueprint_rect.x + self.blueprint_rect.w - 1 do self.ui.app.map:setCellFlags(x, y, {passable = false}) end end -- check if all adjacent tiles of the rooms are still connected if not self:checkReachability() then -- undo passable flags and go back to walls phase self.phase = "walls" self:returnToWallPhase(true) self.ui:playSound("wrong2.wav") self.ui.adviser:say(_A.room_forbidden_non_reachable_parts) return end self.desc_text = _S.place_objects_window.place_door self.confirm_button:enable(false) -- Confirmation is via placing door -- Change the floor tiles to opaque blue local map = self.ui.app.map.th for y = self.blueprint_rect.y, self.blueprint_rect.y + self.blueprint_rect.h - 1 do for x = self.blueprint_rect.x, self.blueprint_rect.x + self.blueprint_rect.w - 1 do map:setCell(x, y, 4, 24) end end -- Re-organise wall anims to index by x and y local walls = {} for _, wall in ipairs(self.blueprint_wall_anims) do local _, x, y = wall:getTile() if not walls[x] then walls[x] = {} end walls[x][y] = wall end self.blueprint_wall_anims = walls end function UIEditRoom:enterWindowsPhase() self.ui:tutorialStep(3, {9, 10}, 11) self.desc_text = _S.place_objects_window.place_windows self.confirm_button:enable(true) end function UIEditRoom:enterObjectsPhase() self.ui:setCursor(self.ui.default_cursor) self.ui:tutorialStep(3, {11, 12}, 13) self.ui:setWorldHitTest(self.room) local confirm = self:checkEnableConfirm() if #self.room.room_info.objects_additional == 0 and confirm then self:confirm(true) return end self.desc_text = _S.place_objects_window.confirm_or_buy_objects if #self.room.room_info.objects_additional > 0 then self.purchase_button:enable(true) end self.pickup_button:enable(true) if self.objects_backup then self:addObjects(self.objects_backup, true) else local room_objects = self.room.room_info.objects_needed if TheApp.config.enable_avg_contents then room_objects = self:computeAverageContents() end local object_list = {} -- transform set to list for o, num in pairs(room_objects) do if num > 0 then object_list[#object_list + 1] = { object = TheApp.objects[o], qty = num } end end self:addObjects(object_list, true) end end -- Decide contents of the new room based on average content of previous built rooms -- of the same type. function UIEditRoom:computeAverageContents() local average_objects = {} -- what does the average room of this type contain? local room_count = 0 for _, room in pairs(self.world.rooms) do if room and room.built and not room.crashed and room.hospital == self.ui.hospital and room.room_info == self.room_type then room_count = room_count + 1 for obj, _ in pairs(room.objects) do average_objects[obj.object_type.id] = (average_objects[obj.object_type.id] or 0) + 1 end end end -- Ensure room contents is within the boundaries of objects_needed and objects_additional. local objects_needed = self.room.room_info.objects_needed local additional_objects = {} -- Reversed mapping for _, obj in pairs(self.room.room_info.objects_additional) do additional_objects[obj] = 1 end for id, count in pairs(average_objects) do count = math.floor(count / room_count + 0.5) if additional_objects[id] == nil and objects_needed[id] == nil then count = 0 end average_objects[id] = count end for id, count in pairs(objects_needed) do if (average_objects[id] or 0) < count then average_objects[id] = count end end return average_objects end function UIEditRoom:draw(canvas, ...) if self.world.user_actions_allowed then local ui = self.ui local x, y = ui:WorldToScreen(self.mouse_cell_x, self.mouse_cell_y) local zoom = self.ui.zoom_factor if canvas:scale(zoom) then x = math.floor(x / zoom) y = math.floor(y / zoom) end self.cell_outline:draw(canvas, 2, x - 32, y) canvas:scale(1) end UIPlaceObjects.draw(self, canvas, ...) end function UIEditRoom:onMouseDown(button, x, y) if self.world.user_actions_allowed and not self.confirm_dialog_open then if button == "left" then if self.phase == "walls" then if 0 <= x and x < self.width and 0 <= y and y < self.height then else local mouse_x, mouse_y = self.ui:ScreenToWorld(self.x + x, self.y + y) self.mouse_down_x = math.floor(mouse_x) self.mouse_down_y = math.floor(mouse_y) if self.move_rect then self.move_rect_x = self.mouse_down_x - self.blueprint_rect.x self.move_rect_y = self.mouse_down_y - self.blueprint_rect.y elseif self.resize_rect then -- nothing to do else self:setBlueprintRect(self.mouse_down_x, self.mouse_down_y, 1, 1) end end elseif self.phase == "door" then if self.blueprint_door.valid then self.ui:playSound("buildclk.wav") self:confirm(true) else self.ui:tutorialStep(3, 9, 10) end elseif self.phase == "windows" then self:placeWindowBlueprint() end end end return UIPlaceObjects.onMouseDown(self, button, x, y) or true end function UIEditRoom:onMouseUp(button, x, y) if self.mouse_down_x then self.mouse_down_x = false self.mouse_down_y = false end if self.move_rect_x then self.move_rect_x = false self.move_rect_y = false end return UIPlaceObjects.onMouseUp(self, button, x, y) end function UIEditRoom:onMouseMove(x, y, ...) if self.in_pickup_mode then self.ui:setCursor(self.ui.app.gfx:loadMainCursor("grab")) end end function UIEditRoom:setBlueprintRect(x, y, w, h) local rect = self.blueprint_rect local map = self.ui.app.map if x < 1 then x = 1 end if y < 1 then y = 1 end if x + w > map.width then w = map.width - x end if y + h > map.height then h = map.height - y end if rect.x == x and rect.y == y and rect.w == w and rect.h == h then -- Nothing to do return end local too_small = w < self.room_type.minimum_size or h < self.room_type.minimum_size local player_id = self.ui.hospital:getPlayerIndex() -- Entire update of floor tiles and wall animations done in C to replace -- several hundred calls into C with just a single call. The price for this -- is reduced flexibility. See l_map_updateblueprint in th_lua.cpp for code. local is_valid = map.th:updateRoomBlueprint(rect.x, rect.y, rect.w, rect.h, x, y, w, h, player_id, self.blueprint_wall_anims, self.anims, too_small) -- NB: due to the unflexibility, tutorial step "too small AND invalid position" (3.7) -- is currently unusable, as it's not possible to determine if the position would -- have been invalid even if it weren't too small. if self.phase ~= "closed" then if too_small then self.ui:tutorialStep(3, {4, 5, 8}, 6) elseif not is_valid then self.ui:tutorialStep(3, {4, 6, 8}, 5) else self.ui:tutorialStep(3, {4, 5, 6}, 8) end end self.confirm_button:enable(is_valid) rect.x = x rect.y = y rect.w = w rect.h = h end --25 north wall, west --26 north wall, east --27 east wall, south --28 east wall, north --29 south wall, west --30 south wall, east --31 west wall, south --32 west wall, north -- single door blue print values matching TH local door_floor_blueprint_markers = { north = 26, east = 27, south = 30, west = 31 } local window_floor_blueprint_markers = { north = 33, east = 34, south = 35, west = 36, } --! Check walls for having room for the door --!param x (int) X tile position of the door. --!param y (int) Y tile position of the door. --!param wall (string) Name of the wall (either 'north' or 'west'). --!param has_swingdoor (boolean) Whether the room has a normal door (false) or a swing door (true) as entrance. --!return (int) bit flags indicating invalid tile position using 1 based power of 2 as this works with ipairs --! values returned are the enumeration of --! 4 = centre door in swing door or for single door the value can just be non-zero but uses the same bit of code --! 2 (door section closer to top of screen) - smaller x or y --! 8 (door section closer to bottom of screen) - larger x or y local function checkDoorWalls(x, y, wall, has_swingdoor) local th = TheApp.map.th local dx, dy, wall_num if wall == "west" then wall_num = 3 dx = 0 dy = 1 else wall_num = 2 dx = 1 dy = 0 end local invalid_tile = 0 if th:getCell(x, y, wall_num) % 0x100 ~= 0 then invalid_tile = 4 end -- If it is a swing door there are two more locations to check. if has_swingdoor then if th:getCell(x - dx, y - dy, wall_num) % 0x100 ~= 0 then invalid_tile = invalid_tile + 2 end if th:getCell(x + dx, y + dy, wall_num) % 0x100 ~= 0 then invalid_tile = invalid_tile + 8 end end return invalid_tile end --! Check whether the given tile can function as a door entry/exit tile. --!param xpos (int) X position of the tile. --!param ypos (int) Y position of the tile. --!param player_id (int) Player id owning the hospital. --!param world - reference to world object instance --!return (boolean) whether the tile is considered to be valid. local function validDoorTile(xpos, ypos, player_id, world) local th = TheApp.map.th local tile_flags = th:getCellFlags(xpos, ypos) -- check own it if tile_flags.owner ~= player_id then return false end -- any object will cause it to be blocked (ignore litter) if tile_flags.thob ~= 0 and tile_flags.thob ~= 62 then return false end -- check if its passable that no object footprint blocks it if tile_flags.passable then return world:isTileExclusivelyPassable(xpos, ypos, 1) end return true end --! Calculate position offsets and door blueprint wall values --! param x (int) doors blueprint x value --! param y (int) doors blueprint y value --! param wall (string) original wall orientation --! return x (int) updated x value --! return y (int) updated y value --! return x_mod (int) offest value to apply to tile count to determine relative position --! return y_mod (int) offset value to apply to tile count to determine relatitve position --! return wall (string) wall orientation style (only 2 styles) local function doorWallOffsetCalculations(x, y, wall) local x_mod local y_mod if wall == "south" then y = y + 1 wall = "north" x_mod = 2 elseif wall == "east" then x = x + 1 wall = "west" y_mod = 2 elseif wall == "north" then x_mod = 2 else y_mod = 2 end return x, y, x_mod, y_mod, wall end function UIEditRoom:setDoorBlueprint(orig_x, orig_y, orig_wall) local x, y, x_mod, y_mod, wall = doorWallOffsetCalculations(orig_x, orig_y, orig_wall) local map = TheApp.map.th if self.blueprint_door.anim then if self.room_type.swing_doors then if self.blueprint_door.anim[1] then -- retrieve the old door position details to reset the blue print local oldx, oldy local _, _, oldx_mod, oldy_mod, _ = doorWallOffsetCalculations(self.blueprint_door.floor_x, self.blueprint_door.floor_y, self.blueprint_door.wall) -- If we're dealing with swing doors the anim variable is actually a table with three -- identical "doors". for i, anim in ipairs(self.blueprint_door.anim) do anim:setAnimation(self.anims, self.blueprint_door.old_anim[i], self.blueprint_door.old_flags[i]) anim:setTag(nil) self.blueprint_door.anim[i] = nil oldx = oldx_mod and self.blueprint_door.floor_x + (i - oldx_mod) or self.blueprint_door.floor_x oldy = oldy_mod and self.blueprint_door.floor_y + (i - oldy_mod) or self.blueprint_door.floor_y map:setCell(oldx, oldy, 4, 24) end end else self.blueprint_door.anim:setAnimation(self.anims, self.blueprint_door.old_anim, self.blueprint_door.old_flags) self.blueprint_door.anim:setTag(nil) self.blueprint_door.anim = nil map:setCell(self.blueprint_door.floor_x, self.blueprint_door.floor_y, 4, 24) end end self.blueprint_door.x = x self.blueprint_door.y = y self.blueprint_door.wall = wall self.blueprint_door.floor_x = orig_x self.blueprint_door.floor_y = orig_y self.blueprint_door.valid = false if not wall then return end local anim = self.blueprint_wall_anims[x][y] if self.room_type.swing_doors then anim = {} local types = {"swing_slave", "swing_master", "nothing"} for i = 1, 3 do local x1 = x_mod and (x + (i - x_mod)) or x local y1 = y_mod and (y + (i - y_mod)) or y anim[i] = self.blueprint_wall_anims[x1][y1] if anim[i] ~= self.blueprint_door.anim[i] then self.blueprint_door.anim[i] = anim[i] self.blueprint_door.anim[i]:setTag(types[i]) self.blueprint_door.old_anim[i] = anim[i]:getAnimation() self.blueprint_door.old_flags[i] = anim[i]:getFlag() end end else if anim ~= self.blueprint_door.anim then self.blueprint_door.anim = anim self.blueprint_door.anim:setTag("door") self.blueprint_door.old_anim = anim:getAnimation() self.blueprint_door.old_flags = anim:getFlag() end end local flags local x2, y2 = x, y if wall == "west" then flags = 1 x2 = x2 - 1 else--if wall == "north" then flags = 0 y2 = y2 - 1 end local world = self.ui.app.world -- invalid_tile used to select the individual blueprint that is blocked local invalid_tile = checkDoorWalls(x, y, wall, self.room_type.swing_doors) -- Ensure that the door isn't being built on top of an object local player_id = self.ui.hospital:getPlayerIndex() if not validDoorTile(x, y, player_id, world) or not validDoorTile(x2, y2, player_id, world) then invalid_tile = bitOr(invalid_tile, 4) end -- If we're making swing doors two more tiles need to be checked. if self.room_type.swing_doors then local dx = x_mod and 1 or 0 local dy = y_mod and 1 or 0 if not validDoorTile(x + dx, y + dy, player_id, world) or not validDoorTile(x2 + dx, y2 + dy, player_id, world) then invalid_tile = bitOr(invalid_tile, 8) end if not validDoorTile(x - dx, y - dy, player_id, world) or not validDoorTile(x2 - dx, y2 - dy, player_id, world) then invalid_tile = bitOr(invalid_tile, 2) end end self.blueprint_door.valid = (invalid_tile == 0) if self.room_type.swing_doors then for i, animation in ipairs(anim) do -- calculation here to flag blocked blueprint tiles on swing doors for each door tile animation:setAnimation(self.anims, 126, flags + (hasBit(invalid_tile, i) and 1 or 0) * 16) end else anim:setAnimation(self.anims, 126, flags + (invalid_tile ~= 0 and 1 or 0) * 16) end if self.room_type.swing_doors then flags = door_floor_blueprint_markers[orig_wall] local dirfix = orig_wall == "east" flags = dirfix and flags + 1 or flags for i = 1, 3 do local x1 = x_mod and orig_x + i - x_mod or orig_x local y1 = y_mod and orig_y + i - y_mod or orig_y if (i == 2) then map:setCell(x1, y1, 4, 24) else if dirfix then map:setCell(x1, y1, 4, i < 2 and flags or flags - 1) else map:setCell(x1, y1, 4, i > 2 and flags or flags - 1) end end end else map:setCell(self.blueprint_door.floor_x, self.blueprint_door.floor_y, 4, door_floor_blueprint_markers[orig_wall]) end end function UIEditRoom:placeWindowBlueprint() if self.blueprint_window.anim and self.blueprint_window.valid then self.blueprint_window = {} self.ui:playSound("buildclk.wav") elseif self.blueprint_window.anim and not self.blueprint_window.valid then self.ui:tutorialStep(3, 11, 12) end end function UIEditRoom:setWindowBlueprint(orig_x, orig_y, orig_wall) local x = orig_x local y = orig_y local wall = orig_wall if wall == "south" then y = y + 1 wall = "north" elseif wall == "east" then x = x + 1 wall = "west" end local map = self.ui.app.map.th local world = self.ui.app.world if self.blueprint_window.anim then self.blueprint_window.anim:setAnimation(self.anims, self.blueprint_window.old_anim, self.blueprint_window.old_flags) self.blueprint_window.anim:setTag(nil) self.blueprint_window.anim = nil map:setCell(self.blueprint_window.floor_x, self.blueprint_window.floor_y, 4, 24) end local anim = x and self.blueprint_wall_anims[x][y] if anim and anim:getTag() then x, y, wall = nil, nil, nil orig_x, orig_y, orig_wall = nil, nil, nil end self.blueprint_window.x = x self.blueprint_window.y = y self.blueprint_window.wall = wall self.blueprint_window.floor_x = orig_x self.blueprint_window.floor_y = orig_y self.blueprint_window.valid = false if not wall then return end if anim ~= self.blueprint_window.anim then self.blueprint_window.anim = anim self.blueprint_window.anim:setTag("window") self.blueprint_window.old_anim = anim:getAnimation() self.blueprint_window.old_flags = anim:getFlag() end self.blueprint_window.valid = true local flags if wall == "west" then flags = 1 if world:getWallIdFromBlockId(map:getCell(x, y, 3)) then self.blueprint_window.valid = false flags = flags + 16 end else--if wall == "north" then flags = 0 if world:getWallIdFromBlockId(map:getCell(x, y, 2)) then self.blueprint_window.valid = false flags = flags + 16 end end anim:setAnimation(self.anims, 130, flags) if self.blueprint_window.valid then map:setCell(self.blueprint_window.floor_x, self.blueprint_window.floor_y, 4, window_floor_blueprint_markers[orig_wall]) end end function UIEditRoom:onCursorWorldPositionChange(x, y) local repaint = UIPlaceObjects.onCursorWorldPositionChange(self, x, y) local ui = self.ui -- Is the game paused? if not self.world.user_actions_allowed or self.confirm_dialog_open then ui:setCursor(ui.default_cursor) return end local wx, wy = ui:ScreenToWorld(self.x + x, self.y + y) wx = math.floor(wx) wy = math.floor(wy) if self.phase == "walls" then local rect = self.blueprint_rect if not self.mouse_down_x then if wx > rect.x and wx < rect.x + rect.w - 1 and wy > rect.y and wy < rect.y + rect.h - 1 then -- inside blueprint, non-border -> move blueprint ui:setCursor(ui.app.gfx:loadMainCursor("move_room")) self.move_rect = true self.resize_rect = false elseif wx < rect.x or wx >= rect.x + rect.w or wy < rect.y or wy >= rect.y + rect.h then -- outside blueprint ui:setCursor(ui.app.gfx:loadMainCursor("resize_room")) self.move_rect = false self.resize_rect = false else -- inside blueprint, at border -> resize blueprint self.move_rect = false self.resize_rect = { n = (wy == rect.y), s = (wy == rect.y + rect.h - 1) and not (wy == rect.y), w = (wx == rect.x), e = (wx == rect.x + rect.w - 1) and not (wx == rect.x), } if (self.resize_rect.w or self.resize_rect.e) and (self.resize_rect.n or self.resize_rect.s) then ui:setCursor(ui.app.gfx:loadMainCursor("nswe_arrow")) elseif self.resize_rect.w or self.resize_rect.e then ui:setCursor(ui.app.gfx:loadMainCursor("we_arrow")) else ui:setCursor(ui.app.gfx:loadMainCursor("ns_arrow")) end end end else if self.phase ~= "clear_area" and self.phase ~= "objects" then ui:setCursor(ui.app.gfx:loadMainCursor("resize_room")) end local cell_x, cell_y, wall = self:screenToWall(self.x + x, self.y + y) if self.phase == "door" then self:setDoorBlueprint(cell_x, cell_y, wall) elseif self.phase == "windows" then self:setWindowBlueprint(cell_x, cell_y, wall) end end if self.mouse_down_x and self.move_rect then local rect = self.blueprint_rect self:setBlueprintRect(wx - self.move_rect_x, wy - self.move_rect_y, rect.w, rect.h) elseif self.mouse_down_x and self.resize_rect then local rect = self.blueprint_rect local x1, y1, x2, y2 = rect.x, rect.y, rect.x + rect.w - 1, rect.y + rect.h - 1 if self.resize_rect.w then x1 = wx elseif self.resize_rect.e then x2 = wx end if self.resize_rect.n then y1 = wy elseif self.resize_rect.s then y2 = wy end if x1 > x2 then x1, x2 = x2, x1 self.resize_rect.w, self.resize_rect.e = self.resize_rect.e, self.resize_rect.w end if y1 > y2 then y1, y2 = y2, y1 self.resize_rect.n, self.resize_rect.s = self.resize_rect.s, self.resize_rect.n end self:setBlueprintRect(x1, y1, x2 - x1 + 1, y2 - y1 + 1) elseif self.mouse_down_x then local x1, x2 = self.mouse_down_x, wx local y1, y2 = self.mouse_down_y, wy if x1 > x2 then x1, x2 = x2, x1 end if y1 > y2 then y1, y2 = y2, y1 end self:setBlueprintRect(x1, y1, x2 - x1 + 1, y2 - y1 + 1) end if wx ~= self.mouse_cell_x or wy ~= self.mouse_cell_y then repaint = true end self.mouse_cell_x = wx self.mouse_cell_y = wy return repaint end -- checks if all required objects are placed, and enables/disables the confirm button accordingly. -- also returns the new state of the confirm button function UIEditRoom:checkEnableConfirm() local needed = {} -- copy list of required objects for k, v in pairs(self.room.room_info.objects_needed) do needed[k] = v end -- subtract existing objects from the required numbers for o in pairs(self.room.objects) do local id = o.object_type.id if needed[id] then needed[id] = needed[id] - 1 if needed[id] == 0 then needed[id] = nil end end end -- disable if there are not fulfilled requirements local confirm = not next(needed) if confirm then self.ui:tutorialStep(3, {13, 14}, 15) else self.ui:tutorialStep(3, {14, 15}, 13) end self.confirm_button:enable(confirm) return confirm end function UIEditRoom:placeObject() local obj = UIPlaceObjects.placeObject(self, true) if obj then self:checkEnableConfirm() end end function UIEditRoom:afterLoad(old, new) UIPlaceObjects.afterLoad(self, old, new) self:registerKeyHandlers() end CorsixTH-0.63/CorsixTH/Lua/dialogs/fullscreen.lua000066400000000000000000000106511347163623700216770ustar00rootroot00000000000000--[[ Copyright (c) 2009 Peter "Corsix" Cawley 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. --]] --! Base class for 640x480px dialogs (fullscreen in original game resolution). class "UIFullscreen" (Window) ---@type UIFullscreen local UIFullscreen = _G["UIFullscreen"] function UIFullscreen:UIFullscreen(ui) self:Window() self.esc_closes = true self.ui = ui self.modal_class = "fullscreen" self.width = 640 self.height = 480 self:onChangeResolution() end -- Cause all fullscreen windows to share a common saved window position. function UIFullscreen:getSavedWindowPositionName() return "UIFullscreen" end function UIFullscreen:onChangeResolution() local app = self.ui.app if app.config.width > self.width or app.config.height > self.height then if not self.border_sprites then self.border_sprites = app.gfx:loadSpriteTable("Bitmap", "aux_ui", true) end else self.border_sprites = nil end -- not draggable in actual fullscreen mode self.draggable = not not self.border_sprites local config = self.ui.app.runtime_config.window_position if config then config = config[self:getSavedWindowPositionName()] if config and config.x and config.y then return self:setPosition(config.x, config.y) end end self.x = math.floor((app.config.width - self.width) / 2) -- NB: Bottom panel is 48 pixels high if app.config.height > 480 + 48 then self.y = math.floor((app.config.height - 48 - self.height) / 2) elseif app.config.height >= 480 then self.y = 0 else self.y = math.floor((app.config.height - self.height) / 2) end end function UIFullscreen:draw(canvas, x, y) local sprites = self.border_sprites if sprites then local draw = sprites.draw local scr_x = self.x + x local scr_y = self.y + y canvas:nonOverlapping(true) draw(sprites, canvas, 10, scr_x - 9, scr_y - 9) draw(sprites, canvas, 12, scr_x + 600, scr_y - 9) draw(sprites, canvas, 15, scr_x - 9, scr_y + 440) draw(sprites, canvas, 17, scr_x + 600, scr_y + 440) for loop_x = scr_x + 40, scr_x + 560, 40 do draw(sprites, canvas, 11, loop_x, scr_y - 9) draw(sprites, canvas, 16, loop_x, scr_y + 480) end for loop_y = scr_y + 40, scr_y + 400, 40 do draw(sprites, canvas, 13, scr_x - 9, loop_y) draw(sprites, canvas, 14, scr_x + 640, loop_y) end canvas:nonOverlapping(false) end return Window.draw(self, canvas, x, y) end function UIFullscreen:onMouseDown(button, x, y) local repaint = Window.onMouseDown(self, button, x, y) if button == "left" and not repaint and not (x >= 0 and y >= 0 and x < self.width and y < self.height) and self:hitTest(x, y) then return self:beginDrag(x, y) end return repaint end function UIFullscreen:hitTest(x, y) if x >= 0 and y >= 0 and x < self.width and y < self.height then return true end local sprites = self.border_sprites if not sprites then return false end if x < -9 or y < -9 or x >= self.width + 9 or y >= self.height + 9 then return false end if (0 <= x and x < self.width) or (0 <= y and y < self.height) then return true end return sprites.hitTest(sprites, 10, x + 9, y + 9) or sprites.hitTest(sprites, 12, x - 600, y + 9) or sprites.hitTest(sprites, 15, x + 9, y - 440) or sprites.hitTest(sprites, 17, x - 600, y - 440) end function UIFullscreen:afterLoad(old, new) Window.afterLoad(self, old, new) if old < 22 then self.draggable = not not self.border_sprites end end CorsixTH-0.63/CorsixTH/Lua/dialogs/fullscreen/000077500000000000000000000000001347163623700211715ustar00rootroot00000000000000CorsixTH-0.63/CorsixTH/Lua/dialogs/fullscreen/annual_report.lua000066400000000000000000000610631347163623700245530ustar00rootroot00000000000000--[[ Copyright (c) 2010 Edvin "Lego3" Linge 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. --]] --! Annual Report fullscreen window shown at the start of each year. class "UIAnnualReport" (UIFullscreen) ---@type UIAnnualReport local UIAnnualReport = _G["UIAnnualReport"] --! Helper function that enables and makes visible button or table of buttons/panels. --!param button The button or table of buttons that should be activated/deactivated. If -- a table is given it needs to have the is_table flag set to true. --!param active Defines if the new state is active (true) or inactive (false). local function setActive(button, active) if button.is_table then for _, btn in ipairs(button) do btn.enabled = active btn.visible = active end else button.enabled = active button.visible = active end end function UIAnnualReport:UIAnnualReport(ui, world) self:UIFullscreen(ui) self.ui = ui local gfx = ui.app.gfx self.won_amount = 0 self.award_won_amount = 0 self.rep_amount = 0 if not pcall(function() local palette = gfx:loadPalette("QData", "Award02V.pal") palette:setEntry(255, 0xFF, 0x00, 0xFF) -- Make index 255 transparent -- Right now the statistics are first --self.background = gfx:loadRaw("Fame01V", 640, 480) self.award_background = gfx:loadRaw("Award01V", 640, 480) self.stat_background = gfx:loadRaw("Award02V", 640, 480) self.background = self.stat_background self.stat_font = gfx:loadFont("QData", "Font45V", false, palette) self.write_font = gfx:loadFont("QData", "Font47V", false, palette) self.stone_font = gfx:loadFont("QData", "Font46V", false, palette) self.panel_sprites = gfx:loadSpriteTable("QData", "Award03V", true, palette) end) then ui:addWindow(UIInformation(ui, {_S.errors.dialog_missing_graphics})) self:close() return end ------------------------ The current state the dialog is in. --------------------------- -- Possible values are 1, 2 and 3 = fame, statistics and awards pages respectively -- TODO: The dialog has some preparations for the fame screen, but as long as there are no -- competitor scores and the player's own score isn't increased anywhere there's no use in -- showing it. Only hall of fame is there right now too, and maybe it should be a -- stand alone dialog since it has (2) sprites in another sprite file? self.state = 2 self.default_button_sound = "selectx.wav" -- Close button, in the future different behaviours for different screens though --self.first_close = self:addPanel(0, 609, 449):makeButton(0, 0, 26, 26, 1, self.changePage) self.second_close = self:addPanel(0, 608, 449):makeButton(0, 0, 26, 26, 1, self.close) setActive(self.second_close, true) -- Change page buttons for the second and third pages local --[[persistable:annual_report_change_page]] function change() self:changePage(3) end self.second_change = self:addPanel(0, 274, 435):makeButton(0, 0, 91, 42, 3, change) setActive(self.second_change, true) self.third_change = self:addPanel(0, 272, 367):makeButton(0, 0, 91, 42, 3, self.changePage) setActive(self.third_change, false) -- The plaque showed after the player has clicked on a trophy local plaque = {} plaque[1] = self:addPanel(19, 206, 87) plaque[2] = self:addPanel(20, 206, 161) plaque[3] = self:addPanel(21, 206, 233) plaque[4] = self:addPanel(22, 206, 321) plaque.is_table = true self.plaque = plaque setActive(self.plaque, false) -- Close button for the trophy motivations self.third_close = self:addPanel(0, 389, 378):makeButton(0, 0, 26, 26, 2, self.showTrophyMotivation) setActive(self.third_close, false) -- The scroll showed after the player has clicked on an award local scroll = {} scroll[1] = self:addPanel(16, 206, 87) scroll[2] = self:addPanel(17, 206, 200) scroll[3] = self:addPanel(18, 206, 304) scroll[4] = self:addPanel(15, 300, 341) scroll.is_table = true self.scroll = scroll setActive(self.scroll, false) -- Close button for the award motivations self.fourth_close = self:addPanel(0, 369, 358):makeButton(0, 0, 26, 26, 2, self.showAwardMotivation) setActive(self.fourth_close, false) -- How many awards the player got this year. Will increase after the checkup. self.no_awards = 0 self.awards = {} -- Trophies. Currently the soda and the reputation award have been implemented self.no_trophies = 0 self.trophies = {} -- Check which awards and trophies the player should get. self:checkTrophiesAndAwards(world) -- Get and sort values used on the statistics screen. -- The six categories. The extra tables are used to be able to sort the values. self.money_sort = {} self.visitors_sort = {} self.salary_sort = {} self.deaths_sort = {} self.cures_sort = {} self.value_sort = {} -- TODO: Right now there are no real competitors, they all have initial values. for i, hospital in ipairs(world.hospitals) do self.money_sort[i] = {value = hospital.balance - hospital.loan, hosp_index = i} self.visitors_sort[i] = {value = hospital.num_visitors, hosp_index = i} self.deaths_sort[i] = {value = hospital.num_deaths, hosp_index = i} self.cures_sort[i] = {value = hospital.num_cured, hosp_index = i} self.value_sort[i] = {value = hospital.value, hosp_index = i} self.salary_sort[i] = {value = hospital.player_salary, hosp_index = i} end local local_hosp_index = 1 -- sort putting local player hospital first when values the same local desc_order = function(a,b) return a.value > b.value or (a.value == b.value and a.hosp_index == local_hosp_index) end local asc_order = function(a,b) return a.value < b.value or (a.value == b.value and a.hosp_index == local_hosp_index) end table.sort(self.money_sort, desc_order) table.sort(self.visitors_sort, desc_order) table.sort(self.deaths_sort, asc_order) table.sort(self.cures_sort, desc_order) table.sort(self.value_sort, desc_order) table.sort(self.salary_sort, desc_order) -- Pause the game to allow the player plenty of time to check all statistics and trophies won if world and not world:isCurrentSpeed("Pause") then world:setSpeed("Pause") end TheApp.video:setBlueFilterActive(false) end --! Finds out which awards and/or trophies the player has been awarded this year. function UIAnnualReport:checkTrophiesAndAwards(world) local hosp = self.ui.hospital local level_config = world.map.level_config local prices = level_config and level_config.awards_trophies or nil -- Check CuresAward so that we know the new config settings are available if prices and prices.TrophyMayorBonus then self.won_amount = 0 self.rep_amount = 0 self.award_won_amount = 0 -- The trophies and certificated awards/penalties available at this time -- -------------------------------- Trophies --------------------------------- -- Coke sales if hosp.sodas_sold > prices.CansofCoke then self:addTrophy(_S.trophy_room.sold_drinks.trophies[math.random(1, 3)], "money", prices.CansofCokeBonus) self.won_amount = self.won_amount + prices.CansofCokeBonus end -- Impressive VIP visits if hosp.num_vips_ty > 0 and hosp.pleased_vips_ty == hosp.num_vips_ty then -- added some here so you get odd amounts as in TH! local win_value = (prices.TrophyMayorBonus * hosp.pleased_vips_ty) + math.random(1, 5) self:addTrophy(_S.trophy_room.happy_vips.trophies[math.random(1, 3)], "reputation", win_value) self.rep_amount = self.rep_amount + win_value end -- Impressive Reputation in the year (above a threshold throughout the year) if hosp.reputation_above_threshold then self:addTrophy(_S.trophy_room.consistant_rep.trophies[math.random(1, 2)], "money", prices.TrophyReputationBonus) self.won_amount = self.won_amount + prices.TrophyReputationBonus end -- No deaths or around a 100% Cure rate in the year if hosp.num_deaths_this_year == 0 then self:addTrophy(_S.trophy_room.no_deaths.trophies[math.random(1, 3)], "money", prices.TrophyDeathBonus) self.won_amount = self.won_amount + prices.TrophyDeathBonus elseif hosp.num_cured_ty > (hosp.not_cured_ty * 0.9) then self:addTrophy(_S.trophy_room.many_cured.trophies[math.random(1, 3)], "money", prices.TrophyCuresBonus) self.won_amount = self.won_amount + prices.TrophyCuresBonus end -------------------- Certificate Awards or Penalties --------------------- -- Reputation if hosp.reputation > prices.ReputationAward then self:addAward(_S.trophy_room.high_rep.awards[math.random(1, 2)], "money", prices.AwardReputationBonus) self.award_won_amount = self.award_won_amount + prices.AwardReputationBonus elseif hosp.reputation < prices.ReputationPoor then self:addAward(_S.trophy_room.high_rep.penalty[math.random(1, 2)], "money", prices.AwardReputationPenalty) self.award_won_amount = self.award_won_amount + prices.AwardReputationPenalty end -- Hospital Value if hosp.value > prices.HospValueAward then -- added some here so you get odd amounts as in TH! local win_value = prices.HospValueBonus * math.random(1, 15) self:addAward(_S.trophy_room.hosp_value.awards[1], "reputation", win_value) self.rep_amount = self.rep_amount + win_value elseif hosp.value < prices.HospValuePoor then -- added some here so you get odd amounts as in TH! local lose_value = prices.HospValuePenalty * math.random(1, 15) self:addAward(_S.trophy_room.hosp_value.penalty[1], "reputation", lose_value) self.rep_amount = self.rep_amount + lose_value end -- Should these next few be linked so that you can only get one or should you get more than one if you met the targets? -- Cures if hosp.num_cured_ty > prices.CuresAward then self:addAward(_S.trophy_room.many_cured.awards[math.random(1, 2)], "money", prices.CuresBonus) self.award_won_amount = self.award_won_amount + prices.CuresBonus elseif hosp.num_cured_ty < prices.CuresPoor then self:addAward(_S.trophy_room.many_cured.penalty[math.random(1, 2)], "money", prices.CuresPenalty) self.award_won_amount = self.award_won_amount + prices.CuresPenalty end -- Deaths if hosp.num_deaths_this_year < prices.DeathsAward then self:addAward(_S.trophy_room.no_deaths.awards[math.random(1, 2)], "money", prices.DeathsBonus) self.award_won_amount = self.award_won_amount + prices.DeathsBonus elseif hosp.num_deaths_this_year > prices.DeathsPoor then self:addAward(_S.trophy_room.no_deaths.penalty[math.random(1, 2)], "money", prices.DeathsPenalty) self.award_won_amount = self.award_won_amount + prices.DeathsPenalty end -- Cures V Deaths -- This value is not really a ratio since the level files cannot contain decimal values. local cure_ratio = 100 if hosp.num_deaths_this_year > 0 then cure_ratio = hosp.num_cured_ty / hosp.num_deaths_this_year end if cure_ratio > prices.CuresVDeathsAward then self:addAward(_S.trophy_room.curesvdeaths.awards[1], "money", prices.CuresVDeathsBonus) self.award_won_amount = self.award_won_amount + prices.CuresVDeathsBonus elseif cure_ratio <= prices.CuresVDeathsPoor then self:addAward(_S.trophy_room.curesvdeaths.penalty[1], "money", prices.CuresVDeathsPenalty) self.award_won_amount = self.award_won_amount + prices.CuresVDeathsPenalty end end end function UIAnnualReport:updateAwards() -- Now apply the won/lost values. local hosp = self.ui.hospital if self.won_amount ~= 0 then hosp:receiveMoney(self.won_amount, _S.transactions.eoy_trophy_bonus) end if self.award_won_amount ~= 0 then hosp:receiveMoney(self.award_won_amount, _S.transactions.eoy_bonus_penalty) end if self.rep_amount ~= 0 then hosp:changeReputation("year_end", nil, math.floor(self.rep_amount)) end end -- A table defining which type of shadow each award should have. local award_shadows = { { shadow = 4 }, { shadow = 4 }, { shadow = 4 }, { shadow = 7 }, { shadow = 7 }, { shadow = 9 }, } -- Another table defining some properties of the three trophies. local trophy_prop = { { sprite = 12, x = 142, y = 324, w = 61, h = 144, }, { sprite = 14, x = 466, y = 331, w = 72, h = 145, }, { sprite = 13, x = 407, y = 324, w = 60, h = 144, }, } --! Adds a trophy figure with some text if the player clicks on it. --!param text (string) The text to show as motivation. --!param award_type (string) Should be one of "reputation" or "money" --!param amount (integer) How much the player got/lost. function UIAnnualReport:addTrophy(text, award_type, amount) local no = self.no_trophies + 1 -- Only show up to three trophies visually. if no <= 3 then local prop = trophy_prop[no] -- The actual figure and a button on it. local trophy_parts = {} trophy_parts.is_table = true -- Insert the info for later reference trophy_parts.info = { text = text, award_type = award_type, amount = amount } local --[[persistable:annual_report_show_trophy_motivation]] function change() self:showTrophyMotivation(no) end trophy_parts[1] = self:addPanel(prop.sprite, prop.x, prop.y) trophy_parts[2] = trophy_parts[1]:makeButton(0, 0, prop.w, prop.h, prop.sprite, change) setActive(trophy_parts, false) self.trophies[no] = trophy_parts end self.no_trophies = no end --! Adds an award frame with some text if the player clicks on it. --!param text (string) The text to show as motivation. --!param award_type (string) Should be one of "reputation" or "money" --!param amount (integer) How much the player got/lost. function UIAnnualReport:addAward(text, award_type, amount) -- How many awards the player has got up to this point. local no = self.no_awards + 1 if no <= 6 then -- Only visually show the first six awards. -- Add them one column at a time from the left. local x = no <= 3 and 16 or 525 local y = 74 if no % 3 == 2 then y = 189 elseif no % 3 == 0 then y = 304 end local award_parts = {} award_parts.is_table = true -- Insert the info for later reference award_parts.info = { text = text, award_type = award_type, amount = amount } -- The plaque if amount > 0 then -- A positive award award_parts[1] = self:addPanel(10, x + 12, y + 11) else -- A bad award award_parts[1] = self:addPanel(11, x + 12, y + 11) end -- The frame award_parts[2] = self:addPanel(23, x, y) -- The shadow award_parts[3] = self:addPanel(award_shadows[no].shadow, x, y) -- Make a button so that the player can click and see the motivation local --[[persistable:annual_report_show_award_motivation]] function change() self:showAwardMotivation(no) end award_parts[4] = award_parts[3]:makeButton(0, 0, 105, 103, award_shadows[no].shadow, change) self.awards[no] = award_parts setActive(award_parts, false) end -- The economic part of the award. self.no_awards = no end --! Activates the motivation scroll with the given text on it. --!param text_index_to_show The index of the award to show info from. function UIAnnualReport:showAwardMotivation(text_index_to_show) if text_index_to_show then -- Make sure no trophy motivation is shown self:showTrophyMotivation() setActive(self.scroll, true) -- Possibly hide the black award symbol if self.awards[text_index_to_show].info.amount > 0 then setActive(self.scroll[4], false) end setActive(self.fourth_close, true) setActive(self.third_change, false) self.award_motivation = text_index_to_show else setActive(self.scroll, false) setActive(self.fourth_close, false) setActive(self.third_change, true) self.award_motivation = nil end end --! Activates the motivation plaque with the given text on it. --!param text_index_to_show The index of the trophy to show info from. function UIAnnualReport:showTrophyMotivation(text_index_to_show) if text_index_to_show then -- Make sure no award motivation is shown self:showAwardMotivation() setActive(self.plaque, true) setActive(self.third_close, true) setActive(self.third_change, false) self.trophy_motivation = text_index_to_show else setActive(self.plaque, false) setActive(self.third_close, false) setActive(self.third_change, true) self.trophy_motivation = nil end end --! Overridden close function. The game should be unpaused again when closing the dialog. function UIAnnualReport:close() if TheApp.world:getLocalPlayerHospital().game_won then if not TheApp.world:isCurrentSpeed("Pause") then TheApp.world:setSpeed("Pause") TheApp.video:setBlueFilterActive(false) end TheApp.world.ui.bottom_panel:openLastMessage() elseif TheApp.world:isCurrentSpeed("Pause") then if TheApp.ui.speed_up_key_pressed then TheApp.world:setSpeed("Speed Up") else TheApp.world:setSpeed(TheApp.world.prev_speed) end end self:updateAwards() Window.close(self) self.ui.app.world:checkIfGameWon() end --! Changes the page of the annual report --!param page_no The page to go to, either page 1, 2 or 3. Default is currently page 2. function UIAnnualReport:changePage(page_no) -- Can only go to page 2 from page 1, and then only between page 2 and 3 --setActive(self.first_close, false) setActive(self.second_close, true) self.second_close.visible = true if page_no == 2 or not page_no then -- Statistics page. self.background = self.stat_background setActive(self.third_change, false) setActive(self.second_change, true) for i, _ in ipairs(self.trophies) do setActive(self.trophies[i], false) end for i, _ in ipairs(self.awards) do setActive(self.awards[i], false) end self.state = 2 else -- Awards and trophies self.background = self.award_background setActive(self.third_change, true) setActive(self.second_change, false) -- Show awards given. for i, _ in ipairs(self.awards) do setActive(self.awards[i], true) end -- And trophies given. for i, _ in ipairs(self.trophies) do setActive(self.trophies[i], true) end self.state = 3 end end function UIAnnualReport:draw(canvas, x, y) self.background:draw(canvas, self.x + x, self.y + y) UIFullscreen.draw(self, canvas, x, y) x, y = self.x + x, self.y + y local font = self.stat_font local world = self.ui.app.world if self.state == 1 then -- Fame screen -- Title and column names font:draw(canvas, _S.high_score.best_scores, x + 220, y + 104, 200, 0) font:draw(canvas, _S.high_score.pos, x + 218, y + 132) font:draw(canvas, _S.high_score.player, x + 260, y + 132) font:draw(canvas, _S.high_score.score, x + 360, y + 132) -- Players and their score local i = 1 local dy = 0 --for i = 1, 10 do font:draw(canvas, i .. ".", x + 220, y + 160 + dy) font:draw(canvas, world.hospitals[1].name:upper(), x + 260, y + 160 + dy) font:draw(canvas, "NA", x + 360, y + 160 + dy) -- dy = dy + 25 --end elseif self.state == 2 then -- Statistics screen self:drawStatisticsScreen(canvas, x, y) else -- Award and trophy screen -- Write out motivation if appropriate if self.trophy_motivation then -- If it is a plaque showing we write in stone text. local info = self.trophies[self.trophy_motivation].info self.stone_font:drawWrapped(canvas, info.text, x + 225, y + 105, 185, "center") -- Type of award local award_type = _S.trophy_room.cash if info.award_type == "reputation" then award_type = _S.trophy_room.reputation end self.stone_font:draw(canvas, award_type, x + 220, y + 330, 200, 0) -- Amount won/lost self.stone_font:draw(canvas, "+" .. info.amount, x + 220, y + 355, 200, 0) elseif self.award_motivation then local info = self.awards[self.award_motivation].info self.write_font:drawWrapped(canvas, info.text, x + 235, y + 125, 165, "center") -- Type of award local award_type = _S.trophy_room.cash if info.award_type == "reputation" then award_type = _S.trophy_room.reputation end self.write_font:draw(canvas, award_type, x + 220, y + 290, 200, 0) -- The amount won/lost local text = "" if info.amount > 0 then text = "+" end self.write_font:draw(canvas, text .. info.amount, x + 220, y + 315, 200, 0) end end end function UIAnnualReport:drawStatisticsScreen(canvas, x, y) local font = self.stat_font local world = self.ui.app.world -- Draw titles -- world date year is + 1, so adding it to 1998 realigns it font:draw(canvas, _S.menu.charts .. " " .. (world:date():year() + 1998), x + 210, y + 30, 200, 0) font:draw(canvas, _S.high_score.categories.money, x + 140, y + 98, 170, 0) font:draw(canvas, _S.high_score.categories.salary, x + 328, y + 98, 170, 0) font:draw(canvas, _S.high_score.categories.cures, x + 140, y + 205, 170, 0) font:draw(canvas, _S.high_score.categories.deaths, x + 328, y + 205, 170, 0) font:draw(canvas, _S.high_score.categories.visitors, x + 140, y + 310, 170, 0) font:draw(canvas, _S.high_score.categories.total_value, x + 328, y + 310, 170, 0) -- TODO: Add possibility to right align text. -- Helper function to find where the person is in the array. -- TODO: This whole sorting thing, it should be possible to do it in a better way? local getindex = function(tablename, val) for ind, value in ipairs(tablename) do if value['hosp_index'] == val then return ind end end end local row_y = 128 local row_dy = 15 local col_x = 190 local row_no_y = 106 for i, hospital in ipairs(world.hospitals) do local name = hospital.name -- Most Money local index_m = getindex(self.money_sort, i) -- index_* is the returned value of the sorted place for this player. -- However there might be many players with the same value, so each iteration a -- duplicate has been found, one additional row lower is the right place to be. font:draw(canvas, name:upper(), x + 140, y + row_y + row_dy * (index_m - 1)) font:draw(canvas, self.money_sort[index_m].value, x + 240, y + row_y + row_dy * (index_m - 1), 70, 0, "right") -- Highest Salary local index_s = getindex(self.salary_sort, i) font:draw(canvas, name:upper(), x + 140 + col_x, y + row_y + row_dy * (index_s - 1)) font:draw(canvas, self.salary_sort[index_s].value, x + 240 + col_x, y + row_y + row_dy * (index_s - 1), 70, 0, "right") -- Most Cures local index_c = getindex(self.cures_sort, i) font:draw(canvas, name:upper(), x + 140, y + row_y + row_no_y + row_dy * (index_c - 1)) font:draw(canvas, self.cures_sort[index_c].value, x + 240, y + row_y + row_no_y + row_dy * (index_c - 1), 70, 0, "right") -- Most Deaths local index_d = getindex(self.deaths_sort, i) font:draw(canvas, name:upper(), x + 140 + col_x, y + row_y + row_no_y + row_dy * (index_d - 1)) font:draw(canvas, self.deaths_sort[index_d].value, x + 240 + col_x, y + row_y + row_no_y + row_dy * (index_d - 1), 70, 0, "right") -- Most Visitors local index_v = getindex(self.visitors_sort, i) font:draw(canvas, name:upper(), x + 140, y + row_y + row_no_y * 2 + row_dy * (index_v - 1)) font:draw(canvas, self.visitors_sort[index_v].value, x + 240, y + row_y + row_no_y * 2 + row_dy * (index_v - 1), 70, 0, "right") -- Highest Value local index_v2 = getindex(self.value_sort, i) font:draw(canvas, name:upper(), x + 140 + col_x, y + row_y + row_no_y * 2 + row_dy * (index_v2 - 1)) font:draw(canvas, self.value_sort[index_v2].value, x + 240 + col_x, y + row_y + row_no_y * 2 + row_dy * (index_v2 - 1), 70, 0, "right") end end CorsixTH-0.63/CorsixTH/Lua/dialogs/fullscreen/bank_manager.lua000066400000000000000000000414201347163623700243020ustar00rootroot00000000000000--[[ Copyright (c) 2009 Edvin "Lego3" Linge 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. --]] --! Bank manager (for loans / insurance companies) and bank statement fullscreen windows. class "UIBankManager" (UIFullscreen) ---@type UIBankManager local UIBankManager = _G["UIBankManager"] function UIBankManager:UIBankManager(ui) self:UIFullscreen(ui) local gfx = ui.app.gfx self.world = ui.app.world if not pcall(function() self.background = gfx:loadRaw("Bank01V", 640, 480) self.stat_background = gfx:loadRaw("Stat01V", 640, 480) local palette = gfx:loadPalette("QData", "Bank01V.pal") palette:setEntry(255, 0xFF, 0x00, 0xFF) -- Make index 255 transparent self.panel_sprites = gfx:loadSpriteTable("QData", "Bank02V", true, palette) self.font = gfx:loadFont("QData", "Font36V", false, palette) -- The statistics font palette = gfx:loadPalette("QData", "Stat01V.pal") palette:setEntry(255, 0xFF, 0x00, 0xFF) -- Make index 255 transparent self.stat_font = gfx:loadFont("QData", "Font37V", false, palette) end) then ui:addWindow(UIInformation(ui, {_S.errors.dialog_missing_graphics})) self:close() return end -- counters for the animations of the bank manager self.counter = 0 self.browsclk = 0 self.smilesclk = 0 self.eyesclk = 0 -- sprites for the animation self.smiles = self:addPanel(12, 303, 199) self.eyesblink = self:addPanel(7, 298, 173) self.browslift = self:addPanel(9, 296, 165) -- Button so that the user can click in the middle and get the statistics page and -- vice versa self.stat_button = self:addPanel(0, 230, 100) :makeButton(0, 0, 160, 300, 0, self.showStatistics) self.return_from_stat_button = self:addPanel(0, 0, 0) :makeButton(0, 0, 640, 440, 0, self.hideStatistics) self.return_from_stat_button.enabled = false -- Buttons -- The close button needs to be movable self.close_panel = self:addPanel(0, 607, 448) self.close_button = self.close_panel:makeButton(0, 0, 26, 26, 4, self.close):setTooltip(_S.tooltip.bank_manager.close) self:addPanel(0, 250, 390):makeButton(0, 0, 200, 50, 0, self.openTownMap):setTooltip(_S.tooltip.toolbar.town_map) self:addPanel(0, 192, 265):makeButton(0, 0, 21, 21, 6, self.increaseLoan):setTooltip(_S.tooltip.bank_manager.borrow_5000) self:addPanel(0, 50, 265):makeButton(0, 0, 21, 21, 5, self.decreaseLoan):setTooltip(_S.tooltip.bank_manager.repay_5000) self.graph_buttons = { self:addPanel(0, 547, 157):makeButton(0, 0, 42, 23, 3, self.showGraph1):setTooltip(_S.tooltip.bank_manager.show_graph:format(self.ui.hospital.insurance[1])), self:addPanel(0, 547, 217):makeButton(0, 0, 42, 23, 3, self.showGraph2):setTooltip(_S.tooltip.bank_manager.show_graph:format(self.ui.hospital.insurance[2])), self:addPanel(0, 547, 277):makeButton(0, 0, 42, 23, 3, self.showGraph3):setTooltip(_S.tooltip.bank_manager.show_graph:format(self.ui.hospital.insurance[3])) } self.graph = self:addPanel(1, 417, 150) self.graph.visible = false self.graph.enabled = false self.return_from_graph_button = self:addPanel(0, 547, 277) self.return_from_graph_button:makeButton(0, 0, 42, 23, 2, self.returnFromGraph):setTooltip(_S.tooltip.bank_manager.graph_return) self.return_from_graph_button.visible = false self.return_from_graph_button.enabled = false self:makeTooltip(_S.tooltip.bank_manager.hospital_value, 60, 105, 203, 157) self:makeTooltip(_S.tooltip.bank_manager.balance, 60, 170, 203, 222) self:makeTooltip(_S.tooltip.bank_manager.current_loan, 60, 235, 203, 287) self:makeTooltip(_S.tooltip.bank_manager.interest_payment, 60, 300, 203, 352) local --[[persistable:insurance_tooltip_template]] function insurance_tooltip(i) return --[[persistable:insurance_tooltip]] function() if not self.graph.visible then return _S.tooltip.bank_manager.insurance_owed:format(self.ui.hospital.insurance[i]) end end end self:makeDynamicTooltip(insurance_tooltip(1), 430, 128, 589, 180) self:makeDynamicTooltip(insurance_tooltip(2), 430, 188, 589, 240) self:makeDynamicTooltip(insurance_tooltip(3), 430, 248, 589, 300) self:makeTooltip(_S.tooltip.bank_manager.inflation_rate, 430, 308, 589, 331) self:makeTooltip(_S.tooltip.bank_manager.interest_rate, 430, 337, 589, 360) -- TODO: Add the graphs end function UIBankManager:afterLoad(old, new) if old < 36 then -- adds the new variables for bank manager animation self.browsclk = 0 self.smilesclk = 0 self.eyesclk = 0 self.counter = 0 self.smiles = self:addPanel(12, 303, 199) self.eyesblink = self:addPanel(7, 298, 173) self.browslift = self:addPanel(9, 296, 165) end UIFullscreen.afterLoad(self, old, new) end --! Sum the values in the provided array. --!param t Array to sum. --!return (int) The sum of all values from the t array. local function sum(t) local total = 0 for _, entry in ipairs(t) do total = total + entry end return total end --! Animation function. function UIBankManager:onTick() self.counter = self.counter + 1 -- animate the eyes to blink local function animateEyes() self.eyesclk = self.eyesclk + 1 if self.eyesclk > 2 then self.eyesclk = 0 self.eyesblink.sprite_index = self.eyesblink.sprite_index + 1 if self.eyesblink.sprite_index > 8 then self.eyesblink.sprite_index = 7 end end end -- animate the eyebrows to raise and lower local function animateBrows() self.browsclk = self.browsclk + 1 if self.browsclk > 3 then self.browsclk = 0 self.browslift.sprite_index = self.browslift.sprite_index + 1 if self.browslift.sprite_index > 11 then self.browslift.sprite_index = 9 end end end -- animate the smile to frown and back again local function animateSmile() self.smilesclk = self.smilesclk + 1 if self.smilesclk > 3 then self.smilesclk = 0 self.smiles.sprite_index = self.smiles.sprite_index + 1 if self.smiles.sprite_index > 15 then self.smiles.sprite_index = 12 end end end -- counters to determine when to start and stop the animations -- two blinks if self.counter >= 24 and self.counter < 36 then animateEyes() -- one blink elseif self.counter >= 49 and self.counter < 55 then animateEyes() -- one blink elseif self.counter >= 70 and self.counter < 76 then animateEyes() -- up and down once elseif self.counter >= 88 and self.counter < 100 then animateBrows() -- smile elseif self.counter >= 132 and self.counter < 140 then animateSmile() -- two blinks elseif self.counter >= 164 and self.counter < 176 then animateEyes() -- one blink elseif self.counter >= 189 and self.counter < 195 then animateEyes() -- one blink elseif self.counter >= 219 and self.counter < 225 then animateEyes() -- brows up and down once elseif self.counter >= 248 and self.counter < 260 then animateBrows() --smiles elseif self.counter >= 272 and self.counter < 280 then animateSmile() -- brows up and down twice elseif self.counter >= 298 and self.counter < 322 then animateBrows() -- two blinks elseif self.counter >= 340 and self.counter < 352 then animateEyes() end -- reset the animation counter if self.counter > 420 then self.counter = 0 end end function UIBankManager:draw(canvas, x, y) local hospital = self.ui.hospital -- Either draw the statistics page or the normal bank page if self.showingStatistics then local font = self.stat_font self.stat_background:draw(canvas, self.x + x, self.y + y) UIFullscreen.draw(self, canvas, x, y) x, y = self.x + x, self.y + y -- Titles font:draw(canvas, _S.bank_manager.statistics_page.date, x + 44, y + 37, 65, 0) font:draw(canvas, _S.bank_manager.statistics_page.details, x + 125, y + 40, 230, 0) font:draw(canvas, _S.bank_manager.statistics_page.money_out, x + 373, y + 42, 70, 0) font:draw(canvas, _S.bank_manager.statistics_page.money_in, x + 449, y + 41, 70, 0) font:draw(canvas, _S.bank_manager.statistics_page.balance, x + 525, y + 40, 70, 0) -- Lua < 5.3 stored integer money amount in floating point values. -- Lua 5.3 introduced an integer representation, and started printing -- integer floating point numbers with a trailing .0 . -- -- As a result, CorsixTH games converted from earlier Lua versions print a -- trailing .0 in the bank manager window. The "math.floor" around all -- numbers printed below avoids that problem by converting to integer -- representation for Lua 5.3, and doing nothing in Lua < 5.3. -- Each transaction -- A for loop going backwards for no = 1, #hospital.transactions do local values = hospital.transactions[#hospital.transactions - no + 1] local current_y = no * 15 + y + 60 font:draw(canvas, _S.date_format.daymonth:format(values.day, values.month), x + 48, current_y) font:draw(canvas, values.desc, x + 129, current_y) if values.spend then font:draw(canvas, "$ " .. math.floor(values.spend), x + 377, current_y) else font:draw(canvas, "$ " .. math.floor(values.receive), x + 453, current_y) end font:draw(canvas, "$ " .. math.floor(values.balance), x + 529, current_y) end -- Summary font:draw(canvas, _S.bank_manager.statistics_page.current_balance, x + 373, y + 420, 140, 0) font:draw(canvas, "$ " .. hospital.balance, x + 526, y + 421, 70, 0) else local font = self.font self.background:draw(canvas, self.x + x, self.y + y) UIFullscreen.draw(self, canvas, x, y) x, y = self.x + x, self.y + y -- The left side font:draw(canvas, _S.bank_manager.hospital_value, x + 60, y + 109, 143, 0) font:draw(canvas, "$ " .. math.floor(hospital.value), x + 60, y + 139, 143, 0) font:draw(canvas, _S.bank_manager.balance, x + 60, y + 174, 143, 0) font:draw(canvas, "$ " .. math.floor(hospital.balance), x + 60, y + 204, 143, 0) font:draw(canvas, _S.bank_manager.current_loan, x + 60, y + 239, 143, 0) font:draw(canvas, "$ " .. math.floor(hospital.loan), x + 60, y + 269, 143, 0) font:draw(canvas, _S.bank_manager.interest_payment, x + 60, y + 305, 143, 0) local interest = math.floor(hospital.loan * hospital.interest_rate / 12) font:draw(canvas, "$ " .. interest, x + 60, y + 334, 143, 0) -- The right side font:draw(canvas, _S.bank_manager.insurance_owed, x + 430, y + 102, 158, 0) if self.graph.visible then font:draw(canvas, hospital.insurance[self.chosen_insurance], x + 430, y + 132, 158, 0) else font:draw(canvas, hospital.insurance[1], x + 430, y + 132, 158, 0) font:draw(canvas, "$ ".. math.floor(sum(hospital.insurance_balance[1])), x + 430, y + 162, 100, 0) font:draw(canvas, hospital.insurance[2], x + 430, y + 192, 158, 0) font:draw(canvas, "$ ".. math.floor(sum(hospital.insurance_balance[2])), x + 430, y + 222, 100, 0) font:draw(canvas, hospital.insurance[3], x + 430, y + 252, 158, 0) font:draw(canvas, "$ ".. math.floor(sum(hospital.insurance_balance[3])), x + 430, y + 282, 100, 0) end font:draw(canvas, _S.bank_manager.inflation_rate, x + 430, y + 312, 100, 0) font:draw(canvas, hospital.inflation_rate*100 .. " %", x + 550, y + 313, 38, 0) font:draw(canvas, _S.bank_manager.interest_rate, x + 430, y + 342, 100, 0) font:draw(canvas, hospital.interest_rate*100 .. " %", x + 550, y + 342, 38, 0) end end function UIBankManager:onMouseMove(x, y, ...) local ui = self.ui if x > 0 and x < 640 and y > 0 and y < 480 then if self.showingStatistics then ui:setCursor(ui.app.gfx:loadMainCursor("banksummary")) -- Set pie chart cursor else ui:setCursor(ui.app.gfx:loadMainCursor("bank")) -- Set dollar cursor end else ui:setCursor(ui.default_cursor) -- Return to default cursor end end function UIBankManager:close() local ui = self.ui ui:setCursor(ui.default_cursor) -- Return to default cursor UIFullscreen.close(self) self.ui:getWindow(UIBottomPanel):updateButtonStates() end function UIBankManager:showStatistics(keep_cursor) if self.closed then return end self.ui:playSound("selectx.wav") -- close any open graphs if self.graph.visible then self:returnFromGraph() end self.showingStatistics = true self.return_from_stat_button.enabled = true self.stat_button.enabled = false -- hides the animated parts of the bank manager when viewing the statement self.smiles.visible = false self.eyesblink.visible = false self.browslift.visible = false -- The close button has been slightly moved. local panel = self.close_panel panel.x = panel.x - 6 panel.y = panel.y - 6 local btn = self.close_button btn.x = btn.x - 6 btn.y = btn.y - 6 -- Change tooltip to say that the statement screen is closed. btn:setTooltip(_S.tooltip.statement.close) -- Set pie chart cursor, unless coming here from right click on the dollar sign. if not keep_cursor then self.ui:setCursor(self.ui.app.gfx:loadMainCursor("banksummary")) end end function UIBankManager:hideStatistics() self.ui:playSound("selectx.wav") self.showingStatistics = false self.return_from_stat_button.enabled = false self.stat_button.enabled = true -- shows the animated parts of the bank manager when viewing the main screen self.smiles.visible = true self.eyesblink.visible = true self.browslift.visible = true -- resets the animation counter if the screen is switched to the statement and back self.counter = -1 -- return the close button again local panel = self.close_panel panel.x = panel.x + 6 panel.y = panel.y + 6 local btn = self.close_button btn.x = btn.x + 6 btn.y = btn.y + 6 -- Change the tooltip back btn:setTooltip(_S.tooltip.bank_manager.close) -- Set dollar cursor self.ui:setCursor(self.ui.app.gfx:loadMainCursor("bank")) end function UIBankManager:showGraph() self.ui:playSound("selectx.wav") self.graph:setTooltip(_S.tooltip.bank_manager.graph:format(self.ui.hospital.insurance[self.chosen_insurance])) self.graph.visible = true self.return_from_graph_button.visible = true self.return_from_graph_button.enabled = true for i = 1, 3 do self.graph_buttons[i].visible = false self.graph_buttons[i].enabled = false end end function UIBankManager:showGraph1() self.chosen_insurance = 1 self:showGraph() end function UIBankManager:showGraph2() self.chosen_insurance = 2 self:showGraph() end function UIBankManager:showGraph3() self.chosen_insurance = 3 self:showGraph() end function UIBankManager:returnFromGraph() self.ui:playSound("selectx.wav") self.graph.visible = false self.return_from_graph_button.visible = false self.return_from_graph_button.enabled = false for i = 1, 3 do self.graph_buttons[i].enabled = true self.graph_buttons[i].visible = true end end function UIBankManager:increaseLoan() local hospital = self.ui.hospital local max_loan = not self.world.free_build_mode and (math.floor((hospital.value * 0.33) / 5000) * 5000) + 10000 or 0 if hospital.loan + 5000 <= max_loan then local amount = self.ui.app.key_modifiers.ctrl and max_loan - hospital.loan or 5000 hospital.loan = hospital.loan + amount hospital:receiveMoney(amount, _S.transactions.bank_loan) self.ui:playSound("selectx.wav") else self.ui:playSound("Wrong2.wav") end end function UIBankManager:decreaseLoan() local hospital = self.ui.hospital local amount = 5000 if self.ui.app.key_modifiers.ctrl then -- Repay as much as possible in increments of 5000 if hospital.balance > 5000 then amount = math.min(hospital.loan, math.floor(hospital.balance / 5000) * 5000) end end if hospital.loan > 0 and hospital.balance >= amount then hospital.loan = hospital.loan - amount hospital:spendMoney(amount, _S.transactions.loan_repayment) self.ui:playSound("selectx.wav") else self.ui:playSound("Wrong2.wav") end end function UIBankManager:openTownMap() local dlg = UITownMap(self.ui) self.ui:addWindow(dlg) end CorsixTH-0.63/CorsixTH/Lua/dialogs/fullscreen/drug_casebook.lua000066400000000000000000000362721347163623700245150ustar00rootroot00000000000000--[[ Copyright (c) 2009 Edvin "Lego3" Linge 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. --]] --! Drug Casebook fullscreen window (view disease statistics and set prices). class "UICasebook" (UIFullscreen) ---@type UICasebook local UICasebook = _G["UICasebook"] function UICasebook:UICasebook(ui, disease_selection) self:UIFullscreen(ui) local gfx = ui.app.gfx if not pcall(function() self.background = gfx:loadRaw("DrugN01V", 640, 480) local palette = gfx:loadPalette("QData", "DrugN01V.pal") palette:setEntry(255, 0xFF, 0x00, 0xFF) -- Make index 255 transparent self.panel_sprites = gfx:loadSpriteTable("QData", "DrugN02V", true, palette) self.title_font = gfx:loadFont("QData", "Font25V", false, palette) self.selected_title_font = gfx:loadFont("QData", "Font26V", false, palette) self.drug_font = gfx:loadFont("QData", "Font24V", false, palette) end) then ui:addWindow(UIInformation(ui, {_S.errors.dialog_missing_graphics})) self:close() return end self.ui = ui self.hospital = ui.hospital self.casebook = self.hospital.disease_casebook self:updateDiseaseList() -- Buttons self:addPanel(0, 607, 449):makeButton(0, 0, 26, 26, 3, self.close):setTooltip(_S.tooltip.casebook.close) self:addPanel(0, 439, 29):makeRepeatButton(0, 0, 70, 46, 1, self.scrollUp):setTooltip(_S.tooltip.casebook.up) self:addPanel(0, 437, 394):makeRepeatButton(0, 0, 77, 53, 2, self.scrollDown):setTooltip(_S.tooltip.casebook.down) self:addPanel(0, 354, 133):makeRepeatButton(0, 0, 22, 22, 5, self.increasePay):setTooltip(_S.tooltip.casebook.increase) self:addPanel(0, 237, 133):makeRepeatButton(0, 0, 22, 22, 4, self.decreasePay):setTooltip(_S.tooltip.casebook.decrease) self:addPanel(0, 235, 400):makeButton(0, 0, 140, 20, 0, self.concentrateResearch) :setTooltip(_S.tooltip.casebook.research) self:registerKeyHandlers(); -- Icons representing cure effectiveness and other important information. self.machinery = self:addPanel(6, 306, 352):setTooltip(_S.tooltip.casebook.cure_type.machine) self.machinery.visible = false self.drug = self:addPanel(7, 306, 352):setDynamicTooltip(--[[persistable:casebook_drug_tooltip]] function() return _S.tooltip.casebook.cure_type.drug_percentage:format(self.casebook[self.selected_disease].cure_effectiveness) end) self.drug.visible = false self.surgery = self:addPanel(8, 306, 352):setTooltip(_S.tooltip.casebook.cure_type.surgery) self.surgery.visible = false self.unknown = self:addPanel(9, 306, 352):setTooltip(_S.tooltip.casebook.cure_type.unknown) self.unknown.visible = false self.psychiatry = self:addPanel(10, 306, 352):setTooltip(_S.tooltip.casebook.cure_type.psychiatrist) self.psychiatry.visible = false self.curable = self:addPanel(11, 335, 352):setTooltip(_S.tooltip.casebook.cure_requirement.possible) self.curable.visible = false self.not_curable = self:addPanel(12, 335, 352):setTooltip(_S.tooltip.casebook.cure_requirement.not_possible) -- TODO: split up in more specific requirements self.not_curable.visible = false self.percentage_counter = false -- Counter for displaying cure price percentage for a certain time before switching to price. self:makeTooltip(_S.tooltip.casebook.reputation, 249, 72, 362, 117) self:makeTooltip(_S.tooltip.casebook.treatment_charge, 249, 117, 362, 161) self:makeTooltip(_S.tooltip.casebook.earned_money, 247, 161, 362, 205) self:makeTooltip(_S.tooltip.casebook.cured, 247, 205, 362, 249) self:makeTooltip(_S.tooltip.casebook.deaths, 247, 249, 362, 293) self:makeTooltip(_S.tooltip.casebook.sent_home, 247, 293, 362, 337) if disease_selection then self:selectDisease(disease_selection) else self.selected_index = #self.names_sorted self.selected_disease = self.names_sorted[self.selected_index] self:updateIcons() end end function UICasebook:registerKeyHandlers() -- Hotkeys self:addKeyHandler("ingame_scroll_up", self.scrollUp) self:addKeyHandler("ingame_scroll_down", self.scrollDown) self:addKeyHandler("ingame_scroll_left", self.decreasePay) self:addKeyHandler("ingame_scroll_right", self.increasePay) end function UICasebook:close() UIFullscreen.close(self) self.ui:getWindow(UIBottomPanel):updateButtonStates() end --! The diseases list has been changed, update the list. function UICasebook:updateDiseaseList() -- A sorted list of known diseases and pseudo diseases. -- Used to be able to list the diseases in, believe it or not, -- alphabetical order. self.names_sorted = {} for n, value in pairs(self.casebook) do if value.discovered then self.names_sorted[#self.names_sorted + 1] = n end end table.sort(self.names_sorted, function(d1, d2) local c1, c2 = self.casebook[d1], self.casebook[d2] if c1.pseudo ~= c2.pseudo then return c1.pseudo end return c1.disease.name:upper() < c2.disease.name:upper() end) if self.selected_disease then -- Re-select the current disease. self:selectDisease(self.selected_disease) end end --! Select a disease by name. --!param disease (string) Name of the disease function UICasebook:selectDisease(disease) for i = 1, #self.names_sorted do if disease == self.names_sorted[i] then self.selected_index = i self.selected_disease = self.names_sorted[self.selected_index] break end end self:updateIcons() end --! Function that is called when a new entry is selected in some way --! It updates all icons etc. that react to what is selected function UICasebook:updateIcons() local disease = self.selected_disease local hosp = self.hospital local world = hosp.world local known = true -- Curable / not curable icons and their tooltip if self.casebook[disease].pseudo then self.curable.visible = false self.not_curable.visible = false else local req = hosp:checkDiseaseRequirements(disease) if not req then self.curable.visible = true self.not_curable.visible = false else self.curable.visible = false self.not_curable.visible = true -- Strings for the tooltip local research = false local build = false local staff = false -- Room requirements if #req.rooms > 0 then for _, room_id in ipairs(req.rooms) do -- Not researched yet? if not hosp.discovered_rooms[world.available_rooms[room_id]] then known = false research = (research and (research .. ", ") or " (") .. TheApp.rooms[room_id].name end -- Researched, but not built. TODO: maybe make this an else clause to not oversize the tooltip that much build = (build and (build .. ", ") or " (") .. TheApp.rooms[room_id].name end end research = research and (_S.tooltip.casebook.cure_requirement.research_machine .. research .. "). ") or "" build = build and (_S.tooltip.casebook.cure_requirement.build_room .. build .. "). ") or "" local staffclass_to_string = { Nurse = _S.staff_title.nurse, Doctor = _S.staff_title.doctor, Surgeon = _S.staff_title.surgeon, Psychiatrist = _S.staff_title.psychiatrist, Researcher = _S.staff_title.researcher, } -- Staff requirements for sclass, amount in pairs(req.staff) do staff = (staff and (staff .. ", ") or " (") .. staffclass_to_string[sclass] .. ": " .. amount end staff = staff and (_S.tooltip.casebook.cure_requirement.hire_staff .. staff .. "). ") or "" self.not_curable:setTooltip(research .. build .. staff) end end self.unknown.visible = not known self.drug.visible = known and not not self.casebook[disease].drug self.machinery.visible = known and not not self.casebook[disease].machine and not self.casebook[disease].pseudo self.psychiatry.visible = known and not not self.casebook[disease].psychiatrist self.surgery.visible = known and not not self.casebook[disease].surgeon self.ui:updateTooltip() -- for the case that mouse is hovering over icon while player scrolls through list with keys self.percentage_counter = 50 end function UICasebook:draw(canvas, x, y) self.background:draw(canvas, self.x + x, self.y + y) UIFullscreen.draw(self, canvas, x, y) x, y = self.x + x, self.y + y local titles = self.title_font local book = self.casebook local disease = self.selected_disease local selected = self.selected_index -- All titles titles:draw(canvas, _S.casebook.reputation, x + 278, y + 68) titles:draw(canvas, _S.casebook.treatment_charge, x + 260, y + 113) titles:draw(canvas, _S.casebook.earned_money, x + 265, y + 157) titles:draw(canvas, _S.casebook.cured, x + 276, y + 201) titles:draw(canvas, _S.casebook.deaths, x + 279, y + 245) titles:draw(canvas, _S.casebook.sent_home, x + 270, y + 289) titles:draw(canvas, _S.casebook.cure, x + 255, y + 354) -- Specific disease information if self.hospital:canConcentrateResearch(disease) then if book[disease].concentrate_research then -- Concentrate research self.selected_title_font:draw(canvas, _S.casebook.research, x + 245, y + 398) else titles:draw(canvas, _S.casebook.research, x + 245, y + 398) end end local rep = book[disease].reputation or self.hospital.reputation if rep < self.hospital.reputation_min then rep = self.hospital.reputation_min elseif rep > self.hospital.reputation_max then rep = self.hospital.reputation_max end titles:draw(canvas, rep, x + 248, y + 92, 114, 0) -- Reputation -- Treatment Charge is either displayed in percent, or normally local price_text = self.percentage_counter and ("%.0f%%"):format(book[disease].price * 100) or "$" .. self.hospital:getTreatmentPrice(disease) titles:draw(canvas, price_text, x + 262, y + 137, 90, 0) -- Treatment Charge titles:draw(canvas, "$" .. book[disease].money_earned, x + 248, y + 181, 114, 0) -- Money Earned titles:draw(canvas, book[disease].recoveries, x + 248, y + 225, 114, 0) -- Recoveries titles:draw(canvas, book[disease].fatalities, x + 248, y + 269, 114, 0) -- Fatalities titles:draw(canvas, book[disease].turned_away, x + 248, y + 313, 114, 0) -- Turned away -- Cure percentage if self.drug.visible then self.drug_font:draw(canvas, book[disease].cure_effectiveness, x + 313, y + 364, 16, 0) end -- Right-hand side list of diseases (and pseudo diseases) local index = 1 while selected - index > 0 and index <= 7 do titles:draw(canvas, book[self.names_sorted[selected - index]].disease.name:upper(), x + 409, y + 203 - index*18) index = index + 1 end self.selected_title_font:draw(canvas, book[disease].disease.name:upper(), x + 409, y + 227) index = 1 while index + selected <= #self.names_sorted and index <= 7 do titles:draw(canvas, book[self.names_sorted[index + selected]].disease.name:upper(), x + 409, y + 251 + index*18) index = index + 1 end end function UICasebook:scrollUp() if self.selected_index > 1 then if self.ui.app.key_modifiers.ctrl then self.selected_index = 1 else self.selected_index = self.selected_index - 1 end self.selected_disease = self.names_sorted[self.selected_index] self.ui:playSound("pagetur2.wav") else self.ui:playSound("Wrong2.wav") end self:updateIcons() end function UICasebook:scrollDown() if self.selected_index < #self.names_sorted then if self.ui.app.key_modifiers.ctrl then self.selected_index = #self.names_sorted else self.selected_index = self.selected_index + 1 end self.selected_disease = self.names_sorted[self.selected_index] self.ui:playSound("pagetur2.wav") else self.ui:playSound("Wrong2.wav") end self:updateIcons() end function UICasebook:increasePay() local price = self.casebook[self.selected_disease].price local amount = 0.01 if self.ui.app.key_modifiers.ctrl then amount = amount * 25 elseif self.ui.app.key_modifiers.shift then amount = amount * 5 end price = price + amount if price > 2 then price = 2 self.ui:playSound("Wrong2.wav") else self.ui:playSound("selectx.wav") end self.casebook[self.selected_disease].price = price self.percentage_counter = 50 end function UICasebook:decreasePay() local price = self.casebook[self.selected_disease].price local amount = 0.01 if self.ui.app.key_modifiers.ctrl then amount = amount * 25 elseif self.ui.app.key_modifiers.shift then amount = amount * 5 end price = price - amount if price < 0.5 then price = 0.5 self.ui:playSound("Wrong2.wav") else self.ui:playSound("selectx.wav") end self.casebook[self.selected_disease].price = price self.percentage_counter = 50 end function UICasebook:concentrateResearch() if self.hospital:canConcentrateResearch(self.selected_disease) then self.hospital.research:concentrateResearch(self.selected_disease) end end function UICasebook:onMouseDown(button, x, y) -- Normal window operations if outside the disease list if x < 395 or x > 540 or y < 77 or y > 394 then return UIFullscreen.onMouseDown(self, button, x, y) end local index_diff if y < 203 then index_diff = -7 + math.floor((y - 77) / 18) elseif y > 269 then index_diff = math.floor((y - 269) / 18) + 1 else return end -- Clicking on a disease name scrolls to the disease local new_index = self.selected_index + index_diff if new_index >= 1 and new_index <= #self.names_sorted then self.selected_index = new_index self.selected_disease = self.names_sorted[self.selected_index] self.ui:playSound("pagetur2.wav") self:updateIcons() end end function UICasebook:onMouseWheel(x, y) if not UIFullscreen.onMouseWheel(self, x, y) then if self:hitTest(self.cursor_x, self.cursor_y) then if y > 0 then self:scrollUp() return true else self:scrollDown() return true end end return false else return true end end function UICasebook:onTick() -- Decrease counter for showing percentage of cure price, if applicable if self.percentage_counter then self.percentage_counter = self.percentage_counter - 1 if self.percentage_counter <= 0 then self.percentage_counter = false end end return UIFullscreen.onTick(self) end function UICasebook:afterLoad(old, new) UIFullscreen.afterLoad(self, old, new) self:registerKeyHandlers() end CorsixTH-0.63/CorsixTH/Lua/dialogs/fullscreen/fax.lua000066400000000000000000000260721347163623700224610ustar00rootroot00000000000000--[[ Copyright (c) 2009 Peter "Corsix" Cawley 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. --]] corsixth.require("announcer") local AnnouncementPriority = _G["AnnouncementPriority"] class "UIFax" (UIFullscreen) ---@type UIFax local UIFax = _G["UIFax"] function UIFax:UIFax(ui, icon) self:UIFullscreen(ui) local gfx = ui.app.gfx self.background = gfx:loadRaw("Fax01V", 640, 480) local palette = gfx:loadPalette("QData", "Fax01V.pal") palette:setEntry(255, 0xFF, 0x00, 0xFF) -- Make index 255 transparent self.panel_sprites = gfx:loadSpriteTable("QData", "Fax02V", true, palette) self.fax_font = gfx:loadFont("QData", "Font51V", false, palette) self.icon = icon self.message = icon.message or {} self.owner = icon.owner self.code = "" -- Add choice buttons local choices = self.message.choices self.choice_buttons = {} local orig_y = 175 if choices then for i = 1, #choices do local y = orig_y + ((i-1) + (3-#choices)) * 48 local choice = choices[i].choice -- NB: both nil and true result in enabled; also handle old "disabled" choice local enabled = (choices[i].enabled ~= false) and (choice ~= "disabled") local --[[persistable:fax_choice_button]] function callback() self:choice(i) end self.choice_buttons[i] = self:addPanel(17, 492, y):makeButton(0, 0, 43, 43, 18, callback) :setDisabledSprite(19):enable(enabled) end end -- Close button self:addPanel(0, 598, 440):makeButton(0, 0, 26, 26, 16, self.close):setTooltip(_S.tooltip.fax.close) self:addPanel(0, 471, 349):makeButton(0, 0, 87, 20, 14, self.cancel) -- Cancel code button self:addPanel(0, 474, 372):makeButton(0, 0, 91, 27, 15, self.validate) -- Validate code button self:addPanel(0, 168, 348):makeButton(0, 0, 43, 10, 1, self.correct) -- Correction button local function button(char) return --[[persistable:fax_button]] function() self:appendNumber(char) end end self:addPanel(0, 220, 348):makeButton(0, 0, 43, 10, 2, button("1")):setSound("Fax_1.wav") self:addPanel(0, 272, 348):makeButton(0, 0, 44, 10, 3, button("2")):setSound("Fax_2.wav") self:addPanel(0, 327, 348):makeButton(0, 0, 43, 10, 4, button("3")):setSound("Fax_3.wav") self:addPanel(0, 219, 358):makeButton(0, 0, 44, 10, 5, button("4")):setSound("Fax_4.wav") self:addPanel(0, 272, 358):makeButton(0, 0, 43, 10, 6, button("5")):setSound("Fax_5.wav") self:addPanel(0, 326, 358):makeButton(0, 0, 44, 10, 7, button("6")):setSound("Fax_6.wav") self:addPanel(0, 218, 370):makeButton(0, 0, 44, 11, 8, button("7")):setSound("Fax_7.wav") self:addPanel(0, 271, 370):makeButton(0, 0, 44, 11, 9, button("8")):setSound("Fax_8.wav") self:addPanel(0, 326, 370):makeButton(0, 0, 44, 11, 10, button("9")):setSound("Fax_9.wav") self:addPanel(0, 217, 382):makeButton(0, 0, 45, 12, 11, button("*")) self:addPanel(0, 271, 382):makeButton(0, 0, 44, 11, 12, button("0")):setSound("Fax_0.wav") self:addPanel(0, 326, 382):makeButton(0, 0, 44, 11, 13, button("#")) end function UIFax:updateChoices() local choices = self.message.choices for i, button in ipairs(self.choice_buttons) do -- NB: both nil and true result in enabled; also handle old "disabled" choice local enabled = (choices[i].enabled ~= false) and (choices[i].choice ~= "disabled") button:enable(enabled) end end function UIFax:draw(canvas, x, y) self.background:draw(canvas, self.x + x, self.y + y) UIFullscreen.draw(self, canvas, x, y) x, y = self.x + x, self.y + y if self.message then local last_y = y + 40 for _, message in ipairs(self.message) do last_y = self.fax_font:drawWrapped(canvas, message.text, x + 190, last_y + (message.offset or 0), 330, "center") end local choices = self.message.choices if choices then local orig_y = y + 190 for i = 1, #choices do last_y = orig_y + ((i - 1) + (3 - #choices)) * 48 self.fax_font:drawWrapped(canvas, choices[i].text, x + 190, last_y + (choices[i].offset or 0), 300) end end end end --A choice was made for the fax. --!param choice_number (integer) Number of the choice function UIFax:choice(choice_number) local choices = self.message.choices local choice, additionalInfo if choices and choice_number >= 1 and choice_number <= #choices then choice = choices[choice_number].choice additionalInfo = choices[choice_number].additionalInfo else choice = "disabled" additionalInfo = nil end local owner = self.owner if owner then -- A choice was made, the patient is no longer waiting for a decision owner:setMood("patient_wait", "deactivate") owner.message_callback = nil if choice == "send_home" then owner:goHome("kicked") if owner.diagnosed then -- No treatment rooms owner:updateDynamicInfo(_S.dynamic_info.patient.actions.no_treatment_available) else -- No diagnosis rooms owner:updateDynamicInfo(_S.dynamic_info.patient.actions.no_diagnoses_available) end elseif choice == "wait" then -- Wait two months before going home owner.waiting = 60 if owner.diagnosed then -- Waiting for treatment room owner:updateDynamicInfo(_S.dynamic_info.patient.actions.waiting_for_treatment_rooms) else -- Waiting for diagnosis room owner:updateDynamicInfo(_S.dynamic_info.patient.actions.waiting_for_diagnosis_rooms) end elseif choice == "guess_cure" then owner:setDiagnosed() if owner:agreesToPay(owner.disease.id) then owner:setNextAction(SeekRoomAction(owner.disease.treatment_rooms[1]):enableTreatmentRoom()) else owner:goHome("over_priced", owner.disease.id) end elseif choice == "research" then owner:unregisterCallbacks() owner:setMood("idea", "activate") owner:setNextAction(SeekRoomAction("research")) end end local vip_ignores_refusal = math.random(1, 2) if choice == "accept_emergency" then self.ui.app.world:newObject("helicopter", self.ui.hospital, "north") self.ui:addWindow(UIWatch(self.ui, "emergency")) self.ui:playAnnouncement(self.ui.hospital.emergency.disease.emergency_sound, AnnouncementPriority.Critical) self.ui.adviser:say(_A.information.emergency) elseif choice == "refuse_emergency" then self.ui.app.world:nextEmergency() -- VIP may choose to visit anyway if he is refused too often elseif (self.ui.hospital.vip_declined > 2 and vip_ignores_refusal == 2) and choice == "refuse_vip" then self.ui.hospital.num_vips = self.ui.hospital.num_vips + 1 self.ui.app.world:spawnVIP(additionalInfo.name) self.ui.hospital.vip_declined = 0 elseif choice == "refuse_vip" then self.ui.app.world:nextVip() -- don't start an inspection self.ui.hospital.vip_declined = self.ui.hospital.vip_declined + 1 elseif choice == "accept_vip" then self.ui.hospital.num_vips = self.ui.hospital.num_vips + 1 self.ui.app.world:spawnVIP(additionalInfo.name) elseif choice == "declare_epidemic" then local epidemic = self.ui.hospital.epidemic if epidemic then epidemic:resolveDeclaration() end elseif choice == "cover_up_epidemic" then local epidemic = self.ui.hospital.epidemic if epidemic then epidemic:startCoverUp() end elseif choice == "accept_new_level" then -- Set the new salary. self.ui.hospital.player_salary = self.ui.hospital.salary_offer if tonumber(self.ui.app.world.map.level_number) then self.ui.app:loadLevel(self.ui.app.world.map.level_number + 1, self.ui.app.map.difficulty) else for i, level in ipairs(self.ui.app.world.campaign_info.levels) do if self.ui.app.world.map.level_number == level then local next_level = self.ui.app.world.campaign_info.levels[i + 1] local level_info, _ = self.ui.app:readLevelFile(next_level) if level_info then self.ui.app:loadLevel(next_level, nil, level_info.name, level_info.map_file, level_info.briefing) break end end end end elseif choice == "return_to_main_menu" then self.ui.app.moviePlayer:playWinMovie() self.ui.app:loadMainMenu() end self.icon:removeMessage() self:close() end function UIFax:cancel() self.code = "" end function UIFax:correct() if self.code ~= "" then self.code = string.sub(self.code, 1, -2) --Remove last character end end function UIFax:validate() if self.code == "" then return end local code = self.code self.code = "" local code_n = (tonumber(code) or 0) / 10^5 local x = math.abs((code_n ^ 5.00001 - code_n ^ 5) * 10^5 - code_n ^ 5) print("Code typed on fax:", code) if code == "24328" then -- Original game cheat code self.ui.adviser:say(_A.cheats.th_cheat) self.ui:addWindow(UICheats(self.ui)) elseif code == "112" then -- simple, unobfuscated cheat for everyone :) -- not that critical, but we want to make to make sure it's played fairly soon self.ui:playAnnouncement("rand*.wav", AnnouncementPriority.Critical) elseif 27868.3 < x and x < 27868.4 then -- Roujin's challenge cheat local hosp = self.ui.hospital if not hosp.spawn_rate_cheat then self.ui.adviser:say(_A.cheats.roujin_on_cheat) hosp.spawn_rate_cheat = true else self.ui.adviser:say(_A.cheats.roujin_off_cheat) hosp.spawn_rate_cheat = nil end else -- no valid cheat entered self.ui:playSound("fax_no.wav") return end self.ui:playSound("fax_yes.wav") -- TODO: Other cheats (preferably with slight obfuscation, as above) end function UIFax:appendNumber(number) self.code = self.code .. number end function UIFax:close() local world = self.ui.app.world self.icon.fax = nil self.icon:adjustToggle() UIFullscreen.close(self) if world and world:isCurrentSpeed("Pause") then world:setSpeed(world.prev_speed) end end function UIFax:afterLoad(old, new) UIFullscreen.afterLoad(self, old, new) if old < 59 then -- self.choice_buttons added, changes to disabled buttons. -- Since it's hard to add retroactively, just close any opened fax window. self:close() end end CorsixTH-0.63/CorsixTH/Lua/dialogs/fullscreen/graphs.lua000066400000000000000000000413031347163623700231610ustar00rootroot00000000000000--[[ Copyright (c) 2011 Ted "IntelOrca" John 2013 Edvin "Lego3" Linge 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. --]] --! Charts fullscreen window class "UIGraphs" (UIFullscreen) ---@type UIGraphs local UIGraphs = _G["UIGraphs"] local TH = require("TH") -- These values are based on the background colours of the pen symbols local colours = { money_in = {182, 32, 16}, money_out = {215, 81, 8}, wages = {194, 162, 0}, balance = {28, 138, 36}, visitors = {0, 101, 198}, cures = {36, 40, 154}, deaths = {130, 0, 178}, reputation = {215, 12, 101} } function UIGraphs:UIGraphs(ui) self:UIFullscreen(ui) local gfx = ui.app.gfx if not pcall(function() self.background = gfx:loadRaw("Graph01V", 640, 480) local palette = gfx:loadPalette("QData", "Graph01V.pal") palette:setEntry(255, 0xFF, 0x00, 0xFF) -- Make index 255 transparent self.panel_sprites = gfx:loadSpriteTable("QData", "Graph02V", true, palette) self.white_font = gfx:loadFont("QData", "Font01V", false, palette) self.black_font = gfx:loadFont("QData", "Font00V", false, palette) end) then ui:addWindow(UIInformation(ui, {_S.errors.dialog_missing_graphics})) self:close() return end self.hospital = ui.hospital -- Buttons self:addPanel(0, 63, 384):makeButton(0, 0, 26, 26, 3, self.close):setTooltip(_S.tooltip.graphs.close) -- The possible scales are: -- 1: Increments of four years per line -- 2: Increments of one year per line -- 3: Increments of one month per line self.graph_scale = 3 self.graph_scale_panel = self:addPanel(0, 371, 384) self.graph_scale_button = self.graph_scale_panel:makeButton(0, 0, 65, 26, 2, self.toggleGraphScale):setTooltip(_S.tooltip.graphs.scale) self.hide_graph = {} local function buttons(name) return --[[persistable:graphs_button]] function() self:toggleGraph(name) end end self.graph_buttons = { self:addPanel(0, 590, 34):makeToggleButton(0, 0, 42, 42, 1, buttons("money_in")):setTooltip(_S.tooltip.graphs.money_in), self:addPanel(0, 590, 86):makeToggleButton(0, 0, 42, 42, 1, buttons("money_out")):setTooltip(_S.tooltip.graphs.money_out), self:addPanel(0, 590, 138):makeToggleButton(0, 0, 42, 42, 1, buttons("wages")):setTooltip(_S.tooltip.graphs.wages), self:addPanel(0, 590, 190):makeToggleButton(0, 0, 42, 42, 1, buttons("balance")):setTooltip(_S.tooltip.graphs.balance), self:addPanel(0, 590, 243):makeToggleButton(0, 0, 42, 42, 1, buttons("visitors")):setTooltip(_S.tooltip.graphs.visitors), self:addPanel(0, 590, 295):makeToggleButton(0, 0, 42, 42, 1, buttons("cures")):setTooltip(_S.tooltip.graphs.cures), self:addPanel(0, 590, 347):makeToggleButton(0, 0, 42, 42, 1, buttons("deaths")):setTooltip(_S.tooltip.graphs.deaths), self:addPanel(0, 590, 400):makeToggleButton(0, 0, 42, 42, 1, buttons("reputation")):setTooltip(_S.tooltip.graphs.reputation) } self:updateLines() end local TOP_Y = 85 -- Top of the graph area local BOTTOM_Y = 353 -- Bottom of the graph area local RIGHT_X = 346 -- Right side of the graph area local VERT_DX = 25 -- Spacing between the vertical lines in the graph local VERT_COUNT = 12 -- Number of vertical lines in the graph local GRAPH_HEIGHT = BOTTOM_Y - TOP_Y --! Compute the vertical position of a value in the graph given the line extremes --!param graph_line (table) Meta data of the line, including extreme values. --!param value (number) Value to position vertically in the graph. --!return Y position in the graph of the value. local function computeVerticalValuePosition(graph_line, value) -- 0 is always included in the range. assert(graph_line.maximum >= 0 and graph_line.minimum <= 0) local range = graph_line.maximum - graph_line.minimum if range == 0 then return BOTTOM_Y end return BOTTOM_Y - math.floor(((value - graph_line.minimum) / range) * GRAPH_HEIGHT) end --! Convert graph scale to a stepsize in months. --!param graph_scale (int, 1 to 3) Graph scale to display. --!return Number of months to jump between statistics values in the hospital statistics data. local function getStatisticsStepsize(graph_scale) local stepsize = 4 * 12 -- Four years if graph_scale == 2 then stepsize = 12 -- One year elseif graph_scale == 3 then stepsize = 1 -- A month end return stepsize end --! Get the statistics from the hospital that should be displayed. --! Selection starts at the last (=newest) entry, and goes back in time. --!return The values of all statistics to plot in the graph display. function UIGraphs:getHospitalStatistics() local statistics = self.hospital.statistics local values = {} local i = #statistics -- Picking hospital statistics from right to left (recent to old). local stats_stepsize = getStatisticsStepsize(self.graph_scale) while #values < VERT_COUNT and i >= 1 do values[#values + 1] = statistics[i] i = i - stats_stepsize end return values end --! Reposition the given sequence of text entries vertically such that the maximum -- absolute deviation from the ideal position is minimized. --!param label_datas (array) Text entries --!param start_index (int) First entry to move. --!param last_index (int) Last entry to move. local function moveSequence(label_datas, start_index, last_index) -- min_y, max_y Smallest and biggest vertical position of the labels. Since -- they are sorted on y, it's the position of the first and last visible entry. -- min_y_shift, max_y_shift Vertical movement of the label of the first and -- last visible entry for vertically centering the text. -- min_dev, max_dev Smallest and biggest deviation from the optimal position, -- for all visible labels. local min_y = nil local max_y, min_y_shift, max_y_shift, min_dev, max_dev for i = start_index, last_index do local label = label_datas[i] if label.pos_y then -- Label is visible local deviation = label.pos_y - label.ideal_y -- Positive if moved down if min_y then -- Updating the max y, and deviations max_y = label.pos_y max_y_shift = label.shift_y min_dev = math.min(min_dev, deviation) max_dev = math.max(max_dev, deviation) else -- First time entering the loop min_y = label.pos_y max_y = label.pos_y min_y_shift = label.shift_y max_y_shift = label.shift_y min_dev = deviation max_dev = deviation end end end -- There should be at least one visible entry in the provided range. assert(min_y ~= nil) local move = -math.floor((max_dev + min_dev) / 2) -- Suggested movement of the sequence. -- Verify the sequence will stay inside graph upper and lower limits, adjust otherwise. if min_y + min_y_shift + move < TOP_Y then move = TOP_Y - min_y - min_y_shift elseif max_y + max_y_shift + move > BOTTOM_Y then move = BOTTOM_Y - max_y - max_y_shift end -- And update the positions. for i = start_index, last_index do local label = label_datas[i] if label.pos_y then label.pos_y = label.pos_y + move end end end --! Compute new actual position of the labels. --!param graph (UIGraphs) Graph window object local function updateTextPositions(graph) -- Reset vertical position of the text back to its ideal position. -- Disable computations on invisible graphs by removing the actual y position of it. for _, label in ipairs(graph.label_datas) do if graph.hide_graph[label.stat] then label.pos_y = nil else label.pos_y = label.ideal_y end end -- Move labels of the graphs such that they stay at the right of the graph -- between their upper and lower boundaries. local sequence_moved = true local collision_count = 8 -- In theory the loop should terminate, but better safe than sorry. while sequence_moved and collision_count > 0 do collision_count = collision_count - 1 sequence_moved = false -- Find sequences of text entries that partly overlap or have no vertical -- space between them. Entries in such a sequence cannot be moved -- individually, the sequence as a whole must move. local start_index, last_index = nil, nil -- Start and end of the sequence. local collision = false -- True collision detected in the sequence local prev_index, prev_label = nil, nil for i, label in ipairs(graph.label_datas) do if label.pos_y then -- Label is visible if prev_label then -- Bottom y of previous label, top of current label local bottom_prev = prev_label.pos_y + prev_label.shift_y + prev_label.size_y local top_current = label.pos_y + label.shift_y if top_current < bottom_prev then -- True collision, text has to move collision = true sequence_moved = true label.pos_y = bottom_prev - label.shift_y if not start_index then start_index = prev_index end last_index = i elseif top_current == bottom_prev then -- Entry is concatenated to the sequence, position is fine. if not start_index then start_index = prev_index end last_index = i else -- Entry is not part of the sequence, move previous sequence to its -- optimal spot if required if collision then moveSequence(graph.label_datas, start_index, last_index) end collision = false start_index = nil last_index = nil -- Do not consider the current text in this round. The next entry may -- see it as the start of a next sequence. end end prev_label = label prev_index = i end end if collision then moveSequence(graph.label_datas, start_index, last_index) end end end function UIGraphs:updateLines() self.values = self:getHospitalStatistics() -- Construct meta data about each graph line. local graph_datas = {} -- Table ordered by statistics name. self.graph_datas = graph_datas for stat, _ in pairs(self.values[1]) do graph_datas[stat] = {line = nil, maximum = 0, minimum = 0} end -- Decide maximum and minimum for normalisation of each line. -- 0 is always included in the computed range. for _, stats in ipairs(self.values) do for stat, value in pairs(stats) do if value < graph_datas[stat].minimum then graph_datas[stat].minimum = value end if value > graph_datas[stat].maximum then graph_datas[stat].maximum = value end end end -- Add the line objects of the graph. for stat, graph_data in pairs(self.graph_datas) do local line = TH.line() line:setWidth(2) local hue = colours[stat] line:setColour(hue[1], hue[2], hue[3], 255) graph_data.line = line end -- Add the graph line pieces. Doing this separately is more efficient as all -- graph lines can be extended to the left in the same iteration. local xpos = RIGHT_X for i, stats in ipairs(self.values) do for stat, value in pairs(stats) do local line = graph_datas[stat].line local ypos = computeVerticalValuePosition(graph_datas[stat], value) if i == 1 then line:moveTo(xpos, ypos) else line:lineTo(xpos, ypos) end end xpos = xpos - VERT_DX end -- Compute label data for each statistic, and order by vertical position. -- The newest statistic values are displayed at the right edge of the graph, -- which decides the optimal position of the graph label text and value. local label_datas = {} self.label_datas = label_datas for stat, value in pairs(self.values[1]) do local ideal_y = computeVerticalValuePosition(graph_datas[stat], value) local text = _S.graphs[stat] .. ":" local _, size_y, _ = self.black_font:sizeOf(text) label_datas[#label_datas + 1] = { stat = stat, -- Name of the statistic it belongs to. text = text, -- Translated label text. ideal_y = ideal_y, -- Ideal vertical position. pos_y = nil, -- Actual position for drawing. size_y = size_y, -- Vertical size of the text. shift_y = -math.floor(size_y / 2), -- Amount of shift to center the text. value = value} -- Numeric value to display. end -- Sort the labels of the graph on ideal y position, and compute actual position. local function compare(a,b) return a.ideal_y < b.ideal_y end table.sort(label_datas, compare) updateTextPositions(self) -- Create small lines going from the number of month name to the actual graph. -- Like the lines, index runs from right to left at the screen. local aux_lines = {} self.aux_lines = aux_lines xpos = RIGHT_X for _ = 1, #self.values do local line = TH.line() line:setWidth(1) line:moveTo(xpos, BOTTOM_Y + 2) line:lineTo(xpos, BOTTOM_Y + 8) aux_lines[#aux_lines + 1] = line xpos = xpos - VERT_DX end end function UIGraphs:draw(canvas, x, y) self.background:draw(canvas, self.x + x, self.y + y) UIFullscreen.draw(self, canvas, x, y) x, y = self.x + x, self.y + y self.white_font:draw(canvas, _S.graphs.money_in, x + 502, y + 41, 80, 27) self.white_font:draw(canvas, _S.graphs.money_out, x + 502, y + 93, 80, 27) self.white_font:draw(canvas, _S.graphs.wages, x + 502, y + 145, 80, 27) self.white_font:draw(canvas, _S.graphs.balance, x + 502, y + 197, 80, 27) self.white_font:draw(canvas, _S.graphs.visitors, x + 502, y + 249, 80, 27) self.white_font:draw(canvas, _S.graphs.cures, x + 502, y + 301, 80, 27) self.white_font:draw(canvas, _S.graphs.deaths, x + 502, y + 353, 80, 27) self.white_font:draw(canvas, _S.graphs.reputation, x + 502, y + 405, 80, 27) -- Draw the different lines for stat, graph in pairs(self.graph_datas) do if not self.hide_graph[stat] then graph.line:draw(canvas, x, y) end end -- Draw strings showing what values each entry has at the moment just to the right of the graph. -- TODO: These should be coloured according to the colour of the corresponding line. for _, label in pairs(self.label_datas) do if label.pos_y then local ypos = label.pos_y + label.shift_y self.black_font:draw(canvas, label.text, x + RIGHT_X + 3, y + ypos) self.black_font:draw(canvas, label.value, x + RIGHT_X + 60, y + ypos) end end local stats_stepsize = getStatisticsStepsize(self.graph_scale) local xpos = x + RIGHT_X -- Draw numbers (or month names) below the graph assert(#self.hospital.statistics > 0) -- Avoid negative months and years. if stats_stepsize >= 12 then -- Display years local year_number = math.floor((#self.hospital.statistics - 1) / 12) for i = 1, #self.values do self.black_font:drawWrapped(canvas, year_number, xpos, y + BOTTOM_Y + 10, 25, "center") xpos = xpos - VERT_DX year_number = year_number - math.floor(stats_stepsize / 12) -- And the small black line self.aux_lines[i]:draw(canvas, x, y) end else -- Display months local month_number = #self.hospital.statistics - math.floor((#self.hospital.statistics - 1) / 12) * 12 for i = 1, #self.values do self.black_font:drawWrapped(canvas, _S.months[month_number], xpos, y + BOTTOM_Y + 10, 25, "center") xpos = xpos - VERT_DX month_number = month_number - stats_stepsize if month_number < 1 then month_number = month_number + 12 end -- And the small black line self.aux_lines[i]:draw(canvas, x, y) end end end function UIGraphs:toggleGraphScale() self.graph_scale = self.graph_scale + 1 if self.graph_scale == 4 then self.graph_scale = 1 end self:updateLines() self.ui:playSound("selectx.wav") end function UIGraphs:toggleGraph(name) self.hide_graph[name] = not self.hide_graph[name] self.ui:playSound("selectx.wav") updateTextPositions(self) end function UIGraphs:close() UIFullscreen.close(self) self.ui:getWindow(UIBottomPanel):updateButtonStates() end function UIGraphs:afterLoad(old, new) UIFullscreen.afterLoad(self, old, new) if old < 117 then self:close() end end CorsixTH-0.63/CorsixTH/Lua/dialogs/fullscreen/hospital_policy.lua000066400000000000000000000217401347163623700251020ustar00rootroot00000000000000--[[ Copyright (c) 2009 Edvin "Lego3" Linge 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. --]] --! Hospital policy fullscreen window (set staff tiredness and patient cure thresholds, etc.). class "UIPolicy" (UIFullscreen) ---@type UIPolicy local UIPolicy = _G["UIPolicy"] function UIPolicy:UIPolicy(ui, disease_selection) self:UIFullscreen(ui) local gfx = ui.app.gfx if not pcall(function() self.background = gfx:loadRaw("Pol01V", 640, 480) local palette = gfx:loadPalette("QData", "Pol01V.pal") palette:setEntry(255, 0xFF, 0x00, 0xFF) -- Make index 255 transparent self.panel_sprites = gfx:loadSpriteTable("QData", "Pol02V", true, palette) self.label_font = gfx:loadFont("QData", "Font74V", false, palette) self.text_font = gfx:loadFont("QData", "Font105V", false, palette) end) then ui:addWindow(UIInformation(ui, {_S.errors.dialog_missing_graphics})) self:close() return end local hosp = ui.hospital self.hospital = hosp local --[[persistable:hospital_policy_allow_staff]] function allowStaff(name, state, btn) if name == "Allow" then if self.prohibit_button.toggled then -- Changing setting from prohibit to allow hosp.policies["staff_allowed_to_move"] = true self.prohibit_button:toggle() else -- Already allowed, toggle again self.allow_button:toggle() end else -- Clicking the prohibit button if self.allow_button.toggled then -- Changing setting from allow to prohibit hosp.policies["staff_allowed_to_move"] = false self.allow_button:toggle() else -- Already prohibited, toggle again self.prohibit_button:toggle() end end end -- Buttons self:addPanel(0, 607, 447):makeButton(0, 0, 26, 26, 6, self.close) :setTooltip(_S.tooltip.policy.close) self.allow_button = self:addPanel(0, 348, 379) :makeToggleButton(0, 0, 48, 17, 4, allowStaff, "Allow") :setTooltip(_S.tooltip.policy.staff_leave) -- Allow staff to move self.prohibit_button = self:addPanel(0, 395, 379) :makeToggleButton(0, 0, 48, 17, 5, allowStaff, "Prohibit") :setTooltip(_S.tooltip.policy.staff_stay) -- Prohibit staff to move if self.hospital.policies["staff_allowed_to_move"] then self.allow_button:toggle() else self.prohibit_button:toggle() end -- Slider positions local guess = 129 + math.floor(hosp.policies["guess_cure"] * 299) local home = 129 + math.floor(hosp.policies["send_home"] * 299) local stop = 124 + math.floor((hosp.policies["stop_procedure"] - 1) * 299) local staffroom = 149 + math.floor(hosp.policies["goto_staffroom"] * 250) -- Sliders self.sliders = {} self.sliders["guess_cure"] = self:addPanel(2, guess, 119, 82, 44) self.sliders["send_home"] = self:addPanel(1, home, 135, 82, 28) self.sliders["stop_procedure"] = self:addPanel(3, stop, 210, 92, 28) self.sliders["goto_staffroom"] = self:addPanel(3, staffroom, 285, 92, 28) self.sliders["guess_cure"].min_x = home self.sliders["guess_cure"].total_min_x = 129 -- Needed to get the correct value set when windows is closed. self.sliders["guess_cure"].max_x = 428 self.sliders["send_home"].min_x = 129 self.sliders["send_home"].max_x = guess self.sliders["send_home"].total_max_x = 428 self.sliders["stop_procedure"].min_x = 124 self.sliders["stop_procedure"].max_x = 423 self.sliders["stop_procedure"].addition = true -- This value goes from 1 to 2. self.sliders["goto_staffroom"].min_x = 149 self.sliders["goto_staffroom"].max_x = 399 -- Z order of the sliders. -- The small 'send_home' slider must be tested first in 'self:panelHit', -- to ensure it can always be moved, even if the big 'guess_cure' is at the -- same position. self.sliders_z = {self.sliders["send_home"], self.sliders["guess_cure"], self.sliders["stop_procedure"], self.sliders["goto_staffroom"]} -- Tooltips for slider bars self:makeTooltip(_S.tooltip.policy.diag_procedure, 161, 119, 479, 174) self:makeTooltip(_S.tooltip.policy.diag_termination, 161, 210, 479, 249) self:makeTooltip(_S.tooltip.policy.staff_rest, 161, 285, 479, 324) end function UIPolicy:draw(canvas, x, y) self.background:draw(canvas, self.x + x, self.y + y) UIFullscreen.draw(self, canvas, x, y) x, y = self.x + x, self.y + y local text = self.text_font local label = self.label_font -- Labels on the panels local added_x = self.sliders["send_home"].x local added_y = self.sliders["send_home"].y label:draw(canvas, _S.policy.sliders.send_home, x + added_x, y + added_y + 2, 82, 0) added_x = self.sliders["guess_cure"].x added_y = self.sliders["guess_cure"].y label:draw(canvas, _S.policy.sliders.guess, x + added_x, y + added_y + 2, 82, 0) added_x = self.sliders["stop_procedure"].x added_y = self.sliders["stop_procedure"].y label:draw(canvas, _S.policy.sliders.stop, x + added_x, y + added_y + 2, 92, 0) added_x = self.sliders["goto_staffroom"].x added_y = self.sliders["goto_staffroom"].y label:draw(canvas, _S.policy.sliders.staff_room, x + added_x, y + added_y + 2, 92, 0) -- All other text text:draw(canvas, _S.policy.header, x + 160, y + 78, 300, 0) text:draw(canvas, _S.policy.diag_procedure, x + 161, y + 100) text:draw(canvas, _S.policy.diag_termination, x + 161, y + 181) text:draw(canvas, _S.policy.staff_rest, x + 161, y + 262) text:draw(canvas, _S.policy.staff_leave_rooms, x + 161, y + 374) end function UIPolicy:onMouseMove(x, y, dx, dy) local repaint = UIFullscreen.onMouseMove(self, x, y, dx, dy) if self.moving_panel then -- A slider is being moved. local p = self.moving_panel self.moved_x = self.moved_x + dx local new_x = self.moved_x + self.down_x - self.moving_panel.w / 2 - self.offset if new_x > p.min_x then if new_x < p.max_x then self.moving_panel.x = new_x self.position_x = new_x else self.moving_panel.x = self.moving_panel.max_x self.position_x = self.moving_panel.max_x end else self.moving_panel.x = self.moving_panel.min_x self.position_x = self.moving_panel.min_x end repaint = true end return repaint end function UIPolicy:onMouseDown(code, x, y) if code == "left" then self.moving_panel = self:panelHit(x, y) if self.moving_panel then self.down_x = x self.offset = x - (self.moving_panel.x + self.moving_panel.w / 2) self.moved_x = 0 self.position_x = self.moving_panel.x return true end end return UIFullscreen.onMouseDown(self, code, x, y) end function UIPolicy:onMouseUp(code, x, y) if self.moving_panel then if self.moving_panel == self.sliders["guess_cure"] then self.sliders["send_home"].max_x = self.position_x elseif self.moving_panel == self.sliders["send_home"] then self.sliders["guess_cure"].min_x = self.position_x end end self.moving_panel = nil return UIFullscreen.onMouseUp(self, code, x, y) end --! Detect which slider is clicked by the mouse. --!param x (int) X position of the mouse. --!param y (int) Y position of the mouse. --!return Slider that was detected at the given position, or nil function UIPolicy:panelHit(x, y) for _, panel in ipairs(self.sliders_z) do if x > panel.x and y > panel.y and x < panel.x + panel.w and y < panel.y + panel.h then return panel end end return nil end --! Close the window. function UIPolicy:close() -- Save new slider positions in the hospital policies again for the next use. for key, s in pairs(self.sliders or {}) do local divider = (s.total_max_x or s.max_x) - (s.total_min_x or s.min_x) local number = (s.addition and 1 or 0) self.hospital.policies[key] = number + (s.x - (s.total_min_x or s.min_x))/divider end UIFullscreen.close(self) self.ui:getWindow(UIBottomPanel):updateButtonStates() end function UIPolicy:afterLoad(old, new) UIFullscreen.afterLoad(self, old, new) if old < 116 then -- Ensure panelHit tests the sliders in the right order. self.sliders_z = {self.sliders["send_home"], self.sliders["guess_cure"], self.sliders["stop_procedure"], self.sliders["goto_staffroom"]} end end CorsixTH-0.63/CorsixTH/Lua/dialogs/fullscreen/progress_report.lua000066400000000000000000000220641347163623700251370ustar00rootroot00000000000000--[[ Copyright (c) 2010 Edvin "Lego3" Linge 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. --]] --! Progress Report fullscreen window (check level goals, competitors and alerts). class "UIProgressReport" (UIFullscreen) ---@type UIProgressReport local UIProgressReport = _G["UIProgressReport"] function UIProgressReport:UIProgressReport(ui) -- TODO: Refactor this file! self:UIFullscreen(ui) local world = self.ui.app.world local hospital = ui.hospital local gfx = ui.app.gfx if not pcall(function() local palette = gfx:loadPalette("QData", "Rep01V.pal") palette:setEntry(255, 0xFF, 0x00, 0xFF) -- Make index 255 transparent self.background = gfx:loadRaw("Rep01V", 640, 480) self.red_font = gfx:loadFont("QData", "Font101V", false, palette) self.normal_font = gfx:loadFont("QData", "Font100V", false, palette) self.small_font = gfx:loadFont("QData", "Font106V") self.panel_sprites = gfx:loadSpriteTable("QData", "Rep02V", true, palette) end) then ui:addWindow(UIInformation(ui, {_S.errors.dialog_missing_graphics})) self:close() return end self.default_button_sound = "selectx.wav" -- Selected hospital number self.selected = 1 -- Add the icons for the criteria local x = 263 local world_goals = world.goals for _, tab in ipairs(world_goals) do local crit_name = world.level_criteria[tab.criterion].name local res_value = world_goals[crit_name].win_value world_goals[crit_name].visible = true -- Special case for money, subtract loans local cur_value = hospital[crit_name] if crit_name == "balance" then cur_value = cur_value - hospital.loan end if world_goals[crit_name].lose_value then world_goals[crit_name].red = false if cur_value < world_goals[crit_name].boundary then world_goals[crit_name].red = true res_value = world_goals[crit_name].lose_value -- TODO: Make the ugly workaround for the special case "percentage_killed" better if crit_name:find("killed") then res_value = nil world_goals[crit_name].visible = false end elseif not world_goals[crit_name].win_value then world_goals[crit_name].visible = false end end -- Only five criteria can be there at once. if crit_name:find("killed") and world.winning_goal_count > 5 then res_value = nil world_goals[crit_name].visible = false end if res_value then local tooltip if world.level_criteria[tab.criterion].formats == 2 then tooltip = _S.tooltip.status[crit_name]:format(math.floor(res_value), math.floor(cur_value)) else tooltip = _S.tooltip.status[crit_name]:format(math.floor(res_value)) end self:addPanel(world.level_criteria[tab.criterion].icon, x, 240) self:makeTooltip(tooltip, x, 180, x + 30, 180 + 90) x = x + 30 end end self:addPanel(0, 606, 447):makeButton(0, 0, 26, 26, 8, self.close):setTooltip(_S.tooltip.status.close) -- Own and competitor hospital buttons local function btn_handler(num) return --[[persistable:progress_report_hospital_button]] function() self.selected = num end end local function tooltip(num) return (num == 1) and _S.tooltip.status.win_progress_own or _S.tooltip.status.win_progress_other:format(world.hospitals[num].name) .. " " .. _S.misc.not_yet_implemented end local function make_hosp_button(num) self:addPanel(0, 265, 71 + (num - 1) * 25) :makeButton(0, 0, 147, 20, 9, btn_handler(num)) :setTooltip(tooltip(num)) :enable(num == 1) end for i = 1, math.min(#world.hospitals, 4) do make_hosp_button(i) end self:makeTooltip(_S.tooltip.status.population_chart .. " " .. _S.misc.not_yet_implemented, 433, 64, 578, 179) self:makeTooltip(_S.tooltip.status.happiness, 433, 179, 578, 209) self:makeTooltip(_S.tooltip.status.thirst, 433, 209, 578, 239) self:makeTooltip(_S.tooltip.status.warmth, 433, 239, 578, 270) self.warning = self:addPanel(7, 252, 295) self.warning.visible = false -- TODO: 6 gray end function UIProgressReport:close() UIFullscreen.close(self) self.ui:getWindow(UIBottomPanel):updateButtonStates() end function UIProgressReport:drawMarkers(canvas, x, y) local x_min = 455 local x_max = 551 local width = x_max - x_min local happiness = self.ui.hospital:getAveragePatientAttribute("happiness", 0.5) local thirst = 1 - self.ui.hospital:getAveragePatientAttribute("thirst", 0.5) local warmth = self.ui.hospital:getAveragePatientAttribute("warmth", nil) warmth = UIPatient.normaliseWarmth(warmth) self.panel_sprites:draw(canvas, 5, math.floor(x + x_min + width * happiness), y + 193) self.panel_sprites:draw(canvas, 5, math.floor(x + x_min + width * thirst), y + 223) self.panel_sprites:draw(canvas, 5, math.floor(x + x_min + width * warmth), y + 254) local world = self.ui.app.world if world.free_build_mode then self.normal_font:drawWrapped(canvas, _S.progress_report.free_build, x + 265, y + 194, 150, "center") end -- Possibly show warning that it's too cold, too hot, patients not happy -- or if theres need to build drink machines as folks are thirsty. Only show one at a time though! -- TODO the levels may need adjustment local msg = self.ui.hospital.show_progress_screen_warnings if warmth < 0.3 and msg == 1 then self.warning.visible = true self.normal_font:drawWrapped(canvas, _S.progress_report.too_cold, x + 285, y + 285, 285) elseif warmth > 0.7 and msg == 1 then self.warning.visible = true self.normal_font:drawWrapped(canvas, _S.progress_report.too_hot, x + 285, y + 285, 285) elseif thirst > 0.7 and msg == 2 then self.warning.visible = true self.normal_font:drawWrapped(canvas, _S.progress_report.more_drinks_machines, x + 285, y + 285, 285) elseif happiness < 0.8 and happiness >= 0.6 and msg == 3 then self.warning.visible = true self.normal_font:drawWrapped(canvas, _S.progress_report.quite_unhappy, x + 285, y + 285, 285) elseif happiness < 0.6 and msg == 3 then self.warning.visible = true self.normal_font:drawWrapped(canvas, _S.progress_report.very_unhappy, x + 285, y + 285, 285) else self.warning.visible = false end end function UIProgressReport:draw(canvas, x, y) self.background:draw(canvas, self.x + x, self.y + y) UIFullscreen.draw(self, canvas, x, y) x, y = self.x + x, self.y + y local hospital = self.ui.hospital local world = hospital.world local world_goals = world.goals -- Names of the players playing local ly = 73 for pnum, player in ipairs(world.hospitals) do local font = (pnum == self.selected) and self.red_font or self.normal_font font:draw(canvas, player.name:upper(), x + 272, y + ly) ly = ly + 25 end -- Draw the vertical bars for the winning conditions local lx = 270 for _, tab in ipairs(world_goals) do local crit_name = world.level_criteria[tab.criterion].name if world_goals[crit_name].visible then local sprite_offset = world_goals[crit_name].red and 2 or 0 local cur_value = hospital[crit_name] -- Balance is special if crit_name == "balance" then cur_value = cur_value - hospital.loan end local height if world_goals[crit_name].red then local lose = world_goals[crit_name].lose_value height = 1 + 49 * (1 - ((cur_value - lose)/(world_goals[crit_name].boundary - lose))) else height = 1 + 49 * (cur_value/world_goals[crit_name].win_value) end if height > 50 then height = 50 end local result_y = 0 for dy = 0, height - 1 do self.panel_sprites:draw(canvas, 1 + sprite_offset, x + lx, y + 237 - dy) result_y = result_y + 1 end self.panel_sprites:draw(canvas, 2 + sprite_offset, x + lx, y + 237 - result_y) lx = lx + 30 end end self:drawMarkers(canvas, x, y) self.normal_font:draw(canvas, _S.progress_report.header .. " " .. (world:date():year() + 1999), x + 227, y + 40, 400, 0) self.small_font:draw(canvas, _S.progress_report.win_criteria:upper(), x + 263, y + 172) self.small_font:draw(canvas, _S.progress_report.percentage_pop:upper() .. " " .. (hospital.population * 100) .. "%", x + 450, y + 65) end CorsixTH-0.63/CorsixTH/Lua/dialogs/fullscreen/research_policy.lua000066400000000000000000000206501347163623700250520ustar00rootroot00000000000000--[[ Copyright (c) 2010 M.Chalon 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. --]] class "UIResearch" (UIFullscreen) ---@type UIResearch local UIResearch = _G["UIResearch"] local research_categories = { "cure", "diagnosis", "drugs", "improvements", "specialisation", } local col_bg = { red = 24, green = 24, blue = 20, } function UIResearch:UIResearch(ui) self:UIFullscreen(ui) local gfx = ui.app.gfx if not pcall(function() self.background = gfx:loadRaw("Res01V", 640, 480) local palette = gfx:loadPalette("QData", "Res01V.pal") palette:setEntry(255, 0xFF, 0x00, 0xFF) -- Make index 255 transparent self.panel_sprites = gfx:loadSpriteTable("QData", "Res02V", true, palette) self.label_font = gfx:loadFont("QData", "Font43V", false, palette) self.number_font = gfx:loadFont("QData", "Font43V", false, palette) end) then ui:addWindow(UIInformation(ui, {_S.errors.dialog_missing_graphics})) self:close() return end self.hospital = ui.hospital self.research = ui.hospital.research -- stubs for backwards compatibility local --[[persistable:research_policy_adjust]] function adjust(name) end local --[[persistable:research_less_stub]] function less_stub() end local --[[persistable:research_more_stub]] function more_stub() end -- Close button self:addPanel(0, 607, 447):makeButton(0, 0, 40, 40, 4, self.close):setTooltip(_S.tooltip.research.close) self.adjust_buttons = {} self:updateCategories() self.waterclk = 0 self.ratclk = 0 self.waterpanel= self:addPanel(5, 2, 312) self.ratpanel= self:addPanel(13, 480, 365) -- Add tooltips to progress of research. local lx = 165 local ly = 60 for _, category in ipairs(research_categories) do self:makeDynamicTooltip(--[[persistable:research_policy_research_progress_tooltip]] function() local research = self.research.research_policy if research[category].current and not research[category].current.dummy then local required = self.research:getResearchRequired(research[category].current) local available = self.research.research_progress[research[category].current].points return _S.tooltip.research_policy.research_progress:format(math.round(available), required) else return _S.tooltip.research_policy.no_research end end, lx, ly, lx + 315, ly + 41) ly = ly + 41 end end function UIResearch:updateCategories() -- Buttons to increase/decrease percentages local size = 40 local topy = 21 local spacing = 41 local c1 = 372 local c2 = 450 local function handler_factory(area, mode) return --[[persistable:research_policy_adjust_handler]] function(window) window:adjustResearch(area, mode) end end --[[ Retrieves a translated string dynamically !param string_name (string) The key name (e.g., "tooltip.research.cure_dec") !return (string) The actual translation (e.g., "Decrease cure percentage") ]] local function get_localized_string(string_name) local var_table = _G["_S"] for token in string.gmatch(string_name, "[%w_]+") do var_table = var_table[token] end return var_table end for i, area in ipairs(research_categories) do local current = self.hospital.research.research_policy[area].current if current then self.adjust_buttons[area] = { less = self:addPanel(0, c1, topy + i * spacing) :makeRepeatButton(0, 0, size, size, 1, handler_factory(area, "less")) :setTooltip(get_localized_string("tooltip.research." .. area .. "_dec")), more = self:addPanel(0, c2, topy + i * spacing) :makeRepeatButton(0, 0, size, size, 2, handler_factory(area, "more")) :setTooltip(get_localized_string("tooltip.research." .. area .. "_inc")), } else if self.adjust_buttons[area] then self.adjust_buttons[area].less.enabled = false self.adjust_buttons[area].more.enabled = false end self:addColourPanel(c1, topy + i * spacing, 120, 30, col_bg.red, col_bg.green, col_bg.blue) end end end function UIResearch:adjustResearch(area, mode) local res = self.research local amount = 1 if self.ui.app.key_modifiers.ctrl then amount = amount * 20 elseif self.ui.app.key_modifiers.shift then amount = amount * 5 end if mode == "less" then if res.research_policy[area].frac > 0 then res.research_policy[area].frac = math.max(0, res.research_policy[area].frac - amount) self.ui:playSound("selectx.wav") else self.ui:playSound("Wrong2.wav") end elseif mode == "more" then if res.research_policy.global < 100 and res.research_policy[area].current then res.research_policy[area].frac = res.research_policy[area].frac + math.min(amount, 100 - res.research_policy.global) self.ui:playSound("selectx.wav") else self.ui:playSound("Wrong2.wav") end end res.research_policy.global = 0 for _, category in ipairs(research_categories) do res.research_policy.global = res.research_policy.global + res.research_policy[category].frac end end function UIResearch:onTick() -- sprite index for the water are between 5 and 12 -- We use a sub clock self.waterclk = self.waterclk + 1 if self.waterclk > 3 then self.waterclk = 0 self.waterpanel.sprite_index = self.waterpanel.sprite_index + 1 if self.waterpanel.sprite_index > 12 then self.waterpanel.sprite_index = 5 end end -- sprite index for the rat are between 10 and 15 -- We use a sub clock self.ratclk = self.ratclk + 1 if self.ratclk > 3 then self.ratclk = 0 -- sprite index for the water are between 13 and 20 self.ratpanel.sprite_index = self.ratpanel.sprite_index + 1 if self.ratpanel.sprite_index > 20 then self.ratpanel.sprite_index = 13 end end return UIFullscreen.onTick(self) end function UIResearch:draw(canvas, x, y) self.background:draw(canvas, self.x + x, self.y + y) UIFullscreen.draw(self, canvas, x, y) x, y = self.x + x, self.y + y local num_font = self.number_font local lbl_font = self.label_font local ytop = 28 local spacing = 41 local research = self.research.research_policy for i, category in ipairs(research_categories) do local ypos = y + ytop + i * spacing lbl_font:draw(canvas, _S.research.categories[category], x + 170, ypos) if not research[category].current then num_font:draw(canvas, _S.misc.done, x + 270, ypos, 300, 0) else num_font:draw(canvas, research[category].frac, x + 270, ypos, 300, 0) end -- Display research progress. if research[category].current and not research[category].current.dummy then local ly = ypos + 26 local lx = x + 172 local required = self.research:getResearchRequired(research[category].current) local available = self.research.research_progress[research[category].current].points local length = 290 * available / required local dx = 0 while dx + 10 < length do self.panel_sprites:draw(canvas, 3, lx + dx, ly) dx = dx + 10 end end end num_font:draw(canvas, research.global, x + 270, y + 288, 300, 0) end function UIResearch:close() UIFullscreen.close(self) self.ui:getWindow(UIBottomPanel):updateButtonStates() end function UIResearch:afterLoad(old, new) UIFullscreen.afterLoad(self, old, new) if old < 26 then self.adjust_buttons = {} for i, area in ipairs(research_categories) do self.adjust_buttons[area] = { less = self.buttons[2 * i], more = self.buttons[2 * i + 1], } end end end CorsixTH-0.63/CorsixTH/Lua/dialogs/fullscreen/staff_management.lua000066400000000000000000000526571347163623700252120ustar00rootroot00000000000000--[[ Copyright (c) 2009 Edvin "Lego3" Linge 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. --]] local math_floor = math.floor --! Staff management screen class "UIStaffManagement" (UIFullscreen) ---@type UIStaffManagement local UIStaffManagement = _G["UIStaffManagement"] function UIStaffManagement:UIStaffManagement(ui) self:UIFullscreen(ui) local gfx = ui.app.gfx if not pcall(function() self.background = gfx:loadRaw("Staff01V", 640, 480) local palette = gfx:loadPalette("QData", "Staff01V.pal") palette:setEntry(255, 0xFF, 0x00, 0xFF) -- Make index 255 transparent self.panel_sprites = gfx:loadSpriteTable("QData", "Staff02V", true, palette) self.title_font = gfx:loadFont("QData", "Font01V", false, palette) self.face_parts = ui.app.gfx:loadRaw("Face01V", 65, 1350, nil, "Data", "MPalette.dat") end) then ui:addWindow(UIInformation(ui, {_S.errors.dialog_missing_graphics})) self:close() return end local hosp = ui.hospital self.ui = ui self.hospital = hosp -- Order the staff self:updateStaffList() self.default_button_sound = "selectx.wav" -- Close button self:addPanel(0, 603, 443):makeButton(0, 0, 26, 26, 10, self.close):setTooltip(_S.tooltip.staff_list.close) -- Top categories local --[[persistable:staff_management_category]] function category(name, state, btn) self:setCategory(name) end self.categories = { self:addPanel(0, 53, 15):makeToggleButton(0, 0, 58, 58, 1, category, "Doctor"):setTooltip(_S.tooltip.staff_list.doctors), self:addPanel(0, 119, 15):makeToggleButton(0, 0, 58, 58, 1, category, "Nurse"):setTooltip(_S.tooltip.staff_list.nurses), self:addPanel(0, 185, 15):makeToggleButton(0, 0, 58, 58, 1, category, "Handyman"):setTooltip(_S.tooltip.staff_list.handymen), self:addPanel(0, 251, 15):makeToggleButton(0, 0, 58, 58, 1, category, "Receptionist"):setTooltip(_S.tooltip.staff_list.receptionists), } -- Other buttons self:addPanel(0, 12, 86):makeButton(0, 0, 31, 74, 2, self.scrollUp):setTooltip(_S.tooltip.staff_list.prev_person) self:addPanel(0, 12, 274):makeButton(0, 0, 31, 74, 3, self.scrollDown):setTooltip(_S.tooltip.staff_list.next_person) self:addPanel(0, 319, 372):makeButton(0, 0, 112, 39, 7, self.payBonus):setTooltip(_S.tooltip.staff_list.bonus) self:addPanel(0, 319, 418):makeButton(0, 0, 112, 39, 8, self.increaseSalary):setTooltip(_S.tooltip.staff_list.pay_rise) self:addPanel(0, 438, 372):makeButton(0, 0, 45, 85, 9, self.fire):setTooltip(_S.tooltip.staff_list.sack) -- "Arrow" to show title of doctors self.arrow = self:addPanel(12, 259, 397) self.arrow_position = 259 self.arrow.visible = false -- Scroll bar dot self.scroll_dot = self:addPanel(11, 21, 168) self.scroll_dot.visible = false -- Doctors' skills or progress towards them self.progress_surgeon = self:addPanel(17, 188, 408) self.progress_surgeon.visible = false self.qualified_surgeon = self:addPanel(20, 188, 408):setTooltip(_S.tooltip.staff_list.surgeon) self.qualified_surgeon.visible = false self.progress_psychiatrist = self:addPanel(18, 228, 408) self.progress_psychiatrist.visible = false self.qualified_psychiatrist = self:addPanel(21, 228, 408):setTooltip(_S.tooltip.staff_list.psychiatrist) self.qualified_psychiatrist.visible = false self.progress_researcher = self:addPanel(19, 268, 408) self.progress_researcher.visible = false self.qualified_researcher = self:addPanel(22, 268, 408):setTooltip(_S.tooltip.staff_list.researcher) self.qualified_researcher.visible = false -- Blankers for each row local row_blankers = {} for i = 1, 10 do row_blankers[i] = self:addColourPanel(50, 55 + i*27, 580, 27, 60, 174, 203) end self.row_blankers = row_blankers -- Extra background for the portrait self.portrait_back = self:addColourPanel(65, 374, 71, 81, 210, 255, 255) self.portrait_back.visible = false -- Doctor skill blankers self.title_blanker = self:addColourPanel(225, 365, 90, 39, 57, 166, 198) self.skill_blanker = self:addColourPanel(142, 406, 168, 54, 57, 166, 198) -- Tooltip regions self:makeTooltip(_S.tooltip.staff_list.happiness, 321, 51, 421, 75) self:makeTooltip(_S.tooltip.staff_list.tiredness, 426, 51, 526, 75) self:makeTooltip(_S.tooltip.staff_list.ability, 530, 51, 629, 75) self:makeTooltip(_S.tooltip.staff_list.detail, 146, 367, 226, 407) self:makeTooltip(_S.tooltip.staff_list.view_staff, 495, 371, 583, 458) self.row_tooltips = {} for line_num = 1, 10 do self.row_tooltips[line_num] = { self:makeTooltip(_S.tooltip.staff_list.salary, 193, 84 + 27 * (line_num - 1), 313, 108 + 27 * (line_num - 1)), self:makeTooltip(_S.tooltip.staff_list.happiness_2, 321, 84 + 27 * (line_num - 1), 421, 108 + 27 * (line_num - 1)), self:makeTooltip(_S.tooltip.staff_list.tiredness_2, 425, 84 + 27 * (line_num - 1), 525, 108 + 27 * (line_num - 1)), self:makeTooltip(_S.tooltip.staff_list.ability_2, 529, 84 + 27 * (line_num - 1), 628, 108 + 27 * (line_num - 1)), } end self.seniority_tooltip = self:makeTooltip(_S.tooltip.staff_list.doctor_seniority, 230, 367, 310, 407) self.skills_tooltip = self:makeTooltip(_S.tooltip.staff_list.skills, 146, 406, 186, 460) self:setCategory("Doctor") self:registerKeyHandlers() end function UIStaffManagement:registerKeyHandlers() -- Hotkeys. self:addKeyHandler("ingame_scroll_left", self.previousCategory) self:addKeyHandler("ingame_scroll_right", self.nextCategory) self:addKeyHandler("ingame_scroll_up", self.previousStaff) self:addKeyHandler("ingame_scroll_down", self.nextStaff) end function UIStaffManagement:updateTooltips() self.seniority_tooltip.enabled = self.category == "Doctor" self.skills_tooltip.enabled = self.category == "Doctor" for i, tooltips in ipairs(self.row_tooltips) do local state = 10 * (self.page - 1) + i <= #self.staff_members[self.category] for _, tooltip in ipairs(tooltips) do tooltip.enabled = state end end end function UIStaffManagement:updateStaffList(staff_member_removed) local selected_staff if staff_member_removed then -- The update was issued because someone was removed from the list, we need to handle this. selected_staff = self.staff_members[self.category][self.selected_staff] if self.staff_members[self.category][self.selected_staff] == staff_member_removed then self.selected_staff = nil selected_staff = nil end end local hosp = self.hospital local staff_members = { Doctor = {}, Nurse = {}, Handyman = {}, Receptionist = {}, } staff_members.Surgeon = staff_members.Doctor for _, staff in ipairs(hosp.staff) do local list = staff_members[staff.humanoid_class] list[#list + 1] = staff -- The selected staff might have been moved because someone else was removed from the list. if selected_staff == staff then self.selected_staff = #list end end self.staff_members = staff_members if staff_member_removed then self:updateTooltips() -- If we're viewing a page that no longer exists, go back a page if self.page > math.ceil(#self.staff_members[self.category] / 10) then self:scrollUp() end self:updateScrollDotVisibility() end end function UIStaffManagement:setCategory(name) self.skill_blanker.visible = name ~= "Doctor" self.title_blanker.visible = name ~= "Doctor" self.category = name for _, btn in ipairs(self.categories) do local should_be_toggled = btn.on_click_self == name if btn.toggled ~= should_be_toggled then btn:toggle() end end self.selected_staff = nil self.page = 1 self:updateScrollDotVisibility() self:updateTooltips() end -- Function to select given list index in the current category. -- Includes jumping to correct page. function UIStaffManagement:selectIndex(idx) if idx > #self.staff_members[self.category] or idx <= 0 then return end self.page = math.floor((idx - 1) / 10) + 1 self.selected_staff = idx end -- Function to select a given staff member. -- Includes switching to correct category and page. function UIStaffManagement:selectStaff(staff) self:setCategory(staff.humanoid_class == "Surgeon" and "Doctor" or staff.humanoid_class) for i, s in ipairs(self.staff_members[self.category]) do if s == staff then self:selectIndex(i) break end end end function UIStaffManagement:draw(canvas, x, y) self.background:draw(canvas, self.x + x, self.y + y) UIFullscreen.draw(self, canvas, x, y) x, y = self.x + x, self.y + y local titles = self.title_font -- Titles titles:draw(canvas, _S.staff_list.morale, x + 323, y + 31, 95, 0) titles:draw(canvas, _S.staff_list.tiredness, x + 427, y + 31, 95, 0) titles:draw(canvas, _S.staff_list.skill, x + 530, y + 31, 95, 0) -- Number of employees titles:draw(canvas, #self.staff_members["Doctor"], x + 79, y + 57) titles:draw(canvas, #self.staff_members["Nurse"], x + 145, y + 57) titles:draw(canvas, #self.staff_members["Handyman"], x + 211, y + 57) titles:draw(canvas, #self.staff_members["Receptionist"], x + 277, y + 57) local total_happiness = 0 local total_fatigue = 0 local total_skill = 0 -- Draw each listing local staff_list = self.staff_members[self.category] for i, staff in ipairs(staff_list) do if not staff then break end -- Morale, tiredness and skill, used to draw the average at the end too. local happiness_bar_width = 0 if staff.attributes["happiness"] then happiness_bar_width = math_floor(staff.attributes["happiness"] * 40 + 0.5) total_happiness = total_happiness + staff.attributes["happiness"] end local fatigue_bar_width = 40.5 if staff.attributes["fatigue"] then total_fatigue = total_fatigue + staff.attributes["fatigue"] fatigue_bar_width = math_floor((1 - staff.attributes["fatigue"]) * 40 + 0.5) end local skill_bar_width = math_floor(staff.profile.skill * 40 + 0.5) total_skill = total_skill + staff.profile.skill -- Is this staff member on the visible page? Then draw him/her if i > (self.page-1)*10 and i <= self.page*10 then local row_no = i - (self.page-1)*10 self.row_blankers[row_no].visible = false titles:draw(canvas, row_no + 10*(self.page-1), x + 58, y + 63 + row_no*27) titles:draw(canvas, staff.profile.name, x + 88, y + 63 + row_no*27) titles:draw(canvas, "$" .. staff.profile.wage, x + 230, y + 63 + row_no*27, 80, 0) -- Draw the morale, tiredness and skill for this staff member if happiness_bar_width ~= 0 then for dx = 0, happiness_bar_width - 1 do self.panel_sprites:draw(canvas, 16, x + 351 + dx, y + 65 + row_no*27) end end if fatigue_bar_width ~= 0 then for dx = 0, fatigue_bar_width - 1 do self.panel_sprites:draw(canvas, 15, x + 456 + dx, y + 65 + row_no*27) end end if skill_bar_width ~= 0 then for dx = 0, skill_bar_width - 1 do self.panel_sprites:draw(canvas, 14, x + 559 + dx, y + 65 + row_no*27) end end end end -- Make sure the other ones are not visible for i = #staff_list + 1 - (self.page-1)*10, 10 do self.row_blankers[i].visible = true end -- Draw the average morale, tiredness and skill if #staff_list ~= 0 then local happiness_bar_width = math_floor((total_happiness/#staff_list) * 40 + 0.5) if happiness_bar_width ~= 0 then for dx = 0, happiness_bar_width - 1 do self.panel_sprites:draw(canvas, 16, x + 351 + dx, y + 59) end end local fatigue_bar_width = math_floor((1 - (total_fatigue/#staff_list)) * 40 + 0.5) if fatigue_bar_width ~= 0 then for dx = 0, fatigue_bar_width - 1 do self.panel_sprites:draw(canvas, 15, x + 456 + dx, y + 59) end end local skill_bar_width = math_floor((total_skill/#staff_list) * 40 + 0.5) if skill_bar_width ~= 0 then for dx = 0, skill_bar_width - 1 do self.panel_sprites:draw(canvas, 14, x + 559 + dx, y + 59) end end end -- Reset self.progress_surgeon.visible = false self.qualified_surgeon.visible = false self.progress_psychiatrist.visible = false self.qualified_psychiatrist.visible = false self.progress_researcher.visible = false self.qualified_researcher.visible = false self.arrow.visible = false self.portrait_back.visible = false -- If a staff member is selected, draw picture, skill etc if self.selected_staff then local profile = self.staff_members[self.category][self.selected_staff].profile -- Draw the red rectangle TODO: Make a neater function in C? local red = canvas:mapRGB(221, 83, 0) local y_pos = self.selected_staff - (self.page - 1)*10 canvas:drawRect(red, x + 49, y + y_pos*27 + 54, 581, 1) canvas:drawRect(red, x + 49, y + y_pos*27 + 81, 581, 1) canvas:drawRect(red, x + 49, y + y_pos*27 + 54, 1, 28) canvas:drawRect(red, x + 630, y + y_pos*27 + 54, 1, 28) -- Current position in the game world local px, py = self:getStaffPosition(37, 61) self.ui.app.map:draw(canvas, px, py, 83, 82, x + 497, y + 373) -- Portrait self.portrait_back.visible = true profile:drawFace(canvas, x + 68, y + 377, self.face_parts) -- 10 % increase in salary or a bonus: titles:draw(canvas, "$" .. math_floor(profile.wage*0.1), x + 377, y + 387, 45, 0) titles:draw(canvas, "$" .. math_floor(profile.wage*0.1 + profile.wage), x + 377, y + 432, 45, 0) -- Attention to detail local attention_bar_width = math_floor(profile.attention_to_detail * 40 + 0.5) if attention_bar_width ~= 0 then for dx = 0, attention_bar_width - 1 do self.panel_sprites:draw(canvas, 13, x + 178 + dx, y + 387) end end -- If it is a doctor, draw skills etc. if self.category == "Doctor" then if profile.is_surgeon > 0 then if profile.is_surgeon >= 1.0 then self.qualified_surgeon.visible = true elseif not profile.is_consultant then self.progress_surgeon.visible = true self.progress_surgeon:setTooltip(_S.tooltip.staff_list.surgeon_train:format(math_floor(profile.is_surgeon * 100))) local progress = math_floor(profile.is_surgeon * 23 + 0.5) for dx = 0, progress - 1 do self.panel_sprites:draw(canvas, 13, x + 196 + dx, y + 447) end end end if profile.is_psychiatrist > 0 then if profile.is_psychiatrist >= 1.0 then self.qualified_psychiatrist.visible = true elseif not profile.is_consultant then self.progress_psychiatrist.visible = true self.progress_psychiatrist:setTooltip(_S.tooltip.staff_list.psychiatrist_train:format(math_floor(profile.is_psychiatrist * 100))) local progress = math_floor(profile.is_psychiatrist * 23 + 0.5) for dx = 0, progress - 1 do self.panel_sprites:draw(canvas, 13, x + 236 + dx, y + 447) end end end if profile.is_researcher > 0 then if profile.is_researcher >= 1.0 then self.qualified_researcher.visible = true elseif not profile.is_consultant then self.progress_researcher.visible = true self.progress_researcher:setTooltip(_S.tooltip.staff_list.researcher_train:format(math_floor(profile.is_researcher * 100))) local progress = math_floor(profile.is_researcher * 23 + 0.5) for dx = 0, progress - 1 do self.panel_sprites:draw(canvas, 13, x + 276 + dx, y + 447) end end end -- Draw type of doctor self.arrow.visible = true if profile.is_consultant then self.arrow.x = self.arrow_position + 29 elseif profile.is_junior then self.arrow.x = self.arrow_position - 23 else self.arrow.x = self.arrow_position end end end end function UIStaffManagement:onMouseDown(code, x, y) if code == "left" then if x > 50 and x < 490 then if y > 82 and y < 351 then if #self.staff_members[self.category] - (self.page - 1)*10 > math_floor((y - 81)/27) then self.selected_staff = math_floor((y - 81)/27) + 1 + (self.page - 1)*10 end end elseif x > 497 and x < 580 and y > 373 and y < 455 and self.selected_staff then -- Hit in the view of the staff local ui = self.ui ui:scrollMapTo(self:getStaffPosition()) ui:addWindow(UIStaff(ui, self.staff_members[self.category][self.selected_staff])) self:close() return false end end return UIFullscreen.onMouseDown(self, code, x, y) end function UIStaffManagement:onMouseWheel(x, y) if not UIFullscreen.onMouseWheel(self, x, y) then if self:hitTest(self.cursor_x, self.cursor_y) then if y > 0 then self:scrollUp() return true else self:scrollDown() return true end end return false else return true end end function UIFullscreen:getStaffPosition(dx, dy) local staff = self.staff_members[self.category][self.selected_staff] local x, y = self.ui.app.map:WorldToScreen(staff.tile_x, staff.tile_y) local px, py = staff.th:getMarker() return x + px - (dx or 0), y + py - (dy or 0) end function UIStaffManagement:previousCategory() if self.category == "Nurse" then self:setCategory("Doctor") elseif self.category == "Handyman" then self:setCategory("Nurse") elseif self.category == "Receptionist" then self:setCategory("Handyman") end end function UIStaffManagement:nextCategory() if self.category == "Doctor" then self:setCategory("Nurse") elseif self.category == "Nurse" then self:setCategory("Handyman") elseif self.category == "Handyman" then self:setCategory("Receptionist") end end function UIStaffManagement:previousStaff() -- If nothing currently selected, select the last one, otherwise the previous. if self.selected_staff == nil then self:selectIndex(#self.staff_members[self.category]) else self:selectIndex(self.selected_staff - 1) end end function UIStaffManagement:nextStaff() -- If nothing currently selected, select the first one, otherwise the next. if self.selected_staff == nil then self:selectIndex(1) else self:selectIndex(self.selected_staff + 1) end end function UIStaffManagement:scrollUp() if self.scroll_dot.visible and self.page > 1 then self.selected_staff = nil self.page = self.page - 1 self:updateScrollDot() end self:updateTooltips() end function UIStaffManagement:scrollDown() if self.scroll_dot.visible and self.page*10 < #self.staff_members[self.category] then self.selected_staff = nil self.page = self.page + 1 self:updateScrollDot() end self:updateTooltips() end --! Updates the position of the paging scroll indicator function UIStaffManagement:updateScrollDot() local numPages = math.ceil(#self.staff_members[self.category] / 10) local yOffset = math_floor(83 * ((self.page - 1) / (numPages - 1))) self.scroll_dot.y = 168 + yOffset end --! Updates whether the paging scroll indicator is visible and its position if visible function UIStaffManagement:updateScrollDotVisibility() if #self.staff_members[self.category] > 10 then self.scroll_dot.visible = true self:updateScrollDot() else self.scroll_dot.visible = false end end function UIStaffManagement:payBonus() local staff = self.staff_members[self.category][self.selected_staff] if self.selected_staff and self.hospital.balance > math_floor(staff.profile.wage*0.1) then staff:changeAttribute("happiness", 0.5) self.hospital:spendMoney(math_floor(staff.profile.wage*0.1), _S.transactions.personal_bonus) self.ui:playSound("cashreg.wav") end end function UIStaffManagement:increaseSalary() if self.selected_staff then local staff = self.staff_members[self.category][self.selected_staff] staff:increaseWage(math_floor(staff.profile.wage*0.1)) end end function UIStaffManagement:fire() if self.selected_staff then self.ui:addWindow(UIConfirmDialog(self.ui, _S.confirmation.sack_staff, --[[persistable:staff_management_confirm_sack]] function() local current_category = self.staff_members[self.category] current_category[self.selected_staff]:fire() -- Close the staff window if open local staff_window = self.ui:getWindow(UIStaff) if staff_window and staff_window.staff == current_category[self.selected_staff] then staff_window:close() end -- Update the staff list self:updateStaffList(current_category[self.selected_staff]) end)) -- End of confirmation dialog end end function UIStaffManagement:close() UIFullscreen.close(self) self.ui:getWindow(UIBottomPanel):updateButtonStates() end function UIStaffManagement:afterLoad(old, new) UIFullscreen.afterLoad(self, old, new) self:registerKeyHandlers() end CorsixTH-0.63/CorsixTH/Lua/dialogs/fullscreen/town_map.lua000066400000000000000000000311661347163623700235270ustar00rootroot00000000000000--[[ Copyright (c) 2010 Sjors Gielen 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. --]] local TH = require("TH") --! Town map fullscreen window (purchase land, set radiator levels, map overview). class "UITownMap" (UIFullscreen) ---@type UITownMap local UITownMap = _G["UITownMap"] function UITownMap:UITownMap(ui) self:UIFullscreen(ui) local app = self.ui.app local gfx = app.gfx self.app = app if not pcall(function() local palette = gfx:loadPalette("QData", "Town01V.pal") palette:setEntry(255, 0xFF, 0x00, 0xFF) -- Make index 255 transparent self.background = gfx:loadRaw("Town01V", 640, 480) self.info_font = gfx:loadFont("QData", "Font34V", false, palette) self.city_font = gfx:loadFont("QData", "Font31V", false, palette) self.money_font = gfx:loadFont("QData", "Font05V") self.panel_sprites = gfx:loadSpriteTable("QData", "Town02V", true, palette) end) then ui:addWindow(UIInformation(ui, {_S.errors.dialog_missing_graphics})) self:close() return end self.default_button_sound = "selectx.wav" self.default_buy_sound = "buy.wav" local config = self:initRuntimeConfig() -- A list of areas in the town, including the owner. -- In single player there are only bought and available areas, in multiplayer -- areas are owned by players and when a player wants to buy a piece of -- terrain, an auction is started. -- TODO display the areas, in the right color -- TODO display everything in the areas -- TODO multiplayer mode -- NB: original TH closed the town map on right click of balance button. -- This is likely a bug and we do not copy this behavior. self:addPanel(0, 30, 420):makeButton(0, 0, 200, 50, 0, self.bankManager, nil, self.bankStats):setTooltip(_S.tooltip.town_map.balance) self:addPanel(0, 594, 437):makeButton(0, 0, 26, 26, 8, self.close):setTooltip(_S.tooltip.town_map.close) self:addPanel(0, 171, 315):makeButton(0, 0, 20, 20, 6, self.increaseHeat):setTooltip(_S.tooltip.town_map.heat_inc) self:addPanel(0, 70, 314):makeButton(0, 0, 20, 20, 7, self.decreaseHeat):setTooltip(_S.tooltip.town_map.heat_dec) -- add the toggle buttons local function toggle_button(sprite, x, y, option, str) local panel = self:addPanel(sprite, x, y) local btn = panel:makeToggleButton(0, 0, 46, 46, 0, --[[persistable:town_map_config_button]] function(_, state) app.runtime_config.town_dialog[option] = state end):setTooltip(str) btn:setToggleState(config[option]) end toggle_button(1, 140, 37, "people_enabled", _S.tooltip.town_map.people) toggle_button(2, 140, 89, "plants_enabled", _S.tooltip.town_map.plants) toggle_button(3, 140, 141, "fire_ext_enabled", _S.tooltip.town_map.fire_extinguishers) toggle_button(4, 140, 193, "objects_enabled", _S.tooltip.town_map.objects) toggle_button(5, 140, 246, "radiators_enabled", _S.tooltip.town_map.radiators) self:makeTooltip(_S.tooltip.town_map.heat_level, 94, 318, 167, 331) self:makeTooltip(_S.tooltip.town_map.heating_bill, 72, 351, 167, 374) end function UITownMap:initRuntimeConfig() -- config is a *runtime* configuration list; re-instantiations of the dialog -- share the same values, but it's not saved across saves or sessions local config = self.app.runtime_config.town_dialog if config == nil then config = {} self.app.runtime_config.town_dialog = config config.people_enabled = true config.plants_enabled = true config.fire_ext_enabled = true config.objects_enabled = true config.radiators_enabled = true end return config end function UITownMap:close() UIFullscreen.close(self) self.ui:getWindow(UIBottomPanel):updateButtonStates() end local flag_cache = {} function UITownMap:onMouseMove(x, y) local tx = math.floor((x - 227) / 3) local ty = math.floor((y - 25) / 3) self.hover_plot = nil if 0 <= tx and tx < 128 and 0 <= ty and ty < 128 then local map = self.ui.hospital.world.map.th self.hover_plot = map:getCellFlags(tx + 1, ty + 1, flag_cache).parcelId end return UIFullscreen.onMouseMove(self, x, y) end function UITownMap:onMouseUp(button, x, y) local redraw = false if button == "left" then local tx = math.floor((x - 227) / 3) local ty = math.floor((y - 25) / 3) if 0 <= tx and tx < 128 and 0 <= ty and ty < 128 then local map = self.ui.hospital.world.map.th local plot = map:getCellFlags(tx + 1, ty + 1, flag_cache).parcelId if plot ~= 0 then if self.ui.hospital:purchasePlot(plot) then self.ui:playSound("cashreg.wav") redraw = true else self.ui:playSound("Wrong2.wav") end end end elseif button == "right" then local tx = math.floor((x - 227) / 3) local ty = math.floor((y - 25) / 3) local map = self.ui.hospital.world.map.th if 0 <= tx and tx < 128 and 0 <= ty and ty < 128 then local plot = map:getCellFlags(tx + 1, ty + 1, flag_cache).parcelId if plot ~= 0 then local sx, sy = self.ui.app.map:WorldToScreen(tx, ty) self.ui:scrollMapTo(sx, sy) self:close() end end end return UIFullscreen.onMouseUp(self, button, x, y) or redraw end function UITownMap:draw(canvas, x, y) self.background:draw(canvas, self.x + x, self.y + y) UIFullscreen.draw(self, canvas, x, y) x, y = self.x + x, self.y + y local app = self.ui.app local hospital = self.ui.hospital local world = hospital.world local map = world.map -- config is a *runtime* configuration list; re-instantiations of the dialog -- share the same values, but it's not saved across saves or sessions local config = app.runtime_config.town_dialog if not config then config = self:initRuntimeConfig() end -- We need to draw number of people, plants, fire extinguisers, other objects -- and radiators. -- NB: original TH's patient count was always 1 too big (started counting at 1) -- This is likely a bug and we do not copy this behavior. local patientcount = hospital.patientcount local plants = world.object_counts.plant local fireext = world.object_counts.extinguisher local objs = world.object_counts.general local radiators = world.object_counts.radiator self.info_font:draw(canvas, patientcount, x + 95, y + 57) self.info_font:draw(canvas, plants, x + 95, y + 110) self.info_font:draw(canvas, fireext, x + 95, y + 157) self.info_font:draw(canvas, objs, x + 95, y + 211) self.info_font:draw(canvas, radiators, x + 95, y + 265) -- Heating costs local heating_costs = math.floor(((hospital.radiator_heat *10)* radiators)* 7.5) self.info_font:draw(canvas, ("%8i"):format(heating_costs), x + 100, y + 355) -- draw money balance self.money_font:draw(canvas, ("%7i"):format(hospital.balance), x + 49, y + 431) -- radiator heat local rad_max_width = 60 -- Radiator indicator width local rad_width = rad_max_width * hospital.radiator_heat for dx = 0, rad_width do self.panel_sprites:draw(canvas, 9, x + 101 + dx, y + 319) end -- city name self.city_font:draw(canvas, map.level_name, x + 300, y + 43, 260, 15) local town_map_offset_x = x + 227 local town_map_offset_y = y + 25 TH.windowHelpers.townMapDraw(self, map.th, canvas, town_map_offset_x, town_map_offset_y, config.radiators_enabled) -- Draw entities local function draw_entities(list, color, size) for _, ent in ipairs(list) do -- 3 is the number of pixel that are used to represent one world tile in the map canvas:drawRect(color, town_map_offset_x + ent.tile_x * 3 - 2, town_map_offset_y + ent.tile_y * 3 + 1, size, size) end end local function draw_entities_in_hospital(list, color, size) for _, ent in ipairs(list) do local tile_x, tile_y = ent.tile_x, ent.tile_y if tile_x and hospital:isInHospital(tile_x, tile_y) then -- 3 is the number of pixel that are used to represent one world tile in the map canvas:drawRect(color, town_map_offset_x + tile_x * 3 - 2, town_map_offset_y + tile_y * 3 + 1, size, size) end end end --! Select entities of the world by their id. --!param id Id of the objects to select. --!return (list) The selected entities. local function get_objects_by_id(id) local ret = {} for _, obj_list in pairs(world.objects) do for _, obj in ipairs(obj_list) do if obj.object_type.id == id then table.insert(ret, obj) end end end return ret end if config.people_enabled then local staff_color = canvas:mapRGB(97, 109, 235) local patient_color = canvas:mapRGB(255, 255, 255) draw_entities_in_hospital(self.ui.hospital.staff, staff_color, 2) draw_entities_in_hospital(self.ui.hospital.patients, patient_color, 2) end if config.radiators_enabled then local radiator_color = canvas:mapRGB(255, 0, 70) draw_entities(get_objects_by_id("radiator"), radiator_color, 1) end if config.fire_ext_enabled then local fire_ext_color = canvas:mapRGB(216, 0, 0) draw_entities(get_objects_by_id("extinguisher"), fire_ext_color, 2) end if config.plants_enabled then local plant_color = canvas:mapRGB(127, 180, 73) draw_entities(get_objects_by_id("plant"), plant_color, 2) end if config.objects_enabled then local machine_list = {} for _, obj_list in pairs(world.objects) do for _, obj in ipairs(obj_list) do if obj.object_type.show_in_town_map then table.insert(machine_list, obj) end end end local machine_color = canvas:mapRGB(142, 182, 182) draw_entities(machine_list, machine_color, 3) end -- plot number, owner, area and price local plot_num = "-" local tile_count = "-" local price = "-" local owner = "-" if self.hover_plot then if self.hover_plot == 0 then price = _S.town_map.not_for_sale else tile_count = map:getParcelTileCount(self.hover_plot) local owner_num = map.th:getPlotOwner(self.hover_plot) if owner_num == 0 then owner = _S.town_map.for_sale price = "$" .. map:getParcelPrice(self.hover_plot) else owner = world.hospitals[owner_num].name end plot_num = self.hover_plot end end self.city_font:draw(canvas, _S.town_map.number, x + 227, y + 435) self.city_font:draw(canvas, ":", x + 300, y + 435) self.city_font:draw(canvas, plot_num, x + 315, y + 435) self.city_font:draw(canvas, _S.town_map.owner, x + 227, y + 450) self.city_font:draw(canvas, ":", x + 300, y + 450) self.city_font:draw(canvas, owner, x + 315, y + 450) self.city_font:draw(canvas, _S.town_map.area, x + 432, y + 435) self.city_font:draw(canvas, ":", x + 495, y + 435) self.city_font:draw(canvas, tile_count, x + 515, y + 435) self.city_font:draw(canvas, _S.town_map.price, x + 432, y + 450) self.city_font:draw(canvas, ":", x + 495, y + 450) self.city_font:draw(canvas, price, x + 515, y + 450) end function UITownMap:decreaseHeat() local h = self.ui.hospital local heat = math.floor(h.radiator_heat * 10 + 0.5) if not h.heating_broke then heat = heat - 1 if heat < 1 then heat = 1 end h.radiator_heat = heat / 10 end end function UITownMap:increaseHeat() local h = self.ui.hospital local heat = math.floor(h.radiator_heat * 10 + 0.5) if not h.heating_broke then heat = heat + 1 if heat > 10 then heat = 10 end h.radiator_heat = heat / 10 end end function UITownMap:bankManager() local dlg = UIBankManager(self.ui) self.ui:addWindow(dlg) self.ui:getWindow(UIBottomPanel):updateButtonStates() end function UITownMap:bankStats() local dlg = UIBankManager(self.ui) dlg:showStatistics() self.ui:addWindow(dlg) self.ui:getWindow(UIBottomPanel):updateButtonStates() end CorsixTH-0.63/CorsixTH/Lua/dialogs/furnish_corridor.lua000066400000000000000000000214751347163623700231240ustar00rootroot00000000000000--[[ Copyright (c) 2009 Peter "Corsix" Cawley 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. --]] local TH = require("TH") local math_floor = math.floor --! Dialog for purchasing `Object`s (for the corridor or for rooms). class "UIFurnishCorridor" (Window) ---@type UIFurnishCorridor local UIFurnishCorridor = _G["UIFurnishCorridor"] function UIFurnishCorridor:UIFurnishCorridor(ui, objects, edit_dialog) self:Window() local app = ui.app if edit_dialog then self.modal_class = "furnish" self.edit_dialog = edit_dialog else self.modal_class = "main" end self.esc_closes = true self.ui = ui self.anims = app.anims self.width = 360 self.height = 274 self:setDefaultPosition(0.5, 0.4) self.panel_sprites = app.gfx:loadSpriteTable("QData", "Req10V", true) self.white_font = app.gfx:loadFont("QData", "Font01V") self.blue_font = app.gfx:loadFont("QData", "Font02V") self.title_text = _S.buy_objects_window.choose_items self.price_text = (_S.buy_objects_window.price .. " "):gsub(" $", " ") self.total_text = (_S.buy_objects_window.total .. " "):gsub(" $", " ") self.item_price = 0 self.total_price = 0 self.list_hover_index = 0 self.preview_anim = TH.animation() self.objects = { } if objects then for _, object in pairs(objects) do self.objects[#self.objects + 1] = {object = object.object, start_qty = object.qty, qty = object.qty, min_qty = object.min_qty} -- Had to make a copy of objects list. Otherwise, we will modify the original variable (Opening dialog twice keeps memory of previously chosen quantities) end else for _, object in ipairs(app.objects) do if object.corridor_object then self.objects[#self.objects + 1] = {object = object, start_qty = 0, qty = 0, min_qty = 0} end end table.sort(self.objects, function(o1, o2) return o1.object.corridor_object < o2.object.corridor_object end) end self:addPanel(228, 0, 0) -- Grid top for y = 33, 103, 10 do self:addPanel(229, 0, y) -- Grid body end self:addPanel(230, 0, 113) -- Grid bottom self:addPanel(231, 0, 148) -- Cost / total top self:addPanel(232, 0, 173) -- Cost / total body self:addPanel(233, 0, 215) -- Cost / total bottom self:addPanel(234, 0, 248) -- Close button background self:addPanel(234, 0, 252) -- Close button background extension self:addPanel(242, 9, 237):makeButton(0, 0, 129, 28, 243, self.close):setTooltip(_S.tooltip.buy_objects_window.cancel) self:addPanel(235, 146, 0) -- List top self:addPanel(236, 146, 223) -- List bottom self:addPanel(237, 154, 238):makeButton(0, 0, 197, 28, 238, self.confirm):setTooltip(_S.tooltip.buy_objects_window.confirm) local i = 1 local function item_callback(index, qty) local is_negative_quantity = qty < 0 return --[[persistable:furnish_corridor_item_callback]] function(window) if window:purchaseItem(index, qty) == 0 and not is_negative_quantity then -- give visual warning that player doesn't have enough $ to buy window.ui.adviser:say(_A.warnings.cannot_afford_2, false, true) window.ui:playSound("wrong2.wav") elseif qty > 0 then window.ui:playSound("AddItemJ.wav") else window.ui:playSound("DelItemJ.wav") end end end for y = 34, 205, 19 do local x = 146 self:addPanel(239, x, y) -- List body if i <= #self.objects then self:addPanel(240, x + 12, y):makeButton(0, 0, 125, 19, 241, item_callback(i, 1), nil, item_callback(i, -1)):setTooltip(self.objects[i].object.tooltip) self:addPanel(244, x + 139, y + 1):makeRepeatButton(0, 0, 17, 17, 245, item_callback(i, -1)):setTooltip(_S.tooltip.buy_objects_window.decrease) self:addPanel(246, x + 183, y + 1):makeRepeatButton(0, 0, 17, 17, 247, item_callback(i, 1)):setTooltip(_S.tooltip.buy_objects_window.increase) end i = i + 1 end self:makeTooltip(_S.tooltip.buy_objects_window.price, 20, 168, 127, 187) self:makeTooltip(_S.tooltip.buy_objects_window.total_value, 20, 196, 127, 215) self:registerKeyHandlers() end function UIFurnishCorridor:registerKeyHandlers() self:addKeyHandler("global_confirm", self.confirm) self:addKeyHandler("global_confirm_alt", self.confirm) end function UIFurnishCorridor:purchaseItem(index, quantity) local o = self.objects[index] local is_negative_quantity = quantity < 0 if self.ui.app.key_modifiers.ctrl then quantity = quantity * 10 elseif self.ui.app.key_modifiers.shift then quantity = quantity * 5 end quantity = quantity + o.qty if quantity < o.min_qty then quantity = o.min_qty elseif quantity > 99 then quantity = 99 end quantity = quantity - o.qty local hospital = self.ui.hospital if hospital.balance >= self.total_price + quantity * hospital:getObjectBuildCost(o.object.id) or is_negative_quantity then o.qty = o.qty + quantity self.total_price = self.total_price + quantity * hospital:getObjectBuildCost(o.object.id) if o.object.id == "reception_desk" then if o.qty > 0 then self.ui:tutorialStep(1, 2, 3) else self.ui:tutorialStep(1, 3, 2) end end else quantity = 0 end return quantity end function UIFurnishCorridor:confirm() self.ui:tutorialStep(1, 3, 4) local to_purchase = {} local to_sell = {} for _, o in ipairs(self.objects) do local build_cost = self.ui.hospital:getObjectBuildCost(o.object.id) if o.qty - o.start_qty > 0 then local diff_qty = o.qty - o.start_qty to_purchase[#to_purchase + 1] = { object = o.object, qty = diff_qty } self.ui.hospital:spendMoney(build_cost * diff_qty, _S.transactions.buy_object .. ": " .. o.object.name, build_cost * diff_qty) elseif o.qty - o.start_qty < 0 then local diff_qty = o.start_qty - o.qty to_sell[#to_sell + 1] = { object = o.object, qty = diff_qty } self.ui.hospital:receiveMoney(build_cost * diff_qty, _S.transactions.sell_object .. ": " .. o.object.name, build_cost * diff_qty) end end if self.edit_dialog then self.edit_dialog:addObjects(to_purchase, false) -- payment already handled here self.edit_dialog:removeObjects(to_sell, false) -- payment already handled here self:close() else if #to_purchase == 0 then self:close() else self.ui:addWindow(UIPlaceObjects(self.ui, to_purchase)) end end end function UIFurnishCorridor:close() self.ui:tutorialStep(1, {2, 3}, 1) if self.edit_dialog then self.edit_dialog:addObjects() -- No objects added. Call the function anyway to handle visibility etc. end Window.close(self) end function UIFurnishCorridor:draw(canvas, x, y) Window.draw(self, canvas, x, y) x, y = x + self.x, y + self.y self.white_font:draw(canvas, self.title_text, x + 163, y + 18) self.white_font:draw(canvas, self.price_text .. self.item_price, x + 24, y + 173) self.white_font:draw(canvas, self.total_text .. self.total_price, x + 24, y + 202) for i, o in ipairs(self.objects) do local font = self.white_font if i == self.list_hover_index then font = self.blue_font end font:draw(canvas, o.object.name, x + 163, y + 20 + i * 19) font:draw(canvas, o.qty, x + 306, y + 20 + i * 19, 19, 0) end self.preview_anim:draw(canvas, x + 72, y + 57) end function UIFurnishCorridor:onMouseMove(x, y, dx, dy) local repaint = Window.onMouseMove(self, x, y, dx, dy) local hover_idx = 0 if 158 <= x and x < 346 and 34 <= y and y < 224 then hover_idx = math_floor((y - 15) / 19) end if hover_idx ~= self.list_hover_index then if 1 <= hover_idx and hover_idx <= #self.objects then local obj = self.objects[hover_idx].object self.item_price = self.ui.hospital:getObjectBuildCost(obj.id) self.preview_anim:setAnimation(self.anims, obj.build_preview_animation) end self.list_hover_index = hover_idx repaint = true end return repaint end function UIFurnishCorridor:afterLoad(old, new) Window.afterLoad(self, old, new) self:registerKeyHandlers() end CorsixTH-0.63/CorsixTH/Lua/dialogs/hire_staff.lua000066400000000000000000000237061347163623700216540ustar00rootroot00000000000000--[[ Copyright (c) 2009 Peter "Corsix" Cawley 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. --]] class "UIHireStaff" (Window) ---@type UIHireStaff local UIHireStaff = _G["UIHireStaff"] function UIHireStaff:UIHireStaff(ui) self:Window() self.modal_class = "main" self.esc_closes = true self.world = ui.app.world self.ui = ui self.width = 242 self.height = 323 self:setDefaultPosition(100, 100) self.panel_sprites = ui.app.gfx:loadSpriteTable("QData", "Req11V", true) self.white_font = ui.app.gfx:loadFont("QData", "Font01V") self.face_parts = ui.app.gfx:loadRaw("Face01V", 65, 1350, nil, "Data", "MPalette.dat") -- Left hand side tab backgrounds self:addPanel(253, 0, 0) self:addPanel(254, 0, 83) self:addPanel(254, 0, 162) self:addPanel(255, 0, 241) -- Left hand side tabs local --[[persistable:hire_staff_category]] function category(name, state, btn) if #self.world.available_staff[name] == 0 then self.ui:playSound("wrong2.wav") if state then btn:toggle() end else self.ui:playSound("selectx.wav") self:setCategory(state and name or nil) end end self.tabs = { self:addPanel(264, 8, 8):makeToggleButton(0, 0, 40, 69, 265, category, "Doctor"):setTooltip(_S.tooltip.hire_staff_window.doctors), self:addPanel(266, 8, 87):makeToggleButton(0, 0, 40, 69, 267, category, "Nurse"):setTooltip(_S.tooltip.hire_staff_window.nurses), self:addPanel(268, 8, 166):makeToggleButton(0, 0, 40, 69, 269, category, "Handyman"):setTooltip(_S.tooltip.hire_staff_window.handymen), self:addPanel(270, 8, 245):makeToggleButton(0, 0, 40, 69, 271, category, "Receptionist"):setTooltip(_S.tooltip.hire_staff_window.receptionists), } -- Right hand side self:addPanel(256, 56, 0) -- Dialog header for y = 49, 113, 11 do self:addPanel(257,56, y) -- Dialog background end self.ability_bg_panel = self:addPanel(260, 55, 114) -- Abilities background self.skill_bg_panel = self:addPanel(259, 68, 95):setTooltip(_S.tooltip.hire_staff_window.staff_ability, 109, 95) -- Skill background self.skill_bg_panel.visible = false self:addPanel(261, 55, 160) -- Wage background self.abilities_blanker = self:addColourPanel(73, 133, 156, 34, 60, 174, 203) -- Hides abilities list for y = 207, 262, 3 do self:addPanel(262, 54, y) -- Description background end self:addColourPanel(155, 45, 72, 81, 211, 255, 255) -- Portrait background self:addPanel(263, 56, 263) -- Dialog midpiece self.complete_blanker = self:addColourPanel(68, 15, 161, 257, 60, 174, 203) -- Hides all staff info self:addPanel(272, 56, 277):makeButton(8, 10, 43, 27, 273, self.movePrevious):setTooltip(_S.tooltip.hire_staff_window.prev_person) self:addPanel(274, 106, 277):makeButton(0, 10, 58, 27, 275, self.hire):setTooltip(_S.tooltip.hire_staff_window.hire) self:addPanel(276, 163, 277):makeButton(0, 10, 28, 27, 277, self.close):setTooltip(_S.tooltip.hire_staff_window.cancel) self:addPanel(278, 190, 277):makeButton(0, 10, 44, 27, 279, self.moveNext):setTooltip(_S.tooltip.hire_staff_window.next_person) self:makeTooltip(_S.tooltip.hire_staff_window.salary, 68, 173, 227, 194) self:makeTooltip(_S.tooltip.hire_staff_window.doctor_seniority, 68, 44, 151, 95) self:makeTooltip(_S.tooltip.hire_staff_window.qualifications, 68, 134, 107, 167) self:makeTooltip(_S.tooltip.hire_staff_window.surgeon, 120, 136, 137, 167) self:makeTooltip(_S.tooltip.hire_staff_window.psychiatrist, 137, 136, 164, 167) self:makeTooltip(_S.tooltip.hire_staff_window.researcher, 164, 136, 191, 167) self:updateTooltips() self:registerKeyHandlers() end function UIHireStaff:registerKeyHandlers() self:addKeyHandler("global_confirm", self.hire) self:addKeyHandler("global_confirm_alt", self.hire) end function UIHireStaff:updateTooltips() local cond = not not self.category self.tooltip_regions[1].enabled = cond cond = cond and self.category == "Doctor" self.tooltip_regions[2].enabled = cond self.tooltip_regions[3].enabled = cond cond = cond and self.current_index and self.world.available_staff[self.category] cond = cond and cond[self.current_index] self.tooltip_regions[4].enabled = cond and cond.is_surgeon >= 1.0 self.tooltip_regions[5].enabled = cond and cond.is_psychiatrist >= 1.0 self.tooltip_regions[6].enabled = cond and cond.is_researcher >= 1.0 end function UIHireStaff:onMouseUp(button, x, y) self.mouse_up_x = self.x + x self.mouse_up_y = self.y + y return Window.onMouseUp(self, button, x, y) end function UIHireStaff:hire() self.ui:tutorialStep(2, {3, 4, 5}, 6) self.ui:tutorialStep(4, 3, 4) local profile if self.category and self.current_index then profile = self.world.available_staff[self.category] profile = profile and profile[self.current_index] end if not profile then self.ui:playSound("wrong2.wav") return end if self.ui.hospital.balance < profile.wage then self:cannotAfford() self.ui:playSound("wrong2.wav") return end self.ui:playSound("YesX.wav") table.remove(self.world.available_staff[self.category], self.current_index) self.ui:addWindow(UIPlaceStaff(self.ui, profile, self.mouse_up_x, self.mouse_up_y)) end function UIHireStaff:cannotAfford() local msg = { (_A.warnings.cannot_afford), (_A.warnings.cash_low_consider_loan), } if msg then self.world.ui.adviser:say(msg[math.random(1, #msg)]) end end function UIHireStaff:draw(canvas, x, y) Window.draw(self, canvas, x, y) x, y = self.x + x, self.y + y local font = self.white_font local staff = self.world.available_staff font:draw(canvas, #staff.Doctor , x + 16, y + 58, 26, 0) font:draw(canvas, #staff.Nurse , x + 16, y + 137, 26, 0) font:draw(canvas, #staff.Handyman , x + 16, y + 216, 26, 0) font:draw(canvas, #staff.Receptionist, x + 16, y + 295, 26, 0) if self.category and self.current_index then local profile = staff[self.category] profile = profile and profile[self.current_index] if not profile then return end font:draw(canvas, profile.name, x + 79, y + 21) profile:drawFace(canvas, x + 158, y + 48, self.face_parts) font:draw(canvas, "$" .. profile.wage, x + 116, y + 179) font:drawWrapped(canvas, profile.desc, x + 74, y + 205, 149) -- Skill bar if self.skill_bg_panel.visible then local skill_bar_width = math.floor(profile.skill * 40 + 0.5) if skill_bar_width ~= 0 then local px, py = self.skill_bg_panel.x, self.skill_bg_panel.y px = px + x py = py + y for dx = 0, skill_bar_width - 1 do self.panel_sprites:draw(canvas, 3, px + 22 + dx, py + 9) end end end if self.category == "Doctor" then -- Junior / Doctor / Consultant marker self.panel_sprites:draw(canvas, 258, x + 71, y + 49) if profile.is_junior then self.panel_sprites:draw(canvas, 296, x + 79, y + 80) elseif profile.is_consultant then self.panel_sprites:draw(canvas, 296, x + 131, y + 80) else self.panel_sprites:draw(canvas, 296, x + 101, y + 80) end -- Ability markers local px, py = self.ability_bg_panel.x, self.ability_bg_panel.y px = px + x py = py + y if profile.is_surgeon >= 1.0 then self.panel_sprites:draw(canvas, 292, px + 65, py + 22) end if profile.is_psychiatrist >= 1.0 then self.panel_sprites:draw(canvas, 293, px + 82, py + 28) end if profile.is_researcher >= 1.0 then self.panel_sprites:draw(canvas, 294, px + 109, py + 27) end end end end function UIHireStaff:movePrevious() self:moveBy(-1) self.ui:tutorialStep(2, 4, 5) end function UIHireStaff:moveNext() self.ui:tutorialStep(2, 3, 4) self:moveBy(1) end function UIHireStaff:moveBy(n) if self.category then self.current_index = self.current_index + n local category = self.world.available_staff[self.category] if self.current_index < 1 then self.current_index = 1 elseif self.current_index > #category then self.current_index = #category else self.ui:playSound("selectx.wav") self:updateTooltips() return true end end self.ui:playSound("wrong2.wav") return false end function UIHireStaff:setCategory(name) if name == "Receptionist" then self.ui:tutorialStep(2, 2, 3) else self.ui:tutorialStep(2, {3, 4, 5}, 2) end if name == "Doctor" then self.ui:tutorialStep(4, 2, 3) else self.ui:tutorialStep(4, 3, 2) end self.skill_bg_panel.visible = not not name self.complete_blanker.visible = not name self.abilities_blanker.visible = name ~= "Doctor" self.category = name for _, btn in ipairs(self.tabs) do local should_be_toggled = btn.on_click_self == name if btn.toggled ~= should_be_toggled then btn:toggle() end end self.current_index = 1 self:updateTooltips() end function UIHireStaff:close() self.ui:tutorialStep(2, {2, 3, 4, 5}, 1) self.ui:tutorialStep(4, {2, 3}, 1) return Window.close(self) end function UIHireStaff:afterLoad(old, new) Window.afterLoad(self, old, new) self:registerKeyHandlers() end CorsixTH-0.63/CorsixTH/Lua/dialogs/information.lua000066400000000000000000000112551347163623700220630ustar00rootroot00000000000000--[[ Copyright (c) 2009 Edvin "Lego3" Linge 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. --]] --! Dialog that informs the player of for example what the goals for the level are. class "UIInformation" (Window) ---@type UIInformation local UIInformation = _G["UIInformation"] --! Constructor for the Information Dialog. --!param text The text to show, held in a table. All elements of the table will be written -- beneath each other. If instead a table within the table is supplied the texts -- will be shown in consecutive dialogs. --!param use_built_in_font Whether the built-in font should be used to make sure that -- the given message can be read without distortions. function UIInformation:UIInformation(ui, text, use_built_in_font) self:Window() local app = ui.app self.modal_class = "information" self.esc_closes = true self.on_top = true self.ui = ui self.panel_sprites = app.gfx:loadSpriteTable("Data", "PulldV", true) if not use_built_in_font then self.black_font = app.gfx:loadFont("QData", "Font00V") else self.black_font = app.gfx:loadBuiltinFont() self.black_background = true end if type(text[1]) == "table" then self.text = text[1] table.remove(text, 1) self.additional_text = text else self.text = text end -- Window size parameters self.text_width = 300 self.spacing = { l = 40, r = 40, t = 20, b = 20, } self:onChangeLanguage() -- Enter closes the window self:registerKeyHandlers() end function UIInformation:registerKeyHandlers() self:addKeyHandler("global_confirm", self.close) self:addKeyHandler("global_confirm_alt", self.close) end function UIInformation:onChangeLanguage() local total_req_height = 0 for _, text in ipairs(self.text) do local _, req_height = self.black_font:sizeOf(text, self.text_width) total_req_height = total_req_height + req_height end self.width = self.spacing.l + self.text_width + self.spacing.r self.height = self.spacing.t + total_req_height + self.spacing.b self:setDefaultPosition(0.5, 0.5) self:removeAllPanels() for x = 4, self.width - 4, 4 do self:addPanel(12, x, 0) -- Dialog top and bottom borders self:addPanel(16, x, self.height-4) end for y = 4, self.height - 4, 4 do self:addPanel(18, 0, y) -- Dialog left and right borders self:addPanel(14, self.width-4, y) end self:addPanel(11, 0, 0) -- Border top left corner self:addPanel(17, 0, self.height-4) -- Border bottom left corner self:addPanel(13, self.width-4, 0) -- Border top right corner self:addPanel(15, self.width-4, self.height-4) -- Border bottom right corner -- Close button self:addPanel(19, self.width - 30, self.height - 30):makeButton(0, 0, 18, 18, 20, self.close):setTooltip(_S.tooltip.information.close) end function UIInformation:draw(canvas, x, y) local dx, dy = x + self.x, y + self.y local background = self.black_background and canvas:mapRGB(0, 0, 0) or canvas:mapRGB(255, 255, 255) canvas:drawRect(background, dx + 4, dy + 4, self.width - 8, self.height - 8) local last_y = dy + self.spacing.t for _, text in ipairs(self.text) do last_y = self.black_font:drawWrapped(canvas, text, dx + self.spacing.l, last_y, self.text_width) end Window.draw(self, canvas, x, y) end function UIInformation:hitTest(x, y) if x >= 0 and y >= 0 and x < self.width and y < self.height then return true else return Window.hitTest(self, x, y) end end function UIInformation:close() self.ui:tutorialStep(3, 16, "next") Window.close(self) if self.additional_text and #self.additional_text > 0 then self.ui:addWindow(UIInformation(self.ui, self.additional_text)) end end function UIInformation:afterLoad(old, new) Window.afterLoad(self, old, new) self:registerKeyHandlers() end CorsixTH-0.63/CorsixTH/Lua/dialogs/jukebox.lua000066400000000000000000000143041347163623700212030ustar00rootroot00000000000000--[[ Copyright (c) 2009 Peter "Corsix" Cawley 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. --]] local ipairs = ipairs class "UIJukebox" (Window) ---@type UIJukebox local UIJukebox = _G["UIJukebox"] function UIJukebox:UIJukebox(app) self:Window() self.modal_class = "jukebox" self.esc_closes = true self.audio = app.audio self.app = app self.ui = app.ui self.width = 259 self.height = 74 + 30 * #self.audio.background_playlist + 18 self:setDefaultPosition(26, 26) self.panel_sprites = app.gfx:loadSpriteTable("QData", "Req13V", true) self.white_font = app.gfx:loadFont("QData", "Font01V") self.blue_font = app.gfx:loadFont("QData", "Font02V") -- Dialog head (current track title & exit button) self:addPanel(389, 0, 0) for x = 30, self.width - 61, 24 do self:addPanel(390, x, 0) end self:addPanel(391, self.width - 61, 0) self:addPanel(409, self.width - 42, 19):makeButton(0, 0, 24, 24, 410, self.close):setTooltip(_S.tooltip.jukebox.close) self.play_btn = self:addPanel(392, 0, 49):makeToggleButton(19, 2, 50, 24, 393, self.togglePlayPause):setSound("selectx.wav"):setTooltip(_S.tooltip.jukebox.play) self:updatePlayButton() self:addPanel(394, 87, 49):makeButton(0, 2, 24, 24, 395, self.audio.playPreviousBackgroundTrack, self.audio):setSound("selectx.wav"):setTooltip(_S.tooltip.jukebox.rewind) self:addPanel(396, 115, 49):makeButton(0, 2, 24, 24, 397, self.audio.playNextBackgroundTrack, self.audio):setSound("selectx.wav"):setTooltip(_S.tooltip.jukebox.fast_forward) self:addPanel(398, 157, 49):makeButton(0, 2, 24, 24, 399, self.stopBackgroundTrack):setSound("selectx.wav"):setTooltip(_S.tooltip.jukebox.stop) self:addPanel(400, 185, 49):makeButton(0, 2, 24, 24, 401, self.loopTrack):setSound("selectx.wav"):setTooltip(_S.tooltip.jukebox.loop) -- Track list self.track_buttons = {} for i, info in ipairs(self.audio.background_playlist) do local y = 47 + i * 30 self:addPanel(402, 0, y) for x = 30, self.width - 61, 24 do self:addPanel(403, x, y) end self.track_buttons[i] = self:addPanel(404, self.width - 61, y):makeToggleButton(19, 4, 24, 24, 405):setSound("selectx.wav") if not info.enabled then self.track_buttons[i]:toggle() end self.track_buttons[i].on_click = --[[persistable:jukebox_toggle_track]] function(window, off) window:toggleTrack(i, info, not off) end end -- Dialog footer local y = 74 + 30 * #self.audio.background_playlist self:addPanel(406, 0, y) for x = 30, self.width - 61, 24 do self:addPanel(407, x, y) end self:addPanel(408, self.width - 61, y) self:makeTooltip(_S.tooltip.jukebox.current_title, 17, 17, 212, 46) end -- makes the play button consistent with the current status of the background music -- running -> toggled -- stopped -> not toggled -- paused -> not toggled function UIJukebox:updatePlayButton() local status = not not self.audio.background_music and not self.audio.background_paused if status ~= self.play_btn.toggled then self.play_btn:toggle() end end function UIJukebox:togglePlayPause() if not self.audio.background_music then -- Update configuration that we want music now. self.app.config.play_music = true self.app:saveConfig() self.audio:playRandomBackgroundTrack() else self.audio:pauseBackgroundTrack() -- Just pausing does not imply that the player will want to have music turned off -- the next time he or she starts the game. end end function UIJukebox:stopBackgroundTrack() -- Pressing this button means that the player doesn't want any -- background music in the future, so set that config flag. self.app.config.play_music = false self.app:saveConfig() self.audio:stopBackgroundTrack() end function UIJukebox:toggleTrack(index, info, on) info.enabled = on if not on and self.audio.background_music == info.music then self.audio:stopBackgroundTrack() self.audio:playRandomBackgroundTrack() end end function UIJukebox:loopTrack() local index = self.audio:findIndexOfCurrentTrack() local playlist = self.audio.background_playlist if playlist[index].loop then playlist[index].loop = false for i, list_entry in ipairs(playlist) do if list_entry.enabled_before_loop and index ~= i then list_entry.enabled_before_loop = nil self:toggleTrack(i, list_entry, true) self.track_buttons[i]:toggle() end end else playlist[index].loop = true for i, list_entry in ipairs(playlist) do if list_entry.enabled and index ~= i then list_entry.enabled_before_loop = true self:toggleTrack(i, list_entry, false) self.track_buttons[i]:toggle() end end end end function UIJukebox:draw(canvas, x, y) Window.draw(self, canvas, x, y) x, y = self.x + x, self.y + y local playing = self.audio.background_music or "" for i, info in ipairs(self.audio.background_playlist) do local ypos = y + 47 + i * 30 local font = self.white_font if info.music == playing then font = self.blue_font end local str = info.title while font:sizeOf(str) > 185 do str = string.sub(str, 1, string.len(str) - 5) .. "..." end font:draw(canvas, str, x + 24, ypos + 11) if info.music == playing then font:draw(canvas, str, x + 24, self.y + 27) end end end CorsixTH-0.63/CorsixTH/Lua/dialogs/machine_dialog.lua000066400000000000000000000137571347163623700224720ustar00rootroot00000000000000--[[ Copyright (c) 2009 Edvin "Lego3" Linge 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. --]] class "UIMachine" (Window) ---@type UIMachine local UIMachine = _G["UIMachine"] function UIMachine:UIMachine(ui, machine, room) self:Window() local app = ui.app self.esc_closes = true self.machine = machine self.room = room self.ui = ui self.modal_class = "humanoid_info" self.width = 188 self.height = 206 self:setDefaultPosition(-20, 30) self.panel_sprites = app.gfx:loadSpriteTable("QData", "Req03V", true) self.white_font = app.gfx:loadFont("QData", "Font01V") self:addPanel(333, 0, 0) -- Dialog header self:addPanel(334, 0, 74) -- The next part for y = 131, 180, 7 do self:addPanel(335, 0, y) -- Some background end self:addPanel(336, 0, 182) -- Dialog footer -- Call button self:addPanel(339, 20, 127) :makeButton(0, 0, 63, 60, 340, self.callHandyman) :setTooltip(_S.tooltip.machine_window.repair) :setSound("selectx.wav") -- Replace button self:addPanel(341, 92, 127) :makeButton(0, 0, 45, 60, 342, self.replaceMachine) :setTooltip(_S.tooltip.machine_window.replace) :setSound("selectx.wav") -- Close button self:addPanel(337, 146, 18):makeButton(0, 0, 24, 24, 338, self.close) :setTooltip(_S.tooltip.machine_window.close) self:makeTooltip(_S.tooltip.machine_window.name, 18, 19, 139, 42) self:makeTooltip(_S.tooltip.machine_window.times_used, 18, 49, 139, 77) self:makeTooltip(_S.tooltip.machine_window.status, 24, 88, 128, 115) end function UIMachine:draw(canvas, x, y) Window.draw(self, canvas, x, y) x, y = self.x + x, self.y + y local mach = self.machine local font = self.white_font local output if self.room.needs_repair then output = "(" .. mach.object_type.name .. ")" else output = mach.object_type.name end font:draw(canvas, output, x + 27, y + 27) -- Name font:draw(canvas, mach.total_usage, x + 60, y + 59) -- Total number of times used local status_bar_width = math.floor((1 - mach.times_used/mach.strength) * 40 + 0.5) if status_bar_width ~= 0 then for dx = 0, status_bar_width - 1 do self.panel_sprites:draw(canvas, 352, x + 53 + dx, y + 99) -- Or 5 end end end function UIMachine:callHandyman() if self.machine.times_used ~= 0 then local taskIndex = self.machine.hospital:getIndexOfTask(self.machine.tile_x, self.machine.tile_y, "repairing") if taskIndex == -1 then local call = self.ui.app.world.dispatcher:callForRepair(self.machine, false, true) self.machine.hospital:addHandymanTask(self.machine, "repairing", 2, self.machine.tile_x, self.machine.tile_y, call) else self.machine.hospital:modifyHandymanTaskPriority(taskIndex, 2, "repairing") end end end function UIMachine:replaceMachine() local machine = self.machine local hosp = self.ui.hospital local cost = hosp.research.research_progress[machine.object_type].cost if self.ui.hospital.balance < cost then -- give visual warning that player doesn't have enough $ to buy self.ui.adviser:say(_A.warnings.cannot_afford_2, false, true) self.ui:playSound("wrong2.wav") return end self.ui:addWindow(UIConfirmDialog(self.ui, _S.confirmation.replace_machine:format(machine.object_type.name, cost), --[[persistable:replace_machine_confirm_dialog]]function() -- Charge for new machine hosp:spendMoney(cost, _S.transactions.machine_replacement) -- Tell the machine to pretend it's a shiny new one machine:machineReplaced() end )) end function UIMachine:onMouseDown(code, x, y) -- cycle through all machines when you right click on the machine title if code == "right" then if x > 18 and x < 139 then if y > 19 and y < 42 then -- select next machine local ui = self.ui local first_machine, next_machine = nil, self.machine local next_room for _, entity in ipairs(ui.app.world.entities) do -- is a machine and not a slave (e.g. operating_table_b) if class.is(entity, Machine) and not entity.master then next_room = entity:getRoom() if next_room.is_active then if not first_machine then first_machine = entity end if not next_machine then next_machine = entity break elseif entity == next_machine then next_machine = nil end end end end if not next_machine or next_machine == self.machine then next_machine = first_machine end if next_machine and next_machine ~= self.machine then -- center screen on machine local sx, sy = ui.app.map:WorldToScreen(next_machine.tile_x, next_machine.tile_y) local dx, dy = next_machine.th:getPosition() ui:scrollMapTo(sx + dx, sy + dy) -- change window ui:addWindow(UIMachine(ui, next_machine, next_room)) ui:playSound("camclick.wav") end end end end return Window.onMouseDown(self, code, x, y) end CorsixTH-0.63/CorsixTH/Lua/dialogs/menu.lua000066400000000000000000000700321347163623700205000ustar00rootroot00000000000000--[[ Copyright (c) 2009 Peter "Corsix" Cawley 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. --]] local ipairs, math_floor, unpack, select, assert = ipairs, math.floor, unpack, select, assert local TH = require("TH") --! The ingame menu bar which sits (nominally hidden) at the top of the screen. class "UIMenuBar" (Window) ---@type UIMenuBar local UIMenuBar = _G["UIMenuBar"] function UIMenuBar:UIMenuBar(ui, map_editor) self:Window() local app = ui.app self.ui = ui self.on_top = true self.x = 0 self.y = 0 self.width = app.config.width self.height = 16 self.visible = false self.panel_sprites = app.gfx:loadSpriteTable("Data", "PullDV", true) self.white_font = app.gfx:loadFont("QData", "Font01V") self.blue_font = app.gfx:loadFont("QData", "Font02V") -- The list of top-level menus, from left to right self.menus = {} -- The menu which the cursor was most recently over -- This should be present in self.open_menus, else it won't be drawn self.active_menu = false -- The list of menus which should be displayed -- This list satifies: open_menus[x] == nil or open_menus[x].level == x self.open_menus = {} if map_editor then self:makeMapeditorMenu(app) else self:makeGameMenu(app) end end function UIMenuBar:onTick() if #self.open_menus > 0 then -- If the deepest menu has no need to be open, close it after a short time -- It needs to be open if the cursor is over it, or the cursor is over the -- item in its parent corresponding to it. local deepest = self.open_menus[#self.open_menus] local parent = deepest.parent if deepest == self.active_menu or (parent and parent == self.active_menu and parent.items[parent.hover_index] and parent.items[parent.hover_index].submenu == deepest) then self.menu_disappear_counter = nil else if self.menu_disappear_counter == 0 then self.menu_disappear_counter = nil local close_to = self.active_menu and self.active_menu.level or 0 for i = #self.open_menus, close_to + 1, -1 do self.open_menus[i] = nil end else self.menu_disappear_counter = (self.menu_disappear_counter or 26) - 1 end end end if self.disappear_counter then if self.disappear_counter == 0 then for i = #self.open_menus, 1, -1 do self.open_menus[i] = nil end self.active_menu = false self.visible = false self.disappear_counter = nil if self.on_top then self.ui:sendToBottom(self) self.on_top = false end else self.disappear_counter = self.disappear_counter - 1 end end Window.onTick(self) end function UIMenuBar:onChangeResolution() self.width = self.ui.app.config.width end function UIMenuBar:onChangeLanguage() local function check_size(menu) menu.has_size = false for _, item in ipairs(menu.items) do if item.submenu then check_size(item.submenu) end end end for _, menu in ipairs(self.menus) do check_size(menu.menu) end end local function assign_menu_levels(menu, level) menu.level = level for _, item in ipairs(menu.items) do if item.submenu then assign_menu_levels(item.submenu, level + 1) end end end --! Add a menu to the menu bar. --!param title Title of the menu (at the bar). --!param menu Menu to add. function UIMenuBar:addMenu(title, menu) assign_menu_levels(menu, 1) local menu_item = { title = title, menu = menu, x = 0, y = 0, height = 16, } if self.menus[1] then menu_item.x = self.menus[#self.menus].x + self.menus[#self.menus].width end menu_item.width = self.white_font:sizeOf(title) + 32 self.menus[#self.menus + 1] = menu_item end function UIMenuBar:draw(canvas) if not self.visible then return end local panel_sprites = self.panel_sprites local panel_sprites_draw = panel_sprites.draw canvas:nonOverlapping() panel_sprites_draw(panel_sprites, canvas, 1, 0, 0) panel_sprites_draw(panel_sprites, canvas, 4, 0, 6) panel_sprites_draw(panel_sprites, canvas, 7, 0, 10) for x = 10, self.width - 10, 10 do panel_sprites_draw(panel_sprites, canvas, 2, x, 0) end for x = 10, self.width - 10, 10 do panel_sprites_draw(panel_sprites, canvas, 5, x, 6) end for x = 10, self.width - 10, 10 do panel_sprites_draw(panel_sprites, canvas, 8, x, 10) end canvas:nonOverlapping(false) local x = self.width - 10 panel_sprites_draw(panel_sprites, canvas, 3, x, 0) panel_sprites_draw(panel_sprites, canvas, 6, x, 6) panel_sprites_draw(panel_sprites, canvas, 9, x, 10) for _, menu in ipairs(self.menus) do self.white_font:draw(canvas, menu.title, menu.x, menu.y, 0, menu.height) end for _, menu in ipairs(self.open_menus) do self:drawMenu(menu, canvas) end -- Draw clock if self.ui.app.config.twentyfour_hour_clock then self.white_font:draw(canvas, os.date("%H:%M"), self.width-45, 2, 0) else self.white_font:draw(canvas, os.date("%I:%M %p"), self.width-65, 2, 0) end end function UIMenuBar:drawMenu(menu, canvas) local panel_sprites = self.panel_sprites local panel_sprites_draw = panel_sprites.draw local x, y, w, h = menu.x, menu.y, menu.width, menu.height canvas:nonOverlapping() menu.render_list:draw(canvas, x, y) canvas:nonOverlapping(false) local btmy = y + h - 6 panel_sprites_draw(panel_sprites, canvas, 3, x + w - 10, y) for ypos = y + 6, y + h - 6, 4 do panel_sprites_draw(panel_sprites, canvas, 6, x + w - 10, ypos) end panel_sprites_draw(panel_sprites, canvas, 9, x + w - 10, btmy) x = menu.x y = menu.y + 4 for i, item in ipairs(menu.items) do -- Update the checkbox status if necessary before drawing if item.is_check_item and item.condition then item.checked = item.condition() end local font = self.white_font if i == menu.hover_index then font = self.blue_font end font:draw(canvas, item.title, x, y) if item.submenu then font:draw(canvas, "+", x + w - 10, y) elseif item.checked then panel_sprites_draw(panel_sprites, canvas, 10, x, y) end y = y + 14 end end function UIMenuBar:hitTestBar(x, y) if y < 16 then for _, menu in ipairs(self.menus) do if menu.x <= x and x < menu.x + menu.width then local submenu = menu.menu submenu.x = menu.x submenu.y = menu.y + menu.height - 2 submenu.hover_index = 0 self:calculateMenuSize(submenu) return submenu end end end return false end function UIMenuBar:onMouseMove(x, y) local padding = 6 local visible = y < self.height + padding local newactive = false if not self.active_menu then for i = #self.open_menus, 1, -1 do if self.open_menus[i]:hitTest(x, y, padding) then self.active_menu = self.open_menus[i] newactive = true break end end end if self.active_menu then local menu = self.active_menu while true do local hit = menu:hitTest(x, y, padding) local toparent = true if hit then toparent = false visible = true if hit ~= true then menu.hover_index = hit else menu.hover_index = 0 if menu.parent and menu.parent:hitTest(x, y, 0) then toparent = true end end local child = menu.items[menu.hover_index] child = not toparent and child and child.submenu if child then child.x = menu.x + menu.width - 10 child.y = menu.y + menu.hover_index * 14 - 14 self:calculateMenuSize(child) self.open_menus[child.level] = child for i = #self.open_menus, child.level + 1, -1 do self.open_menus[i] = nil end if child:hitTest(x, y, 0) then menu.hover_index = 0 self.active_menu = child child.parent = menu menu = child newactive = true else break end elseif not toparent then break end end if toparent then newactive = true menu.hover_index = 0 menu = menu.parent if not menu then local bar_menu = self:hitTestBar(x, y) if bar_menu then self.open_menus = {bar_menu} end self.active_menu = bar_menu or (visible and self.active_menu) break end self.active_menu = menu end end elseif self.ui.down_count ~= 0 then local bar_menu = self:hitTestBar(x, y) if bar_menu then self.open_menus = {bar_menu} self.active_menu = bar_menu end end newactive = newactive or (visible and not self.visible) if visible then self:appear() else self:disappear() end return newactive end function UIMenuBar:appear() self.disappear_counter = nil self.visible = true if not self.on_top then self.ui:sendToTop(self) self.on_top = true end end function UIMenuBar:disappear() if not self.disappear_counter then self.disappear_counter = 100 end end function UIMenuBar:onMouseDown(button, x, y) if button ~= "left" or not self.visible then return end local repaint = false while self.active_menu do local menu = self.active_menu if menu:hitTest(x, y, 0) then if repaint then self:onMouseMove(x, y) end return true end for i = #self.open_menus, self.active_menu.level, -1 do self.open_menus[i] = nil end self.active_menu = menu.parent repaint = true end local new_active = self:hitTestBar(x, y) if new_active ~= self.active_menu then self.open_menus = {new_active} self.active_menu = new_active repaint = true self.ui:playSound("selectx.wav") end return repaint end function UIMenuBar:onMouseUp(button, x, y) if button ~= "left" or not self.visible then return end local repaint = false while self.active_menu do local index = self.active_menu:hitTest(x, y, 0) if index == false then if not self.active_menu.parent and y < 16 then break else self.active_menu = self.active_menu.parent end elseif index == true then break else local item = self.active_menu.items[index] if item.submenu then break elseif item.is_check_item then if item.group then if not item.checked then item.checked = true for _, itm in ipairs(self.active_menu.items) do if itm ~= item and itm.group == item.group then itm.checked = false end end if item.handler then item.handler(item, self.active_menu) end end else item.checked = not item.checked if item.handler then item.handler(item, self.active_menu) end end else if item.handler then item.handler(item, self.active_menu) end if y > 22 then self:disappear() end self.active_menu = false end self.ui:playSound("selectx.wav") repaint = true break end end for i = #self.open_menus, (self.active_menu and self.active_menu.level or 0) + 1, -1 do self.open_menus[i] = nil end return repaint end function UIMenuBar:calculateMenuSize(menu) if menu.has_size ~= self then local w = 20 local h = 6 for _, item in ipairs(menu.items) do local item_w = self.white_font:sizeOf(item.title) + 10 if item_w > w then w = item_w end h = h + 14 end if h < 20 then h = 20 end menu.width = w menu.height = h menu.has_size = self local render_list = TH.spriteList() menu.render_list = render_list render_list:setSheet(self.panel_sprites) render_list:append(1, 0, 0) for x = 10, w - 10, 10 do render_list:append(2, x, 0) end for y = 6, h - 6, 4 do render_list:append(4, 0, y) for x = 10, w - 10, 10 do render_list:append(5, x, y) end end local btmy = h - 6 render_list:append(7, 0, btmy) for x = 10, w - 10, 10 do render_list:append(8, x, btmy) end end end class "UIMenu" ---@type UIMenu local UIMenu = _G["UIMenu"] function UIMenu:UIMenu() self.items = {} self.parent = false self.hover_index = 0 self.has_size = false end function UIMenu:hitTest(x, y, padding) -- number -> hit that item -- true -> hit menu, but not an item -- false -> no hit if self.x - padding <= x and x < self.x + self.width + padding and self.y - padding <= y and y < self.y + self.height + padding then if self.x <= x and x < self.x + self.width then local index = math_floor((y - self.y + 12) / 14) if 1 <= index and index <= #self.items then return index end end return true else return false end end function UIMenu:appendBase(item) self.items[#self.items + 1] = item self.has_size = false return self end function UIMenu:appendItem(text, callback) return self:appendBase { title = text, handler = callback, } end function UIMenu:appendCheckItem(text, checked, callback, group, condition) return self:appendBase { is_check_item = true, title = text, checked = not not checked, handler = callback, group = group, condition = condition } end function UIMenu:appendMenu(text, menu) menu.parent = self return self:appendBase { title = text, submenu = assert(menu, "No submenu"), } end -- A function to set the menu hotkey strings, whether a string or table. -- Usage: hotkey_value_label(hotkey name as string) -- Ex: hotkey_value_label("ingame_loadMenu") will produce (SHIFT+L) by default. --!param hotkey_name (string) Name of hotkey to be converted to string. --!param hotkeys (table) The app's hotkey table. I.E. app.hotkeys --!return (string) The hotkey returned in this format: (KEY+KEY) local function hotkey_value_label(hotkey_name, hotkeys) local hotkey_value = hotkeys[hotkey_name] if hotkey_value == nil then return "" end return string.upper(array_join(hotkey_value, "+")) end --! Make a menu for the map editor. --!param app Application. function UIMenuBar:makeMapeditorMenu(app) local menu = UIMenu() local hotkeys = app.hotkeys menu:appendItem(_S.menu_file.load:format(hotkey_value_label("ingame_loadMenu", hotkeys)), function() self.ui:addWindow(UILoadMap(self.ui, "map")) end) :appendItem(_S.menu_file.save:format(hotkey_value_label("ingame_saveMenu", hotkeys)), function() self.ui:addWindow(UISaveMap(self.ui)) end) :appendItem(_S.menu_file.quit:format(hotkey_value_label("ingame_quitLevel", hotkeys)), function() self.ui:quit() end) self:addMenu(_S.menu.file, menu) menu = UIMenu() menu:appendItem(_S.menu_player_count.players_1, function() self.ui.map_editor:setPlayerCount(1) end) :appendItem(_S.menu_player_count.players_2, function() self.ui.map_editor:setPlayerCount(2) end) :appendItem(_S.menu_player_count.players_3, function() self.ui.map_editor:setPlayerCount(3) end) :appendItem(_S.menu_player_count.players_4, function() self.ui.map_editor:setPlayerCount(4) end) self:addMenu(_S.menu.player_count, menu) end --! Make a menu for the game. --!param app Application. function UIMenuBar:makeGameMenu(app) local menu = UIMenu() local hotkeys = app.hotkeys menu:appendItem(_S.menu_file.load:format(hotkey_value_label("ingame_loadMenu", hotkeys)), function() self.ui:addWindow(UILoadGame(self.ui, "game")) end) :appendItem(_S.menu_file.save:format(hotkey_value_label("ingame_saveMenu", hotkeys)), function() self.ui:addWindow(UISaveGame(self.ui)) end) :appendItem(_S.menu_file.restart:format(hotkey_value_label("ingame_restartLevel", hotkeys)), function() app:restart() end) :appendItem(_S.menu_file.quit:format(hotkey_value_label("ingame_quitLevel", hotkeys)), function() self.ui:quit() end) self:addMenu(_S.menu.file, menu) local options = UIMenu() if app.audio.has_bg_music then local function vol(level, setting) if setting == "music" then return level == app.config.music_volume, function() app.audio:setBackgroundVolume(level) app:saveConfig() end, "" elseif setting == "sound" then return level == app.config.sound_volume, function() app.audio:setSoundVolume(level) app:saveConfig() end, "" else return level == app.config.announcement_volume, function() app.audio:setAnnouncementVolume(level) app:saveConfig() end, "" end end local function appendVolume(setting) local volume_menu = UIMenu() -- The three Volume menus for level = 10, 100, 10 do volume_menu:appendCheckItem(_S.menu_options_volume[level], vol(level / 100, setting)) end return volume_menu end options:appendCheckItem(_S.menu_options.sound:format(hotkey_value_label("ingame_toggleSounds", hotkeys)), app.config.play_sounds, function(item) app.audio:playSoundEffects(item.checked) app:saveConfig() end, nil, function() return app.config.play_sounds end) options:appendCheckItem(_S.menu_options.announcements:format(hotkey_value_label("ingame_toggleAnnouncements", hotkeys)), app.config.play_announcements, function(item) app.config.play_announcements = item.checked app:saveConfig() end, nil, function() return app.config.play_announcements end) options:appendCheckItem(_S.menu_options.music:format(hotkey_value_label("ingame_toggleMusic", hotkeys)), app.config.play_music, function(item) app.config.play_music = item.checked self.ui:togglePlayMusic(item) app:saveConfig() end, nil, function(musicStatus) return app.config.play_music end) options :appendMenu(_S.menu_options.sound_vol, appendVolume("sound")) :appendMenu(_S.menu_options.announcements_vol, appendVolume("announcement")) :appendMenu(_S.menu_options.music_vol, appendVolume("music")) :appendItem(_S.menu_options.jukebox:format(hotkey_value_label("ingame_jukebox", hotkeys)), function() self.ui:addWindow(UIJukebox(app)) end) end local function boolean_runtime_config(option) return not not app.runtime_config[option], function(item) app.runtime_config[option] = item.checked end end options:appendCheckItem(_S.menu_options.lock_windows, boolean_runtime_config"lock_windows") -- Edge Scrolling options:appendCheckItem(_S.menu_options.edge_scrolling, not app.config.prevent_edge_scrolling, function(item) app.config.prevent_edge_scrolling = not item.checked end, nil, function() return not app.config.prevent_edge_scrolling end) -- Mouse Capture options:appendCheckItem(_S.menu_options.capture_mouse, app.config.capture_mouse, function(item) app.config.capture_mouse = item.checked app:saveConfig() app:setCaptureMouse() end) options:appendCheckItem(_S.menu_options.adviser_disabled:format(hotkey_value_label("ingame_toggleAdvisor", hotkeys)), not app.config.adviser_disabled, function(item) app.config.adviser_disabled = not item.checked app:saveConfig() end, nil, function() return not app.config.adviser_disabled end) options:appendCheckItem(_S.menu_options.twentyfour_hour_clock, app.config.twentyfour_hour_clock, function(item) app.config.twentyfour_hour_clock = item.checked app:saveConfig() end) local function temperatureDisplay(method) return method == 1, function() app.world.map:setTemperatureDisplayMethod(method) end, "", function () return app.world.map.temperature_display_method == method end end local function wageIncreaseRequests(grant) return grant, function() app.world:getLocalPlayerHospital().policies.grant_wage_increase = grant end, "", function () if app.world:getLocalPlayerHospital().policies.grant_wage_increase == nil then app.world:getLocalPlayerHospital().policies.grant_wage_increase = app.config.grant_wage_increase end return app.world:getLocalPlayerHospital().policies.grant_wage_increase == grant end end options:appendMenu(_S.menu_options.wage_increase, UIMenu() :appendCheckItem(_S.menu_options_wage_increase.grant, wageIncreaseRequests(true)) :appendCheckItem(_S.menu_options_wage_increase.deny, wageIncreaseRequests(false)) ) options:appendMenu(_S.menu_options.warmth_colors, UIMenu() :appendCheckItem(_S.menu_options_warmth_colors.choice_1, temperatureDisplay(1)) :appendCheckItem(_S.menu_options_warmth_colors.choice_2, temperatureDisplay(2)) :appendCheckItem(_S.menu_options_warmth_colors.choice_3, temperatureDisplay(3)) ) local function rate(speed) return speed == "Normal", function() app.world:setSpeed(speed) end, "", function() return app.world:isCurrentSpeed(speed) end end options:appendMenu(_S.menu_options.game_speed, UIMenu() :appendCheckItem(_S.menu_options_game_speed.pause:format(hotkey_value_label("ingame_pause", hotkeys)), rate("Pause")) :appendCheckItem(_S.menu_options_game_speed.slowest:format(hotkey_value_label("ingame_gamespeed_slowest", hotkeys)), rate("Slowest")) :appendCheckItem(_S.menu_options_game_speed.slower:format(hotkey_value_label("ingame_gamespeed_slower", hotkeys)), rate("Slower")) :appendCheckItem(_S.menu_options_game_speed.normal:format(hotkey_value_label("ingame_gamespeed_normal", hotkeys)), rate("Normal")) -- (default) :appendCheckItem(_S.menu_options_game_speed.max_speed:format(hotkey_value_label("ingame_gamespeed_max", hotkeys)), rate("Max speed")) :appendCheckItem(_S.menu_options_game_speed.and_then_some_more:format(hotkey_value_label("ingame_gamespeed_thensome", hotkeys)), rate("And then some more")) ) self:addMenu(_S.menu.options, options) self:addMenu(_S.menu.charts, UIMenu() :appendItem(_S.menu_charts.bank_manager:format(hotkey_value_label("ingame_panel_bankManager", hotkeys)), function() self.ui.bottom_panel:dialogBankManager(true) end) :appendItem(_S.menu_charts.statement:format(hotkey_value_label("ingame_panel_bankStats", hotkeys)), function() self.ui.bottom_panel:dialogBankStats(true) end) :appendItem(_S.menu_charts.staff_listing:format(hotkey_value_label("ingame_panel_staffManage", hotkeys)), function() self.ui.bottom_panel:dialogStaffManagement(true) end) :appendItem(_S.menu_charts.town_map:format(hotkey_value_label("ingame_panel_townMap", hotkeys)), function() self.ui.bottom_panel:dialogTownMap(true) end) :appendItem(_S.menu_charts.casebook:format(hotkey_value_label("ingame_panel_casebook", hotkeys)), function() self.ui.bottom_panel:dialogDrugCasebook(true) end) :appendItem(_S.menu_charts.research:format(hotkey_value_label("ingame_panel_research", hotkeys)), function() self.ui.bottom_panel:dialogResearch(true) end) :appendItem(_S.menu_charts.status:format(hotkey_value_label("ingame_panel_status", hotkeys)), function() self.ui.bottom_panel:dialogStatus(true) end) :appendItem(_S.menu_charts.graphs:format(hotkey_value_label("ingame_panel_charts", hotkeys)), function() self.ui.bottom_panel:dialogCharts(true) end) :appendItem(_S.menu_charts.policy:format(hotkey_value_label("ingame_panel_policy", hotkeys)), function() self.ui.bottom_panel:dialogPolicy(true) end) :appendItem(_S.menu_charts.briefing, function() self.ui:showBriefing() end) ) local function _(s) return " " .. s:upper() .. " " end local function limit_camera(item) app.ui:limitCamera(item.checked) end local function disable_salary_raise(item) app.world:debugDisableSalaryRaise(item.checked) end local function overlay(...) local args = {n = select('#', ...), ...} return function(item, m) if args.n > 0 then app.map:loadDebugText(unpack(args, 1, args.n)) else app.map:clearDebugText() end end end local levels_menu = UIMenu() for L = 1, 12 do levels_menu:appendItem((" L%i "):format(L), function() local status, err = pcall(app.loadLevel, app, L) if not status then err = _S.errors.load_prefix .. err print(err) self.ui:addWindow(UIInformation(self.ui, {err})) end end) end if self.ui.app.config.debug then self:addMenu(_S.menu.debug, UIMenu() -- Debug :appendMenu(_S.menu_debug.jump_to_level, levels_menu) :appendItem(_S.menu_debug.connect_debugger:format(hotkey_value_label("global_connectDebugger", hotkeys)), function() self.ui:connectDebugger() end) :appendCheckItem(_S.menu_debug.limit_camera, true, limit_camera, nil, function() return self.ui.limit_to_visible_diamond end) :appendCheckItem(_S.menu_debug.disable_salary_raise, false, disable_salary_raise, nil, function() return self.ui.app.world.debug_disable_salary_raise end) :appendItem(_S.menu_debug.make_debug_fax, function() self.ui:makeDebugFax() end) :appendItem(_S.menu_debug.make_debug_patient, function() self.ui:addWindow(UIMakeDebugPatient(self.ui)) end) :appendItem(_S.menu_debug.cheats:format(hotkey_value_label("ingame_showCheatWindow", hotkeys)), function() self.ui:addWindow(UICheats(self.ui)) end) :appendItem(_S.menu_debug.lua_console:format(hotkey_value_label("global_showLuaConsole", hotkeys)), function() self.ui:addWindow(UILuaConsole(self.ui)) end) :appendItem(_S.menu_debug.debug_script:format(hotkey_value_label("global_runDebugScript", hotkeys)), function() self.ui:runDebugScript() end) :appendItem(_S.menu_debug.calls_dispatcher, function() self.ui:addWindow(UICallsDispatcher(self.ui)) end) :appendItem(_S.menu_debug.dump_strings:format(hotkey_value_label("ingame_poopStrings", hotkeys)), function() self.ui.app:dumpStrings() end) :appendItem(_S.menu_debug.dump_gamelog:format(hotkey_value_label("ingame_poopLog", hotkeys)), function() self.ui.app.world:dumpGameLog() end) :appendMenu(_S.menu_debug.map_overlay, UIMenu() :appendCheckItem(_S.menu_debug_overlay.none, true, overlay(), "") :appendCheckItem(_S.menu_debug_overlay.flags, false, overlay("flags"), "") :appendCheckItem(_S.menu_debug_overlay.positions, false, overlay("positions"), "") :appendCheckItem(_S.menu_debug_overlay.heat, false, overlay("heat"), "") :appendCheckItem(_S.menu_debug_overlay.byte_0_1, false, overlay(35, 8, 0, 1, false), "") :appendCheckItem(_S.menu_debug_overlay.byte_floor, false, overlay(35, 8, 2, 2, false), "") :appendCheckItem(_S.menu_debug_overlay.byte_n_wall, false, overlay(35, 8, 3, 3, false), "") :appendCheckItem(_S.menu_debug_overlay.byte_w_wall, false, overlay(35, 8, 4, 4, false), "") :appendCheckItem(_S.menu_debug_overlay.byte_5, false, overlay(35, 8, 5, 5, true), "") :appendCheckItem(_S.menu_debug_overlay.byte_6, false, overlay(35, 8, 6, 6, true), "") :appendCheckItem(_S.menu_debug_overlay.byte_7, false, overlay(35, 8, 7, 7, true), "") :appendCheckItem(_S.menu_debug_overlay.parcel, false, overlay("parcel"), "") ) :appendItem(_S.menu_debug.sprite_viewer, function() corsixth.require("sprite_viewer") end) ) end end CorsixTH-0.63/CorsixTH/Lua/dialogs/message.lua000066400000000000000000000146331347163623700211650ustar00rootroot00000000000000--[[ Copyright (c) 2009 Peter "Corsix" Cawley 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. --]] --! Small fax notification window which sits on the bottom bar. class "UIMessage" (Window) ---@type UIMessage local UIMessage = _G["UIMessage"] function UIMessage:UIMessage(ui, x, stop_x, onClose, type, message, owner, timeout, default_choice, callback) self:Window() local app = ui.app ui:playSound("NewFax.wav") self.esc_closes = false self.on_top = false self.onClose = onClose self.timer = timeout self.default_choice = default_choice self.ui = ui self.message = message self.callback = callback if owner then self.owner = owner if owner.message_callback then owner:message_callback(true) -- There can be only one message per owner, just remove any existing one end assert(owner.message_callback == nil) owner.message_callback = --[[persistable:owner_of_message_callback]] function(humanoid, do_remove) if do_remove then self:removeMessage() else self:openMessage() end end end self.width = 30 self.height = 28 self.stop_x = stop_x self.stop_y = -24 self.x = x self.y = 4 self.panel_sprites = app.gfx:loadSpriteTable("Data", "Panel02V", true) self.type = type local types = { emergency = 43, epidemy = 45, strike = 47, personality = 49, information = 51, disease = 53, report = 55 } local kind = types[type] self.can_dismiss = self.type ~= "strike" and #self.message.choices == 1 self.button = self:addPanel(kind, 0, 0) :setTooltip(self.can_dismiss and _S.tooltip.message.button_dismiss or _S.tooltip.message.button) -- FIXME: tooltip doesn't work very well here :makeToggleButton(0, 0, 30, 28, kind + 1, self.openMessage, nil, self.dismissMessage) -- The emergency has a rotating siren if kind == 43 then self.rotator = {} for i = 57, 60 do self.rotator[i] = self:addPanel(i, 10, 8) self.rotator[i].visible = false end self.active = 57 end end function UIMessage:draw(canvas, x, y) if self.on_top then Window.draw(self, canvas, x, y) else local x_, y_, w, h = canvas:getClip() canvas:setClip(x_, y + self.stop_y, w, self.height, true) Window.draw(self, canvas, x, y) canvas:setClip(x_, y_, w, h) end end function UIMessage:close(...) assert(self.onClose == nil, "UIMessage closed improperly") return Window.close(self, ...) end -- Adjust the toggle state to match if the message is open or not function UIMessage:adjustToggle() if (self.button.toggled and not self.fax) or (not self.button.toggled and self.fax) then self.button:toggle() end end function UIMessage:openMessage() if TheApp.world:isCurrentSpeed("Speed Up") then TheApp.world:previousSpeed() end if not TheApp.world:isCurrentSpeed("Pause") then TheApp.world:setSpeed("Pause") end if self.type == "strike" then -- strikes are special cases, as they are not faxes self.ui:addWindow(UIStaffRise(self.ui, self.owner, self.message)) self:removeMessage() else if self.fax then self.fax:close() else self.fax = UIFax(self.ui, self) self.ui:addWindow(self.fax) self.ui:playSound("fax_in.wav") end -- Manual adjustion of toggle state is necessary if owner's message_callback was used self:adjustToggle() end TheApp.video:setBlueFilterActive(false) end -- Removes the Message, executing a choice if given, else just deletes it --!param choice_number (number) if given, removes the message by executing this choice. function UIMessage:removeMessage(choice_number) if choice_number then if not self.fax then self.fax = UIFax(self.ui, self) -- NB: just create, don't add to ui end self.fax:choice(choice_number) else if self.fax then self.fax:close() end if self.owner then self.owner.message = nil self.owner.message_callback = nil end if self.onClose then self:onClose(false) self.onClose = nil end self:close() end end -- Tries to dismiss the message. This is only possible if there is only one choice. function UIMessage:dismissMessage() if self.can_dismiss then self:removeMessage(1) else self.ui:playSound("wrong2.wav") self:adjustToggle() end end function UIMessage:setXLimit(stop_x) assert(stop_x <= self.stop_x, "UIMessage moved in wrong direction") self.stop_x = stop_x end function UIMessage:onTick() if self.on_top == false and self.y == self.stop_y then self.on_top = true end if self.y > self.stop_y then local y = self.y - 8 if y > self.stop_y then self.y = y else self.y = self.stop_y end elseif self.x > self.stop_x then local x = self.x - 3 if x > self.stop_x then self.x = x else self.x = self.stop_x end end end function UIMessage:onWorldTick() if self.timer then self.timer = self.timer - 1 if self.timer <= 0 then self.timer = nil self:removeMessage(self.default_choice) end end if self.active then self.rotator[self.active].visible = false if self.active == 60 then self.active = 57 else self.active = self.active + 1 end self.rotator[self.active].visible = true end end function UIMessage:afterLoad(old, new) if old < 21 then -- self.button added; however check for existence first -- since the savegame bump was a couple of revisions later if not self.button then self.button = self.buttons[1] end end Window.afterLoad(self, old, new) end CorsixTH-0.63/CorsixTH/Lua/dialogs/patient.lua000066400000000000000000000314351347163623700212040ustar00rootroot00000000000000--[[ Copyright (c) 2009 Peter "Corsix" Cawley 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. --]] local TH = require("TH") -- Test for hit within the view circle local --[[persistable:patient_window_is_in_view_circle]] function is_in_view_circle(x, y) return (x - 55)^2 + (y - 254)^2 < 39^2 end --! Individual patient information dialog class "UIPatient" (Window) ---@type UIPatient local UIPatient = _G["UIPatient"] function UIPatient:UIPatient(ui, patient) self:Window() local app = ui.app self.esc_closes = true self.ui = ui self.modal_class = "humanoid_info" self.width = 191 self.height = 310 self:setDefaultPosition(-20, 30) self.panel_sprites = app.gfx:loadSpriteTable("QData", "Req02V", true) self.font = app.gfx:loadFont("QData", "Font74V") -- Font used in the treatment history self.patient = patient self.visible_diamond = ui:makeVisibleDiamond(75, 76) self:addPanel(320, 15, 0) -- Graph top self:addPanel(321, 15, 61) -- Graph bottom self.history_panel = self:addColourPanel(36, 22, 99, 88, 223, 223, 223) -- Treatment history background self.history_panel:makeButton(0, 0, 99, 88, nil, --[[persistable:patient_toggle_history]] function() self.history_panel.visible = not self.history_panel.visible end):setTooltip(_S.tooltip.patient_window.graph) -- Treatment history toggle self.history_panel.visible = false -- Hide the treatment history at start self:addPanel(322, 15, 126) -- Happiness / thirst / temperature sliders self:addPanel(323, 0, 201) -- View circle top self:addPanel(324, 0, 254) -- View circle bottom self:addPanel(325, 147, 21):makeButton(0, 0, 24, 24, 326, self.close):setTooltip(_S.tooltip.patient_window.close) -- If the patient has been diagnosed the "guess cure" button is not visible and -- if the patient is going home it is not possible to kick him/her anymore. self:addPanel(411, 14 + 132, 61 + 19):makeButton(0, 0, 25, 31, 412, self.viewQueue):setTooltip(_S.tooltip.patient_window.queue) -- Initialize all buttons and blankers, then call the update function which decides what to show. -- Show the drug casebook only after the disease has been diagnosed. self.disease_button = self:addPanel(329, 14 + 117, 61 + 107) :makeButton(0, 0, 38, 38, 330, self.viewDiseases):setTooltip(_S.tooltip.patient_window.casebook) self.disease_blanker = self:addColourPanel(14 + 115, 61 + 105, 45, 45, 113, 117, 170) self.home_button = self:addPanel(331, 14 + 95, 61 + 158):makeButton(0, 0, 60, 60, 332, self.goHome):setTooltip(_S.tooltip.patient_window.send_home) self.home_blanker = self:addColourPanel(14 + 93, 61 + 156, 67, 67, 113, 117, 170) self.guess_button = self:addPanel(413, 14 + 117, 61 + 58):makeButton(0, 0, 38, 38, 414, self.guessDisease):setTooltip(_S.tooltip.patient_window.abort_diagnosis) self.guess_blanker = self:addColourPanel(14 + 115, 61 + 56, 45, 45, 113, 117, 170) -- Set correct initial visibility/enabledness of the three buttons and their blankers self:updateInformation() self:makeTooltip(_S.tooltip.patient_window.happiness, 33, 117, 124, 141) self:makeTooltip(_S.tooltip.patient_window.thirst, 33, 141, 124, 169) self:makeTooltip(_S.tooltip.patient_window.warmth, 33, 169, 124, 203) -- Non-rectangular tooltip has to be realized with dynamic tooltip at the moment self:makeDynamicTooltip(--[[persistable:patient_window_center_tooltip]]function(x, y) if is_in_view_circle(x, y) then return _S.tooltip.patient_window.center_view end end, 17, 216, 92, 292) self:registerKeyHandlers() end function UIPatient:registerKeyHandlers() -- Always add this because of a race condition if the user clicks a patient -- that's already going home, then clicks another, the handler is left empty. Bad. -- Just do a going_home check when called. self:addKeyHandler("ingame_patient_gohome", self.goHome) end --! Normalise warmth of a patient. --!param warmth (number or nil) If given, the fraction of warmth of the patient. --!return (float) Normalized warmth level. function UIPatient.normaliseWarmth(warmth) if not warmth then return 0.5 end -- Return 1/2 if unknown. if warmth < 0.08 then warmth = 0 elseif warmth > 0.50 then warmth = 1 else warmth = (warmth - 0.08) / (0.50 - 0.08) end return warmth end --! Draw a bar in the patient dialogue window. --!param canvas Canvas to draw at. --!param xbase Horizontal base position. --!param ybase Vertical base position. --!param xpos Horizontal offset. --!param ypos Vertical offset. --!param value Fraction to draw. function UIPatient:drawBar(canvas, xbase, ybase, xpos, ypos, value) local width = math.floor(value * 40 + 0.5) for dx = 0, width - 1 do self.panel_sprites:draw(canvas, xbase, xpos + 58 + dx, ypos + ybase) end end function UIPatient:draw(canvas, x_, y_) local x, y = self.x + x_, self.y + y_ local map = self.ui.app.map local patient = self.patient -- If the patient has just despawned, then it will have no tile, hence -- making it impossible to render said patient. In this case, the dialog -- should close. Note that it is slightly better to close the dialog during -- the draw callback rather than the tick callback, as doing so in the tick -- callback would be removing from the window list while said list is being -- iterated, causing the next window in the list to miss it's tick (rendering -- is done via a reverse traversal, which does not suffer this problem). if not patient.tile_x then self:close() return end local px, py = map:WorldToScreen(patient.tile_x, patient.tile_y) local dx, dy = patient.th:getMarker() px = px + dx - 37 py = py + dy - 61 -- If the patient is spawning or despawning, or just on the map edge, then -- the rendering point needs adjustment to keep the rendered region entirely -- within the map (this situation doesn't occur very often, but we need to -- handle it properly when it does occur). px, py = self.ui.limitPointToDiamond(px, py, self.visible_diamond, true) self.ui.app.map:draw(canvas, px, py, 75, 76, x + 17, y + 216) Window.draw(self, canvas, x_, y_) -- The patient bars (happiness, thirst, and warmth). local warmth = self.normaliseWarmth(patient.attributes["warmth"]) self:drawBar(canvas, 348, 126, x, y, patient.attributes["happiness"] or 0.5) self:drawBar(canvas, 351, 154, x, y, 1 - (patient.attributes["thirst"] or 0.5)) self:drawBar(canvas, 349, 183, x, y, warmth) if self.history_panel.visible then self:drawTreatmentHistory(canvas, x + 40, y + 25) elseif patient.health_history then self:drawHealthHistory(canvas, x, y) end end --! List the treatments that were performed on the patient. --!param canvas Destination to draw on. --!param x (int) X position of the top of the list. --!param y (int) Y position of the top of the list. function UIPatient:drawTreatmentHistory(canvas, x, y) for _, room in ipairs(self.patient.treatment_history) do y = self.font:drawWrapped(canvas, room, x, y, 95) end end --! Draw the health graph of the patient. --!param canvas Destination to draw on. --!param x (int) X position of the top-left of the graph. --!param y (int) Y position of the top-left of the graph. function UIPatient:drawHealthHistory(canvas, x, y) -- Sizes and positions of the graph in the window. local hor_length = 76 local vert_length = 70 local startx = 58 local starty = 27 -- Health history information. local hh = self.patient.health_history local index = hh["last"] local size = hh["size"] local dx = hor_length / size local line = nil -- Make a line the first time we find a non-nil value. for _ = 1, size do index = (index == size) and 1 or (index + 1) if hh[index] then local posy = starty + (1.0 - hh[index]) * vert_length if not line then line = TH.line() line:setWidth(2) line:setColour(200, 55, 30, 255) line:moveTo(startx, posy) else line:lineTo(startx, posy) end end startx = startx + dx end if line then line:draw(canvas, x, y) end end function UIPatient:onMouseDown(button, x, y) self.do_scroll = button == "left" and is_in_view_circle(x, y) return Window.onMouseDown(self, button, x, y) end function UIPatient:onMouseUp(button, x, y) local ui = self.ui if button == "left" then self.do_scroll = false end local repaint = Window.onMouseUp(self, button, x, y) if button == "right" and is_in_view_circle(x, y) then -- Right click goes to the next patient local patient_index = nil for i, patient in ipairs(ui.hospital.patients) do if patient == self.patient then patient_index = i break end end patient_index = (patient_index or 0) + 1 local patient = ui.hospital.patients[patient_index] or ui.hospital.patients[1] if patient then ui:addWindow(UIPatient(ui, patient)) return false end end return repaint end function UIPatient:onMouseMove(x, y, dx, dy) self.do_scroll = self.do_scroll and is_in_view_circle(x, y) return Window.onMouseMove(self, x, y, dx, dy) end --[[! Scrolls the map to the position of the patient which this dialog belongs to ]] function UIPatient:scrollToPatient() local ui = self.ui local patient = self.patient local px, py = ui.app.map:WorldToScreen(patient.tile_x, patient.tile_y) local dx, dy = patient.th:getPosition() ui:scrollMapTo(px + dx, py + dy) end function UIPatient:onTick() if self.do_scroll then self:scrollToPatient() end return Window.onTick(self) end function UIPatient:updateInformation() local patient = self.patient if patient.diagnosed then self.disease_button.enabled = true self.disease_button.visible = true self.disease_blanker.visible = false else self.disease_button.enabled = false self.disease_button.visible = false self.disease_blanker.visible = true end if patient.going_home then self.home_button.enabled = false self.home_button.visible = false self.home_blanker.visible = true else self.home_button.enabled = true self.home_button.visible = true self.home_blanker.visible = false end if patient.is_debug or patient.diagnosis_progress == 0 or patient.diagnosed or patient.going_home then self.guess_button.enabled = false self.guess_button.visible = false self.guess_blanker.visible = true else self.guess_button.enabled = true self.guess_button.visible = true self.guess_blanker.visible = false end end function UIPatient:viewQueue() for _, action in ipairs(self.patient.action_queue) do if action.name == "queue" then self.ui:addWindow(UIQueue(self.ui, action.queue)) self.ui:playSound("selectx.wav") return end end self.ui:playSound("wrong2.wav") end function UIPatient:goHome() if self.patient.going_home then return end self:close() self.patient:playSound("sack.wav") self.patient:goHome("kicked") self.patient:updateDynamicInfo(_S.dynamic_info.patient.actions.sent_home) end function UIPatient:viewDiseases() local dlg = UICasebook(self.ui, self.patient.diagnosed and self.patient.disease.id or nil) self.ui:addWindow(dlg) end function UIPatient:guessDisease() local patient = self.patient -- NB: the first line of conditions should already be ruled out by button being disabled, but just in case if patient.is_debug or patient.diagnosis_progress == 0 or patient.diagnosed or patient.going_home or patient:getRoom() or not patient.hospital.disease_casebook[patient.disease.id].discovered then self.ui:playSound("wrong2.wav") return end patient:setDiagnosed() if patient:agreesToPay(patient.disease.id) then patient:setNextAction(SeekRoomAction(patient.disease.treatment_rooms[1]):enableTreatmentRoom(), 1) else patient:goHome("over_priced") end end function UIPatient:hitTest(x, y) return Window.hitTest(self, x, y) or is_in_view_circle(x, y) end function UIPatient:afterLoad(old, new) Window.afterLoad(self, old, new) self:registerKeyHandlers() end CorsixTH-0.63/CorsixTH/Lua/dialogs/place_objects.lua000066400000000000000000000717001347163623700223340ustar00rootroot00000000000000--[[ Copyright (c) 2009 Peter "Corsix" Cawley 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. --]] local TH = require("TH") local ipairs, math_floor = ipairs, math.floor -- Visually, it looks better to have the object being placed not attached to a -- tile (so that it is always on top of walls, etc.), but for debugging it can -- be useful to attach it to a tile. local ATTACH_BLUEPRINT_TO_TILE = false --! The dialog shown when placing objects. class "UIPlaceObjects" (Window) ---@type UIPlaceObjects local UIPlaceObjects = _G["UIPlaceObjects"] --[[ Constructor for the class. !param ui (UI) The active ui. !param object_list (table) a list of tables with objects to place. Keys are "object", "qty" and "existing_object". The first is the object_type of the object, the second how many, and if the key "existing_object" is set it should be an already existing object that is about to be moved. In particular, if that object has a variable called current_frame then that frame will be used when drawing the object as it is being moved. ]] function UIPlaceObjects:UIPlaceObjects(ui, object_list, pay_for) self:Window() object_list = object_list or {} -- Default argument local app = ui.app self.modal_class = "main" self.ui = ui self.map = app.map self.anims = app.anims self.world = app.world self.width = 186 self.height = 167 + #object_list * 29 self:setDefaultPosition(0.9, 0.1) self.panel_sprites = app.gfx:loadSpriteTable("QData", "Req05V", true) self.white_font = app.gfx:loadFont("QData", "Font01V") self.blue_font = app.gfx:loadFont("QData", "Font02V") self.title_text = _S.rooms_short.corridor_objects self.desc_text = _S.place_objects_window.place_objects_in_corridor self:addPanel(112, 0, 0) -- Dialog header for y = 48, 83, 7 do self:addPanel(113, 0, y) -- Desc text box end self:addPanel(114, 0, 90) -- Dialog mid-piece self:addPanel(115, 0, 100):makeButton(9, 8, 41, 42, 116, self.cancel):setSound("no4.wav"):setTooltip(_S.tooltip.place_objects_window.cancel) self.purchase_button = self:addPanel(117, 50, 100):makeButton(1, 8, 41, 42, 118, self.purchaseItems):setTooltip(_S.tooltip.place_objects_window.buy_sell) :setDisabledSprite(127):enable(false) -- Disabled purchase items button self.pickup_button = self:addPanel(119, 92, 100):makeButton(1, 8, 41, 42, 120, self.pickupItems):setTooltip(_S.tooltip.place_objects_window.pick_up) :setDisabledSprite(128):enable(false):makeToggle() -- Disabled pick up items button self.confirm_button = self:addPanel(121, 134, 100):makeButton(1, 8, 43, 42, 122, self.confirm):setTooltip(_S.tooltip.place_objects_window.confirm) :setDisabledSprite(129):enable(false):setSound("YesX.wav") -- Disabled confirm button self.list_header = self:addPanel(123, 0, 146) -- Object list header self.list_header.visible = false self.objects = {} self.object_footprint = {} self.num_slots = 0 self:addObjects(object_list, pay_for) ui:setWorldHitTest(false) UIPlaceObjects.registerKeyHandlers(self) end function UIPlaceObjects:registerKeyHandlers() self:addKeyHandler("global_cancel", self.cancel) self:addKeyHandler("global_cancel_alt", self.cancel) self:addKeyHandler("ingame_rotateobject", self.tryNextOrientation) end -- changes the window size and buttons to num_slots slots function UIPlaceObjects:resize(num_slots) if self.num_slots == num_slots then return end if num_slots == 0 then self.list_header.visible = false else self.list_header.visible = true end local function idx(i) return --[[persistable:place_objects_idx1]] function(window) if i == window.active_index then window:nextOrientation() else window.place_objects = true window:setActiveIndex(i) -- Stop picking up items when user presses object in list local edit_room_window = window.ui:getWindow(UIEditRoom) if edit_room_window and edit_room_window.in_pickup_mode then edit_room_window:stopPickupItems() end end end end if self.num_slots < num_slots then -- change last panel if self.num_slots > 0 then local last_panel = self.panels[#self.panels - 1] last_panel.y = last_panel.y + 4 last_panel.sprite_index = 124 end -- add new panels (save last one) for i = self.num_slots + 1, num_slots - 1 do self:addPanel(124, 0, 121 + i * 29) :makeButton(15, 8, 130, 23, 125, idx(i)) :preservePanel() end -- add last new panel self:addPanel(156, 0, 117 + num_slots * 29) :makeButton(15, 12, 130, 23, 125, idx(num_slots)) :preservePanel() else -- remove buttons for _ = self.num_slots, num_slots + 1, -1 do -- NB: Two panels per item, the latter being a dummy for the button self.panels[#self.panels] = nil self.panels[#self.panels] = nil self.buttons[#self.buttons] = nil if num_slots > 0 then -- change appearance of last panel local last_panel = self.panels[#self.panels - 1] last_panel.y = last_panel.y - 4 last_panel.sprite_index = 156 end end end self.num_slots = num_slots self.height = 167 + (num_slots) * 29 end function UIPlaceObjects:addObjects(object_list, pay_for) self.visible = true -- even if no objects are to be placed, make the window visible again if not object_list then object_list = {} end if #object_list == 0 and #self.objects == 0 then return end -- Detect objects already existing in self.objects and increment its quantity -- rather than adding new objects lines. local new_index = 1 while true do local new_object = object_list[new_index] if not new_object then break end for _, object in ipairs(self.objects) do if new_object.qty > 0 and new_object.object.thob == object.object.thob then object.qty = object.qty + new_object.qty if pay_for then local build_cost = self.ui.hospital:getObjectBuildCost(new_object.object.id) local msg = _S.transactions.buy_object .. ": " .. object.object.name self.ui.hospital:spendMoney(new_object.qty * build_cost, msg, new_object.qty * build_cost) end -- If this is an object that has been created in the world already, add it to the -- associated list of objects to re-place. if new_object.existing_object then if not object.existing_objects then object.existing_objects = {} end -- Insert the new object in the beginning of the list so that that this object -- is the one to be placed first. (LIFO) table.insert(object.existing_objects, 1, new_object.existing_object) end table.remove(object_list, new_index) new_index = new_index - 1 break end end new_index = new_index + 1 end self.place_objects = true -- When adding objects guess we want to place objects self.object_anim = TH.animation() self.object_slave_anim = TH.animation() local total_objects = #self.objects + #object_list self:resize(total_objects) for _, object in pairs(object_list) do if object.existing_object then object.existing_objects = {object.existing_object} end self.objects[#self.objects + 1] = object if pay_for then local build_cost = self.ui.hospital:getObjectBuildCost(object.object.id) local msg = _S.transactions.buy_object .. ": " .. object.object.name self.ui.hospital:spendMoney(object.qty * build_cost, msg, object.qty * build_cost) end end -- sort list by size of object (number of tiles in the first existing orientation (usually north)) table.sort(self.objects, function(o1, o2) local orient1 = o1.object.orientations.north or o1.object.orientations.east or o1.object.orientations.south or o1.object.orientations.west local orient2 = o2.object.orientations.north or o2.object.orientations.east or o2.object.orientations.south or o2.object.orientations.west return #orient1.footprint > #orient2.footprint end) self.active_index = 0 -- avoid case of index changing from 1 to 1 self:setActiveIndex(1) self:onCursorWorldPositionChange(self.ui:getCursorPosition(self)) end -- precondition: self.active_index has to correspond to the object to be removed function UIPlaceObjects:removeObject(object, dont_close_if_empty, refund) if refund then local build_cost = self.ui.hospital:getObjectBuildCost(object.object.id) local msg = _S.transactions.sell_object .. ": " .. object.object.name self.ui.hospital:receiveMoney(build_cost, msg, build_cost) end object.qty = object.qty - 1 -- Prefer to remove objects not yet placed local existing_no = object.existing_objects and #object.existing_objects or 0 if existing_no > 0 then if object.qty < #object.existing_objects then -- The object is already as good as destroyed. It is only known in this list. table.remove(object.existing_objects, 1) end end if object.qty == 0 then if #self.objects == 1 then self:clearBlueprint() self.object_cell_x = nil self.object_cell_y = nil if dont_close_if_empty then self.list_header.visible = false self.place_objects = false -- No object to place else self:close() return end end local idx = self.active_index table.remove(self.objects, idx) self:resize(#self.objects) self.active_index = 0 -- avoid case of index changing from 1 to 1 self:setActiveIndex(1) else -- Make sure the correct frame is shown for the next object self:setOrientation(self.object_orientation) end -- Update blueprint self:setBlueprintCell(self.object_cell_x, self.object_cell_y) end function UIPlaceObjects:removeAllObjects(refund) -- There is surely a nicer way to implement this than the current hack. Rewrite it sometime later. self:setActiveIndex(1) for _ = 1, #self.objects do for _ = 1, self.objects[1].qty do self:removeObject(self.objects[1], true, refund) end end end function UIPlaceObjects:removeObjects(object_list, refund) -- rewrite at some point.. if not object_list then object_list = {} end for _, o in ipairs(object_list) do for j, p in ipairs(self.objects) do if o.object.id == p.object.id then self.active_index = j for _ = 1, o.qty do self:removeObject(p, true, refund) end end end end end function UIPlaceObjects:close() self.ui:tutorialStep(1, {4, 5}, 1) self:removeAllObjects(true) self:clearBlueprint() self.ui:setWorldHitTest(true) return Window.close(self) end function UIPlaceObjects:cancel() self:close() end function UIPlaceObjects:setActiveIndex(index) if index == self.active_index or #self.objects == 0 then return end self.active_index = index local object = self.objects[self.active_index].object if object.id == "reception_desk" then self.ui:tutorialStep(1, 6, 4) else self.ui:tutorialStep(1, {4, 5}, 6) end local anims = self.anims local grey_scale = anims.Alt32_GreyScale local _, ghost = self.ui.app.gfx:loadPalette() for _, anim in pairs(object.idle_animations) do anims:setAnimationGhostPalette(anim, ghost, grey_scale) end if object.slave_type then for _, anim in pairs(object.slave_type.idle_animations) do anims:setAnimationGhostPalette(anim, ghost, grey_scale) end end if object.locked_to_wall then local wx, wy, wo = self:calculateBestPlacementPosition(0, 0) self.object_cell_x, self.object_cell_y = wx, wy self:setOrientation(wo) else self.object_orientation = "west" self:nextOrientation() end end local orient_mirror = { north = "west", west = "north", east = "south", south = "east", } local orient_next = { north = "east", east = "south", south = "west", west = "north", } function UIPlaceObjects:setOrientation(orient) self.object_orientation = orient local object_data = self.objects[self.active_index] local object = object_data.object local anim = object.idle_animations[orient] local flag = 0 if not anim then anim = object.idle_animations[orient_mirror[orient]] flag = 1 end if object.orientations[orient].early_list then flag = flag + 1024 end self.object_anim:setAnimation(self.anims, anim, flag) if object.slave_type then local slave_flag = flag - (flag % 2) local slave_anim = object.slave_type.idle_animations[orient] if not slave_anim then slave_anim = object.slave_type.idle_animations[orient_mirror[orient]] slave_flag = slave_flag + 1 end self.object_slave_anim:setAnimation(self.anims, slave_anim, slave_flag) end local present_object if object_data.existing_objects and #object_data.existing_objects > 0 then present_object = object_data.existing_objects[1] end if present_object and present_object.current_frame then self.object_anim:setFrame(present_object.current_frame) end local px, py = unpack(object.orientations[orient].render_attach_position) if type(px) == "table" then px, py = unpack(px) end px, py = Map:WorldToScreen(px + 1, py + 1) px = object.orientations[orient].animation_offset[1] + px py = object.orientations[orient].animation_offset[2] + py self.object_anim:setPosition(px, py) if object.slave_type then px, py = unpack(object.slave_type.orientations[orient].render_attach_position) if type(px) == "table" then px, py = unpack(px) end local offset = object.orientations[orient].slave_position if offset then px = px + offset[1] py = py + offset[2] end px, py = Map:WorldToScreen(px + 1, py + 1) px = object.slave_type.orientations[orient].animation_offset[1] + px py = object.slave_type.orientations[orient].animation_offset[2] + py self.object_slave_anim:setPosition(px, py) end self:setBlueprintCell(self.object_cell_x, self.object_cell_y) end function UIPlaceObjects:nextOrientation() if not self.object_anim then return end local object = self.objects[self.active_index].object if object.locked_to_wall then -- Orientation is dictated by the nearest wall return end local orient = self.object_orientation repeat orient = orient_next[orient] until object.orientations[orient] self:setOrientation(orient) end function UIPlaceObjects:tryNextOrientation() if #self.objects > 0 then self.ui:playSound("swoosh.wav") self.objects[self.active_index].orientation_before = self.object_orientation self:nextOrientation() end end function UIPlaceObjects:onMouseUp(button, x, y) local repaint = Window.onMouseUp(self, button, x, y) -- We don't want to place objects because we are selecting new objects for adding in a room being built/edited -- Or the game is paused. if not self.place_objects or not self.world.user_actions_allowed then return end if button == "right" then self:tryNextOrientation() repaint = true elseif button == "left" then if #self.objects > 0 then if 0 <= x and x < self.width and 0 <= y and y < self.height then -- Click within window - do nothing elseif self.object_cell_x and self.object_cell_y and self.object_blueprint_good then self:placeObject() repaint = true elseif self.object_cell_x and self.object_cell_y and not self.object_blueprint_good then self.ui:tutorialStep(3, {13, 15}, 14) end end end return repaint end function UIPlaceObjects:placeObject(dont_close_if_empty) if not self.place_objects then -- We don't want to place objects because we are selecting new objects for adding in a room being built/edited return end local object = self.objects[self.active_index] if object.object.id == "reception_desk" then self.ui:tutorialStep(1, 4, "next") end local real_obj -- There might be an existing object that has been picked up. if object.existing_objects and #object.existing_objects > 0 then real_obj = object.existing_objects[1] table.remove(object.existing_objects, 1) end local room = self.room or self.world:getRoom(self.object_cell_x, self.object_cell_y) if real_obj then -- If there is such an object then we don't want to make a new one, but move this one instead. if real_obj.orientation_before and real_obj.orientation_before ~= self.object_orientation then real_obj:initOrientation(self.object_orientation) end self.world:prepareFootprintTilesForBuild(real_obj.footprint, self.object_cell_x, self.object_cell_y) real_obj:setTile(self.object_cell_x, self.object_cell_y) self.world:objectPlaced(real_obj) if real_obj.slave then self.world:objectPlaced(real_obj.slave) end -- Some objects (e.g. the plant) uses this flag to avoid doing stupid things when picked up. real_obj.picked_up = false -- Machines may have smoke, recalculate it to ensure the animation is in the correct state if real_obj.strength then real_obj:calculateSmoke(room) end if class.is(real_obj, Machine) then real_obj:setHandymanRepairPosition(self.object_orientation) end else local object_footprint = object.object.orientations[self.object_orientation].footprint self.world:prepareFootprintTilesForBuild(object_footprint, self.object_cell_x, self.object_cell_y) real_obj = self.world:newObject(object.object.id, self.object_cell_x, self.object_cell_y, self.object_orientation) real_obj:setState(object.state) end if room then room.objects[real_obj] = true end self.ui:playSound("place_r.wav") self:removeObject(object, dont_close_if_empty) object.orientation_before = nil return real_obj end function UIPlaceObjects:draw(canvas, x, y) if not self.visible then return -- Do nothing if dialog is not visible end -- Don't show the object if the game is paused if self.world.user_actions_allowed then if not ATTACH_BLUEPRINT_TO_TILE and self.object_cell_x and self.object_anim then local xpos, ypos = self.ui:WorldToScreen(self.object_cell_x, self.object_cell_y) local zoom = self.ui.zoom_factor if canvas:scale(zoom) then xpos = math.floor(xpos / zoom) ypos = math.floor(ypos / zoom) end self.object_anim:draw(canvas, xpos, ypos) if self.objects[self.active_index].object.slave_type then self.object_slave_anim:draw(canvas, xpos, ypos) end canvas:scale(1) end end Window.draw(self, canvas, x, y) x, y = x + self.x, y + self.y self.white_font:draw(canvas, self.title_text, x + 17, y + 21, 153, 0) self.white_font:drawWrapped(canvas, self.desc_text, x + 20, y + 46, 147) for i, o in ipairs(self.objects) do local font = self.white_font local ypos = y + 136 + i * 29 if i == self.active_index then font = self.blue_font end font:draw(canvas, o.object.name, x + 15, ypos, 130, 0) font:draw(canvas, o.qty, x + 151, ypos, 19, 0) end end function UIPlaceObjects:clearBlueprint() local map = self.map.th if self.object_anim then self.object_anim:setTile(nil) end if self.object_slave_anim then self.object_slave_anim:setTile(nil) end for _, xy in ipairs(self.object_footprint) do if xy[1] ~= 0 then map:setCell(xy[1], xy[2], 4, 0) end end end local flag_alpha75 = 256 * 8 local flag_altpal = 16 function UIPlaceObjects:setBlueprintCell(x, y) self:clearBlueprint() self.object_cell_x = x self.object_cell_y = y if x and y and #self.objects > 0 then local object = self.objects[self.active_index].object local object_footprint = object.orientations[self.object_orientation].footprint local map = self.map.th if #object_footprint ~= #self.object_footprint then self.object_footprint = {} for i = 1, #object_footprint do self.object_footprint[i] = {} end end local optional_tiles = 0 for _, tile in ipairs(object_footprint) do if tile.optional then optional_tiles = optional_tiles + 1 end end local flags = {} local allgood = true local opt_tiles_blocked = 0 local world = self.ui.app.world local player_id = self.ui.hospital:getPlayerIndex() local roomId = self.room and self.room.id local passable_flag local direction = self.object_orientation local direction_parameters = { north = { x = 0, y = -1, buildable_flag = "buildableNorth", passable_flag = "travelNorth", needed_side = "need_north_side"}, east = { x = 1, y = 0, buildable_flag = "buildableEast", passable_flag = "travelEast", needed_side = "need_east_side"}, south = { x = 0, y = 1, buildable_flag = "buildableSouth", passable_flag = "travelSouth", needed_side = "need_south_side"}, west = { x = -1, y = 0, buildable_flag = "buildableWest", passable_flag = "travelWest", needed_side = "need_west_side"} } -- The given footprint tile is not usable, update the external 'allgood' -- variable accordingly. local function setAllGood(xy) if xy.optional then opt_tiles_blocked = opt_tiles_blocked + 1 if opt_tiles_blocked >= optional_tiles then allgood = false end else allgood = false end end for i, tile in ipairs(object_footprint) do local xpos = x + tile[1] local ypos = y + tile[2] -- Check 1: Does the tile have valid map coordinates?: if not world:isOnMap(xpos, ypos) then setAllGood(tile) xpos = 0 ypos = 0 else local flag = "buildable" local good_tile = 24 + flag_alpha75 local bad_tile = 67 + flag_alpha75 if tile.only_passable then flag = "passable" end if tile.only_side then if object.thob == 50 and direction == "east" then direction = "west" end flag = direction_parameters[direction]["buildable_flag"] passable_flag = direction_parameters[direction]["passable_flag"] end -- Check 2: Is the tile in the object's allowed room?: local result = world:willObjectsFootprintTileBeWithinItsAllowedRoomIfLocatedAt(xpos, ypos, object, roomId) local is_object_allowed = result.within_room roomId = result.roomId -- Check 3: The footprint tile should either be buildable or passable, is it?: if not tile.only_side and is_object_allowed then is_object_allowed = world:isFootprintTileBuildableOrPassable(xpos, ypos, tile, object_footprint, flag, player_id) elseif is_object_allowed then is_object_allowed = map:getCellFlags(xpos, ypos, flags)[flag] and (player_id == 0 or flags.owner == player_id) end -- ignore placed object tile if it is shareable if not tile.shareable and is_object_allowed then -- Check 4: only one object per tile allowed original TH -- can build on litter and unoccupied tiles and only placeable if not on another objects passable footprint unless that too is a shareable tile local objchk = map:getCellFlags(xpos, ypos, flags)["thob"] is_object_allowed = objchk == 0 or objchk == 62 or objchk == 64 -- no object, litter/puke, ratholes is_object_allowed = is_object_allowed and world:isTileExclusivelyPassable(xpos, ypos, 10) end -- Having checked if the tile is good set its blueprint appearance flag: if is_object_allowed then if not tile.invisible then map:setCell(xpos, ypos, 4, good_tile) end else if not tile.invisible then map:setCell(xpos, ypos, 4, bad_tile) end setAllGood(tile) end end self.object_footprint[i][1] = xpos self.object_footprint[i][2] = ypos end if self.object_anim and object.class ~= "SideObject" then if allgood then allgood = not world:wouldNonSideObjectBreakPathfindingIfSpawnedAt(x, y, object, self.object_orientation, roomId) end if ATTACH_BLUEPRINT_TO_TILE then self.object_anim:setTile(map, x, y) end self.object_anim:setPartialFlag(flag_altpal, not allgood) self.object_slave_anim:setPartialFlag(flag_altpal, not allgood) self.object_blueprint_good = allgood self.ui:tutorialStep(1, allgood and 5 or 4, allgood and 4 or 5) elseif object.class == "SideObject" then if map:getCellFlags(x, y)[passable_flag] == true then local checked_x, checked_y = x, y if passable_flag == "travelNorth" or passable_flag == "travelSouth" then checked_y = checked_y + (passable_flag == "travelNorth" and -1 or 1) else checked_x = checked_x + (passable_flag == "travelEast" and 1 or -1) end flags = {} flags[passable_flag] = false map:setCellFlags(x, y, flags) if not world.pathfinder:findDistance(x, y, checked_x, checked_y) then --we need to check if the failure to get the distance is due to the presence of an object in the adjacent tile if map:getCellFlags(checked_x, checked_y)["passable"] then allgood = false end end flags[passable_flag] = true map:setCellFlags(x, y, flags) end if ATTACH_BLUEPRINT_TO_TILE then self.object_anim:setTile(map, x, y) end self.object_anim:setPartialFlag(flag_altpal, not allgood) self.object_slave_anim:setPartialFlag(flag_altpal, not allgood) self.object_blueprint_good = allgood self.ui:tutorialStep(1, allgood and 5 or 4, allgood and 4 or 5) end else self.object_footprint = {} end end local function NearestPointOnLine(lx1, ly1, lx2, ly2, px, py) -- Translate everything to make one line segment endpoint be on the origin local lx = lx1 - lx2 local ly = ly1 - ly2 px = px - lx2 py = py - ly2 -- Project point onto line (scale everything to make (lx, ly) be on the unit -- circle, then dot product). local d = (lx * px + ly * py) / (lx * lx + ly * ly) if d <= 0 then return lx2, ly2 elseif d >= 1 then return lx1, ly1 else return d * lx1 + (1 - d) * lx2, d * ly1 + (1 - d) * ly2 end end function UIPlaceObjects:calculateBestPlacementPosition(x, y) local object = self.objects[self.active_index].object local room = self.room local wx, wy = self.ui:ScreenToWorld(self.x + x, self.y + y) local bestd = nil local bestx, besty = wx, wy local besto = self.object_orientation if room and object.locked_to_wall then if object.locked_to_wall.north then local px, py = NearestPointOnLine(room.x + 0.5, room.y + 0.5, room.x + room.width - 0.5, room.y + 0.5, wx, wy) local d = ((px - wx)^2 + (py - wy)^2)^0.5 if not bestd or d < bestd then bestd, bestx, besty, besto = d, px, py, object.locked_to_wall.north end end if object.locked_to_wall.west then local px, py = NearestPointOnLine(room.x + 0.5, room.y + 0.5, room.x + 0.5, room.y + room.height - 0.5, wx, wy) local d = ((px - wx)^2 + (py - wy)^2)^0.5 if not bestd or d < bestd then bestx, besty, besto = px, py, object.locked_to_wall.west end end -- TODO: East, South end bestx, besty = math_floor(bestx), math_floor(besty) if bestx < 1 or besty < 1 or bestx > self.map.width or besty > self.map.height then bestx, besty = nil, nil end return bestx, besty, besto end function UIPlaceObjects:onCursorWorldPositionChange(x, y) local repaint = Window.onCursorWorldPositionChange(self, x, y) if not self.place_objects then -- We don't want to place objects because we are selecting new objects for adding in a room being built/edited return repaint end repaint = true if self.world.user_actions_allowed then local wx, wy, wo = self:calculateBestPlacementPosition(x, y) if wx ~= self.object_cell_x or wy ~= self.object_cell_y then self:setBlueprintCell(wx, wy) repaint = true end if wo ~= self.object_orientation then self:setOrientation(wo) repaint = true end else self:clearBlueprint() end return repaint end function UIPlaceObjects:selectObjectType(object_type) for i, o in ipairs(self.objects) do if o.object.id == object_type.id then self:setActiveIndex(i) return end end end function UIPlaceObjects:afterLoad(old, new) Window.afterLoad(self, old, new) UIPlaceObjects.registerKeyHandlers(self) end CorsixTH-0.63/CorsixTH/Lua/dialogs/place_staff.lua000066400000000000000000000130021347163623700217750ustar00rootroot00000000000000--[[ Copyright (c) 2009 Peter "Corsix" Cawley 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. --]] local math_floor = math.floor local TH = require("TH") --! Invisible window which handles placing a `Staff` member in the world. class "UIPlaceStaff" (Window) ---@type UIPlaceStaff local UIPlaceStaff = _G["UIPlaceStaff"] function UIPlaceStaff:UIPlaceStaff(ui, profile, x, y) self.ui = ui self.world = ui.app.world self.modal_class = "main" self.esc_closes = true if class.is(profile, Staff) then self.staff = profile profile = profile.profile end self.profile = profile -- The receptionist has no door animations, and hence would not -- be able to leave a room if placed in one. self.allow_in_rooms = profile.humanoid_class ~= "Receptionist" self.anim = TH.animation() self.anim:setLayer(5, profile.layer5) local idle_anim = Humanoid.getIdleAnimation(profile.humanoid_class) self.anim:setAnimation(self.world.anims, idle_anim) local _, ghost = ui.app.gfx:loadPalette() local grey_scale = self.world.anims.Alt32_GreyScale self.world.anims:setAnimationGhostPalette(idle_anim, ghost, grey_scale) self:onCursorWorldPositionChange(x, y) self:Window() end function UIPlaceStaff:close() if self.staff then self.staff.pickup = false self.staff.going_to_staffroom = nil self.staff:getCurrentAction().window = nil self.staff:setNextAction(MeanderAction()) elseif self.profile then self.ui:tutorialStep(2, {6, 7}, 1) self.ui:tutorialStep(4, {4, 5}, 1) -- Return the profile to the available staff list local staff_pool = self.world.available_staff[self.profile.humanoid_class] staff_pool[#staff_pool + 1] = self.profile end self.ui:playSound("plac_st2.wav") Window.close(self) end function UIPlaceStaff:onCursorWorldPositionChange(x, y) x, y = self.ui:ScreenToWorld(x, y + 14) self.tile_x = math_floor(x) self.tile_y = math_floor(y) end local flag_cache = {} local flag_altpal = 16 function UIPlaceStaff:draw(canvas) if self.world.user_actions_allowed then self.world.map.th:getCellFlags(self.tile_x, self.tile_y, flag_cache) local room = self.world:getRoom(self.tile_x, self.tile_y) local player_id = self.ui.hospital:getPlayerIndex() local valid = flag_cache.hospital and flag_cache.passable and (self.allow_in_rooms or flag_cache.roomId == 0) and (not room and true or not room.crashed) and flag_cache.owner == player_id self.anim:setFlag(valid and 0 or flag_altpal) local zoom = self.ui.zoom_factor if canvas:scale(zoom) then local x, y = self.ui:WorldToScreen(self.tile_x, self.tile_y) self.anim:draw(canvas, math.floor(x / zoom), math.floor(y / zoom)) canvas:scale(1) else self.anim:draw(canvas, self.ui:WorldToScreen(self.tile_x, self.tile_y)) end self.ui:tutorialStep(2, valid and 7 or 6, valid and 6 or 7) self.ui:tutorialStep(4, valid and 5 or 4, valid and 4 or 5) end end function UIPlaceStaff:onMouseUp(button, x, y) if self.world.user_actions_allowed then if button == "right" then self:close() return true elseif button == "left" then self:onMouseMove(x, y) self.world.map.th:getCellFlags(self.tile_x, self.tile_y, flag_cache) local room = self.world:getRoom(self.tile_x, self.tile_y) local player_id = self.ui.hospital:getPlayerIndex() if flag_cache.hospital and flag_cache.passable and (self.allow_in_rooms or flag_cache.roomId == 0) and (not room or not room.crashed) and flag_cache.owner == player_id then if self.staff then self.staff:setTile(self.tile_x, self.tile_y) else local entity = self.world:newEntity(self.profile.humanoid_class, 2) entity:setProfile(self.profile) self.profile = nil entity:setTile(self.tile_x, self.tile_y) self.ui.hospital:addStaff(entity) entity:setHospital(self.ui.hospital) local entity_room = entity:getRoom() if entity_room then entity_room:onHumanoidEnter(entity) else entity:onPlaceInCorridor() end self.ui:tutorialStep(2, 6, "next") self.ui:tutorialStep(4, 4, "next") -- Update the staff management window if it is open. local window = self.world.ui:getWindow(UIStaffManagement) if window then window:updateStaffList(self) end end self:close() return true else self.ui.adviser:say(_A.placement_info.staff_cannot_place) return true end end end end CorsixTH-0.63/CorsixTH/Lua/dialogs/queue_dialog.lua000066400000000000000000000276011347163623700222030ustar00rootroot00000000000000--[[ Copyright (c) 2009 Peter "Corsix" Cawley 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. --]] local TH = require("TH") --! Room / door / reception desk queue visualisation dialog. class "UIQueue" (Window) ---@type UIQueue local UIQueue = _G["UIQueue"] function UIQueue:UIQueue(ui, queue) self:Window() local app = ui.app self.esc_closes = true self.ui = ui self.modal_class = "main" self.width = 604 self.height = 122 self:setDefaultPosition(0.5, 0.5) self.panel_sprites = app.gfx:loadSpriteTable("QData", "Req06V", true) self.white_font = app.gfx:loadFont("QData", "Font01V") self.queue = queue self:addPanel(364, 0, 0) -- Right extremity of the panel for x = 21, 83, 4 do self:addPanel(365, x, 0) end self:addPanel(366, 85, 0) for x = 223, 531, 7 do self:addPanel(367, x, 0) end self:addPanel(368, 529, 0) -- Left extremity of the panel self:addPanel(369, 97, self.height - 33):makeButton(0, 0, 17, 17, 370, self.decreaseMaxSize):setTooltip(_S.tooltip.queue_window.dec_queue_size) self:addPanel(371, 144, self.height - 33):makeButton(0, 0, 17, 17, 372, self.increaseMaxSize):setTooltip(_S.tooltip.queue_window.inc_queue_size) self:addPanel(373, self.width - 42, 17):makeButton(0, 0, 24, 24, 374, self.close):setTooltip(_S.tooltip.queue_window.close) self:makeTooltip(_S.tooltip.queue_window.num_in_queue, 15, 15, 163, 36) self:makeTooltip(_S.tooltip.queue_window.num_expected, 15, 39, 163, 60) self:makeTooltip(_S.tooltip.queue_window.num_entered, 15, 62, 163, 83) self:makeTooltip(_S.tooltip.queue_window.max_queue_size, 15, 87, 163, 108) self:makeTooltip(_S.tooltip.queue_window.front_of_queue, 168, 25, 213, 105) self:makeTooltip(_S.tooltip.queue_window.end_of_queue, 543, 51, 586, 105) self:makeTooltip(_S.tooltip.queue_window.patient .. " " .. _S.misc.not_yet_implemented, 218, 15, 537, 107) end function UIQueue:decreaseMaxSize() local amount = 1 if self.ui.app.key_modifiers.ctrl then amount = amount * 10 elseif self.ui.app.key_modifiers.shift then amount = amount * 5 end self.queue:decreaseMaxSize(amount) end function UIQueue:increaseMaxSize() local amount = 1 if self.ui.app.key_modifiers.ctrl then amount = amount * 10 elseif self.ui.app.key_modifiers.shift then amount = amount * 5 end self.queue:increaseMaxSize(amount) end function UIQueue:draw(canvas, x, y) Window.draw(self, canvas, x, y) x, y = self.x + x, self.y + y local font = self.white_font local queue = self.queue local num_patients = queue:reportedSize() font:draw(canvas, _S.queue_window.num_in_queue, x + 22, y + 22) font:draw(canvas, num_patients, x + 140, y + 22) font:draw(canvas, _S.queue_window.num_expected, x + 22, y + 45) font:draw(canvas, queue:expectedSize(), x + 140, y + 45) font:draw(canvas, _S.queue_window.num_entered, x + 22, y + 68) font:draw(canvas, queue.visitor_count, x + 140, y + 68) font:draw(canvas, _S.queue_window.max_queue_size, x + 22, y + 93) font:draw(canvas, queue.max_size, x + 119, y + 93) self:drawPatients(canvas, x, y) -- Draw dragged patient in the cursor location if self.dragged then self:drawPatient(canvas, self.dragged.x, self.dragged.y, self.dragged.patient) end end local function isInsideQueueBoundingBox(x, y) local x_min = 219 local x_max = 534 local y_min = 15 local y_max = 105 return not (x < x_min or x > x_max or y < y_min or y > y_max) end function UIQueue:onMouseDown(button, x, y) -- Allow normal window operations if the mouse is outside the listing of patients if not isInsideQueueBoundingBox(x, y) then return Window.onMouseDown(self, button, x, y) end local x_min = 219 local y_min = 15 self.hovered = self:getHoveredPatient(x - x_min, y - y_min) -- Select patient to drag - if left clicking. if button == "left" then self.dragged = self.hovered if self.dragged then self.dragged.x = x + self.x self.dragged.y = y + self.y end elseif button == "right" and self.hovered then -- Otherwise bring up the choice screen. self.just_added = true self.ui:addWindow(UIQueuePopup(self.ui, self.x + x, self.y + y, self.hovered.patient)) end end function UIQueue:onMouseUp(button, x, y) if self.just_added then self.just_added = false else -- Always remove any leftover popup windows local window = self.ui:getWindow(UIQueuePopup) if window then window:close() end end if button == "left" then local queue = self.queue local num_patients = queue:reportedSize() local width = 276 self.ui:setCursor(self.ui.default_cursor) -- reset cursor if not self.dragged then return Window.onMouseUp(self, button, x, y) end -- Check whether the dragged patient is still in the queue local index = -1 for i = 1, num_patients do if self.dragged.patient == queue:reportedHumanoid(i) then index = i break end end if index == -1 then self.dragged = nil return end if x > 170 and x < 210 and y > 25 and y < 105 then -- Inside door bounding box queue:movePatient(index, 'front') -- move to front elseif x > 542 and x < 585 and y > 50 and y < 105 then -- Inside exit sign bounding box queue:movePatient(index, 'back') -- move to back elseif isInsideQueueBoundingBox(x, y) then local dx = 1 if num_patients ~= 1 then dx = math.floor(width / (num_patients - 1)) end queue:movePatient(index, math.floor((x - 220) / dx)) -- move to dropped position self:onMouseMove(x, y, 0, 0) end -- Try to drop to another room local room local wx, wy = self.ui:ScreenToWorld(x + self.x, y + self.y) wx = math.floor(wx) wy = math.floor(wy) if wx > 0 and wy > 0 and wx < self.ui.app.map.width and wy < self.ui.app.map.height then room = self.ui.app.world:getRoom(wx, wy) end -- The new room must be of the same class as the current one local this_room = self.dragged.patient.next_room_to_visit if this_room and room and room ~= this_room and room.room_info.id == this_room.room_info.id then -- Move to another room local patient = self.dragged.patient patient:setNextAction(room:createEnterAction(patient)) patient.next_room_to_visit = room patient:updateDynamicInfo(_S.dynamic_info.patient.actions.on_my_way_to:format(room.room_info.name)) room.door.queue:expect(patient) room.door:updateDynamicInfo() end end self.dragged = nil end function UIQueue:onMouseMove(x, y, dx, dy) local x_min = 219 local y_min = 15 if self.dragged then self.dragged.x = x + self.x self.dragged.y = y + self.y -- Change cursor when outside queue dialog if x > 0 and x < 605 and y > 0 and y < 120 then self.ui:setCursor(self.ui.default_cursor) else self.ui:setCursor(self.ui.app.gfx:loadMainCursor("queue_drag")) end end if not isInsideQueueBoundingBox(x, y) then self.hovered = nil Window:onMouseMove(x, y, dx, dy) return end -- Update hovered patient self.hovered = self:getHoveredPatient(x - x_min, y - y_min) Window:onMouseMove(x, y, dx, dy) end function UIQueue:close() -- Always remove any leftover popup windows local window = self.ui:getWindow(UIQueuePopup) if window then window:close() end Window.close(self) end function UIQueue:getHoveredPatient(x, y) local queue = self.queue local num_patients = queue:reportedSize() local width = 276 local gap = 10 x = x - 15 -- sprite offset local dx = 0 if num_patients ~= 1 then dx = math.floor(width / (num_patients - 1)) end local offset = 0 local closest = nil -- Find the closest patient to the given x-coordinate for index = 1, num_patients do local patient = queue:reportedHumanoid(index) local patient_x = (index - 1) * dx + offset local diff = math.abs(patient_x - x) -- Take into account the gap between the hovered patient and other patients if self.hovered and patient == self.hovered.patient then offset = gap * 2 diff = diff + gap end if not closest or diff < closest.diff then closest = {patient = patient, diff = diff, x = x} end end -- The closest patient must be close enough (i.e. almost over the patient sprite) if not closest or closest.diff > 25 then return nil end return {patient = closest.patient, x = closest.x} end function UIQueue:drawPatients(canvas, x, y) local queue = self.queue local num_patients = queue:reportedSize() local width = 276 local gap = 10 local dx = 0 if not self.hovered then if num_patients ~= 1 then dx = math.floor(width / (num_patients - 1)) end for index = 1, num_patients do local patient = queue:reportedHumanoid(index) self:drawPatient(canvas, x + 239 + dx * (index - 1), y + 75, patient) end else if num_patients ~= 1 then dx = math.floor((width - 2 * gap) / (num_patients - 1)) end x = x + 239 y = y + 75 for index = 1, num_patients do local patient = queue:reportedHumanoid(index) if patient == self.hovered.patient then x = x + gap self:drawPatient(canvas, x, y - 10, patient) x = x + gap + dx else self:drawPatient(canvas, x, y, patient) x = x + dx end end end end function UIQueue:drawPatient(canvas, x, y, patient) local anim = TH.animation() local idle_anim = patient.getIdleAnimation(patient.humanoid_class) anim:setAnimation(self.ui.app.world.anims, idle_anim, 1) -- flag 1 is for having patients in west position (looking the door in the dialog) for layer, id in pairs(patient.layers) do anim:setLayer(layer, id) end anim:draw(canvas, x, y) -- Also draw the mood of the patient, if any. local mood = patient:getCurrentMood() if mood then mood:draw(canvas, x, y + 24) end end class "UIQueuePopup" (Window) ---@type UIQueuePopup local UIQueuePopup = _G["UIQueuePopup"] function UIQueuePopup:UIQueuePopup(ui, x, y, patient) self:Window() self.esc_closes = true self.ui = ui self.patient = patient self.width = 188 self.height = 68 local app = ui.app self.modal_class = "popup" self:setDefaultPosition(x, y) -- Background sprites self:addPanel(375, 0, 0) -- Buttons self:addPanel(0, 12, 12):makeButton(0, 0, 81, 54, 378, self.sendToReception) self:addPanel(0, 95, 12):makeButton(0, 0, 81, 54, 379, self.sendHome) self:addPanel(377, 0, 58) self.panel_sprites = app.gfx:loadSpriteTable("QData", "Req06V", true) self.white_font = app.gfx:loadFont("QData", "Font01V") end function UIQueuePopup:draw(canvas, x, y) Window.draw(self, canvas, x, y) -- TODO: Same as above. -- x, y = self.x + x, self.y + y --[[for i, hospital in ipairs(self.ui.app.world.hospitals) do self.white_font:draw(canvas, hospital.name:upper() , x + 74, y + 78 + (i-1)*34, 92, 0) end]] end function UIQueuePopup:sendToReception() self.patient:setNextAction(SeekReceptionAction()) self:close() end function UIQueuePopup:sendHome() self.patient:goHome("kicked") self:close() end CorsixTH-0.63/CorsixTH/Lua/dialogs/resizable.lua000066400000000000000000000164351347163623700215230ustar00rootroot00000000000000--[[ Copyright (c) 2010 Manuel "Roujin" Wolf 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. --]] --! Class for resizable windows. --! If resizable is set to true, the user can resize by clicking and dragging --any of the corners. class "UIResizable" (Window) ---@type UIResizable local UIResizable = _G["UIResizable"] local border_offset_x = 9 local border_offset_y = 9 local border_size_x = 40 local border_size_y = 40 function UIResizable:UIResizable(ui, width, height, colour, no_borders, background_bevel) self:Window() local app = ui.app self.ui = ui self.resizable = false -- by default, not user-resizable if not no_borders then self.border_sprites = app.gfx:loadSpriteTable("Bitmap", "aux_ui", true) end if background_bevel then self.background_panel = self:addBevelPanel(0, 0, 0, 0, colour) self.background_panel.lowered = true else self.background_panel = self:addColourPanel(0, 0, 0, 0, 0, 0, 0) end -- Minimum size. Can be changed per window, but should never be smaller than this -- because it would result in visual glitches self.min_width = 50 self.min_height = 50 self.border_pos = {} self.border_pos.left = -border_offset_x self.border_pos.upper = -border_offset_y -- NB: intentionally calling like this to allow subclasses to extend setSize without being called from here UIResizable.setSize(self, width, height) self:setColour(colour) end function UIResizable:setSize(width, height) width = math.max(self.min_width, width) height = math.max(self.min_height, height) self.width = width self.height = height self.background_panel.w = width self.background_panel.h = height self.border_pos.right = self.width self.border_pos.corner_right = self.width - border_size_x self.border_pos.lower = self.height self.border_pos.corner_lower = self.height - border_size_y end function UIResizable:setColour(colour) self.colour = colour self.background_panel:setColour(colour) end function UIResizable:draw(canvas, x, y) local sprites = self.border_sprites if sprites then local draw = sprites.draw local xabs = self.x + x local yabs = self.y + y canvas:nonOverlapping(true) draw(sprites, canvas, 10, xabs + self.border_pos.left , yabs + self.border_pos.upper) -- upper left corner draw(sprites, canvas, 12, xabs + self.border_pos.corner_right, yabs + self.border_pos.upper) -- upper right corner draw(sprites, canvas, 15, xabs + self.border_pos.left , yabs + self.border_pos.corner_lower) -- lower left corner draw(sprites, canvas, 17, xabs + self.border_pos.corner_right, yabs + self.border_pos.corner_lower) -- lower right corner for xpos = xabs + border_size_x, xabs + self.border_pos.corner_right - 1, border_size_x do draw(sprites, canvas, 11, xpos, yabs + self.border_pos.upper) -- upper edge draw(sprites, canvas, 16, xpos, yabs + self.border_pos.lower) -- lower edge end for ypos = yabs + border_size_y, yabs + self.border_pos.corner_lower - 1, border_size_y do draw(sprites, canvas, 13, xabs + self.border_pos.left, ypos) -- left edge draw(sprites, canvas, 14, xabs + self.border_pos.right, ypos) -- right edge end canvas:nonOverlapping(false) end -- Draw window components Window.draw(self, canvas, x, y) end function UIResizable:onMouseDown(button, x, y) local res = self.resizable and self:hitTestCorners(x, y) if res then self:beginResize(x, y, res) return true end return Window.onMouseDown(self, button, x, y) end function UIResizable:hitTest(x, y) if x >= 0 and y >= 0 and x < self.width and y < self.height then -- inside window return Window.hitTest(self, x, y) end local sprites = self.border_sprites if not sprites then return false end if x < -9 or y < -9 or x >= self.width + 9 or y >= self.height + 9 then -- outside border bounds return false end if (0 <= x and x < self.width) or (0 <= y and y < self.height) then -- edges (upper/lower/left/right) return true end return self:hitTestCorners(x, y) and true end --! Tests if any of the four corners of the window border is hit --!param x the x coordinate to test --!param y the y coordinate to test --!return (boolean or string) false if not hit, else a string to denote which corner was hit (can be "ul", "ur", "ll" or "lr") function UIResizable:hitTestCorners(x, y) if self.border_sprites then local yzone = (-9 <= y and y < 0) and "u" or (self.height <= y and y < self.height + 9) and "l" local xzone = (-9 <= x and x < 0) and "l" or (self.width <= x and x < self.width + 9) and "r" local sprite_ids = {ul = 10, ur = 12, ll = 15, lr = 17} if yzone and xzone then local zone = yzone .. xzone local dy = (yzone == "u" and self.border_pos.upper or self.border_pos.corner_lower) local dx = (xzone == "l" and self.border_pos.left or self.border_pos.corner_right) return self.border_sprites:hitTest(sprite_ids[zone], x - dx, y - dy) and zone end end return false end --[[ Initiate resizing of the resizable window. !param x The X position of the cursor in window co-ordinatees. !param y The Y position of the cursor in window co-ordinatees. !param mode Either one of "ul", "ur", "ll" or "lr" to denote in which direction to resize. (upper/lower + left/right) ]] function UIResizable:beginResize(x, y, mode) local orig_x = self.x local orig_y = self.y local ref_x = self.x + x local ref_y = self.y + y local orig_width = self.width local orig_height = self.height self.dragging = true self.ui.drag_mouse_move = --[[persistable:window_resize_mouse_move]] function (sx, sy) -- sx and sy are cursor screen co-ords. Convert to relative change. sx = sx - ref_x sy = sy - ref_y local invert_x = mode == "ul" or mode == "ll" local invert_y = mode == "ul" or mode == "ur" sx = invert_x and -sx or sx sy = invert_y and -sy or sy self:setSize(orig_width + sx, orig_height + sy) local new_x, new_y if invert_x then new_x = orig_x + orig_width - self.width end if invert_y then new_y = orig_y + orig_height - self.height end if new_x or new_y then self:setPosition(new_x or orig_x, new_y or orig_y) end end end function UIResizable:afterLoad(old, new) Window.afterLoad(self, old, new) if old < 65 then -- added min_width and min_height self.min_width = 50 self.min_height = 50 end end CorsixTH-0.63/CorsixTH/Lua/dialogs/resizables/000077500000000000000000000000001347163623700211725ustar00rootroot00000000000000CorsixTH-0.63/CorsixTH/Lua/dialogs/resizables/calls_dispatcher.lua000066400000000000000000000145041347163623700252050ustar00rootroot00000000000000--[[ Copyright (c) 2010 Sam Wong 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. --]] --! Calls Dispatcher Window class "UICallsDispatcher" (UIResizable) ---@type UICallsDispatcher local UICallsDispatcher = _G["UICallsDispatcher"] local col_bg = { red = 154, green = 146, blue = 198, } local col_button = { red = 84, green = 200, blue = 84, } local col_shadow = { red = 134, green = 126, blue = 178, } function UICallsDispatcher:UICallsDispatcher(ui) local app = ui.app self:UIResizable(ui, 320, 350, col_bg) self.ui = ui self.dispatcher = app.world.dispatcher self.on_top = false self.esc_closes = true self.resizable = false self.call_list = {} self.list_table = {} self.rows_shown = 0 self:createControls() self:setDefaultPosition(0.05, 0.05) self.default_button_sound = "selectx.wav" self.dispatcher:addChangeCallback(self.update, self) self:update() end local row_height = 20 local window_margin = 15 function UICallsDispatcher:createControls() local rows = math.floor((self.height - window_margin * 3 - 60) / row_height) if rows ~= self.rows_shown then local function assigned_factory(num) return --[[persistable:calls_dispatcher_assigned_button]] function(window) window:itemButtonClicked(num) end end local function task_factory(num) return --[[persistable:calls_dispatcher_task_button]] function(window) window:itemButtonClicked(num) end end local callback = --[[persistable:calls_dispatcher_scrollbar]] function() self:scrollbarChange() end self.rows_shown = rows self.list_table = {} local y = window_margin for i = 1, rows, 1 do local assigned_panel = self:addBevelPanel(window_margin, y, 20, row_height, col_button) local assigned_button = assigned_panel:makeButton(0, 0, 20, row_height, nil, assigned_factory(i)) :setTooltip(_S.tooltip.calls_dispatcher.assigned) local task_panel = self:addBevelPanel(50, y, self.width - 50 - 40 - window_margin, row_height, col_bg) local task_button = task_panel:makeButton(0, 0, self.width - 50 - 40 - window_margin, row_height, nil, task_factory(i)) :setTooltip(_S.tooltip.calls_dispatcher.task) table.insert(self.list_table, { assigned_panel = assigned_panel, assigned_button = assigned_button, task_panel = task_panel, task_button = task_button, }) y = y + row_height end self.summary_panel = self:addColourPanel(50, y + 10, self.width - 50 - 40 - window_margin, 20, col_bg.red, col_bg.green, col_bg.blue) self.scrollbar = self:addColourPanel(self.width - window_margin - 20, window_margin, 20, row_height * rows, col_shadow.red, col_shadow.green, col_shadow.blue) :makeScrollbar(col_bg, callback, 1, 1, 10, 1) self.close_button = self:addBevelPanel(window_margin, y + 20 + window_margin, self.width - 2 * window_margin, 40, col_bg):setLabel(_S.calls_dispatcher.close) :makeButton(0, 0, self.width - 2 * window_margin, 40, nil, self.close):setTooltip(_S.tooltip.calls_dispatcher.close) end end function UICallsDispatcher:update() self.call_list = {} local assigned = 0 for _, queue in pairs(self.dispatcher.call_queue) do for _, call in pairs(queue) do table.insert(self.call_list, call) if call.assigned then assigned = assigned + 1 end end end table.sort(self.call_list, function(a,b) if a.created == nil or b.created == nil then return false end return a.created < b.created end ) self.summary_panel:setLabel(_S.calls_dispatcher.summary:format(#self.call_list, assigned), nil, "left") self.scrollbar:setRange(1, math.max(1, #self.call_list), self.rows_shown, self.scrollbar.value) self:scrollbarChange() end function UICallsDispatcher:scrollToEntity(entity) local x, y = self.ui.app.map:WorldToScreen(entity.tile_x, entity.tile_y) local px, py = entity.th:getMarker() self.ui:scrollMapTo(x + px, y + py) end function UICallsDispatcher:scrollToRoom(room) local x, y = self.ui.app.map:WorldToScreen(room.x + room.width / 2, room.y + room.height / 2) self.ui:scrollMapTo(x, y) end function UICallsDispatcher:itemButtonClicked(index) local call = self.call_list[index + self.scrollbar.value - 1] if call and call.assigned then self.ui:addWindow(UIStaff(self.ui, call.assigned)) end if call and call.object then if class.is(call.object, Room) then self:scrollToRoom(call.object) elseif class.is(call.object, Entity) then self:scrollToEntity(call.object) end end end function UICallsDispatcher:scrollbarChange() local scroll_pos = self.scrollbar.value for i = 1, self.rows_shown, 1 do local call = self.call_list[i + scroll_pos - 1] local row = self.list_table[i] if call then row.assigned_panel:setLabel(call.assigned and "@" or '') row.assigned_button:enable(call.assigned and true or false) row.task_panel:setLabel((call.description and call.description or call.key), nil, "left") row.task_button:enable(true) else row.assigned_panel:setLabel("") row.task_panel:setLabel("") row.assigned_button:enable(false) row.task_button:enable(false) end end end function UICallsDispatcher:close() self.dispatcher:removeChangeCallback(self.update) Window.close(self) end CorsixTH-0.63/CorsixTH/Lua/dialogs/resizables/cheats.lua000066400000000000000000000165311347163623700231520ustar00rootroot00000000000000--[[ Copyright (c) 2010 Manuel "Roujin" Wolf 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. --]] --! A dialog for activating cheats class "UICheats" (UIResizable) ---@type UICheats local UICheats = _G["UICheats"] local col_bg = { red = 154, green = 146, blue = 198, } local col_caption = { red = 174, green = 166, blue = 218, } local col_border = { red = 134, green = 126, blue = 178, } local col_cheated_no = { red = 36, green = 154, blue = 36, } local col_cheated_yes = { red = 224, green = 36, blue = 36, } --[[ Constructs the cheat dialog. !param ui (UI) The active ui. ]] function UICheats:UICheats(ui) self.cheats = { {name = "money", func = self.cheatMoney}, {name = "all_research", func = self.cheatResearch}, {name = "emergency", func = self.cheatEmergency}, {name = "epidemic", func = self.cheatEpidemic}, {name = "toggle_infected", func = self.cheatToggleInfected}, {name = "vip", func = self.cheatVip}, {name = "earthquake", func = self.cheatEarthquake}, {name = "create_patient", func = self.cheatPatient}, {name = "end_month", func = self.cheatMonth}, {name = "end_year", func = self.cheatYear}, {name = "lose_level", func = self.cheatLose}, {name = "win_level", func = self.cheatWin}, {name = "increase_prices", func = self.cheatIncreasePrices}, {name = "decrease_prices", func = self.cheatDecreasePrices}, } self:UIResizable(ui, 300, 200, col_bg) self.default_button_sound = "selectx.wav" self.modal_class = "cheats" self.esc_closes = true self.resizable = false self:setDefaultPosition(0.2, 0.4) local y = 10 self:addBevelPanel(20, y, 260, 20, col_caption):setLabel(_S.cheats_window.caption) .lowered = true y = y + 30 self:addColourPanel(20, y, 260, 40, col_bg.red, col_bg.green, col_bg.blue):setLabel({_S.cheats_window.warning}) y = y + 40 self.cheated_panel = self:addBevelPanel(20, y, 260, 18, col_cheated_no, col_border, col_border) local function button_clicked(num) return --[[persistable:cheats_button]] function(window) window:buttonClicked(num) end end self.item_panels = {} self.item_buttons = {} y = y + 30 for num = 1, #self.cheats do self.item_panels[num] = self:addBevelPanel(20, y, 260, 20, col_bg) :setLabel(_S.cheats_window.cheats[self.cheats[num].name]) self.item_buttons[num] = self.item_panels[num]:makeButton(0, 0, 260, 20, nil, button_clicked(num)) :setTooltip(_S.tooltip.cheats_window.cheats[self.cheats[num].name]) y = y + 20 end y = y + 20 self:addBevelPanel(20, y, 260, 40, col_bg):setLabel(_S.cheats_window.close) :makeButton(0, 0, 260, 40, nil, self.buttonBack):setTooltip(_S.tooltip.cheats_window.close) y = y + 60 self:setSize(300, y) self:updateCheatedStatus() end function UICheats:updateCheatedStatus() local cheated = self.ui.hospital.cheated self.cheated_panel:setLabel(cheated and _S.cheats_window.cheated.yes or _S.cheats_window.cheated.no) self.cheated_panel:setColour(cheated and col_cheated_yes or col_cheated_no) end function UICheats:buttonClicked(num) -- Only the cheats that may fail return false in that case. All others return nothing. if self.cheats[num].func(self) ~= false then if self.cheats[num].name ~= "lose_level" then local announcements = self.ui.app.world.cheat_announcements if announcements then self.ui:playSound(announcements[math.random(1, #announcements)]) end self.ui.hospital.cheated = true self:updateCheatedStatus() end else -- It was not possible to use this cheat. self.ui:addWindow(UIInformation(self.ui, {_S.information.cheat_not_possible})) end end function UICheats:cheatMoney() self.ui.hospital:receiveMoney(10000, _S.transactions.cheat) end function UICheats:cheatResearch() local hosp = self.ui.hospital for _, cat in ipairs({"diagnosis", "cure"}) do while hosp.research.research_policy[cat].current do hosp.research:discoverObject(hosp.research.research_policy[cat].current) end end end function UICheats:cheatEmergency() if not self.ui.hospital:createEmergency() then self.ui:addWindow(UIInformation(self.ui, {_S.misc.no_heliport})) end end --[[ Creates a new contagious patient in the hospital - potentially an epidemic]] function UICheats:cheatEpidemic() self.ui.hospital:spawnContagiousPatient() end --[[ Before an epidemic has been revealed toggle the infected icons to easily distinguish the infected patients -- will toggle icons for ALL future epidemics you cannot distingush between epidemics by disease ]] function UICheats:cheatToggleInfected() local hospital = self.ui.hospital if hospital.future_epidemics_pool and #hospital.future_epidemics_pool > 0 then for _, future_epidemic in ipairs(hospital.future_epidemics_pool) do local show_mood = future_epidemic.cheat_always_show_mood future_epidemic.cheat_always_show_mood = not show_mood local mood_action = show_mood and "deactivate" or "activate" for _, patient in ipairs(future_epidemic.infected_patients) do patient:setMood("epidemy4",mood_action) end end else print("Unable to toggle icons - no epidemics in progress that are not revealed") end end function UICheats:cheatVip() self.ui.hospital:createVip() end function UICheats:cheatEarthquake() return self.ui.app.world:createEarthquake() end function UICheats:cheatPatient() self.ui.app.world:spawnPatient() end function UICheats:cheatMonth() self.ui.app.world:setEndMonth() end function UICheats:cheatYear() self.ui.app.world:setEndYear() end function UICheats:cheatLose() self.ui.app.world:loseGame(1) -- TODO adjust for multiplayer end function UICheats:cheatWin() self.ui.app.world:winGame(1) -- TODO adjust for multiplayer end function UICheats:cheatIncreasePrices() local hosp = self.ui.app.world.hospitals[1] for _, casebook in pairs(hosp.disease_casebook) do local new_price = casebook.price + 0.5 if new_price > 2 then casebook.price = 2 else casebook.price = new_price end end end function UICheats:cheatDecreasePrices() local hosp = self.ui.app.world.hospitals[1] for _, casebook in pairs(hosp.disease_casebook) do local new_price = casebook.price - 0.5 if new_price < 0.5 then casebook.price = 0.5 else casebook.price = new_price end end end function UICheats:buttonBack() self:close() end CorsixTH-0.63/CorsixTH/Lua/dialogs/resizables/customise.lua000066400000000000000000000231001347163623700237040ustar00rootroot00000000000000--[[ Copyright (c) 2013 Mark (Mark L) Lawlor 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. --]] --! Customise window used in the main menu and ingame. class "UICustomise" (UIResizable) ---@type UICustomise local UICustomise = _G["UICustomise"] local col_bg = { red = 154, green = 146, blue = 198, } local col_shadow = { red = 134, green = 126, blue = 178, } local col_caption = { red = 174, green = 166, blue = 218, } function UICustomise:UICustomise(ui, mode) self:UIResizable(ui, 320, 280, col_bg) local app = ui.app self.mode = mode self.modal_class = mode == "menu" and "main menu" or "options" or "customise" self.on_top = mode == "menu" self.esc_closes = true self.resizable = false self:setDefaultPosition(0.5, 0.25) self.default_button_sound = "selectx.wav" self.app = app -- Window parts definition -- Title self:addBevelPanel(80, 10, 160, 20, col_caption):setLabel(_S.customise_window.caption) .lowered = true -- Movies, global switch self:addBevelPanel(20, 40, 135, 20, col_shadow, col_bg, col_bg) :setLabel(_S.customise_window.movies):setTooltip(_S.tooltip.customise_window.movies).lowered = true self.movies_panel = self:addBevelPanel(160, 40, 135, 20, col_bg):setLabel(app.config.movies and _S.customise_window.option_on or _S.customise_window.option_off) self.movies_button = self.movies_panel:makeToggleButton(0, 0, 140, 20, nil, self.buttonMoviesGlobal) :setToggleState(app.config.movies):setTooltip(_S.tooltip.customise_window.movies) -- Intro movie self:addBevelPanel(20, 65, 135, 20, col_shadow, col_bg, col_bg) :setLabel(_S.customise_window.intro):setTooltip(_S.tooltip.customise_window.intro).lowered = true self.intro_panel = self:addBevelPanel(160, 65, 135, 20, col_bg):setLabel(app.config.play_intro and _S.customise_window.option_on or _S.customise_window.option_off) self.intro_button = self.intro_panel:makeToggleButton(0, 0, 140, 20, nil, self.buttonIntro) :setToggleState(app.config.play_intro):setTooltip(_S.tooltip.customise_window.intro) -- Allow user actions when paused self:addBevelPanel(20, 90, 135, 20, col_shadow, col_bg, col_bg) :setLabel(_S.customise_window.paused):setTooltip(_S.tooltip.customise_window.paused).lowered = true self.paused_panel = self:addBevelPanel(160, 90, 135, 20, col_bg):setLabel(app.config.allow_user_actions_while_paused and _S.customise_window.option_on or _S.customise_window.option_off) self.paused_button = self.paused_panel:makeToggleButton(0, 0, 140, 20, nil, self.buttonPaused) :setToggleState(app.config.allow_user_actions_while_paused):setTooltip(_S.tooltip.customise_window.paused) -- Volume down is opening casebook self:addBevelPanel(20, 115, 135, 20, col_shadow, col_bg, col_bg) :setLabel(_S.customise_window.volume):setTooltip(_S.tooltip.customise_window.volume).lowered = true self.volume_panel = self:addBevelPanel(160, 115, 135, 20, col_bg):setLabel(app.config.volume_opens_casebook and _S.customise_window.option_on or _S.customise_window.option_off) self.volume_button = self.volume_panel:makeToggleButton(0, 0, 140, 20, nil, self.buttonVolume) :setToggleState(app.config.volume_opens_casebook):setTooltip(_S.tooltip.customise_window.volume) -- Alien DNA from emergencies only/must stand/can knock on doors self:addBevelPanel(20, 140, 135, 20, col_shadow, col_bg, col_bg) :setLabel(_S.customise_window.aliens):setTooltip(_S.tooltip.customise_window.aliens).lowered = true self.aliens_panel = self:addBevelPanel(160, 140, 135, 20, col_bg):setLabel(app.config.alien_dna_only_by_emergency and _S.customise_window.option_on or _S.customise_window.option_off) self.aliens_button = self.aliens_panel:makeToggleButton(0, 0, 140, 20, nil, self.buttonAliens) :setToggleState(app.config.alien_dna_only_by_emergency):setTooltip(_S.tooltip.customise_window.aliens) -- Allow female patients with Fractured Bones self:addBevelPanel(20, 165, 135, 20, col_shadow, col_bg, col_bg) :setLabel(_S.customise_window.fractured_bones):setTooltip(_S.tooltip.customise_window.fractured_bones).lowered = true self.fractured_bones_panel = self:addBevelPanel(160, 165, 135, 20, col_bg):setLabel(app.config.disable_fractured_bones_females and _S.customise_window.option_on or _S.customise_window.option_off) self.fractured_bones_button = self.fractured_bones_panel:makeToggleButton(0, 0, 140, 20, nil, self.buttonFractured_bones) :setToggleState(app.config.disable_fractured_bones_females):setTooltip(_S.tooltip.customise_window.fractured_bones) -- Allow average contents when building rooms self:addBevelPanel(20, 190, 135, 20, col_shadow, col_bg, col_bg) :setLabel(_S.customise_window.average_contents):setTooltip(_S.tooltip.customise_window.average_contents).lowered = true self.average_contents_panel = self:addBevelPanel(160, 190, 135, 20, col_bg):setLabel(app.config.enable_avg_contents and _S.customise_window.option_on or _S.customise_window.option_off) self.average_contents_button = self.average_contents_panel:makeToggleButton(0, 0, 140, 20, nil, self.buttonAverage_contents) :setToggleState(app.config.enable_avg_contents):setTooltip(_S.tooltip.customise_window.average_contents) -- "Back" button self:addBevelPanel(20, 220, 280, 40, col_bg):setLabel(_S.customise_window.back) :makeButton(0, 0, 280, 40, nil, self.buttonBack):setTooltip(_S.tooltip.customise_window.back) end function UICustomise:buttonAudioGlobal(checked) local window = UIAudio(self.ui, "menu") self.ui:addWindow(window) end function UICustomise:buttonMoviesGlobal(checked) local app = self.ui.app app.config.movies = not app.config.movies self.movies_button:toggle() self.movies_panel:setLabel(app.config.movies and _S.customise_window.option_on or _S.customise_window.option_off) self:reload() app:saveConfig() end function UICustomise:buttonIntro(checked) local app = self.ui.app app.config.play_intro = not app.config.play_intro self.intro_button:toggle() self.intro_panel:setLabel(app.config.play_intro and _S.customise_window.option_on or _S.customise_window.option_off) self:reload() app:saveConfig() end function UICustomise:buttonPaused(checked) local app = self.ui.app app.config.allow_user_actions_while_paused = not app.config.allow_user_actions_while_paused self.paused_button:toggle() self.paused_panel:setLabel(app.config.allow_user_actions_while_paused and _S.customise_window.option_on or _S.customise_window.option_off) self:reload() app:saveConfig() end function UICustomise:buttonVolume(checked) local app = self.ui.app app.config.volume_opens_casebook = not app.config.volume_opens_casebook self.volume_button:toggle() self.volume_panel:setLabel(app.config.volume_opens_casebook and _S.customise_window.option_on or _S.customise_window.option_off) self:reload() app:saveConfig() end function UICustomise:buttonAliens(checked) local app = self.ui.app app.config.alien_dna_only_by_emergency = not app.config.alien_dna_only_by_emergency app.config.alien_dna_must_stand = not app.config.alien_dna_must_stand app.config.alien_dna_can_knock_on_doors = not app.config.alien_dna_can_knock_on_doors self.aliens_button:toggle() self.aliens_panel:setLabel(app.config.alien_dna_only_by_emergency and _S.customise_window.option_on or _S.customise_window.option_off) app:saveConfig() self:reload() local err = {_S.errors.alien_dna} self.ui:addWindow(UIInformation(self.ui, err)) end function UICustomise:buttonFractured_bones(checked) local app = self.ui.app app.config.disable_fractured_bones_females = not app.config.disable_fractured_bones_females self.fractured_bones_button:toggle() self.fractured_bones_panel:setLabel(app.config.disable_fractured_bones_females and _S.customise_window.option_on or _S.customise_window.option_off) app:saveConfig() self:reload() local err = {_S.errors.fractured_bones} self.ui:addWindow(UIInformation(self.ui, err)) end function UICustomise:buttonAverage_contents(checked) local app = self.ui.app app.config.enable_avg_contents = not app.config.enable_avg_contents self.average_contents_button:toggle() self.average_contents_panel:setLabel(app.config.enable_avg_contents and _S.customise_window.option_on or _S.customise_window.option_off) app:saveConfig() self:reload() end function UICustomise:buttonBack() self:close() local window = UIOptions(self.ui, "menu") self.ui:addWindow(window) end -- So that we can see the option has been changed reload the menu function UICustomise:reload() local window = UICustomise(self.ui, "menu") self.ui:addWindow(window) end function UICustomise:close() UIResizable.close(self) if self.mode == "menu" then self.ui:addWindow(UIMainMenu(self.ui)) end end CorsixTH-0.63/CorsixTH/Lua/dialogs/resizables/directory_browser.lua000066400000000000000000000153151347163623700254510ustar00rootroot00000000000000--[[ Copyright (c) 2010 Peter "Corsix" Cawley 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. --]] local lfs = require("lfs") local TH = require("TH") local lfsext = TH.lfsExt() --! A tree node representing a directory in the physical file-system. class "DirTreeNode" (FileTreeNode) ---@type DirTreeNode local DirTreeNode = _G["DirTreeNode"] function DirTreeNode:DirTreeNode(path) self:FileTreeNode(path) end function DirTreeNode:isValidFile(name) -- Check parent criteria and that it's a directory. if FileTreeNode.isValidFile(self, name) and lfs.attributes(self:childPath(name), "mode") == "directory" then -- Make sure that we are allowed to read the directory. local status, _, dir_obj = pcall(lfs.dir, self:childPath(name)) if status then dir_obj:close() end return status end end function DirTreeNode:getSelectColour(canvas) if self.is_valid_directory then return self.highlight_colour else return canvas:mapRGB(174, 166, 218) end end --! This tree only shows directories and highlights valid TH directories. class "InstallDirTreeNode" (DirTreeNode) ---@type InstallDirTreeNode local InstallDirTreeNode = _G["InstallDirTreeNode"] function InstallDirTreeNode:InstallDirTreeNode(path) self:FileTreeNode(path) end function InstallDirTreeNode:createNewNode(path) return InstallDirTreeNode(path) end function InstallDirTreeNode:select() -- Do nothing as an override. getHighlightColour solves this instead. end function InstallDirTreeNode:getHighlightColour(canvas) local highlight_colour = self.highlight_colour if highlight_colour == nil then highlight_colour = false if self:getLevel() == 0 and not self.has_looked_for_children then -- Assume root-level things are not TH directories, unless we've already -- got a list of their children. highlight_colour = nil elseif self:getChildCount() >= 3 then local ngot = 0 local things_to_check = {"data", "levels", "qdata"} for _, thing in ipairs(things_to_check) do if not self.children[thing:lower()] then break else ngot = ngot + 1 end end if ngot == 3 then highlight_colour = canvas:mapRGB(0, 255, 0) self.is_valid_directory = true end end self.highlight_colour = highlight_colour end return highlight_colour or nil end --! Prompter for Theme Hospital install directory class "UIDirectoryBrowser" (UIResizable) ---@type UIDirectoryBrowser local UIDirectoryBrowser = _G["UIDirectoryBrowser"] --! Creates a new directory browser window --!param ui The active UI to hook into. --!param mode Whether the dialog has been opened from the main_menu or somewhere else. Currently --! valid are "menu" or "dir_browser". --!param instruction The textual instruction what the user should do in the dialog. --!param treenode_class What TreeNode subclass the nodes will be built from. E.g. "InstallDirTreeNode" --!param callback The function that is called when the user has chosen a directory. Gets --! a path string as argument. function UIDirectoryBrowser:UIDirectoryBrowser(ui, mode, instruction, treenode_class, callback) self.col_bg = { red = 154, green = 146, blue = 198, } self.col_scrollbar = { red = 164, green = 156, blue = 208, } self:UIResizable(ui, 500, 423, self.col_bg, mode == nil and true or false) self.ui = ui self.mode = mode self.instruction = instruction self:setSize(500, 423) self:addColourPanel(0, 0, self.width, self.height, self.col_bg.red, self.col_bg.green, self.col_bg.blue) self.modal_class = mode == "menu" and "main menu" or "dir browser" self.resizable = false self.exit_button = self:addBevelPanel(260, 400, 100, 18, self.col_bg) if mode ~= nil then self.font = TheApp.gfx:loadFont("QData", "Font01V") self:setDefaultPosition(0.5, 0.25) self.on_top = true self.esc_closes = true self.exit_button:setLabel(_S.install.cancel, self.font):makeButton(0, 0, 100, 18, nil, self.close) else self.font = ui.app.gfx:loadBuiltinFont() self:setDefaultPosition(0.05, 0.5) self:addKeyHandler("global_cancel", self.exit) self:addKeyHandler("global_cancel_alt", self.exit) self.exit_button:setLabel(_S.install.exit, self.font):makeButton(0, 0, 100, 18, nil, self.exit) end -- Create the root item (or items, on Windows), and set it as the -- first_visible_node. local root local roots = lfsext.volumes() if #roots > 1 then for k, v in pairs(roots) do roots[k] = _G[treenode_class](v) end root = DummyRootNode(roots) else root = _G[treenode_class](roots[1]) end local select_function = function(node) if node.is_valid_directory then callback(node.path) self:close() end end local control = TreeControl(root, 5, 55, 490, 340, self.col_bg, self.col_scrollbar) :setSelectCallback(select_function) local ok_function = function() if control.selected_node then select_function(control.selected_node) end end self.ok_button = self:addBevelPanel(130, 400, 100, 18, self.col_bg) :setLabel(_S.install.ok, self.font):makeButton(0, 0, 100, 18, nil, ok_function) self:addWindow(control) end function UIDirectoryBrowser:exit() self.ui.app:exit() end function UIDirectoryBrowser:close() UIResizable.close(self) if self.mode == "menu" then self.ui:addWindow(UIFolder(self.ui, "menu")) end end function UIDirectoryBrowser:draw(canvas, x, y) UIResizable.draw(self, canvas, x, y) x, y = self.x + x, self.y + y if not self.mode then self.font:drawWrapped(canvas, _S.install.title, x + 5, y + 5, self.width - 10, "center") self.font:drawWrapped(canvas, self.instruction, x + 5, y + 15, self.width - 10) else self.font:drawWrapped(canvas, self.instruction, x + 5, y + 15, self.width - 10) end end CorsixTH-0.63/CorsixTH/Lua/dialogs/resizables/dropdown.lua000066400000000000000000000071151347163623700235350ustar00rootroot00000000000000--[[ Copyright (c) 2013 Manuel "Roujin" Wolf 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. --]] --! Dropdown "window" used for selection of one item from a list. class "UIDropdown" (UIResizable) ---@type UIDropdown local UIDropdown = _G["UIDropdown"] --! Constructor for the dropdown "window" --!param ui (UI) The ui the window is created in --!param parent_window (Window) The window that this dropdown will be attached to --!param parent_button (Button) The button in the parent_window that this dropdown will be positioned under --!param items (table) A list of items for the list to display, where each item is a table with at least -- the field text, and optionally fields font and/or tooltip --!param callback (function) A function to be called when an item is selected. It is called with two parameters: -- The parent window and the index of the selected item --!param colour (table) A colour in the form of {red = ..., green = ..., blue = ...}. Optional if parent_window is a UIResizable function UIDropdown:UIDropdown(ui, parent_window, parent_button, items, callback, colour) local col = colour or parent_window.colour self:UIResizable(ui, 1, 1, col, true, true) self.modal_class = "dropdown" self.esc_closes = true self.resizable = false self.default_button_sound = "selectx.wav" self.parent_window = parent_window self.parent_button = parent_button self.items = items self.callback = callback local panel = parent_button.panel_for_sprite local width = panel.w local height = panel.h -- TODO: Somehow make the dropdown disappear if the user clicks outside it. self:setPosition(panel.x, panel.y + panel.h) local y = 0 for i, item in ipairs(items) do self:addBevelPanel(1, y + 1, width - 2, height - 2, parent_window.colour):setLabel(item.text, item.font) :makeButton(-1, -1, width, height, nil, --[[persistable:dropdown_callback]] function() self:selectItem(i) end) -- TODO: tooltips for dropdown items currently deactivated because alignment and conditions for displaying are off for tooltips on sub-windows --:setTooltip(item.tooltip) y = y + height end -- Adjust size self:setSize(width, y) end function UIDropdown:selectItem(number) UIResizable.close(self) self.parent_button:setLabel(self.items[number].text, self.items[number].font):setToggleState(false) if self.callback then self.callback(self.parent_window, number) end end function UIDropdown:beginDrag(x, y) -- TODO: It may be undesirable anyway for dropdowns, but for dragging of sub-windows -- offsets are wrongly calculated (results in jump when dragging) -- Disable dragging return false end CorsixTH-0.63/CorsixTH/Lua/dialogs/resizables/file_browser.lua000066400000000000000000000171001347163623700243560ustar00rootroot00000000000000--[[ Copyright (c) 2011 Edvin "Lego3" Linge 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. --]] local lfs = require("lfs") --! A tree node representing a file (or directory) in the physical file-system -- that meets a given file extension criterion. class "FilteredFileTreeNode" (FileTreeNode) ---@type FilteredFileTreeNode local FilteredFileTreeNode = _G["FilteredFileTreeNode"] function FilteredFileTreeNode:FilteredFileTreeNode(path, filter) self:FileTreeNode(path) self.filter_by = filter end function FilteredFileTreeNode:isValidFile(name) -- Directories and files ending with .sav are valid. if FileTreeNode.isValidFile(self, name) then if lfs.attributes(self:childPath(name), "mode") == "directory" then return true end if type(self.filter_by) == "table" then for _, ext in ipairs(self.filter_by) do if string.sub(name:lower(), -string.len(ext)) == ext then return true end end else return string.sub(name:lower(), -string.len(self.filter_by)) == self.filter_by end end return false -- TODO: We don't want to show hidden files on windows. How can we check that? end function FilteredFileTreeNode:createNewNode(path) return FilteredFileTreeNode(path, self.filter_by) end function FilteredFileTreeNode:getLabel() -- The label was previously only the file name without extension or -- folder hierarchy. TODO: Is there some reason to not show the extension? local label = self.label if not label then label = FileTreeNode.getLabel(self) --[[if type(self.filter_by) == "table" then for _, ext in ipairs(self.filter_by) do if string.sub(label:lower(), -string.len(ext)) == ext then label = string.sub(label:lower(), 0, -string.len(ext) - 1) end end elseif string.sub(label:lower(), -string.len(self.filter_by)) == self.filter_by then label = string.sub(label:lower(), 0, -string.len(self.filter_by) - 1) end--]] self.label = label end return label end --! A sortable tree control that accommodates a certain file type and also possibly shows -- their last modification dates. class "FilteredTreeControl" (TreeControl) ---@type FilteredTreeControl local FilteredTreeControl = _G["FilteredTreeControl"] function FilteredTreeControl:FilteredTreeControl(root, x, y, width, height, col_bg, col_fg, has_font, show_dates) self:TreeControl(root, x, y, width, height, col_bg, col_fg, 14, has_font) self.num_rows = (self.tree_rect.h - self.y_offset) / self.row_height -- Add the two column headers and make buttons on them. if show_dates then self:addBevelPanel(1, 1, width - 170, 13, col_bg):setLabel(_S.menu_list_window.name) :makeButton(0, 0, width - 170, 13, nil, self.sortByName):setTooltip(_S.tooltip.menu_list_window.name) self:addBevelPanel(width - 169, 1, 150, 13, col_bg):setLabel(_S.menu_list_window.save_date) :makeButton(0, 0, 150, 13, nil, self.sortByDate):setTooltip(_S.tooltip.menu_list_window.save_date) end self.show_dates = show_dates end function FilteredTreeControl:sortByName() if self.sort_by == "date" or (self.sort_by == "name" and self.order == "descending") then self:sortBy("name", "ascending") else self:sortBy("name", "descending") end end function FilteredTreeControl:sortByDate() if self.sort_by == "name" or (self.sort_by == "date" and self.order == "descending") then self:sortBy("date", "ascending") else self:sortBy("date", "descending") end end --! Sorts the list according to the given parameters. --!param sort_by Either "name" or "date". --!param order Either "ascending" or "descending" function FilteredTreeControl:sortBy(sort_by, order) self.sort_by = sort_by self.order = order -- Find how many nodes are above the first visible one in order -- to make the correct new nodes show. (Because of the scrollbar) local number = 0 local node = self.first_visible_node while node ~= self.tree_root do number = number + 1 node = node:getPrevVisible() end self.tree_root:reSortChildren(sort_by, order) -- Now check which new node will be the first visible one. node = self.tree_root while number > 0 do node = node:getNextVisible() number = number - 1 end self.first_visible_node = node end function FilteredTreeControl:drawExtraOnRow(canvas, node, x, y) -- We want to show the modification date to the right of each save. if not node:hasChildren() and self.show_dates then local last_mod = node:getLastModification() local daytime = _S.date_format.daymonth:format(os.date("%d", last_mod), tonumber(os.date("%m", last_mod))) self.font:draw(canvas, daytime .. " " .. os.date("%Y %X", last_mod), x + self.tree_rect.w - 140, y) end end --! A file browser with a scrollbar. Used by load_game and save_game. class "UIFileBrowser" (UIResizable) ---@type UIFileBrowser local UIFileBrowser = _G["UIFileBrowser"] local col_caption = { red = 174, green = 166, blue = 218, } --[[ Constructs the dialog. !param ui (UI) The active ui. !param mode (string) Either "menu" or "game" depending on which mode the game is in right now. !param title (string) The desired title of the dialog. ]] function UIFileBrowser:UIFileBrowser(ui, mode, title, vertical_size, root, show_dates) self.col_bg = { red = 154, green = 146, blue = 198, } self.col_scrollbar = { red = 164, green = 156, blue = 208, } local h_size = 450 self:UIResizable(ui, h_size, 380, self.col_bg) self.default_button_sound = "selectx.wav" self.mode = mode self.modal_class = mode == "menu" and "main menu" or "saveload" self.on_top = mode == "menu" self.esc_closes = true self.resizable = false self:setDefaultPosition(0.5, 0.25) self:addBevelPanel((h_size - 190) / 2, 10, 190, 20, col_caption):setLabel(title) .lowered = true -- Initialize the tree control self.control = FilteredTreeControl(root, 5, 35, h_size - 10, vertical_size, self.col_bg, self.col_scrollbar, true, show_dates) :setSelectCallback(--[[persistable:file_browser_select_callback]] function(node) if node.is_valid_file and (lfs.attributes(node.path, "mode") ~= "directory") then self:choiceMade(node.path) end end) self:addWindow(self.control) -- Create the back button. self:addBevelPanel((h_size - 160) / 2, 340, 160, 30, self.col_bg):setLabel(_S.menu_list_window.back) :makeButton(0, 0, 160, 40, nil, self.buttonBack):setTooltip(_S.tooltip.menu_list_window.back) end -- Function stub for dialogs to override. This function is called each time a file is chosen. --!param name (string) Name of the file chosen. function UIFileBrowser:choiceMade(name) end function UIFileBrowser:buttonBack() self:close() end CorsixTH-0.63/CorsixTH/Lua/dialogs/resizables/file_browsers/000077500000000000000000000000001347163623700240375ustar00rootroot00000000000000CorsixTH-0.63/CorsixTH/Lua/dialogs/resizables/file_browsers/choose_font.lua000066400000000000000000000042641347163623700270560ustar00rootroot00000000000000--[[ Copyright (c) 2013 Edvin "Lego3" Linge 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. --]] local TH = require("TH") local lfsext = TH.lfsExt() --! Window where the user can choose a font file. class "UIChooseFont" (UIFileBrowser) ---@type UIChooseFont local UIChooseFont = _G["UIChooseFont"] function UIChooseFont:UIChooseFont(ui, mode) -- Create the root item (or items, on Windows). local root local roots = lfsext.volumes() if #roots > 1 then for k, v in pairs(roots) do roots[k] = FilteredFileTreeNode(v, {".ttc", ".otf", ".ttf"}) end root = DummyRootNode(roots) else root = FilteredFileTreeNode(roots[1], {".ttc", ".otf", ".ttf"}) end self:UIFileBrowser(ui, mode, _S.font_location_window.caption:format(".ttc, .otf, .ttf"), 265, root) end --! Function called by clicking button of existing save #num function UIChooseFont:choiceMade(name) local app = TheApp app.config.unicode_font = name app:saveConfig() app.gfx:loadFontFile() if class.is(self.parent, UIOptions) then self.parent:checkForAvailableLanguages() end self:close() end function UIChooseFont:close() UIResizable.close(self) if self.mode == "menu" then self.ui:addWindow(UIOptions(self.ui, self.mode)) end end CorsixTH-0.63/CorsixTH/Lua/dialogs/resizables/file_browsers/load_game.lua000066400000000000000000000040361347163623700264550ustar00rootroot00000000000000--[[ Copyright (c) 2010 Manuel "Roujin" Wolf 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. --]] --! Load Game Window class "UILoadGame" (UIFileBrowser) ---@type UILoadGame local UILoadGame = _G["UILoadGame"] function UILoadGame:UILoadGame(ui, mode) local treenode = FilteredFileTreeNode(ui.app.savegame_dir, ".sav") treenode.label = "Saves" self:UIFileBrowser(ui, mode, _S.load_game_window.caption:format(".sav"), 295, treenode, true) -- The most probable preference of sorting is by date - what you played last -- is the thing you want to play soon again. self.control:sortByDate() end function UILoadGame:choiceMade(name) local app = self.ui.app -- Make sure there is no blue filter active. app.video:setBlueFilterActive(false) local status, err = pcall(app.load, app, name) if not status then err = _S.errors.load_prefix .. err print(err) app:loadMainMenu() app.ui:addWindow(UIInformation(self.ui, {err})) end end function UILoadGame:close() UIResizable.close(self) if self.mode == "menu" then self.ui:addWindow(UIMainMenu(self.ui)) end end CorsixTH-0.63/CorsixTH/Lua/dialogs/resizables/file_browsers/load_map.lua000066400000000000000000000041701347163623700263200ustar00rootroot00000000000000--[[ Copyright (c) 2010 Manuel "Roujin" Wolf 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. --]] --! Load Map Window class "UILoadMap" (UIFileBrowser) ---@type UILoadMap local UILoadMap = _G["UILoadMap"] function UILoadMap:UILoadMap(ui, mode) local path = ui.app.user_level_dir local treenode = FilteredFileTreeNode(path, ".map") treenode.label = "Maps" self:UIFileBrowser(ui, mode, _S.load_game_window.caption:format(".map"), 295, treenode, true) -- The most probable preference of sorting is by date - what you played last -- is the thing you want to play soon again. self.control:sortByDate() end function UILoadMap:choiceMade(name) local app = self.ui.app -- Make sure there is no blue filter active. app.video:setBlueFilterActive(false) name = name:sub(app.user_level_dir:len() + 1) local status, err = pcall(app.loadLevel, app, name, nil, nil, nil, nil, true) if not status then err = _S.errors.load_prefix .. err print(err) app:loadMainMenu() app.ui:addWindow(UIInformation(self.ui, {err})) end end function UILoadMap:close() UIResizable.close(self) if self.mode == "menu" then self.ui:addWindow(UIMainMenu(self.ui)) end end CorsixTH-0.63/CorsixTH/Lua/dialogs/resizables/file_browsers/save_game.lua000066400000000000000000000071151347163623700264750ustar00rootroot00000000000000--[[ Copyright (c) 2010 Manuel "Roujin" Wolf 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. --]] --! Save Game Window class "UISaveGame" (UIFileBrowser) ---@type UISaveGame local UISaveGame = _G["UISaveGame"] local col_textbox = { red = 0, green = 0, blue = 0, } local col_highlight = { red = 174, green = 166, blue = 218, } local col_shadow = { red = 134, green = 126, blue = 178, } function UISaveGame:UISaveGame(ui) local treenode = FilteredFileTreeNode(ui.app.savegame_dir, ".sav") treenode.label = "Saves" self:UIFileBrowser(ui, "game", _S.save_game_window.caption:format(".sav"), 265, treenode, true) -- The most probable preference of sorting is by date - what you played last -- is the thing you want to play soon again. self.control:sortByDate() -- Textbox for entering new savegame name self.new_savegame_textbox = self:addBevelPanel(5, 310, self.width - 10, 17, col_textbox, col_highlight, col_shadow) :setLabel(_S.save_game_window.new_save_game, nil, "left"):setTooltip(_S.tooltip.save_game_window.new_save_game) :makeTextbox(--[[persistable:save_game_new_savegame_textbox_confirm_callback]] function() self:confirmName() end, --[[persistable:save_game_new_savegame_textbox_abort_callback]] function() self:abortName() end) end --! Function called when textbox is aborted (e.g. by pressing escape) function UISaveGame:abortName() self.new_savegame_textbox.text = "" self.new_savegame_textbox.panel:setLabel(_S.save_game_window.new_save_game) end --! Function called when textbox is confirmed (e.g. by pressing enter) function UISaveGame:confirmName() local filename = self.new_savegame_textbox.text local app = self.ui.app if filename == "" then self:abortName() return end self:trySave(app.savegame_dir .. filename .. ".sav") end --! Function called by clicking button of existing save #num function UISaveGame:choiceMade(name) self:trySave(name) end --! Try to save the game with given filename; if already exists, create confirmation window first. function UISaveGame:trySave(filename) if lfs.attributes(filename, "size") ~= nil then self.ui:addWindow(UIConfirmDialog(self.ui, _S.confirmation.overwrite_save, --[[persistable:save_game_confirmation]] function() self:doSave(filename) end)) else self:doSave(filename) end end --! Actually do save the game with given filename. function UISaveGame:doSave(filename) filename = filename local ui = self.ui local app = ui.app self:close() local status, err = pcall(app.save, app, filename) if not status then err = _S.errors.save_prefix .. err print(err) ui:addWindow(UIInformation(ui, {err})) end end CorsixTH-0.63/CorsixTH/Lua/dialogs/resizables/file_browsers/save_map.lua000066400000000000000000000070161347163623700263410ustar00rootroot00000000000000--[[ Copyright (c) 2015 Stephen E. Baker et al. 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. --]] --! Save Map Window class "UISaveMap" (UIFileBrowser) ---@type UISaveMap local UISaveMap = _G["UISaveMap"] local col_textbox = { red = 0, green = 0, blue = 0, } local col_highlight = { red = 174, green = 166, blue = 218, } local col_shadow = { red = 134, green = 126, blue = 178, } function UISaveMap:UISaveMap(ui) local treenode = FilteredFileTreeNode(ui.app.user_level_dir, ".map") treenode.label = "Maps" self:UIFileBrowser(ui, "map", _S.save_map_window.caption:format(".map"), 265, treenode, true) -- The most probable preference of sorting is by date - what you played last -- is the thing you want to play soon again. self.control:sortByDate() -- Textbox for entering new save name self.new_map_textbox = self:addBevelPanel(5, 310, self.width - 10, 17, col_textbox, col_highlight, col_shadow) :setLabel(_S.save_map_window.new_map, nil, "left"):setTooltip(_S.tooltip.save_map_window.new_map) :makeTextbox(--[[persistable:save_map_new_map_textbox_confirm_callback]] function() self:confirmName() end, --[[persistable:save_map_new_map_textbox_abort_callback]] function() self:abortName() end) end --! Function called when textbox is aborted (e.g. by pressing escape) function UISaveMap:abortName() self.new_map_textbox.text = "" self.new_map_textbox.panel:setLabel(_S.save_map_window.new_map) end --! Function called when textbox is confirmed (e.g. by pressing enter) function UISaveMap:confirmName() local filename = self.new_map_textbox.text local app = self.ui.app if filename == "" then self:abortName() return end self:trySave(app.user_level_dir .. filename .. ".map") end --! Function called by clicking button of existing save #num function UISaveMap:choiceMade(name) self:trySave(name) end --! Try to save the game with given filename; if already exists, create confirmation window first. function UISaveMap:trySave(filename) if lfs.attributes(filename, "size") ~= nil then self.ui:addWindow(UIConfirmDialog(self.ui, _S.confirmation.overwrite_save, --[[persistable:save_map_confirmation]] function() self:doSave(filename) end)) else self:doSave(filename) end end --! Actually do save the map with given filename. function UISaveMap:doSave(filename) filename = filename local ui = self.ui local map = ui.app.map self:close() local status, err = pcall(map.save, map, filename) if not status then err = _S.errors.save_prefix .. err print(err) ui:addWindow(UIInformation(ui, {err})) end end CorsixTH-0.63/CorsixTH/Lua/dialogs/resizables/folder_settings.lua000066400000000000000000000210241347163623700250670ustar00rootroot00000000000000--[[ Copyright (c) 2013 Mark (Mark L) Lawlor 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. --]] --! Customise window used in the main menu and ingame. class "UIFolder" (UIResizable) ---@type UIFolder local UIFolder = _G["UIFolder"] local col_bg = { red = 154, green = 146, blue = 198, } local col_shadow = { red = 134, green = 126, blue = 178, } local col_caption = { red = 174, green = 166, blue = 218, } function UIFolder:UIFolder(ui, mode) self:UIResizable(ui, 360, 240, col_bg) local app = ui.app self.mode = mode self.modal_class = mode == "menu" and "main menu" or "options" or "folders" self.on_top = mode == "menu" self.esc_closes = true self.resizable = false self:setDefaultPosition(0.5, 0.25) self.default_button_sound = "selectx.wav" self.app = app -- Window parts definition -- Title self:addBevelPanel(80, 10, 200, 20, col_caption):setLabel(_S.folders_window.caption) .lowered = true -- Location of original game local built_in = app.gfx:loadMenuFont() self:addBevelPanel(20, 50, 130, 20, col_shadow, col_bg, col_bg) :setLabel(_S.folders_window.data_label):setTooltip(_S.tooltip.folders_window.data_location) .lowered = true self:addBevelPanel(160, 50, 180, 20, col_bg) :setLabel(app.config.theme_hospital_install, built_in):setAutoClip(true) :makeButton(0, 0, 180, 20, nil, self.buttonBrowseForTHInstall):setTooltip(_S.tooltip.folders_window.browse_data:format(app.config.theme_hospital_install)) -- Location of font file self:addBevelPanel(20, 75, 130, 20, col_shadow, col_bg, col_bg) :setLabel(_S.folders_window.font_label):setTooltip(_S.tooltip.folders_window.font_location) .lowered = true local tooltip_font = app.config.unicode_font and _S.tooltip.folders_window.browse_font:format(app.config.unicode_font) or _S.tooltip.folders_window.no_font_specified self:addBevelPanel(160, 75, 180, 20, col_bg) :setLabel(app.config.unicode_font and app.config.unicode_font or tooltip_font, built_in):setAutoClip(true) :makeButton(0, 0, 180, 20, nil, self.buttonBrowseForFont):setTooltip(tooltip_font) -- Location saves alternative self:addBevelPanel(20, 100, 130, 20, col_shadow, col_bg, col_bg) :setLabel(_S.folders_window.savegames_label):setTooltip(_S.tooltip.folders_window.savegames_location) .lowered = true local tooltip_saves = app.config.savegames and _S.tooltip.folders_window.browse_saves:format(app.config.savegames) or _S.tooltip.folders_window.default self.saves_panel = self:addBevelPanel(160, 100, 160, 20, col_bg) self.saves_panel:setLabel(app.config.savegames and app.config.savegames or tooltip_saves , built_in):setAutoClip(true) :makeButton(0, 0, 160, 20, nil, self.buttonBrowseForSavegames):setTooltip(tooltip_saves) self:addBevelPanel(320, 100, 20, 20, col_bg):setLabel("X"):makeButton(0, 0, 20, 20, nil, self.resetSavegameDir):setTooltip(_S.tooltip.folders_window.reset_to_default) -- location for screenshots self:addBevelPanel(20, 125, 130, 20, col_shadow, col_bg, col_bg) :setLabel(_S.folders_window.screenshots_label):setTooltip(_S.tooltip.folders_window.screenshots_location) .lowered = true local tooltip_screenshots = app.config.screenshots and _S.tooltip.folders_window.browse_screenshots:format(app.config.screenshots) or _S.tooltip.folders_window.default self.screenshots_panel = self:addBevelPanel(160, 125, 160, 20, col_bg) self.screenshots_panel:setLabel(app.config.screenshots and app.config.screenshots or tooltip_screenshots, built_in):setAutoClip(true) :makeButton(0, 0, 160, 20, nil, self.buttonBrowseForScreenshots):setTooltip(tooltip_screenshots) self:addBevelPanel(320, 125, 20, 20, col_bg):setLabel("X"):makeButton(0, 0, 20, 20, nil, self.resetScreenshotDir):setTooltip(_S.tooltip.folders_window.reset_to_default) -- location for music files self:addBevelPanel(20, 150, 130, 20, col_shadow, col_bg, col_bg) :setLabel(_S.folders_window.music_label):setTooltip(_S.tooltip.folders_window.music_location) .lowered = true local tooltip_audio = app.config.audio_music and _S.tooltip.folders_window.browse_music:format(app.config.audio_music) or _S.tooltip.folders_window.not_specified self.music_panel = self:addBevelPanel(160, 150, 180, 20, col_bg) self.music_panel:setLabel(app.config.audio_music and app.config.audio_music or tooltip_audio, built_in):setAutoClip(true) :makeButton(0, 0, 160, 20, nil, self.buttonBrowseForAudio_music):setTooltip(tooltip_audio) self:addBevelPanel(320, 150, 20, 20, col_bg):setLabel("X"):makeButton(0, 0, 20, 20, nil, self.resetmusicDir):setTooltip(_S.tooltip.folders_window.reset_to_default) -- "Back" button self:addBevelPanel(20, 180, 320, 40, col_bg):setLabel(_S.folders_window.back) :makeButton(0, 0, 320, 40, nil, self.buttonBack):setTooltip(_S.tooltip.folders_window.back) self.built_in_font = built_in end function UIFolder:resetSavegameDir() local app = TheApp app.config.savegames = nil app:saveConfig() app:initSavegameDir() self.saves_panel:setLabel(_S.tooltip.folders_window.default, self.built_in_font) end function UIFolder:resetScreenshotDir() local app = TheApp app.config.screenshots = nil app:saveConfig() app:initScreenshotsDir() self.screenshots_panel:setLabel(_S.tooltip.folders_window.default, self.built_in_font) end function UIFolder:resetmusicDir() local app = TheApp app.config.audio_music = nil app:saveConfig() app.audio:init() self.music_panel:setLabel(_S.tooltip.folders_window.not_specified, self.built_in_font) end function UIFolder:buttonBrowseForFont() local browser = UIChooseFont(self.ui, self.mode) self.ui:addWindow(browser) end function UIFolder:buttonBrowseForSavegames() local app = TheApp local old_path = app.config.savegames local function callback(path) if old_path ~= path then app.config.savegames = path app:saveConfig() app:initSavegameDir() self.saves_panel:setLabel(app.config.savegames, self.built_in_font) end end local browser = UIDirectoryBrowser(self.ui, self.mode, _S.folders_window.savegames_location, "DirTreeNode", callback) self.ui:addWindow(browser) end function UIFolder:buttonBrowseForTHInstall() local function callback(path) local app = TheApp app.config.theme_hospital_install = path app:saveConfig() debug.getregistry()._RESTART = true app.running = false end local browser = UIDirectoryBrowser(self.ui, self.mode, _S.folders_window.new_th_location, "InstallDirTreeNode", callback) self.ui:addWindow(browser) end function UIFolder:buttonBrowseForScreenshots() local app = TheApp local old_path = app.config.savegames local function callback(path) if old_path ~= path then app.config.screenshots = path app:saveConfig() app:initScreenshotsDir() self.screenshots_panel:setLabel(app.config.screenshots, self.built_in_font) end end local browser = UIDirectoryBrowser(self.ui, self.mode, _S.folders_window.screenshots_location, "DirTreeNode", callback) self.ui:addWindow(browser) end function UIFolder:buttonBrowseForAudio_music() local function callback(path) local app = TheApp app.config.audio_music = path app:saveConfig() app.audio:init() self.music_panel:setLabel(app.config.audio_music, self.built_in_font) end local browser = UIDirectoryBrowser(self.ui, self.mode, _S.folders_window.music_location, "DirTreeNode", callback) self.ui:addWindow(browser) end function UIFolder:buttonBack() self:close() local window = UIOptions(self.ui, "menu") self.ui:addWindow(window) end function UIFolder:close() UIResizable.close(self) if self.mode == "menu" then self.ui:addWindow(UIMainMenu(self.ui)) end end CorsixTH-0.63/CorsixTH/Lua/dialogs/resizables/hotkey_assign.lua000066400000000000000000002105631347163623700245530ustar00rootroot00000000000000--[[ Copyright (c) 2019 James "leiget" Russell 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. --]] --! Customise window used in the main menu and ingame. class "UIHotkeyAssign" (UIResizable) ---@type UIHotkeyAssign local UIHotkeyAssign = _G["UIHotkeyAssign"] local col_bg = { red = 154, green = 146, blue = 198, } local col_hotkeybox = { red = 81, green = 76, blue = 150, } local col_highlight = { red = 174, green = 166, blue = 218, } local col_shadow = { red = 134, green = 126, blue = 178, } local col_caption = { red = 174, green = 166, blue = 218, } local hotkey_backup = {} local hotkeys_backedUp = false local hotkey_buttons = {} local key_hierarchy = { "ctrl", "alt", "shift", "gui", "menu", "return", "enter", "escape", "backspace", "tab", "space", "!", "\"", "#", "%", "$", "&", "\'", "(", ")", "*", "+", ",", "-", ".", "/", "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", ":", ";", "<", "=", ">", "?", "@", "[", "\\", "]", "^", "_", "`", "a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z", "capslock", "f1", "f2", "f3", "f4", "f5", "f6", "f7", "f8", "f9", "f10", "f11", "f12", "printscreen", "scrolllock", "pause", "insert", "home", "pageup", "delete", "end", "pagedown", "right", "left", "down", "up", "numlock", "f13", "f14", "f15", "f16", "f17", "f18", "f19", "f20", "f21", "f22", "f23", "f24", "keypad 0", "keypad 1", "keypad 2", "keypad 3", "keypad 4", "keypad 6", "keypad 7", "keypad 8", "keypad 9", "keypad .", } --! Removes qualifiers like left and right from modifier keys --! e.g. left shift becomes shift. --! --!param noted_keys (table) Array of keys to normalize --!return (table) New array of normalized keys local function normalize_modifiers(noted_keys) local res = shallow_clone(noted_keys) -- Go through the new key table and remove "left" or "right" from any modifier strings. for k, v in ipairs(res) do -- Ctrl if string.find(v, "ctrl", 1, true) then res[k] = "ctrl" end -- Alt if string.find(v, "alt", 1, true) then res[k] = "alt" end -- Shift if string.find(v, "shift", 1, true) then res[k] = "shift" end -- GUI if string.find(v, "gui", 1, true) then res[k] = "gui" end -- MENU if string.find(v, "menu", 1, true) then res[k] = "menu" end end return res end --! Return an array of the keys from the given array, sorted into a --! deterministic order. local function sort_noted_keys(noted_keys) -- Go through the new noted_keys and order it according to the key hairarchy. local result = {} local idx = 1 for _, v1 in ipairs(key_hierarchy) do for _, v2 in ipairs(noted_keys) do if v1 == v2 then result[idx] = v2 idx = idx + 1 end end end return result end --! Return an array with the modifier keys removed. --! Used when assigning the scroll keys. --! --!param noted_keys (table) Array of keys to check for modifiers --!return (table) New array of keys without modifiers local function remove_modifiers(noted_keys) local res = shallow_clone(noted_keys) for k, v in ipairs(res) do -- Ctrl if string.find(v, "ctrl", 1, true) then table.remove(res, k) end -- Alt if string.find(v, "alt", 1, true) then table.remove(res, k) end -- Shift if string.find(v, "shift", 1, true) then table.remove(res, k) end -- GUI if string.find(v, "gui", 1, true) then table.remove(res, k) end -- MENU if string.find(v, "menu", 1, true) then table.remove(res, k) end end return res end --! Determine if the given key sequence is already being used for an action in --! the app. --! --!param keys (table) A sorted array of the key sequence to test --!param app (App) The App --!return (boolean,string) Whether the key is used, and if so, for what action local function is_hotkey_used(keys, app) -- Find out if there is another hotkey with the same key assignment. -- Make sure it's not the same key we are currently mapping. local our_key_str = serialize(keys) local key_str = "" -- Go through the app.hotkeys table... for k, _ in pairs(app.hotkeys) do if type(app.hotkeys[k]) == "table" then key_str = serialize(app.hotkeys[k]) elseif type(app.hotkeys[k]) == "string" then key_str = serialize({app.hotkeys[k]}) end -- If the key(s) that were pressed match the current key in the "app.hotkey" table... if our_key_str == key_str then return true, k end end return false end --! Assign the given key sequence to a hotkey. --! --! Validates a given key sequence and applies it to the given hotkey. --! If the key sequence is already used, first swap that hotkey with the given --! one to prevent duplicates. --! --!param hotkey (string) The hotkey to change --!param hotkey_buttons_table (table) Configuration table of all hotkeys --!param app (App) The App local function hotkey_input(hotkey, hotkey_buttons_table, app) --[[ TODO: -- Keypad when numlock is off doesn't work correctly. Seems that keypad input isn't working correctly in ui.lua or something. Left for future patch. -- Disable the "global_exitApp" hotkey while assigning hotkeys? Even when "global_exitApp" isn't added at startup Alt+F4 still abandons program. Why? -- Modifier keys for other languages nessecary? -- Ex: STRG for german's "CTRL". ]] local noted_keys = hotkey_buttons_table[hotkey].noted_keys -- Check if the table even has anything or has too much. local table_length = #noted_keys if table_length == 0 or table_length > 4 then hotkey_buttons_table[hotkey]:abort() return end -- If the noted key input is "enter", "return", or "escape"... if array_join(noted_keys) == array_join( {"enter"} ) or array_join(noted_keys) == array_join( {"return"} ) or array_join(noted_keys) == array_join( {"escape"} ) then -- Abort, as we don't want the enter or esc key used for anything other -- than "global_confirm" and "global_cancel". hotkey_buttons_table[hotkey]:abort() return end noted_keys = normalize_modifiers(noted_keys) noted_keys = sort_noted_keys(noted_keys) -- If the current hotkey is a scroll key... if hotkey == "ingame_scroll_up" or hotkey == "ingame_scroll_down" or hotkey == "ingame_scroll_left" or hotkey == "ingame_scroll_right" then -- Get rid of any modifers, as they won't work correctly, anyway. noted_keys = remove_modifiers(noted_keys) end local hotkey_used, hotkey_used_key = is_hotkey_used(noted_keys, app) -- If this hotkey was used for a different action, swap with current assignment if hotkey_used and hotkey ~= hotkey_used_key then app.hotkeys[hotkey_used_key] = shallow_clone(app.hotkeys[hotkey]) if hotkey_buttons_table[hotkey_used_key] then hotkey_buttons_table[hotkey_used_key]:setText( string.upper(array_join(app.hotkeys[hotkey_used_key], "+")) ) end end if #noted_keys == 1 then noted_keys = noted_keys[1] end app.hotkeys[hotkey] = noted_keys -- If the key is "global_cancel_alt"... if hotkey == "global_cancel_alt" then app.hotkeys["global_stop_movie_alt"] = noted_keys app.hotkeys["global_window_close_alt"] = noted_keys end hotkey_buttons_table[hotkey]:setText( string.upper( array_join(app.hotkeys[hotkey], "+") ) ) end function UIHotkeyAssign:UIHotkeyAssign(ui, mode) self:UIResizable(ui, 640, 480, col_bg) local panel_width = 100 local panel_height = 20 local current_pos_x = 1 local current_pos_y = 1 local max_x_pos_step = 3 local max_y_pos_step = 19 -- Panel x position table. self.panel_pos_table_x = {} self.panel_pos_table_x[1] = 10 self.panel_pos_table_x[2] = 220 self.panel_pos_table_x[3] = 430 -- Panel y position table. self.panel_pos_table_y = {} for i=1, 19, 1 do self.panel_pos_table_y[i] = (i*20)+20 end -- Gets the next x position of the hotkey panels. -- Easier to use than manually putting it all in. local function get_next_pos_x() current_pos_x = current_pos_x + 1 if(current_pos_x > max_x_pos_step) then current_pos_x=max_x_pos_step end return current_pos_x end -- Gets the next y position for the hotkey panels. local function get_next_pos_y() current_pos_y = current_pos_y + 1 if(current_pos_y > max_y_pos_step) then current_pos_y = 1 get_next_pos_x() end return current_pos_y end self.ui = ui self.mode = mode self.modal_class = mode == "menu" and "main menu" or "options" or "folders" self.on_top = mode == "menu" self.esc_closes = true self.resizable = false self:setDefaultPosition(0.5, 0.25) self.default_button_sound = "selectx.wav" self.app = ui.app self.hotkey_buttons = hotkey_buttons if not hotkeys_backedUp then hotkey_backup = shallow_clone(self.app.hotkeys) hotkeys_backedUp = true end -- Title self:addBevelPanel(220, 10, 200, 20, col_caption):setLabel(_S.hotkey_window.caption_main) -- Location of original game local built_in = self.app.gfx:loadMenuFont() -- Global Keys self:addBevelPanel(self.panel_pos_table_x[current_pos_x], self.panel_pos_table_y[current_pos_y], panel_width*2, panel_height, col_caption):setLabel(_S.hotkey_window.panel_globalKeys) get_next_pos_y() -- global_exitApp self:addBevelPanel(self.panel_pos_table_x[current_pos_x], self.panel_pos_table_y[current_pos_y], panel_width, panel_height, col_shadow, col_bg, col_bg) : setLabel(_S.hotkey_window.global_exitApp) self.hotkey_buttons["global_exitApp"] = self:addBevelPanel(self.panel_pos_table_x[current_pos_x]+panel_width, self.panel_pos_table_y[current_pos_y], panel_width, panel_height, col_hotkeybox, col_highlight, col_shadow) :makeHotkeyBox(function() self:confirm_func("global_exitApp") end, nil):setText( string.upper(array_join(ui.app.hotkeys["global_exitApp"], "+")) ) get_next_pos_y() -- global_resetApp self:addBevelPanel(self.panel_pos_table_x[current_pos_x], self.panel_pos_table_y[current_pos_y], panel_width, panel_height, col_shadow, col_bg, col_bg) : setLabel(_S.hotkey_window.global_resetApp) self.hotkey_buttons["global_resetApp"] = self:addBevelPanel(self.panel_pos_table_x[current_pos_x]+panel_width, self.panel_pos_table_y[current_pos_y], panel_width, panel_height, col_hotkeybox, col_highlight, col_shadow) :makeHotkeyBox(function() self:confirm_func("global_resetApp") end, nil):setText( string.upper(array_join(ui.app.hotkeys["global_resetApp"], "+")) ) get_next_pos_y() -- global_screenshot self:addBevelPanel(self.panel_pos_table_x[current_pos_x], self.panel_pos_table_y[current_pos_y], panel_width, panel_height, col_shadow, col_bg, col_bg) : setLabel(_S.hotkey_window.global_screenshot) self.hotkey_buttons["global_screenshot"] = self:addBevelPanel(self.panel_pos_table_x[current_pos_x]+panel_width, self.panel_pos_table_y[current_pos_y], panel_width, panel_height, col_hotkeybox, col_highlight, col_shadow) :makeHotkeyBox(function() self:confirm_func("global_screenshot") end, nil):setText( string.upper(array_join(ui.app.hotkeys["global_screenshot"], "+")) ) get_next_pos_y() -- global_releaseMouse self:addBevelPanel(self.panel_pos_table_x[current_pos_x], self.panel_pos_table_y[current_pos_y], panel_width, panel_height, col_shadow, col_bg, col_bg) : setLabel(_S.hotkey_window.global_releaseMouse) self.hotkey_buttons["global_releaseMouse"] = self:addBevelPanel(self.panel_pos_table_x[current_pos_x]+panel_width, self.panel_pos_table_y[current_pos_y], panel_width, panel_height, col_hotkeybox, col_highlight, col_shadow) :makeHotkeyBox(function() self:confirm_func("global_releaseMouse") end, nil):setText( string.upper(array_join(ui.app.hotkeys["global_releaseMouse"], "+")) ) get_next_pos_y() -- global_confirm_alt self:addBevelPanel(self.panel_pos_table_x[current_pos_x], self.panel_pos_table_y[current_pos_y], panel_width, panel_height, col_shadow, col_bg, col_bg) : setLabel(_S.hotkey_window.global_confirm_alt) self.hotkey_buttons["global_confirm_alt"] = self:addBevelPanel(self.panel_pos_table_x[current_pos_x]+panel_width, self.panel_pos_table_y[current_pos_y], panel_width, panel_height, col_hotkeybox, col_highlight, col_shadow) :makeHotkeyBox(function() self:confirm_func("global_confirm_alt") end, nil):setText( string.upper(array_join(ui.app.hotkeys["global_confirm_alt"], "+")) ) get_next_pos_y() -- global_cancel_alt self:addBevelPanel(self.panel_pos_table_x[current_pos_x], self.panel_pos_table_y[current_pos_y], panel_width, panel_height, col_shadow, col_bg, col_bg) : setLabel(_S.hotkey_window.global_cancel_alt) self.hotkey_buttons["global_cancel_alt"] = self:addBevelPanel(self.panel_pos_table_x[current_pos_x]+panel_width, self.panel_pos_table_y[current_pos_y], panel_width, panel_height, col_hotkeybox, col_highlight, col_shadow) :makeHotkeyBox(function() self:confirm_func("global_cancel_alt") end, nil):setText( string.upper(array_join(ui.app.hotkeys["global_cancel_alt"], "+")) ) get_next_pos_y() -- General In-Game Keys self:addBevelPanel(self.panel_pos_table_x[current_pos_x], self.panel_pos_table_y[current_pos_y], panel_width*2, panel_height, col_caption):setLabel(_S.hotkey_window.panel_generalInGameKeys) get_next_pos_y() -- ingame_showmenubar self:addBevelPanel(self.panel_pos_table_x[current_pos_x], self.panel_pos_table_y[current_pos_y], panel_width, panel_height, col_shadow, col_bg, col_bg) : setLabel(_S.hotkey_window.ingame_showmenubar) self.hotkey_buttons["ingame_showmenubar"] = self:addBevelPanel(self.panel_pos_table_x[current_pos_x]+panel_width, self.panel_pos_table_y[current_pos_y], panel_width, panel_height, col_hotkeybox, col_highlight, col_shadow) :makeHotkeyBox(function() self:confirm_func("ingame_showmenubar") end, nil):setText( string.upper(array_join(ui.app.hotkeys["ingame_showmenubar"], "+")) ) get_next_pos_y() -- ingame_saveMenu self:addBevelPanel(self.panel_pos_table_x[current_pos_x], self.panel_pos_table_y[current_pos_y], panel_width, panel_height, col_shadow, col_bg, col_bg) : setLabel(_S.hotkey_window.ingame_saveMenu) self.hotkey_buttons["ingame_saveMenu"] = self:addBevelPanel(self.panel_pos_table_x[current_pos_x]+panel_width, self.panel_pos_table_y[current_pos_y], panel_width, panel_height, col_hotkeybox, col_highlight, col_shadow) :makeHotkeyBox(function() self:confirm_func("ingame_saveMenu") end, nil):setText( string.upper(array_join(ui.app.hotkeys["ingame_saveMenu"], "+")) ) get_next_pos_y() -- ingame_loadMenu self:addBevelPanel(self.panel_pos_table_x[current_pos_x], self.panel_pos_table_y[current_pos_y], panel_width, panel_height, col_shadow, col_bg, col_bg) : setLabel(_S.hotkey_window.ingame_loadMenu) self.hotkey_buttons["ingame_loadMenu"] = self:addBevelPanel(self.panel_pos_table_x[current_pos_x]+panel_width, self.panel_pos_table_y[current_pos_y], panel_width, panel_height, col_hotkeybox, col_highlight, col_shadow) :makeHotkeyBox(function() self:confirm_func("ingame_loadMenu") end, nil):setText( string.upper(array_join(ui.app.hotkeys["ingame_loadMenu"], "+")) ) get_next_pos_y() -- ingame_jukebox self:addBevelPanel(self.panel_pos_table_x[current_pos_x], self.panel_pos_table_y[current_pos_y], panel_width, panel_height, col_shadow, col_bg, col_bg) : setLabel(_S.hotkey_window.ingame_jukebox) self.hotkey_buttons["ingame_jukebox"] = self:addBevelPanel(self.panel_pos_table_x[current_pos_x]+panel_width, self.panel_pos_table_y[current_pos_y], panel_width, panel_height, col_hotkeybox, col_highlight, col_shadow) :makeHotkeyBox(function() self:confirm_func("ingame_jukebox") end, nil):setText( string.upper(array_join(ui.app.hotkeys["ingame_jukebox"], "+")) ) get_next_pos_y() -- ingame_openFirstMessage self:addBevelPanel(self.panel_pos_table_x[current_pos_x], self.panel_pos_table_y[current_pos_y], panel_width, panel_height, col_shadow, col_bg, col_bg) : setLabel(_S.hotkey_window.ingame_openFirstMessage) self.hotkey_buttons["ingame_openFirstMessage"] = self:addBevelPanel(self.panel_pos_table_x[current_pos_x]+panel_width, self.panel_pos_table_y[current_pos_y], panel_width, panel_height, col_hotkeybox, col_highlight, col_shadow) :makeHotkeyBox(function() self:confirm_func("ingame_openFirstMessage") end, nil):setText( string.upper(array_join(ui.app.hotkeys["ingame_openFirstMessage"], "+")) ) get_next_pos_y() -- ingame_quickSave self:addBevelPanel(self.panel_pos_table_x[current_pos_x], self.panel_pos_table_y[current_pos_y], panel_width, panel_height, col_shadow, col_bg, col_bg) : setLabel(_S.hotkey_window.ingame_quickSave) self.hotkey_buttons["ingame_quickSave"] = self:addBevelPanel(self.panel_pos_table_x[current_pos_x]+panel_width, self.panel_pos_table_y[current_pos_y], panel_width, panel_height, col_hotkeybox, col_highlight, col_shadow) :makeHotkeyBox(function() self:confirm_func("ingame_quickSave") end, nil):setText( string.upper(array_join(ui.app.hotkeys["ingame_quickSave"], "+")) ) get_next_pos_y() -- ingame_quickLoad self:addBevelPanel(self.panel_pos_table_x[current_pos_x], self.panel_pos_table_y[current_pos_y], panel_width, panel_height, col_shadow, col_bg, col_bg) : setLabel(_S.hotkey_window.ingame_quickLoad) self.hotkey_buttons["ingame_quickLoad"] = self:addBevelPanel(self.panel_pos_table_x[current_pos_x]+panel_width, self.panel_pos_table_y[current_pos_y], panel_width, panel_height, col_hotkeybox, col_highlight, col_shadow) :makeHotkeyBox(function() self:confirm_func("ingame_quickLoad") end, nil):setText( string.upper(array_join(ui.app.hotkeys["ingame_quickLoad"], "+")) ) get_next_pos_y() -- ingame_restartLevel self:addBevelPanel(self.panel_pos_table_x[current_pos_x], self.panel_pos_table_y[current_pos_y], panel_width, panel_height, col_shadow, col_bg, col_bg) : setLabel(_S.hotkey_window.ingame_restartLevel) self.hotkey_buttons["ingame_restartLevel"] = self:addBevelPanel(self.panel_pos_table_x[current_pos_x]+panel_width, self.panel_pos_table_y[current_pos_y], panel_width, panel_height, col_hotkeybox, col_highlight, col_shadow) :makeHotkeyBox(function() self:confirm_func("ingame_restartLevel") end, nil):setText( string.upper(array_join(ui.app.hotkeys["ingame_restartLevel"], "+")) ) get_next_pos_y() -- ingame_quitLevel self:addBevelPanel(self.panel_pos_table_x[current_pos_x], self.panel_pos_table_y[current_pos_y], panel_width, panel_height, col_shadow, col_bg, col_bg) : setLabel(_S.hotkey_window.ingame_quitLevel) self.hotkey_buttons["ingame_quitLevel"] = self:addBevelPanel(self.panel_pos_table_x[current_pos_x]+panel_width, self.panel_pos_table_y[current_pos_y], panel_width, panel_height, col_hotkeybox, col_highlight, col_shadow) :makeHotkeyBox(function() self:confirm_func("ingame_quitLevel") end, nil):setText( string.upper(array_join(ui.app.hotkeys["ingame_quitLevel"], "+")) ) get_next_pos_y() -- Scroll keys. get_next_pos_y() get_next_pos_y() self:addBevelPanel(self.panel_pos_table_x[current_pos_x], self.panel_pos_table_y[current_pos_y], panel_width*2, panel_height, col_caption):setLabel(_S.hotkey_window.panel_scrollKeys) get_next_pos_y() -- ingame_scroll_up self:addBevelPanel(self.panel_pos_table_x[current_pos_x], self.panel_pos_table_y[current_pos_y], panel_width, panel_height, col_shadow, col_bg, col_bg) : setLabel(_S.hotkey_window.ingame_scroll_up) self.hotkey_buttons["ingame_scroll_up"] = self:addBevelPanel(self.panel_pos_table_x[current_pos_x]+panel_width, self.panel_pos_table_y[current_pos_y], panel_width, panel_height, col_hotkeybox, col_highlight, col_shadow) :makeHotkeyBox(function() self:confirm_func("ingame_scroll_up") end, nil):setText( string.upper(array_join(ui.app.hotkeys["ingame_scroll_up"], "+")) ) get_next_pos_y() -- ingame_scroll_down self:addBevelPanel(self.panel_pos_table_x[current_pos_x], self.panel_pos_table_y[current_pos_y], panel_width, panel_height, col_shadow, col_bg, col_bg) : setLabel(_S.hotkey_window.ingame_scroll_down) self.hotkey_buttons["ingame_scroll_down"] = self:addBevelPanel(self.panel_pos_table_x[current_pos_x]+panel_width, self.panel_pos_table_y[current_pos_y], panel_width, panel_height, col_hotkeybox, col_highlight, col_shadow) :makeHotkeyBox(function() self:confirm_func("ingame_scroll_down") end, nil):setText( string.upper(array_join(ui.app.hotkeys["ingame_scroll_down"], "+")) ) get_next_pos_y() -- ingame_scroll_left self:addBevelPanel(self.panel_pos_table_x[current_pos_x], self.panel_pos_table_y[current_pos_y], panel_width, panel_height, col_shadow, col_bg, col_bg) : setLabel(_S.hotkey_window.ingame_scroll_left) self.hotkey_buttons["ingame_scroll_left"] = self:addBevelPanel(self.panel_pos_table_x[current_pos_x]+panel_width, self.panel_pos_table_y[current_pos_y], panel_width, panel_height, col_hotkeybox, col_highlight, col_shadow) :makeHotkeyBox(function() self:confirm_func("ingame_scroll_left") end, nil):setText( string.upper(array_join(ui.app.hotkeys["ingame_scroll_left"], "+")) ) get_next_pos_y() -- ingame_scroll_right self:addBevelPanel(self.panel_pos_table_x[current_pos_x], self.panel_pos_table_y[current_pos_y], panel_width, panel_height, col_shadow, col_bg, col_bg) : setLabel(_S.hotkey_window.ingame_scroll_right) self.hotkey_buttons["ingame_scroll_right"] = self:addBevelPanel(self.panel_pos_table_x[current_pos_x]+panel_width, self.panel_pos_table_y[current_pos_y], panel_width, panel_height, col_hotkeybox, col_highlight, col_shadow) :makeHotkeyBox(function() self:confirm_func("ingame_scroll_right") end, nil):setText( string.upper(array_join(ui.app.hotkeys["ingame_scroll_right"], "+")) ) get_next_pos_y() -- ingame_scroll_shift self:addBevelPanel(self.panel_pos_table_x[current_pos_x], self.panel_pos_table_y[current_pos_y], panel_width, panel_height, col_shadow, col_bg, col_bg) : setLabel(_S.hotkey_window.ingame_scroll_shift) self.hotkey_buttons["ingame_scroll_shift"] = self:addBevelPanel(self.panel_pos_table_x[current_pos_x]+panel_width, self.panel_pos_table_y[current_pos_y], panel_width, panel_height, col_hotkeybox, col_highlight, col_shadow) :makeHotkeyBox(function() self:confirm_func("ingame_scroll_shift") end, nil):setText( string.upper(array_join(ui.app.hotkeys["ingame_scroll_shift"], "+")) ) get_next_pos_y() -- Zoom Keys self:addBevelPanel(self.panel_pos_table_x[current_pos_x], self.panel_pos_table_y[current_pos_y], panel_width*2, panel_height, col_caption):setLabel(_S.hotkey_window.panel_zoomKeys) get_next_pos_y() -- ingame_zoom_in self:addBevelPanel(self.panel_pos_table_x[current_pos_x], self.panel_pos_table_y[current_pos_y], panel_width, panel_height, col_shadow, col_bg, col_bg) : setLabel(_S.hotkey_window.ingame_zoom_in) self.hotkey_buttons["ingame_zoom_in"] = self:addBevelPanel(self.panel_pos_table_x[current_pos_x]+panel_width, self.panel_pos_table_y[current_pos_y], panel_width, panel_height, col_hotkeybox, col_highlight, col_shadow) :makeHotkeyBox(function() self:confirm_func("ingame_zoom_in") end, nil):setText( string.upper(array_join(ui.app.hotkeys["ingame_zoom_in"], "+")) ) get_next_pos_y() -- ingame_zoom_in_more self:addBevelPanel(self.panel_pos_table_x[current_pos_x], self.panel_pos_table_y[current_pos_y], panel_width, panel_height, col_shadow, col_bg, col_bg) : setLabel(_S.hotkey_window.ingame_zoom_in_more) self.hotkey_buttons["ingame_zoom_in_more"] = self:addBevelPanel(self.panel_pos_table_x[current_pos_x]+panel_width, self.panel_pos_table_y[current_pos_y], panel_width, panel_height, col_hotkeybox, col_highlight, col_shadow) :makeHotkeyBox(function() self:confirm_func("ingame_zoom_in_more") end, nil):setText( string.upper(array_join(ui.app.hotkeys["ingame_zoom_in_more"], "+")) ) get_next_pos_y() -- ingame_zoom_out self:addBevelPanel(self.panel_pos_table_x[current_pos_x], self.panel_pos_table_y[current_pos_y], panel_width, panel_height, col_shadow, col_bg, col_bg) : setLabel(_S.hotkey_window.ingame_zoom_out) self.hotkey_buttons["ingame_zoom_out"] = self:addBevelPanel(self.panel_pos_table_x[current_pos_x]+panel_width, self.panel_pos_table_y[current_pos_y], panel_width, panel_height, col_hotkeybox, col_highlight, col_shadow) :makeHotkeyBox(function() self:confirm_func("ingame_zoom_out") end, nil):setText( string.upper(array_join(ui.app.hotkeys["ingame_zoom_out"], "+")) ) get_next_pos_y() -- ingame_zoom_out_more self:addBevelPanel(self.panel_pos_table_x[current_pos_x], self.panel_pos_table_y[current_pos_y], panel_width, panel_height, col_shadow, col_bg, col_bg) : setLabel(_S.hotkey_window.ingame_zoom_out_more) self.hotkey_buttons["ingame_zoom_out_more"] = self:addBevelPanel(self.panel_pos_table_x[current_pos_x]+panel_width, self.panel_pos_table_y[current_pos_y], panel_width, panel_height, col_hotkeybox, col_highlight, col_shadow) :makeHotkeyBox(function() self:confirm_func("ingame_zoom_out_more") end, nil):setText( string.upper(array_join(ui.app.hotkeys["ingame_zoom_out_more"], "+")) ) get_next_pos_y() -- Game Speed Keys self:addBevelPanel(self.panel_pos_table_x[current_pos_x], self.panel_pos_table_y[current_pos_y], panel_width*2, panel_height, col_caption):setLabel(_S.hotkey_window.panel_gameSpeedKeys) get_next_pos_y() -- ingame_pause self:addBevelPanel(self.panel_pos_table_x[current_pos_x], self.panel_pos_table_y[current_pos_y], panel_width, panel_height, col_shadow, col_bg, col_bg) : setLabel(_S.hotkey_window.ingame_pause) self.hotkey_buttons["ingame_pause"] = self:addBevelPanel(self.panel_pos_table_x[current_pos_x]+panel_width, self.panel_pos_table_y[current_pos_y], panel_width, panel_height, col_hotkeybox, col_highlight, col_shadow) :makeHotkeyBox(function() self:confirm_func("ingame_pause") end, nil):setText( string.upper(array_join(ui.app.hotkeys["ingame_pause"], "+")) ) get_next_pos_y() -- ingame_gamespeed_slowest self:addBevelPanel(self.panel_pos_table_x[current_pos_x], self.panel_pos_table_y[current_pos_y], panel_width, panel_height, col_shadow, col_bg, col_bg) : setLabel(_S.hotkey_window.ingame_gamespeed_slowest) self.hotkey_buttons["ingame_gamespeed_slowest"] = self:addBevelPanel(self.panel_pos_table_x[current_pos_x]+panel_width, self.panel_pos_table_y[current_pos_y], panel_width, panel_height, col_hotkeybox, col_highlight, col_shadow) :makeHotkeyBox(function() self:confirm_func("ingame_gamespeed_slowest") end, nil):setText( string.upper(array_join(ui.app.hotkeys["ingame_gamespeed_slowest"], "+")) ) get_next_pos_y() -- ingame_gamespeed_slower self:addBevelPanel(self.panel_pos_table_x[current_pos_x], self.panel_pos_table_y[current_pos_y], panel_width, panel_height, col_shadow, col_bg, col_bg) : setLabel(_S.hotkey_window.ingame_gamespeed_slower) self.hotkey_buttons["ingame_gamespeed_slower"] = self:addBevelPanel(self.panel_pos_table_x[current_pos_x]+panel_width, self.panel_pos_table_y[current_pos_y], panel_width, panel_height, col_hotkeybox, col_highlight, col_shadow) :makeHotkeyBox(function() self:confirm_func("ingame_gamespeed_slower") end, nil):setText( string.upper(array_join(ui.app.hotkeys["ingame_gamespeed_slower"], "+")) ) get_next_pos_y() -- ingame_gamespeed_normal self:addBevelPanel(self.panel_pos_table_x[current_pos_x], self.panel_pos_table_y[current_pos_y], panel_width, panel_height, col_shadow, col_bg, col_bg) : setLabel(_S.hotkey_window.ingame_gamespeed_normal) self.hotkey_buttons["ingame_gamespeed_normal"] = self:addBevelPanel(self.panel_pos_table_x[current_pos_x]+panel_width, self.panel_pos_table_y[current_pos_y], panel_width, panel_height, col_hotkeybox, col_highlight, col_shadow) :makeHotkeyBox(function() self:confirm_func("ingame_gamespeed_normal") end, nil):setText( string.upper(array_join(ui.app.hotkeys["ingame_gamespeed_normal"], "+")) ) get_next_pos_y() -- ingame_gamespeed_max self:addBevelPanel(self.panel_pos_table_x[current_pos_x], self.panel_pos_table_y[current_pos_y], panel_width, panel_height, col_shadow, col_bg, col_bg) : setLabel(_S.hotkey_window.ingame_gamespeed_max) self.hotkey_buttons["ingame_gamespeed_max"] = self:addBevelPanel(self.panel_pos_table_x[current_pos_x]+panel_width, self.panel_pos_table_y[current_pos_y], panel_width, panel_height, col_hotkeybox, col_highlight, col_shadow) :makeHotkeyBox(function() self:confirm_func("ingame_gamespeed_max") end, nil):setText( string.upper(array_join(ui.app.hotkeys["ingame_gamespeed_max"], "+")) ) get_next_pos_y() -- ingame_gamespeed_thensome self:addBevelPanel(self.panel_pos_table_x[current_pos_x], self.panel_pos_table_y[current_pos_y], panel_width, panel_height, col_shadow, col_bg, col_bg) : setLabel(_S.hotkey_window.ingame_gamespeed_thensome) self.hotkey_buttons["ingame_gamespeed_thensome"] = self:addBevelPanel(self.panel_pos_table_x[current_pos_x]+panel_width, self.panel_pos_table_y[current_pos_y], panel_width, panel_height, col_hotkeybox, col_highlight, col_shadow) :makeHotkeyBox(function() self:confirm_func("ingame_gamespeed_thensome") end, nil):setText( string.upper(array_join(ui.app.hotkeys["ingame_gamespeed_thensome"], "+")) ) get_next_pos_y() -- ingame_gamespeed_speedup self:addBevelPanel(self.panel_pos_table_x[current_pos_x], self.panel_pos_table_y[current_pos_y], panel_width, panel_height, col_shadow, col_bg, col_bg) : setLabel(_S.hotkey_window.ingame_gamespeed_speedup) self.hotkey_buttons["ingame_gamespeed_speedup"] = self:addBevelPanel(self.panel_pos_table_x[current_pos_x]+panel_width, self.panel_pos_table_y[current_pos_y], panel_width, panel_height, col_hotkeybox, col_highlight, col_shadow) :makeHotkeyBox(function() self:confirm_func("ingame_gamespeed_speedup") end, nil):setText( string.upper(array_join(ui.app.hotkeys["ingame_gamespeed_speedup"], "+")) ) get_next_pos_y() -- Misc. In-Game Keys self:addBevelPanel(self.panel_pos_table_x[current_pos_x], self.panel_pos_table_y[current_pos_y], panel_width*2, panel_height, col_caption):setLabel(_S.hotkey_window.panel_miscInGameKeys) get_next_pos_y() -- ingame_rotateobject self:addBevelPanel(self.panel_pos_table_x[current_pos_x], self.panel_pos_table_y[current_pos_y], panel_width, panel_height, col_shadow, col_bg, col_bg) : setLabel(_S.hotkey_window.ingame_rotateobject) self.hotkey_buttons["ingame_rotateobject"] = self:addBevelPanel(self.panel_pos_table_x[current_pos_x]+panel_width, self.panel_pos_table_y[current_pos_y], panel_width, panel_height, col_hotkeybox, col_highlight, col_shadow) :makeHotkeyBox(function() self:confirm_func("ingame_rotateobject") end, nil):setText( string.upper(array_join(ui.app.hotkeys["ingame_rotateobject"], "+")) ) get_next_pos_y() -- ingame_patient_gohome self:addBevelPanel(self.panel_pos_table_x[current_pos_x], self.panel_pos_table_y[current_pos_y], panel_width, panel_height, col_shadow, col_bg, col_bg) : setLabel(_S.hotkey_window.ingame_patient_gohome) self.hotkey_buttons["ingame_patient_gohome"] = self:addBevelPanel(self.panel_pos_table_x[current_pos_x]+panel_width, self.panel_pos_table_y[current_pos_y], panel_width, panel_height, col_hotkeybox, col_highlight, col_shadow) :makeHotkeyBox(function() self:confirm_func("ingame_patient_gohome") end, nil):setText( string.upper(array_join(ui.app.hotkeys["ingame_patient_gohome"], "+")) ) get_next_pos_y() -- ingame_setTransparent self:addBevelPanel(self.panel_pos_table_x[current_pos_x], self.panel_pos_table_y[current_pos_y], panel_width, panel_height, col_shadow, col_bg, col_bg) : setLabel(_S.hotkey_window.ingame_setTransparent) self.hotkey_buttons["ingame_setTransparent"] = self:addBevelPanel(self.panel_pos_table_x[current_pos_x]+panel_width, self.panel_pos_table_y[current_pos_y], panel_width, panel_height, col_hotkeybox, col_highlight, col_shadow) :makeHotkeyBox(function() self:confirm_func("ingame_setTransparent") end, nil):setText( string.upper(array_join(ui.app.hotkeys["ingame_setTransparent"], "+")) ) get_next_pos_y() -- Toggle Keys self:addBevelPanel(self.panel_pos_table_x[current_pos_x], self.panel_pos_table_y[current_pos_y], panel_width*2, panel_height, col_caption):setLabel(_S.hotkey_window.panel_toggleKeys) get_next_pos_y() -- ingame_toggleAnnouncements self:addBevelPanel(self.panel_pos_table_x[current_pos_x], self.panel_pos_table_y[current_pos_y], panel_width, panel_height, col_shadow, col_bg, col_bg) : setLabel(_S.hotkey_window.ingame_toggleAnnouncements) self.hotkey_buttons["ingame_toggleAnnouncements"] = self:addBevelPanel(self.panel_pos_table_x[current_pos_x]+panel_width, self.panel_pos_table_y[current_pos_y], panel_width, panel_height, col_hotkeybox, col_highlight, col_shadow) :makeHotkeyBox(function() self:confirm_func("ingame_toggleAnnouncements") end, nil):setText( string.upper(array_join(ui.app.hotkeys["ingame_toggleAnnouncements"], "+")) ) get_next_pos_y() -- ingame_toggleSounds self:addBevelPanel(self.panel_pos_table_x[current_pos_x], self.panel_pos_table_y[current_pos_y], panel_width, panel_height, col_shadow, col_bg, col_bg) : setLabel(_S.hotkey_window.ingame_toggleSounds) self.hotkey_buttons["ingame_toggleSounds"] = self:addBevelPanel(self.panel_pos_table_x[current_pos_x]+panel_width, self.panel_pos_table_y[current_pos_y], panel_width, panel_height, col_hotkeybox, col_highlight, col_shadow) :makeHotkeyBox(function() self:confirm_func("ingame_toggleSounds") end, nil):setText( string.upper(array_join(ui.app.hotkeys["ingame_toggleSounds"], "+")) ) get_next_pos_y() -- ingame_toggleMusic self:addBevelPanel(self.panel_pos_table_x[current_pos_x], self.panel_pos_table_y[current_pos_y], panel_width, panel_height, col_shadow, col_bg, col_bg) : setLabel(_S.hotkey_window.ingame_toggleMusic) self.hotkey_buttons["ingame_toggleMusic"] = self:addBevelPanel(self.panel_pos_table_x[current_pos_x]+panel_width, self.panel_pos_table_y[current_pos_y], panel_width, panel_height, col_hotkeybox, col_highlight, col_shadow) :makeHotkeyBox(function() self:confirm_func("ingame_toggleMusic") end, nil):setText( string.upper(array_join(ui.app.hotkeys["ingame_toggleMusic"], "+")) ) get_next_pos_y() -- ingame_toggleAdvisor self:addBevelPanel(self.panel_pos_table_x[current_pos_x], self.panel_pos_table_y[current_pos_y], panel_width, panel_height, col_shadow, col_bg, col_bg) : setLabel(_S.hotkey_window.ingame_toggleAdvisor) self.hotkey_buttons["ingame_toggleAdvisor"] = self:addBevelPanel(self.panel_pos_table_x[current_pos_x]+panel_width, self.panel_pos_table_y[current_pos_y], panel_width, panel_height, col_hotkeybox, col_highlight, col_shadow) :makeHotkeyBox(function() self:confirm_func("ingame_toggleAdvisor") end, nil):setText( string.upper(array_join(ui.app.hotkeys["ingame_toggleAdvisor"], "+")) ) get_next_pos_y() -- ingame_toggleInfo self:addBevelPanel(self.panel_pos_table_x[current_pos_x], self.panel_pos_table_y[current_pos_y], panel_width, panel_height, col_shadow, col_bg, col_bg) : setLabel(_S.hotkey_window.ingame_toggleInfo) self.hotkey_buttons["ingame_toggleInfo"] = self:addBevelPanel(self.panel_pos_table_x[current_pos_x]+panel_width, self.panel_pos_table_y[current_pos_y], panel_width, panel_height, col_hotkeybox, col_highlight, col_shadow) :makeHotkeyBox(function() self:confirm_func("ingame_toggleInfo") end, nil):setText( string.upper(array_join(ui.app.hotkeys["ingame_toggleInfo"], "+")) ) get_next_pos_y() if self.ui.app.config.debug then -- Debug Keys self:addBevelPanel(self.panel_pos_table_x[current_pos_x], self.panel_pos_table_y[current_pos_y], panel_width*2, panel_height, col_caption):setLabel(_S.hotkey_window.panel_debugKeys) get_next_pos_y() -- global_connectDebugger self:addBevelPanel(self.panel_pos_table_x[current_pos_x], self.panel_pos_table_y[current_pos_y], panel_width, panel_height, col_shadow, col_bg, col_bg) : setLabel(_S.hotkey_window.global_connectDebugger) self.hotkey_buttons["global_connectDebugger"] = self:addBevelPanel(self.panel_pos_table_x[current_pos_x]+panel_width, self.panel_pos_table_y[current_pos_y], panel_width, panel_height, col_hotkeybox, col_highlight, col_shadow) :makeHotkeyBox(function() self:confirm_func("global_connectDebugger") end, nil):setText( string.upper(array_join(ui.app.hotkeys["global_connectDebugger"], "+")) ) get_next_pos_y() -- global_showLuaConsole self:addBevelPanel(self.panel_pos_table_x[current_pos_x], self.panel_pos_table_y[current_pos_y], panel_width, panel_height, col_shadow, col_bg, col_bg) : setLabel(_S.hotkey_window.global_showLuaConsole) self.hotkey_buttons["global_showLuaConsole"] = self:addBevelPanel(self.panel_pos_table_x[current_pos_x]+panel_width, self.panel_pos_table_y[current_pos_y], panel_width, panel_height, col_hotkeybox, col_highlight, col_shadow) :makeHotkeyBox(function() self:confirm_func("global_showLuaConsole") end, nil):setText( string.upper(array_join(ui.app.hotkeys["global_showLuaConsole"], "+")) ) get_next_pos_y() -- global_runDebugScript self:addBevelPanel(self.panel_pos_table_x[current_pos_x], self.panel_pos_table_y[current_pos_y], panel_width, panel_height, col_shadow, col_bg, col_bg) : setLabel(_S.hotkey_window.global_runDebugScript) self.hotkey_buttons["global_runDebugScript"] = self:addBevelPanel(self.panel_pos_table_x[current_pos_x]+panel_width, self.panel_pos_table_y[current_pos_y], panel_width, panel_height, col_hotkeybox, col_highlight, col_shadow) :makeHotkeyBox(function() self:confirm_func("global_runDebugScript") end, nil):setText( string.upper(array_join(ui.app.hotkeys["global_runDebugScript"], "+")) ) get_next_pos_y() -- ingame_showCheatWindow self:addBevelPanel(self.panel_pos_table_x[current_pos_x], self.panel_pos_table_y[current_pos_y], panel_width, panel_height, col_shadow, col_bg, col_bg) : setLabel(_S.hotkey_window.ingame_showCheatWindow) self.hotkey_buttons["ingame_showCheatWindow"] = self:addBevelPanel(self.panel_pos_table_x[current_pos_x]+panel_width, self.panel_pos_table_y[current_pos_y], panel_width, panel_height, col_hotkeybox, col_highlight, col_shadow) :makeHotkeyBox(function() self:confirm_func("ingame_showCheatWindow") end, nil):setText( string.upper(array_join(ui.app.hotkeys["ingame_showCheatWindow"], "+")) ) get_next_pos_y() -- ingame_poopLog self:addBevelPanel(self.panel_pos_table_x[current_pos_x], self.panel_pos_table_y[current_pos_y], panel_width, panel_height, col_shadow, col_bg, col_bg) : setLabel(_S.hotkey_window.ingame_poopLog) self.hotkey_buttons["ingame_poopLog"] = self:addBevelPanel(self.panel_pos_table_x[current_pos_x]+panel_width, self.panel_pos_table_y[current_pos_y], panel_width, panel_height, col_hotkeybox, col_highlight, col_shadow) :makeHotkeyBox(function() self:confirm_func("ingame_poopLog") end, nil):setText( string.upper(array_join(ui.app.hotkeys["ingame_poopLog"], "+")) ) get_next_pos_y() -- ingame_poopStrings self:addBevelPanel(self.panel_pos_table_x[current_pos_x], self.panel_pos_table_y[current_pos_y], panel_width, panel_height, col_shadow, col_bg, col_bg) : setLabel(_S.hotkey_window.ingame_poopStrings) self.hotkey_buttons["ingame_poopStrings"] = self:addBevelPanel(self.panel_pos_table_x[current_pos_x]+panel_width, self.panel_pos_table_y[current_pos_y], panel_width, panel_height, col_hotkeybox, col_highlight, col_shadow) :makeHotkeyBox(function() self:confirm_func("ingame_poopStrings") end, nil):setText( string.upper(array_join(ui.app.hotkeys["ingame_poopStrings"], "+")) ) get_next_pos_y() end -- Toggle keys assignment window. self:addBevelPanel(self.panel_pos_table_x[1], 385, 200, 40, col_bg):setLabel(_S.hotkey_window.caption_panels) :makeButton(0, 0, 200, 40, nil, self.toggleButton):setTooltip(_S.tooltip.hotkey_window.caption_panels) -- Store and recall position assignment window. self:addBevelPanel(self.panel_pos_table_x[3], 385, 200, 40, col_bg):setLabel(_S.hotkey_window.button_recallPosKeys) :makeButton(0, 0, 200, 40, nil, self.storeRecallPosButton):setTooltip(_S.tooltip.hotkey_window.button_recallPosKeys) -- "Accept" button self:addBevelPanel(10, 430, 180, 40, col_bg):setLabel(_S.hotkey_window.button_accept) :makeButton(0, 0, 180, 40, nil, self.buttonAccept):setTooltip(_S.tooltip.hotkey_window.button_accept) -- Reset to defaults button. self:addBevelPanel(230, 430, 180, 40, col_bg):setLabel(_S.hotkey_window.button_defaults) :makeButton(0, 0, 180, 40, nil, self.buttonDefaults):setTooltip(_S.tooltip.hotkey_window.button_defaults) -- "Cancel" button self:addBevelPanel(450, 430, 180, 40, col_bg):setLabel(_S.hotkey_window.button_cancel) :makeButton(0, 0, 180, 40, nil, self.buttonCancel):setTooltip(_S.tooltip.hotkey_window.button_cancel) self.built_in_font = built_in end function UIHotkeyAssign:buttonAccept() self.app:saveHotkeys() hotkeys_backedUp = false self:close() local window = UIOptions(self.ui, "menu") self.ui:addWindow(window) end function UIHotkeyAssign:buttonDefaults() -- Copy the default hotkeys into the app's current hotkey table. self.app.hotkeys = shallow_clone(select(5, corsixth.require("config_finder"))) -- Reload all hotkey boxes' text. for k, _ in pairs(self.hotkey_buttons) do self.hotkey_buttons[k]:setText( string.upper(array_join(self.app.hotkeys[k], "+")) ) end end function UIHotkeyAssign:buttonCancel() --Reset all keys back to what they were before opening the hotkey window. self.app.hotkeys = shallow_clone(hotkey_backup) hotkeys_backedUp = false self:close() local window = UIOptions(self.ui, "menu") self.ui:addWindow(window) end function UIHotkeyAssign:close() UIResizable.close(self) if self.mode == "menu" then self.ui:addWindow(UIOptions(self.ui, "menu")) end end function UIHotkeyAssign:toggleButton() self:close() local window = UIHotkeyAssign_Panels(self.ui, "menu") self.ui:addWindow(window) end function UIHotkeyAssign:storeRecallPosButton() self:close() local window = UIHotkeyAssign_storeRecallPos(self.ui, "menu") self.ui:addWindow(window) end function UIHotkeyAssign:confirm_func(hotkey) hotkey_input(hotkey, self.hotkey_buttons, self.app) end --! Assign panel keys window. class "UIHotkeyAssign_Panels" (UIResizable) ---@type UIHotkeyAssign_Panels local UIHotkeyAssign_Panels = _G["UIHotkeyAssign_Panels"] function UIHotkeyAssign_Panels:UIHotkeyAssign_Panels(ui, mode) self:UIResizable(ui, 240, 460, col_bg) local panel_width = 110 local panel_height = 20 local panel_x_pos = 10 local current_pos_y = 1 self.ui = ui self.mode = mode self.modal_class = mode == "menu" and "main menu" or "options" or "folders" self.on_top = mode == "menu" self.esc_closes = true self.resizable = false self:setDefaultPosition(0.5, 0.25) self.default_button_sound = "selectx.wav" self.app = ui.app self.hotkey_buttons = {} -- Panel y position table. self.panel_pos_table_y = {} for i=1, 18, 1 do self.panel_pos_table_y[i] = (i*20)+20 end -- Title self:addBevelPanel(10, 10, 220, 20, col_caption):setLabel(_S.hotkey_window.caption_panels) -- "Back" button self:addBevelPanel(10, 410, 220, 40, col_bg):setLabel(_S.hotkey_window.button_back) :makeButton(0, 0, 220, 40, nil, self.buttonBack):setTooltip(_S.tooltip.hotkey_window.button_back_02) -- ingame_panel_bankManager self:addBevelPanel(panel_x_pos, self.panel_pos_table_y[current_pos_y], panel_width, panel_height, col_shadow, col_bg, col_bg) : setLabel(_S.hotkey_window.ingame_panel_bankManager) self.hotkey_buttons["ingame_panel_bankManager"] = self:addBevelPanel(panel_x_pos+panel_width, self.panel_pos_table_y[current_pos_y], panel_width, panel_height, col_hotkeybox, col_highlight, col_shadow) :makeHotkeyBox(function() self:confirm_func("ingame_panel_bankManager") end, nil):setText( string.upper(array_join(ui.app.hotkeys["ingame_panel_bankManager"], "+")) ) current_pos_y = current_pos_y + 1 -- ingame_panel_bankStats self:addBevelPanel(panel_x_pos, self.panel_pos_table_y[current_pos_y], panel_width, panel_height, col_shadow, col_bg, col_bg) : setLabel(_S.hotkey_window.ingame_panel_bankStats) self.hotkey_buttons["ingame_panel_bankStats"] = self:addBevelPanel(panel_x_pos+panel_width, self.panel_pos_table_y[current_pos_y], panel_width, panel_height, col_hotkeybox, col_highlight, col_shadow) :makeHotkeyBox(function() self:confirm_func("ingame_panel_bankStats") end, nil):setText( string.upper(array_join(ui.app.hotkeys["ingame_panel_bankStats"], "+")) ) current_pos_y = current_pos_y + 1 -- ingame_panel_staffManage self:addBevelPanel(panel_x_pos, self.panel_pos_table_y[current_pos_y], panel_width, panel_height, col_shadow, col_bg, col_bg) : setLabel(_S.hotkey_window.ingame_panel_staffManage) self.hotkey_buttons["ingame_panel_staffManage"] = self:addBevelPanel(panel_x_pos+panel_width, self.panel_pos_table_y[current_pos_y], panel_width, panel_height, col_hotkeybox, col_highlight, col_shadow) :makeHotkeyBox(function() self:confirm_func("ingame_panel_staffManage") end, nil):setText( string.upper(array_join(ui.app.hotkeys["ingame_panel_staffManage"], "+")) ) current_pos_y = current_pos_y + 1 -- ingame_panel_townMap self:addBevelPanel(panel_x_pos, self.panel_pos_table_y[current_pos_y], panel_width, panel_height, col_shadow, col_bg, col_bg) : setLabel(_S.hotkey_window.ingame_panel_townMap) self.hotkey_buttons["ingame_panel_townMap"] = self:addBevelPanel(panel_x_pos+panel_width, self.panel_pos_table_y[current_pos_y], panel_width, panel_height, col_hotkeybox, col_highlight, col_shadow) :makeHotkeyBox(function() self:confirm_func("ingame_panel_townMap") end, nil):setText( string.upper(array_join(ui.app.hotkeys["ingame_panel_townMap"], "+")) ) current_pos_y = current_pos_y + 1 -- ingame_panel_casebook self:addBevelPanel(panel_x_pos, self.panel_pos_table_y[current_pos_y], panel_width, panel_height, col_shadow, col_bg, col_bg) : setLabel(_S.hotkey_window.ingame_panel_casebook) self.hotkey_buttons["ingame_panel_casebook"] = self:addBevelPanel(panel_x_pos+panel_width, self.panel_pos_table_y[current_pos_y], panel_width, panel_height, col_hotkeybox, col_highlight, col_shadow) :makeHotkeyBox(function() self:confirm_func("ingame_panel_casebook") end, nil):setText( string.upper(array_join(ui.app.hotkeys["ingame_panel_casebook"], "+")) ) current_pos_y = current_pos_y + 1 -- ingame_panel_research self:addBevelPanel(panel_x_pos, self.panel_pos_table_y[current_pos_y], panel_width, panel_height, col_shadow, col_bg, col_bg) : setLabel(_S.hotkey_window.ingame_panel_research) self.hotkey_buttons["ingame_panel_research"] = self:addBevelPanel(panel_x_pos+panel_width, self.panel_pos_table_y[current_pos_y], panel_width, panel_height, col_hotkeybox, col_highlight, col_shadow) :makeHotkeyBox(function() self:confirm_func("ingame_panel_research") end, nil):setText( string.upper(array_join(ui.app.hotkeys["ingame_panel_research"], "+")) ) current_pos_y = current_pos_y + 1 -- ingame_panel_status self:addBevelPanel(panel_x_pos, self.panel_pos_table_y[current_pos_y], panel_width, panel_height, col_shadow, col_bg, col_bg) : setLabel(_S.hotkey_window.ingame_panel_status) self.hotkey_buttons["ingame_panel_status"] = self:addBevelPanel(panel_x_pos+panel_width, self.panel_pos_table_y[current_pos_y], panel_width, panel_height, col_hotkeybox, col_highlight, col_shadow) :makeHotkeyBox(function() self:confirm_func("ingame_panel_status") end, nil):setText( string.upper(array_join(ui.app.hotkeys["ingame_panel_status"], "+")) ) current_pos_y = current_pos_y + 1 -- ingame_panel_charts self:addBevelPanel(panel_x_pos, self.panel_pos_table_y[current_pos_y], panel_width, panel_height, col_shadow, col_bg, col_bg) : setLabel(_S.hotkey_window.ingame_panel_charts) self.hotkey_buttons["ingame_panel_charts"] = self:addBevelPanel(panel_x_pos+panel_width, self.panel_pos_table_y[current_pos_y], panel_width, panel_height, col_hotkeybox, col_highlight, col_shadow) :makeHotkeyBox(function() self:confirm_func("ingame_panel_charts") end, nil):setText( string.upper(array_join(ui.app.hotkeys["ingame_panel_charts"], "+")) ) current_pos_y = current_pos_y + 1 -- ingame_panel_policy self:addBevelPanel(panel_x_pos, self.panel_pos_table_y[current_pos_y], panel_width, panel_height, col_shadow, col_bg, col_bg) : setLabel(_S.hotkey_window.ingame_panel_policy) self.hotkey_buttons["ingame_panel_policy"] = self:addBevelPanel(panel_x_pos+panel_width, self.panel_pos_table_y[current_pos_y], panel_width, panel_height, col_hotkeybox, col_highlight, col_shadow) :makeHotkeyBox(function() self:confirm_func("ingame_panel_policy") end, nil):setText( string.upper(array_join(ui.app.hotkeys["ingame_panel_policy"], "+")) ) current_pos_y = current_pos_y + 1 -- ingame_panel_buildRoom self:addBevelPanel(panel_x_pos, self.panel_pos_table_y[current_pos_y], panel_width, panel_height, col_shadow, col_bg, col_bg) : setLabel(_S.hotkey_window.ingame_panel_buildRoom) self.hotkey_buttons["ingame_panel_buildRoom"] = self:addBevelPanel(panel_x_pos+panel_width, self.panel_pos_table_y[current_pos_y], panel_width, panel_height, col_hotkeybox, col_highlight, col_shadow) :makeHotkeyBox(function() self:confirm_func("ingame_panel_buildRoom") end, nil):setText( string.upper(array_join(ui.app.hotkeys["ingame_panel_buildRoom"], "+")) ) current_pos_y = current_pos_y + 1 -- ingame_panel_furnishCorridor self:addBevelPanel(panel_x_pos, self.panel_pos_table_y[current_pos_y], panel_width, panel_height, col_shadow, col_bg, col_bg) : setLabel(_S.hotkey_window.ingame_panel_furnishCorridor) self.hotkey_buttons["ingame_panel_furnishCorridor"] = self:addBevelPanel(panel_x_pos+panel_width, self.panel_pos_table_y[current_pos_y], panel_width, panel_height, col_hotkeybox, col_highlight, col_shadow) :makeHotkeyBox(function() self:confirm_func("ingame_panel_furnishCorridor") end, nil):setText( string.upper(array_join(ui.app.hotkeys["ingame_panel_furnishCorridor"], "+")) ) current_pos_y = current_pos_y + 1 -- ingame_panel_editRoom self:addBevelPanel(panel_x_pos, self.panel_pos_table_y[current_pos_y], panel_width, panel_height, col_shadow, col_bg, col_bg) : setLabel(_S.hotkey_window.ingame_panel_editRoom) self.hotkey_buttons["ingame_panel_editRoom"] = self:addBevelPanel(panel_x_pos+panel_width, self.panel_pos_table_y[current_pos_y], panel_width, panel_height, col_hotkeybox, col_highlight, col_shadow) :makeHotkeyBox(function() self:confirm_func("ingame_panel_editRoom") end, nil):setText( string.upper(array_join(ui.app.hotkeys["ingame_panel_editRoom"], "+")) ) current_pos_y = current_pos_y + 1 -- ingame_panel_hireStaff self:addBevelPanel(panel_x_pos, self.panel_pos_table_y[current_pos_y], panel_width, panel_height, col_shadow, col_bg, col_bg) : setLabel(_S.hotkey_window.ingame_panel_hireStaff) self.hotkey_buttons["ingame_panel_hireStaff"] = self:addBevelPanel(panel_x_pos+panel_width, self.panel_pos_table_y[current_pos_y], panel_width, panel_height, col_hotkeybox, col_highlight, col_shadow) :makeHotkeyBox(function() self:confirm_func("ingame_panel_hireStaff") end, nil):setText( string.upper(array_join(ui.app.hotkeys["ingame_panel_hireStaff"], "+")) ) current_pos_y = current_pos_y + 1 -- self:addBevelPanel(10, self.panel_pos_table_y[current_pos_y], panel_width*2, panel_height, col_bg):setLabel(_S.hotkey_window.panel_altPanelKeys) current_pos_y = current_pos_y + 1 -- ingame_panel_map_alt self:addBevelPanel(panel_x_pos, self.panel_pos_table_y[current_pos_y], panel_width, panel_height, col_shadow, col_bg, col_bg) : setLabel(_S.hotkey_window.ingame_panel_map_alt) self.hotkey_buttons["ingame_panel_map_alt"] = self:addBevelPanel(panel_x_pos+panel_width, self.panel_pos_table_y[current_pos_y], panel_width, panel_height, col_hotkeybox, col_highlight, col_shadow) :makeHotkeyBox(function() self:confirm_func("ingame_panel_map_alt") end, nil):setText( string.upper(array_join(ui.app.hotkeys["ingame_panel_map_alt"], "+")) ) current_pos_y = current_pos_y + 1 -- ingame_panel_research_alt self:addBevelPanel(panel_x_pos, self.panel_pos_table_y[current_pos_y], panel_width, panel_height, col_shadow, col_bg, col_bg) : setLabel(_S.hotkey_window.ingame_panel_research_alt) self.hotkey_buttons["ingame_panel_research_alt"] = self:addBevelPanel(panel_x_pos+panel_width, self.panel_pos_table_y[current_pos_y], panel_width, panel_height, col_hotkeybox, col_highlight, col_shadow) :makeHotkeyBox(function() self:confirm_func("ingame_panel_research_alt") end, nil):setText( string.upper(array_join(ui.app.hotkeys["ingame_panel_research_alt"], "+")) ) current_pos_y = current_pos_y + 1 -- ingame_panel_casebook_alt self:addBevelPanel(panel_x_pos, self.panel_pos_table_y[current_pos_y], panel_width, panel_height, col_shadow, col_bg, col_bg) : setLabel(_S.hotkey_window.ingame_panel_casebook_alt) self.hotkey_buttons["ingame_panel_casebook_alt"] = self:addBevelPanel(panel_x_pos+panel_width, self.panel_pos_table_y[current_pos_y], panel_width, panel_height, col_hotkeybox, col_highlight, col_shadow) :makeHotkeyBox(function() self:confirm_func("ingame_panel_casebook_alt") end, nil):setText( string.upper(array_join(ui.app.hotkeys["ingame_panel_casebook_alt"], "+")) ) current_pos_y = current_pos_y + 1 -- ingame_panel_casebook_alt02 self:addBevelPanel(panel_x_pos, self.panel_pos_table_y[current_pos_y], panel_width, panel_height, col_shadow, col_bg, col_bg) : setLabel(_S.hotkey_window.ingame_panel_casebook_alt02) self.hotkey_buttons["ingame_panel_casebook_alt02"] = self:addBevelPanel(panel_x_pos+panel_width, self.panel_pos_table_y[current_pos_y], panel_width, panel_height, col_hotkeybox, col_highlight, col_shadow) :makeHotkeyBox(function() self:confirm_func("ingame_panel_casebook_alt02") end, nil):setText( string.upper(array_join(ui.app.hotkeys["ingame_panel_casebook_alt02"], "+")) ) end function UIHotkeyAssign_Panels:close() UIResizable.close(self) if self.mode == "menu" then self.ui:addWindow(UIHotkeyAssign(self.ui, "menu")) end end function UIHotkeyAssign_Panels:buttonBack() self:close() local window = UIHotkeyAssign(self.ui, "menu") self.ui:addWindow(window) end function UIHotkeyAssign_Panels:confirm_func(hotkey) hotkey_input(hotkey, self.hotkey_buttons, self.app) end --! Customise window used in the main menu and ingame. class "UIHotkeyAssign_storeRecallPos" (UIResizable) ---@type UIHotkeyAssign_storeRecallPos local UIHotkeyAssign_storeRecallPos = _G["UIHotkeyAssign_storeRecallPos"] function UIHotkeyAssign_storeRecallPos:UIHotkeyAssign_storeRecallPos(ui, mode) self:UIResizable(ui, 440, 320, col_bg) local panel_width = 100 local panel_height = 20 local panel_x_pos = 10 local current_pos_y = 1 self.ui = ui self.mode = mode self.modal_class = mode == "menu" and "main menu" or "options" or "folders" self.on_top = mode == "menu" self.esc_closes = true self.resizable = false self:setDefaultPosition(0.5, 0.25) self.default_button_sound = "selectx.wav" self.app = ui.app self.hotkey_buttons = {} -- Panel y position table. self.panel_pos_table_y = {} for i=1, 11, 1 do self.panel_pos_table_y[i] = (i*20)+20 end -- Title self:addBevelPanel(10, 10, 420, panel_height, col_caption):setLabel(_S.hotkey_window.panel_recallPosKeys) -- "Back" button self:addBevelPanel(10, 270, 420, 40, col_bg):setLabel(_S.hotkey_window.button_back) :makeButton(0, 0, 420, 40, nil, self.buttonBack):setTooltip(_S.tooltip.hotkey_window.button_back_02) -- Store Position Panel self:addBevelPanel(panel_x_pos, self.panel_pos_table_y[current_pos_y], 200, panel_height, col_caption):setLabel(_S.hotkey_window.panel_storePosKey) current_pos_y = current_pos_y + 1 -- ingame_storePosition_1 self:addBevelPanel(panel_x_pos, self.panel_pos_table_y[current_pos_y], panel_width, panel_height, col_shadow, col_bg, col_bg) : setLabel(_S.hotkey_window.ingame_storePosition_1) self.hotkey_buttons["ingame_storePosition_1"] = self:addBevelPanel(panel_x_pos+panel_width, self.panel_pos_table_y[current_pos_y], panel_width, panel_height, col_hotkeybox, col_highlight, col_shadow) :makeHotkeyBox(function() self:confirm_func("ingame_storePosition_1") end, nil):setText( string.upper(array_join(ui.app.hotkeys["ingame_storePosition_1"], "+")) ) current_pos_y = current_pos_y + 1 -- ingame_storePosition_2 self:addBevelPanel(panel_x_pos, self.panel_pos_table_y[current_pos_y], panel_width, panel_height, col_shadow, col_bg, col_bg) : setLabel(_S.hotkey_window.ingame_storePosition_2) self.hotkey_buttons["ingame_storePosition_2"] = self:addBevelPanel(panel_x_pos+panel_width, self.panel_pos_table_y[current_pos_y], panel_width, panel_height, col_hotkeybox, col_highlight, col_shadow) :makeHotkeyBox(function() self:confirm_func("ingame_storePosition_2") end, nil):setText( string.upper(array_join(ui.app.hotkeys["ingame_storePosition_2"], "+")) ) current_pos_y = current_pos_y + 1 -- ingame_storePosition_3 self:addBevelPanel(panel_x_pos, self.panel_pos_table_y[current_pos_y], panel_width, panel_height, col_shadow, col_bg, col_bg) : setLabel(_S.hotkey_window.ingame_storePosition_3) self.hotkey_buttons["ingame_storePosition_3"] = self:addBevelPanel(panel_x_pos+panel_width, self.panel_pos_table_y[current_pos_y], panel_width, panel_height, col_hotkeybox, col_highlight, col_shadow) :makeHotkeyBox(function() self:confirm_func("ingame_storePosition_3") end, nil):setText( string.upper(array_join(ui.app.hotkeys["ingame_storePosition_3"], "+")) ) current_pos_y = current_pos_y + 1 -- ingame_storePosition_4 self:addBevelPanel(panel_x_pos, self.panel_pos_table_y[current_pos_y], panel_width, panel_height, col_shadow, col_bg, col_bg) : setLabel(_S.hotkey_window.ingame_storePosition_4) self.hotkey_buttons["ingame_storePosition_4"] = self:addBevelPanel(panel_x_pos+panel_width, self.panel_pos_table_y[current_pos_y], panel_width, panel_height, col_hotkeybox, col_highlight, col_shadow) :makeHotkeyBox(function() self:confirm_func("ingame_storePosition_4") end, nil):setText( string.upper(array_join(ui.app.hotkeys["ingame_storePosition_4"], "+")) ) current_pos_y = current_pos_y + 1 -- ingame_storePosition_5 self:addBevelPanel(panel_x_pos, self.panel_pos_table_y[current_pos_y], panel_width, panel_height, col_shadow, col_bg, col_bg) : setLabel(_S.hotkey_window.ingame_storePosition_5) self.hotkey_buttons["ingame_storePosition_5"] = self:addBevelPanel(panel_x_pos+panel_width, self.panel_pos_table_y[current_pos_y], panel_width, panel_height, col_hotkeybox, col_highlight, col_shadow) :makeHotkeyBox(function() self:confirm_func("ingame_storePosition_5") end, nil):setText( string.upper(array_join(ui.app.hotkeys["ingame_storePosition_5"], "+")) ) current_pos_y = current_pos_y + 1 -- ingame_storePosition_6 self:addBevelPanel(panel_x_pos, self.panel_pos_table_y[current_pos_y], panel_width, panel_height, col_shadow, col_bg, col_bg) : setLabel(_S.hotkey_window.ingame_storePosition_6) self.hotkey_buttons["ingame_storePosition_6"] = self:addBevelPanel(panel_x_pos+panel_width, self.panel_pos_table_y[current_pos_y], panel_width, panel_height, col_hotkeybox, col_highlight, col_shadow) :makeHotkeyBox(function() self:confirm_func("ingame_storePosition_6") end, nil):setText( string.upper(array_join(ui.app.hotkeys["ingame_storePosition_6"], "+")) ) current_pos_y = current_pos_y + 1 -- ingame_storePosition_7 self:addBevelPanel(panel_x_pos, self.panel_pos_table_y[current_pos_y], panel_width, panel_height, col_shadow, col_bg, col_bg) : setLabel(_S.hotkey_window.ingame_storePosition_7) self.hotkey_buttons["ingame_storePosition_7"] = self:addBevelPanel(panel_x_pos+panel_width, self.panel_pos_table_y[current_pos_y], panel_width, panel_height, col_hotkeybox, col_highlight, col_shadow) :makeHotkeyBox(function() self:confirm_func("ingame_storePosition_7") end, nil):setText( string.upper(array_join(ui.app.hotkeys["ingame_storePosition_7"], "+")) ) current_pos_y = current_pos_y + 1 -- ingame_storePosition_8 self:addBevelPanel(panel_x_pos, self.panel_pos_table_y[current_pos_y], panel_width, panel_height, col_shadow, col_bg, col_bg) : setLabel(_S.hotkey_window.ingame_storePosition_8) self.hotkey_buttons["ingame_storePosition_8"] = self:addBevelPanel(panel_x_pos+panel_width, self.panel_pos_table_y[current_pos_y], panel_width, panel_height, col_hotkeybox, col_highlight, col_shadow) :makeHotkeyBox(function() self:confirm_func("ingame_storePosition_8") end, nil):setText( string.upper(array_join(ui.app.hotkeys["ingame_storePosition_8"], "+")) ) current_pos_y = current_pos_y + 1 -- ingame_storePosition_9 self:addBevelPanel(panel_x_pos, self.panel_pos_table_y[current_pos_y], panel_width, panel_height, col_shadow, col_bg, col_bg) : setLabel(_S.hotkey_window.ingame_storePosition_9) self.hotkey_buttons["ingame_storePosition_9"] = self:addBevelPanel(panel_x_pos+panel_width, self.panel_pos_table_y[current_pos_y], panel_width, panel_height, col_hotkeybox, col_highlight, col_shadow) :makeHotkeyBox(function() self:confirm_func("ingame_storePosition_9") end, nil):setText( string.upper(array_join(ui.app.hotkeys["ingame_storePosition_9"], "+")) ) current_pos_y = current_pos_y + 1 -- ingame_storePosition_0 self:addBevelPanel(panel_x_pos, self.panel_pos_table_y[current_pos_y], panel_width, panel_height, col_shadow, col_bg, col_bg) : setLabel(_S.hotkey_window.ingame_storePosition_0) self.hotkey_buttons["ingame_storePosition_0"] = self:addBevelPanel(panel_x_pos+panel_width, self.panel_pos_table_y[current_pos_y], panel_width, panel_height, col_hotkeybox, col_highlight, col_shadow) :makeHotkeyBox(function() self:confirm_func("ingame_storePosition_0") end, nil):setText( string.upper(array_join(ui.app.hotkeys["ingame_storePosition_0"], "+")) ) --Go to the next column. current_pos_y = 1 panel_x_pos = panel_x_pos + 220 -- Recall Position Panel self:addBevelPanel(panel_x_pos, self.panel_pos_table_y[current_pos_y], 200, panel_height, col_caption):setLabel(_S.hotkey_window.panel_recallPosKeys) current_pos_y = current_pos_y + 1 -- ingame_recallPosition_1 self:addBevelPanel(panel_x_pos, self.panel_pos_table_y[current_pos_y], panel_width, panel_height, col_shadow, col_bg, col_bg) : setLabel(_S.hotkey_window.ingame_recallPosition_1) self.hotkey_buttons["ingame_recallPosition_1"] = self:addBevelPanel(panel_x_pos+panel_width, self.panel_pos_table_y[current_pos_y], panel_width, panel_height, col_hotkeybox, col_highlight, col_shadow) :makeHotkeyBox(function() self:confirm_func("ingame_recallPosition_1") end, nil):setText( string.upper(array_join(ui.app.hotkeys["ingame_recallPosition_1"], "+")) ) current_pos_y = current_pos_y + 1 -- ingame_recallPosition_2 self:addBevelPanel(panel_x_pos, self.panel_pos_table_y[current_pos_y], panel_width, panel_height, col_shadow, col_bg, col_bg) : setLabel(_S.hotkey_window.ingame_recallPosition_2) self.hotkey_buttons["ingame_recallPosition_2"] = self:addBevelPanel(panel_x_pos+panel_width, self.panel_pos_table_y[current_pos_y], panel_width, panel_height, col_hotkeybox, col_highlight, col_shadow) :makeHotkeyBox(function() self:confirm_func("ingame_recallPosition_2") end, nil):setText( string.upper(array_join(ui.app.hotkeys["ingame_recallPosition_2"], "+")) ) current_pos_y = current_pos_y + 1 -- ingame_recallPosition_3 self:addBevelPanel(panel_x_pos, self.panel_pos_table_y[current_pos_y], panel_width, panel_height, col_shadow, col_bg, col_bg) : setLabel(_S.hotkey_window.ingame_recallPosition_3) self.hotkey_buttons["ingame_recallPosition_3"] = self:addBevelPanel(panel_x_pos+panel_width, self.panel_pos_table_y[current_pos_y], panel_width, panel_height, col_hotkeybox, col_highlight, col_shadow) :makeHotkeyBox(function() self:confirm_func("ingame_recallPosition_3") end, nil):setText( string.upper(array_join(ui.app.hotkeys["ingame_recallPosition_3"], "+")) ) current_pos_y = current_pos_y + 1 -- ingame_recallPosition_4 self:addBevelPanel(panel_x_pos, self.panel_pos_table_y[current_pos_y], panel_width, panel_height, col_shadow, col_bg, col_bg) : setLabel(_S.hotkey_window.ingame_recallPosition_4) self.hotkey_buttons["ingame_recallPosition_4"] = self:addBevelPanel(panel_x_pos+panel_width, self.panel_pos_table_y[current_pos_y], panel_width, panel_height, col_hotkeybox, col_highlight, col_shadow) :makeHotkeyBox(function() self:confirm_func("ingame_recallPosition_4") end, nil):setText( string.upper(array_join(ui.app.hotkeys["ingame_recallPosition_4"], "+")) ) current_pos_y = current_pos_y + 1 -- ingame_recallPosition_5 self:addBevelPanel(panel_x_pos, self.panel_pos_table_y[current_pos_y], panel_width, panel_height, col_shadow, col_bg, col_bg) : setLabel(_S.hotkey_window.ingame_recallPosition_5) self.hotkey_buttons["ingame_recallPosition_5"] = self:addBevelPanel(panel_x_pos+panel_width, self.panel_pos_table_y[current_pos_y], panel_width, panel_height, col_hotkeybox, col_highlight, col_shadow) :makeHotkeyBox(function() self:confirm_func("ingame_recallPosition_5") end, nil):setText( string.upper(array_join(ui.app.hotkeys["ingame_recallPosition_5"], "+")) ) current_pos_y = current_pos_y + 1 -- ingame_recallPosition_6 self:addBevelPanel(panel_x_pos, self.panel_pos_table_y[current_pos_y], panel_width, panel_height, col_shadow, col_bg, col_bg) : setLabel(_S.hotkey_window.ingame_recallPosition_6) self.hotkey_buttons["ingame_recallPosition_6"] = self:addBevelPanel(panel_x_pos+panel_width, self.panel_pos_table_y[current_pos_y], panel_width, panel_height, col_hotkeybox, col_highlight, col_shadow) :makeHotkeyBox(function() self:confirm_func("ingame_recallPosition_6") end, nil):setText( string.upper(array_join(ui.app.hotkeys["ingame_recallPosition_6"], "+")) ) current_pos_y = current_pos_y + 1 -- ingame_recallPosition_7 self:addBevelPanel(panel_x_pos, self.panel_pos_table_y[current_pos_y], panel_width, panel_height, col_shadow, col_bg, col_bg) : setLabel(_S.hotkey_window.ingame_recallPosition_7) self.hotkey_buttons["ingame_recallPosition_7"] = self:addBevelPanel(panel_x_pos+panel_width, self.panel_pos_table_y[current_pos_y], panel_width, panel_height, col_hotkeybox, col_highlight, col_shadow) :makeHotkeyBox(function() self:confirm_func("ingame_recallPosition_7") end, nil):setText( string.upper(array_join(ui.app.hotkeys["ingame_recallPosition_7"], "+")) ) current_pos_y = current_pos_y + 1 -- ingame_recallPosition_8 self:addBevelPanel(panel_x_pos, self.panel_pos_table_y[current_pos_y], panel_width, panel_height, col_shadow, col_bg, col_bg) : setLabel(_S.hotkey_window.ingame_recallPosition_8) self.hotkey_buttons["ingame_recallPosition_8"] = self:addBevelPanel(panel_x_pos+panel_width, self.panel_pos_table_y[current_pos_y], panel_width, panel_height, col_hotkeybox, col_highlight, col_shadow) :makeHotkeyBox(function() self:confirm_func("ingame_recallPosition_8") end, nil):setText( string.upper(array_join(ui.app.hotkeys["ingame_recallPosition_8"], "+")) ) current_pos_y = current_pos_y + 1 -- ingame_recallPosition_9 self:addBevelPanel(panel_x_pos, self.panel_pos_table_y[current_pos_y], panel_width, panel_height, col_shadow, col_bg, col_bg) : setLabel(_S.hotkey_window.ingame_recallPosition_9) self.hotkey_buttons["ingame_recallPosition_9"] = self:addBevelPanel(panel_x_pos+panel_width, self.panel_pos_table_y[current_pos_y], panel_width, panel_height, col_hotkeybox, col_highlight, col_shadow) :makeHotkeyBox(function() self:confirm_func("ingame_recallPosition_9") end, nil):setText( string.upper(array_join(ui.app.hotkeys["ingame_recallPosition_9"], "+")) ) current_pos_y = current_pos_y + 1 -- ingame_recallPosition_0 self:addBevelPanel(panel_x_pos, self.panel_pos_table_y[current_pos_y], panel_width, panel_height, col_shadow, col_bg, col_bg) : setLabel(_S.hotkey_window.ingame_recallPosition_0) self.hotkey_buttons["ingame_recallPosition_0"] = self:addBevelPanel(panel_x_pos+panel_width, self.panel_pos_table_y[current_pos_y], panel_width, panel_height, col_hotkeybox, col_highlight, col_shadow) :makeHotkeyBox(function() self:confirm_func("ingame_recallPosition_0") end, nil):setText( string.upper(array_join(ui.app.hotkeys["ingame_recallPosition_0"], "+")) ) end function UIHotkeyAssign_storeRecallPos:close() UIResizable.close(self) if self.mode == "menu" then self.ui:addWindow(UIHotkeyAssign(self.ui, "menu")) end end function UIHotkeyAssign_storeRecallPos:buttonBack() self:close() local window = UIHotkeyAssign(self.ui, "menu") self.ui:addWindow(window) end function UIHotkeyAssign_storeRecallPos:confirm_func(hotkey) hotkey_input(hotkey, self.hotkey_buttons, self.app) end CorsixTH-0.63/CorsixTH/Lua/dialogs/resizables/lua_console.lua000066400000000000000000000102021347163623700241730ustar00rootroot00000000000000--[[ Copyright (c) 2010 Manuel "Roujin" Wolf 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. --]] strict_declare_global "_" _ = nil --! Interactive Lua Console for ingame debugging. class "UILuaConsole" (UIResizable) ---@type UILuaConsole local UILuaConsole = _G["UILuaConsole"] local col_bg = { red = 46, green = 186, blue = 60, } local col_textbox = { red = 0, green = 0, blue = 0, } local col_highlight = { red = 174, green = 166, blue = 218, } local col_shadow = { red = 134, green = 126, blue = 178, } function UILuaConsole:UILuaConsole(ui) self:UIResizable(ui, 320, 240, col_bg) local app = ui.app self.modal_class = "console" self.esc_closes = true self.resizable = true self.min_width = 200 self.min_height = 150 self:setDefaultPosition(0.1, 0.1) -- Window parts definition self.default_button_sound = "selectx.wav" -- Textbox for entering code self.textbox = self:addBevelPanel(20, 20, 280, 140, col_textbox, col_highlight, col_shadow) :setLabel("", app.gfx:loadBuiltinFont(), "left"):setTooltip(_S.tooltip.lua_console.textbox):setAutoClip(true) :makeTextbox():allowedInput("all"):setText({""}) self.textbox:setActive(true) -- activated by default -- "Execute" button self.execute_button = self:addBevelPanel(20, self.height - 60, 130, 40, col_bg):setLabel(_S.lua_console.execute_code) :makeButton(0, 0, 130, 40, nil, self.buttonExecute):setTooltip(_S.tooltip.lua_console.execute_code) -- "Close" button self.close_button = self:addBevelPanel(170, self.height - 60, 130, 40, col_bg):setLabel(_S.lua_console.close) :makeButton(0, 0, 130, 40, nil, self.buttonClose):setTooltip(_S.tooltip.lua_console.close) end function UILuaConsole:setSize(width, height) UIResizable.setSize(self, width, height) self.textbox:setSize(self.width - 40, self.height - 100) local button_width = math.floor((self.width - 60) / 2) self.execute_button:setPosition(20, self.height - 60) self.execute_button:setSize(button_width, 40) self.close_button:setPosition(self.width - 20 - button_width, self.height - 60) self.close_button:setSize(button_width, 40) end function UILuaConsole:buttonExecute() print("Loading UserFunction...") local func, err, s _ = TheApp.ui and TheApp.ui.debug_cursor_entity local i = 0 func, err = load(function() i = i + 1 if type(self.textbox.text) == "table" then return self.textbox.text[i] and self.textbox.text[i] .. "\n" else return i < 2 and self.textbox.text end end, "=UserFunction") if not func then print("Error while loading UserFunction:") print(err) return end print("Executing UserFunction...") s, err = pcall(func) if not s then print("Error while executing UserFunction:") print(err) end end function UILuaConsole:buttonClose() self:close() end function UILuaConsole:afterLoad(old, new) UIResizable.afterLoad(self, old, new) if old < 65 then -- added min_width and min_height self.min_width = 200 self.min_height = 150 -- added execute_button, close_button, changed callback self.execute_button = self.buttons[2] self.close_button = self.buttons[3] self.close_button.on_click = self.buttonClose end end CorsixTH-0.63/CorsixTH/Lua/dialogs/resizables/main_menu.lua000066400000000000000000000136311347163623700236510ustar00rootroot00000000000000--[[ Copyright (c) 2010-2014 Manuel "Roujin" Wolf, Edvin "Lego3" Linge 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. --]] --! Class for main menu window. class "UIMainMenu" (UIResizable) ---@type UIMainMenu local UIMainMenu = _G["UIMainMenu"] local col_bg = { red = 154, green = 146, blue = 198, } local menu_item_height = 40 function UIMainMenu:UIMainMenu(ui) -- First define all menu entries with a label, a callback and a tooltip. -- That way we can call the UIResizable constructor with a good height argument. local menu_items = { {_S.main_menu.new_game, self.buttonNewGame, _S.tooltip.main_menu.new_game}, {_S.main_menu.custom_campaign, self.buttonCustomCampaign, _S.tooltip.main_menu.custom_campaign}, {_S.main_menu.custom_level, self.buttonCustomGame, _S.tooltip.main_menu.custom_level}, {_S.main_menu.continue, self.buttonContinueGame, _S.tooltip.main_menu.continue}, {_S.main_menu.load_game, self.buttonLoadGame, _S.tooltip.main_menu.load_game}, {_S.main_menu.options, self.buttonOptions, _S.tooltip.main_menu.options}, {_S.main_menu.map_edit, self.buttonMapEdit, _S.tooltip.main_menu.map_edit}, {_S.main_menu.exit, self.buttonExit, _S.tooltip.main_menu.exit} } self.no_menu_entries = #menu_items self:UIResizable(ui, 200, (menu_item_height + 10) * (#menu_items + 1), col_bg) self.esc_closes = false self.modal_class = "main menu" self.on_top = true self:setDefaultPosition(0.5, 0.25) -- The main menu also shows the version number of the player's copy of the game. self.label_font = TheApp.gfx:loadFont("QData", "Font01V") self.version_number = TheApp:getVersion() -- individual buttons self.default_button_sound = "selectx.wav" local next_y = 20 for _, item in ipairs(menu_items) do next_y = self:addMenuItem(item[1], item[2], item[3], next_y) end end --! Adds a single menu item to the main menu. --!param label (string) The (localized) label to use for the new button. --!param callback (function) Function to call when the user clicks the button. --!param tooltip (string) Text to show when the player hovers over the button. --!param y_pos (integer) Y-position from where to add the menu item. --!return (integer) Y-position below which more items can be added. -- This function has added a menu item between y_pos and the return value. function UIMainMenu:addMenuItem(label, callback, tooltip, y_pos) self:addBevelPanel(20, y_pos, 160, menu_item_height, col_bg) :setLabel(label):makeButton(0, 0, 160, menu_item_height, nil, callback) :setTooltip(tooltip) return y_pos + menu_item_height + 10 end function UIMainMenu:getSavedWindowPositionName() return "main_menu_group" end function UIMainMenu:draw(canvas, x, y) UIResizable.draw(self, canvas, x, y) x, y = self.x + x, self.y + y -- Move the version string up a bit if also showing the savegame version. local ly = y + (menu_item_height + 10) * (self.no_menu_entries + 1) - 15 if TheApp.config.debug then self.label_font:draw(canvas, _S.main_menu.savegame_version .. TheApp.savegame_version, x + 5, ly, 190, 0, "right") ly = ly - 15 end self.label_font:draw(canvas, _S.main_menu.version .. self.version_number, x + 5, ly, 190, 0, "right") end function UIMainMenu:buttonNewGame() local window = UINewGame(self.ui) self.ui:addWindow(window) end function UIMainMenu:buttonCustomCampaign() if TheApp.using_demo_files then self.ui:addWindow(UIInformation(self.ui, {_S.information.no_custom_game_in_demo})) else local window = UICustomCampaign(self.ui) self.ui:addWindow(window) end end function UIMainMenu:buttonCustomGame() if TheApp.using_demo_files then self.ui:addWindow(UIInformation(self.ui, {_S.information.no_custom_game_in_demo})) else local window = UICustomGame(self.ui) self.ui:addWindow(window) end end function UIMainMenu:buttonContinueGame() local most_recent_saved_game = FileTreeNode(self.ui.app.savegame_dir):getMostRecentlyModifiedChildFile(".sav") if most_recent_saved_game then local path = most_recent_saved_game.path local app = self.ui.app local status, err = pcall(app.load, app, path) if not status then err = _S.errors.load_prefix .. err print(err) app.ui:addWindow(UIInformation(self.ui, {err})) end else local error = _S.errors.load_prefix .. _S.errors.no_games_to_contine print(error) self.ui.app.ui:addWindow(UIInformation(self.ui, {error})) end end function UIMainMenu:buttonLoadGame() local window = UILoadGame(self.ui, "menu") self.ui:addWindow(window) end function UIMainMenu:buttonOptions() local window = UIOptions(self.ui, "menu") self.ui:addWindow(window) end function UIMainMenu:buttonMapEdit() self.ui.app:mapEdit() end function UIMainMenu:buttonExit() self.ui:addWindow(UIConfirmDialog(self.ui, _S.tooltip.main_menu.quit, --[[persistable:quit_confirm_dialog]]function() self.ui.app:exit() end )) end CorsixTH-0.63/CorsixTH/Lua/dialogs/resizables/map_editor.lua000066400000000000000000001721121347163623700240240ustar00rootroot00000000000000--[[ Copyright (c) 2010 Peter "Corsix" Cawley Copyright (c) 2014 Stephen Baker 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. --]] class "UIMapEditor" (UIResizable) ---@type UIMapEditor local UIMapEditor = _G["UIMapEditor"] local col_bg = {red = 154, green = 146, blue = 198} -- {{{ Editor sprites. -- Unfortunately, current map file format does not support flags like FLIP_H. -- Commented this out until flags can be stored in the file created by the map editor. -- -- High byte sprite constants. -- local FLIP_H = DrawFlags.FlipHorizontal * 256 -- Each variable below is an array of multi-tile sprites, which is translated -- to a list of buttons at a page. -- The generic form of a multi-tile sprite (see the helipad for an example) is -- a table {sprites = .., height = .., objects = ..}. The 'height' defines the -- height of the displayed button (between 1 and MAX_HEIGHT). The 'sprites' is -- an array of single sprites, a table of {sprite = ..., xpos = ..., ypos = -- ..., type = ...}. It defines which sprite to display at which relative -- position. Positions run from 1 upward, sprites are numbers 0..255 (the low -- byte). -- The high byte is reserved for adding DrawFlags flags in the future, eg FLIP_H. -- -- The type defines where the sprite is stored. 'north' and 'west' mean north -- respectively west wall. 'floor' means it is a floor sprite. 'hospital' is -- also a floor sprite but it also states that the tile is part of the -- hospital. Similarly, 'road' is a floor sprite outside the hospital that can -- be walked on. Finally, the 'objects' defines the position of objects in the -- shape. At this time, only an entrance door can be placed. -- -- As there are a lot of single tile sprite buttons, there is a simplified -- form to specify those (and they get expanded to the generic multi-tile -- sprite form automagically). The short form for a single sprite button is a -- table {sprite = ..., height = ..., type = ...}, where all the fields have -- the same meaning as described above for the generic form. -- -- {{{ Foliage sprites. local foliage = { {sprite=192, height=3, type="floor"}, -- Regular European shrub 1 {sprite=193, height=2, type="floor"}, -- Ground plant, green 1 {sprite=194, height=2, type="floor"}, -- Bush {sprite=195, height=3, type="floor"}, -- Ground plant, red flowers {sprite=196, height=3, type="floor"}, -- Shrub {sprite=197, height=4, type="floor"}, -- Dead tree (very high) {sprite=198, height=2, type="floor"}, -- Low ground plant {sprite=199, height=3, type="floor"}, -- Regular European shrub 2 {sprite=200, height=2, type="floor"}, -- Ground plant, flowers {sprite=201, height=1, type="floor"}, -- Flowerbed East/South {sprite=202, height=1, type="floor"}, -- Flowerbed West/South {sprite=203, height=1, type="floor"}, -- Flowerbed West/North {sprite=204, height=1, type="floor"}, -- Flowerbed North/South } -- }}} -- {{{ Hedge row sprites. local hedgerow={ {sprite=176, height=2, type="floor"}, -- Hedge West-North {sprite=177, height=2, type="floor"}, -- Hedge West-South {sprite=178, height=2, type="floor"}, -- Hedge East-South {sprite=179, height=2, type="floor"}, -- Hedge East-North {sprite=180, height=2, type="floor"}, -- Hedge West-East {sprite=181, height=2, type="floor"}, -- Hedge North-South {sprite=182, height=2, type="floor"}, -- Hedge East-West-South {sprite=183, height=2, type="floor"}, -- Hedge East-West-North {sprite=184, height=2, type="floor"}, -- Hedge West-North-South {sprite=185, height=2, type="floor"}, -- Hedge East-North-South {sprite=186, height=2, type="floor"}, -- Hedge East-West-North-South {sprite=187, height=2, type="floor"}, -- Hedge North-South with shrub {sprite=188, height=2, type="floor"}, -- Hedge North-South with holes {sprite=189, height=2, type="floor"}, -- Hedge East-West with shrub 1 {sprite=190, height=2, type="floor"}, -- Hedge East-West with holes {sprite=191, height=2, type="floor"}, -- Hedge East-West with shrub 2 } -- }}} -- {{{ Pond sprites. local pond={ {sprite= 60, height=1, type="floor"}, -- South edge of a pond {sprite= 65, height=1, type="floor"}, -- West edge of a pond {sprite= 68, height=1, type="floor"}, -- North edge of a pond {sprite= 78, height=1, type="floor"}, -- East edge of a pond {sprite= 59, height=1, type="floor"}, -- South-West corner of a pond {sprite= 77, height=1, type="floor"}, -- North-East corner of a pond {sprite= 79, height=1, type="floor"}, -- South-East corner of a pond {sprite= 80, height=1, type="floor"}, -- North-West corner of a pond {sprite= 69, height=1, type="floor"}, -- Water tile of a pond {sprite= 71, height=1, type="floor"}, -- Water tile of a pond with water lilies {sprite= 72, height=2, type="floor"}, -- Water tile of a pond with water plant 1 {sprite= 73, height=2, type="floor"} -- Water tile of a pond with water plant 2 } -- }}} -- {{{ Inside floor sprites. local inside={ {sprite= 17, height=1, type="hospital"}, -- Dark blue/purple carpet tile {sprite= 70, height=1, type="hospital"}, -- Duplicate of 017 {sprite= 18, height=1, type="hospital"}, -- Red-Blue floor tile 1 {sprite= 19, height=1, type="hospital"}, -- Red-Blue floor tile 2 {sprite= 23, height=1, type="hospital"}, -- Red-Blue floor tile 3 {sprite= 16, height=1, type="hospital"}, -- Dark big checker pattern tile {sprite= 21, height=1, type="hospital"}, -- Small checker pattern tile {sprite= 22, height=1, type="hospital"}, -- Big checker pattern tile {sprite= 66, height=1, type="hospital"}, -- Floor tile with light center {sprite= 76, height=1, type="hospital"}, -- Floor tile with light center and corners {sprite= 20, height=1, type="hospital"} -- Wooden floor tile } -- }}} -- {{{ Outside floor sprites. local outside={ {sprite= 1, height=1, type="floor"}, -- Grass tile 1 {sprite= 2, height=1, type="floor"}, -- Grass tile 2 {sprite= 3, height=1, type="floor"}, -- Grass tile 3 {sprite= 4, height=1, type="road" }, -- Light concrete tile {sprite= 15, height=1, type="road" }, -- Concrete tile {sprite= 5, height=1, type="road" }, -- Dark concrete tile {sprite= 6, height=1, type="floor"}, -- Grass tile with South-East concrete corner {sprite= 8, height=1, type="floor"}, -- Grass tile with South-West concrete corner {sprite= 10, height=1, type="floor"}, -- Grass tile with North-West concrete corner {sprite= 12, height=1, type="floor"}, -- Grass tile with North-East concrete corner {sprite= 7, height=1, type="floor"}, -- Grass tile with South concrete edge {sprite= 9, height=1, type="floor"}, -- Grass tile with West concrete edge {sprite= 11, height=1, type="floor"}, -- Grass tile with North concrete edge {sprite= 13, height=1, type="floor"}, -- Grass tile with East concrete edge {sprite= 14, height=1, type="floor"}, -- Concrete tile with North-East grass corner {sprite= 61, height=1, type="floor"}, -- Concrete tile with South-West grass corner {sprite= 62, height=1, type="floor"}, -- Concrete tile with South-East grass corner {sprite= 63, height=1, type="floor"}, -- Concrete tile with North-West grass corner {sprite= 64, height=1, type="floor"}, -- Grass tile with rocks {sprite=205, height=1, type="floor"}, -- Fully cracked garden marble tile {sprite=206, height=1, type="floor"}, -- Broken garden marble tile {sprite=207, height=1, type="floor"}, -- Partially cracked garden marble tile {sprite=208, height=1, type="floor"}, -- Garden marble tile } -- }}} -- {{{ Road floor sprites. local road_spr = { {sprite= 41, height=1, type="road"}, -- Road with white discontinuous line North-South {sprite= 45, height=1, type="road"}, -- Road with double yellow lines at West edge merging at South --{sprite= 46, height=1, type="road"}, -- Duplicate of 45 {sprite= 42, height=1, type="road"}, -- Road with double yellow lines at West with black orthogonal lines {sprite= 43, height=1, type="road"}, -- Road with double yellow lines at West edge {sprite= 44, height=1, type="road"}, -- Road with double yellow lines at West edge merging at North {sprite= 47, height=1, type="road"}, -- Road with red line at East linked to yellow discontinuous line at South {sprite= 49, height=1, type="road"}, -- Road with red braking line at the East pointing to the West {sprite= 48, height=1, type="road"}, -- Road with red line at East linked to yellow discontinuous line at North {sprite= 53, height=1, type="road"}, -- Road with double yellow lines at East edge merging at the south {sprite= 52, height=1, type="road"}, -- Road with double yellow lines at East with black orthogonal lines --{sprite= 54, height=1, type="road"}, -- Duplicate of 52 {sprite= 51, height=1, type="road"}, -- Road with double yellow lines at East edge {sprite= 57, height=1, type="road"}, -- Road with red line at West linked to yellow discontinuous line at South {sprite= 55, height=1, type="road"}, -- Road with red braking line at the West pointing to the East {sprite= 56, height=1, type="road"}, -- Road with red line at West linked to yellow discontinuous line at North {sprite= 50, height=1, type="road"}, -- Road with grey edge at the East {sprite= 58, height=1, type="road"}, -- Road with grey edge at the West } local road = {} -- All sprites get horizontally flipped as well, for roads running north-south. for _, spr in ipairs(road_spr) do road[#road + 1] = spr -- Unfortunately, current map file format does not support flags like FLIP_H. -- Commented this out until flags can be stored in the file created by the map editor. -- road[#road + 1] = {sprite = spr.sprite + FLIP_H, height = spr.height, type = spr.type} end -- }}} -- {{{ North wall layout and floor sprites. local north_wall = { {sprites = { {sprite=159, xpos=1, ypos=1, type="north"}, -- External doorway North outside left part {sprite=157, xpos=3, ypos=1, type="north"}, -- External doorway North outside right part }, height = 3, objects = {{type="entrance_door", xpos=2, ypos=1, direction="north"}}, }, {sprites = { {sprite=163, xpos=1, ypos=1, type="north"}, -- External doorway North inside left part {sprite=161, xpos=3, ypos=1, type="north"}, -- External doorway North inside right part }, height = 3, objects = {{type="entrance_door", xpos=2, ypos=1, direction="north"}}, }, {sprite=114, height=3, type="north"}, -- External North wall outside {sprite=116, height=3, type="north"}, -- External North wall outside left part of window {sprite=120, height=3, type="north"}, -- External North wall with window {sprite=118, height=3, type="north"}, -- External North wall outside right part of window {sprite=122, height=3, type="north"}, -- External North wall inside {sprite=124, height=3, type="north"}, -- External North wall inside left part of window {sprite=126, height=3, type="north"}, -- External North wall inside right part of window -- Unfortunately, current map file format does not support flags like FLIP_H. -- Commented this out until flags can be stored in the file created by the map editor. -- {sprite=209 + FLIP_H, height=3, type="north"}, -- Lamp post pointing East -- {sprite=210 + FLIP_H, height=3, type="north"}, -- Lamp post pointing West } -- }}} -- {{{ West wall layout and floor sprites. local west_wall = { {sprites = { {sprite=158, xpos=1, ypos=3, type="west"}, -- External doorway West outside left part {sprite=160, xpos=1, ypos=1, type="west"}, -- External doorway West outside right part }, height = 3, objects = {{type="entrance_door", xpos=1, ypos=2, direction="west"}}, }, {sprites = { {sprite=162, xpos=1, ypos=3, type="west"}, -- External doorway West inside left part {sprite=164, xpos=1, ypos=1, type="west"}, -- External doorway West inside right part }, height = 3, objects = {{type="entrance_door", xpos=1, ypos=2, direction="west"}}, }, {sprite=115, height=3, type="west"}, -- External West wall outside {sprite=119, height=3, type="west"}, -- External West wall outside left part of window -- No external west-wall with just glass. 121 (below) isn't finished, 120 (north above) has different lighting -- {sprite=121, height=3, type="west"}, -- External West wall with window glass (UNFINISHED?) {sprite=117, height=3, type="west"}, -- External West wall outside right part of window {sprite=123, height=3, type="west"}, -- External West wall inside {sprite=127, height=3, type="west"}, -- External West wall inside left part of window {sprite=125, height=3, type="west"}, -- External West wall inside right part of window {sprite=210, height=3, type="west"}, -- Lamp post pointing South {sprite=209, height=3, type="west"}, -- Lamp post pointing North } -- }}} -- {{{ Helipad layout. local helipad = { {sprites = { -- Dark tiles around the edges. {sprite=5, xpos=1, ypos=1, type="road"}, {sprite=5, xpos=2, ypos=1, type="road"}, {sprite=5, xpos=3, ypos=1, type="road"}, {sprite=5, xpos=4, ypos=1, type="road"}, {sprite=5, xpos=5, ypos=1, type="road"}, {sprite=5, xpos=1, ypos=2, type="road"}, {sprite=5, xpos=1, ypos=3, type="road"}, {sprite=5, xpos=1, ypos=4, type="road"}, {sprite=5, xpos=1, ypos=5, type="road"}, {sprite=5, xpos=2, ypos=5, type="road"}, {sprite=5, xpos=3, ypos=5, type="road"}, {sprite=5, xpos=4, ypos=5, type="road"}, {sprite=5, xpos=5, ypos=5, type="road"}, {sprite=5, xpos=5, ypos=2, type="road"}, {sprite=5, xpos=5, ypos=3, type="road"}, {sprite=5, xpos=5, ypos=4, type="road"}, -- Dark tiles in the 'H' {sprite=5, xpos=3, ypos=2, type="road"}, {sprite=5, xpos=3, ypos=4, type="road"}, -- Light tiles in the 'H' {sprite=4, xpos=2, ypos=2, type="road"}, {sprite=4, xpos=2, ypos=3, type="road"}, {sprite=4, xpos=2, ypos=4, type="road"}, {sprite=4, xpos=4, ypos=2, type="road"}, {sprite=4, xpos=4, ypos=3, type="road"}, {sprite=4, xpos=4, ypos=4, type="road"}, {sprite=4, xpos=3, ypos=3, type="road"} }, height=5 } } -- }}} local MAX_HEIGHT = 5 -- Biggest height in above sprites local PAGES = { {name = _S.map_editor_window.pages.inside, spr_data = inside}, {name = _S.map_editor_window.pages.outside, spr_data = outside}, {name = _S.map_editor_window.pages.foliage, spr_data = foliage}, {name = _S.map_editor_window.pages.hedgerow, spr_data = hedgerow}, {name = _S.map_editor_window.pages.pond, spr_data = pond}, {name = _S.map_editor_window.pages.road, spr_data = road}, {name = _S.map_editor_window.pages.north_wall, spr_data = north_wall}, {name = _S.map_editor_window.pages.west_wall, spr_data = west_wall}, {name = _S.map_editor_window.pages.helipad, spr_data = helipad} } -- {{{ Functions --! Normalize the editor sprite in the table to always have a 'sprites' field, as well as have sizes and a column width (for the display). --!param (table) Sprite from the 'PAGES[#].spr_data' table. --!return (table 'sprites', 'xsize', 'ysize', 'width', and 'height') local function normalizeEditSprite(spr) assert(MAX_HEIGHT >= spr.height) -- Verify that sprite fits in the maximum height. if spr.sprites == nil then -- {sprite = xxx, height = y} case return {sprites = {{sprite = spr.sprite, xpos = 1, ypos = 1, type=spr.type}}, xsize = 1, ysize = 1, type = spr.type, xorigin = 0, yorigin = 0, width = 2, height = spr.height} else -- {sprites={...}, height=y} case, compute sizes, and width local xsize = 1 local ysize = 1 local spr_type = nil for _, sp in ipairs(spr.sprites) do if sp.xpos > xsize then xsize = sp.xpos end if sp.ypos > ysize then ysize = sp.ypos end assert(not spr_type or spr_type == sp.type) -- Ensure all sprites have the same type. spr_type = sp.type end -- Position to draw (1,1) sprite, by default (0,0) -- Since sprites are drawn top to bottom, yorigin never changes. local xorigin = (ysize - 1) * 32 local yorigin = 0 local width = ysize - 1 + xsize - 1 + 2 if width < ysize then width = ysize end return {sprites = spr.sprites, xsize = xsize, ysize = ysize, type = spr_type, xorigin = xorigin, yorigin = yorigin, width = width, height = spr.height, objects = spr.objects} end end --!Decide the highest possible placement for 'width' columns. --!param cols (list int) First available position in each column, higher number is lower. --!param width (int) Required width as number of columns. --!return (int, int) Starting column and placement height. local function getHighestRowcol(cols, width) local best = cols[1] + 100000 local best_col = 0 for left = 1, #cols - width + 1 do -- Try starting in each column. if cols[left] < best then -- First column is potentially better. local top = cols[left] for i = 1, width - 1 do if top < cols[left + i] then top = cols[left + i] if top >= best then break end -- i-th column breaks improvement. end end if top < best then best = top best_col = left end end end return best_col, best end --! Layout buttons from a tab of editor sprites. --!param esprs (list) Editor sprite tab to layout. --!param num_cols (int) Number of columns available in the layout. --!return (list) Sprites with button positions in ('column', 'row'). local function layoutButtons(esprs, num_cols) local buttons = {} local cols = {} for i = 1, num_cols do cols[i] = 1 end for hgt = MAX_HEIGHT, 1, -1 do -- Fit highest sprites first. for _, espr in ipairs(esprs) do espr = normalizeEditSprite(espr) if espr.height == hgt then local spr_col, spr_height = getHighestRowcol(cols, espr.width) buttons[#buttons + 1] = espr buttons[#buttons].column = spr_col buttons[#buttons].row = spr_height for i = spr_col, spr_col + espr.width - 1 do -- Update height in the affected columns assert(cols[i] <= spr_height) cols[i] = spr_height + hgt end end end end return buttons end -- }}} -- }}} local EDITOR_WINDOW_XSIZE = 368 local EDITOR_WINDOW_YSIZE = 586 local EDITOR_COLUMNS = 10 -- Number of columns for the sprite buttons local EDITOR_COLUMN_SIZE = 32 + 3 -- Width of a sprite button in pixels local EDITOR_ROW_SIZE = 32 + 4 -- Height of a sprite button in pixels function UIMapEditor:UIMapEditor(ui) self:UIResizable(ui, EDITOR_WINDOW_XSIZE, EDITOR_WINDOW_YSIZE, col_bg) self.resizable = false self.ui = ui self.panel_sprites = self.ui.app.map.blocks -- For when there are multiple things which could be sampled from a tile, -- keep track of the index of which one was most recently sampled, so that -- next time a different one is sampled. self.sample_i = 1 -- Cursor data in the main world view. -- States: -- - disabled: Just show the cursor. -- - grid: Show an area with red rectangles (requires 'sprite' to exist). -- - left: Dragging with left mouse button is down, (leftx, lefty) defines the tile. -- - right: Dragging with right mouse button down, (rightx, righty) defines the tile. -- - both: Dragging with both left and right mouse buttons down (initiated with left -- button), (rightx, righty) defines the tile where right button got pressed. -- - delete: Like grid, with a 1x1 cursor for selecting tiles to remove walls from. -- - delete-left: Left mouse button drag of 'delete' mode. -- - parcel: Like grid, with a 1x1 cursor for selecting tiles to set the parcel. -- - parcel-left: Left mouse button drag of 'parcel' mode. -- - paste: Like grid, with a copy_xsize, copy_ysize cursor to show where to paste. -- - paste-left: Left mouse button drag of 'paste' mode. Pasting is limited to dragged -- area (which can be smaller than (copy_xsize, copy_ysize) area). -- - camera: Like grid, with a 1x1 cursor for selecting tile to set the camera -- - heliport: Like grid, with a 1x1 cursor for selecting tile to set the heliport -- -- Notes: -- - The code switches back to 'grid' or 'disabled' without waiting for all -- buttons getting released. -- - Nothing gets added in the world until you let go of a mouse button. -- - Drag detection ('is_drag') is used to allow cancel if user moves back -- to the (leftx, lefty) position. -- - The sprite decides how you can drag (none, north-south, east-west, area) -- self.cursor = { state = "disabled", -- State of the cursor. sprite = nil, -- Selected sprite from the menu. is_drag = false, -- Whether a true drag (at least 2 cells covered) has been detected. parcel = nil, -- Parcel number to set in 'parcel' / 'parcel-left' mode. camera = nil, -- Camera player to set in 'camera' mode. heliport = nil, -- Heliport player to set in 'heliport' mode. xpos = 0, -- Horizontal tile position of the mouse cursor. ypos = 0, -- Vertical tile position of the mouse cursor. leftx = 0, -- Horizontal tile position where the left-click was first detected. lefty = 0, -- Vertical tile position where the left-click was first detected. rightx = 0, -- Horizontal tile position where the right-click was first detected. righty = 0, -- Vertical tile position where the right-click was first detected. copy_data = nil, -- Data of the copied area, 'nil' if no data available. copy_xsize = 0, -- Horizontal size of the copy area. copy_ysize = 0, -- Vertical size of the copy area. } -- {{{ Creation of buttons. -- A sprite table containing a "cell outline" sprite self.cell_outline = TheApp.gfx:loadSpriteTable("Bitmap", "aux_ui", true) self:addBevelPanel(0, 0, EDITOR_WINDOW_XSIZE, EDITOR_WINDOW_YSIZE, col_bg) -- Background of the window. self.block_buttons = {} -- List of table {button = .., panel = ..} self.selected_block = nil -- Page of of block buttons currently displayed/selected. -- Make the page selection buttons local XSTART = 10 local XSIZE = 109 local YSIZE = 20 local ypos = 10 local xpos = XSTART self.page_selectbuttons = {} for _, page in ipairs(PAGES) do local name = page.name if xpos + XSIZE >= EDITOR_WINDOW_XSIZE then -- Update ypos (and xpos) if necessary. xpos = XSTART ypos = ypos + YSIZE + 2 end local p = self:addBevelPanel(xpos, ypos, XSIZE, YSIZE, col_bg) :setLabel(name):makeToggleButton(0, 0, XSIZE, YSIZE, nil, --[[persistable:map_editor_spritepage_clicked]] function() self:pageClicked(name) end) local spr_buttons = layoutButtons(page.spr_data, EDITOR_COLUMNS) local page_data = {button = p, name = name, sprite_buttons = spr_buttons} self.page_selectbuttons[#self.page_selectbuttons + 1] = page_data xpos = xpos + XSIZE + 10 end -- Make the bottom text buttons xpos = XSTART ypos = 420 local text_pages = { {name = "paste", text = _S.map_editor_window.pages.paste}, {name = "delete_wall", text = _S.map_editor_window.pages.delete_wall}, {name = "parcel_0", text = _S.map_editor_window.pages.parcel_0, parcel = 0}, {name = "parcel_1", text = _S.map_editor_window.pages.parcel_1, parcel = 1}, {name = "parcel_2", text = _S.map_editor_window.pages.parcel_2, parcel = 2}, {name = "parcel_3", text = _S.map_editor_window.pages.parcel_3, parcel = 3}, {name = "parcel_4", text = _S.map_editor_window.pages.parcel_4, parcel = 4}, {name = "parcel_5", text = _S.map_editor_window.pages.parcel_5, parcel = 5}, {name = "parcel_6", text = _S.map_editor_window.pages.parcel_6, parcel = 6}, {name = "parcel_7", text = _S.map_editor_window.pages.parcel_7, parcel = 7}, {name = "parcel_8", text = _S.map_editor_window.pages.parcel_8, parcel = 8}, {name = "parcel_9", text = _S.map_editor_window.pages.parcel_9, parcel = 9}, {name = "camera_1", text = _S.map_editor_window.pages.camera_1, camera = 1}, {name = "camera_2", text = _S.map_editor_window.pages.camera_2, camera = 2}, {name = "camera_3", text = _S.map_editor_window.pages.camera_3, camera = 3}, {name = "camera_4", text = _S.map_editor_window.pages.camera_4, camera = 4}, {name = "heliport_1", text = _S.map_editor_window.pages.heliport_1, heliport = 1}, {name = "heliport_2", text = _S.map_editor_window.pages.heliport_2, heliport = 2}, {name = "heliport_3", text = _S.map_editor_window.pages.heliport_3, heliport = 3}, {name = "heliport_4", text = _S.map_editor_window.pages.heliport_4, heliport = 4}} for _, page in ipairs(text_pages) do if xpos + XSIZE >= EDITOR_WINDOW_XSIZE then -- Update ypos (and xpos) if necessary. xpos = XSTART ypos = ypos + YSIZE + 2 end local name = page.name local p = self:addBevelPanel(xpos, ypos, XSIZE, YSIZE, col_bg) :setLabel(page.text):makeToggleButton(0, 0, XSIZE, YSIZE, nil, --[[persistable:map_editor_textpage_clicked]] function() self:pageClicked(name) end) local page_data = {button = p, name = name, data = page} self.page_selectbuttons[#self.page_selectbuttons + 1] = page_data xpos = xpos + XSIZE + 10 end self:pageClicked("") -- Initialize all above 'page_selectbuttons'. -- }}} self:setPosition(0.1, 0.1) end function UIMapEditor:setPlayerCount(count) local map = self.ui.app.map map:setPlayerCount(count) if self.cursor.state == "camera" or self.cursor.state == "heliport" then map:updateDebugOverlay() end end -- {{{ function UIMapEditor:pageClicked(name) --! Update how the button is displayed based on the provided new state. --!param button (Panel) to update. --!param action (str) New state of the button. local function updateToggleButton(button, action) if action == "raised" then button:enable(true) button:setVisible(true) button:setToggleState(false) elseif action == "lowered" then button:enable(true) button:setVisible(true) button:setToggleState(true) elseif action == "invisible" then button:enable(false) button:setVisible(false) elseif action == "disabled" then button:enable(false) button:setVisible(true) button:setToggleState(false) else assert(false) -- Should never arrive here end end --! Callback function of the page select buttons. --!param name (string) Name of the clicked page. function UIMapEditor:pageClicked(name) local map = self.ui.app.map if name == "paste" then -- Make 'paste' button non-selectable if there is no data to paste. name = self.cursor.copy_data and name or "" else self.cursor.copy_data = nil -- Delete copied area when selecting another item. end for _, pb in ipairs(self.page_selectbuttons) do if pb.name == name then map:clearDebugText() self.cursor.state = name == "paste" and "paste" or "disabled" updateToggleButton(pb.button, "lowered") if pb.sprite_buttons then -- 'sprite' button, display sprites to select from, by the user. self:buildSpriteButtons(pb.sprite_buttons) else -- 'text' button, switch cursor to the right mode directly. self:buildSpriteButtons({}) if pb.name == "delete_wall" then self.cursor.state = "delete" self.cursor.sprite = nil self.cursor.is_drag = false elseif pb.name == "paste" then self.cursor.state = "paste" self.cursor.sprite = nil self.cursor.is_drag = false elseif pb.data.camera then self.cursor.state = "camera" self.cursor.spirte = nil self.cursor.is_drag = false self.cursor.camera = pb.data.camera map:loadDebugText("camera") elseif pb.data.heliport then self.cursor.state = "heliport" self.cursor.spirte = nil self.cursor.is_drag = false self.cursor.heliport = pb.data.heliport map:loadDebugText("heliport") else -- Should be a parcel button. assert(pb.data.parcel) self.cursor.state = "parcel" self.cursor.sprite = nil self.cursor.is_drag = false self.cursor.parcel = pb.data.parcel map:loadDebugText("parcel") end end elseif pb.name == "paste" and not self.cursor.copy_data then updateToggleButton(pb.button, "disabled") else updateToggleButton(pb.button, "raised") end end end --! Do layout of the sprite buttons of the page. function UIMapEditor:buildSpriteButtons(buttons) self.selected_block = buttons local XBASE = 10 local YBASE = 83 local number = 1 for _, button in ipairs(buttons) do local xpos = XBASE + (button.column - 1) * EDITOR_COLUMN_SIZE local ypos = YBASE + (button.row - 1) * EDITOR_ROW_SIZE local width = EDITOR_COLUMN_SIZE * button.width - 2 local height = EDITOR_ROW_SIZE * button.height - 2 local pb = self.block_buttons[number] if pb == nil then -- New sprite button needed local bbutton_number = number local bbutton = self:addBevelPanel(xpos, ypos, width, height, col_bg) bbutton = bbutton:makeToggleButton(0, 0, width, height, nil, --[[persistable:map_editor_block_clicked]] function() self:blockClicked(bbutton_number) end) updateToggleButton(bbutton, "raised") local bpanel = self:addPanel(number, xpos+1, ypos+1, width-2, height-2) bpanel.visible = true bpanel.editor_button = button bpanel.custom_draw = --[[persistable:map_editor_draw_block_sprite]] function(panel, canvas, x, y) x = x + panel.x + panel.editor_button.xorigin y = y + panel.y + panel.editor_button.yorigin for _, spr in ipairs(panel.editor_button.sprites) do local xspr = x + (spr.xpos - spr.ypos) * 32 local yspr = y + (spr.xpos + spr.ypos) * 16 - 32 panel.window.panel_sprites:draw(canvas, spr.sprite % 256, xspr, yspr, math.floor(spr.sprite / 256)) end end self.block_buttons[#self.block_buttons + 1] = {button=bbutton, panel=bpanel} else -- Reposition & resize existing sprite button local bbutton = pb.button bbutton:setPosition(xpos, ypos) bbutton:setSize(width, height) updateToggleButton(bbutton, "raised") local bpanel = pb.panel bpanel.editor_button = button bpanel:setPosition(xpos+1, ypos+1) bpanel:setSize(width-2, height-2) bpanel:setVisible(true) end number = number + 1 end -- Make remaining buttons and panels invisible. while true do local pb = self.block_buttons[number] if pb == nil then break end updateToggleButton(pb.button, "invisible") pb.panel.visible = false number = number + 1 end end -- }}} --! Should the given type of sprite be considered a floor sprite? --!param sprite_type (string) Type of sprite. --!return The (boolean) type is a floor sprite type. local function isFloorSpriteType(sprite_type) return sprite_type == "floor" or sprite_type == "hospital" or sprite_type == "road" end --! Construct cell flags for a given kind of floor sprite. --!param sprite_type (string) Type of sprite. local function makeCellFlags(sprite_type) if sprite_type == "floor" then return {buildable=false, passable=false, hospital=false} elseif sprite_type == "road" then return {buildable=false, passable=true, hospital=false} elseif sprite_type == "hospital" then return {buildable=true, passable=true, hospital=true} end assert(false) -- Should never get here end --! Get the tile area covered by two points. --!param x1 (jnt) Horizontal coordinate of the first point. --!param y1 (int) Vertical coordinate of the first point. --!param x2 (jnt) Horizontal coordinate of the second point. --!param y2 (int) Vertical coordinate of the second point. --!return (4 int) Smallest horizontal, smallest vertical, largest horizontal, -- and largest vertical coordinate. local function getCoveredArea(x1, y1, x2, y2) local minx, maxx, miny, maxy if x1 < x2 then minx, maxx = x1, x2 else minx, maxx = x2, x1 end if y1 < y2 then miny, maxy = y1, y2 else miny, maxy = y2, y1 end return minx, miny, maxx, maxy end --! Get the size of an area covered by two points. --!param x1 (jnt) Horizontal coordinate of the first point. --!param y1 (int) Vertical coordinate of the first point. --!param x2 (jnt) Horizontal coordinate of the second point. --!param y2 (int) Vertical coordinate of the second point. --!return (2 int) Horizontal and vertical size of the area. local function getAreaSize(x1, y1, x2, y2) local minx, miny, maxx, maxy = getCoveredArea(x1, y1, x2, y2) return maxx - minx + 1, maxy - miny + 1 end --! Test whether (px, py) is inside the given area. --!param px (int) Horizontal coordinate of the point to test. --!param py (int) Vertical coordinate of the point to test. --!param minx (jnt) Smallest horizontal coordinate of the area. --!param miny (int) Smallest vertical coordinate of the area. --!param maxx (jnt) Largest horizontal coordinate of the area. --!param maxy (int) Largest vertical coordinate of the area. --!return (bool) Whether the point is inside the given area. local function isPointInside(px, py, minx, miny, maxx, maxy) return px >= minx and px <= maxx and py >= miny and py <= maxy end --! Compute x/y pairs to draw the cursor sprite over the area. --!param minx (int) First horizontal position to draw the sprite. --!param miny (int) First vertical position to draw the sprite. --!param maxx (int) Last horizontal position to draw the sprite. --!param maxy (int) Last vertical position to draw the sprite. --!param dx (nil or int) Horizontal step size of drawing, usually same size as -- the width of the sprite being drawn, default is 1. --!param dy (nil or int) Vertical step size of drawing, usually same size as -- the height of the sprite being drawn, default is 1. --!return (array of (xpos, ypos) pairs) Points to draw the sprite cursor. local function computeCursorSpriteAtArea(minx, miny, maxx, maxy, dx, dy) local coords = {} if not dx or not dy then dx, dy = 1, 1 end assert(dx > 0 and dy > 0) local xbase, ybase xbase = minx while xbase <= maxx do ybase = miny while ybase <= maxy do coords[#coords + 1] = {xpos = xbase, ypos = ybase} ybase = ybase + dy end xbase = xbase + dx end return coords end --! Compute the positions to draw the selected sprite in the world. --!return (array of {xpos, ypos} tables) Coordinates to draw the selected sprite. function UIMapEditor:getDrawPoints() if self.cursor.state == "disabled" then -- Nothing to compute, drop to bottom {} return. elseif self.cursor.state == "grid" then local bx, by = self:areaOnWorld(self.cursor.xpos, self.cursor.ypos, self.cursor.sprite.xsize, self.cursor.sprite.ysize) return {{xpos = bx, ypos = by}} elseif self.cursor.state == "delete" or self.cursor.state == "parcel" or self.cursor.state == "camera" or self.cursor.state == "heliport" or self.cursor.state == "paste" then return {{xpos = self.cursor.xpos, ypos = self.cursor.ypos}} elseif self.cursor.state == "left" then -- Simple drag (left button only). local minx, miny, maxx, maxy = getCoveredArea(self.cursor.leftx, self.cursor.lefty, self.cursor.xpos, self.cursor.ypos) if minx ~= maxx or miny ~= maxy or not self.cursor.is_drag then -- Just 1 tile without starting a drag, or an area of at least two tiles. return computeCursorSpriteAtArea(minx, miny, maxx, maxy, self.cursor.sprite.xsize, self.cursor.sprite.ysize) end elseif self.cursor.state == "delete-left" or self.cursor.state == "parcel-left" or self.cursor.state == "paste-left" then local minx, miny, maxx, maxy = getCoveredArea(self.cursor.leftx, self.cursor.lefty, self.cursor.xpos, self.cursor.ypos) if minx ~= maxx or miny ~= maxy or not self.cursor.is_drag then -- Just 1 tile without starting a drag, or an area of at least two tiles. return computeCursorSpriteAtArea(minx, miny, maxx, maxy, 1, 1) end elseif self.cursor.state == "right" then local minx, miny, maxx, maxy = getCoveredArea(self.cursor.rightx, self.cursor.righty, self.cursor.xpos, self.cursor.ypos) if minx ~= maxx or miny ~= maxy or not self.cursor.is_drag then -- Just 1 tile without starting a drag, or an area of at least two tiles. return computeCursorSpriteAtArea(minx, miny, maxx, maxy, 1, 1) end elseif self.cursor.state == "both" then -- left+right drag (left initiated). -- Area is defined from first to last point, 'right' point must be inside the area. local minx, miny, maxx, maxy = getCoveredArea(self.cursor.leftx, self.cursor.lefty, self.cursor.xpos, self.cursor.ypos) if minx ~= maxx or miny ~= maxy then -- Otherwise area is 1x1, either due to 'cancel', or never enlarged. if isPointInside(self.cursor.rightx, self.cursor.righty, minx, miny, maxx, maxy) then -- Get block size between left and right click. local dx, dy = getAreaSize(self.cursor.leftx, self.cursor.lefty, self.cursor.rightx, self.cursor.righty) if dx > 1 or dy > 1 then -- Otherwise, left and right click is in the same tile. return computeCursorSpriteAtArea(minx, miny, maxx, maxy, dx, dy) end end end end return {} end --! Fill an area of tiles with red cursor rectangles. Caller must make sure that -- the area is completely inside the world boundaries. --!param canvas Canvas to draw at. --!param xpos (int) Horizontal base tile position (of the top corner). --!param ypos (int) Vertical base tile position (of the top corner). --!param xsize (int) Horizontal size in tiles. --!param ysize (int) Vertical size in tiles. function UIMapEditor:fillCursorArea(canvas, xpos, ypos, xsize, ysize) local ui = self.ui local zoom = ui.zoom_factor for x = 0, xsize - 1 do for y = 0, ysize - 1 do local xcoord, ycoord = ui:WorldToScreen(xpos + x, ypos + y) self.cell_outline:draw(canvas, 2, math.floor(xcoord / zoom) - 32, math.floor(ycoord / zoom)) end end end --! Draw the display (map editor window, and main world display) --!param canvas (draw object) Canvas to draw on. function UIMapEditor:draw(canvas, ...) local ui = self.ui -- Draw the red grid for the selected tile. local coords = self:getDrawPoints() if #coords ~= 0 then -- Get size of the cursor. local xsize, ysize if self.cursor.state == "delete" or self.cursor.state == "delete-left" or self.cursor.state == "parcel" or self.cursor.state == "parcel-left" or self.cursor.state == "heliport" or self.cursor.state == "camera" or self.cursor.state == "paste-left" or self.cursor.state == "right" then xsize, ysize = 1, 1 elseif self.cursor.state == "paste" then xsize, ysize = self.cursor.copy_xsize, self.cursor.copy_ysize else xsize, ysize = self.cursor.sprite.xsize, self.cursor.sprite.ysize end -- Draw cursors. local scaled = canvas:scale(ui.zoom_factor) for _, coord in ipairs(coords) do local xpos, ypos = coord.xpos, coord.ypos self:fillCursorArea(canvas, xpos, ypos, xsize, ysize) end if scaled then canvas:scale(1) end end UIResizable.draw(self, canvas, ...) end -- {{{ several useful functions --! User clicked at a block (a button with a sprite). --!param num Index block number. function UIMapEditor:blockClicked(num) -- Reset toggle of other block buttons. for bnum = 1, #self.block_buttons do if bnum ~= num then self.block_buttons[bnum].button:setToggleState(false) end end if self.block_buttons[num].button.toggled then local sprite = self.selected_block[num] self.cursor.state = "grid" self.cursor.sprite = {xsize = sprite.xsize, ysize = sprite.ysize, sprites = sprite.sprites, objects = sprite.objects, type = sprite.type} else self.cursor.state = "disabled" self.cursor.sprite = nil end end --! Convert mouse coordinates to tile coordinates in the world. --!param mx (int) Mouse X screen coordinate. --!param my (int) Mouse y screen coordinate. --!return (int, int) Tile x,y coordinates, limited to the map. function UIMapEditor:mouseToWorld(mx, my) local ui = self.ui local wxr, wyr = ui:ScreenToWorld(self.x + mx, self.y + my) local wx = math.floor(wxr) local wy = math.floor(wyr) return self:areaOnWorld(wx, wy, 1, 1) end --! Stay on world with the entire area, by moving the base position (if needed). --!param xpos (int) Horizontal base position. --!param ypos (int) Vertical base position. --!param xsize (int) Horizontal size. --!param ysize (int) Vertical size. --!return (int, int) Allowed base position function UIMapEditor:areaOnWorld(xpos, ypos, xsize, ysize) local map = self.ui.app.map xpos = math.min(math.max(xpos, 1), map.width - xsize + 1) ypos = math.min(math.max(ypos, 1), map.height - ysize + 1) return xpos, ypos end -- }}} --! Retrieve what drag capabilities are allowed by the currently selected world cursor sprite. --!return (string) "none"=not draggable, "east-west"=dragging only in east-west direction, -- "north-south"=dragging only in north-south direction, "area"=dragging in both directions. function UIMapEditor:getCursorDragCapabilities() -- Parcel and delete modes have unrestricted movement. if self.cursor.state == "delete" or self.cursor.state == "delete-left" or self.cursor.state == "parcel" or self.cursor.state == "parcel-left" or self.cursor.state == "paste" or self.cursor.state == "paste-left" or self.cursor.state == "right" then return "area" end -- No sprite, or not a 1x1 size -> not draggable. if not self.cursor.sprite then return "none" end if self.cursor.sprite.xsize ~= 1 or self.cursor.sprite.ysize ~= 1 then return "none" end if isFloorSpriteType(self.cursor.sprite.type) then return "area" end if self.cursor.sprite.type == "north" then return "east-west" end if self.cursor.sprite.type == "west" then return "north-south" end assert(false) -- Should never get here end --! The user moved the mouse! --!param x (int) New horizontal position of the mouse at the screen. --!param y (int) New vertical position of the mouse at the screen. --!param dx (int) Horizontal shift in position of the mouse at the screen. --!param dy (int) Vertical shift in position of the mouse at the screen. function UIMapEditor:onMouseMove(x, y, dx, dy) local repaint = UIResizable.onMouseMove(self, x, y, dx, dy) -- Update the stored state of cursor position, and trigger a repaint as the -- cell outline sprite should track the cursor position. local wx, wy = self:mouseToWorld(x, y) if wx ~= self.cursor.xpos or wy ~= self.cursor.ypos then if self.cursor.state == "disabled" then self.cursor.xpos = wx -- Nothing is displayed, just keep track of the position. self.cursor.ypos = wy return repaint elseif self.cursor.state == "grid" or self.cursor.state == "delete" or self.cursor.state == "parcel" or self.cursor.state == "paste" or self.cursor.state == "heliport" or self.cursor.state == "camera" or self.cursor.state == "right" then self.cursor.xpos = wx -- Allow arbitrary movement. self.cursor.ypos = wy return true else -- Dragging in some mode. self.cursor.is_drag = true -- Crossing a tile boundary implies 'real' dragging. -- Update wx and wy according to drag capabilities. local cap = self:getCursorDragCapabilities() if cap == "north-south" then wx = self.cursor.leftx elseif cap == "east-west" then wy = self.cursor.lefty elseif cap == "none" then wx, wy = self.cursor.leftx, self.cursor.lefty -- Block all movement. end repaint = repaint or self.cursor.xpos ~= wx or self.cursor.ypos ~= wy self.cursor.xpos = wx self.cursor.ypos = wy return repaint end end end --! Mouse button got pressed. --!param button (string) Mouse button being pressed. --!param xpos (int) Horizontal position of the mouse at the time of the mouse button press. --!param ypos (int) Vertical position of the mouse at the time of the mouse button press. --!return (bool) Whether to repaint the display. function UIMapEditor:onMouseDown(button, xpos, ypos) if UIResizable.onMouseDown(self, button, xpos, ypos) then -- Button in this window. return true end if self:hitTest(xpos, ypos) then -- Clicked elsewhere in the window. return true end local repaint = false if self.cursor.state == "disabled" then if button == "right" then self.cursor.state = "right" self.cursor.rightx = self.cursor.xpos self.cursor.righty = self.cursor.ypos end elseif self.cursor.state == "grid" then -- LMB down switches to 'left' if button == "left" then self.cursor.state = "left" self.cursor.leftx = self.cursor.xpos self.cursor.lefty = self.cursor.ypos -- RMB down switches to 'right' elseif button == "right" then self.cursor.state = "right" self.cursor.rightx = self.cursor.xpos self.cursor.righty = self.cursor.ypos end -- Since 'grid' already shows the red rectangles, nothing changes visually. elseif self.cursor.state == "delete" then if button == "left" then self.cursor.state = "delete-left" self.cursor.leftx = self.cursor.xpos self.cursor.lefty = self.cursor.ypos elseif button == "right" then self.cursor.state = "right" self.cursor.rightx = self.cursor.xpos self.cursor.righty = self.cursor.ypos end elseif self.cursor.state == "parcel" then if button == "left" then self.cursor.state = "parcel-left" self.cursor.leftx = self.cursor.xpos self.cursor.lefty = self.cursor.ypos elseif button == "right" then self.cursor.state = "right" self.cursor.rightx = self.cursor.xpos self.cursor.righty = self.cursor.ypos end elseif self.cursor.state == "left" then -- If RMB is down, switch to 'both'. if button == "right" then self.cursor.state = "both" self.cursor.rightx = self.cursor.xpos self.cursor.righty = self.cursor.ypos repaint = true end elseif self.cursor.state == "right" then -- Ignore all down buttons, until RMB is released. elseif self.cursor.state == "paste" then if button == "left" then self.cursor.state = "paste-left" self.cursor.leftx = self.cursor.xpos self.cursor.lefty = self.cursor.ypos elseif button == "right" then self.cursor.state = "right" self.cursor.rightx = self.cursor.xpos self.cursor.righty = self.cursor.ypos end -- "both", "delete-left", "parcel-left", "paste-left" do not handle buttons. end return repaint end --! Add an object to the map. Currently, only "entrance_door" is supported. --!param obj_type (str) Type of object ("entrance_door") --!param xpos (int) Desired x position of the new object. --!param ypos (int) Desired y position of the new object. --!param direction (str) Direction of the new object ("north" or "west"). function UIMapEditor:drawObject(obj_type, xpos, ypos, direction) local world = self.ui.app.world -- TheApp.objects[name].thob -- name = world.object_id_by_thob[thob] -- generic object = world.object_types[object_id] -- instance: world:getObject(x, y, name) if obj_type == "entrance_door" then world:newObject("entrance_right_door", xpos, ypos, direction) if direction == "north" then world:newObject("entrance_left_door", xpos - 1, ypos, direction) else world:newObject("entrance_left_door", xpos, ypos - 1, direction) end end end --! Remove an entrance door from the world. --!param door Entrance door to remove. function UIMapEditor:removeDoor(door) local world = self.ui.app.world world:destroyEntity(door) if door.slave then world:destroyEntity(door.slave) end end --! Collect other objects that use the space needed for the specified new object. -- If they exist, return them or delete them. --!param obj_type (str) Type of object ("entrance_door") --!param xpos (int) Desired x position of the new object. --!param ypos (int) Desired y position of the new object. --!param direction (str) Direction of the new object ("north" or "west"). --!param remove (bool) If set, remove the found objects. --!return (list) The objects that use the space, if they are not removed. function UIMapEditor:checkObjectSpace(obj_type, xpos, ypos, direction, remove) local world = self.ui.app.world local right_door = world.object_types["entrance_right_door"] local left_door = world.object_types["entrance_left_door"] local th = self.ui.app.map.th --! Check single tile for conflicts with other doors. --!param x X position of the tile to check. --!param y Y position of the tile to check. --!return (int, int) position of the conflicting door, or (nil, nil) if no conflict. local function checkTile(x, y) local all_flags = th:getCellFlags(x, y) if not all_flags.thob then return nil, nil elseif all_flags.thob == right_door.thob then return x, y elseif all_flags.thob == left_door.thob then if all_flags.tallWest then return x, y + 1 else return x + 1, y end end return nil, nil end -- While the general intention is 'objects', the only object that can exist -- and is handled here is the entrance door. assert(obj_type == "entrance_door") local doors = {} local x, y = checkTile(xpos, ypos) if x then doors[#doors + 1] = world:getObject(x, y, "entrance_right_door") end local x2, y2 if direction == "north" then x2, y2 = checkTile(xpos - 1, ypos) else x2, y2 = checkTile(xpos, ypos - 1) end if x2 and (x2 ~= x or y2 ~= y) then doors[#doors + 1] = world:getObject(x2, y2, "entrance_right_door") end if remove then for _, door in ipairs(doors) do self:removeDoor(door) end return end return doors end --! Recognize objects in the collection of thob+tallWest entries --!param minx (int) Base horizontal position (objects should be put relative to it). --!param miny (int) Base vertical position (objects should be put relative to it). --!param thobdir_positions (table xy to {thob, tallWest}) Found thobs. --!return (array of {type, xpos, ypos, direction}) Found objects. function UIMapEditor:findObjects(minx, miny, thobdir_positions) local world = self.ui.app.world local right_door = world.object_types["entrance_right_door"] local left_door = world.object_types["entrance_left_door"] local objects = {} -- Found objects ordered by position. -- Look for right entrance door. for xy_right, thobdir_right in pairs(thobdir_positions) do if right_door.thob == thobdir_right.thob then -- Found right door, is there a matching left door? local xy_left = thobdir_right.tallWest and xy_right - 256 or xy_right - 1 local thobdir_left = thobdir_positions[xy_left] if thobdir_left and thobdir_left.thob == left_door.thob and thobdir_left.tallWest == thobdir_right.tallWest then local obj = {type="entrance_door", xpos = xy_right % 256 - minx + 1, ypos = math.floor(xy_right / 256) - miny + 1, direction=thobdir_right.tallWest and "west" or "north"} objects[#objects + 1] = obj end end end return objects end --! Draw the selected sprite at the given coordinates. --!param coords (array or {xpos, ypos} tables) Coordinates to draw the selected sprite. function UIMapEditor:drawCursorSpriteAtArea(coords) local th = self.ui.app.map.th if self.cursor.sprite then for _, coord in ipairs(coords) do local xbase, ybase = coord.xpos, coord.ypos -- Draw the selected sprite. xbase, ybase = self:areaOnWorld(xbase, ybase, self.cursor.sprite.xsize, self.cursor.sprite.ysize) for _, spr in ipairs(self.cursor.sprite.sprites) do local tx, ty = xbase + spr.xpos - 1, ybase + spr.ypos - 1 local f, nw, ww = th:getCell(tx, ty) -- floor, north-wall, west-wall (, ui) if isFloorSpriteType(spr.type) then f = spr.sprite -- Floor sprite gets changed, also modify the cell flags. th:setCellFlags(tx, ty, makeCellFlags(spr.type)) elseif spr.type == "north" then nw = spr.sprite elseif spr.type == "west" then ww = spr.sprite end th:setCell(tx, ty, f, nw, ww, 0) end -- Draw the objects if self.cursor.sprite.objects then for _, obj in ipairs(self.cursor.sprite.objects) do local tx, ty = xbase + obj.xpos - 1, ybase + obj.ypos - 1 self:drawObject(obj.type, tx, ty, obj.direction) end end end end end --! Copy area from the game. --!return (bool) Whether copying succeeded. function UIMapEditor:copyArea() local th = self.ui.app.map.th local minx, miny, maxx, maxy = getCoveredArea(self.cursor.rightx, self.cursor.righty, self.cursor.xpos, self.cursor.ypos) if minx == maxx and miny == maxy and self.is_drag then return false -- Canceled drag end local thobdir_positions = {} -- Copy data. self.cursor.copy_data = {} self.cursor.copy_xsize = maxx - minx + 1 self.cursor.copy_ysize = maxy - miny + 1 local tx, ty tx = minx while tx <= maxx do ty = miny while ty <= maxy do local f, nw, ww = th:getCell(tx, ty) local all_flags = th:getCellFlags(tx, ty) self.cursor.copy_data[#self.cursor.copy_data + 1] = { xpos = tx - minx, ypos = ty - miny, floor = f, north_wall = nw, west_wall = ww, flags = {buildable = all_flags.buildable, passable = all_flags.passable, hospital = all_flags.hospital}, } if all_flags.thob and all_flags.thob ~= 0 then thobdir_positions[tx + 256 * ty] = {thob = all_flags.thob, tallWest = all_flags.tallWest} end ty = ty + 1 end tx = tx + 1 end self.cursor.copy_objects = self:findObjects(minx, miny, thobdir_positions) return true end --! Paste copied area into the destination area (one or more times). function UIMapEditor:pasteArea() local th = self.ui.app.map.th local minx, miny, maxx, maxy -- Fill 'minx', 'miny' with the non-cursor corner. if self.cursor.leftx == self.cursor.xpos and self.cursor.lefty == self.cursor.ypos then if self.is_drag then return -- Canceled paste area. end minx = self.cursor.xpos + self.cursor.copy_xsize - 1 miny = self.cursor.ypos + self.cursor.copy_ysize - 1 minx, miny = self:areaOnWorld(minx, miny, 1, 1) else minx = self.cursor.leftx miny = self.cursor.lefty end minx, miny, maxx, maxy = getCoveredArea(minx, miny, self.cursor.xpos, self.cursor.ypos) -- Copy area in 'sub-areas' of (self.cursor.copy_xsize, self.cursor.copy_ysize). local tx, ty tx = minx while tx <= maxx do ty = miny while ty <= maxy do -- Copy floor and wall sprites, and set the passable/buildable/hospital flag. for _, elm in ipairs(self.cursor.copy_data) do local x, y = tx + elm.xpos, ty + elm.ypos if x <= maxx and y <= maxy then th:setCell(x, y, elm.floor, elm.north_wall, elm.west_wall, 0) th:setCellFlags(x, y, elm.flags) end end -- Make room for the new objects. for _, obj in ipairs(self.cursor.copy_objects) do local x, y = tx + obj.xpos - 1, ty + obj.ypos - 1 if x <= maxx and y <= maxy then self:checkObjectSpace(obj.type, x, y, obj.direction, true) end end -- Paste the objects of the copied area. for _, obj in ipairs(self.cursor.copy_objects) do local x, y = tx + obj.xpos - 1, ty + obj.ypos - 1 if x <= maxx and y <= maxy then self:drawObject(obj.type, x, y, obj.direction) end end ty = ty + self.cursor.copy_ysize end tx = tx + self.cursor.copy_xsize end end --! Delete the walls at the given coordinates. --!param coords (array or {xpos, ypos} tables) Coordinates to remove the walls. function UIMapEditor:deleteWallsAtArea(coords) local th = self.ui.app.map.th local thobdir_positions = {} -- Storage for found objects. for _, coord in ipairs(coords) do local tx, ty = coord.xpos, coord.ypos -- Remove west and north wall. local f = th:getCell(tx, ty) -- floor (, north-wall, west-wall , ui) th:setCell(tx, ty, f, 0, 0, 0) -- No need for map:setCellFlags, as 'passable', 'buildable', and 'hospital' are floor properties. -- Collect thobs, to remove next. local all_flags = th:getCellFlags(tx, ty) if all_flags.thob ~= 0 then thobdir_positions[tx + ty * 256] = {thob=all_flags.thob, tallWest=all_flags.tallWest} end end -- Remove objects from the area. local objects = self:findObjects(1, 1, thobdir_positions) -- Uses absolute position for the objects for _, obj in ipairs(objects) do self:checkObjectSpace(obj.type, obj.xpos, obj.ypos, obj.direction, true) end end --! Set parcel number at the given coordinates. --!param coords (array or {xpos, ypos} tables) Coordinates to set parcel. --!param parcel_num (int) Parcel number to set. function UIMapEditor:setParcelAtArea(coords, parcel_num) local th = self.ui.app.map.th for _, coord in ipairs(coords) do local tx, ty = coord.xpos, coord.ypos th:setCellFlags(tx, ty, {parcelId = parcel_num}) end end --! Mouse button was released. --!param button (string) Mouse button being released. --!param x (int) Horizontal position of the mouse at the time of the mouse button release. --!param y (int) Vertical position of the mouse at the time of the mouse button release. --!return (bool) Whether to repaint the display. function UIMapEditor:onMouseUp(button, x, y) local map = self.ui.app.map if UIResizable.onMouseUp(self, button, x, y) then return true end if self:hitTest(x, y) then return true end --! Get the cursor mode to jump to after ending the drag mode. --!return (string) New cursor mode. local function newState() if self.cursor.sprite then return "grid" else return "disabled" end end local repaint = false if self.cursor.state == "disabled" then -- Don't care about buttons. elseif self.cursor.state == "left" then if button == "left" then -- Simple drag (left button only). self:drawCursorSpriteAtArea(self:getDrawPoints()) self.cursor.state = newState() self.cursor.is_drag = false repaint = true end elseif self.cursor.state == "delete-left" then if button == "left" then self:deleteWallsAtArea(self:getDrawPoints()) self.cursor.state = "delete" self.cursor.is_drag = false repaint = true end elseif self.cursor.state == "parcel-left" then if button == "left" then self:setParcelAtArea(self:getDrawPoints(), self.cursor.parcel) map:updateDebugOverlay() self.cursor.state = "parcel" self.cursor.is_drag = false repaint = true end elseif self.cursor.state == "camera" then if button == "left" then local dp = self:getDrawPoints() map:setCameraTile(dp[1].xpos, dp[1].ypos, self.cursor.camera) map:updateDebugOverlay() repaint = true end elseif self.cursor.state == "heliport" then if button == "left" then local dp = self:getDrawPoints() map:setHeliportTile(dp[1].xpos, dp[1].ypos, self.cursor.heliport) map:updateDebugOverlay() repaint = true end elseif self.cursor.state == "right" then if button == "right" then if self:copyArea() then self.cursor.state = "paste" self:pageClicked("paste") self.cursor.is_drag = false repaint = true else self.cursor.state = "disabled" -- Copy area was canceled. self.cursor.is_drag = false repaint = true end end elseif self.cursor.state == "paste-left" then if button == "left" then self.cursor.state = "paste" self.cursor.is_drag = false repaint = true self:pasteArea() end elseif self.cursor.state == "both" then if button == "left" then -- Only care about left button. -- left+right drag ends. self:drawCursorSpriteAtArea(self:getDrawPoints()) self.cursor.state = newState() self.cursor.is_drag = false repaint = true end -- "grid", "delete", "parcel", and "paste" already assumed no buttons pushed, -- ignore event. end return repaint end CorsixTH-0.63/CorsixTH/Lua/dialogs/resizables/menu_list_dialog.lua000066400000000000000000000110561347163623700252160ustar00rootroot00000000000000--[[ Copyright (c) 2010 Manuel "Roujin" Wolf 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. --]] --! A menu list with a scrollbar. Used by load_game, save_game and custom_game. class "UIMenuList" (UIResizable) ---@type UIMenuList local UIMenuList = _G["UIMenuList"] local col_caption = { red = 174, green = 166, blue = 218, } local col_scrollbar = { red = 164, green = 156, blue = 208, } --[[ Constructs the menu list dialog. !param ui (UI) The active ui. !param mode (string) Either "menu" or "game" depending on which mode the game is in right now. !param title (string) The desired title of the dialog. !param items (table) A list of items to include in the list. Each listing should be a table with keys "name" and "tooltip" with the corresponding values. !param num_rows (integer) The number of rows displayed at a given time. Default is 10. !param extra_beside_list (integer) How much space, if any, the dialog will need to the right of the list, e.g. information space. ]] function UIMenuList:UIMenuList(ui, mode, title, items, num_rows, extra_beside_list) self.col_bg = { red = 154, green = 146, blue = 198, } extra_beside_list = extra_beside_list or 0 self:UIResizable(ui, 280 + extra_beside_list, 270, self.col_bg) self.default_button_sound = "selectx.wav" self.items = items self.num_rows = num_rows and num_rows or 10 self.mode = mode self.modal_class = mode == "menu" and "main menu" or "saveload" self.on_top = mode == "menu" self.esc_closes = true self.resizable = false self:setDefaultPosition(0.5, 0.25) self:addBevelPanel(20, 10, 240, 20, col_caption):setLabel(title).lowered = true local scrollbar_base = self:addBevelPanel(240, 40, 20, self.num_rows * 17, self.col_bg) scrollbar_base.lowered = true self.scrollbar = scrollbar_base:makeScrollbar(col_scrollbar, --[[persistable:menu_list_scrollbar_callback]] function() self:updateButtons() end, 1, math.max(#items, 1), self.num_rows) local function button_clicked(num) return --[[persistable:menu_list_button]] function(window) window:buttonClicked(num) end end self.item_panels = {} self.item_buttons = {} for num = 1, self.num_rows do self.item_panels[num] = self:addBevelPanel(20, 40 + (num - 1) * 17, 210, 17, self.col_bg):setLabel(nil, nil, "center") self.item_buttons[num] = self.item_panels[num]:makeButton(0, 0, 220, 17, nil, button_clicked(num)) end self:addBevelPanel(20, 220, 240, 40, self.col_bg):setLabel(_S.menu_list_window.back) :makeButton(0, 0, 240, 40, nil, self.buttonBack):setTooltip(_S.tooltip.menu_list_window.back) self:updateButtons() end function UIMenuList:getSavedWindowPositionName() if self.mode == "menu" then return "main_menu_group" end return UIResizable.getSavedWindowPositionName(self) end -- Function stub for dialogs to override. This function is called each time a button is clicked. --!param num (integer) Number of the button pressed. function UIMenuList:buttonClicked(num) end -- Updates buttons when scrolling. function UIMenuList:updateButtons() for num = 1, self.num_rows do local panel = self.item_panels[num] local button = self.item_buttons[num] local item = self.items[num + self.scrollbar.value - 1] if item then panel:setLabel(item.name) panel:setTooltip(item.tooltip) button:enable(true) else panel:setLabel() panel:setTooltip() button:enable(false) end end end function UIMenuList:buttonBack() self:close() end function UIMenuList:close() UIResizable.close(self) if self.mode == "menu" then self.ui:addWindow(UIMainMenu(self.ui)) end end CorsixTH-0.63/CorsixTH/Lua/dialogs/resizables/menu_list_dialogs/000077500000000000000000000000001347163623700246735ustar00rootroot00000000000000CorsixTH-0.63/CorsixTH/Lua/dialogs/resizables/menu_list_dialogs/custom_campaign.lua000066400000000000000000000111411347163623700305450ustar00rootroot00000000000000--[[ Copyright (c) 2014 Edvin "Lego3" Linge 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. --]] local pathsep = package.config:sub(1, 1) --! Custom Campaign Window class "UICustomCampaign" (UIMenuList) ---@type UICustomCampaign local UICustomCampaign = _G["UICustomCampaign"] local col_scrollbar = { red = 164, green = 156, blue = 208, } local details_width = 280 --! Collect the campaign levels at the provided path --!param path (str) File system path to search. --!return (array) The found levels, with some basic information about each level. local function createCampaignList(path) local campaigns = {} for file in lfs.dir(path) do if file:match"%.campaign$" then local campaign_info, err = TheApp:readCampaignFile(file) if not campaign_info then print(err) else if campaign_info.levels and #campaign_info.levels > 0 then campaigns[#campaigns + 1] = { name = campaign_info.name, tooltip = _S.tooltip.custom_campaign_window.choose_campaign, no_levels = #campaign_info.levels, path = file, description = campaign_info.description, } else print("Warning: Loaded campaign that had no levels specified") end end end end return campaigns end function UICustomCampaign:UICustomCampaign(ui) self.label_font = TheApp.gfx:loadFont("QData", "Font01V") local local_path = debug.getinfo(1, "S").source:sub(2, -61) local dir = "Campaigns" .. pathsep local path = local_path .. dir local campaigns = createCampaignList(path) self:UIMenuList(ui, "menu", _S.custom_campaign_window.caption, campaigns, 10, details_width + 40) -- Create a toolbar ready to be used if the description for a level is -- too long to fit local scrollbar_base = self:addBevelPanel(560, 40, 20, self.num_rows*17, self.col_bg) scrollbar_base.lowered = true self.details_scrollbar = scrollbar_base:makeScrollbar(col_scrollbar, --[[persistable:campaign_details_scrollbar_callback]] function() self:updateDescriptionOffset() end, 1, 1, self.num_rows) self.description_offset = 0 -- Finally the load button self:addBevelPanel(420, 220, 160, 40, self.col_bg) :setLabel(_S.custom_campaign_window.start_selected_campaign) :makeButton(0, 0, 160, 40, 11, self.buttonStartCampaign) :setTooltip(_S.tooltip.custom_campaign_window.start_selected_campaign) end -- Overrides the function in the UIMenuList, choosing what should happen when the player -- clicks a choice in the list. function UICustomCampaign:buttonClicked(num) local item = self.items[num + self.scrollbar.value - 1] self.chosen_item = item if item.description then local _, _, rows = self.label_font:sizeOf(item.description, details_width) self.details_scrollbar:setRange(1, rows, 13, 1) else self.details_scrollbar:setRange(1, 13, 13, 1) end self.description_offset = 0 end function UICustomCampaign:buttonStartCampaign() if self.chosen_item then TheApp:loadCampaign(self.chosen_item.path) end end function UICustomCampaign:draw(canvas, x, y) UIMenuList.draw(self, canvas, x, y) x, y = self.x + x, self.y + y if self.chosen_item and self.chosen_item.name then self.label_font:drawWrapped(canvas, self.chosen_item.name, x + 270, y + 10, details_width) self.label_font:drawWrapped(canvas, "(levels: " .. self.chosen_item.no_levels .. ")", x+ 270, y + 22, details_width) end if self.chosen_item and self.chosen_item.description then self.label_font:drawWrapped(canvas, self.chosen_item.description, x + 270, y + 40, details_width, nil, 13, self.description_offset) end end CorsixTH-0.63/CorsixTH/Lua/dialogs/resizables/menu_list_dialogs/custom_game.lua000066400000000000000000000135031347163623700277030ustar00rootroot00000000000000--[[ Copyright (c) 2010-2014 Edvin "Lego3" Linge 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. --]] --! Custom Game Window class "UICustomGame" (UIMenuList) ---@type UICustomGame local UICustomGame = _G["UICustomGame"] local col_scrollbar = { red = 164, green = 156, blue = 208, } local details_width = 280 --! Compile metainfo for all of the levels in the given path. --!param path (string) The path that should contain level files. --!param items (table) Table to insert the level metadata into. local findLevelsInDir = function(path, items) for file in lfs.dir(path) do if file:match"%.level$" then local level_info = TheApp:readLevelFile(file) if level_info.name and level_info.map_file then items[#items + 1] = { name = level_info.name, tooltip = _S.tooltip.custom_game_window.choose_game, map_file = level_info.map_file, level_file = file, intro = level_info.briefing, deprecated_variable_used = level_info.deprecated_variable_used, } end end end end function UICustomGame:UICustomGame(ui) self.label_font = TheApp.gfx:loadFont("QData", "Font01V") -- Supply the required list of items to UIMenuList -- Create the actual list local items = {} findLevelsInDir(TheApp.level_dir, items) findLevelsInDir(TheApp.user_level_dir, items) self:UIMenuList(ui, "menu", _S.custom_game_window.caption, items, 10, details_width + 40) -- Create a toolbar ready to be used if the description for a level is -- too long to fit local scrollbar_base = self:addBevelPanel(560, 40, 20, self.num_rows*17, self.col_bg) scrollbar_base.lowered = true self.details_scrollbar = scrollbar_base:makeScrollbar(col_scrollbar, --[[persistable:menu_list_details_scrollbar_callback]] function() self:updateDescriptionOffset() end, 1, 1, self.num_rows) self.description_offset = 0 -- Now add the free build button beside the list. if not pcall(function() local palette = ui.app.gfx:loadPalette("QData", "DrugN01V.pal") self.panel_sprites = ui.app.gfx:loadSpriteTable("QData", "DrugN02V", true, palette) self.border_sprites = ui.app.gfx:loadSpriteTable("Bitmap", "aux_ui", true) end) then self:close() return end self:addBevelPanel(280, 230, 140, 20, self.col_bg):setLabel(_S.custom_game_window.free_build).lowered = true local button = self:addPanel(12, 430, 225):makeToggleButton(0, 0, 29, 29, 11, self.buttonFreebuild) :setTooltip(_S.tooltip.custom_game_window.free_build) if self.ui.app.config.free_build_mode then button:toggle() end -- Finally the load button self:addBevelPanel(480, 220, 100, 40, self.col_bg) :setLabel(_S.custom_game_window.load_selected_level) :makeButton(0, 0, 100, 40, 11, self.buttonLoadLevel) :setTooltip(_S.tooltip.custom_game_window.load_selected_level) end function UICustomGame:updateDescriptionOffset() self.description_offset = self.details_scrollbar.value - 1 end -- Overrides the function in the UIMenuList, choosing what should happen when the player -- clicks a choice in the list. function UICustomGame:buttonClicked(num) local item = self.items[num + self.scrollbar.value - 1] self.chosen_index = num self.chosen_level_name = item.name self.chosen_level_description = item.intro if self.chosen_level_description then local _, y, rows = self.label_font:sizeOf(self.chosen_level_description, details_width) local row_height = y / rows self.max_rows_shown = math.floor(self.num_rows*17 / row_height) self.details_scrollbar:setRange(1, rows, math.min(rows, self.max_rows_shown), 1) else self.details_scrollbar:setRange(1, 1, 1, 1) end self.description_offset = 0 if item.deprecated_variable_used then self.ui:addWindow(UIInformation(self.ui, {_S.warnings.levelfile_variable_is_deprecated:format(item.name)})) end end function UICustomGame:buttonLoadLevel() if self.chosen_index then -- First make sure the map file exists. local item = self.items[self.chosen_index + self.scrollbar.value - 1] local app = self.ui.app local _, errors = app:readMapDataFile(item.map_file) if errors then self.ui:addWindow(UIInformation(self.ui, {errors})) return end app:loadLevel(item.level_file, nil, self.chosen_level_name, item.map_file, self.chosen_level_description) end end function UICustomGame:buttonFreebuild(checked) self.ui.app.config.free_build_mode = checked end function UICustomGame:draw(canvas, x, y) UIMenuList.draw(self, canvas, x, y) x, y = self.x + x, self.y + y if self.chosen_level_name then self.label_font:drawWrapped(canvas, self.chosen_level_name, x + 270, y + 10, details_width) end if self.chosen_level_description then self.label_font:drawWrapped(canvas, self.chosen_level_description, x + 270, y + 40, details_width, nil, self.max_rows_shown, self.description_offset) end end CorsixTH-0.63/CorsixTH/Lua/dialogs/resizables/menu_list_dialogs/make_debug_patient.lua000066400000000000000000000042201347163623700312030ustar00rootroot00000000000000--[[ Copyright (c) 2010 Peter "Corsix" Cawley 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. --]] class "UIMakeDebugPatient" (UIMenuList) ---@type UIMakeDebugPatient local UIMakeDebugPatient = _G["UIMakeDebugPatient"] function UIMakeDebugPatient:UIMakeDebugPatient(ui) local items = {} for _, disease in ipairs(ui.app.diseases) do if disease.visuals_id or disease.non_visuals_id == 1 then items[#items + 1] = { name = disease.name, disease = disease, tooltop = disease.name, } end end self:UIMenuList(ui, "game", _S.debug_patient_window.caption, items) end function UIMakeDebugPatient:buttonClicked(num) local item = self.items[num + self.scrollbar.value - 1] local patient = self.ui.app.world:newEntity("Patient", 2) patient.is_debug = true table.insert(self.ui.hospital.debug_patients, patient) patient:setDisease(item.disease) patient.diagnosed = true local x, y = self.ui:ScreenToWorld(self.x + self.width / 2, self.y + self.height + 100) patient:setTile(math.floor(x), math.floor(y)) patient:setMood("idea1", "activate") -- temporary, to make debug patients distinguishable from normal ones patient:setHospital(self.ui.hospital) end CorsixTH-0.63/CorsixTH/Lua/dialogs/resizables/new_game.lua000066400000000000000000000163751347163623700234730ustar00rootroot00000000000000--[[ Copyright (c) 2010 Edvin "Lego3" Linge 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. --]] --! Class for the difficulty choice window. class "UINewGame" (UIResizable) ---@type UINewGame local UINewGame = _G["UINewGame"] local col_bg = { red = 154, green = 146, blue = 198, } local col_caption = { red = 174, green = 166, blue = 218, } local col_textbox = { red = 0, green = 0, blue = 0, } local col_highlight = { red = 174, green = 166, blue = 218, } local col_shadow = { red = 134, green = 126, blue = 178, } function UINewGame:UINewGame(ui) self:UIResizable(ui, 320, 220, col_bg) local app = ui.app self.esc_closes = true self.resizable = false self.modal_class = "main menu" self.on_top = true self:setDefaultPosition(0.5, 0.25) if TheApp.using_demo_files then -- We're using the demo version of TH. Load directly and activate the tutorial. -- Those who use the demo files probably want that anyway. self.start_tutorial = true self:startGame("full") self:close() return end self.border_sprites = app.gfx:loadSpriteTable("Bitmap", "aux_ui", true) self.start_tutorial = false self.difficulty = 1 local avail_diff = { {text = _S.new_game_window.medium, tooltip = _S.tooltip.new_game_window.medium, param = "full"}, } if TheApp.fs:getFilePath("Levels", "Easy01.SAM") then table.insert(avail_diff, 1, {text = _S.new_game_window.easy, tooltip = _S.tooltip.new_game_window.easy, param = "easy"}) self.difficulty = 2 end if TheApp.fs:getFilePath("Levels", "Hard01.SAM") then avail_diff[#avail_diff + 1] = {text = _S.new_game_window.hard, tooltip = _S.tooltip.new_game_window.hard, param = "hard"} end self.available_difficulties = avail_diff self.default_button_sound = "selectx.wav" -- Window parts definition -- Title self:addBevelPanel(80, 10, 160, 20, col_caption):setLabel(_S.new_game_window.caption).lowered = true -- Player Name self.player_name = app.config.player_name or os.getenv("USER") or os.getenv("USERNAME") or "PLAYER" self:addBevelPanel(20, 45, 140, 30, col_shadow, col_bg, col_bg) :setLabel(_S.new_game_window.player_name).lowered = true self.name_textbox = self:addBevelPanel(165, 45, 140, 30, col_textbox, col_highlight, col_shadow) :setTooltip(_S.tooltip.new_game_window.player_name):setAutoClip(true) :makeTextbox( --[[persistable:new_game_confirm_name]]function() local name = self.name_textbox.text if not name:find("%S") then self.name_textbox:setText(self.player_name) else self.player_name = name self:saveToConfig() end end, --[[persistable:new_game_abort_name]]function() self.name_textbox:setText(self.player_name) end) :allowedInput({"alpha", "numbers", "misc"}):characterLimit(15):setText(self.player_name) -- Tutorial self:addBevelPanel(20, 80, 140, 30, col_shadow, col_bg, col_bg) :setLabel(_S.new_game_window.tutorial).lowered = true self:addBevelPanel(165, 80, 140, 30, col_bg):setLabel(_S.new_game_window.option_off) :makeToggleButton(0, 0, 135, 30, nil, self.buttonTutorial):setTooltip(_S.tooltip.new_game_window.tutorial) -- Difficulty self:addBevelPanel(20, 115, 140, 30, col_shadow, col_bg, col_bg) :setLabel(_S.new_game_window.difficulty).lowered = true self:addBevelPanel(165, 115, 140, 30, col_bg):setLabel(self.available_difficulties[self.difficulty].text) :makeToggleButton(0, 0, 135, 30, nil, self.dropdownDifficulty):setTooltip(_S.tooltip.new_game_window.difficulty) -- Start and Cancel self:addBevelPanel(20, 165, 140, 40, col_bg):setLabel(_S.new_game_window.start):makeButton(0, 0, 135, 40, nil, self.buttonStart):setTooltip(_S.tooltip.new_game_window.start) self:addBevelPanel(165, 165, 140, 40, col_bg):setLabel(_S.new_game_window.cancel):makeButton(0, 0, 135, 40, nil, self.buttonCancel):setTooltip(_S.tooltip.new_game_window.cancel) end function UINewGame:saveToConfig() self.ui.app.config.player_name = self.player_name self.ui.app:saveConfig() end function UINewGame:onMouseDown(button, x, y) local repaint = UIResizable.onMouseDown(self, button, x, y) if button == "left" and not repaint and not (x >= 0 and y >= 0 and x < self.width and y < self.height) and self:hitTest(x, y) then return self:beginDrag(x, y) end return repaint end function UINewGame:hitTest(x, y) if x >= 0 and y >= 0 and x < self.width and y < self.height then return true end local sprites = self.border_sprites if not sprites then return false end if x < -9 or y < -9 or x >= self.width + 9 or y >= self.height + 9 then return false end if (0 <= x and x < self.width) or (0 <= y and y < self.height) then return true end return sprites.hitTest(sprites, 10, x + 9, y + 9) or sprites.hitTest(sprites, 12, x - 160, y + 9) or sprites.hitTest(sprites, 15, x + 9, y - 240) or sprites.hitTest(sprites, 17, x - 160, y - 240) end function UINewGame:buttonTutorial(checked, button) self.start_tutorial = checked button.panel_for_sprite:setLabel(checked and _S.new_game_window.option_on or _S.new_game_window.option_off) end function UINewGame:dropdownDifficulty(activate, button) if activate and #self.available_difficulties > 1 then self.difficulty_dropdown = UIDropdown(self.ui, self, button, self.available_difficulties, self.selectDifficulty) self:addWindow(self.difficulty_dropdown) else if self.difficulty_dropdown then self.difficulty_dropdown:close() self.difficulty_dropdown = nil end end end function UINewGame:selectDifficulty(number) self.difficulty = number end function UINewGame:buttonStart() self.name_textbox:confirm() print("starting game with difficulty " .. self.available_difficulties[self.difficulty].param) self:startGame(self.available_difficulties[self.difficulty].param) end function UINewGame:startGame(difficulty) self.ui.app:loadLevel(1, difficulty) -- Initiate campaign progression. The UI above may now have changed. if not TheApp.using_demo_files then TheApp.world.campaign_info = "TH.campaign" end if self.start_tutorial then TheApp.ui.start_tutorial = true TheApp.ui:startTutorial() end end function UINewGame:buttonCancel() self.name_textbox:confirm() self:close() end function UINewGame:close() UIResizable.close(self) self.ui:addWindow(UIMainMenu(self.ui)) end CorsixTH-0.63/CorsixTH/Lua/dialogs/resizables/options.lua000066400000000000000000000610041347163623700233710ustar00rootroot00000000000000--[[ Copyright (c) 2010 Manuel "Roujin" Wolf 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. --]] --! Options window used in the main menu and ingame. class "UIOptions" (UIResizable) ---@type UIOptions local UIOptions = _G["UIOptions"] local col_bg = { red = 154, green = 146, blue = 198, } local col_textbox = { red = 0, green = 0, blue = 0, } local col_highlight = { red = 174, green = 166, blue = 218, } local col_shadow = { red = 134, green = 126, blue = 178, } local col_caption = { red = 174, green = 166, blue = 218, } -- Private functions --- Calculates the Y position for the dialog box in the option menu -- and increments along the current position for the next element -- @return The Y position to place the element at function UIOptions:_getOptionYPos() -- Offset from top of options box local STARTING_Y_POS = 15 -- Y Height is 20 for panel size + 10 for spacing local Y_HEIGHT = 30 -- Multiply by the index so that index=1 is at STARTING_Y_POS local calculated_pos = STARTING_Y_POS + Y_HEIGHT * (self._current_option_index - 1) self._current_option_index = self._current_option_index + 1 return calculated_pos end function UIOptions:UIOptions(ui, mode) self:UIResizable(ui, 320, 430, col_bg) local app = ui.app self.mode = mode self.modal_class = mode == "menu" and "main menu" or "options" self.on_top = mode == "menu" self.esc_closes = true self.resizable = false self:setDefaultPosition(0.5, 0.25) self.default_button_sound = "selectx.wav" self.app = app -- Tracks the current position of the object self._current_option_index = 1 -- Constants for most button's width and height local BTN_WIDTH = 135 local BTN_HEIGHT = 20 self:checkForAvailableLanguages() -- Set up list of resolutions self.available_resolutions = { {text = "640x480 (4:3)", width = 640, height = 480}, {text = "800x600 (4:3)", width = 800, height = 600}, {text = "1024x768 (4:3)", width = 1024, height = 768}, {text = "1280x960 (4:3)", width = 1280, height = 960}, {text = "1600x1200 (4:3)", width = 1600, height = 1200}, {text = "1280x1024 (5:4)", width = 1280, height = 1024}, {text = "1280x720 (16:9)", width = 1280, height = 720}, {text = "1366x768 (16:9)", width = 1366, height = 768}, {text = "1600x900 (16:9)", width = 1600, height = 900}, {text = "1920x1080 (16:9)", width = 1920, height = 1080}, {text = "1280x800 (16:10)", width = 1280, height = 800}, {text = "1440x900 (16:10)", width = 1440, height = 900}, {text = "1680x1050 (16:10)", width = 1680, height = 1050}, {text = "1920x1200 (16:10)", width = 1920, height = 1200}, {text = _S.options_window.custom_resolution, custom = true}, } -- Window parts definition -- Title local title_y_pos = self:_getOptionYPos() self:addBevelPanel(80, title_y_pos, 165, 20, col_caption):setLabel(_S.options_window.caption) .lowered = true -- Fullscreen local fullscreen_y_pos = self:_getOptionYPos() self:addBevelPanel(20, fullscreen_y_pos, BTN_WIDTH, BTN_HEIGHT, col_shadow, col_bg, col_bg) :setLabel(_S.options_window.fullscreen):setTooltip(_S.tooltip.options_window.fullscreen).lowered = true self.fullscreen_panel = self:addBevelPanel(165, fullscreen_y_pos, BTN_WIDTH, BTN_HEIGHT, col_bg):setLabel(app.fullscreen and _S.options_window.option_on or _S.options_window.option_off) self.fullscreen_button = self.fullscreen_panel:makeToggleButton(0, 0, 140, BTN_HEIGHT, nil, self.buttonFullscreen) :setToggleState(app.fullscreen):setTooltip(_S.tooltip.options_window.fullscreen_button) -- Screen resolution local screen_res_y_pos = self:_getOptionYPos() self:addBevelPanel(20, screen_res_y_pos, BTN_WIDTH, BTN_HEIGHT, col_shadow, col_bg, col_bg) :setLabel(_S.options_window.resolution):setTooltip(_S.tooltip.options_window.resolution).lowered = true self.resolution_panel = self:addBevelPanel(165, screen_res_y_pos, BTN_WIDTH, BTN_HEIGHT, col_bg):setLabel(app.config.width .. "x" .. app.config.height) self.resolution_button = self.resolution_panel:makeToggleButton(0, 0, BTN_WIDTH, BTN_HEIGHT, nil, self.dropdownResolution):setTooltip(_S.tooltip.options_window.select_resolution) -- Mouse capture local capture_mouse_y_pos = self:_getOptionYPos() self:addBevelPanel(20, capture_mouse_y_pos, BTN_WIDTH, BTN_HEIGHT, col_shadow, col_bg, col_bg) :setLabel(_S.options_window.capture_mouse):setTooltip(_S.tooltip.options_window.capture_mouse).lowered = true self.mouse_capture_panel = self:addBevelPanel(165, capture_mouse_y_pos, BTN_WIDTH, BTN_HEIGHT, col_bg):setLabel(app.config.capture_mouse and _S.options_window.option_on or _S.options_window.option_off) self.mouse_capture_button = self.mouse_capture_panel:makeToggleButton(0, 0, BTN_WIDTH, BTN_HEIGHT, nil, self.buttonMouseCapture) :setToggleState(app.config.capture_mouse):setTooltip(_S.tooltip.options_window.capture_mouse) -- Language -- Get language name in the language to normalize display. -- If it doesn't exist, display the current config option. local lang = self.app.strings:getLanguageNames(app.config.language) if lang then lang = lang[1] else lang = app.config.language end local lang_y_pos = self:_getOptionYPos() self:addBevelPanel(20, lang_y_pos, BTN_WIDTH, BTN_HEIGHT, col_shadow, col_bg, col_bg) :setLabel(_S.options_window.language):setTooltip(_S.tooltip.options_window.language).lowered = true self.language_panel = self:addBevelPanel(165, lang_y_pos, BTN_WIDTH, BTN_HEIGHT, col_bg):setLabel(lang) self.language_button = self.language_panel:makeToggleButton(0, 0, BTN_WIDTH, BTN_HEIGHT, nil, self.dropdownLanguage):setTooltip(_S.tooltip.options_window.select_language) -- add the Audio global switch. local audio_y_pos = self:_getOptionYPos() self:addBevelPanel(20, audio_y_pos, BTN_WIDTH, BTN_HEIGHT, col_shadow, col_bg, col_bg) :setLabel(_S.options_window.audio):setTooltip(_S.tooltip.options_window.audio_button).lowered = true self.volume_panel = self:addBevelPanel(165, audio_y_pos, BTN_WIDTH, BTN_HEIGHT, col_bg):setLabel(app.config.audio and _S.customise_window.option_on or _S.customise_window.option_off) self.volume_button = self.volume_panel:makeToggleButton(0, 0, BTN_WIDTH, BTN_HEIGHT, nil, self.buttonAudioGlobal) :setToggleState(app.config.audio):setTooltip(_S.tooltip.options_window.audio_toggle) -- Set scroll speed. local scroll_y_pos = self:_getOptionYPos() self:addBevelPanel(20, scroll_y_pos, BTN_WIDTH, BTN_HEIGHT, col_shadow, col_bg, col_bg) : setLabel(_S.options_window.scrollspeed):setTooltip(_S.tooltip.options_window.scrollspeed).lowered = true self.scrollspeed_panel = self:addBevelPanel(165, scroll_y_pos, BTN_WIDTH, BTN_HEIGHT, col_bg):setLabel(tostring(self.ui.app.config.scroll_speed)) self.scrollspeed_button = self.scrollspeed_panel : makeToggleButton(0, 0, BTN_WIDTH, BTN_HEIGHT, nil, self.buttonScrollSpeed) : setTooltip(_S.tooltip.options_window.scrollspeed) -- Set shift scroll speed. local shiftscroll_y_pos = self:_getOptionYPos() self:addBevelPanel(20, shiftscroll_y_pos, BTN_WIDTH, BTN_HEIGHT, col_shadow, col_bg, col_bg) : setLabel(_S.options_window.shift_scrollspeed):setTooltip(_S.tooltip.options_window.shift_scrollspeed).lowered = true self.shift_scrollspeed_panel = self:addBevelPanel(165, shiftscroll_y_pos, BTN_WIDTH, BTN_HEIGHT, col_bg):setLabel( tostring(self.ui.app.config.shift_scroll_speed) ) self.shift_scrollspeed_button = self.shift_scrollspeed_panel : makeToggleButton(0, 0, BTN_WIDTH, BTN_HEIGHT, nil, self.buttonShiftScrollSpeed) : setTooltip(_S.tooltip.options_window.shift_scrollspeed) -- Set zoom speed. local zoom_y_pos = self:_getOptionYPos() self:addBevelPanel(20, zoom_y_pos, BTN_WIDTH, BTN_HEIGHT, col_shadow, col_bg, col_bg) : setLabel(_S.options_window.zoom_speed):setTooltip(_S.tooltip.options_window.zoom_speed).lowered = true self.zoomspeed_panel = self:addBevelPanel(165, zoom_y_pos, BTN_WIDTH, BTN_HEIGHT, col_bg):setLabel( tostring(self.ui.app.config.zoom_speed) ) self.zoomspeed_button = self.zoomspeed_panel : makeToggleButton(0, 0, BTN_WIDTH, BTN_HEIGHT, nil, self.buttonZoomSpeed) : setTooltip(_S.tooltip.options_window.zoom_speed) -- "Customise" button local customise_y_pos = self:_getOptionYPos() self:addBevelPanel(20, customise_y_pos, BTN_WIDTH, 30, col_bg):setLabel(_S.options_window.customise) :makeButton(0, 0, BTN_WIDTH, 30, nil, self.buttonCustomise):setTooltip(_S.tooltip.options_window.customise_button) -- "Folders" button self:addBevelPanel(165, customise_y_pos, BTN_WIDTH, 30, col_bg):setLabel(_S.options_window.folder) :makeButton(0, 0, BTN_WIDTH, 30, nil, self.buttonFolder):setTooltip(_S.tooltip.options_window.folder_button) -- "Hotkeys" button local hotkey_y_pos = self:_getOptionYPos() + 10 self:addBevelPanel(20, hotkey_y_pos, 280, 40, col_bg):setLabel(_S.options_window.hotkey) :makeButton(0, 0, 280, 40, nil, self.buttonHotkey):setTooltip(_S.tooltip.options_window.hotkey) -- "Back" button -- Give some extra space to back button. This is fine as long as it is the last button in the options menu local back_button_y_pos = self:_getOptionYPos() + 30 self:addBevelPanel(20, back_button_y_pos, 280, 40, col_bg):setLabel(_S.options_window.back) :makeButton(0, 0, 280, 40, nil, self.buttonBack):setTooltip(_S.tooltip.options_window.back) end -- Stubs for backward compatibility local --[[persistable:options_window_language_button]] function language_button() end local --[[persistable:options_width_textbox_reset]] function width_textbox_reset() end local --[[persistable:options_height_textbox_reset]] function height_textbox_reset() end function UIOptions:checkForAvailableLanguages() local app = self.app -- Set up list of available languages local langs = {} for _, lang in ipairs(app.strings.languages) do local font = app.strings:getFont(lang) if app.gfx:hasLanguageFont(font) then font = font and app.gfx:loadLanguageFont(font, app.gfx:loadSpriteTable("QData", "Font01V")) langs[#langs + 1] = {text = lang, font = font, tooltip = _S.tooltip.options_window.language_dropdown_item:format(lang)} end end self.available_languages = langs end function UIOptions:dropdownLanguage(activate) if activate then self:dropdownResolution(false) self.language_dropdown = UIDropdown(self.ui, self, self.language_button, self.available_languages, self.selectLanguage) self:addWindow(self.language_dropdown) else self.language_button:setToggleState(false) if self.language_dropdown then self.language_dropdown:close() self.language_dropdown = nil end end end function UIOptions:selectLanguage(number) local app = self.ui.app app.config.language = (self.available_languages[number].text) app:initLanguage() app:saveConfig() end function UIOptions:dropdownResolution(activate) if activate then self:dropdownLanguage(false) self.resolution_dropdown = UIDropdown(self.ui, self, self.resolution_button, self.available_resolutions, self.selectResolution) self:addWindow(self.resolution_dropdown) else self.resolution_button:setToggleState(false) if self.resolution_dropdown then self.resolution_dropdown:close() self.resolution_dropdown = nil end end end function UIOptions:selectResolution(number) local res = self.available_resolutions[number] local callback = --[[persistable:options_resolution_callback]] function(width, height) if not self.ui:changeResolution(width, height) then local err = {_S.errors.unavailable_screen_size} self.ui:addWindow(UIInformation(self.ui, err)) end self.resolution_panel:setLabel(self.ui.app.config.width .. "x" .. self.ui.app.config.height) end if res.custom then self.resolution_panel:setLabel(self.ui.app.config.width .. "x" .. self.ui.app.config.height) self.ui:addWindow(UIResolution(self.ui, callback)) else callback(res.width, res.height) end end function UIOptions:buttonFullscreen(checked) if not self.ui:toggleFullscreen() then local err = {_S.errors.unavailable_screen_size} self.ui:addWindow(UIInformation(self.ui, err)) self.fullscreen_button:toggle() end self.fullscreen_panel:setLabel(self.ui.app.fullscreen and _S.options_window.option_on or _S.options_window.option_off) end function UIOptions:buttonMouseCapture(checked) local app = self.ui.app app.config.capture_mouse = not app.config.capture_mouse app:saveConfig() app:setCaptureMouse() self.mouse_capture_button:setLabel(app.config.capture_mouse and _S.options_window.option_on or _S.options_window.option_off) end function UIOptions:buttonCustomise() local window = UICustomise(self.ui, "menu") self.ui:addWindow(window) end function UIOptions:buttonFolder() local window = UIFolder(self.ui, "menu") self.ui:addWindow(window) end function UIOptions:buttonHotkey() local window = UIHotkeyAssign(self.ui, "menu") self.ui:addWindow(window) end function UIOptions:buttonBrowseForTHInstall() local function callback(path) local app = TheApp app.config.theme_hospital_install = path app:saveConfig() debug.getregistry()._RESTART = true app.running = false end local browser = UIDirectoryBrowser(self.ui, self.mode, _S.options_window.new_th_directory, "InstallDirTreeNode", callback) self.ui:addWindow(browser) end function UIOptions:buttonAudioGlobal(checked) local app = self.ui.app app.config.audio = not app.config.audio app:saveConfig() self.volume_button:setLabel(app.config.audio and _S.customise_window.option_on or _S.customise_window.option_off) -- Reinit audio app.audio:stopBackgroundTrack() app.audio.has_bg_music = false app.audio.not_loaded = not app.config.audio app.audio.speech_file_name = nil app.audio:init() app:initLanguage() end function UIOptions:buttonScrollSpeed() local callback = function(scrollspeed_number) self.scrollspeed_panel : setLabel(tostring(scrollspeed_number)) self.scrollspeed_button : setToggleState(false) end self.ui:addWindow(UIScrollSpeed(self.ui, callback)) end function UIOptions:buttonBack() self:close() end function UIOptions:buttonShiftScrollSpeed() local callback = function(shift_scrollspeed_number) self.shift_scrollspeed_panel : setLabel( tostring(shift_scrollspeed_number) ) self.shift_scrollspeed_button : setToggleState(false) end self.ui:addWindow(UIShiftScrollSpeed(self.ui, callback)) end function UIOptions:buttonBack() self:close() end function UIOptions:buttonZoomSpeed() local callback = function(zoomspeed_number) self.zoomspeed_panel : setLabel( tostring(zoomspeed_number) ) self.zoomspeed_button : setToggleState(false) end self.ui:addWindow( UIZoomSpeed(self.ui, callback) ) end function UIOptions:close() UIResizable.close(self) if self.mode == "menu" then self.ui:addWindow(UIMainMenu(self.ui)) end end --! A custom resolution selection window class "UIResolution" (UIResizable) ---@type UIResolution local UIResolution = _G["UIResolution"] function UIResolution:UIResolution(ui, callback) self:UIResizable(ui, 200, 140, col_bg) local app = ui.app self.modal_class = "resolution" self.on_top = true self.esc_closes = true self.resizable = false self:setDefaultPosition(0.5, 0.5) self.default_button_sound = "selectx.wav" self.callback = callback -- Window parts definition -- Title self:addBevelPanel(20, 10, 160, 20, col_caption):setLabel(_S.options_window.resolution) .lowered = true -- Textboxes self:addBevelPanel(20, 40, 80, 20, col_shadow, col_bg, col_bg):setLabel(_S.options_window.width) self.width_textbox = self:addBevelPanel(100, 40, 80, 20, col_textbox, col_highlight, col_shadow) :setTooltip(_S.tooltip.options_window.width) :makeTextbox():allowedInput("numbers"):characterLimit(4):setText(tostring(app.config.width)) self:addBevelPanel(20, 60, 80, 20, col_shadow, col_bg, col_bg):setLabel(_S.options_window.height) self.height_textbox = self:addBevelPanel(100, 60, 80, 20, col_textbox, col_highlight, col_shadow) :setTooltip(_S.tooltip.options_window.height) :makeTextbox():allowedInput("numbers"):characterLimit(4):setText(tostring(app.config.height)) -- Apply and cancel self:addBevelPanel(20, 90, 80, 40, col_bg):setLabel(_S.options_window.apply) :makeButton(0, 0, 80, 40, nil, self.ok):setTooltip(_S.tooltip.options_window.apply) self:addBevelPanel(100, 90, 80, 40, col_bg):setLabel(_S.options_window.cancel) :makeButton(0, 0, 80, 40, nil, self.cancel):setTooltip(_S.tooltip.options_window.cancel) end function UIResolution:cancel() self:close(false) end function UIResolution:ok() local width, height = tonumber(self.width_textbox.text) or 0, tonumber(self.height_textbox.text) or 0 if width < 640 or height < 480 then local err = {_S.errors.minimum_screen_size} self.ui:addWindow(UIInformation(self.ui, err)) elseif width > 3000 or height > 2000 then self.ui:addWindow(UIConfirmDialog(self.ui, _S.confirmation.maximum_screen_size, --[[persistable:maximum_screen_size_confirm_dialog]]function() self:close(true) self:close(false) end )) else self:close(true) end end --! Closes the resolution dialog --!param ok (boolean or nil) whether the resolution entry was confirmed (true) or aborted (false) function UIResolution:close(ok) UIResizable.close(self) if ok and self.callback then self.callback(tonumber(self.width_textbox.text) or 0, tonumber(self.height_textbox.text) or 0) end end --! A window for setting the scroll speed of the camera. class "UIScrollSpeed" (UIResizable) ---@type UIScrollSpeed local UIScrollSpeed = _G["UIScrollSpeed"] function UIScrollSpeed:UIScrollSpeed(ui, callback) self:UIResizable(ui, 200, 140, col_bg) self.on_top = true self.esc_closes = true self.resizable = false self:setDefaultPosition(0.5, 0.5) self.default_button_sound = "selectx.wav" self.scrollspeed_temp = 2 self.callback = callback self:addBevelPanel(20, 10, 160, 20, col_caption):setLabel(_S.options_window.scrollspeed).lowered = true self:addBevelPanel(20, 50, 90, 20, col_shadow, col_bg, col_bg):setLabel(_S.options_window.scrollspeed) -- self.scrollspeed_textbox = self:addBevelPanel(110, 50, 70, 20, col_textbox, col_highlight, col_shadow) :setTooltip(_S.tooltip.options_window.scrollspeed) :makeTextbox():allowedInput("numbers"):characterLimit(4):setText(tostring(self.ui.app.config.scroll_speed)) --Apply and cancel. self:addBevelPanel(20, 90, 80, 40, col_bg):setLabel(_S.options_window.apply) :makeButton(0, 0, 80, 40, nil, self.ok):setTooltip(_S.tooltip.options_window.apply_scrollspeed) self:addBevelPanel(100, 90, 80, 40, col_bg):setLabel(_S.options_window.cancel) :makeButton(0, 0, 80, 40, nil, self.cancel):setTooltip(_S.tooltip.options_window.cancel_scrollspeed) end function UIScrollSpeed:ok() self.scrollspeed_temp = tonumber(self.scrollspeed_textbox.text) or 2 if self.scrollspeed_temp < 1 then self.scrollspeed_temp = 1 elseif self.scrollspeed_temp > 10 then self.scrollspeed_temp = 10 end self:close(true) end function UIScrollSpeed:cancel() self:close(false) end --!param ok (boolean or nil) whether the resolution entry was confirmed (true) or aborted (false) function UIScrollSpeed:close(ok) UIResizable.close(self) if ok then self.scrollspeed_textbox.text = self.scrollspeed_temp or 2 self.ui.app.config.scroll_speed = self.scrollspeed_textbox.text self.callback(self.scrollspeed_textbox.text) else self.callback(self.ui.app.config.scroll_speed) end end --! A window for setting the scroll speed of the camera while pressing the SHIFT key.. class "UIShiftScrollSpeed" (UIResizable) ---@type UIShiftScrollSpeed local UIShiftScrollSpeed = _G["UIShiftScrollSpeed"] function UIShiftScrollSpeed:UIShiftScrollSpeed(ui, callback) self:UIResizable(ui, 200, 140, col_bg) self.on_top = true self.esc_closes = true self.resizable = false self:setDefaultPosition(0.5, 0.5) self.default_button_sound = "selectx.wav" self.shift_scrollspeed_temp = 4 self.callback = callback self:addBevelPanel(20, 10, 160, 20, col_caption):setLabel(_S.options_window.shift_scrollspeed).lowered = true self:addBevelPanel(20, 50, 120, 20, col_shadow, col_bg, col_bg):setLabel(_S.options_window.shift_scrollspeed) -- self.shift_scrollspeed_textbox = self:addBevelPanel(140, 50, 40, 20, col_textbox, col_highlight, col_shadow) :setTooltip(_S.tooltip.options_window.shift_scrollspeed) :makeTextbox():allowedInput("numbers"):characterLimit(4):setText(tostring(self.ui.app.config.shift_scroll_speed)) --Apply and cancel. self:addBevelPanel(20, 90, 80, 40, col_bg):setLabel(_S.options_window.apply) :makeButton(0, 0, 80, 40, nil, self.ok):setTooltip(_S.tooltip.options_window.apply_shift_scrollspeed) self:addBevelPanel(100, 90, 80, 40, col_bg):setLabel(_S.options_window.cancel) :makeButton(0, 0, 80, 40, nil, self.cancel):setTooltip(_S.tooltip.options_window.cancel_shift_scrollspeed) end function UIShiftScrollSpeed:ok() self.shift_scrollspeed_temp = tonumber(self.shift_scrollspeed_textbox.text) or 4 if self.shift_scrollspeed_temp < 1 then self.shift_scrollspeed_temp = 1 elseif self.shift_scrollspeed_temp > 10 then self.shift_scrollspeed_temp = 10 end self:close(true) end function UIShiftScrollSpeed:cancel() self:close(false) end --!param ok (boolean or nil) whether the resolution entry was confirmed (true) or aborted (false) function UIShiftScrollSpeed:close(ok) UIResizable.close(self) if ok then self.shift_scrollspeed_textbox.text = self.shift_scrollspeed_temp or 4 self.ui.app.config.shift_scroll_speed = self.shift_scrollspeed_textbox.text self.callback(self.shift_scrollspeed_textbox.text) else self.callback(self.ui.app.config.shift_scroll_speed) end end --! Window to set the zoom speed of the scroll wheel while in-game. class "UIZoomSpeed" (UIResizable) ---@type UIZoomSpeed local UIZoomSpeed = _G["UIZoomSpeed"] function UIZoomSpeed:UIZoomSpeed(ui, callback) self:UIResizable(ui, 200, 140, col_bg) self.on_top = true self.esc_closes = true self.resizable = false self:setDefaultPosition(0.5, 0.5) self.default_button_sound = "selectx.wav" self.zoomspeed_temp = 80 self.callback = callback -- self:addBevelPanel(20, 10, 160, 20, col_caption):setLabel(_S.options_window.zoom_speed).lowered = true -- self:addBevelPanel(20, 50, 90, 20, col_shadow, col_bg, col_bg):setLabel(_S.options_window.zoom_speed) -- self.zoomspeed_textbox = self:addBevelPanel(110, 50, 70, 20, col_textbox, col_highlight, col_shadow) :setTooltip(_S.tooltip.options_window.zoom_speed) :makeTextbox():allowedInput("numbers"):characterLimit(4):setText( tostring(self.ui.app.config.zoom_speed) ) --Apply and cancel. self:addBevelPanel(20, 90, 80, 40, col_bg):setLabel(_S.options_window.apply) :makeButton(0, 0, 80, 40, nil, self.ok):setTooltip(_S.tooltip.options_window.apply_zoomspeed) self:addBevelPanel(100, 90, 80, 40, col_bg):setLabel(_S.options_window.cancel) :makeButton(0, 0, 80, 40, nil, self.cancel):setTooltip(_S.tooltip.options_window.cancel_zoomspeed) end function UIZoomSpeed:ok() self.zoomspeed_temp = tonumber( self.zoomspeed_textbox.text ) or 80 if self.zoomspeed_temp < 10 then self.zoomspeed_temp = 10 elseif self.zoomspeed_temp > 1000 then self.zoomspeed_temp = 1000 end self:close(true) end function UIZoomSpeed:cancel() self:close(false) end --!param ok (boolean or nil) whether the resolution entry was confirmed (true) or aborted (false) function UIZoomSpeed:close(ok) UIResizable.close(self) if ok then self.zoomspeed_textbox.text = self.zoomspeed_temp or 2 self.ui.app.config.zoom_speed = self.zoomspeed_textbox.text self.callback(self.zoomspeed_textbox.text) else self.callback(self.ui.app.config.zoom_speed) end endCorsixTH-0.63/CorsixTH/Lua/dialogs/resizables/tip_of_the_day.lua000066400000000000000000000056041347163623700246570ustar00rootroot00000000000000--[[ Copyright (c) 2010 Manuel "Roujin" Wolf 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. --]] --! Tip of the Day Window class "UITipOfTheDay" (UIResizable) ---@type UITipOfTheDay local UITipOfTheDay = _G["UITipOfTheDay"] local col_bg = { red = math.random(20, 200), green = math.random(20, 200), blue = math.random(20, 200), } function UITipOfTheDay:UITipOfTheDay(ui) self:UIResizable(ui, 380, 110, col_bg) local app = ui.app self.ui = ui self.resizable = false self:setDefaultPosition(-20, -20) self.white_font = app.gfx:loadFont("QData", "Font01V") self.num_tips = #_S.totd_window.tips if self.num_tips == 0 then -- NB: #_S.totd_window.tips == 0, which implies something went wrong with -- the string localisation code, hence don't try to localise the following: print("Warning: No tips for tip-of-the-day window") self:close() return end self.tip_num = math.random(1, self.num_tips) self:addBevelPanel(10, self.height - 30, self.width / 2 - 20, 20, col_bg):setLabel(_S.totd_window.previous) :makeButton(0, 0, self.width / 2 - 20, 20, nil, self.buttonPrev):setTooltip(_S.tooltip.totd_window.previous) self:addBevelPanel(self.width / 2 + 10, self.height - 30, self.width / 2 - 20, 20, col_bg):setLabel(_S.totd_window.next) :makeButton(0, 0, self.width / 2 - 20, 20, nil, self.buttonNext):setTooltip(_S.tooltip.totd_window.next) end function UITipOfTheDay:draw(canvas, x, y) -- Draw window components UIResizable.draw(self, canvas, x, y) -- Draw tip x, y = self.x + x, self.y + y local text = _S.totd_window.tips[self.tip_num] self.white_font:drawWrapped(canvas, text, x + 10, y + 10, self.width - 20) end function UITipOfTheDay:buttonPrev() self.tip_num = self.tip_num - 1 if self.tip_num == 0 then self.tip_num = self.num_tips end end function UITipOfTheDay:buttonNext() self.tip_num = self.tip_num + 1 if self.tip_num > self.num_tips then self.tip_num = 1 end end CorsixTH-0.63/CorsixTH/Lua/dialogs/resizables/update.lua000066400000000000000000000070561347163623700231670ustar00rootroot00000000000000--[[ Copyright (c) 2013 Alan Woolley 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. --]] --! Options window used in the main menu and ingame. class "UIUpdate" (UIResizable) ---@type UIUpdate local UIUpdate = _G["UIUpdate"] local col_bg = { red = 154, green = 146, blue = 198, } local col_old_version = { red = 255, green = 0, blue = 0, } local col_new_version = { red = 0, green = 255, blue = 0, } local col_shadow = { red = 134, green = 126, blue = 178, } local col_caption = { red = 174, green = 166, blue = 218, } function UIUpdate:UIUpdate(ui, this_version, new_version, brief_description, download_url) self:UIResizable(ui, 320, 320, col_bg) local app = ui.app self.modal_class = "main" self.on_top = true self.esc_closes = true self.resizable = false self:setDefaultPosition(0.5, 0.25) self.default_button_sound = "selectx.wav" self.description_text = brief_description self.app = app self.white_font = app.gfx:loadFont("QData", "Font01V") self.download_url = download_url local pathsep = package.config:sub(1, 1) if pathsep == "\\" then self.os_is_windows = true else self.os_is_windows = false end self:addBevelPanel(20, 50, 140, 20, col_shadow, col_bg, col_bg) :setLabel(_S.update_window.current_version).lowered = true self:addBevelPanel(20, 70, 140, 20, col_shadow, col_bg, col_bg) :setLabel(_S.update_window.new_version).lowered = true self:addBevelPanel (160,50,140,20, col_old_version, col_bg, col_bg):setLabel(this_version) self:addBevelPanel (160,70,140,20, col_new_version, col_bg, col_bg):setLabel(new_version) -- Title self:addBevelPanel(80, 10, 160, 20, col_caption):setLabel(_S.update_window.caption) .lowered = true -- Download button self:addBevelPanel(20, 225, 280, 40, col_bg):setLabel(_S.update_window.download) :makeButton(0, 0, 280, 40, nil, self.buttonDownload):setTooltip(_S.tooltip.update_window.download) -- Ignore button self:addBevelPanel(20, 270, 280, 40, col_bg):setLabel(_S.update_window.ignore) :makeButton(0, 0, 280, 40, nil, self.buttonIgnore):setTooltip(_S.tooltip.update_window.ignore) end function UIUpdate:draw(canvas, x, y) -- Draw window components UIResizable.draw(self, canvas, x, y) -- Draw description x, y = self.x + x, self.y + y self.white_font:drawWrapped(canvas, self.description_text, x + 20, y + 100, self.width - 20) end function UIUpdate:buttonDownload() if self.os_is_windows then os.execute("start " .. self.download_url) else os.execute("xdg-open " .. self.download_url) end end function UIUpdate:buttonIgnore() self:close() end CorsixTH-0.63/CorsixTH/Lua/dialogs/staff_dialog.lua000066400000000000000000000347461347163623700221720ustar00rootroot00000000000000--[[ Copyright (c) 2009 Peter "Corsix" Cawley 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. --]] -- Test for hit within the view circle local --[[persistable:staff_dialog_is_in_view_circle]] function is_in_view_circle(x, y, is_handyman) local circle_center_y = is_handyman and 276 or 248 return (x - 55)^2 + (y - circle_center_y)^2 < 39^2 end --! Individual staff information dialog class "UIStaff" (Window) ---@type UIStaff local UIStaff = _G["UIStaff"] --! Callback function for handyman to change his parcel. function UIStaff:changeParcel() local index = 0 for i, v in ipairs(self.staff.hospital.ownedPlots) do if v == self.staff.parcelNr then index = i break end end if not self.staff.hospital.ownedPlots[index + 1] then self.staff.parcelNr = 0 else self.staff.parcelNr = self.staff.hospital.ownedPlots[index + 1] end end function UIStaff:getParcelText() if not self.staff.parcelNr then self.staff.parcelNr = 0 end if self.staff.parcelNr == 0 then return _S.handyman_window.all_parcels --"All parcels" else return _S.handyman_window.parcel .. " " .. self.staff.parcelNr end end function UIStaff:UIStaff(ui, staff) self:Window() local app = ui.app local profile = staff.profile self.esc_closes = true self.staff = staff self.ui = ui self.modal_class = "humanoid_info" self.width = 220 if profile.humanoid_class == "Handyman" then self.height = 332 else self.height = 304 end self:setDefaultPosition(-20, 30) self.panel_sprites = app.gfx:loadSpriteTable("QData", "Req01V", true) self.white_font = app.gfx:loadFont("QData", "Font01V") self.face_parts = app.gfx:loadRaw("Face01V", 65, 1350, nil, "Data", "MPalette.dat") self:addPanel(297, 15, 0) -- Dialog header for y = 51, 121, 10 do self:addPanel(298, 15, y) -- Dialog background end self:addPanel(299, 104, 50) -- Happiness self:addPanel(300, 105, 82) -- Tiredness self:addPanel(301, 15, 114) -- Skills/Abilities self:addColourPanel(35, 51, 71, 81, 208, 252, 252):makeButton(0, 0, 71, 81, nil, self.openStaffManagement):setTooltip(_S.tooltip.staff_window.face) -- Portrait background if profile.humanoid_class == "Handyman" then self:addPanel(311, 15, 131) -- Tasks top for y = 149, 184, 5 do self:addPanel(312, 15, y) -- Tasks buttons end self:addPanel(302, 5, 205) -- View circle top/Wage self:addPanel(313, 15, 189) -- Tasks bottom self:addPanel(314, 37, 145):makeRepeatButton(0, 0, 49, 48, 315, self.doMoreCleaning):setTooltip(_S.tooltip.handyman_window.prio_litter) self:addPanel(316, 92, 145):makeRepeatButton(0, 0, 49, 48, 317, self.doMoreWatering):setTooltip(_S.tooltip.handyman_window.prio_plants) self:addPanel(318, 148, 145):makeRepeatButton(0, 0, 49, 48, 319, self.doMoreRepairing):setTooltip(_S.tooltip.handyman_window.prio_machines) self:addPanel(240, 21, 210):makeButton(0, 0, 73, 30, 240, self.changeParcel):setTooltip(_S.tooltip.handyman_window.parcel_select) self:addPanel(303, 0, 253) -- View circle midpiece self:addPanel(304, 6, 302) -- View circle bottom self:addPanel(307, 106, 253):makeButton(0, 0, 50, 50, 308, self.fireStaff):setTooltip(_S.tooltip.staff_window.sack) self:addPanel(309, 164, 253):makeButton(0, 0, 37, 50, 310, self.placeStaff):setTooltip(_S.tooltip.staff_window.pick_up) else self:addPanel(302, 5, 178) -- View circle top/Wage self:addPanel(303, 0, 226) -- View circle midpiece self:addPanel(304, 6, 274) -- View circle bottom if profile.humanoid_class ~= "Doctor" then self:addColourPanel(32, 141, 171, 39, 85, 202, 219) -- Hides Skills end self:addPanel(307, 106, 226):makeButton(0, 0, 50, 50, 308, self.fireStaff):setTooltip(_S.tooltip.staff_window.sack) self:addPanel(309, 164, 226):makeButton(0, 0, 37, 50, 310, self.placeStaff):setTooltip(_S.tooltip.staff_window.pick_up) end self:addPanel(305, 178, 18):makeButton(0, 0, 24, 24, 306, self.close):setTooltip(_S.tooltip.staff_window.close) self:makeTooltip(_S.tooltip.staff_window.name, 33, 19, 172, 42) self:makeTooltip(_S.tooltip.staff_window.happiness, 113, 49, 204, 74) self:makeTooltip(_S.tooltip.staff_window.tiredness, 113, 74, 204, 109) self:makeTooltip(_S.tooltip.staff_window.ability, 113, 109, 204, 134) if profile.humanoid_class == "Doctor" then self:makeTooltip(_S.tooltip.staff_window.doctor_seniority, 30, 141, 111, 182) self:makeTooltip(_S.tooltip.staff_window.skills, 111, 146, 141, 179) local skill_to_string = { is_surgeon = _S.tooltip.staff_window.surgeon, is_psychiatrist = _S.tooltip.staff_window.psychiatrist, is_researcher = _S.tooltip.staff_window.researcher, } local --[[persistable:staff_dialog_skill_tooltip_template]] function skill_tooltip(skill) return --[[persistable:staff_dialog_skill_tooltip]] function() if profile[skill] >= 1.0 then return skill_to_string[skill] end end end self:makeDynamicTooltip(skill_tooltip("is_surgeon"), 143, 148, 155, 177) self:makeDynamicTooltip(skill_tooltip("is_psychiatrist"), 155, 148, 177, 177) self:makeDynamicTooltip(skill_tooltip("is_researcher"), 177, 148, 202, 177) end -- window for handyman is slightly different local offset = profile.humanoid_class == "Handyman" and 27 or 0 self:makeTooltip(_S.tooltip.staff_window.salary, 90, 191 + offset, 204, 214 + offset) -- Non-rectangular tooltip has to be realized with dynamic tooltip at the moment self:makeDynamicTooltip(--[[persistable:staff_dialog_center_tooltip]]function(x, y) if is_in_view_circle(x, y, profile.humanoid_class == "Handyman") then return _S.tooltip.staff_window.center_view end end, 17, 211 + offset, 92, 286 + offset) end function UIStaff:getStaffPosition(dx, dy) local staff = self.staff local x, y = self.ui.app.map:WorldToScreen(staff.tile_x, staff.tile_y) local px, py = staff.th:getMarker() return x + px - (dx or 0), y + py - (dy or 0) end function UIStaff:draw(canvas, x_, y_) local x, y = self.x + x_, self.y + y_ local px, py = self:getStaffPosition(37, 61) self.ui.app.map:draw(canvas, px, py, 75, 75, x + 17, y + self.height - 93) Window.draw(self, canvas, x_, y_) local profile = self.staff.profile local font = self.white_font font:draw(canvas, profile.name, x + 42, y + 28) -- Name if profile.humanoid_class == "Handyman" then font:draw(canvas, "$" .. profile.wage, x + 135, y + 226) -- Wage font:draw(canvas, self:getParcelText(), x + 35, y + 215, 50, 0) -- The concentration areas if self.staff.attributes["cleaning"] then -- Backwards compatibility local cleaning_width = math.floor(self.staff.attributes["cleaning"] * 40 + 0.5) local watering_width = math.floor(self.staff.attributes["watering"] * 40 + 0.5) local repairing_width = math.floor(self.staff.attributes["repairing"] * 40 + 0.5) if cleaning_width ~= 0 then for dx = 0, cleaning_width - 1 do self.panel_sprites:draw(canvas, 351, x + 43 + dx, y + 200) end end if watering_width ~= 0 then for dx = 0, watering_width - 1 do self.panel_sprites:draw(canvas, 351, x + 99 + dx, y + 200) end end if repairing_width ~= 0 then for dx = 0, repairing_width - 1 do self.panel_sprites:draw(canvas, 351, x + 155 + dx, y + 200) end end end else font:draw(canvas, "$" .. profile.wage, x + 135, y + 199) -- Wage end if self.staff.attributes["happiness"] then local happiness_bar_width = math.floor(self.staff.attributes["happiness"] * 40 + 0.5) if happiness_bar_width ~= 0 then for dx = 0, happiness_bar_width - 1 do self.panel_sprites:draw(canvas, 348, x + 139 + dx, y + 56) end end end local fatigue_bar_width = 40.5 if self.staff.attributes["fatigue"] then fatigue_bar_width = math.floor((1 - self.staff.attributes["fatigue"]) * 40 + 0.5) end if fatigue_bar_width ~= 0 then for dx = 0, fatigue_bar_width - 1 do self.panel_sprites:draw(canvas, 349, x + 139 + dx, y + 89) end end local skill_bar_width = math.floor(profile.skill * 40 + 0.5) if skill_bar_width ~= 0 then for dx = 0, skill_bar_width - 1 do self.panel_sprites:draw(canvas, 350, x + 139 + dx, y + 120) end end if profile.humanoid_class == "Doctor" then -- Junior / Doctor / Consultant marker if profile.is_junior then self.panel_sprites:draw(canvas, 347, x + 38, y + 173) elseif profile.is_consultant then self.panel_sprites:draw(canvas, 347, x + 89, y + 173) else self.panel_sprites:draw(canvas, 347, x + 60, y + 173) end -- Ability markers if profile.is_surgeon >= 1.0 then self.panel_sprites:draw(canvas, 344, x + 144, y + 148) end if profile.is_psychiatrist >= 1.0 then self.panel_sprites:draw(canvas, 345, x + 155, y + 154) end if profile.is_researcher >= 1.0 then self.panel_sprites:draw(canvas, 346, x + 178, y + 153) end end profile:drawFace(canvas, x + 38, y + 54, self.face_parts) -- Portrait end function UIStaff:onMouseDown(button, x, y) self.do_scroll = button == "left" and is_in_view_circle(x, y, self.staff.profile.humanoid_class == "Handyman") return Window.onMouseDown(self, button, x, y) end -- Helper function to facilitate humanoid_class comparison wrt. Surgeons local function surg_compat(class) return class == "Surgeon" and "Doctor" or class end function UIStaff:onMouseUp(button, x, y) local ui = self.ui if button == "left" then self.do_scroll = false end local repaint = Window.onMouseUp(self, button, x, y) -- Test for hit within the view circle if button == "right" and is_in_view_circle(x, y, self.staff.profile.humanoid_class == "Handyman") then -- Right click goes to the next staff member of the same category (NB: Surgeon in same Category as Doctor) local staff_index = nil for i, staff in ipairs(ui.hospital.staff) do if staff_index and surg_compat(staff.humanoid_class) == surg_compat(self.staff.humanoid_class) then ui:addWindow(UIStaff(ui, staff)) return false end if staff == self.staff then staff_index = i end end -- Try again from beginning of list until staff_index for i = 1, staff_index - 1 do local staff = ui.hospital.staff[i] if surg_compat(staff.humanoid_class) == surg_compat(self.staff.humanoid_class) then ui:addWindow(UIStaff(ui, staff)) return false end end end return repaint end function UIStaff:onMouseMove(x, y, dx, dy) self.do_scroll = self.do_scroll and is_in_view_circle(x, y, self.staff.profile.humanoid_class == "Handyman") return Window.onMouseMove(self, x, y, dx, dy) end function UIStaff:onTick() if self.do_scroll then local ui = self.ui local staff = self.staff local sx, sy = ui.app.map:WorldToScreen(staff.tile_x, staff.tile_y) local dx, dy = staff.th:getPosition() ui:scrollMapTo(sx + dx, sy + dy) end return Window.onTick(self) end function UIStaff:placeStaff() self.staff.pickup = true self.staff:setNextAction(PickupAction(self.ui):setTodoClose(self), true) end function UIStaff:fireStaff() self.ui:addWindow(UIConfirmDialog(self.ui, _S.confirmation.sack_staff, --[[persistable:staff_dialog_confirm_sack]] function() self.staff:fire() end)) end --! Function to balance 'cleaning','watering', and 'repairing', where --! one of them is increased, and the other two are decreased. --!param increased Attribute to increase. function UIStaff:changeHandymanAttributes(increased) if not self.staff.attributes[increased] then return end local incr_value = 0.1 -- Increase of 'increased' local smallest_decr = 0.05 -- Smallest decrement that can be performed. local decr_attrs = {} local attributes = {"cleaning", "watering", "repairing"} for _, attr in ipairs(attributes) do if attr == increased then -- Adding too much is not a problem, it gets clipped to 1. self.staff:changeAttribute(attr, incr_value) if self.staff.attributes[attr] == 1 then incr_value = 2.0 -- Doing 'increased' 100%, set other attributes to 0. end else decr_attrs[#decr_attrs + 1] = attr smallest_decr = math.min(smallest_decr, self.staff.attributes[attr]) end end assert(#decr_attrs == 2) -- The decreasing attributes should together decrease '-incr_value', but one -- or both may be smaller than '-incr_value / 2'. -- Compensate by subtracting the biggest value from both. local decr_value = incr_value - smallest_decr for _, attr in ipairs(decr_attrs) do -- Subtracting too much is not a problem, it gets clipped to 0. self.staff:changeAttribute(attr, -decr_value) end end --! UI callback function to increase 'cleaning' (wiping litter). function UIStaff:doMoreCleaning() self:changeHandymanAttributes("cleaning") end --! UI callback function to increase 'watering' (plants). function UIStaff:doMoreWatering() self:changeHandymanAttributes("watering") end --! UI callback function to increase 'repairing' (machines). function UIStaff:doMoreRepairing() self:changeHandymanAttributes("repairing") end function UIStaff:openStaffManagement() local dlg = UIStaffManagement(self.ui) -- Make sure that the dialog managed to create itself properly. -- For example, if using the demo files closed will be true because the dialog could not be loaded. if not dlg.closed then dlg:selectStaff(self.staff) self.ui:addWindow(dlg) self:close() end end function UIStaff:hitTest(x, y) return Window.hitTest(self, x, y) or is_in_view_circle(x, y, self.staff.profile.humanoid_class == "Handyman") end CorsixTH-0.63/CorsixTH/Lua/dialogs/staff_rise.lua000066400000000000000000000153661347163623700216720ustar00rootroot00000000000000--[[ Copyright (c) 2010 Miika-Petteri Matikainen 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. --]] --! Dialog for staff member requesting a salaray raise. class "UIStaffRise" (Window) ---@type UIStaffRise local UIStaffRise = _G["UIStaffRise"] function UIStaffRise:UIStaffRise(ui, staff, rise_amount) self:Window() local app = ui.app local profile = staff.profile self.esc_closes = false -- Do not allow closing the dialog with esc self.staff = staff self.ui = ui self.rise_amount = rise_amount self.on_top = true local final_wage = self.staff.profile.wage + rise_amount self.text = _S.pay_rise.regular.__random:format(rise_amount, final_wage) -- Random complaint text self.width = 366 self.height = 275 -- Center the dialog self:setDefaultPosition(0.5, 0.5) self.panel_sprites = app.gfx:loadSpriteTable("QData", "Req12V", true) self.white_font = app.gfx:loadFont("QData", "Font01V") self.black_font = app.gfx:loadFont("QData", "Font00V") self.face_parts = app.gfx:loadRaw("Face01V", 65, 1350, nil, "Data", "MPalette.dat") -- Left hand side self:addPanel(280, 0, 0) self:addPanel(281, 0, 54) self:addPanel(281, 0, 64) self:addPanel(281, 0, 64) self:addPanel(281, 0, 74) self:addPanel(281, 0, 84) self:addPanel(281, 0, 94) self:addPanel(281, 0, 104) self:addPanel(282, 0, 114) self:addPanel(283, 0, 171) self:addPanel(284, 0, 214) self:addColourPanel(96, 44, 72, 81, 211, 255, 255) -- Portrait background -- Right hand side self:addPanel(285, 180, 0) self:addPanel(286, 180, 20) self:addPanel(286, 180, 48) self:addPanel(286, 180, 76) self:addPanel(286, 180, 104) self:addPanel(286, 180, 132) self:addPanel(286, 180, 160) self:addPanel(287, 180, 188) self:addPanel(288, 180, 233):makeButton(0, 0, 90, 45, 289, self.increaseSalary):setTooltip(_S.tooltip.pay_rise_window.accept) self:addPanel(290, 270, 233):makeButton(0, 0, 90, 45, 291, self.fireStaff):setTooltip(_S.tooltip.pay_rise_window.decline) self:makeTooltip(_S.tooltip.staff_window.name, 14, 15, 169, 38) self:makeTooltip(_S.tooltip.staff_window.face, 96, 44, 168, 125) self:makeTooltip(_S.tooltip.staff_window.salary, 14, 171, 168, 193) self:makeTooltip(_S.tooltip.staff_window.ability, 12, 213, 89, 243) if profile.humanoid_class == "Doctor" then self:makeTooltip(_S.tooltip.staff_window.doctor_seniority, 89, 197, 168, 243) self:makeTooltip(_S.tooltip.staff_window.skills, 14, 132, 47, 166) -- NB: should be sufficient here to check only once, not make a dynamic tooltip if profile.is_surgeon >= 1.0 then self:makeTooltip(_S.tooltip.staff_window.surgeon, 72, 133, 87, 164) end if profile.is_psychiatrist >= 1.0 then self:makeTooltip(_S.tooltip.staff_window.psychiatrist, 87, 133, 116, 164) end if profile.is_researcher >= 1.0 then self:makeTooltip(_S.tooltip.staff_window.researcher, 116, 133, 146, 164) end else -- Hide doctor specific information self:addColourPanel(10, 130, 160, 40, 60, 174, 203) self:addColourPanel(89, 198, 81, 45, 60, 174, 203) end end function UIStaffRise:getStaffPosition(dx, dy) local staff = self.staff local x, y = self.ui.app.map:WorldToScreen(staff.tile_x, staff.tile_y) local px, py = staff.th:getMarker() return x + px - (dx or 0), y + py - (dy or 0) end function UIStaffRise:draw(canvas, x, y) Window.draw(self, canvas, x, y) local profile = self.staff.profile x, y = self.x + x, self.y + y local px, py = self:getStaffPosition(37, 61) local font = self.white_font profile:drawFace(canvas, x + 99, y + 47, self.face_parts) -- Portrait self.ui.app.map:draw(canvas, px, py, 71, 81, x + 16, y + 44) -- Viewport font:draw(canvas, profile.name, x + 20, y + 20) -- Name font:draw(canvas, "$" .. profile.wage, x + 60, y + 178) -- Wage -- Ability -- Note: The bar looks like "attention to detail", but actually ability level -- is displayed here. This was the same in TH, and makes more sense. -- However at some point we should fix the graphics to look like an ability bar. local ability_bar_width = math.floor(profile.skill * 40 + 0.5) if ability_bar_width ~= 0 then for dx = 0, ability_bar_width - 1 do self.panel_sprites:draw(canvas, 295, x + 42 + dx, y + 230) end end if self.staff.profile.humanoid_class == "Doctor" then self:drawDoctorAttributes(canvas) end -- Complaint text self.black_font:drawWrapped(canvas, self.text, x + 200, y + 20, 140) end function UIStaffRise:drawDoctorAttributes(canvas) local profile = self.staff.profile local x, y = self.x, self.y -- Junior / Doctor / Consultant marker local marker_x = x + 98 if profile.is_junior then elseif profile.is_consultant then marker_x = marker_x + 52 else marker_x = marker_x + 22 end self.panel_sprites:draw(canvas, 296, marker_x, y + 230) -- Ability markers if profile.is_surgeon >= 1.0 then self.panel_sprites:draw(canvas, 292, x + 74, y + 133) end if profile.is_psychiatrist >= 1.0 then self.panel_sprites:draw(canvas, 293, x + 90, y + 139) end if profile.is_researcher >= 1.0 then self.panel_sprites:draw(canvas, 294, x + 120, y + 138) end end function UIStaffRise:fireStaff() self.staff.message_callback = nil self.staff:fire() self:close() local world = self.ui.app.world if world and world:isCurrentSpeed("Pause") then world:setSpeed(world.prev_speed) end end function UIStaffRise:increaseSalary() self.staff.message_callback = nil self.staff:increaseWage(self.rise_amount) self.staff.quitting_in = nil self:close() local world = self.ui.app.world if world and world:isCurrentSpeed("Pause") then world:setSpeed(world.prev_speed) end end function UIStaffRise:afterLoad(old, new) Window.afterLoad(self, old, new) if not self.black_font then self.black_font = self.ui.app.gfx:loadFont("QData", "Font00V") end end CorsixTH-0.63/CorsixTH/Lua/dialogs/tree_ctrl.lua000066400000000000000000000507421347163623700215250ustar00rootroot00000000000000--[[ Copyright (c) 2010 Peter "Corsix" Cawley 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. --]] --! Iterface for items within a UI tree control class "TreeNode" ---@type TreeNode local TreeNode = _G["TreeNode"] function TreeNode:TreeNode() self.is_expanded = false self.num_visible_descendants = 0 end --! Get the number of childrem which the item has function TreeNode:getChildCount() error("To be implemented in subclasses") end --! Query if the item has any children at all. --! The simple way of doing this is checking if getChildCount() is non-zero, -- but often this can be implemented in a more efficient manner. function TreeNode:hasChildren() return self:getChildCount() ~= 0 end --! Get a child of the item. --!param idx (integer) An integer between 1 and getChildCount() (inclusive). function TreeNode:getChildByIndex(idx) error("To be implemented in subclasses") end --! Given a child of the item, determine which index it is --!param child (TreeNode) A value returned from getChildByIndex() function TreeNode:getIndexOfChild(child) error("To be implemented in subclasses") end --! Get the text to be displayed for the item function TreeNode:getLabel() error("To be implemented in subclasses") end --! Get the item's parent, if it has one function TreeNode:getParent() return self.parent end --! Get the tree control within which the item is displayed function TreeNode:getControl() return self.control or self:getParent():getControl() end --! Query whether the item's children are visible function TreeNode:isExpanded() return self.is_expanded end --! Get the background colour for when the item is highlighted function TreeNode:getHighlightColour(canvas) return nil end --! Get the background colour for when the item is selected function TreeNode:getSelectColour(canvas) return canvas:mapRGB(174, 166, 218) end --! Make the children of the item visible function TreeNode:expand() if self.is_expanded then return end self.is_expanded = true self.num_visible_descendants = 0 for i = 1, self:getChildCount() do self.num_visible_descendants = self.num_visible_descendants + 1 + self:getChildByIndex(i).num_visible_descendants end local parent = self:getParent() while parent do parent.num_visible_descendants = parent.num_visible_descendants + self.num_visible_descendants parent = parent:getParent() end self:getControl():onNumVisibleNodesChange() end --! Make the children of the item invisible function TreeNode:contract() if not self.is_expanded then return end self.is_expanded = false local parent = self:getParent() while parent do parent.num_visible_descendants = parent.num_visible_descendants - self.num_visible_descendants parent = parent:getParent() end self.num_visible_descendants = 0 self:getControl():onNumVisibleNodesChange() end --! The number of visible items in the set of this item and all its descendants function TreeNode:numVisibleDescendants() if self.hidden then return self.num_visible_descendants else return self.num_visible_descendants + 1 end end --! Get the depth from the root item to this item. --! The root item has level 0, its direct children have level 1, etc. function TreeNode:getLevel() local level = self.level if not level then local parent = self:getParent() if parent then level = parent:getLevel() + 1 else level = 0 end self.level = level end return level end --! Get the previous item in the on-screen display order function TreeNode:getPrevVisible() local parent = self:getParent() if not parent then return end local idx = parent:getIndexOfChild(self) if idx == 1 then return parent else local prev = parent:getChildByIndex(idx - 1) while prev:isExpanded() do if not prev:hasChildren() then break else prev = prev:getChildByIndex(prev:getChildCount()) end end return prev end end --! Get the next item in the on-screen display order function TreeNode:getNextVisible() if self:isExpanded() and self:hasChildren() then return self:getChildByIndex(1) end while true do local parent = self:getParent() if not parent then return end local idx = parent:getIndexOfChild(self) if idx == parent:getChildCount() then self = parent else return parent:getChildByIndex(idx + 1) end end end --! A tree node representing a file (or directory) in the physical file-system. class "FileTreeNode" (TreeNode) ---@type FileTreeNode local FileTreeNode = _G["FileTreeNode"] local pathsep = package.config:sub(1, 1) function FileTreeNode:FileTreeNode(path) self:TreeNode() if path:sub(-1) == pathsep and path ~= pathsep then path = path:sub(1, -2) end self.path = path self.children = {} self.has_looked_for_children = false -- Default sorting is by name self.sort_by = "name" self.order = "ascending" end function FileTreeNode:isDirectory() return lfs.attributes(self.path, "mode") == "directory" end --- --@param (optional) return the most recently modified child file which has this string in its name. --@return nil if no child file is found otherwise return the FileTreedNode for mostly recently modified child file. function FileTreeNode:getMostRecentlyModifiedChildFile(file_name_filter) self:checkForChildren() self:reSortChildren("date", "descending") local most_recently_mod_child_dir_file = nil local root_child = nil --A. Search for files matching the file name filter in the root directory and its child directories: for i = 1, self:getChildCount(), 1 do root_child = self:getChildByIndex(i) -- 1. Get the most recently modified child directory file which matches the name filter: if root_child:isDirectory() then local current_child_dir_file = root_child:getMostRecentlyModifiedChildFile(file_name_filter) if current_child_dir_file ~= nil then if most_recently_mod_child_dir_file == nil then most_recently_mod_child_dir_file = current_child_dir_file elseif current_child_dir_file:getLastModification() > most_recently_mod_child_dir_file:getLastModification() then most_recently_mod_child_dir_file = current_child_dir_file end end -- Sort always puts directories first so when this else closure is reached in this iterative for loop -- all the sub directories will have been checked: else -- 2. Get the most recently modified root directory file which matches the name filter: local matches_filter = true if(file_name_filter) then matches_filter = string.find(root_child:getLabel(), file_name_filter) end -- End this for loop to begin step B: if matches_filter then break end end root_child = nil end --B. Return the most recently modified file or nil if no file matching the name filter was found: if most_recently_mod_child_dir_file then if root_child then if root_child:getLastModification() > most_recently_mod_child_dir_file:getLastModification() then return root_child end end return most_recently_mod_child_dir_file elseif root_child then return root_child else return nil end end function FileTreeNode:childPath(item) if self.path:sub(-1, -1) == pathsep then return self.path .. item else return self.path .. pathsep .. item end end function FileTreeNode:hasChildren() if self.has_looked_for_children then return #self.children ~= 0 elseif self.has_children == nil then if self:getLevel() == 0 then -- Assume root level things have children until we really need to check return true end self.has_children = false -- Only directories have children. if lfs.attributes(self.path, "mode") ~= "directory" then return false end local status, err, dir_obj = pcall(lfs.dir, self.path) if not status then print("Error while fetching children for " .. self.path .. ": " .. err) else for item in dir_obj.next, dir_obj do if self:isValidFile(item) then self.has_children = true break end end dir_obj:close() end end return self.has_children end --! Returns whether the given file name is valid -- in this tree. Override for desired behaviour. function FileTreeNode:isValidFile(name) return name ~= "." and name ~= ".." end function FileTreeNode:createNewNode(path) return FileTreeNode(path) end function FileTreeNode:expand() TreeNode.expand(self) self:reSortChildren(self.sort_by, self.order) end local function sort_by_key(t1, t2) local second_mode = lfs.attributes(t2.path, "mode") == "directory" if lfs.attributes(t1.path, "mode") == "directory" then if second_mode then if t1.order == "ascending" then return t1.sort_key < t2.sort_key else return t1.sort_key > t2.sort_key end else return true end else if second_mode then return false else if t1.order == "ascending" then return t1.sort_key < t2.sort_key else return t1.sort_key > t2.sort_key end end end end --! Sorts the node and its children either by date or by name. --!param sort_by What to sort by. Either "name" or "date". --!param order If the ordering should be "ascending" or "descending". function FileTreeNode:reSortChildren(sort_by, order) for _, child in ipairs(self.children) do if sort_by == "date" then child.sort_key = lfs.attributes(child.path, "modification") child.sort_by = sort_by child.order = order elseif sort_by == "name" then child.sort_key = child:getLabel():lower() child.sort_by = sort_by child.order = order else -- No sorting return end end table.sort(self.children, sort_by_key) for i, child in ipairs(self.children) do self.children[child] = i child:reSortChildren(sort_by, order) end end function FileTreeNode:checkForChildren() if not self.has_looked_for_children then self.has_looked_for_children = true if self.has_children == false then -- Already checked and found nothing return end for item in lfs.dir(self.path) do local path = self:childPath(item) if self:isValidFile(item) then local node = self:createNewNode(path) node.sort_key = item:lower() self.children[#self.children + 1] = node end end for i, child in ipairs(self.children) do self.children[child] = i self.children[child.sort_key] = i child.parent = self end end end function FileTreeNode:getHighlightColour(canvas) local highlight_colour = self.highlight_colour if highlight_colour == nil then highlight_colour = false if type(self.filter_by) == "table" then for _, ext in ipairs(self.filter_by) do if string.sub(self.path:lower(), -string.len(ext)) == ext then self.is_valid_file = true highlight_colour = canvas:mapRGB(0, 255, 0) end end elseif self.filter_by and string.sub(self.path:lower(), -string.len(self.filter_by)) == self.filter_by then self.is_valid_file = true highlight_colour = canvas:mapRGB(0, 255, 0) end self.highlight_colour = highlight_colour end return highlight_colour or nil end function FileTreeNode:getChildCount() self:checkForChildren() return #self.children end function FileTreeNode:getChildByIndex(idx) self:checkForChildren() return self.children[idx] end function FileTreeNode:getIndexOfChild(child) return self.children[child] end function FileTreeNode:getLabel() local label = self.label if not label then local parent = self:getParent() if parent and parent.path then if parent.path:sub(-1, -1) == pathsep then label = self.path:sub(#parent.path + 1, -1) else label = self.path:sub(#parent.path + 2, -1) end else label = self.path end self.label = label end return label end function FileTreeNode:getLastModification() return lfs.attributes(self.path, "modification") end --! Selects an item. By default everything selected is valid. Can be overridden -- by inheriting classes. function FileTreeNode:select() self.is_valid_directory = true end --! A tree node which can be used as a root node to give the effect of having -- multiple root nodes. class "DummyRootNode" (TreeNode) ---@type DummyRootNode local DummyRootNode = _G["DummyRootNode"] --!param roots (array) An array of `TreeNode`s which should be displayed as -- root nodes. function DummyRootNode:DummyRootNode(roots) self:TreeNode() self.children = {} for i, child in ipairs(roots) do self.children[i] = child self.children[child] = i child.parent = self end self.level = -1 -- to make children level 0 self.hidden = true end function DummyRootNode:getChildCount() return #self.children end function DummyRootNode:getChildByIndex(idx) return self.children[idx] end function DummyRootNode:getIndexOfChild(child) return self.children[child] end --! A control (to be placed on a window) which allows the user to navigate a -- tree of items and select one item from it. class "TreeControl" (Window) ---@type TreeControl local TreeControl = _G["TreeControl"] --!param root (TreeNode) The single root node of the tree (use a `DummyRootNode` -- here if multiple root nodes are desired). --!param x (integer) The X-position, in pixels, where the control should start -- within its parent. --!param y (integer) The Y-position, in pixels, where the control should start -- within its parent. --!param width (integer) The width, in pixels, of the control. --!param height (integer) The height, in pixels, of the control. --!param col_bg (table) The background colour of the control - this should be -- a table with `red`, `green`, and `blue` fields, each an integer between 0 -- and 255. --!param col_fg (table) The colour used for the scrollbar and highlighted items. function TreeControl:TreeControl(root, x, y, width, height, col_bg, col_fg, y_offset, has_font) -- Setup the base window self:Window() self.x = x self.y = y self.width = width self.height = height self.y_offset = y_offset or 0 -- Load the graphical resources local gfx = TheApp.gfx if not has_font then self.font = gfx:loadBuiltinFont() else self.font = TheApp.gfx:loadFont("QData", "Font01V") end self.tree_sprites = gfx:loadSpriteTable("Bitmap", "tree_ctrl", true, gfx:loadPalette("Bitmap", "tree_ctrl.pal")) -- Calculate sizes and counts local scrollbar_width = 20 self.row_height = 14 self.tree_rect = { x = 0, y = 0, w = width - scrollbar_width, h = height - height % self.row_height, } self.num_rows = (self.tree_rect.h - self.y_offset) / self.row_height self:addBevelPanel(0, 0, width, height, col_bg).lowered = true local scrollbar_base = self:addBevelPanel(width - scrollbar_width, 0, scrollbar_width, height, col_bg) scrollbar_base.lowered = true self.scrollbar = scrollbar_base:makeScrollbar(col_fg, --[[persistable:tree_ctrl_scrollbar_callback]] function() self:onScroll() end, 1, 1, self.num_rows) self.tree_root = root if root.hidden then self.first_visible_node = root:getChildByIndex(1) else self.first_visible_node = root end root.control = self self.first_visible_ordinal = 1 root:expand() end function TreeControl:hitTestTree(x, y) local rect = self.tree_rect x = x - rect.x y = y - rect.y - self.y_offset if 0 <= x and 0 <= y and x < rect.w and y < rect.h then local n = math.floor(y / self.row_height) local node = self.first_visible_node while n ~= 0 and node do node = node:getNextVisible() n = n - 1 end if n == 0 then if node then local level = node:getLevel() if x > level * 14 then if x < (level+1) * 14 then return node, true else return node, false end end end end end end function TreeControl:onMouseMove(x, y) local redraw = Window.onMouseMove(self, x, y) local node, expand = self:hitTestTree(x, y) if expand and self.highlighted_node ~= nil then self.highlighted_node = nil return redraw elseif not expand and node ~= self.highlighted_node then self.highlighted_node = node return redraw end return redraw end function TreeControl:onMouseDown(button, x, y) local redraw = Window.onMouseDown(self, button, x, y) if button ~= 4 and button ~= 5 then -- NB: 4 and 5 are scrollwheel self.mouse_down_in_self = false if 0 <= x and 0 <= y and x < self.width and y < self.height then self.mouse_down_in_self = true redraw = true end end return redraw end function TreeControl:setSelectCallback(callback) self.select_callback = callback return self end function TreeControl:onMouseUp(button, x, y) local redraw = Window.onMouseUp(self, button, x, y) local node, expand = self:hitTestTree(x, y) if self.mouse_down_in_self and node then if expand then if node:hasChildren() then if node:isExpanded() then node:contract() else node:expand() end redraw = true end elseif self.selected_node == node and self.select_callback then self.select_callback(node) redraw = true else self.selected_node = node node:select() redraw = true end end self.mouse_down_in_self = false return redraw end function TreeControl:onMouseWheel(x, y) self.scrollbar:setXorY(self.scrollbar:getXorY() - y * 8) end function TreeControl:onNumVisibleNodesChange() self.scrollbar:setRange(1, self.tree_root:numVisibleDescendants(), self.num_rows, self.first_visible_ordinal) end function TreeControl:onScroll() if self.scrollbar.value > self.first_visible_ordinal then for _ = 1, self.scrollbar.value - self.first_visible_ordinal do self.first_visible_node = self.first_visible_node:getNextVisible() end elseif self.scrollbar.value < self.first_visible_ordinal then for _ = 1, self.first_visible_ordinal - self.scrollbar.value do self.first_visible_node = self.first_visible_node:getPrevVisible() end end self.first_visible_ordinal = self.scrollbar.value end --! Override this function if a certain row should have certain text -- or additional flavour to it. function TreeControl:drawExtraOnRow(canvas, node, x, y) end function TreeControl:draw(canvas, x, y) Window.draw(self, canvas, x, y) x = x + self.x + self.tree_rect.x y = y + self.y + self.tree_rect.y + self.y_offset local node = self.first_visible_node local num_nodes_drawn = 0 while node and num_nodes_drawn < self.num_rows do local level = node:getLevel() for i = 0, level - 1 do self.tree_sprites:draw(canvas, 1, x + i * 14, y) end if node == self.highlighted_node then local offset = (level + 1) * 14 local colour = node:getHighlightColour(canvas) or self.scrollbar.slider.colour canvas:drawRect(colour, x + offset - 1, y, self.tree_rect.w - offset - 1, self.row_height) end if node == self.selected_node then local offset = (level + 1) * 14 local colour = node:getSelectColour(canvas) or self.scrollbar.slider.colour canvas:drawRect(colour, x + offset - 1, y, self.tree_rect.w - offset - 1, self.row_height) end local icon if not node:hasChildren() then icon = 2 elseif node:isExpanded() then icon = 4 else icon = 3 end self.tree_sprites:draw(canvas, icon, x + level * 14, y) self.font:draw(canvas, node:getLabel(), x + (level + 1) * 14, y + 2) self:drawExtraOnRow(canvas, node, x, y) y = y + self.row_height num_nodes_drawn = num_nodes_drawn + 1 node = node:getNextVisible() end end CorsixTH-0.63/CorsixTH/Lua/dialogs/watch.lua000066400000000000000000000151331347163623700206430ustar00rootroot00000000000000--[[ Copyright (c) 2009 Peter "Corsix" Cawley 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. --]] --! Timer / clock / watch / countdown dialog for emergencies / level start --! The timer lasts approximately 100 days, split into 13 segments class "UIWatch" (Window) ---@type UIWatch local UIWatch = _G["UIWatch"] --!param count_type (string) One of: "open_countdown" or "emergency" or "epidemic" function UIWatch:UIWatch(ui, count_type) self:Window() local app = ui.app self.esc_closes = false self.modal_class = "open_countdown" self.tick_rate = math.floor((100 * Date.hoursPerDay()) / 13) self.tick_timer = self.tick_rate -- Initialize tick timer self.open_timer = 12 self.ui = ui self.hospital = ui.hospital self.width = 39 self.height = 79 self:setDefaultPosition(20, -100) self.panel_sprites = app.gfx:loadSpriteTable("Data", "Watch01V", true) self.epidemic = false self.count_type = count_type -- For cycling the list of epidemic/emergency patients which index to use self.current_index = nil -- The last patient whose dialog was opened by clicking the timer self.lastCycledPatient = nil local end_sprite = (count_type == "epidemic") and 14 or 16 local tooltips = { ["initial_opening"] = _S.tooltip.watch.hospital_opening, ["emergency"] = _S.tooltip.watch.emergency, ["epidemic"] = _S.tooltip.watch.epidemic, } if count_type == "epidemic" then self.end_button = self:addPanel(end_sprite, 4, 0) :makeButton(4, 0, 27, 28, end_sprite + 1, self.toggleVaccinationMode) :setTooltip(tooltips[count_type]) elseif count_type ~= "emergency" then self.end_button = self:addPanel(end_sprite, 4, 0) :makeButton(4, 0, 27, 28, end_sprite + 1, self.onCountdownEnd) :setTooltip(tooltips[count_type]) end local timer_sprite = 13 if count_type == "epidemic" or count_type == "emergency" then self:addPanel(timer_sprite, 0, 28) :setTooltip(tooltips[count_type]) :makeButton(timer_sprite, 0, 25, 50, timer_sprite, self.scrollToTimerEventPatient, nil, self.cycleTimerEventPatient) else self:addPanel(timer_sprite, 0, 28):setTooltip(tooltips[count_type]) end self:addPanel(1, 2, 47) end function UIWatch:onCountdownEnd() self:close() if self.count_type == "emergency" then self.ui.hospital:resolveEmergency() elseif self.count_type == "epidemic" then local epidemic = self.hospital.epidemic if epidemic and not epidemic.inspector then epidemic:spawnInspector() if epidemic.vaccination_mode_active then epidemic:toggleVaccinationMode() end end elseif self.count_type == "initial_opening" then self.ui.hospital.opened = true self.ui.hospital.boiler_can_break = true -- boiler can't break whilst build timer is open self.ui:playSound("fanfare.wav") end end function UIWatch:onWorldTick() if self.tick_timer == 0 and self.open_timer >= 0 then -- Used for making a smooth animation self.tick_timer = self.tick_rate self.open_timer = self.open_timer - 1 if self.open_timer == 11 then self:addPanel(2, 2, 47) elseif self.open_timer == 0 then self.panels[#self.panels].sprite_index = 0 elseif self.open_timer < 11 and self.open_timer > 0 then self.panels[#self.panels].sprite_index = 13 - self.open_timer if self.open_timer == 5 then table.remove(self.panels, #self.panels - 1) end end elseif self.open_timer == -1 then -- the timer is at 0 when it is completely red. self:onCountdownEnd() -- Countdown terminated, so we open the hospital or ends the epidemic panic else self.tick_timer = self.tick_timer - 1 end end --[[! Toggles vaccination mode by toggling the button then toggling the mode in the current epidemic.]] function UIWatch:toggleVaccinationMode() local epidemic = self.hospital.epidemic self.end_button:toggle() epidemic:toggleVaccinationMode() end --[[! During an emergency - Cycles through the patient dialogs of all the emergency patients ! During an epidemic - Cycles to the first patient who is infected but not vaccinated]] function UIWatch:cycleTimerEventPatient() self.ui:playSound("camclick.wav") local hospital = self.ui.hospital if self.count_type == "emergency" then local patients = hospital.emergency_patients if #patients > 0 then if not self.current_index or self.current_index == #patients then self.current_index = 1 else self.current_index = self.current_index + 1 end self.lastCycledPatient = patients[self.current_index] self.ui:addWindow(UIPatient(self.ui, self.lastCycledPatient)) end else for _, infected_patient in ipairs(hospital.epidemic.infected_patients) do if not infected_patient.vaccinated and not infected_patient.cured then self.lastCycledPatient = infected_patient self.ui:addWindow(UIPatient(self.ui, self.lastCycledPatient)) break end end end end --[[! While cycling through timer event patients (@see UIWatch:cycleTimerEventPatient) scrolls the screen to centre on the selected patient If a patient dialog is open that does not belong to the timer event, does nothing]] function UIWatch:scrollToTimerEventPatient() self.ui:playSound("camclick.wav") local patient = self.lastCycledPatient if patient then -- Current open dialog local current_patient_dialog = self.ui:getWindow(UIPatient) if not current_patient_dialog then -- Create the dialog but don't add it to the window local patient_dialog = UIPatient(self.ui, patient) patient_dialog:scrollToPatient() elseif patient == current_patient_dialog.patient then current_patient_dialog:scrollToPatient() end end end CorsixTH-0.63/CorsixTH/Lua/diseases/000077500000000000000000000000001347163623700172055ustar00rootroot00000000000000CorsixTH-0.63/CorsixTH/Lua/diseases/alien_dna.lua000066400000000000000000000060021347163623700216200ustar00rootroot00000000000000--[[ Copyright (c) 2011 Manuel "Roujin" Wolf 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. --]] local disease = {} disease.id = "alien_dna" disease.expertise_id = 8 disease.visuals_id = 6 disease.name = _S.diseases.alien_dna.name disease.cause = _S.diseases.alien_dna.cause disease.symptoms = _S.diseases.alien_dna.symptoms disease.cure = _S.diseases.alien_dna.cure disease.cure_price = 2000 disease.emergency_sound = "emerg020.wav" disease.emergency_number = 16 disease.contagious = false disease.must_stand = TheApp.config.alien_dna_must_stand -- Alien Patients are forced to stand while queueing because of missing animation disease.only_emergency = TheApp.config.alien_dna_only_by_emergency -- TODO implement (there are no normal door animations, so they cannot go to GP) disease.initPatient = function(patient) local which = math.random(0, 1) -- male or female? patient:setType((which == 0) and "Alien Male Patient" or "Alien Female Patient") patient.change_into = (which == 0) and "Standard Male Patient" or "Standard Female Patient" if which == 0 then patient:setLayer(0, math.random(1, 5) * 2) -- 5 variations for males patient:setLayer(2, math.random(0, 1) * 2) -- + alternate shoes else patient:setLayer(0, math.random(2, 4) * 2) -- NB: for layer0 = 2 head is missing in death animation, so it's not used patient:setLayer(2, 0) end patient:setLayer(1, math.random(0, 3) * 2) -- 3 clothes variations for both genders patient:setLayer(3, 0) patient:setLayer(4, 0) patient.should_knock_on_doors = TheApp.config.alien_dna_can_knock_on_doors end -- Diagnosis rooms are the rooms other than the GPs office which can be visited -- to aid in diagnosis. The need not be visited, and if they are visited, the -- order in which they are visited is not fixed. disease.diagnosis_rooms = { } -- Treatment rooms are the rooms which must be visited, in the given order, to -- cure the disease. disease.treatment_rooms = { "dna_fixer", } -- If a machine is required a small icon should appear in the drug casebook. disease.requires_machine = true return disease CorsixTH-0.63/CorsixTH/Lua/diseases/baldness.lua000066400000000000000000000045341347163623700215110ustar00rootroot00000000000000--[[ Copyright (c) 2010 Miika-Petteri Matikainen 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. --]] local disease = {} disease.id = "baldness" disease.expertise_id = 10 disease.visuals_id = 8 disease.name = _S.diseases.baldness.name disease.cause = _S.diseases.baldness.cause disease.symptoms = _S.diseases.baldness.symptoms disease.cure = _S.diseases.baldness.cure disease.cure_price = 950 disease.emergency_sound = "emerg012.wav" disease.emergency_number = 18 disease.contagious = false disease.initPatient = function(patient) patient:setType("Slack Male Patient") patient:setLayer(0, 12) patient:setLayer(1, math.random(0, 3) * 2) patient:setLayer(2, 0) patient:setLayer(3, 0) patient:setLayer(4, 0) -- Disable knocking doors as there is no door knocking animation in layer 0 with 12 (bald head) patient.should_knock_on_doors = false end -- Diagnosis rooms are the rooms other than the GPs office which can be visited -- to aid in diagnosis. The need not be visited, and if they are visited, the -- order in which they are visited is not fixed. disease.diagnosis_rooms = { "x_ray", "blood_machine", "scanner", } -- Treatment rooms are the rooms which must be visited, in the given order, to -- cure the disease. disease.treatment_rooms = { "hair_restoration", } -- If a machine is required a small icon should appear in the drug casebook. disease.requires_machine = true return disease CorsixTH-0.63/CorsixTH/Lua/diseases/bloaty_head.lua000066400000000000000000000044161347163623700221700ustar00rootroot00000000000000--[[ Copyright (c) 2009 Peter "Corsix" Cawley 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. --]] local disease = {} disease.id = "bloaty_head" disease.expertise_id = 2 disease.visuals_id = 0 disease.name = _S.diseases.bloaty_head.name disease.cause = _S.diseases.bloaty_head.cause disease.symptoms = _S.diseases.bloaty_head.symptoms disease.cure = _S.diseases.bloaty_head.cure disease.cure_price = 850 disease.emergency_sound = "emerg007.wav" disease.emergency_number = 18 disease.contagious = false disease.initPatient = function(patient) patient:setType("Standard Male Patient") patient:setLayer(0, math.random(6, 8) * 2) patient:setLayer(1, math.random(0, 3) * 2) patient:setLayer(2, math.random(0, 1) * 2) patient:setLayer(3, 0) patient:setLayer(4, 0) end -- Diagnosis rooms are the rooms other than the GPs office which can be visited -- to aid in diagnosis. The need not be visited, and if they are visited, the -- order in which they are visited is not fixed. disease.diagnosis_rooms = { "general_diag", "x_ray", "cardiogram", "scanner", } -- Treatment rooms are the rooms which must be visited, in the given order, to -- cure the disease. disease.treatment_rooms = { "inflation", } -- If a machine is required a small icon should appear in the drug casebook. disease.requires_machine = true return disease CorsixTH-0.63/CorsixTH/Lua/diseases/broken_heart.lua000066400000000000000000000046361347163623700223640ustar00rootroot00000000000000--[[ Copyright (c) 2010 Peter "Corsix" Cawley 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. --]] local disease = {} disease.id = "broken_heart" disease.expertise_id = 20 disease.non_visuals_id = 4 disease.name = _S.diseases.broken_heart.name disease.cause = _S.diseases.broken_heart.cause disease.symptoms = _S.diseases.broken_heart.symptoms disease.cure = _S.diseases.broken_heart.cure disease.cure_price = 1900 disease.emergency_sound = "emerg025.wav" disease.emergency_number = 6 disease.contagious = true disease.initPatient = function(patient) if math.random(0, 1) == 0 then patient:setType("Standard Male Patient") patient:setLayer(0, math.random(1, 5) * 2) patient:setLayer(2, math.random(0, 2) * 2) else patient:setType("Standard Female Patient") patient:setLayer(0, math.random(1, 4) * 2) patient:setLayer(2, 0) end patient:setLayer(1, math.random(0, 3) * 2) patient:setLayer(3, 0) patient:setLayer(4, 0) end -- Diagnosis rooms are the rooms other than the GPs office which can be visited -- to aid in diagnosis. The need not be visited, and if they are visited, the -- order in which they are visited is not fixed. disease.diagnosis_rooms = { "general_diag", "cardiogram", "scanner", "ultrascan", "blood_machine", "x_ray", "psych", "ward", } -- Treatment rooms are the rooms which must be visited, in the given order, to -- cure the disease. disease.treatment_rooms = { "ward", "operating_theatre", } return disease CorsixTH-0.63/CorsixTH/Lua/diseases/broken_wind.lua000066400000000000000000000046721347163623700222220ustar00rootroot00000000000000--[[ Copyright (c) 2009 Haico "brainball" van Roeden Based on gut_rot.lua by Edvin "Lego3" Linge 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. --]] local disease = {} disease.id = "broken_wind" disease.expertise_id = 17 disease.non_visuals_id = 1 disease.name = _S.diseases.broken_wind.name disease.cause = _S.diseases.broken_wind.cause disease.symptoms = _S.diseases.broken_wind.symptoms disease.cure = _S.diseases.broken_wind.cure disease.cure_price = 1300 disease.emergency_sound = "emerg016.wav" disease.emergency_number = 14 disease.contagious = true disease.initPatient = function(patient) if math.random(0, 1) == 0 then patient:setType("Standard Male Patient") patient:setLayer(0, math.random(1, 5) * 2) patient:setLayer(2, math.random(0, 2) * 2) else patient:setType("Standard Female Patient") patient:setLayer(0, math.random(1, 4) * 2) patient:setLayer(2, 0) end patient:setLayer(1, math.random(0, 3) * 2) patient:setLayer(3, 0) patient:setLayer(4, 0) end -- Diagnosis rooms are the rooms other than the GPs office which can be visited -- to aid in diagnosis. The need not be visited, and if they are visited, the -- order in which they are visited is not fixed. disease.diagnosis_rooms = { "general_diag", "cardiogram", "scanner", "ultrascan", "blood_machine", "x_ray", "psych", "ward", } -- Treatment rooms are the rooms which must be visited, in the given order, to -- cure the disease. disease.treatment_rooms = { "pharmacy", } return disease CorsixTH-0.63/CorsixTH/Lua/diseases/chronic_nosehair.lua000066400000000000000000000047221347163623700232320ustar00rootroot00000000000000--[[ Copyright (c) 2009 Haico "brainball" van Roeden Based on gut_rot.lua by Edvin "Lego3" Linge 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. --]] local disease = {} disease.id = "chronic_nosehair" disease.expertise_id = 25 disease.non_visuals_id = 9 disease.name = _S.diseases.chronic_nosehair.name disease.cause = _S.diseases.chronic_nosehair.cause disease.symptoms = _S.diseases.chronic_nosehair.symptoms disease.cure = _S.diseases.chronic_nosehair.cure disease.cure_price = 800 disease.emergency_sound = "emerg029.wav" disease.emergency_number = 18 disease.contagious = true disease.initPatient = function(patient) if math.random(0, 1) == 0 then patient:setType("Standard Male Patient") patient:setLayer(0, math.random(1, 5) * 2) patient:setLayer(2, math.random(0, 2) * 2) else patient:setType("Standard Female Patient") patient:setLayer(0, math.random(1, 4) * 2) patient:setLayer(2, 0) end patient:setLayer(1, math.random(0, 3) * 2) patient:setLayer(3, 0) patient:setLayer(4, 0) end -- Diagnosis rooms are the rooms other than the GPs office which can be visited -- to aid in diagnosis. The need not be visited, and if they are visited, the -- order in which they are visited is not fixed. disease.diagnosis_rooms = { "general_diag", "cardiogram", "scanner", "ultrascan", "blood_machine", "x_ray", "psych", "ward", } -- Treatment rooms are the rooms which must be visited, in the given order, to -- cure the disease. disease.treatment_rooms = { "pharmacy", } return disease CorsixTH-0.63/CorsixTH/Lua/diseases/corrugated_ankles.lua000066400000000000000000000047271347163623700234160ustar00rootroot00000000000000--[[ Copyright (c) 2009 Haico "brainball" van Roeden Based on gut_rot.lua by Edvin "Lego3" Linge 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. --]] local disease = {} disease.id = "corrugated_ankles" disease.expertise_id = 24 disease.non_visuals_id = 8 disease.name = _S.diseases.corrugated_ankles.name disease.cause = _S.diseases.corrugated_ankles.cause disease.symptoms = _S.diseases.corrugated_ankles.symptoms disease.cure = _S.diseases.corrugated_ankles.cure disease.cure_price = 800 disease.emergency_sound = "emerg028.wav" disease.emergency_number = 18 disease.contagious = true disease.initPatient = function(patient) if math.random(0, 1) == 0 then patient:setType("Standard Male Patient") patient:setLayer(0, math.random(1, 5) * 2) patient:setLayer(2, math.random(0, 2) * 2) else patient:setType("Standard Female Patient") patient:setLayer(0, math.random(1, 4) * 2) patient:setLayer(2, 0) end patient:setLayer(1, math.random(0, 3) * 2) patient:setLayer(3, 0) patient:setLayer(4, 0) end -- Diagnosis rooms are the rooms other than the GPs office which can be visited -- to aid in diagnosis. The need not be visited, and if they are visited, the -- order in which they are visited is not fixed. disease.diagnosis_rooms = { "general_diag", "cardiogram", "scanner", "ultrascan", "blood_machine", "x_ray", "psych", "ward", } -- Treatment rooms are the rooms which must be visited, in the given order, to -- cure the disease. disease.treatment_rooms = { "pharmacy", } return disease CorsixTH-0.63/CorsixTH/Lua/diseases/discrete_itching.lua000066400000000000000000000047341347163623700232270ustar00rootroot00000000000000 --[[ Copyright (c) 2009 Haico "brainball" van Roeden Based on gut_rot.lua by Edvin "Lego3" Linge 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. --]] local disease = {} disease.id = "discrete_itching" disease.expertise_id = 11 disease.visuals_id = 9 disease.name = _S.diseases.discrete_itching.name disease.cause = _S.diseases.discrete_itching.cause disease.symptoms = _S.diseases.discrete_itching.symptoms disease.cure = _S.diseases.discrete_itching.cure disease.cure_price = 700 disease.emergency_sound = "emerg013.wav" disease.emergency_number = 15 disease.contagious = true disease.initPatient = function(patient) if math.random(0, 1) == 0 then patient:setType("Standard Male Patient") patient:setLayer(0, math.random(1, 5) * 2) patient:setLayer(2, math.random(0, 2) * 2) else patient:setType("Standard Female Patient") patient:setLayer(0, math.random(1, 4) * 2) patient:setLayer(2, 0) end patient:setLayer(1, math.random(0, 3) * 2) patient:setLayer(3, 0) patient:setLayer(4, 0) end -- Diagnosis rooms are the rooms other than the GPs office which can be visited -- to aid in diagnosis. The need not be visited, and if they are visited, the -- order in which they are visited is not fixed. disease.diagnosis_rooms = { "general_diag", "cardiogram", "scanner", "ultrascan", "blood_machine", "x_ray", "psych", "ward", } -- Treatment rooms are the rooms which must be visited, in the given order, to -- cure the disease. disease.treatment_rooms = { "pharmacy", } return disease CorsixTH-0.63/CorsixTH/Lua/diseases/fake_blood.lua000066400000000000000000000045761347163623700220110ustar00rootroot00000000000000--[[ Copyright (c) 2010 Manuel "Roujin" Wolf 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. --]] local disease = {} disease.id = "fake_blood" disease.expertise_id = 27 disease.non_visuals_id = 11 disease.name = _S.diseases.fake_blood.name disease.cause = _S.diseases.fake_blood.cause disease.symptoms = _S.diseases.fake_blood.symptoms disease.cure = _S.diseases.fake_blood.cure disease.cure_price = 800 disease.emergency_sound = "emerg031.wav" disease.emergency_number = 18 disease.contagious = true disease.initPatient = function(patient) if math.random(0, 1) == 0 then patient:setType("Standard Male Patient") patient:setLayer(0, math.random(1, 5) * 2) patient:setLayer(2, math.random(0, 2) * 2) else patient:setType("Standard Female Patient") patient:setLayer(0, math.random(1, 4) * 2) patient:setLayer(2, 0) end patient:setLayer(1, math.random(0, 3) * 2) patient:setLayer(3, 0) patient:setLayer(4, 0) end -- Diagnosis rooms are the rooms other than the GPs office which can be visited -- to aid in diagnosis. The need not be visited, and if they are visited, the -- order in which they are visited is not fixed. disease.diagnosis_rooms = { "general_diag", "cardiogram", "scanner", "ultrascan", "blood_machine", "x_ray", "psych", "ward", } -- Treatment rooms are the rooms which must be visited, in the given order, to -- cure the disease. disease.treatment_rooms = { "psych", } return disease CorsixTH-0.63/CorsixTH/Lua/diseases/fractured_bones.lua000066400000000000000000000064261347163623700230650ustar00rootroot00000000000000--[[ Copyright (c) 2009 Edvin "Lego3" Linge 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. --]] local disease = {} disease.id = "fractured_bones" disease.expertise_id = 9 disease.visuals_id = 7 disease.name = _S.diseases.fractured_bones.name disease.cause = _S.diseases.fractured_bones.cause disease.symptoms = _S.diseases.fractured_bones.symptoms disease.cure = _S.diseases.fractured_bones.cure disease.cure_price = 450 disease.emergency_sound = "emerg005.wav" disease.emergency_number = 16 disease.contagious = false disease.initPatient = function(patient) if not TheApp.config.disable_fractured_bones_females and math.random(1, 2) == 2 then -- The female animation in the cast remover is bad -- so by default it is disabled. They can though be allowed by turning them on in config patient:setType("Standard Female Patient") patient:setLayer(0, math.random(1, 4) * 2) local num1 = math.random(0, 1) -- The first bandage yes/no patient:setLayer(2, num1 * 2) -- There needs to be at least one bandage on the patient patient:setLayer(3, (num1 == 0 and 1 or math.random(0, 1)) * 2) patient:setLayer(4, 0) else patient:setType("Alternate Male Patient") patient:setLayer(0, math.random(1, 5) * 2) -- Some bandage types may be duplicated, then it shall be so local num1 = math.random(0, 2) -- The first bandage yes/no patient:setLayer(2, num1 * 2) local num2 = math.random(0, 5) -- The second bandage yes/no -- 6 does not exist, a few more arm bandages instead if num2 == 3 then num2 = 4 end patient:setLayer(3, num2 * 2) -- There needs to be at least one bandage on the patient local num3 = math.random(0, 5) if num3 == 3 then num3 = 4 end patient:setLayer(4, ((num1 == 0 and num2 == 0) and 1 or num3) * 2) end patient:setLayer(1, math.random(0, 3) * 2) end -- Diagnosis rooms are the rooms other than the GPs office which can be visited -- to aid in diagnosis. The need not be visited, and if they are visited, the -- order in which they are visited is not fixed. disease.diagnosis_rooms = { "scanner", } -- Treatment rooms are the rooms which must be visited, in the given order, to -- cure the disease. disease.treatment_rooms = { "fracture_clinic", } -- If a machine is required a small icon should appear in the drug casebook. disease.requires_machine = true return disease CorsixTH-0.63/CorsixTH/Lua/diseases/gastric_ejections.lua000066400000000000000000000047301347163623700234130ustar00rootroot00000000000000--[[ Copyright (c) 2009 Haico "brainball" van Roeden Based on gut_rot.lua by Edvin "Lego3" Linge 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. --]] local disease = {} disease.id = "gastric_ejections" disease.expertise_id = 28 disease.non_visuals_id = 12 disease.name = _S.diseases.gastric_ejections.name disease.cause = _S.diseases.gastric_ejections.cause disease.symptoms = _S.diseases.gastric_ejections.symptoms disease.cure = _S.diseases.gastric_ejections.cure disease.cure_price = 650 disease.emergency_sound = "emerg032.wav" disease.emergency_number = 15 disease.contagious = true disease.initPatient = function(patient) if math.random(0, 1) == 0 then patient:setType("Standard Male Patient") patient:setLayer(0, math.random(1, 5) * 2) patient:setLayer(2, math.random(0, 2) * 2) else patient:setType("Standard Female Patient") patient:setLayer(0, math.random(1, 4) * 2) patient:setLayer(2, 0) end patient:setLayer(1, math.random(0, 3) * 2) patient:setLayer(3, 0) patient:setLayer(4, 0) end -- Diagnosis rooms are the rooms other than the GPs office which can be visited -- to aid in diagnosis. The need not be visited, and if they are visited, the -- order in which they are visited is not fixed. disease.diagnosis_rooms = { "general_diag", "cardiogram", "scanner", "ultrascan", "blood_machine", "x_ray", "psych", "ward", } -- Treatment rooms are the rooms which must be visited, in the given order, to -- cure the disease. disease.treatment_rooms = { "pharmacy", } return disease CorsixTH-0.63/CorsixTH/Lua/diseases/golf_stones.lua000066400000000000000000000046321347163623700222370ustar00rootroot00000000000000--[[ Copyright (c) 2010 Peter "Corsix" Cawley 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. --]] local disease = {} disease.id = "golf_stones" disease.expertise_id = 34 disease.non_visuals_id = 18 disease.name = _S.diseases.golf_stones.name disease.cause = _S.diseases.golf_stones.cause disease.symptoms = _S.diseases.golf_stones.symptoms disease.cure = _S.diseases.golf_stones.cure disease.cure_price = 1600 disease.emergency_sound = "emerg034.wav" disease.emergency_number = 6 disease.contagious = true disease.initPatient = function(patient) if math.random(0, 1) == 0 then patient:setType("Standard Male Patient") patient:setLayer(0, math.random(1, 5) * 2) patient:setLayer(2, math.random(0, 2) * 2) else patient:setType("Standard Female Patient") patient:setLayer(0, math.random(1, 4) * 2) patient:setLayer(2, 0) end patient:setLayer(1, math.random(0, 3) * 2) patient:setLayer(3, 0) patient:setLayer(4, 0) end -- Diagnosis rooms are the rooms other than the GPs office which can be visited -- to aid in diagnosis. The need not be visited, and if they are visited, the -- order in which they are visited is not fixed. disease.diagnosis_rooms = { "general_diag", "cardiogram", "scanner", "ultrascan", "blood_machine", "x_ray", "psych", "ward", } -- Treatment rooms are the rooms which must be visited, in the given order, to -- cure the disease. disease.treatment_rooms = { "ward", "operating_theatre", } return disease CorsixTH-0.63/CorsixTH/Lua/diseases/gut_rot.lua000066400000000000000000000046151347163623700214010ustar00rootroot00000000000000--[[ Copyright (c) 2009 Edvin "Lego3" Linge 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. --]] local disease = {} disease.id = "gut_rot" disease.expertise_id = 33 disease.non_visuals_id = 17 disease.name = _S.diseases.gut_rot.name disease.cause = _S.diseases.gut_rot.cause disease.symptoms = _S.diseases.gut_rot.symptoms disease.cure = _S.diseases.gut_rot.cure disease.cure_price = 350 disease.emergency_sound = "emerg019.wav" disease.emergency_number = 14 disease.more_loo_use = true disease.contagious = true disease.initPatient = function(patient) if math.random(0, 1) == 0 then patient:setType("Standard Male Patient") patient:setLayer(0, math.random(1, 5) * 2) patient:setLayer(2, math.random(0, 2) * 2) else patient:setType("Standard Female Patient") patient:setLayer(0, math.random(1, 4) * 2) patient:setLayer(2, 0) end patient:setLayer(1, math.random(0, 3) * 2) patient:setLayer(3, 0) patient:setLayer(4, 0) end -- Diagnosis rooms are the rooms other than the GPs office which can be visited -- to aid in diagnosis. The need not be visited, and if they are visited, the -- order in which they are visited is not fixed. disease.diagnosis_rooms = { "general_diag", "cardiogram", "scanner", "ultrascan", "blood_machine", "x_ray", "psych", "ward", } -- Treatment rooms are the rooms which must be visited, in the given order, to -- cure the disease. disease.treatment_rooms = { "pharmacy", } return disease CorsixTH-0.63/CorsixTH/Lua/diseases/hairyitis.lua000066400000000000000000000046441347163623700217250ustar00rootroot00000000000000--[[ Copyright (c) 2009 Edvin "Lego3" Linge 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. --]] local disease = {} disease.id = "hairyitis" disease.expertise_id = 3 disease.visuals_id = 1 disease.name = _S.diseases.hairyitis.name disease.cause = _S.diseases.hairyitis.cause disease.symptoms = _S.diseases.hairyitis.symptoms disease.cure = _S.diseases.hairyitis.cure disease.cure_price = 1150 disease.emergency_sound = "emerg008.wav" disease.emergency_number = 12 disease.contagious = false disease.initPatient = function(patient) patient:setType("Chewbacca Patient") -- NB: Layers have no effect on the appearance until cured, at which point -- they are standard male patient layers. The clinic does however sometimes -- change this so that a female emerge. patient:setLayer(0, math.random(1, 5) * 2) patient:setLayer(1, math.random(0, 3) * 2) patient:setLayer(2, math.random(0, 1) * 2) patient:setLayer(3, 0) patient:setLayer(4, 0) end -- Diagnosis rooms are the rooms other than the GPs office which can be visited -- to aid in diagnosis. The need not be visited, and if they are visited, the -- order in which they are visited is not fixed. disease.diagnosis_rooms = { "x_ray", "scanner", } -- Treatment rooms are the rooms which must be visited, in the given order, to -- cure the disease. disease.treatment_rooms = { "electrolysis", } -- If a machine is required a small icon should appear in the drug casebook. disease.requires_machine = true return disease CorsixTH-0.63/CorsixTH/Lua/diseases/heaped_piles.lua000066400000000000000000000046771347163623700223500ustar00rootroot00000000000000--[[ Copyright (c) 2009 Haico "brainball" van Roeden Based on gut_rot.lua by Edvin "Lego3" Linge 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. --]] local disease = {} disease.id = "heaped_piles" disease.expertise_id = 32 disease.non_visuals_id = 16 disease.name = _S.diseases.heaped_piles.name disease.cause = _S.diseases.heaped_piles.cause disease.symptoms = _S.diseases.heaped_piles.symptoms disease.cure = _S.diseases.heaped_piles.cure disease.cure_price = 400 disease.emergency_sound = "emerg001.wav" disease.emergency_number = 14 disease.contagious = true disease.initPatient = function(patient) if math.random(0, 1) == 0 then patient:setType("Standard Male Patient") patient:setLayer(0, math.random(1, 5) * 2) patient:setLayer(2, math.random(0, 2) * 2) else patient:setType("Standard Female Patient") patient:setLayer(0, math.random(1, 4) * 2) patient:setLayer(2, 0) end patient:setLayer(1, math.random(0, 3) * 2) patient:setLayer(3, 0) patient:setLayer(4, 0) end -- Diagnosis rooms are the rooms other than the GPs office which can be visited -- to aid in diagnosis. The need not be visited, and if they are visited, the -- order in which they are visited is not fixed. disease.diagnosis_rooms = { "general_diag", "cardiogram", "scanner", "ultrascan", "blood_machine", "x_ray", "psych", "ward", } -- Treatment rooms are the rooms which must be visited, in the given order, to -- cure the disease. disease.treatment_rooms = { "pharmacy", } return disease CorsixTH-0.63/CorsixTH/Lua/diseases/infectious_laughter.lua000066400000000000000000000046311347163623700237570ustar00rootroot00000000000000--[[ Copyright (c) 2010 Manuel "Roujin" Wolf 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. --]] local disease = {} disease.id = "infectious_laughter" disease.expertise_id = 23 disease.non_visuals_id = 7 disease.name = _S.diseases.infectious_laughter.name disease.cause = _S.diseases.infectious_laughter.cause disease.symptoms = _S.diseases.infectious_laughter.symptoms disease.cure = _S.diseases.infectious_laughter.cure disease.cure_price = 1500 disease.emergency_sound = "emerg027.wav" disease.emergency_number = 18 disease.contagious = true disease.initPatient = function(patient) if math.random(0, 1) == 0 then patient:setType("Standard Male Patient") patient:setLayer(0, math.random(1, 5) * 2) patient:setLayer(2, math.random(0, 2) * 2) else patient:setType("Standard Female Patient") patient:setLayer(0, math.random(1, 4) * 2) patient:setLayer(2, 0) end patient:setLayer(1, math.random(0, 3) * 2) patient:setLayer(3, 0) patient:setLayer(4, 0) end -- Diagnosis rooms are the rooms other than the GPs office which can be visited -- to aid in diagnosis. The need not be visited, and if they are visited, the -- order in which they are visited is not fixed. disease.diagnosis_rooms = { "cardiogram", "scanner", "ultrascan", "blood_machine", "x_ray", "psych", "ward", } -- Treatment rooms are the rooms which must be visited, in the given order, to -- cure the disease. disease.treatment_rooms = { "psych", } return disease CorsixTH-0.63/CorsixTH/Lua/diseases/invisibility.lua000066400000000000000000000042601347163623700224300ustar00rootroot00000000000000--[[ Copyright (c) 2009 Peter "Corsix" Cawley 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. --]] local disease = {} disease.id = "invisibility" disease.expertise_id = 5 disease.visuals_id = 3 disease.name = _S.diseases.invisibility.name disease.cause = _S.diseases.invisibility.cause disease.symptoms = _S.diseases.invisibility.symptoms disease.cure = _S.diseases.invisibility.cure disease.cure_price = 1400 disease.emergency_sound = "emerg006.wav" disease.emergency_number = 18 disease.contagious = false disease.initPatient = function(patient) patient:setType("Invisible Patient") patient:setLayer(0, 2) patient:setLayer(1, 0) patient:setLayer(2, 4) patient:setLayer(3, 0) patient:setLayer(4, 0) patient.cured_layers = { [0] = math.random(1, 5) * 2, [1] = math.random(0, 3) * 2, [2] = 4, } end -- Diagnosis rooms are the rooms other than the GPs office which can be visited -- to aid in diagnosis. The need not be visited, and if they are visited, the -- order in which they are visited is not fixed. disease.diagnosis_rooms = { "x_ray", "scanner", } -- Treatment rooms are the rooms which must be visited, in the given order, to -- cure the disease. disease.treatment_rooms = { "pharmacy", } return disease CorsixTH-0.63/CorsixTH/Lua/diseases/iron_lungs.lua000066400000000000000000000045221347163623700220720ustar00rootroot00000000000000--[[ Copyright (c) 2010 Peter "Corsix" Cawley 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. --]] local disease = {} disease.id = "iron_lungs" disease.expertise_id = 30 disease.non_visuals_id = 14 disease.name = _S.diseases.iron_lungs.name disease.cause = _S.diseases.iron_lungs.cause disease.symptoms = _S.diseases.iron_lungs.symptoms disease.cure = _S.diseases.iron_lungs.cure disease.cure_price = 1700 disease.emergency_sound = "emerg033.wav" disease.emergency_number = 5 disease.contagious = true disease.initPatient = function(patient) if math.random(0, 1) == 0 then patient:setType("Standard Male Patient") patient:setLayer(0, math.random(1, 5) * 2) patient:setLayer(2, math.random(0, 2) * 2) else patient:setType("Standard Female Patient") patient:setLayer(0, math.random(1, 4) * 2) patient:setLayer(2, 0) end patient:setLayer(1, math.random(0, 3) * 2) patient:setLayer(3, 0) patient:setLayer(4, 0) end -- Diagnosis rooms are the rooms other than the GPs office which can be visited -- to aid in diagnosis. The need not be visited, and if they are visited, the -- order in which they are visited is not fixed. disease.diagnosis_rooms = { "x_ray", "cardiogram", "blood_machine", } -- Treatment rooms are the rooms which must be visited, in the given order, to -- cure the disease. disease.treatment_rooms = { "ward", "operating_theatre", } return disease CorsixTH-0.63/CorsixTH/Lua/diseases/jellyitis.lua000066400000000000000000000050711347163623700217230ustar00rootroot00000000000000--[[ Copyright (c) 2010 Manuel "Roujin" Wolf 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. --]] local disease = {} disease.id = "jellyitis" disease.expertise_id = 12 disease.visuals_id = 10 disease.name = _S.diseases.jellyitis.name disease.cause = _S.diseases.jellyitis.cause disease.symptoms = _S.diseases.jellyitis.symptoms disease.cure = _S.diseases.jellyitis.cure disease.cure_price = 1000 disease.emergency_sound = "emerg014.wav" disease.emergency_number = 12 disease.contagious = false disease.initPatient = function(patient) if math.random(0, 1) == 0 then patient:setType("Standard Male Patient") patient:setLayer(0, math.random(1, 5) * 2) patient:setLayer(2, math.random(0, 2) * 2) else patient:setType("Standard Female Patient") patient:setLayer(0, math.random(1, 4) * 2) patient:setLayer(2, 0) end patient:setLayer(1, math.random(0, 3) * 2) patient:setLayer(3, 0) patient:setLayer(4, 0) end -- TODO: visual jelly effect should be applied from time to time while walking -- Diagnosis rooms are the rooms other than the GPs office which can be visited -- to aid in diagnosis. The need not be visited, and if they are visited, the -- order in which they are visited is not fixed. disease.diagnosis_rooms = { "general_diag", "cardiogram", "scanner", "ultrascan", "blood_machine", "x_ray", "psych", "ward", } -- Treatment rooms are the rooms which must be visited, in the given order, to -- cure the disease. disease.treatment_rooms = { "jelly_vat", } -- If a machine is required a small icon should appear in the drug casebook. disease.requires_machine = true return disease CorsixTH-0.63/CorsixTH/Lua/diseases/kidney_beans.lua000066400000000000000000000046361347163623700223540ustar00rootroot00000000000000--[[ Copyright (c) 2010 Peter "Corsix" Cawley 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. --]] local disease = {} disease.id = "kidney_beans" disease.expertise_id = 19 disease.non_visuals_id = 3 disease.name = _S.diseases.kidney_beans.name disease.cause = _S.diseases.kidney_beans.cause disease.symptoms = _S.diseases.kidney_beans.symptoms disease.cure = _S.diseases.kidney_beans.cure disease.cure_price = 1050 disease.emergency_sound = "emerg024.wav" disease.emergency_number = 5 disease.contagious = true disease.initPatient = function(patient) if math.random(0, 1) == 0 then patient:setType("Standard Male Patient") patient:setLayer(0, math.random(1, 5) * 2) patient:setLayer(2, math.random(0, 2) * 2) else patient:setType("Standard Female Patient") patient:setLayer(0, math.random(1, 4) * 2) patient:setLayer(2, 0) end patient:setLayer(1, math.random(0, 3) * 2) patient:setLayer(3, 0) patient:setLayer(4, 0) end -- Diagnosis rooms are the rooms other than the GPs office which can be visited -- to aid in diagnosis. The need not be visited, and if they are visited, the -- order in which they are visited is not fixed. disease.diagnosis_rooms = { "general_diag", "cardiogram", "scanner", "ultrascan", "blood_machine", "x_ray", "psych", "ward", } -- Treatment rooms are the rooms which must be visited, in the given order, to -- cure the disease. disease.treatment_rooms = { "ward", "operating_theatre", } return disease CorsixTH-0.63/CorsixTH/Lua/diseases/king_complex.lua000066400000000000000000000041151347163623700223700ustar00rootroot00000000000000--[[ Copyright (c) 2009 Peter "Corsix" Cawley 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. --]] local disease = {} disease.id = "king_complex" disease.expertise_id = 4 disease.visuals_id = 2 disease.name = _S.diseases.king_complex.name disease.cause = _S.diseases.king_complex.cause disease.symptoms = _S.diseases.king_complex.symptoms disease.cure = _S.diseases.king_complex.cure disease.cure_price = 1600 disease.emergency_sound = "emerg009.wav" disease.emergency_number = 18 disease.contagious = false disease.initPatient = function(patient) patient:setType("Elvis Patient") patient:setLayer(0, math.random(1, 3)*2) patient:setLayer(1, 0) patient:setLayer(2, 0) patient:setLayer(3, 0) patient:setLayer(4, 0) end -- Diagnosis rooms are the rooms other than the GPs office which can be visited -- to aid in diagnosis. The need not be visited, and if they are visited, the -- order in which they are visited is not fixed. disease.diagnosis_rooms = { "x_ray", "scanner", } -- Treatment rooms are the rooms which must be visited, in the given order, to -- cure the disease. disease.treatment_rooms = { "psych", } return disease CorsixTH-0.63/CorsixTH/Lua/diseases/pregnant.lua000066400000000000000000000043131347163623700215270ustar00rootroot00000000000000--[[ Copyright (c) 2011 Mark "MarkL" Lawlor 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. --]] local disease = {} disease.id = "pregnant" disease.expertise_id = 14 disease.visuals_id = 12 disease.name = _S.diseases.pregnancy.name disease.cause = _S.diseases.pregnancy.cause disease.symptoms = _S.diseases.pregnancy.symptoms disease.cure = _S.diseases.pregnancy.cure disease.cure_price = 200 disease.emergency_sound = "emerg021.wav" disease.emergency_number = 8 disease.contagious = false disease.initPatient = function(patient) patient:setType("Standard Female Patient") patient:setLayer(0, math.random(1, 4) * 2) patient:setLayer(2, 0) patient:setLayer(1, math.random(0, 3) * 2) patient:setLayer(3, 0) patient:setLayer(4, 0) end -- Diagnosis rooms are the rooms other than the GPs office which can be visited -- to aid in diagnosis. They need not be visited, and if they are visited, the -- order in which they are visited is not fixed. disease.diagnosis_rooms = { "general_diag", "cardiogram", "scanner", "ultrascan", "blood_machine", "x_ray", "psych", "ward", } -- Treatment rooms are the rooms which must be visited, in the given order, to -- cure the disease. disease.treatment_rooms = { "ward", "operating_theatre", } return disease CorsixTH-0.63/CorsixTH/Lua/diseases/ruptured_nodules.lua000066400000000000000000000046621347163623700233230ustar00rootroot00000000000000--[[ Copyright (c) 2010 Peter "Corsix" Cawley 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. --]] local disease = {} disease.id = "ruptured_nodules" disease.expertise_id = 21 disease.non_visuals_id = 5 disease.name = _S.diseases.ruptured_nodules.name disease.cause = _S.diseases.ruptured_nodules.cause disease.symptoms = _S.diseases.ruptured_nodules.symptoms disease.cure = _S.diseases.ruptured_nodules.cure disease.cure_price = 1600 disease.emergency_sound = "emerg026.wav" disease.emergency_number = 6 disease.contagious = true disease.initPatient = function(patient) if math.random(0, 1) == 0 then patient:setType("Standard Male Patient") patient:setLayer(0, math.random(1, 5) * 2) patient:setLayer(2, math.random(0, 2) * 2) else patient:setType("Standard Female Patient") patient:setLayer(0, math.random(1, 4) * 2) patient:setLayer(2, 0) end patient:setLayer(1, math.random(0, 3) * 2) patient:setLayer(3, 0) patient:setLayer(4, 0) end -- Diagnosis rooms are the rooms other than the GPs office which can be visited -- to aid in diagnosis. The need not be visited, and if they are visited, the -- order in which they are visited is not fixed. disease.diagnosis_rooms = { "general_diag", "cardiogram", "scanner", "ultrascan", "blood_machine", "x_ray", "psych", "ward", } -- Treatment rooms are the rooms which must be visited, in the given order, to -- cure the disease. disease.treatment_rooms = { "ward", "operating_theatre", } return disease CorsixTH-0.63/CorsixTH/Lua/diseases/serious_radiation.lua000066400000000000000000000050661347163623700234420ustar00rootroot00000000000000--[[ Copyright (c) 2010 Manuel "Roujin" Wolf 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. --]] local disease = {} disease.id = "serious_radiation" disease.expertise_id = 6 disease.visuals_id = 4 disease.name = _S.diseases.serious_radiation.name disease.cause = _S.diseases.serious_radiation.cause disease.symptoms = _S.diseases.serious_radiation.symptoms disease.cure = _S.diseases.serious_radiation.cure disease.cure_price = 1800 disease.emergency_sound = "emerg010.wav" disease.emergency_number = 18 disease.contagious = true disease.initPatient = function(patient) if math.random(0, 1) == 0 then patient:setType("Standard Male Patient") patient:setLayer(0, math.random(1, 5) * 2) patient:setLayer(2, math.random(0, 2) * 2) else patient:setType("Standard Female Patient") patient:setLayer(0, math.random(1, 4) * 2) patient:setLayer(2, 0) end patient:setLayer(1, math.random(0, 3) * 2) patient:setLayer(3, 0) patient:setLayer(4, 0) end -- TODO: visual radiation effect -- Diagnosis rooms are the rooms other than the GPs office which can be visited -- to aid in diagnosis. The need not be visited, and if they are visited, the -- order in which they are visited is not fixed. disease.diagnosis_rooms = { "general_diag", "cardiogram", "scanner", "ultrascan", "blood_machine", "x_ray", "psych", "ward", } -- Treatment rooms are the rooms which must be visited, in the given order, to -- cure the disease. disease.treatment_rooms = { "decontamination", } -- If a machine is required a small icon should appear in the drug casebook. disease.requires_machine = true return disease CorsixTH-0.63/CorsixTH/Lua/diseases/slack_tongue.lua000066400000000000000000000045471347163623700224000ustar00rootroot00000000000000--[[ Copyright (c) 2009 Edvin "Lego3" Linge 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. --]] local disease = {} disease.id = "slack_tongue" disease.expertise_id = 7 disease.visuals_id = 5 disease.name = _S.diseases.slack_tongue.name disease.cause = _S.diseases.slack_tongue.cause disease.symptoms = _S.diseases.slack_tongue.symptoms disease.cure = _S.diseases.slack_tongue.cure disease.cure_price = 900 disease.emergency_sound = "emerg011.wav" disease.emergency_number = 18 disease.contagious = false disease.initPatient = function(patient) if math.random(0, 1) == 1 then patient:setType("Slack Female Patient") patient:setLayer(0, math.random(5, 8) * 2) else patient:setType("Slack Male Patient") patient:setLayer(0, math.random(1, 5) * 2) end patient:setLayer(1, math.random(0, 3) * 2) patient:setLayer(2, 0) patient:setLayer(3, 0) patient:setLayer(4, 0) end -- Diagnosis rooms are the rooms other than the GPs office which can be visited -- to aid in diagnosis. The need not be visited, and if they are visited, the -- order in which they are visited is not fixed. disease.diagnosis_rooms = { "x_ray", "scanner", } -- Treatment rooms are the rooms which must be visited, in the given order, to -- cure the disease. disease.treatment_rooms = { "slack_tongue", } -- If a machine is required a small icon should appear in the drug casebook. disease.requires_machine = true return disease CorsixTH-0.63/CorsixTH/Lua/diseases/sleeping_illness.lua000066400000000000000000000047431347163623700232570ustar00rootroot00000000000000--[[ Copyright (c) 2009 Haico "brainball" van Roeden Based on gut_rot.lua by Edvin "Lego3" Linge 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. --]] local disease = {} disease.id = "sleeping_illness" disease.expertise_id = 13 disease.visuals_id = 11 disease.name = _S.diseases.sleeping_illness.name disease.cause = _S.diseases.sleeping_illness.cause disease.symptoms = _S.diseases.sleeping_illness.symptoms disease.cure = _S.diseases.sleeping_illness.cure disease.yawn = true disease.cure_price = 750 disease.emergency_sound = "emerg015.wav" disease.emergency_number = 18 disease.contagious = true disease.initPatient = function(patient) if math.random(0, 1) == 0 then patient:setType("Standard Male Patient") patient:setLayer(0, math.random(1, 5) * 2) patient:setLayer(2, math.random(0, 2) * 2) else patient:setType("Standard Female Patient") patient:setLayer(0, math.random(1, 4) * 2) patient:setLayer(2, 0) end patient:setLayer(1, math.random(0, 3) * 2) patient:setLayer(3, 0) patient:setLayer(4, 0) end -- Diagnosis rooms are the rooms other than the GPs office which can be visited -- to aid in diagnosis. The need not be visited, and if they are visited, the -- order in which they are visited is not fixed. disease.diagnosis_rooms = { "general_diag", "cardiogram", "scanner", "ultrascan", "blood_machine", "x_ray", "psych", "ward", } -- Treatment rooms are the rooms which must be visited, in the given order, to -- cure the disease. disease.treatment_rooms = { "pharmacy", } return disease CorsixTH-0.63/CorsixTH/Lua/diseases/spare_ribs.lua000066400000000000000000000046241347163623700220470ustar00rootroot00000000000000--[[ Copyright (c) 2010 Peter "Corsix" Cawley 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. --]] local disease = {} disease.id = "spare_ribs" disease.expertise_id = 18 disease.non_visuals_id = 2 disease.name = _S.diseases.spare_ribs.name disease.cause = _S.diseases.spare_ribs.cause disease.symptoms = _S.diseases.spare_ribs.symptoms disease.cure = _S.diseases.spare_ribs.cure disease.cure_price = 1100 disease.emergency_sound = "emerg023.wav" disease.emergency_number = 4 disease.contagious = true disease.initPatient = function(patient) if math.random(0, 1) == 0 then patient:setType("Standard Male Patient") patient:setLayer(0, math.random(1, 5) * 2) patient:setLayer(2, math.random(0, 2) * 2) else patient:setType("Standard Female Patient") patient:setLayer(0, math.random(1, 4) * 2) patient:setLayer(2, 0) end patient:setLayer(1, math.random(0, 3) * 2) patient:setLayer(3, 0) patient:setLayer(4, 0) end -- Diagnosis rooms are the rooms other than the GPs office which can be visited -- to aid in diagnosis. The need not be visited, and if they are visited, the -- order in which they are visited is not fixed. disease.diagnosis_rooms = { "general_diag", "cardiogram", "scanner", "ultrascan", "blood_machine", "x_ray", "psych", "ward", } -- Treatment rooms are the rooms which must be visited, in the given order, to -- cure the disease. disease.treatment_rooms = { "ward", "operating_theatre", } return disease CorsixTH-0.63/CorsixTH/Lua/diseases/sweaty_palms.lua000066400000000000000000000046101347163623700224210ustar00rootroot00000000000000--[[ Copyright (c) 2010 Manuel "Roujin" Wolf 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. --]] local disease = {} disease.id = "sweaty_palms" disease.expertise_id = 31 disease.non_visuals_id = 15 disease.name = _S.diseases.sweaty_palms.name disease.cause = _S.diseases.sweaty_palms.cause disease.symptoms = _S.diseases.sweaty_palms.symptoms disease.cure = _S.diseases.sweaty_palms.cure disease.cure_price = 600 disease.emergency_sound = "emerg017.wav" disease.emergency_number = 14 disease.contagious = true disease.initPatient = function(patient) if math.random(0, 1) == 0 then patient:setType("Standard Male Patient") patient:setLayer(0, math.random(1, 5) * 2) patient:setLayer(2, math.random(0, 2) * 2) else patient:setType("Standard Female Patient") patient:setLayer(0, math.random(1, 4) * 2) patient:setLayer(2, 0) end patient:setLayer(1, math.random(0, 3) * 2) patient:setLayer(3, 0) patient:setLayer(4, 0) end -- Diagnosis rooms are the rooms other than the GPs office which can be visited -- to aid in diagnosis. The need not be visited, and if they are visited, the -- order in which they are visited is not fixed. disease.diagnosis_rooms = { "general_diag", "cardiogram", "scanner", "ultrascan", "blood_machine", "x_ray", "psych", "ward", } -- Treatment rooms are the rooms which must be visited, in the given order, to -- cure the disease. disease.treatment_rooms = { "psych", } return disease CorsixTH-0.63/CorsixTH/Lua/diseases/the_squits.lua000066400000000000000000000047211347163623700221040ustar00rootroot00000000000000--[[ Copyright (c) 2009 Haico "brainball" van Roeden Based on gut_rot.lua by Edvin "Lego3" Linge 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. --]] local disease = {} disease.id = "the_squits" disease.expertise_id = 29 disease.non_visuals_id = 13 disease.name = _S.diseases.the_squits.name disease.cause = _S.diseases.the_squits.cause disease.symptoms = _S.diseases.the_squits.symptoms disease.cure = _S.diseases.the_squits.cure disease.cure_price = 400 disease.emergency_sound = "emerg002.wav" disease.emergency_number = 18 disease.more_loo_use = true disease.contagious = true disease.initPatient = function(patient) if math.random(0, 1) == 0 then patient:setType("Standard Male Patient") patient:setLayer(0, math.random(1, 5) * 2) patient:setLayer(2, math.random(0, 2) * 2) else patient:setType("Standard Female Patient") patient:setLayer(0, math.random(1, 4) * 2) patient:setLayer(2, 0) end patient:setLayer(1, math.random(0, 3) * 2) patient:setLayer(3, 0) patient:setLayer(4, 0) end -- Diagnosis rooms are the rooms other than the GPs office which can be visited -- to aid in diagnosis. The need not be visited, and if they are visited, the -- order in which they are visited is not fixed. disease.diagnosis_rooms = { "general_diag", "cardiogram", "scanner", "ultrascan", "blood_machine", "x_ray", "psych", "ward", } -- Treatment rooms are the rooms which must be visited, in the given order, to -- cure the disease. disease.treatment_rooms = { "pharmacy", } return disease CorsixTH-0.63/CorsixTH/Lua/diseases/third_degree_sideburns.lua000066400000000000000000000046721347163623700244240ustar00rootroot00000000000000--[[ Copyright (c) 2010 Manuel "Roujin" Wolf 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. --]] local disease = {} disease.id = "third_degree_sideburns" disease.expertise_id = 26 disease.non_visuals_id = 10 disease.name = _S.diseases.third_degree_sideburns.name disease.cause = _S.diseases.third_degree_sideburns.cause disease.symptoms = _S.diseases.third_degree_sideburns.symptoms disease.cure = _S.diseases.third_degree_sideburns.cure disease.cure_price = 550 disease.emergency_sound = "emerg030.wav" disease.emergency_number = 13 disease.contagious = true disease.initPatient = function(patient) if math.random(0, 1) == 0 then patient:setType("Standard Male Patient") patient:setLayer(0, math.random(1, 5) * 2) patient:setLayer(2, math.random(0, 2) * 2) else patient:setType("Standard Female Patient") patient:setLayer(0, math.random(1, 4) * 2) patient:setLayer(2, 0) end patient:setLayer(1, math.random(0, 3) * 2) patient:setLayer(3, 0) patient:setLayer(4, 0) end -- Diagnosis rooms are the rooms other than the GPs office which can be visited -- to aid in diagnosis. The need not be visited, and if they are visited, the -- order in which they are visited is not fixed. disease.diagnosis_rooms = { "general_diag", "cardiogram", "scanner", "ultrascan", "blood_machine", "x_ray", "psych", "ward", } -- Treatment rooms are the rooms which must be visited, in the given order, to -- cure the disease. disease.treatment_rooms = { "psych", } return disease CorsixTH-0.63/CorsixTH/Lua/diseases/transparency.lua000066400000000000000000000044531347163623700224270ustar00rootroot00000000000000--[[ Copyright (c) 2009 Peter "Corsix" Cawley 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. --]] local disease = {} disease.id = "transparency" disease.expertise_id = 15 disease.visuals_id = 13 disease.name = _S.diseases.transparency.name disease.cause = _S.diseases.transparency.cause disease.symptoms = _S.diseases.transparency.symptoms disease.cure = _S.diseases.transparency.cure disease.cure_price = 800 disease.emergency_sound = "emerg022.wav" disease.emergency_number = 12 disease.contagious = false disease.initPatient = function(patient) if math.random(0, 1) == 0 then patient:setType("Transparent Male Patient") patient:setLayer(0, math.random(1, 5) * 2) patient:setLayer(2, math.random(0, 2) * 2) else patient:setType("Transparent Female Patient") patient:setLayer(0, math.random(1, 4) * 2) patient:setLayer(2, 0) end patient:setLayer(1, math.random(0, 3) * 2) patient:setLayer(3, 0) patient:setLayer(4, 0) end -- Diagnosis rooms are the rooms other than the GPs office which can be visited -- to aid in diagnosis. The need not be visited, and if they are visited, the -- order in which they are visited is not fixed. disease.diagnosis_rooms = { "scanner", } -- Treatment rooms are the rooms which must be visited, in the given order, to -- cure the disease. disease.treatment_rooms = { "pharmacy", } return disease CorsixTH-0.63/CorsixTH/Lua/diseases/tv_personalities.lua000066400000000000000000000046321347163623700233070ustar00rootroot00000000000000--[[ Copyright (c) 2009 Edvin "Lego3" Linge 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. --]] local disease = {} disease.id = "tv_personalities" disease.expertise_id = 22 disease.non_visuals_id = 6 disease.name = _S.diseases.tv_personalities.name disease.cause = _S.diseases.tv_personalities.cause disease.symptoms = _S.diseases.tv_personalities.symptoms disease.cure = _S.diseases.tv_personalities.cure disease.cure_price = 800 disease.emergency_sound = "emerg003.wav" disease.emergency_number = 14 disease.contagious = true disease.initPatient = function(patient) if math.random(0, 1) == 0 then patient:setType("Standard Male Patient") patient:setLayer(0, math.random(1, 5) * 2) patient:setLayer(2, math.random(0, 2) * 2) else patient:setType("Standard Female Patient") patient:setLayer(0, math.random(1, 4) * 2) patient:setLayer(2, 0) end patient:setLayer(1, math.random(0, 3) * 2) patient:setLayer(3, 0) patient:setLayer(4, 0) end -- Diagnosis rooms are the rooms other than the GPs office which can be visited -- to aid in diagnosis. The need not be visited, and if they are visited, the -- order in which they are visited is not fixed. disease.diagnosis_rooms = { "general_diag", "cardiogram", "scanner", "ultrascan", "blood_machine", "x_ray", "psych", "ward", } -- Treatment rooms are the rooms which must be visited, in the given order, to -- cure the disease. disease.treatment_rooms = { "psych", } return disease CorsixTH-0.63/CorsixTH/Lua/diseases/uncommon_cold.lua000066400000000000000000000047031347163623700225500ustar00rootroot00000000000000--[[ Copyright (c) 2009 Haico "brainball" van Roeden Based on gut_rot.lua by Edvin "Lego3" Linge 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. --]] local disease = {} disease.id = "uncommon_cold" disease.expertise_id = 16 disease.non_visuals_id = 0 disease.name = _S.diseases.uncommon_cold.name disease.cause = _S.diseases.uncommon_cold.cause disease.symptoms = _S.diseases.uncommon_cold.symptoms disease.cure = _S.diseases.uncommon_cold.cure disease.cure_price = 300 disease.emergency_sound = "emerg004.wav" disease.emergency_number = 18 disease.contagious = true disease.initPatient = function(patient) if math.random(0, 1) == 0 then patient:setType("Standard Male Patient") patient:setLayer(0, math.random(1, 5) * 2) patient:setLayer(2, math.random(0, 2) * 2) else patient:setType("Standard Female Patient") patient:setLayer(0, math.random(1, 4) * 2) patient:setLayer(2, 0) end patient:setLayer(1, math.random(0, 3) * 2) patient:setLayer(3, 0) patient:setLayer(4, 0) end -- Diagnosis rooms are the rooms other than the GPs office which can be visited -- to aid in diagnosis. The need not be visited, and if they are visited, the -- order in which they are visited is not fixed. disease.diagnosis_rooms = { "general_diag", "cardiogram", "scanner", "ultrascan", "blood_machine", "x_ray", "psych", "ward", } -- Treatment rooms are the rooms which must be visited, in the given order, to -- cure the disease. disease.treatment_rooms = { "pharmacy", } return disease CorsixTH-0.63/CorsixTH/Lua/diseases/unexpected_swelling.lua000066400000000000000000000047011347163623700237620ustar00rootroot00000000000000--[[ Copyright (c) 2010 Peter "Corsix" Cawley 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. --]] local disease = {} disease.id = "unexpected_swelling" disease.expertise_id = 35 disease.non_visuals_id = 19 disease.name = _S.diseases.unexpected_swelling.name disease.cause = _S.diseases.unexpected_swelling.cause disease.symptoms = _S.diseases.unexpected_swelling.symptoms disease.cure = _S.diseases.unexpected_swelling.cure disease.cure_price = 500 disease.emergency_sound = "emerg018.wav" disease.emergency_number = 5 disease.contagious = true disease.initPatient = function(patient) if math.random(0, 1) == 0 then patient:setType("Standard Male Patient") patient:setLayer(0, math.random(1, 5) * 2) patient:setLayer(2, math.random(0, 2) * 2) else patient:setType("Standard Female Patient") patient:setLayer(0, math.random(1, 4) * 2) patient:setLayer(2, 0) end patient:setLayer(1, math.random(0, 3) * 2) patient:setLayer(3, 0) patient:setLayer(4, 0) end -- Diagnosis rooms are the rooms other than the GPs office which can be visited -- to aid in diagnosis. The need not be visited, and if they are visited, the -- order in which they are visited is not fixed. disease.diagnosis_rooms = { "general_diag", "cardiogram", "scanner", "ultrascan", "blood_machine", "x_ray", "psych", "ward", } -- Treatment rooms are the rooms which must be visited, in the given order, to -- cure the disease. disease.treatment_rooms = { "ward", "operating_theatre", } return disease CorsixTH-0.63/CorsixTH/Lua/entities/000077500000000000000000000000001347163623700172315ustar00rootroot00000000000000CorsixTH-0.63/CorsixTH/Lua/entities/humanoid.lua000066400000000000000000001113071347163623700215430ustar00rootroot00000000000000--[[ Copyright (c) 2009 Peter "Corsix" Cawley 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. --]] --! An `Entity` which occupies a single tile and is capable of moving around the map. class "Humanoid" (Entity) ---@type Humanoid local Humanoid = _G["Humanoid"] local walk_animations = permanent"humanoid_walk_animations"({}) local door_animations = permanent"humanoid_door_animations"({}) local die_animations = permanent"humanoid_die_animations"({}) local falling_animations = permanent"humanoid_falling_animations"({}) local on_ground_animations = permanent"humanoid_on_ground_animations"({}) local get_up_animations = permanent"humanoid_get_up_animations"({}) local shake_fist_animations = permanent"humanoid_shake_fist_animations"({}) local pee_animations = permanent"humanoid_pee_animations"({}) local vomit_animations = permanent"humanoid_vomit_animations"({}) local tap_foot_animations = permanent"humanoid_tap_foot_animations"({}) local yawn_animations = permanent"humanoid_yawn_animations"({}) local check_watch_animations = permanent"humanoid_check_watch_animations"({}) local mood_icons = permanent"humanoid_mood_icons"({}) local function anims(name, walkN, walkE, idleN, idleE, doorL, doorE, knockN, knockE, swingL, swingE) walk_animations[name] = { walk_east = walkE, walk_north = walkN, idle_east = idleE, idle_north = idleN, } door_animations[name] = { entering = doorE, leaving = doorL, entering_swing = swingE, leaving_swing = swingL, knock_north = knockN, knock_east = knockE, } end --- -- @param name The name of the patient class these death animations are for. -- @param fall The patient's fall animation. -- @param rise The transparent getting up animation for heaven death patients who have been lying dead on the ground. -- @param rise_hell The opaque getting up animation for hell death patients who have been lying dead on the ground. -- @param wings The heaven death animation in which the patient's wings appear. -- @param hands The heaven death animation which occurs after the wings animation when the patient puts their hands together. -- @param fly The heaven death animation which makes patients fly upwards to heaven. -- @param extra Dead untreated patients who don't transform before falling over use this animation afterwards to transform into a standard male/female. --- local function die_anims(name, fall, rise, rise_hell, wings, hands, fly, extra) die_animations[name] = { fall_east = fall, rise_east = rise, rise_hell_east = rise_hell, wings_east = wings, hands_east = hands, fly_east = fly, extra_east = extra, } end local function falling_anim(name, fallingAnim) falling_animations[name] = fallingAnim end local function on_ground_anim(name, on_groundAnim) on_ground_animations[name] = on_groundAnim end local function get_up_anim(name, get_upAnim) get_up_animations[name] = get_upAnim end local function shake_fist_anim(name, shake_fistAnim) shake_fist_animations[name] = shake_fistAnim end local function vomit_anim(name, vomitAnim) vomit_animations[name] = vomitAnim end local function yawn_anim(name, yawnAnim) yawn_animations[name] = yawnAnim end local function tap_foot_anim(name, tap_footAnim) tap_foot_animations[name] = tap_footAnim end local function check_watch_anim(name, check_watchAnim) check_watch_animations[name] = check_watchAnim end local function pee_anim(name, peeAnim) pee_animations[name] = peeAnim end local function moods(name, iconNo, prio, alwaysOn) mood_icons[name] = {icon = iconNo, priority = prio, on_hover = alwaysOn} end -- | Walk animations | -- | Name |WalkN|WalkE|IdleN|IdleE|DoorL|DoorE|KnockN|KnockE|SwingL|SwingE| Notes -----+---------------------------+-----+-----+-----+-----+-----+-----+------+------+-------+---------+ anims("Standard Male Patient", 16, 18, 24, 26, 182, 184, 286, 288, 2040, 2042) -- 0-16, ABC anims("Gowned Male Patient", 406, 408, 414, 416) -- 0-10 anims("Stripped Male Patient", 818, 820, 826, 828) -- 0-16 anims("Stripped Male Patient 2", 818, 820, 826, 828) -- 0-16 anims("Stripped Male Patient 3", 818, 820, 826, 828) anims("Alternate Male Patient", 2704, 2706, 2712, 2714, 2748, 2750, 2764, 2766) -- 0-10, ABC anims("Slack Male Patient", 1484, 1486, 1492, 1494, 1524, 1526, 2764, 1494) -- 0-14, ABC anims("Slack Female Patient", 0, 2, 8, 10, 258, 260, 294, 296, 2864, 2866) -- 0-16, ABC anims("Transparent Male Patient", 1064, 1066, 1072, 1074, 1104, 1106, 1120, 1074) -- 0-16, ABC anims("Standard Female Patient", 0, 2, 8, 10, 258, 260, 294, 296, 2864, 2866) -- 0-16, ABC anims("Gowned Female Patient", 2876, 2878, 2884, 2886) -- 0-8 anims("Stripped Female Patient", 834, 836, 842, 844) -- 0-16 anims("Stripped Female Patient 2", 834, 836, 842, 844) -- 0-16 anims("Stripped Female Patient 3", 834, 836, 842, 844) anims("Transparent Female Patient",3012, 3014, 3020, 3022, 3052, 3054, 3068, 3070) -- 0-8, ABC anims("Chewbacca Patient", 858, 860, 866, 868, 3526, 3528, 4150, 4152) anims("Elvis Patient", 978, 980, 986, 988, 3634, 3636, 4868, 4870) anims("Invisible Patient", 1642, 1644, 1840, 1842, 1796, 1798, 4192, 4194) anims("Alien Male Patient", 3598, 3600, 3606, 3608, 182, 184, 286, 288, 3626, 3628) -- remember, no "normal"-doors animation anims("Alien Female Patient", 3598, 3600, 3606, 3608, 258, 260, 294, 296, 3626, 3628) -- identical to male; however death animations differ anims("Doctor", 32, 34, 40, 42, 670, 672, nil, nil, 4750, 4752) anims("Surgeon", 2288, 2290, 2296, 2298) anims("Nurse", 1206, 1208, 1650, 1652, 3264, 3266, nil, nil, 3272, 3274) anims("Handyman", 1858, 1860, 1866, 1868, 3286, 3288, nil, nil, 3518, 3520) anims("Receptionist", 3668, 3670, 3676, 3678) -- Could do with door animations anims("VIP", 266, 268, 274, 276) anims("Inspector", 266, 268, 274, 276) anims("Grim Reaper", 994, 996, 1002, 1004) -- | Die Animations | -- | Name |FallE|RiseE|RiseE Hell|WingsE|HandsE|FlyE|ExtraE| Notes 2248 ----+--------------------------------+-----+-----+----------+-----+------+-----+------ die_anims("Standard Male Patient", 1682, 2434, 384, 2438, 2446, 2450) -- Always facing east or south die_anims("Alternate Male Patient", 1682, 2434, 3404, 2438, 2446, 2450) die_anims("Slack Male Patient", 1682, 2434, 384, 2438, 2446, 2450) -- TODO: Where is slack male transformation? Uses alternate male for now. die_anims("Transparent Male Patient", 4412, 2434, 384, 2438, 2446, 2450, 4416) -- Extra = Transformation die_anims("Standard Female Patient", 3116, 3208, 580, 3212, 3216, 3220) die_anims("Slack Female Patient", 4288, 3208, 580, 3212, 3216, 3220) die_anims("Transparent Female Patient",4420, 3208, 580, 3212, 3216, 3220, 4428) -- Extra = Transformation die_anims("Chewbacca Patient", 4182, 2434, 384, 2438, 2446, 2450, 1682) -- Only males die... (1222 is the Female) die_anims("Elvis Patient", 974, 2434, 384, 2438, 2446, 2450, 4186) -- Extra = Transformation die_anims("Invisible Patient", 4200, 2434, 384, 2438, 2446, 2450) die_anims("Alien Male Patient", 4882, 2434, 384, 2438, 2446, 2450) die_anims("Alien Female Patient", 4886, 3208, 580, 3212, 3216, 3220) -- The next fours sets belong together, but are done like this so we can use them on there own -- I also had difficulty in keeping them together, as the patient needs to on the floor -- for the duration of the earth quake before getting back up -- Shaking of fist could perhaps be used when waiting too long -- | Falling Animations | -- | Name |Anim| Notes ----+--------------------------------+-----+-----+-----+-----+------+------+ falling_anim("Standard Male Patient", 1682) falling_anim("Standard Female Patient", 3116) -- | On_ground Animations | -- | Name |Anim| Notes ----+--------------------------------+-----+-----+-----+-----+------+------+ on_ground_anim("Standard Male Patient", 1258) on_ground_anim("Standard Female Patient", 3116) -- | Get_up Animations | -- | Name |Anim| Notes ----+--------------------------------+-----+-----+-----+-----+------+------+ get_up_anim("Standard Male Patient", 384) get_up_anim("Standard Female Patient", 580) -- | Shake_fist Animations | -- | Name |Anim| Notes ----+--------------------------------+-----+-----+-----+-----+------+------+ shake_fist_anim("Standard Male Patient", 392) -- bloaty head patients lose head! -- | Vomit Animations | -- | Name |Anim | Notes ----+-----------------------------------+-----+ vomit_anim("Elvis Patient", 1034) vomit_anim("Standard Female Patient", 3184) vomit_anim("Standard Male Patient", 2056) vomit_anim("Alternate Male Patient", 4476) vomit_anim("Chewbacca Patient", 4138) vomit_anim("Invisible Patient", 4204) vomit_anim("Slack Male Patient", 4324) vomit_anim("Transparent Female Patient", 4452) vomit_anim("Transparent Male Patient", 4384) -- | Yawn Animations | -- | Name |Anim | Notes ----+-----------------------------------+-----+ yawn_anim("Standard Female Patient", 4864) yawn_anim("Standard Male Patient", 368) --yawn_anim("Alternate Male Patient", 2968) is this one the same as standard male? -- whichever one is used for male, if he wears a hat it will lift when he yawns -- | Foot tapping Animations | -- | Name |Anim | Notes ----+-----------------------------------+-----+ tap_foot_anim("Standard Female Patient", 4464) tap_foot_anim("Standard Male Patient", 2960) tap_foot_anim("Alternate Male Patient", 360) -- | Check watch Animations | -- | Name |Anim | Notes ----+-----------------------------------+-----+ check_watch_anim("Standard Female Patient", 4468) check_watch_anim("Standard Male Patient", 2964) check_watch_anim("Alternate Male Patient", 364) check_watch_anim("Slack Male Patient", 4060) -- | pee Animations | -- | Name |Anim | Notes ----+-----------------------------------+-----+ pee_anim("Elvis Patient", 970) pee_anim("Standard Female Patient", 4744) pee_anim("Slack Female Patient", 4744) pee_anim("Standard Male Patient", 2244) pee_anim("Alternate Male Patient", 4472) pee_anim("Slack Male Patient", 4328) pee_anim("Chewbacca Patient", 4178) pee_anim("Invisible Patient", 4208) pee_anim("Transparent Female Patient", 4852) pee_anim("Transparent Male Patient", 4848) -- | Available Moods | -- | Name |Icon|Priority|Show Always| Notes -----+-----------------+----+--------+-----------+ moods("reflexion", 4020, 5) -- Some icons should only appear when the player moods("cantfind", 4050, 3) -- hover over the humanoid moods("idea1", 2464, 10) -- Higher priority is more important. moods("idea2", 2466, 11) moods("idea3", 4044, 12) moods("staff_wait", 4054, 20) moods("tired", 3990, 30) moods("pay_rise", 4576, 40) moods("thirsty", 3986, 4) moods("cold", 3994, 0, true) -- These have no priority since moods("hot", 3988, 0, true) -- they will be shown when hovering moods("queue", 4568, 70) -- no matter what other priorities. moods("poo", 3996, 5) moods("sad_money", 4018, 50) moods("patient_wait", 5006, 40) moods("epidemy1", 4566, 55) moods("epidemy2", 4570, 55) moods("epidemy3", 4572, 55) moods("epidemy4", 4574, 55) moods("sad1", 3992, 40) moods("sad2", 4000, 41) moods("sad3", 4002, 42) moods("sad4", 4004, 43) moods("sad5", 4006, 44) moods("sad6", 4008, 45) moods("sad7", 4578, 46) moods("dead", 4046, 60) moods("cured", 4048, 60) moods("emergency", 3914, 50) moods("exit", 4052, 60) local anim_mgr = TheApp.animation_manager for anim in values(door_animations, "*.entering") do anim_mgr:setMarker(anim, 0, {-1, 0}, 3, {-1, 0}, 9, {0, 0}) end for anim in values(door_animations, "*.leaving") do anim_mgr:setMarker(anim, 1, {0, 0.4}, 4, {0, 0.4}, 7, {0, 0}, 11, {0, -1}) end for anim in values(door_animations, "*.entering_swing") do anim_mgr:setMarker(anim, 0, {-1, 0}, 8, {0, 0}) end for anim in values(door_animations, "*.leaving_swing") do anim_mgr:setMarker(anim, 0, {0.1, 0}, 9, {0, -1}) end --!param ... Arguments for base class constructor. function Humanoid:Humanoid(...) self:Entity(...) self.action_queue = {} self.last_move_direction = "east" self.attributes = {} self.attributes["warmth"] = 0.29 self.attributes["happiness"] = 1 -- patients should be not be fully well when they come to your hospital and if it is staff there is no harm done! self.attributes["health"] = math.random(80, 100) /100 self.active_moods = {} self.should_knock_on_doors = false self.speed = "normal" self.build_callbacks = {--[[set]]} self.remove_callbacks = {--[[set]]} self.staff_change_callbacks = {--[[set]]} end -- Save game compatibility function Humanoid:afterLoad(old, new) if old < 38 and new >= 38 then -- should existing patients be updated and be getting really ill? -- adds the new variables for health icons self.attributes["health"] = math.random(60, 100) /100 end -- make sure female slack patients have the correct animation if old < 42 and new >= 42 then if self.humanoid_class == "Slack Female Patient" then self.die_anims = die_animations["Slack Female Patient"] end end if old < 77 and new >= 77 then self.has_vomitted = 0 end if old < 49 and new >= 49 then self.has_fallen = 1 end if old < 61 and new >= 61 then -- callbacks changed self.build_callbacks = {} self.remove_callbacks = {} if self.build_callback then self.build_callbacks[self.build_callback] = true self.build_callback = nil end if self.toilet_callback then self.build_callbacks[self.toilet_callback] = true self.toilet_callback = nil end end if old < 83 and new >= 83 and self.humanoid_class == "Chewbacca Patient" then self.die_anims.extra_east = 1682 end if old < 134 and new >= 134 then self.staff_change_callbacks = {} end for _, action in pairs(self.action_queue) do -- Sometimes actions not actual instances of HumanoidAction HumanoidAction.afterLoad(action, old, new) end Entity.afterLoad(self, old, new) end -- Function which is called when the user clicks on the `Humanoid`. --!param ui (GameUI) The UI which the user in question is using. --!param button (string) One of: "left", "middle", "right". function Humanoid:onClick(ui, button) if TheApp.config.debug then self:dump() end end function Humanoid:getRoom() return self.in_room or Entity.getRoom(self) end function Humanoid:dump() print("-----------------------------------") print("Clicked on: ") print(self:tostring()) print("-----------------------------------") end -- Called when the humanoid is about to be removed from the world. function Humanoid:onDestroy() local x, y = self.tile_x, self.tile_y if x and y then local notify_object = self.world:getObjectToNotifyOfOccupants(x, y) if notify_object then notify_object:onOccupantChange(-1) end end -- Make absolutely sure there are no callbacks left on the humanoid. self:unregisterCallbacks() return Entity.onDestroy(self) end -- Set the `Hospital` which is responsible for treating or employing the -- `Humanoid`. In single player games, this has little effect, but it is very -- important in multiplayer games. --!param hospital (Hospital) The `Hospital` which should be responsible -- for the `Humanoid`. function Humanoid:setHospital(hospital) self.hospital = hospital if not hospital.is_in_world then self:despawn() end end --! Despawn the humanoid. function Humanoid:despawn() local spawn_point = self.world.spawn_points[math.random(1, #self.world.spawn_points)] self:setNextAction(SpawnAction("despawn", spawn_point):setMustHappen(true)) end -- Function to activate/deactivate moods of a humanoid. -- If mood_name is nil it is considered a refresh only. function Humanoid:setMood(mood_name, activate) if mood_name then if activate and activate ~= "deactivate" then if self.active_moods[mood_name] then return -- No use doing anything if it already exists. end self.active_moods[mood_name] = mood_icons[mood_name] else if not self.active_moods[mood_name] then return -- No use doing anything if the mood isn't there anyway. end self.active_moods[mood_name] = nil end end local new_mood = nil -- TODO: Make equal priorities cycle, or make all moods unique for _, value in pairs(self.active_moods) do if new_mood then -- There is a mood, check priorities. if new_mood.priority < value.priority then new_mood = value end else if not value.on_hover then new_mood = value end end end self:setMoodInfo(new_mood) end function Humanoid:setCallCompleted() if self.on_call then CallsDispatcher.onCheckpointCompleted(self.on_call) end end -- Is the given mood in the list of active moods. function Humanoid:isMoodActive(mood) for i, _ in pairs(self.active_moods) do if i == mood then return true end end return false end function Humanoid.getIdleAnimation(humanoid_class) return assert(walk_animations[humanoid_class], "Invalid humanoid class").idle_east end function Humanoid:getCurrentMood() if self.mood_info then return self.mood_info end end local function Humanoid_startAction(self) local action = self.action_queue[1] -- Handle an empty action queue in some way instead of crashing. if not action then -- if this is a patient that is going home, an empty -- action queue is not a problem if class.is(self, Patient) and self.going_home then return end ---- Empty action queue! ---- -- First find out if this humanoid is in a room. local room = self:getRoom() if room then room:makeHumanoidLeave(self) end -- Is it a member of staff, grim or a patient? if class.is(self, Staff) then self:queueAction(MeanderAction()) elseif class.is(self,GrimReaper) then self:queueAction(IdleAction()) else self:queueAction(SeekReceptionAction()) end -- Open the dialog of the humanoid. local ui = self.world.ui if class.is(self, Patient) then ui:addWindow(UIPatient(ui, self)) elseif class.is(self, Staff) then ui:addWindow(UIStaff(ui, self)) end -- Pause the game. self.world:setSpeed("Pause") -- Tell the player what just happened. self.world:gameLog("") self.world:gameLog("Empty action queue!") self.world:gameLog("Last action: " .. self.previous_action.name) self.world:gameLog(debug.traceback()) ui:addWindow(UIConfirmDialog(ui, "Sorry, a humanoid just had an empty action queue,".. " which means that he or she didn't know what to do next.".. " Please consult the command window for more detailed information. ".. "A dialog with ".. "the offending humanoid has been opened. ".. "Would you like him/her to leave the hospital?", --[[persistable:humanoid_leave_hospital]] function() self.world:gameLog("The humanoid was told to leave the hospital...") if class.is(self, Staff) then self:fire() else -- Set these variables to increase the likelihood of the humanoid managing to get out of the hospital. self.going_home = false self.hospital = self.world:getLocalPlayerHospital() self:goHome("kicked") end if TheApp.world:isCurrentSpeed("Pause") then TheApp.world:setSpeed(TheApp.world.prev_speed) end end, --[[persistable:humanoid_stay_in_hospital]] function() if TheApp.world:isCurrentSpeed("Pause") then TheApp.world:setSpeed(TheApp.world.prev_speed) end end )) action = self.action_queue[1] end ---- There is an action to start ---- -- Call the action start handler TheApp.humanoid_actions[action.name](action, self) if action == self.action_queue[1] and action.todo_interrupt then local high_priority = action.todo_interrupt == "high" action.todo_interrupt = nil local on_interrupt = action.on_interrupt if on_interrupt then action.on_interrupt = nil on_interrupt(action, self, high_priority) end end end function Humanoid:setNextAction(action, high_priority) -- Aim: Cleanly finish the current action (along with any subsequent actions -- which must happen), then replace all the remaining actions with the given -- one. local i = 1 local queue = self.action_queue local interrupted = false -- Skip over any actions which must happen while queue[i] and queue[i].must_happen do interrupted = true i = i + 1 end -- Remove actions which are no longer going to happen local done_set = {} for j = #queue, i, -1 do local removed = queue[j] queue[j] = nil if not removed then -- A bug (rare) that removed could be nil. -- but as it's being removed anyway...it could be ignored print("Warning: Action to be removed was nil") else if removed.on_remove then removed.on_remove(removed, self) end if removed.until_leave_queue and not done_set[removed.until_leave_queue] then removed.until_leave_queue:removeValue(self) done_set[removed.until_leave_queue] = true end if removed.object and removed.object:isReservedFor(self) then removed.object:removeReservedUser(self) end end end -- Add the new action to the queue queue[i] = action -- Interrupt the current action and queue other actions to be interrupted -- when they start. if interrupted then interrupted = queue[1] for j = 1, i - 1 do queue[j].todo_interrupt = high_priority and "high" or true end local on_interrupt = interrupted.on_interrupt if on_interrupt then interrupted.on_interrupt = nil on_interrupt(interrupted, self, high_priority or false) end else -- Start the action if it has become the current action Humanoid_startAction(self) end return self end function Humanoid:queueAction(action, pos) if pos then table.insert(self.action_queue, pos + 1, action) if pos == 0 then Humanoid_startAction(self) end else self.action_queue[#self.action_queue + 1] = action end return self end function Humanoid:finishAction(action) if action ~= nil then assert(action == self.action_queue[1], "Can only finish current action") end -- Save the previous action just a while longer. self.previous_action = self.action_queue[1] table.remove(self.action_queue, 1) Humanoid_startAction(self) end -- Check if the humanoid is running actions intended to leave the room, as indicated by the flag function Humanoid:isLeaving() return self.action_queue[1].is_leaving and true or false end -- Check if there is "is_leaving" action in the action queue function Humanoid:hasLeavingAction() for _, action in ipairs(self.action_queue) do if action.is_leaving then return true end end return false end function Humanoid:setType(humanoid_class) assert(walk_animations[humanoid_class], "Invalid humanoid class: " .. tostring(humanoid_class)) self.walk_anims = walk_animations[humanoid_class] self.door_anims = door_animations[humanoid_class] self.die_anims = die_animations[humanoid_class] self.falling_anim = falling_animations[humanoid_class] self.on_ground_anim = on_ground_animations[humanoid_class] self.get_up_anim = get_up_animations[humanoid_class] self.shake_fist_anim = shake_fist_animations[humanoid_class] self.vomit_anim = vomit_animations[humanoid_class] self.yawn_anim = yawn_animations[humanoid_class] self.tap_foot_anim = tap_foot_animations[humanoid_class] self.check_watch_anim = check_watch_animations[humanoid_class] self.pee_anim = pee_animations[humanoid_class] self.humanoid_class = humanoid_class if #self.action_queue == 0 then self:setNextAction(IdleAction()) end self.th:setPartialFlag(self.permanent_flags or 0, false) if humanoid_class == "Invisible Patient" then -- Invisible patients do not have very many pixels to hit, box works better self.permanent_flags = DrawFlags.BoundBoxHitTest else self.permanent_flags = nil end self.th:setPartialFlag(self.permanent_flags or 0) end -- Helper function for the common case of instructing a `Humanoid` to walk to -- a position on the map. Equivalent to calling `setNextAction` with a walk -- action. --!param tile_x (integer) The X-component of the Lua tile co-ordinates of the -- tile to walk to. --!param tile_y (integer) The Y-component of the Lua tile co-ordinates of the -- tile to walk to. --!param must_happen (boolean, nil) If true, then the walk action will not be -- interrupted. function Humanoid:walkTo(tile_x, tile_y, must_happen) self:setNextAction(WalkAction(tile_x, tile_y) :setMustHappen(not not must_happen)) end -- Stub functions for handling fatigue. These are overridden by the staff subclass, -- but also defined here, so we can just call it on any humanoid function Humanoid:tire(amount) end function Humanoid:wake(amount) end function Humanoid:updateSpeed() self.speed = "normal" end function Humanoid:handleRemovedObject(object) local replacement_action if self.humanoid_class and self.humanoid_class == "Receptionist" then replacement_action = MeanderAction() elseif object.object_type.id == "bench" or object.object_type.id == "drinks_machine" then replacement_action = IdleAction():setMustHappen(true) end for i, action in ipairs(self.action_queue) do if (action.name == "use_object" or action.name == "staff_reception") and action.object == object then if replacement_action then self:queueAction(replacement_action, i) end if i == 1 then local on_interrupt = action.on_interrupt action.on_interrupt = nil if on_interrupt then on_interrupt(action, self, true) end else table.remove(self.action_queue, i) self.associated_desk = nil -- NB: for the other case, this is already handled in the on_interrupt function end -- Are we in a queue? if self.action_queue[i + 1] and self.action_queue[i + 1].name == "queue" then self.action_queue[i + 1]:onChangeQueuePosition(self) end break end end end -- Adjusts one of the `Humanoid`'s attributes. --!param attribute (string) One of: "happiness", "thirst", "toilet_need", "warmth". --!param amount (number) This amount is added to the existing value for the attribute, -- and is then capped to be between 0 and 1. function Humanoid:changeAttribute(attribute, amount) -- Receptionist is always 100% happy if self.humanoid_class and self.humanoid_class == "Receptionist" and attribute == "happiness" then self.attributes[attribute] = 1 return true end if self.attributes[attribute] then self.attributes[attribute] = self.attributes[attribute] + amount if self.attributes[attribute] > 1 then self.attributes[attribute] = 1 elseif self.attributes[attribute] < 0 then self.attributes[attribute] = 0 end end end -- Check if it is cold or hot around the humanoid and increase/decrease the -- feeling of warmth accordingly. Returns whether the calling function should proceed. function Humanoid:tickDay() -- No use doing anything if we're going home if self.going_home then return false end local temperature = self.world.map.th:getCellTemperature(self.tile_x, self.tile_y) self.attributes.warmth = self.attributes.warmth * 0.75 + temperature * 0.25 -- If it is too hot or too cold, start to decrease happiness and -- show the corresponding icon. Otherwise we could get happier instead. local min_comfort_temp = 0.22 -- 11 degrees Celcius. local max_comfort_temp = 0.36 -- 18 degrees Celcius. local decrease_factor = 0.10 local increase_happiness = 0.005 if self.attributes["warmth"] and self.hospital then -- Cold: less than comfortable. if self.attributes["warmth"] < min_comfort_temp then self:changeAttribute("happiness", -decrease_factor * (min_comfort_temp - self.attributes["warmth"])) self:setMood("cold", "activate") -- Hot: More than comfortable. elseif self.attributes["warmth"] > max_comfort_temp then self:changeAttribute("happiness", -decrease_factor * (self.attributes["warmth"] - max_comfort_temp)) self:setMood("hot", "activate") -- Ideal: Not too cold or too warm. else self:changeAttribute("happiness", increase_happiness) self:setMood("cold", "deactivate") self:setMood("hot", "deactivate") end end return true end -- Helper function that finds out if there is an action queued to use the specified object function Humanoid:goingToUseObject(object_type) for _, action in ipairs(self.action_queue) do if action.object and action.object.object_type.id == object_type then return true end end return false end -- Registers a new build callback for this humanoid. --!param callback (function) The callback to call when a room has been built. function Humanoid:registerRoomBuildCallback(callback) if not self.build_callbacks[callback] then self.build_callbacks[callback] = true else self.world:gameLog("Warning: Trying to re-add room build callback (" .. tostring(callback) .. ") for humanoid (" .. tostring(self) .. ").") end end -- Unregisters a build callback for this humanoid. --!param callback (function) The callback to remove. function Humanoid:unregisterRoomBuildCallback(callback) if self.build_callbacks[callback] then self.build_callbacks[callback] = nil else self.world:gameLog("Warning: Trying to remove nonexistant room build callback (" .. tostring(callback) .. ") from humanoid (" .. tostring(self) .. ").") end end function Humanoid:notifyNewRoom(room) for callback, _ in pairs(self.build_callbacks) do callback(room) end end function Humanoid:notifyOfStaffChange(staff) for callback, _ in pairs(self.staff_change_callbacks) do callback(staff) end end -- Registers a new remove callback for this humanoid. --!param callback (function) The callback to call when a room has been removed. function Humanoid:registerRoomRemoveCallback(callback) if not self.remove_callbacks[callback] then self.world:registerRoomRemoveCallback(callback) self.remove_callbacks[callback] = true else self.world:gameLog("Warning: Trying to re-add room remove callback (" .. tostring(callback) .. ") for humanoid (" .. tostring(self) .. ").") end end -- Unregisters a remove callback for this humanoid. --!param callback (function) The callback to remove. function Humanoid:unregisterRoomRemoveCallback(callback) if self.remove_callbacks[callback] then self.world:unregisterRoomRemoveCallback(callback) self.remove_callbacks[callback] = nil else self.world:gameLog("Warning: Trying to remove nonexistant room remove callback (" .. tostring(callback) .. ") from humanoid (" .. tostring(self) .. ").") end end -- Registers a new staff change callback for this humanoid. --!param callback (function) The callback to call when a staff member has been hired or fired function Humanoid:registerStaffChangeCallback(callback) if self.staff_change_callbacks and not self.staff_change_callbacks[callback] then self.staff_change_callbacks[callback] = true else self.world:gameLog("Warning: Trying to re-add staff callback (" .. tostring(callback) .. ") for humanoid (" .. tostring(self) .. ").") end end -- Unregisters a staff change callback for this humanoid. --!param callback (function) The callback to remove. function Humanoid:unregisterStaffChangeCallback(callback) if self.staff_change_callbacks and self.staff_change_callbacks[callback] then self.staff_change_callbacks[callback] = nil else self.world:gameLog("Warning: Trying to remove nonexistant staff callback (" .. tostring(callback) .. ") from humanoid (" .. tostring(self) .. ").") end end -- Function called when a humanoid is sent away from the hospital to prevent -- further actions taken as a result of a callback function Humanoid:unregisterCallbacks() -- Remove callbacks for new rooms for cb, _ in pairs(self.build_callbacks) do self:unregisterRoomBuildCallback(cb) end -- Remove callbacks for removed rooms for cb, _ in pairs(self.remove_callbacks) do self:unregisterRoomRemoveCallback(cb) end -- Remove callbacks for removed rooms for cb, _ in pairs(self.staff_change_callbacks) do self:unregisterStaffChangeCallback(cb) end -- Remove any message related to the humanoid. if self.message_callback then self:message_callback(true) self.message_callback = nil end end function Humanoid:getDrawingLayer() return 4 end function Humanoid:getCurrentAction() if next(self.action_queue) == nil then error("Action queue was empty. This should never happen.\n" .. self:tostring()) end return self.action_queue[1] end --[[ Return string representation ! Returns string representation of the humanoid like status and action queue !return (string) ]] function Humanoid:tostring() local name = self.profile and self.profile.name or nil local class = self.humanoid_class and self.humanoid_class or "N/A" local full_name = "humanoid" if (name) then full_name = full_name .. " (" .. name .. ")" end local result = string.format("%s - class: %s", full_name, class) result = result .. string.format("\nWarmth: %.3f Happiness: %.3f Fatigue: %.3f Thirst: %.3f Toilet_Need: %.3f Health: %.3f", self.attributes["warmth"] or 0, self.attributes["happiness"] or 0, self.attributes["fatigue"] or 0, self.attributes["thirst"] or 0, self.attributes["toilet_need"] or 0, self.attributes["health"] or 0) result = result .. "\nActions: [" for i = 1, #self.action_queue do local action = self.action_queue[i] local action_string = action.name if action.room_type then action_string = action_string .. " - " .. action.room_type elseif action.object then action_string = action_string .. " - " .. action.object.object_type.id elseif action.name == "walk" then action_string = action_string .. " - going to " .. action.x .. ":" .. action.y elseif action.name == "queue" then local distance = action.current_bench_distance if distance == nil then distance = "nil" end local standing = "false" if action:isStanding() then standing = "true" end action_string = action_string .. " - Bench distance: " .. distance .. " Standing: " .. standing end local flag = action.must_happen and " must_happen" or "" if flag ~= "" then action_string = action_string .. " " .. flag end if i ~= 1 then result = result .. ", " end result = result .. action_string end result = result .. "]" return result end CorsixTH-0.63/CorsixTH/Lua/entities/humanoids/000077500000000000000000000000001347163623700212205ustar00rootroot00000000000000CorsixTH-0.63/CorsixTH/Lua/entities/humanoids/grim_reaper.lua000066400000000000000000000026771347163623700242330ustar00rootroot00000000000000--[[ Copyright (c) 2012 Luís "Driver" Duarte 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. --]] class "GrimReaper" (Humanoid) ---@type GrimReaper local GrimReaper = _G["GrimReaper"] function GrimReaper:GrimReaper(...) self:Humanoid(...) self.attributes = {} self.hover_cursor = TheApp.gfx:loadMainCursor("default") self.walk_anims = { walk_east = 996, walk_north = 994, idle_east = 1004, idle_north = 1002, } end function GrimReaper:tickDay() return false end CorsixTH-0.63/CorsixTH/Lua/entities/humanoids/inspector.lua000066400000000000000000000042021347163623700237270ustar00rootroot00000000000000--[[ Copyright (c) 2011 William "sadger" Gatens 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. --]] corsixth.require("announcer") local AnnouncementPriority = _G["AnnouncementPriority"] --[[ An `Inspector` is called to the hospital after an epidemic to issue a report]] class "Inspector" (Humanoid) ---@type Inspector local Inspector = _G["Inspector"] function Inspector:Inspector(...) self:Humanoid(...) self.hover_cursor = TheApp.gfx:loadMainCursor("default") self.has_been_announced = false end --[[ Labels the inspector as the "Health Inspector" ]] function Inspector:updateDynamicInfo(action_string) self:setDynamicInfo('text', {_S.dynamic_info.health_inspector}) end --[[ Sends the inspector home ]] function Inspector:goHome() if self.going_home then return end --Store a reference to the hospital last visited to send fax to self.last_hospital = self.hospital self:unregisterCallbacks() self.going_home = true self:despawn() end --[[ Called when the inspector has left the map ]] function Inspector:onDestroy() return Humanoid.onDestroy(self) end function Inspector:announce() self.world.ui:playAnnouncement("vip008.wav", AnnouncementPriority.High) end CorsixTH-0.63/CorsixTH/Lua/entities/humanoids/patient.lua000066400000000000000000001275531347163623700234040ustar00rootroot00000000000000--[[ Copyright (c) 2009 Peter "Corsix" Cawley 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. --]] --! A `Humanoid` who is in the hospital for diagnosis and/or treatment. class "Patient" (Humanoid) ---@type Patient local Patient = _G["Patient"] function Patient:Patient(...) self:Humanoid(...) self.hover_cursor = TheApp.gfx:loadMainCursor("patient") self.should_knock_on_doors = true self.treatment_history = {} self.going_home = false -- If set, the patient is going home. self.litter_countdown = nil -- If set, number of tiles to walk before attempting to drop litter. self.has_fallen = 1 self.has_vomitted = 0 self.action_string = "" self.cured = false self.infected = false -- To distinguish between actually being dead and having a nil hospital self.dead = false -- Is the patient reserved for a particular nurse when being vaccinated self.reserved_for = false self.vaccinated = false -- Has the patient been sent to the wrong room and needs redirecting self.needs_redirecting = false self.attempted_to_infect= false -- Is the patient about to be vaccinated? self.vaccination_candidate = false -- Has the patient passed reception? self.has_passed_reception = false -- Is the patient trying to get to the toilet? ("yes", "no", or "no-toilets") self.going_to_toilet = "no" -- Health history in entries 1..SIZE (may not all exist at first). The "last" -- entry indicates last written entry, "(last+1) % SIZE" is the oldest entry. -- The "size" entry holds the length of the array (that is, SIZE). -- Variable gets automatically initialized on first day. self.health_history = nil end function Patient:onClick(ui, button) if button == "left" then if self.message_callback then self:message_callback() else local hospital = self.hospital or self.world:getLocalPlayerHospital() local epidemic = hospital and hospital.epidemic if not epidemic or (not epidemic.coverup_in_progress or (not self.infected or self.marked_for_vaccination) and not epidemic.vaccination_mode_active) then ui:addWindow(UIPatient(ui, self)) end if epidemic and epidemic.coverup_in_progress and self.infected and not self.marked_for_vaccination and -- Prevent further vaccinations when the timer ends not epidemic.timer.closed then epidemic:markForVaccination(self) end end elseif self.user_of then -- The object we're using is made invisible, as the animation contains both -- the humanoid and the object. Hence send the click onto the object. self.user_of:onClick(ui, button) end Humanoid.onClick(self, ui, button) end function Patient:setDisease(disease) self.disease = disease disease.initPatient(self) self.diagnosed = false self.diagnosis_progress = 0 self.cure_rooms_visited = 0 -- Copy list of diagnosis rooms -- (patient may visit these for diagnosis, if they exist in the hospital). self.available_diagnosis_rooms = {} for i, room in ipairs(self.disease.diagnosis_rooms) do self.available_diagnosis_rooms[i] = room end -- Decide an insurance company, one out of four patients have one. -- TODO: May need some balancing, but it is roughly the same as in TH. local company = math.random(1,12) if company < 4 then self.insurance_company = company end -- Randomise thirst and the need to visit the loo soon. -- Alien patients do not have the needed animations for these things, so exclude them if not self.disease.only_emergency then self.attributes["thirst"] = math.random()*0.2 self.attributes["toilet_need"] = math.random()*0.2 end self:updateDynamicInfo() end function Patient:changeDisease(new_disease) assert(not self.diagnosed, "Cannot change the disease of a diagnosed patient") -- These assertions should hold until handling of visual diseases is implemented. assert(self.disease.contagious, "Cannot change the disease of a patient who has a non-contagious disease") assert(new_disease.contagious, "Cannot change a disease to a non-contagious disease") local visited_rooms = {} -- Add all diagnosis room for the old disease. for _, room in ipairs(self.disease.diagnosis_rooms) do visited_rooms[room] = true end -- Disable the rooms not yet visited by the patient. for _, room in ipairs(self.available_diagnosis_rooms) do visited_rooms[room] = false end -- 'visited_rooms' is now diagnosis rooms that the patient has visited for the old disease. -- Compute unvisited rooms for the new disease. self.available_diagnosis_rooms = {} for _, room in ipairs(new_disease.diagnosis_rooms) do if not visited_rooms[room] then self.available_diagnosis_rooms[#self.available_diagnosis_rooms + 1] = room end end self.disease = new_disease -- Finally, make the patient carry the new disease. end --! Mark patient as being diagnosed. function Patient:setDiagnosed() self.diagnosed = true self.treatment_history[#self.treatment_history + 1] = self.disease.name local window = self.world.ui:getWindow(UIPatient) if window and window.patient == self then window:updateInformation() end self:updateDynamicInfo() end -- Modifies the diagnosis progress of a patient. -- incrementValue can be either positive or negative. function Patient:modifyDiagnosisProgress(incrementValue) self.diagnosis_progress = math.min(self.hospital.policies["stop_procedure"], self.diagnosis_progress + incrementValue) self.diagnosis_progress = math.max(0.000, self.diagnosis_progress) local window = self.world.ui:getWindow(UIPatient) if window and window.patient == self then window:updateInformation() end self:updateDynamicInfo() end -- Updates the patients diagnostic progress based on the doctors skill -- called when they are done using a diagnosis room function Patient:completeDiagnosticStep(room) -- Base: depending on difficulty of disease as set in sam file -- tiredness reduces the chance of diagnosis if staff member is above 50% tired local multiplier = 1 local expertise = self.world.map.level_config.expertise local diagnosis_difficulty = expertise[self.disease.expertise_id].MaxDiagDiff / 1000 local diagnosis_base = 0.4 * (1 - diagnosis_difficulty) local diagnosis_bonus = 0.4 -- Did the staff member manage to leave the room before the patient had -- a chance to get diagnosed? Then use a default middle value. if room.staff_member then local fatigue = room.staff_member.attributes["fatigue"] or 0 -- Bonus: based on skill and attn to detail (with some randomness). -- additional bonus if the staff member is highly skilled / consultant -- tiredness reduces the chance of diagnosis if staff member is above 50% tired if room.staff_member.profile.skill >= 0.9 then multiplier = math.random(1, 5) * (1 - (fatigue -0.5)) else multiplier = 1 * (1 - (fatigue -0.5)) end local divisor = math.random(1, 3) local attn_detail = room.staff_member.profile.attention_to_detail / divisor local skill = room.staff_member.profile.skill / divisor diagnosis_bonus = (attn_detail + 0.4) * skill end self:modifyDiagnosisProgress(diagnosis_base + (diagnosis_bonus * multiplier)) end -- Sets the hospital for the patient - additionally removing them from a -- hospital if they already belong to one. For player hospitals, patients who -- are not debug or emergency patients are made to seek a reception desk. --!param hospital (Hospital): hospital to assign to patient function Patient:setHospital(hospital) if self.hospital then self.hospital:removePatient(self) end Humanoid.setHospital(self, hospital) if hospital.is_in_world and not self.is_debug and not self.is_emergency then self:setNextAction(SeekReceptionAction()) end hospital:addPatient(self) end --! Decide the ID of the disease or treatment that the patient is paying for. --!return (string or nil) Id of the disease or treatment, or nil if the Id could --! not be decided. function Patient:getTreatmentDiseaseId() if self.diagnosed then return self.disease.id else local room_info = self:getRoom() if not room_info then print("Warning: Trying to receive money for treated patient who is ".. "not in a room") return nil end room_info = room_info.room_info return "diag_" .. room_info.id end end --! Estimate the subjective perceived distortion between the price level the --! patient might expect considering the reputation and the cure effectiveness --! of a given treatment and the staff internal state. --!param casebook (table): casebook entry for the treatment. --!return (float) [-1, 1]. The smaller the value is, the more the patient --! considers the bill to be under-priced. The bigger the value is, the more --! the patient patient considers the bill to be over-priced. function Patient:getPriceDistortion(casebook) -- weights local happiness_weight = 0.1 local reputation_weight = 0.6 local effectiveness_weight = 0.3 -- map the different variables to [0-1] and merge them local reputation = casebook.reputation or self.hospital.reputation local effectiveness = casebook.cure_effectiveness local weighted_happiness = happiness_weight * self.attributes.happiness local weighted_reputation = reputation_weight * (reputation / 1000) local weighted_effectiveness = effectiveness_weight * (effectiveness / 100) local expected_price_level = weighted_happiness + weighted_reputation + weighted_effectiveness -- map to [0-1] local price_level = ((casebook.price - 0.5) / 3) * 2 return price_level - expected_price_level end --! Handle attempting to treat this patient --! --! If the treatment is effective the patient will be sent home, otherwise they --! will die. The patient may or may not agree to pay for the treatment --! depending on whether they consider the price reasonable. function Patient:treatDisease() local hospital = self.hospital hospital:receiveMoneyForTreatment(self) -- Either the patient is no longer sick, or he/she dies. if self:isTreatmentEffective() then self:cure() self.treatment_history[#self.treatment_history + 1] = _S.dynamic_info.patient.actions.cured self:goHome("cured") else self:die() end hospital:updatePercentages() hospital:paySupplierForDrug(self.disease.id) if self.is_emergency then hospital:checkEmergencyOver() end end --! Returns true if patient agrees to pay for the given treatment. --!param disease_id (string): The id of the disease to test function Patient:agreesToPay(disease_id) local casebook = self.hospital.disease_casebook[disease_id] local price_distortion = self:getPriceDistortion(casebook) local is_over_priced = price_distortion > self.hospital.over_priced_threshold return not (is_over_priced and math.random(1, 5) == 1) end --! Either the patient is cured, or he/she dies. --!return (boolean) True if cured, false if died. function Patient:isTreatmentEffective() local cure_chance = self.hospital.disease_casebook[self.disease.id].cure_effectiveness cure_chance = cure_chance * self.diagnosis_progress local die = self.die_anims and math.random(1, 100) > cure_chance return not die end --! Change patient internal state to "cured". function Patient:cure() self.cured = true self.infected = false self.attributes["health"] = 1 end function Patient:die() -- It may happen that this patient was just cured and then the room blew up. local hospital = self.hospital if hospital.num_deaths < 1 then self.world.ui.adviser:say(_A.information.first_death) end hospital:humanoidDeath(self) if not self.is_debug then local casebook = hospital.disease_casebook[self.disease.id] casebook.fatalities = casebook.fatalities + 1 end hospital:msgKilled() self:setMood("dead", "activate") self.world.ui:playSound("boo.wav") -- this sound is always heard self.going_home = true if self:getRoom() then self:queueAction(MeanderAction():setCount(1)) else self:setNextAction(MeanderAction():setCount(1)) end if self.is_emergency then hospital.emergency.killed_emergency_patients = hospital.emergency.killed_emergency_patients + 1 end self:queueAction(DieAction()) self:updateDynamicInfo(_S.dynamic_info.patient.actions.dying) end function Patient:canPeeOrPuke(current) return ((current.name == "walk" or current.name == "idle" or current.name == "seek_room" or current.name == "queue") and not self.going_home and self.world.map.th:getCellFlags(self.tile_x, self.tile_y).buildable) end --! Animations for when there is an earth quake function Patient:falling() local current = self:getCurrentAction() current.keep_reserved = true if self.falling_anim and self:canPeeOrPuke(current) and self.has_fallen == 1 then self:setNextAction(FallingAction(), 0) self.has_fallen = 2 if self.has_fallen == 2 then self:setNextAction(OnGroundAction()) self.on_ground = true end if self.on_ground then self:setNextAction(GetUpAction()) end if current.name == "idle" or current.name == "walk" then self:queueAction({ name = current.name, x = current.x, y = current.y, must_happen = (current.name == "walk" and current.saved_must_happen) or (current.name == "idle" and current.must_happen), is_entering = current.is_entering, }, 2) else self:queueAction({ name = current.name, room_type = current.room_type, message_sent = true, diagnosis_room = current.diagnosis_room, treatment_room = current.treatment_room, }, 2) end if current.on_interrupt then current.on_interrupt(current, self) else self:finishAction() end self.on_ground = false if math.random(1, 5) == 3 then self:shakeFist() end self:fallingAnnounce() self:changeAttribute("happiness", -0.05) -- falling makes you very unhappy else return end end function Patient:fallingAnnounce() local msg = { (_A.warnings.falling_1), (_A.warnings.falling_2), (_A.warnings.falling_3), (_A.warnings.falling_4), (_A.warnings.falling_5), (_A.warnings.falling_6), } if msg then self.world.ui.adviser:say(msg[math.random(1, #msg)]) end end --! Perform 'shake fist' action. function Patient:shakeFist() if self.shake_fist_anim then self:queueAction(ShakeFistAction(), 1) end end function Patient:vomit() local current = self:getCurrentAction() --Only vomit under these conditions. Maybe I should add a vomit for patients in queues too? if self:canPeeOrPuke(current) and self.has_vomitted == 0 then self:queueAction(VomitAction(), 1) if current.name == "idle" or current.name == "walk" then self:queueAction({ name = current.name, x = current.x, y = current.y, must_happen = (current.name == "walk" and current.saved_must_happen) or (current.name == "idle" and current.must_happen), is_entering = current.is_entering, }, 2) else self:queueAction({ name = current.name, room_type = current.room_type, message_sent = true, diagnosis_room = current.diagnosis_room, treatment_room = current.treatment_room, }, 2) end if current.on_interrupt then current.on_interrupt(current, self) else self:finishAction() end self.has_vomitted = self.has_vomitted + 1 self:changeAttribute("happiness", -0.02) -- being sick makes you unhappy else return end end function Patient:pee() local current = self:getCurrentAction() --Only pee under these conditions. As with vomit, should they also pee if in a queue? if self:canPeeOrPuke(current) then self:queueAction(PeeAction(), 1) if current.name == "idle" or current.name == "walk" then self:queueAction({ name = current.name, x = current.x, y = current.y, must_happen = (current.name == "walk" and current.saved_must_happen) or (current.name == "idle" and current.must_happen), is_entering = current.is_entering, }, 2) else self:queueAction({ name = current.name, room_type = current.room_type, message_sent = true, diagnosis_room = current.diagnosis_room, treatment_room = current.treatment_room, }, 2) end if current.on_interrupt then current.on_interrupt(current, self) else self:finishAction() end self:setMood("poo", "deactivate") self:changeAttribute("happiness", -0.02) -- not being able to find a loo and doing it in the corridor will make you sad too if not self.hospital.did_it_on_floor then self.hospital.did_it_on_floor = true self.world.ui.adviser:say(_A.warnings.people_did_it_on_the_floor) end else return end end function Patient:checkWatch() local action = self:getCurrentAction() if self.check_watch_anim and (action.name == "idle" or action.name == "seek_room") and not action.is_leaving then self:queueAction(CheckWatchAction(), 0) end end function Patient:yawn() local action = self:getCurrentAction() if self.yawn_anim and (action.name == "idle" or action.name == "seek_room") and not action.is_leaving then self:queueAction(YawnAction(), 0) end end function Patient:tapFoot() local action = self:getCurrentAction() if self.tap_foot_anim and (action.name == "idle" or action.name == "seek_room") and not action.is_leaving then self:queueAction(TapFootAction(), 0) end end --! Make the patient leave the hospital. This function also handles some --! statistics (number of cured/kicked out patients, etc.) --! The mood icon is updated accordingly. Reputation is impacted accordingly. --!param reason (string): the reason why the patient is sent home, which could be: --! -"cured": When the patient is cured. --! -"kicked": When the patient is kicked anyway, either manually, --! either when no treatment can be found for her/him, etc. --! -"over_priced": When the patient decided to leave because he/she believes --! the last treatment is over-priced. --param disease_id (string): When the reason is "over_priced" this is the --! id of the disease/diagnosis that the patient considered over_priced function Patient:goHome(reason, disease_id) local hosp = self.hospital if self.going_home then -- The patient should be going home already! Anything related to the hospital -- will not be updated correctly, but we still want to try to get the patient to go home. TheApp.world:gameLog("Warning: goHome called when the patient is already going home") self:despawn() return end if reason == "cured" then self:setMood("cured", "activate") self:changeAttribute("happiness", 0.8) self.world.ui:playSound("cheer.wav") -- This sound is always heard self.hospital:updateCuredCounts(self) self:updateDynamicInfo(_S.dynamic_info.patient.actions.cured) self.hospital:msgCured() elseif reason == "kicked" then self:setMood("exit", "activate") self.hospital:updateNotCuredCounts(self, reason) elseif reason == "over_priced" then self:setMood("sad_money", "activate") self:changeAttribute("happiness", -0.5) local treatment_name = self.hospital.disease_casebook[disease_id].disease.name self.world.ui.adviser:say(_A.warnings.patient_not_paying:format(treatment_name)) self.hospital:updateNotCuredCounts(self, reason) self:clearDynamicInfo() self:updateDynamicInfo(_S.dynamic_info.patient.actions.prices_too_high) elseif reason == "evacuated" then self:clearDynamicInfo() self:setDynamicInfo('text', {_S.dynamic_info.patient.actions.epidemic_sent_home}) self:setMood("exit","activate") else TheApp.world:gameLog("Error: unknown reason " .. reason .. "!") end hosp:updatePercentages() if self.is_debug then hosp:removeDebugPatient(self) end -- Remove any messages and/or callbacks related to the patient. self:unregisterCallbacks() self.going_home = true self.waiting = nil -- Remove any vaccination calls from patient if not self.vaccinated then self.world.dispatcher:dropFromQueue(self) end local room = self:getRoom() if room then room:makeHumanoidLeave(self) end Humanoid.despawn(self) end -- Despawns the patient and removes them from the hospital function Patient:despawn() self.hospital:removePatient(self) Humanoid.despawn(self) end -- This function handles changing of the different attributes of the patient. -- For example if thirst gets over a certain level (now: 0.7), the patient -- tries to find a drinks machine nearby. function Patient:tickDay() -- First of all it may happen that this patient is tired of waiting and goes home. if self.waiting then self.waiting = self.waiting - 1 if self.waiting == 0 then self:goHome("kicked") if self.diagnosed then -- No treatment rooms self:updateDynamicInfo(_S.dynamic_info.patient.actions.no_treatment_available) else -- No diagnosis rooms self:updateDynamicInfo(_S.dynamic_info.patient.actions.no_diagnoses_available) end elseif self.waiting == 10 then self:tapFoot() elseif self.waiting == 20 then self:yawn() elseif self.waiting == 30 then self:checkWatch() end if self.has_vomitted and self.has_vomitted > 0 then self.has_vomitted = 0 end end -- if patients are getting unhappy, then maybe we should see this! if self.attributes["happiness"] < 0.3 then self:setMood("sad7", "activate") else self:setMood("sad7", "deactivate") end -- Now call the parent function - it checks -- if we're outside the hospital or on our way home. if not Humanoid.tickDay(self) then return end -- Die before we poo or drink -- patient has been in the hospital for over 6 months and is still not well, so will become sad and will either get fed up and leave -- or stay in the hope that you will cure them before they die -- strange, but in TH happiness does not go down, even when close to death IMO that is wrong as you would be unhappy if you waited too long. -- TODO death animation for slack female is missing its head. For now the only option is for her to get fed up and leave -- this can be changed when the animation thing is resolved -- TODO clean up this block, nonmagical numbers if self.attributes["health"] >= 0.18 and self.attributes["health"] < 0.22 then self:setMood("sad2", "activate") self:changeAttribute("happiness", -0.0002) -- waiting too long will make you sad -- There is a 1/3 chance that the patient will get fed up and leave -- note, this is potentially run 10 ((0.22-0.18)/0.004) times, hence the 1/30 chance. if math.random(1,30) == 1 then self:updateDynamicInfo(_S.dynamic_info.patient.actions.fed_up) self:setMood("sad2", "deactivate") self:goHome("kicked") end elseif self.attributes["health"] >= 0.14 and self.attributes["health"] < 0.18 then self:setMood("sad2", "deactivate") self:setMood("sad3", "activate") -- now wishes they had gone to that other hospital elseif self.attributes["health"] >= 0.10 and self.attributes["health"] < 0.14 then self:setMood("sad3", "deactivate") self:setMood("sad4", "activate") -- starts to take a turn for the worse and is slipping away elseif self.attributes["health"] >= 0.06 and self.attributes["health"] < 0.10 then self:setMood("sad4", "deactivate") self:setMood("sad5", "activate") -- fading fast elseif self.attributes["health"] >= 0.01 and self.attributes["health"] < 0.06 then self:setMood("sad5", "deactivate") self:setMood("sad6", "activate") -- its not looking good elseif self.attributes["health"] > 0.00 and self.attributes["health"] < 0.01 then self.attributes["health"] = 0.0 -- is there time to say a prayer elseif self.attributes["health"] == 0.0 then -- people who are in a room should not die: -- 1. they are being cured in this moment. dying in the last few seconds -- before the cure makes only a subtle difference for gameplay -- 2. they will leave the room soon (toilets, diagnostics) and will die then if not self:getRoom() and not self:getCurrentAction().is_leaving then self:setMood("sad6", "deactivate") self:die() end --dead people aren't thirsty return end -- Note: to avoid empty action queue error if the player spam clicks a patient at the same time as the day changes -- there is now an inbetween "neutal" stage. if self.has_fallen == 3 then self.has_fallen = 1 elseif self.has_fallen == 2 then self.has_fallen = 3 end -- Update health history. if not self.health_history then -- First day, initialize health history. self.health_history = {} self.health_history[1] = self.attributes["health"] self.health_history["last"] = 1 self.health_history["size"] = 20 else -- Update the health history, wrapping around the array. local last = self.health_history["last"] + 1 if last > self.health_history["size"] then last = 1 end self.health_history[last] = self.attributes["health"] self.health_history["last"] = last end -- Vomitings. if self.vomit_anim and not self:getRoom() and not self:getCurrentAction().is_leaving and not self:getCurrentAction().is_entering then --Nausea level is based on health then proximity to vomit is used as a multiplier. --Only a patient with a health value of less than 0.8 can be the initial vomiter, however :) local initialVomitMult = 0.002 --The initial chance of vomiting. local proximityVomitMult = 1.5 --The multiplier used when in proximity to vomit. local nausea = (1.0 - self.attributes["health"]) * initialVomitMult local foundVomit = {} local numVomit = 0 self.world:findObjectNear(self, "litter", 2, function(x, y) local litter = self.world:getObject(x, y, "litter") if not litter then return end if litter:vomitInducing() then local alreadyFound = false for i=1,numVomit do if foundVomit[i] == litter then alreadyFound = true break end end if not alreadyFound then numVomit = numVomit + 1 foundVomit[numVomit] = litter end end -- seeing litter will make you unhappy. If it is pee or puke it is worse if litter:anyLitter() then self:changeAttribute("happiness", -0.0002) else self:changeAttribute("happiness", -0.0004) end end) -- End of findObjectNear -- As we don't yet have rats, ratholes and dead rats the chances of vomitting are slim -- as a temp fix for this I have added 0.5 to the < nausea equation, -- this may want adjusting or removing when the other factors are in the game MarkL if self.attributes["health"] <= 0.8 or numVomit > 0 or self.attributes["happiness"] < 0.6 then nausea = nausea * ((numVomit+1) * proximityVomitMult) if math.random() < nausea + 0.5 then self:vomit() end end end -- It is nice to see plants, but dead plants make you unhappy self.world:findObjectNear(self, "plant", 2, function(x, y) local plant = self.world:getObject(x, y, "plant") if not plant then return end if plant:isPleasing() then self:changeAttribute("happiness", 0.0002) else self:changeAttribute("happiness", -0.0002) end end) -- It always makes you happy to see you are in safe place self.world:findObjectNear(self, "extinguisher", 2, function(x, y) self:changeAttribute("happiness", 0.0002) end) -- sitting makes you happy whilst standing and walking does not if self:goingToUseObject("bench") then self:changeAttribute("happiness", 0.00002) else self:changeAttribute("happiness", -0.00002) end -- Each tick both thirst, warmth and toilet_need changes and health decreases. self:changeAttribute("thirst", self.attributes["warmth"]*0.02+0.004*math.random() + 0.004) self:changeAttribute("health", - 0.004) if self.disease.more_loo_use then self:changeAttribute("toilet_need", 0.018*math.random() + 0.008) else self:changeAttribute("toilet_need", 0.006*math.random() + 0.002) end -- Maybe it's time to visit the loo? if self.attributes["toilet_need"] and self.attributes["toilet_need"] > 0.75 then if self.pee_anim and not self:getCurrentAction().is_leaving and not self:getCurrentAction().is_entering and not self.in_room then if math.random(1, 10) < 5 then self:pee() self:changeAttribute("toilet_need", -(0.5 + math.random()*0.15)) self.going_to_toilet = "no" else -- If waiting for user response, do not send to toilets, as this messes -- things up. if self.going_to_toilet == "no" and not self.waiting then self:setMood("poo", "activate") -- Check if any room exists. if not self.world:findRoomNear(self, "toilets") then self.going_to_toilet = "no-toilets" -- Gets reset when a new toilet is built (then, patient will try again). -- Otherwise we can queue the action, but only if not in any rooms right now. elseif not self:getRoom() and not self:getCurrentAction().is_leaving and not self:getCurrentAction().pee then self:setNextAction(SeekToiletsAction():setMustHappen(true)) self.going_to_toilet = "yes" end end end end end if self.disease.yawn and math.random(1, 10) == 5 then self:yawn() end -- If thirsty enough a soda would be nice if self.attributes["thirst"] and self.attributes["thirst"] > 0.7 then self:changeAttribute("happiness", -0.002) self:setMood("thirsty", "activate") -- If there's already an action to buy a drink in the action queue, or -- if we're going to the loo, do nothing if self:goingToUseObject("drinks_machine") or self.going_to_toilet ~= "no" then return end -- Don't check for a drinks machine too often if self.timeout and self.timeout > 0 then self.timeout = self.timeout - 1 return end -- The only allowed situations to grab a soda is when queueing -- or idling/walking in the corridors -- Also make sure the walk action when leaving a room has a chance to finish. if not self:getRoom() and not self:getCurrentAction().is_leaving and not self.going_home then local machine, lx, ly = self.world: findObjectNear(self, "drinks_machine", 8) -- If no machine can be found, resume previous action and wait a -- while before trying again. To get a little randomness into the picture -- it's not certain we go for it right now. if not machine or not lx or not ly or math.random(1,10) < 3 then self.timeout = math.random(2,4) return end -- Callback function when the machine has been used local --[[persistable:patient_drinks_machine_after_use]] function after_use() self:changeAttribute("thirst", -(0.7 + math.random()*0.3)) self:changeAttribute("toilet_need", 0.05 + math.random()*0.05) self:setMood("thirsty", "deactivate") -- The patient might be kicked while buying a drink if not self.going_home then self.hospital:sellSodaToPatient(self) end -- The patient might also throw the can on the floor, bad patient! if math.random() < 0.6 then -- It will be dropped between 1 and 12 tiles away (litter bin catches 8 radius). self.litter_countdown = math.random(1, 12) end end -- If we are queueing, let the queue handle the situation. for _, current_action in ipairs(self.action_queue) do if current_action.name == "queue" then local callbacks = current_action.queue.callbacks[self] if callbacks then callbacks:onGetSoda(self, machine, lx, ly, after_use) return end end end -- Or, if walking or idling insert the needed actions in -- the beginning of the queue local current = self:getCurrentAction() if current.name == "walk" or current.name == "idle" or current.name == "seek_room" then -- Go to the machine, use it, and then continue with -- whatever he/she was doing. current.keep_reserved = true self:queueAction(WalkAction(lx, ly):setMustHappen(true):disableTruncate(), 1) self:queueAction(UseObjectAction(machine):setAfterUse(after_use):setMustHappen(true), 2) machine:addReservedUser(self) -- Insert the old action again, a little differently depending on -- what the previous action was. if current.name == "idle" or current.name == "walk" then self:queueAction({ name = current.name, x = current.x, y = current.y, must_happen = (current.name == "walk" and current.saved_must_happen) or (current.name == "idle" and current.must_happen), is_entering = current.is_entering, }, 3) -- If we were idling, also go away a little before continuing with -- that important action. if current.name == "idle" then self:queueAction(MeanderAction():setCount(1), 3) end else -- We were seeking a room, start that action from the beginning -- i.e. do not set the must_happen flag. self:queueAction({ name = current.name, room_type = current.room_type, message_sent = true, diagnosis_room = current.diagnosis_room, treatment_room = current.treatment_room, }, 3) end if current.on_interrupt then current.on_interrupt(current, self) else self:finishAction() end end end end -- If the patient is sitting on a bench or standing and queued, -- it may be a situation where he/she is not in the queue -- anymore, but should be. If this is the case for more than -- 2 ticks, go to reception if #self.action_queue > 1 and (self:getCurrentAction().name == "use_object" or self:getCurrentAction().name == "idle") and self.action_queue[2].name == "queue" then local found = false for _, humanoid in ipairs(self.action_queue[2].queue) do if humanoid == self then found = true break end end if not found then if not self.noqueue_ticks then self.noqueue_ticks = 1 elseif self.noqueue_ticks > 2 then self.world:gameLog("A patient has a queue action, but is not in the corresponding queue") self:setNextAction(SeekReceptionAction()) else self.noqueue_ticks = self.noqueue_ticks + 1 end else self.noqueue_ticks = 0 end end end function Patient:notifyNewRoom(room) Humanoid.notifyNewRoom(self, room) if self.going_to_toilet == "no-toilets" and room.room_info.id == "toilets" then self.going_to_toilet = "no" -- Patient can try again going to the loo. end end -- Called each time the patient moves to a new tile. function Patient:setTile(x, y) if not self.litter_countdown then -- If arrived at the first tile of the hospital, give patient some litter. if x and self.world.map.th:getCellFlags(x, y).buildable then -- Small hospitals are around 40-50 tiles. self.litter_countdown = math.random(20, 100) end elseif self.hospital and not self.going_home then self.litter_countdown = self.litter_countdown - 1 -- Is the patient about to drop some litter? if self.litter_countdown == 0 then if x and not self:getRoom() and not self.world:getObjects(x, y) and self.world.map.th:getCellFlags(x, y).buildable and (not self.world:findObjectNear(self, "bin", 8) or math.random() < 0.05) then -- Drop some litter! local trash = math.random(1, 4) local litter = self.world:newObject("litter", x, y) litter:setLitterType(trash, math.random(0, 1)) if not self.hospital.hospital_littered then self.hospital.hospital_littered = true -- A callout is only needed if there are no handymen employed if not self.hospital:hasStaffOfCategory("Handyman") then self.world.ui.adviser:say(_A.staff_advice.need_handyman_litter) end end end -- Always give new litter to drop. self.litter_countdown = math.random(30, 150) end end Humanoid.setTile(self, x, y) end -- As of now each time a bench is placed the world notifies all patients -- in the vicinity through this function. function Patient:notifyNewObject(id) -- If currently queueing it would be nice to be able to sit down. assert(id == "bench", "Can only handle benches at the moment") -- Look for a queue action and tell this patient to look for a bench -- if currently standing up. for _, action in ipairs(self.action_queue) do if action.name == "queue" then local callbacks = action.queue.callbacks[self] if callbacks then assert(action.done_init, "Queue action was not yet initialized") if action:isStanding() then callbacks:onChangeQueuePosition(self) break end end end end end function Patient:addToTreatmentHistory(room) local should_add = true -- Do not add facility rooms such as toilets to the treatment history. for i, _ in pairs(room.categories) do if i == "facilities" then should_add = false break end end if should_add then self.treatment_history[#self.treatment_history + 1] = room.name end end function Patient:updateDynamicInfo(action_string) -- Retain the old text if only an update is wanted, i.e. no new string is supplied. if action_string == nil then if self.action_string then action_string = self.action_string else action_string = "" end else self.action_string = action_string end local info = "" if self.going_home then self:setDynamicInfo('progress', nil) elseif self.diagnosed then if self.diagnosis_progress < 1.0 then -- The cure was guessed info = _S.dynamic_info.patient.guessed_diagnosis:format(self.disease.name) else info = _S.dynamic_info.patient.diagnosed:format(self.disease.name) end self:setDynamicInfo('progress', nil) else info = _S.dynamic_info.patient.diagnosis_progress -- TODO: If the policy is changed this info will not be changed until the next -- diagnosis facility has been visited. local divider = 1 if self.hospital then divider = self.hospital.policies["stop_procedure"] end if self.diagnosis_progress then self:setDynamicInfo('progress', math.min(1.0, self.diagnosis_progress / divider)) end end -- Set the centre line of dynamic info based on contagiousness, if appropriate local epidemic = self.hospital and self.hospital.epidemic if epidemic and epidemic.coverup_in_progress then if self.infected and not self.vaccinated then self:setDynamicInfo('text', {action_string, _S.dynamic_info.patient.actions.epidemic_contagious, info}) elseif self.vaccinated then self:setDynamicInfo('text', {action_string, _S.dynamic_info.patient.actions.epidemic_vaccinated, info}) end else self:setDynamicInfo('text', {action_string, "", info}) end end --[[ Update availability of a choice in message owned by this patient, if any !param choice (string) The choice that needs updating (currently "research" or "guess_cure"). ]] function Patient:updateMessage(choice) if self.message and self.message.choices then local message_choice local enabled = false for _, c in ipairs(self.message.choices) do if c.choice == choice then message_choice = choice end end if choice == "research" and message_choice == choice then -- enable only if research department is built and a room in the treatment chain is undiscovered local req = self.hospital:checkDiseaseRequirements(self.disease.id) if req then local strings = _S.fax.disease_discovered_patient_choice enabled = self.hospital:hasRoomOfType("research") and self.hospital:hasStaffOfCategory("Researcher") local output_text = strings.can_not_cure if #req.rooms == 1 then local room_name, required_staff, staff_name = self.world:getRoomNameAndRequiredStaffName(req.rooms[1]) if req.staff[required_staff] or 0 > 0 then output_text = strings.need_to_build_and_employ:format(room_name, staff_name) else output_text = strings.need_to_build:format(room_name) end elseif #req.rooms == 0 and next(req.staff) then local staffclass_to_string = { Nurse = _S.staff_title.nurse, Doctor = _S.staff_title.doctor, Surgeon = _S.staff_title.surgeon, Psychiatrist = _S.staff_title.psychiatrist, } output_text = strings.need_to_employ:format(staffclass_to_string[next(req.staff)]) end self.message[3].text = output_text else -- no requirements missing enabled = false end else -- if choice == "guess_cure" then -- TODO: implement end for _, c in ipairs(self.message.choices) do if c.choice == choice then c.enabled = enabled end end -- Update the fax window if it is open. local window = self.world.ui:getWindow(UIFax) if window then window:updateChoices() end end end --[[ If the patient is not a vaccination candidate then give them the arrow icon and candidate status ]] function Patient:giveVaccinationCandidateStatus() self:setMood("epidemy2","deactivate") self:setMood("epidemy3","activate") self.vaccination_candidate = true end --[[Remove the vaccination candidate icon and status from the patient]] function Patient:removeVaccinationCandidateStatus() if not self.vaccinated then self:setMood("epidemy3","deactivate") self:setMood("epidemy2","activate") self.vaccination_candidate = false end end function Patient:afterLoad(old, new) if old < 68 then if self.going_home then self.waiting = nil end end if old < 87 then if self.die_anims == nil then self.die_anims = {} end -- New humanoid animation: rise_hell_east: if self:isMalePatient() then if self.humanoid_class ~= "Alternate Male Patient" then self.die_anims.rise_hell_east = 384 else self.die_anims.rise_hell_east = 3404 end else self.die_anims.rise_hell_east = 580 end end if old < 108 then if self.going_to_toilet then -- Not easily decidable what the patient is doing here, -- removing a toilet while it's used is unlikely to happen. if self.world:findRoomNear(self, "toilets") then self.going_to_toilet = "yes" else self.going_to_toilet = "no-toilets" end else self.going_to_toilet = "no" end end Humanoid.afterLoad(self, old, new) end function Patient:isMalePatient() if string.find(self.humanoid_class,"Female") then return false elseif string.find(self.humanoid_class,"Male") then return true else local male_patient_classes = {["Chewbacca Patient"] = true,["Elvis Patient"] = true,["Invisible Patient"] = true} return male_patient_classes[self.humanoid_class] ~= nil end end -- Dummy callback for savegame compatibility local callbackNewRoom = --[[persistable:patient_toilet_build_callback]] function(room) end CorsixTH-0.63/CorsixTH/Lua/entities/humanoids/staff.lua000066400000000000000000000556501347163623700230410ustar00rootroot00000000000000--[[ Copyright (c) 2009 Peter "Corsix" Cawley 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. --]] corsixth.require("announcer") --! A Doctor, Nurse, Receptionist, Handyman, or Surgeon class "Staff" (Humanoid) ---@type Staff local Staff = _G["Staff"] --!param ... Arguments to base class constructor. function Staff:Staff(...) self:Humanoid(...) self.hover_cursor = TheApp.gfx:loadMainCursor("staff") self.parcelNr = 0 end function Staff:tickDay() Humanoid.tickDay(self) -- Pay too low --> unhappy -- Pay too high --> happy local fair_wage = self.profile:getFairWage() local wage = self.profile.wage self:changeAttribute("happiness", 0.05 * (wage - fair_wage) / (fair_wage ~= 0 and fair_wage or 1)) -- if you overwork your Dr's then there is a chance that they can go crazy -- when this happens, find him and get him to rest straight away if self.attributes["fatigue"] then if self.attributes["fatigue"] < 0.7 then if self:isResting() then self:setMood("tired", "deactivate") self:changeAttribute("happiness", 0.006) end end -- Working when you should be taking a break will make you unhappy if self.attributes["fatigue"] >= self.hospital.policies["goto_staffroom"] then self:changeAttribute("happiness", -0.02) end -- You will also start to become unhappy as you become tired if self.attributes["fatigue"] >= 0.5 then self:changeAttribute("happiness", -0.01) end end -- It is nice to see plants, but dead plants make you unhappy self.world:findObjectNear(self, "plant", 2, function(x, y) local plant = self.world:getObject(x, y, "plant") if plant then if plant:isPleasing() then self:changeAttribute("happiness", 0.002) else self:changeAttribute("happiness", -0.003) end end end) -- It always makes you happy to see you are in safe place self.world:findObjectNear(self, "extinguisher", 2, function(x, y) self:changeAttribute("happiness", 0.002) end) -- Extra room items add to your happiness (some more than others) self.world:findObjectNear(self, "bin", 2, function(x, y) self:changeAttribute("happiness", 0.001) end) self.world:findObjectNear(self, "bookcase", 2, function(x, y) self:changeAttribute("happiness", 0.003) end) self.world:findObjectNear(self, "skeleton", 2, function(x, y) self:changeAttribute("happiness", 0.002) end) self.world:findObjectNear(self, "tv", 2, function(x, y) self:changeAttribute("happiness", 0.0005) end) -- Being able to rest from work and play the video game or pool will make you happy if (self:getCurrentAction().name == "use_object" and self:getCurrentAction().object.object_type.id == "video_game") then self:changeAttribute("happiness", 0.08) end if (self:getCurrentAction().name == "use_object" and self:getCurrentAction().object.object_type.id == "pool_table") then self:changeAttribute("happiness", 0.074) end if (self:getCurrentAction().name == "use_object" and self:getCurrentAction().object.object_type.id == "sofa") then self:changeAttribute("happiness", 0.05) end --TODO windows in your work space and a large space to work in add to happiness -- working in a small space makes you unhappy end function Staff:tick() Entity.tick(self) -- don't do anything if they're fired or picked up or have no hospital if self.fired or self.pickup or not self.hospital or self.dead then return end -- check if we need to use the staff room and go there if so self:checkIfNeedRest() -- check if staff has been waiting too long for a raise and fire if so self:checkIfWaitedTooLong() -- Decide whether the staff member should be tiring and tire them if self:isTiring() then self:tire(0.000090) self:changeAttribute("happiness", -0.00002) end -- Make staff members request a raise if they are very unhappy if not self.world.debug_disable_salary_raise and self.attributes["happiness"] < 0.1 then if not self.timer_until_raise then self.timer_until_raise = 200 end if self.timer_until_raise == 0 then self:requestRaise() else self.timer_until_raise = self.timer_until_raise - 1 end else self.timer_until_raise = nil end -- seeing litter will make you unhappy. If it is pee or puke it is worse self.world:findObjectNear(self, "litter", 2, function(x, y) local litter = self.world:getObject(x, y, "litter") if not litter then return end if litter:anyLitter() then self:changeAttribute("happiness", -0.0002) else self:changeAttribute("happiness", -0.0004) end end) self:updateSpeed() end function Staff:checkIfWaitedTooLong() if self.quitting_in then self.quitting_in = self.quitting_in - 1 if self.quitting_in < 0 then local rise_windows = self.world.ui:getWindows(UIStaffRise) local staff_rise_window = nil -- We go through all "requesting rise" windows open, to see if we need -- to close them when the person is fired. for i = 1, #rise_windows do if rise_windows[i].staff == self then staff_rise_window = rise_windows[i] break end end --If the hospital policy is set to automatically grant wage increases, grant the requested raise --instead of firing the staff member if self.hospital.policies.grant_wage_increase then local amount = math.floor(math.max(self.profile.wage * 1.1, (self.profile:getFairWage(self.world) + self.profile.wage) / 2) - self.profile.wage) self.quitting_in = nil self:setMood("pay_rise", "deactivate") self.world.ui.bottom_panel:removeMessage(self) self:increaseWage(amount) return end -- Plays the sack sound, but maybe it's good that you hear a staff member leaving? if staff_rise_window then staff_rise_window:fireStaff() else self:fire() end end end end function Staff:leaveAnnounce() return end function Staff:isTiring() local tiring = true local room = self:getRoom() -- Being in a staff room is actually quite refreshing, as long as you're not a handyman watering plants. if room then if room.room_info.id == "staff_room" and not self.on_call then tiring = false end elseif self.humanoid_class ~= "Handyman" then tiring = false end -- Picking staff members up doesn't tire them, it just tires the player. if self:getCurrentAction().name == "pickup" then tiring = false end return tiring end function Staff:isResting() local room = self:getRoom() if room and room.room_info.id == "staff_room" and not self.on_call then return true else return false end end -- Immediately terminate the staff member's employment. function Staff:fire() if self.fired then return end -- Ensure that there are no inspection windows open for this staff member. local staff_window = self.world.ui:getWindow(UIStaff) if staff_window and staff_window.staff == self then staff_window:close() end self.hospital:spendMoney(self.profile.wage, _S.transactions.severance .. ": " .. self.profile.name) self.world.ui:playSound("sack.wav") self:setMood("exit", "activate") self:setDynamicInfoText(_S.dynamic_info.staff.actions.fired) self.fired = true self.hospital:changeReputation("kicked") self:despawn() self.hover_cursor = nil self.attributes["fatigue"] = nil self:leaveAnnounce() -- Unregister any build callbacks or messages. self:unregisterCallbacks() -- Update the staff management window if it is open. local window = self.world.ui:getWindow(UIStaffManagement) if window then window:updateStaffList(self) end end function Staff:die() -- Update the staff management screen (if present) accordingly local window = self.world.ui:getWindow(UIStaffManagement) if window then window:updateStaffList(self) end self.dead = true end -- Despawns the staff member and removes them from the hospital function Staff:despawn() self.hospital:removeStaff(self) Humanoid.despawn(self) end -- Function which is called when the user clicks on the staff member. -- Responsible for opening a staff information dialog on left click and picking -- up the staff member on right click. --!param ui (GameUI) The UI which the user in question is using. --!param button (string) One of: "left", "middle", "right". function Staff:onClick(ui, button) if self.fired then return end if button == "left" then if self.message_callback then self:message_callback() else ui:addWindow(UIStaff(ui, self)) end elseif button == "right" then self.pickup = true self:setNextAction(PickupAction(ui), true) end Humanoid.onClick(self, ui, button) end function Staff:dump() print("-----------------------------------") if self.on_call then print("On call: ") CallsDispatcher.dumpCall(self.on_call) else print('On call: no') end print("Busy: ", (self:isIdle() and "idle" or "busy") .. (self.pickup and " and picked up" or '')) if self.going_to_staffroom then print("Going to staffroom") end if self.last_room then print("Last room: ", self.last_room.room_info.id .. '@' .. self.last_room.x ..','.. self.last_room.y) end Humanoid.dump(self) end function Staff:setProfile(profile) self.profile = profile self:setType(profile.humanoid_class) self.attributes["fatigue"] = 0 self:setLayer(5, profile.layer5) self.waiting_for_staffroom = false -- Staff member has detected there is no staff room to rest. end -- Function for increasing fatigue. Fatigue can be between 0 and 1, -- so amounts here should be appropriately small comma values. function Staff:tire(amount) self:changeAttribute("fatigue", amount) self:updateDynamicInfo() end -- Function for decreasing fatigue. Fatigue can be between 0 and 1, -- so amounts here should be appropriately small comma values. function Staff:wake(amount) self:changeAttribute("fatigue", -amount) self:updateDynamicInfo() end -- Update the movement speed function Staff:updateSpeed() local level = 2 if self.profile.is_junior then level = 1 elseif self.profile.is_consultant then level = 3 end local room = self:getRoom() if room and room.room_info.id == "training" then level = 1 elseif self.attributes["fatigue"] then if self.attributes["fatigue"] >= 0.8 then level = level - 2 elseif self.attributes["fatigue"] >= 0.7 then level = level - 1 end end if level >= 3 then self.speed = "fast" self.slow_animation = false elseif level <= 1 then self.speed = "slow" self.slow_animation = true else self.speed = "normal" self.slow_animation = false end end -- Check if fatigue is over a certain level (decided by the hospital policy), -- and go to the StaffRoom if it is. function Staff:checkIfNeedRest() -- Only when the staff member is very tired should the icon emerge. Unhappiness will also escalate if self.attributes["fatigue"] >= 0.7 then self:setMood("tired", "activate") self:changeAttribute("happiness", -0.0002) end -- If above the policy threshold, go to the staff room. if self.attributes["fatigue"] >= self.hospital.policies["goto_staffroom"] and not class.is(self:getRoom(), StaffRoom) then -- The staff will get unhappy if there is no staffroom to rest in. if self.waiting_for_staffroom then self:changeAttribute("happiness", -0.001) end local room = self:getRoom() if (self.staffroom_needed and ((room and not room:getPatient()) or not room)) or (room and self.going_to_staffroom) then if self:getCurrentAction().name ~= "walk" and self:getCurrentAction().name ~= "queue" then self.staffroom_needed = nil self:goToStaffRoom() end end -- Abort if waiting for a staffroom to be built, waiting for the patient to leave, -- already going to staffroom or being picked up if self.waiting_for_staffroom or self.staffroom_needed or self.going_to_staffroom or self.pickup then return end -- If no staff room exists, prevent further checks until one is built if not self.world:findRoomNear(self, "staff_room") then self.waiting_for_staffroom = true -- notifyNewRoom resets it when a staff room gets built. return end if self.humanoid_class ~= "Handyman" and room and room:getPatient() then -- If occupied by patient, staff will go to the staffroom after the patient left. self.staffroom_needed = true else if room then room.staff_leaving = true end self:goToStaffRoom() end end end function Staff:notifyNewRoom(room) if room.room_info.id == "staff_room" then self.waiting_for_staffroom = false end end function Staff:goToStaffRoom() -- NB: going_to_staffroom set if (and only if) a seek_staffroom action is in the action_queue self.going_to_staffroom = true local room = self:getRoom() if room then room.staff_leaving = true self:setNextAction(room:createLeaveAction()) self:queueAction(SeekStaffRoomAction()) else self:setNextAction(SeekStaffRoomAction()) end end function Staff:onPlaceInCorridor() local world = self.world local notify_object = world:getObjectToNotifyOfOccupants(self.tile_x, self.tile_y) if notify_object then notify_object:onOccupantChange(1) end -- Assume that if the player puts someone in the corridor they don't want the -- staff member to primarily return to his/her old room. self.last_room = nil self:updateSpeed() self:setNextAction(MeanderAction()) end -- Sets the Hospital for a member of staff --!param hospital (Hospital) - hospital to assign to member of staff function Staff:setHospital(hospital) Humanoid.setHospital(self, hospital) self:updateDynamicInfo() end -- Helper function to decide if Staff fulfills a criterion -- (one of "Doctor", "Nurse", "Psychiatrist", "Surgeon", "Researcher" and "Handyman") function Staff:fulfillsCriterion(criterion) return false end function Staff:adviseWrongPersonForThisRoom() local room = self:getRoom() local room_name = room.room_info.long_name local required = (room.room_info.maximum_staff or room.room_info.required_staff) if required then if required.Nurse then self.world.ui.adviser:say(_A.staff_place_advice.only_nurses_in_room:format(room_name)) elseif required.Surgeon then self.world.ui.adviser:say(_A.staff_place_advice.only_surgeons) elseif required.Researcher then self.world.ui.adviser:say(_A.staff_place_advice.only_researchers) elseif required.Psychiatrist then self.world.ui.adviser:say(_A.staff_place_advice.only_psychiatrists) else self.world.ui.adviser:say(_A.staff_place_advice.only_doctors_in_room:format(room_name)) end end end -- Function to decide if staff currently has nothing to do and can be called to a room where he's needed function Staff:isIdle() -- Make sure we're not in an undesired state if not self.hospital or self.fired then return false end if self.on_call or self.pickup or self.going_to_staffroom or self.staffroom_needed then return false end if self.waiting_on_other_staff then return false end -- if they are using a door they are not idle, this stops doctors being considered for staff selection -- for rooms they have not completely left yet, fixes issue 810 if self.user_of and self.user_of.object_type.id == "door" then return false end local room = self:getRoom() if room then -- in special rooms, never if room.room_info.id == "staff_room" or room.room_info.id == "research" or room.room_info.id == "training" then return false end -- For handyman - just check the on_call flag if self.humanoid_class == "Handyman" and not self.on_call then return true end -- For other staff... -- in regular rooms (diagnosis / treatment), if no patient is in sight -- or if the only one in sight is actually leaving. if self.humanoid_class ~= "Handyman" and room.door.queue:patientSize() == 0 and not self:getCurrentAction().is_leaving and not (room.door.reserved_for and class.is(room.door.reserved_for, Patient)) then if room:getPatientCount() == 0 then return true else -- It might still be the case that the patient is leaving for _, action in ipairs(room:getPatient().action_queue) do if action.is_leaving then return true end end end end else -- In the corridor and not on_call (watering or going to room), the staff is free -- unless going back to the training room or research department. local x, y = self:getCurrentAction().x, self:getCurrentAction().y if x then room = self.world:getRoom(x, y) if room and (room.room_info.id == "training" or room.room_info.id == "research") then return false end end return true end return false end -- Makes the staff member request a raise of 10%, or a wage exactly inbetween their current and a fair one, whichever is more. function Staff:requestRaise() -- Is this the first time a member of staff is requesting a raise? -- Only show the help if the player is playing the campaign though if self.hospital and not self.hospital.has_seen_pay_rise and tonumber(self.world.map.level_number) then self.world.ui.adviser:say(_A.information.pay_rise) self.hospital.has_seen_pay_rise = true end -- Check whether there is already a request for raise. if not self:isMoodActive("pay_rise") then local amount = math.floor(math.max(self.profile.wage * 1.1, (self.profile:getFairWage() + self.profile.wage) / 2) - self.profile.wage) -- At least for now, staff are timid, and only ask for raises 1/5th of the time if math.random(1, 5) ~= 1 or amount <= 0 then self.timer_until_raise = nil return end self.quitting_in = 25*30 -- Time until the staff members quits anyway self:setMood("pay_rise", "activate") self.world.ui.bottom_panel:queueMessage("strike", amount, self) end end -- Increases the wage of the staff member. Also increases happiness and clears -- any request raise dialogs. --!param amount (integer) The amount, in game dollars per month, to increase -- the salary by. function Staff:increaseWage(amount) self.profile.wage = self.profile.wage + amount self.world.ui:playSound("cashreg.wav") if self.profile.wage > 2000 then -- What cap here? self.profile.wage = 2000 else -- If the cap has been reached this member of staff won't get unhappy -- ever again... self:changeAttribute("happiness", 0.99) self:setMood("pay_rise", "deactivate") end end function Staff:setDynamicInfoText(text) self.dynamic_text = text self:updateDynamicInfo() end function Staff:updateDynamicInfo() local fatigue_text = _S.dynamic_info.staff.tiredness if not self.attributes["fatigue"] then fatigue_text = nil end self:setDynamicInfo('text', { self.profile.profession, self.dynamic_text and self.dynamic_text or "", fatigue_text, }) self:setDynamicInfo('progress', self.attributes["fatigue"]) if self.hospital then self:setDynamicInfo('dividers', {self.hospital.policies["goto_staffroom"]}) end end function Staff:onDestroy() -- Remove any message related to the staff member. if self.message_callback then self:message_callback(true) self.message_callback = nil end Humanoid.onDestroy(self) end function Staff:afterLoad(old, new) -- Usage of going_to_staffroom flag changed slightly, so unset it. -- (should be safe even if someone is actually going to staffroom) if old < 27 and new >= 27 then self.going_to_staffroom = nil end if old < 29 and new >= 29 then -- Handymen could have "staffroom_needed" flag set due to a bug, unset it. if self.humanoid_class == "Handyman" then self.staffroom_needed = nil end end if old < 64 and new >= 64 then -- added reference to world for staff profiles self.profile.world = self.world end if old < 68 and new >= 68 then if self.attributes["fatigue"] then if self.attributes["fatigue"] >= self.hospital.policies["goto_staffroom"] then self:goToStaffRoom() self.going_to_staffroom = true end end end if old < 121 and new >= 121 then if self.humanoid_class == "Handyman" and self.user_of and self.user_of.object_type.class == "Litter" then local litter = self.user_of local hospital = self.world:getHospital(litter.tile_x, litter.tile_y) local taskIndex = hospital:getIndexOfTask(litter.tile_x, litter.tile_y, "cleaning", litter) hospital:removeHandymanTask(taskIndex, "cleaning") end end if old < 133 and new >= 133 then if self.humanoid_class == "Handyman" then setmetatable(self, Handyman._metatable) elseif self.humanoid_class == "Receptionist" then setmetatable(self, Receptionist._metatable) elseif self.humanoid_class == "Nurse" then setmetatable(self, Nurse._metatable) else setmetatable(self, Doctor._metatable) end -- The new class's afterLoad calls staff.afterLoad, so to avoid -- infinite recursion we need to finish afterLoad actions up to -- this version, and then pretend we are starting from this -- version to avoid running them a second time. Humanoid.afterLoad(self, old, 133) self:afterLoad(133, new) return end Humanoid.afterLoad(self, old, new) end function Staff:getDrawingLayer() return 4 end --! Estimate staff service quality based on skills, fatigue and happiness. --!return (float) between [0-1] indicating quality of the service. function Staff:getServiceQuality() -- weights local skill_weight = 0.7 local fatigue_weight = 0.2 local happiness_weight = 0.1 local weighted_skill = skill_weight * self.profile.skill local weighted_fatigue = fatigue_weight * self.attributes["fatigue"] local weighted_happiness = happiness_weight * self.attributes["happiness"] return weighted_skill + weighted_fatigue + weighted_happiness end --[[ Return string representation !return (string) ]] function Staff:tostring() return Humanoid.tostring(self) end -- Dummy callback for savegame compatibility local callbackNewRoom = --[[persistable:staff_build_staff_room_callback]] function(room) end CorsixTH-0.63/CorsixTH/Lua/entities/humanoids/staff/000077500000000000000000000000001347163623700223235ustar00rootroot00000000000000CorsixTH-0.63/CorsixTH/Lua/entities/humanoids/staff/doctor.lua000066400000000000000000000242401347163623700243220ustar00rootroot00000000000000--[[ Copyright (c) 2009 Peter "Corsix" Cawley 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. --]] corsixth.require("announcer") corsixth.require("entities.humanoids.staff") local AnnouncementPriority = _G["AnnouncementPriority"] --! A Doctor (Researcher,Surgan,Psychologist) class "Doctor" (Staff) ---@type Doctor local Doctor = _G["Doctor"] --!param ... Arguments to base class constructor. function Doctor:Doctor(...) self:Staff(...) end function Doctor:tickDay() Staff.tickDay(self) -- if you overwork your Dr's then there is a chance that they can go crazy -- when this happens, find him and get him to rest straight away if self.attributes["fatigue"] then if self.attributes["fatigue"] < 0.7 then if self:isResting() then self:setCrazy(false) end else -- doctor can go crazy if they're too tired if math.random(1, 300) == 1 then self:setCrazy(true) end end end -- is self researcher in research room? if self:isResearching() then self.hospital.research:addResearchPoints(1550 + 1000*self.profile.skill) -- is self using lecture chair in a training room w/ a consultant? elseif self:isLearning() then -- Find values for how fast doctors learn the different professions from the level local level_config = self.world.map.level_config local surg_thres = 1 local psych_thres = 1 local res_thres = 1 if level_config and level_config.gbv.AbilityThreshold then surg_thres = level_config.gbv.AbilityThreshold[0] psych_thres = level_config.gbv.AbilityThreshold[1] res_thres = level_config.gbv.AbilityThreshold[2] end local general_thres = 200 -- general skill factor local room = self:getRoom() -- room_factor starts at 5 for a basic room w/ TrainingRate == 4 -- books add +1.5, skeles add +2.0, see TrainingRoom:calculateTrainingFactor local room_factor = room:getTrainingFactor() -- number of staff includes consultant local staff_count = room:getStaffCount() - 1 -- update general skill self:trainSkill(room.staff_member, "skill", general_thres, room_factor, staff_count) -- update special skill based on consultant skills if room.staff_member.profile.is_surgeon >= 1.0 then self:trainSkill(room.staff_member, "is_surgeon", surg_thres, room_factor, staff_count) end if room.staff_member.profile.is_psychiatrist >= 1.0 then self:trainSkill(room.staff_member, "is_psychiatrist", psych_thres, room_factor, staff_count) end if room.staff_member.profile.is_researcher >= 1.0 then self:trainSkill(room.staff_member, "is_researcher", res_thres, room_factor, staff_count) end end end function Doctor:tick() Staff.tick(self) -- don't do anything if they're fired or picked up or have no hospital if self.fired or self.pickup or not self.hospital or self.dead then return end -- if doctor is in a room and they're using an object -- then their skill level will increase _slowly_ over time if self:isLearningOnTheJob() then self:updateSkill(self.humanoid_class, "skill", 0.000003) end end function Doctor:leaveAnnounce() local announcement_priority = AnnouncementPriority.High local dr_leave_sounds = {"sack001.wav", "sack002.wav", "sack003.wav",} self.world.ui:playAnnouncement(dr_leave_sounds[math.random(1, #dr_leave_sounds)], announcement_priority) end -- Determine if the staff member should contribute to research function Doctor:isResearching() local room = self:getRoom() -- Doctor is in research lab, is qualified, and is not leaving the hospital. return room and room.room_info.id == "research" and self.profile.is_researcher >= 1.0 and self.hospital end -- Determine if the staff member should increase their skills function Doctor:isLearning() local room = self:getRoom() -- Doctor is in training room, the training room has a consultant, and is using lecture chair. return room and room.room_info.id == "training" and room.staff_member and self:getCurrentAction().name == "use_object" and self:getCurrentAction().object.object_type.id == "lecture_chair" end function Doctor:isLearningOnTheJob() local room = self:getRoom() -- Doctor is in room but not training room, staff room, or toilets; is a doctor; and is using something return room and room.room_info.id ~= "training" and room.room_info.id ~= "staff_room" and room.room_info.id ~= "toilets" and self:getCurrentAction().name == "use_object" end function Doctor:setProfile(profile) Staff.setProfile(self, profile) self:updateStaffTitle() end function Doctor:updateSkill(consultant, trait, amount) -- luacheck: no unused args local old_profile = { is_junior = self.profile.is_junior, is_consultant = self.profile.is_consultant } -- don't push further when they are already at 100%+ if self.profile[trait] >= 1.0 then return end self.profile[trait] = self.profile[trait] + amount if self.profile[trait] >= 1.0 then self.profile[trait] = 1.0 local is = trait:match"^is_(.*)" if is == "surgeon" or is == "psychiatrist" or is == "researcher" then self.world.ui.adviser:say(_A.information.promotion_to_specialist:format(_S.staff_title[is])) -- patients might we waiting for a doctor with this skill, notify them self.hospital:notifyOfStaffChange(self) end self:updateStaffTitle() end if trait == "skill" then self.profile:parseSkillLevel() if old_profile.is_junior and not self.profile.is_junior then self.world.ui.adviser:say(_A.information.promotion_to_doctor) self:updateStaffTitle() elseif not old_profile.is_consultant and self.profile.is_consultant then self.world.ui.adviser:say(_A.information.promotion_to_consultant) if self:getRoom().room_info.id == "training" then self:setNextAction(self:getRoom():createLeaveAction()) self:queueAction(MeanderAction()) self.last_room = nil end self:updateStaffTitle() end end end function Doctor:trainSkill(consultant, trait, skill_thres, room_factor, staff_count) -- TODO: tweak/rework this algorithm -- TODO: possibly adjust based upon consultant's skill level? -- possibly based on attention to detail? local constant = 12.0 local staff_factor = constant + (staff_count-1)*(constant/6.0) local delta = room_factor / (skill_thres * staff_factor) self:updateSkill(consultant, trait, delta) end function Doctor:updateStaffTitle() local profile = self.profile local professions = "" local number = 0 if profile.is_junior then professions = _S.staff_title.junior .. " " number = 1 elseif profile.is_consultant then professions = _S.staff_title.consultant .. " " number = 1 end if profile.is_researcher >= 1.0 then professions = professions .. _S.staff_title.researcher .. " " number = number + 1 end if profile.is_surgeon >= 1.0 then professions = professions .. _S.staff_title.surgeon .. " " number = number + 1 end if profile.is_psychiatrist >= 1.0 then if number < 3 then professions = professions .. _S.staff_title.psychiatrist else professions = professions .. _S.dynamic_info.staff.psychiatrist_abbrev end end if professions == "" then professions = _S.staff_title.doctor end self.profile.profession = professions end function Doctor:setCrazy(crazy) if crazy then -- make doctor crazy if not self.is_crazy then self:setLayer(5, self.profile.layer5 + 4) self.world.ui.adviser:say(_A.warnings.doctor_crazy_overwork) self.is_crazy = true end else -- make doctor sane if self.is_crazy then if not (self.layers[5] < 5) then self:setLayer(5, self.layers[5] - 4) self.is_crazy = false end end end end local profile_attributes = { Psychiatrist = "is_psychiatrist", Surgeon = "is_surgeon", Researcher = "is_researcher", } -- Helper function to decide if Staff fulfills a criterion -- (one of "Doctor", "Nurse", "Psychiatrist", "Surgeon", "Researcher" and "Handyman") function Doctor:fulfillsCriterion(criterion) if criterion == "Doctor" then return true elseif criterion == "Psychiatrist" or criterion == "Surgeon" or criterion == "Researcher" then if self.profile and self.profile[profile_attributes[criterion]] == 1.0 then return true end end return false end function Doctor:adviseWrongPersonForThisRoom() local room = self:getRoom() local room_name = room.room_info.long_name if room.room_info.id == "toilets" then self.world.ui.adviser:say(_A.staff_place_advice.doctors_cannot_work_in_room:format(room_name)) elseif room.room_info.id == "training" then self.world.ui.adviser:say(_A.staff_place_advice.doctors_cannot_work_in_room:format(room_name)) else Staff.adviseWrongPersonForThisRoom(self) end end function Doctor:afterLoad(old, new) Staff.afterLoad(self, old, new) end --[[ Return string representation ! Adds Doctor statistics for a "Doctor" object !return (string) ]] function Doctor:tostring() local result = Humanoid.tostring(self) result = result .. string.format("\nSkills: (%.3f) Surgeon (%.3f) Psych (%.3f) Researcher (%.3f)", self.profile.skill or 0, self.profile.is_surgeon or 0, self.profile.is_psychiatrist or 0, self.profile.is_researcher or 0) return result end CorsixTH-0.63/CorsixTH/Lua/entities/humanoids/staff/handyman.lua000066400000000000000000000135271347163623700246350ustar00rootroot00000000000000--[[ Copyright (c) 2009 Peter "Corsix" Cawley 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. --]] corsixth.require("announcer") corsixth.require("entities.humanoids.staff") local AnnouncementPriority = _G["AnnouncementPriority"] --! A Doctor, Nurse, Receptionist, Handyman, or Surgeon class "Handyman" (Staff) ---@type Handyman local Handyman = _G["Handyman"] --!param ... Arguments to base class constructor. function Handyman:Handyman(...) self:Staff(...) end function Handyman:leaveAnnounce() local announcement_priority = AnnouncementPriority.High self.world.ui:playAnnouncement("sack006.wav", announcement_priority) end function Handyman:die() self:unassignTask() Staff.die(self) end function Handyman:dump() print("-----------------------------------") if self.on_call then print("On call: ") CallsDispatcher.dumpCall(self.on_call) else print('On call: no') end print("Busy: ", (self:isIdle() and "idle" or "busy") .. (self.pickup and " and picked up" or '')) if self.going_to_staffroom then print("Going to staffroom") end if self.last_room then print("Last room: ", self.last_room.room_info.id .. '@' .. self.last_room.x ..','.. self.last_room.y) end print("Cleaning: " .. self.attributes["cleaning"], "Watering: " .. self.attributes["watering"], "Repairing: " .. self.attributes["repairing"]) Humanoid.dump(self) end function Handyman:setProfile(profile) Staff.setProfile(self, profile) self.attributes["cleaning"] = 0.333 self.attributes["watering"] = 0.333 self.attributes["repairing"] = 0.333 end function Handyman:goToStaffRoom() Staff.goToStaffRoom(self) self:unassignTask() end function Handyman:onPlaceInCorridor() self:unassignTask() Staff.onPlaceInCorridor(self) end -- Helper function to decide if Handyman fulfills a criterion -- (one of "Doctor", "Nurse", "Psychiatrist", "Surgeon", "Researcher" and "Handyman") function Handyman:fulfillsCriterion(criterion) if criterion == "Handyman" then return true end return false end function Handyman:afterLoad(old, new) Staff.afterLoad(self, old, new) end function Handyman:interruptHandymanTask() self:setDynamicInfoText("") if self.on_call then self.on_call.assigned = nil self.on_call = nil end self.task = nil self:setNextAction(AnswerCallAction()) end function Handyman:searchForHandymanTask() self.task = nil local nr = math.random() local task, task2, task3 local assignedTask = false if nr < self.attributes["cleaning"] then task, task2, task3 = "cleaning", "watering", "repairing" elseif nr < self.attributes["cleaning"] + self.attributes["watering"] then task, task2, task3 = "watering", "cleaning", "repairing" else task, task2, task3 = "repairing", "watering", "cleaning" end local index = self.hospital:searchForHandymanTask(self, task) if index ~= -1 then self:assignHandymanTask(index, task) assignedTask = true else if self.attributes[task] < 1 then local sum = self.attributes[task2] + self.attributes[task3] if math.random(0, math.floor(sum * 100)) > math.floor(self.attributes[task2] * 100) then task2, task3 = task3, task2 end index = self.hospital:searchForHandymanTask(self, task2) if index ~= -1 then self:assignHandymanTask(index, task2) assignedTask = true elseif self.attributes[task3] > 0 then index = self.hospital:searchForHandymanTask(self, task3) if index ~= -1 then self:assignHandymanTask(index, task3) assignedTask = true end end end end if assignedTask == false then -- Make sure that the handyman isn't meandering already. for _, action in ipairs(self.action_queue) do if action.name == "meander" then return false end end if self:getRoom() then self:queueAction(self:getRoom():createLeaveAction()) end self:queueAction(MeanderAction()) end return assignedTask end function Handyman:assignHandymanTask(taskIndex, taskType) self.hospital:assignHandymanToTask(self, taskIndex, taskType) local task = self.hospital:getTaskObject(taskIndex, taskType) self.task = task if taskType == "cleaning" then if self:getRoom() then self:setNextAction(self:getRoom():createLeaveAction()) self:queueAction(WalkAction(task.tile_x, task.tile_y)) else self:setNextAction(WalkAction(task.tile_x, task.tile_y)) end self:queueAction(SweepFloorAction(task.object)) self:queueAction(AnswerCallAction()) else if task.call.dropped then task.call.dropped = nil end task.call.dispatcher:executeCall(task.call, self) end end -- If the staff member had a task outstanding, unassigning them from that task. -- Tasks with no handyman assigned will be eligible for reassignment by the hospital. function Handyman:unassignTask() if self.task then self.task.assignedHandyman = nil self.task = nil end end CorsixTH-0.63/CorsixTH/Lua/entities/humanoids/staff/nurse.lua000066400000000000000000000043171347163623700241670ustar00rootroot00000000000000--[[ Copyright (c) 2009 Peter "Corsix" Cawley 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. --]] corsixth.require("announcer") corsixth.require("entities.humanoids.staff") local AnnouncementPriority = _G["AnnouncementPriority"] --! A Doctor, Nurse, Receptionist, Handyman, or Surgeon class "Nurse" (Staff) ---@type Nurse local Nurse = _G["Nurse"] --!param ... Arguments to base class constructor. function Nurse:Nurse(...) self:Staff(...) end function Nurse:leaveAnnounce() local announcement_priority = AnnouncementPriority.High local nurse_leave_sounds = {"sack004.wav", "sack005.wav",} self.world.ui:playAnnouncement(nurse_leave_sounds[math.random(1, #nurse_leave_sounds)], announcement_priority) end -- Helper function to decide if Staff fulfills a criterion -- (one of "Doctor", "Nurse", "Psychiatrist", "Surgeon", "Researcher" and "Handyman") function Nurse:fulfillsCriterion(criterion) if criterion == "Nurse" then return true end return false end function Nurse:adviseWrongPersonForThisRoom() local room = self:getRoom() local room_name = room.room_info.long_name self.world.ui.adviser:say(_A.staff_place_advice.nurses_cannot_work_in_room:format(room_name)) end function Nurse:afterLoad(old, new) Staff.afterLoad(self, old, new) end CorsixTH-0.63/CorsixTH/Lua/entities/humanoids/staff/receptionist.lua000066400000000000000000000062231347163623700255410ustar00rootroot00000000000000--[[ Copyright (c) 2009 Peter "Corsix" Cawley 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. --]] corsixth.require("announcer") corsixth.require("entities.humanoids.staff") local AnnouncementPriority = _G["AnnouncementPriority"] --! A Doctor, Nurse, Receptionist, Handyman, or Surgeon class "Receptionist" (Staff) ---@type Receptionist local Receptionist = _G["Receptionist"] --!param ... Arguments to base class constructor. function Receptionist:Receptionist(...) self:Staff(...) end function Receptionist:tickDay() Staff.tickDay(self) self:needsWorkStation() end function Receptionist:leaveAnnounce() local announcement_priority = AnnouncementPriority.High local receptionist_leave_sounds = {"sack007.wav", "sack008.wav",} self.world.ui:playAnnouncement(receptionist_leave_sounds[math.random(1, #receptionist_leave_sounds)], announcement_priority) end function Receptionist:isTiring() return false end function Receptionist:isResting() return false end function Receptionist:setProfile(profile) Staff.setProfile(self, profile) self.attributes["fatigue"] = nil end function Receptionist:needsWorkStation() if self.hospital and not self.hospital.receptionist_msg then if self.world.object_counts["reception_desk"] == 0 then self.world.ui.adviser:say(_A.warnings.no_desk_4) self.hospital.receptionist_msg = true end end end -- Receptionists do not need rest function Receptionist:checkIfNeedRest() return end function Receptionist:onPlaceInCorridor() Staff.onPlaceInCorridor(self) local world = self.world world:findObjectNear(self, "reception_desk", nil, function(x, y) local obj = world:getObject(x, y, "reception_desk") return obj and obj:occupy(self) end) end -- Helper function to decide if Staff fulfills a criterion -- (one of "Doctor", "Nurse", "Psychiatrist", "Surgeon", "Researcher" and "Handyman") function Receptionist:fulfillsCriterion(criterion) -- luacheck: no unused args return false end function Receptionist:getDrawingLayer() local direction = self.last_move_direction if direction == "west" or direction == "north" then return 5 end return 3 end function Receptionist:afterLoad(old, new) Staff.afterLoad(self, old, new) end CorsixTH-0.63/CorsixTH/Lua/entities/humanoids/vip.lua000066400000000000000000000376241347163623700225350ustar00rootroot00000000000000--[[ Copyright (c) 2011 John Pirie 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. --]] corsixth.require("announcer") local AnnouncementPriority = _G["AnnouncementPriority"] --! A `Vip` who is in the hospital to evaluate the hospital and produce a report class "Vip" (Humanoid) ---@type Vip local Vip = _G["Vip"] function Vip:Vip(...) self:Humanoid(...) self.hover_cursor = TheApp.gfx:loadMainCursor("default") self.action_string = "" self.name="" self.announced = false self.vip_rating = 50 self.cash_reward = 0 self.enter_deaths = 0 self.enter_visitors = 0 self.enter_explosions = 0 self.enter_cures = 0 self.num_vomit_noninducing = 0 self.num_vomit_inducing = 0 self.found_vomit = {} self.num_visited_rooms = 0 self.room_eval = 0 self.waiting = 0 end -- Check if it is cold or hot around the vip and increase/decrease the -- feeling of warmth accordingly. Returns whether the calling function should proceed. function Vip:tickDay() -- for the vip if self.waiting then self.waiting = self.waiting - 1 if self.waiting == 0 then if #self.world.rooms == 0 then -- No rooms have been built yet self:goHome() end -- First let the previous room go. -- Include this when the VIP is supposed to block doors again. --[[if self.next_room then self.next_room.door.reserved_for = nil self.next_room:tryAdvanceQueue() end--]] -- Find out which next room to visit. self.next_room_no, self.next_room = next(self.world.rooms, self.next_room_no) -- Make sure that this room is active while self.next_room and not self.next_room.is_active do self.next_room_no, self.next_room = next(self.world.rooms, self.next_room_no) end self:setNextAction(VipGoToNextRoomAction()) end end self.world:findObjectNear(self, "litter", 8, function(x, y) local litter = self.world:getObject(x, y, "litter") if not litter then return end local alreadyFound = false for i=1, (self.num_vomit_noninducing + self.num_vomit_inducing) do if self.found_vomit[i] == litter then alreadyFound = true break end end self.found_vomit[(self.num_vomit_noninducing + self.num_vomit_inducing + 1)] = litter if not alreadyFound then if litter:anyLitter() then self.num_vomit_noninducing = self.num_vomit_noninducing + 1 else self.num_vomit_inducing = self.num_vomit_inducing + 1 end end end) return Humanoid.tickDay(self) end -- display the VIP name in the info box function Vip:updateDynamicInfo(action_string) self:setDynamicInfo('text', {self.name}) end function Vip:goHome() if self.going_home then return end self:unregisterCallbacks() -- Set the rating. self:setVIPRating() self.going_home = true -- save self.hospital so we can reference it in self:onDestroy self.last_hospital = self.hospital self:despawn() end -- called when the vip is out of the hospital grounds function Vip:onDestroy() local message -- First of all there's a special message if we're in free build mode. if self.world.free_build_mode then self.last_hospital.reputation = self.last_hospital.reputation + 20 message = { {text = _S.fax.vip_visit_result.vip_remarked_name:format(self.name)}, {text = _S.fax.vip_visit_result.remarks.free_build[math.random(1, 3)]}, choices = {{text = _S.fax.vip_visit_result.close_text, choice = "close"}} } elseif self.vip_rating == 1 then self.last_hospital.reputation = self.last_hospital.reputation - 10 message = { {text = _S.fax.vip_visit_result.vip_remarked_name:format(self.name)}, {text = _S.fax.vip_visit_result.remarks.very_bad[math.random(1, 3)]}, {text = _S.fax.vip_visit_result.rep_loss}, choices = {{text = _S.fax.vip_visit_result.close_text, choice = "close"}} } elseif self.vip_rating == 2 then self.last_hospital.reputation = self.last_hospital.reputation - 5 message = { {text = _S.fax.vip_visit_result.vip_remarked_name:format(self.name)}, {text = _S.fax.vip_visit_result.remarks.bad[math.random(1, 3)]}, {text = _S.fax.vip_visit_result.rep_loss}, choices = {{text = _S.fax.vip_visit_result.close_text, choice = "close"}} } elseif self.vip_rating == 3 then message = { {text = _S.fax.vip_visit_result.vip_remarked_name:format(self.name)}, {text = _S.fax.vip_visit_result.remarks.mediocre[math.random(1, 3)]}, choices = {{text = _S.fax.vip_visit_result.close_text, choice = "close"}} } elseif self.vip_rating == 4 then self.last_hospital:receiveMoney(self.cash_reward, _S.transactions.vip_award) self.last_hospital.reputation = self.last_hospital.reputation + (math.round(self.cash_reward / 100)) message = { {text = _S.fax.vip_visit_result.vip_remarked_name:format(self.name)}, {text = _S.fax.vip_visit_result.remarks.good[math.random(1, 3)]}, {text = _S.fax.vip_visit_result.rep_boost}, {text = _S.fax.vip_visit_result.cash_grant:format(self.cash_reward)}, choices = {{text = _S.fax.vip_visit_result.close_text, choice = "close"}} } else self.last_hospital:receiveMoney(self.cash_reward, _S.transactions.vip_award) self.last_hospital.reputation = self.last_hospital.reputation + (math.round(self.cash_reward / 100)) self.last_hospital.pleased_vips_ty = self.last_hospital.pleased_vips_ty + 1 if self.vip_rating == 5 then message = { {text = _S.fax.vip_visit_result.vip_remarked_name:format(self.name)}, {text = _S.fax.vip_visit_result.remarks.super[math.random(1, 3)]}, {text = _S.fax.vip_visit_result.rep_boost}, {text = _S.fax.vip_visit_result.cash_grant:format(self.cash_reward)}, choices = {{text = _S.fax.vip_visit_result.close_text, choice = "close"}} } end end self.world.ui.bottom_panel:queueMessage("report", message, nil, 24 * 20, 1) self.world:nextVip() return Humanoid.onDestroy(self) end function Vip:announce() local announcements = { "vip001.wav", "vip002.wav", "vip003.wav", "vip004.wav", "vip005.wav", } -- there is also vip008 which announces a man from the ministry self.world.ui:playAnnouncement(announcements[math.random(1, #announcements)], AnnouncementPriority.High) if self.hospital.num_vips < 1 then self.world.ui.adviser:say(_A.information.initial_general_advice.first_VIP) else self.world.ui.adviser:say(_A.information.vip_arrived:format(self.name)) end end function Vip:evaluateRoom() -- Another room visited. self.num_visited_rooms = self.num_visited_rooms + 1 local room = self.next_room -- if the player is about to kill a live patient for research, lower their rating dramatically if room.room_info.id == "research" then if room:getPatient() then self.vip_rating = self.vip_rating - 80 end end if room.staff_member then if room.staff_member.profile.skill > 0.9 then self.room_eval = self.room_eval + 3 end if room.staff_member.attributes["fatigue"] then if room.staff_member.attributes["fatigue"] < 0.4 then self.room_eval = self.room_eval + 2 end end end -- evaluate the room we're currently looking at for object, _ in pairs(room.objects) do if object.object_type.id == "extinguisher" then self.room_eval = self.room_eval + 1 break elseif object.object_type.id == "plant" then if object.days_left >= 10 then self.room_eval = self.room_eval + 1 elseif object.days_left <= 3 then self.room_eval = self.room_eval - 1 end break end if object.strength then if object.strength > (object.object_type.default_strength / 2) then self.room_eval = self.room_eval + 1 else self.room_eval = self.room_eval - 3 end end end end function Vip:evaluateEmergency(success) -- Make sure that the VIP is still actually in the process of evaluation if not self.going_home then if success then self.vip_rating = self.vip_rating + 10 else self.vip_rating = self.vip_rating - 15 end end end function Vip:setVIPRating() --check the visitor to patient death ratio local death_diff = self.hospital.num_deaths - self.enter_deaths local visitors_diff = self.hospital.num_visitors - self.enter_visitors if death_diff == 0 then if visitors_diff ~= 0 then --if there have been no new patients, no +/- points self.vip_rating = self.vip_rating + 20 end else local death_ratio = visitors_diff / death_diff local death_ratio_rangemap = { {upper = 2, value = -20}, {upper = 4, value = -10}, {upper = 8, value = 0}, {upper = 12, value = 5}, {value = 10} } self.vip_rating = self.vip_rating + rangeMapLookup(death_ratio, death_ratio_rangemap) end --check the visitor to patient cure ratio local cure_diff = self.hospital.num_cured - self.enter_cures if cure_diff == 0 then if visitors_diff ~= 0 then --if there have been no new patients, no +/- points self.vip_rating = self.vip_rating - 10 end else local cure_ratio = visitors_diff / cure_diff local cure_ratio_rangemap = { {upper = 3, value = 20}, {upper = 6, value = 10}, {upper = 10, value = 0}, {upper = 12, value = -5}, {value = -10} } self.vip_rating = self.vip_rating + rangeMapLookup(cure_ratio, cure_ratio_rangemap) end -- check for the average queue length local sum_queue = 0 local room_count = 0 for _, room in pairs(self.world.rooms) do if room.door.queue then sum_queue = sum_queue + room.door.queue:size() end if not room.crashed then room_count = room_count + 1 end end if room_count == 0 then self.vip_rating = self.vip_rating - 100 elseif sum_queue == 0 then self.vip_rating = self.vip_rating + 6 else local queue_ratio = sum_queue / room_count local queue_ratio_rangemap = { {upper = 2, value = 6}, {upper = 5, value = 3}, {upper = 9, value = 0}, {upper = 11, value = -3}, {value = -6} } self.vip_rating = self.vip_rating + rangeMapLookup(queue_ratio, queue_ratio_rangemap) end -- now we check for toilet presence local sum_toilets = 0 for _, room in pairs(self.world.rooms) do if room.room_info.id == "toilets" then for object, _ in pairs(room.objects) do if object.object_type.id == "loo" then sum_toilets = sum_toilets + 1 end end end end if sum_toilets == 0 then self.vip_rating = self.vip_rating - 6 else local patients_per_toilet = #self.hospital.patients / sum_toilets local toilet_ratio_rangemap = { {upper = 10, value = 6}, {upper = 20, value = 3}, {upper = 40, value = 0}, {value = -3} } self.vip_rating = self.vip_rating + rangeMapLookup(patients_per_toilet, toilet_ratio_rangemap) end -- check the levels of non-vomit inducing litter in the hospital local litter_ratio_rangemap = { {upper = 3, value = 4}, {upper = 5, value = 2}, {upper = 7, value = 0}, {upper = 8, value = -2}, {value = -4} } self.vip_rating = self.vip_rating + rangeMapLookup(self.num_vomit_noninducing, litter_ratio_rangemap) -- check the levels of vomit inducing litter in the hospital local inducing_ratio_rangemap = { {upper = 3, value = 8}, {upper = 5, value = 4}, {upper = 6, value = 0}, {upper = 7, value = -6}, {upper = 10, value = -12}, {upper = 12, value = -16}, {value = -20} } self.vip_rating = self.vip_rating + rangeMapLookup(self.num_vomit_inducing, inducing_ratio_rangemap) -- if there were explosions, hit the user hard if self.hospital.num_explosions ~= self.enter_explosions then self.vip_rating = self.vip_rating - 70 end -- check the vip heat level local heat_ratio_rangemap = { {upper = 0.20, value = -5}, {upper = 0.40, value = -3}, {upper = 0.60, value = 0}, {upper = 0.80, value = 3}, {value = 5} } self.vip_rating = self.vip_rating + rangeMapLookup(self.attributes["warmth"], heat_ratio_rangemap) -- check the seating : standing ratio of waiting patients -- find all the patients who are currently waiting around local sum_sitting, sum_standing = self.hospital:countSittingStanding() if sum_sitting >= sum_standing then self.vip_rating = self.vip_rating + 4 else self.vip_rating = self.vip_rating - 4 end -- check average patient thirst local avg_thirst = self.hospital:getAveragePatientAttribute("thirst", nil) if avg_thirst then local thirst_ratio_rangemap = { {upper = 0.20, value = -5}, {upper = 0.40, value = -1}, {upper = 0.60, value = 0}, {upper = 0.80, value = 1}, {value = 3} } self.vip_rating = self.vip_rating + rangeMapLookup(avg_thirst, thirst_ratio_rangemap) end if self.num_visited_rooms ~= 0 then self.vip_rating = self.vip_rating + self.room_eval / self.num_visited_rooms end -- check average patient happiness local avg_happiness = self.hospital:getAveragePatientAttribute("happiness", nil) if avg_happiness then local patients_happy_ratio_rangemap = { {upper = 0.20, value = -10}, {upper = 0.40, value = -5}, {upper = 0.60, value = 0}, {upper = 0.80, value = 5}, {value = 10} } self.vip_rating = self.vip_rating + rangeMapLookup(avg_happiness, patients_happy_ratio_rangemap) end -- check average staff happiness avg_happiness = self.hospital:getAverageStaffAttribute("happiness", nil) if avg_happiness then local staff_happy_ratio_rangemap = { {upper = 0.20, value = -10}, {upper = 0.40, value = -5}, {upper = 0.60, value = 0}, {upper = 0.80, value = 5}, {value = 10} } self.vip_rating = self.vip_rating + rangeMapLookup(avg_happiness, staff_happy_ratio_rangemap) end -- set the cash reward value if tonumber(self.world.map.level_number) then self.cash_reward = math.round(self.world.map.level_number * self.vip_rating) * 10 else -- custom level, it has no level number. Default back to one. self.cash_reward = math.round(1 * self.vip_rating) * 10 end if self.cash_reward > 2000 then self.cash_reward = 2000 end -- give the rating between 1 and 5 local rating_ratio_rangemap = { {upper = 25, value = 1}, {upper = 45, value = 2}, {upper = 65, value = 3}, {upper = 85, value = 4}, {value = 5} } self.vip_rating = rangeMapLookup(self.vip_rating, rating_ratio_rangemap) self.hospital.num_vips_ty = self.hospital.num_vips_ty + 1 end function Vip:afterLoad(old, new) if old < 50 then self.num_visited_rooms = 0 self:setNextAction(IdleAction()) self.waiting = 1 for _, room in pairs(self.world.rooms) do if room.door.reserved_for == self then room.door.reserved_for = nil room:tryAdvanceQueue() end end end if old < 79 then self.name = self.hospital.visitingVIP end Humanoid.afterLoad(self, old, new) end CorsixTH-0.63/CorsixTH/Lua/entities/machine.lua000066400000000000000000000357721347163623700213560ustar00rootroot00000000000000--[[ Copyright (c) 2009 Edvin "Lego3" Linge 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. --]] local TH = require("TH") --! An `Object` which needs occasional repair (to prevent explosion). class "Machine" (Object) ---@type Machine local Machine = _G["Machine"] function Machine:Machine(world, object_type, x, y, direction, etc) self.total_usage = -1 -- Incremented in the constructor of Object. self:Object(world, object_type, x, y, direction, etc) if object_type.default_strength then -- Only for the main object. The slave doesn't need any strength local progress = world.ui.hospital.research.research_progress[object_type] self.strength = progress.start_strength end -- We actually don't want any dynamic info just yet self:clearDynamicInfo() -- Change hover cursor once the room has been finished. self.waiting_for_finalize = true -- Waiting until the room is completed (reset by new-room callback). self:setHandymanRepairPosition(direction) end function Machine:notifyNewRoom(room) if self.waiting_for_finalize and room.objects[self] then self:finalize(room) self.waiting_for_finalize = false end end function Machine:setCrashedAnimation() self:setAnimation(self.object_type.crashed_animation) end --! Calculates the number of times the machine can be used before crashing (unless repaired first) function Machine:getRemainingUses() return self.strength - self.times_used end --! Set whether the smoke animation should be showing local function setSmoke(self, isSmoking) -- If turning smoke on for this machine if isSmoking then -- If there is no smoke animation for this machine, make one if not self.smokeInfo then self.smokeInfo = TH.animation() -- Note: Set the location of the smoke to that of the machine -- rather than setting the machine to the parent so that the smoke -- doesn't get hidden with the machine during use self.smokeInfo:setTile(self.th:getTile()) -- Always show the first smoke layer self.smokeInfo:setLayer(10, 2) -- tick to animate over all frames self.ticks = true end -- TODO: select the smoke icon based on the type of machine self.smokeInfo:setAnimation(self.world.anims, 3424) else -- Otherwise, turning smoke off -- If there is currently a smoke animation, remove it if self.smokeInfo then self.smokeInfo:setTile(nil) end self.smokeInfo = nil end end --! Call on machine use. Handles crashing the machine & queueing repairs function Machine:machineUsed(room) -- Do nothing if the room has already crashed if room.crashed then return end -- Update dynamic info (strength & times used) self:updateDynamicInfo() -- How many uses this machine has left until it explodes local threshold = self:getRemainingUses() -- Find a queued task for a handyman coming to repair this machine local taskIndex = self.hospital:getIndexOfTask(self.tile_x, self.tile_y, "repairing") -- Too late it is about to explode if threshold < 1 then -- Clean up any task of handyman coming to repair the machine self.hospital:removeHandymanTask(taskIndex, "repairing") -- Blow up the room room:crashRoom() self:setCrashedAnimation() -- No special cursor required when hovering over the crashed room self.hover_cursor = nil -- Clear dynamic info (tracks machine usage which is no longer required) self:clearDynamicInfo() -- Prevent the machine from smoking, it's now just a pile of rubble setSmoke(self, false) -- If we have the window for this machine open, close it local window = self.world.ui:getWindow(UIMachine) if window and window.machine == self then window:close() end -- Clear the icon showing a handyman is coming to repair the machine self:setRepairing(nil) return true -- Else if urgent repair needed elseif threshold < 4 then -- If the job of repairing the machine isn't queued, queue it now (higher priority) if taskIndex == -1 then local call = self.world.dispatcher:callForRepair(self, true, false, true) self.hospital:addHandymanTask(self, "repairing", 2, self.tile_x, self.tile_y, call) else -- Otherwise the task is already queued. Increase the priority to above that of machines with at least 4 uses left self.hospital:modifyHandymanTaskPriority(taskIndex, 2, "repairing") end -- Else if repair is needed, but not urgently elseif threshold < 6 then -- If the job of repairing the machine isn't queued, queue it now (low priority) if taskIndex == -1 then local call = self.world.dispatcher:callForRepair(self) self.hospital:addHandymanTask(self, "repairing", 1, self.tile_x, self.tile_y, call) end end -- Update whether smoke gets displayed for this machine (and if so, how much) self:calculateSmoke(room) end --! Calculates whether smoke gets displayed for this machine (and if so, how much) function Machine:calculateSmoke(room) -- Do nothing if the room has already crashed if room.crashed then return end -- How many uses this machine has left until it explodes local threshold = self:getRemainingUses() -- If now exploding, clear any smoke if threshold < 1 then setSmoke(self, false) -- Else if urgent repair needed elseif threshold < 4 then -- Display smoke, up to three animations per machine -- i.e. < 4 one plume, < 3 two plumes or < 2 three plumes of smoke setSmoke(self, true) -- turn on additional layers of the animation for extra smoke plumes, depending on how damaged the machine is if threshold < 3 then self.smokeInfo:setLayer(11, 2) end if threshold < 2 then self.smokeInfo:setLayer(12, 2) end end end function Machine:getRepairTile() local x = self.tile_x + self.handyman_position[1] local y = self.tile_y + self.handyman_position[2] return x, y end function Machine:createHandymanActions(handyman) local ux, uy = self:getRepairTile() local this_room = self:getRoom() local handyman_room = handyman:getRoom() assert(this_room, "machine should always in a room") self.repairing = handyman self:setRepairingMode() local --[[persistable:handyman_repair_after_use]] function repair_after_use() handyman:setCallCompleted() handyman:setDynamicInfoText("") self:machineRepaired(self:getRoom()) end local action = WalkAction(ux, uy):setIsEntering(this_room and true or false) local repair_action = UseObjectAction(self):setProlongedUsage(false) :setAfterUse(repair_after_use) repair_action.min_length = 20 if handyman_room and handyman_room ~= this_room then handyman:setNextAction(handyman_room:createLeaveAction()) handyman:queueAction(action) else handyman:setNextAction(action) end local meander_loop_callback = --[[persistable:handyman_meander_repair_loop_callback]] function() if not self.user then -- The machine is ready to be repaired. -- The following statement will finish the meander action in the handyman's -- action queue. handyman:finishAction() end -- Otherwise do nothing and let the meandering continue. end -- Before the actual repair action, insert a meander action to wait for the machine -- to become free for use. handyman:queueAction(MeanderAction():setLoopCallback(meander_loop_callback)) -- The last one is another walk action to the repair tile. If the handyman goes directly -- to repair it will simply complete in an instant. handyman:queueAction(action) handyman:queueAction(repair_action) CallsDispatcher.queueCallCheckpointAction(handyman) handyman:queueAction(AnswerCallAction()) handyman:setDynamicInfoText(_S.dynamic_info.staff.actions.going_to_repair :format(self.object_type.name)) end --! Replace this machine (make it pretend it's brand new) function Machine:machineReplaced() -- Reset usage stats self.total_usage = 0 self.times_used = 0 -- Update strength to match the current level of research for it self.strength = self.hospital.research.research_progress[self.object_type].start_strength -- Remove any queued repair jobs local index = self.hospital:getIndexOfTask(self.tile_x, self.tile_y, "repairing") if index ~= -1 then self.hospital:removeHandymanTask(index, "repairing") end -- Clear icon showing handyman is coming to repair the machine self:setRepairing(nil) -- Clear smoke setSmoke(self, false) end function Machine:machineRepaired(room) room.needs_repair = nil local str = self.strength if self.times_used/str > 0.55 then self.strength = str - 1 end self.times_used = 0 self:setRepairing(nil) setSmoke(self, false) local taskIndex = self.hospital:getIndexOfTask(self.tile_x, self.tile_y, "repairing") self.hospital:removeHandymanTask(taskIndex, "repairing") end --! Tells the machine to start showing the icon that it needs repair. --! also lock the room from patient entering --!param handyman The handyman heading to this machine. nil if repairing is finished function Machine:setRepairing(handyman) -- If mode is set to true manually through the dialog, boost the urgency despite of the strength local anim = {icon = 4564} -- The only icon for machinery local room = self:getRoom() self:setMoodInfo(handyman and anim or nil) room.needs_repair = handyman if handyman then self.ticks = true else self.ticks = self.object_type.ticks self.world.dispatcher:dropFromQueue(self) if not room.crashed then self:updateDynamicInfo(true) self:getRoom():tryAdvanceQueue() end end end function Machine:setRepairingMode(lock_room) if lock_room ~= nil then self.repairing_lock_room = lock_room end if self.repairing and self.repairing_lock_room then self:setRepairing(self.repairing) end end function Machine.slaveMixinClass(class_method_table) local slave_to_master, master_to_slave = Object.slaveMixinClass(class_method_table) master_to_slave("finalize") master_to_slave("setCrashedAnimation") slave_to_master("createRepairAction") slave_to_master("getRepairTile") return slave_to_master, master_to_slave end -- Currently used to make the hover cursor of the machine be special -- only if the room is active at the moment (e.g. not being edited) function Machine:finalize(room) if room.is_active then self.hover_cursor = TheApp.gfx:loadMainCursor("repair") self:updateDynamicInfo(true) else self:clearDynamicInfo() self.hover_cursor = nil end end function Machine:updateDynamicInfo(only_update) if not only_update then self.times_used = self.times_used + 1 self.total_usage = self.total_usage + 1 end if self.strength then self:setDynamicInfo("text", { self.object_type.name, _S.dynamic_info.object.strength:format(self.strength), _S.dynamic_info.object.times_used:format(self.times_used), }) end end function Machine:onClick(ui, button) local room = self:getRoom() if button == "left" and room.is_active then -- If the room is crashed is_active is false. ui:addWindow(UIMachine(ui, self, room)) else Object.onClick(self, ui, button) end end function Machine:onDestroy() local room = self:getRoom() if room then room.needs_repair = nil end local index = self.hospital:getIndexOfTask(self.tile_x, self.tile_y, "repairing") if index ~= -1 then self.hospital:removeHandymanTask(index, "repairing") end -- Stop this machine from smoking setSmoke(self, false) Object.onDestroy(self) end function Machine:afterLoad(old, new) if old < 15 then if self.object_type.id == "cardio" then -- Fix THOB value being wrong self.world.map.th:setCellFlags(self.tile_x, self.tile_y, { thob = self.object_type.thob }) end end if old < 54 then local room = self:getRoom() if room.crashed then local taskIndex = room.hospital:getIndexOfTask(self.tile_x, self.tile_y, "repairing") room.hospital:removeHandymanTask(taskIndex, "repairing") end end return Object.afterLoad(self, old, new) end function Machine:tick() -- Tick any smoke animation if self.smokeInfo then self.smokeInfo:tick() end return Object.tick(self) end --[[ Gets the state of a machine ! In addition to the object implementation this includes total_usage !return (table) state ]] function Machine:getState() local state = Object.getState(self) state.total_usage = self.total_usage return state end --[[ Sets the state of a machine ! Adds total_usage !param state (table) table holding the state !return (void) ]] function Machine:setState(state) Object.setState(self, state) if state then self.total_usage = state.total_usage end end --[[ Sets the handyman use position of a machine ! Calculate handyman use position based on object orientation ! or the normal use position if one not available !param direction (string) orientation of object !return (void) ]] function Machine:setHandymanRepairPosition(direction) local orientation = self.object_type.orientations[direction] local handyman_position = orientation.handyman_position if handyman_position then -- If there are many possible handyman tiles, choose one that is accessible from the use_position. if type(handyman_position[1]) == "table" then for _, position in ipairs(handyman_position) do local hx, hy = self.tile_x + position[1], self.tile_y + position[2] local ux, uy = self.tile_x + orientation.use_position[1], self.tile_y + orientation.use_position[2] if self.world.pathfinder:findDistance(hx, hy, ux, uy) then -- Also make sure the tile is not in another room or in the corridor. local room = self.world:getRoom(hx, hy) if room and room == self:getRoom() then self.handyman_position = {position[1], position[2]} break end end end else self.handyman_position = {handyman_position[1], handyman_position[2]} end else self.handyman_position = {orientation.use_position[1], orientation.use_position[2]} end end -- Dummy callbacks for savegame compatibility local callbackNewRoom = --[[persistable:machine_build_callback]] function(room) end local repair_loop_callback = --[[persistable:handyman_repair_loop_callback]] function() end CorsixTH-0.63/CorsixTH/Lua/entities/object.lua000066400000000000000000000726751347163623700212230ustar00rootroot00000000000000--[[ Copyright (c) 2009 Peter "Corsix" Cawley 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. --]] local TH = require("TH") --! An `Entity` which occupies at least a single map tile and does not move. class "Object" (Entity) ---@type Object local Object = _G["Object"] local orient_mirror = { north = "west", west = "north", east = "south", south = "east", } function Object:getDrawingLayer() return 4 end function Object:Object(world, object_type, x, y, direction, etc) local th = TH.animation() self:Entity(th) if etc == "map object" then if direction % 2 == 0 then direction = "north" else direction = "west" end end self.ticks = object_type.ticks self.object_type = object_type self.world = world self.hospital = world:getLocalPlayerHospital() self.user = false self.times_used = -1 -- Incremented in the call on the next line self:updateDynamicInfo() self:initOrientation(direction) self:setTile(x, y) end --! Initializes the footprint, finds out what to draw and checks for -- split animations. --!param direction The orientation in which the object is facing. function Object:initOrientation(direction) self.direction = direction local object_type = self.object_type local flags = self.init_anim_flags or 0 local anim = object_type.idle_animations[direction] if not anim then anim = object_type.idle_animations[orient_mirror[direction]] flags = 1 end local footprint = object_type.orientations footprint = footprint and footprint[direction] if footprint and footprint.early_list then flags = flags + 1024 end if footprint and footprint.list_bottom then flags = flags + 2048 end local rap = footprint and footprint.render_attach_position if rap and rap[1] and type(rap[1]) == "table" then self.split_anims = {self.th} self.split_anim_positions = rap self.th:setCrop(rap[1].column) for i = 2, #rap do local point = rap[i] local th = TH.animation() th:setCrop(point.column) th:setHitTestResult(self) th:setPosition(Map:WorldToScreen(1-point[1], 1-point[2])) self.split_anims[i] = th end else -- Make sure these variables aren't left behind. The object -- might just have been moved and rotated. self.split_anims = nil self.split_anim_positions = nil end if footprint and footprint.animation_offset then self:setPosition(unpack(footprint.animation_offset)) end footprint = footprint and footprint.footprint if footprint then self.footprint = footprint else self.footprint = nil end self:setAnimation(anim, flags) end --! Add methods to a class for creating and controlling a slave object function Object.slaveMixinClass(class_method_table) local name = class.name(class_method_table) local super = class.superclass(class_method_table) local super_constructor = super[class.name(super)] -- Constructor class_method_table[name] = function(self, world, object_type, x, y, direction, ...) super_constructor(self, world, object_type, x, y, direction, ...) if object_type.slave_id then local orientation = object_type.orientations orientation = orientation and orientation[direction] if orientation.slave_position then x = x + orientation.slave_position[1] y = y + orientation.slave_position[2] end self.slave = world:newObject(object_type.slave_id, x, y, direction, ...) self.slave.master = self end end -- Slave -> Master redirects local function slave_to_master(method) local super_method = super[method] class_method_table[method] = function(self, ...) local master = self.master if master then return master[method](master, ...) else return super_method(self, ...) end end end slave_to_master("onClick") slave_to_master("updateDynamicInfo") slave_to_master("getDynamicInfo") -- Master -> Slave notifications local function master_to_slave(method) local super_method = super[method] class_method_table[method] = function(self, ...) local slave = self.slave if slave then slave[method](slave, ...) end return super_method(self, ...) end end master_to_slave("initOrientation") class_method_table.onDestroy = function(self, ...) local slave = self.slave if slave then self.world:destroyEntity(slave) end return super.onDestroy(self, ...) end class_method_table.setTile = function(self, x, y) if self.slave then local dx, dy = 0, 0 local orientation = self.object_type.orientations orientation = orientation and orientation[self.direction] if orientation.slave_position then dx = orientation.slave_position[1] dy = orientation.slave_position[2] end if x then self.slave:setTile(x + dx, y + dy) else self.slave:setTile(x, y) end end return super.setTile(self, x, y) end return slave_to_master, master_to_slave end function Object:tick() if self.split_anims then if self.num_animation_ticks then for i = 2, #self.split_anims do local th = self.split_anims[i] for _ = 1, self.num_animation_ticks do th:tick() end end else for i = 2, #self.split_anims do self.split_anims[i]:tick() end end end return Entity.tick(self) end function Object:setPosition(x, y) if self.split_anims then -- The given position is for the primary tile, so position non-primary -- animations relative to the primary one. local bx, by = unpack(self.split_anim_positions[1]) for i, th in ipairs(self.split_anims) do local point = self.split_anim_positions[i] local dx, dy = Map:WorldToScreen(1-point[1]+bx, 1-point[2]+by) th:setPosition(x + dx, y + dy) end else self.th:setPosition(x, y) end return self end function Object:setAnimation(animation, flags) if self.split_anims then flags = (flags or 0) + DrawFlags.Crop if self.permanent_flags then flags = flags + self.permanent_flags end if animation ~= self.animation_idx or flags ~= self.animation_flags then self.animation_idx = animation self.animation_flags = flags local anims = self.world.anims for _, th in ipairs(self.split_anims) do th:setAnimation(anims, animation, flags) end end return self else return Entity.setAnimation(self, animation, flags) end end --! Get the primary tile which the object is attached to for rendering --[[! For objects which attach to a single tile for rendering, this method will return the X and Y Lua world co-ordinates of that tile. For objects which split their rendering over multiple tiles, one of them is arbitrarily designated as the primary tile, and its co-ordinates are returned. ]] function Object:getRenderAttachTile() local x, y = self.tile_x, self.tile_y local offset = self.object_type.orientations if x and offset then offset = offset[self.direction].render_attach_position if self.split_anims then offset = offset[1] end x = x + offset[1] y = y + offset[2] end return x, y end function Object:updateDynamicInfo() self.times_used = self.times_used + 1 local object = self.object_type if object.dynamic_info then self:setDynamicInfo("text", {object.name, "", _S.dynamic_info.object.times_used:format(self.times_used)}) end end function Object:getSecondaryUsageTile() local x, y = self.tile_x, self.tile_y local offset = self.object_type.orientations if offset then offset = offset[self.direction].use_position_secondary x = x + offset[1] y = y + offset[2] end return x, y end -- This function returns a list of all "only_passable" tiles belonging to an object. -- It must be overridden by objects which do not have a footprint, but walkable tiles (e.g. doors of any kind) function Object:getWalkableTiles() local tiles = {} for _, xy in ipairs(self.footprint) do if xy.only_passable then tiles[#tiles + 1] = { self.tile_x + xy[1], self.tile_y + xy[2] } end end return tiles end function Object:setTile(x, y) local function coordinatesAreInFootprint(object_footprint, xpos, ypos) for _, xy in ipairs(object_footprint) do if xy[1] == xpos and xy[2] == ypos then return true end end return false end local function isEmpty(table) return next(table) == nil end local function getComplementaryPassableFlag(passable_flag) if passable_flag == "travelNorth" or passable_flag == "travelSouth" then return passable_flag == "travelNorth" and "travelSouth" or "travelNorth" else return passable_flag == "travelEast" and "travelWest" or "travelEast" end end local function setPassableFlags(passable_flag, xpos, ypos, next_x, next_y, value) local flags1 = {} flags1[passable_flag] = value self.world.map.th:setCellFlags(xpos, ypos, flags1) local flags2 = {} flags2[getComplementaryPassableFlag(passable_flag)] = value self.world.map.th:setCellFlags(next_x, next_y, flags2) end local direction_parameters = { north = { x = 0, y = -1, buildable_flag = "buildableNorth", passable_flag = "travelNorth", needed_side = "need_north_side"}, east = { x = 1, y = 0, buildable_flag = "buildableEast", passable_flag = "travelEast", needed_side = "need_east_side"}, south = { x = 0, y = 1, buildable_flag = "buildableSouth", passable_flag = "travelSouth", needed_side = "need_south_side"}, west = { x = -1, y = 0, buildable_flag = "buildableWest", passable_flag = "travelWest", needed_side = "need_west_side"} } local direction = self.direction if self.object_type.thob == 50 and direction == "east" then direction = "west" end if self.tile_x ~= nil then self.world:removeObjectFromTile(self, self.tile_x, self.tile_y) if self.footprint then local map = self.world.map.th for _, xy in ipairs(self.footprint) do local xpos, ypos = self.tile_x + xy[1], self.tile_y + xy[2] if xy.only_side then if self.set_passable_flags then self.set_passable_flags = nil local par = direction_parameters[direction] local passableFlag, next_tile_x, next_tile_y = par.passable_flag, xpos + par.x, ypos + par.y setPassableFlags(passableFlag, xpos, ypos, next_tile_x, next_tile_y, true) end local flags_to_set= {} flags_to_set[direction_parameters[direction].buildable_flag] = true map:setCellFlags(xpos, ypos, flags_to_set) else local flags_to_set = {} for _, value in pairs(direction_parameters) do if coordinatesAreInFootprint(self.footprint, xy[1] + value.x, xy[2] + value.y) or xy.complete_cell or xy[value.needed_side] then flags_to_set[value.buildable_flag] = true end end if not isEmpty(flags_to_set) then map:setCellFlags(xpos, ypos, flags_to_set) end if not map:getCellFlags(xpos, ypos).passable then map:setCellFlags(xpos, ypos, { buildable = true, passable = true, }) else -- passable tiles can "belong" to multiple objects, so we have to check that if not self.world:isTilePartOfNearbyObject(xpos, ypos, 10) then -- assumption: no object defines a passable tile further than 10 tiles away from its origin map:setCellFlags(xpos, ypos, { buildable = true, }) end end end end end end local entity_map = self.world.entity_map -- Remove the reference to the object at it's previous coordinates if entity_map then entity_map:removeEntity(self.tile_x,self.tile_y, self) end -- Update the objects coordinates self.tile_x = x self.tile_y = y -- Update the entity map for the new position if entity_map then entity_map:addEntity(x,y,self) end if x then self.th:setDrawingLayer(self:getDrawingLayer()) self.th:setTile(self.world.map.th, self:getRenderAttachTile()) self.world:addObjectToTile(self, x, y) if self.footprint then local map = self.world.map.th local optional_found = false local room = self.world:getRoom(x, y) local roomId = room and room.id local next_tile_x, next_tile_y = x,y local passable_flag for _, xy in ipairs(self.footprint) do local change_flags = true local flags_to_set = {} local lx = x + xy[1] local ly = y + xy[2] local flags if xy.optional then if optional_found then -- An optional tile has been accepted, we don't need anymore such tiles. change_flags = false else flags = map:getCellFlags(lx, ly) local is_object_allowed = true if roomId and flags.roomId ~= roomId then is_object_allowed = false elseif xy.only_passable and not self.world.pathfinder:isReachableFromHospital(lx, ly) then is_object_allowed = false end if is_object_allowed then change_flags = true optional_found = true else change_flags = false end end end flags = map:getCellFlags(lx, ly) if xy.only_side then local par = direction_parameters[direction] flags_to_set[par["buildable_flag"]] = false passable_flag, next_tile_x, next_tile_y = par["passable_flag"], x + par["x"], y + par["y"] else for _, value in pairs(direction_parameters) do if coordinatesAreInFootprint(self.footprint, xy[1] + value["x"], xy[2] + value["y"]) or xy.complete_cell or xy[value["needed_side"]] then if map:getCellFlags(x, y, flags)[value["buildable_flag"]] == 0 then change_flags = false end flags_to_set[value["buildable_flag"]] = false end end end if change_flags then if not xy.only_side then map:setCellFlags(lx, ly, { buildable = false, passable = not not xy.only_passable, }) end if not isEmpty(flags_to_set) then map:setCellFlags(lx, ly, flags_to_set) end if xy.only_side then if map:getCellFlags(lx, ly)[passable_flag] == true then self.set_passable_flags = true setPassableFlags(passable_flag, lx, ly, next_tile_x, next_tile_y, false) end end end end end if self.split_anims then local map = self.world.map.th local pos = self.split_anim_positions for i = 2, #self.split_anims do self.split_anims[i]:setTile(map, x + pos[i][1], y + pos[i][2]) end end else self.th:setTile(nil) if self.split_anims then for i = 2, #self.split_anims do self.split_anims[i]:setTile(nil) end end end self.world:clearCaches() return self end -- Sets the user of this object to the given user. Note that if multiple_users_allowed -- is set to true for this object "user" will always be the last added user to this object. -- Please do not modify object.user directly. --!param user The user that is about to use this object. function Object:setUser(user) assert(user, "setUser: Expected a user, got nil") -- It makes no sense to add a nil value self.user = user if self.object_type.multiple_users_allowed then if not self.user_list then self.user_list = {} end table.insert(self.user_list, user) end self.th:makeInvisible() self:removeReservedUser(user) end -- Removes a user from the set of users if multiple_users_allowed is set to true for this -- object. Otherwise it sets "user" to nil. Please don't directly change the variable "user". function Object:removeUser(user) if self.object_type.multiple_users_allowed then if not user or not self.user_list then -- No user specified, empty the list; or the list didn't exist self.user_list = {} end local found = false for i, users in ipairs(self.user_list) do if users == user then table.remove(self.user_list, i) found = true break end end if not found then self.world:gameLog("Warning: Could not find a humanoid to remove from the user list") end if #self.user_list == 0 then -- No users left, make the object visible again. self.user = nil self.th:makeVisible() end else self.user = nil self.th:makeVisible() end end -- Adds a reserved user for this object. If multiple_users_allowed is set there can be -- many users reserving the object. reserved_for will then be the user who most recently -- reserved this object. function Object:addReservedUser(user) assert(user, "Expected a user, got nil") -- It makes no sense to add a nil value if self.object_type.multiple_users_allowed then if not self.reserved_for_list then self.reserved_for_list = {} end table.insert(self.reserved_for_list, user) else assert(not self.reserved_for or user ~= self.reserved_for, "Object already reserved for another user") end self.reserved_for = user end -- If multiple_users_allowed is true: Removes the user specified from this object's list of reserved users. -- If the argument is nil it is assumed that the list should be emptied. -- Note that if there are many humanoids reserving this object reserved_for might still be set after a -- call to this function. -- Otherwise: sets reserved_for to nil. function Object:removeReservedUser(user) if self.object_type.multiple_users_allowed then -- No user specified, delete the whole list; or no list found, make it. if not user or not self.reserved_for_list then self.reserved_for_list = {} end local found = false for i, users in ipairs(self.reserved_for_list) do if users == user then table.remove(self.reserved_for_list, i) found = true break end end if not found then self.world:gameLog("Warning: Could not find a humanoid to remove from the reserved user list") end if #self.reserved_for_list == 0 then -- No users left, set reserved_for to nil. self.reserved_for = nil end else self.reserved_for = nil end end -- Checks whether the object is reserved for the specified user. -- If the argument is nil a check for any reserved user is done. function Object:isReservedFor(user) if not user then if self.reserved_for_list then return #self.reserved_for_list > 0 else return not not self.reserved_for end end if self.reserved_for == user then -- "Normal" use return true end if self.object_type.multiple_users_allowed then if not self.reserved_for_list then self.reserved_for_list = {} end for _, users in ipairs(self.reserved_for_list) do if users == user then return true end end end return false end --[[ Called when the object is clicked !param ui (UI) The active ui. !param button (string) Which button was clicked. !param data (table) If some data should be retained after moving an object it is in this table. ]] function Object:onClick(ui, button, data) local window = ui:getWindow(UIEditRoom) if button == "right" or (button == "left" and window and window.in_pickup_mode) then -- This flag can be used if for example some things should only happen as long as the -- object is not picked up. How lovely when it is so logical. :-) local object_list = {{object = self.object_type, qty = 1, existing_object = self}} local room = self:getRoom() window = window and window.visible and window local direction = self.direction if (not room and window) or (room and not (window and window.room == room) and not self.object_type.corridor_object) or (not room and not self.object_type.corridor_object) then return end local fullscreen = ui:getWindow(UIFullscreen) if fullscreen then fullscreen:close() end if self.object_type.class == "Plant" or self.object_type.class == "Machine" then local taskType = "watering" if self.object_type.class == "Machine" then taskType = "repairing" end local index = self.hospital:getIndexOfTask(self.tile_x, self.tile_y, taskType) if index ~= -1 then self.hospital:removeHandymanTask(index, taskType) end end self.picked_up = true self.world:destroyEntity(self) -- NB: the object has to be destroyed before updating/creating the window, -- or the blueprint will be wrong if not window then window = UIPlaceObjects(ui, object_list, false) -- don't pay for ui:addWindow(window) else window:stopPickupItems() window:addObjects(object_list, false) -- don't pay for window:selectObjectType(self.object_type) window:checkEnableConfirm() -- since we removed an object from the room, the requirements may not be met anymore end window:setOrientation(direction) self.orientation_before = self.direction ui:playSound("pickup.wav") end end function Object:eraseObject() self.world.map.th:eraseObjectTypes(self.tile_x, self.tile_y) end function Object:resetAnimation() self.world.map.th:setCellFlags(self.tile_x, self.tile_y, {thob = self.object_type.thob}) self.th:setDrawingLayer(self:getDrawingLayer()) self.th:setTile(self.world.map.th, self:getRenderAttachTile()) end function Object:onDestroy() local room = self:getRoom() if room then room.objects[self] = nil end if self.user_list then for _, user in ipairs(self.user_list) do user:handleRemovedObject(self) end self.user_list = {} elseif self.user then self.user:handleRemovedObject(self) end self.user = nil if self.reserved_for_list then for _, reserver in ipairs(self.reserved_for_list) do reserver:handleRemovedObject(self) end self.reserved_for_list = {} elseif self.reserved_for then self.reserved_for:handleRemovedObject(self) end self.reserved_for = nil Entity.onDestroy(self) -- Issue 1105 - rebuild wall travel and pathfinding on side object removal if self.object_type.class == "SideObject" then self.world.map.th:updatePathfinding() self.world:resetSideObjects() end end function Object:afterLoad(old, new) if old < 52 then self.hospital = self.world:getLocalPlayerHospital() end if old < 57 then if self.footprint and self.direction then local object_type = self.object_type local footprint = object_type.orientations footprint = footprint and footprint[self.direction] if footprint and footprint.animation_offset then self:setPosition(unpack(footprint.animation_offset)) end footprint = footprint and footprint.footprint self.footprint = footprint if object_type.class == "SideObject" then local flags = {buildable = true} self.world.map.th:setCellFlags(self.tile_x, self.tile_y, flags) end self:setTile(self.tile_x, self.tile_y) end end return Entity.afterLoad(self, old, new) end local all_pathfind_dirs = {[0] = true, [1] = true, [2] = true, [3] = true} function Object.processTypeDefinition(object_type) if object_type.id == "extinguisher" or object_type.id == "radiator" or object_type.id == "plant" or object_type.id == "reception_desk" or object_type.id == "bench" then object_type.count_category = object_type.id elseif object_type.id ~= "bin" and not object_type.corridor_object and not object_type.id:find("door") then object_type.count_category = "general" end if object_type.orientations then for _, details in pairs(object_type.orientations) do -- Set default values if not details.animation_offset then details.animation_offset = {0, 0} end if not details.render_attach_position then details.render_attach_position = {0, 0} end -- Set the usage position if details.use_position == "passable" then -- "passable" => the *first* passable tile in the footprint list for _, point in pairs(details.footprint) do if point.only_passable then details.use_position = {point[1], point[2]} break end end elseif not details.use_position then details.use_position = {0, 0} end -- Set handyman repair tile if object_type.default_strength and not details.handyman_position then details.handyman_position = details.use_position end -- Find the nearest solid tile in the footprint to the usage position local use_position = details.use_position local solid_near_use_position local solid_near_use_position_d = 10000 for _, point in pairs(details.footprint) do repeat if point.only_passable then break -- continue end local d = (point[1] - use_position[1])^2 + (point[2] - use_position[2])^2 if d >= solid_near_use_position_d then break -- continue end solid_near_use_position = point solid_near_use_position_d = d until true end if solid_near_use_position_d ~= 1 then details.pathfind_allowed_dirs = all_pathfind_dirs else if use_position[1] < solid_near_use_position[1] then details.pathfind_allowed_dirs = {[1] = true} elseif use_position[1] > solid_near_use_position[1] then details.pathfind_allowed_dirs = {[3] = true} elseif use_position[2] < solid_near_use_position[2] then details.pathfind_allowed_dirs = {[2] = true} else details.pathfind_allowed_dirs = {[0] = true} end end -- Adjust the footprint to make this tile the origin local solid_points = {} if solid_near_use_position then local x, y = unpack(solid_near_use_position) for _, point in pairs(details.footprint) do point[1] = point[1] - x point[2] = point[2] - y if not point.only_passable then solid_points[point[1] * 100 + point[2]] = point end end for _, key in ipairs({"use_position_secondary", "finish_use_position", "finish_use_position_secondary"}) do if details[key] then details[key][1] = details[key][1] - x details[key][2] = details[key][2] - y end end use_position[1] = use_position[1] - x use_position[2] = use_position[2] - y if details.slave_position then details.slave_position[1] = details.slave_position[1] - x details.slave_position[2] = details.slave_position[2] - y end local rx, ry = unpack(details.render_attach_position) if type(rx) == "table" then rx, ry = unpack(details.render_attach_position[1]) for _, point in ipairs(details.render_attach_position) do point.column = point[1] - point[2] point[1] = point[1] - x point[2] = point[2] - y end else details.render_attach_position[1] = rx - x details.render_attach_position[2] = ry - y end x, y = Map:WorldToScreen(rx + 1, ry + 1) details.animation_offset[1] = details.animation_offset[1] - x details.animation_offset[2] = details.animation_offset[2] - y end -- Find the region around the solid part of the footprint local adjacent_set = {} local adjacent_list = {} details.adjacent_to_solid_footprint = adjacent_list for _, point in pairs(solid_points) do for _, delta in ipairs({{-1, 0}, {0, -1}, {0, 1}, {1, 0}}) do local x = point[1] + delta[1] local y = point[2] + delta[2] local k2 = x * 100 + y if not solid_points[k2] and not adjacent_set[k2] then adjacent_set[k2] = {x, y} adjacent_list[#adjacent_list + 1] = adjacent_set[k2] end end end end end end --[[ Gets the state of an object ! The state can be later used to set the state of this object. This is useful when we would destroy and create a new object that should represent the same object. !return (table) state ]] function Object:getState() return {times_used = self.times_used} end --[[ Sets the state of an object ! This is a complement to a pair function. IT will use the generated state table to update it's state. !param state (table) table holding the state !return (void) ]] function Object:setState(state) if state then self.times_used = state.times_used end end CorsixTH-0.63/CorsixTH/Lua/entity.lua000066400000000000000000000313731347163623700174330ustar00rootroot00000000000000--[[ Copyright (c) 2009 Peter "Corsix" Cawley 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. --]] --! Abstraction for visible gameplay things which sit somewhere on the map. class "Entity" ---@type Entity local Entity = _G["Entity"] local TH = require("TH") function Entity:Entity(animation) self.th = animation self.layers = {} animation:setHitTestResult(self) self.ticks = true self.playing_sounds_in_random_sequence = false self.waiting_for_sound_effects_to_be_turned_on = false self.random_sound_sequence_parameters = nil self.dynamic_info = nil end --[[ This plays a sound "at" the entity, meaning the sound will not be played if the entity is off-screen, and the volume will be quieter the further the entity is from the center of the screen. If this is not what you want then use UI:playSound instead. !param name (string, integer) The filename or ordinal of the sound to play. !param played_callback (function) a optional parameter. !param played_callback_delay (integer) a optional milliseconds parameter. --]] function Entity:playSound(name, played_callback, played_callback_delay) if TheApp.config.play_sounds then TheApp.audio:playSound(name, self, false, played_callback, played_callback_delay) end end function Entity:setWaitingForSoundEffectsToBeTurnedOn(state) self.waiting_for_sound_effects_to_be_turned_on = true end --[[ Plays a sequence of related sounds at an entity while entity.playing_sounds_in_random_sequence = true. The silences between these sounds can either have randomly generated lengths between the min and max length parameters or they can all be a specified length by providing min and max tables with one value for the desired pause duration. !param name_pattern (String) example: LAVA00*.WAV !param min_silence_lengths (table) the desired mininum silences length for the different tick rates, [3] = Normal !param max_silence_lengths (table) the desired maximum silences length for the different tick rates, [3] = Normal !param num_silences (integer) how many different silence lengths should be used, this can be a nil parameter. -]] function Entity:playEntitySounds(name_pattern, min_silence_lengths, max_silence_lengths, num_silences) self.playing_sounds_in_random_sequence = true self.random_sound_sequence_parameters = {} self.random_sound_sequence_parameters["namePattern"] = name_pattern self.random_sound_sequence_parameters["minSilence"] = min_silence_lengths self.random_sound_sequence_parameters["maxSilence"] = max_silence_lengths self.random_sound_sequence_parameters["numSilences"] = num_silences TheApp.audio:playEntitySounds(name_pattern, self, min_silence_lengths, max_silence_lengths, num_silences) end --[[ Set which animation is used to give the entity a visual appearance. ! Until an entity is given an animation, it is invisible to the player. Note that some "animations" consist of a single frame, and hence the term animation is used both to mean things which are animated and things which are static. !param animation (integer) The ordinal into the main animation set !param flags (integer) A combination of zero or more drawing flags to control the use of alternative palettes, transparency, and other similar settings. See `THDF_` values in `th_gfx.h` for the possible bit values. ]] function Entity:setAnimation(animation, flags) flags = flags or 0 if self.permanent_flags then flags = flags + self.permanent_flags end if animation ~= self.animation_idx or flags ~= self.animation_flags then self.animation_idx = animation self.animation_flags = flags self.th:setAnimation(self.world.anims, animation, flags) end return self end --[[ Set the map tile which the entity is on. !param x (integer) The 1-based X co-ordinate of the tile. !param y (integer) The 1-based Y co-ordinate of the tile. ]] function Entity:setTile(x, y) if self.user_of then print("Warning: Entity tile changed while marked as using an object") end local entity_map = self.world.entity_map -- Remove the reference to the entity at it's previous coordinates if entity_map then entity_map:removeEntity(self.tile_x,self.tile_y, self) end self.tile_x = x self.tile_y = y self.th:setDrawingLayer(self:getDrawingLayer()) -- NB: (x, y) can be nil, in which case th:setTile expects all nil arguments self.th:setTile(x and self.world.map.th, x, y) if self.mood_info then self.mood_info:setParent(self.th) end -- Update the entity map for the new position if entity_map then entity_map:addEntity(x,y,self) end return self end function Entity:getRoom() if self.tile_x and self.tile_y then return self.world:getRoom(self.tile_x, self.tile_y) else return nil end end --[[ Set the pixel position of the entity within the current tile. !param x (integer) The 0-based X pixel offset from the default position. !param y (integer) The 0-based Y pixel offset from the default position. ]] function Entity:setPosition(x, y) self.th:setPosition(x, y) return self end --[[ Set the rate at which the entity pixel position changes !param x (integer) The X component of the speed in pixels per tick. !param y (integer) The Y component of the speed in pixels per tick. ]] function Entity:setSpeed(x, y) self.th:setSpeed(x, y) return self end --[[ Combined form of `setTile`, `setPosition`, and `setSpeed` !param tx (integer) The 1-based X co-ordinate of the tile. !param ty (integer) The 1-based Y co-ordinate of the tile. !param px (integer) The 0-based X pixel offset from the default position. !param py (integer) The 0-based Y pixel offset from the default position. !param sx (integer) The X component of the speed in pixels per tick. !param sy (integer) The Y component of the speed in pixels per tick. ]] function Entity:setTilePositionSpeed(tx, ty, px, py, sx, sy) self:setTile(tx, ty) self:setPosition(px or 0, py or 0) self:setSpeed(sx or 0, sy or 0) return self end -- Inner tick function that will skip every other tick when -- slow_animation is set. function Entity:_tick() if self.slow_animation then if not self.skip_next_tick then self.th:tick() end self.skip_next_tick = not self.skip_next_tick else self.th:tick() end end -- Function which is called once every tick, where a tick is the smallest unit -- of time in the game engine. Typically used to advance animations and similar -- recurring or long-duration tasks. function Entity:tick() if self.num_animation_ticks then for _ = 1, self.num_animation_ticks do self:_tick() end if self.num_animation_ticks == 1 then self.num_animation_ticks = nil end else self:_tick() end -- Tick any mood animation if self.mood_info then self.mood_info:tick() end local timer = self.timer_time if timer then timer = timer - 1 if timer == 0 then self.timer_time = nil local timer_function = self.timer_function self.timer_function = nil timer_function(self) else self.timer_time = timer end end end --[[ Set which parts of the animation to be displayed. ! Each animation is made up of 13 layers, and generally has several different options for each layer. In the animation viewer tool, multiple options can be toggled on for each layer, however here only one option may be selected per layer. !param layer (integer) The layer to set (1 through 13). !param id (integer) The option to display for the given layer. ]] function Entity:setLayer(layer, id) self.th:setLayer(layer, id) self.layers[layer] = id return self end --[[ Register a function (related to the entity) to be called at a later time. ! Each `Entity` can have a single timer associated with it, and due to this limit of one, it is almost always the case that the currently active humanoid action is the only thing which calls `setTimer`. If self.slow_animation is set then all timers will be doubled as animation length will be doubled. !param tick_count (integer) If 0, then `f` will be called during the entity's next `tick`. If 1, then `f` will be called one tick after that, and so on. !param f (function) Function which takes a single argument (the entity). ]] function Entity:setTimer(tick_count, f) self.timer_time = tick_count self.timer_function = f if self.slow_animation and tick_count then self.skip_next_tick = true self.timer_time = tick_count * 2 end end -- Used to set a mood icon over the entity. function Entity:setMoodInfo(new_mood) if new_mood then if not self.mood_info then self.mood_info = TH.animation() self.mood_info:setPosition(-1, -96) self.mood_info:setParent(self.th) end self.mood_info:setAnimation(self.world.anims, new_mood.icon) else if self.mood_info then self.mood_info:setTile(nil) end self.mood_info = false end end -- Function which is called when the entity is to be permanently removed from -- the world. function Entity:onDestroy() -- Clear any mood self:setMoodInfo() self:setTile(nil) self.world.dispatcher:dropFromQueue(self) -- Debug aid to check that there are no hanging references after the entity -- has been destroyed: --[[ self.gc_dummy = newproxy(true) -- undocumented Lua library function getmetatable(self.gc_dummy).__gc = function() print("Entity " .. tostring(self) .. " has been garbage collected.") end --]] if self.waiting_for_sound_effects_to_be_turned_on then TheApp.audio:entityNoLongerWaitingForSoundsToBeTurnedOn(self) end end -- Function which is called at the end of each ingame day. Should be used to -- implement behaviours which happen regularly, but not as frequently as to -- need them in `tick`. function Entity:tickDay() end --! Notify the entity of a new object. --!param id Name of the new object. -- TODO Currently only used for benches placed nearby. -- TODO Maybe also pass the object tile coordinates? function Entity:notifyNewObject(id) end --! Notify the entity that a new room was built. --!param room (Room) The new room. function Entity:notifyNewRoom(room) end function Entity:setMood(mood_name, activate) end -- Returns a table of hover info about an object. function Entity:getDynamicInfo() return self.dynamic_info end -- Sets a piece of Dynamic_info. -- type could be 'text', 'progress' or 'dividers' function Entity:setDynamicInfo(type, value) if not self.dynamic_info then self.dynamic_info = { text = nil, progress = nil, dividers = nil, } end self.dynamic_info[type] = value end -- Completely clears the dynamic info. function Entity:clearDynamicInfo() self.dynamic_info = nil end --! Stub to be extended in subclasses, if needed. function Entity:afterLoad(old, new) end function Entity:playAfterLoadSound() if self.random_sound_sequence_parameters then self.playing_sounds_in_random_sequence = true self:playEntitySounds(self.random_sound_sequence_parameters["namePattern"], self.random_sound_sequence_parameters["minSilence"], self.random_sound_sequence_parameters["maxSilence"], self.random_sound_sequence_parameters["numSilences"]) end end --! Stub to be extended in subclasses, if needed. function Entity:eraseObject() -- Give entity the chance to clear itself from the map before resetAnimation gets called. end function Entity:resetAnimation() self.th:setDrawingLayer(self:getDrawingLayer()) local x, y = self.tile_x, self.tile_y self.th:setTile(x and self.world.map.th, x, y) end --[[ Returns the drawing layer for this particular entity. Should be overriden in derived classes. The drawing layer specifies the order in which object are drawn in a tile (the object with the smallest layer is drawn first). Litter should have layer 0, side objects to the north layer 1, side objects to the west layer 2, normal objects should have layers between 3 and 7, east side object should have layer 8 and south side objects layer 9. ]] function Entity:getDrawingLayer() return 4 end CorsixTH-0.63/CorsixTH/Lua/entity_map.lua000066400000000000000000000173031347163623700202650ustar00rootroot00000000000000--[[ Copyright (c) 2013 William "sadger" Gatens 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. --]] class "EntityMap" ---@type EntityMap local EntityMap = _G["EntityMap"] --[[ An entity map is a structure is a 2 dimensional structure created from a game map, it has the same dimensions as the game map which intitalises it. The purpose of the map is store the location of entities in the map in real-time. Each cell given by an (x, y) coordinate is a table {humanoids ={}, objects = {}} where the tables of humanoids/objects may be empty or contain the entity/entities that currently exist in that tile.]] function EntityMap:EntityMap(map) self.width, self.height = map.th:size() self.entity_map = {} for x = 1, self.width do self.entity_map[x] = {} for y = 1, self.height do self.entity_map[x][y] = {humanoids = {}, objects = {}} end end end local function add_entity_to_table(entity, entity_table) entity_table[#entity_table+1] = entity end --[[Adds an entity to the entity map in a specified location @param x (integer) the x coordinate of the entity @param y (integer) the y coordinate of the entity @param entity (Entity) the entity to be added to the map in the (x, y) position]] function EntityMap:addEntity(x, y, entity) -- Distinguish between entity types and add them -- to the respective tables if x and y and entity then if class.is(entity, Humanoid) then add_entity_to_table(entity, self:getHumanoidsAtCoordinate(x, y)) elseif class.is(entity, Object) then add_entity_to_table(entity, self:getObjectsAtCoordinate(x, y)) end end end -- Iterates through a table and removes the given entity local function remove_entity_from_table(entity, entity_table) local index = -1 for i, h in ipairs(entity_table) do if h == entity then -- If we have found it no need to keep looking index = i break end end -- We haven't found it so we have incorrectly tried to remove it assert(index ~= -1, "Tried to remove entity from entity_map - entity not found") table.remove(entity_table, index) end --[[Removes an entity from the entity map given specified location Assumes the entity already has been added in the (x, y) position or will cause the assertion that the entity is contained in the map to fail. @param x (integer) the x coordinate of the entity @param y (integer) the y coordinate of the entity @param entity (Entity) the entity to be removed from the map in the (x, y) position ]] function EntityMap:removeEntity(x, y, entity) -- Distinguish between entity types to find table to remove from -- then remove the entity from that table if x and y and entity then if class.is(entity, Humanoid) then remove_entity_from_table(entity, self:getHumanoidsAtCoordinate(x, y)) elseif class.is(entity, Object) then remove_entity_from_table(entity, self:getObjectsAtCoordinate(x, y)) end end end --[[Returns a map of all entities (objects and humanoids) at a specified coordinate @param x (integer) the x coordinate to retrieve entities from @param y (integer) the y coordinate to retrieve entities from @return entity_map (table) containing the entities at the (x, y) coordinate ]] function EntityMap:getEntitiesAtCoordinate(x, y) --Add all the humanoids local entity_table = {} for _, obj in ipairs(self:getHumanoidsAtCoordinate(x, y)) do table.insert(entity_table, obj) end --Add all the objects for _, obj in ipairs(self:getObjectsAtCoordinate(x, y)) do table.insert(entity_table, obj) end return entity_table end --[[Returns a table of all humanoids at a specified coordinate @param x (integer) the x coordinate to retrieve entities from @param y (integer) the y coordinate to retrieve entities from @return (table) containing the humanoids at the (x, y) coordinate ]] function EntityMap:getHumanoidsAtCoordinate(x, y) assert(x >= 1 and y >= 1 and x <= self.width and y <= self.height, "Coordinate requested is out of the entity map bounds") return self.entity_map[x][y]["humanoids"] end --[[Returns a table of all objects at a specified coordinate @param x (integer) the x coordinate to retrieve entities from @param y (integer) the y coordinate to retrieve entities from @return (table) containing the objects at the (x, y) coordinate ]] function EntityMap:getObjectsAtCoordinate(x, y) assert(x >= 1 and y >= 1 and x <= self.width and y <= self.height, "Coordinate requested is out of the entity map bounds") return self.entity_map[x][y]["objects"] end --[[ Returns a map of coordinates {{x1, y1}, ... {xn, yn}} directly adjacent to a given (x, y) coordinate - no diagonals @param x (integer) the x coordinate to obtain adjacent tiles from @param y (integer) the y coordinate to obtain adjacent tiles from ]] function EntityMap:getAdjacentSquares(x, y) -- Table of coordinates {x=integer, y=integer} representing (x, y) coordinates local adjacent_squares = {} if x and y then if x ~= 1 then adjacent_squares[#adjacent_squares+1] = {x = x-1, y = y} end if x ~= self.width then adjacent_squares[#adjacent_squares+1] = {x = x+1, y = y} end if y ~= 1 then adjacent_squares[#adjacent_squares+1] = {x = x, y = y-1} end if y ~= self.height then adjacent_squares[#adjacent_squares+1] = {x = x, y = y+1} end end return adjacent_squares end --[[ Returns all the entities which are patients in the squares directly adjacent to the given (x, y) coordinate - diagonals are not considered @param x (integer) the x coordinate to obtain adjacent patients from @param y (integer) the y coordinate to obtain adjacent patients from ]] function EntityMap:getPatientsInAdjacentSquares(x, y) local adjacent_patients = {} for _, coord in ipairs(self:getAdjacentSquares(x, y)) do for _, humanoid in ipairs(self:getHumanoidsAtCoordinate(coord.x, coord.y)) do if class.is(humanoid, Patient) then adjacent_patients[#adjacent_patients + 1] = humanoid end end end return adjacent_patients end --[[ Returns a map of coordinates {{x1, y1}, ... {xn, yn}} of the adjacent tiles (no diagonals) which do not contain any humanoids or objects does NOT determine if the tile is reachable from (x, y) may even be in a different room @param x (integer) the x coordinate to obtain free tiles from @param y (integer) the y coordinate to obtain free tiles from ]] function EntityMap:getAdjacentFreeTiles(x, y) local adjacent_free_tiles = {} for _, coord in ipairs(self:getAdjacentSquares(x, y)) do local x_coord = coord['x'] local y_coord = coord['y'] -- If no object or humanoid occupy the til_coorde if #self:getHumanoidsAtCoordinate(x_coord, y_coord) == 0 and #self:getObjectsAtCoordinate(x_coord, y_coord) == 0 then adjacent_free_tiles[#adjacent_free_tiles+1] = coord end end return adjacent_free_tiles end CorsixTH-0.63/CorsixTH/Lua/epidemic.lua000066400000000000000000000657351347163623700177070ustar00rootroot00000000000000--[[ Copyright (c) 2013 William "sadger" Gatens 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. --]] corsixth.require("announcer") local AnnouncementPriority = _G["AnnouncementPriority"] class "Epidemic" ---@type Epidemic local Epidemic = _G["Epidemic"] --[[Manages the epidemics that occur in hospitals. Generally, any epidemic logic that happens outside this class will call functions contained here.]] function Epidemic:Epidemic(hospital, contagious_patient) self.hospital = hospital self.world = self.hospital.world self.infected_patients = {} -- The contagious disease the epidemic is based around self.disease = contagious_patient.disease -- Can the epidemic be revealed to the player self.ready_to_reveal = false -- Is the epidemic revealed to the player? self.revealed = false -- Various values for the different outcomes - used when result fax is sent self.declare_fine = 0 self.reputation_hit = 0 self.coverup_fine = 0 self.compensation = 0 -- Is the epidemic bad enough to deserve the whole hospital to be evacuated self.will_be_evacuated = false -- Fax sent when the result of the cover up is revealed to the player self.cover_up_result_fax = {} -- Set if the user choses the cover up option instead of declaring self.coverup_in_progress = false --Cover up timer and amount of intervals the timer has self.timer = nil self.countdown_intervals = 0 -- Set when we know if the player has passed/failed the epidemic -- generally used to test if infected patients can still infect others self.result_determined = false -- Vaccination mode is activated when the icon on the timer -- is clicked - used to determine what the cursor should look like self.vaccination_mode_active = false -- For Cheat - Show the contagious icon even before the epidemic is revealed? self.cheat_always_show_mood = false -- Number of times an infect patient has successfully infected another self.total_infections = 0 -- Number of times any infected patient has tried to infected another - successful or not self.attempted_infections = 0 local level_config = self.world.map.level_config -- How often is the epidemic disease passed on? Represents a percentage -- spread_factor% of the time a disease is passed on to a suitable target self.spread_factor = level_config.gbv.ContagiousSpreadFactor or 25 -- How many people still infected and not cure causes the player to take a reputation hit as well as a fine -- has no effect if more than evacuation_minimum - hospital is evacuated anyway self.reputation_loss_minimum = level_config.gbv.EpidemicRepLossMinimum or 5 -- How many people need to still be infected and not cure to cause the -- inspector to evacuate the hospital self.evacuation_minimum = level_config.gbv.EpidemicEvacMinimum or 10 -- The health inspector who reveals the result of the epidemic self.inspector = nil self:addContagiousPatient(contagious_patient) -- Mark all the patients currently in the hospital as passed reception - for compatibility self:markPatientsAsPassedReception() end --[[ The epidemic tick - currently the same rate as the hospital's tick but not necessary dependent on it - could potentially be reduced for performance.]] function Epidemic:tick() if not self.ready_to_reveal then self:checkIfReadyToReveal() end if not self.result_determined then self:infectOtherPatients() end if self.coverup_in_progress then if not self.result_determined then self:checkNoInfectedPlayerHasLeft() self:markedPatientsCallForVaccination() self:showAppropriateAdviceMessages() end self:tryAnnounceInspector() end self:checkPatientsForRemoval() end --[[ Adds a new patient to the epidemic who is actively contagious: infected but not vaccinated or cured]] function Epidemic:addContagiousPatient(patient) patient.infected = true patient:updateDynamicInfo() self.infected_patients[#self.infected_patients + 1] = patient if self.coverup_in_progress or self.cheat_always_show_mood then patient:setMood("epidemy4","activate") end end --[[ Goes through all infected patients checking if there are any other patients in adjacent squares that can be infected, and if so infects them turning them into an infected patient too. ]] function Epidemic:infectOtherPatients() --[[ Can an infected patient infect another patient - taking into account spread factor as defined in the configuration. Patients must be both in the corridors or in the same room - don't infect through walls. @param patient (Patient) already infected patient @param other (Patient) target to possibly infect @return true if patient can infect other, false otherwise (boolean) ]] local function canInfectOther(patient, other) -- Patient is not infectious. if patient.cured or patient.vaccinated then return false end -- 'other' is already infected or is going home. if other.infected or other.cured or other.vaccinated then return false end if other.is_emergency then return false end -- Don't interact with emergencies. -- If the other patient has a different disease OR the other patient's -- disease cannot be changed. if patient.disease ~= other.disease and (not other.disease.contagious or other.diagnosed) then return false end if other.attempted_to_infect then return false end -- Only infect if both are in the same room. return patient:getRoom() == other:getRoom() end local function infect_other(infected_patient, patient) if infected_patient.disease == patient.disease then self:addContagiousPatient(patient) self.total_infections = self.total_infections + 1 else patient:changeDisease(infected_patient.disease) self:addContagiousPatient(patient) self.total_infections = self.total_infections + 1 end end -- Scale the chance of spreading the disease infecting spread_factor% -- of patients results in too large an epidemic typically so infect -- spread_factor/spread_scale_factor patients. -- This scale factor is purely for balance purposes, the larger the -- value the less spreading the epidemics will be, all relative to spread_factor. -- Must be > 0. local spread_scale_factor = 200 -- Go through all infected patients making the check if they can infect -- and making any patient they can infect contagious too. local entity_map = self.world.entity_map if entity_map then for _, infected_patient in ipairs(self.infected_patients) do local adjacent_patients = entity_map:getPatientsInAdjacentSquares(infected_patient.tile_x, infected_patient.tile_y) for _, patient in ipairs(adjacent_patients) do if canInfectOther(infected_patient, patient) then patient.attempted_to_infect = true self.attempted_infections = self.attempted_infections + 1 if (self.total_infections / self.attempted_infections) < (self.spread_factor / spread_scale_factor) then infect_other(infected_patient, patient) end end end end end end --[[ The epidemic is ready to be revealed to the player if any infected patient is fully diagnosed. N.B. because multiple epidemics are queued to become the "active" one, being ready to reveal does NOT guarantee an epidemic WILL be revealed to the player and may even terminate before they are even aware it existed. ]] function Epidemic:checkIfReadyToReveal() for _, infected_patient in ipairs(self.infected_patients) do if infected_patient.diagnosed then self.ready_to_reveal = true break end end end --[[ Show the player the have an epidemic - send a fax This happens when the epidemic is chosen to the be the "active" epidemic out of all the queued ones.]] function Epidemic:revealEpidemic() assert(self.ready_to_reveal) self.revealed = true self:sendInitialFax() self:announceStartOfEpidemic() end --[[ Plays the announcement for the start of the epidemic ]] function Epidemic:announceStartOfEpidemic() local announcements = {"EPID001.wav", "EPID002.wav", "EPID003.wav", "EPID004.wav"} if self.hospital:isPlayerHospital() then self.world.ui:playAnnouncement(announcements[math.random(1, #announcements)], AnnouncementPriority.Critical) end end --[[ Plays the announcement for the end of the epidemic ]] function Epidemic:announceEndOfEpidemic() local announcements = {"EPID005.wav", "EPID006.wav", "EPID007.wav", "EPID008.wav"} if self.hospital:isPlayerHospital() then self.world.ui:playAnnouncement(announcements[math.random(1, #announcements)], AnnouncementPriority.Critical) end end --[[ Checks for conditions that could end the epidemic earlier than the length of the timer. If an infected patient leaves the hospital it's discovered instantly and will result in a fail.]] function Epidemic:checkNoInfectedPlayerHasLeft() if self.result_determined then return end -- Check whether a patient has left. for _, infected_patient in ipairs(self.infected_patients) do local px, py = infected_patient.tile_x, infected_patient.tile_y -- If leaving and no longer in the hospital. if infected_patient.going_home and not infected_patient.cured and px and py and not self.hospital:isInHospital(px,py) then -- Patient escaped from the hospital, discovery is inevitable. self.result_determined = true if not self.inspector then self:spawnInspector() end self:finishCoverUp() return end end end --[[Remove any patients which were already on their way out or died before the epidemic was started to be fair on the players so they don't instantly fail. Additionally if any patients die during an epidemic we also remove them, otherwise a player may never win the epidemic in such a case.]] function Epidemic:checkPatientsForRemoval() for i, infected_patient in ipairs(self.infected_patients) do if (not self.coverup_in_progress and infected_patient.going_home) or infected_patient.dead then table.remove(self.infected_patients,i) end end end --[[ Toggle the vaccination mode changes how the cursor interacts with the hospital. Toggled by pressing the button on the watch (@see UIWatch:UIWatch) ]] function Epidemic:toggleVaccinationMode() self.vaccination_mode_active = not self.vaccination_mode_active local cursor = self.vaccination_mode_active and "epidemic_hover" or "default" self.world.ui:setCursor(self.world.ui.app.gfx:loadMainCursor(cursor)) end --[[ Show a patient is able to be vaccinated, this is shown to the player by changing the icon, once a player has been marked for vaccination they may possibly become a vaccination candidate. Marking is done by clicking the player and can only happen during a cover up. ]] function Epidemic:markForVaccination(patient) if patient.infected and not patient.vaccinated and not patient.marked_for_vaccination then patient.marked_for_vaccination = true patient:setMood("epidemy4","deactivate") patient:setMood("epidemy2","activate") end end --[[ Counts the number of patients that have been infected that are still -- infected -- @return infected_count (Integer) the number of patients still infected.]] function Epidemic:countInfectedPatients() local infected_count = 0 for _, patient in pairs(self.infected_patients) do if patient.infected and not patient.cured then infected_count = infected_count + 1 end end return infected_count end --[[ Sends the initial fax to the player when the epidemic is revealed.]] function Epidemic:sendInitialFax() local num_infected = self:countInfectedPatients() --Save it in a global variable so we can apply the fine in the declare function self.declare_fine = self:calculateInfectedFine(num_infected) local message = { {text = _S.fax.epidemic.disease_name:format(self.disease.name)}, {text = _S.fax.epidemic.declare_explanation_fine:format(self.declare_fine)}, {text = _S.fax.epidemic.cover_up_explanation_1}, {text = _S.fax.epidemic.cover_up_explanation_2}, choices = { {text = _S.fax.epidemic.choices.declare, choice = "declare_epidemic"}, {text = _S.fax.epidemic.choices.cover_up, choice = "cover_up_epidemic"}, }, } self.world.ui.bottom_panel:queueMessage("epidemy", message, nil, 24*20,2) end --[[ Calculate the fine for having a given number of infected patients --Used to determine the initial declaration fine as the cover up fine. --@param infected_count (Integer) number of patients still infected --@return fine (Integer) the fine amount ]] function Epidemic:calculateInfectedFine(infected_count) local level_config = self.world.map.level_config local fine_per_infected = level_config.gbv.EpidemicFine or 2000 return math.max(2000, infected_count * fine_per_infected) end --[[ Gets the amount of reputation to add/remove from the player based on a given fine. Reputation gain/loss isn't specified in the configs so we use a percentage of the fine as a base value with extra being gained/lost for specific circumstances. @param fine_amount (Integer) amount the player will be fined @return reputation hit (Integer) reputation to be deducted relative to fine]] local function getBaseReputationFromFine(fine_amount) return math.round(fine_amount / 100) end --[[ When the player chooses to declare the epidemic instead of trying to cover up it from the initial faxes - ends the epidemic immediately after applying fine.]] function Epidemic:resolveDeclaration() self.result_determined = true self:clearAllInfectedPatients() --No fax for declaration just apply fines and rep hit self.hospital:spendMoney(self.declare_fine, _S.transactions.epidemy_fine) local reputation_hit = getBaseReputationFromFine(self.declare_fine) self.hospital.reputation = self.hospital.reputation - reputation_hit self.hospital.epidemic = nil end --[[ Remove all infected patients by vaccinating from the hospital and clear any epidemic-specific icons from their heads.]] function Epidemic:clearAllInfectedPatients() for _, infected_patient in ipairs(self.infected_patients) do -- Remove any vaccination calls still open infected_patient:removeVaccinationCandidateStatus() self.world.dispatcher:dropFromQueue(infected_patient) infected_patient.vaccinated = true infected_patient:setMood("epidemy1","deactivate") infected_patient:setMood("epidemy2","deactivate") infected_patient:setMood("epidemy3","deactivate") infected_patient:setMood("epidemy4","deactivate") end end --[[ When the player chooses to begin the cover up over declaring from the initial fax (@see sendInitialFax) ]] function Epidemic:startCoverUp() self.timer = UIWatch(self.world.ui, "epidemic") self.countdown_intervals = self.timer.open_timer self.world.ui:addWindow(self.timer) self.coverup_in_progress = true --Set the mood icon for all infected patients for _, infected_patient in ipairs(self.infected_patients) do infected_patient:updateDynamicInfo() infected_patient:setMood("epidemy4","activate") end end --[[ Ends the cover up of the epidemic with the result to be applied later (@see applyOutcome) ]] function Epidemic:finishCoverUp() self.result_determined = true self.timer:close() -- Turn vaccination mode off if self.vaccination_mode_active then self:toggleVaccinationMode() end local still_infected = self:countInfectedPatients() self:determineFaxAndFines(still_infected) self:clearAllInfectedPatients() end --[[ Calculates the contents of the fax and the appropriate fines based on the result of a cover up, results are stored globally to the class to be applied later. @param still_infected (Integer) the number of patients still infected]] function Epidemic:determineFaxAndFines(still_infected) -- Losing text local fail_text_1 = _S.fax.epidemic_result.failed.part_1_name:format(self.disease.name) local fail_text_2 = _S.fax.epidemic_result.failed.part_2 local close_option = {text = _S.fax.epidemic_result.close_text, choice = "close"} -- Losing fine (if epidemic is "lost") self.coverup_fine = self:calculateInfectedFine(still_infected) if still_infected == 0 then -- Compensation fine (if epidemic is "won") local level_config = self.world.map.level_config local compensation_low_value = level_config.gbv.EpidemicCompLo or 1000 local compensation_high_value = level_config.gbv.EpidemicCompHi or 5000 self.compensation = math.random(compensation_low_value,compensation_high_value) self.cover_up_result_fax = { {text = _S.fax.epidemic_result.succeeded.part_1_name:format(self.disease.name)}, {text = _S.fax.epidemic_result.succeeded.part_2}, {text = _S.fax.epidemic_result.compensation_amount:format(self.compensation)}, choices = {close_option} } elseif still_infected < self.reputation_loss_minimum and still_infected < self.evacuation_minimum then self.cover_up_result_fax = { {text = fail_text_1}, {text = fail_text_2}, {text = _S.fax.epidemic_result.fine_amount:format(self.coverup_fine)}, choices = {close_option} } elseif still_infected >= self.reputation_loss_minimum and still_infected < self.evacuation_minimum then self.cover_up_result_fax = { {text = fail_text_1}, {text = fail_text_2}, {text = _S.fax.epidemic_result.rep_loss_fine_amount:format(self.coverup_fine)}, choices = {close_option} } else self.will_be_evacuated = true self.cover_up_result_fax = { {text = fail_text_1}, {text = fail_text_2}, {text = _S.fax.epidemic_result.hospital_evacuated}, choices = {close_option} } end end --[[ Apply the compensation or fines where appropriate to the player as determined when the cover up was completed (@see finishCoverUp) ]] function Epidemic:applyOutcome() -- If there is no compensation to apply the epidemic has been failed if self.compensation == 0 then if self.will_be_evacuated then self.reputation_hit = math.round(self.hospital.reputation * (1/3)) self:evacuateHospital() else self.reputation_hit = getBaseReputationFromFine(self.coverup_fine) end -- Apply fine and reputation hit self.hospital:spendMoney(self.coverup_fine,_S.transactions.epidemy_coverup_fine) self.hospital.reputation = self.hospital.reputation - self.reputation_hit else self.hospital:receiveMoney(self.compensation, _S.transactions.compensation) end -- Finally send the fax confirming the outcome self:sendResultFax() --Remove epidemic from hospital so another epidemic may be assigned self.hospital.epidemic = nil end --[[ For compatibility. Mark all the current patients who are in the hospital --but not in the reception queues as being "passed reception" used to decide --who is evacuated @see evacuateHospital. For new patients they are marked --as they leave the reception desks.]] function Epidemic:markPatientsAsPassedReception() local queuing_patients = {} for _, desk in ipairs(self.hospital:findReceptionDesks()) do for _, patient in ipairs(desk.queue) do -- Use patient as map key to speed up lookup queuing_patients[patient] = true end end for _, patient in ipairs(self.hospital.patients) do -- Patient is not queuing for reception local px, py = patient.tile_x, patient.tile_y if px and py and self.hospital:isInHospital(px,py) and queuing_patients[patient] == nil then patient.has_passed_reception = true end end end --[[ Forces evacuation of the hospital - it makes ALL patients leave and storm out. ]] function Epidemic:evacuateHospital() for _, patient in ipairs(self.hospital.patients) do if patient.has_passed_reception and not patient.going_home then patient:goHome("evacuated") end end end --[[ Send the results of the cover up to the player - will be a success/compensation or fail/fines + reputation hit]] function Epidemic:sendResultFax() self.world.ui.bottom_panel:queueMessage("report", self.cover_up_result_fax, nil, 24*20, 1) self:announceEndOfEpidemic() end --[[ Spawns the inspector who will walk to the reception desk. ]] function Epidemic:spawnInspector() self.world.ui.adviser:say(_A.information.epidemic_health_inspector) local inspector = self.world:newEntity("Inspector", 2) self.inspector = inspector inspector:setType("Inspector") local spawn_point = self.world.spawn_points[math.random(1, #self.world.spawn_points)] inspector:setNextAction(SpawnAction("spawn", spawn_point)) inspector:setHospital(self.hospital) inspector:queueAction(SeekReceptionAction()) end --[[ Is the patient "still" either idle queuing or sitting on a bench Typically this is used to determine if a patient can be vaccinated @param patient (Patient) the patient we wish to determine if they are static.]] local function is_static(patient) local action = patient:getCurrentAction() return action.name == "queue" or action.name == "idle" or (action.name == "use_object" and action.object.object_type.id == "bench") end --[[ During a cover up every patient marked for vaccination (clicked) creates a call to be vaccinated by a nurse - patients must also be static (seated or standing queuing) ]] function Epidemic:markedPatientsCallForVaccination() for _, infected_patient in ipairs(self.infected_patients) do if infected_patient.marked_for_vaccination and not infected_patient.reserved_for and is_static(infected_patient) then self.world.dispatcher:callNurseForVaccination(infected_patient) end end end --[[ In response to a vaccination call by the vaccination candidate (@see makeVaccinationCandidateCallForNurse) perform the vaccination actions or deal with call if unable to vaccinate. @param patient (Patient) the patient who make the original call @param nurse (Nurse) the nurse attempting to vaccinate the patient]] function Epidemic:createVaccinationActions(patient,nurse) patient.reserved_for = nurse -- Check square is reachable first local x,y = self:getBestVaccinationTile(nurse,patient) -- If unreachable patient keep the call open for now if not x or not y then nurse:setCallCompleted() patient.reserved_for = nil nurse:setNextAction(MeanderAction()) patient:removeVaccinationCandidateStatus() else -- Give selected patient the cursor with the arrow once they are next -- in line for vaccination i.e. call assigned patient:giveVaccinationCandidateStatus() local level_config = self.world.map.level_config local fee = level_config.gbv.VacCost or 50 nurse:setNextAction(WalkAction(x, y):setMustHappen(true):enableWalkingToVaccinate()) nurse:queueAction(VaccinateAction(patient, fee)) end end --[[Find the best tile to stand on to vaccinate a patient @param nurse (Nurse) the nurse performing the vaccination @param patient (Patient) the patient to be vaccinated @return best_x,best_y (Integer,nil) the best tiles to vaccinate from.]] function Epidemic:getBestVaccinationTile(nurse, patient) local px, py = patient.tile_x, patient.tile_y -- If the patient is using a bench the best tile to use is -- directly in front of them local action = patient:getCurrentAction() if action.name == "use_object" then local object_in_use = action.object if object_in_use.object_type.id == "bench" then local direction = object_in_use.direction if direction == "north" then return px, py - 1 elseif direction == "south" then return px, py + 1 elseif direction == "east" then return px + 1, py elseif direction == "west" then return px - 1, py end end end -- General usage tile finder, used in the other cases -- when the patient isn't sitting on a bench -- Location of the nurse local nx, ny = nurse.tile_x, nurse.tile_y local best_x, best_y = nil local shortest_distance = nil local free_tiles = self.world.entity_map:getAdjacentFreeTiles(px, py) for _, coord in ipairs(free_tiles) do local x = coord['x'] local y = coord['y'] local distance = self.world:getPathDistance(nx, ny, x, y) -- If the tile is reachable for the nurse if distance then -- If the tile is closer then it's a better choice if not shortest_distance or distance < shortest_distance then shortest_distance = distance best_x, best_y = x, y end end end return best_x, best_y end --[[When the nurse is interrupted unreserve the patient and unassign the call. @param nurse (Nurse) the nurse whose vaccination actions we are interrupting]] function Epidemic:interruptVaccinationActions(nurse) assert(nurse.humanoid_class == "Nurse") local call = nurse.on_call if call then local patient = call.object if patient and patient.vaccination_candidate and not patient.vaccinated then patient:removeVaccinationCandidateStatus() end call.object.reserved_for = nil call.assigned = nil nurse.on_call = nil end end --[[ Make the advisor show appropriate messages under certain conditions of the epidemic.]] function Epidemic:showAppropriateAdviceMessages() if self.countdown_intervals then if not self.has_said_hurry_up and self:countInfectedPatients() > 0 and -- If only 1/4 of the countdown_intervals remaining on the timer self.timer.open_timer == math.floor(self.countdown_intervals * 1 / 4) then self.world.ui.adviser:say(_A.epidemic.hurry_up) self.has_said_hurry_up = true -- Wait until at least 1/4 of the countdown_intervals has expired before giving -- this warning so it doesn't happen straight away elseif self.timer.open_timer <= math.floor(self.countdown_intervals * 3 / 4) and not self.has_said_serious and self:countInfectedPatients() > 10 then self.world.ui.adviser:say(_A.epidemic.serious_warning) self.has_said_serious = true end end end --[[ Are no infected patients, cured or still infected in the hospital? @returns true if so, false otherwise. (boolean) ]] function Epidemic:hasNoInfectedPatients() return #self.infected_patients == 0 end function Epidemic:tryAnnounceInspector() local inspector = self.inspector if inspector and not inspector.has_been_announced and self.hospital:isInHospital(inspector.tile_x, inspector.tile_y) then inspector:announce() inspector.has_been_announced = true end end function Epidemic:afterLoad(old, new) if old < 106 then self.level_config = nil end end CorsixTH-0.63/CorsixTH/Lua/filesystem.lua000066400000000000000000000113211347163623700202720ustar00rootroot00000000000000--[[ Copyright (c) 2010 Peter "Corsix" Cawley 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. --]] local pathsep = package.config:sub(1, 1) local part_pattern = "[^" .. pathsep .. "]+" local ISO_FS = require("ISO_FS") --! Layer for abstracting away differences in file systems class "FileSystem" ---@type FileSystem local FileSystem = _G["FileSystem"] function FileSystem:FileSystem() end local function normalise(str) return str:upper():gsub("_", "-") end function FileSystem:_enumerate() self.sub_dirs = {} self.files = {} for item in lfs.dir(self.physical_path) do local path = self.physical_path .. pathsep .. item if lfs.attributes(path, "mode") == "directory" then self.sub_dirs[normalise(item)] = {physical_path = path} else self.files[normalise(item)] = path end end end function FileSystem:setRoot(physical_path) if physical_path:match"%.[iI][sS][oO]$" or physical_path:match"%.[iI][sS][oO]9660$" then self.provider = ISO_FS() self.provider:setPathSeparator(pathsep) local file, err = io.open(physical_path, "rb") if not file then return nil, err end return self.provider:setRoot(file) else self.provider = nil end if physical_path:sub(-1) == pathsep then -- Trim off the trailing separator (lfs doesn't like querying the mode of a -- directory with a trailing slash on win32) physical_path = physical_path:sub(1, -2) end if lfs.attributes(physical_path, "mode") ~= "directory" then return nil, "Specified path ('" .. physical_path .. "') is not a directory" end self.physical_path = physical_path self:_enumerate() return true end function FileSystem:listFiles(virtual_path, ...) if ... then virtual_path = table.concat({virtual_path, ...}, pathsep) end if self.provider then return self.provider:listFiles(virtual_path) elseif not self.sub_dirs then return nil, "Filesystem layer not initialised" end for part in virtual_path:gmatch(part_pattern) do local part_u = normalise(part) if self.sub_dirs[part_u] then self = self.sub_dirs[part_u] if not self.files then FileSystem._enumerate(self) end elseif self.files[part_u] then return nil, ("Attempt to access file '%s' as if it were a directory while trying to enumerate '%s'"):format(part, virtual_path) else return nil, ("Unable to find '%s' while trying to enumerate '%s'"):format(part, virtual_path) end end return self.files end function FileSystem:readContents(virtual_path, ...) local file, err = self:getFilePath(virtual_path, ...) if not file then return file, err end local f, e = io.open(file, "rb") if not f then return nil, e end local data = f:read"*a" f:close() return data end function FileSystem:getFilePath(virtual_path, ...) if ... then virtual_path = table.concat({virtual_path, ...}, pathsep) end if self.provider then return self.provider:readContents(virtual_path) elseif not self.sub_dirs then return nil, "Filesystem layer not initialised" end local is_file = false for part in virtual_path:gmatch(part_pattern) do if is_file then return nil, ("Attempt to access file '%s' as if it were a directory while trying to read '%s'"):format(part, virtual_path) end local part_u = normalise(part) if self.sub_dirs[part_u] then self = self.sub_dirs[part_u] if not self.files then FileSystem._enumerate(self) end elseif self.files[part_u] then self = self.files[part_u] is_file = true else return nil, ("Unable to find '%s' while trying to read '%s'"):format(part, virtual_path) end end if not is_file then return nil, ("Attempt to access directory '%s' as if it were a file"):format(virtual_path) end return self end CorsixTH-0.63/CorsixTH/Lua/game_ui.lua000066400000000000000000001305151347163623700175230ustar00rootroot00000000000000--[[ Copyright (c) 2010 Manuel "Roujin" Wolf 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. --]] corsixth.require("ui") corsixth.require("announcer") --! Variant of UI for running games class "GameUI" (UI) ---@type GameUI local GameUI = _G["GameUI"] local TH = require("TH") local Announcer = _G["Announcer"] -- The maximum distance to shake the screen from the origin during an -- earthquake with full intensity. local shake_screen_max_movement = 50 --pixels -- 0.002 is about 5 pixels on a 1920 pixel display local multigesture_pinch_sensitivity_factor = 0.002 -- combined with the above, multiplying by 100 means minimum current_momentum.z for any detected pinch -- will result in a call to adjustZoom in the onTick method local multigesture_pinch_amplification_factor = 100 --! Game UI constructor. --!param app (Application) Application object. --!param local_hospital Hospital to display --!param map_editor (bool) Whether the map is editable. function GameUI:GameUI(app, local_hospital, map_editor) self:UI(app) self.app = app self.hospital = local_hospital self.tutorial = { chapter = 0, phase = 0 } if map_editor then self.map_editor = UIMapEditor(self) self:addWindow(self.map_editor) else self.adviser = UIAdviser(self) self.bottom_panel = UIBottomPanel(self) self.bottom_panel:addWindow(self.adviser) self:addWindow(self.bottom_panel) end -- UI widgets self.menu_bar = UIMenuBar(self, self.map_editor) self:addWindow(self.menu_bar) local scr_w = app.config.width local scr_h = app.config.height self.visible_diamond = self:makeVisibleDiamond(scr_w, scr_h) if self.visible_diamond.w <= 0 or self.visible_diamond.h <= 0 then -- For a standard 128x128 map, screen size would have to be in the -- region of 3276x2457 in order to be too large. if not self.map_editor then error("Screen size too large for the map") end end self.screen_offset_x, self.screen_offset_y = app.map:WorldToScreen( app.map.th:getCameraTile(local_hospital:getPlayerIndex())) self.zoom_factor = 1 self:scrollMap(-scr_w / 2, 16 - scr_h / 2) self.limit_to_visible_diamond = not self.map_editor self.transparent_walls = false self.do_world_hit_test = true self.momentum = app.config.scrolling_momentum self.current_momentum = {x = 0.0, y = 0.0, z = 0.0} self.multigesturemove = {x = 0.0, y = 0.0} self.recallpositions = {} self.speed_up_key_pressed = false -- The currently specified intensity value for earthquakes. To abstract -- the effect from the implementation this value is a number between 0 -- and 1. self.shake_screen_intensity = 0 self.announcer = Announcer(app) end function GameUI:setupGlobalKeyHandlers() UI.setupGlobalKeyHandlers(self) -- Set the scrolling keys. self.scroll_keys = { [tostring(self.app.hotkeys["ingame_scroll_up"])] = {x = 0, y = -10}, [tostring(self.app.hotkeys["ingame_scroll_down"])] = {x = 0, y = 10}, [tostring(self.app.hotkeys["ingame_scroll_left"])] = {x = -10, y = 0}, [tostring(self.app.hotkeys["ingame_scroll_right"])] = {x = 10, y = 0}, } -- This is the long version of the shift speed key. -- i.e. if the "ingame_scroll_shift" key is "ctrl", then it will give us -- "left ctrl" and "right ctrl" for reference against the rawchar in -- "onKeyDown()" and "onKeyUp()" self.shift_scroll_key_long = {} self.shift_scroll_speed_pressed = false local temp_table = {} local shift_scroll_key_index = 1 if type(self.app.hotkeys["ingame_scroll_shift"]) == "string" then temp_table = {self.app.hotkeys["ingame_scroll_shift"]} elseif type(self.app.hotkeys["ingame_scroll_shift"]) == "table" then temp_table = shallow_clone(self.app.hotkeys["ingame_scroll_shift"]) end -- Go through the "ingame_scroll_shift" key table and see if it has any modifier names. for _, v in pairs (temp_table) do -- If it does then add long name version of them into the long key table. if v == "ctrl" then self.shift_scroll_key_long[shift_scroll_key_index] = "left ctrl" shift_scroll_key_index = shift_scroll_key_index + 1 self.shift_scroll_key_long[shift_scroll_key_index] = "right ctrl" shift_scroll_key_index = shift_scroll_key_index + 1 elseif v == "alt" then self.shift_scroll_key_long[shift_scroll_key_index] = "left alt" shift_scroll_key_index = shift_scroll_key_index + 1 self.shift_scroll_key_long[shift_scroll_key_index] = "right alt" shift_scroll_key_index = shift_scroll_key_index + 1 elseif v == "shift" then self.shift_scroll_key_long[shift_scroll_key_index] = "left shift" shift_scroll_key_index = shift_scroll_key_index + 1 self.shift_scroll_key_long[shift_scroll_key_index] = "right shift" shift_scroll_key_index = shift_scroll_key_index + 1 end end self:addKeyHandler("global_window_close", self, self.setEditRoom, false) self:addKeyHandler("ingame_showmenubar", self, self.showMenuBar) self:addKeyHandler("ingame_gamespeed_speedup", self, self.keySpeedUp) self:addKeyHandler("ingame_setTransparent", self, self.keyTransparent) self:addKeyHandler("ingame_toggleAdvisor", self, self.toggleAdviser) self:addKeyHandler("ingame_poopLog", self.app.world, self.app.world.dumpGameLog) self:addKeyHandler("ingame_poopStrings", self.app, self.app.dumpStrings) self:addKeyHandler("ingame_toggleAnnouncements", self, self.togglePlayAnnouncements) self:addKeyHandler("ingame_toggleSounds", self, self.togglePlaySounds) self:addKeyHandler("ingame_toggleMusic", self, self.togglePlayMusic) -- scroll to map position for i = 0, 9 do -- set camera view self:addKeyHandler(string.format("ingame_storePosition_%d", i), self, self.setMapRecallPosition, i) -- recall camera view self:addKeyHandler(string.format("ingame_recallPosition_%d", i), self, self.recallMapPosition, i) end if self.app.config.debug then self:addKeyHandler("ingame_showCheatWindow", self, self.showCheatsWindow) end end function GameUI:makeVisibleDiamond(scr_w, scr_h) local map_w = self.app.map.width local map_h = self.app.map.height assert(map_w == map_h, "UI limiter requires square map") -- The visible diamond is the region which the top-left corner of the screen -- is limited to, and ensures that the map always covers all of the screen. -- Its vertices are at (x + w, y), (x - w, y), (x, y + h), (x, y - h). return { x = - scr_w / 2, y = 16 * map_h - scr_h / 2, w = 32 * map_h - scr_h - scr_w / 2, h = 16 * map_h - scr_h / 2 - scr_w / 4, } end --! Calculate the minimum valid zoom value --! --! Zooming out too much would cause negative width/height to be returned from --! makeVisibleDiamond. This function calculates the minimum zoom_factor that --! would be allowed. function GameUI:calculateMinimumZoom() local scr_w = self.app.config.width local scr_h = self.app.config.height local map_h = self.app.map.height -- Minimum width: 0 = 32 * map_h - (scr_h/factor) - (scr_w/factor) / 2, -- Minimum height: 0 = 16 * map_h - (scr_h/factor) / 2 - (scr_w/factor) / 4 -- Both rearrange to: local factor = (scr_w + 2 * scr_h) / (64 * map_h) -- Due to precision issues a tolerance is needed otherwise setZoom might fail factor = factor + 0.001 return factor end function GameUI:setZoom(factor) if factor <= 0 then return false end if not factor or math.abs(factor - 1) < 0.001 then factor = 1 end local scr_w = self.app.config.width local scr_h = self.app.config.height local new_diamond = self:makeVisibleDiamond(scr_w / factor, scr_h / factor) if new_diamond.w < 0 or new_diamond.h < 0 then return false end self.visible_diamond = new_diamond local refx, refy = self.cursor_x or scr_w / 2, self.cursor_y or scr_h / 2 local cx, cy = self:ScreenToWorld(refx, refy) self.zoom_factor = factor cx, cy = self.app.map:WorldToScreen(cx, cy) cx = cx - self.screen_offset_x - refx / factor cy = cy - self.screen_offset_y - refy / factor self:scrollMap(cx, cy) return true end function GameUI:draw(canvas) local app = self.app local config = app.config if self.map_editor or not self.in_visible_diamond then canvas:fillBlack() end local zoom = self.zoom_factor local dx = self.screen_offset_x + math.floor((0.5 - math.random()) * self.shake_screen_intensity * shake_screen_max_movement * 2) local dy = self.screen_offset_y + math.floor((0.5 - math.random()) * self.shake_screen_intensity * shake_screen_max_movement * 2) if canvas:scale(zoom) then app.map:draw(canvas, dx, dy, math.floor(config.width / zoom), math.floor(config.height / zoom), 0, 0) canvas:scale(1) else self:setZoom(1) app.map:draw(canvas, dx, dy, config.width, config.height, 0, 0) end Window.draw(self, canvas, 0, 0) -- NB: not calling UI.draw on purpose self:drawTooltip(canvas) if self.simulated_cursor then self.simulated_cursor.draw(canvas, self.cursor_x, self.cursor_y) end end function GameUI:onChangeResolution() -- Calculate and enforce minimum zoom local minimum_zoom = self:calculateMinimumZoom() if self.zoom_factor < minimum_zoom then self:setZoom(minimum_zoom) end -- Recalculate scrolling bounds local scr_w = self.app.config.width local scr_h = self.app.config.height self.visible_diamond = self:makeVisibleDiamond(scr_w / self.zoom_factor, scr_h / self.zoom_factor) self:scrollMap(0, 0) UI.onChangeResolution(self) end --! Update UI state after the UI has been depersisted --! When an UI object is depersisted, its state will reflect how the UI was at -- the moment of persistence, which may be different to the keyboard / mouse -- state at the moment of depersistence. --!param ui (UI) The previously existing UI object, from which values should be -- taken. function GameUI:resync(ui) if self.drag_mouse_move then -- Check that a window is actually being dragged. If none is found, then -- remove the drag handler. local something_being_dragged = false for _, window in ipairs(self.windows) do if window.dragging then something_being_dragged = true break end end if not something_being_dragged then self.drag_mouse_move = nil end end self.tick_scroll_amount = ui.tick_scroll_amount self.down_count = ui.down_count if ui.limit_to_visible_diamond ~= nil then self.limit_to_visible_diamond = ui.limit_to_visible_diamond end self.key_remaps = ui.key_remaps self.key_to_button_remaps = ui.key_to_button_remaps end function GameUI:updateKeyScroll() local dx, dy = 0, 0 for key, scr in pairs(self.scroll_keys) do if self.buttons_down[key] then dx = dx + scr.x dy = dy + scr.y end end --If there is any movement on the x or y axis... if dx ~= 0 or dy ~= 0 then --Get the length of the scrolling vector. local mag = (dx^2 + dy^2) ^ 0.5 --Then normalize the scrolling vector, after which multiply it by the scroll speed variable used in self.scroll_keys, which is 10 as of 14/10/18. dx = (dx / mag) * 10 dy = (dy / mag) * 10 -- Set the scroll amount to be used. self.tick_scroll_amount = {x = dx, y = dy} return true else self.tick_scroll_amount = false return false end end function GameUI:keySpeedUp() self.speed_up_key_pressed = true self.app.world:speedUp() end function GameUI:keyTransparent() self:setWallsTransparent(true) end function GameUI:onKeyDown(rawchar, modifiers, is_repeat) if UI.onKeyDown(self, rawchar, modifiers, is_repeat) then -- Key has been handled already return true end local key = rawchar:lower() -- If key is shift speed key... for _, v in pairs(self.shift_scroll_key_long) do if v == key then self.shift_scroll_speed_pressed = true end end if self.scroll_keys[key] then self:updateKeyScroll() return end end function GameUI:onKeyUp(rawchar) if UI.onKeyUp(self, rawchar) then return true end local key = rawchar:lower() for _, v in pairs(self.shift_scroll_key_long) do if v == key then self.shift_scroll_speed_pressed = false end end if self.scroll_keys[key] then self:updateKeyScroll() return end -- Guess that the "Speed Up" key was released because the -- code parameter can't provide UTF-8 key codes: self.speed_up_key_pressed = false if self.app.world:isCurrentSpeed("Speed Up") then self.app.world:previousSpeed() end self:setWallsTransparent(false) end function GameUI:makeDebugFax() local message = { {text = "debug fax"}, -- no translation needed imo choices = {{text = "close debug fax", choice = "close"}}, } -- Don't use "strike" type here, as these open a different window and must have an owner local types = {"emergency", "epidemy", "personality", "information", "disease", "report"} self.bottom_panel:queueMessage(types[math.random(1, #types)], message) end function GameUI:ScreenToWorld(x, y) local zoom = self.zoom_factor return self.app.map:ScreenToWorld(self.screen_offset_x + x / zoom, self.screen_offset_y + y / zoom) end function GameUI:WorldToScreen(x, y) local zoom = self.zoom_factor x, y = self.app.map:WorldToScreen(x, y) x = x - self.screen_offset_x y = y - self.screen_offset_y return x * zoom, y * zoom end function GameUI:getScreenOffset() return self.screen_offset_x, self.screen_offset_y end --! Change if the World should be tested for entities under the cursor --!param mode (boolean or room) true to enable hit test (normal), false --! to disable, room to enable only for non-door objects in given room function GameUI:setWorldHitTest(mode) self.do_world_hit_test = mode end function GameUI:onCursorWorldPositionChange() local zoom = self.zoom_factor local x = math.floor(self.screen_offset_x + self.cursor_x / zoom) local y = math.floor(self.screen_offset_y + self.cursor_y / zoom) local entity = nil local overwindow = self:hitTest(self.cursor_x, self.cursor_y) if self.do_world_hit_test and not overwindow then entity = self.app.map.th:hitTestObjects(x, y) if self.do_world_hit_test ~= true then -- limit to non-door objects in room local room = self.do_world_hit_test entity = entity and class.is(entity, Object) and entity:getRoom() == room and entity ~= room.door and entity end end if entity ~= self.cursor_entity then -- Stop displaying hoverable moods for the old entity if self.cursor_entity then self.cursor_entity:setMood(nil) end -- Make the entity easily accessible when debugging, and ignore "deselecting" an entity. if entity then self.debug_cursor_entity = entity end local epidemic = self.hospital.epidemic local infected_cursor = TheApp.gfx:loadMainCursor("epidemic") local epidemic_cursor = TheApp.gfx:loadMainCursor("epidemic_hover") self.cursor_entity = entity if self.cursor ~= self.edit_room_cursor and self.cursor ~= self.waiting_cursor then local cursor = self.default_cursor if self.app.world.user_actions_allowed then --- If the patient is infected show the infected cursor if epidemic and epidemic.coverup_in_progress and entity and entity.infected and not epidemic.timer.closed then cursor = infected_cursor -- In vaccination mode display epidemic hover cursor for all entities elseif epidemic and epidemic.vaccination_mode_active then cursor = epidemic_cursor -- Otherwise just show the normal cursor and hover if appropriate else cursor = entity and entity.hover_cursor or (self.down_count ~= 0 and self.down_cursor or self.default_cursor) end end self:setCursor(cursor) end if self.bottom_panel then self.bottom_panel:setDynamicInfo(nil) end end -- Queueing icons over patients local wx, wy = self:ScreenToWorld(self.cursor_x, self.cursor_y) wx = math.floor(wx) wy = math.floor(wy) local room if not overwindow and wx > 0 and wy > 0 and wx < self.app.map.width and wy < self.app.map.height then room = self.app.world:getRoom(wx, wy) end if room ~= self.cursor_room then -- Unset queue mood for patients queueing the old room if self.cursor_room then local queue = self.cursor_room.door.queue if queue then for _, humanoid in ipairs(queue) do humanoid:setMood("queue", "deactivate") end end end -- Set queue mood for patients queueing the new room if room then local queue = room.door.queue if queue then for _, humanoid in ipairs(queue) do humanoid:setMood("queue", "activate") end end end self.cursor_room = room end -- Any hoverable mood should be displayed on the new entity if class.is(entity, Humanoid) then for _, value in pairs(entity.active_moods) do if value.on_hover then entity:setMoodInfo(value) break end end end -- Dynamic info if entity and self.bottom_panel then self.bottom_panel:setDynamicInfo(entity:getDynamicInfo()) end return Window.onCursorWorldPositionChange(self, self.cursor_x, self.cursor_y) end local UpdateCursorPosition = TH.cursor.setPosition local highlight_x, highlight_y --! Called when the mouse enters or leaves the game window. function GameUI:onWindowActive(gain) if gain == 0 then self.tick_scroll_amount_mouse = false end end -- TODO: try to remove duplication with UI:onMouseMove function GameUI:onMouseMove(x, y, dx, dy) if self.mouse_released then return false end local repaint = UpdateCursorPosition(self.app.video, x, y) if self.app.moviePlayer.playing then return false end self.cursor_x = x self.cursor_y = y if self:onCursorWorldPositionChange() or self.simulated_cursor then repaint = true end if self.buttons_down.mouse_middle then local zoom = self.zoom_factor self.current_momentum.x = -dx/zoom self.current_momentum.y = -dy/zoom -- Stop zooming when the middle mouse button is pressed self.current_momentum.z = 0 self:scrollMap(self.current_momentum.x, self.current_momentum.y) repaint = true end if self.drag_mouse_move then self.drag_mouse_move(x, y) return true end local scroll_region_size if self.app.config.fullscreen then -- As the mouse is locked within the window, a 1px region feels a lot -- larger than it actually is. scroll_region_size = 1 else -- In windowed mode, a reasonable size is needed, though not too large. scroll_region_size = 8 end if not self.app.config.prevent_edge_scrolling and (x < scroll_region_size or y < scroll_region_size or x >= self.app.config.width - scroll_region_size or y >= self.app.config.height - scroll_region_size) then local scroll_dx = 0 local scroll_dy = 0 local scroll_power = 7 if x < scroll_region_size then scroll_dx = -scroll_power elseif x >= self.app.config.width - scroll_region_size then scroll_dx = scroll_power end if y < scroll_region_size then scroll_dy = -scroll_power elseif y >= self.app.config.height - scroll_region_size then scroll_dy = scroll_power end if not self.tick_scroll_amount_mouse then self.tick_scroll_amount_mouse = {x = scroll_dx, y = scroll_dy} else self.tick_scroll_amount_mouse.x = scroll_dx self.tick_scroll_amount_mouse.y = scroll_dy end else self.tick_scroll_amount_mouse = false end if Window.onMouseMove(self, x, y, dx, dy) then repaint = true end self:updateTooltip() local map = self.app.map local wx, wy = self:ScreenToWorld(x, y) wx = math.floor(wx) wy = math.floor(wy) if highlight_x then --map.th:setCell(highlight_x, highlight_y, 4, 0) highlight_x = nil end if 1 <= wx and wx <= 128 and 1 <= wy and wy <= 128 then if map.th:getCellFlags(wx, wy).passable then --map.th:setCell(wx, wy, 4, 24 + 8 * 256) highlight_x = wx highlight_y = wy end end return repaint end function GameUI:onMouseUp(code, x, y) if self.app.moviePlayer.playing then return UI.onMouseUp(self, code, x, y) end local button = self.button_codes[code] if button == "right" and not self.map_editor and highlight_x then local window = self:getWindow(UIPatient) local patient = (window and window.patient.is_debug and window.patient) or self.hospital:getDebugPatient() if patient then patient:walkTo(highlight_x, highlight_y) patient:queueAction(IdleAction()) end end if self.edit_room then if class.is(self.edit_room, Room) then if button == "right" and self.cursor == self.waiting_cursor then -- Still waiting for people to leave the room, abort editing it. self:setEditRoom(false) end else -- No room chosen yet, but about to edit one. if button == "left" then -- Take the clicked one. local room = self.app.world:getRoom(self:ScreenToWorld(x, y)) if room and not room.crashed then self:setCursor(self.waiting_cursor) self.edit_room = room room:tryToEdit() end else -- right click, we don't want to edit a room after all. self:setEditRoom(false) end end end -- During vaccination mode you can only interact with infected patients local epidemic = self.hospital.epidemic if epidemic and epidemic.vaccination_mode_active then if button == "left" then if self.cursor_entity then -- Allow click behaviour for infected patients if self.cursor_entity.infected then self.cursor_entity:onClick(self,button) end end elseif button == "right" then --Right click turns vaccination mode off local watch = TheApp.ui:getWindow(UIWatch) watch:toggleVaccinationMode() end end return UI.onMouseUp(self, code, x, y) end --! Process SDL_MULTIGESTURE events for zoom and map move functionality --!param numfingers (integer) number of touch points, received from the SDL event --! This is still more info about param x. --!param dTheta (float) rotation in radians of the gesture from the SDL event --!param dDist (float) magnitude of pinch from the SDL event --!param x (float) normalised x value of the gesture --!param y (float) normalised y value of the gesture --!return (boolean) event processed indicator function GameUI:onMultiGesture(numfingers, dTheta, dDist, x, y) -- only deal with 2 finger events for now if numfingers == 2 then -- calculate magnitude of pinch local mag = math.abs(dDist) if mag > multigesture_pinch_sensitivity_factor then -- pinch action - constant needs to be tweaked self.current_momentum.z = self.current_momentum.z + dDist * multigesture_pinch_amplification_factor return true else -- scroll map local normx = self.app.config.width * x local normy = self.app.config.height * y if self.multigesturemove.x == 0.0 then self.multigesturemove.x = normx self.multigesturemove.y = normy else local dx = normx - self.multigesturemove.x local dy = normy - self.multigesturemove.y self.current_momentum.x = self.current_momentum.x - dx self.current_momentum.y = self.current_momentum.y - dy self.multigesturemove.x = normx self.multigesturemove.y = normy end return true end end return false end function GameUI:onMouseWheel(x, y) local inside_window = false if self.windows then for _, window in ipairs(self.windows) do if window:hitTest(self.cursor_x - window.x, self.cursor_y - window.y) then inside_window = true break end end end if not inside_window then -- Apply momentum to the zoom if math.abs(self.current_momentum.z) < 12 then self.current_momentum.z = self.current_momentum.z + y end end return UI.onMouseWheel(self, x, y) end function GameUI:playAnnouncement(name, priority, played_callback, played_callback_delay) self.announcer:playAnnouncement(name, priority, played_callback, played_callback_delay) end function GameUI:onTick() local repaint = UI.onTick(self) if not self.buttons_down.mouse_middle then if math.abs(self.current_momentum.x) < 0.2 and math.abs(self.current_momentum.y) < 0.2 then -- Stop scrolling self.current_momentum.x = 0.0 self.current_momentum.y = 0.0 else self.current_momentum.x = self.current_momentum.x * self.momentum self.current_momentum.y = self.current_momentum.y * self.momentum self:scrollMap(self.current_momentum.x, self.current_momentum.y) end if math.abs(self.current_momentum.z) < 0.2 then self.current_momentum.z = 0.0 else self.current_momentum.z = self.current_momentum.z * self.momentum self.app.world:adjustZoom(self.current_momentum.z) end self.multigesturemove.x = 0.0 self.multigesturemove.y = 0.0 end if self.tick_scroll_amount or self.tick_scroll_amount_mouse then -- The scroll amount per tick gradually increases as the duration of the -- scroll increases due to this multiplier. local mult = self.tick_scroll_mult mult = mult + 0.02 if mult > 2 then mult = 2 end self.tick_scroll_mult = mult -- Combine the mouse scroll and keyboard scroll local dx, dy = 0, 0 if self.tick_scroll_amount_mouse then dx, dy = self.tick_scroll_amount_mouse.x, self.tick_scroll_amount_mouse.y -- If the middle mouse button is down, then the world is being dragged, -- and so the scroll direction due to the cursor being at the map edge -- should be opposite to normal to make it feel more natural. if self.buttons_down.mouse_middle then dx, dy = -dx, -dy end end if self.tick_scroll_amount then dx = dx + self.tick_scroll_amount.x dy = dy + self.tick_scroll_amount.y end -- Adjust scroll speed based on config value: -- there is a separate config value for whether or not shift is held. -- the speed is multiplied by 0.5 for consistency between the old and -- new configuration. In the past scroll_speed applied only to shift -- and defaulted to 2, where 1 was regular scroll speed. By -- By multiplying by 0.5, we allow for setting slower than normal -- scroll speeds, and ensure there is no behaviour change for players -- who do not modify their config file. if self.shift_scroll_speed_pressed then mult = mult * self.app.config.shift_scroll_speed * 0.5 else mult = mult * self.app.config.scroll_speed * 0.5 end self:scrollMap(dx * mult, dy * mult) repaint = true else self.tick_scroll_mult = 1 end if self:onCursorWorldPositionChange() then repaint = true end self.announcer:onTick() return repaint end local abs, sqrt_5, floor = math.abs, math.sqrt(1 / 5), math.floor function GameUI:scrollMapTo(x, y) local zoom = 2 * self.zoom_factor local config = self.app.config return self:scrollMap(x - self.screen_offset_x - config.width / zoom, y - self.screen_offset_y - config.height / zoom) end function GameUI.limitPointToDiamond(dx, dy, visible_diamond, do_limit) -- If point outside visible diamond, then move point to the nearest position -- on the edge of the diamond (NB: relies on diamond.w == 2 * diamond.h). local rx = dx - visible_diamond.x local ry = dy - visible_diamond.y if abs(rx) + abs(ry) * 2 > visible_diamond.w then if do_limit then -- Determine the quadrant which the point lies in and accordingly set: -- (vx, vy) : a unit vector perpendicular to the diamond edge in the quadrant -- (p1x, p1y), (p2x, p2y) : the two diamond verticies in the quadrant -- d : distance from the point to the line defined by the diamond edge (not the line segment itself) local vx, vy, d local p1x, p1y, p2x, p2y = 0, 0, 0, 0 if rx >= 0 and ry >= 0 then p1x, p2y = visible_diamond.w, visible_diamond.h vx, vy = sqrt_5, 2 * sqrt_5 d = (rx * vx + ry * vy) - (p1x * vx) elseif rx >= 0 and ry < 0 then p2x, p1y = visible_diamond.w, -visible_diamond.h vx, vy = sqrt_5, -2 * sqrt_5 d = (rx * vx + ry * vy) - (p2x * vx) elseif rx < 0 and ry >= 0 then p2x, p1y = -visible_diamond.w, visible_diamond.h vx, vy = -sqrt_5, 2 * sqrt_5 d = (rx * vx + ry * vy) - (p2x * vx) else--if rx < 0 and ry < 0 then p1x, p2y = -visible_diamond.w, -visible_diamond.h vx, vy = -sqrt_5, -2 * sqrt_5 d = (rx * vx + ry * vy) - (p1x * vx) end -- In the unit vector parallel to the diamond edge, resolve the two vertices and -- the point, and either move the point to the edge or to one of the two vertices. -- NB: vx, vy, p1x, p1y, p2x, p2y are set such that p1 < p2. local p1 = vx * p1y - vy * p1x local p2 = vx * p2y - vy * p2x local pd = vx * ry - vy * rx if pd < p1 then dx, dy = p1x + visible_diamond.x, p1y + visible_diamond.y elseif pd > p2 then dx, dy = p2x + visible_diamond.x, p2y + visible_diamond.y else--if p1 <= pd and pd <= p2 then dx, dy = dx - d * vx, dy - d * vy end return math.floor(dx), math.floor(dy), true else return dx, dy, false end end return dx, dy, true end function GameUI:scrollMap(dx, dy) dx = dx + self.screen_offset_x dy = dy + self.screen_offset_y dx, dy, self.in_visible_diamond = self.limitPointToDiamond(dx, dy, self.visible_diamond, self.limit_to_visible_diamond) self.screen_offset_x = floor(dx + 0.5) self.screen_offset_y = floor(dy + 0.5) end --! Start shaking the screen, e.g. an earthquake effect --!param intensity (number) The magnitude of the effect, between 0 for no -- movement to 1 for significant shaking. function GameUI:beginShakeScreen(intensity) self.shake_screen_intensity = intensity end --! Stop the screen from shaking after beginShakeScreen is called. function GameUI:endShakeScreen() self.shake_screen_intensity = 0 end function GameUI:limitCamera(mode) self.limit_to_visible_diamond = mode self:scrollMap(0, 0) end --! Applies the current setting for wall transparency to the map function GameUI:applyTransparency() self.app.map.th:setWallDrawFlags(self.transparent_walls and 4 or 0) end --! Sets wall transparency to the specified parameter --!param mode (boolean) whether to enable or disable wall transparency function GameUI:setWallsTransparent(mode) if mode ~= self.transparent_walls then self.transparent_walls = mode self:applyTransparency() end end function UI:toggleAdviser() self.app.config.adviser_disabled = not self.app.config.adviser_disabled self.app:saveConfig() end function UI:togglePlaySounds() self.app.config.play_sounds = not self.app.config.play_sounds self.app.audio:playSoundEffects(self.app.config.play_sounds) self.app:saveConfig() end function UI:togglePlayAnnouncements() self.app.config.play_announcements = not self.app.config.play_announcements self.app:saveConfig() end function UI:togglePlayMusic(item) if not self.app.audio.background_music then self.app.config.play_music = true self.app.audio:playRandomBackgroundTrack() -- play else self.app.config.play_music = false self.app.audio:stopBackgroundTrack() -- stop end -- self.app.config.play_music = not self.app.config.play_music self.app:saveConfig() end local tutorial_phases local function make_tutorial_phases() tutorial_phases = { { -- 1) build reception { text = _A.tutorial.build_reception, -- 1 begin_callback = function() TheApp.ui:getWindow(UIBottomPanel):startButtonBlinking(3) end, end_callback = function() TheApp.ui:getWindow(UIBottomPanel):stopButtonBlinking() end, }, { text = _A.tutorial.order_one_reception, -- 2 begin_callback = function() TheApp.ui:getWindow(UIFurnishCorridor):startButtonBlinking(3) end, end_callback = function() TheApp.ui:getWindow(UIFurnishCorridor):stopButtonBlinking(3) end, }, { text = _A.tutorial.accept_purchase, -- 3 begin_callback = function() TheApp.ui:getWindow(UIFurnishCorridor):startButtonBlinking(2) end, end_callback = function() TheApp.ui:getWindow(UIFurnishCorridor):stopButtonBlinking(2) end, }, _A.tutorial.rotate_and_place_reception, -- 4 _A.tutorial.reception_invalid_position, -- 5 -- 6: object other than reception selected. currently no text for this phase. }, { -- 2) hire receptionist { text = _A.tutorial.hire_receptionist, -- 1 begin_callback = function() TheApp.ui:getWindow(UIBottomPanel):startButtonBlinking(5) end, end_callback = function() TheApp.ui:getWindow(UIBottomPanel):stopButtonBlinking() end, }, { text = _A.tutorial.select_receptionists, -- 2 begin_callback = function() TheApp.ui:getWindow(UIHireStaff):startButtonBlinking(4) end, end_callback = function() TheApp.ui:getWindow(UIHireStaff):stopButtonBlinking() end, }, { text = _A.tutorial.next_receptionist, -- 3 begin_callback = function() TheApp.ui:getWindow(UIHireStaff):startButtonBlinking(8) end, end_callback = function() TheApp.ui:getWindow(UIHireStaff):stopButtonBlinking() end, }, { text = _A.tutorial.prev_receptionist, -- 4 begin_callback = function() TheApp.ui:getWindow(UIHireStaff):startButtonBlinking(5) end, end_callback = function() TheApp.ui:getWindow(UIHireStaff):stopButtonBlinking() end, }, { text = _A.tutorial.choose_receptionist, -- 5 begin_callback = function() TheApp.ui:getWindow(UIHireStaff):startButtonBlinking(6) end, end_callback = function() TheApp.ui:getWindow(UIHireStaff):stopButtonBlinking() end, }, _A.tutorial.place_receptionist, -- 6 _A.tutorial.receptionist_invalid_position, -- 7 }, { -- 3) build GP's office -- 3.1) room window { text = _A.tutorial.build_gps_office, -- 1 begin_callback = function() TheApp.ui:getWindow(UIBottomPanel):startButtonBlinking(2) end, end_callback = function() TheApp.ui:getWindow(UIBottomPanel):stopButtonBlinking() end, }, { text = _A.tutorial.select_diagnosis_rooms, -- 2 begin_callback = function() TheApp.ui:getWindow(UIBuildRoom):startButtonBlinking(1) end, end_callback = function() TheApp.ui:getWindow(UIBuildRoom):stopButtonBlinking() end, }, { text = _A.tutorial.click_gps_office, -- 3 begin_callback = function() TheApp.ui:getWindow(UIBuildRoom):startButtonBlinking(5) end, end_callback = function() TheApp.ui:getWindow(UIBuildRoom):stopButtonBlinking() end, }, -- 3.2) blueprint -- [11][58] was maybe planned to be used in this place, but is not needed. _A.tutorial.click_and_drag_to_build, -- 4 _A.tutorial.room_in_invalid_position, -- 5 _A.tutorial.room_too_small, -- 6 _A.tutorial.room_too_small_and_invalid, -- 7 { text = _A.tutorial.room_big_enough, -- 8 begin_callback = function() TheApp.ui:getWindow(UIEditRoom):startButtonBlinking(4) end, end_callback = function() TheApp.ui:getWindow(UIEditRoom):stopButtonBlinking() end, }, -- 3.3) door and windows _A.tutorial.place_door, -- 9 _A.tutorial.door_in_invalid_position, -- 10 { text = _A.tutorial.place_windows, -- 11 begin_callback = function() TheApp.ui:getWindow(UIEditRoom):startButtonBlinking(4) end, end_callback = function() TheApp.ui:getWindow(UIEditRoom):stopButtonBlinking() end, }, { text = _A.tutorial.window_in_invalid_position, -- 12 begin_callback = function() TheApp.ui:getWindow(UIEditRoom):startButtonBlinking(4) end, end_callback = function() TheApp.ui:getWindow(UIEditRoom):stopButtonBlinking() end, }, -- 3.4) objects _A.tutorial.place_objects, -- 13 _A.tutorial.object_in_invalid_position, -- 14 { text = _A.tutorial.confirm_room, -- 15 begin_callback = function() TheApp.ui:getWindow(UIEditRoom):startButtonBlinking(4) end, end_callback = function() TheApp.ui:getWindow(UIEditRoom):stopButtonBlinking() end, }, { text = _A.tutorial.information_window, -- 16 begin_callback = function() TheApp.ui:getWindow(UIInformation):startButtonBlinking(1) end, end_callback = function() TheApp.ui:getWindow(UIInformation):stopButtonBlinking() end, }, }, { -- 4) hire doctor { text = _A.tutorial.hire_doctor, -- 1 begin_callback = function() TheApp.ui:getWindow(UIBottomPanel):startButtonBlinking(5) end, end_callback = function() TheApp.ui:getWindow(UIBottomPanel):stopButtonBlinking() end, }, { text = _A.tutorial.select_doctors, -- 2 begin_callback = function() TheApp.ui:getWindow(UIHireStaff):startButtonBlinking(1) end, end_callback = function() TheApp.ui:getWindow(UIHireStaff):stopButtonBlinking() end, }, { text = _A.tutorial.choose_doctor, -- 3 begin_callback = function() TheApp.ui:getWindow(UIHireStaff):startButtonBlinking(6) end, end_callback = function() TheApp.ui:getWindow(UIHireStaff):stopButtonBlinking() end, }, _A.tutorial.place_doctor, -- 4 _A.tutorial.doctor_in_invalid_position, -- 5 }, { -- 5) end of tutorial { begin_callback = function() -- The demo uses a single string for the post-tutorial info while -- the real game uses three. local texts = TheApp.using_demo_files and { {_S.introduction_texts["level15"]}, {_S.introduction_texts["demo"]}, } or { {_S.introduction_texts["level15"]}, {_S.introduction_texts["level16"]}, {_S.introduction_texts["level17"]}, {_S.introduction_texts["level1"]}, } TheApp.ui:addWindow(UIInformation(TheApp.ui, texts)) TheApp.ui:addWindow(UIWatch(TheApp.ui, "initial_opening")) end, }, }, } end tutorial_phases = setmetatable({}, {__index = function(t, k) make_tutorial_phases() return tutorial_phases[k] end}) -- Called to trigger step to another part of the tutorial. -- chapter: Individual parts of the tutorial. Step will only happen if it's the current chapter. -- phase_from: Phase we need to be in for this step to happen. Multiple phases can be given here in an array. -- phase_to: Phase we want to step to or "next" to go to next chapter or "end" to end tutorial. -- returns true if we changed phase, false if we didn't function GameUI:tutorialStep(chapter, phase_from, phase_to, ...) if self.tutorial.chapter ~= chapter then return false end if type(phase_from) == "table" then local contains_current = false for _, phase in ipairs(phase_from) do if phase == self.tutorial.phase then contains_current = true break end end if not contains_current then return false end else if self.tutorial.phase ~= phase_from then return false end end local old_phase = tutorial_phases[self.tutorial.chapter][self.tutorial.phase] if old_phase and old_phase.end_callback and type(old_phase.end_callback) == "function" then old_phase.end_callback(...) end if phase_to == "end" then self.tutorial.chapter = 0 self.tutorial.phase = 0 return true elseif phase_to == "next" then self.tutorial.chapter = self.tutorial.chapter + 1 self.tutorial.phase = 1 else self.tutorial.phase = phase_to end if TheApp.config.debug then print("Tutorial: Now in " .. self.tutorial.chapter .. ", " .. self.tutorial.phase) end local new_phase = tutorial_phases[self.tutorial.chapter][self.tutorial.phase] local str, callback if (type(new_phase) == "table" and type(new_phase.text) == "table") or not new_phase.text then str = new_phase.text callback = new_phase.begin_callback else str = new_phase end if str and str.text then self.adviser:say(str, true, true) else self.adviser.stay_up = nil end if callback then callback(...) end return true end function GameUI:startTutorial(chapter) chapter = chapter or 1 self.tutorial.chapter = chapter self.tutorial.phase = 0 self:tutorialStep(chapter, 0, 1) end --! Converts centre of screen co-ordinates to world tile positions and stores the values for later recall -- param index (integer) Postion in recallpositions table function GameUI:setMapRecallPosition(index) local cx, cy = self:ScreenToWorld(self.app.config.width / 2, self.app.config.height / 2) self.recallpositions[index] = {x = cx, y = cy, z = self.zoom_factor} end --! Retrives stored recall position and attempts to scroll to that position - will be limited to the bounds of the camera when zoomed out -- param index (integer) Postion in recallpositions table function GameUI:recallMapPosition(index) if self.recallpositions[index] ~= nil then local sx, sy = self.app.map:WorldToScreen(self.recallpositions[index].x, self.recallpositions[index].y) local dx, dy = self.app.map:ScreenToWorld(self.app.config.width / 2, self.app.config.height / 2) self:setZoom(self.recallpositions[index].z) self:scrollMapTo(sx + dx, sy + dy) end end function GameUI:setEditRoom(enabled) -- TODO: Make the room the cursor is over flash if enabled then self:setCursor(self.edit_room_cursor) self.edit_room = true else -- If the actual editing hasn't started yet but is on its way, -- activate the room again. if class.is(self.edit_room, Room) and self.cursor == self.waiting_cursor then self.edit_room.is_active = true else -- If we are currently editing a room it may happen that we need to abort it. -- Also remove any dialog where the user is buying items. local item_window = self.app.ui:getWindow(UIFurnishCorridor) if item_window and item_window.edit_dialog then item_window:close() end local edit_window = self.app.ui:getWindow(UIEditRoom) if edit_window then edit_window:verifyOrAbortRoom() end end self:setCursor(self.default_cursor) self.edit_room = false end end function GameUI:afterLoad(old, new) if old < 16 then self.zoom_factor = 1 end if old < 23 then self.do_world_hit_test = not self:getWindow(UIPlaceObjects) end if old < 34 then self.adviser.queued_messages = {} self.adviser.phase = 0 self.adviser.timer = nil self.adviser.frame = 1 self.adviser.number_frames = 4 end if old < 75 then self.current_momentum = { x = 0, y = 0 } self.momentum = self.app.config.scrolling_momentum end if old < 78 then self.current_momentum = { x = 0, y = 0, z = 0} end if old < 115 then self.shake_screen_intensity = 0 end if old < 122 then self.multigesturemove = {x = 0.0, y = 0.0} end if old < 129 then self.recallpositions = {} end if old < 130 then self.ticks_since_last_announcement = nil -- cleanup self.announcer = Announcer(self.app) end return UI.afterLoad(self, old, new) end function GameUI:showBriefing() local level = self.app.world.map.level_number local text = {_S.information.custom_game} if type(level) == "number" then text = {_S.introduction_texts[TheApp.using_demo_files and "demo" or "level" .. level]} elseif self.app.world.map.level_intro then text = {self.app.world.map.level_intro} end self:addWindow(UIInformation(self, text)) end --! Offers a confirmation window to quit the game and return to main menu -- NB: overrides UI.quit, do NOT call it from here function GameUI:quit() self:addWindow(UIConfirmDialog(self, _S.confirmation.quit, --[[persistable:gameui_confirm_quit]] function() self.app:loadMainMenu() end)) end function GameUI:showCheatsWindow() self:addWindow(UICheats(self)) end function GameUI:showMenuBar() self.menu_bar:appear() end CorsixTH-0.63/CorsixTH/Lua/graphics.lua000066400000000000000000000477321347163623700177250ustar00rootroot00000000000000--[[ Copyright (c) 2009 Peter "Corsix" Cawley 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. --]] local TH = require("TH") local pathsep = package.config:sub(1, 1) local ourpath = debug.getinfo(1, "S").source:sub(2, -17) --! Layer for loading (and subsequently caching) graphical resources. --! The Graphics class handles loading and caching of graphics resources. -- It can adapt as the API to C changes, and hide these changes from most of -- the other Lua code. class "Graphics" ---@type Graphics local Graphics = _G["Graphics"] local cursors_name = { default = 1, clicked = 2, resize_room = 3, edit_room = 4, ns_arrow = 5, we_arrow = 6, nswe_arrow = 7, move_room = 8, sleep = 9, kill_rat = 10, kill_rat_hover = 11, epidemic_hover = 12, epidemic = 13, grab = 14, quit = 15, staff = 16, repair = 17, patient = 18, queue = 19, queue_drag = 20, bank = 36, banksummary = 44, } local cursors_palette = { [36] = "bank01v.pal", [44] = "stat01v.pal", } function Graphics:Graphics(app) self.app = app self.target = self.app.video -- The cache is used to avoid reloading an object if it is already loaded self.cache = { raw = {}, tabled = {}, palette = {}, palette_greyscale_ghost = {}, ghosts = {}, anims = {}, language_fonts = {}, cursors = setmetatable({}, {__mode = "k"}), } self.custom_graphics = {} -- The load info table records how objects were loaded, and is used to -- persist objects as instructions on how to load them. self.load_info = setmetatable({}, {__mode = "k"}) -- If the video target changes then resources will need to be reloaded -- (at least with some rendering engines). Note that reloading is different -- to loading (as in load_info), as reloading is done while the application -- is running, upon objects which are already loaded, whereas loading might -- be done with a different graphics engine, or might only need to grab an -- object from the cache. self.reload_functions = setmetatable({}, {__mode = "k"}) -- Cursors and fonts need to be reloaded after sprite sheets, as they are -- created from sprite sheets. self.reload_functions_last = setmetatable({}, {__mode = "k"}) self:loadFontFile() local graphics_folder = nil if self.app.config.use_new_graphics then -- Check if the config specifies a place to look for graphics in. -- Otherwise check in the default "Graphics" folder. graphics_folder = self.app.config.new_graphics_folder or ourpath .. "Graphics" if graphics_folder:sub(-1) ~= pathsep then graphics_folder = graphics_folder .. pathsep end local graphics_config_file = graphics_folder .. "file_mapping.txt" local result, err = loadfile_envcall(graphics_config_file) if not result then print("Warning: Failed to read custom graphics configuration:\n" .. err) else result(self.custom_graphics) if not self.custom_graphics.file_mapping then print("Error: An invalid custom graphics mapping file was found") end end end self.custom_graphics_folder = graphics_folder end --! Tries to load the font file given in the config file as unicode_font. --! If it is not found it tries to find one in the operating system. function Graphics:loadFontFile() -- Load the Unicode font, if there is one specified. local font_file = self.app.config.unicode_font if not font_file then -- Try a font which commonly comes with the operating system. local windir = os.getenv("WINDIR") if windir and windir ~= "" then font_file = windir .. pathsep .. "Fonts" .. pathsep .. "ARIALUNI.TTF" else font_file = "/usr/share/fonts/truetype/arphic/uming.ttc" end end font_file = font_file and io.open(font_file, "rb") if font_file then self.ttf_font_data = font_file:read"*a" font_file:close() end end function Graphics:loadMainCursor(id) if type(id) ~= "number" then id = cursors_name[id] end if id > 20 then -- SPointer cursors local cursor_palette = self:loadPalette("QData", cursors_palette[id]) cursor_palette:setEntry(255, 0xFF, 0x00, 0xFF) -- Make index 255 transparent return self:loadCursor(self:loadSpriteTable("QData", "SPointer", false, cursor_palette), id - 20) else return self:loadCursor(self:loadSpriteTable("Data", "MPointer"), id) end end function Graphics:loadCursor(sheet, index, hot_x, hot_y) local sheet_cache = self.cache.cursors[sheet] if not sheet_cache then sheet_cache = {} self.cache.cursors[sheet] = sheet_cache end local cursor = sheet_cache[index] if not cursor then hot_x = hot_x or 0 hot_y = hot_y or 0 cursor = TH.cursor() if not cursor:load(sheet, index, hot_x, hot_y) then cursor = { draw = function(canvas, x, y) sheet:draw(canvas, index, x - hot_x, y - hot_y) end, } else local function cursor_reloader(res) assert(res:load(sheet, index, hot_x, hot_y)) end self.reload_functions_last[cursor] = cursor_reloader end sheet_cache[index] = cursor self.load_info[cursor] = {self.loadCursor, self, sheet, index, hot_x, hot_y} end return cursor end local function makeGreyscaleGhost(pal) local remap = {} -- Convert pal from a string to an array of palette entries local entries = {} for i = 1, #pal, 3 do local entry = {pal:byte(i, i + 2)} -- R, G, B at [1], [2], [3] entries[(i - 1) / 3] = entry end -- For each palette entry, convert it to grey and then find the nearest -- entry in the palette to that grey. for i = 0, #entries do local entry = entries[i] local grey = entry[1] * 0.299 + entry[2] * 0.587 + entry[3] * 0.114 local grey_index = 0 local grey_diff = 100000 -- greater than 3*63^2 (TH uses 6 bit colour channels) for j = 0, #entries do local replace_entry = entries[j] local diff_r = replace_entry[1] - grey local diff_g = replace_entry[2] - grey local diff_b = replace_entry[3] - grey local diff = diff_r * diff_r + diff_g * diff_g + diff_b * diff_b if diff < grey_diff then grey_diff = diff grey_index = j end end remap[i] = string.char(grey_index) end -- Convert remap from an array to a string return table.concat(remap, "", 0, 255) end function Graphics:loadPalette(dir, name) name = name or "MPalette.dat" if self.cache.palette[name] then return self.cache.palette[name], self.cache.palette_greyscale_ghost[name] end local data = self.app:readDataFile(dir or "Data", name) local palette = TH.palette() palette:load(data) self.cache.palette_greyscale_ghost[name] = makeGreyscaleGhost(data) self.cache.palette[name] = palette self.load_info[palette] = {self.loadPalette, self, dir, name} return palette, self.cache.palette_greyscale_ghost[name] end function Graphics:loadGhost(dir, name, index) local cached = self.cache.ghosts[name] if not cached then local data = self.app:readDataFile(dir, name) cached = data self.cache.ghosts[name] = cached end return cached:sub(index * 256 + 1, index * 256 + 256) end function Graphics:loadRaw(name, width, height, dir, paldir, pal) if self.cache.raw[name] then return self.cache.raw[name] end width = width or 640 height = height or 480 dir = dir or "QData" local data = self.app:readDataFile(dir, name .. ".dat") data = data:sub(1, width * height) local bitmap = TH.bitmap() local palette if pal and paldir then palette = self:loadPalette(paldir, pal) else palette = self:loadPalette(dir, name .. ".pal") end bitmap:setPalette(palette) assert(bitmap:load(data, width, self.target)) local function bitmap_reloader(bm) bm:setPalette(palette) local bitmap_data = self.app:readDataFile(dir, name .. ".dat") bitmap_data = bitmap_data:sub(1, width * height) assert(bm:load(bitmap_data, width, self.target)) end self.reload_functions[bitmap] = bitmap_reloader self.cache.raw[name] = bitmap self.load_info[bitmap] = {self.loadRaw, self, name, width, height, dir, paldir, pal} return bitmap end function Graphics:loadBuiltinFont() local font = self.builtin_font if not font then local dat, tab, pal = TH.GetBuiltinFont() local function dernc(x) if x:sub(1, 3) == "RNC" then return rnc.decompress(x) else return x end end local palette = TH.palette() palette:load(dernc(pal)) local sheet = TH.sheet() sheet:setPalette(palette) sheet:load(dernc(tab), dernc(dat), true, self.target) font = TH.bitmap_font() font:setSheet(sheet) font:setSeparation(1, 0) self.load_info[font] = {self.loadBuiltinFont, self} self.builtin_font = font end return font end function Graphics:hasLanguageFont(font) if font == nil then -- Original game fonts are always present. return true else if not TH.freetype_font then -- CorsixTH compiled without FreeType2 support, so even if suitable font -- file exists, it cannot be loaded or drawn. return false end -- TODO: Handle more than one font return not not self.ttf_font_data end end --! Font proxy meta table wrapping the C++ class. local font_proxy_mt = { __index = { sizeOf = function(self, ...) return self._proxy:sizeOf(...) end, draw = function(self, ...) return self._proxy:draw(...) end, drawWrapped = function(self, ...) return self._proxy:drawWrapped(...) end, drawTooltip = function(self, ...) return self._proxy:drawTooltip(...) end, } } function Graphics:onChangeLanguage() -- Some fonts might need changing between bitmap and freetype local load_info = self.load_info self.load_info = {} -- Any newly made objects are temporary, and shouldn't -- remember reload information (also avoids insertions -- into a table being iterated over). for object, info in pairs(load_info) do if object._proxy then local fn = info[1] local new_object = fn(unpack(info, 2)) object._proxy = new_object._proxy end end self.load_info = load_info end --! Font reload function. --!param font The font to (force) reloading. local function font_reloader(font) font:clearCache() end --! Utility function to return preferred font for main menu ui function Graphics:loadMenuFont() local font if self.language_font then font = self:loadFont("QData", "Font01V") else font = self:loadBuiltinFont() end return font end function Graphics:loadLanguageFont(name, sprite_table, ...) local font if name == nil then font = self:loadFont(sprite_table, ...) else local cache = self.cache.language_fonts[name] font = cache and cache[sprite_table] if not font then font = TH.freetype_font() -- TODO: Choose face based on "name" rather than always using same face. font:setFace(self.ttf_font_data) font:setSheet(sprite_table) self.reload_functions_last[font] = font_reloader if not cache then cache = {} self.cache.language_fonts[name] = cache end cache[sprite_table] = font end end self.load_info[font] = {self.loadLanguageFont, self, name, sprite_table, ...} return font end function Graphics:loadFont(sprite_table, x_sep, y_sep, ...) -- Allow (multiple) arguments for loading a sprite table in place of the -- sprite_table argument. if type(sprite_table) == "string" then local arg = {sprite_table, x_sep, y_sep, ...} local n_pass_on_args = #arg for i = 2, #arg do if type(arg[i]) == "number" then -- x_sep n_pass_on_args = i - 1 break end end sprite_table = self:loadSpriteTable(unpack(arg, 1, n_pass_on_args)) if n_pass_on_args < #arg then x_sep, y_sep = unpack(arg, n_pass_on_args + 1, #arg) else x_sep, y_sep = nil, nil end end local use_bitmap_font = true if not sprite_table:isVisible(46) then -- uppercase M -- The font doesn't contain an uppercase M, so (in all likelihood) is used -- for drawing special symbols rather than text, so the original bitmap -- font should be used. elseif self.language_font then use_bitmap_font = false end local font if use_bitmap_font then font = TH.bitmap_font() font:setSeparation(x_sep or 0, y_sep or 0) font:setSheet(sprite_table) else font = self:loadLanguageFont(self.language_font, sprite_table) end -- A change of language might cause the font to change between bitmap and -- freetype, so wrap it in a proxy object which allows the actual object to -- be changed easily. font = setmetatable({_proxy = font}, font_proxy_mt) self.load_info[font] = {self.loadFont, self, sprite_table, x_sep, y_sep, ...} return font end function Graphics:loadAnimations(dir, prefix) if self.cache.anims[prefix] then return self.cache.anims[prefix] end --! Load a custom animation file (if it can be found) --!param path Path to the file. local function loadCustomAnims(path) local file, err = io.open(path, "rb") if not file then return nil, err end local data = file:read"*a" file:close() return data end local sheet = self:loadSpriteTable(dir, prefix .. "Spr-0") local anims = TH.anims() anims:setSheet(sheet) if not anims:load( self.app:readDataFile(dir, prefix .. "Start-1.ani"), self.app:readDataFile(dir, prefix .. "Fra-1.ani"), self.app:readDataFile(dir, prefix .. "List-1.ani"), self.app:readDataFile(dir, prefix .. "Ele-1.ani")) then error("Cannot load original animations " .. prefix) end if self.custom_graphics_folder and self.custom_graphics.file_mapping then for _, fname in pairs(self.custom_graphics.file_mapping) do anims:setCanvas(self.target) local data, err = loadCustomAnims(self.custom_graphics_folder .. fname) if not data then print("Error when loading custom animations:\n" .. err) elseif not anims:loadCustom(data) then print("Warning: custom animations loading failed") end end end self.cache.anims[prefix] = anims self.load_info[anims] = {self.loadAnimations, self, dir, prefix} return anims end function Graphics:loadSpriteTable(dir, name, complex, palette) local cached = self.cache.tabled[name] if cached then return cached end local function sheet_reloader(sheet) sheet:setPalette(palette or self:loadPalette()) local data_tab, data_dat data_tab = self.app:readDataFile(dir, name .. ".tab") data_dat = self.app:readDataFile(dir, name .. ".dat") if not sheet:load(data_tab, data_dat, complex, self.target) then error("Cannot load sprite sheet " .. dir .. ":" .. name) end end local sheet = TH.sheet() self.reload_functions[sheet] = sheet_reloader sheet_reloader(sheet) if name ~= "SPointer" then self.cache.tabled[name] = sheet end self.load_info[sheet] = {self.loadSpriteTable, self, dir, name, complex, palette} return sheet end function Graphics:updateTarget(target) self.target = target for _, res_set in ipairs({"reload_functions", "reload_functions_last"}) do for resource, reloader in pairs(self[res_set]) do reloader(resource) end end end --! Utility class for setting animation markers and querying animation length. class "AnimationManager" ---@type AnimationManager local AnimationManager = _G["AnimationManager"] function AnimationManager:AnimationManager(anims) self.anim_length_cache = {} self.anims = anims end --! For overriding animations which have builtin repeats or excess frames function AnimationManager:setAnimLength(anim, length) self.anim_length_cache[anim] = length end function AnimationManager:getAnimLength(anim) local anims = self.anims if not self.anim_length_cache[anim] then local length = 0 local seen = {} local frame = anims:getFirstFrame(anim) while not seen[frame] do seen[frame] = true length = length + 1 frame = anims:getNextFrame(frame) end self.anim_length_cache[anim] = length end return self.anim_length_cache[anim] end --[[ Markers can be set using a variety of different arguments: setMarker(anim_number, position) setMarker(anim_number, start_position, end_position) setMarker(anim_number, keyframe_1, keyframe_1_position, keyframe_2, ...) position should be a table; {x, y} for a tile position, {x, y, "px"} for a pixel position, with (0, 0) being the origin in both cases. The first variant of setMarker sets the same marker for each frame. The second variant does linear interpolation of the two positions between the first frame and the last frame. The third variant does linear interpolation between keyframes, and then the final position for frames after the last keyframe. The keyframe arguments should be 0-based integers, as in the animation viewer. To set the markers for multiple animations at once, the anim_number argument can be a table, in which case the marker is set for all values in the table. Alternatively, the values function (defined in utility.lua) can be used in conjection with a for loop to set markers for multiple things. --]] function AnimationManager:setMarker(anim, ...) return self:setMarkerRaw(anim, "setFrameMarker", ...) end local function TableToPixels(t) if t[3] == "px" then return t[1], t[2] else local x, y = Map:WorldToScreen(t[1] + 1, t[2] + 1) return math.floor(x), math.floor(y) end end function AnimationManager:setMarkerRaw(anim, fn, arg1, arg2, ...) if type(anim) == "table" then for _, val in pairs(anim) do self:setMarkerRaw(val, fn, arg1, arg2, ...) end return end local tp_arg1 = type(arg1) local anim_length = self:getAnimLength(anim) local anims = self.anims local frame = anims:getFirstFrame(anim) if tp_arg1 == "table" then if arg2 then -- Linear-interpolation positions local x1, y1 = TableToPixels(arg1) local x2, y2 = TableToPixels(arg2) for i = 0, anim_length - 1 do local n = math.floor(i / (anim_length - 1)) anims[fn](anims, frame, (x2 - x1) * n + x1, (y2 - y1) * n + y1) frame = anims:getNextFrame(frame) end else -- Static position local x, y = TableToPixels(arg1) for _ = 1, anim_length do anims[fn](anims, frame, x, y) frame = anims:getNextFrame(frame) end end elseif tp_arg1 == "number" then -- Keyframe positions local f1, x1, y1 = 0, 0, 0 local args if arg1 == 0 then x1, y1 = TableToPixels(arg2) args = {...} else args = {arg1, arg2, ...} end local f2, x2, y2 local args_i = 1 for f = 0, anim_length - 1 do if f2 and f == f2 then f1, x1, y1 = f2, x2, y2 f2, x2, y2 = nil, nil, nil end if not f2 then f2 = args[args_i] if f2 then x2, y2 = TableToPixels(args[args_i + 1]) args_i = args_i + 2 end end if f2 then local n = math.floor((f - f1) / (f2 - f1)) anims[fn](anims, frame, (x2 - x1) * n + x1, (y2 - y1) * n + y1) else anims[fn](anims, frame, x1, y1) end frame = anims:getNextFrame(frame) end elseif tp_arg1 == "string" then error("TODO") else error("Invalid arguments to setMarker", 2) end end CorsixTH-0.63/CorsixTH/Lua/hospital.lua000066400000000000000000002546461347163623700177540ustar00rootroot00000000000000--[[ Copyright (c) 2009 Peter "Corsix" Cawley 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. --]] corsixth.require("announcer") local AnnouncementPriority = _G["AnnouncementPriority"] class "Hospital" ---@type Hospital local Hospital = _G["Hospital"] function Hospital:Hospital(world, avail_rooms, name) self.world = world local level_config = world.map.level_config local level = world.map.level_number local balance = 40000 local interest_rate = 0.01 if level_config then if level_config.towns and level_config.towns[level] then balance = level_config.towns[level].StartCash interest_rate = level_config.towns[level].InterestRate / 10000 elseif level_config.town then balance = level_config.town.StartCash interest_rate = level_config.town.InterestRate / 10000 end end self.name = name or "PLAYER" -- TODO: Variate initial reputation etc based on level -- When playing in free build mode you don't care about money. self.balance = not world.free_build_mode and balance or 0 self.loan = 0 self.acc_loan_interest = 0 self.acc_research_cost = 0 self.acc_overdraft = 0 self.acc_heating = 0 -- The sum of all material values (tiles, rooms, objects). -- Initial value: hospital tile count * tile value + 20000 self.value = world.map:getParcelPrice(self:getPlayerIndex()) + 20000 -- TODO: With the fame/shame screen and scoring comes salary. self.player_salary = 10000 self.salary_offer = 0 self.handymanTasks = {} -- Represents the "active" epidemic non-nil if -- an epidemic is happening currently in the hospital -- Only one epidemic is ever "active" self.epidemic = nil -- The pool of epidemics which may happen in the future. -- Epidemic in this table continue in the background its -- patients infecting each other. Epidemics are chosen from -- this pool to become the "active" epidemic self.future_epidemics_pool = {} -- How many epidemics can exist simultaneously counting current and future -- epidemics. If epidemic_limit = 1 then only one epidemic can exist at a -- time either in the futures pool or as a current epidemic. self.concurrent_epidemic_limit = level_config.gbv.EpidemicConcurrentLimit or 1 -- Initial values self.interest_rate = interest_rate self.inflation_rate = 0.045 self.salary_incr = level_config.gbv.ScoreMaxInc or 300 self.sal_min = level_config.gbv.ScoreMaxInc / 6 or 50 self.reputation = 500 self.reputation_min = 0 self.reputation_max = 1000 -- Price distortion level under which the patients might consider the -- treatment to be under-priced (TODO: This could depend on difficulty and/or -- level; e.g. Easy: -0.3 / Difficult: -0.5) self.under_priced_threshold = -0.4 -- Price distortion level over which the patients might consider the -- treatment to be over-priced (TODO: This could depend on difficulty and/or -- level; e.g. Easy: 0.4 / Difficult: 0.2) self.over_priced_threshold = 0.3 self.radiator_heat = 0.5 self.num_visitors = 0 self.num_deaths = 0 self.num_deaths_this_year = 0 self.num_cured = 0 self.not_cured = 0 self.seating_warning = 0 self.num_explosions = 0 self.announce_vip = 0 self.vip_declined = 0 self.num_vips = 0 -- used to check if it's the user's first vip self.percentage_cured = 0 self.percentage_killed = 0 self.msg_counter = 0 self.population = 0.25 -- TODO: Percentage showing how much of -- the total population that goes to the player's hospital, -- used for one of the goals. Change when competitors are there. -- Since there are none right now the player's hospital always get -- 50 % of all patients as soon as gbv.AllocDelay has expired. -- Statistics used in the graph dialog. Each entry is the month, inside it -- is "money in", "money out", wages, balance, visitors, cures, deaths, reputation -- statistic[i] shows what the values were when going from month i - 1 to i. self.statistics = { { money_in = 0, money_out = 0, wages = 0, balance = balance, visitors = 0, cures = 0, deaths = 0, reputation = 500, -- TODO: Always 500 from the beginning? } } self.money_in = 0 self.money_out = 0 -- Other statistics, back to zero each year self.sodas_sold = 0 self:checkReputation() -- Reset self.reputation_above_threshold self.num_vips_ty = 0 -- used to count how many VIP visits in the year for an award self.pleased_vips_ty = 0 self.num_cured_ty = 0 self.not_cured_ty = 0 self.num_visitors_ty = 0 self.ownedPlots = {1} -- Plots owned by the hospital self.ratholes = {} -- List of table {x, y, wall, parcel, optional object} for ratholes in the hospital corridors. self.is_in_world = true -- Whether the hospital is in this world (AI hospitals are not) self.opened = false self.transactions = {} self.staff = {} self.patients = {} self.debug_patients = {} -- right-click-commandable patients for testing self.disease_casebook = {} self.policies = {} self.discovered_diseases = {} -- a list self.discovered_rooms = {} -- a set; keys are the entries of TheApp.rooms, values are true or nil self.undiscovered_rooms = {} -- NB: These two together must form the list world.available_rooms for _, avail_room in ipairs(avail_rooms) do if avail_room.is_discovered then self.discovered_rooms[avail_room.room] = true else self.undiscovered_rooms[avail_room.room] = true end end self.policies["staff_allowed_to_move"] = true self.policies["send_home"] = 0.1 self.policies["guess_cure"] = 0.9 self.policies["stop_procedure"] = 1 -- Note that this is between 1 and 2 ( = 100% - 200%) self.policies["goto_staffroom"] = 0.6 self.policies["grant_wage_increase"] = TheApp.config.grant_wage_increase -- Randomly select three insurance companies to use, only different by name right now. -- The first ones are more likely to come self.insurance = {} for no, local_name in ipairs(_S.insurance_companies) do -- NOTE: Will not work if more companies are added if math.random(1, 11) < 4 or 11 - no < #self.insurance + 3 then self.insurance[#self.insurance + 1] = local_name end if #self.insurance > 2 then break end end -- A list of how much each insurance company owes you. The first entry for -- each company is the current month's dept, the second the previous -- month and the third the month before that. -- All payment that goes through an insurance company a given month is paid two -- months later. For example diagnoses in April are paid the 1st of July self.insurance_balance = {{0, 0, 0}, {0, 0, 0}, {0, 0, 0}} -- Initialize diseases local diseases = TheApp.diseases local expertise = level_config.expertise local gbv = level_config.gbv for _, disease in ipairs(diseases) do local disease_available = true local drug_effectiveness = 95 local drug = disease.treatment_rooms and disease.treatment_rooms[1] == "pharmacy" or nil local drug_cost = 100 if expertise then disease_available = expertise[disease.expertise_id].Known == 1 -- This means that the config is available drug_effectiveness = gbv.StartRating drug_cost = gbv.StartCost end if world.available_diseases[disease.id] or disease.pseudo then local info = { reputation = not disease.pseudo and 500 or nil, price = 1.0, -- user-set multiplier between 0.5 and 2.0 money_earned = 0, recoveries = 0, fatalities = 0, turned_away = 0, disease = disease, discovered = disease_available, concentrate_research = false, cure_effectiveness = drug and drug_effectiveness or 100, -- This will only work as long as there's only one treatment room. drug = drug, drug_cost = drug and drug_cost, psychiatrist = disease.treatment_rooms and disease.treatment_rooms[1] == "psych" or nil, machine = disease.requires_machine, -- This assumes we always have the ward then the operating_theatre as treatment rooms. surgeon = disease.treatment_rooms and disease.treatment_rooms[2] == "operating_theatre" or nil, researcher = disease.requires_researcher, -- TODO: Fix when aliens are in the game. pseudo = disease.pseudo, -- Diagnosis is pseudo } self.disease_casebook[disease.id] = info if disease_available and not disease.pseudo then self.discovered_diseases[#self.discovered_diseases + 1] = disease.id end end end self.research = ResearchDepartment(self) -- Initialize build cost for all available rooms. for _, avail_room in ipairs(avail_rooms) do self.research.research_progress[avail_room.room] = { -- In free build mode, everything is freely available. build_cost = not self.free_build_mode and avail_room.build_cost or 0, } end end -- Seasoned players will know these things, but it does not harm to be reminded if there is no staff room or toilet! function Hospital:noStaffroom_msg() local staffroom_msg = { (_A.warnings.build_staffroom), (_A.warnings.need_staffroom), (_A.warnings.staff_overworked), (_A.warnings.staff_tired), } if staffroom_msg then self.world.ui.adviser:say(staffroom_msg[math.random(1, #staffroom_msg)]) self.staff_room_msg = true end end function Hospital:noToilet_msg() local toilet_msg = { (_A.warnings.need_toilets), (_A.warnings.build_toilets), (_A.warnings.build_toilet_now), } if toilet_msg then self.world.ui.adviser:say(toilet_msg[math.random(1, #toilet_msg)]) self.toilet_msg = true end end -- Give praise where it is due function Hospital:praiseBench() local bench_msg = { (_A.praise.many_benches), (_A.praise.plenty_of_benches), (_A.praise.few_have_to_stand), } if bench_msg then self.world.ui.adviser:say(bench_msg[math.random(1, #bench_msg)]) self.bench_msg = true end end --! Messages regarding numbers cured and killed function Hospital:msgCured() local msg_chance = math.random(1, 15) if self.num_cured > 1 then if msg_chance == 3 and self.msg_counter > 10 then self.world.ui.adviser:say(_A.level_progress.another_patient_cured:format(self.num_cured)) self.msg_counter = 0 elseif msg_chance == 12 and self.msg_counter > 10 then self.world.ui.adviser:say(_A.praise.patients_cured:format(self.num_cured)) self.msg_counter = 0 end end end --! So the messages don't show too often there will need to be at least 10 days before one can show again. function Hospital:msgKilled() local msg_chance = math.random(1, 10) if self.num_deaths > 1 then if msg_chance < 4 and self.msg_counter > 10 then self.world.ui.adviser:say(_A.warnings.many_killed:format(self.num_deaths)) self.msg_counter = 0 elseif msg_chance > 7 and self.msg_counter > 10 then self.world.ui.adviser:say(_A.level_progress.another_patient_killed:format(self.num_deaths)) self.msg_counter = 0 end end end -- Warn if the hospital is lacking some basics function Hospital:warningBench() local bench_msg = { (_A.warnings.more_benches), (_A.warnings.people_have_to_stand), } if bench_msg then self.world.ui.adviser:say(bench_msg[math.random(1, #bench_msg)]) self.bench_msg = true end end -- Warn when it is too hot function Hospital:warningTooHot() local hot_msg = { (_A.information.initial_general_advice.decrease_heating), (_A.warnings.patients_too_hot), (_A.warnings.patients_getting_hot), } if hot_msg then self.world.ui.adviser:say(hot_msg[math.random(1, #hot_msg)]) self.warmth_msg = true end end -- Warn when it is too cold function Hospital:warningTooCold() local cold_msg = { (_A.information.initial_general_advice.increase_heating), (_A.warnings.patients_very_cold), (_A.warnings.people_freezing), } if cold_msg then self.world.ui.adviser:say(cold_msg[math.random(1, #cold_msg)]) self.warmth_msg = true end end function Hospital:warningThirst() local thirst_msg = { (_A.warnings.patients_thirsty), (_A.warnings.patients_thirsty2), } if thirst_msg then self.world.ui.adviser:say(thirst_msg[math.random(1, #thirst_msg)]) self.thirst_msg = true end end -- Remind the player when cash is low that a loan might be available function Hospital:cashLow() -- Don't remind in free build mode. if self.world.free_build_mode then return end local hosp = self.world.hospitals[1] local cashlowmessage = { (_A.warnings.money_low), (_A.warnings.money_very_low_take_loan), (_A.warnings.cash_low_consider_loan), } if hosp.balance < 2000 and hosp.balance >= -500 then hosp.world.ui.adviser:say(cashlowmessage[math.random(1, #cashlowmessage)]) elseif hosp.balance < -2000 and hosp.world:date():monthOfYear() > 8 then -- ideally this should be linked to the lose criteria for balance hosp.world.ui.adviser:say(_A.warnings.bankruptcy_imminent) end end function Hospital:afterLoad(old, new) if old < 8 then -- The list of discovered rooms was not saved. The best we can do is make everything -- discovered which is available for the level. self.discovered_rooms = {} for _, room in ipairs(self.world.available_rooms) do self.discovered_rooms[room] = true end end if old < 9 then -- Initial opening added self.opened = true end if old < 14 then -- NOTE: This will no longer work, but cluttering the code with stub functions -- for this "old" compatibility, is it necessary? self:_initResearch() end if old < 19 then -- The statistics on the current map will be wrong, but it's better than nothing. self.num_visitors = 0 self.player_salary = 10000 self.sodas_sold = 0 end if old < 20 then -- New variables self.acc_loan_interest = 0 self.acc_research_cost = 0 -- Go through all diseases and remove individual reputation for diagnoses for _, disease in pairs(self.disease_casebook) do if disease.pseudo == true then disease.reputation = nil end end -- Go through all possible rooms and add those not researched to the research list. self.research_rooms = {} local next_diag = nil local next_cure = nil for _, room in ipairs(self.world.available_rooms) do if not self.discovered_rooms[room] then self.research_rooms[room] = 0 if room.categories.diagnosis then next_diag = room else next_cure = room end end end -- Go through all rooms and find if a research department has been built -- Also check for training rooms where the training_factor needs to be set for _, room in pairs(self.world.rooms) do if room.room_info.id == "research" then self.research_dep_built = true elseif room.room_info.id == "training" then -- A standard value to keep things going room.training_factor = 5 end end -- Redefine the research table self.research = { improvements = {frac = 20, points = 0, current = "inflation"}, drugs = {frac = 20, points = 0, current = "invisibility"}, diagnosis = {frac = 20, points = 0, current = next_diag}, cure = {frac = 20, points = 0, current = next_cure}, specialisation = {frac = 20, points = 0, current = "special"}, global = 100, } self.discover_autopsy_risk = 10 end if old < 24 then -- New variables self.salary_incr = 300 self.sal_min = 50 self.salary_offer = 0 end if old < 25 then self.insurance_balance = {{0, 0, 0}, {0, 0, 0}, {0, 0, 0}} self.num_deaths_this_year = 0 end if old < 30 then if self.emergency then self.emergency.percentage = 0.75 end end if old < 33 then -- Research has been revamped and expanded. Drugs and improvements -- will work fine, but room research needs to be rebuilt. local research = ResearchDepartment(self) self.undiscovered_rooms = {} local cure, diagnosis local cfg_objects = self.world.map.level_config.objects for _, room in ipairs(self.world.available_rooms) do -- If a room is discovered, make sure its objects are also -- discovered, otherwise add it to the undiscovered list. if self.discovered_rooms[room] then for name, _ in pairs(room.objects_needed) do local object = TheApp.objects[name] if cfg_objects[object.thob] and cfg_objects[object.thob].AvailableForLevel == 1 and object.research_category and not research.research_progress[object].discovered then local progress = self.research_rooms[room] if self.research.cure.current == room or self.research.diagnosis.current == room then progress = progress + self.research.diagnosis.points end research.research_progress[object].discovered = true research.research_progress[object].points = progress end end else self.undiscovered_rooms[room] = true if not cure or not diagnosis then for name, _ in pairs(room.objects_needed) do local object = TheApp.objects[name] if cfg_objects[object.thob] and cfg_objects[object.thob].AvailableForLevel == 1 and object.research_category and not research.research_progress[object].discovered then if object.research_category == "cure" then cure = object elseif object.research_category == "diagnosis" then diagnosis = object end end end end end end local policy = research.research_policy if cure then policy.cure.current = cure else policy.global = policy.global - policy.cure.frac policy.cure.frac = 0 end if diagnosis then research.research_policy.diagnosis.current = diagnosis else policy.global = policy.global - policy.diagnosis.frac policy.diagnosis.frac = 0 end self.research = research self.research_rooms = nil -- Cost of rooms has also been changed local rooms = self.world.map.level_config.rooms if not rooms then -- Add the new variables manually. rooms = { [7] = {Cost = 2280}, -- GP_OFFICE [8] = {Cost = 2270}, -- PSYCHO [9] = {Cost = 1700}, -- WARD [10] = {Cost = 2250}, -- OP_THEATRE [11] = {Cost = 500}, -- PHARMACY [12] = {Cost = 470}, -- CARDIO [13] = {Cost = 3970}, -- SCANNER [14] = {Cost = 2000}, -- ULTRASCAN [15] = {Cost = 3000}, -- BLOOD_MACHINE [16] = {Cost = 2000}, -- XRAY [17] = {Cost = 1500}, -- INFLATOR [18] = {Cost = 7000}, -- ALIEN [19] = {Cost = 500}, -- HAIR_RESTORER [20] = {Cost = 1500}, -- SLACK_TONGUE [21] = {Cost = 500}, -- FRACTURE [22] = {Cost = 1850}, -- TRAINING [23] = {Cost = 500}, -- ELECTRO [24] = {Cost = 4500}, -- JELLY_VAT [25] = {Cost = 1350}, -- STAFF ROOM [26] = {Cost = 5}, -- TV ?? [27] = {Cost = 720}, -- GENERAL_DIAG [28] = {Cost = 800}, -- RESEARCH [29] = {Cost = 1170}, -- TOILETS [30] = {Cost = 5500}, -- DECON_SHOWER } self.world.map.level_config.rooms = rooms end for _, room in ipairs(TheApp.rooms) do -- Sum up the build cost of the room local build_cost = rooms[room.level_config_id].Cost for name, no in pairs(room.objects_needed) do -- Add cost for this object. build_cost = build_cost + cfg_objects[TheApp.objects[name].thob].StartCost * no end -- Now define the total build cost for the room. room.build_cost = build_cost end end if old < 34 then -- New variable self.acc_overdraft = 0 end if old < 35 then -- Define build costs for rooms once again. local cfg_objects = self.world.map.level_config.objects local cfg_rooms = self.world.map.level_config.rooms for _, room in ipairs(TheApp.rooms) do -- Sum up the build cost of the room local build_cost = cfg_rooms[room.level_config_id].Cost for name, no in pairs(room.objects_needed) do -- Add cost for this object. build_cost = build_cost + cfg_objects[TheApp.objects[name].thob].StartCost * no end -- Now define the total build cost for the room. self.research.research_progress[room] = { build_cost = build_cost, } end end if old < 39 then self.acc_heating = 0 end if old < 40 then self.statistics = {} self.money_in = 0 self.money_out = 0 end if old < 41 then self.boiler_can_break = true end if old < 45 then self.num_explosions = 0 self.num_vips = 0 end if old < 48 then self.seating_warning = 0 end if old < 50 then self.num_vips_ty = 0 self.pleased_vips_ty = 0 self.num_cured_ty = 0 self.not_cured_ty = 0 self.num_visitors_ty = 0 end if old < 52 then self:initOwnedPlots() self.handymanTasks = {} end if old < 54 then local current = self.research.research_policy.specialisation.current if current and not current.dummy and not current.thob and not current.drug then for _, disease_entry in pairs(self.disease_casebook) do if disease_entry.concentrate_research then self.research:concentrateResearch(disease_entry.disease.id) self.research:concentrateResearch(disease_entry.disease.id) end end end end if old < 56 then self.research_dep_built = false end if old < 76 then self.msg_counter = 0 end if old < 84 then self.vip_declined = 0 end if old < 88 then self.future_epidemics_pool = {} self.concurrent_epidemic_limit = self.world.map.level_config.gbv.EpidemicConcurrentLimit or 1 end if old < 107 then self.reception_desks = nil end if old < 109 then -- price distortion self.under_priced_threshold = -0.4 self.over_priced_threshold = 0.3 end if old < 111 then self.initial_grace = nil end if old < 114 then self.ratholes = {} end if old < 131 then self.autopsy_discovered = nil self.discover_autopsy_risk = nil end -- Update other objects in the hospital (added in version 106). if self.epidemic then self.epidemic.afterLoad(old, new) end for _, future_epidemic in ipairs(self.future_epidemics_pool) do future_epidemic.afterLoad(old, new) end self.research.afterLoad(old, new) end --! Update the Hospital.patientcount variable. function Hospital:countPatients() -- I have taken the patient count out of town map, from memory it does not work the other way round. -- i.e. calling it from town map to use here -- so Town map now takes this information from here. (If I am wrong, put it back) self.patientcount = 0 for _, patient in ipairs(self.patients) do -- only count patients that are in the hospital local tx, ty = patient.tile_x, patient.tile_y if tx and ty and self:isInHospital(tx, ty) then self.patientcount = self.patientcount + 1 end end end --! Count number of sitting and standing patients in the hospital. --!return (integer, integer) Number of sitting and number of standing patient in the hospital. function Hospital:countSittingStanding() local numberSitting = 0 local numberStanding = 0 for _, patient in ipairs(self.patients) do local pat_action = patient:getCurrentAction() if pat_action.name == "idle" and not patient:getRoom() then numberStanding = numberStanding + 1 elseif pat_action.name == "use_object" and pat_action.object.object_type.id == "bench" then numberSitting = numberSitting + 1 end end return numberSitting, numberStanding end -- A range of checks to help a new player. These are set days apart and will show no more than once a month function Hospital:checkFacilities() local current_date = self.world:date() local day = current_date:dayOfMonth() -- All messages are shown after first 4 months if respective conditions are met if self:isPlayerHospital() and current_date >= Date(1,5) then -- If there is no staff room, remind player of the need to build one if not self.staff_room_msg and day == 3 and not self:hasRoomOfType("staff_room") then self:noStaffroom_msg() end -- If there is no toilet, remind player of the need to build one if not self.toilet_msg and day == 8 and not self:hasRoomOfType("toilets") then self:noToilet_msg() end if not self.bench_msg then -- How are we for seating, if there are plenty then praise is due, if not the player is warned -- check the seating : standing ratio of waiting patients -- find all the patients who are currently waiting around local numberSitting, numberStanding = self:countSittingStanding() -- If there are patients standing then maybe the seating is in the wrong place! -- set to 5% (standing:seated) if there are more than 50 patients or 20% if there are less than 50. -- If this happens for 10 days in any month you are warned about seating unless you have already been warned that month -- So there are now two checks about having enough seating, if either are called then you won't receive praise. (may need balancing) local number_standing_threshold = numberSitting / (self.patientcount < 50 and 5 or 20) if numberStanding > number_standing_threshold then self.seating_warning = self.seating_warning + 1 if self.seating_warning >= 10 then self:warningBench() end end if day == 12 then -- If there are less patients standing than sitting (1:20) and there are more benches than patients in the hospital -- you have plenty of seating. If you have not been warned of standing patients in the last month, you could be praised. -- We don't want to see praise messages about seating every month, so randomise the chances of it being shown local show_praise = math.random(1, 4) == 4 if self.world.object_counts.bench > self.patientcount and show_praise then self:praiseBench() -- Are there enough benches for the volume of patients in your hospital? elseif self.world.object_counts.bench < self.patientcount then self:warningBench() end end end -- Make players more aware of the need for radiators if self.world.object_counts.radiator == 0 then self.world.ui.adviser:say(_A.information.initial_general_advice.place_radiators) end -- Now to check how warm or cold patients and staff are. So that we are not bombarded with warmth -- messages if we are told about patients then we won't be told about staff as well in the same month -- And unlike TH we don't want to be told that anyone is too hot or cold when the boiler is broken do we! if not self.warmth_msg and not self.heating_broke then if day == 15 then local warmth = self:getAveragePatientAttribute("warmth", 0.3) -- Default value does not result in a message. if warmth < 0.22 then self:warningTooCold() elseif warmth >= 0.36 then self:warningTooHot() end end -- Are the staff warm enough? if day == 20 then local avgWarmth = self:getAverageStaffAttribute("warmth", 0.25) -- Default value does not result in a message. if avgWarmth < 0.22 then self.world.ui.adviser:say(_A.warnings.staff_very_cold) elseif avgWarmth >= 0.36 then self.world.ui.adviser:say(_A.warnings.staff_too_hot) end end end -- Are the patients in need of a drink if not self.thirst_msg and day == 24 then local thirst = self:getAveragePatientAttribute("thirst", 0) -- Default value does not result in a message. local thirst_threshold = current_date:year() == 1 and 0.8 or 0.9 if thirst > thirst_threshold then self.world.ui.adviser:say(_A.warnings.patients_very_thirsty) elseif thirst > 0.6 then self:warningThirst() end end -- reset all the messages on 28th of each month if day == 28 then self.staff_room_msg = false self.toilet_msg = false self.bench_msg = false self.cash_msg = false self.warmth_msg = false self.thirst_msg = false self.seating_warning = 0 end end end --! Called each tick, also called 'hours'. Check hours_per_day in --! date.lua to see how many times per day this is. function Hospital:tick() -- add some random background sounds, ringing phones, coughing, belching etc self:countPatients() local sounds = { "ispot001.wav", "ispot002.wav", "ispot003.wav", "ispot004.wav", "ispot005.wav", "ispot006.wav", "ispot007.wav", "ispot008.wav", "ispot009.wav", "ispot010.wav", "ispot011.wav", "ispot012.wav", "ispot013.wav", "ispot014.wav", "ispot015.wav", "ispot016.wav", "ispot017.wav", "ispot018.wav", "ispot019.wav", "ispot020.wav", "ispot021.wav", "ispot022.wav", "ispot023.wav", "ispot024.wav", "ispot025.wav" } -- ispot026 and ispot027 are both toilet related sounds -- wait until there are some patients in the hospital and a room, otherwise you will wonder who is coughing or who is the -- receptionist telephoning! opted for gp as you can't run the hospital without one. if self:hasRoomOfType("gp") and self.patientcount > 2 then if math.random(1, 100) == 3 then local sound_to_play = sounds[math.random(1, #sounds)] if TheApp.audio:soundExists(sound_to_play) then self.world.ui:playSound(sound_to_play) end end end self:manageEpidemics() end function Hospital:purchasePlot(plot_number) local map = self.world.map if map.th:isParcelPurchasable(plot_number, self:getPlayerIndex()) and not self.world.ui.transparent_walls then local cost = not self.world.free_build_mode and map:getParcelPrice(plot_number) or 0 if cost <= self.balance then self.world:setPlotOwner(plot_number, self:getPlayerIndex()) table.insert(self.ownedPlots, plot_number) -- Also make sure to apply transparency to the new walls, if required. self.world.ui:applyTransparency() self:spendMoney(cost, _S.transactions.buy_land, cost) return true else -- Give visual warning that player doesn't have enough $ to build -- Let the message remain unitl cancelled by the player as it is being displayed behind the town map self.world.ui.adviser:say(_A.warnings.cannot_afford_2, true, true) end end return false end function Hospital:getPlayerIndex() -- TODO: In multiplayer, return 2 or 3 or 4 return 1 end --! Returns the heliport x and y coordinates or nil if none exist. --!return (pair of integers, or nil) The x,y position of the tile with the heliport, if it exists. function Hospital:getHeliportPosition() local x, y = self.world.map.th:getHeliportTile(self:getPlayerIndex()) -- NB: Level 2 has a heliport tile set, but no heliport, so we ensure that -- the specified tile is suitable by checking the spawn tile for -- passability. if y > 0 and self.world.map:getCellFlag(x, y, "passable") then return x, y end end --! Returns the tile on which patients should spawn when getting out of the helicopter. --!return (pair of integers, or nil) The x,y position to use for spawning emergency patients from the heliport, if available. function Hospital:getHeliportSpawnPosition() local x, y = self:getHeliportPosition() if x and y then return x, y - 1 end end --[[ Test if a given map tile is part of this hospital. !param x (integer) The 1-based X co-ordinate of the tile to test. !param y (integer) The 1-based Y co-ordinate of the tile to test. ]] function Hospital:isInHospital(x, y) local flags = self.world.map.th:getCellFlags(x, y) return flags.hospital and flags.owner == self:getPlayerIndex() end function Hospital:coldWarning() local announcements = { "sorry002.wav", "sorry004.wav", } if announcements and self:isPlayerHospital() then self.world.ui:playAnnouncement(announcements[math.random(1, #announcements)], AnnouncementPriority.Normal) end end function Hospital:hotWarning() local announcements = { "sorry003.wav", "sorry004.wav", } if announcements and self:isPlayerHospital() then self.world.ui:playAnnouncement(announcements[math.random(1, #announcements)], AnnouncementPriority.Normal) end end -- Called when the hospitals's boiler has broken down. -- It will remain broken for a certain period of time. function Hospital:boilerBreakdown() self.curr_setting = self.radiator_heat self.radiator_heat = math.random(0, 1) self.boiler_countdown = math.random(7, 25) self.heating_broke = true -- Only show the message when relevant to the local player's hospital. if self:isPlayerHospital() then if self.radiator_heat == 0 then self.world.ui.adviser:say(_A.boiler_issue.minimum_heat) self:coldWarning() else self.world.ui.adviser:say(_A.boiler_issue.maximum_heat) self:hotWarning() end end end -- When the boiler has been repaired this function is called. function Hospital:boilerFixed() self.radiator_heat = self.curr_setting self.heating_broke = false if self:isPlayerHospital() then self.world.ui.adviser:say(_A.boiler_issue.resolved) end end --! Daily update of the ratholes. --!param self (Hospital) hospital being updated. local function dailyUpdateRatholes(self) local map = self.world.map local th = map.th local wanted_holes = math.round(th:getLitterFraction(self:getPlayerIndex()) * 200) if #self.ratholes < wanted_holes then -- Not enough holes, find a new spot -- Try to find a wall in a corridor, and add it if possible. -- Each iteration does a few probes at a random position, most tries will -- fail on not being on a free (non-built) tile in a corridor with a wall -- in the right hospital. -- Doing more iterations speeds up finding a suitable location, less -- iterations is reduces needed processor time. -- "6 + 2 * difference" is an arbitrary value that seems to work nicely, 12 -- is an arbitrary upper limit on the number of tries. for _ = 1, math.min(12, 6 + 2 * (wanted_holes - #self.ratholes)) do local x = math.random(1, map.width) local y = math.random(1, map.height) local flags = th:getCellFlags(x, y) if self:isInHospital(x, y) and flags.roomId == 0 and flags.buildable then local walls = self:getWallsAround(x, y) if #walls > 0 then -- Found a wall, check it for not being used. local wall = walls[math.random(1, #walls)] local found = false for _, hole in ipairs(self.ratholes) do if hole.x == x and hole.y == y and hole.wall == wall.wall then found = true break end end if not found then self:addRathole(x, y, wall.wall, wall.parcel) break end end end end end end -- Called at the end of each day. function Hospital:onEndDay() local pay_this = self.loan*self.interest_rate/365 -- No leap years self.acc_loan_interest = self.acc_loan_interest + pay_this self.research:researchCost() if self:hasStaffedDesk() then self:checkFacilities() end self.show_progress_screen_warnings = math.random(1, 3) -- used in progress report to limit warnings self.msg_counter = self.msg_counter + 1 if self.balance < 0 then -- TODO: Add the extra interest rate to level configuration. local overdraft_interest = self.interest_rate + 0.02 local overdraft = math.abs(self.balance) local overdraft_payment = (overdraft*overdraft_interest)/365 self.acc_overdraft = self.acc_overdraft + overdraft_payment end local hosp = self.world.hospitals[1] hosp.receptionist_count = 0 for _, staff in ipairs(self.staff) do if staff.humanoid_class == "Receptionist" then hosp.receptionist_count = hosp.receptionist_count + 1 end end -- check if we still have to announce VIP visit if self.announce_vip > 0 then -- check if the VIP is in the building yet for _, e in ipairs(self.world.entities) do if e.humanoid_class == "VIP" and e.announced == false then if self:isInHospital(e.tile_x, e.tile_y) and self:isPlayerHospital() then -- play VIP arrival sound and show tooltips e:announce() e.announced = true self.announce_vip = self.announce_vip - 1 end end end end -- Countdown for boiler breakdowns if self.heating_broke then self.boiler_countdown = self.boiler_countdown - 1 if self.boiler_countdown == 0 then self:boilerFixed() end end -- Is the boiler working today? local breakdown = math.random(1, 240) if breakdown == 1 and not self.heating_broke and self.boiler_can_break and self.world.object_counts.radiator > 0 then if tonumber(self.world.map.level_number) then if self.world.map.level_number == 1 and (self.world:date() >= Date(1,6)) then self:boilerBreakdown() elseif self.world.map.level_number > 1 then self:boilerBreakdown() end else self:boilerBreakdown() end end -- Calculate heating cost daily. Divide the monthly cost by the number of days in that month local radiators = self.world.object_counts.radiator local heating_costs = (((self.radiator_heat * 10) * radiators) * 7.50) / self.world:date():lastDayOfMonth() self.acc_heating = self.acc_heating + heating_costs if self:isPlayerHospital() then dailyUpdateRatholes(self) end end -- Called at the end of each month. function Hospital:onEndMonth() -- Spend wages local wages = 0 local current_month = self.world:date():monthOfYear() for _, staff in ipairs(self.staff) do wages = wages + staff.profile.wage end if wages ~= 0 then self:spendMoney(wages, _S.transactions.wages) end -- Pay heating costs if math.round(self.acc_heating) > 0 then self:spendMoney(math.round(self.acc_heating), _S.transactions.heating) self.acc_heating = 0 end -- how is the bank balance if self:isPlayerHospital() then if self.balance < 1000 and not self.cash_msg then self:cashLow() elseif self.balance > 6000 and self.loan > 0 and not self.cash_ms then self.world.ui.adviser:say(_A.warnings.pay_back_loan) end self.cash_msg = true end -- Pay interest on loans if math.round(self.acc_loan_interest) > 0 then self:spendMoney(math.round(self.acc_loan_interest), _S.transactions.loan_interest) self.acc_loan_interest = 0 end -- Pay overdraft charges if math.round(self.acc_overdraft) > 0 then self:spendMoney(math.round(self.acc_overdraft), _S.transactions.overdraft) self.acc_overdraft = 0 end -- Pay research costs if math.round(self.acc_research_cost) > 0 then self:spendMoney(math.round(self.acc_research_cost), _S.transactions.research) self.acc_research_cost = 0 end -- add to score each month -- rate varies on some performance factors i.e. reputation above 500 increases the score -- and the number of deaths will reduce the score. local sal_inc = self.salary_incr / 10 local sal_mult = (self.reputation - 500) / (self.num_deaths + 1) -- added 1 so that you don't divide by 0 local month_incr = sal_inc + sal_mult -- To ensure that you can't receive less than 50 or -- more than 300 per month if month_incr < self.sal_min then month_incr = self.sal_min elseif month_incr > self.salary_incr then month_incr = self.salary_incr end self.player_salary = self.player_salary + math.ceil(month_incr) -- TODO: do you get interest on the balance owed? for i, company in ipairs(self.insurance_balance) do -- Get the amount that is about to be paid to the player local payout_amount = company[3] if payout_amount > 0 then local str = _S.transactions.insurance_colon .. " " .. self.insurance[i] self:receiveMoney(payout_amount, str) end -- Shift the amounts to the left table.remove(company, 3) table.insert(company, 1, 0) -- The new month have no payments yet end -- Check for equipment getting available self.research:checkAutomaticDiscovery(self.world:date():monthOfGame()) -- Add some interesting statistics. self.statistics[self.world:date():monthOfGame() + 1] = { money_in = self.money_in, money_out = self.money_out, wages = wages, balance = self.balance, visitors = self.num_visitors, cures = self.num_cured, deaths = self.num_deaths, reputation = self.reputation, } self.money_in = 0 self.money_out = 0 -- make players aware of the need for a receptionist and desk. if (self:isPlayerHospital() and not self:hasStaffedDesk()) and self.world:date():year() == 1 then if self.receptionist_count ~= 0 and current_month > 2 and not self.receptionist_msg then self.world.ui.adviser:say(_A.warnings.no_desk_6) self.receptionist_msg = true elseif self.receptionist_count == 0 and current_month > 2 and self.world.object_counts["reception_desk"] ~= 0 then self.world.ui.adviser:say(_A.warnings.no_desk_7) -- self.receptionist_msg = true elseif current_month == 3 then self.world.ui.adviser:say(_A.warnings.no_desk, true) elseif current_month == 8 then self.world.ui.adviser:say(_A.warnings.no_desk_1, true) elseif current_month == 11 then if self.visitors == 0 then self.world.ui.adviser:say(_A.warnings.no_desk_2, true) else self.world.ui.adviser:say(_A.warnings.no_desk_3, true) end end end end --! Returns whether this hospital is controlled by a real person or not. function Hospital:isPlayerHospital() return self == self.world:getLocalPlayerHospital() end --! Does the hospital have a working reception? --!return (bool) Whether there is a working reception in the hospital. function Hospital:hasStaffedDesk() for _, desk in ipairs(self:findReceptionDesks()) do if desk.receptionist or desk.reserved_for then return true end end return false end --! Collect the reception desks in the hospital. --!return (list) The reception desks in the hospital. function Hospital:findReceptionDesks() local reception_desks = {} for _, obj_list in pairs(self.world.objects) do for _, obj in ipairs(obj_list) do if obj.object_type.id == "reception_desk" then reception_desks[#reception_desks + 1] = obj end end end return reception_desks end --! Called at the end of each year function Hospital:onEndYear() self.sodas_sold = 0 self.num_vips_ty = 0 self.num_deaths_this_year = 0 self:checkReputation() -- On third year of level 3 there is the large increase to salary -- this will replicate that. I have still to check other levels above 5 to -- see if there are other large increases. -- TODO Hall of fame and shame if self.world:date():year() == 3 and self.world.map.level_number == 3 then -- adds the extra to salary in level 3 year 3 self.player_salary = self.player_salary + math.random(8000,20000) end end -- Creates complete emergency with patients, what disease they have, what's needed -- to cure them and the fax. function Hospital:createEmergency(emergency) local created_one = false local random_disease = self.world.available_diseases[math.random(1, #self.world.available_diseases)] local disease = TheApp.diseases[random_disease.id] local number = math.random(2, disease.emergency_number) if self:getHeliportSpawnPosition() and self:hasStaffedDesk() then if not emergency then -- Create a random emergency if parameters are not specified already. emergency = { disease = disease, victims = number, bonus = 1000, percentage = 0.75, killed_emergency_patients = 0, cured_emergency_patients = 0, } end self.emergency = emergency -- The last room in the list of treatment rooms is considered when checking for availability. -- It works for all original diseases, but if we introduce new multiple room diseases it might break. -- TODO: Make it work for all kinds of lists of treatment rooms. -- TODO: Change to make use of Hospital:checkDiseaseRequirements local no_rooms = #emergency.disease.treatment_rooms local room_name, required_staff, staff_name = self.world:getRoomNameAndRequiredStaffName(emergency.disease.treatment_rooms[no_rooms]) local staff_available = self:hasStaffOfCategory(required_staff) -- Check so that all rooms in the list are available if self:hasRoomOfType(emergency.disease.treatment_rooms[no_rooms]) then room_name = nil end local casebook = self.disease_casebook[random_disease.id] local added_info = casebook.drug and _S.fax.emergency.cure_possible_drug_name_efficiency:format(emergency.disease.name, casebook.cure_effectiveness) or _S.fax.emergency.cure_possible if room_name then if staff_available then added_info = _S.fax.emergency.cure_not_possible_build:format(room_name) .. "." else added_info = _S.fax.emergency.cure_not_possible_build_and_employ:format(room_name, staff_name) .. "." end elseif not staff_available then added_info = _S.fax.emergency.cure_not_possible_employ:format(staff_name) .. "." end local one_or_many_victims_msg if emergency.victims == 1 then one_or_many_victims_msg = _S.fax.emergency.num_disease_singular:format(emergency.disease.name) else one_or_many_victims_msg = _S.fax.emergency.num_disease:format(emergency.victims, emergency.disease.name) end local message = { {text = _S.fax.emergency.location:format(_S.fax.emergency.locations[math.random(1,9)])}, {text = one_or_many_victims_msg }, {text = added_info}, {text = self.world.free_build_mode and _S.fax.emergency.free_build or _S.fax.emergency.bonus:format(emergency.bonus*emergency.victims)}, choices = { {text = _S.fax.emergency.choices.accept, choice = "accept_emergency"}, {text = _S.fax.emergency.choices.refuse, choice = "refuse_emergency"}, }, } self.world.ui.bottom_panel:queueMessage("emergency", message, nil, Date.hoursPerDay() * 16, 2) -- automatically refuse after 16 days created_one = true end return created_one end -- Called when the timer runs out during an emergency or when all emergency patients are cured or dead. function Hospital:resolveEmergency() local emer = self.emergency local rescued_patients = emer.cured_emergency_patients for _, patient in ipairs(self.emergency_patients) do if patient and not patient.cured and not patient.dead and not patient:getRoom() then patient:die() end end local total = emer.victims local max_bonus = emer.bonus * total local emergency_success = rescued_patients/total >= emer.percentage local earned = 0 if emergency_success then earned = emer.bonus * rescued_patients end local message = { {text = _S.fax.emergency_result.saved_people :format(rescued_patients, total)}, {text = self.world.free_build_mode and "" or _S.fax.emergency_result.earned_money:format(max_bonus, earned)}, choices = { {text = _S.fax.emergency_result.close_text, choice = "close"}, }, } self.world.ui.bottom_panel:queueMessage("report", message, nil, 24*25, 1) if emergency_success then -- Reputation increased self:changeReputation("emergency_success", emer.disease) self:receiveMoney(earned, _S.transactions.emergency_bonus) else -- Too few rescued, reputation hit self:changeReputation("emergency_failed", emer.disease) end --check if there's a VIP in the building, and if there is then let him know the outcome for _, e in ipairs(self.world.entities) do if class.is(e, Vip) then e:evaluateEmergency(emergency_success) end end self.world:nextEmergency() end --! Determine if all of the patients in the emergency have been cured or killed. --! If they have end the emergency timer. function Hospital:checkEmergencyOver() local killed = self.emergency.killed_emergency_patients local cured = self.emergency.cured_emergency_patients if killed + cured >= self.emergency.victims then local window = self.world.ui:getWindow(UIWatch) if window then window:onCountdownEnd() end end end -- Creates VIP and sends a FAX to query the user. function Hospital:createVip() local vipName = _S.vip_names[math.random(1,10)] local message = { {text = _S.fax.vip_visit_query.vip_name:format(vipName)}, choices = {{text = _S.fax.vip_visit_query.choices.invite, choice = "accept_vip", additionalInfo = {name=vipName}}, {text = _S.fax.vip_visit_query.choices.refuse, choice = "refuse_vip", additionalInfo = {name=vipName}}} } -- auto-refuse after 20 days self.world.ui.bottom_panel:queueMessage("personality", message, nil, 24*20, 2) end --[[ Creates a new epidemic by creating a new contagious patient with a random disease - this is NOT typically how epidemics are started (mainly for cheat use) see @Hospital:determineIfContagious() to see how epidemics are typically started]] function Hospital:spawnContagiousPatient() --[[ Gets the available non-visual disease in the current world @return non_visuals (table) table of available non-visual diseases]] local function get_avaliable_contagious_diseases() local contagious = {} for _, disease in ipairs(self.world.available_diseases) do if disease.contagious then contagious[#contagious + 1] = disease end end return contagious end if self:hasStaffedDesk() then local patient = self.world:newEntity("Patient", 2) local contagious_diseases = get_avaliable_contagious_diseases() if #contagious_diseases > 0 then local disease = contagious_diseases[math.random(1,#contagious_diseases)] patient:setDisease(disease) --Move the first patient closer (FOR TESTING ONLY) local x,y = self:getHeliportSpawnPosition() patient:setTile(x,y) patient:setHospital(self) self:addToEpidemic(patient) else print("Cannot create epidemic - no contagious diseases available") end else print("Cannot create epidemic - no staffed reception desk") end end function Hospital:countEpidemics() -- Count the current epidemic if it exists local epidemic_count = self.epidemic and 1 or 0 epidemic_count = epidemic_count + #self.future_epidemics_pool return epidemic_count end --[[ Make the active epidemic (if exists) and any future epidemics tick. If there is no current epidemic determines if any epidemic in the pool of future epidemics can become the active one. Also removes any epidemics from the future pool which have no infected patients and thus, will have no effect on the hospital. ]] function Hospital:manageEpidemics() --[[ Can the future epidemic be revealed to the player @param future_epidemic (Epidemic) the epidemic to attempt to reveal @return true if can be revealed false otherwise (boolean) ]] local function can_be_revealed(epidemic) return not self.world.ui:getWindow(UIWatch) and not self.epidemic and epidemic.ready_to_reveal end local current_epidemic = self.epidemic if(current_epidemic) then current_epidemic:tick() end if self.future_epidemics_pool then for i, future_epidemic in ipairs(self.future_epidemics_pool) do if future_epidemic:hasNoInfectedPatients() then table.remove(self.future_epidemics_pool,i) elseif can_be_revealed(future_epidemic) then self.epidemic = future_epidemic self.epidemic:revealEpidemic() table.remove(self.future_epidemics_pool,i) else future_epidemic:tick() end end end end --[[ Determines if a patient is contagious and then attempts to add them the appropriate epidemic if so. @param patient (Patient) patient to determine if contagious]] function Hospital:determineIfContagious(patient) if patient.is_emergency or not patient.disease.contagious then return false end -- ContRate treated like a percentage with ContRate% of patients with -- a disease having the contagious strain local level_config = self.world.map.level_config local disease = patient.disease local contRate = level_config.expertise[disease.expertise_id].ContRate or 0 -- The patient is potentially contagious as we do not yet know if there -- is a suitable epidemic which they can belong to local potentially_contagious = contRate > 0 and (math.random(1,contRate) == contRate) -- The patient isn't contagious if these conditions aren't passed local reduce_months = level_config.ReduceContMonths or 14 local reduce_people = level_config.ReduceContPeepCount or 20 local date_in_months = self.world:date():monthOfGame() if potentially_contagious and date_in_months > reduce_months and self.num_visitors > reduce_people then self:addToEpidemic(patient) end end --[[ Determines if there is a suitable epidemic the contagious patient can belong to and adds them to it if possible. N.B. a patient isn't actually contagious until they belong to an epidemic. So if it isn't possible to add a patient to an epidemic they are just treated as a normal patient. @param patient (Patient) patient to attempt to add to an epidemic ]] function Hospital:addToEpidemic(patient) local epidemic = self.epidemic -- Don't add a new contagious patient if the player is trying to cover up -- an existing epidemic - not really fair if epidemic and not epidemic.coverup_in_progress and (patient.disease == epidemic.disease) then epidemic:addContagiousPatient(patient) elseif self.future_epidemics_pool and not (epidemic and epidemic.coverup_in_progress) then local added = false for _, future_epidemic in ipairs(self.future_epidemics_pool) do if future_epidemic.disease == patient.disease then future_epidemic:addContagiousPatient(patient) added = true break end end if not added then -- Make a new epidemic as one doesn't exist with this disease, but only if -- we haven't reach the concurrent epidemic limit if self:countEpidemics() < self.concurrent_epidemic_limit then local new_epidemic = Epidemic(self, patient) self.future_epidemics_pool[#self.future_epidemics_pool + 1] = new_epidemic end end end end function Hospital:spawnPatient() self.world:spawnPatient(self) end function Hospital:removeDebugPatient(patient) for i, p in ipairs(self.debug_patients) do if p == patient then table.remove(self.debug_patients, i) return end end end local debug_n function Hospital:getDebugPatient() if not debug_n or debug_n >= #self.debug_patients then debug_n = 1 else debug_n = debug_n + 1 end return self.debug_patients[debug_n] end --[[ Returns how much a given object currently costs to purchase. The cost may be affected by research progress. !param name (string) The name (id) of the object to investigate. ]] function Hospital:getObjectBuildCost(name) -- Everything is free in free build mode. if self.world.free_build_mode then return 0 end local progress = self.research.research_progress local cfg_objects = self.world.map.level_config.objects local obj_def = TheApp.objects[name] -- Get how much this item costs at the start of the level. local obj_cost = cfg_objects[obj_def.thob].StartCost -- Some objects might have got their cost reduced by research. if progress[obj_def] then obj_cost = progress[obj_def].cost end return obj_cost end --[[ Lowers the player's money by the given amount and logs the transaction. !param amount (integer) The (positive) amount to spend. !param reason (string) A string that shows what happened. Should be one of the strings in _S.transactions. !param changeValue (integer) The (positive) amount the hospital value should be increased ]] function Hospital:spendMoney(amount, reason, changeValue) if not self.world.free_build_mode then self.balance = self.balance - amount self:logTransaction({spend = amount, desc = reason}) self.money_out = self.money_out + amount if changeValue then self.value = self.value + changeValue end end end --[[ Increases the player's money by the given amount and logs the transaction. !param amount (integer) The (positive) amount to receive. !param reason (string) A string that tells what happened. Should be one of the strings in _S.transactions. !param changeValue (integer) The (positive) amount the hospital value should be decreased ]] function Hospital:receiveMoney(amount, reason, changeValue) if not self.world.free_build_mode then self.balance = self.balance + amount self:logTransaction({receive = amount, desc = reason}) self.money_in = self.money_in + amount if changeValue then self.value = self.value - changeValue end end end --[[ Determines how much the player should receive after a patient is treated in a room. !param patient (Patient) The patient that just got treated. ]] function Hospital:receiveMoneyForTreatment(patient) if not self.world.free_build_mode then local disease_id = patient:getTreatmentDiseaseId() if disease_id == nil then return end local casebook = self.disease_casebook[disease_id] local reason if casebook.pseudo then reason = _S.transactions.treat_colon .. " " .. casebook.disease.name else reason = _S.transactions.cure_colon .. " " .. casebook.disease.name end local amount = self:getTreatmentPrice(disease_id) -- 25% of the payments now go through insurance if patient.insurance_company then self:addInsuranceMoney(patient.insurance_company, amount) else -- patient is paying normally (but still, he could feel like it's -- under- or over-priced and it could impact happiness and reputation) self:computePriceLevelImpact(patient, casebook) self:receiveMoney(amount, reason) end casebook.money_earned = casebook.money_earned + amount patient.world:newFloatingDollarSign(patient, amount) end end --! Sell a soda to a patient. --!param patient (patient) The patient buying the soda. function Hospital:sellSodaToPatient(patient) self:receiveMoneyForProduct(patient, 20, _S.transactions.drinks) self.sodas_sold = self.sodas_sold + 1 end --! Function to determine the price for a treatment, modified by reputation and percentage -- Treatment charge should never be less than the starting price if reputation falls below 500 function Hospital:getTreatmentPrice(disease) local reputation = self.disease_casebook[disease].reputation or self.reputation local percentage = self.disease_casebook[disease].price local raw_price = self.disease_casebook[disease].disease.cure_price if reputation >= 500 then return math.ceil(raw_price * (reputation / 500) * percentage) else return math.ceil(raw_price * percentage) end end function Hospital:addInsuranceMoney(company, amount) local old_balance = self.insurance_balance[company][1] self.insurance_balance[company][1] = old_balance + amount end function Hospital:receiveMoneyForProduct(patient, amount, reason) patient.world:newFloatingDollarSign(patient, amount) self:receiveMoney(amount, reason) end --! Pay drug if drug has been purchased to treat a patient. --!param disease_id Disease that was treated. function Hospital:paySupplierForDrug(disease_id) local drug_amount = self.disease_casebook[disease_id].drug_cost or 0 if drug_amount ~= 0 then local str = _S.drug_companies[math.random(1, 5)] self:spendMoney(drug_amount, _S.transactions.drug_cost .. ": " .. str) end end --[[ Add a transaction to the hospital's transaction log. !param transaction (table) A table containing a string field called `desc`, and at least one of the following integer fields: `spend`, `receive`. ]] function Hospital:logTransaction(transaction) transaction.balance = self.balance transaction.day = self.world:date():dayOfMonth() transaction.month = self.world:date():monthOfYear() while #self.transactions > 20 do self.transactions[#self.transactions] = nil end table.insert(self.transactions, 1, transaction) end --! Initialize hospital staff from the level config. function Hospital:initStaff() local level_config = self.world.map.level_config if level_config.start_staff then for _, conf in ipairs(level_config.start_staff) do local profile local skill = 0 local added_staff = true if conf.Skill then skill = conf.Skill / 100 end if conf.Nurse == 1 then profile = StaffProfile(self.world, "Nurse", _S.staff_class["nurse"]) profile:init(skill) elseif conf.Receptionist == 1 then profile = StaffProfile(self.world, "Receptionist", _S.staff_class["receptionist"]) profile:init(skill) elseif conf.Handyman == 1 then profile = StaffProfile(self.world, "Handyman", _S.staff_class["handyman"]) profile:init(skill) elseif conf.Doctor == 1 then profile = StaffProfile(self.world, "Doctor", _S.staff_class["doctor"]) local shrink = 0 local rsch = 0 local surg = 0 local jr, cons if conf.Shrink == 1 then shrink = 1 end if conf.Surgeon == 1 then surg = 1 end if conf.Researcher == 1 then rsch = 1 end if conf.Junior == 1 then jr = 1 elseif conf.Consultant == 1 then cons = 1 end profile:initDoctor(shrink,surg,rsch,jr,cons,skill) else added_staff = false end if added_staff then local staff = self.world:newEntity(profile.humanoid_class, 2) staff:setProfile(profile) -- TODO: Make a somewhat "nicer" placing algorithm. staff:setTile(self.world.map.th:getCameraTile(1)) staff:onPlaceInCorridor() self.staff[#self.staff + 1] = staff staff:setHospital(self) end end end end function Hospital:addStaff(staff) self.staff[#self.staff + 1] = staff -- Cost of hiring staff: self:spendMoney(staff.profile.wage, _S.transactions.hire_staff .. ": " .. staff.profile.name) self:notifyOfStaffChange(staff) end function Hospital:addPatient(patient) self.patients[#self.patients + 1] = patient -- Add to the hospital's visitor count self.num_visitors = self.num_visitors + 1 self.num_visitors_ty = self.num_visitors_ty + 1 -- Decide if the patient belongs in an epidemic self:determineIfContagious(patient) end function Hospital:humanoidDeath(humanoid) self.num_deaths = self.num_deaths + 1 self.num_deaths_this_year = self.num_deaths_this_year + 1 self:changeReputation("death", humanoid.disease) self:updatePercentages() end --! Checks if the hospital employs staff of a given category. --!param category (string) A humanoid_class or one of the specialists, i.e. --! "Doctor", "Nurse", "Handyman", "Receptionist", "Psychiatrist", --! "Surgeon", "Researcher" or "Consultant" --! returns false if none, else number of that type employed function Hospital:hasStaffOfCategory(category) local result = false for _, staff in ipairs(self.staff) do if staff.humanoid_class == category then result = (result or 0) + 1 elseif staff.humanoid_class == "Doctor" then if (category == "Psychiatrist" and staff.profile.is_psychiatrist >= 1.0) or (category == "Surgeon" and staff.profile.is_surgeon >= 1.0) or (category == "Researcher" and staff.profile.is_researcher >= 1.0) or (category == "Consultant" and staff.profile.is_consultant) then result = (result or 0) + 1 end end end return result end --! Checks if the hospital has a room of a given type. --!param type (string) A room_info.id, e.g. "ward". --! Returns false if none, else number of that type found function Hospital:hasRoomOfType(type) -- Check how many rooms there are. local result = false for _, room in pairs(self.world.rooms) do if room.hospital == self and room.room_info.id == type and room.is_active then result = (result or 0) + 1 end end return result end --! Remove the first entry with a given value from a table. --! Only works reliably for lists. --!param t Table to search for the value, and update. --!param value Value to search and remove. --!return Whether the value was removed. local function RemoveByValue(t, value) for i, v in ipairs(t) do if v == value then table.remove(t, i) return true end end return false end --! Remove a staff member from the hospital staff. --!param staff (Staff) Staff member to remove. function Hospital:removeStaff(staff) RemoveByValue(self.staff, staff) -- update all messages for waiting patients self:notifyOfStaffChange(staff) end --! Remove a patient from the hospital. --!param patient (Patient) Patient to remove. function Hospital:removePatient(patient) RemoveByValue(self.patients, patient) end -- TODO: This should depend on difficulty and level local reputation_changes = { ["cured"] = 1, -- a patient was successfully treated ["death"] = -4, -- a patient died due to bad treatment or waiting too long ["kicked"] = -3, -- firing a staff member OR sending a patient home ["emergency_success"] = 15, ["emergency_failed"] = -20, ["over_priced"] = -2, ["under_priced"] = 1, } --! Normally reputation is changed based on a reason, and the affected --! disease also has its own reputation meter. --!param reason (string) The reason for changing reputation, for example "cured" or "death". --!param disease The disease, if any, that should be affected. --!param valueChange (integer) In some cases, for example at year end, the amount varies a lot. -- Then it is specified here. function Hospital:changeReputation(reason, disease, valueChange) local amount if reason == "autopsy_discovered" then local rep_hit_perc = self.world.map.level_config.gbv.AutopsyRepHitPercent amount = rep_hit_perc and math.floor(-self.reputation * rep_hit_perc / 100) or -70 elseif valueChange then amount = valueChange else amount = reputation_changes[reason] end if self:isReputationChangeAllowed(amount) then self.reputation = self.reputation + amount end if disease then local casebook = self.disease_casebook[disease.id] casebook.reputation = casebook.reputation + amount end if self.reputation < self.reputation_min then self.reputation = self.reputation_min elseif self.reputation > self.reputation_max then self.reputation = self.reputation_max end -- Check if criteria for trophy is still met if self.reputation_above_threshold then self:checkReputation() end end --! Check whether the reputation is still above the treshold. function Hospital:checkReputation() local level_config = self.world.map.level_config if level_config.awards_trophies then local min_repuration = level_config.awards_trophies.Reputation self.reputation_above_threshold = min_repuration < self.reputation return end self.reputation_above_threshold = false end --! Decide whether a reputation change is effective or not. As we approach 1000, --! a gain is less likely. As we approach 0, a loss is less likely. --! Under 500, a gain is always effective. Over 500, a loss is always effective. --!param amount (int): The amount of reputation change. function Hospital:isReputationChangeAllowed(amount) if (amount > 0 and self.reputation <= 500) or (amount < 0 and self.reputation >= 500) or (amount == 0) then return true else return math.random() <= self:getReputationChangeLikelihood() end end --! Compute the likelihood for a reputation change to be effective. --! Likelihood gets smaller as hospital reputation gets closer to extreme values. --!return (float) Likelihood of a reputation change. function Hospital:getReputationChangeLikelihood() -- The result follows a quadratic function, for a curved and smooth evolution. -- If reputation == 500, the result is 100%. -- Between [380-720], the result is still over 80%. -- At 100 or 900, it's under 40%. -- At 0 or 1000, it's 0%. -- -- The a, b and c coefficients have been computed to include points -- (x=0, y=1), (x=500, y=0) and (x=1000, y=1) where x is the current -- reputation and y the likelihood of the reputation change to be -- refused, based a discriminant (aka "delta") == 0 local a = 0.000004008 local b = 0.004008 local c = 1 local x = self.reputation -- The result is "reversed" for more readability return 1 - (a * x * x - b * x + c) end --! Update the 'cured' counts of the hospital. --!param patient Patient that was cured. function Hospital:updateCuredCounts(patient) if not patient.is_debug then self:changeReputation("cured", patient.disease) end if self.num_cured < 1 then self.world.ui.adviser:say(_A.information.first_cure) end self.num_cured = self.num_cured + 1 self.num_cured_ty = self.num_cured_ty + 1 local casebook = self.disease_casebook[patient.disease.id] casebook.recoveries = casebook.recoveries + 1 if patient.is_emergency then self.emergency.cured_emergency_patients = self.emergency.cured_emergency_patients + 1 end end --! Update the 'not cured' counts of the hospital. --!param patient Patient that was not cured. --!param reason (string) the reason why the patient is not cured. --! -"kicked": Patient goes home early (manually sent, no treatment room, etc). --! -"over_priced": Patient considers the price too high. function Hospital:updateNotCuredCounts(patient, reason) if patient.is_debug then return end self:changeReputation(reason, patient.disease) self.not_cured = self.not_cured + 1 self.not_cured_ty = self.not_cured_ty + 1 if reason == "kicked" then local casebook = self.disease_casebook[patient.disease.id] casebook.turned_away = casebook.turned_away + 1 end end function Hospital:updatePercentages() local killed = self.num_deaths / (self.num_cured + self.num_deaths) * 100 self.percentage_killed = math.round(killed) local cured = self.num_cured / (self.num_cured + self.not_cured + self.num_deaths) * 100 self.percentage_cured = math.round(cured) end --! Compute average of an attribute for all patients in the hospital. --!param attribute (str) Name of the attribute. --!param default_value Value to return if there are no patients. --!return Average value of the attribute for all hospital patients, or the default value. function Hospital:getAveragePatientAttribute(attribute, default_value) local sum = 0 local count = 0 for _, patient in ipairs(self.patients) do local tx, ty = patient.tile_x, patient.tile_y -- Some patients (i.e. Alien) may not have the attribute in question, so check for that if tx and ty and self:isInHospital(tx, ty) and patient.attributes[attribute] then sum = sum + patient.attributes[attribute] count = count + 1 end end if count == 0 then return default_value else return sum / count end end --! Compute average of an attribute for all staff in the hospital. --!param attribute (str) Name of the attribute. --!param default_value Value to return if there is no staff. --!return Average value of the attribute for all staff, or the default value. function Hospital:getAverageStaffAttribute(attribute, default_value) local sum = 0 local count = 0 for _, staff in ipairs(self.staff) do sum = sum + staff.attributes[attribute] count = count + 1 end if count == 0 then return default_value else return sum / count end end --! Checks if the requirements for the given disease are met in the hospital and returns the ones missing. --!param disease (String) The disease to check the requirements for --! returns false if all requirements are met, else a table in the form --! { rooms = {[room1], [room2], ...}, staff = {[humanoid_class] = [amount_needed] or nil} } --! i.e. a list of rooms (ordered the same as disease.treatment_rooms), and a set of humanoid_classes with --! the needed amount of that class as the value function Hospital:checkDiseaseRequirements(disease) -- Copy rooms list from disease but leave out the ones that are present in the hospital -- Get required staff from all rooms required by the disease, if not already present in hospital local rooms = {} local staff = {} local any = false for _, room_id in ipairs(self.world.available_diseases[disease].treatment_rooms) do local found = self:hasRoomOfType(room_id) if not found then rooms[#rooms + 1] = room_id any = true end -- Get staff for room for staff_class, amount in pairs(TheApp.rooms[room_id].required_staff) do local available = self:hasStaffOfCategory(staff_class) or 0 if available < amount then -- Don't add up the staff requirements of different rooms, but take the maximum staff[staff_class] = math.max(staff[staff_class] or 0, amount - available) any = true end end end -- False if no rooms and no staff were added return any and {rooms = rooms, staff = staff} end --! Get the set of walls around a tile position. --!param x (int) X position of the queried tile. --!param y (int) Y position of the queried tile. --!return (table {wall, parcel}) The walls around the given position. function Hospital:getWallsAround(x, y) local map = self.world.map local th = map.th local _, nw, ww local walls = {} -- List of {wall="north"/"west"/"south"/"east", parcel} local flags = th:getCellFlags(x, y) _, nw, ww = th:getCell(x, y) -- floor, north wall, west wall if ww ~= 0 then walls[#walls + 1] = {wall = "west", parcel = flags.parcelId} end if nw ~= 0 then walls[#walls + 1] = {wall = "north", parcel = flags.parcelId} end if x ~= map.width then _, _, ww = th:getCell(x + 1, y) if ww ~= 0 then walls[#walls + 1] = {wall = "east", parcel = flags.parcelId} end end if y ~= map.height then _, nw, _ = th:getCell(x, y + 1) if nw ~= 0 then walls[#walls + 1] = {wall = "south", parcel = flags.parcelId} end end return walls end --! Test for the given position to be inside the given rectangle. --!param x (int) X position to test. --!param y (int) Y position to test. --!param rect (table x, y, width, height) Rectangle to check against. --!return (bool) Whether the position is inside the rectangle. local function isInside(x, y, rect) return x >= rect.x and x < rect.x + rect.width and y >= rect.y and y < rect.y + rect.height end --! Find all ratholes that match the `to_match` criteria. --!param holes (list ratholes) Currently existing holes. --!param to_match (table) For each direction a rectangle with matching tile positions. --!return (list) Matching ratholes. local function findMatchingRatholes(holes, to_match) local matched = {} for _, hole in ipairs(holes) do if isInside(hole.x, hole.y, to_match[hole.wall]) then table.insert(matched, hole) end end return matched end --! Remove the ratholes that use the walls of the provided room. --!param room (Room) Room being de-activated. function Hospital:removeRatholesAroundRoom(room) local above_rect = {x = room.x, width = room.width, y = room.y - 1, height = 1} local below_rect = {x = room.x, width = room.width, y = room.y +room.height, height = 1} local left_rect = {x = room.x - 1, width = 1, y = room.y, height = room.height} local right_rect = {x = room.x + room.width, width = 1, y = room.y, height = room.height} local to_delete = {east = left_rect, west = right_rect, south = above_rect, north = below_rect} local remove_holes = findMatchingRatholes(self.ratholes, to_delete) for _, hole in ipairs(remove_holes) do self:removeRathole(hole) end end -- Add a rathole to the room. --!param x (int) X position of the tile containing the rathole. --!param y (int) Y position of the tile containing the rathole. --!param wall (string) Wall containing the hole (north, west, south, east) --!param parcel (int) Parcel number of the xy position. function Hospital:addRathole(x, y, wall, parcel) for _, rathole in ipairs(self.ratholes) do if rathole.x == x and rathole.y == y and rathole.wall == wall then return end end local hole = {x = x, y = y, wall = wall, parcel = parcel} if wall == "north" or wall == "west" then -- Only add a rat-hole graphics object for the visible holes. hole["object"] = self.world:newObject("rathole", hole.x, hole.y, hole.wall) end table.insert(self.ratholes, hole) end --! Remove the provided rathole. --!param hole (table{x, y, wall, optional object}) Hole to remove. function Hospital:removeRathole(hole) for i, rathole in ipairs(self.ratholes) do if rathole.x == hole.x and rathole.y == hole.y and rathole.wall == hole.wall then table.remove(self.ratholes, i) if rathole.object then self.world:destroyEntity(rathole.object) end break end end end --! Remove any rathole from the given position. --!param x X position of the tile that should not have ratholes. --!param y Y position of the tile that should not have ratholes. function Hospital:removeRatholeXY(x, y) for i = #self.ratholes, 1, -1 do local rathole = self.ratholes[i] if rathole.x == x and rathole.y == y then table.remove(self.ratholes, i) if rathole.object then self.world:destroyEntity(rathole.object) end end end end class "AIHospital" (Hospital) ---@type AIHospital local AIHospital = _G["AIHospital"] function AIHospital:AIHospital(competitor, ...) self:Hospital(...) if _S.competitor_names[competitor] then self.name = _S.competitor_names[competitor] else self.name = "NONAME" end self.is_in_world = false end function AIHospital:spawnPatient() -- TODO: Simulate patient end function AIHospital:logTransaction() -- AI doesn't need a log of transactions, as it is only used for UI purposes end function Hospital:addHandymanTask(object, taskType, priority, x, y, call) local parcelId = self.world.map.th:getCellFlags(x, y).parcelId local subTable = self:findHandymanTaskSubtable(taskType) table.insert(subTable, {["object"] = object, ["priority"] = priority, ["tile_x"] = x, ["tile_y"] = y, ["parcelId"] = parcelId, ["call"] = call}) end function Hospital:modifyHandymanTaskPriority(taskIndex, newPriority, taskType) if taskIndex ~= -1 then local subTable = self:findHandymanTaskSubtable(taskType) subTable[taskIndex].priority = newPriority end end function Hospital:removeHandymanTask(taskIndex, taskType) if taskIndex ~= -1 then local subTable = self:findHandymanTaskSubtable(taskType) local task = subTable[taskIndex] table.remove(subTable, taskIndex) if task.assignedHandyman then if task.object.ticks ~= true then task.assignedHandyman:interruptHandymanTask() end end end end function Hospital:findHandymanTaskSubtable(taskType) for i = 1, #self.handymanTasks do if self.handymanTasks[i].taskType == taskType then return self.handymanTasks[i].subTable end end table.insert(self.handymanTasks, {["taskType"] = taskType, ["subTable"] = {}}) return self:findHandymanTaskSubtable(taskType) end function Hospital:getTaskObject(taskIndex, taskType) return self:findHandymanTaskSubtable(taskType)[taskIndex] end function Hospital:assignHandymanToTask(handyman, taskIndex, taskType) if taskIndex ~= -1 then local subTable = self:findHandymanTaskSubtable(taskType) if not subTable[taskIndex].assignedHandyman then subTable[taskIndex].assignedHandyman = handyman else local formerHandyman = subTable[taskIndex].assignedHandyman subTable[taskIndex].assignedHandyman = handyman formerHandyman:interruptHandymanTask() end end end function Hospital:searchForHandymanTask(handyman, taskType) local subTable = self:findHandymanTaskSubtable(taskType) --if a distance is smaller than this value stop the search to --save performance local thresholdForStopping = 3 local first, dist, index, priority, multiplier = true, 0, -1, 0, 1 if handyman.profile.is_consultant then multiplier = 0.5 elseif handyman.profile.is_junior then multiplier = 2 end if not handyman.parcelNr then handyman.parcelNr = 0 end for i, v in ipairs(subTable) do local distance = self.world:getPathDistance(v.tile_x, v.tile_y, handyman.tile_x, handyman.tile_y) local canContinue = true if not first and v.priority < priority then canContinue = false end if not v.parcelId then v.parcelId = self.world.map.th:getCellFlags(v.tile_x, v.tile_y).parcelId end if handyman.parcelNr ~= 0 and handyman.parcelNr ~= v.parcelId then canContinue = false end if distance == false then canContinue = false end if canContinue then if v.assignedHandyman then if v.assignedHandyman.fired then v.assignedHandyman:unassignTask() elseif not v.assignedHandyman.hospital then -- This should normally never be the case. If the handyman doesn't belong to a hsopital -- then they should not have any tasks assigned to them however it was previously possible -- We need to tidy up to make sure the task can be reassigned. print("Warning: Orphaned handyman is still assigned a task. Removing.") v.assignedHandyman:unassignTask() else local assignedDistance = self.world:getPathDistance(v.tile_x, v.tile_y, v.assignedHandyman.tile_x, v.assignedHandyman.tile_y) if assignedDistance ~= false then if v.assignedHandyman.profile.is_consultant then assignedDistance = assignedDistance / 2 elseif v.assignedHandyman.profile.is_junior then assignedDistance = assignedDistance * 2 end distance = distance * multiplier if distance + 5 > assignedDistance then canContinue = false else distance = distance / multiplier end end end end if canContinue then if first then if distance <= thresholdForStopping then return i end first, dist, index, priority = false, distance, i, v.priority elseif priority < v.priority or distance < dist then if distance < thresholdForStopping then return i end dist, index, priority = distance, i, v.priority end end end end return index end --! Find a handyman task by task type, position, and possibly the used object. --!param x (int) The X coordinate of the position. --!param y (int) The Y coordinate of the position. --!param taskType Type of the task. --!param obj (Object) If specified, the object used for doing the task. --! Since multiple litter objects may exist at the same tile, the object must be given when cleaning. function Hospital:getIndexOfTask(x, y, taskType, obj) local subTable = self:findHandymanTaskSubtable(taskType) for i, v in ipairs(subTable) do if v.tile_x == x and v.tile_y == y and (obj == nil or v.object == obj) then return i end end return -1 end --! Afterload function to initialize the owned plots. function Hospital:initOwnedPlots() self.ownedPlots = {} for _, v in ipairs(self.world.entities) do if v.tile_x and v.tile_y then local parcel = self.world.map.th:getCellFlags(v.tile_x, v.tile_y).parcelId local isAlreadyContained = false for _, v2 in ipairs(self.ownedPlots) do if parcel == v2 then isAlreadyContained = true break end end if isAlreadyContained == false and parcel ~= 0 and self.world.map.th:getPlotOwner(parcel) ~= 0 then table.insert(self.ownedPlots, parcel) end end end end --! Function that returns true if the room for the given disease --! has not been researched yet. --! param disease (string): the disease to be checked. function Hospital:roomNotYetResearched(disease) local req = self:checkDiseaseRequirements(disease) if type(req) == "table" and #req.rooms > 0 then for _, room_id in ipairs(req.rooms) do if not self.discovered_rooms[self.world.available_rooms[room_id]] then return true end end end return false end --! Function that returns true if concentrating research on the disease is possible. --! @param disease (string): the disease to be checked. function Hospital:canConcentrateResearch(disease) local book = self.disease_casebook if not book[disease].pseudo and self:roomNotYetResearched(disease) then return true end if book[disease].drug then return book[disease].cure_effectiveness < 100 end local room if book[disease].pseudo then room = book[disease].disease.id:sub(6) else room = book[disease].disease.treatment_rooms[#book[disease].disease.treatment_rooms] end local research_progress = self.research.research_progress local object_type for obj, _ in pairs(self.world.available_rooms[room].objects_needed) do if self.world.object_types[obj].default_strength then object_type = obj break end end if object_type then local progress = research_progress[self.world.object_types[object_type]] return progress.start_strength < self.world.map.level_config.gbv.MaxObjectStrength end return false end --! Change patient happiness and hospital reputation based on price distortion. --! The patient happiness is adjusted proportionally. The hospital reputation --! can only be affected when the distortion level reaches some threshold. --!param patient (patient) The patient paying the bill. His/her happiness level --! is adjusted. --!param casebook (object) Disease casebook entry. It's used to display the --! localised disease name when Adviser tells the warning message. function Hospital:computePriceLevelImpact(patient, casebook) local price_distortion = patient:getPriceDistortion(casebook) patient:changeAttribute("happiness", -(price_distortion / 2)) if price_distortion < self.under_priced_threshold then if math.random(1, 100) == 1 then self.world.ui.adviser:say(_A.warnings.low_prices:format(casebook.disease.name)) self:changeReputation("under_priced") end elseif price_distortion > self.over_priced_threshold then if math.random(1, 100) == 1 then self.world.ui.adviser:say(_A.warnings.high_prices:format(casebook.disease.name)) self:changeReputation("over_priced") end elseif math.abs(price_distortion) <= 0.15 and math.random(1, 200) == 1 then -- When prices are well adjusted (i.e. abs(price distortion) <= 0.15) self.world.ui.adviser:say(_A.warnings.fair_prices:format(casebook.disease.name)) end end --! Notify patients of a change to hospital staff members --!param staff (Staff) Changed staff member subject of notification function Hospital:notifyOfStaffChange(staff) for _, patient in pairs(self.patients) do patient:notifyOfStaffChange(staff) end end CorsixTH-0.63/CorsixTH/Lua/humanoid_action.lua000066400000000000000000000106041347163623700212520ustar00rootroot00000000000000--[[ Copyright (c) 2016 Albert "Alberth" Hofkamp 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. --]] --! Humanoid action base class. class "HumanoidAction" ---@type HumanoidAction local HumanoidAction = _G["HumanoidAction"] --! Construct a humanoid action (base class constructor). --!param name (str) Name of the action. function HumanoidAction:HumanoidAction(name) assert(type(name) == "string", "Invalid value for parameter 'name'") self.name = name self.count = nil -- 'nil' means 'forever' (until finished), else the number to perform. self.must_happen = false -- If true, action cannot be skipped. self.loop_callback = nil -- Periodic callback to check for termination conditions. self.after_use = nil -- Callback for performing updates afterwards. self.is_leaving = false -- Whether the humanoid is leaving. self.no_truncate = false -- If set, disable shortening the action. end --! Set the number of times the action should happen. --!param count (int or nil) Set to 'nil' if 'forever', else integer count. --!return (action) Returning self, for daisy-chaining. function HumanoidAction:setCount(count) assert(count == nil or type(count) == "number", "Invalid value for parameter 'count'") self.count = count return self end --! Set the 'must happen' flag (that is, action cannot be skipped). --!param must_happen (bool) Whether or not the action must happen. --!return (action) Returning self, for daisy-chaining. function HumanoidAction:setMustHappen(must_happen) assert(type(must_happen) == "boolean", "Invalid value for parameters 'must_happen'") self.must_happen = must_happen return self end --! Set the callback for checking termination conditions. --!param loop_callback (func) Callback function that is called each iteration to check for --! termination conditions. --!return (action) Returning self, for daisy-chaining. function HumanoidAction:setLoopCallback(loop_callback) assert(loop_callback == nil or type(loop_callback) == "function", "Invalid value for parameter 'loop_callback'") self.loop_callback = loop_callback return self end --! Set the callback for performing updates afterwards. --!param after_use (func) Callback function that is called after the action ends. --!return (action) Returning self, for daisy-chaining. function HumanoidAction:setAfterUse(after_use) assert(after_use == nil or type(after_use) == "function", "Invalid value for parameter 'after_use'") self.after_use = after_use return self end --! Set whether the humanoid is leaving. --!param is_leaving (bool) Whether or not the humanoid is leaving. If not specified, value is true. --!return (action) Returning self, for daisy-chaining. function HumanoidAction:setIsLeaving(is_leaving) assert(type(is_leaving) == "boolean", "Invalid value for parameter 'is_leaving'") self.is_leaving = is_leaving return self end --! Do not allow truncating the action. --!return (action) Returning self, for daisy-chaining. function HumanoidAction:disableTruncate() self.no_truncate = true return self end function HumanoidAction:afterLoad(old, new) if old < 112 and new >= 112 then self.is_leaving = not not self.is_leaving self.must_happen = not not self.must_happen self.no_truncate = not not self.no_truncate self.saved_must_happen = not not self.saved_must_happen self.idle_must_happen = not not self.idle_must_happen if self.name == "walk" then self.is_entering = not not self.is_entering end end end CorsixTH-0.63/CorsixTH/Lua/humanoid_actions/000077500000000000000000000000001347163623700207315ustar00rootroot00000000000000CorsixTH-0.63/CorsixTH/Lua/humanoid_actions/answer_call.lua000066400000000000000000000032501347163623700237260ustar00rootroot00000000000000--[[ Copyright (c) 2010 Sam Wong 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. --]] class "AnswerCallAction" (HumanoidAction) ---@type AnswerCallAction local AnswerCallAction = _G["AnswerCallAction"] function AnswerCallAction:AnswerCallAction() self:HumanoidAction("answer_call") end local function action_answer_call_start(action, humanoid) action.must_happen = true CallsDispatcher.onCheckpointCompleted(action, humanoid) if not humanoid.world.dispatcher:answerCall(humanoid) then local room = humanoid:getRoom() if room then humanoid:queueAction(room:createLeaveAction()) end humanoid:queueAction(MeanderAction()) end humanoid:finishAction(action) end return action_answer_call_start CorsixTH-0.63/CorsixTH/Lua/humanoid_actions/call_checkpoint.lua000066400000000000000000000035231347163623700245610ustar00rootroot00000000000000--[[ Copyright (c) 2010 Sam Wong 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. --]] class "CallCheckPointAction" (HumanoidAction) ---@type CallCheckPointAction local CallCheckPointAction = _G["CallCheckPointAction"] function CallCheckPointAction:CallCheckPointAction(call, on_remove) assert(call == nil or (type(call) == "table" and type(call.key) == "string"), "Invalid value for parameter 'call'") assert(type(on_remove) == "function", "Invalid value for parameter 'on_remove'") self:HumanoidAction("call_checkpoint") self.call = call -- The call the humanoid is on (humanoid.on_call) or nil self.on_remove = on_remove -- Interrupt handler to use. end local function action_call_checkpoint_start(action, humanoid) action.must_happen = true CallsDispatcher.onCheckpointCompleted(action.call) humanoid:finishAction(action) end return action_call_checkpoint_start CorsixTH-0.63/CorsixTH/Lua/humanoid_actions/check_watch.lua000066400000000000000000000037131347163623700237030ustar00rootroot00000000000000--[[ Copyright (c) 2011 Mark "Mark.L" Lawlor 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. --]] class "CheckWatchAction" (HumanoidAction) ---@type CheckWatchAction local CheckWatchAction = _G["CheckWatchAction"] function CheckWatchAction:CheckWatchAction() self:HumanoidAction("check_watch") self:setMustHappen(true) end local action_check_watch_end = permanent"action_check_watch_end"( function(humanoid) humanoid:finishAction() end) local function action_check_watch_start(action, humanoid) if math.random(0, 1) == 1 then humanoid.last_move_direction = "east" else humanoid.last_move_direction = "south" end assert(humanoid.check_watch_anim, "Error: watch checking animation for humanoid " .. humanoid.humanoid_class) action.must_happen = true humanoid:setAnimation(humanoid.check_watch_anim, humanoid.last_move_direction == "east" and 0 or 1) humanoid:setTimer(humanoid.world:getAnimLength(humanoid.check_watch_anim), action_check_watch_end) end return action_check_watch_start CorsixTH-0.63/CorsixTH/Lua/humanoid_actions/die.lua000066400000000000000000000303431347163623700222000ustar00rootroot00000000000000--[[ Copyright (c) 2009 Edvin "Lego3" Linge 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. --]] class "DieAction" (HumanoidAction) ---@type DieAction local DieAction = _G["DieAction"] function DieAction:DieAction() self:HumanoidAction("die") end local action_die_tick; action_die_tick = permanent"action_die_tick"( function(humanoid) local action = humanoid:getCurrentAction() local phase = action.phase local mirror = humanoid.last_move_direction == "east" and 0 or 1 if phase == 0 then action.phase = 1 if humanoid.die_anims.extra_east ~= nil then humanoid:setTimer(humanoid.world:getAnimLength(humanoid.die_anims.extra_east), action_die_tick) humanoid:setAnimation(humanoid.die_anims.extra_east, mirror) else action_die_tick(humanoid) end elseif phase == 1 then action.phase = 2 humanoid:setTimer(11, action_die_tick) humanoid:setAnimation(humanoid.die_anims.rise_east, mirror) elseif phase == 2 then -- Female slack tongue head layer is missing from wings animation onwards -- So we change the head to its standard equivalent if humanoid.humanoid_class == "Slack Female Patient" then humanoid:setLayer(0, humanoid.layers[0] - 8) end action.phase = 3 humanoid:setTimer(11, action_die_tick) humanoid:setAnimation(humanoid.die_anims.wings_east, mirror) elseif phase == 3 then action.phase = 4 humanoid:setTimer(15, action_die_tick) humanoid:setAnimation(humanoid.die_anims.hands_east, mirror) elseif phase == 4 then action.phase = 5 humanoid:setTimer(30, action_die_tick) humanoid:setAnimation(humanoid.die_anims.fly_east, mirror) humanoid:setTilePositionSpeed(humanoid.tile_x, humanoid.tile_y, nil, nil, 0, -4) else humanoid:despawn() humanoid.world:destroyEntity(humanoid) end end) local action_die_tick_reaper; action_die_tick_reaper = permanent"action_die_tick_reaper"( function(humanoid) local action = humanoid:getCurrentAction() local mirror = humanoid.last_move_direction == "east" and 0 or 1 local phase = action.phase if phase == 0 then action.phase = 1 if humanoid.die_anims.extra_east ~= nil then humanoid:setTimer(humanoid.world:getAnimLength(humanoid.die_anims.extra_east), action_die_tick_reaper) humanoid:setAnimation(humanoid.die_anims.extra_east, mirror) else action_die_tick_reaper(humanoid) end --1: The patient stays on the ground until phase 5: elseif phase == 1 then action.phase = 2 if humanoid.humanoid_class ~= "Standard Male Patient" then humanoid:setType("Standard Male Patient") end humanoid:setAnimation(humanoid.on_ground_anim, mirror) action_die_tick_reaper(humanoid) --2: Spawn the grim reaper and the lava hole, if no suitable spawn points are found a heaven death will be started: elseif phase == 2 then local holes_orientation local hole_x, hole_y local grim_x, grim_y local grim_use_tile_x, grim_use_tile_y local grim_spawn_idle_direction local mirror_grim = 0 local spawn_scenarios = { {"south", humanoid.tile_x, humanoid.tile_y + 4, 0, 1, "north", 0, -1, {{after_spawn_idle_direction = "east", hole_x_offset = -5, hole_y_offset = 2}, {hole_x_offset = 0, hole_y_offset = 3}} }, {"east", humanoid.tile_x + 4, humanoid.tile_y, 1, 0, "west", -1, 0, {{hole_x_offset = 3, hole_y_offset = 0}} } } --- -- @param spawn_scenario {holes_orientation, find_hole_spawn_x, find_hole_spawn_y, g_use_x_offset, g_use_y_offset, grim_face_hole_dir, mirror_grim, p_use_x_offset, p_use_y_offset, find_grim_spawn_attempts} --- local function tryToUseHellDeathSpawnScenario(spawn_scenario) holes_orientation = spawn_scenario[1] hole_x, hole_y = humanoid.world.pathfinder:findIdleTile(spawn_scenario[2], spawn_scenario[3], 0) if hole_x and humanoid.world:canNonSideObjectBeSpawnedAt(hole_x, hole_y, "gates_to_hell", holes_orientation, 0, 0) then if holes_orientation == "east" then mirror_grim = 1 end grim_use_tile_x = hole_x + spawn_scenario[4] grim_use_tile_y = hole_y + spawn_scenario[5] humanoid.hole_use_tile_x = hole_x + spawn_scenario[7] humanoid.hole_use_tile_y = hole_y + spawn_scenario[8] -- tile can't be in a room if humanoid.world:getRoom(humanoid.hole_use_tile_x, humanoid.hole_use_tile_y) then return false end --Ensure that the lava hole is passable on at least one of its sides to prevent it from blocking 1 tile wide corridors: humanoid.world.map:setCellFlags(hole_x, hole_y, {passable = false}) local hole_has_passable_side = humanoid.world:getPathDistance(grim_use_tile_x, grim_use_tile_y, humanoid.hole_use_tile_x, humanoid.hole_use_tile_y) == 4 humanoid.world.map:setCellFlags(hole_x, hole_y, {passable = true}) if not hole_has_passable_side then return false end --Try to find grim a spawn point which will allow him to walk to his lava hole use tile: local grim_cant_walk_to_use_tile = true for _, find_grim_spawn_attempt in ipairs(spawn_scenario[9]) do grim_spawn_idle_direction = find_grim_spawn_attempt.after_spawn_idle_direction or spawn_scenario[6] grim_x, grim_y = humanoid.world.pathfinder:findIdleTile(hole_x + find_grim_spawn_attempt.hole_x_offset, hole_y + find_grim_spawn_attempt.hole_y_offset, 0) if grim_x and not humanoid.world:getRoom(grim_x, grim_y) then grim_cant_walk_to_use_tile = false break end end -- Else spawn him on it: if grim_cant_walk_to_use_tile then grim_spawn_idle_direction = spawn_scenario[6] grim_x = grim_use_tile_x grim_y = grim_use_tile_y end return true end return false end local usable_scenario_found = false for _, spawn_scenario in ipairs(spawn_scenarios) do if not usable_scenario_found then usable_scenario_found = tryToUseHellDeathSpawnScenario(spawn_scenario) end end if not usable_scenario_found then action_die_tick(humanoid) return end --Spawn the grim reaper and the lava hole: local lava_hole = humanoid.world:newObject("gates_to_hell", hole_x, hole_y, holes_orientation) local grim_reaper = humanoid.world:newEntity("GrimReaper", 1660) local point_dir = {x = grim_x, y = grim_y, direction = grim_spawn_idle_direction} grim_reaper:setNextAction(IdleSpawnAction(1660, point_dir):setCount(40)) --Initialise the grim reaper: grim_reaper:setHospital(humanoid.world:getLocalPlayerHospital()) grim_reaper.lava_hole = lava_hole grim_reaper.lava_hole.orientation = holes_orientation grim_reaper.use_tile_x = grim_use_tile_x grim_reaper.use_tile_y = grim_use_tile_y grim_reaper.mirror = mirror_grim grim_reaper.patient = humanoid humanoid.grim_reaper = grim_reaper action.phase = 3 action_die_tick_reaper(humanoid) --3: The grim reaper walks to his lava hole use tile and then stands idle waiting for phase 6: elseif phase == 3 then action.phase = 4 local grim = humanoid.grim_reaper if grim.tile_x ~= grim.use_tile_x or grim.tile_y ~= grim.use_tile_y then grim:queueAction(WalkAction(grim.use_tile_x, grim.use_tile_y):disableTruncate()) end local loop_callback_wait = --[[persistable:reaper_wait]]function() grim:setAnimation(1002, grim.mirror) action_die_tick_reaper(humanoid) end grim:queueAction(IdleAction():setLoopCallback(loop_callback_wait)) --4: There will be a brief pause before the patient stands up: elseif phase == 4 then action.phase = 5 humanoid:setTimer(20, action_die_tick_reaper) -- 5: The dead patient will now stand up: elseif phase == 5 then action.phase = 6 humanoid:setTimer(humanoid.world:getAnimLength(humanoid.die_anims.rise_hell_east), action_die_tick_reaper) humanoid:setAnimation(humanoid.die_anims.rise_hell_east, mirror) --6: The dead patient will now walk in to the lava hole, falling in as the grim reaper does his "sending patient to hell" animation: elseif phase == 6 then local grim = humanoid.grim_reaper local lava_hole = grim.lava_hole --The grim reaper's final actions: local loop_callback_swipe =--[[persistable:reaper_swipe]]function() grim:setAnimation(1670, grim.mirror) end grim:queueAction(IdleAction():setCount(grim.world:getAnimLength(1670)):setLoopCallback(loop_callback_swipe)) local loop_callback_leave =--[[persistable:reaper_leave]]function() grim:setAnimation(1678, grim.mirror) end grim:queueAction(IdleAction():setCount(grim.world:getAnimLength(1678)):setLoopCallback(loop_callback_leave)) local lava_destroy = --[[persistable:lava_destroy]]function() humanoid.world:destroyEntity(lava_hole) end local loop_callback_destroy =--[[persistable:reaper_destroy]]function() lava_hole.playing_sounds_in_random_sequence = false lava_hole:setTimer(lava_hole.world:getAnimLength(2552), lava_destroy) lava_hole:setAnimation(2552) grim.world:destroyEntity(grim) end grim:queueAction(IdleAction():setLoopCallback(loop_callback_destroy)) --The patient's final actions: humanoid:walkTo(humanoid.hole_use_tile_x, humanoid.hole_use_tile_y, true) local post_walk_into = --[[persistable:walk_into_lava]]function() grim:finishAction() end local use_action = UseObjectAction(lava_hole) use_action.destroy_user_after_use = true use_action.after_walk_in = post_walk_into humanoid:queueAction(use_action) humanoid:finishAction() end end) local function action_die_start(action, humanoid) humanoid:setMoodInfo() -- clear all mood icons local preferred_fall_direction if math.random(0, 1) == 1 then preferred_fall_direction = "east" else preferred_fall_direction = "south" end local anims = humanoid.die_anims assert(anims, "Error: no death animation for humanoid ".. humanoid.humanoid_class) action.must_happen = true -- TODO: Right now the angel version of death is the only possibility -- The Grim Reaper should sometimes also have a go. local fall = anims.fall_east --If this isn't done their bald head will become bloated instead of suddenly having hair: if humanoid.disease.id == "baldness" then humanoid:setLayer(0,2) end local mirror_fall = preferred_fall_direction == "east" and 0 or 1 humanoid.last_move_direction = preferred_fall_direction humanoid:setAnimation(anims.fall_east, mirror_fall) action.phase = 0 local fall_anim_duration = humanoid.world:getAnimLength(fall) if humanoid.humanoid_class == "Chewbacca Patient" then --After 21 ticks the first frame of the buggy falling part of this animation is reached --so this animation is ended early, action_die_tick will then use the standard male fall animation: fall_anim_duration = 21 end -- Bloaty head patients can't go to hell because they don't have a -- "transform to standard male"/"fall into lava hole" animation. if humanoid:isMalePatient() and humanoid.disease.id ~= "bloaty_head" then if math.random(1, 100) <= 65 then humanoid:setTimer(fall_anim_duration, action_die_tick_reaper) else humanoid:setTimer(fall_anim_duration, action_die_tick) end else humanoid:setTimer(fall_anim_duration, action_die_tick) end humanoid.dead = true end return action_die_start CorsixTH-0.63/CorsixTH/Lua/humanoid_actions/falling.lua000066400000000000000000000036211347163623700230520ustar00rootroot00000000000000--[[ Copyright (c) 2011 Mark "Mark.L" Lawlor 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. --]] class "FallingAction" (HumanoidAction) ---@type FallingAction local FallingAction = _G["FallingAction"] function FallingAction:FallingAction() self:HumanoidAction("falling") self.setMustHappen(true) end local action_falling_end = permanent"action_falling_end"( function(humanoid) humanoid:finishAction() end) local function action_falling_start(action, humanoid) if math.random(0, 1) == 1 then humanoid.last_move_direction = "east" else humanoid.last_move_direction = "south" end assert(humanoid.falling_anim, "Error: no falling animation for humanoid " .. humanoid.humanoid_class) action.must_happen = true humanoid:setAnimation(humanoid.falling_anim, humanoid.last_move_direction == "east" and 0 or 1) humanoid:setTimer(humanoid.world:getAnimLength(humanoid.falling_anim), action_falling_end) end return action_falling_start CorsixTH-0.63/CorsixTH/Lua/humanoid_actions/get_up.lua000066400000000000000000000035441347163623700227250ustar00rootroot00000000000000--[[ Copyright (c) 2011 Mark "Mark.L" Lawlor 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. --]] class "GetUpAction" (HumanoidAction) ---@type GetUpAction local GetUpAction = _G["GetUpAction"] function GetUpAction:GetUpAction() self:HumanoidAction("get_up") end local action_get_up_end = permanent"action_get_up_end"( function(humanoid) humanoid:finishAction() end) local function action_get_up_start(action, humanoid) if math.random(0, 1) == 1 then humanoid.last_move_direction = "east" else humanoid.last_move_direction = "south" end assert(humanoid.get_up_anim, "Error: no getting up animation for humanoid " .. humanoid.humanoid_class) action.must_happen = true humanoid:setAnimation(humanoid.get_up_anim, humanoid.last_move_direction == "east" and 0 or 1) humanoid:setTimer(humanoid.world:getAnimLength(humanoid.get_up_anim), action_get_up_end) end return action_get_up_start CorsixTH-0.63/CorsixTH/Lua/humanoid_actions/idle.lua000066400000000000000000000066311347163623700223570ustar00rootroot00000000000000--[[ Copyright (c) 2009 Peter "Corsix" Cawley 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. --]] class "IdleAction" (HumanoidAction) ---@type IdleAction local IdleAction = _G["IdleAction"] function IdleAction:IdleAction() self:HumanoidAction("idle") self.direction = nil -- Direction of standing idle. self.on_interrupt = nil -- Function to call at an interrupt. end --! Set the direction of facing while standing idle. --!param direction (string) Direction of facing. --!return (action) Self, for daisy-chaining. function IdleAction:setDirection(direction) assert(direction == nil or direction == "north" or direction == "south" or direction == "east" or direction == "west", "Invalid value for parameter 'direction'") self.direction = direction return self end --! Set the function to call on interrupt. --!param on_interrupt (function) Function to call on interrupt. --!return (action) Self, for daisy-chaining. function IdleAction:setOnInterrupt(on_interrupt) assert(on_interrupt == nil or type(on_interrupt) == "function", "Invalid value for parameter 'on_interrupt'") self.on_interrupt = on_interrupt return self end local action_idle_interrupt = permanent"action_idle_interrupt"( function(action, humanoid) humanoid:setTimer(1, humanoid.finishAction) end) local action_timer = permanent"action_idle_timer"( function(humanoid) local action = humanoid:getCurrentAction() if action.after_use then action.after_use() action.must_happen = true end humanoid:finishAction() end) local function action_idle_start(action, humanoid) local direction = action.direction or humanoid.last_move_direction local anims = humanoid.walk_anims if direction == "north" then humanoid:setAnimation(anims.idle_north, 0) elseif direction == "east" then humanoid:setAnimation(anims.idle_east, 0) elseif direction == "south" then humanoid:setAnimation(anims.idle_east, 1) elseif direction == "west" then humanoid:setAnimation(anims.idle_north, 1) end humanoid.th:setTile(humanoid.th:getTile()) humanoid:setSpeed(0, 0) if action.count then humanoid:setTimer(action.count, action_timer) action.must_happen = true end -- If an interrupt is already specified for the idle action don't replace it if action.must_happen and not action.on_interrupt then action.on_interrupt = action_idle_interrupt end if action.loop_callback then action:loop_callback(humanoid) end end return action_idle_start CorsixTH-0.63/CorsixTH/Lua/humanoid_actions/idle_spawn.lua000066400000000000000000000050601347163623700235620ustar00rootroot00000000000000--[[ Copyright (c) 2014 Joseph Sheppard 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. --]] class "IdleSpawnAction" (HumanoidAction) ---@type IdleSpawnAction local IdleSpawnAction = _G["IdleSpawnAction"] function IdleSpawnAction:IdleSpawnAction(anim, point_dir) assert(type(anim) == "number", "Invalid value for parameter 'anim'") assert(type(point_dir) == "table" and type(point_dir.x) == "number" and type(point_dir.y) == "number" and point_dir.direction == "north" or point_dir.direction == "south" or point_dir.direction == "east" or point_dir.direction == "west", "Invalid value for parameter 'point_dir'") self:HumanoidAction("idle_spawn") self.spawn_animation = anim self.point = point_dir -- x, y, direction of the spawn animation end local function action_idle_spawn_start(action, humanoid) action.must_happen = true humanoid.last_move_direction = action.point.direction humanoid:setTilePositionSpeed(action.point.x,action.point.y) if action.spawn_animation then local loop_callback_spawn =--[[persistable:idle_spawn_animation]] function() if action.spawn_sound then humanoid:playSound(action.spawn_sound) end humanoid:setAnimation(action.spawn_animation) end humanoid:queueAction(IdleAction():setCount(humanoid.world:getAnimLength(action.spawn_animation)) :setLoopCallback(loop_callback_spawn)) elseif action.spawn_sound then humanoid:playSound(action.spawn_sound) end humanoid:queueAction(IdleAction():setCount(action.count):setLoopCallback(action.loop_callback)) humanoid:finishAction() end return action_idle_spawn_start CorsixTH-0.63/CorsixTH/Lua/humanoid_actions/knock_door.lua000066400000000000000000000051551347163623700235720ustar00rootroot00000000000000--[[ Copyright (c) 2009 Peter "Corsix" Cawley 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. --]] class "KnockDoorAction" (HumanoidAction) ---@type KnockDoorAction local KnockDoorAction = _G["KnockDoorAction"] --! Constructor for knocking on the door action. --!param door (Object) Door to knock on. --!param direction (string) Direction of facing. function KnockDoorAction:KnockDoorAction(door, direction) assert(class.is(door, Door), "Invalid value for parameter 'door'") assert(direction == "north" or direction == "south" or direction == "east" or direction == "west", "Invalid value for parameter 'direction'") self:HumanoidAction("knock_door") self.door = door -- Door to knock on. self.direction = direction -- Direction of facing. end local action_knock_door_tick = permanent"action_knock_door_tick"( function(humanoid) local door = humanoid.user_of door:removeUser(humanoid) humanoid.user_of = nil door:getRoom():tryAdvanceQueue() humanoid:finishAction() end) local function action_knock_door_start(action, humanoid) local direction = action.direction local anims = humanoid.door_anims local door = action.door action.must_happen = true local anim = anims.knock_north local flag_mirror = (direction == "west" or direction == "south") and 1 or 0 if direction == "east" or direction == "south" then anim = anims.knock_east end humanoid:setAnimation(anim, flag_mirror) humanoid:setTilePositionSpeed(humanoid.tile_x, humanoid.tile_y) humanoid:setTimer(humanoid.world:getAnimLength(anim), action_knock_door_tick) humanoid.user_of = door door:setUser(humanoid) door.th:makeVisible() end return action_knock_door_start CorsixTH-0.63/CorsixTH/Lua/humanoid_actions/meander.lua000066400000000000000000000072751347163623700230620ustar00rootroot00000000000000--[[ Copyright (c) 2009 Peter "Corsix" Cawley 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. --]] class "MeanderAction" (HumanoidAction) ---@type MeanderAction local MeanderAction = _G["MeanderAction"] function MeanderAction:MeanderAction() self:HumanoidAction("meander") end local function meander_action_start(action, humanoid) local room = humanoid:getRoom() -- Answering call queue if class.is(humanoid, Staff) and humanoid:isIdle() and not room then if humanoid.humanoid_class == "Handyman" then if humanoid:searchForHandymanTask() == true then return end -- If staff starts wandering around in Idle mode, -- he's effectively not in any room and need not to comeback after -- staff room visit elseif humanoid.world.dispatcher:answerCall(humanoid) then if action.must_happen then humanoid:finishAction() end return else -- Nowhere to go, start going to the old room if it's still in -- need of staff. local last_room = humanoid.last_room if last_room and last_room.is_active and last_room:testStaffCriteria(last_room:getMaximumStaffCriteria(), humanoid) then humanoid:queueAction(last_room:createEnterAction(humanoid)) humanoid:setDynamicInfoText(_S.dynamic_info.staff.actions.heading_for :format(last_room.room_info.name)) humanoid:finishAction() return end end humanoid.last_room = nil end -- Just wandering around if humanoid.humanoid_class == "Doctor" or humanoid.humanoid_class == "Nurse" then if not room then humanoid:setDynamicInfoText(_S.dynamic_info.staff.actions.wandering) end end local x, y = humanoid.world.pathfinder:findIdleTile(humanoid.tile_x, humanoid.tile_y, math.random(1, 24)) if x == humanoid.tile_x and y == humanoid.tile_y then -- Nowhere to walk to - go idle instead, or go onto the next action if #humanoid.action_queue == 1 then humanoid:queueAction(IdleAction()) end humanoid:finishAction() return end if action.todo_interrupt then humanoid:finishAction() return end if action.count then if action.count == 0 then humanoid:finishAction() return else action.count = action.count - 1 end elseif action.loop_callback then action.loop_callback() if action ~= humanoid:getCurrentAction() then return end end local procrastination if action.can_idle then action.can_idle = false procrastination = IdleAction():setCount(math.random(5, 40)):setMustHappen(action.must_happen) else action.can_idle = true procrastination = WalkAction(x, y):setMustHappen(action.must_happen) end humanoid:queueAction(procrastination, 0) end return meander_action_start CorsixTH-0.63/CorsixTH/Lua/humanoid_actions/multi_use_object.lua000066400000000000000000000331111347163623700247670ustar00rootroot00000000000000--[[ Copyright (c) 2009 Peter "Corsix" Cawley 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. --]] class "MultiUseObjectAction" (HumanoidAction) ---@type MultiUseObjectAction local MultiUseObjectAction = _G["MultiUseObjectAction"] --! Construct a multi-use object action. --!param object (Object) Object being used. --!param use_with (Humanoid) Fellow user of the object. function MultiUseObjectAction:MultiUseObjectAction(object, use_with) assert(class.is(object, Object), "Invalid value for parameter 'object'") assert(class.is(use_with, Humanoid), "Invalid value for parameter 'use_with'") self:HumanoidAction("multi_use_object") self.object = object self.use_with = use_with self.prolonged_usage = nil -- If true, the usage is prolonged. self.layer3 = nil end --! Set the invisibility span. --!param span (array) Span of invisibility, {from, to} --!return (action) self, for daisy-chaining. function MultiUseObjectAction:setInvisiblePhaseSpan(span) assert(type(span) == "table" and type(span[1]) == "number" and type(span[2] == "number") and span[1] <= span[2], "Invalid value for parameter 'span'") self.invisible_phase_span = span return self end --! Set prolonged usage of the object. --!param prolonged (bool) If set, enable prolonged usage of the object. --!return (action) self, for daisy-chaining. function MultiUseObjectAction:setProlongedUsage(prolonged) assert(type(prolonged), "boolean", "Invalid value for parameter 'prolonged'") self.prolonged_usage = prolonged return self end -- Set animation layer3 to the given value. --!param layer3 (int) Value to set for animation layer 3. --!return (action) self, for daisy-chaining. function MultiUseObjectAction:setLayer3(layer3) assert(type(layer3) == "number", "Invalid value for parameter 'layer3'") self.layer3 = layer3 return self end local TH = require("TH") local orient_mirror = { north = "west", west = "north", east = "south", south = "east", } local function action_multi_use_next_phase(action, phase) phase = phase + 1 if phase < -5 then phase = -5 end if phase == -5 and not action.anims.begin_use then phase = phase + 1 end if phase == -4 and not action.anims.begin_use_2 then phase = phase + 1 end if phase == -3 and not action.anims.begin_use_3 then phase = phase + 1 end if phase == -2 and not action.anims.begin_use_4 then phase = phase + 1 end if phase == -1 and not action.anims.begin_use_5 then phase = phase + 1 end if phase == 0 and not action.anims.in_use then phase = phase + 1 end if phase == 1 and not action.anims.finish_use then phase = phase + 1 end if phase == 2 and not action.anims.finish_use_2 then phase = phase + 1 end if phase == 3 and not action.anims.finish_use_3 then phase = phase + 1 end if phase == 4 and not action.anims.finish_use_4 then phase = phase + 1 end if phase == 5 and not action.anims.finish_use_5 then phase = phase + 1 end if phase > 5 then phase = 100 end return phase end local action_multi_use_object_tick local function action_multi_use_phase(action, humanoid, phase) local object = action.object humanoid.user_of = nil -- Temporary to avoid tile change warning action.phase = phase local anim_name = "in_use" if phase == -5 then anim_name = "begin_use" elseif phase == -4 then anim_name = "begin_use_2" elseif phase == -3 then anim_name = "begin_use_3" elseif phase == -2 then anim_name = "begin_use_4" elseif phase == -1 then anim_name = "begin_use_5" elseif phase == 1 then anim_name = "finish_use" elseif phase == 2 then anim_name = "finish_use_2" elseif phase == 3 then anim_name = "finish_use_3" elseif phase == 4 then anim_name = "finish_use_4" elseif phase == 5 then anim_name = "finish_use_5" end local anim = action.anims[anim_name] if type(anim) == "table" then -- If an animation list is provided rather than a single animation, then -- choose an animation from the list at random, or according to the previous -- phase. Look at general diagnosis for usage example. if action.random_anim then anim = anim[action.random_anim] else action.random_anim = math.random(1, #anim) anim = anim[action.random_anim] end end if object.split_anims then local anims = humanoid.world.anims for i = 2, #object.split_anims do local th = object.split_anims[i] th:setAnimation(anims, anim, action.mirror_flags) end end humanoid:setAnimation(anim, action.mirror_flags) local offset = object.object_type.orientations if offset then local tx, ty offset = offset[object.direction] if offset.use_animate_from_use_position then tx, ty = object.tile_x + offset.use_position[1], object.tile_y + offset.use_position[2] else tx, ty = object:getRenderAttachTile() end offset = offset.animation_offset humanoid:setTilePositionSpeed(tx, ty, offset[1], offset[2]) else humanoid:setTilePositionSpeed(object.tile_x, object.tile_y, 0, 0) end humanoid.user_of = object local length = humanoid.world:getAnimLength(anim) local secondary_anim = action.anims.secondary and action.anims.secondary[anim_name] if action.secondary_anim then secondary_anim = action.secondary_anim action.secondary_anim = nil end local use_with = action.use_with if secondary_anim then if type(secondary_anim) == "table" and secondary_anim[1] == "morph" then use_with:setAnimation(secondary_anim[2], action.mirror_flags) local morph_target = TH.animation() morph_target:setAnimation(use_with.world.anims, secondary_anim[3], action.mirror_flags) for layer, id in pairs(use_with.layers) do morph_target:setLayer(layer, id) end if secondary_anim.layers then for layer, id in pairs(use_with[secondary_anim.layers]) do morph_target:setLayer(layer, id) end action.change_secondary_layers = use_with[secondary_anim.layers] end use_with.th:setMorph(morph_target) secondary_anim = secondary_anim[3] else use_with:setAnimation(secondary_anim, action.mirror_flags) end use_with.th:makeVisible() local secondary_length = use_with.world:getAnimLength(secondary_anim) if secondary_length > length then length = secondary_length end else local span = action.invisible_phase_span if span then if span[1] <= phase and span[2] >= phase then use_with.th:makeInvisible() else use_with.th:makeVisible() end else use_with.th:makeInvisible() end end humanoid:setTimer(length, action_multi_use_object_tick) end local function copy_layers(dest, src) if class.is(dest, Staff) then dest:setLayer(0, src.layers[0]) dest:setLayer(1, src.layers[1]) dest:setLayer(2, src.layers[2]) dest:setLayer(3, src.layers[3]) dest:setLayer(4, src.layers[4]) elseif class.is(src, Staff) then dest:setLayer(5, src.layers[5]) end end action_multi_use_object_tick = permanent"action_multi_use_object_tick"( function(humanoid) local action = humanoid:getCurrentAction() local use_with = action.use_with local object = action.object local phase = action.phase local oldphase = phase if phase ~= 0 or not action.prolonged_usage then phase = action_multi_use_next_phase(action, phase) elseif action.loop_callback then action:loop_callback() end if action.change_secondary_layers then for layer, id in pairs(action.change_secondary_layers) do use_with:setLayer(layer, id) end action.change_secondary_layers = nil copy_layers(humanoid, use_with) end if oldphase <= 5 and phase > 5 then object:removeUser(humanoid) humanoid.user_of = nil if object.split_anims then local anims, anim, frame, flags = humanoid.world.anims, object.th:getAnimation(), object.th:getFrame(), object.th:getFlag() for i = 2, #object.split_anims do local th = object.split_anims[i] th:setLayersFrom(object.th) th:setHitTestResult(object) th:setAnimation(anims, anim, flags) th:setFrame(frame) end object.ticks = object.object_type.ticks end end if phase == 0 then -- Already now move the secondary user to his final position and orientation. -- This is needed if some end phases have the secondary user visible (e.g. jelly moulder) local spec = object.object_type.orientations[object.direction] local pos = spec.finish_use_position_secondary or spec.use_position_secondary local direction = spec.finish_use_orientation_secondary use_with:setTilePositionSpeed(object.tile_x + pos[1], object.tile_y + pos[2]) if direction then local anims = use_with.walk_anims local anim = (direction == "north" or direction == "west") and anims.idle_north or anims.idle_east local flags = (direction == "north" or direction == "east") and 0 or 1 use_with:setAnimation(anim, flags) end end if phase == 100 then if action.layer3 then humanoid:setLayer(3, action.old_layer3_humanoid) use_with:setLayer(3, action.old_layer3_use_with) end use_with.th:makeVisible() use_with:getCurrentAction().on_interrupt = action.idle_interrupt use_with:getCurrentAction().must_happen = action.idle_must_happen local spec = object.object_type.orientations[object.direction] local pos = spec.finish_use_position or spec.use_position humanoid:setTilePositionSpeed(object.tile_x + pos[1], object.tile_y + pos[2]) -- Check if the room is about to be destroyed local room_destroyed = false if object.strength then room_destroyed = object:machineUsed(humanoid:getRoom()) end if not room_destroyed then -- Now call the after_use function if appropriate if action.after_use then action.after_use() end humanoid:finishAction(action) end else action_multi_use_phase(action, humanoid, phase) end end) local action_multi_use_object_interrupt = permanent"action_multi_use_object_interrupt"( function(action, humanoid) if not action.loop_callback then action.prolonged_usage = false end end) local function action_multi_use_object_start(action, humanoid) local use_with = action.use_with if action.must_happen then -- Setting must_happen is slightly dangerous (though required in some -- situations), as the multi-usage cannot be sure to happen until the -- secondary user is present (at which point, must_happen is always set). if action.todo_interrupt and not action.no_truncate then humanoid:finishAction(action) return end end if use_with:getCurrentAction().name ~= "idle" then humanoid:queueAction(IdleAction():setCount(2), 0) return else action.idle_interrupt = use_with:getCurrentAction().on_interrupt action.idle_must_happen = use_with:getCurrentAction().must_happen use_with:getCurrentAction().on_interrupt = nil use_with:getCurrentAction().must_happen = true end action.must_happen = true if action.prolonged_usage then action.on_interrupt = action_multi_use_object_interrupt use_with:getCurrentAction().on_interrupt = --[[persistable:action_multi_use_object_use_with_interrupt]] function() if action.on_interrupt then action:on_interrupt() action.on_interrupt = nil end end end local object = action.object local orient = object.direction local flags = 0 local anim_set = humanoid.humanoid_class .. " - " .. use_with.humanoid_class if not object.object_type.multi_usage_animations[anim_set][orient] then orient = orient_mirror[orient] flags = flags + 1 end if object.split_anims then flags = flags + DrawFlags.Crop end local spec = object.object_type.orientations[object.direction] -- early_list_while_in_use (if defined) will take precedence over early_list if spec.early_list_while_in_use or (spec.early_list_while_in_use == nil and spec.early_list) then flags = flags + 1024 end local anims = object.object_type.multi_usage_animations[anim_set][orient] action.anims = anims action.mirror_flags = flags object:setUser(humanoid) humanoid.user_of = object copy_layers(humanoid, use_with) if action.layer3 then action.old_layer3_humanoid = humanoid.layers[3] action.old_layer3_use_with = use_with.layers[3] humanoid:setLayer(3, action.layer3) use_with:setLayer(3, action.layer3) end if object.split_anims then for i = 2, #object.split_anims do local th = object.split_anims[i] th:setLayersFrom(humanoid.th) th:setHitTestResult(humanoid) end object.ticks = true end action_multi_use_phase(action, humanoid, action_multi_use_next_phase(action, -100)) end return action_multi_use_object_start CorsixTH-0.63/CorsixTH/Lua/humanoid_actions/on_ground.lua000066400000000000000000000036241347163623700234330ustar00rootroot00000000000000--[[ Copyright (c) 2011 Mark "Mark.L" Lawlor 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. --]] class "OnGroundAction" (HumanoidAction) ---@type OnGroundAction local OnGroundAction = _G["OnGroundAction"] function OnGroundAction:OnGroundAction() self:HumanoidAction("on_ground") end local action_on_ground_end = permanent"action_on_ground_end"( function(humanoid) humanoid:finishAction() end) local function action_on_ground_start(action, humanoid) if math.random(0, 1) == 1 then humanoid.last_move_direction = "east" else humanoid.last_move_direction = "south" end assert(humanoid.on_ground_anim, "Error: no on the ground animation for humanoid " .. humanoid.humanoid_class) action.must_happen = true humanoid:setAnimation(humanoid.on_ground_anim, humanoid.last_move_direction == "east" and 0 or 1) humanoid:setTimer(humanoid.world:getAnimLength(humanoid.on_ground_anim), action_on_ground_end) end return action_on_ground_start CorsixTH-0.63/CorsixTH/Lua/humanoid_actions/pee.lua000066400000000000000000000037711347163623700222150ustar00rootroot00000000000000--[[ Copyright (c) 2011 Mark "Mark.L" Lawlor 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. --]] class "PeeAction" (HumanoidAction) ---@type PeeAction local PeeAction = _G["PeeAction"] function PeeAction:PeeAction() self:HumanoidAction("pee") self:setMustHappen(true) end local action_pee_end = permanent"action_pee_end"( function(humanoid) local litter = humanoid.world:newObject("litter", humanoid.tile_x, humanoid.tile_y) litter:setLitterType("pee", humanoid.last_move_direction == "south" and 0 or 1) humanoid:finishAction() end) local function action_pee_start(action, humanoid) if math.random(0, 1) == 1 then humanoid.last_move_direction = "east" else humanoid.last_move_direction = "south" end assert(humanoid.pee_anim, "Error: no pee animation for humanoid " .. humanoid.humanoid_class) action.must_happen = true humanoid:setAnimation(humanoid.pee_anim, humanoid.last_move_direction == "east" and 0 or 1) humanoid:setTimer(humanoid.world:getAnimLength(humanoid.pee_anim), action_pee_end) end return action_pee_start CorsixTH-0.63/CorsixTH/Lua/humanoid_actions/pickup.lua000066400000000000000000000073431347163623700227360ustar00rootroot00000000000000--[[ Copyright (c) 2009 Peter "Corsix" Cawley 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. --]] class "PickupAction" (HumanoidAction) ---@type PickupAction local PickupAction = _G["PickupAction"] -- Construct a pick-up action --!param ui User interface function PickupAction:PickupAction(ui) assert(class.is(ui, UI), "Invalid value for parameter 'ui'") self:HumanoidAction("pickup") self.ui = ui self.todo_close = nil self:setMustHappen(true) end function PickupAction:setTodoClose(dialog) assert(class.is(dialog, Window), "Invalid value for parameter 'dialog'") self.todo_close = dialog return self end local action_pickup_interrupt = permanent"action_pickup_interrupt"( function(action, humanoid) if action.window then action.window:close() end humanoid.th:makeVisible() local room = humanoid:getRoom() if room then room:onHumanoidEnter(humanoid) else humanoid:onPlaceInCorridor() end humanoid:finishAction() action.ui:setDefaultCursor(nil) end) local action_pickup_dont_interrupt = permanent"action_pickup_dont_interrupt"( function(action, humanoid) action.on_interrupt = action_pickup_interrupt end) local function action_pickup_start(action, humanoid) humanoid.dealing_with_patient = nil if action.todo_close then action.todo_close:close() end if class.is(humanoid, Staff) then humanoid:setDynamicInfoText("") -- picking up staff was not canceling moods in all cases see issue 1642 -- as you would expect room:onHumanoidLeave(humanoid to clear them! humanoid:setMood("idea3", "deactivate") humanoid:setMood("reflexion", "deactivate") end humanoid:setSpeed(0, 0) humanoid.th:makeInvisible() local room = humanoid:getRoom() if room then room:onHumanoidLeave(humanoid) end action.must_happen = true if action.todo_interrupt and action.todo_interrupt ~= "high" then -- If you pick up a staff member as they walk through a door, then the walk -- action will be given a high priority interrupt, and hence immediately -- dump the staff member in the room, at which point the room will command -- the entering staff, sending this pick up action a normal interrupt. We -- will completely ignore that, as the user's wish to pick up the staff is -- more important than the room's wish to command the staff. -- action_pickup_dont_interrupt will then set the interrupt handler back to -- normal, as that is called when the staff member is placed down again. action.on_interrupt = action_pickup_dont_interrupt else action.on_interrupt = action_pickup_interrupt end local ui = action.ui action.window = UIPlaceStaff(ui, humanoid, ui.cursor_x, ui.cursor_y) ui:addWindow(action.window) ui:playSound("pickup.wav") ui:setDefaultCursor(ui.grab_cursor) end return action_pickup_start CorsixTH-0.63/CorsixTH/Lua/humanoid_actions/queue.lua000066400000000000000000000317271347163623700225720ustar00rootroot00000000000000--[[ Copyright (c) 2009 Peter "Corsix" Cawley 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. --]] class "QueueAction" (HumanoidAction) ---@type QueueAction local QueueAction = _G["QueueAction"] --! Queue for something (door or reception desk). --!param x X position of the queue. --!param y Y position of the queue. --!param queue (Queue) Queue to join function QueueAction:QueueAction(x, y, queue) assert(type(x) == "number", "Invalid value for parameter 'x'") assert(type(y) == "number", "Invalid value for parameter 'y'") assert(class.is(queue, Queue), "Invalid value for parameter 'queue'") self:HumanoidAction("queue") self.x = x -- Position of the queue(?) self.y = y self.face_x = nil -- Tile to turn the face to. self.face_y = nil self.queue = queue self.reserve_when_done = nil -- Object to reserve when leaving the queue. end --! Set the object to reserve when queueing is done. --!param door (object) Object to reserve when leaving the queue. --!return (action) self, for daisy-chaining. function QueueAction:setReserveWhenDone(door) assert(class.is(door, Door), "Invalid value for parameter 'door'") self.reserve_when_done = door return self end --! Set the tile to face. --!param face_x (int) X coordinate of the tile to face. --!param face_y (int) Y coordinate of the tile to face. --!return (action) self, for daisy-chaining. function QueueAction:setFaceDirection(face_x, face_y) assert(type(face_x) == "number", "Invalid value for parameter 'face_x'") assert(type(face_y) == "number", "Invalid value for parameter 'face_y'") self.face_x = face_x self.face_y = face_y return self end local function get_direction(x, y, facing_x, facing_y) if facing_y < y then return "north" elseif facing_y > y then return "south" end if facing_x > x then return "east" elseif facing_x < x then return "west" end end local function interrupt_head(humanoid, n) while n > 1 do local action = humanoid.action_queue[n] if action.name == "use_object" then -- Pull object usages out of the queue if action.object and action.object:isReservedFor(humanoid) then action.object:removeReservedUser(humanoid) end table.remove(humanoid.action_queue, n) else -- Mark other actions as needing interruption assert(action.must_happen) action.todo_interrupt = true end n = n - 1 end local action = humanoid.action_queue[n] assert(action.must_happen) local on_interrupt = action.on_interrupt if on_interrupt then action.on_interrupt = nil on_interrupt(action, humanoid) end end local function action_queue_find_idle(action, humanoid) local found_any = false for i, current_action in ipairs(humanoid.action_queue) do if current_action.name == "idle" then found_any = true if humanoid.action_queue[i + 1] == action then return i end end end if found_any then print("Warning: Proper idle not in action_queue") end return -1 end local function action_queue_find_drink_action(action, humanoid) local found_any = false for i, current_action in ipairs(humanoid.action_queue) do if current_action.name == "use_object" and current_action.object.object_type.id == "drinks_machine" then found_any = true if humanoid.action_queue[i + 1] == action then return i end end end if found_any then error("Proper drink action not in action_queue") else return -1 end end -- Finish standing includes currently going to the drinks machine. local function action_queue_finish_standing(action, humanoid) local index = action_queue_find_idle(action, humanoid) if index == -1 then -- Maybe going to the drinks machine? index = action_queue_find_drink_action(action, humanoid) if index == -1 then -- Attempt to recover by assuming the person is sitting down. print("Warning: Idle not in action_queue") if humanoid:getCurrentAction().name == "use_object" then -- It is likely that the person is sitting down. return action_queue_leave_bench(action, humanoid) else error("This person seems to neither be standing nor sitting?!") end end end interrupt_head(humanoid, index) index = index + 1 while index >= 1 do local current_action = humanoid.action_queue[index] if current_action == action then return index - 1 end index = index - 1 end error("Queue action not in action_queue") end local function action_queue_leave_bench(action, humanoid) local index for i, current_action in ipairs(humanoid.action_queue) do -- Check to see that we haven't -- gotten to the actual queue action yet. -- Instead of crashing if we have, try with the assumption -- that we're actually standing. if current_action == action then print("Warning: A patient supposedly sitting down was not," .. " trying to recover assuming he/she is standing.") return action_queue_finish_standing(action, humanoid) end if current_action.name == "use_object" then if humanoid.action_queue[i + 1] == action then interrupt_head(humanoid, i) index = i break end end end index = index + 1 while index >= 1 do local current_action = humanoid.action_queue[index] if current_action == action then return index - 1 end index = index - 1 end error("Queue action not in action_queue") end local action_queue_on_change_position = permanent"action_queue_on_change_position"( function(action, humanoid) -- Only proceed with this handler if the patient is still in the queue if not action.is_in_queue then return end -- Find out if we have to be standing up - considering humanoid_class covers both health inspector and VIP local must_stand = class.is(humanoid, Staff) or humanoid.humanoid_class == "Inspector" or humanoid.humanoid_class == "VIP" or (humanoid.disease and humanoid.disease.must_stand) local queue = action.queue if not must_stand then for i = 1, queue.bench_threshold do if queue[i] == humanoid then must_stand = true break end end end if not must_stand then -- Try to find a bench local bench_max_distance if action:isStanding() then bench_max_distance = 10 else bench_max_distance = action.current_bench_distance / 2 end local bench, bx, by, dist = humanoid.world:getFreeBench(action.x, action.y, bench_max_distance) if bench then local num_actions_prior if action:isStanding() then num_actions_prior = action_queue_finish_standing(action, humanoid) else num_actions_prior = action_queue_leave_bench(action, humanoid) end action.current_bench_distance = dist humanoid:queueAction(WalkAction(bx, by):setMustHappen(true), num_actions_prior) humanoid:queueAction(UseObjectAction(bench):setMustHappen(true), num_actions_prior + 1) bench.reserved_for = humanoid return elseif not action:isStanding() then -- Already sitting down, so nothing to do. return end end -- Stand up in the correct position in the queue local standing_index = 0 local our_room = humanoid:getRoom() for _, person in ipairs(queue) do if person == humanoid then break end if queue.callbacks[person]:isStanding() and person:getRoom() == our_room then standing_index = standing_index + 1 end end local ix, iy = humanoid.world:getIdleTile(action.x, action.y, standing_index) assert(ix and iy) local facing_x, facing_y if standing_index == 0 then facing_x, facing_y = action.face_x or action.x, action.face_y or action.y else facing_x, facing_y = humanoid.world:getIdleTile(action.x, action.y, standing_index - 1) end assert(facing_x and facing_y) local idle_direction = get_direction(ix, iy, facing_x, facing_y) if action:isStanding() then local idle_index = action_queue_find_idle(action, humanoid) if idle_index == -1 then idle_index = action_queue_find_drink_action(action, humanoid) if idle_index ~= -1 then -- Going to get a drink. Do nothing since it will be fixed after getting the drink. return else error("Could not find an idle or drink action when trying to stand in line.") end end humanoid.action_queue[idle_index].direction = idle_direction humanoid:queueAction(WalkAction(ix, iy):setMustHappen(true):setIsLeaving(humanoid:isLeaving()), idle_index - 1) else action.current_bench_distance = nil local num_actions_prior = action_queue_leave_bench(action, humanoid) humanoid:queueAction(WalkAction(ix, iy):setMustHappen(true), num_actions_prior) humanoid:queueAction(IdleAction():setDirection(idle_direction):setMustHappen(true), num_actions_prior + 1) end end) local action_queue_is_standing = permanent"action_queue_is_standing"( function(action) return not action.current_bench_distance end) local action_queue_on_leave = permanent"action_queue_on_leave"( function(action, humanoid) action.is_in_queue = false if action.reserve_when_done then action.reserve_when_done:addReservedUser(humanoid) end for i, current_action in ipairs(humanoid.action_queue) do if current_action == action then interrupt_head(humanoid, i) return end end error("Queue action not in action_queue") end) -- While queueing one could get thirsty. local action_queue_get_soda = permanent"action_queue_get_soda"( function(action, humanoid, machine, mx, my, fun_after_use) local num_actions_prior if action:isStanding() then num_actions_prior = action_queue_finish_standing(action, humanoid) else num_actions_prior = action_queue_leave_bench(action, humanoid) end -- Callback function used after the drinks machine has been used. local --[[persistable:action_queue_get_soda_after_use]] function after_use() fun_after_use() -- Defined in patient:tickDay -- If the patient is still in the queue, insert an idle action so that -- change_position can do its work. -- Note that it is inserted after the currently executing use_object action. if action.is_in_queue then humanoid:queueAction(IdleAction():setMustHappen(true), 1) action_queue_on_change_position(action, humanoid) end end -- Walk to the machine and then use it. humanoid:queueAction(WalkAction(mx, my):setMustHappen(true), num_actions_prior) humanoid:queueAction(UseObjectAction(machine):setAfterUse(after_use) :setMustHappen(true), num_actions_prior + 1) machine:addReservedUser(humanoid) -- Make sure no one thinks we're sitting down anymore. action.current_bench_distance = nil end) local action_queue_interrupt = permanent"action_queue_interrupt"( function(action, humanoid) if action.is_in_queue then action.queue:removeValue(humanoid) if action.reserve_when_done then action.reserve_when_done:updateDynamicInfo() end end if action.reserve_when_done then if action.reserve_when_done:isReservedFor(humanoid) then action.reserve_when_done:removeReservedUser(humanoid) end end humanoid:finishAction() end) local function action_queue_start(action, humanoid) local queue = action.queue if action.done_init then return end action.done_init = true action.must_happen = true action.on_interrupt = action_queue_interrupt action.onChangeQueuePosition = action_queue_on_change_position action.onLeaveQueue = action_queue_on_leave action.onGetSoda = action_queue_get_soda action.isStanding = action_queue_is_standing action.is_in_queue = true queue:unexpect(humanoid) queue:push(humanoid, action) local door = action.reserve_when_done if door then door:updateDynamicInfo() if class.is(humanoid, Patient) then humanoid:updateDynamicInfo(_S.dynamic_info.patient.actions.queueing_for:format(door.room.room_info.name)) end end humanoid:queueAction(IdleAction():setMustHappen(true):setIsLeaving(humanoid:isLeaving()), 0) action:onChangeQueuePosition(humanoid) if queue.same_room_priority then queue.same_room_priority:getRoom():tryAdvanceQueue() end end return action_queue_start CorsixTH-0.63/CorsixTH/Lua/humanoid_actions/seek_reception.lua000066400000000000000000000111731347163623700244360ustar00rootroot00000000000000--[[ Copyright (c) 2009 Peter "Corsix" Cawley 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. --]] class "SeekReceptionAction" (HumanoidAction) ---@type SeekReceptionAction local SeekReceptionAction = _G["SeekReceptionAction"] function SeekReceptionAction:SeekReceptionAction() self:HumanoidAction("seek_reception") end local function can_join_queue_at(humanoid, x, y) local flag_cache = humanoid.world.map.th:getCellFlags(x, y) return flag_cache.hospital and not flag_cache.room and humanoid.hospital and flag_cache.owner == humanoid.hospital:getPlayerIndex() end local function action_seek_reception_start(action, humanoid) local world = humanoid.world local best_desk local score assert(humanoid.hospital, "humanoid must be associated with a hospital to seek reception") -- Go through all receptions desks. for _, desk in ipairs(humanoid.hospital:findReceptionDesks()) do if (not desk.receptionist and not desk.reserved_for) then -- Not an allowed reception desk to go to. else -- Ok, so we found one. -- Is this one better than the last one? -- A lower score is better. -- First find out where the usage tile is. local orientation = desk.object_type.orientations[desk.direction] local x = desk.tile_x + orientation.use_position[1] local y = desk.tile_y + orientation.use_position[2] local this_score = humanoid.world:getPathDistance(humanoid.tile_x, humanoid.tile_y, x, y) this_score = this_score + desk:getUsageScore() if not score or this_score < score then -- It is better, or the first one! score = this_score best_desk = desk end end end if best_desk then -- We found a desk to go to! local orientation = best_desk.object_type.orientations[best_desk.direction] local x = best_desk.tile_x + orientation.use_position[1] local y = best_desk.tile_y + orientation.use_position[2] humanoid:updateDynamicInfo(_S.dynamic_info.patient.actions.on_my_way_to :format(best_desk.object_type.name)) humanoid.waiting = nil -- We don't want patients which have just spawned to be joining the queue -- immediately, so walk them closer to the desk before joining the queue if can_join_queue_at(humanoid, humanoid.tile_x, humanoid.tile_y) then local face_x, face_y = best_desk:getSecondaryUsageTile() humanoid:setNextAction(QueueAction(x, y, best_desk.queue):setMustHappen(action.must_happen) :setFaceDirection(face_x, face_y)) else local walk = WalkAction(x, y):setMustHappen(action.must_happen) humanoid:queueAction(walk, 0) -- Trim the walk to finish once it is possible to join the queue for i = #walk.path_x, 2, -1 do if can_join_queue_at(humanoid, walk.path_x[i], walk.path_y[i]) then walk.path_x[i + 1] = nil walk.path_y[i + 1] = nil else break end end end else -- No reception desk found. One will probably be built soon, somewhere in -- the hospital, so either walk to the hospital, or walk around the hospital. local procrastination if humanoid.hospital:isInHospital(humanoid.tile_x, humanoid.tile_y) then procrastination = MeanderAction():setCount(1):setMustHappen(action.must_happen) if not humanoid.waiting then -- Eventually people are going to get bored and leave. humanoid.waiting = 5 end else local _, hosp_x, hosp_y = world.pathfinder:isReachableFromHospital(humanoid.tile_x, humanoid.tile_y) procrastination = WalkAction(hosp_x, hosp_y):setMustHappen(action.must_happen) end humanoid:queueAction(procrastination, 0) end end return action_seek_reception_start CorsixTH-0.63/CorsixTH/Lua/humanoid_actions/seek_room.lua000066400000000000000000000440131347163623700234210ustar00rootroot00000000000000--[[ Copyright (c) 2009 Peter "Corsix" Cawley 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. --]] class "SeekRoomAction" (HumanoidAction) ---@type SeekRoomAction local SeekRoomAction = _G["SeekRoomAction"] --! Find another room (and go to it). --!param room_type Type of the new room. function SeekRoomAction:SeekRoomAction(room_type) assert(type(room_type) == "string", "Invalid value for parameter 'room_type'") self:HumanoidAction("seek_room") self.room_type = room_type self.treatment_room = nil -- Whether the next room is a treatment room. self.diagnosis_room = nil end --! Denote that the room being looked for is a treatment room. --!return (action) self, for daisy-chaining. function SeekRoomAction:enableTreatmentRoom() self.treatment_room = true return self end function SeekRoomAction:setDiagnosisRoom(room) assert(type(room) == "number", "Invalid value for parameter 'room'") self.diagnosis_room = room return self end local action_seek_room_find_room = permanent"action_seek_room_find_room"( function(action, humanoid) local room_type = action.room_type if action.diagnosis_room then local tried_rooms = 0 -- Make numbers for each available diagnosis room. A random index from this list will be chosen, -- and then the corresponding room index is taken as next room. (The list decrease for each room -- missing) local available_rooms = {} local room_at_index for i=1, #humanoid.available_diagnosis_rooms do available_rooms[i] = i end while tried_rooms < #humanoid.available_diagnosis_rooms do -- Choose a diagnosis room from the list at random. Note: This ignores the initial diagnosis room! room_at_index = math.random(1,#available_rooms) room_type = humanoid.available_diagnosis_rooms[available_rooms[room_at_index]] -- Try to find the room local room = humanoid.world:findRoomNear(humanoid, room_type, nil, "advanced") if room then return room else tried_rooms = tried_rooms + 1 -- Remove the index of this room from the list of indeces available in available_diagnosis_rooms table.remove(available_rooms, room_at_index) -- If the room can be built, set the flag for it. local diag = humanoid.world.available_rooms[room_type] if diag and humanoid.hospital.discovered_rooms[diag] then action.diagnosis_exists = room_type end end end -- No room found. If the last room to be checked was one that is not yet discovered -- but another one exists that can be built, return to that one. if not humanoid.world.available_rooms[room_type] and action.diagnosis_exists then action.room_type = action.diagnosis_exists end return nil elseif action.treatment_room then -- Treatment rooms etc either exist, or they don't. -- However, if many rooms are needed to treat the patient they all need to be available. -- Example: ward + operating theatre. for _, rooms in pairs(humanoid.disease.treatment_rooms) do if not humanoid.world:findRoomNear(humanoid, rooms, nil, "advanced") then action.room_type_needed = rooms return nil end end end return humanoid.world:findRoomNear(humanoid, room_type, nil, "advanced") end) local action_seek_room_goto_room = permanent"action_seek_room_goto_room"( function(room, humanoid, diagnosis_room) humanoid:setMood("patient_wait", "deactivate") humanoid.waiting = nil humanoid.message_callback = nil humanoid:setNextAction(room:createEnterAction(humanoid)) humanoid.next_room_to_visit = room humanoid:updateDynamicInfo(_S.dynamic_info.patient.actions.on_my_way_to :format(room.room_info.name)) room.door.queue:expect(humanoid) room.door:updateDynamicInfo() if not room:testStaffCriteria(room:getRequiredStaffCriteria()) then humanoid.world.dispatcher:callForStaff(room) end if diagnosis_room then -- The diagnosis room was found, remove it from the list table.remove(humanoid.available_diagnosis_rooms, diagnosis_room) end end) local function action_seek_room_no_treatment_room_found(room_type, humanoid) -- Emergency patients also don't need to ask what to do, they'll just wait for the player -- to build the necessary room. if humanoid.is_emergency then return end -- Wait two months before going home anyway. humanoid.waiting = 60 local strings = _S.fax.disease_discovered_patient_choice -- Can this room be built right now? What is then missing? local output_text = strings.can_not_cure -- TODO: can we really assert this? Or should we just make the patient go home? --local room = assert(humanoid.world.available_rooms[room_type], "room " .. room_type .. " not available") local req = humanoid.hospital:checkDiseaseRequirements(humanoid.disease.id) local research_enabled = false if req then research_enabled = humanoid.hospital:hasRoomOfType("research") and humanoid.hospital:hasStaffOfCategory("Researcher") if #req.rooms == 1 then local room_name, required_staff, staff_name = humanoid.world:getRoomNameAndRequiredStaffName(req.rooms[1]) if req.staff[required_staff] or 0 > 0 then output_text = strings.need_to_build_and_employ:format(room_name, staff_name) else output_text = strings.need_to_build:format(room_name) end elseif #req.rooms == 0 and next(req.staff) then local staffclass_to_string = { Nurse = _S.staff_title.nurse, Doctor = _S.staff_title.doctor, Surgeon = _S.staff_title.surgeon, Psychiatrist = _S.staff_title.psychiatrist, } output_text = strings.need_to_employ:format(staffclass_to_string[next(req.staff)]) end end local message = { {text = strings.disease_name:format(humanoid.disease.name)}, {text = " "}, {text = output_text}, {text = strings.what_to_do_question}, choices = { {text = strings.choices.send_home, choice = "send_home"}, {text = strings.choices.wait, choice = "wait"}, {text = strings.choices.research, choice = "research", enabled = research_enabled}, }, } -- Ok, send the message in all channels. TheApp.ui.bottom_panel:queueMessage("information", message, humanoid) humanoid:setMood("patient_wait", "activate") humanoid:updateDynamicInfo(_S.dynamic_info.patient.actions.awaiting_decision) end local function action_seek_room_no_diagnosis_room_found(action, humanoid) --If it's the VIP then there's been an explosion. Skip the exploded room if humanoid.humanoid_class == "VIP" then humanoid.waiting = 1 return end -- If none of the diagnosis rooms can be built yet, go home anyway. -- Otherwise, depending on hospital policy three things can happen: if humanoid.diagnosis_progress < humanoid.hospital.policies["send_home"] then -- Send home automatically humanoid:goHome("kicked") humanoid:updateDynamicInfo(_S.dynamic_info.patient.actions.no_diagnoses_available) elseif humanoid.diagnosis_progress < humanoid.hospital.policies["guess_cure"] or not humanoid.hospital.disease_casebook[humanoid.disease.id].discovered then -- If the disease hasn't been discovered yet it cannot be guessed, go here instead. -- Ask the player -- Wait two months before going home anyway. humanoid:setMood("patient_wait", "activate") humanoid.waiting = 60 local guess_enabled = humanoid.hospital.disease_casebook[humanoid.disease.id].discovered local message = { {text = _S.fax.diagnosis_failed.situation}, {text = " "}, {text = _S.fax.diagnosis_failed.what_to_do_question}, choices = { {text = _S.fax.diagnosis_failed.choices.send_home, choice = "send_home"}, {text = _S.fax.diagnosis_failed.choices.take_chance, choice = "guess_cure", enabled = guess_enabled}, {text = _S.fax.diagnosis_failed.choices.wait, choice = "wait"}, }, } if guess_enabled then table.insert(message, 3, {text = _S.fax.diagnosis_failed.partial_diagnosis_percentage_name :format(math.round(humanoid.diagnosis_progress*100), humanoid.disease.name)}) end TheApp.ui.bottom_panel:queueMessage("information", message, humanoid) humanoid:updateDynamicInfo(_S.dynamic_info.patient.actions.awaiting_decision) -- This seek_room action will be reused, return that it's valid. return true else -- Guess "type of disease" automatically. -- A patient with an undiscovered disease should never get here. assert(humanoid.hospital.disease_casebook[humanoid.disease.id].discovered) humanoid:setDiagnosed() humanoid:unregisterRoomBuildCallback(action.build_callback) humanoid:unregisterRoomRemoveCallback(action.remove_callback) humanoid:unregisterStaffChangeCallback(action.staff_change_callback) if humanoid:agreesToPay(humanoid.disease.id) then humanoid:queueAction({ name = "seek_room", room_type = humanoid.disease.treatment_rooms[1], treatment_room = true, }, 1) else humanoid:goHome("over_priced", humanoid.disease.id) end humanoid:finishAction() end end local action_seek_room_interrupt = permanent"action_seek_room_interrupt"( function(action, humanoid) humanoid:setMood("patient_wait", "deactivate") -- Just in case we are somehow started again: -- FIXME: This seems to be used for intermediate actions like peeing while the patient is waiting -- Unfortunately this means that if you finish the required room while the patient is peeing -- the callback does not happen, meaning that the message does not disappear. humanoid:unregisterRoomBuildCallback(action.build_callback) humanoid:unregisterRoomRemoveCallback(action.remove_callback) humanoid:unregisterStaffChangeCallback(action.staff_change_callback) action.build_callback = nil action.remove_callback = nil action.staff_change_callback = nil action.done_init = false humanoid:finishAction() end) local function action_seek_room_start(action, humanoid) if action.todo_interrupt then humanoid:finishAction() return end -- Seeking for toilets is a special case with its own action. if action.room_type == "toilets" then humanoid:queueAction(SeekToiletsAction(), 1) humanoid:finishAction() return end -- Tries to find the room, if it is a diagnosis room, try to find any room in the diagnosis list. if not humanoid.diagnosed or action.room_type == "research" then local room = action_seek_room_find_room(action, humanoid) -- if we have the room but not the staff we shouldn't seek out the room either if room then if humanoid.message then TheApp.ui.bottom_panel:removeMessage(humanoid) end action_seek_room_goto_room(room, humanoid, action.diagnosis_room) return end end -- check we can treat the patient - and just shortcut the processing local req = humanoid.hospital:checkDiseaseRequirements(humanoid.disease.id) if humanoid.diagnosed and not req then local room = action_seek_room_find_room(action, humanoid) -- if we have the room but not the staff we shouldn't seek out the room either if room then if humanoid.message then TheApp.ui.bottom_panel:removeMessage(humanoid) end action_seek_room_goto_room(room, humanoid, action.diagnosis_room) return end end -- we can't yet treat the patient, register callbacks -- create message etc if not action.done_init then action.done_init = true action.must_happen = true local remove_callback = --[[persistable:action_seek_room_remove_callback]] function(rm) humanoid:updateMessage("research") end -- End of remove_callback function action.remove_callback = remove_callback humanoid:registerRoomRemoveCallback(remove_callback) local build_callback local staff_change_callback staff_change_callback = --[[persistable:action_seek_room_staff_change_callback]] function(staff) -- we might have hired or fired a staff member -- technically we don't care about Receptionist or Handyman if staff.humanoid_class == "Receptionist" or staff.humanoid_class == "Handyman" then return end -- update the message either way humanoid:updateMessage("research") local room_req = humanoid.hospital:checkDiseaseRequirements(humanoid.disease.id) -- only need to check if we hired someone if not staff.fired and not room_req then local room = action_seek_room_find_room(action, humanoid) if room then TheApp.ui.bottom_panel:removeMessage(humanoid) humanoid:unregisterRoomBuildCallback(build_callback) humanoid:unregisterRoomRemoveCallback(remove_callback) humanoid:unregisterStaffChangeCallback(staff_change_callback) action_seek_room_goto_room(room, humanoid, action.diagnosis_room) end end end -- End of staff_change_callback function action.staff_change_callback = staff_change_callback humanoid:registerStaffChangeCallback(staff_change_callback) build_callback = --[[persistable:action_seek_room_build_callback]] function(rm) -- if research room was built, message may need to be updated humanoid:updateMessage("research") local found = false if rm.room_info.id == action.room_type then found = true elseif rm.room_info.id == action.room_type_needed then -- So the room that we're going to is not actually the room we waited for to be built. -- Example: Will go to ward, but is waiting for the operating theatre. -- Clean up and start over to find the room we actually want to go to. TheApp.ui.bottom_panel:removeMessage(humanoid) humanoid:unregisterRoomBuildCallback(build_callback) humanoid:unregisterRoomRemoveCallback(remove_callback) humanoid:unregisterStaffChangeCallback(staff_change_callback) action.room_type_needed = nil action_seek_room_start(action, humanoid) elseif not humanoid.diagnosed then -- Waiting for a diagnosis room, we need to go through the list - unless it is gp if action.room_type ~= "gp" then for i = 1, #humanoid.available_diagnosis_rooms do if humanoid.available_diagnosis_rooms[i].id == rm.room_info.id then found = true end end end end if found then -- Don't add a "go to room" action to the patient's queue if the -- autopsy machine is about to kill them: -- don't need this as we unregistered all previous callbacks if we went to research local room_req = humanoid.hospital:checkDiseaseRequirements(humanoid.disease.id) -- get required staff if not room_req then action_seek_room_goto_room(rm, humanoid, action.diagnosis_room) TheApp.ui.bottom_panel:removeMessage(humanoid) humanoid:unregisterRoomBuildCallback(build_callback) humanoid:unregisterRoomRemoveCallback(remove_callback) humanoid:unregisterStaffChangeCallback(staff_change_callback) end end end -- End of build_callback function action.build_callback = build_callback humanoid:registerRoomBuildCallback(build_callback) action.on_interrupt = action_seek_room_interrupt end -- Things needed to get the patient to the correct room in due time are done. Now it's -- time to let the player know about it too. -- If done_walk is set the meander action that takes place after not finding any room has been -- done = nothing more to do right now. if not action.done_walk then local action_still_valid = true if not action.message_sent then -- Make a message about that something needs to be done about this patient if humanoid.diagnosed then -- The patient is diagnosed, a treatment room is missing. -- It may happen that it is another room in a series which is missing. local room_to_find = action.room_type_needed and action.room_type_needed or action.room_type action_seek_room_no_treatment_room_found(room_to_find, humanoid) else -- No more diagnosis rooms can be found -- The GP's office is a special case. TODO: Make a custom message anyway? if action.room_type == "gp" then humanoid:setMood("patient_wait", "activate") humanoid:updateDynamicInfo(_S.dynamic_info.patient.actions.no_gp_available) else action_still_valid = action_seek_room_no_diagnosis_room_found(action, humanoid) end end end if action_still_valid then action.done_walk = true humanoid:queueAction(MeanderAction():setCount(1):setMustHappen(true), 0) end else -- Make sure the patient stands in a correct way as he/she is waiting. local direction = humanoid.last_move_direction local anims = humanoid.walk_anims if direction == "north" then humanoid:setAnimation(anims.idle_north, 0) elseif direction == "east" then humanoid:setAnimation(anims.idle_east, 0) elseif direction == "south" then humanoid:setAnimation(anims.idle_east, 1) elseif direction == "west" then humanoid:setAnimation(anims.idle_north, 1) end humanoid:setTilePositionSpeed(humanoid.tile_x, humanoid.tile_y) end end return action_seek_room_start CorsixTH-0.63/CorsixTH/Lua/humanoid_actions/seek_staffroom.lua000066400000000000000000000045151347163623700244500ustar00rootroot00000000000000--[[ Copyright (c) 2009 Manuel Wolf 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. --]] class "SeekStaffRoomAction" (HumanoidAction) ---@type SeekStaffRoomAction local SeekStaffRoomAction = _G["SeekStaffRoomAction"] function SeekStaffRoomAction:SeekStaffRoomAction() self:HumanoidAction("seek_staffroom") self:setMustHappen(true) end local function seek_staffroom_action_start(action, humanoid) -- Mechanism for clearing the going_to_staffroom flag when this action is -- interrupted (due to entering the staff room, being picked up, etc.) if action.todo_interrupt then humanoid.going_to_staffroom = nil humanoid:finishAction() return end action.must_happen = true -- Go to the nearest staff room, if any is found. local room = humanoid.world:findRoomNear(humanoid, "staff_room") if room then local task = room:createEnterAction(humanoid):setMustHappen(true):setIsLeaving(true) humanoid:queueAction(task, 0) humanoid:setDynamicInfoText(_S.dynamic_info.staff.actions.heading_for:format(room.room_info.name)) else -- This should happen only in rare cases, e.g. if the target staff room was removed while heading there and none other exists print("No staff room found in seek_staffroom action") humanoid.going_to_staffroom = nil humanoid:queueAction(MeanderAction()) humanoid:finishAction() end end return seek_staffroom_action_start CorsixTH-0.63/CorsixTH/Lua/humanoid_actions/seek_toilets.lua000066400000000000000000000051531347163623700241320ustar00rootroot00000000000000--[[ Copyright (c) 2009 Edvin "Lego3" Linge Based on seek_staffroom.lua by Manuel Wolf 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. --]] class "SeekToiletsAction" (HumanoidAction) ---@type SeekToiletsAction local SeekToiletsAction = _G["SeekToiletsAction"] function SeekToiletsAction:SeekToiletsAction() self:HumanoidAction("seek_toilets") end local function seek_toilets_action_start(action, humanoid) -- Mechanism for clearing the going_to_toilets flag when this action is -- interrupted. if action.todo_interrupt then humanoid.going_to_toilet = "no" humanoid:finishAction() return end action.must_happen = true -- Go to the nearest toilet, if any is found. local room = humanoid.world:findRoomNear(humanoid, "toilets", nil, "advanced") if room then humanoid:setNextAction(room:createEnterAction(humanoid):setMustHappen(true)) -- Unexpect the patient from a possible destination room. if humanoid.next_room_to_visit then local queue = humanoid.next_room_to_visit.door.queue if queue then queue:unexpect(humanoid) end humanoid:updateDynamicInfo("") end humanoid:finishAction() else -- This should happen only in rare cases, e.g. if the target toilet room was -- removed while heading there and none other exists. In that case, go back -- to the previous room or go to the reception. if humanoid.next_room_to_visit then humanoid:setNextAction(SeekRoomAction(humanoid.next_room_to_visit.room_info.id)) else humanoid:queueAction(SeekReceptionAction()) end humanoid.going_to_toilet = "no" humanoid:finishAction() end end return seek_toilets_action_start CorsixTH-0.63/CorsixTH/Lua/humanoid_actions/shake_fist.lua000066400000000000000000000036751347163623700235670ustar00rootroot00000000000000--[[ Copyright (c) 2011 Mark "Mark.L" Lawlor 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. --]] class "ShakeFistAction" (HumanoidAction) ---@type ShakeFistAction local ShakeFistAction = _G["ShakeFistAction"] function ShakeFistAction:ShakeFistAction() self:HumanoidAction("shake_fist") self:setMustHappen(true) end local action_shake_fist_end = permanent"action_shake_fist_end"( function(humanoid) humanoid:finishAction() end) local function action_shake_fist_start(action, humanoid) if math.random(0, 1) == 1 then humanoid.last_move_direction = "east" else humanoid.last_move_direction = "south" end assert(humanoid.shake_fist_anim, "Error: no shaking fist animation for humanoid " .. humanoid.humanoid_class) action.must_happen = true humanoid:setAnimation(humanoid.shake_fist_anim, humanoid.last_move_direction == "east" and 0 or 1) humanoid:setTimer(humanoid.world:getAnimLength(humanoid.shake_fist_anim), action_shake_fist_end) end return action_shake_fist_start CorsixTH-0.63/CorsixTH/Lua/humanoid_actions/spawn.lua000066400000000000000000000111471347163623700225700ustar00rootroot00000000000000--[[ Copyright (c) 2009 Peter "Corsix" Cawley 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. --]] class "SpawnAction" (HumanoidAction) ---@type SpawnAction local SpawnAction = _G["SpawnAction"] --! Spawn an entity. --!param mode (str) Mode of spawning: "spawn" or "despawn" --!param point (table x, y, optional direction) Position and optional face direction of spawning or despawning. function SpawnAction:SpawnAction(mode, point) assert(mode == "spawn" or mode == "despawn", "Invalid value for parameter 'mode'") assert(type(point) == "table" and type(point.x) == "number" and type(point.y) == "number", "Invalid value for parameter 'point'") self:HumanoidAction("spawn") self.mode = mode -- mode of spawning: "spawn" or "despawn" self.point = point self.offset = nil -- Offset in position?? end --! Set the offset of spawning. --! --! These two values specifies how many tiles away the humanoid should start --! walking before actually spawning in the destination tile. Default is x and --! y values are 2, and should not be set less than or equal to 0. Only one of --! x or y offsets are used depending on the initial walk direction of the --! newly spawned humanoid. --!param offset (table x, y) Position offset. --!return (action) Return self for daisy chaining. function SpawnAction:setOffset(offset) assert(type(offset) == "table" and (offset.x == nil or (type(offset.x) == "number" and offset.x > 0)) and (offset.y == nil or (type(offset.y) == "number" and offset.y > 0)), "Invalid value for parameter 'offset'") self.offset = offset return self end local orient_opposite = { north = "south", west = "east", east = "west", south = "north", } local action_spawn_despawn = permanent"action_spawn_despawn"( function(humanoid) if humanoid.hospital then humanoid:despawn() end humanoid.world:destroyEntity(humanoid) end) local function action_spawn_start(action, humanoid) assert(action.mode == "spawn" or action.mode == "despawn", "spawn action given invalid mode: " .. action.mode) local x, y = action.point.x, action.point.y if action.mode == "despawn" and (humanoid.tile_x ~= x or humanoid.tile_y ~= y) then humanoid:queueAction(WalkAction(action.point.x, action.point.y):setMustHappen(action.must_happen), 0) return end action.must_happen = true local anims = humanoid.walk_anims local walk_dir = action.point.direction if action.mode == "spawn" then walk_dir = orient_opposite[walk_dir] end local offset_x = 2 local offset_y = 2 if action.offset then offset_x = action.offset.x and action.offset.x or 2 offset_y = action.offset.y and action.offset.y or 2 end assert(offset_x > 0 and offset_y > 0, "Spawning needs to be done from an adjacent tile.") local anim, flag, speed_x, speed_y, duration if walk_dir == "east" then anim, flag, speed_x, speed_y, duration = anims.walk_east , 0, 4, 2, 10*offset_x elseif walk_dir == "west" then anim, flag, speed_x, speed_y, duration = anims.walk_north, 1, -4, -2, 10*offset_x elseif walk_dir == "south" then anim, flag, speed_x, speed_y, duration = anims.walk_east , 1, -4, 2, 10*offset_y else--if walk_dir == "north" then anim, flag, speed_x, speed_y, duration = anims.walk_north, 0, 4, -2, 10*offset_y end humanoid.last_move_direction = walk_dir humanoid:setAnimation(anim, flag) local pos_x, pos_y = 0, 0 if action.mode == "spawn" then pos_x = -speed_x * duration pos_y = -speed_y * duration humanoid:setTimer(duration, humanoid.finishAction) else humanoid:setTimer(duration, action_spawn_despawn) end humanoid:setTilePositionSpeed(x, y, pos_x, pos_y, speed_x, speed_y) end return action_spawn_start CorsixTH-0.63/CorsixTH/Lua/humanoid_actions/staff_reception.lua000066400000000000000000000103571347163623700246150ustar00rootroot00000000000000--[[ Copyright (c) 2009 Peter "Corsix" Cawley 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. --]] class "StaffReceptionAction" (HumanoidAction) ---@type StaffReceptionAction local StaffReceptionAction = _G["StaffReceptionAction"] -- Action class for the "staff reception desk" action. --!param desk (object) Desk to staff. function StaffReceptionAction:StaffReceptionAction(desk) assert(class.is(desk, ReceptionDesk), "Invalid value for parameter 'desk'") self:HumanoidAction("staff_reception") self.object = desk -- Reception desk object. self:setMustHappen(true) end local action_staff_reception_interrupt = permanent"action_staff_reception_interrupt"( function(action, humanoid, high_priority) local object = action.object object.receptionist = nil if not object.being_destroyed then -- don't look for replacement if desk was picked up object:checkForNearbyStaff() end humanoid.associated_desk = nil local dx, dy = object:getSecondaryUsageTile() if high_priority then humanoid:setTilePositionSpeed(dx, dy) humanoid:finishAction() else HumanoidRawWalk(humanoid, humanoid.tile_x, humanoid.tile_y, dx, dy, nil, function() humanoid:setTilePositionSpeed(dx, dy) humanoid:finishAction() end) end end) local action_staff_reception_idle_phase = permanent"action_staff_reception_idle_phase"( function(humanoid) local action = humanoid:getCurrentAction() local direction = humanoid.last_move_direction local anims = humanoid.walk_anims local object = action.object if direction == "north" then humanoid:setAnimation(anims.idle_north, 0) elseif direction == "east" then humanoid:setAnimation(anims.idle_east, 0) elseif direction == "south" then humanoid:setAnimation(anims.idle_east, 1) elseif direction == "west" then humanoid:setAnimation(anims.idle_north, 1) end humanoid:setTilePositionSpeed(object.tile_x, object.tile_y) object.receptionist = humanoid object.reserved_for = nil object.th:makeVisible() if direction == "north" or direction == "west" then -- Place desk behind receptionist in render order (they are on the same tile) object.th:setTile(object.th:getTile()) end if action.on_interrupt then action.on_interrupt = action_staff_reception_interrupt else action_staff_reception_interrupt(action, humanoid) end end) local action_staff_reception_interrupt_early = permanent"action_staff_reception_interrupt_early"( function(action, humanoid, high_priority) if high_priority then action.object.reserved_for = nil humanoid.associated_desk:checkForNearbyStaff() humanoid.associated_desk = nil humanoid:setTimer(nil) humanoid:setTilePositionSpeed(action.object:getSecondaryUsageTile()) humanoid:finishAction() end end) local function action_staff_reception_start(action, humanoid) if action.todo_interrupt then humanoid.associated_desk.reserved_for = nil humanoid.associated_desk:checkForNearbyStaff() humanoid.associated_desk = nil humanoid:finishAction(action) return end local object = action.object HumanoidRawWalk(humanoid, humanoid.tile_x, humanoid.tile_y, object.tile_x, object.tile_y, nil, action_staff_reception_idle_phase) action.must_happen = true action.on_interrupt = action_staff_reception_interrupt_early end return action_staff_reception_start CorsixTH-0.63/CorsixTH/Lua/humanoid_actions/sweep_floor.lua000066400000000000000000000053161347163623700237650ustar00rootroot00000000000000--[[ Copyright (c) 2011 Edvin "Lego3" Linge 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. --]] class "SweepFloorAction" (HumanoidAction) ---@type SweepFloorAction local SweepFloorAction = _G["SweepFloorAction"] function SweepFloorAction:SweepFloorAction(litter) assert(class.is(litter, Litter), "Invalid value for parameter 'litter'") self:HumanoidAction("sweep_floor") self.litter = litter end -- Set markers for all animations involved. local animation_numbers = { 1874, 1878, } TheApp.animation_manager:setMarker(animation_numbers, {-1.05, -0.05}) local finish = permanent"action_sweep_floor_finish"( function(humanoid) humanoid:finishAction() end) local remove_litter = permanent"action_sweep_floor_remove_litter"( function(humanoid) humanoid.user_of:remove() humanoid.user_of:setTile(nil) humanoid.user_of = nil humanoid:setTimer(humanoid.world:getAnimLength(animation_numbers[2]) * 2, finish) end) local sweep = permanent"action_sweep_floor_sweep"( function(humanoid) local anim = animation_numbers[2] humanoid:setAnimation(anim) humanoid:setTimer(humanoid.world:getAnimLength(anim) * 2, remove_litter) end) local function action_sweep_floor_start(action, humanoid) action.must_happen = true humanoid.user_of = action.litter -- remove handyman task as soon as action starts - we should be committed to completing this task local litter = action.litter local hospital = litter.world:getHospital(litter.tile_x, litter.tile_y) local taskIndex = hospital:getIndexOfTask(litter.tile_x, litter.tile_y, "cleaning", litter) hospital:removeHandymanTask(taskIndex, "cleaning") local anim = animation_numbers[1] humanoid:setAnimation(anim) humanoid:setTimer(humanoid.world:getAnimLength(anim), sweep) end return action_sweep_floor_start CorsixTH-0.63/CorsixTH/Lua/humanoid_actions/tap_foot.lua000066400000000000000000000036331347163623700232540ustar00rootroot00000000000000--[[ Copyright (c) 2011 Mark "Mark.L" Lawlor 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. --]] class "TapFootAction" (HumanoidAction) ---@type TapFootAction local TapFootAction = _G["TapFootAction"] function TapFootAction:TapFootAction() self:HumanoidAction("tap_foot") self:setMustHappen(true) end local action_tap_foot_end = permanent"action_tap_foot_end"( function(humanoid) humanoid:finishAction() end) local function action_tap_foot_start(action, humanoid) if math.random(0, 1) == 1 then humanoid.last_move_direction = "east" else humanoid.last_move_direction = "south" end assert(humanoid.tap_foot_anim, "Error: foot tapping animation for humanoid " .. humanoid.humanoid_class) action.must_happen = true humanoid:setAnimation(humanoid.tap_foot_anim, humanoid.last_move_direction == "east" and 0 or 1) humanoid:setTimer(humanoid.world:getAnimLength(humanoid.tap_foot_anim), action_tap_foot_end) end return action_tap_foot_start CorsixTH-0.63/CorsixTH/Lua/humanoid_actions/use_object.lua000066400000000000000000000340261347163623700235630ustar00rootroot00000000000000--[[ Copyright (c) 2009 Peter "Corsix" Cawley 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. --]] local TH = require("TH") class "UseObjectAction" (HumanoidAction) ---@type UseObjectAction local UseObjectAction = _G["UseObjectAction"] --! Construct a 'use object' action. --!param object (Object) Object to use. function UseObjectAction:UseObjectAction(object) assert(class.is(object, Object), "Invalid value for parameter 'object'") self:HumanoidAction("use_object") self.object = object self.watering_plant = false -- Whether the action is watering the plant. self.prolonged_usage = nil -- If true, the usage is prolonged. end --! Set the 'watering plant' flag. --!return (action) self, for daisy chaining. function UseObjectAction:enableWateringPlant() self.watering_plant = true return self end --! Set prolonged usage of the object. --!param prolonged (bool or nil) If set, enable prolonged usage of the object. --!return (action) self, for daisy-chaining. function UseObjectAction:setProlongedUsage(prolonged) assert(prolonged == nil or type(prolonged) == "boolean", "Invalid value for parameter 'prolonged'") self.prolonged_usage = prolonged return self end local orient_mirror = { north = "west", west = "north", east = "south", south = "east", } local function action_use_next_phase(action, phase) phase = phase + 1 if phase < -6 then phase = -6 end if phase == -6 and not action.do_walk then phase = phase + 1 end if phase == -5 and not action.anims.begin_use then phase = phase + 1 end if phase == -4 and not action.anims.begin_use_2 then phase = phase + 1 end if phase == -3 and not action.anims.begin_use_3 then phase = phase + 1 end if phase == -2 and not action.anims.begin_use_4 then phase = phase + 1 end if phase == -1 and not action.anims.begin_use_5 then phase = phase + 1 end if phase == 0 and not action.anims.in_use then phase = phase + 1 end if phase == 1 and not action.anims.finish_use then phase = phase + 1 end if phase == 2 and not action.anims.finish_use_2 then phase = phase + 1 end if phase == 3 and not action.anims.finish_use_3 then phase = phase + 1 end if phase == 4 and not action.anims.finish_use_4 then phase = phase + 1 end if phase == 5 and not action.anims.finish_use_5 then phase = phase + 1 end if phase == 6 and not action.do_walk or phase == 6 and action.destroy_user_after_use then phase = phase + 1 end if phase > 6 then phase = 100 end return phase end local action_use_object_tick local function action_use_phase(action, humanoid, phase) local object = action.object humanoid.user_of = nil -- Temporary to avoid tile change warning action.phase = phase if phase == -6 then HumanoidRawWalk(humanoid, action.old_tile_x, action.old_tile_y, action.new_tile_x, action.new_tile_y, nil, action_use_object_tick) return elseif phase == 6 then HumanoidRawWalk(humanoid, action.new_tile_x, action.new_tile_y, action.old_tile_x, action.old_tile_y, nil, action_use_object_tick) return end local anim_table = action.anims.in_use if phase == -5 then anim_table = action.anims.begin_use elseif phase == -4 then anim_table = action.anims.begin_use_2 elseif phase == -3 then anim_table = action.anims.begin_use_3 elseif phase == -2 then anim_table = action.anims.begin_use_4 elseif phase == -1 then anim_table = action.anims.begin_use_5 elseif phase == 1 then anim_table = action.anims.finish_use elseif phase == 2 then anim_table = action.anims.finish_use_2 elseif phase == 3 then anim_table = action.anims.finish_use_3 elseif phase == 4 then anim_table = action.anims.finish_use_4 elseif phase == 5 then anim_table = action.anims.finish_use_5 end local is_list = false local anim = anim_table[humanoid.humanoid_class] if not anim then -- Handymen have their own number of animations. if humanoid.humanoid_class == "Handyman" then --action_use_phase(action, humanoid, action_use_next_phase(action, phase)) action_use_object_tick(humanoid) return else error("No animation for " .. humanoid.humanoid_class .. " using " .. object.object_type.id .. " facing " .. object.direction .. " phase " .. phase) end end local anim_length = 1 if type(anim) == "table" and anim.length then anim_length = anim.length end if type(anim) == "table" and anim[1] ~= "morph" and #anim > 1 then -- If an animation list is provided rather than a single animation, then -- choose an animation from the list at random. is_list = true anim = anim[math.random(1, #anim)] end local flags = action.mirror_flags if type(anim) == "table" then if anim.mirror then -- a single animation may be (un-)mirrored, switch the mirror flag in that case flags = flag_toggle(flags, DrawFlags.FlipHorizontal) end if anim.object_visible then -- this flag may be set to make the (idle) object visible additionally to the usage animation object.th:makeVisible() else object.th:makeInvisible() end if anim[1] ~= "morph" then anim = anim[1] end else object.th:makeInvisible() end if object.split_anims then flags = flags + DrawFlags.Crop local anims = humanoid.world.anims for i = 2, #object.split_anims do local th = object.split_anims[i] th:setAnimation(anims, anim, flags) end end if type(anim) == "table" and anim[1] == "morph" then -- If a table with entries {"morph", A, B} is given rather than a single -- animation, then display A first, then morph to B. humanoid:setAnimation(anim[2], flags) local morph_target = TH.animation() local morph_flags = flags if anim.mirror_morph then morph_flags = flag_toggle(morph_flags, DrawFlags.FlipHorizontal) end morph_target:setAnimation(humanoid.world.anims, anim[3], morph_flags) for layer, id in pairs(humanoid.layers) do morph_target:setLayer(layer, id) end if anim.layers then for layer, id in pairs(humanoid[anim.layers]) do morph_target:setLayer(layer, id) end action.change_layers = humanoid[anim.layers] end humanoid.th:setMorph(morph_target, anim_length) anim = anim[3] else humanoid:setAnimation(anim, flags) end local offset = object.object_type.orientations if offset then local tx, ty offset = offset[object.direction] if offset.use_animate_from_use_position then tx, ty = action.old_tile_x, action.old_tile_y else tx, ty = object:getRenderAttachTile() end if humanoid.humanoid_class == "Handyman" and offset.added_handyman_animate_offset_while_in_use then tx = tx + offset.added_handyman_animate_offset_while_in_use[1] ty = ty + offset.added_handyman_animate_offset_while_in_use[2] end local added_offset = nil if offset.added_animation_offset_while_in_use then added_offset = offset.added_animation_offset_while_in_use end offset = offset.animation_offset if added_offset then humanoid:setTilePositionSpeed(tx, ty, offset[1] + added_offset[1], offset[2] + added_offset[2]) else humanoid:setTilePositionSpeed(tx, ty, offset[1], offset[2]) end else humanoid:setTilePositionSpeed(object.tile_x, object.tile_y, 0, 0) end humanoid.user_of = object local length = anim_length * humanoid.world:getAnimLength(anim) if action.min_length and phase == 0 and action.min_length > length then -- A certain length is desired. -- Even it out so that an integer number of animation sequences are done. length = action.min_length + action.min_length % length end if phase == 0 and (not is_list) and length == 1 and action.prolonged_usage and action.on_interrupt and not action.loop_callback then -- a timer would be redundant, so do not set one else humanoid:setTimer(length, action_use_object_tick) end end local function init_split_anims(object, humanoid) if object.split_anims then for i = 2, #object.split_anims do local th = object.split_anims[i] th:setLayersFrom(humanoid.th) th:setHitTestResult(humanoid) end object.ticks = true end end local function finish_using(object, humanoid) object:removeUser(humanoid) humanoid.user_of = nil if object.split_anims then local anims, anim, frame, flags = humanoid.world.anims, object.th:getAnimation(), object.th:getFrame(), object.th:getFlag() for i = 2, #object.split_anims do local th = object.split_anims[i] th:setLayersFrom(object.th) th:setHitTestResult(object) th:setAnimation(anims, anim, flags) th:setFrame(frame) end object.ticks = object.object_type.ticks end end action_use_object_tick = permanent"action_use_object_tick"( function(humanoid) local action = humanoid:getCurrentAction() local object = action.object local phase = action.phase local oldphase = phase if oldphase == -6 then object:setUser(humanoid) humanoid.user_of = object init_split_anims(object, humanoid) if action.after_walk_in then action:after_walk_in() end end if phase ~= 0 or not action.prolonged_usage or not action.on_interrupt then phase = action_use_next_phase(action, phase) elseif action.loop_callback then action:loop_callback() end if action.change_layers then for layer, id in pairs(action.change_layers) do humanoid:setLayer(layer, id) end action.change_layers = nil end if oldphase <= 5 and phase > 5 then finish_using(object, humanoid) end if phase == 100 then humanoid:setTilePositionSpeed(action.old_tile_x, action.old_tile_y) -- Check if the room is about to be destroyed local room_destroyed = false if object.strength then if humanoid.humanoid_class ~= "Handyman" then room_destroyed = object:machineUsed(humanoid:getRoom()) end elseif object:getDynamicInfo() and not object.master then -- Don't update if it is a slave object. object:updateDynamicInfo() end if not room_destroyed then -- Note that after_use is not called if the room has been destroyed! -- In that case both the patient, staff member(s) and -- the actual object are already dead. if action.after_use then action.after_use() end if action.destroy_user_after_use then humanoid:despawn() humanoid.world:destroyEntity(humanoid) else humanoid:finishAction(action) end end else action_use_phase(action, humanoid, phase) end end) local action_use_object_interrupt = permanent"action_use_object_interrupt"( function(action, humanoid, high_priority) if high_priority then local object = action.object if humanoid.user_of then finish_using(object, humanoid) elseif object:isReservedFor(humanoid) then object:removeReservedUser(humanoid) end humanoid:setTimer(nil) humanoid:setTilePositionSpeed(action.old_tile_x, action.old_tile_y) humanoid:finishAction() elseif not humanoid.timer_function then humanoid:setTimer(1, action_use_object_tick) end -- Only patients can be vaccination candidates so no need to check if humanoid.vaccination_candidate then humanoid:removeVaccinationCandidateStatus() end end) local function action_use_object_start(action, humanoid) action.old_tile_x = humanoid.tile_x action.old_tile_y = humanoid.tile_y action.on_interrupt = action_use_object_interrupt action.must_happen = true local object = action.object local orient = object.direction local flags = 0 if not object.object_type.usage_animations[orient] then orient = orient_mirror[orient] flags = flags + 1 end local spec = object.object_type.orientations[object.direction] -- early_list_while_in_use (if defined) will take precedence over early_list if spec.early_list_while_in_use or (spec.early_list_while_in_use == nil and spec.early_list) then flags = flags + 1024 end -- The handyman has his own place to be in if spec.finish_use_position and humanoid.humanoid_class ~= "Handyman" then action.old_tile_x = object.tile_x + spec.finish_use_position[1] action.old_tile_y = object.tile_y + spec.finish_use_position[2] end if spec.walk_in_tile then action.new_tile_x = spec.walk_in_tile[1] + object.tile_x action.new_tile_y = spec.walk_in_tile[2] + object.tile_y else action.new_tile_x = object.tile_x action.new_tile_y = object.tile_y end local anims = object.object_type.usage_animations[orient] action.anims = anims action.mirror_flags = flags if action.prolonged_usage == nil and anims.begin_use and anims.in_use and anims.finish_use then action.prolonged_usage = true end if object.object_type.walk_in_to_use then action.do_walk = true else object:setUser(humanoid) humanoid.user_of = object init_split_anims(object, humanoid) end if action.watering_plant then -- Tell the plant to start restoring itself object:restoreToFullHealth() end action_use_phase(action, humanoid, action_use_next_phase(action, -100)) end return action_use_object_start CorsixTH-0.63/CorsixTH/Lua/humanoid_actions/use_screen.lua000066400000000000000000000161261347163623700235750ustar00rootroot00000000000000--[[ Copyright (c) 2009 Peter "Corsix" Cawley 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. --]] class "UseScreenAction" (HumanoidAction) ---@type UseScreenAction local UseScreenAction = _G["UseScreenAction"] --! Action to use the screen. --!param screen (object) Screen to use. function UseScreenAction:UseScreenAction(screen) assert(class.is(screen, Object) and ( screen.object_type.id == "screen" or screen.object_type.id == "surgeon_screen"), "Invalid value for parameter 'screen'") self:HumanoidAction("use_screen") self.object = screen end local finish = permanent"action_use_screen_finish"( function(humanoid) local screen = humanoid.user_of humanoid.user_of = nil screen:removeUser(humanoid) local offset = screen.object_type.orientations[screen.direction].use_position humanoid:setTile(screen.tile_x + offset[1], screen.tile_y + offset[2]) local after_use = humanoid:getCurrentAction().after_use if after_use then after_use() end humanoid:finishAction() end) -- Set markers for all animations involved. local animation_numbers = { 946, --1022, 1048, 1052, --1204, --2772, --2774, --2776, 2780, 2782, 2784, 2790, 2792, 2794, 2796, 2844, 2848, 4760, 4762, 4768, 4770, } TheApp.animation_manager:setMarker(animation_numbers, {-1.05, -0.05}) local patient_clothes_state = permanent"action_use_screen_patient_clothes_state"( function(humanoid) humanoid.user_of:setAnimation(1204) humanoid.user_of:setLayer(1, humanoid.layers[1]) return finish(humanoid) end) local normal_state = permanent"action_use_screen_normal_state"( function(humanoid) humanoid.user_of:setAnimation(1022) humanoid.user_of:setLayer(1, 0) return finish(humanoid) end) local surgical_state = permanent"action_use_screen_surgical_state"( function(humanoid) local screen = humanoid.user_of if screen.num_green_outfits > 0 then if screen.num_white_outfits > 0 then screen:setAnimation(2776) else screen:setAnimation(2772) end else screen:setAnimation(2774) end return finish(humanoid) end) local function action_use_screen_start(action, humanoid) local screen = action.object local class = humanoid.humanoid_class local anim, when_done local is_surgical = not not screen.num_green_outfits local change_to = math.random(1, 3) if class == "Elvis Patient" then anim, when_done = 946, finish humanoid:setType "Standard Male Patient" humanoid:setLayer(0, 2) humanoid:setLayer(1, math.random(0, 3) * 2) humanoid:setLayer(2, 2) elseif class == "Stripped Male Patient" then humanoid:setType "Standard Male Patient" anim, when_done = 1052, normal_state elseif class == "Stripped Female Patient" then humanoid:setType "Standard Female Patient" anim, when_done = 2844, normal_state elseif class == "Stripped Male Patient 2" then humanoid:setType "Standard Male Patient" anim, when_done = 1052, normal_state elseif class == "Stripped Female Patient 2" then humanoid:setType "Standard Female Patient" anim, when_done = 2844, normal_state elseif class == "Stripped Male Patient 3" then humanoid:setType "Standard Male Patient" anim, when_done = 1052, normal_state elseif class == "Stripped Female Patient 3" then humanoid:setType "Standard Female Patient" anim, when_done = 2844, normal_state elseif class == "Gowned Male Patient" then humanoid:setType "Standard Male Patient" anim, when_done = 4768, finish elseif class == "Gowned Female Patient" then humanoid:setType "Standard Female Patient" anim, when_done = 4770, finish elseif class == "Standard Male Patient" then if is_surgical then humanoid:setType "Gowned Male Patient" anim, when_done = 4760, finish else if change_to == 1 then humanoid:setType "Stripped Male Patient" anim, when_done = 1048, patient_clothes_state elseif change_to == 2 then humanoid:setType "Stripped Male Patient 2" anim, when_done = 1048, patient_clothes_state else humanoid:setType "Stripped Male Patient 3" anim, when_done = 1048, patient_clothes_state end end elseif class == "Standard Female Patient" then if is_surgical then humanoid:setType "Gowned Female Patient" anim, when_done = 4762, finish else if change_to == 1 then humanoid:setType "Stripped Female Patient" anim, when_done = 2848, patient_clothes_state elseif change_to == 2 then humanoid:setType "Stripped Female Patient 2" anim, when_done = 2848, patient_clothes_state else humanoid:setType "Stripped Female Patient 3" anim, when_done = 2848, patient_clothes_state end end elseif class == "Doctor" then humanoid:setType "Surgeon" when_done = surgical_state if screen.num_white_outfits > 0 then if screen.num_green_outfits > 1 then anim = 2780 else anim = 2784 end else anim = 2782 end screen.num_green_outfits = screen.num_green_outfits - 1 screen.num_white_outfits = screen.num_white_outfits + 1 elseif class == "Surgeon" then humanoid:setType "Doctor" when_done = surgical_state if screen.num_green_outfits > 0 then if screen.num_white_outfits > 1 then anim = 2796 else anim = 2790 end else anim = 2792 end screen.num_green_outfits = screen.num_green_outfits + 1 screen.num_white_outfits = screen.num_white_outfits - 1 else error(class .. " trying to use screen") end humanoid:setAnimation(anim) local mood_info = humanoid.mood_info humanoid.mood_info = nil -- Do not move mood_info humanoid:setTile(screen:getRenderAttachTile()) local offset = screen.object_type.orientations[screen.direction].animation_offset humanoid:setPosition(offset[1], offset[2]) humanoid.mood_info = mood_info humanoid:setSpeed(0, 0) humanoid:setTimer(humanoid.world:getAnimLength(anim), when_done) screen:setUser(humanoid) humanoid.user_of = screen action.must_happen = true if action.todo_interrupt == "high" then humanoid:setTimer(nil) when_done(humanoid) end end return action_use_screen_start CorsixTH-0.63/CorsixTH/Lua/humanoid_actions/use_staffroom.lua000066400000000000000000000152551347163623700243200ustar00rootroot00000000000000--[[ Copyright (c) 2009 Manuel Wolf 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. --]] class "UseStaffRoomAction" (HumanoidAction) ---@type UseStaffRoomAction local UseStaffRoomAction = _G["UseStaffRoomAction"] function UseStaffRoomAction:UseStaffRoomAction() self:HumanoidAction("use_staffroom") end -- decide on the next source of relaxation the humanoid will go to -- returns target_obj, ox, oy, new_type -- the function will always return a value for new_type, depending on what type was chosen, -- but target_obj, ox and oy will be nil, if no object of the chosen target was found local decide_next_target = permanent"use_staffroom_action_decide_next_target"( function(action, humanoid) assert(action.name == "use_staffroom", "decide_next_target only works with the use_staffroom action") local cur_type = action.target_type assert(class.is(humanoid, Staff), "decide_next_target called for non-staff humanoid") local h_class = humanoid.humanoid_class local chance = math.random(1, 10) -- take sofa as default local new_type = "sofa" -- With a chance of 20%, look for a pool table (Doctor and Handyman only) -- Don't choose pool table two times in a row though if (h_class == "Doctor" or h_class == "Handyman") and cur_type ~= "pool_table" and chance <= 2 then new_type = "pool_table" end -- With a chance of 20%, look for a video game (Doctor and Nurse only) -- Don't choose video game two times in a row though if (h_class == "Doctor" or h_class == "Nurse") and cur_type ~= "video_game" and 2 < chance and chance <= 4 then new_type = "video_game" end -- Take the a near object but not always the nearest (decreasing probability over distance) for some variation. local obj, ox, oy = humanoid.world:findFreeObjectNearToUse(humanoid, new_type, "near") return obj, ox, oy, new_type end) -- randomly generate the use time for a given source of relaxation local generate_use_time = permanent"use_staffroom_action_generate_use_time"( function(type) if type == "sofa" then return math.random(50, 80) elseif type == "pool_table" then return math.random(2, 5) elseif type == "video_game" then return math.random(2, 15) end end) -- table of how much relaxation an object gives per tick local relaxation = { sofa = 0.001, pool_table = 0.05, video_game = 0.05, } -- main function of the staffroom action local function use_staffroom_action_start(action, humanoid) assert(class.is(humanoid, Staff), "use_staffroom action called for non-staff humanoid") assert(humanoid.humanoid_class ~= "Receptionist", "use_staffroom action called for receptionist") -- For initial call of this function we have to decide a new target now -- Else, there should be already a new target defined if not action.next_target_type then action.target_obj, action.ox, action.oy, action.target_type = decide_next_target(action, humanoid) if action.target_obj then action.target_obj.reserved_for = humanoid end else action.target_obj = action.next_target_obj action.ox = action.next_ox action.oy = action.next_oy action.target_type = action.next_target_type action.next_target_obj = nil action.next_ox = nil action.next_oy = nil action.next_target_type = nil end -- If no target was found, then walk around for a bit and try again later if not action.target_obj then humanoid:queueAction(MeanderAction():setCount(2), 0) return end -- Otherwise, walk to and use the object: -- Note: force prolonged_usage, because video_game wouldn't get it by default (because it has no begin and end animation) local obj_use_time = generate_use_time(action.target_type) local loop_callback_use = --[[persistable:use_staffroom_action_loop_callback]] function(obj_action) humanoid:wake(relaxation[action.target_type]) -- if staff is no longer fatigued, make them leave the staff room if humanoid.attributes["fatigue"] == 0 then humanoid:setNextAction(humanoid:getRoom():createLeaveAction()) local room = humanoid.last_room -- Send back to the last room if that room is still empty. -- (applies to training and research only) -- Make sure that the room is still there though. -- If not, just answer the call if room and room.is_active and (room.room_info.id == "research" or room.room_info.id == "training") and room:testStaffCriteria(room:getMaximumStaffCriteria(), humanoid) then humanoid:queueAction(room:createEnterAction(humanoid)) humanoid:setDynamicInfoText(_S.dynamic_info.staff.actions.heading_for:format(room.room_info.name)) else -- Send the staff out of the room humanoid:queueAction(MeanderAction()) end else obj_use_time = obj_use_time - 1 -- if staff is done using object if obj_use_time == 0 then -- Decide on the next target. If it happens to be of the same type as the current, just continue using the current. -- also check x,y co-ords to see if the object actually exists in the room action.next_target_obj, action.next_ox, action.next_oy, action.next_target_type = decide_next_target(action, humanoid) if (not action.next_ox and not action.next_oy) or action.next_target_type == action.target_type then obj_use_time = generate_use_time(action.target_type) else if action.next_target_obj then action.next_target_obj.reserved_for = humanoid end obj_action.prolonged_usage = false end end end end local obj_action = UseObjectAction(action.target_obj):setProlongedUsage(true) :setLoopCallback(loop_callback_use) humanoid:queueAction(WalkAction(action.ox, action.oy), 0) humanoid:queueAction(obj_action, 1) end return use_staffroom_action_start CorsixTH-0.63/CorsixTH/Lua/humanoid_actions/vaccinate.lua000066400000000000000000000106131347163623700233720ustar00rootroot00000000000000--[[ Copyright (c) 2013 William "sadger" Gatens 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. --]] class "VaccinateAction" (HumanoidAction) ---@type VaccinateAction local VaccinateAction = _G["VaccinateAction"] -- Vaccinate action constructor for a nurse. --!param patient (Patient) Patient to vaccinate. --!param fee Amount of money to pay. function VaccinateAction:VaccinateAction(patient, fee) assert(class.is(patient, Patient), "Invalid value for parameter 'patient'") assert(type(fee) == "number", "Invalid value for parameter 'fee'") self:HumanoidAction("vaccinate") self.patient = patient -- Patient to vaccinate. self.vaccination_fee = fee -- Money to get from the patient. self:setMustHappen(true) end local is_in_adjacent_square = permanent"vacc_adjacent_square"( function (patient,nurse) local x1, y1 = patient.tile_x, patient.tile_y local x2, y2 = nurse.tile_x, nurse.tile_y if not x1 or not x2 or not y1 or not y2 then return false end -- Determine if they are in an adjacent square local x_diff = math.abs(x1-x2) local y_diff = math.abs(y1-y2) if (x_diff + y_diff == 1) then -- And neither of them are in a room so must be outside return (not patient:getRoom() and not nurse:getRoom()) end end) local find_face_direction = permanent"vacc_find_face_direction"( function(nurse, patient) local nx, ny = nurse.tile_x, nurse.tile_y local px, py = patient.tile_x, patient.tile_y local x_diff = px - nx local y_diff = py - ny if x_diff == 1 then return "east" elseif x_diff == -1 then return "west" elseif y_diff == -1 then return "north" elseif y_diff == 1 then return "south" end end) local interrupt_vaccination = permanent"action_interrupt_vaccination"( function(action, humanoid) local epidemic = humanoid.hospital.epidemic epidemic:interruptVaccinationActions(humanoid) humanoid:setTimer(1, humanoid.finishAction) end) local function vaccinate(action, nurse) assert(nurse.humanoid_class == "Nurse") local patient = action.patient local perform_vaccination = --[[persistable:action_perform_vaccination]] function(humanoid) -- Check if they STILL are in an adjacent square if is_in_adjacent_square(nurse, patient) then CallsDispatcher.queueCallCheckpointAction(nurse) nurse:queueAction(AnswerCallAction()) -- Disable either vaccination icon that may be present (edge case) patient:setMood("epidemy2", "deactivate") patient:setMood("epidemy3", "deactivate") patient:setMood("epidemy1", "activate") patient.vaccinated = true patient.hospital:spendMoney(action.vaccination_fee, _S.transactions.vaccination) patient:updateDynamicInfo() else patient:setMood("epidemy3", "deactivate") patient:setMood("epidemy2", "activate") -- Drop it they may not even be the vacc candidate anymore CallsDispatcher.queueCallCheckpointAction(nurse) nurse:queueAction(AnswerCallAction()) patient.reserved_for = nil end end if is_in_adjacent_square(nurse,patient) then local face_direction = find_face_direction(nurse,patient) nurse:queueAction(IdleAction():setDirection(face_direction):setCount(5) :setAfterUse(perform_vaccination):setOnInterrupt(interrupt_vaccination):setMustHappen(true)) else patient:removeVaccinationCandidateStatus() nurse:setCallCompleted() patient.reserved_for = nil nurse:queueAction(MeanderAction()) end nurse:finishAction() end return vaccinate CorsixTH-0.63/CorsixTH/Lua/humanoid_actions/vip_go_to_next_room.lua000066400000000000000000000054341347163623700255210ustar00rootroot00000000000000--[[ Copyright (c) 2012 Edvin "Lego3" Linge 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. --]] class "VipGoToNextRoomAction" (HumanoidAction) ---@type VipGoToNextRoomAction local VipGoToNextRoomAction = _G["VipGoToNextRoomAction"] function VipGoToNextRoomAction:VipGoToNextRoomAction() self:HumanoidAction("vip_go_to_next_room") end local action_vip_go_to_next_room_end = permanent"action_next_room_end"( function(humanoid) end) local function action_vip_go_to_next_room_start(action, humanoid) if humanoid.next_room_no == nil then -- This vip is done here. humanoid:goHome() else -- Walk to the entrance of the room and stay there for a while. local x, y = humanoid.next_room:getEntranceXY() local callback = --[[persistable:vip_next_room_enroute_cancel]] function() humanoid:setNextAction(IdleAction()) humanoid.waiting = 1 end humanoid:queueAction(WalkAction(x, y)) -- What happens if the room disappears: humanoid.next_room.humanoids_enroute[humanoid] = {callback = callback} -- Evaluation function local --[[persistable:vip_next_room_eval]] function evaluate() -- First remove the VIP from the humanoids_enroute list. humanoid.next_room.humanoids_enroute[humanoid] = nil --humanoid.next_room.door.reserved_for = humanoid humanoid:evaluateRoom() humanoid.waiting = 3 end -- Find direction to look at local ix, iy = humanoid.next_room:getEntranceXY(true) local dir = "north" if iy > y then dir = "south" elseif iy == y then if ix < x then dir = "west" else dir = "east" end end humanoid:queueAction(IdleAction():setLoopCallback(evaluate):setDirection(dir)) -- Finish this action and start the above sequence. humanoid:finishAction() end end return action_vip_go_to_next_room_start CorsixTH-0.63/CorsixTH/Lua/humanoid_actions/vomit.lua000066400000000000000000000041071347163623700225740ustar00rootroot00000000000000--[[ Copyright (c) 2009 Darrell "redneon" Blake 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. --]] class "VomitAction" (HumanoidAction) ---@type VomitAction local VomitAction = _G["VomitAction"] function VomitAction:VomitAction() self:HumanoidAction("vomit") self:setMustHappen(true) end local action_vomit_end = permanent"action_vomit_end"( function(humanoid) local litter = humanoid.world:newObject("litter", humanoid.tile_x, humanoid.tile_y) litter:setLitterType("puke", humanoid.last_move_direction == "south" and 0 or 1) --For some reason the vomit is inverted. humanoid:finishAction() end) local function action_vomit_start(action, humanoid) if math.random(0, 1) == 1 then humanoid.last_move_direction = "east" else humanoid.last_move_direction = "south" end assert(humanoid.vomit_anim, "Error: no vomit animation for humanoid " .. humanoid.humanoid_class) action.must_happen = true humanoid:setAnimation(humanoid.vomit_anim, humanoid.last_move_direction == "east" and 0 or 1) humanoid:setTimer(humanoid.world:getAnimLength(humanoid.vomit_anim), action_vomit_end) end return action_vomit_start CorsixTH-0.63/CorsixTH/Lua/humanoid_actions/walk.lua000066400000000000000000000370131347163623700223760ustar00rootroot00000000000000--[[ Copyright (c) 2009 Peter "Corsix" Cawley 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. --]] class "WalkAction" (HumanoidAction) ---@type WalkAction local WalkAction = _G["WalkAction"] --! Action to walk to a given position. --!param x (int) X coordinate of the destination tile. --!param y (int) Y coordinate of the destination tile. function WalkAction:WalkAction(x, y) assert(type(x) == "number", "Invalid value for parameter 'x'") assert(type(y) == "number", "Invalid value for parameter 'y'") self:HumanoidAction("walk") self.x = x self.y = y self.truncate_only_on_high_priority = false self.walking_to_vaccinate = false -- Nurse walking with the intention to vaccinate self.is_entering = false -- Whether the walk enters a room. end function WalkAction:truncateOnHighPriority() self.truncate_only_on_high_priority = true return self end --! Nurse is walking with the intention to vaccinate. --!return (action) self, for daisy-chaining. function WalkAction:enableWalkingToVaccinate() self.walking_to_vaccinate = true return self end --! Set a flag whether the walk enters a room. --!param entering (bool) If set or nil, set the flag of entering the room. --!return (action) self, for daisy-chaining. function WalkAction:setIsEntering(entering) assert(type(entering) == "boolean", "Invalid value for parameter 'entering'") self.is_entering = entering return self end local action_walk_interrupt action_walk_interrupt = permanent"action_walk_interrupt"( function(action, humanoid, high_priority) if action.truncate_only_on_high_priority and not high_priority then action.on_interrupt = action_walk_interrupt return end -- Truncate the remainder of the path for j = #action.path_x, action.path_index + 1, -1 do action.path_x[j] = nil action.path_y[j] = nil end -- Unreserve any door which we had reserved unless specifically told not to. if not action.keep_reserved then local door = action.reserve_on_resume if door and (door.reserved_for == humanoid or class.is(humanoid, Vip)) then -- "or class.is(humanoid, Vip)" is added as a temporary fix -- TODO: find the cause of the "VIP bug", why does the door not get unreserved sometimes when the VIP has looked into a room? See issue 1025 door.reserved_for = nil if door.queue:size() > 0 then door.queue:pop() door:updateDynamicInfo() end end else -- This flag can be used only once at a time. action.keep_reserved = nil end -- Unexpect the patient from a possible destination room. if humanoid.next_room_to_visit then local door = humanoid.next_room_to_visit.door if door.queue then door.queue:unexpect(humanoid) door:updateDynamicInfo() end end -- Terminate immediately if high-priority if high_priority then local timer_function = humanoid.timer_function humanoid:setTimer(nil) timer_function(humanoid) end if action.walking_to_vaccinate then local hospital = humanoid.hospital or humanoid.last_hospital local epidemic = hospital.epidemic if epidemic then epidemic:interruptVaccinationActions(humanoid) end end end) local flag_list_bottom = 2048 local flag_flip_h = 1 local navigateDoor local function action_walk_raw(humanoid, x1, y1, x2, y2, map, timer_fn) local factor = 1 local quantity = 8 if humanoid.speed and humanoid.speed == "fast" then factor = 2 quantity = 4 end local anims = humanoid.walk_anims local world = humanoid.world local notify_object = world:getObjectToNotifyOfOccupants(x2, y2) if notify_object then notify_object:onOccupantChange(1) end notify_object = world:getObjectToNotifyOfOccupants(x1, y1) if notify_object then notify_object:onOccupantChange(-1) end if x1 ~= x2 then if x1 < x2 then if map and map:getCellFlags(x2, y2).doorWest then return navigateDoor(humanoid, x1, y1, "east") else humanoid.last_move_direction = "east" humanoid:setAnimation(anims.walk_east) humanoid:setTilePositionSpeed(x2, y2, -32, -16, 4*factor, 2*factor) end else if map and map:getCellFlags(x1, y1).doorWest then return navigateDoor(humanoid, x1, y1, "west") else humanoid.last_move_direction = "west" humanoid:setAnimation(anims.walk_north, flag_flip_h) humanoid:setTilePositionSpeed(x1, y1, 0, 0, -4*factor, -2*factor) end end else if y1 < y2 then if map and map:getCellFlags(x2, y2).doorNorth then return navigateDoor(humanoid, x1, y1, "south") else humanoid.last_move_direction = "south" humanoid:setAnimation(anims.walk_east, flag_flip_h) humanoid:setTilePositionSpeed(x2, y2, 32, -16, -4*factor, 2*factor) end else if map and map:getCellFlags(x1, y1).doorNorth then return navigateDoor(humanoid, x1, y1, "north") else humanoid.last_move_direction = "north" humanoid:setAnimation(anims.walk_north) humanoid:setTilePositionSpeed(x1, y1, 0, 0, 4*factor, -2*factor) end end end humanoid:setTimer(quantity, timer_fn) end local flags_here, flags_there = {}, {} local action_walk_tick; action_walk_tick = permanent"action_walk_tick"( function(humanoid) local action = humanoid:getCurrentAction() local path_x = action.path_x local path_y = action.path_y local path_index = action.path_index local check_doors = not not humanoid.door_anims local x1, y1 = path_x[path_index ], path_y[path_index ] local x2, y2 = path_x[path_index+1], path_y[path_index+1] if not x2 then -- Arrival at final tile humanoid:setTilePositionSpeed(x1, y1) if action.on_next_tile_set then action.on_next_tile_set() end humanoid:finishAction(action) return end -- Make sure that the next tile hasn't somehow become impassable since our -- route was determined local map = humanoid.world.map.th map:getCellFlags(x1, y1, flags_here) map:getCellFlags(x2, y2, flags_there) local recalc_route = not flags_there.passable and flags_here.passable -- Also make sure that a room hasn't unexpectedly been built on top of the -- path since the route was calculated. if not recalc_route and flags_here.roomId ~= flags_there.roomId then -- if going to the corridor we don't care as we are at the door -- as this will be false we won't bother checking for rerouting recalc_route = flags_there.room local door = TheApp.objects.door.id local door2 = TheApp.objects.swing_door_right.id local doorcheck = {[door] = true, [door2] = true} -- but we should see if this is the same room id we want to go to and cancel the reroute -- ensure we still have a door on this route if recalc_route and (humanoid.world:getObject(x1, y1, doorcheck) or humanoid.world:getObject(x2, y2, doorcheck)) and -- is there any door map:getCellFlags(path_x[#path_x], path_y[#path_y]).roomId == flags_there.roomId then recalc_route = false end end if recalc_route then if map:getCellFlags(x1, y1).passable then humanoid:setTilePositionSpeed(x1, y1) if action.on_next_tile_set then action.on_next_tile_set() end return action:on_restart(humanoid) end end -- on_next_tile_set can be set in the call to action_walk_raw, but it is -- then to be called AFTER the next raw walk or tile set, which is why we -- remember the previous value and call that, rather than call the new value. local on_next_tile_set = action.on_next_tile_set action_walk_raw(humanoid, x1, y1, x2, y2, check_doors and map, action_walk_tick) action.path_index = path_index + 1 if on_next_tile_set then on_next_tile_set() end end) -- This is a slight hack, but is the easiest way to make walk functionality -- available to other actions which want to do low-level walk operations. strict_declare_global "HumanoidRawWalk" HumanoidRawWalk = action_walk_raw local action_walk_tick_door = permanent"action_walk_tick_door"( function(humanoid) local door = humanoid.user_of if not class.is(door, SwingDoor) then -- The doors will need to finish swinging before another humanoid can walk through. door:removeUser(humanoid) end humanoid.user_of = nil return action_walk_tick(humanoid) end) navigateDoor = function(humanoid, x1, y1, dir) local action = humanoid:getCurrentAction() local duration = 12 local dx = x1 local dy = y1 if dir == "east" then dx = dx + 1 duration = 10 elseif dir == "south" then dy = dy + 1 duration = 10 end local swinging = false local door = humanoid.world:getObject(dx, dy, "door") if not door then swinging = true door = humanoid.world:getObject(dx, dy, "swing_door_right") end door.queue:unexpect(humanoid) door:updateDynamicInfo() local room = door:getRoom() local is_entering_room = room and humanoid:getRoom() ~= room if class.is(humanoid, Staff) and is_entering_room and humanoid.humanoid_class ~= "Handyman" then -- A member of staff is entering, but is maybe no longer needed -- in this room? if not room.is_active or not room:staffFitsInRoom(humanoid) then humanoid:queueAction(IdleAction(), 0) humanoid:setTilePositionSpeed(x1, y1) humanoid:setNextAction(IdleAction():setCount(10), 0) humanoid:queueAction(MeanderAction()) return end end if door.user or (door.reserved_for and door.reserved_for ~= humanoid) or (is_entering_room and not room:canHumanoidEnter(humanoid)) then --queueing patients are no longer enroute room.humanoids_enroute[humanoid] = nil local queue = door.queue if door.reserved_for == humanoid then door.reserved_for = nil if queue:size() > 0 and room.is_active then queue:pop() door:updateDynamicInfo() end end humanoid:setTilePositionSpeed(x1, y1) local action_index = 0 if is_entering_room and queue:size() == 0 and not room:getPatient() and not door.user and not door.reserved_for and humanoid.should_knock_on_doors and room.room_info.required_staff and not swinging then humanoid:queueAction(KnockDoorAction(door, dir), action_index) action_index = action_index + 1 end humanoid:queueAction(QueueAction(x1, y1, queue):setIsLeaving(humanoid:isLeaving()) :setReserveWhenDone(door), action_index) action.must_happen = action.saved_must_happen action.reserve_on_resume = door return end if action.reserve_on_resume then assert(action.reserve_on_resume == door) action.reserve_on_resume = nil elseif is_entering_room and not action.done_knock and humanoid.should_knock_on_doors and room.room_info.required_staff and not swinging then humanoid:setTilePositionSpeed(x1, y1) humanoid:queueAction(KnockDoorAction(door, dir), 0) action.reserve_on_resume = door action.done_knock = true return end local to_x, to_y local anims = humanoid.door_anims if not anims.leaving or not anims.entering then local from_rm, to_rm = room.room_info.id, "corridor" if is_entering_room then from_rm, to_rm = to_rm, from_rm end error(("Humanoid (%s) without door animations trying to walk through ".. "door (from %s to %s)"):format(humanoid.humanoid_class, from_rm, to_rm)) end humanoid:setTilePositionSpeed(dx, dy) humanoid.user_of = door door:setUser(humanoid) local entering, leaving if swinging then entering = anims.entering_swing leaving = anims.leaving_swing duration = humanoid.world:getAnimLength(entering) else entering = anims.entering leaving = anims.leaving end local direction = "in" if dir == "north" then humanoid:setAnimation(leaving, flag_list_bottom) to_x, to_y = dx, dy - 1 duration = humanoid.world:getAnimLength(leaving) elseif dir == "west" then humanoid:setAnimation(leaving, flag_list_bottom + flag_flip_h) to_x, to_y = dx - 1, dy duration = humanoid.world:getAnimLength(leaving) elseif dir == "east" then humanoid:setAnimation(entering, flag_list_bottom) to_x, to_y = dx, dy direction = "out" elseif dir == "south" then humanoid:setAnimation(entering, flag_list_bottom + flag_flip_h) to_x, to_y = dx, dy direction = "out" end humanoid.last_move_direction = dir if swinging then door:swingDoors(direction, duration) end -- We want to notify the rooms on either side of the door that the humanoid -- has entered / left, but we want to do this AFTER the humanoid has gone -- through the door (so that their tile position reflects the room which they -- are now in). local --[[persistable:action_walk_on_next_tile_set]] function on_next_tile_set() if action.on_next_tile_set == on_next_tile_set then action.on_next_tile_set = nil end local rm = humanoid.world:getRoom(x1, y1) if rm then rm:onHumanoidLeave(humanoid) end rm = humanoid.world:getRoom(to_x, to_y) if rm then rm:onHumanoidEnter(humanoid) end end action.on_next_tile_set = on_next_tile_set if is_entering_room then humanoid.in_room = room end action.path_index = action.path_index + 1 humanoid:setTimer(duration, action_walk_tick_door) end local function action_walk_start(action, humanoid) -- Possible future optimisation: when walking from somewhere inside the hospital -- to somewhere outside the hospital (or from one building to another?), do -- pathfinding in two steps, with the building door as a middle node local path_x, path_y = humanoid.world:getPath(humanoid.tile_x, humanoid.tile_y, action.x, action.y) if not path_x or #path_x == 1 then -- Finishing an action from within the start handler is a very bad idea, as -- it is normal when ordering several actions to setNextAction the first -- one, then queueAction the rest. If the first starts straight away, and -- then finishes straight away, then the humanoid is left with an empty -- action queue. Hence we wait one tick before finishing. We still need to -- set the humanoid animation / position though, which is delegated to the -- idle action (if this wasn't done, then the previous animation would be -- used, which might involve an object). TheApp.humanoid_actions.idle(action, humanoid) humanoid:setTimer(1, humanoid.finishAction) return end action.path_x = path_x action.path_y = path_y action.path_index = 1 if not action.no_truncate then action.on_interrupt = action_walk_interrupt end action.on_restart = action_walk_start action.saved_must_happen = action.must_happen action.must_happen = true if action.reserve_on_resume and not action.todo_interrupt then action.reserve_on_resume.reserved_for = humanoid end return action_walk_tick(humanoid) end return action_walk_start CorsixTH-0.63/CorsixTH/Lua/humanoid_actions/yawn.lua000066400000000000000000000033351347163623700224160ustar00rootroot00000000000000--[[ Copyright (c) 2011 Mark "Mark.L" Lawlor 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. --]] class "YawnAction" (HumanoidAction) ---@type YawnAction local YawnAction = _G["YawnAction"] function YawnAction:YawnAction() self:HumanoidAction("yawn") self:setMustHappen(true) end local action_yawn_end = permanent"action_yawn_end"( function(humanoid) humanoid:finishAction() end) local function action_yawn_start(action, humanoid) assert(humanoid.yawn_anim, "Error: yawning animation for humanoid " .. humanoid.humanoid_class) action.must_happen = true humanoid:setAnimation(humanoid.yawn_anim, humanoid.last_move_direction == "east" and 0 or 1) humanoid:setTimer(humanoid.world:getAnimLength(humanoid.yawn_anim), action_yawn_end) end return action_yawn_start CorsixTH-0.63/CorsixTH/Lua/languages/000077500000000000000000000000001347163623700173535ustar00rootroot00000000000000CorsixTH-0.63/CorsixTH/Lua/languages/brazilian_portuguese.lua000066400000000000000000005573311347163623700243310ustar00rootroot00000000000000--[[ Copyright (c) 2010 Manuel "Roujin" Wolf Copyright (c) 2012 Henrique Poyatos Copyright (c) 2014 Leonardo Malaman (LeonardoGamer) Copyright (c) 2018 Altieres Lima da Silva 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. --]] Language("Português Brasileiro", "Brazilian Portuguese", "pt_br", "br") Inherit("English") Encoding(utf8) ------------------------------- OVERRIDE ---------------------------------- adviser.warnings.money_low = "Você está ficando sem dinheiro!" -- Funny. Exists in German translation, but not existent in english? -- TODO: tooltip.graphs.reputation -- this tooltip talks about hospital value. Actually it should say reputation. -- TODO: tooltip.status.close -- it's called status window, not overview window. -- tooltip.staff_list.next_person, prev_person is rather next/prev page (also in german, maybe more languages?) tooltip.staff_list.next_person = "Mostrar a página seguinte" tooltip.staff_list.prev_person = "Mostrar a página anterior" tooltip.status.reputation = "Sua reputaçäo näo deve estar abaixo de %d. Atualmente tem %d" tooltip.status.balance = "Näo deve ter menos que $%d no banco. Atualmente tem $%d" -- The originals of these two contain one space too much fax.emergency.cure_not_possible_build = "Você precisará construir um(a) %s" fax.emergency.cure_not_possible_build_and_employ = "Você precisará construir um(a) %s e contratar um(a)" fax.emergency.num_disease = "Existem %d pessoas com %s e precisam ser atendidas imediatamente." adviser.goals.lose.kill = "Mate mais %d pacientes para perder o nível!" -- Improve tooltips in staff window to mention hidden features tooltip.staff_window.face = "Rosto da pessoa - clique para abrir a tela de gerenciamento." tooltip.staff_window.center_view = "Clique esquerdo para fixar-se na pessoa, botäo direito para rodar entre os funcionários." -- These strings are missing in some versions of TH (unpatched?) confirmation.restart_level = "Você tem certeza de que deseja reiniciar o nível?" -- TODO adviser.multiplayer.objective_completed -- TODO adviser.multiplayer.objective_failed -- Replace Billy Savile -- this is only relevant to the English game so does not need adding -- in other language files vip_names = { [6] = "O Presidente da Cruz Vermelha", } -- A small error in the introduction text of level 2 introduction_texts.level2 = "Há uma grande variedade de doenças nesta área. Prepare o seu hospital para tratar mais pacientes " .. "e para a construçäo de um Centro de Pesquisa. Lembre-se que deve manter limpo o hospital e procurar atingir a " .. "sua mais alta reputaçäo possível. Tratará doenças como a língua comprida, entäo necessitará de uma sala de " .. "laringologia. Também pode construir uma cardiologia para diagnosticar novas doenças. Estas duas consultas deveräo " .. "ser pesquisadas antes de as construir. Também pode comprar mais terreno para aumentar o seu hospital. " .. "Para isso, utilize o mapa da cidade. Obtenha uma reputaçäo de 300 um saldo de bancário de $10,000 e 40 pessoas curadas. " -- An override for the squits becoming the the squits see issue 1646 adviser.research.drug_improved_1 = "Seu Centro de Pesquisa melhorou o medicamento para %s" ------------------------------- NEW STRINGS ------------------------------- date_format = { daymonth = "%1% %2:months%", } object.litter = "Lixo" tooltip.objects.litter = "Lixo: Um paciente jogou porque näo encontrou um cesto de lixo." object.rathole = "Buraco de rato" tooltip.objects.rathole = "Casa de uma família de ratos que encontrou seu hospital sujo o suficiente para morar nele." tooltip.fax.close = "Fecha esta janela sem apagar a mensagem." tooltip.message.button = "Clique com o botäo esquerdo para abrir a mensagem" tooltip.message.button_dismiss = "Clique com o botäo esquerdo para abrir a mensagem e botäo direto para recusá-la" tooltip.casebook.cure_requirement.hire_staff = "Você precisa contratar empregados para realizar este tratamento." tooltip.casebook.cure_type.unknown = "Você ainda näo sabe como tratar esta doença" tooltip.research_policy.no_research = "Nenhuma pesquisa está sendo feita nesta categoria no momento." tooltip.research_policy.research_progress = "Progresso para a próxima descoberta nesta categoria: %1%/%2%" menu["player_count"] = "QUANTIDADE DE JOGADORES" menu_file = { load = " (%1%) CARREGAR ", save = " (%1%) SALVAR ", restart = " (%1%) REINICIAR ", quit = " (%1%) SAIR ", } menu_options = { sound = " (%1%) SOM ", announcements = " (%1%) ANUNCIOS ", music = " (%1%) MUSICA ", jukebox = " (%1%) MAQUINA DE DISCOS ", lock_windows = " TRAVAR JANELAS ", edge_scrolling = " ROLAR MARGEM ", capture_mouse = " CAPTURAR MOUSE ", adviser_disabled = " (%1%) CONSELHEIRO ", warmth_colors = " CORES QUENTES ", wage_increase = " EXIGENCIAS SALARIAS ", twentyfour_hour_clock = " RELOGIO DE 24 HORAS ", } menu_options_game_speed = { pause = " (%1%) PAUSAR ", slowest = " (%1%) MUITO LENTO ", slower = " (%1%) LENTO ", normal = " (%1%) NORMAL ", max_speed = " (%1%) RAPIDO ", and_then_some_more = " (%1%) MUITO RAPIDO ", } menu_options_warmth_colors = { choice_1 = " VERMELHO ", choice_2 = " AZUL VERDE VERMELHO ", choice_3 = " AMARELO LARANJA VERMELHO ", } menu_options_wage_increase = { grant = " PERMITIR ", deny = " NEGAR ", } -- Add F-keys to entries in charts menu (except briefing), also town_map was added. menu_charts = { bank_manager = " (%1%) GERENTE DO BANCO ", statement = " (%1%) ESTADO DA CONTA ", staff_listing = " (%1%) LISTA DOS FUNCIONARIOS ", town_map = " (%1%) MAPA DA CIDADE ", casebook = " (%1%) FICHA CLINICA ", research = " (%1%) PESQUISA ", status = " (%1%) ESTADO ", graphs = " (%1%) GRAFICO ", policy = " (%1%) NORMAS ", } menu_debug = { jump_to_level = " SALTAR PARA NIVEL ", connect_debugger = " (%1%) CONECTAR SERVIDOR LUA DBGp ", transparent_walls = " (%1%) PAREDES TRANSPARENTES ", limit_camera = " LIMITAR CAMERA ", disable_salary_raise = " DESATIVAR AUMENTO DE SALARIO ", make_debug_fax = " FAZER DEBUG DO FAX ", make_debug_patient = " FAZER DEBUG DO PACIENTE ", cheats = " (%1%) TRAPAÇAS ", lua_console = " (%1%) CONSOLE LUA ", debug_script = " (%1%) RODAR SCRIPT DE DEBUG ", calls_dispatcher = " CHAMAR CONTROLADOR ", dump_strings = " DUMPAR TEXTOS DO JOGO ", dump_gamelog = " (%1%) DUMPAR LOG DO JOGO ", map_overlay = " SOBREPOR MAPA ", sprite_viewer = " VISUALIZADOR DE SPRITE ", } menu_debug_overlay = { none = " NADA ", flags = " MARCAS ", positions = " POSIÇOES ", heat = " TEMPERATURA ", byte_0_1 = " BYTE 0 Y 1 ", byte_floor = " BYTE SOLO ", byte_n_wall = " BYTE PAREDE NORTE ", byte_w_wall = " BYTE PAREDE OESTE ", byte_5 = " BYTE 5 ", byte_6 = " BYTE 6 ", byte_7 = " BYTE 7 ", parcel = " PARCELA ", } menu_player_count = { players_1 = " 1 JOGADOR ", players_2 = " 2 JOGADORES ", players_3 = " 3 JOGADORES ", players_4 = " 4 JOGADORES ", } adviser = { room_forbidden_non_reachable_parts = "Construir a sala neste local resultará em alas do hospital que näo poderäo ser acessadas.", warnings = { no_desk = "Você precisa comprar um balcäo de recepçäo e contratar uma recepcionista em algum momento!", no_desk_1 = "Se você quer que os pacientes venham ao seu hospital, você precisa contratar uma recepcionista e comprar um balcäo para recepcioná-los!", no_desk_2 = "Excelente, isso provavelmente é um recorde mundial - quase um ano e nenhum paciente! Se você deseja continuar administrando este hospital, você precisa urgente contratar uma recepcionista e comprar um balcäo para que ela possa trabalhar!", no_desk_3 = "Brilhante, se passou quase um ano e ainda näo tem uma recepcionista! Como quer que os pacientes apareçam? Arrume uma recepcionista e deixe de perder tempo!", no_desk_4 = "Uma recepcionista necessita de uma mesa para atender os pacientes que aparecem.", no_desk_5 = "Já era hora! Os pacientes começaräo a chegar logo.", no_desk_6 = "Você tem uma recepcionista, que tal se construir uma mesa de recepçäo para que possa trabalhar?", no_desk_7 = "Você construiu a mesa da recepçäo, entäo que tal contratar um recepcionista? Você näo receberá nenhum paciente até que contrate uma.", cannot_afford = "Seu saldo bancário é insuficiente para contratar esta pessoa!", cannot_afford_2 = "Näo tem dinheiro para comprar isso!", falling_1 = "Ei! Isso näo é engraçado, cuidado onde aponta este mouse; alguém pode se machucar!", falling_2 = "Gostou da queda? Pare de bagunçar!", falling_3 = "Ai, isso dói, alguém chame um médico!", falling_4 = "Isto é um Hospital, näo um parque de diversöes!", falling_5 = "Este näo é o local para empurrar as pessoas, elas estäo doentes sabia?!", falling_6 = "Aqui näo é uma pista de boliche, pessoas doentes näo deveriam ser tratadas desta forma!", research_screen_open_1 = "Para acessar a tela de pesquisa, tem que construir um Centro de Pesquisa.", research_screen_open_2 = "Näo é possível realizar pesquisas nessa fase.", researcher_needs_desk_1 = "Uma pesquisa necessita de uma mesa para trabalhar.", researcher_needs_desk_2 = "Seu pesquisador agradece que lhe tenha dado um descanso. Se pretende ter mais pessoas pesquisando, deve dar a cada um uma mesa para trabalhar.", researcher_needs_desk_3 = "Cada pesquisa necessita de uma mesa para trabalhar.", nurse_needs_desk_1 = "Cada enfermeira necessita de uma mesa para trabalhar.", nurse_needs_desk_2 = "Sua enfermeira agradece que lhe tenha dado um descanso. Se pretende ter mais pessoas trabalhando na enfermaria, tem que dar a cada uma delas uma mesa para trabalhar.", low_prices = "Você está cobrando muito pouco pelo uso de %s. Isto trará pessoas para o seu hospital, mas você näo fará muito lucro com cada uma delas.", high_prices = "Você está cobrando muito pelo uso de %s. Isto trará grande lucro a curto prazo, mas no final das contas você começará a afugentar as pessoas para longe do seu hospital.", fair_prices = "O preço de %s parece justo.", patient_not_paying = "Um paciente se foi sem pagar por %s porque é muito caro!", }, cheats = { th_cheat = "Parabéns, você habilitou os códigos de trapaça!", roujin_on_cheat = "Desafio Roujin ativado! Boa sorte...", roujin_off_cheat = "Desafio Roujin desativado.", }, } dynamic_info.patient.actions.no_gp_available = "Esperando que construa um Consultório Geral" dynamic_info.staff.actions.heading_for = "Dirigindo-se para %s" dynamic_info.staff.actions.fired = "Despedido" dynamic_info.patient.actions.epidemic_vaccinated = "Eu näo sou mais contagioso" progress_report.free_build = "CONSTRUÇAO LIVRE" fax = { choices = { return_to_main_menu = "Voltar para menu principal", accept_new_level = "Ir para o próximo nível", decline_new_level = "Continuar jogando um pouco mais", }, emergency = { num_disease_singular = "Existe uma pessoa com %s que precisa urgente de sua atençäo.", free_build = "Se você for bem sucedido sua reputaçäo aumentará, mas se você falhar sua reputaçäo será bastante prejudicada.", }, vip_visit_result = { remarks = { free_build = { "Seu hospital é muito bom! Näo é difícil mantê-lo sem limitaçöes econômicas, né?", "Näo sou economista, mas até eu poderia dirigir este hospital, se é que você me entende...", "Um hospital muito bem cuidado. Mas tome cuidado a crise financeira! Certo... você näo tem que se preocupar com isso.", } } } } letter = { dear_player = "Prezado(a) %s\n", custom_level_completed = "Parabéns! Você completou todos os objetivos desta fase personalizada!", return_to_main_menu = "Deseja retornar ao menu principal ou continuar jogando?", campaign_level_completed = "Bom trabalho! Você superou este nível, mas ainda näo acabou!\n Você se interessaria em aceitar um posto no hospital %s?", campaign_completed = "Incrível! Você conseguiu superar todos os níveis. Já pode relaxar e desfrutar enquanto fala das suas realizaçöes nos fóruns de toda a Internet. Boa sorte!", campaign_level_missing = "Desculpe, parece que o próximo nível desta campanha está faltando. (Nome: %s)", } install = { title = "----------------------- Configuraçäo do CorsixTH -----------------------", th_directory = "O CorsixTH precisa de uma cópia dos arquivos de dados do Theme Hospital original (ou a demo) para executar. Utilize o seletor abaixo para localizar o diretório onde o jogo Theme Hospital está instalado.", ok = "OK", exit = "Sair", cancel = "Cancelar", } misc.not_yet_implemented = "(ainda näo implementado)" misc.no_heliport = "Uma das doença ainda näo foi descoberta, ou näo existe um heliporto neste mapa. Talvez precise comprar uma mesa de recepçäo e contratar a uma recepcionista." main_menu = { new_game = "Campanha", custom_campaign = "Campanha Personalizada", custom_level = "Cenário Personalizado", continue = "Continuar Jogo", load_game = "Carregar Jogo", options = "Configuraçöes", map_edit = "Editor de Mapa", savegame_version = "Versäo do jogo salvo: ", version = "Versäo: ", exit = "Sair", } tooltip.main_menu = { new_game = "Começar o primeiro nível da campanha", custom_campaign = "Jogar uma campanha criada pela comunidade.", custom_level = "Construir seu hospital em um cenário único", continue = "Continuar seu último jogo salvo.", load_game = "Carregar um jogo salvo", options = "Ajustar várias configuraçöes", map_edit = "Criar um mapa personalizado", exit = "Näo, näo, por favor, näo vá", quit = "Você deseja realmente sair do CorsixTH?", } load_game_window = { caption = "Carregar Jogo (%1%)", } tooltip.load_game_window = { load_game = "Carregar jogo %s", load_game_number = "Carregar jogo %d", load_autosave = "Carregar jogo salvo automaticamente", } custom_game_window = { caption = "Jogo Personalizado", free_build = "Construçäo Livre", load_selected_level = "Iniciar", } tooltip.custom_game_window = { choose_game = "Clique em um nível para ver mais informaçäo sobre o mesmo.", free_build = "Marque esta opçäo se quiser jogar sem dinheiro nem condiçöes de vitória ou derrota.", load_selected_level = "Carregar e jogar o nível selecionado", } custom_campaign_window = { caption = "Campanha Personalizada", start_selected_campaign = "Iniciar Campanha", } tooltip.custom_campaign_window = { choose_campaign = "Selecione uma campanha para ver mais informaçäo sobre a mesma.", start_selected_campaign = "Carregar o primeiro nível desta campanha", } save_game_window = { caption = "Salvar Jogo (%1%)", new_save_game = "Novo jogo salvo", } tooltip.save_game_window = { save_game = "Substituir jogo salvo %s", new_save_game = "Digite um nome para o jogo salvo.", } save_map_window = { caption = "Salvar Mapa (%1%)", new_map = "Novo Mapa", } tooltip.save_map_window = { map = "Substituir mapa %s", new_map = "Digite um nome para o novo mapa salvo", } menu_list_window = { name = "Nome", save_date = "Modificado", back = "Voltar", } tooltip.menu_list_window = { name = "Aperte aqui para ordenar a lista por nomes", save_date = "Aperte aqui para ordenar a lista pela última data de modificaçäo", back = "Fechar esta janela.", } options_window = { caption = "Configuraçöes", option_on = "Ligar", option_off = "Desligar", fullscreen = "Tela Cheia", resolution = "Resoluçäo", capture_mouse = "Capturar Mouse", custom_resolution = "Personalizar...", width = "Largura", height = "Altura", audio = "Audio Geral", customise = "Personalizar", folder = "Pastas", language = "Idioma do Jogo", apply = "Aplicar", cancel = "Cancelar", back = "Voltar", } tooltip.options_window = { fullscreen = "Se o jogo deve ser executado em tela cheia ou modo janela", fullscreen_button = "Clique para mudar para tela cheia", resolution = "A resoluçäo que o jogo deve ser executado", select_resolution = "Selecionar uma nova resoluçäo", capture_mouse = "Clique para alternar a captura do cursor na janela do jogo", width = "Digite a largura desejada", height = "Digite a altura desejada", apply = "Aplicar a resoluçäo digitada", cancel = "Voltar sem mudar a resoluçäo", audio_button = "Ligar ou desligar o áudio de todo o jogo", audio_toggle = "Alternar entre ligado e desligado", customise_button = "Você pode alterar mais configuraçöes para personalizar sua experiência de jogo", folder_button = "Opçöes de pasta", language = "O idioma em que os textos do jogo apareceräo", select_language = "Selecione o idioma do jogo", language_dropdown_item = "Selecionar %s como idioma", back = "Fechar a janela de Configuraçöes", } customise_window = { caption = "Config. Personalizadas", option_on = "Ligado", option_off = "Desligado", back = "Voltar", movies = "Vídeo Geral", intro = "Vídeo de Introduçäo", paused = "Construir em Pausa", volume = "Tecla de Volume", aliens = "Pacientes Alienígenas", fractured_bones = "Ossos Fraturados", average_contents = "Conteúdos Habituais", } tooltip.customise_window = { movies = "Controle geral de vídeos, que permitirá a você desativar todos os vídeos", intro = "Desligar ou ligar o vídeo de introduçäo, vídeos gerais precisaräo estar ligados se você quiser o vídeo de introduçäo rode quando você carregar o CorsixTH", paused = "No Theme Hospital o jogador só teria permissäo para utilizar o menu superior se o jogo estivesse pausado. Esta é também a configuraçäo padräo no CorsixTH, mas habilitando isso você tem permissäo para acessar tudo enquanto o jogo está pausado", volume = "Se a tecla de baixar volume abrir também a ficha clínica, utilize esta opçäo para mudar o atalho para direto a ficha clínica para Shift + C.", aliens = "Devido à falta de animaçöes decentes disponíveis, fizemos com que os pacientes com DNA alienígena só apareçam em uma emergência. Para permitir que os pacientes com DNA alienígena possam visitar seu hospital, desative esta opçäo.", fractured_bones = "Devido a uma animaçäo deficiente, fizemos que näo existam pacientes com Fraturas ósseas femininas. Para permitir que as pacientes com Fraturas ósseas visitem seu hospital, desative esta opçäo.", average_contents = "Se você quiser que o jogo lembre que objetos extras você normalmente adiciona quando constrói salas, entäo ligue esta opçäo", back = "Fecha este menu e volta para o Menu de Configuraçöes", } folders_window = { caption = "Localizaçäo de Pastas", data_label = "Dados do TH", font_label = "Fonte", music_label = "Músicas", savegames_label = "Jogos Salvos", screenshots_label = "Capturas de Tela", -- next four are the captions for the browser window, which are called from the folder setting menu new_th_location = "Aqui pode especificar uma nova pasta de instalaçäo do Theme Hospital. O jogo será reiniciado assim que selecionar a nova pasta.", savegames_location = "Selecione a pasta que quer utilizar para seus jogos salvos.", music_location = "Selecione a pasta que quer utilizar para sua música.", screenshots_location = "Selecione a pasta que quer utilizar para suas capturas de tela.", back = "Voltar", } tooltip.folders_window = { browse = "Procurar a localizaçäo da pasta", data_location = "A pasta com a instalaçäo do Theme Hospital original, necessário para executar o CorsixTH", font_location = "A localizaçäo de uma fonte de letra capaz de mostrar caracteres Unicode necessários para seu idioma. Se näo for indicado, näo poderá selecionar idiomas que tenham mais caracteres dos que o jogo original tem, por exemplo, russo e chinês.", savegames_location = "A pasta de jogos salvos é localizada por padräo junto com o arquivo de configuraçäo e é utilizado para armazenar os jogos salvo. Se você näo gostar, pode selecionar outra procurando a pasta que quiser usar.", screenshots_location = "As capturas de tela säo guardadas por padräo em uma pasta junto com o arquivo de configuraçäo. Se você näo gostar, pode selecionar outra procurando a pasta que quiser usar.", music_location = "Selecione uma pasta com seus arquivos de música. Necessita de uma pasta já existente, entäo poderá procurá-la.", browse_data = "Procurar outra localizaçäo com uma instalaçäo do Theme Hospital. (Localizaçäo atual: %1%)", browse_font = "Procurar outro arquivo de fonte de letra. (Localizaçäo atual: %1%)", browse_saves = "Procurar outra localizaçäo para sua pasta de jogos salvos. (Localizaçäo atual: %1%) ", browse_screenshots = "Procurar outra localizaçäo para sua pasta de capturas de tela. (Localizaçäo atual: %1%) ", browse_music = "Procurar outra localizaçäo para sua pasta de música. (Localizaçäo atual: %1%) ", no_font_specified = "Pasta de fontes näo especificada!", not_specified = "Pasta näo especificada!", default = "Localizaçäo padräo", reset_to_default = "Volta a atribuir a pasta a sua localizaçäo padräo", -- original_path = "The currently chosen directory of the original Theme Hospital installation", -- where is this used, I have left if for the time being? back = "Fechar este menu e voltar para o menu de Configuraçöes", } font_location_window = { caption = "Selecionar fonte (%1%)", } handyman_window = { all_parcels = "Todas as parcelas", parcel = "Parcela" } tooltip.handyman_window = { parcel_select = "Parcela onde o faz-tudo aceita tarefas, clique para alterar o configuraçäo" } new_game_window = { caption = "Campanha", player_name = "Nome", option_on = "Ligado", option_off = "Desligado", difficulty = "Dificuldade", easy = "Residente (Fácil)", medium = "Médico (Normal)", hard = "Consultor (Difícil)", tutorial = "Tutorial", start = "Iniciar", cancel = "Cancelar", } tooltip.new_game_window = { player_name = "Digite o nome que você deseja ser chamado no jogo", difficulty = "Selecione o nível de dificuldade do jogo", easy = "Se você näo conhecer jogos de simulaçäo, esta dificuldade é para você.", medium = "Esta é a dificuldade intermediária, se você está inseguro do que deve escolher.", hard = "Se você está acostumado com este tipo de jogo e quer um bom desafio, escolha esta opçäo", tutorial = "Se você precisa de ajuda para começar a jogar, escolha esta opçäo", start = "Iniciar o jogo com a configuraçäo selecionada", cancel = "Ah, eu näo queria começar um novo jogo!", } lua_console = { execute_code = "Executar", close = "Fechar", } tooltip.lua_console = { textbox = "Digite aqui o código Lua que deseja executar", execute_code = "Executar o código Lua que digitou", close = "Fechar o console", } errors = { dialog_missing_graphics = "Desculpe, os arquivos de dados da versäo de demonstraçäo näo contém este diálogo.", save_prefix = "Erro ao salvar o jogo: ", load_prefix = "Erro ao carregar o jogo: ", no_games_to_contine = "Näo há jogos salvos.", load_quick_save = "Erro, näo foi possível carregar o carregamento rápido já que ele näo existe, näo se preocupe nós criamos um agora para você!", map_file_missing = "Näo foi possível encontrar o arquivo de mapa %s para esta fase!", minimum_screen_size = "Por favor, digite dimensöes de tela de pelo menos 640x480.", unavailable_screen_size = "O tamanho da tela que você digitou näo está disponível em tela cheia.", alien_dna = "NOTA: Os pacientes alienígenas näo têm animaçöes para se sentar, abrir portas, bater nas portas, etc. portanto, assim como no Theme Hospital original, ao fazer estas coisas aparentaräo mudar para uma imagem normal e logo voltaräo para o seu estado. Os pacientes com DNA alienígena só apareceräo se o arquivo de fase o indicar", fractured_bones = "NOTA: A animaçäo das pacientes femininas com Fraturas ósseas näo é perfeita", could_not_load_campaign = "Falha ao carregar a campanha: %s", could_not_find_first_campaign_level = "Näo foi possível encontrar o primeiro nível desta campanha: %s", } warnings = { levelfile_variable_is_deprecated = "Aviso: O nível '%s ' contém uma definiçäo variável obsoleta no arquivo de nível." .. " '%LevelFile' foi renomeado para '%MapFile '. Por favor, informe ao criador do mapa para atualizar o nível.", } confirmation = { needs_restart = "Para alterar esta configuraçäo é necessário reiniciar o CorsixTH. Qualquer alteraçäo näo salva será perdida. Tem certeza que deseja fazer isso?", abort_edit_room = "Você está editando uma sala. Se todos os objetos necessários estiverem colocados ela será completada, caso contrário ela será removida. Continuar?", maximum_screen_size = "O tamanho de tela que digitou é maior que 3000 x 2000. É possível utilizar uma resoluçäo maior, mas necessitará de um computador melhor para que a velocidade de quadros por segundo seja aceitável. Tem certeza de que quer continuar?", music_warning = "Antes de selecionar o uso de MP3 para sua música dentro do jogo, precisará ter o arquivo smpeg.dll, ou o equivalente para seu sistema operacional, ou do contrário näo terá música no jogo. Atualmente näo existe um arquivo equivalente para sistemas de 64 bits. Deseja continuar?", } information = { custom_game = "Bem-vindo ao CorsixTH. Divirta-se com esse mapa personalizado!", no_custom_game_in_demo = "Desculpe, mas a versäo de demonstraçäo näo pode jogar mapas personalizados.", cannot_restart = "Infelizmente este mapa personalizado foi salvo antes que a funcionalidade de reiniciaçäo fosse implementada.", very_old_save = "Houveram muitas mudanças no jogo desde que você começou a jogar este mapa. Para ter certeza que todas as funcionalidades estäo funcionando considere recomeçar o mapa.", level_lost = { "Que pena! Você fracassou. Mais sorte na próxima vez!", "Você perdeu porque:", reputation = "Sua reputaçäo caiu abaixo de %d.", balance = "Seu saldo no banco caiu abaixo de %d.", percentage_killed = "Você matou mais de %d por cento dos pacientes.", cheat = "Foi escolha sua ou você se enganou de botäo? Näo sabe nem trapacear direito?", }, cheat_not_possible = "Näo pode usar essa trapaça nesta fase. Näo sabe nem trapacear direito?", } tooltip.information = { close = "Fechar a janela de informaçäo", } totd_window = { tips = { "Todo hospital precisa de uma Recepçäo e um Consultório Geral para começar. Depois disso, dependerá do tipo de pacientes que visitará seu hospital. Entretanto ter uma farmácia é sempre uma boa ideia.", "Máquinas como o Inflador precisam de constante manutençäo. Contrate um ou dois Faz-tudo para reparos nestas máquinas, ou colocará seus funcionários e pacientes em risco.", "Depois de um certo período de trabalho, seus funcionários ficaräo cansados. Certifique-se de construir uma Sala de Descanso, para que posam relaxar.", "Instale Radiadores suficientes para manter seus funcionários e pacientes aquecidos, do contrário ficaräo infelizes. Use o Mapa da Cidade para localizar pontos do hospital que precisem ser aquecidos.", "O nível de habilidade de um médico reflete na qualidade e velocidade dos diagnósticos. Coloque um médico experiente no Consultório Geral, assim näo precisará de muitas salas de diagnósticos adicionais.", "Médicos de níveis 'Residente' e 'Médico' podem melhorar suas habilidades aprendendo com um Consultor na Sala de Treinamento. Se o Consultor possuir alguma especializaçäo (Cirurgiäo, Psiquiatra ou Pesquisador), ele irá passar este conhecimento aos seus alunos.", "Você já tentou digitar o número europeu de emergência (112) no aparelho de fax? Certifique-se que o seu som esteja ligado!", "Você pode alterar algumas configuraçöes como a resoluçäo da tela e o idioma na janela de opçöes que pode ser acessar no menu inicial e dentro do jogo.", "Você selecionou um idioma que näo é o inglês, mas continua vendo textos em inglês por todos os lugares? Ajude-nos a traduzir os textos restantes para o seu idioma!", "A comunidade do CorsixTH está precisando de reforços em sua equipe! Você está interessado em codificar, traduzir ou criar gráficos para o CorsixTH? Entre em contato conosco pelo nosso Fórum, Lista de Discussäo ou canal de IRC (#corsix-th no freenode).", "Se localizar um bug, por favor reporte-o em nosso bugtracker: th-issues.corsix.org", "Cada fase possui certas metas a serem atingidas antes de passar para a próxima fase. Cheque a janela de situaçäo para acompanhar seu progresso a fim de atingir seus objetivos.", "Se você deseja editar ou remover uma sala existente, pode fazê-lo com o botäo de ediçäo de sala na barra inferior.", "Caso haja uma multidäo de pacientes esperando, você deve descobrir rapidamente quais deles estäo aguardando por uma sala em particular passando o ponteiro do mouse por cima desta sala.", "Clique nas portas das salas para ver sua fila. Isso pode ser muito útil, já que pode reordenar a fila ou encaminhar um paciente para outra sala.", "Funcionários infelizes iräo pedir aumentos de salários com mais frequência. Certifique-se que sua equipe esteja trabalho em um ambiente de trabalho confortável para mantê-los felizes.", "Pacientes podem ficar com sede enquanto esperam em seu hospital, ainda mais se ligar o aquecimento! Instale máquinas de venda de refrigerantes em pontos estratégicos para um ganho extra.", "Você pode abortar o processo de diagnóstico prematuramente e pressupor a cura, se você já tiver descoberto a doença. Atente-se que desta maneira aumenta-se o risco de um tratamento errado, resultando na morte do paciente.", "Emergências podem ser uma boa fonte de grana extra, desde que você possua plena capacidade e recursos de lidar com os pacientes à tempo.", }, previous = "Dica anterior", next = "Próxima dica", } tooltip.totd_window = { previous = "Mostra a dica anterior", next = "Mostra a próxima dica", } debug_patient_window = { caption = "Depurar Paciente", } cheats_window = { caption = "Trapaças", warning = "Atençäo: Você näo conseguirá quaisquer pontos de bonificaçöes no fim do nível se você trapacear!", cheated = { no = "Trapaças usadas: Näo", yes = "Trapaças usadas: Sim", }, cheats = { money = "Trapaça de Dinheiro", all_research = "Trapaça Todas as Pesquisas Realizadas", emergency = "Criar Emergência", vip = "Criar VIP", earthquake = "Criar Terremoto", epidemic = "Gerar um paciente contagioso", toggle_infected = "Alternar ícones de infectados", create_patient = "Criar Paciente", end_month = "Fim do Mês", end_year = "Fim do ano", lose_level = "Perder a Fase", win_level = "Ganhar a Fase", increase_prices = "Aumentar Preços", decrease_prices = "Reduzir Preços", }, close = "Fechar", } tooltip.cheats_window = { close = "Fecha a janela de trapaças", cheats = { money = "Adiciona 10.000 no saldo bancário.", all_research = "Completa todas as pesquisas.", emergency = "Cria uma emergência.", vip = "Cria um visitante VIP.", earthquake = "Cria um Terremoto.", epidemic = "Cria um paciente contagioso", toggle_infected = "Mostra/oculta os ícones de infecçäo", create_patient = "Cria um Paciente no canto de mapa.", end_month = "Pula para o final do mês.", end_year = "Pula para o final do ano.", lose_level = "Perde esta fase.", win_level = "Ganha esta fase.", increase_prices = "Aumenta todos os preços em 50% (200% máximo).", decrease_prices = "Reduz todos os preços em 50% (50% mínimo).", } } introduction_texts = { demo = "Bem-vindo ao hospital de demonstraçäo!//" .. "Infelizmente esta versäo de demonstraçäo só possui esta fase. Entretanto, teremos aqui o suficiente para mantê-lo ocupado por enquanto! " .. "Você encontrará várias doenças que necessitaräo de salas diferentes para cura. De tempos em tempos, emergências ocorreräo. E você precisará pesquisar por salas adicionais usando o Centro de Pesquisas. " .. "Seu objetivo é ter um saldo bancário de $100.000,00, o valor do hospital em $ 70.000,00 e uma reputaçäo de 700, enquanto você cura pelo menos 75% de seus pacientes. " .. "Certifique-se que sua reputaçäo näo fique abaixo de 300 e você näo mate mais de 40% dos seus pacientes, senäo você perde.//" .. "Boa sorte!", } calls_dispatcher = { -- Dispatcher description message. Visible in Calls Dispatcher dialog summary = "%d chamadas; %d assinaladas", staff = "%s - %s", watering = "Regando @ %d,%d", repair = "Reparar %s", close = "Fechar", } tooltip.calls_dispatcher = { task = "Lista de tarefas - clique na tarefa para abrir a janela do funcionário responsável e ir para o local da tarefa.", assigned = "Esta janela será marcada se alguém for designado para a tarefa correspondente.", close = "Fechar a janela de chamadas de controle", } update_window = { caption = "Atualizaçäo Disponível!", new_version = "Nova Versäo:", current_version = "Versäo Atual:", download = "Ir para página de download", ignore = "Pular e ir para o menu principal", } tooltip.update_window = { download = "Vai para a página de downloads para obter a última versäo do CorsixTH", ignore = "Ignora esta atualizaçäo no momento. Você será notificado da próxima vez que abrir o CorsixTH", } map_editor_window = { pages = { inside = "Interior", outside = "Exterior", foliage = "Folhagem", hedgerow = "Cerca viva", pond = "Lagoa", road = "Estrada", north_wall = "Parede norte", west_wall = "Parede oeste", helipad = "Heliporto", delete_wall = "Excluir paredes", parcel_0 = "Parcela 0", parcel_1 = "Parcela 1", parcel_2 = "Parcela 2", parcel_3 = "Parcela 3", parcel_4 = "Parcela 4", parcel_5 = "Parcela 5", parcel_6 = "Parcela 6", parcel_7 = "Parcela 7", parcel_8 = "Parcela 8", parcel_9 = "Parcela 9", camera_1 = "Câmera 1", camera_2 = "Câmera 2", camera_3 = "Câmera 3", camera_4 = "Câmera 4", heliport_1 = "Heliporto 1", heliport_2 = "Heliporto 2", heliport_3 = "Heliporto 3", heliport_4 = "Heliporto 4", paste = "Colar área", } } -------------------------------- UNUSED ----------------------------------- ------------------- (kept for backwards compatibility) ---------------------- options_window.change_resolution = "Alterar resoluçäo" tooltip.options_window.change_resolution = "Altera a resoluçäo de janela para as dimensöes digitadas na esquerda" -------------------------------------------------------------------------------------------------------------------------------------------------------- -------------------------------- MISSING STRINGS IN LANGUAGE "PORTUGUêS DO BRASIL": ----------------------------------- --------------------------------------------------------------------------------------------------------------------------------------------------------- rooms_long.ward = "Enfermaria" rooms_long.blood_machine = "Sala de Transfusöes" rooms_long.emergency = "Sala de Emergências" rooms_long.general = "Sala de Clínica Geral" rooms_long.cardiogram = "Sala do Cardiograma" rooms_long.decontamination = "Sala de Descontaminaçäo" rooms_long.jelly_vat = "Banho Gelatinoso" rooms_long.staffroom = "Sala de Descanso" rooms_long.hair_restoration = "Sala de Peloterapia" rooms_long.inflation = "Sala de Inflatoterapia" rooms_long.operating_theatre = "Sala de Operaçöes" rooms_long.gps_office = "Consultório Geral" rooms_long.training_room = "Sala de Formaçäo" rooms_long.x_ray = "Sala de Raio-X" rooms_long.tongue_clinic = "Sala de Laringologia" rooms_long.psychiatric = "Sala de Psiquiatria" rooms_long.corridors = "Corredores" rooms_long.ultrascan = "Sala de Ultra Scanner" rooms_long.dna_fixer = "Sala de Genética" rooms_long.toilets = "Banheiro" rooms_long.fracture_clinic = "Sala de Traumatologia" rooms_long.pharmacy = "Farmácia" rooms_long.general_diag = "Diagnóstico Geral" rooms_long.research_room = "Centro de Pesquisa" rooms_long.scanner = "Sala de Scanner" rooms_long.electrolysis = "Sala de Eletrólise" fax.debug_fax.text4 = "FACTORS : DOCS %d NURSES %d AREA %d ROOMS %d PRICING %d" fax.debug_fax.text2 = "TOTAL PEOPLE IN HOSPITAL %d CHECKING AGAINST %d" fax.debug_fax.text9 = "DISASTERS %d ALLOWED (MTHS) %d (%d)REDUCTION %d" fax.debug_fax.text3 = "FIGURES : DOCS %d NURSES %d AREA %d ROOMS %d PRICING %d" fax.debug_fax.close_text = "Sim, sim, sim!" fax.debug_fax.text5 = "CONTRIBN : DOCS %d NURSES %d AREA %d ROOMS %d PRICING %d PERCENT" fax.debug_fax.text1 = "BEST COUNT %d" fax.debug_fax.text8 = "AMENITIES %d PEEPS HANDLED %d REDUCTION %d" fax.debug_fax.text10 = "KILLS %d ALLOWED (MTHS) %d (%d) REDUCTION %d" fax.debug_fax.text7 = "REPUTATION: %d EXPECTED %d REDUCTION %d" fax.debug_fax.text11 = "PEOPLE THIS MONTH %d" fax.debug_fax.text6 = "THE FOLLOWING FACTORS ARE ALSO APPLIED" fax.emergency.choices.accept = "Sim, preparado para confrontar esta emergência." fax.emergency.choices.refuse = "Näo. Nego-me a confrontar esta emergência." fax.emergency.cure_possible_drug_name_efficiency = "Já dispöe da equipe e do pessoal qualificado. Tem o medicamento necessário. É %s e tem uma efetividade de %d por cento." fax.emergency.bonus = "Ganhará um bônus máximo de $%d por cuidar desta emergência. Mas se fracassar, a sua reputaçäo será seriamente danificada." fax.emergency.locations[1] = "Planta Química Thatcher" fax.emergency.locations[2] = "Universidade Suja" fax.emergency.locations[3] = "Centro de Plantas Aquáticas" fax.emergency.locations[4] = "Instituto de Pesquisa de Substâncias Perigosas" fax.emergency.locations[5] = "Congresso de Bailarinos Russos" fax.emergency.locations[6] = "Pub O Touro e A Rä" fax.emergency.locations[7] = "Funerária Sem Licença Para Boa Morte" fax.emergency.locations[8] = "A Casa do Curry" fax.emergency.locations[9] = "Empório Petroquímico Usado" fax.emergency.cure_not_possible_employ = "Precisará contratar um(a) %s" fax.emergency.location = "Houve um incidente em %s" fax.emergency.cure_possible = "Tem a equipe e o pessoal qualificado necessário, poderá confrontar esta emergência." fax.emergency.cure_not_possible = "Näo pode curar esta doença no momento." fax.epidemic.cover_up_explanation_2 = "Se um Inspetor de Saúde visitar e encontrar uma epidemia encoberta tomará medidas drásticas contra si." fax.epidemic.choices.cover_up = "Tratar de ocultá-la. Procurar curar a epidemia antes de que se estenda por todo o país." fax.epidemic.choices.declare = "Há uma epidemia" fax.epidemic.disease_name = "Os seus Médicos descobriram uma variedade contagiosa de %s." fax.epidemic.declare_explanation_fine = "Se declarar uma epidemia, pagará uma multa de %d, danificando a sua reputaçäo e os seus pacientes seräo automaticamente vacinados." fax.epidemic.cover_up_explanation_1 = "Se tentar encobri-la, terá um tempo limitado para curar a todos os infectados antes de que as Autoridades da Saúde descubram." fax.vip_visit_result.close_text = "Obrigado por visitar o hospital." fax.vip_visit_result.telegram = "Telegrama!" fax.vip_visit_result.vip_remarked_name = "Depois de visitar o seu hospital, %s declarou:" fax.vip_visit_result.remarks.super[1] = "Que hospital eficaz! A próxima vez que estiver gravemente doente, eu venho aqui." fax.vip_visit_result.remarks.super[2] = "É isto o que eu chamo de um hospital." fax.vip_visit_result.remarks.super[3] = "É um hospital excelente. E sei o que digo; visito muitos hospitais." fax.vip_visit_result.remarks.mediocre[1] = "Bom, já vi piores. Mas deveria fazer algumas melhoras." fax.vip_visit_result.remarks.mediocre[2] = "Oh céus! Näo é um lugar agradável para ir se estiver doente." fax.vip_visit_result.remarks.mediocre[3] = "Vou ser sincero, é um hospital normal. Francamente, eu esperava mais, " fax.vip_visit_result.remarks.very_bad[1] = "Vá tugúrio! Vou tentar o enclausurá-lo." fax.vip_visit_result.remarks.very_bad[2] = "Nunca vi um hospital täo espantoso. Que vergonha!" fax.vip_visit_result.remarks.very_bad[3] = "Estou horrorizado. Chama a isto de hospital! Vou sair com um cano." fax.vip_visit_result.remarks.bad[1] = "Por que me zanguei? Foi pior que ir ver uma ópera de quatro horas!" fax.vip_visit_result.remarks.bad[2] = "Estou aborrecido pelo que vi. Chama a isto um hospital? Mais parece uma pocilga!" fax.vip_visit_result.remarks.bad[3] = "Estou farto de atrair a atençäo pública e de visitar buracos fedorentos como este! Demito-me." fax.vip_visit_result.remarks.good[1] = "Que hospital bem dirigido! Obrigado pelo seu convite." fax.vip_visit_result.remarks.good[2] = "Mmmm. Certamente näo é uma má instituiçäo médica." fax.vip_visit_result.remarks.good[3] = "Gostei do seu estupendo hospital. Agora, alguém quer um curry da Casa do Curry?" fax.vip_visit_result.cash_grant = "Você ganhou um prêmio em dinheiro de $%d." fax.vip_visit_result.rep_boost = "Sua reputaçäo na comunidade acaba de aumentar." fax.vip_visit_result.rep_loss = "A sua reputaçäo foi afetada em consequência" fax.disease_discovered.close_text = "Foi encontrada uma nova doença." fax.disease_discovered.need_to_build = "Precisa construir um(a) %s para tratar isto." fax.disease_discovered.can_cure = "Pode tratar esta doença." fax.disease_discovered.need_to_employ = "Contrate um(a) %s que possa solucionar este problema." fax.disease_discovered.need_to_build_and_employ = "Se construir uma %s e contratar um(a) %s pode ter êxito." fax.disease_discovered.discovered_name = "A sua equipe descobriu uma nova doença. É %s." fax.epidemic_result.close_text = "Bem!" fax.epidemic_result.compensation_amount = "O Governo decidiu lhe dar uma compensaçäo de %d pelos danos que estes incidente causara ao bom nome do seu hospital." fax.epidemic_result.succeeded.part_1_name = "Chegou aos ouvidos do Inspetor de Saúde que na sua instituiçäo estava tratando um caso maligno de %s." fax.epidemic_result.succeeded.part_2 = "Embora, näo fosse possível encontrar provas que comprovassem os ditos rumores..." fax.epidemic_result.hospital_evacuated = "O Ministério da Saúde näo tem outra alternativa a näo ser evacuar o seu hospital." fax.epidemic_result.failed.part_1_name = "Ao tentar esconder o fato de que enfrentavam um broto contagioso de %s" fax.epidemic_result.failed.part_2 = "Os funcionários do seu hospital säo responsáveis pela doença que se propagou entre as pessoas que vivem perto do seu hospital." fax.epidemic_result.fine_amount = "O Governo declarou uma emergência nacional e multa-o com %d." fax.epidemic_result.rep_loss_fine_amount = "Os jornais têm feito um escândalo com isto. A sua reputaçäo será gravemente afetada. Além disso, imporá uma multa de %d." fax.emergency_result.close_text = "Aperte para sair" fax.emergency_result.saved_people = "Salvou %d pessoas de um total de %d." fax.emergency_result.earned_money = "Ganhou %d, de um bônus máximo de %d." fax.vip_visit_query.vip_name = "%s expressou o seu desejo de visitar o seu hospital." fax.vip_visit_query.choices.refuse = "Dispensar o V.I.P." fax.vip_visit_query.choices.invite = "Enviar um convite oficial ao V.I.P." fax.diagnosis_failed.what_to_do_question = "O que vamos fazer com o paciente?" fax.diagnosis_failed.choices.send_home = "Enviar o paciente para casa." fax.diagnosis_failed.choices.take_chance = "Tentar uma possível cura." fax.diagnosis_failed.choices.wait = "Fazer o paciente esperar enquanto constrói mais salas de diagnóstico." fax.diagnosis_failed.partial_diagnosis_percentage_name = "Existe %d por cento de probabilidades de descobrirmos que tipo de %s sofre esse paciente." fax.diagnosis_failed.situation = "Fizemos todos os nossos diagnósticos com este paciente e näo estamos seguros do que se trata." fax.disease_discovered_patient_choice.what_to_do_question = "O que quer fazer com o paciente?" fax.disease_discovered_patient_choice.choices.send_home = "Enviar o paciente para casa." fax.disease_discovered_patient_choice.choices.research = "Enviar o paciente para Pesquisa." fax.disease_discovered_patient_choice.choices.wait = "Faça o paciente esperar um momento no hospital." fax.disease_discovered_patient_choice.can_not_cure = "Näo pode curar esta doença." fax.disease_discovered_patient_choice.need_to_employ = "Contrate um(a) %s para corrigir esta situaçäo." fax.disease_discovered_patient_choice.need_to_build = "Precisa construir um(a) %s para poder tratar isto." fax.disease_discovered_patient_choice.need_to_build_and_employ = "Pode consegui-lo se construir um(a) %s e contratar um %s." fax.disease_discovered_patient_choice.guessed_percentage_name = "A sua equipe tem que averiguar o que tem um paciente. Há %d por cento de probabilidade de que seja %s" fax.disease_discovered_patient_choice.disease_name = "A sua equipe descobriu uma nova doença. É %s." original_credits[1] = " " original_credits[2] = " " original_credits[3] = " " original_credits[4] = " " original_credits[5] = " " original_credits[6] = " " original_credits[7] = " " original_credits[8] = " " original_credits[9] = " " original_credits[10] = " " original_credits[11] = " " original_credits[12] = ":Desenvolvido e criado pela" original_credits[13] = ":Bullfrog Productions" original_credits[14] = " " original_credits[15] = ":Equipe de Desenvolvimento Pluto" original_credits[16] = "," original_credits[17] = "Mark Webley" original_credits[18] = "Gary Carr" original_credits[19] = "Matt Chilton" original_credits[20] = "Matt Sullivan" original_credits[21] = "Jo Rider" original_credits[22] = "Rajan Tande" original_credits[23] = "Wayne Imlach" original_credits[24] = "Andy Bass" original_credits[25] = "Jon Rennie" original_credits[26] = "Adam Coglan" original_credits[27] = "Natalie White" original_credits[28] = " " original_credits[29] = " " original_credits[30] = " " original_credits[31] = ":Programaçäo" original_credits[32] = "," original_credits[33] = "Mark Webley" original_credits[34] = "Matt Chilton" original_credits[35] = "Matt Sullivan" original_credits[36] = "Rajan Tande" original_credits[37] = " " original_credits[38] = "Ben Deane" original_credits[39] = "Gary Morgan" original_credits[40] = "Jonty Barnes" original_credits[41] = " " original_credits[42] = " " original_credits[43] = " " original_credits[44] = ":Arte" original_credits[45] = "," original_credits[46] = "Gary Carr" original_credits[47] = "Jo Rider" original_credits[48] = "Andy Bass" original_credits[49] = "Adam Coglan" original_credits[50] = " " original_credits[51] = "Eoin Rogan" original_credits[52] = "George Svarovsky" original_credits[53] = "Saurev Sarkar" original_credits[54] = "Jason Brown" original_credits[55] = "John Kershaw" original_credits[56] = "Dee Lee" original_credits[57] = " " original_credits[58] = " " original_credits[59] = " " original_credits[60] = ":Sequência Introdutória" original_credits[61] = "," original_credits[62] = "Stuart Black" original_credits[63] = " " original_credits[64] = " " original_credits[65] = " " original_credits[66] = ":Música e Efeitos de Som" original_credits[67] = "," original_credits[68] = "Russell Shaw" original_credits[69] = "Adrian Moore" original_credits[70] = " " original_credits[71] = "Jeremy Longley" original_credits[72] = "Andy Wood" original_credits[73] = " " original_credits[74] = " " original_credits[75] = " " original_credits[76] = ":Voz da Narradora" original_credits[77] = "," original_credits[78] = "Rebecca Green" original_credits[79] = " " original_credits[80] = " " original_credits[81] = " " original_credits[82] = ":Desenho dos Níveis" original_credits[83] = "," original_credits[84] = "Wayne Imlach" original_credits[85] = "Natalie White" original_credits[86] = "Steven Jarrett" original_credits[87] = "Shin Kanaoya" original_credits[88] = " " original_credits[89] = " " original_credits[90] = " " original_credits[91] = ":Roteiristas" original_credits[92] = "," original_credits[93] = "James Leach" original_credits[94] = "Sean Masterson" original_credits[95] = "Neil Cook" original_credits[96] = " " original_credits[97] = " " original_credits[98] = " " original_credits[99] = ":Pesquisa e Desenvolvimento" original_credits[100] = "," original_credits[101] = "Andy Cakebread" original_credits[102] = "Richard Reed" original_credits[103] = " " original_credits[104] = "Glenn Corpes" original_credits[105] = "Martin Bell" original_credits[106] = "Ian Shaw" original_credits[107] = "Jan Svarovsky" original_credits[108] = " " original_credits[109] = " " original_credits[110] = " " original_credits[111] = ":Bibliotecas e Ferramentas" original_credits[112] = "," original_credits[113] = "Mark Huntley" original_credits[114] = "Alex Peters" original_credits[115] = "Rik Heywood" original_credits[116] = " " original_credits[117] = "Ian Shippen" original_credits[118] = "Mark Lamport" original_credits[119] = " " original_credits[120] = "Russell Shaw" original_credits[121] = "Tony Cox" original_credits[122] = " " original_credits[123] = " " original_credits[124] = " " original_credits[125] = ":Programaçäo do Instalador" original_credits[126] = "," original_credits[127] = "Andy Nuttall" original_credits[128] = "Tony Cox" original_credits[129] = "Andy Cakebread" original_credits[130] = " " original_credits[131] = " " original_credits[132] = " " original_credits[133] = ":Chefe de Testes" original_credits[134] = "," original_credits[135] = "Andy Robson" original_credits[136] = " " original_credits[137] = " " original_credits[138] = " " original_credits[139] = ":Testadores" original_credits[140] = "," original_credits[141] = "Wayne Imlach" original_credits[142] = "Jon Rennie" original_credits[143] = " " original_credits[144] = "Jeff Brutus" original_credits[145] = "Wayne Frost" original_credits[146] = "Steven Lawrie" original_credits[147] = "Tristan Paramor" original_credits[148] = "Nathan Smethurst" original_credits[149] = " " original_credits[150] = "Ryan Corkery" original_credits[151] = "Simon Doherty" original_credits[152] = "James Dormer" original_credits[153] = "Martin Gregory" original_credits[154] = "Ben Lawley" original_credits[155] = "Joel Lewis" original_credits[156] = "David Lowe" original_credits[157] = "Robert Monczak" original_credits[158] = "Dominic Mortoza" original_credits[159] = "Karl O'Keeffe" original_credits[160] = "Michael Singletary" original_credits[161] = "Andrew Skipper" original_credits[162] = "Stuart Stephen" original_credits[163] = "David Wallington" original_credits[164] = " " original_credits[165] = " " original_credits[166] = " " original_credits[167] = ":Suporte Técnico" original_credits[168] = "," original_credits[169] = "Kevin Donkin" original_credits[170] = "Mike Burnham" original_credits[171] = "Simon Handby" original_credits[172] = " " original_credits[173] = " " original_credits[174] = " " original_credits[175] = ":Marketing" original_credits[176] = "," original_credits[177] = "Pete Murphy" original_credits[178] = "Sean Ratcliffe" original_credits[179] = " " original_credits[180] = " " original_credits[181] = " " original_credits[182] = ":Relaçöes Públicas" original_credits[183] = "," original_credits[184] = "Cathy Campos" original_credits[185] = " " original_credits[186] = " " original_credits[187] = " " original_credits[188] = ":Documentaçäo" original_credits[189] = "," original_credits[190] = "Mark Casey" original_credits[191] = "Richard Johnston" original_credits[192] = "James Lenoel" original_credits[193] = "Jon Rennie" original_credits[194] = " " original_credits[195] = " " original_credits[196] = " " original_credits[197] = ":Documentaçäo e Desenho da Caixa" original_credits[198] = "," original_credits[199] = "Caroline Arthur" original_credits[200] = "James Nolan" original_credits[201] = " " original_credits[202] = " " original_credits[203] = " " original_credits[204] = ":Chefe do Projeto de Localizaçäo" original_credits[205] = "," original_credits[206] = "Carol Aggett" original_credits[207] = " " original_credits[208] = " " original_credits[209] = ":Traduçäo para Português" original_credits[210] = "," original_credits[211] = "Altieres Lima" original_credits[212] = "Leonardo Malaman" original_credits[213] = "Henrique Poyatos" original_credits[214] = " " original_credits[215] = " " original_credits[216] = ":Produçäo" original_credits[217] = "," original_credits[218] = "Rachel Holman" original_credits[219] = " " original_credits[220] = " " original_credits[221] = " " original_credits[222] = ":Produtor" original_credits[223] = "," original_credits[224] = "Mark Webley" original_credits[225] = " " original_credits[226] = " " original_credits[227] = " " original_credits[228] = ":Produtor Associado" original_credits[229] = "," original_credits[230] = "Andy Nuttall" original_credits[231] = " " original_credits[232] = " " original_credits[233] = " " original_credits[234] = ":Operaçöes" original_credits[235] = "," original_credits[236] = "Steve Fitton" original_credits[237] = " " original_credits[238] = " " original_credits[239] = " " original_credits[240] = ":Administraçäo da Companhia" original_credits[241] = "," original_credits[242] = "Audrey Adams" original_credits[243] = "Annette Dabb" original_credits[244] = "Emma Gibbs" original_credits[245] = "Lucia Gobbo" original_credits[246] = "Jo Goodwin" original_credits[247] = "Sian Jones" original_credits[248] = "Kathy McEntee" original_credits[249] = "Louise Ratcliffe" original_credits[250] = " " original_credits[251] = " " original_credits[252] = " " original_credits[253] = ":Direçäo da Companhia" original_credits[254] = "," original_credits[255] = "Les Edgar" original_credits[256] = "Peter Molyneux" original_credits[257] = "David Byrne" original_credits[258] = " " original_credits[259] = " " original_credits[260] = " " original_credits[261] = ":O nosso agradecimento especial para" original_credits[262] = "," original_credits[263] = "Peter Molyneux" original_credits[264] = " " original_credits[265] = "O pessoal do Hospital Frimley Park" original_credits[266] = " " original_credits[267] = "em particular ao" original_credits[268] = "," original_credits[269] = "Beverley Cannell" original_credits[270] = "Doug Carlisle" original_credits[271] = " " original_credits[272] = " " original_credits[273] = " " original_credits[274] = ":Continuem a pensar" original_credits[275] = " " original_credits[276] = " " original_credits[277] = " " original_credits[278] = " " original_credits[279] = " " original_credits[280] = " " original_credits[281] = " " original_credits[282] = " " original_credits[283] = " " original_credits[284] = " " original_credits[285] = " " original_credits[286] = " " original_credits[287] = " " original_credits[288] = " " original_credits[289] = " " original_credits[290] = " " original_credits[291] = " " original_credits[292] = " " original_credits[293] = " " original_credits[294] = " " original_credits[295] = "." buy_objects_window.choose_items = "Escolha os objetos" buy_objects_window.total = "Total: " buy_objects_window.price = "Preço: " build_room_window.pick_room_type = "Escolha a sala" build_room_window.pick_department = "Departamento" build_room_window.cost = "Custo: " object.bench = "Banco" object.pharmacy_cabinet = "Primeiros socorros" object.console = "Console" object.atom_analyser = "Analisador atômico" object.fire_extinguisher = "Extintor" object.scanner = "Scanner" object.bin = "Cesto de papéis" object.swing_door1 = "Porta de batente" object.pool_table = "Mesa de bilhar" object.screen = "Tela" object.cabinet = "Arquivo" object.sofa = "Sofá" object.projector = "Projetor" object.table2 = "Mesa" object.shower = "Ducha descontaminadora" object.comfortable_chair = "Poltrona confortável" object.door = "Porta" object.computer = "Computador" object.litter_bomb = "Bomba de lixo" object.entrance_left = "Porta direita de entrada" object.dna_fixer = "Reparador DNA" object.bed = "Cama" object.lamp = "Abajur" object.bookcase = "Estante" object.desk = "Escritório" object.toilet_sink = "Pia" object.gates_of_hell = "Portas do inferno" object.swing_door2 = "Porta de batente" object.cast_remover = "Removedor de gesso" object.plant = "Planta" object.blood_machine = "Transfusiômetro" object.slicer = "Cortador" object.x_ray = "Raio-X" object.cardio = "Eletrocardiograma" object.crash_trolley = "Carrinho" object.bed2 = "Cama" object.electrolyser = "Eletrólise" object.video_game = "Videogame" object.skeleton = "Esqueleto" object.ultrascanner = "Ultra scanner" object.op_sink1 = "Pia" object.hair_restorer = "Pêlo-restaurador" object.reception_desk = "Recepçäo" object.radiation_shield = "Painel anti-radiaçäo" object.couch = "Divä" object.inflator = "Inflador" object.toilet = "Banheiro" object.lecture_chair = "Poltrona" object.auto_autopsy = "Máq. autópsias" object.chair = "Cadeira" object.x_ray_viewer = "Máquina de raio-X" object.radiator = "Radiador" object.bed3 = "Cama" object.surgeon_screen = "Tela de cirurgiäo" object.jelly_moulder = "Moldador de gelatina" object.drinks_machine = "Máq. de bebidas" object.op_sink2 = "Pia" object.table1 = "Mesa" object.entrance_right = "Porta esquerda de entrada" object.operating_table = "Mesa de operaçöes" object.tv = "Televisäo" transactions.bank_loan = "Empréstimo bancário" transactions.buy_object = "Comprou" transactions.cure = "Cura" transactions.general_bonus = "Pagamento extra geral" transactions.treat_colon = "Tratamento:" transactions.eoy_bonus_penalty = "Bônus/multa de fim de ano" transactions.loan_repayment = "Devoluçäo do empréstimo" transactions.research = "Gastos em pesquisa" transactions.epidemy_coverup_fine = "Multa por cobertura da epidemia" transactions.build_room = "Construiu" transactions.sell_object = "Vendeu" transactions.vaccination = "Vacinas" transactions.personal_bonus = "Pagamento extra individual" transactions.drug_cost = "Medicamento" transactions.severance = "Inden. demissäo" transactions.deposit = "Tratamentos" transactions.epidemy_fine = "Multa pela epidemia" transactions.buy_land = "Comprou terreno" transactions.hire_staff = "Contratou" transactions.insurance_colon = "Seguro:" transactions.drinks = "Renda: máquinas de bebidas" transactions.overdraft = "Juros do saldo devedor" transactions.vip_award = "Prêmio VIP" transactions.research_bonus = "Bônus de pesquisa" transactions.cheat = "Trapaça de dinheiro" transactions.compensation = "Indenizaçäo do governo" transactions.wages = "Salários" transactions.advance_colon = "Avanços:" transactions.cure_colon = "Cura:" transactions.jukebox = "Renda: máquina de discos" transactions.machine_replacement = "Custo por substituiçäo de máquinas" transactions.heating = "Gastos de aquecimento" transactions.final_treat_colon = "Tratamento final:" transactions.emergency_bonus = "Pagamento extra de emergência" transactions.eoy_trophy_bonus = "Troféu bônus de fim de ano" transactions.loan_interest = "Juros do empréstimo" menu_options.game_speed = " VELOCIDADE DO JOGO " menu_options.sound_vol = " VOLUME DO SOM " menu_options.music_vol = " VOLUME DA MUSICA " menu_options.autosave = " AUTO-SALVAR " menu_options.announcements_vol = " VOLUME DOS AVISOS " newspaper[1][1] = "TERROR NO HOSPITAL" newspaper[1][2] = "O MÉDICO AÇOUGUEIRO" newspaper[1][3] = "PANICO GERAL" newspaper[1][4] = "O QUE HAVIA NO LABORATORIO?" newspaper[1][5] = "DETEVE UMA INVESTIGAÇAO DE RISCO" newspaper[2][1] = "DR UNK É UM CANALHA" newspaper[2][2] = "CIRURGIAO DESPEDAÇADO" newspaper[2][3] = "ESPECIALISTA EM JOGOS" newspaper[2][4] = "EMBRIAGADO" newspaper[2][5] = "CIRURGIAO CACHACEIRO" newspaper[2][6] = "EMBRIAGADO EM CIRURGIA" newspaper[3][1] = "CIRURGIAO VICIADO" newspaper[3][2] = "MÉDICO SEM CALÇAS" newspaper[3][3] = "MÉDICO SEDUTOR" newspaper[3][4] = "CIRURGIAO INSACIAVEL" newspaper[4][1] = "MÉDICO INVADE HOSPITAL" newspaper[4][2] = "CRIME ORGANIZADO" newspaper[4][3] = "OPERAÇAO DE DESVIO DE FUNDOS" newspaper[4][4] = "FECHAMENTO SEM REMUNERAÇAO" newspaper[5][1] = "ASSALTO EM UM HOSPITAL" newspaper[5][2] = "MÉDICO RETIRA CADAVERES" newspaper[5][3] = "CAPTURADO COM O CORPO" newspaper[5][4] = "AJUSTE DE CONTAS DO DR MORTE" newspaper[5][5] = "ROUBO NO DEPOSITO" newspaper[5][6] = "DENOMINADO DR CAVATUMBAS" newspaper[6][1] = "DR COSTURA MAIS UMA VEZ!" newspaper[6][2] = "FALSO MÉDICO" newspaper[6][3] = "DIAGNOSTICO ERRADO" newspaper[6][4] = "CONSULTOR DESAJEITADO" newspaper[7][1] = "MÉDICO SE SENTE MARGINALIZADO" newspaper[7][2] = "UM CIRURGIAO 'OPERA' A SI MESMO" newspaper[7][3] = "DESCONTROLE EM BANHEIROS" newspaper[7][4] = "MÉDICO PROTAGONIZA UM ESCANDALO" newspaper[7][5] = "MÉDICO 'CRIA UM BARRACO" progress_report.too_hot = "Revise o seu sistema de aquecimento. Faz muito calor." progress_report.header = "Relatório em curso" progress_report.percentage_pop = "% populaçäo" progress_report.too_cold = "Faz muito frio. Coloque radiadores." progress_report.quite_unhappy = "Os seus pacientes estäo muito contentes." progress_report.win_criteria = "CRITÉRIOS PARA GANHAR" progress_report.very_unhappy = "Os seus pacientes estäo muito descontentes." progress_report.more_drinks_machines = "Coloque mais máquinas de bebidas." staff_descriptions.bad[1] = "É uma pessoa lenta e suscetível. " staff_descriptions.bad[2] = "Mostra preguiça e falta de motivaçäo. " staff_descriptions.bad[3] = "Com uma má formaçäo e pouco eficaz. " staff_descriptions.bad[4] = "Pessoa grosseira e brusca. Chateia as pessoas. " staff_descriptions.bad[5] = "Tem pouca resistência e má atitude. " staff_descriptions.bad[6] = "Pessoa surda como uma porta. Cheira a repolho. " staff_descriptions.bad[7] = "Pessoa imunda no serviço. Um estorvo. " staff_descriptions.bad[8] = "Imprudente e se distrai com facilidade. " staff_descriptions.bad[9] = "Pessoa estressada e confusa. " staff_descriptions.bad[10] = "Pessoa desleal e rancorosa. Cheia de ódio. " staff_descriptions.bad[11] = "Näo toma cuidado e provoca acidentes. " staff_descriptions.bad[12] = "Näo se importa com o trabalho. Perde tempo. " staff_descriptions.bad[13] = "Pessoa temerária e sem cuidado. " staff_descriptions.bad[14] = "Pessoa ardilosa, matreira e subversiva. " staff_descriptions.bad[15] = "Pessoa arrogante e presunçosa. " staff_descriptions.misc[1] = "Joga golfe. " staff_descriptions.misc[2] = "Pratica mergulho. " staff_descriptions.misc[3] = "Faz esculturas de gelo. " staff_descriptions.misc[4] = "Bebe vinho. " staff_descriptions.misc[5] = "Participa de rally. " staff_descriptions.misc[6] = "Faz bungee-jump. " staff_descriptions.misc[7] = "Coleciona latas de cerveja. " staff_descriptions.misc[8] = "Gosta de mergulhar no público em shows. " staff_descriptions.misc[9] = "Gosta de fazer surf. " staff_descriptions.misc[10] = "Pratica raffiting. " staff_descriptions.misc[11] = "Destila uísque. " staff_descriptions.misc[12] = "Especialista em 'faça você mesmo'. " staff_descriptions.misc[13] = "Gosta do cinema francês. " staff_descriptions.misc[14] = "Joga muito Theme Park. " staff_descriptions.misc[15] = "Possui carteira de habilitaçäo E. " staff_descriptions.misc[16] = "Corre de motocicleta. " staff_descriptions.misc[17] = "Toca violino e violoncelo. " staff_descriptions.misc[18] = "Adora andar de trem. " staff_descriptions.misc[19] = "Adora cachorros. " staff_descriptions.misc[20] = "Ouve rádio. " staff_descriptions.misc[21] = "Toma banho com frequência. " staff_descriptions.misc[22] = "Instrutor de costura. " staff_descriptions.misc[23] = "Tira o miolo dos vegetais para usar como saboneteira. " staff_descriptions.misc[24] = "É policial em meio expediente. " staff_descriptions.misc[25] = "Ex-convidado de um concurso. " staff_descriptions.misc[26] = "Coleciona bombas da Segunda Guerra. " staff_descriptions.misc[27] = "Restaura móveis. " staff_descriptions.misc[28] = "Escuta rap e hip-pop. " staff_descriptions.misc[29] = "Extermina insetos borrifando desodorante. " staff_descriptions.misc[30] = "Ridiculariza comediantes ruins. " staff_descriptions.misc[31] = "Investiga para a Câmara Municipal. " staff_descriptions.misc[32] = "Cuida do jardim às escondidas. " staff_descriptions.misc[33] = "Faz contrabando de relógios falsos. " staff_descriptions.misc[34] = "Vocalista de uma banda de rock & roll. " staff_descriptions.misc[35] = "Adora programas de televisäo vespertinos. " staff_descriptions.misc[36] = "Pesca trutas com a mäo. " staff_descriptions.misc[37] = "Isca turistas em museus. " staff_descriptions.good[1] = "Trabalha de forma rápida e diligente. " staff_descriptions.good[2] = "Trabalha com consciência e seriedade. " staff_descriptions.good[3] = "Sabe fazer muitas coisas. " staff_descriptions.good[4] = "Muito agradável e gosta de rir. " staff_descriptions.good[5] = "Tem muita energia. Näo para. " staff_descriptions.good[6] = "Pessoa educada e de boas maneiras. " staff_descriptions.good[7] = "Com talento e capacidade incríveis. " staff_descriptions.good[8] = "Preocupa-se muito pelo seu trabalho. " staff_descriptions.good[9] = "Procura a perfeiçäo e nunca se rende. " staff_descriptions.good[10] = "Ajuda as pessoas com um sorriso. " staff_descriptions.good[11] = "Tem encanto, educaçäo e disponibilidade. " staff_descriptions.good[12] = "Normalmente tem estímulo e dedicaçäo. " staff_descriptions.good[13] = "É boa pessoa e trabalha muito. " staff_descriptions.good[14] = "Leal e amigável. " staff_descriptions.good[15] = "Pessoa atenta e confiável em caso de emergência. " humanoid_name_ends[1] = "SMITH" humanoid_name_ends[2] = "WICK" humanoid_name_ends[3] = "CLIFFE" humanoid_name_ends[4] = "SON" humanoid_name_ends[5] = "INGTON" humanoid_name_ends[6] = "BURY" humanoid_name_ends[7] = "TON" humanoid_name_ends[8] = "SON" humanoid_name_ends[9] = "LEY" humanoid_name_ends[10] = "BERRY" humanoid_name_ends[11] = "BAUM" humanoid_name_ends[12] = "LAN" humanoid_name_ends[13] = "HAM" humanoid_name_ends[14] = "SILL" humanoid_name_ends[15] = "WIN" humanoid_name_ends[16] = "LET" humanoid_name_ends[17] = "ERS" humanoid_name_ends[18] = "TON" humanoid_name_ends[19] = "MOND" humanoid_name_ends[20] = "MAN" humanoid_name_ends[21] = "ELTON" humanoid_name_ends[22] = "E" humanoid_name_ends[23] = "MORE" humanoid_name_ends[24] = "MOOR" humanoid_name_ends[25] = "LET" humanoid_name_ends[26] = "LIN" menu.options = " OPÇOES " menu.display = " TELA " menu.file = " ARQUIVO " menu.debug = " DEBUG " menu.charts = " GRAFICOS " letter[1][1] = "Olá %s!//" letter[1][2] = "Fantástico! Dirigiu este hospital de uma maneira excelente. Nós, a elite do Ministério da Saúde, queríamos saber se estaria interessado em fazer parte de um grande projeto. Há um trabalho, no qual acreditamos que seja a pessoa perfeita. O salário seria de %d. Pense nisto.//" letter[1][3] = "Está interessado em trabalhar no Hospital %s?" letter[2][1] = "Olá %s!//" letter[2][2] = "Parabéns! Realizou notáveis melhorias no seu hospital. Temos outro serviço que poderia se encarregar, se gostar de mudança e novos desafios. Näo tem que aceitar, mas seria bom que o fizesse. O salário é de %d//" letter[2][3] = "Quer trabalhar no Hospital %s?" letter[3][1] = "Olá %s!//" letter[3][2] = "Dirigiu com notável desempenho este hospital durante o seu exercício. Ao chegar este ao seu fim, prevejo um brilhante futuro, e gostaríamos de lhe oferecer um cargo em outro lugar. O salário seria de %d, e acredito que adoraria o desafio que isto criaria.//" letter[3][3] = "Gostaria de ter um posto no Hospital %s?" letter[4][1] = "Olá %s!//" letter[4][2] = "Parabéns! No Ministério estamos muito impressionados pela sua capacidade como diretor do hospital. É sem dúvida, uma pessoa valiosa para o Departamento de Saúde, mas acreditamos que preferiria um trabalho mais qualificado. Receberia um salário de %d, embora a decisäo seja sua.//" letter[4][3] = "Está interessado em trabalhar no Hospital %s?" letter[5][1] = "Olá %s!//" letter[5][2] = "Saudaçöes novamente. Respeitamos os seus desejos de näo querer sair do seu estupendo hospital, mas pedimos que o reconsidere. Ofereceremos para você um alto salário de %d se decidir ir para o outro hospital e se encarregar da sua direçäo.//" letter[5][3] = "Gostaria de ir agora para o Hospital %s?" letter[6][1] = "Olá %s!//" letter[6][2] = "Receba as nossas saudaçöes. Sabemos que desfrutou muito da sua estadia nesta instituiçäo, täo agradável e bem dirigida, mas acreditamos que agora deveria pensar no seu futuro. Naturalmente, teria um salário de %d se decidisse sair. Vale a pena pensar.//" letter[6][3] = "Gostaria de ter um posto no Hospital %s?" letter[7][1] = "Olá %s!//" letter[7][2] = "Bom dia! O Ministério da Saúde queria saber se reconsideraria a sua decisäo de ficar no seu hospital. Compreendemos que tenha um estupendo hospital, mas acreditamos que faria muito bem em aceitar um trabalho mais estimulante, com um salário de %d.//" letter[7][3] = "Aceitaria um posto no Hospital %s?" letter[8][1] = "Olá %s!//" letter[8][2] = "Olá, outra vez. Recebemos a sua resposta negativa na nossa última carta, em que oferecíamos um posto de direçäo em um outro hospital, e um alto salário de %d. Contudo, acreditamos que deveria reconsiderar esta decisäo. Como verá, temos o trabalho perfeito para você.//" letter[8][3] = "Aceitaria um posto no Hospital %s, por favor?" letter[9][1] = "Olá %s!//" letter[9][2] = "Demonstrou ser o melhor diretor de hospital na longa e infeliz história da medicina. O lucro que obteve näo pode ficar sem recompensa, por isso lhe oferecemos o posto de Diretor Chefe de Todos os Hospitais. Terá um salário de %d, uma apresentaçäo com todas as honras e as pessoas demonstraräo o seu reconhecimento esteja onde estiver.//" letter[9][3] = "Agradecemos por tudo o que fez e desfrute de uma longa semi-aposentadoria.//" letter[9][4] = "" letter[10][1] = "Olá %s!//" letter[10][2] = "Parabéns por dirigir com êxito todos os hospitais que lhe atribuímos. Esta grande atuaçäo o capacita a viajar livremente por todo mundo. Receberá uma pensäo de %d e uma limousine, para poder viajar de cidade em cidade, saudando o seu incondicional público e incentivando o trabalho que realiza em todos os hospitais.//" letter[10][3] = "Estamos orgulhosos e agradecidos pelo seu trabalho ao salvar vidas.//" letter[10][4] = "" letter[11][1] = "Olá %s!//" letter[11][2] = "Sua carreira tem sido exemplar, e você é uma inspiraçäo para todos nós. Obrigado por dirigir täo bem tantos hospitais. Gostaríamos de lhe conceder um salário vitalício de %d, e só lhe pedimos que viaje em um carro oficial descoberto de cidade em cidade, dando conferências sobre os seus rápidos lucros.//" letter[11][3] = "É um exemplo para todos os homens de bem e uma pessoa de enorme valor.//" letter[11][4] = "" letter[12][1] = "Olá %s!//" letter[12][2] = "A sua bem-sucedida carreira como o melhor diretor de hospital desde Moisés está chegando ao seu fim. Você provocou tanto efeito nos círculos médicos, que o Ministério quer lhe oferecer um salário de %s, só para inaugurar festas, navios e organizar entrevistas em nosso nome. Você seria um excelente relaçöes públicas!//" letter[12][3] = "Por favor, aceite. Será fácil e irá dispor de um veículo e uma escolta policial.//" letter[12][4] = "" place_objects_window.place_objects_in_corridor = "Coloque os objetos em um corredor." place_objects_window.drag_blueprint = "Arraste a marca azul até que consiga o tamanho que deseja." place_objects_window.pick_up_object = "Aperte sobre um objeto para selecioná-lo ou escolher outra opçäo do diálogo." place_objects_window.place_windows = "Se quiser, coloque algumas janelas. Em seguida, aperte confirmar." place_objects_window.place_objects = "Coloque os objetos e mova-os ao seu gosto. Em seguida, confirme." place_objects_window.confirm_or_buy_objects = "Pode confirmar a sala, comprar ou mover alguns objetos." place_objects_window.place_door = "Coloque a porta" level_names[1] = "Cidade Contaminada" level_names[2] = "Cidade do Sonho" level_names[3] = "Vila Grande" level_names[4] = "Vila Praia" level_names[5] = "Vila Simples" level_names[6] = "Vilaúlcera" level_names[7] = "Cidade Verde" level_names[8] = "Cidade do Porto" level_names[9] = "Cidade Leste" level_names[10] = "Ovovile" level_names[11] = "Vila Corvo" level_names[12] = "Vila Próspera" level_names[13] = "Vila Amistosa" level_names[14] = "Vila Pancadaria" level_names[15] = "Vila Sepultura" pay_rise.definite_quit = "Faça o que fizer, näo ficarei. Estou farto deste local." pay_rise.regular[1] = "Estou esgotado. Preciso de umas boas férias, mais um aumento de %d, se näo quiser deixo este maldito emprego." pay_rise.regular[2] = "Estou muito cansado. Preciso de umas férias e de um aumento salarial de %d, até um total de %d. E quero já, seu tirano!" pay_rise.regular[3] = "Vamos! Trabalho como um escravo. Se me der um bônus de %d, ficarei no seu hospital." pay_rise.regular[4] = "Estou muito descontente. Exijo um aumento de %d, e um salário final de %d, caso contrário, vou embora." pay_rise.regular[5] = "Os meus pais me disseram que os médicos ganham um bom salário, sendo assim, me dê um aumento de %d ou me dedicarei à produçäo de jogos de computador." pay_rise.regular[6] = "Estou farto. Pague-me um bom salário. Será suficiente um aumento de %d." pay_rise.poached = "%s ofereceu-me um salário de %d. Se näo me pagar o mesmo, vou embora." casebook.reputation = "reputaçäo" casebook.earned_money = "dinheiro ganho" casebook.cure_desc.no_cure_known = "Näo há cura conhecida." casebook.cure_desc.hire_doctors = "Você precisa contratar alguns médicos." casebook.cure_desc.build_ward = "Ainda tem que construir uma enfermaria." casebook.cure_desc.improve_cure = "Melhorar Cura." casebook.cure_desc.build_room = "Sugiro que construa %s" casebook.cure_desc.hire_surgeons = "Você precisa contratar cirurgiöes." casebook.cure_desc.cure_known = "Cura." casebook.cure_desc.hire_psychiatrists = "Você precisa contratar psiquiatras." casebook.cure_desc.hire_nurses = "Você deve contratar algumas enfermeiras." casebook.sent_home = "rejeitados" casebook.cured = "recuperaçöes" casebook.deaths = "falecimentos" casebook.treatment_charge = "custo tratamento" casebook.research = "pesquisa intensiva" casebook.cure = "cura" confirmation.replace_machine = "Quer mesmo substituir esta máquina?" confirmation.quit = "Escolheu sair do jogo. Tem certeza de que pretende sair do jogo?" confirmation.sack_staff = "Tem certeza de que pretende despedir este funcionário?" confirmation.delete_room = "Quer mesmo eliminar esta consulta?" confirmation.return_to_blueprint = "Tem certeza de que pretende substituir o(a) %s por $%d?" confirmation.overwrite_save = "Já existe um jogo salvo neste local. Tem certeza de que pretende substitui-lo?" menu_options_volume[80] = " 80% " menu_options_volume[50] = " 50% " menu_options_volume[100] = " 100% " menu_options_volume[70] = " 70% " menu_options_volume[40] = " 40% " menu_options_volume[90] = " 90% " menu_options_volume[60] = " 60% " menu_options_volume[20] = " 20% " menu_options_volume[30] = " 30% " menu_options_volume[10] = " 10% " vip_names[1] = "O Maior dos Ricaços" vip_names[2] = "Lawrence Nightingale" vip_names[3] = "Rei Bernard da Holanda" vip_names[4] = "Aung Sang Su Kyi" vip_names[5] = "Sir Reginald Crumbly" vip_names[7] = "O Vereador Joäo Precipício" vip_names[8] = "O Marquês do Figo de Chumbo" vip_names[9] = "Uma estrela do futebol" vip_names[10] = "A. Eskoplovitz, II" vip_names.health_minister = "O Ministro da Saúde" menu_charts.briefing = " INSTRUÇOES " diseases.kidney_beans.cause = "Causa - Mastigar os cubos de gelo das bebidas." diseases.kidney_beans.name = "Incontinência" diseases.kidney_beans.symptoms = "Sintomas - Dor e idas frequentes ao banheiro." diseases.kidney_beans.cure = "Cura - Dois cirurgiöes extraem as pedras dos rins." diseases.ruptured_nodules.cause = "Causa - Fazer bungee jumping em tempo frio." diseases.ruptured_nodules.name = "Boluditis" diseases.ruptured_nodules.symptoms = "Sintomas - Incapacidade de se sentar confortavelmente." diseases.ruptured_nodules.cure = "Cura - Dois cirurgiöes qualificados colocam certas partes com mäos firmes." diseases.fractured_bones.cause = "Causa - Queda de um lugar alto." diseases.fractured_bones.name = "Fraturas ósseas" diseases.fractured_bones.symptoms = "Sintomas - Um grande rangido e a impossibilidade de usar os membros afetados." diseases.fractured_bones.cure = "Cura - É colocado um molde, depois com uma máquina à laser o remove. " diseases.diag_psych.name = "Diag: Psiquiatria" diseases.jellyitis.cause = "Causa - Uma dieta rica em gelatina e muito exercício." diseases.jellyitis.name = "Gelatinitis" diseases.jellyitis.symptoms = "Sintomas - Um tremor excessivo e cair ao chäo muitas vezes." diseases.jellyitis.cure = "Cura - Inunda-se o paciente durante um momento no banheiro gelatinoso em uma consulta especial." diseases.discrete_itching.cause = "Causa - Insetos diminutos com os dentes afiados." diseases.discrete_itching.name = "Coceira leve" diseases.discrete_itching.symptoms = "Sintomas - Arranhar-se, o que conduz a um inchaço da parte afetada." diseases.discrete_itching.cure = "Cura - O paciente bebe um xarope farmacêutico para evitar a coceira da pele." diseases.alien_dna.cause = "Causa - Enfrentara gigantes providos de sangue alienígena inteligente." diseases.alien_dna.name = "DNA alienígena" diseases.alien_dna.symptoms = "Sintomas - Metamorfose alienígena gradual e desejo de destruir nossas cidades." diseases.alien_dna.cure = "Cura - O DNA é mecanicamente removido, limpo de elementos alienígenas e substituídos rapidamente." diseases.infectious_laughter.cause = "Causa - Comédia clássica de situaçäo." diseases.infectious_laughter.name = "Risada contagiosa" diseases.infectious_laughter.symptoms = "Sintomas - Näo poder parar de rir e repetir frases feitas nada divertidas." diseases.infectious_laughter.cure = "Cura - Um psiquiatra qualificado deve recordar o paciente que a sua doença é grave." diseases.diag_general_diag.name = "Diag: Geral" diseases.spare_ribs.cause = "Causa - Sentar-se sobre chäos muito frios." diseases.spare_ribs.name = "Costelas de mais" diseases.spare_ribs.symptoms = "Sintomas- Um mal-estar no peito." diseases.spare_ribs.cure = "Cura - Dois cirurgiöes extraem as costelas e däo ao paciente em uma sacola." diseases.transparency.cause = "Causa - Lamber tampa de iogurte já usado." diseases.transparency.name = "Transparentitis" diseases.transparency.symptoms = "Sintomas - A carne fica transparente e fica horrível." diseases.transparency.cure = "Cura - Tomar uma preparaçäo farmacêutica de água esfriada e colorida de modo especial." diseases.baldness.cause = "Causa - Contar mentiras e inventar histórias para ser famoso." diseases.baldness.name = "Calvície" diseases.baldness.symptoms = "Sintomas - Ter a cabeça brilhante e passar vergonha." diseases.baldness.cure = "Cura - O cabelo está costurado à cabeça do paciente com uma dolorosa máquina." diseases.sleeping_illness.cause = "Causa - Uma glândula do sono hiperativa no céu da boca." diseases.sleeping_illness.name = "Sonolência" diseases.sleeping_illness.symptoms = "Sintomas - Um desejo imprescindível de mergulhar no sono." diseases.sleeping_illness.cure = "Cura - Uma enfermeira administra uma dose elevada de um poderoso estimulante." diseases.pregnancy.cause = "Causa - Cortes de eletricidade em áreas urbanas." diseases.pregnancy.name = "Grávida" diseases.pregnancy.symptoms = "Sintomas - Muita vontade de comer e um mal-estar no estômago." diseases.pregnancy.cure = "Cura - Extrai-se ao bebé na sala de operaçöes, limpa-se e entrega-se ao paciente." diseases.general_practice.name = "Clínica Geral" diseases.tv_personalities.cause = "Causa - Ver televisäo durante o dia." diseases.tv_personalities.name = "Personalitis" diseases.tv_personalities.symptoms = "Sintomas - Ter a ilusäo de apresentar na televisäo um programa de cozinha." diseases.tv_personalities.cure = "Cura - Um psiquiatra perito deve convencer o paciente de que venda o seu televisor e compre um rádio." diseases.broken_wind.cause = "Causa - Usar um aparelho ginástico depois das comidas." diseases.broken_wind.name = "Aerofagia" diseases.broken_wind.symptoms = "Sintomas - Incomoda as pessoas que estäo mesmo atrás do paciente." diseases.broken_wind.cure = "Cura - Na farmácia bebe-se rapidamente uma forte mistura de átomos aquosos." diseases.hairyitis.cause = "Causa - Exposiçäo prolongada à lua." diseases.hairyitis.name = "Peludismo" diseases.hairyitis.symptoms = "Sintomas - Pacientes com olfato mais sensível." diseases.hairyitis.cure = "Cura - Uma máquina de eletrólise elimina o pêlo e fecha os poros." diseases.diag_ward.name = "Diag: Clínico" diseases.third_degree_sideburns.cause = "Causa - Desejar muito os anos 70 ." diseases.third_degree_sideburns.name = "Costeletas de terceiro grau" diseases.third_degree_sideburns.symptoms = "Sintomas - Corte comprido, roupa larga, plataformas e muita maquilhagem." diseases.third_degree_sideburns.cure = "Cura - O pessoal psiquiátrico deve, empregando técnicas atualizadas, convencer o paciente de que esta moda é horrível." diseases.gut_rot.cause = "Causa - O Xarope para a tosse, a base de uísque, da Sra. McGuiver." diseases.gut_rot.name = "Ulcera gástrica" diseases.gut_rot.symptoms = "Sintomas - O paciente näo tosse, mas também näo tem paredes no estômago." diseases.gut_rot.cure = "Cura - Uma enfermeira administra uma variada dissoluçäo de substâncias químicas para revestir o estômago." diseases.chronic_nosehair.cause = "Causa - Cheirar com desprezo aqueles que estäo pior que o paciente." diseases.chronic_nosehair.name = "Nariz peludo" diseases.chronic_nosehair.symptoms = "Sintomas - Ter tanto cabelo no nariz para fazer uma peruca." diseases.chronic_nosehair.cure = "Cura - Tomar por via oral um xarope retira-pêlo, que a enfermeira prepara na farmácia." diseases.the_squits.cause = "Causa - Comer pizza que encontrou debaixo da mesa da cozinha." diseases.the_squits.name = "Decomposiçäo" diseases.the_squits.symptoms = "Sintomas - Agh! Certamente pode imaginar isto." diseases.the_squits.cure = "Cura - Uma mistura pegajosa de substâncias viscosas preparada na farmácia solidifica as tripas do paciente." diseases.fake_blood.cause = "Causa - O paciente está acostumado a ser o branco das brincadeiras." diseases.fake_blood.name = "Sangue falso" diseases.fake_blood.symptoms = "Sintomas - Fluido vermelho nas veias que se evapora no contato com a roupa." diseases.fake_blood.cure = "Cura - Este problema só se resolve com tratamento psiquiátrico." diseases.corrugated_ankles.cause = "Causa - Avançar sinal vermelho do semáforo." diseases.corrugated_ankles.name = "Tornozelo torcido" diseases.corrugated_ankles.symptoms = "Sintomas - Os pés näo cabem bem nos sapatos." diseases.corrugated_ankles.cure = "Cura - Os tornozelos säo endireitados, bebendo uma infusäo ligeiramente tóxica de ervas e plantas." diseases.diag_x_ray.name = "Diag: Raio-X" diseases.invisibility.cause = "Causa - A picada de uma formiga radioativa (e invisível)." diseases.invisibility.name = "Invisibilidade" diseases.invisibility.symptoms = "Sintomas - Os Pacientes näo sofrem, porém, às vezes gostam de pregar peças em seus familiares." diseases.invisibility.cure = "Cura - Beber um líquido colorido na farmácia, fazendo completamente visível o paciente." diseases.sweaty_palms.cause = "Causa - Temer as entrevistas de trabalho." diseases.sweaty_palms.name = "Mäos suadas" diseases.sweaty_palms.symptoms = "Sintomas - Dar a mäo ao paciente é como agarrar uma esponja encharcada." diseases.sweaty_palms.cure = "Cura - Um psiquiatra deve discutir a fundo com o paciente sobre esta doença inventada." diseases.bloaty_head.cause = "Causa - Cheirar queijo e beber água da chuva näo purificada." diseases.bloaty_head.name = "Cabeça inchada" diseases.bloaty_head.symptoms = "Sintomas - Muito desconforto pelo que parece." diseases.bloaty_head.cure = "Cura - Fura-se a cabeça inflada, em seguida, volta-se a inflar até o tamanho correto com uma máquina inteligente." diseases.heaped_piles.cause = "Causa - Permanecer de pé junto a refrigeradores de água." diseases.heaped_piles.name = "Hemorroidas" diseases.heaped_piles.symptoms = "Sintomas - O paciente sente-se como se estivesse sentado sobre bolas de gude." diseases.heaped_piles.cure = "Cura - Uma bebida agradável, embora muito ácida, dissolve as hemorroidas internas." diseases.king_complex.cause = "Causa - O espírito do rei entrou na mente do paciente e se apoderou dela." diseases.king_complex.name = "Complexo de rei" diseases.king_complex.symptoms = "Sintomas - Calçar sapatos de camurça e comer hambúrgueres." diseases.king_complex.cure = "Cura - Um Psiquiatra conta ao paciente como ele está ridículo." diseases.golf_stones.cause = "Causa - Inalar gás venenoso contendo bolas de golfe." diseases.golf_stones.name = "Cálculos de golfe" diseases.golf_stones.symptoms = "Sintomas - Delirar e sentir muita vergonha." diseases.golf_stones.cure = "Cura - Dois cirurgiöes operam para extrair os cálculos." diseases.gastric_ejections.cause = "Causa - Comida mexicana ou da India muito condimentada." diseases.gastric_ejections.name = "Vômito" diseases.gastric_ejections.symptoms = "Sintomas - O paciente vomita a comida ao meio digerir em qualquer momento." diseases.gastric_ejections.cure = "Cura - Beber um preparado adstringente especial para parar os vômitos." diseases.unexpected_swelling.cause = "Causa - Algo inesperado." diseases.unexpected_swelling.name = "Inchaço inesperado" diseases.unexpected_swelling.symptoms = "Sintomas - Inchaço." diseases.unexpected_swelling.cure = "Cura - Só pode reduzir o inchaço com uma lanceta durante uma operaçäo que requer dois cirurgiöes." diseases.slack_tongue.cause = "Causa - Fazer muita fofoca." diseases.slack_tongue.name = "Língua comprida" diseases.slack_tongue.symptoms = "Sintomas - A língua cresce até cinco vezes o seu tamanho original." diseases.slack_tongue.cure = "Cura - Coloca-se a língua no corta-línguas e elimina-se de forma rápida, eficaz e dolorosa." diseases.diag_scanner.name = "Diag: Scanner" diseases.uncommon_cold.cause = "Causa - Pequenas partículas de muco no ar." diseases.uncommon_cold.name = "Catarro atípico" diseases.uncommon_cold.symptoms = "Sintomas - Mucosidade, espirros e pulmöes descoloridos." diseases.uncommon_cold.cure = "Cura - Beber um grande gole de um xarope estranho para tosse fabricado na farmácia com ingredientes especiais." diseases.broken_heart.cause = "Causa - Alguém mais rico, mais jovem e mais magro que o paciente." diseases.broken_heart.name = "Infelicidade" diseases.broken_heart.symptoms = "Sintomas - Chorar e rir depois de passar horas rasgando as fotos das férias." diseases.broken_heart.cure = "Cura - Dois cirurgiöes abrem o peito e arrumam com delicadeza o coraçäo enquanto prendem a respiraçäo." diseases.diag_blood_machine.name = "Diag: Análise Sanguínea" diseases.diag_cardiogram.name = "Diag: Cardiologia" diseases.serious_radiation.cause = "Causa - Confundir isótopos de plutônio com chiclete." diseases.serious_radiation.name = "Radiaçäo Grave" diseases.serious_radiation.symptoms = "Sintomas - Os pacientes com essa doença se sentem muito mal." diseases.serious_radiation.cure = "Cura - O Paciente deve ir para a Ducha de Descontaminaçäo para se limpar." diseases.iron_lungs.cause = "Causa - A contaminaçäo urbana misturada com restos do Kebab." diseases.iron_lungs.name = "Pulmäo de aço" diseases.iron_lungs.symptoms = "Sintomas - Capacidade para aspirar fogo e gritar debaixo da água." diseases.iron_lungs.cure = "Cura - Dois cirurgiöes realizam uma operaçäo para eliminar as partes duras do pulmäo na sala de operaçöes." diseases.diag_ultrascan.name = "Diag: Ultra Scanner" diseases.autopsy.name = "Autópsia" dynamic_info.staff.ability = "Habilidade" dynamic_info.staff.psychiatrist_abbrev = "Psiq." dynamic_info.staff.actions.waiting_for_patient = "Esperando um paciente" dynamic_info.staff.actions.wandering = "Andando por aí" dynamic_info.staff.actions.going_to_repair = "Indo reparar %s" dynamic_info.staff.tiredness = "Cansaço" dynamic_info.vip = "Visitante VIP" dynamic_info.patient.diagnosis_progress = "Diagnóstico em curso" dynamic_info.patient.emergency = "Emergências: %s" dynamic_info.patient.diagnosed = "Diagnóstico: %s " dynamic_info.patient.guessed_diagnosis = "Bom diagnóstico: %s" dynamic_info.patient.actions.fed_up = "Perdeu a paciência - Indo para casa" dynamic_info.patient.actions.waiting_for_diagnosis_rooms = "Esperando a construçäo da consulta" dynamic_info.patient.actions.sent_to_other_hospital = "Enviado para outro local" dynamic_info.patient.actions.on_my_way_to = "Indo para %s" dynamic_info.patient.actions.waiting_for_treatment_rooms = "Esperando a construçäo do tratamento" dynamic_info.patient.actions.queueing_for = "Na fila para %s" dynamic_info.patient.actions.epidemic_contagious = "Tenho uma doença contagiosa" dynamic_info.patient.actions.no_diagnoses_available = "Näo há mais diagnósticos, vou embora" dynamic_info.patient.actions.awaiting_decision = "Esperando por sua decisäo" dynamic_info.patient.actions.sent_home = "Dado alta" dynamic_info.patient.actions.cured = "Curado!" dynamic_info.patient.actions.prices_too_high = "Os seus preços säo muito altos, vou embora" dynamic_info.patient.actions.epidemic_sent_home = "Enviado para casa por um Inspetor" dynamic_info.patient.actions.no_treatment_available = "Näo há tratamentos, vou para casa." dynamic_info.patient.actions.dying = "Morrendo!" dynamic_info.object.strength = "Resistência %d" dynamic_info.object.queue_expected = "Fila esperada %d" dynamic_info.object.times_used = "Utilizado %d vezes" dynamic_info.object.queue_size = "Tamanho da fila %d" dynamic_info.health_inspector = "Inspetor de Saúde" town_map.chat = "Detalhes da cidade" town_map.not_for_sale = "Näo vende-se" town_map.price = "Preço" town_map.number = "Número" town_map.owner = "Proprietário" town_map.for_sale = "Vende-se" town_map.area = "Terreno" misc.grade_adverb.mildly = "ligeiramente" misc.grade_adverb.moderately = "moderadamente" misc.grade_adverb.extremely = "extremamente" misc.out_of_sync = "Jogo fora de sincronismo" misc.load_failed = "Jogo näo carregado" misc.send_message_all = "Enviar mensagem para todos os jogadores" misc.hospital_open = "Hospital Aberto" misc.save_failed = "ERRO: Näo foi possível salvar o jogo" misc.mouse = "Rato" misc.pause = "Pausa" misc.done = "Concluído" misc.send_message = "Enviar mensagem para o jogador %d" misc.balance = "Arquivo de Balanço:" misc.low_res = "Baixa Resoluçäo" misc.force = "Mäo-de-obra" misc.save_success = "Jogo salvo com êxito" drug_companies[1] = "Laboratórios Joäo" drug_companies[2] = "Curatudo S.A." drug_companies[3] = "Pequena Pílula Co." drug_companies[4] = "Remédios Seguros S.A" drug_companies[5] = "Omnipharma Corp." high_score.score = "PONTOS" high_score.pos = "POS" high_score.worst_scores = "GALERIA DA VERGONHA" high_score.categories.cures = "NUMERO DE CURAS" high_score.categories.cure_death_ratio = "MEDIA DE CURAS E MORTES" high_score.categories.total_value = "VALOR TOTAL" high_score.categories.visitors = "MAIS VISITANTES" high_score.categories.clean = "LIMPEZA" high_score.categories.money = "O MAIS RICO" high_score.categories.salary = "SALARIO MAIS ALTO" high_score.categories.deaths = "NUMERO DE MORTES" high_score.categories.patient_happiness = "CLIENTES SATISFEITOS" high_score.categories.staff_number = "FUNCIONARIOS" high_score.categories.staff_happiness = "FUNCIONARIOS CONTENTES" high_score.player = "JOGADOR" high_score.best_scores = "GALERIA DA FAMA" high_score.killed = "Morto" competitor_names[1] = "ORAC" competitor_names[2] = "COLOSSUS" competitor_names[3] = "HAL" competitor_names[4] = "MULTIVAC" competitor_names[5] = "HOLLY" competitor_names[6] = "DEEP THOUGHT" competitor_names[7] = "ZEN" competitor_names[8] = "LEON" competitor_names[9] = "MARVIN" competitor_names[10] = "AKIRA" competitor_names[11] = "MOTHER" competitor_names[12] = "JAYNE" competitor_names[13] = "CORSIX" competitor_names[14] = "ROUJIN" competitor_names[15] = "EDVIN" competitor_names[16] = "SAM" competitor_names[17] = "CHARLIE" competitor_names[18] = "ARTHUR" competitor_names[19] = "MAGNUS" competitor_names[20] = "SAL" competitor_names[21] = "JOSHUA" competitor_names[22] = "DANEEL" competitor_names[23] = "OLIVAW" competitor_names[24] = "NIC" staff_class.handyman = "Faz-tudo" staff_class.nurse = "Enfermeira" staff_class.surgeon = "Cirurgiäo" staff_class.receptionist = "Recepcionista" staff_class.doctor = "Médico" menu_debug.display_pager = " MOSTRAR PAGINADOR " menu_debug.nav_bits = " NAV BITS " menu_debug.win_level_anim = " SUPERAR NIVEL ANIM " menu_debug.plant_pagers = " PAGINADORES DE PLANTAS " menu_debug.display_room_status = " MOSTRAR ESTADO DA CONSULTA" menu_debug.show_nav_cells = " MOSTRAR CELAS NAV " menu_debug.entry_cells = " CELAS DE ENTRADA " menu_debug.object_cells = " CELAS DE OBJETO " menu_debug.lose_game_anim[1] = " PERDER JOGO 1 ANIM " menu_debug.lose_game_anim[2] = " PERDER JOGO 2 ANIM " menu_debug.lose_game_anim[3] = " PERDER JOGO 3 ANIM " menu_debug.lose_game_anim[4] = " PERDER JOGO 4 ANIM " menu_debug.lose_game_anim[5] = " PERDER JOGO 5 ANIM " menu_debug.lose_game_anim[6] = " PERDER JOGO 6 ANIM " menu_debug.lose_game_anim[7] = " PERDER JOGO 7 ANIM " menu_debug.show_help_hotspot = " MOSTRAR AJUDAS " menu_debug.porter_pagers = " PAGINADORES DE FAZ-TUDO " menu_debug.mapwho_checking = " VERIFICAR LOCALIZAÇAO " menu_debug.machine_pagers = " PAGINADORES DE MAQUINA " menu_debug.keep_clear_cells = " CONSERVAR AS CELAS LIMPAS " menu_debug.enter_nav_debug = " INTRODUZIR NAV DEBUG " menu_debug.win_game_anim = " GANHAR JOGO ANIM " menu_debug.remove_objects = " RETIRAR OBJETOS " menu_debug.display_big_cells = " MOSTRAR CELAS GRANDES " menu_debug.pixbuf_cells = " CELAS PIXBUF " menu_debug.remove_walls = " RETIRAR PAREDES " research.categories.drugs = "Pesquisa farmacêutica" research.categories.cure = "Equipam. de cura" research.categories.improvements = "Melhorias" research.categories.specialisation = "Especializaçäo" research.categories.diagnosis = "Equipam. de diagnóstico" research.funds_allocation = "Alocaçäo de fundos" research.allocated_amount = "Quantidade alocada" months[1] = "Jan" months[2] = "Fev" months[3] = "Mar" months[4] = "Abr" months[5] = "Mai" months[6] = "Jun" months[7] = "Jul" months[8] = "Ago" months[9] = "Set" months[10] = "Out" months[11] = "Nov" months[12] = "Dez" trophy_room.cleanliness.award[1] = "Os Inspetores notaram que o seu hospital está muito limpo. Um hospital limpo é um hospital seguro. Continue assim." trophy_room.cleanliness.regional_good[1] = "Seu hospital foi apontado como um dos menos limpos da regiäo. Um hospital sujo, que cheira mal e é perigoso. Deveria se preocupar mais com a limpeza." trophy_room.cleanliness.regional_bad[1] = "O seu hospital é o mais sujo da regiäo. Outros diretores conseguiram manter os seus hospitais mais limpos. Você é a vergonha da profissäo médica." trophy_room.happy_vips.trophies[1] = "Ganhou o Prêmio Nobel de VIP Exemplares. Todos os que visitaram o seu hospital no ano passado o elogiaram muito." trophy_room.happy_vips.trophies[2] = "A Agência de Pessoas Famosas deseja-lhe conceder o Prêmio à Celebridade por ter agradado a todos os VIP que visitaram o seu hospital." trophy_room.happy_vips.trophies[3] = "Ganhou a VIAGEM VIP por melhorar a imagem dos trabalhadores aos olhos de todos os que visitaram o seu hospital. Estupendo!" trophy_room.gen_repairs.awards[1] = "Foi-lhe concedido um prêmio especial pela diligência dos seus faz-tudo na hora de manter as máquinas do seu hospital em bom estado. Muito bem. Tire umas férias." trophy_room.gen_repairs.awards[2] = "Os seus faz-tudo trabalharam melhor que os de qualquer outro hospital. Este é um importante acontecimento de felicidade." trophy_room.gen_repairs.awards[3] = "As suas máquinas estäo em um magnífico estado. A dedicaçäo dos seus faz-tudo foi extraordinária. Merecem este prestigioso prêmio. Um trabalho estupendo!" trophy_room.gen_repairs.penalty[1] = "Os seus faz-tudo näo cuidaram bem das suas máquinas. Deveria fiscalizá-los melhor ou contratar mais para que façam o trabalho melhor." trophy_room.gen_repairs.penalty[2] = "Näo fez uma boa manutençäo. Os seus funcionários deveriam cuidar melhor dos seus equipamentos." trophy_room.many_cured.penalty[1] = "O seu hospital näo cura com eficácia os pacientes que o necessitam. Tenha mais atençäo às curas para que sejam mais eficazes." trophy_room.many_cured.penalty[2] = "O seu hospital é o menos eficaz na hora de curar pacientes. Decepcionou o Ministério e defraudou a si mesmo. Näo diremos mais." trophy_room.many_cured.trophies[1] = "Parabéns pela concessäo do prêmio Marie Curie por ter curado quase todos os pacientes do seu hospital no ano passado." trophy_room.many_cured.trophies[2] = "A Fundaçäo Nacional de Curas deseja premiá-lo por ter curado um grande número de pacientes no ano passado, concedendo o Galardäo ao Maior Curador." trophy_room.many_cured.trophies[3] = "Foi-lhe concedido a Medalha do Paciente Säo por ter conseguido curar no seu hospital uma enorme porcentagem de pacientes no ano passado." trophy_room.many_cured.awards[1] = "Parabéns por curar um montäo de pessoas no ano passado. Um grande número de pessoas sente-se muito melhor, graças ao seu trabalho." trophy_room.many_cured.awards[2] = "Pedimos que aceite este prêmio por ter curado mais pacientes que qualquer outro hospital. Um excelente trabalho." trophy_room.many_cured.regional[1] = "Você recebeu o prêmio de cura total por ter curado mais pessoas do que todos os outros hospitais juntos." trophy_room.sold_drinks.trophies[1] = "A Associaçäo Odontológica orgulha-se de lhe conceder este troféu e esta placa por vender um montäo de bebidas em lata no seu hospital." trophy_room.sold_drinks.trophies[2] = "O seu hospital foi premiado com o prêmio Bizz-Efervescente pela Venda de Refrigerante em reconhecimento ao número de bebidas vendidas em seu hospital no ano passado." trophy_room.sold_drinks.trophies[3] = "Em nome de DK Obturaçöes Inc., você recebe o prêmio coberto de chocolate para celebrar a enorme quantidade de refrigerantes que vendeu no seu hospital este ano." trophy_room.consistant_rep.trophies[1] = "O Conselho de ministros concedeu-lhe a Mençäo de Honra por ter alcançado o nível máximo de eficácia e reputaçäo durante o ano presente. Muito bem." trophy_room.consistant_rep.trophies[2] = "Parabéns pela concessäo do Prêmio Lençóis Limpos por ser o hospital com a melhor reputaçäo do ano. Você mereceu." trophy_room.cash = "EFETIVO" trophy_room.high_rep.penalty[1] = "Vai ser sancionado pela má reputaçäo que teve no ano passado. Procure melhorar no futuro." trophy_room.high_rep.penalty[2] = "A reputaçäo do seu hospital é a pior da área. É uma vergonha. Melhore ou consiga outro emprego." trophy_room.high_rep.awards[1] = "Muito bem! Ganhou um pequeno prêmio por alcançar uma impressionante reputaçäo no ano passado." trophy_room.high_rep.awards[2] = "Maravilhoso! O seu hospital ganhou um prêmio por conseguir a melhor reputaçäo no ano passado." trophy_room.high_rep.regional[1] = "Por favor, aceite o Prêmio Bullfrog por dirigir o melhor hospital do ano. Você mereceu, aproveite." trophy_room.high_rep.regional[2] = "Este ano, a reputaçäo do seu hospital superou a do resto dos hospitais. Um estupendo lucro." trophy_room.best_value_hosp.trophies[1] = "Parabéns pela concessäo do Prêmio Lençóis Limpos por ser o hospital com a melhor reputaçäo do ano. Você mereceu." trophy_room.best_value_hosp.regional[1] = "Parabéns por ter o hospital mais valioso do jogo. Bom trabalho! Por favor, continue assim." trophy_room.best_value_hosp.penalty[1] = "Todos os hospitais da área valem mais do que o seu. Faça algo a respeito desta vergonhosa situaçäo. Consiga coisas mais caras!" trophy_room.reputation = "REPUTAÇAO" trophy_room.happy_staff.regional_good[1] = "Os seus funcionários säo os mais satisfeitos de todos os hospitais. Se os funcionários estäo contentes, há mais ganhos e menos mortes. No Ministério estäo satisfeitos." trophy_room.happy_staff.penalty[1] = "Os seus funcionários desejam que saiba que estäo muito descontentes. Ter bons funcionários é muito proveitoso. Faça com que eles estejam mais satisfeitos ou algum dia irá perdê-los." trophy_room.happy_staff.trophies[1] = "Ganhou o Prêmio Médico Sorridente por manter o mais contente possível os seus funcionários." trophy_room.happy_staff.trophies[2] = "A Fundaçäo para a Felicidade do Pessoal Sanitário concedeu-lhe este galardäo por näo ter tido trabalhadores descontentes no seu hospital no ano passado." trophy_room.happy_staff.trophies[3] = "Concedemos a você o prêmio Monopoliza do Sorriso Radiante por manter contente todos os seus funcionários, mais à frente do cumprimento do dever, durante o ano passado." trophy_room.happy_staff.awards[1] = "Sua equipe te concedeu um prêmio. Eles dizem que, em geral, você manda muito bem." trophy_room.happy_staff.awards[2] = "Seus funcionários säo täo felizes trabalhando para você que näo conseguem tirar os sorrisos dos seus rostos. Você é um gerente magnífico." trophy_room.happy_staff.regional_bad[1] = "A sua equipe esteve muito infeliz durante o ano passado. Você deveria ter notado. Do jeito que está, as equipes dos outros hospitais estäo muito mais contentes do que a sua." trophy_room.hosp_value.penalty[1] = "O seu hospital fracassou em alcançar um valor razoável. Gerenciou mal o dinheiro. Lembre-se, um bom hospital também é um hospital caro." trophy_room.hosp_value.awards[1] = "O Ministério da Saúde gostaria de parabenizá-lo pelo impressionante valor alcançado em seu hospital." trophy_room.hosp_value.regional[1] = "É uma promessa dos negócios. O hospital é o mais valioso de toda a área." trophy_room.healthy_plants.awards[1] = "Parabéns por ganhar o galardäo do Grande Fertilizante por manter as suas plantas vivas durante o ano passado." trophy_room.healthy_plants.trophies[1] = "Os Amigos das Plantas de Interior desejam lhe conceder o Prêmio de Saúde Verde por manter vivas as suas plantas durante os últimos doze meses." trophy_room.healthy_plants.trophies[2] = "Salvem as Plantas quer concede-lhes o Prêmio do Maior Ecologista por manter vivas as plantas do seu hospital durante o ano passado." trophy_room.research.penalty[1] = "Foi pouco eficiente ao investigar curas, máquinas e remédios novos. Isto é fatal, já que o avanço tecnológico é algo fundamental." trophy_room.research.regional_good[1] = "As suas pesquisas conseguiram colocar o seu hospital nos últimos avanços de hoje em dia. Os seus pesquisadores merecem este prêmio. Muito bem!" trophy_room.research.awards[1] = "As suas pesquisas conseguiram colocar o seu hospital nos últimos avanços de hoje em dia. Os seus pesquisadores merecem este prêmio. Muito bem!" trophy_room.research.awards[2] = "No ano passado, descobriu mais remédios e máquinas do que se podia esperar. Por favor, aceite este prêmio de todos nós no Ministério." trophy_room.research.regional_bad[1] = "Outros hospitais säo melhores que o seu na pesquisa. No Ministério estäo furiosos, seu hospital deveria lhe conceder mais importância." trophy_room.no_deaths.penalty[1] = "O número de mortes no seu hospital, no ano passado, foi muito elevado. Empresta mais atençäo ao seu trabalho. Assegure-se de que no futuro sobreviva mais pessoas." trophy_room.no_deaths.penalty[2] = "O seu hospital é um risco para os pacientes. Supöe-se que deve curar muitas pessoas, näo deixar morrer." trophy_room.no_deaths.trophies[1] = "Ganhou o Galardäo da Queixa Ausente por manter 100%% dos seus pacientes com vida o ano passado." trophy_room.no_deaths.trophies[2] = "A Associaçäo A Vida Continua concede-lhe este prêmio pela ausência de falecimentos no seu hospital este ano." trophy_room.no_deaths.trophies[3] = "Você recebeu o Prêmio pela Conservaçäo da Vida por ter conseguido evitar falecimentos no seu hospital durante este ano. Genial!" trophy_room.no_deaths.awards[1] = "Ganhou este prêmio como reconhecimento ao sob índice de falecimentos no seu hospital, este ano. É estupendo!" trophy_room.no_deaths.awards[2] = "A sua habilidade conseguiu reduzir ao mínimo o número de mortes no seu hospital. Deve estar muito feliz com este resultado." trophy_room.no_deaths.regional[1] = "No ano passado, a taxa de mortalidade do seu hospital foi inferior a dos outros. Por favor, aceite este prêmio." trophy_room.rats_accuracy.trophies[1] = "Você recebeu o Prêmio de Disparos Certeiros Syndicate Wars por acertar em %d%% ratos no seu hospital no ano passado." trophy_room.rats_accuracy.trophies[2] = "Este prêmio é para celebrar a sua incrível pontaria ao eliminar %d%% dos ratos que disparou no seu hospital no ano passado." trophy_room.rats_accuracy.trophies[3] = "Para celebrar o fato de que eliminou %d%% dos ratos do seu hospital, foi-lhe concedido o Troféu de Eliminador de Roedores. Parabéns!" trophy_room.emergencies.penalty[1] = "Foi muito pouco eficiente nos casos de emergência. Os pacientes de emergência merecem uma atençäo rápida e precisa, que você näo lhes deu." trophy_room.emergencies.award[1] = "Parabéns! Ganhou este prêmio pela maneira eficaz e eficiente com a qual solucionou as emergências. Bom trabalho." trophy_room.emergencies.award[2] = "Confrontou as emergências de uma maneira extraordinária. Ganhou este prêmio por ser o melhor na hora de lidar com uma grande quantidade de pacientes." trophy_room.emergencies.regional_good[1] = "O Ministério reconhece que o ano passado no seu hospital, você tratou as emergências melhor do que qualquer outro hospital, entäo lhe concedeu este prêmio." trophy_room.emergencies.regional_bad[1] = "O seu hospital é o pior da regiäo para tratar casos de emergência. Tem a culpa de ocupar o último lugar na Liga Local de Tratamentos de Emergência." trophy_room.curesvdeaths.awards[1] = "Os meus mais sinceros parabéns. No ano passado, o número de curas foi superior ao de falecimentos no seu hospital." trophy_room.curesvdeaths.penalty[1] = "A sua proporçäo entre curas e mortes é extremamente baixa. Deveria assegurar de que cura mais pessoas do que mata. Näo deixe os seus funcionários em mau lugar." trophy_room.wait_times.award[1] = "Parabéns! No seu hospital a gente fez fila durante muito pouco tempo. Este é um acontecimento importante." trophy_room.wait_times.penalty[1] = "No seu hospital, os pacientes esperam muito tempo. Há sempre filas inaceitáveis. Poderia tratar os seus pacientes com mais eficácia se quisesse." trophy_room.happy_patients.awards[1] = "Deve estar orgulhoso de que, no ano passado, as pessoas estivesse muito contente no seu hospital." trophy_room.happy_patients.awards[2] = "Os pacientes que visitaram o seu hospital sentiram-se mais contentes com o seu tratamento, que no resto dos hospitais." trophy_room.happy_patients.penalty[1] = "As pessoas que väo para o hospital tem uma experiência terrível. Terá que fazê-lo muito melhor se quiser ganhar o respeito do Ministério." trophy_room.happy_patients.penalty[2] = "As pessoas que recebeu tratamento no seu hospital queixaram-se do estado do mesmo. Deveria ter muito mais em conta o bem-estar dos pacientes." trophy_room.pop_percentage.awards[1] = "Note, o ano passado curou uma grande parte da populaçäo local no seu hospital. Muito bem." trophy_room.pop_percentage.awards[2] = "Parabéns! A maioria da populaçäo local vai ao seu hospital em vez de ir a qualquer outra instituiçäo." trophy_room.pop_percentage.awards[3] = "Brilhante! O seu hospital recebeu o maior número de pacientes que todos os outros hospitais juntos." trophy_room.pop_percentage.penalty[1] = "Teve muito poucos pacientes este ano. Para ganhar dinheiro, precisa que haja pacientes que paguem." trophy_room.pop_percentage.penalty[2] = "Todos os hospitais da área conseguiram mais pacientes do que você. Deveria estar envergonhado." trophy_room.rats_killed.trophies[1] = "Você recebeu o Troféu Raticida por eliminar %s ratos no seu hospital no ano passado." trophy_room.rats_killed.trophies[2] = "Você merece este prêmio da Federaçäo Anti Ratos, pela sua excepcional habilidade em eliminar ratos, demonstrada ao eliminar %s exemplares." trophy_room.rats_killed.trophies[3] = "Você recebeu o Troféu Acaba com Ratos pela sua grande habilidade em eliminar %d ratos no seu hospital no ano passado." trophy_room.all_cured.awards[1] = "Parabéns por ter ganho o Prêmio Marie Curie por curar a todos os pacientes do seu hospital no ano passado." trophy_room.all_cured.trophies[1] = "A Fundaçäo Curadores Nacionais premia-o por ter curado todos os pacientes do seu hospital no ano passado, concedendo-lhe o Prêmio do Maior Curador." trophy_room.all_cured.trophies[2] = "Você recebeu a Medalha do Paciente Säo por ter conseguido curar todos os pacientes do seu hospital no ano passado." graphs.cures = "Curas" graphs.reputation = "Reputaçäo" graphs.balance = "Balanço" graphs.wages = "Salários" graphs.visitors = "Visitantes" graphs.time_spans[1] = "1 Ano " graphs.time_spans[2] = "12 Anos" graphs.time_spans[3] = "48 Anos" graphs.deaths = "Mortes" graphs.money_out = "Pagamento" graphs.money_in = "Crédito" queue_window.max_queue_size = "Máximo" queue_window.num_expected = "Previsto" queue_window.num_in_queue = "Tamanho da fila" queue_window.num_entered = "Pacientes totais" room_classes.clinics = "Clínica" room_classes.facilities = "Instalaçöes" room_classes.diagnosis = "Diagnóstico" room_classes.treatment = "Tratamento" rooms_short.ward = "Enfermaria" rooms_short.blood_machine = "Transfusöes" rooms_short.fracture_clinic = "Traumatologia" rooms_short.cardiogram = "Cardiologia" rooms_short.decontamination = "Descontaminaçäo" rooms_short.jelly_vat = "Banho gelatinoso" rooms_short.staffroom = "Sala de Descanso" rooms_short.hair_restoration = "Pêloterapia" rooms_short.inflation = "Inflatoterapia" rooms_short.operating_theatre = "Sala de Operaçöes" rooms_short.reception = "Recepçäo" rooms_short.gps_office = "Consultório Geral" rooms_short.training_room = "Formaçäo" rooms_short.x_ray = "Raio-X" rooms_short.tongue_clinic = "Laringologia" rooms_short.general_diag = "Diagnóstico Geral" rooms_short.ultrascan = "Ultra Scanner" rooms_short.dna_fixer = "Genética" rooms_short.psychiatric = "Psiquiatria" rooms_short.toilets = "Banheiro" rooms_short.corridor_objects = "Objetos do corredor" rooms_short.pharmacy = "Farmácia" rooms_short.destroyed = "Destruída" rooms_short.research_room = "Centro de Pesquisa" rooms_short.scanner = "Scanner" rooms_short.electrolysis = "Eletrólise" tooltip.status.warmth = "Nível global de calor das pessoas no seu hospital" tooltip.status.close = "Fechar tela de condiçäo" tooltip.status.thirst = "Nível global de sede das pessoas no seu hospital" tooltip.status.population = "Você precisa ter %d%% da populaçäo total vindo para o seu hospital" tooltip.status.num_cured = "O objetivo é curar %d pessoas. Até agora curou %d" tooltip.status.percentage_killed = "O objetivo é matar pelo menos %d%% dos seus pacientes. Até agora morreram %d%%" tooltip.status.percentage_cured = "Você precisa tratar %d%% dos visitantes do seu hospital. Até agora tratou %d%%" tooltip.status.win_progress_own = "Mostra o progresso para conquistar os critérios do seu próprio hospital" tooltip.status.value = "O seu hospital deve valer $%d. Agora vale $%d" tooltip.status.happiness = "Nível global de satisfaçäo das pessoas no seu hospital" tooltip.status.win_progress_other = "Mostra o progresso para conquistar os critérios de %s" tooltip.status.population_chart = "Gráfico que mostra a proporçäo de pacientes de cada hospital da cidade" tooltip.objects.bench = "Banco: serve de assento aos pacientes para que esperem com mais conforto." tooltip.objects.pharmacy_cabinet = "Farmácia: onde se guardam os remédios" tooltip.objects.console = "15 CONSOLES DE SCANNER" tooltip.objects.atom_analyser = "Misturador químico: situado no Dept. de Desenvolvimento, esta máquina acelera todo o processo de pesquisa." tooltip.objects.fire_extinguisher = "Extintor: reduz o perigo do mau funcionamento das máquinas." tooltip.objects.scanner = "14 SCANNER" tooltip.objects.bin = "Cesto de papéis: os pacientes atiram aqui os seus desperdícios." tooltip.objects.swing_door1 = "52 PORTAS DUPLAS 1" tooltip.objects.pool_table = "Mesa de bilhar: ajuda os seus funcionários a relaxarem." tooltip.objects.screen = "16 TELAS" tooltip.objects.cabinet = "Armário: contém fichas dos pacientes, notas e documentos sobre pesquisa." tooltip.objects.sofa = "Sofá: Os empregados que descansam na sala de descanso sentaräo em um sofá, a menos que tenham uma maneira melhor de relaxar-se." tooltip.objects.projector = "37 PROJETORES" tooltip.objects.table2 = "12 MESAS" tooltip.objects.shower = "54 DUCHAS DESCONTAMINADORAS" tooltip.objects.comfortable_chair = "61 CADEIRA DE LEITURA" tooltip.objects.door = "Porta: as pessoas fecham e abrem um montäo de vezes." tooltip.objects.computer = "Computador: componente chave para a pesquisa" tooltip.objects.litter_bomb = "Bomba de lixo: sabota os hospitais dos oponentes" tooltip.objects.entrance_left = "58 PORTAS DIREITAS DE ENTRADA" tooltip.objects.dna_fixer = "23 REPARADORES DE DNA" tooltip.objects.bed = "Cama: as pessoas que estejam mesmo doentes deitam-se nela." tooltip.objects.lamp = "Abajur: ilumina e permite que o pessoal veja." tooltip.objects.bookcase = "Livraria: material de consulta para os médicos." tooltip.objects.desk = "Escritório: é fundamental para que o médico coloque o seu PC." tooltip.objects.toilet_sink = "Pia: os seus pacientes mais limpos lavam as suas mäos sujas aqui. Se näo houver suficientes pias, os pacientes ficam infelizes." tooltip.objects.gates_of_hell = "48 PORTAS DO INFERNO" tooltip.objects.swing_door2 = "53 PORTAS DUPLAS 2" tooltip.objects.cast_remover = "24 REMOVEDOR DE GESSO" tooltip.objects.plant = "Planta: alegra os pacientes e purifica o ar." tooltip.objects.blood_machine = "42 TRANSFUSIOMETROS" tooltip.objects.slicer = "26 CORTADORES" tooltip.objects.x_ray = "27 RAIOS-X" tooltip.objects.cardio = "13 ELETROCARDIOGRAMA" tooltip.objects.crash_trolley = "20 CARROS" tooltip.objects.bed2 = "näo se utiliza" tooltip.objects.electrolyser = "46 ELETROLISIS" tooltip.objects.video_game = "Videogame: deixe que os seus funcionários se divirtam com o Hi-Octane." tooltip.objects.skeleton = "Esqueleto: é utilizado para aprender e na Noite do Halloween." tooltip.objects.ultrascanner = "22 ULTRA SCANNER" tooltip.objects.op_sink1 = "33 PIAS 1 OP" tooltip.objects.hair_restorer = "25 PELO-RESTAURADORES" tooltip.objects.reception_desk = "Recepçäo: requer uma recepcionista para que envie os pacientes para o médico." tooltip.objects.radiation_shield = "28 TELAS ANTI-RADIACAO" tooltip.objects.couch = "18 POLTRONAS" tooltip.objects.inflator = "Inflador: cura a cabeça inflada." tooltip.objects.toilet = "Banheiro: a natureza uma hora chama..." tooltip.objects.lecture_chair = "Cadeira de leitura: os médicos que estäo estudando sentam-se aqui para tomar notas, aborrecer-se e rabiscar desnecessariamente. Quantas mais cadeiras colocar, mais compridas as aulas seräo." tooltip.objects.auto_autopsy = "Autópsia: uma grande ajuda para descobrir novas curas." tooltip.objects.chair = "Cadeira: os pacientes sentam-se sobre ela e falam das suas doenças." tooltip.objects.x_ray_viewer = "29 TELAS DE RAIOS-X" tooltip.objects.radiator = "Radiador: evita que o seu hospital fique frio." tooltip.objects.bed3 = "näo se utiliza" tooltip.objects.surgeon_screen = "35 TELAS DE CIRURGIAO" tooltip.objects.jelly_moulder = "47 BANHOS GELATINOSOS" tooltip.objects.drinks_machine = "Máquina de bebidas: impede que os pacientes tenham sede e contribui com ganhos." tooltip.objects.op_sink2 = "34 PIAS 2 OP" tooltip.objects.table1 = "Mesa: sobre ela coloca-se um montäo de revistas para que os pacientes esperem contentes." tooltip.objects.entrance_right = "59 PORTAS ESQUERDAS DE ENTRADA" tooltip.objects.operating_table = "30 MESAS DE OPERACOES" tooltip.objects.tv = "TV: assegura de que os seus funcionários näo percam os seus programas favoritos." tooltip.watch.hospital_opening = "Cronômetro de construçäo: é o tempo que resta para que o seu hospital seja declarado aberto. Se apertar o botäo IR abrirá o hospital imediatamente." tooltip.watch.epidemic = "Epidemia: tempo que resta para encobrir a epidemia. Quando este tempo expire ou um paciente contagioso abandone o seu hospital, um Inspetor de Saúde vem visitar. O botäo liga ou desliga o modo vacina. Aperte em um paciente para que uma Enfermeira o vacine." tooltip.watch.emergency = "Emergência: tempo que resta para curar todos os pacientes nas emergências." tooltip.buy_objects_window.increase = "Comprar mais um objeto" tooltip.buy_objects_window.price = "Preço do objeto" tooltip.buy_objects_window.confirm = "Comprar objeto(s)" tooltip.buy_objects_window.cancel = "Cancelar" tooltip.buy_objects_window.decrease = "Comprar menos um objeto" tooltip.buy_objects_window.total_value = "Custo total dos objetos solicitados" tooltip.machine_window.status = "Estado das máquinas." tooltip.machine_window.close = "Cancelar caixa de diálogo" tooltip.machine_window.repair = "Mandar o faz-tudo reparar as máquinas." tooltip.machine_window.name = "Nome" tooltip.machine_window.times_used = "Número de vezes que reparou as máquinas." tooltip.machine_window.replace = "Substituir máquinas" tooltip.pay_rise_window.accept = "Satisfazer a sua demanda salarial" tooltip.pay_rise_window.decline = "Näo pagar; despedi-los" tooltip.staff_window.psychiatrist = "Psiquiatra" tooltip.staff_window.close = "Cancelar caixa de diálogo" tooltip.staff_window.sack = "Despedir" tooltip.staff_window.name = "Nome do empregado" tooltip.staff_window.pick_up = "Selecionar" tooltip.staff_window.tiredness = "Nível de cansaço" tooltip.staff_window.ability = "Nível de qualificaçäo" tooltip.staff_window.researcher = "Pesquisador" tooltip.staff_window.skills = "Qualificaçöes especiais" tooltip.staff_window.salary = "Salário mensal" tooltip.staff_window.happiness = "Nível de satisfaçäo" tooltip.staff_window.doctor_seniority = "Categoria - Residente, Médico ou Consultor" tooltip.staff_window.surgeon = "Cirurgiäo" tooltip.research.cure_dec = "Reduzir a porcentagem dos equipamentos de curas" tooltip.research.close = "Fechar tela de pesquisa" tooltip.research.diagnosis_inc = "Aumentar a porcentagem dos equipamentos de diagnóstico" tooltip.research.cure_inc = "Aumentar a porcentagem dos equipamentos de curas" tooltip.research.specialisation_inc = "Aumentar a porcentagem em pesquisa especial" tooltip.research.diagnosis_dec = "Reduzir a porcentagem dos equipamentos de diagnóstico" tooltip.research.improvements_inc = "Aumentar a porcentagem nas melhorias" tooltip.research.drugs_dec = "Reduzir a porcentagem da pesquisa farmacêutica" tooltip.research.specialisation_dec = "Reduzir a porcentagem em pesquisa especial" tooltip.research.improvements_dec = "Reduzir a porcentagem nas melhorias" tooltip.research.drugs_inc = "Aumentar a porcentagem da pesquisa farmacêutica" tooltip.research.allocated_amount = "Quantidade do orçamento alocado" tooltip.statement.close = "Fechar tela do estado das contas" tooltip.rooms.ward = "As enfermarias säo úteis tanto para diagnosticar como para tratamento. Envie aqui os pacientes para observaçäo e para recuperar de uma operaçäo sob o cuidado de uma enfermeira." tooltip.rooms.blood_machine = "O médico usa o Transfusiômetro para diagnosticar os pacientes" tooltip.rooms.fracture_clinic = "A enfermeira utiliza a consulta de traumatologia para arrumar fraturas" tooltip.rooms.cardiogram = "O médico usa a cardiologia para diagnosticar os pacientes" tooltip.rooms.decontamination = "O médico usa a ducha descontaminadora para curar a radioatividade" tooltip.rooms.jelly_vat = "O médico usa o Banho Gelatinoso para curar a gelatinitis" tooltip.rooms.staffroom = "Os médicos e as enfermeiras descansam na Sala de Descanso" tooltip.rooms.hair_restoration = "O médico usa o Pêlo-restaurador para curar a calvície" tooltip.rooms.inflation = "O médico usa a Inflatoterapia para curar a cabeça inflada" tooltip.rooms.gps_office = "Os pacientes recebem sua primeira consulta na sala de Consultório Geral" tooltip.rooms.training_room = "A sala de formaçäo com um consultor serve para formar outros médicos" tooltip.rooms.x_ray = "O médico usa Raio-X para diagnosticar os pacientes" tooltip.rooms.general_diag = "O médico utiliza a sala de Diagnóstico Geral para fazer um diagnóstico básico. É barato e frequentemente eficaz" tooltip.rooms.operating_theatre = "Na sala de operaçöes faltam dois cirurgiöes qualificados" tooltip.rooms.ultrascan = "O médico usa o Ultra-scanner para diagnosticar os pacientes" tooltip.rooms.psychiatry = "A consulta de psiquiatria cura os pacientes loucos e ajuda a diagnosticar outros pacientes, mas requer um médico qualificado em psiquiatria." tooltip.rooms.toilets = "Construa banheiros para impedir que os pacientes armem uma confusäo no seu hospital!" tooltip.rooms.dna_fixer = "O médico usa o Reparador de DNA para curar os pacientes com DNA alienígena" tooltip.rooms.pharmacy = "Na enfermaria, a enfermeira administra remédios para curar os pacientes" tooltip.rooms.tongue_clinic = "O médico usa a Laringologia para curar a língua comprida" tooltip.rooms.research_room = "Os médicos pesquisadores investigam remédios e máquinas novas no Centro de Pesquisa" tooltip.rooms.scanner = "O médico usa o Scanner para diagnosticar os pacientes" tooltip.rooms.electrolysis = "O médico usa a consulta de eletrólise para curar o peludismo" tooltip.policy.diag_procedure = "Se o diagnóstico de um médico é menos seguro que a porcentagem de ENVIAR PARA CASA, o paciente será enviado para casa. Se o diagnóstico for melhor que a porcentagem de TENTAR CURA, será administrado o tratamento adequado ao paciente" tooltip.policy.staff_leave = "Aperte aqui para que os funcionários livres ajudem os companheiros que precisem" tooltip.policy.close = "Fechar tela de normas" tooltip.policy.staff_rest = "Nível de cansaço dos funcionários antes de poderem descansar" tooltip.policy.diag_termination = "O diagnóstico de um paciente continuará até que os médicos estejam seguros da porcentagem de PARAR PROCESSO, ou até que sejam utilizados todos os diagnósticos" tooltip.policy.staff_stay = "Aperte aqui para assegurar que o funcionário fique nas consultas que foram atribuídas a ele" tooltip.main_menu.load_menu.empty_slot = "VAZIO" tooltip.main_menu.load_menu.load_slot = "JOGO" tooltip.main_menu.network = "Iniciar um jogo em rede" tooltip.staff_list.psychiatrist = "Psiquiatra qualificado" tooltip.staff_list.close = "Fechar gerenciamento de funcionários" tooltip.staff_list.happiness_2 = "Moral do empregado" tooltip.staff_list.ability = "Mostra o nível de habilidade destes empregados" tooltip.staff_list.tiredness_2 = "Cansaço do empregado" tooltip.staff_list.ability_2 = "Nível de habilidade do empregado" tooltip.staff_list.salary = "Salário atual pago a esta pessoa" tooltip.staff_list.researcher_train = "Formado um %d%% para ser Pesquisador" tooltip.staff_list.happiness = "Mostra o quanto contentes estäo estes empregados" tooltip.staff_list.sack = "Despedir esta pessoa" tooltip.staff_list.surgeon = "Cirurgiäo qualificado" tooltip.staff_list.view_staff = "Ver a pessoa trabalhando" tooltip.staff_list.surgeon_train = "Formado um %d%% para ser Cirurgiäo" tooltip.staff_list.tiredness = "Mostra o quanto cansados estäo estes empregados" tooltip.staff_list.receptionists = "Ver a lista das recepcionistas contratadas neste hospital" tooltip.staff_list.pay_rise = "Subir o salário desta pessoa em 10%" tooltip.staff_list.bonus = "Pagar a esta pessoa um bônus de 10%" tooltip.staff_list.doctor_seniority = "Experiência do médico" tooltip.staff_list.nurses = "Ver a lista das enfermeiras contratadas neste hospital" tooltip.staff_list.skills = "Outras qualificaçöes" tooltip.staff_list.detail = "Cuidar os detalhes" tooltip.staff_list.doctors = "Ver a lista dos médicos contratados neste hospital" tooltip.staff_list.handymen = "Ver a lista dos faz-tudo contratados neste hospital" tooltip.staff_list.researcher = "Pesquisador qualificado" tooltip.staff_list.psychiatrist_train = "Formado um %d%% para ser Psiquiatra" tooltip.place_objects_window.confirm = "Confirmar" tooltip.place_objects_window.buy_sell = "Comprar/vender objetos" tooltip.place_objects_window.pick_up = "Pegar objeto" tooltip.place_objects_window.cancel = "Cancelar" tooltip.casebook.increase = "Aumentar quantidade" tooltip.casebook.reputation = "Reputaçäo de curas ou diagnósticos" tooltip.casebook.close = "Fechar ficha clínica" tooltip.casebook.earned_money = "Ganhos até a data" tooltip.casebook.decrease = "Reduzir quantidade" tooltip.casebook.up = "Subir" tooltip.casebook.research = "Clique aqui para utilizar o orçamento de Pesquisa Especializada para este tratamento" tooltip.casebook.down = "Baixar" tooltip.casebook.sent_home = "Número de pacientes dados alta" tooltip.casebook.cured = "Número de restabelecimentos" tooltip.casebook.deaths = "Número de falecimentos" tooltip.casebook.treatment_charge = "Preço" tooltip.casebook.cure_type.psychiatrist = "Os psiquiatras realizam este tratamento" tooltip.casebook.cure_type.drug_percentage = "Este tratamento requer um remédio. O seu tem uma eficácia de %d%%" tooltip.casebook.cure_type.drug = "Este tratamento requer um remédio" tooltip.casebook.cure_type.machine = "É preciso de uma máquina para este tratamento" tooltip.casebook.cure_type.surgery = "Esta doença requer cirurgia" tooltip.casebook.cure_requirement.hire_staff_old = "Você precisa contratar um %s para este tratamento" tooltip.casebook.cure_requirement.not_possible = "Näo pode administrar este tratamento" tooltip.casebook.cure_requirement.hire_surgeon = "Você precisa contratar um segundo cirurgiäo para que realize operaçöes" tooltip.casebook.cure_requirement.build_ward = "Você precisa construir uma enfermaria para administrar este tratamento" tooltip.casebook.cure_requirement.possible = "Pode administrar este tratamento" tooltip.casebook.cure_requirement.build_room = "Você precisa construir uma consulta para dar este tratamento" tooltip.casebook.cure_requirement.hire_surgeons = "Você precisa contratar dois cirurgiöes para as operaçöes" tooltip.casebook.cure_requirement.research_machine = "Precisa inventar alguma máquina para este tratamento." tooltip.casebook.cure_requirement.ward_hire_nurse = "Você precisa de uma enfermeira que trabalhe na enfermaria para administrar este tratamento" tooltip.patient_window.center_view = "Enfocar a pessoa" tooltip.patient_window.warmth = "Quanto calor tem a pessoa" tooltip.patient_window.close = "Cancelar caixa de diálogo" tooltip.patient_window.send_home = "Dar alta à pessoa" tooltip.patient_window.thirst = "Quanta sede tem a pessoa" tooltip.patient_window.graph = "Clique para escolher entre o gráfico do estado de saúde da pessoa ou o seu histórico clínico" tooltip.patient_window.queue = "Ver detalhes da pessoa que faz fila" tooltip.patient_window.happiness = "Satisfaçäo da pessoa" tooltip.patient_window.casebook = "Ver detalhes da doença da pessoa" tooltip.patient_window.abort_diagnosis = "Colocar a pessoa em tratamento em vez de esperar que complete o diagnóstico" tooltip.town_map.fire_extinguishers = "Alternar extintores" tooltip.town_map.people = "Alternar pessoas" tooltip.town_map.balance = "Saldo" tooltip.town_map.objects = "Alternar objetos" tooltip.town_map.heat_inc = "Subir aquecimento" tooltip.town_map.heating_bill = "Recibo de aquecimento" tooltip.town_map.heat_level = "Nível de aquecimento" tooltip.town_map.radiators = "Alternar radiadores" tooltip.town_map.plants = "Alternar plantas" tooltip.town_map.heat_dec = "Baixar aquecimento" tooltip.town_map.close = "Fechar mapa da cidade" tooltip.graphs.cures = "Alternar curas" tooltip.graphs.reputation = "Alternar o valor do hospital" tooltip.graphs.close = "Fechar tela de gráficos" tooltip.graphs.balance = "Alternar saldo" tooltip.graphs.wages = "Alternar salários" tooltip.graphs.visitors = "Alternar visitantes" tooltip.graphs.money_in = "Alternar crédito" tooltip.graphs.deaths = "Alternar mortes" tooltip.graphs.scale = "Tabela de gráficos" tooltip.graphs.money_out = "Alternar gastos" tooltip.toolbar.policy = "Normas" tooltip.toolbar.status = "Condiçäo" tooltip.toolbar.research = "Pesquisa" tooltip.toolbar.hire = "Contratar funcionários" tooltip.toolbar.bank_button = "Aperte o botäo esquerdo para o diretor do banco e o direito para o saldo bancário" tooltip.toolbar.charts = "Gráficos" tooltip.toolbar.balance = "O seu saldo" tooltip.toolbar.edit = "Editar salas e objetos" tooltip.toolbar.date = "A data" tooltip.toolbar.rooms = "Construir salas" tooltip.toolbar.staff_list = "Gerenciamento de funcionários" tooltip.toolbar.town_map = "Mapa da cidade" tooltip.toolbar.casebook = "Ficha clínica" tooltip.toolbar.reputation = "A sua reputaçäo" tooltip.toolbar.objects = "Colocar objetos de corredor" tooltip.queue_window.patient_dropdown.reception = "Enviar paciente à Recepçäo" tooltip.queue_window.patient_dropdown.hospital_1 = "Enviar o paciente para outro hospital" tooltip.queue_window.patient_dropdown.send_home = "Dar alta ao paciente" tooltip.queue_window.patient_dropdown.hospital_3 = "Enviar o paciente para outro hospital" tooltip.queue_window.patient_dropdown.hospital_2 = "Enviar o paciente para outro hospital" tooltip.queue_window.close = "Fecha esta caixa de diálogo" tooltip.queue_window.num_expected = "Número de pacientes que a recepcionista calcula que logo faräo fila" tooltip.queue_window.front_of_queue = "Arraste um paciente para este ícone para colocá-lo no início da fila" tooltip.queue_window.dec_queue_size = "Reduzir o máximo do tamanho da fila" tooltip.queue_window.num_in_queue = "Número de pacientes em fila" tooltip.queue_window.num_entered = "Número de pacientes que foram tratados nesta consulta até agora" tooltip.queue_window.max_queue_size = "Tamanho máximo da fila que permite a recepcionista" tooltip.queue_window.inc_queue_size = "Aumentar o máximo do tamanho da fila" tooltip.queue_window.end_of_queue = "Arraste um paciente para este ícone para colocá-lo no final da fila" tooltip.queue_window.patient = "Arraste um paciente para colocá-lo na fila. Aperte o botäo direito sobre um paciente para mandá-lo para a fila ou para um hospital rival" tooltip.bank_manager.graph = "Gráfico dos pagamentos esperados de %s" tooltip.bank_manager.close = "Fechar tela do gerente do banco" tooltip.bank_manager.balance = "O seu saldo bancário" tooltip.bank_manager.borrow_5000 = "Pedir $5000 ao banco" tooltip.bank_manager.hospital_value = "Valor atual do seu hospital" tooltip.bank_manager.insurance_owed = "Quantidade de dinheiro que lhe deve %s" tooltip.bank_manager.interest_payment = "Pagamentos dos juros mensais" tooltip.bank_manager.repay_5000 = "Devolver $5000 ao banco" tooltip.bank_manager.graph_return = "Voltar para a tela anterior" tooltip.bank_manager.interest_rate = "Taxa de juro anual" tooltip.bank_manager.inflation_rate = "Taxa de inflaçäo anual" tooltip.bank_manager.show_graph = "Mostra o gráfico dos pagamentos esperados de %s" tooltip.bank_manager.current_loan = "Empréstimos pendentes" tooltip.jukebox.play = "Ligar máquina de discos" tooltip.jukebox.stop = "Parar máquina de discos" tooltip.jukebox.close = "Fechar máquina de discos" tooltip.jukebox.fast_forward = "Avançar rápido da máquina de discos" tooltip.jukebox.rewind = "Rebobinar máquina de discos" tooltip.jukebox.current_title = "Máquina de discos" tooltip.jukebox.loop = "Funcionamento contínuo da máquina de discos" tooltip.build_room_window.cost = "Preço da consulta selecionada" tooltip.build_room_window.room_classes.treatment = "Selecione consultas de clínica geral" tooltip.build_room_window.room_classes.facilities = "Selecione consultas especiais" tooltip.build_room_window.room_classes.diagnosis = "Selecione consultas de diagnóstico" tooltip.build_room_window.room_classes.clinic = "Selecione consultas de especialidade médica" tooltip.build_room_window.close = "Sair desta caixa de diálogo e voltar para o jogo" tooltip.hire_staff_window.surgeon = "Cirurgiäo" tooltip.hire_staff_window.psychiatrist = "Psiquiatra" tooltip.hire_staff_window.qualifications = "Outras habilidades do médico" tooltip.hire_staff_window.receptionists = "Ver as recepcionistas que pode contratar" tooltip.hire_staff_window.hire = "Contratar pessoa" tooltip.hire_staff_window.nurses = "Ver as enfermeiras que pode contratar" tooltip.hire_staff_window.doctor_seniority = "Experiência médica (Residente, Médico, Consultor)" tooltip.hire_staff_window.cancel = "Cancelar" tooltip.hire_staff_window.researcher = "Pesquisador" tooltip.hire_staff_window.prev_person = "Ver pessoa anterior" tooltip.hire_staff_window.salary = "Salário" tooltip.hire_staff_window.staff_ability = "Qualificaçäo dos funcionários" tooltip.hire_staff_window.doctors = "Ver os médicos que pode contratar" tooltip.hire_staff_window.next_person = "Ver pessoa seguinte" tooltip.hire_staff_window.handymen = "Ver os faz-tudo que pode contratar" tooltip.handyman_window.center_view = "Enfocar o faz-tudo" tooltip.handyman_window.close = "Cancelar caixa de diálogo" tooltip.handyman_window.sack = "Despedir" tooltip.handyman_window.name = "Nome do faz-tudo" tooltip.handyman_window.pick_up = "Apanhar" tooltip.handyman_window.prio_litter = "Aumentar a prioridade do faz-tudo para a limpeza" tooltip.handyman_window.ability = "Qualificaçäo" tooltip.handyman_window.prio_machines = "Aumentar a prioridade do faz-tudo para reparar as máquinas" tooltip.handyman_window.salary = "Salário" tooltip.handyman_window.face = "Face do faz-tudo" tooltip.handyman_window.happiness = "Satisfaçäo" tooltip.handyman_window.tiredness = "Cansaço" tooltip.handyman_window.prio_plants = "Aumentar a prioridade do faz-tudo para regar as plantas" tooltip.window_general.cancel = "Cancelar" tooltip.window_general.confirm = "Confirmar" adviser.earthquake.ended = "Nossa! Acreditei que ia ser o pior de todos! Alcançou um %d na Escala Richter." adviser.earthquake.damage = "Por causa do terremoto há %d máquinas danificadas e %d pessoas feridas no hospital." adviser.earthquake.alert = "Perigo de terremoto! As suas máquinas podem danificar-se durante o terremoto se näo tiverem uma boa manutençäo." adviser.staff_place_advice.only_psychiatrists = "Os Médicos só podem trabalhar em uma sala de psiquiatria se estiverem qualificados para isso." adviser.staff_place_advice.doctors_cannot_work_in_room = "Os Médicos näo podem trabalhar em %s" adviser.staff_place_advice.only_researchers = "Os Médicos só podem trabalhar em um Centro de Pesquisa se estiverem qualificados para isso." adviser.staff_place_advice.nurses_cannot_work_in_room = "As Enfermeiras näo podem trabalhar em %s" adviser.staff_place_advice.only_surgeons = "Os Médicos só podem trabalhar em uma sala de operaçöes se estiverem qualificados para isso." adviser.staff_place_advice.receptionists_only_at_desk = "As Recepcionistas só podem trabalhar na Recepçäo." adviser.staff_place_advice.only_doctors_in_room = "Apenas Médicos podem trabalhar em %s" adviser.staff_place_advice.only_nurses_in_room = "Só Enfermeiras podem trabalhar na %s" adviser.competitors.staff_poached = "Um dos seus funcionários recebeu uma boa oferta de trabalho de um outro hospital." adviser.competitors.land_purchased = "%s acaba de comprar terrenos." adviser.competitors.hospital_opened = "%s, da concorrência, abriu um hospital na área." adviser.epidemic.hurry_up = "Se näo acabar em seguida com esta epidemia, terá muitos problemas. Despacha-se!" adviser.epidemic.multiple_epidemies = "Parece que tem mais de uma epidemia de uma vez. Isto poderia ser desastroso, sendo assim faz algo rapidamente." adviser.epidemic.serious_warning = "Esta doença contagiosa começa a ser grave. Tem que fazer algo brevemente!" adviser.warnings.patients_unhappy = "Os pacientes näo gostam do seu hospital. Deveria fazer algo para melhorá-lo." adviser.warnings.too_much_litter = "Há um problema de limpeza. Mais faz-tudo é a soluçäo." adviser.warnings.patients_very_thirsty = "Os pacientes têm muita sede. Se näo colocar logo algumas máquinas de bebidas, as pessoas iräo embora do seu hospital para tomar algum refresco." adviser.warnings.queue_too_long_at_reception = "Tem muitos pacientes à espera de reservas para as consultas na recepçäo. Coloque outra Recepçäo e contrate outra Recepcionista." adviser.warnings.patients_thirsty = "As pessoas começam a ter sede. Talvez deveria colocar máquinas de bebidas." adviser.warnings.nurses_tired = "As suas enfermeiras estäo cansadas. Mande-as descansar agora mesmo." adviser.warnings.patients_too_hot = "Os pacientes têm muito calor. Retire alguns radiadores, baixa a temperatura ou coloca mais máquinas de bebidas." adviser.warnings.patients_thirsty2 = "As pessoas queixam-se de que têm sede. Deveria colocar mais máquinas de bebidas ou colocar mais perto as que já há." adviser.warnings.machines_falling_apart = "Suas máquinas estäo caindo aos pedaços. Chame a manutençäo para que as reparem." adviser.warnings.financial_trouble3 = "O seu saldo tem um aspecto preocupante. Faça algo de efetivo. Está a %d do desastre." adviser.warnings.nurses_tired2 = "As suas enfermeiras estäo muito cansadas. Faça descansá-las agora mesmo." adviser.warnings.people_have_to_stand = "Há pacientes de pé. Faça-os sentar já!" adviser.warnings.handymen_tired = "Os seus faz-tudo estäo muito cansados. Mande-os descansar agora mesmo." adviser.warnings.change_priorities_to_plants = "Tem que alterar as prioridades dos seus faz-tudo para que empreguem mais tempo regando as suas plantas." adviser.warnings.staff_tired = "Os seus funcionários estäo incrivelmente cansados. Se näo os deixa descansar um momento em uma Sala de Descanso, alguns poderäo cair de esgotamento." adviser.warnings.some_litter = "Os faz-tudo podem recolher tudo este lixo antes de que se converta em um grave problema." adviser.warnings.cash_low_consider_loan = "As suas finanças andam mal. Já pensou em um empréstimo?" adviser.warnings.reduce_staff_rest_threshold = "Tente alterar o Tempo de Descanso dos funcionários no tela de Normas para que possam descansar mais frequentemente. É só uma sugestäo." adviser.warnings.build_staffroom = "Construa uma Sala de Descanso o mais rápido possível. Os seus funcionários trabalham muito e estäo à beira do colapso. Vamos, seja razoável!" adviser.warnings.many_epidemics = "Parece que tem mais de uma epidemia de uma vez. Isto poderia ser desastroso, sendo assim faz algo rapidamente." adviser.warnings.build_toilets = "Construa um banheiro agora mesmo ou verá algo muito desagradável. E pode imaginar como cheirará o seu hospital." adviser.warnings.staff_overworked = "Os seus empregados têm muito trabalho. Estäo perdendo eficácia e väo começar a cometer erros desastrosos." adviser.warnings.doctors_tired2 = "Os seus médicos estäo cansadíssimos. Precisam descansar imediatamente." adviser.warnings.queues_too_long = "Tem muitos pacientes fazendo fila." adviser.warnings.staff_unhappy = "Os seus funcionários estäo descontentes. Dê-lhes um pagamento extra ou, ainda melhor, construa uma Sala de Descanso para eles. Também poderia alterar o seu tempo de descanso na tela de Normas." adviser.warnings.patient_leaving = "Há um paciente que parte. A causa? A má direçäo e a péssima qualidade dos seus funcionários e seus equipamentos." adviser.warnings.patient_stuck = "Alguém ficou bloqueado. Planeje melhor seu hospital." adviser.warnings.receptionists_tired = "As suas recepcionistas estäo extenuadas. Mande-as descansar agora mesmo." adviser.warnings.charges_too_low = "Você cobra muito barato. Terá pacientes no seu hospital, mas näo lhe contribuiräo com muitos ganhos." adviser.warnings.epidemic_getting_serious = "Esta doença contagiosa começa a ser grave. Tem que fazer algo brevemente!" adviser.warnings.patients_really_thirsty = "Os pacientes têm muita sede. Coloque mais máquinas de bebidas ou aproxime as existentes às filas mais compridas." adviser.warnings.patients_annoyed = "As pessoas estäo enormemente desagradadas pelo modo com que dirige o seu hospital. E näo pode dizer que näo tenham culpa. Solucione o problema ou confronte as consequências!" adviser.warnings.place_plants3 = "Os pacientes estäo descontentes. Coloque mais plantas para animá-los." adviser.warnings.machinery_deteriorating = "As suas máquinas começam a se deteriorar por uso excessivo. Vigie-as." adviser.warnings.place_plants4 = "Alegre os pacientes colocando mais plantas." adviser.warnings.money_very_low_take_loan = "O seu saldo bancário é muito baixo. Poderia pedir um empréstimo." adviser.warnings.finanical_trouble2 = "Consiga algum crédito ou estará acabado. Perderá o nível se perder outros %d." adviser.warnings.patients_very_cold = "Os pacientes têm muito frio. Suba o aquecimento ou coloque mais radiadores no seu hospital." adviser.warnings.deal_with_epidemic_now = "Se näo acabar em seguida com esta epidemia, terá muitos problemas. Despacha-se!" adviser.warnings.litter_catastrophy = "O problema da falta de limpeza é grave. Coloque vários faz-tudo para trabalhar agora mesmo!" adviser.warnings.litter_everywhere = "Há sujeira por toda parte. Coloque mais faz-tudo para trabalhar." adviser.warnings.machinery_slightly_damaged = "A maquinaria do seu hospital está um pouco danificada. Näo se esqueça de as reparar." adviser.warnings.patients_getting_hot = "Os pacientes têm muito calor. Baixe o aquecimento ou retire alguns radiadores." adviser.warnings.no_patients_last_month = "No último mês, näo vieram novos pacientes ao seu hospital. Horrível!" adviser.warnings.many_killed = "Matou %d pacientes. Acho que tem que conseguir melhor, näo?" adviser.warnings.build_toilet_now = "Construa já uns banheiros. As pessoas näo aguentam mais. Näo se ria, é grave." adviser.warnings.people_freezing = "Que horrível! Nesta era de aquecimento central, alguns dos seus pacientes estäo se congelando. Coloque radiadores para que sejam aquecidos e suba o aquecimento." adviser.warnings.place_plants_to_keep_people = "As pessoas estäo indo embora. Se colocasse mais planta poderia convencê-los a ficar." adviser.warnings.patients_leaving = "Os pacientes partem. Melhora o seu hospital colocando plantas, bancos, máquinas de bebidas, etc., para os seus visitantes." adviser.warnings.doctors_tired = "Os seus médicos estäo esgotados. Mande-os descansar agora mesmo." adviser.warnings.charges_too_high = "Os seus preços säo muito altos. Terá grandes benefícios a curto prazo, mas à longo ficará sem pacientes." adviser.warnings.financial_trouble = "Tem sérios problemas financeiros. Arrume as suas finanças já! Se perder outros %d, terá arruinado este nível!" adviser.warnings.reception_bottleneck = "Há um gargalo na Recepçäo. Contrate outra Recepcionista." adviser.warnings.pay_back_loan = "Tem dinheiro de sobra. Por que você näo liquida o seu empréstimo?" adviser.warnings.nobody_cured_last_month = "No mês passado, näo houve nenhuma cura." adviser.warnings.queue_too_long_send_doctor = "As filas de %s säo muito longas. Certifique-se de que há um Médico na sala." adviser.warnings.staff_too_hot = "Os seus empregados têm muito calor. Baixe a temperatura ou retire alguns radiadores das suas consultas." adviser.warnings.place_plants2 = "Os pacientes estäo indo. Com mais planta poderia conseguir que ficassem mais tempo." adviser.warnings.doctor_crazy_overwork = "Oh, näo! Um dos seus médicos ficou louco pelo excesso de trabalho. Irá se recuperar se descansar agora mesmo." adviser.warnings.machinery_damaged = "Repare, o mais brevemente possível, as suas máquinas. Näo falta muito para que comecem a cair aos a pedaços." adviser.warnings.more_benches = "Poderia colocar mais bancos. Os doentes protestam por terem que estar de pé." adviser.warnings.bankruptcy_imminent = "Ei! Vai ficar sem máquinas. Tome cuidado!" adviser.warnings.need_toilets = "Os pacientes precisam de banheiros. Coloque-os em um lugar acessível." adviser.warnings.more_toilets = "Você precisa de mais banheiros. As pessoas näo aguentam mais." adviser.warnings.plants_dying = "As suas plantas estäo secando. Precisam de água. Consiga mais faz-tudo para que cuidem disso. Os pacientes näo gostam das plantas mortas." adviser.warnings.people_did_it_on_the_floor = "Alguns dos seus pacientes näo podem aguentar mais. Alguém vai ter que limpar sem descanso." adviser.warnings.need_staffroom = "Construa uma sala de descanso para que os seus empregados possam descansar." adviser.warnings.plants_thirsty = "Precisa cuidar das suas plantas. Estäo secando." adviser.warnings.too_many_plants = "Tem muitas plantas. Isto parece uma selva." adviser.warnings.receptionists_tired2 = "As suas recepcionistas estäo esgotadas. Deixa que descansem agora mesmo." adviser.warnings.machine_severely_damaged = "%s está prestes a se quebrar." adviser.warnings.machinery_very_damaged = "É uma emergência! Faça com que que um faz-tudo repare as sas máquinas em seguida. Estäo a ponto de explodir!" adviser.warnings.hospital_is_rubbish = "As pessoas estäo dizendo abertamente que seu hospital é lixo. Já sabe que logo iräo se queixar em outro lugar." adviser.warnings.handymen_tired2 = "Os seus faz-tudo estäo cansados. Mande-os descansar imediatamente." adviser.warnings.machinery_damaged2 = "Precisa contratar um faz-tudo para reparar as suas máquinas rapidamente." adviser.warnings.staff_very_cold = "O pessoal reclama do frio. Suba o aquecimento ou coloque mais radiadores." adviser.warnings.desperate_need_for_watering = "Necessita desesperadamente contratar um faz-tudo para que cuide das suas plantas." adviser.warnings.staff_unhappy2 = "Os seus funcionários, no geral, estäo descontentes. Logo, pediräo mais dinheiro." adviser.staff_advice.too_many_nurses = "Está contratando muitas enfermeiras." adviser.staff_advice.need_handyman_litter = "Os pacientes estäo sujando o seu hospital. Contrate uma faz-tudo para se encarregar da limpeza." adviser.staff_advice.need_nurses = "Contrate mais enfermeiras. Na enfermaria e na farmácia faltam enfermeiras." adviser.staff_advice.need_doctors = "Você precisa de mais médicos. Tente colocar os seus melhores médicos nas consultas com mais pacientes." adviser.staff_advice.too_many_doctors = "Tem muitos médicos. Alguns estäo desocupados neste momento." adviser.staff_advice.need_handyman_machines = "Terá que contratar um faz-tudo se quiser que as máquinas do seu hospital funcionem." adviser.staff_advice.need_handyman_plants = "Contrate um faz-tudo para regar as plantas." adviser.praise.few_have_to_stand = "Quase ninguém fica de pé no seu hospital. Os seus pacientes estäo contentes." adviser.praise.patients_cured = "%d pacientes curados." adviser.praise.plants_are_well = "Muito bem. Está cuidando bem das suas plantas. Estupendo." adviser.praise.plenty_of_benches = "Há muitos assentos, assim näo há problema." adviser.praise.plants_thriving = "Muito bem. As suas plantas estäo muito viçosas. Têm um aspecto maravilhoso. Mantenha-as assim e poderá ganhar um prêmio por isto." adviser.praise.many_benches = "Agora os seus pacientes têm suficientes assentos. Muito bem!" adviser.praise.many_plants = "Fantástico! Tem muitas plantas. Os seus pacientes agradeceräo isso." adviser.surgery_requirements.need_surgeons_ward_op = "Precisa contratar dois cirurgiöes e construir uma enfermaria e uma sala de operaçöes para realizar operaçöes." adviser.surgery_requirements.need_surgeon_ward = "Precisa contratar um outro cirurgiäo e construir uma enfermaria para poder realizar operaçöes." adviser.multiplayer.objective_completed = "Completou o objetivo. Felicidades!" adviser.multiplayer.objective_failed = "Näo conseguiu completar o objetivo." adviser.multiplayer.everyone_failed = "Todos falharam ao satisfazer aquele último objetivo." adviser.multiplayer.players_failed = "O(s) seguinte jogador(es) falharam ao alcançar o último objetivo: " adviser.multiplayer.poaching.not_interested = "Ha! Näo lhes interessa trabalhar para si. Estäo contentes onde estäo." adviser.multiplayer.poaching.already_poached_by_someone = "Nem pensar! Alguém trate de pescar essa pessoa!" adviser.multiplayer.poaching.in_progress = "Eu o informarei se esta pessoa deseja trabalhar pra você." adviser.research.new_drug_researched = "Um novo medicamento para curar %s foi descoberto." adviser.research.new_machine_researched = "Pesquisou com êxito %s." adviser.research.drug_fully_researched = "Pesquisou 100%% %s." adviser.research.drug_improved = "O seu Centro de Pesquisa melhorou o medicamento para %s." adviser.research.new_available = "Já pode utilizar um novo %s." adviser.research.machine_improved = "O Centro de Pesquisa trouxe melhorias para %s." adviser.research.autopsy_discovered_rep_loss = "Foi descoberta uma máquina de autópsias. Aguarde uma reaçäo desfavorável das pessoas." adviser.information.emergency = "Há uma emergência! Mexa-se! Mexa-se! Mexa-se!" adviser.information.handyman_adjust = "Pode conseguir que o faz-tudo limpe melhor se estabelecer as suas prioridades." adviser.information.promotion_to_specialist = "Um dos seus Médicos foi promovido para %s." adviser.information.pay_rise = "Um funcionário ameaça se demitir. Pode atender a sua petiçäo ou despedi-lo. Clique no último ícone da esquerda para ver quem deseja demitir." adviser.information.first_death = "Acabou de matar o seu primeiro paciente. Como se sente?" adviser.information.fax_received = "O ícone que acaba de aparecer no canto inferior esquerdo do tela alerta-lhe sobre uma informaçäo importante ou de que tem que tomar uma decisäo." adviser.information.promotion_to_consultant = "Um dos seus MEDICOS converteu-se em CONSULTOR." adviser.information.patient_abducted = "Os alienígenas raptaram um dos seus pacientes." adviser.information.vip_arrived = "Cuidado! %s acaba de chegar para visitar o seu hospital! Faça com que tudo funcione bem para lhe agradar." adviser.information.extra_items = "Os funcionários ficam mais confortáveis e melhoram o seu rendimento se colocar objetos complementares nas salas." adviser.information.epidemic_health_inspector = "O Ministério da Saúde soube de que tem uma epidemia. Prepare-se para receber brevemente a visita de um Inspetor de Saúde." adviser.information.first_cure = "Muito bem! Acaba de curar o seu primeiro paciente." adviser.information.epidemic = "Há uma doença contagiosa no seu hospital. Tem que solucioná-la em seguida!" adviser.information.patient_leaving_too_expensive = "Um paciente está indo embora sem pagar %s. É muito dinheiro." adviser.information.place_windows = "Se colocar janelas, as salas teräo mais luz e os seus empregados estaräo mais contentes." adviser.information.initial_general_advice.first_patients_thirsty = "No seu hospital as pessoas têm sede. Coloque máquinas de bebidas." adviser.information.initial_general_advice.epidemic_spreading = "Há uma doença contagiosa no seu hospital. Tente curar as pessoas infectadas antes que elas possam ir embora." adviser.information.initial_general_advice.research_now_available = "Construiu o seu primeiro centro de pesquisa. Agora pode acessar a tela de pesquisa." adviser.information.initial_general_advice.autopsy_available = "Foi inventada uma máquina de autópsias. Com ela, poderá se livrar dos pacientes problemáticos e investigar os seus restos. Tome cuidado, o uso desta máquina suscita muita polêmica." adviser.information.initial_general_advice.rats_have_arrived = "Os ratos invadiram o seu hospital. Tente eliminá-los com o mouse." adviser.information.initial_general_advice.surgeon_symbol = "Os médicos especializados em cirurgia levam o símbolo: {" adviser.information.initial_general_advice.machine_needs_repair = "Há uma máquina que precisa ser reparada. Encontre a máquina e aperte sobre ela. Em seguida, aperte no botäo do faz-tudo." adviser.information.initial_general_advice.research_symbol = "Os médicos pesquisadores levam o símbolo: }" adviser.information.initial_general_advice.decrease_heating = "As pessoas têm muito calor no seu hospital. Baixe o aquecimento. Isto é feito na tela de mapa da cidade." adviser.information.initial_general_advice.taking_your_staff = "Alguém está subornando a sua equipe. Terá que discutir com eles para que fiquem." adviser.information.initial_general_advice.first_VIP = "Vai receber o seu primeiro visitante VIP. Assegure-se de que o VIP näo veja nada sujo nem nenhum paciente descontente." adviser.information.initial_general_advice.increase_heating = "As pessoas têm frio. Ligue o aquecimento na tela de mapa da cidade." adviser.information.initial_general_advice.psychiatric_symbol = "Os médicos especializados em psiquiatria levam o símbolo: |" adviser.information.initial_general_advice.first_epidemic = "Há uma epidemia no seu hospital! Decida se quer tratá-la ou liberar ela." adviser.information.initial_general_advice.place_radiators = "As pessoas têm frio no seu hospital. Pode colocar mais radiadores selecionando-os no menu de mobiliário do corredor." adviser.information.initial_general_advice.first_emergency = "Os pacientes de emergência têm uma luz azul que pisca sobre a sua cabeça. Cure eles antes de que morram ou de que o tempo limite se esgote." adviser.information.promotion_to_doctor = "Um dos seus RESIDENTES converteu-se em um MEDICO." adviser.information.larger_rooms = "Se fizer salas espaçosas, os seus funcionários se sentiräo mais importantes e melhoraräo o seu rendimento." adviser.goals.win.value = "AUMENTE O VALOR DO SEU HOSPITAL EM %d" adviser.goals.win.reputation = "AUMENTE A SUA REPUTAÇAO EM %d PARA SATISFAZER O NIVEL DO CRITÉRIO PARA GANHAR" adviser.goals.win.cure = "Cure mais %d paciente(s) e terá curado os suficientes para ganhar este nível." adviser.goals.win.money = "Você precisa de outros %d para alcançar o critério financeiro deste nível." adviser.build_advice.door_not_reachable = "As pessoas näo poderäo passar por essa porta. Pense sobre isto." adviser.build_advice.blueprint_would_block = "Essa marca azul tapará outras consultas. Tente alterar o tamanho ou coloque em outro local!" adviser.build_advice.placing_object_blocks_door = "Se colocar este objeto aí, impedirá que se possa acessar alguma porta." adviser.build_advice.blueprint_invalid = "Esta marca azul näo é válida." adviser.level_progress.three_quarters_won = "Falta 75%% para superar este nível." adviser.level_progress.reputation_good_enough = "De acordo, a sua reputaçäo é muito boa para ganhar este nível, mantenha acima de %d e resolva outros problemas para terminar." adviser.level_progress.nearly_won = "Falta muito pouco para superar este nível." adviser.level_progress.hospital_value_enough = "Mantenha o valor do seu hospital acima de %d e atenda os seus outros problemas para ganhar o nível." adviser.level_progress.improve_reputation = "Você precisa melhorar a sua reputaçäo em %d para ter uma oportunidade de ganhar o nível." adviser.level_progress.halfway_won = "Falta 50%% para superar este nível." adviser.level_progress.close_to_win_increase_value = "Está próximo da vitória. Aumente o valor do seu hospital em $%d." adviser.level_progress.another_patient_cured = "Muito bem! Outro paciente curado. Isto faz um total de %d curados." adviser.level_progress.nearly_lost = "Falta muito pouco para perder este nível." adviser.level_progress.three_quarters_lost = "Falta 75%% para perder este nível." adviser.level_progress.dont_kill_more_patients = "Näo pode permitir deixar que morram mais pacientes!" adviser.level_progress.cured_enough_patients = "Curou muitos pacientes, mas precisa manter o seu hospital em melhor estado para ganhar o nível." adviser.level_progress.financial_criteria_met = "Tem satisfeito o critério financeiro deste nível. Agora mantenha o seu saldo acima de %d, enquanto assegura de que o hospital funcione eficazmente." adviser.level_progress.halfway_lost = "Falta 50%% para perder este nível." adviser.level_progress.another_patient_killed = "Oh, näo! Matou outro paciente. Agora há um total de %d mortes." adviser.vomit_wave.started = "Parece que tem um vírus de vômitos no seu hospital. Isto näo teria acontecido se o tivesse mantido limpo. Talvez devesse contratar um faz-tudo." adviser.vomit_wave.ended = "Ufa! Parece que o vírus que causou essa epidemia de vômitos está controlado. No futuro, mantenha o seu hospital limpo." adviser.placement_info.staff_cannot_place = "Näo pode colocar este funcionário aqui. Desculpe." adviser.placement_info.room_cannot_place_2 = "Näo pode colocar a consulta aqui." adviser.placement_info.object_cannot_place = "Eh! Näo pode colocar aqui este objeto." adviser.placement_info.object_can_place = "Pode colocar este objeto aqui." adviser.placement_info.door_can_place = "Se quiser, pode colocar a porta aqui." adviser.placement_info.reception_cannot_place = "Näo pode colocar a Recepçäo aqui." adviser.placement_info.door_cannot_place = "Desculpe, mas näo pode colocar aqui a porta." adviser.placement_info.window_cannot_place = "Ah! Näo pode colocar a janela aqui." adviser.placement_info.staff_can_place = "Pode colocar este funcionário aqui." adviser.placement_info.window_can_place = "Pode colocar a janela aqui. Está bem." adviser.placement_info.reception_can_place = "Näo pode colocar aqui a Recepçäo." adviser.placement_info.room_cannot_place = "Näo pode colocar aqui a consulta." adviser.boiler_issue.maximum_heat = "A caldeira do poräo ficou danificada. Os radiadores estäo no máximo. As pessoas väo derreter! Seria bom que colocasse mais máquinas de bebidas." adviser.boiler_issue.minimum_heat = "Ah, aí está! A caldeira do poräo ficou danificada. Parece que dentro de pouco tempo as pessoas väo congelar no seu hospital!" adviser.boiler_issue.resolved = "Boas notícias. A caldeira e os radiadores voltaram a funcionar corretamente. Os seus pacientes e os seus funcionários desfrutaräo de uma boa temperatura." adviser.tutorial.build_reception = "Você precisa de uma Recepçäo no seu hospital. Escolha uma do menu de mobiliário do corredor." adviser.tutorial.click_and_drag_to_build = "Aperte o botäo esquerdo e arraste para desenhar a sala." adviser.tutorial.window_in_invalid_position = "Esta janela está mal colocada. Tente colocá-la em outro lugar da parede." adviser.tutorial.room_in_invalid_position = "Esta marca azul näo é válida. As áreas vermelhas assinalam onde ocupou parte de outro quarto ou das paredes do hospital." adviser.tutorial.choose_receptionist = "Clique no ícone que pisca para contratar a recepcionista que escolheu." adviser.tutorial.place_doctor = "Coloque o médico na consulta." adviser.tutorial.build_gps_office = "É imprescindível um médico para diagnosticar os doentes." adviser.tutorial.select_doctors = "Clique no ícone que pisca para ver os médicos que pode contratar." adviser.tutorial.click_gps_office = "Clique na linha que pisca para escolher o Consultório Geral." adviser.tutorial.prev_receptionist = "Clique no ícone que pisca para ver a recepcionista disponível anterior." adviser.tutorial.information_window = "A funçäo de ajuda proporciona toda a informaçäo sobre a consulta que acaba de construir." adviser.tutorial.place_receptionist = "Mova a recepcionista e coloque-a no seu lugar." adviser.tutorial.confirm_room = "Clique no ícone que pisca para abrir a consulta ou cancelar para voltar para passo anterior." adviser.tutorial.doctor_in_invalid_position = "Näo pode colocar o médico aqui." adviser.tutorial.place_objects = "Aperte o botäo esquerdo para colocar os objetos, e o direito para fazê-los girar." adviser.tutorial.hire_receptionist = "Agora você precisa de uma recepcionista para atender os seus pacientes." adviser.tutorial.hire_doctor = "Você precisa de um médico para diagnosticar e atender os seus pacientes." adviser.tutorial.room_too_small_and_invalid = "A marca azul é muito pequena e está mal colocada." adviser.tutorial.receptionist_invalid_position = "Näo pode colocar a sua recepcionista aqui." adviser.tutorial.door_in_invalid_position = "Tentou colocar a porta em um lugar incorreto. Tente em outro lugar da grade azul." adviser.tutorial.next_receptionist = "Clique no ícone que pisca para ver a seguinte recepcionista disponível." adviser.tutorial.object_in_invalid_position = "Este objeto está mal colocado. Por favor, coloque em outro lugar ou tente girar." adviser.tutorial.choose_doctor = "Veja as habilidades de cada médico antes de escolher um." adviser.tutorial.rotate_and_place_reception = "Coloque a Recepçäo e aperte o botäo direito do mouse para girá-la." adviser.tutorial.accept_purchase = "Clique com o botäo esquerdo no ícone que pisca para colocá-lo." adviser.tutorial.room_too_small = "A marca azul desta sala é muito pequena. Arraste-a ou aumente o seu tamanho." adviser.tutorial.room_big_enough = "A marca azul é agora suficientemente grande. Se quiser, pode movê-la ou colocá-la." adviser.tutorial.start_tutorial = "Leia as instruçöes. Quando terminar, aperte o botäo esquerdo do mouse para começar o tutorial." adviser.tutorial.place_door = "Mova o mouse ao redor das paredes marcadas de azul para colocar a porta." adviser.tutorial.select_receptionists = "Clique no ícone que pisca para ver as recepcionistas que estäo disponíveis." adviser.tutorial.order_one_reception = "Clique na linha que pisca com o botäo esquerdo do mouse para comprar uma Recepçäo." adviser.tutorial.place_windows = "Coloque as janelas da mesma forma que a porta. Se näo quiser janelas, näo tem que as colocar." adviser.tutorial.select_diagnosis_rooms = "Clique com o botäo esquerdo no ícone que pisca para ver a lista de salas de diagnóstico." adviser.tutorial.reception_invalid_position = "A Recepçäo ficou cinzenta porque näo é possível colocar a¡. Mover ou girá-la." adviser.tutorial.build_pharmacy = "Parabéns! Agora, construa uma farmácia e contrate uma enfermeira para fazer o seu hospital funcionar." adviser.room_requirements.pharmacy_need_nurse = "Contrate uma enfermeira para a Farmácia." adviser.room_requirements.op_need_two_surgeons = "Contrate dois cirurgiöes para que operem na sala de operaçöes." adviser.room_requirements.training_room_need_consultant = "Terá que contratar um especialista para que de conferências nesta sala de formaçäo." adviser.room_requirements.research_room_need_researcher = "Terá que contratar um médico pesquisador para que utilize o centro de pesquisa." adviser.room_requirements.op_need_ward = "Precisa construir uma enfermaria para os pacientes que väo ser operados." adviser.room_requirements.reception_need_receptionist = "Precisa contratar uma recepcionista para atender os seus pacientes." adviser.room_requirements.op_need_another_surgeon = "Precisa contratar um outro cirurgiäo para poder usar o sala de operaçöes." adviser.room_requirements.gps_office_need_doctor = "Contrate um médico para atender no consultório." adviser.room_requirements.ward_need_nurse = "Contrate uma enfermeira para que trabalhe na enfermaria." adviser.room_requirements.psychiatry_need_psychiatrist = "Agora que construiu uma sala de psiquiatria, precisará de um psiquiatra." introduction_texts.level15 = "Bem, estes säo os mecanismos básicos para pôr em funcionamento um hospital.//Os seus Médicos väo precisar de toda a ajuda que possam obter para diagnosticar alguns dos pacientes. Pode ajudá-los construindo outros equipamentos de diagnóstico como a sala de Diagnóstico Geral." introduction_texts.level6 = "Utilize toda a sua capacidade para conseguir um hospital que funcione bem e consiga curar muitos pacientes e que possa tratar qualquer caso que pressentem os doentes.//Está avisado de que o ambiente, aqui, é especialmente propenso a germes e infecçöes. A menos que mantenha uma escrupulosa limpeza na sua instituiçäo, terá que fazer frente a uma série de epidemias entre os pacientes. Procure obter um lucro de $20.000 e fazer o valor do seu hospital superar os $140.000. " introduction_texts.level3 = "Desta vez colocará o seu hospital em uma área rica.//O Ministério da Saúde espera que consiga curar muitos pacientes. Terá que ganhar uma boa reputaçäo para começar, mas uma vez que o hospital comece a funcionar, concentre-se em ganhar todo o dinheiro que puder. Também pode haver emergências. Produzem-se quando chega muita gente que sofre da mesma doença. Se os curar dentro de um prazo determinado, conseguirá aumentar a sua reputaçäo e ganhar um grande extra. Haverá doenças, como o complexo de rei, e deverá ter orçamento para construir uma sala de operaçöes e junto a ela, uma enfermaria. Tem que ganhar $20.000 para superar este nível." introduction_texts.level12 = "Agora enfrentará o maior dos desafios. Impressionado com os seus lucros, o Ministério tem uma grande tarefa para você; querem que construa outro magnífico hospital, que tenha um excelente lucro e uma reputaçäo incrível. Também querem que compre todo o terreno que puder, cure tudo (e queremos dizer todas as doenças) e ganhe todos os prêmios. Acha que conseguirá? Ganhe $650.000, cure 750 pessoas e consiga uma reputaçäo de 800 para ganhar este nível. " introduction_texts.level9 = "Depois de depositar o dinheiro na conta bancária do Ministério e pagar uma nova limousine para o Ministro, agora pode dedicar a criar um bom hospital para cuidar dos doentes e necessitados. Aqui terá um montäo de problemas diferentes. Se os seus funcionários tiverem uma boa formaçäo e suficientes consultas, poderäo resolver qualquer situaçäo. O seu hospital terá que valer $200.000 e precisará ter $400.000 no banco. Se näo o conseguir näo poderá terminar o nível." introduction_texts.level11 = "Tem a oportunidade de construir o hospital definitivo. Esta é uma área de enorme prestígio e o Ministério quer que este seja o melhor hospital. Esperamos que ganhe muito dinheiro, alcance uma excelente reputaçäo e que se encarregue de todos os casos que sejam apresentados. Este é um trabalho importante. Terá que ser muito hábil para completá-lo. Também deve ter em conta que foram vistos OVNIs na área. Assegure-se de que os seus funcionários estejam preparados para receber algumas visitas inesperadas. O seu hospital terá que alcançar um valor de $240.000, precisará ter $500.000 no banco e uma reputaçäo de 700." introduction_texts.level14 = "Ainda tem mais um desafio: um hospital surpresa totalmente imprevisível. Se conseguir ter êxito, será o vencedor dos vencedores. E näo espere que seja fácil, porque é a tarefa mais difícil que confrontará. Boa sorte!" introduction_texts.level10 = "Além de dever curar todas as doenças que possa haver, o Ministério pede que empregue um pouco de tempo em aumentar a eficácia dos seus remédios.//Houve algumas queixas por parte do D. Salutíssimo, o Cachorro Guardiäo da Saúde, assim deve procurar com que todos os seus remédios sejam extremamente eficazes para ficar bem. Também, assegure-se de que o seu hospital tenha uma reputaçäo irrepreensível. Procure deixar morrer poucos pacientes. Como sugestäo, deveria deixar espaço para um banho gelatinoso. Para ganhar, os seus remédios deveräo ter uma eficácia de, pelo menos, 80%, tem que conseguir uma reputaçäo de 650 e guardar $500.000 no banco." introduction_texts.level5 = "Este será um hospital concorrido, que tratará casos muito variados.//Os seus médicos acabam de sair da faculdade, por isso é fundamental que construa uma sala de formaçäo para que alcancem o nível de formaçäo necessário. Só tem três especialistas para ensinar os seus funcionários inexperientes, entäo faça com que estejam contentes. Tem que ter em conta que o hospital está localizado em cima da falha geológica de San Android. Sempre há risco de terremoto. Os terremotos provocaräo danos importantes nas suas máquinas e alteraräo o bom funcionamento do seu hospital. Aumente a sua reputaçäo até 400 e consiga ganhos de $50.000 para triunfar. Também, cure 200 pacientes. " introduction_texts.level1 = "Bem-vindo ao seu primeiro hospital!//Para fazê-lo funcionar, coloque uma Recepçäo, construa um Consultório e contrate uma recepcionista e um médico. Em seguida, espere que cheguem os pacientes. Seria uma boa ideia construir uma consulta de psiquiatria e contratar um psiquiatra. Uma farmácia e uma enfermeira säo fundamentais para curar os seus pacientes. Cuidado com os casos malignos de cabeça inflada; eles säo solucionados na sala de inflatoterapia. Terá que curar 10 pessoas e assegurar de que a sua reputaçäo näo seja inferior a 200." introduction_texts.level17 = "Um último aviso. Fique de olho na sua Reputaçäo, é o que atrairá pacientes ao seu estabelecimento. Se näo matar muitas pessoas e os mantiver razoavelmente felizes näo deverá ter muitos problemas com este nível!//Agora é com você, boa sorte." introduction_texts.level7 = "Aqui, estará sob a estrita vigilância do Ministério da Saúde, entäo faça com que suas contas reflitam excelentes lucros e aumente a sua reputaçäo.//Näo podemos permitir que haja mortes desnecessárias; Näo beneficiam nada o negócio. Certifique-se de que os seus funcionários estejam em plena forma e de ter todos os equipamentos necessários. Obtenha uma reputaçäo de 600, e um saldo bancário de $200.000." introduction_texts.level4 = "Faça com que todos os seus pacientes estejam contentes, trate-os com a maior eficácia e tente deixar que morram o menos possíveis.//A sua reputaçäo está em jogo, entäo procure aumentá-la o máximo que puder. Näo se preocupe muito com o dinheiro; Irá ganhando à medida que cresce a sua reputaçäo. Também poderá formar os seus médicos para ampliar os seus conhecimentos. Eles poderäo curar os pacientes mais difíceis. Alcance uma reputaçäo acima de 500." introduction_texts.level18 = "" introduction_texts.level16 = "Uma vez que tenha diagnosticado algum dos pacientes, precisará construir salas de tratamento e clínicas para curá-los. Pode começar com uma Farmácia, onde precisará de uma Enfermeira que distribua os remédios." introduction_texts.level13 = "A sua incrível habilidade como diretor do hospital atraiu a atençäo da Divisäo Secreta Especial do Serviço Secreto Especial. Tenho um trabalho especial para você. Há um hospital infestado de ratos que precisa de um exterminador eficiente. Você deve matar todos os ratos que puder antes de que o pessoal de Manutençäo limpe toda a sujeira. Acha que é apto para esta missäo?" introduction_texts.level8 = "Só depende de você construir o hospital mais rentável e eficiente possível.//As pessoas por aqui, säo bastante ricas, entäo tente arrecadar o máximo possível. Lembre-se que curar as pessoas é uma coisa muito bonita, mas o que PRECISAMOS de verdade é do dinheiro delas. Arranque todo o dinheiro destes doentes. Acumule a enorme quantia de $300.000 para completar este nível. " humanoid_name_starts[1] = "GOLD" humanoid_name_starts[2] = "HIGH" humanoid_name_starts[3] = "AND" humanoid_name_starts[4] = "BEN" humanoid_name_starts[5] = "BAN" humanoid_name_starts[6] = "BILL" humanoid_name_starts[7] = "WY" humanoid_name_starts[8] = "WAT" humanoid_name_starts[9] = "POD" humanoid_name_starts[10] = "KING" humanoid_name_starts[11] = "BAR" humanoid_name_starts[12] = "PET" humanoid_name_starts[13] = "MAN" humanoid_name_starts[14] = "BOY" humanoid_name_starts[15] = "WAR" humanoid_name_starts[16] = "JACK" humanoid_name_starts[17] = "CRAB" humanoid_name_starts[18] = "FISH" humanoid_name_starts[19] = "WATER" humanoid_name_starts[20] = "MIL" humanoid_name_starts[21] = "BY" humanoid_name_starts[22] = "FEN" humanoid_name_starts[23] = "RICH" humanoid_name_starts[24] = "SCOT" humanoid_name_starts[25] = "BUR" humanoid_name_starts[26] = "PIKE" humanoid_name_starts[27] = "CUR" humanoid_name_starts[28] = "WHIT" humanoid_name_starts[29] = "BINN" humanoid_name_starts[30] = "BONN" humanoid_name_starts[31] = "POG" humanoid_name_starts[32] = "WRIGHT" humanoid_name_starts[33] = "KER" policy.diag_procedure = "Procedimento de diagnóstico" policy.header = "NORMAS DO HOSPITAL" policy.staff_leave_rooms = "Abandonar as consultas" policy.staff_rest = "Enviar os funcionários para descansar" policy.diag_termination = "Conclusäo do diagnóstico" policy.sliders.send_home = "ENVIA PARA CASA" policy.sliders.guess = "TENTAR CURA" policy.sliders.stop = "PARAR PROCESSO" policy.sliders.staff_room = "IR DESCANSAR" menu_display.mcga_lo_res = " BAIXA RESOLUÇAO MCGA " menu_display.shadows = " SOMBRAS " menu_display.high_res = " ALTA RESOLUÇAO " staff_title.surgeon = "Cirurgiäo" staff_title.psychiatrist = "Psiquiatra" staff_title.general = "Geral" staff_title.junior = "Residente" staff_title.researcher = "Pesquisador" staff_title.consultant = "Consultor" staff_title.nurse = "Enfermeira" staff_title.doctor = "Médico" staff_title.receptionist = "Recepcionista" bank_manager.insurance_owed = "Dívida do seguro" bank_manager.interest_rate = "Juros" bank_manager.interest_payment = "Pagamento de juros" bank_manager.statistics_page.date = "Data" bank_manager.statistics_page.money_out = "Débito" bank_manager.statistics_page.money_in = "Crédito" bank_manager.statistics_page.balance = "Saldo" bank_manager.statistics_page.current_balance = "Saldo atual" bank_manager.statistics_page.details = "Detalhes" bank_manager.balance = "Saldo" bank_manager.inflation_rate = "Inflaçäo" bank_manager.hospital_value = "Valor do hospital" bank_manager.current_loan = "Empréstimo pendente" menu_file_save[1] = " JOGO 1 " menu_file_save[2] = " JOGO 2 " menu_file_save[3] = " JOGO 3 " menu_file_save[4] = " JOGO 4 " menu_file_save[5] = " JOGO 5 " menu_file_save[6] = " JOGO 6 " menu_file_save[7] = " JOGO 7 " menu_file_save[8] = " JOGO 8 " insurance_companies[1] = "Seguros Estrelinha" insurance_companies[2] = "Seguros Nacional" insurance_companies[3] = "Mútua Seguril" insurance_companies[4] = "Seguros Ponderoso" insurance_companies[5] = "Geral Seguro" insurance_companies[6] = "Seguro Fiel" insurance_companies[7] = "Holding de Seguros" insurance_companies[8] = "Seguros Leon" insurance_companies[9] = "Joäo e Maria Ltda." insurance_companies[10] = "Seguro Feliz" insurance_companies[11] = "Seguros Sindicato" insurance_companies.out_of_business = "FECHADO" room_descriptions.ward[1] = "Enfermaria//" room_descriptions.ward[2] = "Os pacientes ficam aqui para serem atendidos por uma enfermeira enquanto säo diagnosticados. Permanecem aqui antes de serem operados.//" room_descriptions.ward[3] = "A enfermaria requer uma enfermeira. " room_descriptions.blood_machine[1] = "Sala de Transfusöes//" room_descriptions.blood_machine[2] = "O transfusiômetro é um elemento do equipamento de diagnóstico que revisa as células do sangue do paciente para descobrir do que sofrem.//" room_descriptions.blood_machine[3] = "A sala de transfusöes requer um médico. Também precisa de manutençäo. " room_descriptions.fracture_clinic[1] = "Traumatologia//" room_descriptions.fracture_clinic[2] = "Os pacientes que têm a desgraça de ter fraturas vêm aqui. O removedor de gesso usa poderosos lasers industriais para cortar os gessos mais duros, causando ao paciente só uma pequena dor.//" room_descriptions.fracture_clinic[3] = "A sala de traumatologia requer uma enfermeira. Também precisa de uma manutençäo muito frequente. " room_descriptions.cardiogram[1] = "Sala de Cardiologia//" room_descriptions.cardiogram[2] = "Aqui é diagnosticado e examinado os pacientes antes que voltem para a consulta, onde porá o tratamento.//" room_descriptions.cardiogram[3] = "A sala de cardiologia requer um médico. Também precisa de manutençäo. " room_descriptions.decontamination[1] = "Descontaminaçäo//" room_descriptions.decontamination[2] = "Os pacientes que estiveram expostos à radiaçäo säo enviados rapidamente à consulta de descontaminaçäo. Esta consulta dispöe de uma ducha que os purifica de toda a horrível radioatividade e sujeira.//" room_descriptions.decontamination[3] = "A ducha descontaminadora requer um médico. Também precisa de um faz-tudo que se ocupe da sua manutençäo. " room_descriptions.jelly_vat[1] = "Banho Gelatinoso//" room_descriptions.jelly_vat[2] = "Os pacientes que sofrem da risível doença da gelatinitis devem ir a cambalear-se para a consulta de gelatinitis e ser inundados no banheiro gelatinoso. Isto faz com que se curem de um modo que näo resulta de tudo compreensível para a profissäo médica.//" room_descriptions.jelly_vat[3] = "O banho gelatinoso requer um médico. Também precisa de uma faz-tudo para a sua manutençäo. " room_descriptions.gp[1] = "Sala de Consultório Geral//" room_descriptions.gp[2] = "Esta é a consulta mais importante do seu hospital. Os novos pacientes säo enviados aqui para averiguar o que é que eles têm. Entäo, ou fazem outro diagnóstico ou mandam para uma consulta onde possam ser curados. Possivelmente queira construir outro consultório se o primeiro tiver muito trabalho. Quanto maior for o consultório e quanto mais objetos colocar nele, maior prestígio terá o médico. O mesmo acontece com todas as consultas abertas.//" room_descriptions.gp[3] = "O consultório geral requer um médico. " room_descriptions.hair_restoration[1] = "Peloterapia//" room_descriptions.hair_restoration[2] = "Os pacientes que sofrem de calvície seräo enviados ao pêlo-restaurador desta sala. Um médico ligará o pêlo-restaurador, que, rapidamente, implantará na cabeça do paciente ar puro.//" room_descriptions.hair_restoration[3] = "A consulta de peloterapia requer um médico. Também precisa de manutençäo periódica. " room_descriptions.inflation[1] = "Inflatoterapia//" room_descriptions.inflation[2] = "Os pacientes que sofrem a dolorosa doença de terem a cabeça inflada devem ir à sala de inflatoterapia, será desinflada sua cabeça e em seguida vota a ser inflada à pressäo correta.//" room_descriptions.inflation[3] = "A Inflatoterapia requer um médico. Também precisa de um faz-tudo que se ocupe do seu bom funcionamento. " room_descriptions.psych[1] = "Sala de Psiquiatria//" room_descriptions.psych[2] = "Os pacientes que säo diagnosticados com uma doença psiquiátrica têm que ir a uma consulta de psiquiatria para receber o tratamento. Os psiquiatras também podem realizar diagnósticos para saber que tipo de doença que sofrem os pacientes, e se estas säo do tipo mental, podem tratá-los deitando-os no divä.//" room_descriptions.psych[3] = "A sala de psiquiatria requer um médico especializado em psiquiatria. " room_descriptions.operating_theatre[1] = "Sala de Operaçöes//" room_descriptions.operating_theatre[2] = "Esta importante instalaçäo serve para curar um grande número de doenças. A sala de operaçöes tem que ser espaçosa e deve estar bem equipada. É uma parte essencial do seu hospital.//" room_descriptions.operating_theatre[3] = "A sala de operaçöes requer dois médicos especializados em cirurgia. " room_descriptions.no_room[1] = "" room_descriptions.x_ray[1] = "Sala de Raio X//" room_descriptions.x_ray[2] = "O Raio X fotografa o interior do paciente empregando uma radiaçäo especial para ajudar a equipe a descobrir o que acontece.//" room_descriptions.x_ray[3] = "A sala de Raio X requer um médico. Também precisa de manutençäo. " room_descriptions.tv_room[1] = "TV ROOM NOT USED" room_descriptions.staff_room[1] = "Sala de Descanso//" room_descriptions.staff_room[2] = "Os seus funcionários se cansam quando realizam o seu trabalho. Precisam desta sala para descansar e se refrescar. Os funcionários cansados säo mais lentos, pedem mais dinheiro e por fim väo embora. Também cometem mais erros. Vale a pena construir uma sala que tenham muitos passatempos. Assegure-se de que há lugar para vários funcionários ao mesmo tempo. " room_descriptions.slack_tongue[1] = "Laringologia//" room_descriptions.slack_tongue[2] = "Os pacientes que sejam diagnosticados com língua comprida na consulta seräo enviados aqui para receber tratamento. O médico utilizará uma máquina de alta tecnologia para estirar a língua e cortá-la e, com o que o paciente voltará a estar säo.//" room_descriptions.slack_tongue[3] = "A sala de laringologia requer um médico. Também precisa de uma manutençäo muito frequente. " room_descriptions.dna_fixer[1] = "Genética//" room_descriptions.dna_fixer[2] = "Os pacientes que foram manipulados por alienígenas, devem ter seu DNA substituído nesta sala. O reparador de DNA é uma máquina complexa e seria sensato ter um extintor na sala, só por garantia.//" room_descriptions.dna_fixer[3] = "O reparador de DNA requer que um faz-tudo o revise de vez em quando. Também requer um médico especializado em pesquisa para poder usá-lo. " room_descriptions.training[1] = "Sala de Formaçäo//" room_descriptions.training[2] = "Os seus residentes e médicos podem obter uma valiosa qualificaçäo extra aprendendo nesta sala. Um especialista em cirurgia, pesquisa ou psiquiatria ensinará a sua especialidade aos médicos que recebem formaçäo. Os médicos que já possuem estas especialidades veräo a sua habilidade aumentar enquanto estäo aqui.//" room_descriptions.training[3] = "A sala de formaçäo requer um especialista. " room_descriptions.toilets[1] = "Banheiro//" room_descriptions.toilets[2] = "Os pacientes estäo sentindo um chamado da natureza e precisam se aliviar no conforto de suas instalaçöes de banheiro. Pode construir mais banheiros e pias se esperar muitos visitantes. Em alguns casos, terá que pôr mais banheiros em outras partes do hospital. " room_descriptions.ultrascan[1] = "Ultra Scanner//" room_descriptions.ultrascan[2] = "O ultra scanner é, virtualmente, o mais avançado em equipamentos de diagnóstico. Tem um preço alto mas merece a pena se quiser que o seu hospital realize diagnósticos excelentes.//" room_descriptions.ultrascan[3] = "O ultra scanner requer um médico. Também precisa de manutençäo. " room_descriptions.pharmacy[1] = "Farmácia//" room_descriptions.pharmacy[2] = "Os pacientes que foram diagnosticados e que devem tomar um medicamento devem visitar a farmácia para tomá-lo. Quantos mais remédios forem descobertos e estejam disponíveis, mais concorrida estará a farmácia. Possivelmente queira construir outra farmácia mais para frente.//" room_descriptions.pharmacy[3] = "A farmácia requer uma enfermeira. " room_descriptions.research[1] = "Centro de Pesquisa//" room_descriptions.research[2] = "No centro de pesquisa säo inventados ou melhoram novos remédios e curas. É uma parte essencial do seu hospital, e fará maravilhas para elevar a sua porcentagem de curas.//" room_descriptions.research[3] = "O Centro de Pesquisa requer um médico especializado em pesquisa. " room_descriptions.general_diag[1] = "Sala de Diagnóstico Geral//" room_descriptions.general_diag[2] = "Aqui säo examinados os pacientes que precisam de outro diagnóstico. Se em uma consulta näo descobrir os seus problemas, o diagnosticador geral normalmente consegue. Em seguida, volta a enviar os pacientes para a consulta para analisar os resultados obtidos aqui.//" room_descriptions.general_diag[3] = "A sala de diagnóstico geral requer um médico. " room_descriptions.scanner[1] = "Scanner//" room_descriptions.scanner[2] = "É diagnosticado com precisäo os pacientes empregando um sofisticado scanner. Em seguida, väo para a consulta para que o médico veja o tratamento posterior.//" room_descriptions.scanner[3] = "O scanner requer um médico. Também precisa de manutençäo. " room_descriptions.electrolysis[1] = "Eletrólise//" room_descriptions.electrolysis[2] = "Os pacientes com peludismo säo enviados para esta consulta, onde uma máquina especial de eletrólise elimina os pelos e fecha os poros com eletricidade empregando um composto parecido ao cal.//" room_descriptions.electrolysis[3] = "A sala de eletrólise requer um médico. Também precisa que um faz-tudo faça a sua manutençäo. " staff_list.skill = "NIVEL" staff_list.morale = "MORAL" staff_list.tiredness = "CANSAÇO" staff_list.total_wages = "SALARIOS TOTAIS" menu_file_load[1] = " JOGO 1 " menu_file_load[2] = " JOGO 2 " menu_file_load[3] = " JOGO 3 " menu_file_load[4] = " JOGO 4 " menu_file_load[5] = " JOGO 5 " menu_file_load[6] = " JOGO 6 " menu_file_load[7] = " JOGO 7 " menu_file_load[8] = " JOGO 8 " CorsixTH-0.63/CorsixTH/Lua/languages/czech.lua000077500000000000000000005143561347163623700211730ustar00rootroot00000000000000--[[ Copyright (c) 2011, 2012 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. --]] Font("unicode") Language("Čeština", "Czech", "cs", "cze") Inherit("English") high_score = { player = "HRÁČ", pos = "POZ", best_scores = "SÍŇ SLÁVY", killed = "Zabil", categories = { salary = "NEJVYŠŠÍ VÝPLATA", total_value = "CELKOVÁ HODNOTA", money = "NEJBOHATŠÍ", clean = "ČISTOTA", cures = "POČET VYLÉČENÍ", patient_happiness = "USPOKOJENÍ ZÁKAZNÍKŮ", deaths = "POČET ÚMRTÍ", cure_death_ratio = "POMĚR VYLÉČENÍ ÚMRTÍ", staff_happiness = "USPOKOJENÍ ZAMĚSTNANCŮ", visitors = "NEJVÍCE NÁVŠTĚVNÍKŮ", staff_number = "NEJVÍCE ZAMĚSTNANCŮ", }, worst_scores = "SÍŇ HANBY", score = "SKÓRE", } menu_display = { shadows = " STÍNY ", mcga_lo_res = " MCGA NÍZKÉ ROZ ", high_res = " VYSOKÉ ROZ ", } rooms_long = { dna_fixer = "Spravovač DNA", psychiatric = "Psychiatrie", corridors = "Chodby", gps_office = "Kancelář Praktického Lékaře", general = "Všeobecné", emergency = "Pohotovost", general_diag = "Obecné Vyšetření", hair_restoration = "Obnovovač vlasů", scanner = "Skener", research_room = "Výzkumné Odd.", cardiogram = "Kardiogram", toilets = "Toaleta", decontamination = "Dekontaminace", staffroom = "Místnost pro Zaměstnance", ward = "Nemocniční pokoj", jelly_vat = "Želé Nádrž", x_ray = "Rentgen", inflation = "Nafukovárna", ultrascan = "Ultraskener", blood_machine = "Krevní Stroj", tongue_clinic = "Oddělení Ochablého Jazyka", fracture_clinic = "Oddělení Zlomenin", training_room = "Výuková Místnost", electrolysis = "Oddělení Elektrolýzy", pharmacy = "Lékárna", operating_theatre = "Operační Sál", } menu_file_load = { [1] = " HRA 1 ", [2] = " HRA 2 ", [3] = " HRA 3 ", [4] = " HRA 4 ", [5] = " HRA 5 ", [6] = " HRA 6 ", [7] = " HRA 7 ", [8] = " HRA 8 ", } cheats_window = { warning = "Varování: Pokud budete podvádět, nedostanete na konci úrovně žádné bonusové body!", caption = "Cheaty", cheated = { no = "Cheaty použity: Ne", yes = "Cheaty použity: Ano", }, close = "Zavřít", cheats = { lose_level = "Prohrát Úroveň", emergency = "Vytvořit Havárii", end_year = "Konec Roku", money = "Peníze", win_level = "Vyhrát Úroveň", earthquake = "Vytvořit zemětřesení", all_research = "Všechen Výzkum", create_patient = "Vytvořit Pacienta", end_month = "Konec Měsíce", vip = "Vytvořit VIP", epidemic = "Vytvořit nakažlivého pacienta", toggle_infected = "Zapnout/Vypnout ikony nakažení", }, } menu_file_save = { [1] = " HRA 1 ", [2] = " HRA 2 ", [3] = " HRA 3 ", [4] = " HRA 4 ", [5] = " HRA 5 ", [6] = " HRA 6 ", [7] = " HRA 7 ", [8] = " HRA 8 ", } level_names = { [1] = "ToxiMěsto", [2] = "Ospalá Díra", [3] = "Velkýčestr", [4] = "Frimpton na Moři", [5] = "Prosťáčkov", [6] = "Hnisání na Pláni", [7] = "Zelená Kaluž", [8] = "Lidské Přístaviště", [9] = "Východní město", [10] = "Vejceseslaninou", [11] = "Skřehotálkov", [12] = "Vykrmené město", [13] = "Kámošlí", [14] = "Malé Ztlouknutí", [15] = "Zakopej Pohřbi", } custom_game_window = { free_build = "Volné stavění", caption = "Vlastní Hra", load_selected_level = "Spustit", } menu_debug_overlay = { positions = " POZICE ", parcel = " PARCELA ", byte_6 = " BAJT 6 ", byte_floor = " BAJT PODLAHY ", none = " ŽÁDNÝ ", flags = " PŘÍZNAKY ", byte_0_1 = " BAJT 0 a 1 ", byte_n_wall = " BAJT S ZDI ", byte_w_wall = " BAJT Z ZDI ", byte_5 = " BAJT 5 ", byte_7 = " BAJT 7 ", heat = " TEPLOTA ", } newspaper = { [1] = { [1] = "HOROR DR ŠOKA", [2] = "DIVNÝ PRAKTICKÝ LÉKAŘ SI HRAJE NA BOHA", [3] = "ŠOK ŠPRÝMOŠTAINA", [4] = "CO BYLO NA LABORATORNÍM STOLE?", [5] = "RAZIE ZASTAVILA RISKANTNÍ VÝZKUM", }, [2] = { [1] = "OPILÝ DO NĚMOTY", [2] = "OPILÝ CHIRURG", [3] = "HÝŘIVÝ KONZULTANT", [4] = "CHIRURGICKÁ ŠTAMPRLE", [5] = "CHIRURG NASÁVÁ", [6] = "CHIRURGICKÉ DUŠIČKY", }, [3] = { [1] = "CHTIVÝ CHIRURG", [2] = "DOKTOR KALHOTYDOLŮ", [3] = "DOKTOR MÍŘÍ DOLŮ", [4] = "NEUSPOKOJITELNÝ CHIRURG", }, [4] = { [1] = "DOKTOR UPRAVUJE ČÍSLA", [2] = "ORGÁN-IZOVANÝ ZLOČIN", [3] = "OPERACE PŘEKLENUTÍ BANKY", [4] = "LÉKAŘ DRŽÍ FONDY", }, [5] = { [1] = "ZDRAVOTNÍ VÝZKUMNÍK LOUPÍ HROBY", [2] = "DOKTOR VYPRAZDŇUJE HROBY", [3] = "PŘICHYCEN S MRTVOLOU", [4] = "DEN ZÚČTOVÁNÍ DR SMRTKY", [5] = "SMRTELNÁ NEDBALOST", [6] = "DOKTOROVO NALEZIŠTĚ ODHALENO", }, [6] = { [1] = "DOKTOROVA TAJNÁ DOHODA!", [2] = "NEPOZORNÝ MASTIČKÁŘ", [3] = "ZNIČUJÍCÍ VYŠETŘENÍ", [4] = "NEŠIKOVNÝ KONZULTANT", }, [7] = { [1] = "DOKTOR NEMÁ CO DĚLAT", [2] = "CHIRURG 'OPERUJE' SÁM SEBE", [3] = "MASTURBACE NA HAJZLU", [4] = "DOKTORŮV SKANDÁL UCHOPEN", [5] = "MEDIK DĚLÁ BORDEL", }, } months = { [1] = "Led", [2] = "Úno", [3] = "Bře", [4] = "Dub", [5] = "Kvě", [6] = "Čer", [7] = "Čvc", [8] = "Srp", [9] = "Zář", [10] = "Říj", [11] = "Lis", [12] = "Pro", } dynamic_info = { object = { strength = "Síla %d", queue_size = "Velikost Fronty %d", times_used = "Kolikrát Použito %d", queue_expected = "Očekávaná Fronta %d", }, patient = { diagnosed = "Diagnóza: %s ", diagnosis_progress = "Průběh Vyšetření", guessed_diagnosis = "Odhadnutá diagnóza: %s ", actions = { no_diagnoses_available = "Nemáte pro mě žádné další diagnózy - Jdu domů", no_gp_available = "Čekám, až postavíte kancelář praktického lékaře", cured = "Vyléčen!", waiting_for_treatment_rooms = "Čekám, až pro mě vybudujete místnost k léčení", fed_up = "Naštvaný a odchází", prices_too_high = "Vaše ceny jsou příliš vysoké - Jdu domů", on_my_way_to = "Na cestě do %s", sent_home = "Poslán Domů", dying = "Umírá!", no_treatment_available = "Není pro mě diagnóza - Jdu domů", epidemic_contagious = "Jsem nakažlivý", waiting_for_diagnosis_rooms = "Čekám, až postavíte další diagnostická oddělení", queueing_for = "Ve frontě pro %s", awaiting_decision = "Čekám na Vaše rozhodnutí", sent_to_other_hospital = "Odkázán jinam", epidemic_sent_home = "Poslán domů Inspektorem", epidemic_vaccinated = "Již nejsem nakažlivý", }, emergency = "Havárie: %s", }, staff = { psychiatrist_abbrev = "Psych.", tiredness = "Únava", actions = { heading_for = "Mířím do %s", fired = "Propuštěn", wandering = "Jen se tak potuluji", waiting_for_patient = "Čekám na pacienta", going_to_repair = "Jdu opravit %s", }, ability = "Dovednost", }, vip = "VIP Návštěvník", health_inspector = "Hygienický Inspektor", } calls_dispatcher = { summary = "%d volání; %d přiřazeno", watering = "Zalévám @ %d,%d", repair = "Opravit %s", staff = "%s - %s", close = "Zavřít", } town_map = { number = "Číslo Pozemku", area = "Oblast Pozemku", not_for_sale = "Nelze Vlastnit", owner = "Vlastník Pozemku", chat = "Chat Podrobností Města", for_sale = "Na prodej", price = "Cena Pozemku", } confirmation = { replace_machine = "Jste si jisti, že chcete nahradit %s za %d€?", music_warning = "Před zvolením hudby ve formátu mp3 se ujistěte, že máte dostupný soubor smpeg.dll, nebo podobné, pro váš operační systém, jinak ve hře nebudete mít žádnou hudbu. Chcete pokračovat?", abort_edit_room = "Právě stavíte nebo upravujete místnost. Pokud jsou všechny povinné objekty umístěny, bude dokončena, ale jinak bude smazána. Pokračovat?", quit = "Zvolili jste, že chcete Odejít. Opravdu chcete hru opustit?", needs_restart = "Změna tohoto nastavení vyžaduje restart CorsixTH. Jakýkoli neuložený postup bude ztracen. Jste si jisti, že to chcete udělat?", delete_room = "Opravdu chcete tuto místnost smazat?", sack_staff = "Jste si jisti, že chcete tohoto zaměstnance vykopnout?", restart_level = "Jste si jisti, že chcete úroveň restartovat?", overwrite_save = "Hra už byla do této pozice uložena. Jste si jisti, že ji chcete přepsat?", return_to_blueprint = "Jste si jisti, že se chcete vrátit do režimu Návrhu?", maximum_screen_size = "Velikost obrazovky, kterou jste zadali, je vyšší než 3000 x 2000. Na tato rozlišení lze přejít za předpokladu, že máte hardware schopný tuto hru udržet v hratelné rychlosti. Opravdu chcete pokračovat?", } adviser = { goals = { win = { reputation = "Zvyšte Vaši reputaci na %d ke splnění kritéria pro výhru úrovně", money = "Potřebujete dalších %d ke splnění finančního kritéria v této úrovni.", cure = "Vylečte dalších %d pacientů a budete mít dostatek k výhře v této úrovni.", value = "Musíte zvýšit Vaši hodnotu nemocnice na %d", }, lose = { kill = "Zabijte dalších %d pacientů a úroveň prohrajete!", }, }, competitors = { staff_poached = "Jeden z Vašich zaměstnanců byl ukraden jinou nemocnicí.", land_purchased = "%s právě koupil pozemek.", hospital_opened = "%s otevřel v oblasti konkurenční nemocnici.", }, information = { promotion_to_doctor = "Jeden z Vašich REZIDENTŮ se stal DOKTOREM.", pay_rise = "Jeden z Vašich zaměstnanců vyhrožuje výpovědí. Zvolte, jestli s jejich požadavky souhlasíte nebo je vykopnete. Klikněte na ikonu vlevo, abyste viděli, který zaměstnanec hrozí výpovědí.", handyman_adjust = "Údržbáři můžou čistit účinněji tím, že jim zadáte priority.", emergency = "Je tu pohotovost! Pohyb! Pohyb! POHYB!", epidemic_health_inspector = "Zprávy o Vaší epidemii se donesly na Ministerstvo Zdravotnictví. Připravte se na návštěvu Hygienického Inspektora.", fax_received = "Ikona, která vyskočila vlevo dole na obrazovce, Vás upozorňuje na důležitou informaci nebo rozhodnutí, které musíte udělat.", larger_rooms = "Větší místnosti dávají zaměstnancům pocit důležitosti a zlepšují jejich výkon.", first_cure = "Výborně! Právě jste vyléčili Vašeho prvního Pacienta.", promotion_to_specialist = "Jeden z Vašich Doktorů byl povýšen na %s.", initial_general_advice = { psychiatric_symbol = "Doktoři kvalifikování v Psychiatrických záležitostech mají symbol: |", research_symbol = "Doktoři schopní výzkumu mají symbol: }", surgeon_symbol = "Doktoři, kteří mohou provádět operace, mají symbol: {", epidemic_spreading = "Ve Vaší nemocnici je nákaza. Zkuste nakažené lidi vyléčit dřív, než odejdou.", first_epidemic = "Ve Vaší nemocnici je epidemie! Rozhodněte, zdali to chcete ututlat nebo přiznat barvu.", autopsy_available = "Auto-Pitevní stroj byl vynalezen. Tímto se můžete zbavit problémových a nevítaných pacientů a udělat na jejich zbytcích výzkum. Berte na vědomí, že použití tohoto přístroje je vysoce kontroverzní.", first_VIP = "Chystáte se pořádat Vaši první návštěvu VIP. Snažte se zajistit, aby VIP neviděl nic nehygienického, nebo nějaké nešťastné pacienty.", place_radiators = "Lidem ve Vaší nemocnici je zima - můžete umístit více radiátorů tím, že je vyberete z menu Položek Chodby.", first_emergency = "Urgentní pacienti mají nad svými hlavami blikající modré světlo. Vylečte je předtím, než zemřou nebo vyprší čas.", research_now_available = "Vybudovali jste Vaši první Výzkumnou místnost. Nyní můžete vstoupit do obrazovky Výzkumu.", taking_your_staff = "Někdo krade Váš personál. Budete muset bojovat, aby tu zůstali.", first_patients_thirsty = "Lidé mají ve Vaší nemocnici žízeň. Umístěte pro ně automat na nápoje.", machine_needs_repair = "Máte stroj, který potřebuje opravit. Nalezněte tento stroj - bude se z něho kouřit - a klikněte na něj. Pak klikněte na tlačítko údržbáře.", decrease_heating = "Lidem ve Vaší nemocnici je horko. Snižte úroveň vytápění. To se provádí v Obrazovce Města.", increase_heating = "Lidem je zima. Zvyšte teplotu vytápění v Obrazovce Města.", rats_have_arrived = "Vaši nemocnici zamořily krysy. Zkuste je myší zastřelit.", }, place_windows = "Umístěním oken bude místnost jasnější a zlepší náladu Vašich zaměstnanců.", patient_leaving_too_expensive = "Pacient odchází, aniž by zaplatil za %s. Je to příliš drahé.", vip_arrived = "Pozor! - %s právě přijel na obhlídku Vaší nemocnice! Ujistěte se, že vše běží hladce, abyste ho potěšily.", epidemic = "Ve Vaší nemocnici máte nakažlivou chorobu. Musíte s tím okamžitě něco dělat!", first_death = "Právě jste zabili svého prvního pacienta. Jaký je to pocit?", extra_items = "Dodatečné věci v místnostech Vaše zaměstnance uklidňuje a zlepšuje jejich výkon.", promotion_to_consultant = "Jeden z Vašich DOKTORŮ se stal KONZULTANTEM.", patient_abducted = "Jednoho z Vašich pacientů unášejí mimozemšťané.", }, praise = { many_plants = "Jak milé. Máte spousty rostlin. Vaši Pacienti to jistě ocení.", few_have_to_stand = "Jen málokdo musí ve Vaší nemocnici stát. To pacienty potěší.", plenty_of_benches = "Je tu spousta míst k sezení, takže to není problém.", many_benches = "Pacienti teď mají dostatek míst k sezení. Bod pro Vás.", plants_thriving = "Velmi dobře. Vaše rostliny přímo vzkvétají. Vypadají úžasně. Jen tak dál a možná za ně vyhrajete ocenění.", plants_are_well = "To je hezké. Dobře se staráte o Vaše rostliny. Milé.", patients_cured = "%d Pacientů vyléčeno.", }, placement_info = { reception_can_place = "Tuto recepci můžete umístit zde.", window_can_place = "Toto okno můžete umístit zde. Je to v pořádku.", door_can_place = "Pokud chcete, můžete tyto dveře umístit zde.", reception_cannot_place = "Zde nemůžete tuto Recepci umístit.", object_can_place = "Zde můžete umístit tento objekt.", room_cannot_place = "Zde nemůžete tuto místnost umístit.", room_cannot_place_2 = "Zde nemůžete tuto místnost umístit.", window_cannot_place = "Aha. Zde vlastně okno umístit nemůžete.", staff_cannot_place = "Zde nemůžete zaměstnance umístit. Je mi líto.", staff_can_place = "Zde můžete zaměstnance umístit. ", door_cannot_place = "Je mi líto, ale zde nemůžete dveře umístit.", object_cannot_place = "Hej, zde tento objekt umístit nemůžete.", }, surgery_requirements = { need_surgeons_ward_op = "Musíte zaměstnat dva Chirurgy a postavit Nemocniční Pokoj a také Operační Sál k provedení Operace.", need_surgeon_ward = "Stále potřebujete zaměstnat dalšího Chirurga a postavit Nemocniční Pokoj, abyste mohli provádět Operace.", }, build_advice = { placing_object_blocks_door = "Umístěním tohoto objektu zde by zabránil lidem dostat se k dveřím.", door_not_reachable = "Lidé by nebyli schopni se ke dveřím dostat. Přemýšlejte o tom.", blueprint_would_block = "Tento návrh by bránil ostatním místnostem. Zkuste změnit její velikost, nebo ji přesunout jinam!", blueprint_invalid = "To není platný návrh.", }, multiplayer = { poaching = { not_interested = "Ha! Nemají zájem pro Vás pracovat - jsou spokojeni tam, kde jsou.", already_poached_by_someone = "To snad ne! Někdo se už snaží tuto osobu ukrást.", in_progress = "Dám Vám vědět, zdali tato osoba bude chtít jít pro Vás pracovat.", }, everyone_failed = "Všichni nedokázali splnit poslední úkol. Takže všichni budou hrát dál !", players_failed = "Následující hráč(i) nedokázal(i) splnit poslední úkol : ", }, staff_place_advice = { only_doctors_in_room = "Pouze Doktoři mohou v %s pracovat", only_nurses_in_room = "Pouze Sestry mohou v %s pracovat", receptionists_only_at_desk = "Recepční mohou pracovat pouze v Recepci.", nurses_cannot_work_in_room = "Sestry nemohou v %s pracovat", only_researchers = "Doktoři mohou ve Výzkumném Oddělení pracovat pouze, pokud mají Výzkumnou odbornost.", only_surgeons = "Doktoři mohou na Operačním Sále pracovat pouze, pokud mají Chirurgickou odbornost.", only_psychiatrists = "Doktoři mohou na Psychiatrii pracovat pouze, pokud mají Psychiatrickou odbornost.", doctors_cannot_work_in_room = "Doktoři nemohou v %s pracovat", }, tutorial = { start_tutorial = "Přečtěte si Úvod do Mise, pak klikněte levým tlačítkem myši ke spuštění výuky.", room_too_small_and_invalid = "Návrh je příliš malý a na neplatném místě. Tak jen do toho.", place_receptionist = "Přesuňte Recepční a umístěte ji kamkoliv. Chytře se přesune ke svému stolu.", next_receptionist = "Toto je první Recepční v seznamu. Klikněte levým tlačítkem na blikající ikonku k zobrazení další dostupné.", build_reception = "Dobrý den. Nejdříve potřebuje Vaše nemocnice Recepci. Vyberte jednu z menu Položek Chodby.", accept_purchase = "Klikněte levým tlačítkem, abyste ji zakoupili.", window_in_invalid_position = "Toto okno je v neplatné pozici. Zkuste ho umístit někde jinde na zdi, pokud byste byli tak laskavi.", order_one_reception = "Klikněte jednou na blikající řádek levým tlačítkem myši k objednání jedné Recepce.", place_door = "Pohybujte myší okolo zdí návrhu, abyste umístili dveře tam, kam je chcete.", object_in_invalid_position = "Tato položka je v neplatné pozici. Prosím, buď ji umístěte někam jinam, nebo ji otočte tak, aby se vešla.", click_and_drag_to_build = "Pro vybudování kanceláře Praktického Lékaře si nejdříve musíte promyslet, jak bude velká. Klikněte a držte levé tlačítko, při držení Vaší místnosti, pro změnu velikosti.", doctor_in_invalid_position = "Hej! Zde Doktora dát nemůžete.", build_gps_office = "Abyste mohli začít vyšetřovat nemoci pacientů, musíte postavit kancelář praktického lékaře.", prev_receptionist = "Klikněte levým tlačítkem na blikající ikonu k zobrazení předchozí dostupné Recepční.", door_in_invalid_position = "Ah! Snažili jste se umístit dveře do neplatné polohy. Zkuste někde jinde na zdech návrhu.", room_big_enough = "Návrh je nyní dostatečně velký. Když uvolníte tlačítko myši, tak bude umístěna. Stále ji můžete přemisťovat, nebo měnit její velikost.", select_receptionists = "Klikněte levým tlačítkem na blikající ikonu, pro zobrazení, které Recepční jsou nyní k dispozici pro práci. To číslo na ikoně označuje, z kolika si musíte vybrat.", hire_doctor = "Potřebujete Doktora, který bude vyšetřovat a léčit nemocné lidi.", place_doctor = "Umístěte Doktora kdekoliv v nemocnici. Jakmile v kanceláři bude někdo k vyšetření, tak tam vyrazí.", choose_doctor = "Dobře se podívejte na dovednosti každého Doktora, než si jednoho zvolíte.", click_gps_office = "Klikněte levým tlačítkem na řádek pro vybrání kanceláře praktického lékaře.", choose_receptionist = "Rozhodněte, která Recepční má dobré dovednosti a spravedlivou mzdu a pak klikněte levým tlačítkem na blikající ikonu, abyste ji zaměstnali.", hire_receptionist = "Budete také potřebovat Recepční, aby se postarala o pacienty.", reception_invalid_position = "Recepce je zašedivělá protože je v neplatné pozici. Zkuste ji posunout nebo otočit.", rotate_and_place_reception = "Klikněte pravým tlačítkem myši k otočení Recepce a umístěte ji ve Vaší nemocnici levým tlačítkem myši.", place_windows = "Okna umístěte stejným způsobem jako dveře. Okna sice nepotřebujete, ale Vaši zaměstnanci jsou šťastnější, když se mají z čeho koukat ven.", room_too_small = "Tento návrh místnosti je červený, protože je moc malý. Roztáhněte ho více, aby byl větší.", build_pharmacy = "Blahopřeji! Nyní vybudujte Lékárnu a zaměstnejte Sestru, abyste dostali fungující nemocnici.", room_in_invalid_position = "Jejda! Tento návrh je neplatný - červené oblasti označují kde jste překrývá s jinou místností nebo zdmi nemocnice.", select_doctors = "Klikněte levým tlačítkem na blikající ikonu, abyste se podívali na Doktory, dostupné k najmutí.", place_objects = "Pravým tlačítkem otáčíte položky místnosti, a levým tlačítkem je umisťujete.", receptionist_invalid_position = "Zde nemůžete Recepční umístit.", select_diagnosis_rooms = "Klikněte levým tlačítkem na blikající ikonu pro zobrazení seznamu dostupných diagnostických místností.", information_window = "Rámeček Nápovědy Vám říká vše o té hezké kanceláři, kterou jste právě vybudovali.", confirm_room = "Klikněte levým tlačítkem na blikající ikonu k otevření Vaší místnosti pro činnost nebo klikněte na ikonku X, abyste šli o krok zpět.", }, room_requirements = { op_need_two_surgeons = "Zaměstnejte dva Chirurgy, k provádění operací na Operačním Sále.", op_need_ward = "Musíte vybudovat Nemocniční Pokoj k Předoperačnímu Vyšetření pacientů, než budou moci jít na zákrok.", research_room_need_researcher = "K použití Výzkumné Místnosti musíte zaměstnat Doktora s Výzkumnou odborností.", training_room_need_consultant = "Musíte zaměstnat Konzultanta, který bude ve Výukové Místnosti učit.", pharmacy_need_nurse = "Pro tuto Lékárnu musíte zaměstnat Sestru.", reception_need_receptionist = "Musíte zaměstnat Recepční, abyste mohli vidět Vaše pacienty.", op_need_another_surgeon = "Stále musíte ještě zaměstnat jednoho Chirurga, aby Operační Sál mohl být použitelný.", psychiatry_need_psychiatrist = "Když jste nyní postavili Psychiatrii, musíte také zaměstnat Psychiatra.", ward_need_nurse = "Pro tento Nemocniční Pokoj musíte zaměstnat Sestru.", gps_office_need_doctor = "Potřebujete zaměstnat Doktora, aby v této kanceláři pracoval.", }, research = { new_available = "Nový %s je dostupný.", drug_fully_researched = "%s jste vyzkoumali na 100%.", new_drug_researched = "Nový lék pro léčbu %s byl vynalezen.", drug_improved = "Lék %s byl vylepšen vaším Výzkumným Oddělením.", autopsy_discovered_rep_loss = "Váš stroj Auto-Pitvy byl objeven. Očekávejte zápornou reakci široké veřejnosti.", new_machine_researched = "Nový %s byl právě úspěšně vynalezen.", machine_improved = "%s byl vylepšen vaším Výzkumným Oddělením.", drug_improved_1 = "Lék %s byl vylepšen vaším Výzkumným oddělením." }, cheats = { th_cheat = "Blahopřejeme, právě jste odemkli cheaty!", roujin_off_cheat = "Roujinova výzva deaktivována.", roujin_on_cheat = "Roujinova výzva aktivována! Hodně štěstí...", }, room_forbidden_non_reachable_parts = "Umístěním místnosti zde by zapříčinilo, že části nemocnice by byly nedostupné.", level_progress = { improve_reputation = "Potřebujete svoji reputaci zlepšit o %d, abyste vůbec měli šanci tuto úroveň vyhrát.", three_quarters_lost = "Jste na tři čtvrtě cesty k prohře v této úrovni.", another_patient_cured = "Výborně - další pacient vyléčen. To je teď %d.", three_quarters_won = "Jste na tři čtvrtě cesty k výhře této úrovně.", nearly_lost = "Dostáváte se velmi blízko k prohře této úrovně.", halfway_won = "Jste tak na půli cesty k výhře v této úrovni.", another_patient_killed = "Ale ne! Zabili jste dalšího pacienta. To teď dělá %d úmrtí.", dont_kill_more_patients = "Vážně si nemůžete dovolit nechat zemřít další pacienty!", reputation_good_enough = "Dobře, Vaše reputace je dost vysoká na výhru této úrovně. Udržujte ji nad %d a vyřešte jiné problémy, abyste ji dokončili.", nearly_won = "Jste velmi blízko k výhře v této úrovni.", hospital_value_enough = "Udržte hodnotu své nemocnice nad %d a věnujte se Vašim ostatním problémům, abyste úroveň vyhráli.", close_to_win_increase_value = "Dostáváte se velmi blízko k výhře. Zvyšte hodnotu Vaší nemocnice o %d.", cured_enough_patients = "Sice jste vyléčili dostatek pacientů, ale budete muset udělat ve Vaší nemocnici lepší pořádek, abyste úroveň vyhráli.", financial_criteria_met = "Splnili jste finanční kritéria pro tuto úroveň. Nyní udržujte Vaši bilanci nad %d a zároveň se ujistěte, že Vaše nemocnice dobře běží.", halfway_lost = "Jste na půl cesty k prohře v této úrovni.", }, warnings = { litter_catastrophy = "Situace s odpadky je bezútěšná. Ať na tom hned začne pracovat tým Údržbářů!", financial_trouble = "Jste ve vážných finančních potížích. Hned si zorganizujte své finance! Pokud ztratíte dalších %d, tak zahodíte celou tuto úroveň!", need_toilets = "Pacienti potřebují toalety. Vybudujte je na snadno přístupném místě.", many_epidemics = "Vypadá to, že u Vás propukla více než jedna epidemie najednou. To by mohla být obrovská katastrofa, takže s tím rychle něco dělejte.", need_staffroom = "Postavte Místnost pro Zaměstnance, aby si Vaši zaměstnanci mohly kde odpočinout.", nobody_cured_last_month = "Minulý měsíc nebyl vůbec nikdo vyléčen.", charges_too_high = "Vaše poplatky jsou vysoké. Sice budete mít krátkodobě vysoké příjmy, ale nakonec začnete odhánět lidi pryč.", patient_stuck = "Někdo uváznul. Plánujte Vaši nemocnici lépe.", build_staffroom = "Okamžitě postavte Místnost pro Zaměstnance. Vaši zaměstnanci pracují příliš tvrdě a jsou na pokraji zhroucení. No tak - mějte rozum!", doctor_crazy_overwork = "Ale ne! Jeden z Vašich Doktorů se kvůli přepracování zbláznil. Pokud mu okamžitě máte odpočinou, může se z toho zotavit.", machinery_very_damaged = "Naléhavé! Řekněte Vašemu Údržbáři, aby okamžitě opravil Vaše přístroje! Chystají se vybouchnout!", nurses_tired2 = "Vaše Sestry jsou velmi unavené. Hned jim dejte odpočinout.", patients_very_thirsty = "Pacienti opravdu trpí žízní. Pokud brzo neumístíte automaty na nápoje, budete čelit velkému odcházení, jak všichni lidé odejdou domů pro kolu.", machinery_deteriorating = "Vaše přístroje začali chátrat kvůli nadměrnému užívání. Tak je hlídejte.", machine_severely_damaged = "%s je velmi blízko k nenapravitelné škodě.", people_have_to_stand = "Trpící lid musí stát. Hned umístěte další sezení.", machinery_damaged2 = "Musíte brzo zaměstnat Údržbáře, aby opravil Vaše přístroje.", no_desk_3 = "No to je prostě paráda, skoro rok a Vy nemáte pracující recepci! Jak si myslíte, že Vám sem budou chodit pacienti? Hned to vyřešte a přestaňte se flákat!", deal_with_epidemic_now = "Pokud se s touto epidemií brzo něco neprovede, budete až po oči v průšvihu. Tak pohyb!", too_many_plants = "Máte až příliš mnoho kytek. Je to tam jako v džungli.", cannot_afford = "V bance nemáte dostatek peněz, abyste tuto osobu najali!", cannot_afford_2 = "Nejste tak bohatí, abyste si toto zakoupili!", patients_thirsty = "Lidé začínají mít žízeň. Možná by jste jim měli poskytnout automaty na nápoje.", machinery_slightly_damaged = "Vaše přístroje v nemocnici jsou lehce poškozené. Nezapomeňte, abyste je všechny někdy udržovali.", change_priorities_to_plants = "Musíte změnit priority Vašich Údržbářů, aby trávili více času zaléváním rostlin.", queue_too_long_send_doctor = "Vaše fronty %s jsou příliš dlouhé. Ujistěte se, že v místnosti je doktor.", too_much_litter = "Máte problém s odpadky. Více údržbářů by mohla být odpověď.", place_plants_to_keep_people = "Lidé odcházejí. Umístěním kytek je může přesvědčit, aby zůstali.", research_screen_open_1 = "Předtím, než můžete vstoupit na obrazovku výzkumu, musíte postavit Výzkumné oddělení.", researcher_needs_desk_1 = "Výzkumník potřebuje pro práci svůj stůl.", researcher_needs_desk_2 = "Váš Výzkumník je potěšen vaší velkorysostí mu poskytnout přestávku při práci. Pokud jste zamýšleli, aby současně pracovalo více výzkumníků, musíte každému pořídit vlastní stůl pro práci.", researcher_needs_desk_3 = "Každý Výzkumník musí mít svůj vlastní pracovní stůl.", nurse_needs_desk_1 = "Každá Sestra potřebuje pro svoji práci vlastní stůl.", nurse_needs_desk_2 = "Vaše Sestra je přímo nadšená množstvím volna, které ji poskytujete. Pokud jste měli v úmyslu její začlenění do pracovního procesu, pak muíste každé dát stůl z kterého mohou pracovat.", research_screen_open_2 = "Výzkum je v současné úrovni zakázán.", no_desk_1 = "Pokud chcete, aby lidé do Vaší nemocnice chodili, budete muset najmout recepční a postavit ji recepci, kde může pracovat!", queue_too_long_at_reception = "Máte příliš mnoho pacientů čekajících na přidělení místnosti v recepci. Umístěte další Recepci a zaměstnejte další Recepční.", machines_falling_apart = "Vaše přístroje se začínají rozpadat. Okamžitě k nim pošlete Údržbáře!", patients_too_hot = "Pacientům začíná být velké horko. Buď nějaké radiátory odstraňte, snižte teplotu nebo umístěte pro ně víc automatů na nápoje.", staff_tired = "Vaši zaměstnanci začínají být pěkně unavení. Pokud je nenecháte trochu si odpočinout v Místnosti pro Zaměstnance, někteří by mohli pod tlakem zešílet.", cash_low_consider_loan = "Vaše peněžní situace je velmi vážná. Přemýšleli jste o půjčce?", patient_leaving = "Pacient odchází. Důvod? Vaše mizerně spravovaná a špatně zaměstnaná i vybavená nemocnice.", build_toilet_now = "Hned vybudujte toaletu. Lidé už to nemůžou vydržet. Nesmějte se - tohle je vážné.", epidemic_getting_serious = "Ta Nakažlivá Choroba se stává vážnou. Musíte brzo něco udělat!", money_very_low_take_loan = "Vaše Bankovní Bilance je strašlivě nízká. Mohli byste si vzít půjčku, víte.", more_benches = "Promyslete si umístění více laviček. Nemocní lidé nenávidí, když musejí stát.", some_litter = "Údržbáři se mohou odpadků zbavit dřív, než se z toho stane vážný problém.", patients_very_cold = "Pacientům je velmi zima. Zkuste zvýšit vytápění, nebo umístěte více radiátorů ve Vaší nemocnici.", receptionists_tired2 = "Vaše Recepční jsou velmi vyčerpané. Hned je nechte odpočinout.", patients_getting_hot = "Pacientům začíná být velké horko. Zkuste snížit vytápění, nebo dokonce odstraňte některé radiátory.", people_did_it_on_the_floor = "Někteří pacienti to nemohli vydržet. Čištění bude pro někoho velká práce.", patients_really_thirsty = "Pacienti mají velkou žízeň. Umístěte více automatů na nápoje, nebo přemístěte existující blízko k největším frontám.", doctors_tired = "Vaši Doktoři jsou velmi unavení. Hned je nechte odpočinout.", financial_trouble3 = "Vaše bankovní bilance vypadá trochu znepokojivě. Přemýšlejte o vydělávání více peněz. Jste %d vzdáleni od katastrofy.", handymen_tired2 = "Vaši Údržbáři jsou naprosto zničení. Okamžitě jim dejte odpočinout.", no_desk_2 = "Výborně, to musí být světový rekord: skoro rok a žádní pacienti! Pokud chcete pokračovat jako správce této nemocnice, budete muset najmout recepční a postavit recepci odkud může pracovat!", patients_thirsty2 = "Lidé si stěžují na žízeň. Měli byste umístit další Automaty na nápoje, nebo existující přesuňte blíže k nim.", people_freezing = "Neuvěřitelné, v této době centrálního vytápění, někteří Vaši pacienti mrznou zimou. Postavte radiátory, aby jim bylo teplo a zvyšte vytápění.", staff_too_hot = "Vaši zaměstnanci se přehřívají. Snižte teplotu, nebo odstraňte radiátory z jejich místností.", staff_unhappy2 = "Vaši zaměstnanci jsou obecně nešťastní. Také budou brzo chtít více peněz.", charges_too_low = "Účtujete si příliš málo. Sice to přinese více lidí do nemocnice, ale z každého nebudete mít moc velký výdělek.", staff_very_cold = "Zaměstnanci si stěžují na zimu. Zvyšte vytápění, nebo umístěte více radiátorů.", place_plants4 = "Utěšte Pacienty pomocí více rostlin v prostředí.", nurses_tired = "Vaše sestry jsou unavené. Hned jim dejte odpočinout.", bankruptcy_imminent = "Hej! Míříte směrem k bankrotu. Buďte opatrní!", handymen_tired = "Vaši Údržbáři jsou unavení. Dejte jim odpočinout.", finanical_trouble2 = "Zařiďte, aby Vám přicházeli peníze, nebo budete na dlažbě. Úroveň prohrajete, jestli přijdete o dalších %d.", desperate_need_for_watering = "Zoufale potřebujete zaměstnat Údržbáře, aby se staral o Vaše rostliny.", machinery_damaged = "Hned opravte Vaše přístroje. Nebude dlouho trvat a začnou se rozpadat.", many_killed = "Nyní jste zabili %d lidí. Víte, že jim máte pomáhat.", litter_everywhere = "Všude jsou odpadky. Pošlete na tento problém pár Údržbářů.", falling_3 = "Au, to muselo bolet, zavolejte někdo doktora!", no_patients_last_month = "Minulý měsíc nepřišli do Vaší nemocnice žádní noví pacienti. Šokující!", receptionists_tired = "Vaše Recepční jsou vážně unavené. Hned jim dejte odpočinout.", falling_5 = "Toto není místo pro srážení lidí, přece víte, že jsou nemocní!", falling_2 = "Přestaňte si zahrávat, jak by se to líbilo Vám?", falling_1 = "Hej! Tohle není sranda, dívejte se, kam s tou myší klikáte; mohli byste někoho zranit!", falling_6 = "Toto není kuželník, s nemocnými lidmi by se takto nemělo zacházet!", more_toilets = "Potřebujete více toalet. Lidem se u zadku dělají podezřelé objekty.", falling_4 = "Tohle je nemocnice, ne Theme Park!", plants_thirsty = "Potřebujete se starat o Vaše rostliny. Začínají mít žízeň.", doctors_tired2 = "Vaši Doktoři jsou neuvěřitelně unavení. Potřebují okamžitý odpočinek.", staff_overworked = "Vaši zaměstnanci jsou strašně přepracovaní. Stávají se neschopnými a začnou dělat katastrofické chyby.", patients_annoyed = "Lidé jsou strašně naštvaní na způsob, jak vedete nemocnici. A já se jim nemůžu divit. Vzpamatujte se, nebo čelte následkům!", hospital_is_rubbish = "Lidé otevřeně říkají, že Vaše nemocnice je příšerná. Než se nadáte, vezmou si jejich nemoci jinam.", pay_back_loan = "Máte dostatek peněz. Co takhle pomyslet na splacení půjčky?", plants_dying = "Vaše rostliny umírají. Zoufale touží po vodě. Ať na tomto pracuje více Údržbářů. Pacienti nemají rádi mrtvé rostliny.", patients_unhappy = "Pacienti nemají rádi Vaši nemocnici. Měli byste něco udělat pro zlepšení jejich prostředí.", queues_too_long = "Vaše fronty jsou příliš dlouhé.", place_plants2 = "Lidé odcházejí. Trochu více rostlin by je mohlo zde déle udržet.", patients_leaving = "Pacienti odcházejí. Zlepšete nemocnici pro Vaše návštěvníky umístěním rostlin, laviček, Automatů na nápoje a tak dále.", money_low = "Docházejí Vám peníze!", reception_bottleneck = "V Recepci je zácpa. Zaměstnejte další Recepční.", no_desk = "V určité fázi byste měli vybudovat recepci s najmout recepční!", staff_unhappy = "Vaši zaměstnanci jsou nešťastní. Zkuste jim dát příplatek, nebo ještě lépe, postavte jim Místnost pro Zaměstnance. Také byste mohli změnit zásady odpočinku Vašich zaměstnanců na obrazovce Zásady.", reduce_staff_rest_threshold = "Zkuste snížit práh Odpočinku Zaměstnanců ve Vaší obrazovce Zásad tak, aby Vaši zaměstnanci častěji odpočívají. Jen takový nápad.", place_plants3 = "Pacienti začínají být nešťastní. Umístěte více rostlin, abyste je utěšili.", build_toilets = "Hned teď vybudujte Toaletu nebo uvidíte něco velmi nepěkného. A představte si, jak Vaše nemocnice bude smrdět.", no_desk_4 = "Recepční potřebuje svoji vlastní pracovní stanici, kde bude vítat pacienty při jejich příchodu", no_desk_5 = "No už bylo načase, za chvíli by Vám měli začít přicházet pacienti!", no_desk_6 = "Recepční máte, tak co kdybyste ji postavili recepci, kde by mohla začít pracovat?", no_desk_7 = "Recepci jste postavili, a teď jenom najmout recepční. Bez ní do vaší nemocnice nevkročí ani noha!", }, earthquake = { ended = "Uf. Myslel jsem si, že tento byl Ten Velký - Byl %d stupně na Richterově Škále.", damage = "Toto zemětřesení poškodilo %d přístrojů a %d lidí v nemocnici.", alert = "Varování o zemětřesení. Během zemětřesení budou Vaše přístroje poškozeny. Pokud jsou špatně udržovány, mohou být zničeny.", }, staff_advice = { need_handyman_plants = "Budete muset zaměstnat Údržbáře, aby zaléval kytky.", need_doctors = "Potřebujete více Doktorů. Zkuste Vaše nejlepší Doktory umístit do místností s dlouhými frontami.", need_handyman_litter = "Lidé začali dělat ve Vaší nemocnici nepořádek. Zaměstnejte Údržbáře, aby po nich uklízel.", too_many_doctors = "Máte příliš mnoho Doktorů. Někteří v současnosti nemají nic na práci.", need_handyman_machines = "Pokud budete chtít udržovat přístroje ve Vaší nemocnici, musíte zaměstnat Údržbáře.", need_nurses = "Musíte zaměstnat více Sester. Nemocniční pokoje a Lékárny potřebují Sestru.", too_many_nurses = "Myslím, že v současnosti zaměstnáváte příliš mnoho Sester.", }, vomit_wave = { started = "Vypadá to, že ve Vaší nemocnici máte virus zvracení, pokud by to tu bylo čistější, tak by se to nestalo. Možná byste měli zaměstnat více Údržbářů.", ended = "Uf! Vypadá to, že virus, který způsobil vlnu zvracení, do značné míry odezněl. Do budoucna udržujte Vaší nemocnici čistou.", }, epidemic = { multiple_epidemies = "Vypadá to, že u Vás propukla více než jedna epidemie najednou. To by mohla být obrovská katastrofa, takže s tím rychle něco dělejte.", serious_warning = "Ta Nakažlivá Choroba se stává vážnou. Musíte brzo něco udělat!", hurry_up = "Pokud se s touto epidemií brzo něco neprovede, budete až po oči v průšvihu. Tak pohyb!", }, boiler_issue = { resolved = "Dobré zprávy. Bojler a radiátory nyní už zase správně fungují. Teplota by měla pro Vaše pacienty a zaměstnance být v pořádku.", maximum_heat = "Bojler ve sklepě se zbláznil. Teplo radiátorů se zaseklo na maximu. Lidi začnou tát! Umístěním více Automatů na nápoje by pomohlo.", minimum_heat = "Ah, tady jste. Bojler ve sklepě je rozbitý. Vypadá to, že lidem ve Vaší nemocnici bude za chvilku pořádná zima.", }, } staff_descriptions = { good = { [1] = "Velmi rychlý a pilný pracovník. ", [2] = "Velmi svědomitý. Hluboce se stará. ", [3] = "Má široký rozsah dovedností. ", [4] = "Velmi přátelský a rád se směje. ", [5] = "Úžasná výdrž. Prostě pořád jede. ", [6] = "Pozoruhodně slušný, chová se vlídně. ", [7] = "Neuvěřitelně talentovaný a schopný. ", [8] = "Hodně mu záleží na práci, kterou dělá. ", [9] = "Je puntičkář, který se prostě nevzdává. ", [10] = "Nadšeně pomáhá lidem s úsměvem. ", [11] = "Půvabný, slušný a nápomocný. ", [12] = "Obecně dobře motivovaný a oddaný. ", [13] = "Dobrosrdečný a velmi těžce pracující. ", [14] = "Oddaný a přátelský. ", [15] = "Pečlivý a spolehlivý v nouzových situacích. ", }, bad = { [1] = "Pomalý a malicherný. ", [2] = "Lenoch a špatně motivovaný. ", [3] = "Špatně vyučen a neschopný. ", [4] = "Drzý a neomalený. Leze lidem na nervy. ", [5] = "Hrozná výdrž - má špatný přístup. ", [6] = "Hluchý jako poleno. Je slabě cítit zelím. ", [7] = "Při práci je k ničemu. Možná přítěž. ", [8] = "Zbrklý a snadno rozptýlitelný. ", [9] = "Stresovaný a náchylný k chybám. ", [10] = "Zvrácený a zlý - spalován nenávistí. ", [11] = "Neopatrný a náchylný k nehodám. ", [12] = "Práce ho nezajímá. Líná veš. ", [13] = "Pošetile riskuje, je mu to úplně jedno. ", [14] = "Lstivý, prohnaný a podvratný. ", [15] = "Arogantní a nafoukaný. ", }, misc = { [1] = "Hraje golf. ", [2] = "Chodí se potápět. ", [3] = "Dělá sochy z ledu. ", [4] = "Pije víno. ", [5] = "Jezdí v závodních autech. ", [6] = "Skáče bungee-jumping. ", [7] = "Sbírá pivní tácky. ", [8] = "Má rád skákání z pódia. ", [9] = "Rád surfuje pomocí prdění. ", [10] = "Užívá si rozšiřování řek. ", [11] = "Destiluje whisky. ", [12] = "Zkušený kutil. ", [13] = "Má rád Francouzské nezávislé filmy. ", [14] = "Hodně hraje Theme Park. ", [15] = "Má řidičák pro náklaďáky. ", [16] = "Chodí závodit na motorkách. ", [17] = "Hraje na klasické housle a violoncello. ", [18] = "Zanícený lupič vraků vlaků. ", [19] = "Milovník psů. ", [20] = "Poslouchá rádio. ", [21] = "Často se koupe ve vaně. ", [22] = "Instruktor pro ruční práce s rafií. ", [23] = "Vydlabává zeleninu a používá ji jako držáky na mýdlo. ", [24] = "Zvláštní policejní komisař na částečný úvazek. ", [25] = "Bývalý moderátor kvizového pořadu. ", [26] = "Sbírá šrapnely z 2. světové války. ", [27] = "Přemisťuje nábytek. ", [28] = "Poslouchá rave a trip-hop. ", [29] = "Rozčiluje hmyz deodorantem ve spreji. ", [30] = "Pokřikuje na špatné komiky. ", [31] = "Špehuje pro obecní úřad. ", [32] = "Nenápadný zahradník. ", [33] = "Pašuje falešné hodinky. ", [34] = "Zpívá v rock&rollové skupině. ", [35] = "Uctívá denní televizní vysílání. ", [36] = "Lechtá pstruhy. ", [37] = "Láká turisty v muzeu. ", }, } load_game_window = { caption = "Načíst Hru (%1%)", } menu_options_game_speed = { slowest = " (%1%) NEJPOMALEJŠÍ ", slower = " (%1%) POMALEJŠÍ ", pause = " (%1%) POZASTAVENO ", normal = " (%1%) NORMÁLNÍ ", max_speed = " (%1%) MAX RYCHLOST ", and_then_some_more = " (%1%) A JEŠTĚ TROCHU NAVÍC ", } humanoid_name_starts = { [1] = "ZLATO", [2] = "VYSO", [3] = "A", [4] = "JOS", [5] = "BOŘ", [6] = "JAKUB", [7] = "RA", [8] = "PAV", [9] = "POD", [10] = "KRÁL", [11] = "BAR", [12] = "ZVÍ", [13] = "ČLO", [14] = "KLUK", [15] = "VAL", [16] = "MAR", [17] = "KRAB", [18] = "RYBA", [19] = "VODA", [20] = "MIL", [21] = "MI", [22] = "FER", [23] = "BOHAT", [24] = "SKOT", [25] = "BUŘ", [26] = "HROT", [27] = "CUK", [28] = "BÍL", [29] = "KAR", [30] = "BŘE", [31] = "POD", [32] = "SPRÁVN", [33] = "KEŘ", } trophy_room = { rats_accuracy = { trophies = { [1] = "Je Vám udělen Pohár Syndicate Wars Přesnosti ve Střílení za to, že jste měli %d%% přesnost při střílení krys.", [2] = "Tento pohár připomíná Vaši neuvěřitelnou přesnost při zabití %d%% krys, na které jste ve Vaší nemocnici mířili v posledním roce.", [3] = "Na oslavu události Vašeho zabití %d%% všech krys ve Vaší nemocnici, je Vám udělen Pohár Dungeon Keeper Havěti Zbavený. Blahokrysujeme!", }, }, happy_staff = { regional_bad = { [1] = "Všichni Vaši zaměstnanci byli minulý rok velmi nešťastní. Měli jste si toho všimnout. Tak jak je to teď mají všechny ostatní nemocnice zaměstnance šťastnější než Vy.", }, awards = { [1] = "Vaši zaměstnanci Vám udělují tuto cenu. Říkají, že i když je co zlepšovat, zacházeli jste s nimi vcelku dobře.", [2] = "Vaši zaměstnanci pro Vás tak rádi pracují, že se nemůžou přestat smát. Jste výborný správce.", }, regional_good = { [1] = "Vaši zaměstnanci jsou šťastnější než ti v ostatních nemocnicích. Šťastní zaměstnanci přinášejí více výdělku a méně úmrtí. Ministerstvo je potěšeno.", }, penalty = { [1] = "Vaši zaměstnanci chtějí, aby se vědělo, že jsou velmi nešťastní. Spokojení zaměstnanci jsou přínosem. Udělejte je šťastnějšími nebo je jednoho dne ztratit.", }, trophies = { [1] = "Je Vám udělen Pohár Chechtáka za udržení radosti Vašich pracovitých zaměstnanců tak, jak to jen jde.", [2] = "Adami Institut Radosti Vás oceňuje za to, že jste Ve vaší nemocnici neměli minulý rok žádné nešťastné zaměstnance, tím že Vám uděluje tento pohár.", [3] = "Toto ocenění, Pohár Více Úsměvů je Vám slavnostně udělen za to, že jste Vaše zaměstnance udrželi šťastné nad rámec Vašich povinností během minulého roku. Úsměvy všude kolem!", }, }, happy_patients = { penalty = { [1] = "Lidé přicházející do nemocnice mají otřesné zážitky. Pokud si chcete vysloužit respekt ministerstva, budete se muset mnohem více snažit.", [2] = "Lidé, dostávající ve Vaši nemocnici léčbu, jsou velmi nespokojeni se stavem tohoto místa. Blaho pacientů byste měli důkladněji zvážit.", }, awards = { [1] = "Můžete se dmout pýchou nad tím, že lidé v předchozím roce byly ve Vaší nemocnici velmi šťastní.", [2] = "Lidé navštěvující Vaši nemocnici byly během jejich léčby v průměru šťastnější než v kterékoliv jiné nemocnici ve hře.", }, }, happy_vips = { trophies = { [1] = "Vyhráli jste Nobelovu cenu za zapůsobení na VIP. Každý, kdo v minulém navštívil Vaší nemocnici, o ní pěl jen samou chválu.", [2] = "Agentura Slavných Lidí by Vám chtěla darovat Pohár Celebrity za potěšení těch, kteří navštívili Vaše zařízení. Považujte se za mírně slavného a skoro jednoho z nás.", [3] = "Blahopřejeme Vám k získání ocenění VÝLET VIP za ulehčení života těžce pracujících osobností v oku veřejnosti uspokojením těch, co Vaši nemocnici navštívili. To je výtečné.", }, }, pop_percentage = { penalty = { [1] = "Poznamenejte si, že jste v předchozím roce získali vysoký podíl obyvatel ve Vaší nemocnici města. Výborně.", [2] = "Blahopřejeme. Vaší nemocnici navštěvuje vyšší podíl místních obyvatel města než kterékoli jiné zařízení.", }, awards = { [1] = "Poznamenejte si, že jste získali vysoký podíl obyvatel města ve Vaší nemocnici v minulém roce. Výborně.", [2] = "Blahopřejeme. Vaši nemocnici navštěvuje vyšší podíl místní populace, než jakoukoli jinou instituci.", [3] = "Úžasné. Do Vaší nemocnice jste nalákali více obyvatel, než navštívilo všechny nemocnice dohromady.", }, }, rats_killed = { awards = { }, trophies = { [1] = "Byl Vám udělen Pohár Proti Havěti za zastřelení %d krys ve Vaší nemocnici během minulého roku.", [2] = "Díky Vaším výjimečným schopnostem střílení krys jste se kvalifikovali na získání tohoto poháru od Federace Proti Krysám a Myším, při zabití %d potvor.", [3] = "Kvalifikovali jste se na Pohár Odstřelení Krys za výjimečné dovednosti při zbavení %d krys ve Vaší nemocnici v minulém roce.", }, }, no_deaths = { awards = { [1] = "Obdrželi jste Ocenění Nikdo-Nechcíp za udržení 100 procent živých pacientů v posledním roce.", [2] = "Toto ocenění jste obdrželi, aby Vám připomnělo nízký počet úmrtí ve Vaší nemocnici tento rok. To je skvělé.", }, trophies = { [1] = "Společnost Život Jde Dál Vám uděluje tento pohár za zabránění jakéhokoli úmrtí v posledním roce.", [2] = "Byl Vám udělen Pohár Zůstávám Naživu, že jste zvládli se vyhnout všech možných úmrtí v posledním roce ve Vaši nemocnici. Skvělé.", [3] = "Byla Vám udělena trofej Zůstávám Naživu za to, že jste dokázali v tomto roce zabránit jakémukoliv úmrtí ve Vaši skvělé nemocnici. Výborně.", }, penalty = { [1] = "Počet smrtí Ve Vaší nemocnici byl v minulém roce na přijatelné výši. Věnujte větší pozornost Vaší práci. V budoucnu zajistěte, ať více lidí přežije.", [2] = "Vaše nemocnice je rizikem pro zdraví pacientů. Očekává se, že hodně lidí vyléčíte a ne, že je zahubíte.", }, regional = { [1] = "Počet smrtí ve Vaší nemocnici byl minulý rok nižší než v ostatních nemocnicích. Přijměte prosím tuto cenu.", }, }, healthy_plants = { awards = { [1] = "Blahopřejeme k získání ocenění Hnojiva Rosť Více za udržení neobyčejného zdraví Vašich rostlin během minulého roku.", }, trophies = { [1] = "Přátelé Pokojových Rostlin si přejí Vám udělit Zelený Pohár Zdraví za udržení všech Vašich kytek v dobrém stavu během posledních dvanácti měsíců.", [2] = "Senza Trifidi by Vám chtěli udělit Pohár Zelenéhoprstu za udržení Vašich rostlin v nemocnici v tom nejlepším možném stavu během posledního roku.", }, }, many_cured = { awards = { [1] = "Gratulujeme za vyléčení mnoha pacientů v minulém roce. Díky Vaší práci se mnoho lidí cítí dobře.", [2] = "Přijměte prosím toto ocenění za vyléčené více pacientů než kterákoli jiná nemocnice. Ryzí výkon.", }, penalty = { [1] = "Vaše nemocnice selhává v poskytnutí účinné léčby pacientům, kteří ji potřebují. Soustřeďte se na Vaše léčby, abyste zvýšili jejich účinnost.", [2] = "Vaše nemocnice je méně účinná při ošetřovaní pacientů, než kterákoliv jiná. Zklamali jste ministerstvo a zklamali jste sebe. To je vše, co jsme chtěli říct.", }, regional ={ [1] = "Slavnostně Vám udělujeme cenu Všemocného léku za vyléčení více lidí, než všechny ostatní nemocnice dohromady.", }, trophies = { [1] = "Gratulujeme k výhře Ocenění Marie Curie za úspěšné vyléčení skoro všech pacientů ve Vaší nemocnici v minulém roce.", [2] = "Mezinárodní Nadace Léčení si přeje ocenit skutečnost, že jste vyléčili ohromný počet lidí ve Vaší nemocnici minulý rok tím, že Vám udělí Pohár Hodně-Vyléčeno.", [3] = "Byl Vám darován Pohár Žádný Nemocný Řiťolezec za úspěšnou léčbu vysokého procenta pacientů ve Vaši nemocnici v minulém roce.", }, }, sold_drinks = { trophies = { [1] = "Světová Asociace Zubařů je hrdá, že Vás může ocenit touto cenou a plaketou za prodej spousty konzervovaných nápojů ve Vaší nemocnici.", [2] = "Vaše nemocnice byla oceněna Pohárem Šumivý Byznys za Prodej Nealkoholických Nápojů při uznání počtu nápojů prodaných ve Vaší nemocnici za poslední rok.", [3] = "Jménem DK Plomby a.s., je Vám udělena tato čokoládou pokrytý Pohár na oslavu neobyčejného počtu prodaných nealkoholických nápojů ve Vaší nemocnici tento rok.", }, }, gen_repairs = { penalty = { [1] = "Vaši údržbáři moc dobře Vaše stroje neudržovali. Měli byste na ně dohlédnout pečlivěji, nebo jich najmout více, aby byli schopni množství práce pojmout.", [2] = "Z údržby máte nepořádek. Vaši zaměstnanci by se o stroje měli starat rychle a s péčí.", }, awards = { [1] = "Obdrželi jste zvláštní ocenění za pohotovost Vašich údržbářů, kteří udržují stroje Vaší nemocnice v dobrém stavu. Skvělé. Můžete si vzít dovolenou.", [2] = "Vaši údržbáři si vedli lépe než ti v ostatních nemocnicích. Toto je obrovský úspěch, za který je Vám poblahopřáno.", [3] = "Vaše stroje jsou skvěle udržované. Oddanost Vašich údržbářů je výjimečná. Vy všichni si toto prestižní ocenění zasloužíte. Výtečná práce.", }, }, research = { regional_good = { [1] = "Váš výzkum Vaší nemocnice udržel krok s nejnovějšími poznatky. Vaši výzkumní zaměstnanci si tuto cenu zaslouží. Skvělé.", }, regional_bad = { [1] = "Všechny nemocnice v okolí mají lepší výzkum než Vy. Ministerstvo je rozčílené, protože výzkum by ve Vaší nemocnici měl být velmi důležitý.", }, penalty = { [1] = "Ve výzkumu nové léčby, vybavení a léků jste zaostali. To je velmi špatné, protože technologický pokrok je nezbytný.", }, awards = { [1] = "Váš výzkum Vaší nemocnice udržel krok s nejnovějšími poznatky. Vaši výzkumní zaměstnanci si tuto cenu zaslouží. Skvělé.", [2] = "Během posledního roku jste prozkoumali více léků a zařízení, než kdokoliv mohl doufat. Prosím přijměte toto ocenění od nás všech na ministerstvu.", }, }, curesvdeaths = { penalty = { [1] = "Váš poměr vyléčení k úmrtím je velmi nízký. Měli byste zajistit, že vyléčíte mnohem více lidí, než necháte zemřít. Nebuďte naší ostudou.", }, awards = { [1] = "Vydatné gratulace za dosažení úchvatného poměru vyléčení k úmrtím ve Vaší nemocnici minulý rok.", }, }, emergencies = { regional_good = { [1] = "Ministerstvo uznává, že Vaše nemocnice zvládla předešlý rok mimořádné události lépe než kterákoliv jiná nemocnice a uděluje Vám toto ocenění.", }, award = { [1] = "Blahopřejeme: Vaše efektivní a účinné zvládnutí mimořádných událostí Vám získaly toto zvláštní ocenění. Dobrá práce.", [2] = "Vaše zacházení s mimořádnými událostmi je výjimečné. Toto ocenění je za to, že jste nejlepší ve zvládání velkých návalů nemocných a trpících.", }, penalty = { [1] = "Mimořádné situace moc nezvládáte. Přicházející pacienti pohotovosti vyžadují rychlou a správnou pozornost, kterou jste nedokázali poskytnout.", }, regional_bad = { [1] = "Vaše nemocnice je ve zvládání mimořádných událostí ta nejhorší v oblasti. Je Vaší chybou, že se potácíte na konci místní ligy ošetření v mimořádných situacích.", }, }, all_cured = { awards = { [1] = "Blahopřejeme k vítězství Ocenění Marie Curie za úspěšnou léčbu všech pacientů ve Vaší nemocnici za poslední rok.", }, trophies = { [1] = "Mezinárodní Nadace Léčení si přeje ocenit skutečnost, že jste vyléčili všechny ve Vaší minulý rok tím, že Vám udělí Pohár Hodně-Vyléčeno.", [2] = "Byl Vám darován Pohár Žádný Nemocný Řiťolezec za úspěšnou léčbu všech pacientů ve Vaší nemocnici v minulém roce.", }, }, best_value_hosp = { regional = { [1] = "Blahopřejeme Vám za nejcennější nemocnici ve hře. Dobrá práce. Snažte se prosím takto pokračovat.", }, penalty = { [1] = "Každá nemocnice v oblasti má větší hodnotu než ta Vaše. Udělejte něco s touto ostudnou situací. Dejte se nějaké drahé věci!", }, trophies = { [1] = "Blahopřejeme k získání ocenění Křišťálová Lilie za nemocnici s nejlepší reputací během minulého roku. Také je velmi zasloužená.", }, }, high_rep = { penalty = { [1] = "Budete potrestáni za udržení velmi špatné reputace během minulého roku. Ujistěte se, že se to do budoucna zlepší.", [2] = "Reputace Vaší nemocnice je nejhorší v oblasti. Jste ostuda. Zlepšete ji nebo si hledejte jinou práci.", }, regional = { [1] = "Přijměte prosím Cenu Bullfrog za nejvyšší reputaci v tomto roce ze všech nemocnic. Užijte si to - zasloužili jste si ji.", [2] = "Tento rok reputace Vaší nemocnice překonala všechny ostatní v oblasti dohromady. To je významný úspěch.", }, awards = { [1] = "Výborně. Vyhráváte maličké ocenění za dosažení velmi úctyhodné reputace v posledním roce.", [2] = "Úžasné! Vaše nemocnice vyhrává cenu za vybudování nejlepší během posledního roku.", }, }, cash = "PENÍZE", reputation = "REPUTACE", consistant_rep = { trophies = { [1] = "Tímto se Vám slavnostně uděluje ocenění Kabinetu Ministra za dokonalé standardy a nejvyšší možnou reputaci tento rok. Úžasné.", [2] = "Blahopřejeme k získání ocenění Křišťálová Lilie za nemocnici s nejlepší reputací během minulého roku. Také je velmi zasloužená.", }, }, wait_times = { penalty = { [1] = "Lidé ve Vaší nemocnici musí dlouho čekat. Vždy zde existují nepřijatelné fronty. Pokud byste chtěli, mohli byste zacházet s Vašimi pacienty účinněji.", }, award = { [1] = "Gratulujeme. Vaše nemocnice soustavně má nízkou dobu ve frontě. Toto je důležité ocenění.", }, }, cleanliness = { regional_good = { [1] = "Vaše nemocnice byla uvedena jako jedna z nejméně čistých v oblasti. Špinavá nemocnice smrdí a je nebezpečná. Měli byste nepořádku věnovat větší pozornost.", }, award = { [1] = "Kontroloři si poznamenali, že Vaše nemocnice je velmi čistá. Čisté nemocnice jsou bezpečné nemocnice. Jen tak dál.", }, regional_bad = { [1] = "Vaše nemocnice je nejšpinavější v oblasti. Ostatní správci zvládli udržet svoje chodby čistší. Jste hanbou zdravotnické profese.", }, }, hosp_value = { penalty = { [1] = "Vaší nemocnici se nepodařilo dosáhnout slušné hodnoty. Provedli jste špatná rozhodnutí s penězi. Nezapomeňte, že dobrá nemocnice je také drahá nemocnice.", }, regional = { [1] = "Jste zázračné dítě přes finance. Vaše nemocnice má větší hodnotu než všechny ostatní nemocnice v oblasti dohromady.", }, awards = { [1] = "Ministerstvo zdravotnictví by chtělo využít této příležitosti a poblahopřát Vám k působivé celkové hodnotě Vaší nemocnice.", }, }, } build_room_window = { pick_room_type = "Vyberte Typ Místnosti", pick_department = "Vyberte Oddělení", cost = "Náklady: ", } object = { dna_fixer = "Spravovač DNA", op_sink1 = "Umyvadlo", litter_bomb = "Odpadková Bomba", auto_autopsy = "Auto Pitva", door = "Dveře", projector = "Projektor", radiation_shield = "Radiační štít", entrance_left = "Vchod levé dveře", operating_table = "Operační stůl", bed2 = "Postel", cabinet = "Kartotéka", console = "Konzole", bed = "Postel", couch = "Sedačka", drinks_machine = "Automat na nápoje", shower = "Sprcha", electrolyser = "Elektrolyzér", table2 = "Stůl", radiator = "Radiátor", chair = "Sedačka", jelly_moulder = "Formovač Želé", computer = "Počítač", ultrascanner = "Ultraskener", bin = "Koš", surgeon_screen = "Zástěna Chirurga", slicer = "Kráječ", bed3 = "Postel", x_ray = "Rentgen", video_game = "Video Hra", atom_analyser = "Analyzátor Atomů", inflator = "Nafukovač", toilet = "Toaleta", x_ray_viewer = "Prohlížeč snímků", cast_remover = "Odstraňovač sádry", entrance_right = "Vchod pravé dveře", litter = "Odpadek", cardio = "Kardio", plant = "Rostlina", pool_table = "Kulečníkový stůl", tv = "TV", sofa = "Pohovka", lamp = "Lampa", fire_extinguisher = "Hasicí přístroj", bench = "Sedačka", scanner = "Skener", op_sink2 = "Umyvadlo", toilet_sink = "Umyvadlo", hair_restorer = "Obnovovač vlasů", desk = "Stůl", swing_door2 = "Kyvadlové Dveře", lecture_chair = "Sedadlo posluchárny", pharmacy_cabinet = "Lékárenský kabinet", screen = "Zástěna", table1 = "Stůl", gates_of_hell = "Brány Pekla", blood_machine = "Krevní Stroj", comfortable_chair = "Pohodlné křeslo", bookcase = "Knihovna", reception_desk = "Recepce", crash_trolley = "Manipulační vozík", swing_door1 = "Kyvadlové Dveře", skeleton = "Kostlivec", } handyman_window = { all_parcels = "Všude", parcel = "Parcela", } policy = { staff_leave_rooms = "zam. opouští místnost", diag_procedure = "proces vyšetření", header = "ZÁSADY NEMOCNICE", sliders = { send_home = "POSLAT DOMŮ", guess = "HÁDAT LÉČBU", stop = "ZASTAVIT PROCES", staff_room = "JÍT SE UKLIDNIT", }, diag_termination = "ukončení diagnózy", staff_rest = "poslat zaměstnance odpočinout", } room_classes = { treatment = "Léčba", diagnosis = "Diagnóza", facilities = "Oddělení", clinics = "Kliniky", } tooltip = { folders_window = { data_location = "Adresář instalace původní hry Theme Hospital, jenž je vyžadován pro spuštění CorsixTH", no_font_specified = "Umístění písma zatím nezadáno!", browse_data = "Procházet pro jiné umístění instalace Theme Hospital. (současné umístění: %1%)", browse_font = "Procházet pro výběr jiného souboru s písmem (současné umístění: %1%)", font_location = "Umístění souboru s písmem, které je schopno zobrazit znaky Unicode vyžadované vaším jazykem. Pokud toto není zadáno, nebudete moci zvolit jazyky, které potřebují více znaků, než původní hra obsahuje. Příklad: ruština a čínština", screenshots_location = "Standardně je složka se snímky obrazovky ve stejném umístění jako soubor s nastavením. Pokud toto není žádané, pak si můžete zvolit vlastní. Stačí zvolit adresář, který chete použít.", reset_to_default = "Resetovat adresář na jeho výchozí umístění", back = "Zavřít tuto nabídku a vrátit se zpět do nabídky Nastavení", music_location = "Vyberte umístění vašich mp3 souborů s hudbou. Adresář musí být vytvořen předem a pak ho můžete zde zvolit.", savegames_location = "Standardně je adresář uložených her na stejném místě jako soubor s nastavením. Pokud toto nechcete, můžete si zvolit svůj vlastní. Stačí zvolit adresář, který chcete používat.", browse = "Procházet pro zvolení adresáře", browse_screenshots = "Procházet pro zvolení jiného umístění vašeho adresáře snímků obrazovky ( Současné umístění: %1% ) ", browse_music = "Procházet pro zvolení jiného umístění vašeho adresáře s hudbou ( Současné umístění: %1% ) ", not_specified = "Žádné umístění adresáře zatím nezadáno!", browse_saves = "Procházet pro zvolení jiného umístění vašeho adresáře uložených her ( Současné umístění: %1% ) ", default = "Výchozí umístění", }, customise_window = { aliens = "Kvůli chybějícím správným animacím standardně pacienti s Mimozemskou DNA přicházejí pouze při pohotovosti. Abyste je povolili i jako normální pacienty, stačí toto vypnout.", average_contents = "Pokud chcete, aby si hra pamatovala vámi přidané dodatečné objekty při stavbě místností, pak toto zapněte.", back = "Zavřít tuto nabídku a přejít zpět do Nastavení", movies = "Globální kontrola videí, toto umožňuje zákaz všech videí", fractured_bones = "Kvůli špatné animaci jsou standardně zakázány pacientky se Zlomenými Kostmi. Pro povolení pacientek s touto diagnózou ve vaší nemocnici musíte toto vypnout.", volume = "Pokud tlačítko pro snížení hlasitosti zároveň také otevírá Knihu léčby pacientů, můžete toto zapnout pro změnu klávesové zkratky knihy na Shift + C", intro = "Zapne nebo vypne úvodní video. Pokud chcete, aby video bylo přehráváno při každém spuštění CorsixTH, je třeba zapnout globální kontrolu videí.", paused = "V Theme Hospital může hráč použít horní nabídku pouze při pozastavení hry. To samé platí v CorsixTH, ale pomocí této volby můžete při pozastavení povolit vše.", }, options_window = { language = "Vybrat %s jako jazyk", language_dropdown_item = "Zvolit %s jako jazyk", width = "Zadejte požadovanou šířku obrazovky", select_language = "Vybrat jazyk hry", select_resolution = "Vybrat nové rozlišení", back = "Zavřít okno možností", resolution = "Rozlišení v kterém by hra měla být spuštěna", fullscreen = "Zdali má být hra spuštěna v režimu v okně nebo celé obrazovky", fullscreen_button = "Klikněte pro přepnutí režimu celé obrazovky", change_resolution = "Změnit rozlišení okna na rozměry zadané vlevo", apply = "Použít zadané rozlišení", cancel = "Vrátit se zpět bez změny rozlišení", height = "Zadejte požadovanou výšku obrazovky", audio_button = "Zapnout nebo vypnout všechny zvuky ve hře", audio_toggle = "Zapnout/vypnout", folder_button = "Možnosti složky", customise_button = "Další nastavení, pomocí kterých si můžete svoji hru přizpůsobit", }, update_window = { download = "Přejít na stránku stahování pro získání nejnovější verze CorsixTH", ignore = "Zatím si této aktualizace nevšímat. Při příštím spuštění CorsixTH budete znovu informováni.", }, information = { close = "Zavřít informační dialogové okno", }, menu_list_window = { save_date = "Klikněte zde pro seřazení seznamu podle posledního data změny", name = "Klikněte zde pro seřazení seznamu podle názvu", back = "Zavřít toto okno", }, cheats_window = { close = "Zavřít dialogové okno cheatů", cheats = { lose_level = "Prohrát současnou úroveň.", emergency = "Vytvoří havárii.", end_year = "Přeskočí na konec roku.", earthquake = "Vytvoří zemětřesení.", money = "Přidá 10.000 na Váš bankovní účet.", win_level = "Vyhrát současnou úroveň.", vip = "Vytvoří VIP.", all_research = "Dokončí veškerý výzkum.", create_patient = "Vytvoří Pacienta na kraji mapy.", end_month = "Přeskočí na konec měsíce.", epidemic = "Vytvoří nakažlivého pacienta, který může způsobit epidemii", toggle_infected = "Zobrazí/Skryje ikony nakažení pro aktivní, zjištěné epidemie", }, }, buy_objects_window = { price = "Cena položky", cancel = "Zrušit", confirm = "Koupit položku/y", total_value = "Celková hodnota objednaných položek", decrease = "Koupit o jednu položku méně", increase = "Koupit o jednu položku více", }, custom_game_window = { free_build = "Toto políčko zaškrtněte, pokud chcete hrát bez peněz a podmínek pro vítězství a prohru", load_selected_level = "Načíst a hrát zvolenou úroveň", choose_game = "Klikněte na úroveň pro zobrazení informací o ní.", }, new_game_window = { easy = "Pokud jste začátečníci v simulačních hrách, tak toto je volba pro Vás", cancel = "Ah, Já vlastně nechtěl začít novou hru!", difficulty = "Vyberte úroveň obtížnosti s kterou chcete hru hrát", tutorial = "Pokud chcete se začátkem jednou pomoci, stiskněte toto tlačítko.", hard = "Pokud tento druh hry znáte a chcete výzvu, tak si vyberte tuto volbu", medium = "Toto je střední cesta, když nevíte, co si vybrat", player_name = "Zadejte jméno kterým chcete být ve hře oslovováni.", start = "Zahájit hru se zvolenými možnostmi", }, machine_window = { close = "Zrušit žadatele", replace = "Vyměnit hardware", status = "Stav hardwaru", repair = "Zavolat Údržbáře, aby hardware opravil", name = "Název", times_used = "Počet použití hardwaru", }, calls_dispatcher = { close = "Zavřít dialogové okno rozvrhovače volání", task = "Seznam úkolů - klikněte na úkol pro otevření okna přiděleného zaměstnance a přejděte na místo úkolu", assigned = "Tento rámeček je označen, když je někomu úkol přidělen.", }, staff_window = { happiness = "Úroveň radosti", salary = "Měsíční plat", doctor_seniority = "Hodnost - Rezident, Doktor nebo Konzultant", skills = "Zvláštní dovednosti", tiredness = "Úroveň únavy", name = "Jméno zaměstnance", psychiatrist = "Psychiatr", close = "Zrušit žadatele", face = "Tvář této osoby - klikněte pro otevření obrazovky správy", pick_up = "Zvednout", center_view = "Levým kliknutím se přiblížíte na zaměstnance, pravým kliknutím mezi nimi přepínáte", researcher = "Výzkumník", sack = "Vykopnout", surgeon = "Chirurg", ability = "Úroveň schopnosti", }, town_map = { people = "Přepnout lidi", fire_extinguishers = "Přepnout požární hydranty", plants = "Přepnout rostliny", heat_inc = "Zvýšit teplo", balance = "Bilance", heat_level = "Úroveň tepla", objects = "Přepnout objekty", radiators = "Přepnout radiátory", heat_dec = "Snížit teplo", close = "Odejít ze zobrazení města", heating_bill = "Účet za topení", }, casebook = { cure_type = { surgery = "Tato nemoc vyžaduje operaci", drug_percentage = "Tato léčba používá lék - Váš je účinný na %d%%", drug = "Tato léčba použije lék", machine = "Tato léčba vyžaduje přístroj", unknown = "Stále nevíte jak léčit tuto nemoc", psychiatrist = "Psychiatr provádí tuto léčbu", }, cured = "Počet vyléčení", reputation = "Lék nebo Reputace Vyšetření", down = "Posunout dolů", research = "Klikněte zde k použití rozpočtu Výzkumu Specializací pro tuto léčbu", sent_home = "Počet odmítnutých pacientů", close = "Zavřít Knihu léčby pacientů", up = "Posunout nahoru", deaths = "Počet úmrtí", earned_money = "Dosud vyděláno", increase = "Zvýšit množství", decrease = "Snížit množství", cure_requirement = { hire_surgeons = "K provádění operací potřebujete zaměstnat dva chirurgy", not_possible = "Tuto léčbu ještě nezvládáte", hire_staff_old = "Ke zvládnutí této léčby potřebujete zaměstnat %s", hire_staff = "Ke zvládnutí této léčby potřebujete přijmout zaměstnance", hire_surgeon = "K provedení operace potřebujete zaměstnat druhého chirurga", build_room = "Ke zvládnutí této léčby potřebujete vybudovat místnost", build_ward = "Ke zvládnutí této léčby potřebujete vybudovat Nemocniční pokoj", ward_hire_nurse = "Ke zvládnutí této léčby potřebujete Sestru v Nemocničním pokoji", possible = "Tuto léčbu můžete zvládnout", research_machine = "Pro tuto léčbu potřebujete vynalézt nějaké nástroje", }, treatment_charge = "Poplatek", }, hire_staff_window = { qualifications = "Další Kvalifikace Doktora", salary = "Plat", receptionists = "Zobrazit Recepční k dispozici pro najmutí", prev_person = "Zobrazit předchozí osobu", psychiatrist = "Psychiatr", nurses = "Zobrazit Sestry k dispozici pro najmutí", doctors = "Zobrazit Doktory k dispozici pro najmutí", doctor_seniority = "Služební věk Doktora (Rezident, Doktor, Konzultant)", cancel = "Zrušit", staff_ability = "Schopnost zaměstnance", next_person = "Zobrazit další osobu", researcher = "Výzkumník", handymen = "Zobrazit Údržbáře k dispozici pro najmutí", surgeon = "Chirurg", hire = "Najmout osobu", }, toolbar = { charts = "Grafy", policy = "Zásady", objects = "Zařídit chodby", status = "Stav", reputation = "Vaše reputace", research = "Výzkum", bank_button = "Levé Kliknutí pro Správce Banky, Pravé Kliknutí pro Bankovní Výpis", rooms = "Postavit místnosti", town_map = "Mapa města", casebook = "Kniha léčby pacientů", edit = "Upravit místnosti/položky", date = "Datum", staff_list = "Správa zaměstnanců", balance = "Vaše bilance", hire = "Najmout zaměstnance", }, main_menu = { load_game = "Načíst uloženou hru", options = "Upravit různá nastavení", load_menu = { load_slot = "NAČÍST HRU", empty_slot = "PRÁZDNÉ", }, new_game = "Začít novou hru úplně od začátku", continue = "Pokračovat v předchozí hře", custom_level = "Postavit Vaší nemocnici ve vlastní úrovni", network = "Spustit hru po síti", exit = "Ne, ne, prosím neodcházejte!", quit = "Odejít", custom_campaign = "Hrát komunitou vytvořenou kampaň", map_edit = "Vytvořit vlastní mapu", }, queue_window = { num_expected = "Počet pacientů, u kterých Recepční očekává, že se brzy připojí do fronty", dec_queue_size = "Zmenšení maximální velikosti fronty", num_entered = "Počet pacientů, kteří byli doposud v této místnosti léčeni", num_in_queue = "Počet pacientů ve frontě", close = "Zavřít tohoto žadatele", patient = "Táhněte pacientem pro jeho přesun pozicemi ve frontě. Pravým kliknutím na pacienta ho pošlete domů nebo odkážete do konkurenční nemocnice", max_queue_size = "Maximální velikost fronty, kterou by Recepční měla dovolit", inc_queue_size = "Zvětšení maximální velikosti fronty", front_of_queue = "Přetáhněte pacienta na tuto ikonu pro přesun na začátek fronty", end_of_queue = "Přetáhněte pacienta na tuto ikonu pro přesun na konec fronty", patient_dropdown = { send_home = "Propustit pacienta z nemocnice", hospital_3 = "Odkázat pacienta do jiné nemocnice", reception = "Poslat pacienta k Recepční", hospital_2 = "Odkázat pacienta do jiné nemocnice", hospital_1 = "Odkázat pacienta do jiné nemocnice", }, }, load_game_window = { load_game_number = "Načíst hru %d", load_game = "Načíst hru %s", load_autosave = "Načíst automaticky uloženou hru", }, statement = { close = "Zavřít obrazovku Výpisu", }, graphs = { scale = "Měřítko grafu", reputation = "Přepnout Hodnotu Nemocnice", cures = "Přepnout vyléčení", close = "Zavřít Obrazovku Grafů", wages = "Přepnout výplaty", deaths = "Přepnout úmrtí", balance = "Přepnout bilanci", money_in = "Přepnout příjmy", money_out = "Přepnout výdaje", visitors = "Přepnout návštěvníky", }, totd_window = { previous = "Zobrazit předchozí radu", next = "Zobrazit další radu", }, fax = { close = "Zavřít toto okno bez vymazání zprávy", }, save_game_window = { save_game = "Přepsat uloženou hru %s", new_save_game = "Zadejte jméno pro novou uloženou hru", }, pay_rise_window = { accept = "Splnit platový požadavek", decline = "Neplatit - místo toho je vykopnout", }, jukebox = { close = "Zavřít jukebox", fast_forward = "Rychle dopředu", rewind = "Přetočit", current_title = "Jukebox", play = "Přehrát", stop = "Zastavit", loop = "Přehrávat ve smyčce", }, handyman_window = { happiness = "Radost", salary = "Plat", prio_machines = "Zvýšit Údržbářovu prioritu opravy přístrojů", tiredness = "Únava", sack = "Vykopnout", close = "Zrušit žadatele", name = "Jméno údržbáře", pick_up = "Zvednout", prio_litter = "Zvýšit Údržbářovu prioritu zametání odpadků", center_view = "Přiblížit na Údržbáře", prio_plants = "Zvýšit Údržbářovu prioritu zalévání rostlin", face = "Tvář údržbáře", ability = "Schopnost", parcel_select = "Parcela, kde údržbář přijímá úkoly. Klikněte pro změnu nastavení" }, watch = { hospital_opening = "Čas pro stavbu: toto je zbývající čas, než je Vaše nemocnice prohlášena za otevřenou. Kliknutím na zelené tlačítko ji otevře okamžitě.", epidemic = "Epidemie: čas zbývající pro ututlání epidemie. Když tento čas vyprší NEBO nakažený pacient odejde z Vaší nemocnice, navštíví Vás Hygienický Inspektor. Tlačítko vypíná a zapíná režim očkování. Klikněte na pacienta, aby ho Sestra očkovala.", emergency = "Pohotovost: zbývající čas do vyléčení všech pacientů pohotovosti.", }, policy = { close = "Zavřít obrazovku zásad", staff_leave = "Klikněte zde, aby zaměstnanci, kteří nemají nic na práci, pomohli kolegům, kteří to potřebují", staff_stay = "Klikněte zde, aby určití zaměstnanci zůstali tam, kde je umístíte", staff_rest = "Jak moc musí být zaměstnanci unavení, než si můžou odpočinout", diag_termination = "Vyšetření pacienta bude pokračovat, dokud si nebudou Doktoři tak jistí, jako je procento ZASTAVENÍ PROCEDURY, nebo dokud nebudou vyzkoušeny všechny diagnostické přístroje", diag_procedure = "Pokud je procento Doktorovy diagnózy nižší, než procento POSLAT DOMŮ, pacient bude poslán domů. Pokud je diagnóźa lepší než procento HÁDAT LÉČBU, pacient bude poslán na příslušnou léčbu", }, research_policy = { research_progress = "Vývoj směrem k dalšímu objevu v této kategorii: %1%/%2%", no_research = "V této kategorii nyní žádný výzkum neprobíhá", }, status = { happiness = "Celková radost lidí ve Vaší nemocnici", thirst = "Celková úroveň žízně lidí ve Vaší nemocnici", reputation = "Vaše Reputace musí být alespoň %d. Nyní je %d", population = "Potřebujete, aby %d%% celkové populace chodilo do Vaší nemocnice", population_chart = "Graf zobrazující jakou část místní populace každá nemocnice přitahuje", num_cured = "Tento úkol je vyléčit %d lidí. Dosud jste vyléčili %d", close = "Zavřít obrazovku Přehledu", balance = "Vaše bankovní bilance musí být alespoň %d. Nyní je %d", win_progress_other = "Zobrazit postup směrem ke kritériu výhry pro %s", value = "Vaše nemocnice musí mít cenu %d€. V současnosti má cenu %d€", win_progress_own = "Zobrazit postup směrem ke kritériu výhry pro Vaší vlastní nemocnici", warmth = "Celková úroveň tepla lidí ve Vaší nemocnici", percentage_killed = "Tento úkol je zabít méně než %d%% Vašich návštěvníků. Dosud jste zabili %d%% z nich", percentage_cured = "Potřebujete vyléčit %d%% návštěvníků Vaší nemocnice. Nyní jste vyléčili %d%%", }, patient_window = { happiness = "Radost osoby", thirst = "Jak moc má osoba žízeň", queue = "Zobrazit podrobnosti fronty této osoby", abort_diagnosis = "Poslat osobu na léčbu hned místo čekání na dokončení vyšetření", close = "Zrušit žadatele", casebook = "Zobrazit podrobnosti o nemoci této osoby", warmth = "Úroveň tepla této osoby", graph = "Klikněte pro přepínání mezi grafem zdraví osoby a jejich historií vyšetření", send_home = "Propustit pacienta z nemocnice", center_view = "Přiblížit hru na osobu", }, message = { button_dismiss = "Levým kliknutím si zprávu přečtete, pravým kliknutím jí hodíte pod stůl", button = "Levým kliknutím zprávu otevřete", }, build_room_window = { room_classes = { treatment = "Vybrat místnosti Obecného Vyšetření", clinic = "Vybrat místnosti Specializovaných Oddělení", facilities = "Vybrat místnosti Specializovaných Zařízení", diagnosis = "Vybrat místnosti pro Diagnózu", }, close = "Zrušit tohoto žadatele a navrátit se do hry", cost = "Cena Vaší současně zvolené místnosti", }, rooms = { dna_fixer = "Doktor používá Místnost Spravovače DNA pro léčbu pacientů s Mimozemskou DNA", gps_office = "Pacienti obdrží jejich úvodní konzultaci a výsledky v Kanceláři Praktického Lékaře", toilets = "Postavte Toalety, abyste zabránili Pacientům dělat ve Vaší nemocnici bordel!", general_diag = "Doktor používá místnost Obecného Vyšetření pro základní vyšetření pacientů. Levné a často velmi účinné", hair_restoration = "Doktor používá Místnost Obnovovače Vlasů pro léčbu Plešatosti", scanner = "Doktor používá Skener k vyšetření Pacientů", research_room = "Doktoři s Výzkumnými dovednostmi můžou objevit nové léky a přístroje ve Výzkumné Místnosti", cardiogram = "Doktor používá Místnost s Kardiem k vyšetření Pacientů", ward = "Nemocniční pokoje jsou užitečné jak pro vyšetření, tak i pro léčbu. Pacienti jsou sem posláni pro pozorování a také pro zotavení z operace do nemocničního pokoje se Sestrou", psychiatry = "Psychiatrie léčí šílené pacienty a pomáhá v diagnóze ostatních pacientů, ale vyžaduje Doktora s Psychiatrickou dovedností", staffroom = "Doktoři a Sestry si v místnosti pro zaměstnance odpočinou a nebudou tak unaveni", electrolysis = "Doktor používá místnost Elektrolýzy k léčbě Vlasoitidy", jelly_vat = "Doktor používá Želé Nádrž k léčbě Želitidy", x_ray = "Doktor používá Rentgen k vyšetření Pacientů", inflation = "Doktor používá Nafukovárnu k léčbě Pacientů s Nafouknutými Hlavami", ultrascan = "Doktor používá Ultrasken k vyšetření Pacientů", blood_machine = "Doktor používá Krevní Stroj k vyšetření Pacientů", tongue_clinic = "Doktor používá Místnost Sekáčku Jazyka k léčbě Ochablého Jazyka", fracture_clinic = "Sestra používá Oddělení Fraktur pro spravení Zlomených Kostí", training_room = "Výuková místnost s Konzultantem může být použita k výuce jiných Doktorů", decontamination = "Doktor používá Dekontaminační Sprchu k léčbě Radioaktivity", pharmacy = "Sestra v Lékárně rozděluje léky k léčbě pacientů", operating_theatre = "Operační Sál potřebuje dva Doktory s chirurgickými dovednostmi", }, bank_manager = { interest_payment = "Měsíční splátka úroků", borrow_5000 = "Půjčit si 5000€ od banky", current_loan = "Současné nevyřízené půjčky", repay_5000 = "Splatit 5000€ bance", hospital_value = "Současná hodnota vaší nemocnice", show_graph = "Zobrazit graf očekáváných plateb od %s", insurance_owed = "Množství peněz, které Vám dluží %s", graph = "Graf očekávaných plateb od %s", inflation_rate = "Roční míra inflace", graph_return = "Vrátit se k předchozímu zobrazení", interest_rate = "Roční úroková míra", close = "Zavřít obrazovku Správce Banky", balance = "Vaše bankovní bilance", }, window_general = { cancel = "Zrušit", confirm = "Potvrdit", }, research = { cure_dec = "Snížit procento Léčby", drugs_inc = "Zvýšit procento výzkumu Léků", diagnosis_dec = "Snížit procento Výzkumu", improvements_inc = "Zvýšit procento Vylepšení", drugs_dec = "Snížit procento Léků", diagnosis_inc = "Zvýšit procento výzkumu Vybavení", close = "Zavřít obrazovku Výzkumu", specialisation_inc = "Zvýšit procento Mimořádného Výzkumu", improvements_dec = "Snížit procento Vylepšení", cure_inc = "Zvýšit procento Výzkumu", specialisation_dec = "Snížit procento Mimořádného Výzkumu", allocated_amount = "Množství přiděleného rozpočtu", }, lua_console = { close = "Zavřít konzoli", textbox = "Zde zejte kód Lua pro spuštění", execute_code = "Spustit k=od, který jste zadali", }, place_objects_window = { pick_up = "Zvednout objekt", cancel = "Zrušit", buy_sell = "Koupit/prodat objekty", confirm = "Potvrdit", }, staff_list = { happiness = "Zobrazuje, jak moc jsou zaměstnanci spokojení", researcher_train = "Na %d%% vyškolen pro to, aby se stal Výzkumníkem", ability_2 = "Úroveň schopnosti zaměstnance", surgeon_train = "Na %d%% vyškolen pro to, aby se stal Chirurgem", tiredness = "Zobrazuje, jak moc jsou zaměstnanci unavení", psychiatrist = "Kvalifikovaný Psychiatr", sack = "Vykopnout tuto osobu", next_person = "Zobrazit další stránku", researcher = "Kvalifikovaný Výzkumník", handymen = "Zobrazit seznam Údržbářů zaměstnaných v této nemocnici", surgeon = "Kvalifikovaný Chirurg", ability = "Zobrazí úroveň schopnosti těchto zaměstnanců", salary = "Současný plat této osoby", skills = "Zvláštní dovednosti", happiness_2 = "Morálka Zaměstnance", prev_person = "Zobrazit předchozí stránku", tiredness_2 = "Únava Zaměstnance", nurses = "Zobrazit seznam Sester zaměstnaných v této nemocnici", doctors = "Zobrazit seznam Doktorů zaměstnaných v této nemocnici", close = "Odejít a navrátit se do hry", bonus = "Zaplatit této osobě 10% bonus", pay_rise = "Zvýšit plat této osoby o 10%", doctor_seniority = "Služební věk doktora", detail = "Důraz na Detail", view_staff = "Zobrazit osobu při práci", psychiatrist_train = "Na %d%% vyškolen pro to, aby se stal Psychiatrem", receptionists = "Zobrazit seznam Recepčních zaměstnaných v této nemocnici", }, objects = { dna_fixer = "23 OB_DNA_FIXER", op_sink1 = "33 OB_OP_SINK_1", litter_bomb = "Odpadková bomba: poškozuje nemocnice konkurenta", auto_autopsy = "Pitva: velmi pomáhá v objevování nových léčeb", door = "Dveře: lidé tyto hodně zavírají a otevírají.", projector = "37 OB_PROJECTOR", radiation_shield = "28 OB_RAD_SHIELD", entrance_left = "58 OB_ENT_LDOOR", operating_table = "30 OB_OP_TABLE", bed2 = "nepoužito", cabinet = "Kartoték: obsahuje složky pacientů, poznámky a dokumenty výzkumu.", console = "15 OB_SCANNER_CONSOLE", bed = "Postel: hodně nemocní lidé na těchto leží.", couch = "18 OB_COUCH", drinks_machine = "Automat na Nápoje: zabraňuje žízni pacientů a poskytuje výdělek.", shower = "54 OB_DECON_SHOWER", electrolyser = "46 OB_ELECTRO", table2 = "12 OB_BTABLE", radiator = "Radiátor: zabraňuje, aby ve vaší nemocnici byla zima.", chair = "Židle: pacienti na tomto sedí a povídají o svých nemocech.", jelly_moulder = "47 OB_JELLY_VAT", computer = "Počítač: klíčová součást výzkumu", ultrascanner = "22 OB_ULTRASCAN", bin = "Koš: pacienty sem dávají své odpadky.", surgeon_screen = "35 OB_SURGEON_SCREEN", slicer = "26 OB_SLICER", bed3 = "nepoužito", x_ray = "27 OB_XRAY", video_game = "Video hra: Nechte vaše zaměstnance odpočinout při Vysokém Oktanu.", atom_analyser = "Chemický mixér: umístěn ve výzkumném oddělení, tento stroj zrychlí celý výzkumný proces.", inflator = "Nafukovač: léčí lidi s Nafouknutou Hlavou.", toilet = "Záchod: pacienti, eh, toto používají.", x_ray_viewer = "29 OB_XRAY_VIEWER", cast_remover = "24 OB_CAST_REMOVE", entrance_right = "59 OB_ENT_RDOOR", litter = "Odpadek: Ponechán na zemi pacientem, protože nenalezl koš, do kterého by ho mohl hodit.", cardio = "13 OB_CARDIO", plant = "Rostlina: udržuje pacienty spokojené a čistí vzduch.", pool_table = "Kulečníkový stůl: pomáhá odpočinout vašim zaměstnancům.", tv = "TV: zajistěte, aby zaměstnanci nezmeškali jejich oblíbené programy.", sofa = "Pohovka: Zaměstnanci odpočívající v Místnosti pro Zaměstnance budou tiše sedět na pohovce, ledaže by existoval lepší způsob, jak si odpočinout.", lamp = "Lampa: září světlo a umožňuje zaměstnanci vidět.", fire_extinguisher = "Hasicí přístroj: zmenšuje nebezpečí od selhávajících přístrojů.", bench = "Sedačka: poskytuje sezení pro jednoho pacienta, dělá čekání pohodlnější.", scanner = "14 OB_SCANNER", op_sink2 = "34 OB_OP_SINK_2", toilet_sink = "Umyvadlo: Vaši pacienti více uvědomělí v hygieně si můžou v tomto umýt své zašpiněné ruce. Pokud není dostatek umyvadel, pacienti budou nespokojení.", hair_restorer = "25 OB_HAIR_RESTORER", desk = "Stůl: důležitý pro Doktora, aby si na něj mohl dát PC.", swing_door2 = "53 OB_DOUBLE_DOOR2", lecture_chair = "Přednášková židle: Vaši školící se Doktoři zde sedí a píšou si poznámky, nudí se a jen tak si čmárají. Čím více židlí umístíte, tím větší může vaše třída být.", pharmacy_cabinet = "Lékárna: kde jsou léky uchovávány", screen = "16 OB_SCREEN", table1 = "Stůl (ODSTRANĚNO): obsahuje kolekci časopisů, aby udržovaly čekající pacienty spokojené.", gates_of_hell = "48 OB_HELL", blood_machine = "42 OB_BLOOD_MC", comfortable_chair = "61 OB_COMFY_CHAIR", bookcase = "Knihovna: materiál k nahlédnutí pro Doktory.", reception_desk = "Recepce: vyžaduje Recepční, která posílá pacienty k Doktorům.", crash_trolley = "20 OB_CRASH", swing_door1 = "52 OB_DOUBLE_DOOR1", skeleton = "Kostlivec: používán ke cvičebním účelům a na Halloween.", }, custom_campaign_window = { choose_campaign = "Zvolte kampaň pro zobrazení informací o ní.", start_selected_campaign = "Načte první úroveň kampaně", }, save_map_window = { map = "Přepsat mapu %s", new_map = "Zadejte název uložené hry s mapou", }, } humanoid_name_ends = { [1] = "KOVÁŘ", [2] = "KNOT", [3] = "ÚTES", [4] = "FIN", [5] = "SNOB", [6] = "KOPEJ", [7] = "TUNA", [8] = "SYN", [9] = "LADA", [10] = "PLOD", [11] = "STROM", [12] = "LOK", [13] = "ŠUNKA", [14] = "PRÁH", [15] = "VÝHR", [16] = "PECH", [17] = "ŠVÉD", [18] = "KUNA", [19] = "POND", [20] = "MUŽ", [21] = "MĚLTO", [22] = "E", [23] = "VÍCE", [24] = "BAŽINA", [25] = "NECH", [26] = "ČIN", } place_objects_window = { drag_blueprint = "Táhněte návrh, dokud nebude spokojeni s jeho velikostí", place_objects = "Umístěte objekty a přesunujte je, dokud nebudete spokojení, pak potvrďte", place_objects_in_corridor = "Umístěte objekty na chodbě", place_door = "Umístěte dveře", pick_up_object = "Klikněte na objekt pro zvednutí, nebo vyberte jinou možnost z žadatele", confirm_or_buy_objects = "Může místnost potvrdit, nebo koupit či přesunout nějaké objekty", place_windows = "Umístěte okna, pokud chcete, pak klikněte na potvrdit", } transactions = { cure = "Léčba", eoy_bonus_penalty = "Bonus/Penalizace na konci roku", wages = "Platy", machine_replacement = "Cena Náhradního Přístroje", cheat = "Peníze pomocí cheatu", bank_loan = "Půjčka Banky", build_room = "Stavba Místnosti", research = "Náklady Výzkumu", general_bonus = "Platba Obecného Bonusu", heating = "Náklady za Vytápění", buy_object = "Koupě Objektu", cure_colon = "Léčba:", emergency_bonus = "Platba Bonusu z Havárie", epidemy_coverup_fine = "Pokuta za Ututlání Epidemie", research_bonus = "Bonus Výzkumu", buy_land = "Koupě Pozemku", final_treat_colon = "Konečná Léčba:", drug_cost = "Cena Léku", personal_bonus = "Vyplacení Osobního Bonusu", severance = "Odškodné", jukebox = "Příjem: Jukebox", drinks = "Příjem: Automaty na Nápoje", vaccination = "Očkování", insurance_colon = "Pojištění:", epidemy_fine = "Pokuta za Epidemii", deposit = "Záloha za Léčbu", compensation = "Odškodné Vlády", loan_interest = "Úrok z Půjčky", sell_object = "Prodej Objektu", vip_award = "Peněžní Odměna od VIP", treat_colon = "Léčba:", loan_repayment = "Splacení Půjčky", eoy_trophy_bonus = "Bonus z Cen na konci roku", advance_colon = "Pokrok:", hire_staff = "Najmutí zaměstnanců", overdraft = "Úrok z Přečerpání", } diseases = { jellyitis = { cure = "Léčba - Pacient je na chvíli ponořen do Želé Nádrže ve speciální místnosti.", cause = "Příčina - strava bohatá na želé a příliš mnoho pohybu.", name = "Želitida", symptoms = "Příznaky - nadměrný třes a časté padání.", }, hairyitis = { cure = "Léčba - Elektrolytický přístroj odstraní vlasy a uzavře póry.", cause = "Příčina - Dlouhodobé vystavení měsíci.", name = "Vlasoitida", symptoms = "Příznaky - trpící pocítí zlepšený čich.", }, golf_stones = { cure = "Léčba - Kameny musí být odstraněny pomocí operace vyžadující dva Chirurgy.", cause = "Příčina - vystavení se jedovatému plynu uvnitř golfových míčků.", name = "Golfové Kameny", symptoms = "Symptomy - blouznění a pokročilý stud.", }, discrete_itching = { cure = "Léčba - Pacient vypije lékárnický lepkavý sirup k zabránění svědění kůže.", cause = "Příčina - malý hmyz s ostrými zuby.", name = "Diskrétní Svědění", symptoms = "Příznaky - škrábání, vedoucí k zánětu části těla.", }, serious_radiation = { cure = "Léčba - Pacient musí být umístěn do Dekontaminační Sprchy a pořádně vyčištěn.", cause = "Příčina - záměna izotopů plutonia za žvýkačku.", name = "Vážná Radiace", symptoms = "Příznaky - pacienti s touto nemocí se cítí velmi, velmi mizerně.", }, broken_wind = { cure = "Léčba - hustá směs speciálních vodních atomů je v Lékárně rychle vypita.", cause = "Příčina - použití šlapacího mlýnu v tělocvičně po jídle.", name = "Dušnost", symptoms = "Příznaky - zneklidnění lidí přímo za pacientem.", }, ruptured_nodules = { cure = "Léčba - Dva kvalifikovaní Chirurgové musí uzliny odstranit použitím pevných rukou.", cause = "Příčina - bungee jumping za studeného počasí.", name = "Roztržené Uzliny", symptoms = "Příznaky - neschopnost si pohodlně sednout.", }, invisibility = { cure = "Léčba - Barevná tekutina vypitá v Lékárně brzo pacienta obnoví do plné pozorovatelnosti.", cause = "Příčina - kousnutí radioaktivním (a neviditelným) mravencem.", name = "Neviditelnost", symptoms = "Příznaky - pacienti netrpí žádnou újmou. Ba někteří používají tuto nemoc k uskutečnění kanadských žertíků na své známé.", }, infectious_laughter = { cure = "Léčba - Kvalifikovaný Psychiatr musí pacientovi připomenout, jak závažná tato nemoc je.", cause = "Příčina - klasická situační komedie.", name = "Nakažlivý Smích", symptoms = "Příznaky - bezmocné potlačování smíchu a opakování nevtipných frází.", }, diag_blood_machine = { name = "Vyše Krevní Stroj", }, general_practice = { name = "Praxe Praktického Lékaře", }, fractured_bones = { cure = "Léčba - Je nastavena sádra, pak odstraněna použitím odstraňovacího přístroje řízeného laserem.", cause = "Příčina - padání z vysokých věcí na beton.", name = "Zlomené Kosti", symptoms = "Příznaky - hlasité křupnutí a neschopnost použít zasažené končetiny.", }, corrugated_ankles = { cure = "Léčba - Trošku jedovatá směs bylin a koření je vypita k posílení kloubů.", cause = "Příčina - přejíždění opatření ke zklidnění dopravy na silnici.", name = "Zvlněné Klouby", symptoms = "Příznaky - Obuv není nasazena pohodlně.", }, diag_psych = { name = "Vyše Psychiatr", }, sweaty_palms = { cure = "Léčba - Psychiatr musí pacientovi tuto vymyšlenou chorobu rozmluvit.", cause = "Příčina - strach z pracovních pohovorů.", name = "Zpocené Dlaně", symptoms = "Příznaky - potřes rukou s pacientem je jako uchytit nedávno ponořenou houbu.", }, diag_x_ray = { name = "Vyše Rentgen", }, diag_ward = { name = "Vyše Nemocniční Pokoj", }, slack_tongue = { cure = "Léčba - Jazyk je umístěn do Sekáčku a je rychle, účinně a bezbolestně odstraněn.", cause = "Příčina - věčné diskutování o televizních seriálech.", name = "Ochablý Jazyk", symptoms = "Příznaky - Jazyk se nafoukne do pětinásobku své původní délky.", }, sleeping_illness = { cure = "Léčba - Sestra podá vysokou dávku silného stimulantu.", cause = "Příčina - abnormálně aktivní žláza spanku v patře úst.", name = "Spánková Choroba", symptoms = "Příznaky - Nepřekonatelná touha se všude vyspat.", }, uncommon_cold = { cure = "Léčba - Velký doušek medicíny proti Neobyčejnému Nachlazení vytvořená ze speciálních přísad v Lékárně nemoc vyléčí.", cause = "Příčina - malé částečky nosního hlenu ve vzduchu.", name = "Neobyčejné Nachlazení", symptoms = "Příznaky - rýma, kýchání a odbarvené plíce.", }, transparency = { cure = "Léčba - Lékárenský nápoj ze speciálně zchlazené a obarvené vody tuto nemoc vyléčí.", cause = "Příčina - lízání jogurtu z krycí folie otevřených víček.", name = "Průhlednost", symptoms = "Příznaky - tělo je učiněno průhledným a hrůzostrašným.", }, diag_cardiogram = { name = "Vyše Kardio", }, diag_general_diag = { name = "Vyše Obecné", }, spare_ribs = { cure = "Léčba - Žebra musí být vyňata dvěma Chirurgy a dána pacientovi v sáčku.", cause = "Příčina - sezení na studených kamenných podlahách.", name = "Nadbytečná Žebra", symptoms = "Příznaky - nepříjemný pocit nafouknutí.", }, the_squits = { cure = "Léčba - Lepkavá směs vláknitých lékárenských chemikálií zpevní pacientovy vnitřnosti.", cause = "Příčina - jedení pizzy nalezené za sporákem.", name = "Hnačka", symptoms = "Příznaky - ehm. Tohle jistě víte.", }, broken_heart = { cure = "Léčba - Dva Chirurgové otevřou hrudník a, zadržujíce dech, něžně srdce spraví.", cause = "Příčina - někdo bohatší, mladší a štíhlejší než pacient.", name = "Zlomené Srdce", symptoms = "Příznaky - pláč a zranění z opakované námahy způsobené hodinami trhání fotek z dovolené.", }, baldness = { cure = "Léčba - Vlasy jsou uceleně sloučeny s hlavou pacienta použitím tohoto bolestivého přístroje.", cause = "Příčina - lhaní a vymýšlení příběhů pro zvýšení popularity.", name = "Plešatost", symptoms = "Příznaky - lesklá hlava a rozpaky.", }, bloaty_head = { cure = "Léčba - Nafouknutá hlava se praskne, pak je znovu nafouknuta na správný tlak použitím chytrého přístroje.", cause = "Příčina - čichání sýra a pití nevyčištěné dešťové vody.", name = "Nafouknutá Hlava", symptoms = "Příznaky - velmi nepohodlné pro nemocného.", }, gut_rot = { cure = "Léčba - Sestra může podat výběr rozpuštěných chemikálií k pokrytí žaludku.", cause = "Příčina - Whisky Sirup Proti Kašli Dobrých Časů Paní O'Malleyové.", name = "Shnilé Vnitřnosti", symptoms = "Příznaky - žádný kašel, ale také žádná pokrývka stěny žaludku.", }, iron_lungs = { cure = "Léčba - Dva Chirurgové na Operačním Sále operací odstraní plíce pevné jako sádra.", cause = "Příčina - smog v centru města smíchaný s pozůstatky kebabu.", name = "Železné Plíce", symptoms = "Příznaky - schopnost dýchat oheň a hlasitě křičet pod vodou.", }, chronic_nosehair = { cure = "Léčba - Lektvar na odstranění ohavných chlupů je podán ústně, připraven Sestrou v Lékárně.", cause = "Příčina - pohrdavé popotahování na ty, kteří jsou na tom hůř než pacient.", name = "Strašné Chlupy v Nose", symptoms = "Příznaky - knír z chlupů z kterých by si i jezevec mohl udělat doupě.", }, kidney_beans = { cure = "Léčba - Dva Chirurgové musí fazole odstranit, aniž by se dotkli okrajů ledvin.", cause = "Příčina - rozkousávání kostek ledu v nápojích.", name = "Ledvinové Fazole", symptoms = "Příznaky - bolest a časté výlety na záchod.", }, fake_blood = { cure = "Léčba - Uklidnění Psychiatrem je jediný způsob jak tento problém řešit.", cause = "Příčina - pacient je většinou objetí kanadského žertíku.", name = "Falešná Krev", symptoms = "Příznaky - Červená tekutina v žilách, která se vypařuje při styku s oblečením.", }, heaped_piles = { cure = "Léčba - Příjemný, přesto účinný kyselinný nápoj rozpustí hemeroidy zevnitř.", cause = "Příčina - postávání u vodních chladičů.", name = "Nahromaděné Hemeroidy", symptoms = "Příznaky - pacient cítí jako když on/ona sedí na pytlíku kuliček.", }, gastric_ejections = { cure = "Léčba - Vypití speciálního svazovacího roztoku zabrání čemukoliv být katapultováno.", cause = "Příčina - pálivé mexické nebo indické jídlo.", name = "Žaludeční Katapulty", symptoms = "Příznaky - napůl strávené jídlo je vysíláno z pacienta v náhodných svazcích.", }, diag_ultrascan = { name = "Vyše Ultrasken", }, alien_dna = { cure = "Léčba - DNA je mechanicky odstraněna, vyčištěna od mimozemských částic a rychle nahrazena.", cause = "Příčina - objímač obličeje vyzbrojen inteligentní mimozemskou krví.", name = "Mimozemská DNA", symptoms = "Příznaky - postupná proměna v mimozemšťana a touha zničit naše města.", }, king_complex = { cure = "Léčba - Psychiatr řekne pacientovi jak směšně on nebo ona vypadá.", cause = "Příčina - Způsobeno duchem Krále, který vstoupí do pacientovy mysli a ovládne ji.", name = "Králův Komplex", symptoms = "Příznaky - nošení barevné semišové obuvi a jedení cheeseburgerů.", }, autopsy = { name = "Pitva", }, unexpected_swelling = { cure = "Léčba - Nabobtnání může být zmenšeno pouze propíchnutím během operace, vyžadující dva Chirurgy.", cause = "Příčina - cokoliv nečekané.", name = "Nečekané Nabobtnání", symptoms = "Příznak - nabobtnání.", }, third_degree_sideburns = { cure = "Léčba - Zaměstnanci Psychologie musí, za použití moderních technik, přesvědčit pacienta, že tyto vlasaté nezbytné doplňky jsou hloupost.", cause = "Příčina - Melancholická touha po 70. letech", name = "Licousy 3. stupně", symptoms = "Příznaky - velké vlasy, světlice, platformy a jiskřivý make-up.", }, pregnancy = { cure = "Léčba - Dítě je odstraněno na Operačním Sále, umyto a představeno pacientovi.", cause = "Příčina - výpadky proudu v prostorech měst.", name = "Těhotenství", symptoms = "Příznaky - vybíravé stravování s následným pivním pupkem.", }, diag_scanner = { name = "Vyše Skener", }, tv_personalities = { cure = "Léčba - Vyškolený Psychiatr musí přesvědčit pacienta, aby prodal svoji TV a koupil si rádio.", cause = "Příčina - denní televizní vysílání.", name = "TV Osobnosti", symptoms = "Příznaky - bludy o schopnosti uvádět pořad o vaření.", }, } pay_rise = { poached = "%s mi nabídl %d. Jestliže mi nebudete platit stejně, tak jdu pryč.", regular = { [1] = "Jsem naprosto vyčerpaný. Potřebuji si hodně odpočinout, navíc zvýšení o %d, pokud nechcete, abych tuto blbou práci pověsil na hřebík.", [2] = "Jsem velmi unavený. Potřebuji si odpočinout a zvýšit plat o %d, což celkově bude %d. Udělejte to hned, Vy despoto.", [3] = "No tak. Dřu tady jako kůň. Dejte mi bonus %d a já zůstanu ve vaší nemocnici.", [4] = "Jsem velmi nešťastný. Požaduji zvýšení o %d, tím můj plat bude %d, jinak odcházím.", [5] = "Mí rodiče mi říkali, že zdravotnická profese má dobré platy. Takže mi zvyšte plat o %d nebo se stanu producentem počítačových her.", [6] = "Jsem naštvaný. Máte mi platit slušnou mzdu. Myslím si, že zvýšení o %d by mělo stačit.", }, definite_quit = "Nic, co můžete udělat, mě tu neudrží. Mám tohoto místa plné zuby.", } menu_list_window = { back = "Zpátky", save_date = "Změněno", name = "Název", } misc = { low_res = "Nízké rozl", send_message = "Poslat zprávu hráči %d", send_message_all = "Poslat zprávu všem hráčům", done = "Vše Hotovo", pause = "Pozastavit", no_heliport = "Buď ještě nebyly objeveny žádné nemoci, nebo na této mapě není heliport.", save_success = "Hra v Pořádku Uložena", not_yet_implemented = "(není ještě zavedeno)", force = "Donutit", mouse = "Myš", grade_adverb = { extremely = "extrémně", moderately = "středně", mildly = "mírně", }, balance = "Soubor Rovnováhy:", hospital_open = "Nemocnice Otevřena", out_of_sync = "Hra není synchronizována", save_failed = "CHYBA: Hru Nelze Uložit", load_failed = "Uloženou hru nelze načíst", } progress_report = { win_criteria = "KRITÉRIA VÍTĚZSTVÍ", more_drinks_machines = "Postavte více automatů na nápoje. ", quite_unhappy = "Vaši lidé jsou pěkně nešťastní. ", too_cold = "Je tu příliš velká zima. Umístěte radiátory. ", header = "Hlášení o Postupu", free_build = "VOLNÉ STAVĚNÍ", too_hot = "Zorganizujte si váš systém vytápění. Je tu příliš vedro. ", percentage_pop = "% populace", very_unhappy = "Vaši lidé jsou velmi nešťastní. ", } new_game_window = { easy = "Rezident (Jednoduché)", cancel = "Zrušit", caption = "Kampaň", difficulty = "Obtížnost", option_off = "Vypnuto", option_on = "Zapnuto", tutorial = "Výuka", hard = "Konzultant (Těžké)", medium = "Doktor (Střední)", start = "Zahájit", player_name = "Jméno hráče", } date_format = { daymonth = "%1% %2:months%", } research = { allocated_amount = "Přidělené Množství", funds_allocation = "Přidělení Financí", categories = { cure = "Nástroje pro Léčbu", drugs = "Výzkum Léků", improvements = "Vylepšení", diagnosis = "Diagnostické Nástroje", specialisation = "Specializace", }, } bank_manager = { current_loan = "Současná Půjčka", balance = "Bilance", interest_payment = "Platba Úroků", hospital_value = "Hodnota Nemocnice", interest_rate = "Úroková Míra", statistics_page = { balance = "Bilance", current_balance = "Současná Bilance", date = "Datum", details = "Podrobnosti", money_out = "Náklady", money_in = "Příjmy", }, inflation_rate = "Míra Inflace", insurance_owed = "Dluh na Pojištění", } casebook = { cure = "léčba", treatment_charge = "poplatek za vyšetření", reputation = "reputace", research = "soustředit výzkum", sent_home = "odmítnuto", deaths = "úmrtí", earned_money = "vyděláno peněz", cure_desc = { hire_surgeons = "Potřebujete zaměstnat Chirurgy.", improve_cure = "Zlepšit Léčbu.", no_cure_known = "Žádná Známá Léčba.", build_room = "Doporučuji, abyste postavili %s", hire_nurses = "Měli byste zaměstnat pár Sester.", build_ward = "Stále potřebujete postavit Nemocniční pokoj.", hire_psychiatrists = "Musíte zaměstnat Psychiatry.", cure_known = "Léčba.", hire_doctors = "Potřebujete zaměst¨nat pár Doktorů.", }, cured = "uzdravení", } original_credits = { [1] = " ", [2] = " ", [3] = " ", [4] = " ", [5] = " ", [6] = " ", [7] = " ", [8] = " ", [9] = " ", [10] = " ", [11] = " ", [12] = ":Navrhl a vytvořil", [13] = ":Bullfrog Productions", [14] = " ", [15] = ":Pluto Development Team", [16] = ",", [17] = "Mark Webley", [18] = "Gary Carr", [19] = "Matt Chilton", [20] = "Matt Sullivan", [21] = "Jo Rider", [22] = "Rajan Tande", [23] = "Wayne Imlach", [24] = "Andy Bass", [25] = "Jon Rennie", [26] = "Adam Coglan", [27] = "Natalie White", [28] = " ", [29] = " ", [30] = " ", [31] = ":Programování", [32] = ",", [33] = "Mark Webley", [34] = "Matt Chilton", [35] = "Matt Sullivan", [36] = "Rajan Tande", [37] = " ", [38] = " ", [39] = " ", [40] = ":Grafika", [41] = ",", [42] = "Gary Carr", [43] = "Jo Rider", [44] = "Andy Bass", [45] = "Adam Coglan", [46] = " ", [47] = " ", [48] = " ", [49] = ":Dodatečné programování", [50] = ",", [51] = "Ben Deane", [52] = "Gary Morgan", [53] = "Jonty Barnes", [54] = " ", [55] = " ", [56] = " ", [57] = ":Dodatečná grafika", [58] = ",", [59] = "Eoin Rogan", [60] = "George Svarovsky", [61] = "Saurev Sarkar", [62] = "Jason Brown", [63] = "John Kershaw", [64] = "Dee Lee", [65] = " ", [66] = " ", [67] = " ", [68] = ":Úvodní video", [69] = ",", [70] = "Stuart Black", [71] = " ", [72] = " ", [73] = " ", [74] = ":Hudba a zvukové Efekty", [75] = ",", [76] = "Russell Shaw", [77] = "Adrian Moore", [78] = " ", [79] = " ", [80] = " ", [81] = ":Dodatečná hudba", [82] = ",", [83] = "Jeremy Longley", [84] = "Andy Wood", [85] = " ", [86] = " ", [87] = " ", [88] = ":Hlas oznamovatelky", [89] = ",", [90] = "Rebecca Green", [91] = " ", [92] = " ", [93] = " ", [94] = ":Návrh úrovní", [95] = ",", [96] = "Wayne Imlach", [97] = "Natalie White", [98] = "Steven Jarrett", [99] = "Shin Kanaoya", [100] = " ", [101] = " ", [102] = " ", [103] = ":Skriptování", [104] = ",", [105] = "James Leach", [106] = "Sean Masterson", [107] = "Neil Cook", [108] = " ", [109] = " ", [110] = " ", [111] = ":Výzkum a vývoj", [112] = " ", [113] = ":Grafické jádro", [114] = ",", [115] = "Andy Cakebread", [116] = "Richard Reed", [117] = " ", [118] = " ", [119] = " ", [120] = ":Podpora výzkumu a vývoje", [121] = ",", [122] = "Glenn Corpes", [123] = "Martin Bell", [124] = "Ian Shaw", [125] = "Jan Svarovsky", [126] = " ", [127] = " ", [128] = " ", [129] = ":Knihovny a nástroje", [130] = " ", [131] = "Knihovna Dos a Win 95", [132] = ",", [133] = "Mark Huntley", [134] = "Alex Peters", [135] = "Rik Heywood", [136] = " ", [137] = " ", [138] = " ", [139] = ":Síťová knihovna", [140] = ",", [141] = "Ian Shippen", [142] = "Mark Lamport", [143] = " ", [144] = " ", [145] = " ", [146] = ":Zvuková knihovna", [147] = ",", [148] = "Russell Shaw", [149] = "Tony Cox", [150] = " ", [151] = " ", [152] = " ", [153] = ":Programování instalátoru", [154] = ",", [155] = "Andy Nuttall", [156] = "Tony Cox", [157] = "Andy Cakebread", [158] = " ", [159] = " ", [160] = " ", [161] = ":Morální podpora", [162] = ",", [163] = "Peter Molyneux", [164] = " ", [165] = " ", [166] = " ", [167] = ":Manažer testování", [168] = ",", [169] = "Andy Robson", [170] = " ", [171] = " ", [172] = " ", [173] = ":Hlavní testeři", [174] = ",", [175] = "Wayne Imlach", [176] = "Jon Rennie", [177] = " ", [178] = " ", [179] = " ", [180] = ":Testeři hraní", [181] = ",", [182] = "Jeff Brutus", [183] = "Wayne Frost", [184] = "Steven Lawrie", [185] = "Tristan Paramor", [186] = "Nathan Smethurst", [187] = " ", [188] = "Ryan Corkery", [189] = "Simon Doherty", [190] = "James Dormer", [191] = "Martin Gregory", [192] = "Ben Lawley", [193] = "Joel Lewis", [194] = "David Lowe", [195] = "Robert Monczak", [196] = "Dominic Mortoza", [197] = "Karl O'Keeffe", [198] = "Michael Singletary", [199] = "Andrew Skipper", [200] = "Stuart Stephen", [201] = "David Wallington", [202] = " ", [203] = "A všichni naši ostatní zkušení testeři hraní", [204] = " ", [205] = " ", [206] = " ", [207] = ":Technická podpora", [208] = ",", [209] = "Kevin Donkin", [210] = "Mike Burnham", [211] = "Simon Handby", [212] = " ", [213] = " ", [214] = " ", [215] = ":Marketing", [216] = ",", [217] = "Pete Murphy", [218] = "Sean Ratcliffe", [219] = " ", [220] = " ", [221] = " ", [222] = ":Děkujeme:", [223] = ",", [224] = "Tamara Burke", [225] = "Annabel Roose", [226] = "Chris Morgan", [227] = "Pete Larsen", [228] = " ", [229] = " ", [230] = " ", [231] = ":PR", [232] = ",", [233] = "Cathy Campos", [234] = " ", [235] = " ", [236] = " ", [237] = ":Dokumentace", [238] = ",", [239] = "Mark Casey", [240] = "Richard Johnston", [241] = "James Lenoel", [242] = "Jon Rennie", [243] = " ", [244] = " ", [245] = " ", [246] = ":Úprava dokumentace a balení", [247] = ",", [248] = "Caroline Arthur", [249] = "James Nolan", [250] = " ", [251] = " ", [252] = " ", [253] = ":Manažer lokalizace projektu", [254] = ",", [255] = "Carol Aggett", [256] = " ", [257] = " ", [258] = " ", [259] = ":Lokalizace", [260] = ",", [261] = "Sandra Picaper", [262] = "Sonia 'Sam' Yazmadjian", [263] = " ", [264] = "Bettina Klos", [265] = "Alexa Kortsch", [266] = "Bianca Normann", [267] = " ", [268] = "C.T.O. S.p.A. Zola Predosa (BO)", [269] = "Gian Maria Battistini", [270] = "Maria Ziino", [271] = "Gabriele Vegetti", [272] = " ", [273] = "Elena Ruiz de Velasco", [274] = "Julio Valladares", [275] = "Ricardo Martínez", [276] = " ", [277] = "Kia Collin", [278] = "CBG Consult", [279] = "Ulf Thor", [280] = " ", [281] = " ", [282] = " ", [283] = ":Produkce", [284] = ",", [285] = "Rachel Holman", [286] = " ", [287] = " ", [288] = " ", [289] = ":Producent", [290] = ",", [291] = "Mark Webley", [292] = " ", [293] = " ", [294] = " ", [295] = ":Vedoucí výroby", [296] = ",", [297] = "Andy Nuttall", [298] = " ", [299] = " ", [300] = " ", [301] = ":Operace", [302] = ",", [303] = "Steve Fitton", [304] = " ", [305] = " ", [306] = " ", [307] = ":Správa společnosti", [308] = ",", [309] = "Audrey Adams", [310] = "Annette Dabb", [311] = "Emma Gibbs", [312] = "Lucia Gobbo", [313] = "Jo Goodwin", [314] = "Sian Jones", [315] = "Kathy McEntee", [316] = "Louise Ratcliffe", [317] = " ", [318] = " ", [319] = " ", [320] = ":Vedení společnosti", [321] = ",", [322] = "Les Edgar", [323] = "Peter Molyneux", [324] = "David Byrne", [325] = " ", [326] = " ", [327] = ":Všichni v Bullfrog Productions", [328] = " ", [329] = " ", [330] = " ", [331] = ":Zvláštní poděkování", [332] = ",", [333] = "Všem ve Frimley Park Hospital", [334] = " ", [335] = ":Zvláště", [336] = ",", [337] = "Beverley Cannell", [338] = "Doug Carlisle", [339] = " ", [340] = " ", [341] = " ", [342] = ":Nepřestávejte myslet", [343] = " ", [344] = " ", [345] = " ", [346] = " ", [347] = " ", [348] = " ", [349] = " ", [350] = " ", [351] = " ", [352] = " ", [353] = " ", [354] = " ", [355] = " ", [356] = " ", [357] = " ", [358] = " ", [359] = " ", [360] = " ", [361] = ".", } competitor_names = { [1] = "ORAC", [2] = "HAL", [3] = "COLOSSUS", [4] = "MULTIVAC", [5] = "HOLLY", [6] = "DEEP THOUGHT", [7] = "ZEN", [8] = "SKYNET", [9] = "AKIRA", [10] = "SAMUEL", [11] = "GLaDOS", [12] = "KISMET", [13] = "SHODAN", [14] = "HIPPOKRATÉS", [15] = "MÁMA", [16] = "KÁJA", [17] = "WATSON", [18] = "DEEP BLUE", [19] = "ASIMO", [20] = "TOPIO", [21] = "NIKDO", [22] = "MAREK", [23] = "JANA", [24] = "NIC", } staff_title = { general = "Praktický", doctor = "Doktor", nurse = "Sestra", psychiatrist = "Psychiatr", receptionist = "Recepční", researcher = "Výzkumník", junior = "Rezident", surgeon = "Chirurg", consultant = "Konzultant", } room_descriptions = { gp = { [1] = "Kancelář Praktického Lékaře//", [2] = "Toto je základní vyšetřovací místnost ve vaší nemocnici. Noví pacienti jsou sem poslání, aby se zjistilo co je s nimi špatně. Pak jsou posláni na další vyšetření nebo do místnosti, kde budou vyléčeni. Možná byste mohli postavit další kancelář, pokud bude tato příliš zaneprázdněná. Čím větší je místnost, a čím více předmětů do ní umístíte, tím vyšší je prestiž Doktora. Toto také platí pro všechny obsazené místnosti.//", [3] = "Kancelář Praktického Lékaře vyžaduje jakéhokoliv Doktora. ", }, x_ray = { [1] = "Rentgen//", [2] = "Rentgen pořizuje snímky vnitřku lidí použitím speciální radiace, čímž zaměstnancům poskytuje dobrou představu o tom, co se s nimi děje.//", [3] = "Rentgen vyžaduje jakéhokoliv Doktora. Také potřebuje údržbu. ", }, toilets = { [1] = "Toaleta//", [2] = "Pacienti, kteří cítí volání přírody si budou muset ulehčit v pohodlí vašich toaletních zařízení. Můžete postavit další kabiny a umyvadla pokud očekáváte spousty návštěvníků. V některých případech byste mohli zvážit postavit další zařízení někde jinde v nemocnici. ", }, tv_room = { [1] = "TV MÍSTNOST NENÍ POUŽITA", }, general_diag = { [1] = "Obecné Vyšetření//", [2] = "Pacienti, kteří vyžadují další vyšetření, jsou sem posláni na kontrolu. Pokud kancelář Praktického Lékaře nepřijde na to, co je s nimi špatně, Obecné Vyšetření na to často přijde. Odtud jsou posláni zpátky do kanceláře k analýze výsledků z tohoto vyšetření.//", [3] = "Místnost Obecného vyšetření vyžaduje jakéhokoliv Doktora. ", }, hair_restoration = { [1] = "Klinika Obnovy Vlasů//", [2] = "Pacienti trpící extrémním případem Plešatosti budou nasměrování směrem k Obnovovači Vlasů v této Klinice. Doktor bude obsluhovat stroj, a ten rychle zasadí pacientovu hlavu čerstvými vlasy.//", [3] = "Klinika Obnovy Vlasů vyžaduje jakéhokoliv Doktora. Také vyžaduje pravidelnou údržbu. ", }, ward = { [1] = "Nemocniční Pokoj//", [2] = "Pacienti jsou zde drženi pro pozorování Sestrou během vyšetření. Zůstávají zde před provedením operace.//", [3] = "Nemocniční pokoj vyžaduje jednu Sestru. ", }, scanner = { [1] = "Skener//", [2] = "Pacienti jsou přesně vyšetřeni použitím důmyslného Skeneru. Pak jdou k Doktorovi v Kanceláři Praktického Lékaře k dalšímu vyšetření.//", [3] = "Skener vyžaduje jakéhokoliv. Také vyžaduje údržbu. ", }, slack_tongue = { [1] = "Oddělení Ochablého Jazyka//", [2] = "Pacienti s diagnózou Ochablého Jazyka od Kanceláře Praktického Lékaře budou posláni na tuto kliniku k vyléčení. Doktor použije moderní přístroj k natáhnutí a ušmiknutí jazyka, čímž navrátí pacienta do normálního dobrého zdraví.//", [3] = "Klinika Ochablého Jazyka vyžaduje jakéhokoliv Doktora. Také občas potřebuje údržbu. ", }, cardiogram = { [1] = "Kardio//", [2] = "Pacienti jsou zde vyšetřeni a zkontrolování předtím, než se vrátí do Kanceláře Praktického Lékaře k přidělení léčby.//", [3] = "Kardio vyžaduje jakéhokoliv Doktora. Také vyžaduje údržbu. ", }, decontamination = { [1] = "Dekontaminační Klinika//", [2] = "Pacienti, kteří byly vystaveni Radiaci, jsou rychle odkázáni na Dekontaminační Kliniku. Tato místnost obsahuje sprchu, která je úplně očistí od té strašné radioaktivity a špíny.//", [3] = "Dekontaminační Sprcha vyžaduje jakéhokoliv Doktora. Také potřebuje obsluhu od Údržbáře. ", }, dna_fixer = { [1] = "Klinika DNA//", [2] = "Pacientům, s kterými si pohráli bytosti z jiné planety, musí být v této místnosti jejich DNA nahrazena. Přístroj Spravovač DNA je velmi složitý kus vybavení a bylo by rozumné s ním do místnosti umístit hasící přístroj, čistě pro případ.//", [3] = "Přístroj Spravovač DNA vyžaduje pravidelnou kontrolu od Údržbáře. Také vyžaduje Doktra s Výzkumnou kvalifikací k jeho fungování. ", }, training = { [1] = "Výuková místnost//", [2] = "Vaši Rezidenti a Doktoři můžou studiem v této místnosti získat cenné další kvalifikace. Konzultant s Chirurgickými, Výzkumnými nebo Psychiatrickými dovednostmi tyto předá na všechny Doktory, kteří jsou zde vyučování. Doktoři, kteří už tyto dovednosti mají, zjistí, že jejich schopnost je používat se zvýší, zatímco jsou tady.//", [3] = "Výuková místnost vyžaduje Konzultanta. ", }, electrolysis = { [1] = "Místnost Elektrolýzy//", [2] = "Pacienti s Vlasoitidou jsou posláni do této místnosti, kde zvláštní přístroj jménem Elektrolyzér elektricky vlasy vytrhne a uzavře póry použitím směsi ne nepodobná maltě.//", [3] = "Elektrolyzér vyžaduje jakéhokoliv Doktora. Také potřebuje údržbu od Údržbáře. ", }, jelly_vat = { [1] = "Želé Klinika//", [2] = "Pacienti prokletí srandovní nemocí Želitidou se musí dokymácet do Želé Kliniky, a být umístěni do Želé Nádrže. Vyléčí je to způsobem, který stále není ve zdravotnických kruzích plně pochopen.//", [3] = "Želé Klinika vyžaduje jakéhokoliv Doktora. Také potřebuje Údržbáře pro údržbu. ", }, research = { [1] = "Výzkumné Oddělení//", [2] = "Nové léky a léčby jsou vynalezeny a zlepšovány ve Výzkumném Oddělení. Toto je důležitá čát vaší nemocnice, a bude dělat zázraky ve vašich procentech vyléčených.//", [3] = "Výzkumné Oddělení vyžaduje doktora s Výzkumnými dovednostmi. ", }, inflation = { [1] = "Nafukovárna//", [2] = "Pacienti s touto bolestivou, přesto legrační, nemocí Nafouknuté Hlavy musí přijít do Nafukovárny, kde je předimenzovaná lebka propíchnuta a hned znovu nafouknuta na správný tlak.//", [3] = "Nafukovárna vyžaduje jakéhokoliv Doktora. Také vyžaduje soustavnou obsluhu od Údržbáře. ", }, no_room = { [1] = "", }, blood_machine = { [1] = "Krevní Stroj//", [2] = "Krevní stroj je kus vyšetřovacího vybavení, které kontroluje buňky v pacientově krvi, aby se zjistilo jestli s nimi není něco špatně.//", [3] = "Krevní stroj vyžaduje jakéhokoliv Doktora. Také vyžaduje údržbu. ", }, psych = { [1] = "Psychiatrie//", [2] = "Pacienti s diagnózou psychiatrické nemoci musí navštívit Psychiatrické Odd., aby obdrželi poradenskou službu. Psychiatři také můžou vyšetřovat, přijdou na to, jaký typ nemoci pacienti mají a, pokud je původem duševní, vyléčí je použitím věrné pohovky.//", [3] = "Psychiatrické Odd. vyžaduje Psychiatricky vyučeného Doktora. ", }, fracture_clinic = { [1] = "Oddělení Zlomenin//", [2] = "Ti pacienti, kteří mají takovou smůlu, že mají Zlomené Kosti, půjdou sem. Přístroj na Odstranění Sádry použije účinné průmyslové lasery k uříznutí jakékoli zatuhnuté sádry, což pacientovi způsobí pouze malou bolest.//", [3] = "Oddělení Zlomenin vyžaduje Sestru. Také čas od času vyžaduje údržbu. ", }, ultrascan = { [1] = "Ultrasken//", [2] = "Ultrasken je doslova to nejzazší v diagnostickém vybavení. Cena je sice vysoká, ale stojí za to, pokud chcete ve vaší nemocnici vynikající vyšetřování.//", [3] = "The Ultraskener vyžaduje jakéhokoliv Doktora. Také vyžaduje údržbu. ", }, staff_room = { [1] = "Místnost pro Zaměstnance//", [2] = "Vaši zaměstnanci se při provádění jejich práce unaví. Tuto místnost potřebují, aby si odpočinuli a obnovili síly. Unavení zaměstnanci jsou pomalí, požadují více peněz a nakonec odejdou. Také dělají více chyb. Postavením místnosti, aby tam měli co dělat se, dobře vyplatí. Ujistěte se, že je tam místo pro více zaměstnanců najednou. ", }, pharmacy = { [1] = "Lékárna//", [2] = "Pacienti, kteří byly vyšetřeni a jejichž léčba je lék musí navštívit Lékárnu, aby si ho vzali. Jak více a více léků pro léčbu je objeveno a stanou se dostupnými, tato místnost bude více zaneprázdněná. Možná byste mohli chtít později postavit další Lékárnu.//", [3] = "Lékárna vyžaduje Sestru. ", }, operating_theatre = { [1] = "Operační Sál//", [2] = "Toto důležité zařízení je místo, kde se léčí mnoho druhů nemocí. Sál musí mít dobrou velikost, a musí být naplněn správným vybavením. Je to důležitá část vaší nemocnice.//", [3] = "Operační Sál vyžaduje dva Doktory s Chirurgickými kvalifikacemi. ", }, } queue_window = { num_expected = "Očekáváno", num_entered = "Počet Návštěvníků", max_queue_size = "Max Velikost", num_in_queue = "Velikost Fronty", } debug_patient_window = { caption = "Pacient pro Ladění", } totd_window = { next = "Další Rada", previous = "Předchozí Rada", tips = { [1] = "Každá nemocnice potřebuje recepci a Kancelář Praktického Lékaře, aby mohla fungovat. Poté záleží na tom, jací pacienti navštěvují vaši nemocnici. Lékárna je ale vždycky dobrá volba.", [2] = "Přístroje jako je Nafukovač potřebují údržbu. Zaměstnejte jednoho nebo dva údržbáře pro opravu vašich přístrojů, nebo riskujete, že se vaši pacienti a zaměstnanci zraní.", [3] = "Po chvíli se vaši zaměstnanci unaví. Ujistěte se, že postavíte místnost pro zaměstnance, aby si mohli odpočinout.", [4] = "Umístěte dostatek radiátorů, aby vašim pacientům a zaměstnancům bylo teplo, nebo budou nešťastní. Použijte mapu města k nalezení míst ve vaší nemocnici, která potřebují více vytápění.", [5] = "Doktorova úroveň dovedností vysoce ovlivňuje kvalitu a rychlost jeho diagnóz. Umístěte zkušeného doktora do vaší kanceláře a nebudete potřebovat tolik dodatečných diagnostických místností.", [6] = "Rezidenti a doktoři můžou své dovednosti zlepšit výukou od konzultanta ve výukové místnosti. Pokud konzultant má zvláštní kvalifikace (chirurg, psychiatr, nebo výzkumník), tak také tyto vědomosti předá svým žákům.", [7] = "Zkusili jste zadat evropské číslo tísňového volání (112) do faxu? Nezapomeňte si zapnout zvuk!", [8] = "Jistá nastavení, jako např. rozlišení obrazovky a jazyk, můžete upravit v okně nastavení, které naleznete jak v hlavním menu, tak i ve hře.", [9] = "Vybrali jste jiný jazyk než angličtina, ale přesto je všude anglický text? Pomozte nám přeložit chybějící texty do vašeho jazyka!", [10] = "Tým CorsixTH hledá posily! Zajímá vás programování, překládání, nebo vytváření grafiky pro CorsixTH? Kontaktuje nás na našem Fóru, Poštovním Adresáři nebo Kanálu IRC (corsix-th na freenode).", [11] = "Pokud naleznete chybu, ohlaste ji prosím na našem sledovači chyb: th-issues.corsix.org", [12] = "Každá úroveň má jisté požadavky, které musíte splnit předtím, než můžete pokračovat do další. Podívejte se na okno stavu, abyste viděli váš postup směrem ke splnění úkolů úrovně.", [13] = "Pokud chcete upravit nebo odstranit existující místnost, můžete tak učinit pomocí tlačítka úpravy místnosti, které naleznete dole na panelu nástrojů.", [14] = "V davu čekajících pacientů můžete rychle najít ty, kteří čekají na určitou místnost tím, že nad tuto místnost najedete kurzorem myši.", [15] = "Klikněte na dveře místnosti, abyste viděli její frontu. Zde můžete udělat drobné úpravy, jako např. změnit pořadí fronty nebo poslat pacienta do jiné místnosti.", [16] = "Nešťastní zaměstnanci budou žádat o zvýšení platu častěji. Ujistěte se, že vaši zaměstnanci pracují v pohodlném prostředí, abyste tomuto zabránili.", [17] = "Pacienti budou mít žízeň, zatímco čekají ve vaší nemocnici, a budou mít ještě, pokud zvýšíte vytápění! Umístěte Automaty na Nápoje ve strategických pozicích pro dodatečný příjem.", [18] = "Můžete předčasně ukončit proces vyšetření a hádat léčbu, pokud jste se již s nemocí setkali. Uvědomte si ale, že toto může zvýšit riziko špatné léčby, což způsobí smrt pacienta.", [19] = "Havárie můžou být dobrým zdrojem peněz navíc, za předpokladu, že máte dostatečné kapacity na včasné zvládnutí pohotovostních pacientů.", }, } information = { custom_game = "Vítejte v CorsixTH. Užijte si tuto vlastní mapu!", cannot_restart = "Bohužel, tato hra byla uložena předtím, než byla zavedena funkce restart.", no_custom_game_in_demo = "Je nám líto, ale ve zkušební verzi nemůžete hrát žádné vlastní mapy.", very_old_save = "Od spuštění této úrovně došlo k mnoha aktualizacím. Aby bylo zajištěno, že všechny funkce pracují tak, jak mají, zvažte restartování této úrovně.", cheat_not_possible = "Tento cheat nemůžete použít v této úrovni. Už ani podvádět Vám nejde, to je život, co?", level_lost = { [1] = "Smůla! Nesplnili jste úroveň. Hodně štěstí příště!", [2] = "Důvod, proč jste prohráli:", reputation = "Vaše reputace spadla pod %d.", balance = "Vaše bankovní bilance spadla pod %d.", percentage_killed = "Zabili jste více než %d procent pacientů.", cheat = "Tohle jste chtěli, či jste snad zvolili špatné tlačítko? To Vám ani nejde podvádět? Tady máte lopatu a jděte se zahrabat.", }, } errors = { minimum_screen_size = "Zadejte prosím alespoň 640x480 jako velikost obrazovky.", map_file_missing = "Nelze nalézt soubor s mapou %s pro tuto úroveň!", dialog_missing_graphics = "Je nám líto, datové soubory demoverze toto dialogové okno neobsahují.", load_prefix = "Chyba při načtení hry: ", unavailable_screen_size = "Velikost obrazovky, kterou požadujete, není dostupná v režimu celé obrazovky.", save_prefix = "Chyba při uložení hry: ", alien_dna = "POZNÁMKA: Pro animaci s Mimozemskou DNA neexistují animace pro sednutí, otevírání nebo klepání na dveře atd. Proto se při těchto činnostech, stejně jako v Theme Hospital, dočasně změní na normálně vypadající pacienty a pak se změní zpět. Tyto pacienti se v nemocnici objeví pouze při nastavení v souboru úrovně", fractured_bones = "POZNÁMKA: Animace ženských pacientů se Zlomenými kostmi není dokonalá", load_quick_save = "Chyba! Rychle uloženou pozici nelze načíst, protože neexistuje. Není třeba se obávat, hned jsme jednu pro Vás vytvořili!", no_games_to_contine = "Žádné uložené hry.", could_not_load_campaign = "Nelze načíst kampaň: %s", could_not_find_first_campaign_level = "Nelze načíst první úroveň této kampaně: %s", } menu = { charts = " GRAFY ", options = " NASTAVENÍ ", file = " SOUBOR ", display = " ZOBRAZENÍ ", debug = " LADĚNÍ ", player_count = "POČET HRÁČŮ", } lua_console = { close = "Zavřít", execute_code = "Spustit", } menu_options = { edge_scrolling = " POSUNOVÁNÍ OKRAJŮ ", autosave = " AUTOMATICKÉ ULOŽENÍ ", game_speed = " RYCHLOST HRY ", sound_vol = " HLASITOST ZVUKU ", announcements = " (%1%) OZNÁMENÍ ", lock_windows = " UZAMKNOUT OKNA ", music = " (%1%) HUDBA ", adviser_disabled = " (%1%) PORADCE ", music_vol = " HLASITOST HUDBY ", sound = " (%1%) ZVUK ", announcements_vol = " HLASITOST OZNÁMENÍ ", jukebox = " (%1%) JUKEBOX ", warmth_colors = " BARVY TEPLOTY", twentyfour_hour_clock = " 24HODINOVÝ REŽIM ", wage_increase = " MZDOVÉ POŽADAVKY", } menu_options_warmth_colors = { choice_2 = " MODRÁ ZELENÁ ČERVENÁ ", choice_1 = " ČERVENÁ ", choice_3 = " ŽLUTÁ ORANŽOVÁ ČERVENÁ ", } menu_debug = { cheats = " (%1%) CHEATY ", win_level_anim = " ANIM VÝHRY ÚROVNĚ ", enter_nav_debug = " VSTOUPIT DO LADĚNÍ NAV ", object_cells = " BUŇKY OBJEKTU ", show_nav_cells = " ZOBRAZIT BUŇKY NAV ", dump_strings = " (%1%) VYPSAT ŘETĚZCE ", disable_salary_raise = " ZAKÁZAT ZVYŠOVÁNÍ PLATU ", display_pager = " ZOBRAZIT PAGER ", make_debug_patient = " VYTVOŘIT PACIENTA PRO LADĚNÍ ", keep_clear_cells = " UDRŽET ČISTÉ BUŇKY ", show_help_hotspot = " ZOBRAZIT AKTIVNÍ BODY NÁPOVĚDY ", map_overlay = " PŘEKRYV MAPY ", remove_walls = " ODSTRANIT ZDI ", pixbuf_cells = " BUŇKY VYRPPIX ", plant_pagers = " UMÍSTIT PAGERY ", nav_bits = " BITY NAV ", sprite_viewer = " PROHLÍŽEČ SPRITŮ ", display_room_status = " ZOBRAZIT STAV MÍSTNOSTI ", machine_pagers = " PAGERY PŘÍSTROJŮ ", transparent_walls = " (%1%) PRŮHLEDNÉ ZDI ", limit_camera = " OMEZIT KAMERU ", make_debug_fax = " VYTVOŘIT FAX LADĚNÍ ", jump_to_level = " SKOČIT DO ÚROVNĚ ", win_game_anim = " ANIM VÝHRY HRY ", dump_gamelog = " (%1%) VYPSAT ZÁZNAM HRY ", entry_cells = " BUŇKY VSTUPU ", lose_game_anim = { [1] = " ANIM PROHRY ÚROVNĚ 1 ", [2] = " ANIM PROHRY ÚROVNĚ 2 ", [3] = " ANIM PROHRY ÚROVNĚ 3 ", [4] = " ANIM PROHRY ÚROVNĚ 4 ", [5] = " ANIM PROHRY ÚROVNĚ 5 ", [6] = " ANIM PROHRY ÚROVNĚ 6 ", [7] = " ANIM PROHRY ÚROVNĚ 7 ", }, calls_dispatcher = " ROZVRHOVAČ VOLÁNÍ ", remove_objects = " ODSTRANIT OBJEKTY ", lua_console = " (%1%) KONZOLE LUA ", mapwho_checking = " KONTROLA MAPYKDO ", display_big_cells = " ZOBRAZIT VELKÉ BUŇKY ", porter_pagers = " PAGERY OBSLUHY ", debug_script = " (%1%) SPUSTIT SKRIPT PRO LADĚNÍ ", connect_debugger = " (%1%) PŘIPOJIT LUA DBGp SERVER ", } save_game_window = { caption = "Uložit Hru (%1%)", new_save_game = "Nová Uložená Hra", } main_menu = { custom_level = "Vlastní úroveň", load_game = "Načíst hru", options = "Nastavení", savegame_version = "Verze ukládaných her: ", version = "Verze: ", exit = "Ukončit", new_game = "Nová hra", continue = "Pokračovat ve hře", custom_campaign = "Vlastní kampaň", map_edit = "Editor map", } letter = { [1] = { [1] = "Vážený/á %s//", [2] = "Úžasné! Zvládli jste provoz této nemocnice na výbornou. My pohlaváři na Ministerstvu Zdravotnictví bychom chtěli, jestli byste měli zájem o přijmutí většího projektu. Existuje práce, o které si myslíme, že je pro Vás dokonalá. Plat by byl %d€. Promyslete si to.//", [3] = "Máte zájem o práci v Nemocnici %s?", }, [2] = { [1] = "Vážený/á %s//", [2] = "Výborně! Ve Vaší nemocnici jste udělali znamenitý pokrok. Našli jsme pro Vás něco dalšího, co můžete spravovat, pokud máte chuť na změnu prostředí a novou řadu úkolů. Nemusíte přijímat, ale může to stát za to. Plat je %d€//", [3] = "Chcete práci v Nemocnici %s?", }, [3] = { [1] = "Vážený/á %s", [2] = "Byli jste nesmírně úspěšní během Vašeho období v této nemocnici. Za tímto účelem předvídáme od Vás velké věci, a chtěli bychom Vám nabídnout pozici jinde. Plat by byl %d€, a myslíme si, že si zamilujete nové výzvy, které by to přineslo.//", [3] = "Chtěli byste pozici v Nemocnici %s?", }, [4] = { [1] = "Vážený/á %s//", [2] = "Blahopřejeme! My na Ministerstvu jsme velmi ohromeni Vašimi schopnostmi provozovat nemocnici. Jste určitě zlatý chlapec v Oddělení Zdraví. Myslíme si ale, že byste upřednostňovali trošičku těžší práci. Byli byste placeni %d€, ale rozhodnutí je na Vás.//", [3] = "Máte zájem o práci v Nemocnici %s?", }, [5] = { [1] = "Vážený/á %s//", [2] = "Dobrý den, opět. Vážíme si Vašeho přání neodejít z této okouzlující nemocnice, ale naléháme, abyste si to rozmysleli. Nabídneme Vám skvělý plat %d€ pokud jste připraveni odejít do jiné nemocnice a zařídit, aby běžela tak hladce.//", [3] = "Chtěli byste se teď přesunout do Nemocnice %s?", }, [6] = { [1] = "Vážený/á %s//", [2] = "Zdravíme. Víme, že jste šťastní v této milé a dobře provozované instituci, ale myslíme si, že byste teď měli zvážit další kariérní postup. Samozřejmé Vám bude náležet plat %d€ pokud se rozhodnete přesunout. Stojí za to o tom popřemýšlet.//", [3] = "Přejete si vzít místo v Nemocnici %s?", }, [7] = { [1] = "Vážený/á %s//", [2] = "Dobrý den! Ministerstvo Zdravotnictví by chtělo vědět, zda byste si nechtěli rozmyslet Vaše rozhodnutí zůstat v této nemocnici. Oceňujeme, že maté milou nemocnici, ale také cítíme, že byste udělal dobře, když přijmete místo s větší výzvou, a platem %d€.//", [3] = "Chtěli byste přijmout pozici v Nemocnici %s?", }, [8] = { [1] = "Vážený/á %s//", [2] = "Dobrý den, ještě jednou. Na náš poslední dopis, nabízející Vám prvotřídní pozici v nové nemocnici, a zvýšený plat %d€, jste odpověděli negativně. Nicméně máme pocit, že byste si toto rozhodnutí měli rozmyslet. Máme totiž pro Vás dokonalou práci.//", [3] = "Vezmete místo v Nemocnici %s? Prosím?", }, [9] = { [1] = "Vážený/á %s//", [2] = "Předvedli jste, že jste nejlepší správce nemocnice v dlouhé a pestré historii lékařství. Takový významný úspěch nemůže zůstat bez odměny, takže bychom Vám rádi nabídli místo Vrchního Šéfa Všech Nemocnic. Toto je čestná práce a přichází s platem %d€. Bude vám uspořádán oslavný průvod, a lidé Vám budou ukazovat své uznání, kamkoliv půjdete.//", [3] = "Díky za všechno, co jste udělali. Ať si pořádně užijete dlouhý napůl-důchod.//", [4] = "", }, [10] = { [1] = "Vážený/á %s//", [2] = "Blahopřejeme k úspěšnému provozu všech nemocnic, ke kterých jsme Vás přidělili. Takový výtečný výkon Vás opravňuje ke svobodě všech světových měst. Je Vám dán důchod %d€, navíc limuzína a vše, co po Vás žádáme je cestovat od města k městu, setkávat se s Vaším zbožňujícím lidem a všude propagovat práci všech nemocnic.//", [3] = "Všichni jsme na Vás pyšní. Není mezi námi nikdo, kdo by se necítil vděčný za Vaši tvrdou práci při zachraňování životů.//", [4] = "", }, [11] = { [1] = "Vážený/á %s//", [2] = "Vaše kariéra byla ukázková, a Vy jste inspirací pro nás všechny. Děkujeme, že jste spravovali tolik nemocnic a v každé prací si moc dobře vedli. Chtěli bychom Vám darovat doživotní plat %d€, a chtěli bychom Vás pouze o to, abyste cestovali oficiálním autem s otevřenou střechou od města k městu, přednášeli o tom, jak jste dosáhli tolik tak rychle.//", [3] = "Jste příklad pro každého správně smýšlejícího člověka, a bez výjimky, všichni na světe Vás považují za skvělý přínos.//", [4] = "", }, [12] = { [1] = "Vážený/á %s//", [2] = "Vaše úspěšná kariéra nejlepšího správce nemocnice od dob Mojžíše se chýlí ke konci. Nicméně, Váš dopad na pohodlný svět lékařství byl tak výrazný, že by Vám Ministerstvo rádo nabídlo plat %d€ jen abyste se objevili jako náš zástupce, zahajovat slavnosti, spouštět lodě a pořádat televizní zábavný program. Celý svět po Vás volá a pro nás všechny by to byla dobrá reklama!//", [3] = "Prosím přijměte tuto pozici. Nebude to těžká práce a poskytneme Vám auto a policejní doprovod kamkoliv se hnete.//", [4] = "", }, custom_level_completed = "Výborně! Dokončili jste všechny úkoly v této vlastní úrovni!", dear_player = "Vážený/á %s", return_to_main_menu = "Chtěli byste se vrátit do hlavního menu, nebo pokračovat v hraní?", campaign_level_completed = "Dobrá práce! Splnili jste úroveň. Ale ještě není konec! Chtěli byste přijmout pozici v nemocnici %s?", campaign_level_missing = "Je nám líto, ale zdá se, že následující úroveň této kampaně chybí. (Název: %s)", campaign_completed = "Neuvěřitelné! Zvládli jste splnit všechny úrovně. Nyní si můžete oddychnout a začít sepisovat sebechválu na všech fórech na Internetu. Hodně štěstí!", } rooms_short = { dna_fixer = "Spravovač DNA", psychiatric = "Psychiatrie", gps_office = "Kancelář Prak. Lékaře", toilets = "Toalety", general_diag = "Obecné Vyšetření", hair_restoration = "Obnovovač Vlasů", corridor_objects = "Objekty Chodby", electrolysis = "Oddělení Elektrolýzy", scanner = "Skener", research_room = "Výzkumné Odd.", cardiogram = "Kardiogram", destroyed = "Zničená", reception = "Recepce", staffroom = "Místnost pro Zam.", ward = "Nemocniční Pokoj", jelly_vat = "Želé Nádrž", x_ray = "Rentgen", inflation = "Nafukovárna", ultrascan = "Ultrasken", blood_machine = "Krevní Stroj", tongue_clinic = "Odd. Ochablého Jazyka", fracture_clinic = "Oddělení Zlomenin", training_room = "Výuka", decontamination = "Dekontaminace", pharmacy = "Lékárna", operating_theatre = "Operační Sál", } buy_objects_window = { price = "Cena: ", choose_items = "Zvolte Položky", total = "Celkem: ", } vip_names = { [1] = "Starosta Většího Trumfáku", [2] = "Karel Schwarzenberg", [3] = "Král Bernard z Nizozemí", [4] = "Aun Schan Su Ťij, Barmská předsedkyně Demokratické Opozice", [5] = "Franta z Ostravy", [6] = "Tomáš Garrigue Masaryk", [7] = "Rada Vacátko", [8] = "Karel Brückner", [9] = "Fotbalista Premier League", [10] = "Maxmilián Teroplík III", health_minister = "Ministr zdravotnictví", } fax = { vip_visit_query = { choices = { invite = "Vydat Oficiální Pozvánku pro V.I.P.", refuse = "Odmítnout V.I.P. omluvami.", }, vip_name = "%s vyjádřil přání navštívit Vaší nemocnici", }, vip_visit_result = { telegram = "Telegram!", vip_remarked_name = "Po návštěvě Vaší nemocnice, %s poznamenal:", close_text = "Děkuji za návštěvu nemocnice.", remarks = { mediocre = { [1] = "No, viděl jsem horší. Ale měli byste provést nějaká zlepšení.", [2] = "Jémináčku. To není pěkné místo, kam jít, když se cítíte neduživě.", [3] = "Upřímně, je to průměrná nemocnice. Abych pravdu řekl, čekal jsem více.", }, free_build = { [1] = "Máte tady velmi hezkou nemocnici! Není to ale zas tak těžké ji postavit, když nejste omezeni penězi, co?", [2] = "Sice nejsem ekonom, ale myslím si, že bych tuto nemocnici také mohl řídit, víte, co tím myslím...", [3] = "Velmi dobře spravovaná nemocnice. Dávejte si ale pozor na recesi! Ah ano... Vy se ji nemusíte obávat.", }, good = { [1] = "Jaká to dobře provozovaná nemocnice. Děkuji, že jste mě do ní pozvali.", [2] = "Hmm. Není to špatné zdravotnické zařízení, to zajisté.", [3] = "Užil jsem si Vaší půvabnou nemocnici. Má teď někdo chuť na kari v Taj?", }, very_bad = { [1] = "To je díra. Pokusím se to tu zavřít.", [2] = "Nikdy jsem neviděl tak hroznou nemocnici. Taková ostuda!", [3] = "Jsem šokován. Tomuhle nemůžete říkat nemocnice! Jdu na pivo.", }, super = { [1] = "To je ale úderná nemocnice. Když budu příště vážně nemocný, tak mě tam vezměte.", [2] = "Tak tomu říkám nemocnice.", [3] = "To je výborná nemocnice. A já bych to měl vědět; v pár jsem již byl.", }, bad = { [1] = "Proč jsem se obtěžoval? Bylo to horší než jít na čtyř hodinovou operu!", [2] = "Jsem znechucen tím, co jsem viděl. Tomu říkáte nemocnice? To je spíš chlívek!", [3] = "Už mám dost toho, že jsem v centru pozornosti veřejnosti a navštěvuji smrduté díry jako je tahle! Rezignuji.", }, }, cash_grant = "Byl Vám darován peněžní dar ve výši %d.", rep_loss = "Vaše reputace v souladu s tímto utrpěla.", rep_boost = "Vaše reputace ve společnosti se zvýšila.", }, disease_discovered = { can_cure = "Tuto nemoc můžete zvládnout.", close_text = "Byla objevena nová nemoc.", need_to_build = "Musíte vybudovat %s, abyste toto mohli zvládnout.", need_to_build_and_employ = "Pokud vybudujete %s a zaměstnáte %s můžete uspět.", need_to_employ = "Zaměstnejte %s, abyste mohli tuto krizi zvládnout.", discovered_name = "Váš tým objevil novou nemoc. Je to %s", }, diagnosis_failed = { choices = { send_home = "Poslat Pacienta domů.", wait = "Nechat Pacienta čekat, zatímco Vy postavíte další diagnostické místnosti.", take_chance = "Zkusit možnou léčbu.", }, situation = "Vyčerpali jsme všechny diagnostické přístroje na tomto pacientovi a stále si nejsme jisti, co s ním je špatně.", what_to_do_question = "Co máme s pacientem dělat?", partial_diagnosis_percentage_name = "Existuje %d procentní šance, že jsme identifikovali jaký typ %s pacient má.", }, epidemic_result = { fine_amount = "Vláda vyhlásila obecné ohrožení a uděluje Vám pokutu ve výši %d.", succeeded = { part_1_name = "Hygienický Inspektor slyšel zvěsti, že Vaše zařízení řeší špatný případ %s.", part_2 = "Nicméně se mu nepodařilo najít důkazy k potvrzení těchto zvěstí.", }, close_text = "Hurá!", rep_loss_fine_amount = "Noviny si nad tímto smlsnou. Vaše reputace bude vážně poskvrněna. Navíc dostanete pokutu ve výši %d.", failed = { part_1_name = "Při pokusu o zakrytí faktu, že mají před sebou nakažlivé propuknutí %s", part_2 = "Vaši zaměstnanci nemocnice způsobili, že se choroba rozšířila do široké veřejnosti, žijící v okolí nemocnice.", }, compensation_amount = "Vláda se rozhodla Vás odměnit %d jako vyrovnání za škodu, kterou tyto malé lži způsobili Vašemu dobrému jménu nemocnice.", hospital_evacuated = "Zdravotnická Rada neměla jinou možnost, než evakuovat nemocnici.", }, emergency = { cure_not_possible_build = "Potřebujete postavit %s", locations = { [1] = "Chemický závod Spolana Neratovice.", [2] = "Padělaná Univerzita.", [3] = "Herbicidní Zahradnické Centrum.", [4] = "Výzkumný Institut Nebezpečných Látek.", [5] = "sjezd tanečníků České besedy.", [6] = "hospoda Žába a Býk.", [7] = "Pohřební síň a výčep Velkého Dejva.", [8] = "kari restaurace Taj.", [9] = "Bártův Ráj Použitých Petrochemikálií.", }, choices = { accept = "Ano. Jsem připraven zvládnout tuto havárii. ", refuse = "Ne. Odmítám zvládnout tuto havárii.", }, cure_not_possible_employ = "Potřebujete zaměstnat %s", free_build = "Pokud budete úspěšní, Vaše reputace se zvýší, pokud ale selžete, bude to mít velký dopad na Vaši reputaci.", num_disease_singular = "Je tu 1 osoba s %s a vyžaduje okamžitou pozornost.", cure_not_possible_build_and_employ = "Bude potřeba postavit %s a zaměstnat %s", bonus = "K dispozici je maximální bonus %d za zvládnutí této havárie. Pokud ale selžete, Vaše reputace bude silně pošramocena.", cure_not_possible = "V tuto chvíli nemůžete nemoc léčit.", location = "V %s se stala nehoda", cure_possible_drug_name_efficiency = "Již máte potřebné přístroje a dovednosti. Máte lék, který potřebují. Je to %s a lék je na %d procent účinný.", cure_possible = "Máte správné vybavení a dovednosti, takže byste měli tuto havárii zvládnout.", num_disease = "Je tu %d osob s %s a vyžadují okamžitou pozornost.", }, epidemic = { cover_up_explanation_2 = "Pokud nemocnici Hygienický Inspektor navštíví a zjistí, že stále probíhá ututlání epidemie, může proti Vám přijmout drastická opatření.", disease_name = "Vaši Doktoři objevili nakažlivý kmen %s.", choices = { declare = "Vyhlásit Epidemii. Zaplatit pokutu a přijmout zásah do reputace.", cover_up = "Pokusit se vyléčit všechny nakažené pacienty ve vymezeném čase a předtím, než kdokoliv odejde z nemocnice.", }, declare_explanation_fine = "Pokud vyhlásíte epidemii, zaplatíte pokutu %d, dostanete zásah do reputace a všichni Vaši pacienti budou automaticky očkování.", cover_up_explanation_1 = "Na druhou stranu, pokud se pokusíte toto ututlat, máte omezený čas na vyléčení všech nakažených pacientů předtím, než na to přijdou Zdravotní Orgány.", }, choices = { return_to_main_menu = "návrat do hlavního menu", accept_new_level = "Pokračovat do další úrovně", decline_new_level = "Hrát ještě o trochu déle", }, emergency_result = { earned_money = "Z maximálního bonusu %d, jste získali %d.", close_text = "Klikněte pro zavření.", saved_people = "Zachránili jste %d lidí z celkových %d.", }, disease_discovered_patient_choice = { what_to_do_question = "Co chcete s pacientem dělat?", need_to_employ = "Zaměstnat %s, aby bylo možné tuto situaci zvládnout.", can_not_cure = "Tuto chorobu nemůžete vyléčit.", need_to_build = "Musíte vybudovat %s, abyste mohli být schopni toto zvládnout.", choices = { send_home = "Poslat Pacienta Domů.", wait = "Nechat Pacienta chvilku čekat v nemocnici.", research = "Poslat pacienta do Výzkumného Oddělení.", }, need_to_build_and_employ = "Pokud vybudujete %s a zaměstnáte %s, můžete uspět.", guessed_percentage_name = "Váš tým musel odhadnout pacientovu nemoc. Je tu %d procentní šance, že je to %s", disease_name = "Váš tým objevil novou nemoc. Je to %s", }, debug_fax = { text2 = "CELKEM %d LIDÍ V NEMOCNICI ZAPSÁNO PROTI %d", text7 = "REPUTACE: %d OČEKÁVÁNA %d SNÍŽENÍ %d", text9 = "KATASTROFY %d POVOLENO (MĚS) %d (%d)SNÍŽENÍ %d", text4 = "FAKTORY : DOKT %d SESTRY %d OBLAST %d MÍSTNOSTI %d CENA %d", text1 = "NEJLEPŠÍ POČET %d", text6 = "NÁSLEDUJÍCÍ FAKTORY JSOU TAKÉ ZAHRNUTY", close_text = "Jo, jo, jo!", text3 = "ČÍSLA : DOKT %d SESTRY %d OBLAST %d MÍSTNOSTI %d CENA %d", text5 = "PŘISPÍVAJÍCÍ : DOKT %d SESTRY %d OBLAST %d MÍSTNOSTI %d CENA %d PROCENT", text8 = "POHODLÍ %d LIDÍ ZVLÁDNUTO %d ANÍŽENÍ %d", text10 = "ÚMRTÍ %d POVOLENO (MĚS) %d (%d) SNÍŽENÍ %d", text11 = "LIDÍ TENTO MĚSÍC %d", }, } insurance_companies = { [1] = "LabutíList s.r.o.", [2] = "Plzeňská Cibule", [3] = "Vzájemný Hřeben Vlny", [4] = "Jizva Bígla s.r.o.", [5] = "Plovoucí Duše s.r.o.", [6] = "Jindřich Upřímný a.s.", [7] = "Koncern Pana Baculatého", [8] = "Lev Kočka a.s.", [9] = "Ješitný a Bim s.r.o.", [10] = "spol. Šťastná Pojišťovna", [11] = "Družstevní Pojišťovna", out_of_business = "BANKROT", } menu_file = { save = " (%1%) ULOŽIT ", load = " (%1%) NAČÍST ", restart = " (%1%) RESTARTOVAT ", quit = " (%1%) ODEJÍT ", } graphs = { visitors = "Návštěvníci", time_spans = { [1] = "1 Rok", [2] = "12 Let", [3] = "48 Let", }, cures = "Vyléčení", wages = "Platy", deaths = "Úmrtí", balance = "Bilance", money_in = "Příjem", money_out = "Výdej", reputation = "Reputace", } staff_list = { total_wages = "PLATY CELKEM", tiredness = "ÚNAVA", morale = "MORÁLKA", skill = "DOVEDNOSTI", } introduction_texts = { level14 = "Je tu ještě jedna výzva - naprosto nečekaná nemocnice jako překvapení. " .. "Jestliže toto bude úspěch, bude vítěz nad všemi vítězi. " .. "Nečekejte ale, že to bude lehké, protože je to ten nejtěžší úkol, jaký jste kdy viděli. " .. "Hodně Štěstí!", level16 = "Jakmile jste některé pacienty vyšetřili, budete muset pro jejich léčbu postavit léčebná zařízení a oddělení - dobrý začátek " .. "je Lékárna. Budete také potřebovat Sestru k vydávání různých léků v Lékárně.", level15 = "Dobrá, tak toto jsou základní instrukce jak sestavit nemocnici.//" .. "Vaši Doktoři budou potřebovat veškerou pomoc, kterou mohou získat k vyšetření některých pacientů. Můžete jim pomoci " .. "postavením jiného diagnostického zařízení jako např. Místnost Obecného Vyšetření.", level18 = "", level12 = "Nyní máte matku všech výzev. " .. "Ohromeni Vašim úspěchem, Ministerstvo má pro Vás špičkovou práci; chtějí, aby někdo postavil tu nejlepší nemocnici, vydělat obrovské množství prašulí a mít neuvěřitelnou reputaci. " .. "Očekává se, že také koupíte všechny pozemky, které můžete, všechno vyléčíte (a tím myslíme všechno) a vyhrajete všechna ocenění. " .. "Myslíte, že na to máte?" .. "Vydělejte 650,000€, vylečte 750 lidí, a mějte reputaci ve výši 800, abyste toto vyhráli.", level17 = "Malé varování - velmi si hlídejte Vaši reputaci - to je co pacienty přiláká z široko daleka do Vašeho zařízení. " .. "Pokud nezabijete příliš mnoho lidí a udržíte je rozumně šťastné, neměli byste mít v této úrovni problémy!//" .. "Teď jste v tom sami. Hodně štěstí a tak dále.", level4 = "Udržte všechny lidi šťastné, zacházejte s nimi tak dobře jak to jen a udržte úmrtí na absolutní minimum." .. "Vaše reputace je v sázce, takže se ujistěte, že ji budete mít tak vysoko, jak je to jen možné. " .. "O peníze se moc nestarejte - ty přijdou, jak Vaše důležitá reputace poroste. " .. "Budete mít také možnost učit Doktory k rozšíření jejich schopností. " .. "Mohli by mít na starost pacienta, který se zdá být méně neprůhledný, než většina. " .. "Dosáhněte reputace přes 500.", level13 = "Vaše neuvěřitelné dovednosti správce nemocnice neunikly Zvláštnímu Tajnému Oddělení Zvláštní Tajné. " .. "Mají pro Vás zvláštní bonus; je tu krysami zamořená nemocnice, která potřebuje účinného Terminátora. " .. "Musíte zastřelit tolik krys, kolik můžete, než Údržbáři uklidí všechen bordel. " .. "Myslíte, že to zvládnete?", level6 = "Použijte všechny Vaše znalosti k zřízení bezproblémové, dobře spravované nemocnice, která má zdravý příjem a může se vypořádat s čímkoliv, co na ní nemocná veřejnost může hodit. " .. "Musíte si uvědomit, že zdejší atmosféra je zvláště vhodná k přenášení bacilů a infekcí. " .. "Pokud nebudete Vaše zařízení udržovat až puntičkářsky čisté, můžete čelit řadě epidemií mezi pacienty. " .. "Ujistěte se, že si vyděláte 150,000€ a že Vaše nemocnice má hodnotu přes 140,000€.", level5 = "Toto bude zaneprázdněná nemocnice, která bude řešit různé případy. " .. "Vaši Doktoři jsou všichni přímo ze zdravotnické školy, takže bude zásadní vybudovat výukovou místnost a naučit je do přípustných úrovní. " .. "Máte pouze tři Konzultanty, kteří Vám pomohou s výukou Vašich nezkušených zaměstnanců, takže je udržujte šťastné. " .. "Nezapomeňte, také, že, základy této nemocnice sedí na geologickém zlomu San Robot. " .. "Je tu vždy přítomné nebezpečí zemětřesení. " .. "Způsobí vážné poškození Vašich přístrojů a naruší hladký chod Vaší nemocnice. " .. "Dostaňte Vaši reputaci na značku 400, a uložte suprových 50,000€ abyste uspěli. Také, vylečte 200 pacientů.", level8 = "Je na Vás zřídit tu nejúčinnější a nákladově efektivní nemocnici, jak to jen jde. " .. "lidé v tomto okolí se mají za dobře, takže z nich vymáčkněte tolik prašulí, kolik můžete. " .. "Nezapomeňte, léčení lidí je sice hezké, ale opravdu POTŘEBUJETE peníze, které to přináší. " .. "Vezměte tyto nemocné lidi do čistírny. " .. "Nashromážděte ohromných 300,000€ k dokončení této úrovně.", level7 = "Zde budete pod pečlivou kontrolou z Ministerstva Zdravotnictví, takže se ujistěte, že Vaše účty ukazují, že vyděláváte hodně peněz a že Vaše reputace je ve výšinách. " .. "Nemůžeme si dovolit zbytečná úmrtí - jsou špatná pro byznys. " .. "Ujistěte se, že Vaši zaměstnanci jsou v nejlepší formě, a že máte veškeré vybavení, které potřebujete. " .. "Dostaňte reputaci ve výši 600, plus 200,000€ v bance.", level2 = "V této oblasti je větší škála nemocí. " .. "Postavte Vaši nemocnici, aby zvládla více pacientů a nachystejte se na vybudování Výzkumného Oddělení. " .. "Nezapomeňte udržovat Vaše zařízení čisté a zkuste dostat vaši reputaci tak vysoko, jak to jen jde - budete čelit nemocem jako je Ochablý Jazyk, takže potřebujete Oddělení Ochablého Jazyka. " .. "Můžete také postavit Kardiogram, aby Vám pomohl vyšetřit nové nemoci. " .. "Obě tyto místnosti musí být vyzkoumány předtím, než je budete moci postavit. Nyní si také můžete zakoupit dodatečné parcely pozemků k rozšíření Vaší nemocnice - pro toto použijte Mapu Města. " .. "Miřte k reputaci 300 a bankovní bilance 10,000€ a 40 vyléčeným lidem.", level9 = "Když jste naplnili bankovní účet Ministerstva a zaplatili a novou limuzínu pro samotného Ministra, nyní se můžete vrátit zpět k vytváření pečující, dobře zřízené nemocnice ve prospěch nemocných a potřebných. " .. "Můžete očekávat, že se zde objeví spousta rozdílných problémů." .. "Pokud máte dostatek dobře vyškolených zaměstnanců a místností, měli byste mít všechno pokryto. " .. "Vaše nemocnice musí mít hodnotu 200,000€ a budete potřebovat 400,000€ v bance. " .. "Cokoliv méně a nebudete moct dokončit úroveň.", demo = "Vítejte v demo nemocnici!//" .. "Bohužel, demo verze obsahuje pouze tuto úroveň. Nicméně je toho více než dost, abyste se na chvilku zabavili! " .. "Setkáte se s různými nemocemi, které potřebují různé místnosti k léčbě. Čas od času se můžou stát havárie. A budete potřebovat vyzkoumat dodatečné místnosti pomocí výzkumného oddělení. " .. "Vaším úkolem je vydělat 100,000€, mít hodnotu nemocnice ve výši 70,000€ a reputaci 700, přičemž musíte vyléčit alespoň 75% Vašich pacientů. " .. "Ujistěte se, že Vaše reputace nespadne 300 a že nezabijete více než 40% Vašich pacientů, nebo prohrajete.//" .. "Hodně štěstí!", level10 = "Stejně jako zvládnutí všech nemocí, které se v této oblasti vyskytují, Ministerstvo žádá, abyste strávil nějaký čas soustředěním se na účinnost Vašich léků. " .. "Z ČasNemoci, Hlídacího Psa Zdravotnictví, se ozívají jisté stížnosti, takže abyste vypadali dobře, musíte zajistit, že Vaše léky jsou mimořádně účinné. " .. "Také zajistěte, aby Vaše nemocnice nemusela být kárána. Ať ty úmrtí nejsou vysoká. " .. "Jako nápověda, možná byste měli vyhradit prostor pro Želé Nádrž. " .. "Zdokonalte všechny Vaše léky na alespoň 80 procentní účinnost, mějte reputaci 650 a ukryjte 500,000€ v bance, abyste vyhráli. ", level11 = "Byla Vám dána šance vybudovat to nejlepší z nemocnic. " .. "Toto je mimořádně prestižní oblast a Ministerstvo by rádo chtělo vidět tu nejlepší možnou nemocnici. " .. "Očekáváme, že budete vydělávat velké peníze, mít skvostně vysokou reputaci a zvládat všechny možné případy. " .. "Toto je důležitá práce. " .. "Budete muset být něco zvláštního, abyste toto zvládli. " .. "Nezapomeňte, také, že v oblasti byla zpozorována UFO. Ujistěte se, že Vaši zaměstnanci jsou připraveni na nečekané návštěvníky. " .. "Vaše nemocnice potřebuje mít hodnotu 240,000€, v bance potřebujete 500,000€ a Vaše reputace bude potřeba být na 700.", level3 = "Tentokrát budete zřizovat nemocnici v zámožné oblasti. " .. "Ministerstvo Zdravotnictví očekává od Vás, že zde zajistíte zdravý příjem. " .. "Především budete muset získat dobrou reputaci, ale jakmile nemocnice běží naprázdno, soustřeďte se co nejvíce na vydělávání peněz. " .. "Je tu také možnost výskytu Havárií. " .. "To je tehdy, když velký počet lidí přijde najednou a všichni mají stejnou nemoc. " .. "Vyléčení všech v časovém limitu Vám přidá lepší reputaci a velký bonus. " .. "Nemoci jako Králův Komplex se mohou objevit a měli byste dát do rozpočtu výstavbu Operačního Sálu a Nemocničního Pokoje poblíž. " .. "Vydělejte si 20,000€ abyste dosáhli další úrovně.", level1 = "Vítejte ve Vaší první nemocnici!//" .. "Rozchoďte to tu umístěním Recepce, vybudováním Kanceláře Praktického Lékaře a najmutím Recepční a Doktora. " .. "Pak počkejte, až přijde nějaký byznys." .. "Je dobrý nápad postavit Odd. Psychiatrie a najmout Doktora s Psychiatrickými kvalifikacemi. " .. "Lékárna a Sestra jsou také nutné k léčbě Vašich pacientů. " .. "Dejte si pozor na ničemné případy Nafouknuté Hlavy - Nafukovárna je brzy spraví. " .. "Budete chtít vyléčit 10 lidí a zajistit, že Vaše reputace nespadne pod 200.", } install = { th_directory = "CorsixTH potřebuje kopii datových souborů z původní hry Theme Hospital (nebo demoverze), aby mohla běžet. Prosím použijte okno níže k nalezení instalační složky Theme Hospital.", title = "-------------------------------- Nastavení CorsixTH --------------------------------", exit = "Odejít", ok = "OK", cancel = "Zrušit", } staff_class = { receptionist = "Recepční", surgeon = "Chirurg", handyman = "Údržbář", doctor = "Doktor", nurse = "Sestra", } menu_charts = { bank_manager = " (%1%) SPRÁVCE BANKY ", statement = " (%1%) FINANČNÍ VÝKAZ ", staff_listing = " (%1%) SEZNAM ZAMĚSTNANCŮ ", town_map = " (%1%) MAPA MĚSTA ", casebook = " (%1%) KNIHA LÉČBY PACIENTŮ ", research = " (%1%) VÝZKUM ", status = " (%1%) STAV ", graphs = " (%1%) GRAFY ", policy = " (%1%) ZÁSADY ", briefing = " ÚVOD DO MISE ", } menu_options_volume = { [30] = " 30% ", [10] = " 10% ", [90] = " 90% ", [40] = " 40% ", [20] = " 20% ", [50] = " 50% ", [70] = " 70% ", [60] = " 60% ", [100] = " 100% ", [80] = " 80% ", } drug_companies = { [1] = "Léky-co-máte-rádi", [2] = "Léky Jsme My", [3] = "Drsná Malá Pilulka spol.", [4] = "Heřman Dobromyslný s.r.o.", [5] = "Všelék a.s.", } options_window = { change_resolution = "Změnit Rozlišení", width = "Šířka", fullscreen = "Celá Obrazovka", apply = "Použít", caption = "Nastavení", resolution = "Rozlišení", option_off = "Vypnuto", custom_resolution = "Vlastní...", option_on = "Zapnuto", language = "Jazyk hry", height = "Výška", cancel = "Zrušit", back = "Zpět", folder = "Složky", customise = "Přizpůsobit", audio = "Globální audio", } folders_window = { new_th_location = "Zde můžete zadat novou instalační složku Theme Hospital. Jakmile ji zvolíte, hra bude restartována.", data_label = "Data TH", music_label = "MP3", savegames_label = "Uložené hry", music_location = "Vyberte adresář s hudbou, která bude použita ve hře.", caption = "Umístění složek", screenshots_label = "Snímky obrazovky", font_label = "Písmo", back = "Zpět", savegames_location = "Vyberte složku, kde budou ukládány vaše uložené hry", screenshots_location = "Vyberte složku, kde budou ukládány snímky obrazovky", } font_location_window = { caption = "Zvolte písmo (%1%)" } menu_options_wage_increase = { deny = " ZAMÍTNOUT", grant = " VYHOVĚT", } update_window = { caption = "Dostupná aktualizace!", new_version = "Nová verze:", current_version = "Současná verze:", download = "Přejít na stránku ke stažení", ignore = "Přeskočit a přejít do hlavní nabídky", } customise_window = { average_contents = "Průměrný obsah", option_on = "Zapnuto", paused = "Stavět při pozastavení", option_off = "Vypnuto", intro = "Přehrát úvodní video", caption = "Vlastní nastavení", back = "Zpět", movies = "Globální kontrola videí", volume = "Zkrátka snížení hlasitosti", aliens = "PAcienti s mimozemskou DNA", fractured_bones = "Zlomené kosti", } custom_campaign_window = { caption = "Vlastní kampaň", start_selected_campaign = "Spustit kampaň", } warnings = { levelfile_variable_is_deprecated = "Upozornění: Úroveň '%s' ve svém souboru obsahuje zastaralé určení proměnné.'%LevelFile' bylo přejmenováno na '%MapFile'. Pro aktualizaci úrovně prosím použijte editor map.", } map_editor_window = { pages = { paste = "Vložit oblast", camera_3 = "Kamera 3", hedgerow = "Živý plot", delete_wall = "Smazat zdi", road = "Silnice", parcel_7 = "Parcela 7", pond = "Rybníky", heliport_3 = "Heliport 3", outside = "Vnější prostory", parcel_3 = "Parcela 3", helipad = "Přistávací plocha", parcel_1 = "Parcela 1", heliport_4 = "Heliport 4", parcel_6 = "Parcela 6", foliage = "Rostliny", parcel_2 = "Parcela 2", parcel_5 = "Parcela 5", parcel_4 = "Parcela 4", parcel_0 = "Parcela 0", north_wall = "Severní zeď", inside = "Vnitřní prostory", parcel_9 = "Parcela 9", heliport_2 = "Heliport 2", parcel_8 = "Parcela 8", camera_4 = "Kamera 4", camera_1 = "Kamera 1", camera_2 = "Kamera 2", west_wall = "Západní zeď", heliport_1 = "Heliport 1", }, } save_map_window = { new_map = "Nová mapa", caption = "Uložit mapu (%1%)", } menu_player_count = { players_1 = " 1 HRÁČ ", players_2 = " 2 HRÁČI ", players_3 = " 3 HRÁČI ", players_4 = " 4 HRÁČI ", } CorsixTH-0.63/CorsixTH/Lua/languages/danish.lua000066400000000000000000004150111347163623700213260ustar00rootroot00000000000000--[[ Copyright (c) 2010 Robin Madsen (RobseRob) Copyright (c) 2010-2011 Ole Frandsen (Froksen) Copyright (c) 2011 Rene Bergfort (Kleeze) 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. ------------------------------------------------------------------------------- READ BEFORE DOING ANY CHANGES ------------------------------------------------------------------------------- This danish translation is based apon the Norwegian file by Erlend Mongstad. I have changed it so that is match the formating of the norwegian file. Danish translations is done by the danish team. Mostly Robin Madsen (RobseRob) or by Ole Frandsen (Froksen). Please read Mongstads description of how the formating is done. Since the norwegian/DANISH language isn't in the original Theme Hospital game, this file is split in two sections (A and B). The first section contains all the new language strings, made by the Corsix-TH team, and the second section contains the override translation of all the original english strings. FORMATING AND NORWEGIAN/DANISH LETTERS This file contains UTF-8 text. Make sure your editor is set to UTF-8. For the norwegian/danish letters ø and Ø, you must use the old-style ö and Ö instead. That is because the letters ø and Ø is not included in the original ingame-font. ------------------------------------------------------------------------------- Table of Contents ------------------------------------------------------------------------------- -- SECTION A - NEW STRINGS 1. Global settings 2. Faxes 3. Objects 4. Menu 5. Adviser 6. Dynamic info 7. Tooltip 8. Cheats 9. Dispatcher -- SECTION B - OLD STRINGS (OVERRIDE) Huge section with all original strings, translated from english. -----------------------------------------------------------------------------]] ------------------------------------------------------------------------------- -- SECTION A - NEW STRINGS ------------------------------------------------------------------------------- -- 1. Global setings (do not edit!) Language("Dansk", "Danish", "da", "dk") Inherit("english") date_format = { daymonth = "%1% %2:months%", } -- 2. Faxes fax = { choices = { return_to_main_menu = "Tilbage til hovedmenuen", accept_new_level = "Gå videre til næste bane", decline_new_level = "Spil videre lidt endnu", }, } letter = { dear_player = "Kære %s", custom_level_completed = "Godt arbejde! Du har opfyldt alle mål på denne speicalbane!", return_to_main_menu = "Vil du gå tilbage til hovedmenuen eller fortsætte med at spille?", } install = { title = "--------------------------------- CorsixTH Installation ---------------------------------", th_directory = "CorsixTH kræver en original installation af Theme Hospital for at fungere. Angiv placeringen af spillet her.", exit = "Afslut", } -- 3. Objects object = { litter = "Skrald", } tooltip.fax.close = "Luk dette vindue uden at fjerne beskeden" tooltip.message.button = "Venstreklik for at læse faxen" tooltip.message.button_dismiss = "Venstreklik for at åbne faxen.Höjreklik for at ignorere den" -- 4. Menu menu_options = { lock_windows = " LÅS VINDUER ", edge_scrolling = " KANTSCROLLING ", settings = " INDSTILLINGER ", } menu_options_game_speed.pause = " PAUSE " -- The demo does not contain this string menu_file.restart = " START FORFRA " menu_debug = { jump_to_level = " Gå til bane ", transparent_walls = " (%1%) Gennemsigtige VæGE ", limit_camera = " BEGRæNS KAMERAET ", disable_salary_raise = " STOP LÖNFORHÖJELSER ", make_debug_fax = " LAV FEJLFINDINGS FAX ", make_debug_patient = " LAV FEJLFINDINGS PATIENT ", spawn_patient = " GENERER TILFæLDIG PATIENT ", make_adviser_talk = " FÄ RÄDGIVEREN TIL AT SNAKKE ", show_watch = " VIS URET ", create_emergency = " LAV ET AKUTTILFæLDE ", place_objects = " PLACER OBJEKTER ", cheats = " (%1%) SNYD ", lua_console = " (%1%) LUA KONSOL ", calls_dispatcher = " KALD På AFSENDER ", dump_strings = " (%1%) DUMP TEKT ", dump_gamelog = " (%1%) DUMP SPILLOG ", map_overlay = " KORTOVERSIGT ", sprite_viewer = " SPRITE VISER ", } menu_debug_overlay = { none = " INTET ", flags = " FLAG ", positions = " KORDINATER ", heat = " TEMPERATUR ", byte_0_1 = " BYTE 0 & 1 ", byte_floor = " BYTE GULV ", byte_n_wall = " BYTE N VÆG ", byte_w_wall = " BYTE W VÆG ", byte_5 = " BYTE 5 ", byte_6 = " BYTE 6 ", byte_7 = " BYTE 7 ", parcel = " TOMT ", } -- 5. Adviser adviser = { room_forbidden_non_reachable_parts = "Hvis du placerede rummet her, ville det resultere i, at dele af dit hospital ikke ville være tilgængelige.", cheats = { th_cheat = "Tillykke, du har nu muligheden for at snyde", crazy_on_cheat = "åh nej! Alle lægerne er blevet sköre!", crazy_off_cheat = "Puha... Alle lægerne er blevet normale igen.", roujin_on_cheat = "Roujin's udfordring er blevet aktiveret! Held og lykke...", roujin_off_cheat = "Roujin's udfordring deaktivateret.", hairyitis_cheat = "Skaldethed snydekoden er aktivateret!", hairyitis_off_cheat = "Skaldethed snydekoden deaktivateret.", bloaty_cheat = "Opsvulmet hoved snydekoden deaktivateret.!", bloaty_off_cheat = "Opsvulmet hoved snydekoden deaktivateret.", }, } -- 6. Dynamic info dynamic_info.patient.actions.no_gp_available = "Venter på du bygger en lægekonsultation" dynamic_info.staff.actions.heading_for = "På vej til %s" dynamic_info.staff.actions.fired = "Fyret" -- 7. Tooltip tooltip.research_policy.no_research = "Der forskes ikke på nuværrende tidspunkt i dette område" tooltip.research_policy.research_progress = "Fremskidtet mod den næste opdagelse indenfor dette område: %1%/%2%" tooltip.objects.litter = "Skrald: Smidt af dine patienter, da de ikke kunne finde en skraldespand" -- Misc misc.not_yet_implemented = "(ikke implanteret endnu)" misc.no_heliport = "Enten er der ikke blevet opdaget nogle sygdomme endnu, ellers er der ingen helikopterplads på denne bane." -- Main menu main_menu = { new_game = "Nyt spil", custom_level = "Specialbane", load_game = "Indlæs spil", options = "Indstillinger", exit = "Afslut", } tooltip.main_menu = { new_game = "Start et nyt spil fra begyndelsen", custom_level = "Lav dit eget sygehus på en specialbane", load_game = "Indlæs et gemt spil", options = "Juster dine indstillinger", exit = "Er du sikker på, at du ikke vil spille mere?", } load_game_window = { caption = "Indlæs spil", } tooltip.load_game_window = { load_game = "Indlæs spil %s", load_game_number = "Indlæs spil %d", load_autosave = "Indlæs autogem", } custom_game_window = { caption = "Specialbane", } tooltip.custom_game_window = { start_game_with_name = "Indlæs banen %s", } save_game_window = { caption = "Gem spil", new_save_game = "Nyt gemt spil", } tooltip.save_game_window = { save_game = "Overskriv gemmet %s", new_save_game = "Skriv navnet for det nye gem", } menu_list_window = { back = "Tilbage", } tooltip.menu_list_window = { back = "Luk dette vindue", } options_window = { fullscreen = "Fuldskærm", width = "Bredde", height = "Höjde", change_resolution = "Skift oplösning", browse = "Gennemse", new_th_directory = "Her kan du specificere en ny installationsmappe for Theme Hospital. Så snart du har gjort det vil spillet genstarte.", cancel = "Annullér", back = "Tilbage", } tooltip.options_window = { fullscreen_button = "Klik for at skifte imellem fuldskærmsvisning", width = "Indtast den önskede skærmbrede", height = "Indtast den önskede skærmhöjde", change_resolution = "Skift skærmstörrelsen til dimmensionerne indtastet til höjre", language = "Vælg %s som sprog", original_path = "Theme Hospitals mappe", browse = "Gennemse et andet sted for installation af Theme Hospital. %1%", back = "Luk indstillingsvinduet", } new_game_window = { easy = "Praktikant (Let)", medium = "Læge (Mellem)", hard = "Konsulent (Svær)", tutorial = "Oplæring", cancel = "Annuller", } tooltip.new_game_window = { easy = "Hvis du ikke har erfaring med simulationsspil, er dette niveau det rette", medium = "Hvis du er usikker på hvad du skal vælge, er dette niveau en mellemting", hard = "Hvis du er sikker på dine evner og önsker udfordring, bör du vælge denne.", tutorial = "Hvis du önsker lidt hjælp til at komme godt igang, skal du mærkere denne boks.", cancel = "Hmm... Var det ikke meningen, at du ville starte et nyt spil?!", } lua_console = { execute_code = "Kör", close = "Luk", } tooltip.lua_console = { textbox = "Skriv den Lua-kode du vil köre her", execute_code = "Kör koden", close = "Luk konsollen", } errors = { dialog_missing_graphics = "Undskyld, men demo datafilerne har ikke en tekst.", save_prefix = "Fejl under gem af spil: ", load_prefix = "Fejl under indlæsning af spil: ", map_file_missing = "Kunne ikke finde kort filen %s for denne bane!", minimum_screen_size = "Indtast en oplösning på mindst 640x480.", maximum_screen_size = "Indtast en oplösning på maksimalt 3000x2000.", unavailable_screen_size = "Skærmoplösningen du valgte er ikke tilgængelig i fuldskærmsvisning.", } confirmation = { needs_restart = "Hvis du vil benytte disse indstillinger, så kræver det en genstart af CorsixTH. Spil, som ikke er gemt, vil gå tabt. Er du sikker på, at du vil bruge disse indstillinger?", abort_edit_room = "Du er ved at opbygge eller ændre et lokale. Hvis alle obligatoriske genstande er placeret, kan du gemme lokalet. Hvis ikke, skal du slette rummet. Fortsætte?", restart = "Er du sikker på at du vil pröve på ny?", } confirmation.restart_level = "Er du sikker på at du vil begynde forfra?" information = { custom_game = "Velkommen til CorsixTH. Hav det sjovt med denne specialbane!", cannot_restart = "Beklageligvis er denne specialbane lavet för genstartfuntionen blev implanteret.", level_lost = { "Öv! Du gennemförte ikke banen. Bedre held næste gang!", "Derfor tabte du:", reputation = "Dit omdömme var under %d.", balance = "Din bankbalance var under %d.", percentage_killed = "Du har dræbt mere end %d procent af patienterne.", }, } tooltip.information = { close = "Luk informationsvinduet", } totd_window = { tips = { "I ethvert hospital er det nödvendigt at have en reception og en lægekonsultation for at komme i gang. Herefter er det, alt efter hvilke patienter der ankommer til dit hospital, op til dig at bygge de nödvendige rum - et apotek er dog altid godt at have.", "Maskiner, som for eksempel pumperum, har brug for vedligeholdelse. Ansæt en pedel eller to til at vedligeholde dine maskiner, ellers kan du risikere, at dine ansatte eller patienter kommer til skade.", "Med tiden bliver dine ansatte trætte. Husk at bygge et personalerum, så de kan slappe af.", "Placer radiatorer så dine patienter og ansatte kan holde varmen, ellers bliver de sure. Brug oversigtskortet til at lokalisere områder i dit hospital, som bör være varmere.", "En læges kvalifikationsniveau betyder meget for hastigheden og kvaliteten af hans diagnosticering. Hvis du placerer en meget kvalificeret læge i en lægekonsultation, behöver du ikke så mange yderligere diagnoserum.", --Juniors and doctors can improve their skills by learning from a consultant in the training room. If the consultant has a special qualification (surgeon, psychiatrist or researcher), he will also pass on this knowledge to his pupil(s). "Praktikanter og læger kan forbedre deres kvalifikationer ved at blive undervist af en konsulent i et undervisningslokale. Hvis konsulenten har specielle kvalifikationer (kirurg, psykiater eller forsker), vil han også give disse kvalifikationer videre til sine elever.", -- "Did you try to enter the European emergency number (112) into the fax machine? Make sure your sound is on!", "Har du prövet at indtaste det europæriske alarmnummer (1-1-2) på faxmaskinen? Husk at have lyd slået til!", --"You can adjust some settings such as the resolution and language in the options window found both in the main menu and ingame.", "Du kan ændre nogle indstillinger, såsom skærmoplösning og sprog, i indstillingsvinduet som findes både i hovedmenuen og inde i spillet.", --"You selected a language other than English, but there's English text all over the place? Help us by translating missing texts into your language!", "Du har valgt et andet sprog end engelsk, men der er alligevel engelsk over det hele? Hjælp os med at oversætte teksten til dit sprog.", --"The CorsixTH team is looking for reinforcements! Are you interested in coding, translating or creating graphics for CorsixTH? Contact us at our Forum, Mailing List or IRC Channel (corsix-th at freenode).", "Holdet bag CorsixTH er altid på udkig efter forskærkninger! Er du interesseret i kodning, oversættelse eller at lave grafik til CorsixTH? Så kontakt os på vores forum, mailingliste eller IRC kanalen (corsix-th på freenode).", --"If you find a bug, please report it at our bugtracker: th-issues.corsix.org", "Hvis du finder en fejl kan du rapportere den til os på vores bugtracker: th-issues.corsix.org", --"Each level has certain requirements to fulfill before you can move on to the next one. Check the status window to see your progression towards the level goals.", "På hver bane er der forskellige betingelser, som skal være opfyldt för du kan gå videre til den næste bane. Hold öje med statusvinduet for at se, hvor tæt du på at opfylde banens mål.", --"If you want to edit or remove an existing room, you can do so with the edit room button found in the bottom toolbar.", "Hvis du vil ændre eller fjerne eksisterende lokaler, kan du göre det ved at trykke på rediger lokale knappen som findes i væktöjslinjen i bunden af skærmen.", -- "In a horde of waiting patients, you can quickly find out which ones are waiting for a particular room by hovering over that room with your mouse cursor.", "I en gruppe af ventende patienter kan du hurtigt finde ud af, hvilke der er i kö til et specifikt rum, ved at bevæge musen over rummet.", --"Click on the door of a room to see its queue. You can do useful fine tuning here, such as reordering the queue or sending a patient to another room.", "Klik på dören til et rum for at se dens kö. Her kan du lave brugbar tilpasning, som for eksempel sortere i köen eller sende patienter til et andet rum.", --"Unhappy staff will ask for salary rises frequently. Make sure your staff is working in a comfortable environment to keep that from happening.", "Utilfredse medarbejdere vil oftere bede om lönforhöjelse. Husk at lave et komfortablet arbejdsmiljö for at holde dem tilfredse.", --"Patients will get thirsty while waiting in your hospital, even more so if you turn up the heating! Place vending machines in strategic positions for some extra income.", "Patienter bliver törstige mens de venter på, specielt hvis der er meget varmt på dit hospital! Placer drikkeautomater på strategiske steder for lidt ekstra indkomst.", --"You can abort the diagnosis progress for a patient prematurely and guess the cure, if you already encountered the disease. Beware that this may increase the risk of a wrong cure, resulting in death for the patient.", "Du kan afbryde en patients diagnoseproces för tid og gætte på en kur, hvis du allerede har opdaget denne sygdom tidligere. Men pas på! Det kan betyde en forhöjet risiko for fejldiagnosticering, som kan medföre patientens död.", -- "Emergencies can be a good source for some extra cash, provided that you have enough capacities to handle the emergency patients in time.", "Akuttilfælde kan være en god mulighed for at tjene lidt ekstra penge, så længe du har kapaciteten til at håndtere patienter fra akuttilfældet inden tiden löber ud.", }, previous = "Forrige tip", next = "Næste tip", } tooltip.totd_window = { previous = "Vis det forrige tip", next = "Vis det næste tip", } tooltip.cheats_window = { close = "Lukker dialogen", cheats = { money = "Overförer 10.000 til din bankkonto.", all_research = "Du har forsket alt.", emergency = "Skaber et akkuttilfælde.", create_patient = "Skaber en patient ved udkanten af kortet.", end_month = "Går til slutningen af måneden.", end_year = "Går til slutningen af året", lose_level = "Du taber banen.", win_level = "Du vinder banen.", }, } -- Cheats cheats_window = { caption = "Snyd", warning = "Advarsel: Det vil ikke være muligt at få bonuspoint ved slutningen af banen hvis du snyder!", cheated = { no = "Brugt snyd: Nej", yes = "Brugt snyd: Ja", }, cheats = { money = "Snyd med penge", all_research = "Alt er forsket", emergency = "Skab et akkuttilfælde", create_patient = "Lav en patient", end_month = "Afslut måneden", end_year = "Afslut året", lose_level = "Tab runden", win_level = "Vind runden", }, close = "Luk", } -- dispatcher calls_dispatcher = { -- Dispatcher description message. Visible in Calls Dispatcher dialog summary = "%d kalder; %d tildelt", staff = "%s - %s", watering = "Vander @ %d,%d", repair = "Reparerer %s", close = "Luk", } ------------------------------------------------------------------------------- -- SECTION B - OLD STRINGS (OVERRIDE) ------------------------------------------------------------------------------- -- Staff class -- each of these corresponds to a sprite staff_class = { nurse = "Sygeplejerske", doctor = "Læge", handyman = "Pedel", receptionist = "Receptionist", surgeon = "Kirurg", } -- Staff titles -- these are titles used e.g. in the dynamic info bar staff_class = { nurse = "Sygeplejerske", doctor = "Læge", handyman = "Pedel", receptionist = "Receptionist", surgeon = "Kirurg", -- S[1][6] unused } staff_title = { receptionist = "Receptionist", general = "Generel", -- unused? nurse = "Sygeplejerske", junior = "Praktikant", doctor = "Læge", surgeon = "Kirurg", psychiatrist = "Psykiater", consultant = "Konsulent", researcher = "Forsker", } -- Pay rises pay_rise = { definite_quit = "Jeg er ligeglad med, hvad du tilbyder mig. Jeg er træt af det her sted!", regular = { "Jeg er helt udkört. Jeg har brug for hvile og en lönforhöjelse på %d, ellers skal du nok ikke forvente at se mere til mig.", -- %d (rise) "Jeg er så træt. Jeg har brug for hvile og en lönforhöjelse på %d, altså en lön på %d ialt. Gör det nu, din tyran!", -- %d (rise) %d (new total) "Helt ærligt. Jeg arbejder som en hund på dit hospital! Giv mig en bonus på %d så bliver jeg på dit hospital.", -- %d (rise) "Jeg er pissesur. Jeg kræver en lönforhöjelse på %d, altså en lön på %d ialt, ellers så er jeg den der er skredet.", -- %d (rise) %d (new total) "Mine forældre fortalte mig, at medicinalindustrien betalte godt. Så giv mig en lönforhöjelse på %d ellers bliver jeg videospilsproducent.", -- %d (rise) "Jeg gider ikke mere. Betal mig en ordenlig lön. En lönforhöjelse på %d skulle klare det.", -- %d (rise) }, poached = "Jeg er blevet tilbudt %d af %s. Med mindre du betaler mig det samme er jeg skredet.", -- %d (new total) %s (competitor) } -------------------- Her til er kigget igennem // Froksen -- Staff descriptions staff_descriptions = { good = { [1] = "Altid glad og en flittig medarbejder. ", [2] = "Meget pligtopfyldende. Meget omsorgsfuld. ", [3] = "Er meget alsidig. ", [4] = "Er venlig og altid i godt humör. ", [5] = "Ekstremt udholdende. Löber en tur hver dag. ", [6] = "Utrolig höflig og er godt opdraget. ", [7] = "Utrolig dygtig og talentfuld. ", [8] = "Er meget opsat på at vise, hvem han er. ", [9] = "Er en perfektionist som aldrig giver op. ", [10] = "Hjælper altid patienter med et smil. ", [11] = "Charmerende, höflig og hjælpsom. ", [12] = "Er motiveret og dedikeret. ", [13] = "Stille af natur, men arbejder meget. ", [14] = "Loyal og venlig. ", [15] = "Eftertænksom og er altid til at stole på i akutte tilfælde. ", }, misc = { [1] = "Spiller golf. ", [2] = "Dykker efter muslinger. ", [3] = "Laver is-skulpturer. ", [4] = "Drikker vin. ", [5] = "Körer rally. ", [6] = "Strikker i fritiden ", [7] = "Samler på frimærker. ", [8] = "Elsker at hoppe ned fra scener til publikums begejstring. ", [9] = "Elsker at surfe. ", [10] = "Elsker at undervise elever.", [11] = "Brænder selv sin whisky. ", [12] = "Gör-det-selv ekspert. ", [13] = "Elsker franske kunstfilm. ", [14] = "Spiller meget Theme Park. ", [15] = "Har stort körekort. ", [16] = "Deltager i motorcykelræs. ", [17] = "Spiller klassisk violin og cello. ", [18] = "Entusiastisk tog-förer. ", [19] = "Hundeelsker. ", [20] = "Hörer meget radio. ", [21] = "Bader ofte. ", [22] = "Instruktör i bambusfletning. ", [23] = "Laver figurer af gröntsager. ", [24] = "Deltids minerydder. ", [25] = "Quizvært. ", [26] = "Samler på splinter fra 2.Verdenskrig. ", [27] = "Elsker at indrette. ", [28] = "Danser til rave og hip-hop musik. ", [29] = "Dræber insekter med deodorantspray. ", [30] = "Buher af dårlige komikere. ", [31] = "Stillet op til sygehusrådet. ", [32] = "Gartner med en hemmelig opskrift. ", [33] = "Smugler uægte malerier. ", [34] = "Vokalist i et rock'n'roll-band. ", [35] = "Elsker at se fjernsyn i dagtimerne. ", [36] = "Fisker efter örret. ", [37] = "Lurer på turister på museum. ", }, bad = { [1] = "Langsom og anmasende. ", [2] = "Træt og meget lidt motiveret. ", [3] = "Dårlig trænet og ubrugelig. ", [4] = "Dum i arbejde. Er en reserve. ", [5] = "Lav udholdenhed. Har en dårlig attitude. ", [6] = "Meget döv. Lugter af kål. ", [7] = "Er ligeglad med jobbet. Tager meget lidt ansvar. ", [8] = "Lider af koncentrationsbesvær og bliver let distraheret. ", [9] = "Stresset og laver mange fejl. ", [10] = "Let at provokere. Sidder meget på en stol. ", [11] = "Uforsigtig og uheldig. ", [12] = "Utroværdig og ubeslutsom. ", [13] = "Dumdristig og laver meget lidt. ", [14] = "Snu, udspekuleret og bagtaler andre. ", [15] = "Arrogant og er en karl-smart. ", }, } -- Staff list staff_list = { -- S[24][1] unused -- S[24][2] -- I have no idea what this is. Me neiter, seems like a early stupid way of doing the text overlay? morale = "MORAL", tiredness = "FRISKHED", skill = "KVALIFIKATION", total_wages = "TOTAL LÖN", } -- Objects object = { -- S[2][ 1] unused desk = "Skrivebord", cabinet = "Arkivskab", door = "Dör", bench = "Bænk", table1 = "Bord", -- unused object chair = "Stol", drinks_machine = "Sodavandsautomat", bed = "Seng", inflator = "Inflator", pool_table = "Billiardbord", reception_desk = "Receptionsbord", table2 = "Bord", -- unused object & duplicate cardio = "Löbebånd", scanner = "Skanner", console = "Konsol", screen = "Skærm", litter_bomb = "Affaldsbombe", couch = "Lænestol", sofa = "Sofa", crash_trolley = "Lægebord", tv = "Fjernsyn", ultrascanner = "Ultraskanner", dna_fixer = "DNA Fixer", cast_remover = "Gibsfjerner", hair_restorer = "Hårgenskaber", slicer = "Tungeskærer", x_ray = "Röntgen", radiation_shield = "Radioaktivitetsskjold", x_ray_viewer = "Röntgenviser", operating_table = "Operationsbord", lamp = "Lampe", -- unused object toilet_sink = "Vask", op_sink1 = "Operationsvask", op_sink2 = "Operationsvask", surgeon_screen = "Operationsskærm", lecture_chair = "Undervisningsstol", projector = "Projektor", bed2 = "Seng", -- unused duplicate pharmacy_cabinet = "Medicinskab", computer = "Computer", atom_analyser = "Atomanalyser", blood_machine = "Blodmaskine", fire_extinguisher = "Brandslukker", radiator = "Radiator", plant = "Plante", electrolyser = "Elektrolyser", jelly_moulder = "Gelé former", gates_of_hell = "Helvedes gab", bed3 = "Seng", -- unused duplicate bin = "Skraldespand", toilet = "Toilet", swing_door1 = "Svingdör", swing_door2 = "Svingdör", shower = "Bruser", auto_autopsy = "Auto obduktion", bookcase = "Bogreol", video_game = "videospil", entrance_left = "Indgang venstre", entrance_right = "Indgang höjre", skeleton = "Skelet", comfortable_chair = "Komfortabel stol", } -- Place objects window place_objects_window = { drag_blueprint = "Træk skitsen ud indtil du er tilfreds med rummets störrelse.", place_door = "Vælg dörens placering.", place_windows = "Placer de vinduer du har lyst til, klik derefter på godkend.", place_objects = "Placer genstandene indtil du er tilfreds, klik derefter på godkend.", confirm_or_buy_objects = "Godkend rummet, köb flere genstande, eller flyt allerede placerede genstande.", pick_up_object = "Klik på genstanden der skal samles op, eller vælg en anden i menuen.", place_objects_in_corridor = "Placer genstanden i et gangareal.", } -- Competitor names -- No need to translate!! //froksen -- Months months = { "Jan", "Feb", "Mar", "Apr", "Maj", "Jun", "Jul", "Aug", "Sep", "Okt", "Nov", "Dec", } -- Graphs graphs = { money_in = "Indtægter", money_out = "Udgifter", wages = "Lönninger", balance = "Saldo", visitors = "Besögene", cures = "Helbredte", deaths = "Döde", reputation = "Omdömme", time_spans = { "1 år", "12 år", "48 år", } } -- Transactions transactions = { --null = S[8][ 1], -- not needed wages = "Lönninger", hire_staff = "Ansat", buy_object = "Köbt genstand", build_room = "Bygget rum", cure = "Helbredt", buy_land = "Köbt grund", treat_colon = "Behandlet:", final_treat_colon = "Endelige behandling:", cure_colon = "Helbredt:", deposit = "Behandlings indsættelse", advance_colon = "Forskud", research = "Forskningsomkostninger", drinks = "Indtægt: Drikkevarer", jukebox = "Indtægt: Jukebox", -- unused cheat = "Snydepenge", heating = "Varmeregning", insurance_colon = "Forsikring:", bank_loan = "Banklån", loan_repayment = "Lån tilbagebetalning", loan_interest = "Renter på lån", research_bonus = "Forskningsbonus", drug_cost = "Medicinomkostninger", overdraft = "Renter på kredit", severance = "Böde", general_bonus = "Generel bonus", sell_object = "Solgt genstand", personal_bonus = "Personlig bonus", emergency_bonus = "Akuttilfælde bonus", vaccination = "Vaccinering", epidemy_coverup_fine = "Epidemiböde for forsög på mörklægning", compensation = "Kompensation", vip_award = "VIP belönning", epidemy_fine = "Epidemiböde", eoy_bonus_penalty = "Årsafslutning - straf", eoy_trophy_bonus = "Årsafslutning - trofæbonus", machine_replacement = "Udskiftning af maskine", } -- Level names -- No need to translate these // froksen -- Town map town_map = { -- S[13][ 1] -- unused chat = "Oversigtskort", for_sale = "Til salg", not_for_sale = "Ikke til salg", number = "Grundnummer", owner = "Grundejer", area = "Grundområde", price = "Grundpris", } -- Rooms short -- NB: includes some special "rooms" -- reception, destroyed room and "corridor objects" rooms_short = { -- S[14][1] -- unused -- S[14][3] -- unused reception = "Reception", destroyed = "Ödelagt", corridor_objects = "Korridorgenstande", gps_office = "Lægekonsultation", psychiatric = "Psykiatri", ward = "Sengeafsnit", operating_theatre = "Operationsstue", pharmacy = "Apotek", cardiogram = "Kardiogram", scanner = "Skanner", ultrascan = "Ultraskanner", blood_machine = "Blodmaskine", x_ray = "Röntgen", inflation = "Pumperum", dna_fixer = "DNA Fixer", hair_restoration = "Hårgenskaber", tongue_clinic = "Tungeklinik", fracture_clinic = "Knoglebrudsklinik", training_room = "Undervisningsrum", electrolysis = "Elektrolyse", jelly_vat = "Geléröret", -- Hmm. Donno if this is translateable staffroom = "Personalerum", -- rehabilitation = S[14][24], -- unused, i laughed when i saw this though.. They didn't however get so stupid and include this in the game :P general_diag = "General diagnose", research_room = "Forskningsrum", toilets = "Toiletter", decontamination = "Dekontaminering", } rooms_long = { -- S[53][1] -- unused general = "Generelt", -- unused? emergency = "Akuttilfælde", corridors = "Korridorer", gps_office = "Lægekonsultationen", psychiatric = "Psykiateren", ward = "Sengeafsnittet", operating_theatre = "Operationsstuen", pharmacy = "Apotektet", cardiogram = "Kardiogrammet", scanner = "Skannerrum", ultrascan = "Ultraskannerrum", blood_machine = "Blodmaskinerum", x_ray = "Röntgen", inflation = "Pumperum", dna_fixer = "DNA Fixer", hair_restoration = "Hårgenskaber", tongue_clinic = "Tungeklinik", fracture_clinic = "Konglebrudklinik", training_room = "Undervisningsrum", electrolysis = "Elektolyseklinik", jelly_vat = "Geléröret", -- Same as rooms short version staffroom = "Personalerum", -- rehabilitation = S[53][24], -- unused general_diag = "General diagnose", research_room = "Forskningsrum", toilets = "Toiletter", decontamination = "Dekontaminering", } room_descriptions = { ultrascan = { [1] = "Ultraskanner//", [2] = "Ultraskanneren er toppen af poppen indenfor diagnoseudstyr. Den koster spidsen af en jetjager, men pengne er godt givet ud hvis du vil være i stand til at stille meget sikre diagnoser på dit hospital.//", [3] = "Ultraskanneren betjenes af en læge. Den kræver også vedligeholdelse. ", }, gp = { [1] = "Lægekonsultation//", [2] = "Dette er det helt fundementale diagonseredskab på dit hospital. Nye patienter sendes hertil först for at finde ud af, hvad de fejler. Hvis der ikke straks kan stilles en diagnose, sendes patienten videre til andre diagnoserum. Du skal sandsynligvis med tiden bruge flere lægekonsultationer for at undgå lange köer. Jo större rummet er og jo flere genstande du placerer i rummet, des bedre arbejder lægen. Dette gælder for alle rum.//", [3] = "Alle typer læger kan arbejde i lægekonsultationen. ", }, fracture_clinic = { [1] = "Knoglebrudsklinik//", [2] = "Patienter som har fået knoglebrud behandles her. Gipsfjerneren bruger en kraftig industrilaser til at skære gibsen væk, og forårsager kun ganske lidt smerte hos patienten.//", [3] = "En sygeplejerske står får betjeningen af maskinen, som også kræver vedligeholdelse af en pedel. ", }, tv_room = { [1] = "TV RUM IKKE BRUGT", }, inflation = { [1] = "Pumperum//", [2] = "Patienter som har et humoristisk, men dog smertefuldt, ballonhoved, behandles i pumperummet. Her stikkes der hul på hovedet så trykket forsvinder. Herefter pumper lægen hovedet op til normalstörrelse.//", [3] = "Pumperummet kan kun betjenes af læger. Regelmæssig vedligeholdelse er også vigtig. ", }, jelly_vat = { [1] = "Geléröret//", [2] = "Patienter, som lider af denne forfærdelige sygdom, må slingre den lange vej til Geleröret. I röret bliver de helbredt på en måde, som stadig ikke fuldt ud kan forklares af lægevidenskaben.//", [3] = "Geleröret kræver en læge. Det kræver også vedligeholdelse fra af en pedel.", }, scanner = { [1] = "Skanner//", [2] = "Patienter bliver præcist diagnosticeret ved brug af denne sofistikerede skanner. De skal efterfölgende se en læge i lægekonsultationen, som skal se på resultatet af skanningen og stille den endelige diagnose.//", [3] = "Skanneren betjenes af en læge. Den kræver vedligeholdelse af en pedel. ", }, blood_machine = { [1] = "Blodmaskine//", [2] = "Blodmaskinen undersöger patientens blodceller for at finde ud af, hvad de fejler.//", [3] = "Blodmaskinen betjenes af en læge. Den kræver også vedligeholdelse af en pedel. ", }, pharmacy = { [1] = "Apotek//", [2] = "Patienter, som er blevet diagnosticeret med en sygdom som kan kureres med medicin, sendes til apoteket. Efterhånden som flere og flere sygdomme som kan kureres med medicin opdages, kommer flere og flere patienter til apoteket. Det kan være en god idé at bygge flere apoteker når dit hospital vokser.//", [3] = "En sygeplejerske står for udleveringen af medicin i apoteket. ", }, cardiogram = { [1] = "Kardio//", [2] = "Patienter forsöges diagnosticeret her för de sendes tilbage til lægekonsultationen for at finde en kur.//", [3] = "Kardioen betjenes af en læge. Den kræver også vedligeholdelse af en pedel. ", }, ward = { [1] = "Sengeafsnit//", [2] = "Patienter observeres her af en sygeplejerske mens man forsöger at stille en diagnose. Patienter opholder sig også ofte i sengeafsnittet forud for operationer.//", [3] = "Sengeafsnittet kræver en sygeplejserke. ", }, psych = { [1] = "Psykiatri//", [2] = "Patienter som diagnosticeres med en psykiatrisk sygdom, sendes til psykiateren for behandling. Psykiatere kan også holde samtaler med patienter under diagnosticeringsfasen for at finde ud af, hvad de fejler.//", [3] = "Psykiatrien kræver en læge med psykiatrisk uddannelse. ", }, staff_room = { [1] = "Personalerum//", [2] = "Dine ansatte bliver trætte mens de udförer deres arbejde. I personalerummet kan de slappe af og komme til kræfter igen. Trætte ansatte arbejder langsommere, kræver flere penge og vil i sidste ende sige op. De laver også flere fejl. Et personalerum med flere forskellige ting for dine ansatte at give sig til, er bestemt udgiften værd. Sörg for, at der er plads til flere ansatte på samme tid. ", }, operating_theatre = { [1] = "operationsstue//", [2] = "I dette vigtige rum bliver en række sygdomme behandlet. Operationsstuen kræver god plads og en masse dyrt udstyr. Den er en vital del af dit hospital.//", [3] = "Operationsstuen kræver to læger med kirurgisk uddannelse. ", }, training = { [1] = "Undervisningsrum//", [2] = "Dine praktikanter og læger kan få nye, værdifulde færdigheder ved at studere i dette rum. En konsulent med kirurgisk, psikiatrisk eller forskningsmæssig uddannelse vil videregive disse færdigheder til de læger, de underviser. Læger, som allerede har disse færdigheder, bliver bedre til at bruge dem ved at blive undervist.//", [3] = "Undervisningen varetages af en konsulent. ", }, dna_fixer = { [1] = "DNA Klinik//", [2] = "Patienter, som har været udsat for eksperimenter af aliens fra andre planeter, får deres DNA udskiftet i denne klinik. DNA-klinikken er udstyret med en meget avanceret maskine, og det ville nok være en god idé at have en brandslukker stående i rummet, bare for en sikkerheds skyld.//", [3] = "DNA-klinikken betjenes af en forskningsuddannet læge. Den kræver også vedligeholdelse af en pedel. ", }, research = { [1] = "Forskningsrum//", [2] = "Ny medicin og nye kure opdages og forbedres i forskningsrummet. Det er en vital del af dit hospital, og vil med tiden forbedre dine helbredelsesprocenter.//", [3] = "Forskningsuddannede læger kan arbejde i forskningsrummet. ", }, hair_restoration = { [1] = "Hårgenskabelsesklinik//", [2] = "Patienter som lider af en ekstrem grad af ufrivillig skaldethed, sendes til hårgenskabelsesklinikken. En læge vil betjene maskinen og vil hurtigt genskabe patientens mægtige hårpragt.//", [3] = "Hårgenskabelsesklinkken kræver en læge. Den kræver også vedligeholdelse af en pedel. ", }, general_diag = { [1] = "Generel Diagnose//", [2] = "Patienter, som kræver yderligere diagnosticering, sendes hertil for at blive undersögt af en læge. Hvis en læge i lægekonsultationen ikke i förste omgang kan finde ud af, hvad patienten fejler, bliver de ofte sendt til Generel Diagnose for yderligere undersögelse. Herfra sendes de tilbage til lægekonsultationen hvor resultaterne bliver analyseret.//", [3] = "Generel Diagnose kræver en læge. ", }, electrolysis = { [1] = "Elektrolyse//", [2] = "Patienter med eksplosiv hårvækst sendes til dette rum, hvor en speciel maskine kaldet en Elektrolyser, hiver hårene ud og lukker hårsækkene med elektriske stöd.//", [3] = "Betjening af elektrolysemaskinen kræver en læge. Den kræver også vedligeholdelse af en pedel. ", }, slack_tongue = { [1] = "Slap-Tunge Klinik//", [2] = "Patienter som får stillet diagnosen slap tunge, sendes til denne klinik for behandling. Lægen anvender et stykke moderne udstyr til at forlænge tungen og skære den af, for derved at efterlade patienten med en helt normal tunge.//", [3] = "Slap-Tunge klinikken kræver en læge. Den kræver også vedligeholdelse af en pedel. ", }, toilets = { [1] = "Toilet//", [2] = "Patienter som hörer naturens kalden, får brug for at lette byrden i dine komfortable toiletter. Du kan installere ekstra båse og vaske hvis du forventer mange besögende. Det kan være en god idé at bygge flere toiletter i dit hospital, så trængende patienter ikke skal gå for langt. ", }, no_room = { [1] = "", }, x_ray = { [1] = "Röntgen//", [2] = "Röntgenmaskinen fotograferer indersiden af folk med en speciel bestrålingsteknologi, så dine læger kan danne sig et bedre billede af, hvad de fejler.//", [3] = "Röntgenmaskinen betjenes af en læge. Den kræver også vedligeholdelse. ", }, decontamination = { [1] = "DekontamineringsKlinik//", [2] = "Patienter, som har været udsat for radioaktivitet, sendes hurtigt til dekontamineringsklinikken. Dette rum indeholder en brusebad som renser dem for de forfærdelige radiaktive stoffer og mudder.//", [3] = "Dekontamineringsklinikken kræver en læge. Den kræver også vedligeholdelse af en pedel. ", }, } -- Drug companies drug_companies = { "Mediciner-Til-Dig", "Kur-R-Os", "Runde Små Piller Co.", "Dyremedicin AS", "Alle Piller Co.", } -- Build rooms build_room_window = { -- S[16][1], -- unused pick_department = "Vælg afdelning", pick_room_type = "Vælg rumtype", cost = "Pris:", } -- Build objects buy_objects_window = { choose_items = "Vælg genstand", price = "Pris: ", total = "Total: ", } -- Research research = { categories = { cure = "Behandlingsudstyr", diagnosis = "Diagnoseudstyr", drugs = "Medicinforskning", improvements = "Forbedringer", specialisation = "Specialisering", }, funds_allocation = "Forskningsbudget", allocated_amount = "Totale budget", } -- Policy screen policy = { header = "Hospitalets politik", diag_procedure = "Diagnose procedure", diag_termination = "Diagnose annullering", staff_rest = "Send personale til personalerum", staff_leave_rooms = "Personale må forlade rum", sliders = { guess = "GæT PÅ KUR", -- belongs to diag_procedure send_home = "SEND HJEM", -- also belongs to diag_procedure stop = "STOP PROCEDURE", -- belongs to diag_termination staff_room = "TIL PERSONALERUM", -- belongs to staff_rest } } -- Rooms room_classes = { -- S[19][1] -- unused -- S[19][2] -- "corridors" - unused for now -- S[19][3] -- unused diagnosis = "Diagnosticering", treatment = "Behandling", clinics = "Klinikker", facilities = "Faciliteter", } -- Insurance companies insurance_companies = { out_of_business = "GÅET KONKURS", "Nyköbt Lökke", "Bölgen Blå", "Årlige Forskud AS", "Stygge Arr Co.", "Svömmeblære Co.", "Drön Ærlig AS", "Sverres Beholdninger", "Kate Pus Og Kompani", "Larsen Jr. Forsikring", "Glade Forsikringer AS", "Mafia Forsikringer", } -- Menu root -- Keep 2 spaces as prefix and suffix menu = { file = " FILER ", options = " INDSTILLINGER ", display = " GRAFISKE INDSTILLINGER ", charts = " SKEMAER ", debug = " FEJLFINDING ", } menu_file = { load = " (%1%) INDLæS ", save = " (%1%) GEM ", restart = " (%1%) START FORFRA ", quit = " (%1%) AFSLUT ", } menu_file_load = { [1] = " Gemt spil 1 ", [2] = " Gemt spil 2 ", [3] = " Gemt spil 3 ", [4] = " Gemt spil 4 ", [5] = " Gemt spil 5 ", [6] = " Gemt spil 6 ", [7] = " Gemt spil 7 ", [8] = " Gemt spil 8 ", } -- Menu Options menu_options = { sound = " (%1%) LYD ", announcements = " (%1%) ANNONCERINGER ", music = " (%1%) MUSIK ", sound_vol = " LYDSTYRKE ", announcements_vol = " ANNONCERINGSSTYRKE ", music_vol = " MUSIKSTYRKE ", autosave = " AUTOMATISK GEM ", game_speed = " SPILHASTIGHED ", jukebox = " (%1%) JUKEBOX ", edge_scrolling = " KANT SCROLLING ", settings = " INDSTILLINGER ", } -- Menu Options Game Speed menu_options_game_speed = { pause = " (%1%) PAUSE ", slowest = " (%1%) LANGSOMMEST ", slower = " (%1%) LANGSOMMERE ", normal = " (%1%) NORMAL ", max_speed = " (%1%) HURTIGST ", and_then_some_more = " (%1%) OG SÅ LIGE LIDT MERE ", } -- Menu Display menu_display = { high_res = " MANGE DETALJER ", mcga_lo_res = " FÅ DETAILJER ", shadows = " SKYGGER ", } -- Menu Charts menu_charts = { statement = " (%1%) ERKLÆRINGER ", casebook = " (%1%) MEDICINBOG ", policy = " (%1%) POLITIK ", research = " (%1%) FORSKNING ", graphs = " (%1%) DIAGRAMMER ", staff_listing = " (%1%) PERSONALEHÅNDTERING ", bank_manager = " (%1%) BANKKONSULENT ", status = " (%1%) STATUS ", briefing = " BRIEFING ", } -- Menu Debug menu_debug = { object_cells = " OBJEKTCELLER ", entry_cells = " INDGANGSCELLER ", keep_clear_cells = " KEEP-CLEAR CELLER ", nav_bits = " NAV BITS ", remove_walls = " FJERN VÆGGE ", remove_objects = " FJERN OBJEKTER ", display_pager = " VIS PERSONSOEGER ", mapwho_checking = " MAPWHO CHECKING ", plant_pagers = " PLANT PERSONSOEGERE ", porter_pagers = " PORTER PERSONSOEGERE ", pixbuf_cells = " PIXBUE CELLER ", enter_nav_debug = " ENTER NAV FEJLSOEGNING ", show_nav_cells = " VIS NAV CELER ", machine_pagers = " MASKIN PERSONSOEGER ", display_room_status = " VIS RUM STATUS ", display_big_cells = " VIS STORE CELLER ", show_help_hotspot = " VIS HJÆLP HOTSPOTS ", win_game_anim = " VIND SPIL ANIM ", win_level_anim = " VIND RUNDE ANIM ", lose_game_anim = { [1] = " TAPT SPIL 1 ANIM ", [2] = " TAPT SPIL 2 ANIM ", [3] = " TAPT SPIL 3 ANIM ", [4] = " TAPT SPIL 4 ANIM ", [5] = " TAPT SPIL 5 ANIM ", [6] = " TAPT SPIL 6 ANIM ", [7] = " TAPT SPIL 7 ANIM ", }, } -- High score screen high_score = { -- S[25][1] unused pos = "POS", player = "SPILLER", score = "SCORE", best_scores = "HALL OF FAME", worst_scores = "HALL OF SHAME", killed = "DRÆBT", -- is this used? No its not. categories = { money = "RIGESTE", salary = "HÖJESTE LÖN", clean = "RENESTE", cures = "ANTAL HELBREDTE", deaths = "ANTAL DÖDSFALD", cure_death_ratio = "HELBREDT-DÖDSFALDS RATIO", patient_happiness = "PATIENTTILFREDSHED", staff_happiness = "PERSONALETILFREDSHED", staff_number = "MEST PERSONALE", visitors = "FLEST BESÖGENDE", total_value = "TOTAL VÆRDI", }, } --mangler -- Trophy room -- Trophy room trophy_room = { many_cured = { awards = { "Tillykke med Marie Curie-prisen for at have været i stand til at helbrede næsten alle patienter på hospitalet i det forgangne år.", }, trophies = { "Den Internationale Behandlingsfond önsker at ære dig, fordi du har helbredt et stort antal mennesker på hospitalet i det forgangende år. De tildeler dig Kureret-Mange trofæet.", "Du har fået tildelt Sygdom-Gå-Væk trofæet for at have kureret en höj procentdel af patienter på hospitalet i det forgangne år.", }, }, all_cured = { awards = { "Tillykke med Marie Curie-prisen for at have været i stand til at helbrede alle patienter på hospitalet i det forgangne år.", }, trophies = { "Den Internationale Behandlingsfond önsker at ære dig, fordi du har helbredt alle patienter på hospitalet i det forgangne år. De tildeler dig derfor Kureret-Alle trofæet.", "Du har fået tildelt Ingen-Syge-Mennesker trofæet for at have helbredt alle patienter på hospitalet i det forgangne år.", }, }, high_rep = { awards = { "Du er blevet tildelt Statsministerens Glitrende Ærespris, som tildeles det hospital med det bedste omdömme i det forgangne år. Tillykke!", "Smil og vær glad! Du tildeles Bullfrog-prisen for hospitalet med det bedste omdömme i det forgangne år. Nyd det - det er velfortjent!", }, trophies = { "Tillykke med Rent-og-Pænt trofæet som tildeles hospitalet med det bedste omdömme i det forgangne år. Det er faktisk fortjent.", }, }, happy_staff = { awards = { }, trophies = { "Du tildeles Smilets Pris for at holde dit hårdtarbejdende personale i godt humör.", "Instituttet for Humörspredere hædrer dig for ikke at have nogen sure og negative ansatte på hospitalet i det forgangne år, og giver dig derfor dette trofæ.", "Dette trofæ tildeles hermed dig fordi dit personle, på trods af en ihærdig arbejdsindsats, er glade og tilfredse. De ligefrem stråler af glæde!", }, }, happy_vips = { awards = { "Du har vundet Nobelprisen for at imponere VIP'erne. Alle, som besögte dit hospital i det forgangne år, taler ikke om andet.", "Tillykke med VIP-prisen for at have gjort livene for de hårdtarbejdende kendisser bedre, ved at sætte alle som besögte dit hospital i det forgangne år i et bedre lys. Fantastisk.", }, trophies = { "Foreningen for Kendte Mennesker belönner dig med Kendistrofæet for at have taget dig godt af alle VIP'ere som besögte dit hospital i det forgangne år - du nærmer dig kendis-status, du er snart en af os.", }, }, no_deaths = { awards = { "Du har vundet Længe-Leve trofæet for at holde 100 procent af patienterne i live i det forgangne år.", }, trophies = { "Foreningen Livet-Går-Videre belönner dig med dette trofæ for at have nul dödsfald i det forgangne år.", "Du er tildelt Længe Leve Livet trofæet for at have undgået dödsfald på dit hospital i det forgangne år. Storartet.", }, }, rats_killed = { awards = { }, trophies = { "Du er tildelt Ingen-Gnavere trofæet for at have skudt %d rotter på dit sygehuset i det forgangne år.", -- %d (number of rats) "Du modtager dette trofæ af Foreningen For Mus og Rotters Bekæmpelse på grund af dine unikke evner til at skyde gnavere. Du fik ramt på %d af dem i det forgangne år!", -- %d (number of rats) "Du modtager Rotteskydertrofæet for dine unikke evner, som resulterede i udryddelsen af %d rotter på hospitalet i det forgangne år.", -- %d (number of rats) }, }, rats_accuracy = { awards = { }, trophies = { "Du er tildelt Nöjagtige-Skud-I-Håblös-Krig Trofæet for at have en træfprocent på %d%% i jagten på ækle rotter.", -- %d (accuracy percentage) "Dette trofæ er for at ære din nöjagtighed ved dræbe %d%% af rottene i det forgangne år.", -- %d (accuracy percentage) "For at hædre din præstation med at dræbe intet mindre end %d%% af rottene på dit hospital, bliver du tildelt Dungeon Keepers Skadedyrspris, Tillykke!", -- %d (accuracy percentage) }, }, healthy_plants = { awards = { "Tillykke med Grönne-Glæder prisen for at have holdt dine planter ekstremt friske i det forgangne år.", }, trophies = { "Venner-af-Potteplanter önsker at give dig Grön Helse Trofæet, fordi dine planter har strålet de sidste 12 måneder.", "Foreningen For Grönne Gamlinger önsker at give dig Grönfinger Trofæet for at have holdt plantene friske i det forgangne år.", }, }, sold_drinks = { awards = { }, trophies = { "Foreningen for Globale Tandlæger er stolte over at kunne tildele dig dette trofæ for at have solgt utroligt store mængder sodavand på dit hospital i det forgangne år.", "Hospitalet tildeles Kulsyre-prisen for alle de sprudlende sodavand, der er solgt fra dine automater i de sidste 12 måneder.", "På vegne af Hulfyldernes Forening, tildeles du hermed dette trofæ dækket af Chokolade, for at have solgt enorme mængder sodavand på hospitalet i det forgangne år.", }, }, } -- Casebook screen casebook = { reputation = "Omdömme", treatment_charge = "Behandlingspris", earned_money = "Indtjent", cured = "Helbredt", deaths = "Dræbt", sent_home = "Sendt hjem", research = "Fokusér forskning", cure = "Kur", cure_desc = { build_room = "Jeg anbefalder du bygger %s", -- %s (room name) build_ward = "Du mangler stadig at bygge et sengeafsnit.", hire_doctors = "Du mangler at ansætte nogle læger", hire_surgeons = "Du mangler at ansætte kirurger.", hire_psychiatrists = "Du har ikke ansat en psykiatiker.", hire_nurses = "Du skal ansætte sygeplejersker.", no_cure_known = "Ingen kendt kur.", cure_known = "Kur.", improve_cure = "Forbedre kur.", }, } -- Tooltips tooltip = { -- Build room window build_room_window = { room_classes = { diagnosis = "Diagnoserum", treatment = "Behandlingrum", clinic = "Klinikker", facilities = "Faciliteter", }, cost = "Samlede omkostninger for rummet", close = "Afbryd processen og vend tilbage til spillet", }, -- Toolbar toolbar = { bank_button = "Venstreklik for bankkonsulent, höjreklik for kontoudskrift", balance = "Din Balance", reputation = "Dit omdömme: ", -- NB: no %d! Append " ([reputation])". date = "Dato", rooms = "Byg rum", objects = "Köb genstande", edit = "Ændre rum/genstande", hire = "Ansæt personale", staff_list = "Personalhåndtering", town_map = "Oversigtskort", casebook = "Medicinbog", research = "Forskning", status = "Status", charts = "Diagrammer", policy = "Politik", }, -- Hire staff window hire_staff_window = { doctors = "Vis tilgængelige læger på arbejdsmarkedet", nurses = "Vis tilgængelige sygeplejersker på abejdsmarkedet", handymen = "Vis tilgængelige pedeller på arbejdsmarkedet", receptionists = "Vis tilgængelige receptionister på arbejdsmarkedet", prev_person = "Forrige person", next_person = "Næste person", hire = "Ansæt person", cancel = "Afbryd", doctor_seniority = "Lægens evner (Praktikant, Doktor, Konsulent)", staff_ability = "Kvalifikation", salary = "Lönkrav", qualifications = "Lægens specialer", surgeon = "Kirurg", psychiatrist = "Psykiater", researcher = "Forsker", }, -- Buy objects window buy_objects_window = { price = "Pris for genstand", total_value = "Total værdi af köbte genstande", confirm = "Köb genstand(e)", cancel = "Afbryd", increase = "Köb en til af denne genstand", decrease = "Köb en færre af denne genstand", }, -- Staff list staff_list = { doctors = "Se en oversigt over dine læger", nurses = "Se en oversigt over dine sygeplejersker", handymen = "Se en oversigt over dine pedeller", receptionists = "Se en oversigt over dine receptionister", happiness = "Viser hvor tilfredse dine ansatte er", tiredness = "Viser hvor trætte dine ansatte er", ability = "Viser de ansattes evner", salary = "Den pågældendes lön", happiness_2 = "Den ansattes moral", tiredness_2 = "Den ansattes træthedssniveau", ability_2 = "Den ansattes evner", prev_person = "Forrige ansatte", next_person = "Næste ansatte", bonus = "Giv den ansatte 10% i bonus", sack = "Giv den ansatte sparket", pay_rise = "Hæv den ansattes lön med 10%", close = "Luk og vend tilbage til spillet", doctor_seniority = "Lægens evner", detail = "Lægens öje for detaljer", view_staff = "Fölg den ansatte", surgeon = "Kvalificeret Kirurg", psychiatrist = "Kvalificeret Psykiater", researcher = "Kvalificeret Forsker", surgeon_train = "%d%% gennemfört uddannelse som kirurg", -- %d (percentage trained) psychiatrist_train = "%d%% gennemfört uddannelse som psykiater", -- %d (percentage trained) researcher_train = "%d%% gennemfört uddannelse som forsker", -- %d (percentage trained) skills = "Ekstra evner", }, -- Queue window queue_window = { num_in_queue = "Antal patienter i köen", num_expected = "Antal patienter som receptionen forventer ankommer til köen indenfor kort tid", num_entered = "Antal patienter behandlet i dette rum", max_queue_size = "Den maksimale længde köen må have", dec_queue_size = "Mindre makslængde", inc_queue_size = "Större makslængde", front_of_queue = "Træk i en patient for at stille ham/hende forest i köen", end_of_queue = "Træk i en patient for at stille ham/hende bagerst i köen", close = "Luk vinduet", patient = "Træk i en patient for at stille ham/hende i köen. Höjreklik på en patient for at sende patienten hjem eller til et konkurrerende hospital", patient_dropdown = { reception = "Send patienten til receptionen", send_home = "Send patienten hjem", hospital_1 = "Henvis patienten til et andet hospital", hospital_2 = "Henvis patienten til et andet hospital", hospital_3 = "Henvis patienten til et andet hospital", }, }, -- Main menu main_menu = { new_game = "Begynd et nyt spil", load_game = "Hent et gemt spil", continue = "Indlæs et gemt spil", network = "Ændre dine indstillinger", quit = "Er du sikker på du ikke vil spille mere?", load_menu = { load_slot = " SPIL [slotnumber] ", -- NB: no %d! Append " [slotnumber]". empty_slot = " TOM ", }, }, -- Window general window_general = { cancel = "Afbryd", confirm = "Godkend", }, -- Patient window patient_window = { close = "Luk vinduet", graph = "Klik for at skifte mellem en graf over patientens helbred og patientens behandlingshistorik", happiness = "Patientens humör", thirst = "Patientens törst", warmth = "Patientens temperatur", casebook = "Vis detaljer om patientens sygdom", send_home = "Send patienten hjem fra hospitalet", center_view = "Fokusér på patienten", abort_diagnosis = "Send patienten til behandling i stedet for at vente til diagnosen er stillet med sikkerhed", queue = "Se köen patienten er i", }, -- window staff_window = { name = "Den ansattes navn", close = "Luk vinduet", face = "Ansigtet på personen - klik for at administere de ansatte", happiness = "Humörniveau", tiredness = "Træthedsniveau", ability = "Kvalifikation", doctor_seniority = "Lægens særlige evner (Praktikant, Doktor, Konsulent)", skills = "specialisering", surgeon = "Kirurg", psychiatrist = "Psykiater", researcher = "Forsker", salary = "Månedslön", center_view = "Venstreklik for at finde den ansatte, höjreklik for at bladre igennem de ansatte.", sack = "Fyr personen", pick_up = "Saml op", }, -- Machine window machine_window = { name = "Navn", close = "Luk vinduet", times_used = "Antal gange maskinen har været brugt", status = "Maskinstatus", repair = "Kald en pedel til at vedligeholde maskinen", replace = "Udskift maskinen med en ny", }, -- Handyman window -- Spparently handymen have their own set of strings (partly) containing "handyman". -- We could just get rid of this category and include the three prios into staff_window. handyman_window = { name = "Pedellens navn", -- contains "handyman" close = "Luk vinduet", face = "Pedellens ansigt", -- contains "handyman" happiness = "Humörniveau", tiredness = "Træthedsniveau", ability = "Kvalifikation", prio_litter = "Få pedellen til at priotere rengöring höjere", -- contains "handyman" prio_plants = "Få pedellen til at priotere vanding af planter höjere.", -- contains "handyman" prio_machines = "Få pedellen til at priotere vedligeholdelse af maskiner höjere", -- contains "handyman" salary = "Månedslön", center_view = "Fokusér på pedellen", -- contains "handyman" sack = "Fyr pedellen", pick_up = "Saml pedellen op", }, -- Place objects window place_objects_window = { cancel = "Afbryd", buy_sell = "Köb/Sælg genstand", pick_up = "Flyt genstand", confirm = "Godkend", }, -- Casebook casebook = { up = "Rul op", down = "Rul ned", close = "Luk medicinbogen", reputation = "Ry om behandlingen eller diagnosen i nærområdet", treatment_charge = "Pris for behandling", earned_money = "Total tjent indtil nu", cured = "Antal helbredte patienter", deaths = "Antal patienter dræbt som fölge af behandlingen", sent_home = "Antal patienter sendt hjem", decrease = "Sænk pris", increase = "Forhöj pris", research = "Tryk her for at bruge forskningsbudgettet for specialisering til at forske i denne behandling", cure_type = { drug = "Behandlingen kræver medicin", drug_percentage = "Behandlingen kræver medicin, og din er %d%% effektiv", -- %d (effectiveness percentage) psychiatrist = "Sygdommen kræver behandling hos en psykiater", surgery = "Sygdommen kræver operation", machine = "Sygdommen behandles med en maskine", }, cure_requirement = { possible = "Du kan genneföre behandlingen", research_machine = "Du skal forske i maskiner for at kunne behandle denne sygdom", build_room = "Du skal bygge et rum for at kunne udföre behandlingen", -- NB: no %s! hire_surgeons = "Du mangler to kirurger for at kunne gennemföre behandlingen", hire_surgeon = "Du skal bruge en kirurg mere for at kunne gennemföre behandlingen", hire_staff = "Du skal ansætte noget personale for at kunne behandle denne sygdom", build_ward = "Du skal bygge er sengeafsnit for at kunne gennemföre denne behandling", ward_hire_nurse = "Du mangler en sygeplejerske for at kunne gennemföre behandlingen", not_possible = "Du kan ikke håndtere denne behandling endnu", }, }, -- Statement statement = { close = "Luk kontoudskriften", }, -- Research research = { close = "Luk vinduet", cure_dec = "Nedprioriter forskning i behandlingsudstyr", diagnosis_dec = "Nedprioriter forskning i diagnoseudstyr", drugs_dec = "Nedprioriter forskning i medicin", improvements_dec = "Nedprioriter forskning i forbedring af eksisterende udstyr eller medicin", specialisation_dec = "Nedprioriter forskning i specialiseringer", cure_inc = "Opprioriter forskning i behandlingsudstyr", diagnosis_inc = "Opprioriter forskning i diagnoseudstyr", drugs_inc = "Opprioriter forskning i medicin", improvements_inc = "Opprioriter forskning i forbedringer af eksisterende udstyr eller medicin", specialisation_inc = "Opprioriter forskning i specialiseringer", allocated_amount = "Penge afsat til forskning", }, -- Graphs graphs = { close = "Gå til diagramvinduet", scale = "Skala på diagram", money_in = "Vis/skjul indtægter", money_out = "Vis/skjul udgifter", wages = "Vis/skjul Lönninger", balance = "Vis/skjul Balance", visitors = "Vis/skjul Besögende", cures = "Vis/skjul Helbredte", deaths = "Vis/skjul Dödsfald", reputation = "Vis/skjul Omdömme", }, --- nået hertil 28 dec -- Town map town_map = { people = "Vis/Skjul mennesker", plants = "Vis/Skjul planter", fire_extinguishers = "Vis/Skjul brandslukningsudstyr", objects = "Vis/Skjul genstande", radiators = "Vis/Skjul radiatorer", heat_level = "Temperatur", heat_inc = "Skru op for varmen", heat_dec = "Skrue ned for varmen", heating_bill = "varmeomkostninger", balance = "Balance", close = "Luk oversigtskortet", }, -- Jukebox. jukebox = { current_title = "Jukebox", close = "Luk jukebox", play = "Spil jukebox", rewind = "Spol tilbage - jukebox", fast_forward = "Spol frem - jukebox", stop = "Stop jukebox", loop = "Gentag jukebox", }, -- Bank Manager bank_manager = { hospital_value = "Hospitalets samlede værdi", balance = "Balance", current_loan = "Nuværende lån", repay_5000 = "Tilbagebetal 5000 til banken", borrow_5000 = "Lån 5000 af banken", interest_payment = "Månedlige renteomkostninger", inflation_rate = "Årlig inflation", inflation_rate = "Inflationsrate", close = "Luk banken", insurance_owed = "Penge %s skylder dig", -- %s (name of debitor) show_graph = "Vis forventet tilbagebetalingsplan fra %s", -- %s (name of debitor) graph = "Forventet tilbagebetalingsplan fra %s", -- %s (name of debitor) graph_return = "Vend tilbage til forrige billede", }, -- Status status = { percentage_cured = "Du skal helbrede %d % af de besögende på dit hospital. Indtil nu har du helbredt %d %", thirst = "Gennemsnitlig törst for dine patienter", close = "Luk oversigten", population_chart = "Andel af lokalbefolkningen som benytter dit hospital", win_progress_own = "Vis hvor langt du er nået for at klare banens krav", reputation = "Dit omdömme skal være på mindst %d. Indtil nu er det %d", population = "Du skal have %d%% af befolkningen til at bruge dit sygehus", warmth = "Gennemsnitlig temperatur for patienterne på dit sygehus", percentage_killed = "Kriteriet er blandet andet at dræbe færre end %d%% af dine besögende. Indtil nu har du taget livet af %d%%", balance = "Din bankbalance skal være på mindst %d. Indtil nu er den %d", value = "Dit sygehus skal have en værdi på $%d. Indtil nu er det værd $%d", win_progress_other = "Vis progression i forhold til kravene for dette niveau for %s", -- %s (name of competitor) num_cured = "Kriteriet er blandet andet at helbrede %d mennesker. Indtil nu har du helbredt %d", happiness = "Gennemsnitligt humör på personene på dit sygehus", }, -- Policy policy = { close = "Luk sygehuspolitik", staff_leave = "Klik her for at tillade, at dit peronale må forlade de rum, du har placeret dem i", staff_stay = "Klik her for at få personalet til at blive i de rum, du har placeret dem i", diag_procedure = "Hvis lægens diagonse er mindre sikker end angivet her, vil patitenten blive sendt hjem. Hvis diagnosen er mere sikker end fastsat under gæt kur procenten, vil patienten få den relevante behandling", diag_termination = "Dine læger vil blive ved med at söge efter en diagnose indtil lægerne er helt sikre på en kur, eller indtil alle maskiner er afprövet. Du kan dog altid afbryde diagnosticeringen", staff_rest = "Hvor træt dit personale skal være för de går til personalerummet", }, -- Pay rise window pay_rise_window = { accept = "Accepter kravet", decline = "Afvis krav og afsked vedkommende", }, -- Watch watch = { hospital_opening = "Tid indtil hospitalet åbner og patienter begynder at ankomme. Klik på knappen for at åbne hospitalet med det samme.", emergency = "Tilbageværende tid til at få behandlet de akutte patienter.", epidemic = "Resterende tid til at få styr på epidemien. Når tiden er udlöbet, eller når en smittet patient forlader hospitalet, kommer der en sundhedsindpektör forbi og inspicerer hospitalet. Knappen tænder og slukker for vaccinationstilstanden. Tryk på patienterne for at få en sygeplejerske til at vaccinere dem.", }, -- Rooms rooms = { gps_office = "Patienterne modtager deres förste konsultation og resultaterne af efterfölgende undersögelser i lægekonsultationen.", psychiatry = "Psykiateren behandler patienter med psykiatriske lidelser og hjælper med diagnosticering af andre patienter, men forudsætter en læge med psykiatrisk uddannelse.", ward = "Sengeafsnittet er nyttigt både til diagnosticering og behandling. Patienter sendes hertil for observation, men også som forberedelse til operationer. Sengeafsnittet kræver en sygeplejerske.", operating_theatre = "Operationsstuen kræver to læger med speciale i kirurgi.", pharmacy = "Sygeplejersken udleverer medicin på apoteket for at helbrede patienter.", cardiogram = "En læge bruger löbebåndet til at udarbejde et kardiogram som kan bruges til at diagnosticere patienternes sygdomme.", scanner = "En læge bruger skanneren til at diagnosticere patienterne.", ultrascan = "En læge bruger ultraskanneren til at diagnosticere patienterne.", blood_machine = "En læge bruger blodmaskinen til at diagnosticere patienterne.", x_ray = "En læge bruger röntgenmaskinen til at diagnosticere patienterne.", inflation = "En læge bruger pumperummet til at behandle patienter med opsvulmet hoved.", dna_fixer = "En læge bruger DNA-Maskinen til at behandle patienter med Alien DNA.", hair_restoration = "En læge bruger hårmaskinen til at behandle patienter med ekstremt hårtab.", tongue_clinic = "En læge bruger tungeklinikken til at behandle patienter med slap tunge.", fracture_clinic = "En sygeplejerske bruger knoglebrudsklinikken til at behandle knoglebrud.", training_room = "Et undervisningsrum med en konsulent kan bruges til at oplære andre læger.", electrolysis = "En læge bruger elektrolyseklinikken til at behandle patienter med ekstrem hårvækst.", jelly_vat = "En læge bruger geleröret til at behandle patienter med Gelésyndrom.", staffroom = "Læger, sygeplejersker og pedeller bruger personalerummet til at hvile sig og for at hæve moralen.", -- rehabilitation = S[33][27], -- unused general_diag = "En læge udförer forskellige undersögelser af patienter i dette rum. Billigt og ofte meget effektivt.", research_room = "Læger med specialisering inden for forskning kan forske sig frem til ny medicin og maskiner i forskningsafdelingen.", toilets = "Lav toiletter så patienterne ikke skal bruge deres kræfter på at klemme balderne sammen.", decontamination = "En læge bruger dekontaminering til at behandle patienter som har været udsat for radioaktiv stråling.", }, -- Objects objects = { -- NB: most objects do not have a tooltip because they're not (extra-)buyable desk = "Bord: En læge bruger bordet til sin computer.", cabinet = "Arkivskab: Indeholder patientjournaler, noter og forskningsdokumenter.", door = "Dör: Patienter åbner og lukker disse meget.", bench = "Bænk: Giver en plads at sidde på og gör besöget mere behageligt.", table1 = S[40][ 6], -- unused chair = "Stol: Patienten sidder på den og taler om sine problemer.", drinks_machine = "Sodavandsautomat: Forhindrer at patienterne kommer til at törste og tiltrækker insekter.", bed = "Seng: Patienterne ligger i dem.", inflator = "Pumpe: Helbreder patienter med opsvulmet hoved.", pool_table = "Billardbord: Hjælper dit personale til at slappe af.", reception_desk = "Reception: Herfra bliver patienterne sendt videre til andre områder af dit hospital.", table2 = S[40][13], -- unused & duplicate cardio = S[40][14], -- no description scanner = S[40][15], -- no description console = S[40][16], -- no description screen = S[40][17], -- no description litter_bomb = "Skraldebombe: Saboterer konkurrentens hospital", couch = S[40][19], -- no description sofa = "Sofa: Ansatte slapper af i sofaen, hvis der ikke er bedre måder at slappe af på.", crash_trolley = S[40][21], -- no description tv = "TV: Sörg for, at personalet ikke går glip af deres ynligsprogrammer.", ultrascanner = S[40][23], -- no description dna_fixer = S[40][24], -- no description cast_remover = S[40][25], -- no description hair_restorer = S[40][26], -- no description slicer = S[40][27], -- no description x_ray = S[40][28], -- no description radiation_shield = S[40][29], -- no description x_ray_viewer = S[40][30], -- no description operating_table = S[40][31], -- no description lamp = S[40][32], -- unused toilet_sink = "Vask: Her kan dine patienter vaske deres hænder. Hvis der ikke er nok håndvaske bliver de sure. Vaske er gode for hygiejnen.", op_sink1 = S[40][34], -- no description op_sink2 = S[40][35], -- no description surgeon_screen = S[40][36], -- no description lecture_chair = ": Når dine læger sidder her og tager noter, kan de kun blive klogere. Jo flere stole du har, jo större kan klassen være.", projector = S[40][38], -- no description bed2 = S[40][39], -- unused duplicate pharmacy_cabinet = "Apotekskab: Fyldt med medicin.", computer = "Computer: Genialt forskningsværktöj", atom_analyser = "Atomanalyser: Placeres i forskningsafdelingen, og gör hele forskningsprocessen hurtigere.", blood_machine = S[40][43], -- no description fire_extinguisher = "Brandslukker: Mindsker risikoen for, at dine maskiner brænder sammen.", radiator = "Radiator: Holder hospitalet varmt.", plant = "Plante: Holder patienternes humör oppe og renser luften.", electrolyser = S[40][47], -- no description jelly_moulder = S[40][48], -- no description gates_of_hell = S[40][49], -- no description bed3 = S[40][50], -- unused duplicate bin = "Skaldespand: Patienterne smider deres skrald her.. i hvert fald de velopdragne", toilet = "Toilet: Patienterne.. bruger dette.", swing_door1 = S[40][53], -- no description swing_door2 = S[40][54], -- no description shower = S[40][55], -- no description auto_autopsy = "Obduktionsautomat: Godt hjælpemiddel til at opdage nye behandlingsmetoder.", bookcase = "Bogreol: Indeholder opslagsværker til læger.", video_game = "Videospil: Lader personale slappe af med et spil Hi-Octane.", entrance_left = S[40][59], -- no description entrance_right = S[40][60], -- no description skeleton = "Skelet: Bruges til undervisning og til Halloween.", comfortable_chair = S[40][62], -- no description }, } -- 32. adviser = { -- Epidemic epidemic = { hurry_up = "Hvis du ikke tager dig af epidemien nu, kan du få store problemer. Skynd dig!", serious_warning = "Den smitsomme sygdom begynder at blive et seriöst problem. Du må göre noget snart!", multiple_epidemies = "Det ser ud som om du har mere end en epidemi i gang. Dette kan blive en enorm katastrofe for hospitalet!", }, -- Staff advice staff_advice = { need_handyman_machines = "Du bör ansætte flere pedeller til at tage sig af dine maskiner.", need_doctors = "Du har brug for flere læger. Pröv at placere lægerne i de rum, hvor der er længst kö.", need_handyman_plants = "Du skal ansætte en pedel til at vande planterne.", need_handyman_litter = "Folk er begyndt at svine på dit hospital. Få en pedel til at rydde op efter dine patienter og köb eventuelt flere skraldespande.", need_nurses = "Du har brug for flere sygeplejersker. Sengeafsnit og apoteker drives af sygeplejersker.", too_many_doctors = "Jeg tror du har for mange læger. Nogle af dem har ikke noget at lave.", too_many_nurses = "Jeg tror du har ansat for mange sygeplejersker.", }, -- Earthquake earthquake = { damage = "Jordskælvet har skadet %d maskiner og %d patienter i hospitalet.", -- %d (count machines), &d (count patients) alert = "Jordskælvsvarsel! Under et jordskælv tager dine maskiner skade. De kan brænde sammen hvis de ikke er ordentligt vedligeholdt.", ended = "Puha! Det var et stort skælv - det målte %d på Richters skala.", }, -- Multiplayer multiplayer = { objective_completed = "Du har klaret udfordringerne for denne bane - tillykke!", everyone_failed = "Ingen klarede udfordringerne, så alle kan spille videre!", players_failed = "Fölgende spiller(e) klarede ikke den forrige udfordring : ", poaching = { in_progress = "Jeg skal sige fra denne person, at han gerne vil arbejde for dig.", not_interested = "Ha! De er ikke interesserede i at arbejde for dig..", already_poached_by_someone = "Ikke tale om! Andre pröver allerede at overtale personen.", }, objective_failed = "Det lykkedes ikke for dig at klare udfordringerne.", }, -- Goals goals = { win = { money = "Du skal opnå %d for at klare de finansielle krav for denne bane.", cure = "Når du har helbredt yderligere %d patienter har du helbredt nok til et gennemföre banen.", reputation = "Sörg for at have et omdömme på over %d for at du kan genneföre banen.", value = "Dit hospital skal have en værdi på over %d för du kan gennemföre banen", }, lose = { kill = "Dræb %d patienter mere og du har tabt banen!", }, }, -- Information information = { larger_rooms = "Större rum får de ansatte til at föle sig bedre tilpas og forbedrer deres arbejde.", extra_items = "Flere genstande i kontorer og lokaler får dine ansatte til at föle sig bedre tilpas og forbedrer deres præstationer.", epidemic = "Der er en smitsom epidemi på dit hospital. Det skal du göre noget ved, NU!", promotion_to_doctor = "En af dine praktikanter er blevet forfremmet til doktor.", emergency = "Akkuttilfælde på vej, gör plads!", patient_abducted = "En af dine patienter er blevet bortfört af et rumvæsen!", first_cure = "Godt arbejde! Du har netop helbredt din förste patient! Fortsæt det gode arbejde.", promotion_to_consultant = "En af dine læger er blevet forfremmet til konsulent.", handyman_adjust = "Du kan göre en pedel mere effektiv ved at justere på hans prioriteringer.", promotion_to_specialist = "En af dine læger er blevet forfremmet til %s.", patient_leaving_too_expensive = "En patient forlader dit hospital. Dine priser er alt for höje for vedkommende!", vip_arrived = "Tid til fokus! - %s er netop ankommet til dit hospital. Sörg for at alt körer på skinner, så du kan göre et godt indtryk.", epidemic_health_inspector = "Sundhedsmyndighederne har fået besked om din epidemi. Du kan forvente et besög fra myndighederne meget snart.", first_death = "Du har netop dræbt din förste patient. Hvordan har du det med det?!", pay_rise = "En af dine ansatte truer med at sige op. Du skal vælge om du vil gå med til lönkravene eller om du vil fyre vedkommende. Klik på ikonet nede i venstre hjörne for at se, hvem som truer med at sige op.", place_windows = "Vinduer gör rum lysere og forbedrer arbejdsglæden hos dine ansatte.", fax_received = "Du har modtaget en fax. Du finder den i bunden af skærmen. En fax kan indeholde vigtig information som du skal forholde dig til.", initial_general_advice = { rats_have_arrived = "Rotterne har invaderet dit hospital! Pröv at skyde dem med musen.", autopsy_available = "Obduktionsautomaten er færdigudviklet. Med denne kan du få det bedste ud af patienter, som du ikke kan finde ud af hvad fejler. Advarsel! - Brug af denne maskine er meget kontrovatielt, hvis offentligheden får kendskab til den, kan det få negative konsekvenser for dit omdömme.", first_patients_thirsty = "Flere af dine patienter er törstige. De ville sætte pris på flere sodavandsautomater.", research_now_available = "Du har bygget din förste forskningsafdeling. Du kan styre afdelingens arbejde via forskningsskærmen som du finder i bundet af skærmbilledet.", psychiatric_symbol = "Læger med prykiatrisk uddannelse kan genkendes med symbolet: |", decrease_heating = "Folk på dit hospital sveder. Skru ned for varmen, det kan du göre på oversigtskortet.", surgeon_symbol = "Læger kan udföre kirurgiske indgreb hvis de har symbolet: {", first_emergency = "Akutte patienter har et blinkende blåt lys over deres hoved. Hvis du ikke helbreder dem inden tiden löber ud, dör de!", first_epidemic = "Der er udbrudt en epidemi på dit hospital. Du skal tage stilling til, om du vil forsöge at behandle de ramte selv, eller om du vil betale dig fra det.", taking_your_staff = "Nogen pröver at stjæle dit personale. Du må kæmpe for at beholde dem.", place_radiators = "Patienterne fryser - du bör placere flere radiatorer i dit hospital så patienterne kan holde varmen.", epidemic_spreading = "Epidemien spreder sig på dit hospital. Du skal vaccinere de inficerede patienter inden de forlader hospitalet.", research_symbol = "Forskere er læger med symbolet: }", machine_needs_repair = "Du har udstyr i dit hospital som har brug for at blive repareret. Find udstyret - det ryger fra det - og klik på det for at tilkalde en pedel.", increase_heating = "Folk fryser på dit hospital. Du kan Skrue op for varmen på oversigtskortet.", first_VIP = "Du er ved at modtage dit förste VIP-besög. Sörg for at VIP'en ikke ser noget uhygiejnisk eller triste patienter.", }, }, -- Build advice build_advice = { placing_object_blocks_door = "Hvis du placerer genstanden der, kan folk ikke komme til dören.", blueprint_would_block = "Hvis du placerede rummet sådan, ville det blokere for andre rum. Pröv at ændre rumstörrelsen eller flyt rummet til et andet sted!", door_not_reachable = "Folk kan ikke komme til dören.", blueprint_invalid = "Det er ikke en gyldig skitse.", }, } -- Confirmation confirmation = { quit = "Du har valgt at afslutte spillet. Er du sikker på, at du vil forlade spillet?", return_to_blueprint = "Er du sikker på, at du vil returnere til skitsen?", replace_machine = "Er du sikker på du vil erstatte %s for %d?", -- %s (machine name) %d (price) overwrite_save = "Der er allerede et spil gemt på denne plads. Skal det gemte spil overskrives?", delete_room = "Vil du virkeligt slette dette rum?", sack_staff = "Er du sikker på, at du vil give den ansatte sparket?", restart_level = "Er du sikker på, at du vil starte forfra med denne bane?", } -- Bank manager bank_manager = { hospital_value = "Hospitalets værdi", balance = "Balance", current_loan = "Nuværende lån", interest_payment = "Renter", insurance_owed = "Forsikringer skyldet", -- Is this even used in the game? inflation_rate = "Inflationsrate", -- Inflation rate.. never heard of that either. interest_rate = "Rente", statistics_page = { date = "Dato", details = "Detaljer", money_out = "Ud", money_in = "Ind", balance = "Balance", current_balance = "Nuværende balance", }, } -- Letters letter = { --original line-ends: 5 4 2 3 [1] = { [1] = "Kære %s//", [2] = "Fantastisk! Du har drevet hospitalet virkelig godt. Vi i Ministeriet vil höre, om du er intersseret i et deltage i et större projekt. Vi har et job, som vi tror ville passe dig rigtig godt. Vi kan friste med en lön på $%d. Tænk over det.//", [3] = "Er du interessert i jobbet på hospitalet %s?", }, [2] = { [1] = "Kære %s//", [2] = "Imponerende! Hospitalet er undergået en fantastisk udvikling. Vi har et andet sted, som du kan overtage, hvis du klar til nye udfordringer. Du behöver ikke tage udfordringen op, men det vil give en belönning i form af en lön på $%d//", [3] = "Er du interessert i at jobbet på hospitalet %s?", }, [3] = { [1] = "Kære %s//", [2] = "Din tid på dette hospital har været ekstremt vellykket. Vi spår dig en stor fremtid, og önsker at tilbyde dig en stilling et andet sted. Lönnen vil være $%d, og vi tror du vil elske de nye udfordringer, stillingen förer med sig.//", [3] = "Er du interessert i jobbet på hospitalet %s?", }, [4] = { [1] = "Kære %s//", [2] = "Tillykke! Vi i Ministeriet er meget imponerede over dine evner til drive hospitaler. Du er helt sikkert en gulddreng for sundhedsmyndighederne. Vi er overbeviste om, at du er klar til nye udfordringer på et större hospital. Vi er klar til at tilbyde en lön på $%d, men beslutningen er din.//", [3] = "Er du interessert i jobbet på hospitalet %s?", }, [5] = { [1] = "Kære %s//", [2] = "Hej igen. Vi respekterer dine önsker om at ikke forlade dette fantastiske hospital som du har opbygget, men vi beder dig overveje din beslutning igen. Vi er klar til at tilbyde en god lön på $%d hvis du er klar på at flytte til et andet område og få skabt et respektabelt hospital.//", [3] = "Er du klar til nye udfordringer på hospitalet %s?", }, [6] = { [1] = "Kære %s//", [2] = "Ministeriet hilser dig. Vi ved hvor glad du er blevet for dette nydelige og velorganiserede hospital, men vi mener, at du nu bör koncentrere dig om din karriere. Du vil få en respektabel lederlön på $%d hvis du bestemmer dig for at flytte. Det er i hvert fald en overvejelse værd.//", [3] = "Er du interessert i et nyt job på hospitalet %s?", }, [7] = { [1] = "Kære %s//", [2] = "Goddag! Sundhedsministeren tænker på, om du vil revurdere din stilling på dit nuværende hospital. Vi sætter pris på dit nydelige hospital, men vi tror, at du vil göre meget for en lidt mere udfordrende stilling, og en lön på $%d.//", [3] = "Er du interessert i et job på hospitalet %s?", }, [8] = { [1] = "Kære %s//", [2] = "Hej igen. Du tog ikke imod den forrige udfordring, da vi tilböd dig en alle tiders udfordring på et nyt hospital, og en lön på $%d. Vi mener, at tiden er inde til, at du bör revurdere beslutningen. Vi har det perfekte job til dig, tror vi.//", [3] = "Er du interessert i at tage jobbet på hospitalet %s?", }, [9] = { [1] = "Kære %s//", [2] = "Du har mere end en gang bevist, at du er den bedste i sundhedsvæsnet. Ingen tvivl! En så fantastisk præstation skal belönnes, så vi önsker at tilbyde dig stillingen som Administrerende Direktör for Alle Sygehuse. Dette er en ærefuld stilling, og giver dig en lön på hele $%d. Du får din egen Ticker-Tape parade, og folk kommer til at vise deres taknemmelighed, hvor end du går.//", [3] = "Tak for alt du har gjort i din tid som hospitalsdirektör. Vi önsker dig en lang og fantastisk pension.//", }, [10] = { [1] = "Kære %s//", [2] = "Tillykke! Du har drevet alle de hospitaler vi har givet dig ansvaret for på en udmærket facon. En sådan præstation kvalificerer dig til at få friheden til at rejse Jorden rundt. Du bliver belönnet med en pension på $%d, plus en limousine, og alt vi beder dig om er, at du rejser fra by til by, möder dine lidenskabelige fans, og promoverer hospitalets arbejde, hvor end du måtte befinde dig.//", [3] = "Vi er stolte af dig. Vi er alle taknemmelige over dit hårde arbejde som livredder.//", }, [11] = { [1] = "Kære %s//", [2] = "Din karriere har været eksemplarisk, og du er en stor inspiration for os alle. Tak for, at du har drevet så mange hospitaler, og gjort det så godt i alle dine stillinger. Vi önsker at give dig en livslang lön på $%d, og alt vi beder dig om er at rejse officelt fra by til by, og fortælle folk, hvordan du tjente så mange penge.//", [3] = "Du er et pragteksempel for alle os andre, og vi önsker dig al lykke og glæde fremover!//", }, [12] = { [1] = "Kære %s//", [2] = "Din succeskarriere som den beste hospitalsadministrator, den bedste siden Moses' tid, er ved vejs ende. Men siden du har haft så stor indvirkning på den medicinske verden, önsker Ministeriet at tilbyde dig en livsvarig lön på $%d bare for at være til stede på vore vegne, åbne fester, sösætte skibe og stille op i shows. Hele verden efterlyser dig, og du ville være fantastisk PR for os ude i verden!//", [3] = "Vær så venlig at tage imod denne stilling, det bliver ikke hårdt arbejde! Og vi skal sörge for, at du får politieskorte hvorend du kommer.//", }, } -- Humanoid start of names humanoid_name_starts = { [1] = "BJÖRN", [2] = "PER", [3] = "STOR", [4] = "GUL", [5] = "RIG", [6] = "SOL", [7] = "LANGE", [8] = "FLAD", [9] = "HÅRD", [10] = "MYG", [11] = "BAR", [12] = "SKODDE", [13] = "MÖRKE", [14] = "BLÅ", [15] = "KRIG", [16] = "LAT", [17] = "KRABBE", [18] = "FISK", [19] = "VÅD", [20] = "SEN", [21] = "GRAV", [22] = "BAK", [23] = "LAVE", [24] = "UD", [25] = "ENGE", [26] = "GRÖN", [27] = "KUR", [28] = "KVIT", [29] = "KJEVE", [30] = "TRYGLE", [31] = "KVÆAEN", [32] = "KRYKKE", [33] = "SKADE", } -- Humanoid end of names humanoid_name_ends = { [1] = "STAD", [2] = "BERG", [3] = "NES", [4] = "DAL", [5] = "LID", [6] = "HEIM", [7] = "HEM", [8] = "LAND", [9] = "SETH", [10] = "RUD", [11] = "VIK", [12] = "BÖ", [13] = "GAARD", [14] = "GÅRD", [15] = "HAUG", [16] = "LUND", [17] = "LOFT", [18] = "VER", [19] = "SAND", [20] = "LIE", [21] = "VOLD", [22] = "STRÖM", [23] = "LI", [24] = "DALEN", [25] = "DAHL", [26] = "BAKKEN", } -- VIP names vip_names = { health_minister = "Sundhedsministeren", "Peter Brixtofte", -- A guy that liked to drink VERY expensive vine on the whole cities bill. "Prins Henrik", "Master fatman", "Anders Fogh", "Lars Hjortshöj", "Svampebob", "Jes Dorph", "Michael Laudrup", "Lars larsen", -- Jysk sengetöjslager "Justin bæver", -- Dont think i like him.. i hate him! } -- Deseases diseases = { general_practice = { name = "Lægekonsultation", }, bloaty_head = { name = "Opsvulmet hoved", cause = "Årsag - Patienten har sniffet ost og drukket forurenet vand.", symptoms = "Symptomer - Den ramte har det meget ukomfortabelt. Föler mildest talt en vis oppustethed i hovedregionen.", cure = "Behandling - Der stikkes hul på det opsvulmede hoved, og ved hjælp af en genial maskine bliver hovedet sat tilbage til den korekte PSI.", }, hairyitis = { name = "Ekstrem hårvækst", cause = "Årsag - Lange gåture i måneskin medförer en uhensigtsmæssig udsættelse for månens stråler, som beskadiger hovedbunden og forårsager hårvækst i ukontrollabelt omfang på resten af kroppen.", symptoms = "Symptomer - Nedsat fremdrift i vand.", cure = "Behandling - En elektrolysemaskine fjerner hårvæksten og tilbageförer porene til deres normale stadie.", }, king_complex = { name = "Kongekompleks", cause = "Årsag - Elivs' ånd har taget kontrollen over patienten", symptoms = "Symptomer - Går med farvede lædersko, spiser cheesebrugere og udsætter hofter og knæ for ganske akavede stillinger", cure = "Behandling - En psykiater fortæller patienten hvor tåbelig han ser ud", }, invisibility = { name = "Usynlighed", cause = "Årsag - Bidt af en radioaktiv (og usynlig) myre", symptoms = "Symptomer - Patienten lider ikke - tværtimod! De udnytter situationen og lurer på deres familie og venner!", cure = "Behandling - En farverig drik fra apoteket gör patienten fuldt synlig igen", }, serious_radiation = { name = "Alvorlig bestråling", cause = "Årsag - Har forvekslet plutonium-isotoper med tyggegummi", symptoms = "Symptomer - Patienten föler sig meget ukomfortabel", cure = "Behandling - Patienten placeres i en saniteringsbruser og renset fuldstændigt.", }, slack_tongue = { name = "Slap tunge", cause = "Årsag - Kronisk overivrighed i diskussioner om sæbeoperaer.", symptoms = "Symptomer - Tungen hæver til det femdobbelte.", cure = "Behandling - Tungen bliver placeret i en tungeskærer. Hævelsen fjernes derefter hurtigt, effektivt og smertefuldt.", }, alien_dna = { name = "Udenjordisk DNA", cause = "Årsag - Patienten er blevet bidt af iler udstyret med intelligent rumvæsenblod.", symptoms = "Symptomer - Er under gradvis forvandling til et rumvæsen, og udvikler et önske om at overtage verdensherredömmet", cure = "Behandling - Alt DNA fjernes mekanisk, renses for rumvæsenceller, og bliver hurtig erstattet", }, fractured_bones = { name = "Knoglebrud", cause = "Årsag - Fald fra höjder ned på beton", symptoms = "Symptomer - Höje knaselyde og meget lidt bevægelighed på de udsatte steder", cure = "Behandling - Gipsen fjernes ved hjælp af en laserstyret gipsfjerner", }, baldness = { name = "Ekstremt hårtab", cause = "Årsag - Fortæller lögne og opdigter historier for at forbedre sin popularitet.", symptoms = "Symptomer - Forlegen patient med skinnende pande.", cure = "Behandling - Håret bliver hurtigt smeltet fast til patientens hoved med en smertefuld hårmaskine.", }, discrete_itching = { name = "Skrabesyge", cause = "Årsag - Små insekter med skarpe tænder.", symptoms = "Symptomer - Patienten klör intenst, og huden slår revner.", cure = "Behandling - En sygeplejeske giver patienten en sirupagtig drik som heler huden og som hindrer flere revner.", }, jellyitis = { name = "Gelésyndrom", cause = "Årsag - Geletholdig kost og megen motion.", symptoms = "Symptomer - Meget ustabil og falder ofte.", cure = "Behandling - Patienten bliver presset ned i et gelérör i et specielt rum.", }, sleeping_illness = { name = "Sövnsyge", cause = "Årsag - Forårsaget af overaktive sövnkirtler i ganen.", symptoms = "Symptomer - Stærkt önske om at sove, hvor og når som helst.", cure = "Behandling - En stærk dosis af stimulerende medicin uddelt af en sygeplejerske.", }, pregnancy = { name = "Graviditet", cause = "Årsag - Forårsaget af strömafbrydelser i bebyggede områder.", symptoms = "Symptomer - Spiser ustandseligt og udvikler en ölmave.", cure = "Behandling - Sprædbanet fjernes ved kejsersnit, vaskes og præsenteres derefter for sin mor.", }, -- unused transparency = { name = "Gennemsigtighed", cause = "Årsag - Slikket på folien på gamle yougurtkartoner.", symptoms = "Symptomer - Kroppen bliver gennemsigtig og ækel.", cure = "Behandling - En kölig, farverige drik fra apoteket skulle göre underværker.", }, uncommon_cold = { name = "Forkölelse", cause = "Årsag - Små smörpartikler i luften.", symptoms = "Symptomer - Rendende næse, hoste og misfarvet slim fra lungerne.", cure = "Behandling - En rigtig stor mundfuld hostesaft fra apoteket medförer öjeblikkelig lindring.", }, broken_wind = { name = "Forurenende gasser", cause = "Årsag - Löb på en trædemölle umiddelbart efter indtagelse af frokost.", symptoms = "Symptomer - Ubehag hos folk som befinder sig i patientens nærhed.", cure = "Behandling - En stærk blandning af specielle vandatomer der drikkes hurtigt.", }, spare_ribs = { name = "Spareribs", cause = "Årsag - Patienten har siddet for længe på et koldt gulv.", symptoms = "Symptomer - Ubehagelig fölelse i brystet.", cure = "Behandling - Ribbenene fjernes af to kirurger, og leveres til patienten i en doggybag.", }, kidney_beans = { name = "Kikærter", cause = "Årsag - patienten har spist isterninger.", symptoms = "Symptomer - Smerte og hyppige ture til toilettet", cure = "Behandling - To kirurger fjerner de ærtelignende parasitter, uden at beröre nyrerne!", }, broken_heart = { name = "Knust hjerte", cause = "Årsag - Nogen er rigere, yngre og slankere end patienten.", symptoms = "Symptomer - Hysterisk grædende. Blodsprængte fingerspidser efter at have revet feriebilleder i stykker.", cure = "Behandling - To kirurger sprætter brystet op og sætter derefter hjertet forsigtigt sammen, mens de holder vejret.", }, ruptured_nodules = { name = "Ödelagte nödder", cause = "Årsag - Skihop om vinteren.", symptoms = "Symptomer - Umulig at sidde ned med vedbehag.", cure = "Behandling - To kvalificerede kirurger må fjerne nödderne med forsigtige hænder.", }, tv_personalities = { name = "Programledersyndrom", cause = "Årsag - Ser TV i dagstimerne.", symptoms = "Symptomer - Forestiller sig at han/hun er programleder på formiddagstv og elsker at introducere madseancen.", cure = "Behandling - En psykiater må overtale patienten til at köbe en radio og sælge fjernsynet.", }, infectious_laughter = { name = "Smitsom latter", cause = "Årsag - Klassisk komedie på TV.", symptoms = "Symptomer - Ler hjælpelöst hele tiden og gentager dårlige passager som absolut ikke er morsomme.", cure = "Behandling - En kvalificeret psykiater må göre det klart for patienten, at det faktisk er en alvorlig tilstand.", }, corrugated_ankles = { name = "Böjede ankler", cause = "Årsag - Kört med bus over fartbump.", symptoms = "Symptomer - Skoene passer ikke.", cure = "Behandling - En giftig blanding af urter og krydderier må drikkes for at udrette anklerne.", }, chronic_nosehair = { name = "Kronisk næsehår", cause = "Årsag - Snöfter med foragt af folk med lavere indlægt.", symptoms = "Symptomer - Så mange næsehår at en grævling kunne bo der.", cure = "Behandling - En ækel, hårfjernende kur som skal drikkes. Fås på apoteket.", }, third_degree_sideburns = { name = "Tredjegrads bakkenbarter", cause = "Årsag - Længes efter 70-erne.", symptoms = "Symptomer - Stort hår, farverigt töj, lange bakkenbarter og glitter.", cure = "Behandling - Psykiatrisk personale må, ved brug af moderne teknikker, overbevise patienten om, at paryk yt.", }, fake_blood = { name = "Teaterblod", cause = "Årsag - Patienten er ofte udsat for narrestreger.", symptoms = "Symptomer - Rödt blod som fremkommer når der er kontakt med töj.", cure = "Behandling - Eneste måde at behandle dette på er at få en psykiater til at berolige patienten.", }, gastric_ejections = { name = "Sure opstöd", cause = "Årsag - Stærk krydret mexikansk eller indisk mad.", symptoms = "Symptomer - Gylper karrykylling og tacostykker op..", cure = "Behandling - En sygeplejerske giver patienten en speciel indisk komælk som forhindrer sure opstöd.", }, the_squits = { name = "Tynd mave", cause = "Årsag - Har spist pizzastykker som har været på gulvet.", symptoms = "Symptomer - Uh. Tror du kender symptomerne.", cure = "Behandling - En klæbrig blanding af kemikalier der skal drikkes for at stabilisere maven.", }, iron_lungs = { name = "Jernlunger", cause = "Årsag - Forurenet luft indeholdende bly og kebabrester.", symptoms = "Symptomer - Kan lave flammer og råbe höjlydt under vand.", cure = "Behandling - To kirurger blödgör de hårde lunger i operationsstuen.", }, sweaty_palms = { name = "Svedige håndflader", cause = "Årsag - Har lige været til jobsamtale.", symptoms = "Symptomer - At give hånd til patienten er som at give hånd til en våd svamp.", cure = "Behandling - En pskiater taler med patienten om lidelsen.", }, heaped_piles = { name = "Hæmorider", cause = "Årsag - Siddet for længe på det kolde gulv.", symptoms = "Symptomer - Patienten föler, at han/hun sidder på en pose sten.", cure = "Behandling - En behagelig, men syrlig væske som löser hæmorideproblemet.", }, gut_rot = { name = "Dårlig mave", cause = "Årsag - Onkel Georges blanding af hostesaft og whisky.", symptoms = "Symptomer - Ingen hoste, men heller ingen mavesæk.", cure = "Behandling - En sygeplejerske udskriver en række kemikalier som genskaber væggene i mavesækken.", }, golf_stones = { name = "Golfsten", cause = "Årsag - Udsat for giftige gasser fra golfbolde.", symptoms = "Symptomer - Forvirring og en kraftig skamfölelse.", cure = "Behandling - Stenene fjernes hurtigt og effektivt af to kirurger.", }, unexpected_swelling = { name = "Uventet hævelse", cause = "Årsag - Hvad som helst uventet.", symptoms = "Symptomer - Hævelse.", cure = "Behandling - Hævelsen må skæres bort af to kirurger.", }, diag_scanner = { name = "Diag Skanner", }, diag_blood_machine = { name = "Diag Blodmaskine", }, diag_cardiogram = { name = "Diag löbebånd", }, diag_x_ray = { name = "Diag Röntgen", }, diag_ultrascan = { name = "Diag Ultraskanner", }, diag_general_diag = { name = "Diag Generel", }, diag_ward = { name = "Diag Sengeafd.", }, diag_psych = { name = "Diag Psykiatri", }, autopsy = { name = "Obduktion", }, } -- Faxes fax = { -- Debug fax debug_fax = { -- never seen this, must be a debug option of original TH -- TODO: make this nicer if we ever want to make use of it close_text = "Yes, yes, yes!", text1 = "BEST COUNT %d", -- %d text2 = "TOTAL PEOPLE IN HOSPITAL %d CHECKING AGAINST %d", -- %d %d text3 = "FIGURES : DOCS %d NURSES %d AREA %d ROOMS %d PRICING %d", -- %d %d %d %d %d text4 = "FACTORS : DOCS %d NURSES %d AREA %d ROOMS %d PRICING %d", -- %d %d %d %d %d text5 = "CONTRIBN : DOCS %d NURSES %d AREA %d ROOMS %d PRICING %d PERCENT", -- %d %d %d %d %d text6 = "THE FOLLOWING FACTORS ARE ALSO APPLIED", text7 = "REPUTATION: %d EXPECTED %d REDUCTION %d", -- %d %d %d text8 = "AMENITIES %d PEEPS HANDLED %d REDUCTION %d", -- %d %d %d text9 = "DISASTERS %d ALLOWED (MTHS) %d (%d)REDUCTION %d", -- %d %d %d %d text10 = "KILLS %d ALLOWED (MTHS) %d (%d) REDUCTION %d", -- %d %d %d %d text11 = "PEOPLE THIS MONTH %d", -- %d }, -- Emergency emergency = { choices = { accept = "Ja, jeg kan håndtere dette akkuttilfælde", refuse = "Nej, jeg nægter at tage mig af dette akkuttilfælde", }, location = "Der er sket en ulykke ved %s", num_disease = "Der er %d mennesker med %s som har brug for behandling med det samme.", cure_possible_drug_name_efficiency = "Du har den medicin som er nödvendig for at behandle patienterne. Det er %s og medicinen er %d procent effektiv.", cure_possible = "Du har det nödvendige udstyr og de færdigheder som skal bruges for at håndtere akuttilfældet.", cure_not_possible_build_and_employ = "Det vil være nödvendigt at bygge %s og ansætte en %s", cure_not_possible_build = "Du mangler %s for at håndtere dette", cure_not_possible_employ = "Du mangler en %s for at kunne håndtere dette", cure_not_possible = "Du kan ikke behandle denne sygdom i öjeblikket", bonus = "Hvis du klarer dette akkuttilfælde, vil du modtage en bonus på maksimalt %d. Hvis du derimod fejler, vil det få negative fölger for dit omdömme.", locations = { "A.Tom's Våbenkælder", "Snoppeuniversitetet", "Buskerud Hagecenter", "Forskningsinstituttet For Farlige Emner", "Foreningen For Folkedansende Mænd", "Puben Frosk Og Kyr", "Hallgeir Juniors Begravelses- og Spritbutik", "Mamma-Tai Krydderhus", "Berts Varehus For Brugt Petrokemi", }, }, emergency_result = { close_text = "Klik for at lukke", earned_money = "Af den maksimale bonus på %d, har du tjent %d.", saved_people = "Du reddede %d mennesker af i alt %d.", }, -- Deseace discovered disease_discovered_patient_choice = { choices = { send_home = "Send patienten hjem.", wait = "Få patienten til at vente et stykke tid på hospitalet.", research = "Send patienten til forskningsafdelingen.", }, need_to_build_and_employ = "Hvis du bygger %s og ansætter en %s kan du löse problemet med det samme.", need_to_build = "Du skal bygge %s for at kunne håndtere dette.", need_to_employ = "Ansæt en %s for at hjælpe patienten.", can_not_cure = "Du kan ikke behandle denne sygdom.", disease_name = "Dine ansatte er stödt på et tilfælde af %s.", what_to_do_question = "Hvad skal vi göre med patienten?", guessed_percentage_name = "Dine læger mener, at de ved hvad patienten fejler. Der er %d procent sandsynlighed for at det er %s", }, disease_discovered = { close_text = "Luk.", can_cure = "Du kan behandle denne sygdom.", need_to_build_and_employ = "Hvis du bygger %s og ansætter en %s kan du håndtere dette.", need_to_build = "Du skal bygge %s for at håndtere dette.", need_to_employ = "Ansæt en %s for at behandle patienter med denne sygdom.", discovered_name = "Dine læger har oppdaget et tilfælde af %s.", }, -- Epidemic epidemic = { choices = { declare = "Offentliggör epidemien og betal en böde. Dit omrömme vil blive svækket.", cover_up = "Forsög at behandle alle inficerede patienter inden tiden löber ud, og för nogen smittede forlader hospitalet.", }, disease_name = "Dine læger har opdaget en meget smitsom form for %s.", declare_explanation_fine = "Hvis du offentliggör epidemien, skal du betale en böde på %d og dit omdömme lider et knæk, men samtlige patienter bliver vaccineret automatisk.", cover_up_explanation_1 = "Hvis du derimod forsöger at holde epidemien skjult, skal du behandle samtlige vaccinerede patienter för sundhedsmyndighederne opdager, hvad der foregår.", cover_up_explanation_2 = "Hvis en sundhedsinspektör kommer på besög og finder ud af, at du har forsögt at skjule epidemien, vil han gå drastisk til værks.", }, -- Epidemic result epidemic_result = { close_text = "Hurra!", failed = { part_1_name = "Du forsögte at skjule det faktum, at vi stod overfor et smitsomt udbrud af %s.", part_2 = "Selvfölgelig var dine medarbejdere i stand til at sprede epidemien til alle hospitalets naboer.", }, succeeded = { part_1_name = "Sundhedsinspektören hörte rygter om at dit hospital kæmpede med et alvorligt tilfælde af %s.", part_2 = "Han har dog ikke fundet noget, som har kunne bekræfte rygterne.", }, compensation_amount = "Myndigherne har besluttet at give dig en kompensation på %d for den skade, dit ellers gode rygte har lidt.", fine_amount = "Myndighederne har erklæret en national undtagelsestilstand og forlanger, at du betaler en böde på %d.", rep_loss_fine_amount = "Velkommen på forsiden! Dit rygte har fået en ordenligt lussing! Samtidigt får du en böde på %d.", hospital_evacuated = "Sundhedsmyndighederne ser ingen anden mulighed end at evakuere dit hospital.", }, -- VIP visit query vip_visit_query = { choices = { invite = "Send en officiel invitation.", refuse = "Afvis besöget med en dårlig undskyldning.", }, vip_name = "%s har ytret et önske om at besöge dit hospital", }, -- VIP visit result vip_visit_result = { close_text = "Tak fordi du besögte hospitalet.", telegram = "Telegram!", vip_remarked_name = "Efter sit besög på dit hospital, udtalte %s fölgende:", cash_grant = "Du får %d i kontanter.", rep_boost = "Dit ry i nærområdet har fået en optur.", rep_loss = "Dit ry i nærområdet har taget skade.", remarks = { super = { "Det er et meget flot hospital. Næste gang jeg bliver alvorligt syg, vil jeg indlægges der.", "Se det er hvad jeg kalder for et hospital af topklasse!", "Et super hospital, og det er noget jeg ved en del om, for jeg har været indlagt en hel del gange.", }, good = { "Det er et godt organiseret hospital. Tak fordi jeg måtte komme.", "Hmm. Det er absolut ikke noget dårligt sted, jeg har set.", "Jeg kan godt lide dit charmerende hospital. Forresten, er der nogen som vil med ud at spise indisk?", }, mediocre = { "Nå, jeg har set værre. Men du kunne göre en lang række forbedringer.", "Åh, min kære tid. Det her er ikke det sted man går hen, hvis man föler sig dårlig.", "Et helt normalt hospital, for at være ærlig. Jeg havde forventet noget mere.", }, bad = { "Hvad laver jeg egentlig her?! Det er jo værre end en fire timers opera!", "Det var ækelt! Kalder du det her et hospital?! Det ligner mere en svinesti!", "Jeg er træt af at være en offentlig person, og træt af at skulle besöge steder som dette stinkende hul! Jeg siger op!.", }, very_bad = { "Föj for et syn! Dette hospital skal jeg nok få lukket ned!", "Jeg har aldrig set magen. Det er en skandale!", "Jeg er chokeret! Du kan ikke kalde dette et hospital! Jeg går ud og tager mig en stærk drink!", }, }, }, -- Diagnosis failed diagnosis_failed = { choices = { send_home = "Send patienten hjem", take_chance = "Tag chancen med den mest sandsynlige diagnose.", wait = "Få patienten til at vente mens du bygger flere diagnoserum.", }, situation = "Vi har prövet alle vores diagnoserum på denne patient, men vi er ikke helt sikre på, hvad patienten fejler.", what_to_do_question = "Hvad skal vi göre med patienten?", partial_diagnosis_percentage_name = "Det er %d procent sikkert at patienten har en type af %s, men hvis vi tager fejl, kan det få alvorlige konsekvenser for patienten.", }, } -- Queue window queue_window = { num_in_queue = "Antal ventende", num_expected = "Yderligere på vej", num_entered = "Antal besög", max_queue_size = "Maks kö", } -- Dynamic info dynamic_info = { patient = { actions = { dying = "Döende", awaiting_decision = "Venter på din beslutning", queueing_for = "I kö til %s", -- %s on_my_way_to = "På vej til %s", -- %s cured = "Helbredt!", fed_up = "Irriteret, forlader hospitalet", sent_home = "Sendt hjem", sent_to_other_hospital = "Henvist til et andet hospital", no_diagnoses_available = "Ikke flere diagnosemuligheder", no_treatment_available = "Ingen behandling er mulig - Jeg går hjem", waiting_for_diagnosis_rooms = "Venter på du byggger flere diagnoserum", waiting_for_treatment_rooms = "Venter på du bygger et behandlingsrum", prices_too_high = "Prisene er for höje - Jeg går hjem", epidemic_sent_home = "Sendt hjem af inspektör", epidemic_contagious = "Jeg er smittebærende", }, diagnosed = "Diagnose: %s", -- %s guessed_diagnosis = "Gættet diagnose: %s", -- %s diagnosis_progress = "Diagnoseproces", emergency = "Akut: %s", -- %s (disease name) }, vip = "Besögende VIP", health_inspector = "Sundhedsinspektör", staff = { psychiatrist_abbrev = "Psyk.", actions = { waiting_for_patient = "Venter på patient", wandering = "Vandrer rundt", going_to_repair = "Skal reparere %s", -- %s (name of machine) }, tiredness = "Udbrændthed", ability = "Evner", -- unused? }, object = { strength = "Udholdenhed: %d", -- %d (max. uses) times_used = "Timer brugt: %d", -- %d (times used) queue_size = "Kölængde: %d", -- %d (num of patients) queue_expected = "Forventet kölængde: %d", -- %d (num of patients) }, } introduction_texts = { level17 = "Dette er sidste advarsel - hold öje med dit omdömme - det er det, som tiltrækker patienter til dit hospital. " .. "Hvis der ikke dör for mange patienter og du samtidig holder resten af patienterne i nogenlunde godt humör, skulle denne bane ikke være noget problem.//" .. "Nu må du klare dig selv. Held og lykke!", level1 = "Velkommen til dit förste hospital!//" .. "Du kan komme godt fra start ved at ved at få placeret en reception, bygge en lægekonsultation og ansætte en læge og en receptionist. " .. "Derefter kan du åbne hospitalet, og de første patienter vil derefter begynde at ankomme til hospitalet." .. "Det vil være fornuftigt at bygge en psykiatri rimelig hurtigt og ansætte en læge med speciale i psykiatri. " .. "Et apotek og en sygeplejerske er essentielle for at helbrede dine patienter. Mange sygdomme behandles nemlig med medicin. " .. "Læg mærke til hvis der er mange tilfælde af opsvulmet hoved - et pumperum kan klare opgaven. " .. "For at gennemföre banen skal du helbrede mindst 10 patienter og sörge for, at dit omdömme ikke dykker under 200. ", level9 = "Efter du har fyldt ministerens bankkonto op og betalt for hans nye limousine, kan du nu koncentrere dig om at lave et omsorgsfuldt, velfungerende hospital for de trængende. " .. "Du må forvente at möde en række problemer her." .. "Hvis du har nok lokaler og flinke ansatte, vil du sikkert få styr på banens udfordringer. " .. "Dit hospital skal have en værdi af 200,000, og du skal have mindst 400,000 i banken. " .. "Mindre kan ikke göre det.", level2 = "Der er store problemer med sygdomme i dette område. " .. "Byg hospitalet med henblik på at behandle flere patienter og anlæg en forskningsafdeling. " .. "Husk at holde hospitalet rent og stræb efter at få så höjt et omdömme som muligt - hvis du vil kunne håndtere sygdomme som slap tunge, bliver det nödvendigt at bygge en tungeklinik. " .. "Du kan også bygge et löbebånd for at forbedre diagnosticeringen. Disse rum er först tilgængelige, når du har forsket i området i din forskningsafdeling. " .. "Du kan udvide hospitalet så du får mere plads at bygge på - brug oversigtskortet til dette " .. "Stræb efter at få et omdömme på 300 og en banksaldo på 10,000, samt helbrede mindst 40 patienter. ", level7 = "Her vil du være under overvågning af sundhedsmyndighederne, så husk at få det til at se ud som om du tjener kassen samtidig med at du opbygger et godt omdömme. " .. "Vi kan ikke holde til unödvendige dödsfald - de er dårlige for virksomheden. " .. "Vær sikker på at dit personale er i tip-top form, og at du har alt det udstyr, de har brug for. " .. "Opbyg dit omdömme til 600, og få 200,000 ind på din bankkonto.", level5 = "Dette bliver et travlt hospital, hvor du skal håndtere en lang række sager. " .. "Alle læger kommer direkte fra fakultetet, så det er vitalt, at du får bygget et undervisningsrum og uddanner lægerne så de bliver dygtigere, hurtigere og gerne så de får et speciale eller to. " .. "Du har kun tre konsulenter til at undervise dit uerfarende personale med, så hold dem glade. " .. "Hold for öje, at hospitalet er bygget på San Androids geologiske undergrund. " .. "Der er derfor en evig risiko for, at der kommer jordskælv. " .. "Jordskælv kan forårsage betydlig skade på dine maskiner og påvirke effektiviteten på dit hospital. " .. "Få dit omdömme op på 400 og din bankbalance op på 50,000 for at gennemföre banen. Du skal også helbrede 200 patienter.", level4 = "Hold alle dine patienter glade, få dem hurtigt igennem systemet og hold dödstallet så lavt som muligt." .. "Dit omdömme er på spil, sörg for at have et så godt omdömme som muligt." .. "Lad være med at fokusere for meget på pengene - de skal nok rulle ind i takt med dit stigende omdömme. " .. "Det vil være muligt for dig at undervise dine læger, så de kan udvikle deres evner og blive endnu hurtigere. " .. "Undervisningen varetages af konsulenter. Hvis de har særlige færdigheder som psykiater eller kirurg, vil deres elever med tiden også blive oplært i disse færdigheder. Og det kan de hurtigt få brug for, når patienter med mere krævende sygdomme begynder at ankomme. " .. "Opnå et omdömme på mere end 500.", level14 = "Der er lige en udfordring mere - det fuldstændigt uregerlige hospital. " .. "Hvis det lykkedes for dig at göre dette hospital til en succes, vil du være en mester af mestrene. " .. "Men forvent ikke, at du kan tage den på rutinen, for dette er den stöste udfordring, du nogensinde vil möde. " .. "Held og lykke!", level15 = "Sådan, det er det mest basale, som holder et hospital sammen.//" .. "Dine læger får brug for al den hjælp de kan få til at diagosticere patienterne. Du kan hjælpe dig ved at" .. "bygge andre diagnose faciliteter, så som et generel diagnoserum.", level8 = "Det er op til dig at skabe det mest effektive og produktive hospital som muligt. " .. "Folk fra dette område er ret velhavende, så pres dem for så mange penge som muligt. " .. "Husk: At helbrede folk er meget rart, men du har VIRKELIG BRUG FOR de penge det giver." .. "Flå disse patienter indtil selv Stein Bagger ville få moralske skrubler! " .. "Opnå et massivt overskud på 300,000 for at gennemföre denne bane.", level13 = "Dine fantastiske evner til at administrere et hospital, er blevet bemærket af en speciel hemmelig afdeling under hemmelige specielle afdelinger. " .. "De har en speciel bonus til dig; der er et rotteproblem på et hospital, som mangler en kærlig hånd. " .. "Du skal skyde så mange rotter som muligt för pedellerne kan rydde op i skidtet. " .. "Tror du, at du kan klare opgaven?", level16 = "Når du har diagnosticeret nogle af patienterne, bliver du nödt til at bygge behandlingsfaciliteter og klinikker til at helbrede dem - en godt sted at begynde med" .. "er et apotek. Du skal bruge en sygeplejerske til at udlevere medicinen.", level6 = "Brug al din viden til at udvikle et velfungerende og komfortabelt hospital, som kan skabe et sundt overskud og håndtere alle former for sygdomme, som samfundet smider efter det. " .. "Du skal være opmærksom på, at atmosfæren i dette område er perfekt til at bære infektioner og sygdomme. " .. "Med mindre du holder dit hospital helt rent, risikerer du, at der udbryder epidemier blandt patienterne. " .. "Tjen 150,000 og forög hospitalets samlede værdi til 140,000.", level12 = "Du möder nu udfordringen over dem alle. " .. "Ministeriet er imponeret over dine succeser og har derfor et top-job til dig: De vil have dig til at bygge det ultimative hospital, hvor du skal tjene en pokkers masse penge og have et skyhöjt omdömme. " .. "Det forventes, at du köber alle bygninger, helbreder alle sygdomme (og vi mener alle!) og opnår banens mål og priser. " .. "Klar til udfordringen?" .. "Tjen 650,000, helbred 750 personer, og få et omdömme på 800 for at gennemföre banen.", level3 = "Du vil denne gang skulle bygge dit hospital i et velhavende kvarter. " .. "Sundhedsmyndighederne holder öje med dig for at sikre, at du skaber et overskud her. " .. "Du begynder med et godt omdömme, men så snart hospitalet er åbent, skal du fokusere på at få tjent så mange penge som muligt. " .. "Der er også stor sandsynlighed for akuttilfælde. " .. "Disse indeholder et stort antal patienter, som ankommer samtidig og som alle har den samme sygdom. " .. "Hvis du helbreder dem indenfor tidsgrænsen, forbedrer det dit omdömme og modtager en stor bonus. Når du ikke at helbrede dem inden tiden löber ud, dör patienterne og dit omdömme falder. " .. "Sygdomme som kongekomplekset kan forekomme, og du bör bygge en operationsstue samt et sengeafsnit i nærheden af operationsstuen. " .. "Tjen 20,000 for at gennemföre banen.", level10 = "Såvel som at kunne behandle alle former for sygdomme, vil Sundhedsmyndighederne gerne have, at du bruger noget tid på at forske i effektiviteten af din medicin. " .. "Der har været nogle klager fra Foreningen af Syge, de syges vagthund. Så for at holde dit omdömme höjt skal du sörge for, at din medicin er effektiv. " .. "Du skal også sikre dig, at dit hospital er over gennemsnittet. Hold dödstallet så lavt som muligt" .. "Et lille tip er at du holder lidt plads fri til et gelérör. " .. "Udvikl al din medicin til mindst 80% i effektivitet og få et omdömme på 650 og en bankbeholdning på 500,000 for at gennemföre banen. ", level11 = "Du har nu fået chancen for at bygge det ultimative hospital. " .. "Dette er et ekstremt velhavende område, hvor Sundhedsmyndighederne gerne vil sig, at der opföres det bedst mulige hospital. " .. "Vi forventer, at du tjener kassen, har et skyhöjt omdömme og håndterer alle uventede situationer. " .. "Dette er en vigtig opgave." .. "Du skal være lavet af noget specielt for at dette skal lykkedes. " .. "Bemærk, at en UFO er set i området. Så forbered dit personale på uventet besög. " .. "Dit hospital skal være mindst 240,000 værd, og du skal have mindst 500,000 i banken samt et omdömme på 700 för syndhedsmyndighederne er tilfredse.", level18 = "", } -- Miscellangelous -- Category of strings that fit nowhere else or we are not sure where they belong. -- If you think a string of these fits somewhere else, please move it there. -- Don't forget to change all references in the code and other language files. misc = { grade_adverb = { mildly = "Mildt", moderately = "Moderat", extremely = "Ekstremt", }, done = "Færdig", pause = "Pause", send_message = "Beskeden er sendt til: %d", -- %d (player number) send_message_all = "Beskeden er sendt til alle", save_success = "Gemt med success", save_failed = "Mislykkedes at gemme", hospital_open = "Åbent hospital", out_of_sync = "Spillet er ikke synkroniseret", load_failed = "Indlæsning fejlede", low_res = "Lav oplösning", balance = "Balance fil: ", mouse = "Mus", force = "Styrke", } ----- Old but strings that failed with previous setup progress_report.quite_unhappy = "Folk er ret triste. " progress_report.header = "Progessionsrapport" progress_report.very_unhappy = "Folk er meget triste. " progress_report.more_drinks_machines = "Opsæt flere sodavandsautomater. " progress_report.too_cold = "Det er alt for koldt. Placer flere radiatorer eller skru op for varmen. " progress_report.too_hot = "Juster varmen. Det er alt for varmt. " progress_report.percentage_pop = "% population" progress_report.win_criteria = "Kriterier for at vinde" debug_patient_window.caption = "Fejlfindingspatient" tooltip.casebook.cure_requirement.hire_staff_old = "Du skal ansætte en %s for at kunne håndtere denne sygdom" tooltip.casebook.cure_type.unknown = "Du kan endnu ikke behandle denne sygdom" tooltip.bank_manager.interest_rate = "Årlig rente" tooltip.calls_dispatcher.assigned = "Denne box er afkrydset hvis nogen har fået den pågældende opgave tildelt." tooltip.calls_dispatcher.task = "Liste over opgaver - Klik på en opgave for at se vinduet over tildelt personale og scroll til opgaven" tooltip.calls_dispatcher.close = "Luk kald på afsender vinduet" adviser.level_progress.halfway_lost = "Du er omkring halvejs mod at tabe denne bane." adviser.level_progress.dont_kill_more_patients = "Du har ikke råd til at lade flere patienter dö!" adviser.level_progress.another_patient_killed = "Åh nej! Du har dræbt endnu en patient. Det giver samlet %d dödsfald." adviser.level_progress.halfway_won = "Du er halvejs mod at vinde denne bane." adviser.level_progress.close_to_win_increase_value = "Du er tæt på at vinde banen. Forög hospitalets værdi med %d." adviser.level_progress.financial_criteria_met = "Du har opnået de finatielle kriterier for denne bane. Nu skal du holde din balance over %d, imens du skal sikre dig at dit hospital körer som smurt" adviser.level_progress.nearly_won = "Du er meget tæt på at gennemföre banen." adviser.level_progress.hospital_value_enough = "Hold hospitalets værdi over %d og arbejd med de andre problemer for at vinde banen." adviser.level_progress.another_patient_cured = "Meget flot - endnu en patient helbredt. Det er samlet %d patienter." adviser.level_progress.three_quarters_lost = "Du er tre fjerdedele fra at tabe runden." adviser.level_progress.reputation_good_enough = "Okay, dit ry er godt nok for at kunne gennemföre runden. Hold det over %d og arbejd med de andre problemer for at vinde runden." adviser.level_progress.cured_enough_patients = "Du har kureret nok patienter, men du skal foröge dit hospitals værdi for at vinde runden." adviser.level_progress.nearly_lost = "Du er meget tæt på at vinde runden." adviser.level_progress.improve_reputation = "Du skal forbedre dit ry med %d for at have en chance for at vinde runden." adviser.level_progress.three_quarters_won = "Du er tre fjerdedele væk fra at vinde runden." adviser.praise.many_benches = "Der er rigelig med siddeplads. Flot arbejde!" adviser.praise.many_plants = "Smukt. Du har masser af planter. Dine patienter sætter pris på det." adviser.praise.plants_are_well = "Hvor dejligt! Du tager dig rigtig godt af dine planter. Smukt." adviser.praise.few_have_to_stand = "Der er næsten ingen der skal stå op på dit hospital mens de venter. Det sætter dine patienter pris på det." adviser.praise.plenty_of_benches = "Der er fornuftigt med siddepladser, så det er ikke et problem." adviser.praise.plants_thriving = "Meget godt. Dine planter trives. De ser fantastiske ud. Bliv ved med det, så kan du måske vinde et trofæ for dem." adviser.praise.patients_cured = "%d patienter helbredt." adviser.surgery_requirements.need_surgeons_ward_op = "Du skal ansætte to kirurger og bygge et sengeafsnit og en operationsstue för du kan udföre operationer." adviser.surgery_requirements.need_surgeon_ward = "Du mangler stadigt at ansætte en kirurg og bygge et sengeafsnit för du kan udföre operationer." adviser.vomit_wave.started = "Der ser ud til du har en mavevirus på dit hospital. Hvis hospitalet var renere var det ikke sket. Måske skulle du ansætte flere pedeller." adviser.vomit_wave.ended = "Puha! Der ser ud til mavevirussen er döet ud. Hold dit hospital rent for fremtiden." adviser.room_requirements.research_room_need_researcher = "Kun læger med speciale i forskning kan arbejde i forskningsrummet." adviser.room_requirements.op_need_another_surgeon = "Du mangler stadigt at ansætte en kirurg mere för operationsstuen er brugbar." adviser.room_requirements.op_need_ward = "Du skal bygge et sengeafsnit så patienterne kan hvile sig för de skal opereres." adviser.room_requirements.reception_need_receptionist = "Du skal ansætte en receptionist til at tage imod dine patienter." adviser.room_requirements.psychiatry_need_psychiatrist = "Du skal ansætte en psykiater, nu da du har bygget en psykiatri." adviser.room_requirements.pharmacy_need_nurse = "Du skal ansætte en sygeplejerske til at passe apoteket." adviser.room_requirements.ward_need_nurse = "Du skal ansætte en sygeplejerske til at arbejde på sengeafsnittet." adviser.room_requirements.op_need_two_surgeons = "Ansæt to kirurger for at kunne udföre operationer." adviser.room_requirements.training_room_need_consultant = "Du skal ansætte en konsulent til at undervise i undervisningslokalet." adviser.room_requirements.gps_office_need_doctor = "Du skal ansætte en læge til at arbejde i lægekonsultationen." confirmation.maximum_screen_size = "Skærmopløsningen du har valgt er større end 3000 x 2000. Større opløsninger kan bruges men vil kræve bedre hardware for at køre med en spilbar FPS. Er du sikker på du vil fortsætte?" confirmation.music_warning = "Før du vælger at bruge mp3'er til musikken i spillet, har du brug for smpeg.dll eller lignende til dit styresystem, ellers vil du ikke have musik i spillet. Vil du fortsætte?" menu_options_wage_increase.deny = " AFVIS " menu_options_wage_increase.grant = " TILLAD " tooltip.options_window.audio_button = "Slå alle lyde til og fra i spillet " tooltip.options_window.audio_toggle = "Slå til og fra" tooltip.options_window.folder_button = "Mappeindstillinger" tooltip.options_window.customise_button = "Flere indstillinger som du kan ændre for at tilpasse din spiloplevelse." tooltip.update_window.download = "Gå til downloadsiden for den nyeste version af CorsixTH" tooltip.update_window.ignore = "Ignorer denne opdatering for nu. Du vil blive påmindet igen næste gang du åbner CorsixTH" tooltip.folders_window.browse_font = "Led efter en anden skrifttype fil ( nuværende placering: %1% )" tooltip.folders_window.screenshots_location = "Normalt er skærmbilleder gemt i samme mappe som konfigurationsfilen. Hvis du gerne vil have skærmbilleder gemt et andet sted, skal du blot navigere til den pågældende mappe." tooltip.folders_window.reset_to_default = "Gendan biblioteket til standard placeringen" tooltip.folders_window.back = "Luk denne menu og gå tilbage til indstillinger" tooltip.folders_window.browse = "Find placering af mappe" tooltip.folders_window.browse_screenshots = "Find en anden mappe til dine skærmbilleder ( nuværende placering: %1% ) " tooltip.folders_window.browse_music = "Find en anden mappe til dine lydfiler ( nuværende placering: %1% ) " tooltip.folders_window.no_font_specified = "Du har ikke valgt en skrifttype-placering endnu!" tooltip.folders_window.not_specified = "Du har ikke valgt en mappeplacering endnu!" tooltip.folders_window.browse_saves = "Find en anden mappe til din gemte spil ( nuværende placering %1% ) " tooltip.folders_window.default = "Standard lokation" tooltip.folders_window.data_location = "Placeringen af den originale Theme Hospital installation som kræves for at køre CorsixTH" tooltip.customise_window.back = "Luk denne menu og gå tilbage til indstillinger" tooltip.customise_window.movies = "Global film kontrol, dette vil tillade dig at deaktivere alle film" update_window.caption = "Ny opdatering klar!" update_window.new_version = "Ny Version:" update_window.current_version = "Nuværende Version:" update_window.download = "Gå til downloadsiden" update_window.ignore = "Spring over og gå til hovedmenu" errors.fractured_bones = "NOTE: Animationen for kvindelige patienter med brækkede knogler er ikke perfekt" folders_window.data_label = "TH Data" folders_window.music_location = "Vælg mappen du vil bruge til dit musik" folders_window.music_label = "MP3'er" folders_window.caption = "Mappe placeringer" folders_window.screenshots_label = "Skærmbilleder" folders_window.font_label = "Skrifttype" folders_window.savegames_label = "Gemte spil" folders_window.back = "Tilbage" folders_window.savegames_location = "Vælg mappen du vil bruge til dine gemte spil" folders_window.screenshots_location = "Vælg mappen du vil bruge til dine skærmbilleder" customise_window.average_contents = "Average contents" customise_window.option_on = "Til" customise_window.paused = "Byggeproces sat på pause" customise_window.option_off = "Fra" customise_window.intro = "Afspil Introfilmen" customise_window.caption = "Brugerdefineret indstillinger" customise_window.back = "Tilbage" customise_window.movies = "Global film kontrol" customise_window.volume = "Volume ned tast" customise_window.aliens = "Fremmede patienter" customise_window.fractured_bones = "Brækkede knogler" options_window.folder = "Mapper" options_window.customise = "Tilpasse" options_window.audio = "Global Lyd" menu_options.twentyfour_hour_clock = " 24-TIMERS UR " menu_options.wage_increase = " LØN ANMODNING" install.ok = "OK" install.cancel = "Anullér" adviser.research.drug_improved_1 = "%s medicin er blevet forbædret af din forskningsafdeling." adviser.warnings.researcher_needs_desk_1 = "En Forsker har brug for et bord til at arbejde ved." adviser.warnings.nurse_needs_desk_1 = "Hver Sygeplejerske har brug sit eget bord til at arbejde fra." adviser.warnings.no_desk_5 = "Nu er det ved at være på tide, du burde snart se patienter ankomme!" adviser.warnings.no_desk_4 = "En receptionist skal have sit eget bord for at tage imod nye patienter" CorsixTH-0.63/CorsixTH/Lua/languages/developer.lua000066400000000000000000000030641347163623700220460ustar00rootroot00000000000000--[[ Copyright (c) 2010 Peter "Corsix" Cawley 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. --]] -- To enable the developer "language" in the ingame options, uncomment the -- following line. This language causes every translatable string to be -- displayed as the name of the string. --Language("Developer") Inherit("english") --! Construct a 'translation' with the string names as text value. local function fixup(t, str_name) for k, v in pairs(t) do local name = str_name .. "." .. k if type(v) == "string" then t[k] = name else fixup(v, name) end end end fixup(_G, "_S") CorsixTH-0.63/CorsixTH/Lua/languages/dutch.lua000066400000000000000000005005011347163623700211660ustar00rootroot00000000000000--[[ Copyright (c) 2010 RAS 2011 FlyingBastard, L_konings, Nossah, KasperVld 2012-2013 Omni, Maarten 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. --------------------------------------------------------------------------------- SLEUTELWOORDEN Chirurgen; Onderzoekers; Psychiaters Assistenten; Basisartsen; Specialisten Artsen; Zusters; Conciërges; Receptionistes ---------------------------------------------------------------------------------]] Language("Nederlands", "Dutch", "nl", "dut", "nld") Inherit("English") newspaper = { [1] = { [1] = "DOC SHOCK HORROR", [2] = "ENGE ARTS SPEELT GOD", [3] = "DR FRANKENSTEIN GEVONDEN", [4] = "WAT ZAT ER OP LABJAS?", [5] = "ONETHISCH ONDERZOEK GESTOPT", }, [2] = { [1] = "BEZOPEN ALS EEN VIS", [2] = "ZATTE CHIRURG ZOEKT SCALPEL", [3] = "STRAALBEZOPEN SPECIALIST", [4] = "IN DE LOREM", [5] = "CHIRURG MET LEGE PLATVINK", [6] = "OPEREREN ONDER INVLOED", }, [3] = { [1] = "DOKTERTJE SPELEN IN ZIEKENHUIS", [2] = "DOKTER BROEKNEER", [3] = "PSYCHIATER GAAT PLAT", [4] = "ONBEVREDIGBARE ONDERZOEKER", }, [4] = { [1] = "CREATIEF GEDOKTERT MET KASBOEK", [2] = "GE-ORGAAN-ISEERDE MISDAAD", [3] = "FINANCIELE OMLEIDINGSOPERATIES", [4] = "GELD VERDWIJNT IN ZIEKENHUIS", }, [5] = { [1] = "SPECIALIST ROOFT UIT KIST", [2] = "ZIEKENHUISPERSONEEL STEELT UIT GRAF", [3] = "MET EEN LIJK IN DE PRAKTIJK", [4] = "TOL BETALEN AAN DOKTER DOOD", [5] = "TERMINALE PRAKTIJKEN", [6] = "GRAVEN IN GRAF GEHEKELD", }, [6] = { [1] = "DOC NAAIT PATIENTEN!", [2] = "KWAKZALVERIJ", [3] = "TERMINALE DIAGNOSE", [4] = "SLONZIGE SPECIALIST", }, [7] = { [1] = "CHIRURG HECHT AAN ZIJDEN DRAADJE", [2] = "CHIRURG 'OPEREERT' ZICHZELF", [3] = "DUISTERE DOKTERS DANS", [4] = "DOKTER BIBBER SCHANDAAL", [5] = "ZOOITJE IN ZIEKENHUIS", }, } misc = { hospital_open = "Ziekenhuis open", save_success = "Spel succesvol opgeslagen", save_failed = "FOUT: opslaan mislukt", low_res = "Lage resolutie", no_heliport = "Er zijn nog geen ziektes ontdekt of er is geen helipad aanwezig", grade_adverb = { extremely = "zeer", mildly = "mild", moderately = "vrij", }, not_yet_implemented = "(nog niet geïmplementeerd)", send_message = "Bericht sturen naar speler %d", out_of_sync = "Spel uit sync", balance = "Balans bestand:", load_failed = "Laden mislukt", mouse = "Muis", done = "Klaar", force = "Forceer", pause = "Pauze", send_message_all = "Bericht sturen naar alle spelers", } staff_descriptions = { good = { [1] = "Een snelle en ijverige werker. ", [2] = "Werkt nauwkeurig. Geeft veel om mensen. ", [3] = "Zeer competent. ", [4] = "Erg vriendelijk en goedlachs. ", [5] = "Een echte doorzetter. Gaat maar door. ", [6] = "Zeer beleefd en goedgemanierd. ", [7] = "Ongelofelijk getalenteerd en kundig. ", [8] = "Geeft veel om het afgeleverde werk. ", [9] = "Een pietje precies die maar niet opgeeft. ", [10] = "Toegewijd, helpt mensen met een glimlach. ", [11] = "Charmant, beleefd en behulpzaam. ", [12] = "Gemotiveerd en toegewijd. ", [13] = "Een zachtaardige en harde werker. ", [14] = "Trouw en vriendelijk. ", [15] = "Zorgvuldig en betrouwbaar in een noodsituatie. ", }, misc = { [1] = "Speelt golf. ", [2] = "Houdt van duiken. ", [3] = "Maakt ijssculpturen. ", [4] = "Drinkt wijn. ", [5] = "Rijdt in rallyraces. ", [6] = "Doet aan bungee jumpen. ", [7] = "Verzamelt bierviltjes. ", [8] = "Houdt van stage-diving. ", [9] = "Houdt van ruftsurfen. ", [10] = "Programmeert voor CorsixTH. ", --EN: Developer for CorsixTH [11] = "Stookt whisky. ", [12] = "Een goede klusser. ", [13] = "Houdt van artistieke Franse films. ", [14] = "Speelt vaak Theme Park. ", [15] = "Heeft rijbewijs CE. ", [16] = "Doet aan motorracen. ", [17] = "Speelt viool en cello. ", [18] = "Gepassioneerd treinsloper. ", [19] = "Gek op honden. ", [20] = "Luistert graag naar de radio. ", [21] = "Neemt vaak een bad. ", [22] = "Leraar vlechtwerkjes. ", [23] = "Gebruikt uitgeholde groenten als zeepbakjes. ", [24] = "Vrijwillig politieagent. ", [25] = "Presenteerde een televisiequiz. ", [26] = "Verzamelt granaatscherven uit de Tweede Wereldoorlog. ", [27] = "Richt kamers in. ", [29] = "Pest insecten met deodorant. ", [28] = "Luistert naar rave en trip-hop muziek. ", [30] = "Haat slechte cabaretiers. ", [31] = "Spioneert voor de raad. ", [32] = "Tuiniert stiekem. ", [33] = "Smokkelt nephorloges. ", [34] = "Zingt in een rock-'n-roll band. ", [35] = "Aanbidt middagtelevisie. ", [36] = "Kietelt karpers. ", [37] = "Verpatst troep aan museumbezoekers. ", }, bad = { [1] = "Langzaam en verstrooid. ", [2] = "Lui en ongemotiveerd. ", [3] = "Slecht opgeleid en lusteloos. ", [4] = "Grof en opdringerig. Irriteert mensen. ", [5] = "Geeft snel op - kan zich niet gedragen. ", [6] = "Doof als een kwartel. Stinkt naar bloemkool. ", [7] = "Slecht in het vak. Onbetrouwbaar. ", [8] = "Verstrooid en snel afgeleid. ", [9] = "Gespannen en maakt snel fouten. ", [10] = "Labiel en wrokkig - wordt verteerd door haat. ", [11] = "Slordig en onhandig. ", [12] = "Geeft niets om het vak. Luiaard. ", [13] = "Neemt, volledig apathisch, onnodig risico. ", [14] = "Sluw, geniepig en tegendraads. ", [15] = "Verwaand en zelfingenomen. ", }, } information = { custom_game = "Welkom bij CorsixTH. Veel plezier in dit ziekenhuis!", cannot_restart = "Dit level is opgeslagen voordat de herstart-functie was geïmplementeerd.", very_old_save = "Er zijn veel updates geweest sinds je met dit level bent begonnen. Om zeker te zijn dat alles werkt zoals het hoort, kun je dit level beter opnieuw beginnen.", no_custom_game_in_demo = "Sorry, maar in de demo versie kan je niet als uitzendkracht werken.", level_lost = { [1] = "Balen! Je hebt het level verloren. Volgende keer beter!", [2] = "De reden dat je verloor:", reputation = "Je reputatie kwam onder %d", balance = "Je banksaldo was lager dan %d", percentage_killed = "Je hebt meer dan %d procent van je patiënten vermoord", cheat = "Dit was jouw keuze of heb je op de verkeerde knop gedrukt? Dus je faalt zelfs om vals te spelen, niet zo grappig hè?", }, cheat_not_possible = "Cheat kan niet toegepast worden op dit level. Je faalt zelfs om vals te spelen, niet zo grappig hè?", } staff_list = { morale = "MORAAL", tiredness = "VERMOEIDHEID", skill = "BEKWAAMHEID", total_wages = "SALARIS", } research = { allocated_amount = "Totale hoeveelheid", funds_allocation = "Totaal budget", categories = { improvements = "Verbeteringen", drugs = "Geneesmiddelen", diagnosis = "Diagnostische apparatuur", cure = "Behandelmethoden", specialisation = "Specialisatie", }, } room_classes = { diagnosis = "Diagnose", clinics = "Klinieken", facilities = "Faciliteiten", treatment = "Behandeling", } buy_objects_window = { price = "Prijs: ", choose_items = "Kies voorwerpen", total = "Totaal: ", } place_objects_window = { pick_up_object = "Klik op het voorwerp dat je wil verplaatsen of kies een andere optie.", place_objects_in_corridor = "Plaats de voorwerpen in je ziekenhuis.", place_windows = "Plaats, indien gewenst, ramen en klik op bevestigen.", confirm_or_buy_objects = "Je kunt nu de kamer bevestigen of voorwerpen kopen of verplaatsen", drag_blueprint = "Sleep de blauwdruk tot je de gewenste grootte hebt bereikt.", place_door = "Plaats de deur.", place_objects = "Plaats de voorwerpen naar tevredenheid. Klik ten slotte op bevestigen.", } totd_window = { previous = "Vorige tip", tips = { "Elk ziekenhuis begint met een receptie en een praktijk. Daarna ligt het er helemaal aan wat voor patiënten er langskomen. Een apotheek is altijd een goede volgende keuze.", "Machines zoals de compressor in inflatie hebben onderhoud nodig. Huur één of twee conciërges in om je machines te repareren, anders loop je het risico je personeel en je patiënten te verwonden.", "Op een gegeven moment wordt je personeel moe. Bouw een personeelsruimte zodat ze zich kunnen ontspannen.", "Plaats genoeg radiatoren om je personeel en je patiënten warm, en daarmee tevreden te houden.", "De bekwaamheid van een arts bepaalt hoe snel en hoe goed zijn diagnoses zijn. Als je een goede arts in de praktijk plaatst, heb je ook niet zoveel diagnostische kamers nodig.", "Assistenten en basisartsen kunnen zich laten opleiden door een specialist in het klaslokaal. Als de specialist een specifieke kwalificatie heeft (chirurg, psychiater of onderzoeker), zal hij deze kennis overdragen aan zijn leerling(en).", "Heb je al geprobeerd het alarmnummer (112) te bellen op de faxmachine? Zet wel je geluid eerst aan!", "Je kunt instellingen zoals de schermresolutie en de taal in het instellingen menu wijzigen. Het instellingen menu is in het spel en in het hoofdmenu te vinden.", "De Nederlandse vertaling is up to date. Zie je toch nog Engelse woorden, of heb je een schrijf- of taalfout ontdekt? Meldt het alsjeblieft op het forum (www.corsixth.com).", "Het CorsixTH team zoekt versterking! Zou je willen coden, vertalen of graphics willen maken? Neem dan contact met ons op via ons forum (www.corsixth.com) of ons IRC kanaal (corsix-th op Freenode).", "Als je een bug vindt zouden we het op prijs stellen als je deze meldt via onze bugtracker: th-issues.corsix.org", "Bij elk level moet je aan bepaalde eisen voldoen voordat je door kunt gaan naar het volgende level. Controleer het statusscherm om te zien hoe ver of dicht je bij je doel bent.", "Als je een bestaande kamer wil aanpassen of verwijderen, kun je dat doen met de aanpassen-knop op de werkbalk.", "Je kunt eenvoudig uitvissen welke patiënten, van een grote groep, voor een bepaalde kamer staan te wachten door met je cursor in die kamer te gaan ''staan.''", "Klik op de deur van een kamer om de wachtrij voor die kamer te zien. Je zou ook wat aan kunnen passen, zoals de volgorde van de rij veranderen of een patiënt naar een andere kamer sturen.", "Ongelukkige werknemers zullen vaak om salarisverhoging vragen. Zorg voor een comfortabele werkomgeving om dit soort situaties te voorkomen.", "Patiënten krijgen dorst van het wachten, en het gaat helemaal hard als je de verwarming flink opschroeft! Plaats frisdrankautomaten op strategische locaties voor een extra zakcentje.", "Je kunt het diagnostische proces voor een patiënt vroegtijdig stopzetten als je al weet wat voor ziekte hij of zij heeft. Maar pas op, dit vergroot de kans op een verkeerde behandeling, wat fataal kan zijn voor de patiënt.", "Noodgevallen zijn vaak een goede bron van extra inkomsten. Maar je moet er wel zeker van zijn dat je deze patiënten binnen de tijd kunt behandelen.", }, next = "Volgende tip", } rooms_long = { ultrascan = "Ultrascan", research_room = "Laboratorium", general = "Algemeen", gps_office = "Praktijk", inflation = "Inflatie", staffroom = "Personeelsruimte", jelly_vat = "Gelatinetank", scanner = "Scanner", emergency = "Noodsituatie", decontamination = "Ontsmetting", corridors = "Gangen", cardiogram = "Cardiogram", ward = "Slaapzaal", training_room = "Klaslokaal", psychiatric = "Psychiatrie", operating_theatre = "Operatiekamer", dna_fixer = "DNA hersteller", tongue_clinic = "Lamme tongkliniek", hair_restoration = "Haarrestaurateur", general_diag = "Algemene diagnose", pharmacy = "Apotheek", fracture_clinic = "Gipskamer", toilets = "Toilet", electrolysis = "Elektrolysekliniek", x_ray = "Röntgenkamer", blood_machine = "Bloedmachinekamer", } options_window = { custom_resolution = "Aangepast...", caption = "Opties", option_on = "Aan", option_off = "Uit", resolution = "Resolutie", apply = "Toepassen", language = "Taal", fullscreen = "Volledig scherm", height = "Hoogte", width = "Breedte", change_resolution = "Resolutie wijzigen", back = "Terug", cancel = "Annuleren", folder = "Mappen", audio = "Audio algemeen", customise = "Aangepast", } load_game_window = { caption = "Spel laden (%1%)", } queue_window = { num_in_queue = "Rijlengte", num_entered = "Bezoekers", max_queue_size = "Max lengte", num_expected = "Verwacht", } font_location_window = { caption = "Kies font (%1%)", } update_window = { new_version = "Nieuwe versie:", caption = "Update beschikbaar!", download = "Ga naar de download pagina", current_version = "Huidige versie:", ignore = "Negeer en ga naar het menu", } folders_window = { screenshots_location = "Selecteer de map om screenshots in op te slaan", music_label = "MP3's", back = "Terug", savegames_label = "Opgeslagen spellen", caption = "Bestands locaties", savegames_location = "Selecteer de map om spellen in op te slaan", font_label = "Lettertype", new_th_location = "Kies hier een andere map voor de Them Hospital installatie. Hiervoor wordt het spel opnieuw gestart.", screenshots_label = "Screenshots", music_location = "Selecteer de map die je wilt gebruiken voor muziek.", data_label = "TH Data", } customise_window = { movies = "Video algemeen", option_on = "Aan", option_off = "Uit", back = "Terug", paused = "Bouwen tijdens pause", intro = "Speel intro video", volume = "Volume lager koppeling", caption = "Aangepaste instellingen", fractured_bones = "Gebroken botten", average_contents = "Gemiddeld meubilair", aliens = "Alien patiënten", } trophy_room = { --gebruik hiervoor meer formele tekst happy_vips = { trophies = { [1] = "Door de indruk die je hebt gemaakt op VIPs heb je een nobelprijs gewonnen. Iedereen die je ziekenhuis bezocht sprak niets dan lof.", [2] = "Het Beroemde Personenbureau keert u bij dezen de Celebrity trofee uit voor de lof die u van alle VIPs heeft ontvangen. Beschouw uzelf een beetje beroemd en bijna een van ons.", [3] = "Gefeliciteerd met het winnen van de VIP TRIP. U maakt de levens van hardwerkende beroemdheden een stuk mooier, door het ze allemaal naar hun zin te maken. Fantastisch!", }, }, rats_killed = { awards = { }, trophies = { [1] = "Je hebt de Anti-Ongedierte trofee gewonnen voor het schieten van %d ratten in je ziekenhuis in het afgelopen jaar.", [2] = "Deze trofee wordt aangeboden door de Federatie Tegen Ratten en Muizen om uw uitzonderlijke schietwerk op %d ratten te eren.", [3] = "Deze Rattenknaller trofee wordt u aangeboden voor het afschieten van %d ratten in het afgelopen jaar.", }, }, rats_accuracy = { awards = { }, trophies = { [1] = "U krijgt de Syndicate Wars Precisie trofee omdat %d%% van de schoten die u op ratten afvuurde doel troffen.", [2] = "Deze trofee eert uw fantastische precisie in het afschieten van %d%% van de ratten waar u in het afgelopen jaar op gemikt heeft.", [3] = "Om te vieren dat u afgelopen jaar %d%% van alle ratten in uw ziekenhuis heeft uitgeroeid, belonen wij u met de Dungeon Keeper Ongediertevrij trofee. ProficiRAT", }, }, all_cured = { awards = { [1] = "Gefeliciteerd met het winnen van de Marie Curie Award voor het behandelen van alle patiënten in uw ziekenhuis in het afgelopen jaar.", }, trophies = { [1] = "De Internationale Geneesstichting wil u eren met de Gezondheid voor Iedereen trofee voor het genezen van iedereen die in het afgelopen jaar uw ziekenhuis binnen is komen lopen.", [2] = "U krijgt de Geen Zieke Rochel trofee voor het genezen van alle patiënten die in het afgelopen jaar uw ziekenhuis hebben bezocht.", }, }, many_cured = { awards = { [1] = "Gefeliciteerd met het winnen van de Marie Curie Award voor het behandelen van bijna alle patiënten in uw ziekenhuis in het afgelopen jaar.", [2] = "U ontvangt deze trofee omdat u meer patiënten heeft genezen dan alle andere ziekenhuizen. Een opvallende prestatie.", }, trophies = { [1] = "De Internationale Geneesstichting wil u eren met de Gezondheid voor Alles trofee voor het genezen van massa's mensen die in het afgelopen jaar uw ziekenhuis binnen zijn komen lopen.", [2] = "U krijgt de onderscheiding Het Kwieke Hoentje voor het genezen van een groot aantal patiënten dat in het afgelopen jaar uw ziekenhuis heeft bezocht.", [3] = "Hierbij ontvangt u de Gezonde Gorgel, een prijs voor het genezen van een enorm percentage van uw bezoekers in het afgelopen jaar.", }, penalty = { [1] = "Het lukt uw ziekenhuis niet de patiënten effectief te genezen. Concentreer u op goede behandelmethoden, zodat behandelingen effectiever worden.", [2] = "Uw ziekenhuis is het minst effectief als het gaat om patiënten genezen. U heeft het ministerie teleur gesteld. Moeten we nog meer zeggen?", }, regional = { [1] = "Vanwege het feit dat u meer zieken heeft genezen dan alle andere ziekenhuizen bij elkaar opgeteld, ontvangt u hiervoor de hoogst haalbare onderscheiding. Gefeliciteerd!", }, }, healthy_plants = { awards = { [1] = "Gefeliciteerd met het winnen van de Oei Ik Groei award voor de fantastische staat van de planten in uw ziekenhuis.", }, trophies = { [1] = "De Vrienden van de Potplanten willen u de Groene Gezondheid trofee uitreiken voor de blakende gezondheid waarin uw planten zich de afgelopen twaalf maanden hebben verkeerd", [2] = "De Frisse Narcissen willen u de Groene Vingers trofee uitreiken voor de uitstekende gezondheid van uw planten in het afgelopen jaar.", }, }, no_deaths = { awards = { [1] = "U heeft de Nimmer Vergaan award gewonnen voor het in leven houden van al uw patiënten in het afgelopen jaar.", [2] = "Uw talent heeft gezorgd voor een minimaal aantal sterfgevallen in uw ziekenhuis. U kunt apetrots zijn op dit resultaat.", }, trophies = { [1] = "De 'Het Leven Gaat Door'-corporatie presenteert u deze trofee omdat er in het afgelopen jaar geen mensen zijn overleden.", [2] = "U heeft de Overlijden Vermijden trofee uitgereikt gekregen voor het in leven houden van elke bezoeker van uw fantastische ziekenhuis in het afgelopen jaar. Bravo.", [3] = "Hierbij ontvangt u de 'Ik Leef Nog' prijs omdat dit jaar geen van uw patiënten is overleden in uw mooie ziekenhuis. Heel goed.", }, penalty = { [1] = "Het aantal overledenen in uw ziekenhuis was het afgelopen jaar behoorlijk hoog. Let goed op en zorg dat in de toekomst meer mensen de behandeling overleven.", [2] = "Uw ziekenhuis is een gevaar voor de gezondheid van de patiënt. Er wordt verwacht dat u mensen geneest, niet laat doodgaan!", }, regional = { [1] = "Het dodental in uw ziekenhuis was het laatste jaar lager dan dat van ieder ander ziekenhuis. Daarvoor bieden wij u deze trofee aan.", }, }, sold_drinks = { awards = { }, trophies = { [1] = "De Wereld Tandartsen Vereniging is trots om u deze trofee en plak te presenteren voor het verkopen van massa's frisdrank in uw ziekenhuis.", [2] = "Uw ziekenhuis heeft de Frisse Zaak trofee gewonnen voor de grote hoeveelheid drankjes die uw gasten in het afgelopen jaar hebben gekocht.", [3] = "Uit naam van Goedgevuld Inc. presenteren wij u vol trots deze met chocola overgoten trofee ter ere van uw uitzonderlijk hoge aantal verkochte blikjes frisdrank.", }, }, high_rep = { awards = { [1] = "Hierbij eren wij uw hoge standaarden en een reputatie die dit jaar gewoon niet beter kan zijn. Goed werk.", [2] = "Gefeliciteerd met de Zuijver Op Den Graet trofee voor het ziekenhuis met de hoogste reputatie van het land. En het is welverdiend ook.", }, penalty = { [1] = "Deze maatregel wordt genomen vanwege de zeer slechte reputatie over het afgelopen jaar. We gaan ervan uit dat u verbetering laat zien in de toekomst.", [2] = "De reputatie van uw ziekenhuis is het laagst in de omgeving. U bent een schande. Laat verbetering zien, of zoek een andere baan!", }, regional = { [1] = "Wij bieden u de Bullfrog Award aan voor de hoogste reputatie van alle ziekenhuizen in het afgelopen jaar. Geniet ervan - u heeft het verdiend.", [2] = "Dit jaar behaalde uw ziekenhuis een reputatie die hoger is dan alle andere ziekenhuizen bij elkaar. Een enorme prestatie.", }, }, consistant_rep = { trophies = { [1] = "Hierbij ontvangt u de hoogste onderscheiding van het ministerie voor de meest onberispelijke standaarden en de hoogst mogelijke reputatie dit jaar. Heel goed.", [2] = "Proficiat met het behalen van de Brandschoon Trofee voor het ziekenhuis met de beste reputatie in het afgelopen jaar. Welverdiend.", }, }, happy_patients = { awards = { [1] = "U mag trots zijn op het feit dat bezoekers van uw ziekenhuis in het afgelopen jaar bijzonder tevreden waren.", [2] = "Bezoekers van uw ziekenhuis waren gemiddeld meer tevreden tijdens hun behandeling, dan bezoekers van andere ziekenhuizen in het spel.", }, penalty = { [1] = "Bezoekers van uw ziekenhuis vinden het verschrikkelijk. U zult veel beter moeten presteren om waardering van het ministerie te krijgen.", [2] = "Mensen die in uw ziekenhuis in behandeling zijn, zijn zeer ontevreden over de staat van het ziekenhuis. U moet meer aandacht schenken aan het wel en wee van de patiënten.", }, }, happy_staff = { awards = { [1] = "Deze oorkonde ontvangt u van uw eigen personeel. Er is natuurlijk nog ruimte voor verbetering, maar over het algemeen wordt u als werkgever zeer gewaardeerd.", [2] = "Uw personeel is zo tevreden en gemotiveerd, niets kan hun glimlach nog verpesten. U bent een geweldige manager!", }, trophies = { [1] = "U krijgt de Smiley trofee voor het zo gelukkig mogelijk houden van uw hardwerkende personeel.", [2] = "Het Adami Instituut van Tevredenheid keert u hierbij deze trofee uit omdat uw personeel geen moment blijk heeft gegeven van ontevredenheid.", [3] = "Deze trofee, de Straalmeer Cup, is hierbij de uwe voor uw inzet voor het welzijn en de tevredenheid van uw personeel. Een glimlach van iedereen!", }, penalty = { [1] = "Uw personeel laat officieel weten dat ze ontevreden zijn. Gemotiveerd personeel is waardevol. Werk aan hun tevredenheid voor u ze helemaal zult verliezen.", }, regional_good = { [1] = "Uw personeel is meer tevreden dan dat van andere ziekenhuizen. Tevreden personeel betekent meer inkomsten en minder sterfgevallen. Dit wordt door het ministerie zeer gewaardeerd.", }, regional_bad = { [1] = "Uw personeel heeft zich het afgelopen jaar ontevreden getoond. Heeft u dat niet gemerkt? Op dit moment heeft ieder ander ziekenhuis meer tevreden personeel dan uw ziekenhuis.", }, }, wait_times = { award = { --attention: this string says AWARD, not AWARDS [1] = "Gefeliciteerd. Uw ziekenhuis heeft altijd zeer korte wachttijden. Dit is een belangrijke onderscheiding.", }, penalty = { [1] = "Patiënten in uw ziekenhuis moeten veel te lang wachten. Er zijn altijd enorme wachtrijen. U kunt uw patiënten veel efficiënter helpen, maar daar moet u wel wat voor doen.", }, }, hosp_value = { awards = { [1] = "Het Ministerie van Volksgezondheid wil dit moment graag gebruiken om u te feliciteren met de indrukwekkende waarde die uw ziekenhuis heeft behaald.", }, penalty = { [1] = "Uw ziekenhuis heeft gefaald een behoorlijke waarde te behalen. U heeft slechte financiële keuzes gemaakt. Houd in uw achterhoofd dat een goed ziekenhuis niet goedkoop is.", }, regional = { [1] = "U bent een financieel wonder! Uw ziekenhuis is meer waard dan alle andere ziekenhuizen in de omgeving bij elkaar opgeteld.", }, }, best_value_hosp = { trophies = { [1] = "Proficiat met het behalen van de Brandschoon trofee voor het ziekenhuis met de beste reputatie in het afgelopen jaar. Welverdiend.", }, penalty = { [1] = "Elke ziekenhuis in de omgeving is meer waard dan die van u. Doe iets aan deze beschamende gang van zaken. Zorg voor mooie en dure apparatuur!", }, regional = { [1] = "Gefeliciteerd met het meest waardevolle ziekenhuis in het spel, goed werk. Probeer dat zo te houden.", }, }, curesvdeaths = { awards = { [1] = "Hartelijk gefeliciteerd met het behalen van een indrukwekkende genezen-of-overleden rato in uw ziekenhuis in het afgelopen jaar.", }, penalty = { [1] = "Uw genezen-of-overleden rato is erg slecht. U moet ervoor zorgen u veel meer mensen geneest dan laat sterven. Laat het er niet bij zitten.", }, }, cleanliness = { award = { --attention: this string says AWARD, not AWARDS [1] = "Inspecteurs vinden uw ziekenhuis heel schoon. Schone ziekenhuizen zijn veilige ziekenhuizen. Houden zo.", }, regional_good = { [1] = "Uw ziekenhuis wordt genoemd als een van de minst schone in de omgeving. Een smerig ziekenhuis stinkt en is gevaarlijk. U moet meer aandacht hebben voor troep.", }, regional_bad = { [1] = "Uw ziekenhuis is het smerigst van de regio. Alle andere managers is het gelukt hun gangen schoner te houden. U bent een schande voor de medische wereld.", }, }, gen_repairs = { awards = { [1] = "U ontvangt deze prijs vanwege de oplettendheid van uw conciërges die alle apparatuur heel goed hebben onderhouden. Heel goed. U kunt gerust op vakantie.", [2] = "Uw conciërges hebben beter gepresteerd dan die van andere ziekenhuizen. Dit is een enorme prestatie. Ere wie ere toekomt.", [3] = "Uw apparatuur is fantastisch onderhouden. De motivatie van uw conciërges in uitmuntend. Deze prijs heeft u meer dan verdiend. Geweldig!.", }, penalty = { [1] = "Uw conciërges hebben uw apparatuur niet goed onderhouden. U moet hen beter in de gaten houden, of meer conciërges aannemen als het teveel werk is.", [2] = "Het onderhoud is een drama. Uw personeel moet de apparatuur beter in de gaten houden en zorgvuldiger onderhouden.", }, }, emergencies = { award = { --attention: this string says AWARD, not AWARDS [1] = "Gefeliciteerd: vanwege uw efficiënte en effectieve manier van afhandelen van noodgevallen, ontvangt u deze speciale prijs. Goed werk.", [2] = "Uw werkwijze bij noodgevallen is een unicum. Deze prijs ontvangt u, omdat u absoluut het beste omgaat met grote drommen zieken en zwakken.", }, penalty = { [1] = "U heeft noodgevallen niet goed afgehandeld. Spoed eisende patiënten moeten direct en goed worden geholpen, dat is u niet gelukt.", }, regional_good = { [1] = "Het ministerie heeft het afgelopen jaar gezien dat u noodgevallen beter aankunt dan ieder ander ziekenhuis. Daarvoor ontvangt u deze prijs.", }, regional_bad = { [1] = "Uw ziekenhuis doet het het slechtst van de regio als het gaat om noodgevallen. Het is uw eigen fout dat u onderaan de lokale noodgevallen ranglijst bungelt.", }, }, pop_percentage = { awards = { [1] = "Heeft u gezien dat een groot deel van de lokale bevolking voor uw ziekenhuis heeft gekozen? Goed gedaan.", [2] = "Gefeliciteerd. Vergeleken met andere medische instellingen heeft uw ziekenhuis het grootste aandeel in de bezoekers uit de regio.", [3] = "Briljant! U heeft meer lokale bewoners naar uw ziekenhuis weten te lokken dan alle andere ziekenhuizen bij elkaar opgeteld.", }, penalty = { [1] = "Heel weinig mensen hebben dit jaar uw ziekenhuis bezocht. Om geld te verdienen heeft uw ziekenhuis voldoende betalende zieken nodig!", [2] = "Elk ziekenhuis in de omgeving heeft een groter aandeel lokale bewoners mogen begroeten dan u. Schaamt u zich niet een beetje?", }, }, research = { awards = { [1] = "Uw onderzoekers hebben er het afgelopen jaar voor gezorgd dat uw ziekenhuis volledig up-to-date is met de nieuwste ontwikkelingen. Uw personeel heeft deze onderscheiding verdiend. Heel goed.", [2] = "Het afgelopen jaar heeft u meer medicijnen en apparatuur ontwikkeld dan was verwacht. Wij bieden u deze prijs aan namens het volledige ministerie.", }, penalty = { [1] = "U heeft een minimale hoeveelheid behandelmethoden, medicijnen en apparatuur ontwikkeld. Dit is helemaal niet goed, technologische vooruitgang is essentieel.", }, regional_good ={ [1] = "Uw onderzoekers hebben er het afgelopen jaar voor gezorgd dat uw ziekenhuis volledig up-to-date is met de nieuwste ontwikkelingen. Uw personeel heeft deze onderscheiding verdiend. Heel goed.", }, regional_bad = { [1] = "Ieder ander ziekenhuis in de regio heeft meer en beter onderzoek gedaan dan u. Omdat onderzoek cruciaal is voor een ziekenhuis, noemt het ministerie dit onacceptabel.", }, }, reputation = "REPUTATIE", cash = "GELD", } save_game_window = { caption = "Spel opslaan (%1%)", new_save_game = "Nieuw bestand", } staff_class = { doctor = "Arts", handyman = "Conciërge", receptionist = "Receptioniste", nurse = "Zuster", surgeon = "Chirurg", } fax = { epidemic_result = { fine_amount = "De regering heeft een nationaal alarm afgekondigd en legt u een boete op van %d.", close_text = "Fantastisch!", hospital_evacuated = "De commissie heeft geen andere keus dan het ziekenhuis te evacueren.", succeeded = { part_1_name = "De inspecteur heeft geruchten gehoord dat uw instituut gebukt ging onder zware gevallen van %s.", part_2 = "Hij heeft echter geen bewijzen gevonden ter bevestiging van deze geruchten.", }, compensation_amount = "De regering heeft derhalve besloten u een schadevergoeding toe te kennen ter waarde van %d ter compensatie voor de schade die uw goede naam heeft geleden door deze leugens.", failed = { part_1_name = "Tijdens het verbergen van de uitbraak van %s", part_2 = "heeft je personeel de ziekte verspreidt onder de bevolking.", }, rep_loss_fine_amount = "De media zal hiervan smullen. Dit is een zware klap voor je reputatie. Daarbij moet je een boete betalen van %d.", }, vip_visit_query = { choices = { invite = "De VIP officieel uitnodigen.", refuse = "De VIP met een smoesje afwimpelen.", }, vip_name = "%s wil graag je ziekenhuis bezoeken.", }, vip_visit_result = { telegram = "Telegram!", remarks = { good = { [1] = "Dat ziekenhuis draait goed. Bedankt voor de uitnodiging.", [2] = "Hmm. Zeker een niet al te kwade medische instelling.", [3] = "Ik heb genoten van je charmante ziekenhuis. Goed, iemand zin in Nasi Goreng van de Indonees?", }, super = { [1] = "Dat ziekenhuis loopt als een trein. Als mijn gezondheid me in de steek laat, wil ik daarnaartoe.", [2] = "Dat is pas een ziekenhuis!", [3] = "Wat een fantastisch ziekenhuis. En ik kan het weten: ik heb er wel een paar van binnen gezien.", }, bad = { [1] = "Was dat het nou? Het was nog erger dan een opera van vier uur!", [2] = "Ik walg van wat ik gezien heb. Was dat een ziekenhuis? Het leek meer op een zwijnenstal!", [3] = "Ik ben het zat een publiek figuur te zijn en zulke ranzige hokken te moeten bezoeken! Ik kap ermee.", }, mediocre = { [1] = "Nou ja, het kan erger. Maar je moet er wat aan werken.", [2] = "Oh jee. Niet zo een fijne plaats als je je niet lekker voelt.", [3] = "Een matig ziekenhuis, eerlijk gezegd. Ik had meer verwacht.", }, very_bad = { [1] = "Wat een zooi. Ik ga kijken of ik het kan laten sluiten.", [2] = "Ik heb nog nooit zo'n verschrikkelijk ziekenhuis gezien. Wat een schande!", [3] = "Ik ben geschokt. Dat is toch geen ziekenhuis? Ik heb een biertje nodig.", }, free_build = { [1] = "U heeft een heel mooi ziekenhuis neergezet. Dat is natuurlijk ook niet zo moeilijk als geld geen rol speelt he?", [2] = "Ik ben geen econoom, maar ik denk dat ik dit ziekenhuis ook wel zou kunnen besturen, als u begrijpt wat ik bedoel...", [3] = "Een heel goed lopend ziekenhuis. Pas wel op voor de economische crisis! Oh nee... Daar hoeft u zich natuurlijk geen zorgen om te maken.", }, }, rep_boost = "Je reputatie is verbeterd!", vip_remarked_name = "Na zijn bezoek zei %s:", cash_grant = "Je hebt een bonus gekregen van %d.", rep_loss = "Je reputatie is heeft een flinke deuk opgelopen.", close_text = "Bedankt voor uw bezoek aan ons ziekenhuis.", }, disease_discovered_patient_choice = { need_to_build = "Je moet een %s bouwen om dit te kunnen behandelen.", need_to_employ = "Huur een %s om deze situatie te behandelen.", what_to_do_question = "Wat moeten we met de patiënt doen?", guessed_percentage_name = "Je team moest raden naar de conditie van de patiënt. De kans dat het %s is bedraagt %d", choices = { send_home = "Stuur de patiënt naar huis.", research = "Stuur de patiënt naar het laboratorium.", wait = "Laat de patiënt even geduld hebben.", }, disease_name = "Je team heeft een nieuwe ziekte ontdekt. Het is %s", need_to_build_and_employ = "Als je een %s bouwt en een %s aanneemt, kun je slagen.", can_not_cure = "Je kunt deze ziekte nu niet genezen.", }, emergency_result = { earned_money = "Van de maximum bonus van %d heb je %d verdiend.", close_text = "Sluiten.", saved_people = "Je hebt %d van de %d patiënten genezen.", }, disease_discovered = { discovered_name = "Je team heeft een nieuwe ziekte ontdekt. Het is %s", need_to_employ = "Neem een %s aan om dit probleem te overwinnen.", need_to_build_and_employ = "Als je een %s bouwt en een %s aanneemt, kun je slagen.", need_to_build = "Je moet een %s bouwen om dit te kunnen behandelen.", close_text = "Een nieuwe ziekte is ontdekt.", can_cure = "Je kunt deze ziekte genezen.", }, emergency = { locations = { [1] = "Bakker's Chemische Fabriek.", [2] = "Schamper Universiteit.", [3] = "het Paraquat Tuincentrum.", [4] = "het instituut voor onderzoek naar gevaarlijke stoffen.", [5] = "het Klompendansers congres.", [6] = "Café de Brullende Kikker.", [7] = "Dikke Davids Bier- en Uitvaartwinkel.", [8] = "de lokale Chinees.", [9] = "Berts Gebruikte Petrochemische Producten Emporium.", }, num_disease = "Er zijn %d mensen met %s die onmiddellijk hulp nodig hebben.", num_disease_singular = "Er is één persoon met %s die onmiddellijk hulp nodig heeft.", cure_possible_drug_name_efficiency = "Je hebt alle benodigde apparatuur en hulpverleners. Je hebt het geneesmiddel voor %s, deze is %d procent effectief.", cure_not_possible_employ = "Je zult een %s moeten aannemen", cure_not_possible = "Je kunt op dit moment de ziekte niet genezen.", cure_possible = "Je hebt de benodigde apparatuur en hulpverleners, dus je zou dit noodgeval aan moeten kunnen.", choices = { accept = "Ja, ik ben klaar om dit noodgeval te behandelen.", refuse = "Nee, ik weiger dit noodgeval te behandelen.", }, location = "Er is een ongeluk gebeurd bij %s", cure_not_possible_build = "Je zult een %s moeten bouwen", cure_not_possible_build_and_employ = "Je zult een %s moeten bouwen en een %s moeten aannemen.", bonus = "De maximumbonus voor dit noodgeval bedraagt %d. Als je echter niet slaagt, zal je reputatie schade oplopen.", free_build = "Als je slaagt, is dit goed voor je reputatie. Als je echter niet slaagt, zal je reputatie schade oplopen.", }, choices = { decline_new_level = "Nog even blijven doorspelen", accept_new_level = "Naar het volgende level", return_to_main_menu = "Terug naar het hoofdmenu", }, debug_fax = { text4 = "FACTORS : DOCS %d NURSES %d AREA %d ROOMS %d PRICING %d", text5 = "CONTRIBN : DOCS %d NURSES %d AREA %d ROOMS %d PRICING %d PERCENT", text3 = "FIGURES : DOCS %d NURSES %d AREA %d ROOMS %d PRICING %d", text9 = "DISASTERS %d ALLOWED (MTHS) %d (%d)REDUCTION %d", close_text = "Ja ja!", text1 = "BEST COUNT %d", text6 = "THE FOLLOWING FACTORS ARE ALSO APPLIED", text8 = "AMENITIES %d PEEPS HANDLED %d REDUCTION %d", text2 = "TOTAL PEOPLE IN HOSPITAL %d CHECKING AGAINST %d", text10 = "KILLS %d ALLOWED (MTHS) %d (%d) REDUCTION %d", text11 = "PEOPLE THIS MONTH %d", text7 = "REPUTATION: %d EXPECTED %d REDUCTION %d", }, epidemic = { cover_up_explanation_1 = "Als je probeert dit te verbergen, heb je een beperkte tijd om alle geïnfecteerde patiënten te genezen voor de inspectie erachter komt.", cover_up_explanation_2 = "Als je bezoek krijgt van een inspecteur terwijl je nog bezig bent de epidemie op te lossen, kan hij drastische maatregelen tegen je nemen.", choices = { cover_up = "Alle geïnfecteerde patiënten proberen te genezen voor de tijd voorbij is of iemand je ziekenhuis verlaat.", declare = "Een epidemie afkondigen. Betaal de boete en je reputatie eronder laten lijden.", }, disease_name = "Je artsen hebben een besmettelijke variant van %s ontdekt.", declare_explanation_fine = "Als je een epidemie afkondigt, betaal je een boete van %d en worden al je patiënten automatisch ingeënt. Je reputatie zal hieronder lijden.", }, diagnosis_failed = { choices = { send_home = "Stuur patiënt naar huis.", take_chance = "Waag de gok en probeer de behandeling.", wait = "Laat de patiënt even wachten terwijl je meer diagnostische kamers bouwt.", }, situation = "We hebben al onze diagnostische opties al gebruikt, maar we weten nog steeds niet precies wat er met deze patiënt aan de hand is.", what_to_do_question = "Wat moeten we doen met deze patiënt?", partial_diagnosis_percentage_name = "Er is een kans van %d procent dat we weten wat voor soort %s de patiënt heeft.", }, } bank_manager = { current_loan = "Uitstaande lening", balance = "Saldo", interest_payment = "Maandelijkse rente", hospital_value = "Waarde ziekenhuis", interest_rate = "Rentevoet", insurance_owed = "Deb. Verzekeringen", statistics_page = { balance = "Saldo", details = "Omschrijving", date = "Datum", current_balance = "Huidig Saldo", money_in = "Bij", money_out = "Af", }, inflation_rate = "Inflatie", } staff_title = { junior = "Assistent", psychiatrist = "Psychiater", consultant = "Specialist", surgeon = "Chirurg", doctor = "Basisarts", researcher = "Onderzoeker", nurse = "Zuster", receptionist = "Receptioniste", general = "Algemeen", } tooltip = { message = { button = "Klik op de linkermuisknop om het bericht te openen", button_dismiss = "Klik op de linkermuisknop om het bericht te openen, klik op de rechtermuisknop om het te negeren", }, lua_console = { textbox = "Voer LUA code in om uit te voeren", execute_code = "Voer de ingevoerde code uit", close = "Sluit de console", }, fax = { close = "Sluit dit scherm zonder de fax weg te gooien", }, cheats_window = { close = "Sluit het cheatmenu", cheats = { end_month = "Spring naar het einde van de maand.", emergency = "Creëer een noodgeval", vip = "Creëer een VIP", win_level = "Win het huidige level", create_patient = "Creëer een patiënt op de rand van de kaart.", money = "Voegt 10.000 toe aan je saldo", lose_level = "Verlies het huidige level", all_research = "Voltooi al het onderzoek", end_year = "Spring naar het einde van het jaar.", earthquake = "Creëer een aardbeving", epidemic = "Maakt een besmette patient aan die mogelijk een epidemie veroorzaakt", toggle_infected = "Aan/uit zetten van weergave van geïnfecteerden van de ontdekte epidemie", }, }, new_game_window = { player_name = "Voer de naam in die je wild gebruiken in het spel", difficulty = "Moeilijkheid", cancel = "Oh, ik wilde eigenlijk helemaal geen nieuw spel starten!", tutorial = "Klik hier als je wat hulp nodig hebt in het spel", start = "Begin het spel met de geselecteerde instellingen", easy = "Als je dit spel nog nooit gespeeld hebt, is deze optie voor jou", medium = "De gulden middenweg, als je geen idee hebt wat je wilt", hard = "Als je het spel kent en meer uitdaging zoekt, kies deze optie.", }, calls_dispatcher = { assigned = "Dit vakje is aangekruist als de taak is toegewezen", task = "Lijst van de taken - klik op een taak om het personeelslid te zien die deze taak uit voert en om naar de locatie van de taak te gaan", close = "Sluit dit scherm", }, hire_staff_window = { prev_person = "Vorige persoon bekijken", cancel = "Annuleren", psychiatrist = "Psychiater", salary = "Salaris", next_person = "Volgende persoon bekijken", nurses = "Beschikbare zusters bekijken", surgeon = "Chirurg", handymen = "Beschikbare conciërges bekijken", doctors = "Beschikbare artsen bekijken", doctor_seniority = "Niveau arts (assistent, basisarts of specialist)", hire = "Aannemen", researcher = "Onderzoeker", qualifications = "Extra kwalificaties", receptionists = "Beschikbare receptionistes bekijken", staff_ability = "Competentie", }, handyman_window = { close = "Annuleren", ability = "Competentie", face = "Foto", prio_machines = "Hogere prioriteit geven aan reparaties", prio_litter = "Hogere prioriteit geven aan schoonmaken", happiness = "Tevredenheid", prio_plants = "Hogere prioriteit geven aan het watergeven van planten", name = "Naam van de conciërge", tiredness = "Moeheid", center_view = "Naar conciërge springen", salary = "Salaris", sack = "Ontslaan", pick_up = "Oppakken", parcel_select = "Het gebouw waar de conciërge taken mag verrichten. Klik om te veranderen", }, staff_list = { ability_2 = "Competentie", next_person = "Volgende persoon in de lijst selecteren", detail = "Precisie", happiness = "Tevredenheid", researcher_train = "%d%% van de opleiding tot onderzoeker voltooid", handymen = "Lijst van conciërges bekijken", tiredness = "Laat zien hoe moe de werknemers zijn", researcher = "Gekwalificeerde onderzoeker", happiness_2 = "Moraal", pay_rise = "Salaris met 10% verhogen", bonus = "Een bonus van 10% geven", prev_person = "Vorige persoon in de lijst selecteren", nurses = "Lijst van zusters bekijken", psychiatrist = "Gekwalificeerde psychiater", salary = "Huidig salaris van deze werknemer", ability = "Competentie van deze werknemers", close = "Terugkeren naar het spel", sack = "Deze werknemer ontslaan", surgeon = "Gekwalificeerde chirurg", tiredness_2 = "Moeheid werknemer", doctors = "Lijst van artsen bekijken", doctor_seniority = "Niveau van arts", view_staff = "Bekijk deze persoon", surgeon_train = "%d%% van de opleiding tot chirurg voltooid", skills = "Extra bekwaamheden", receptionists = "Lijst van receptionistes bekijken", psychiatrist_train = "%d%% van de opleiding tot psychiater voltooid", }, research = { cure_inc = "Budget voor onderzoek verhogen", close = "Onderzoeksscherm sluiten", specialisation_dec = "Budget voor specialisatie verlagen", diagnosis_dec = "Budget voor diagnostische apparatuur verhogen", allocated_amount = "Totaal budget", improvements_inc = "Budget voor verbeteringen verhogen", drugs_dec = "Budget voor medicijnen verlagen", drugs_inc = "Budget voor medicijnen verhogen", cure_dec = "Budget voor behandelmethodes verlagen", specialisation_inc = "Budget voor specialisatie verlagen", improvements_dec = "Budget voor verbeteringen verlagen", diagnosis_inc = "Budget voor diagnostische apparatuur verhogen", }, machine_window = { repair = "Een Conciërge sturen om deze machine te repareren", name = "Naam", close = "Sluiten", times_used = "Aantal keren gebruikt", status = "Status machine", replace = "Machine vervangen", }, place_objects_window = { confirm = "Bevestigen", cancel = "Annuleren", pick_up = "Voorwerp oppakken", buy_sell = "Voorwerp kopen of verkopen", }, totd_window = { previous = "Vorige tip tonen", next = "Volgende tip tonen", }, load_game_window = { load_game = "Laad spel %s", load_autosave = "Laad Autosave", load_game_number = "Laad spel %d", }, queue_window = { end_of_queue = "Sleep een patiënt hier naartoe om hem of haar achteraan in de rij te plaatsen", num_entered = "Aantal patiënten die in deze kamer zijn behandeld", close = "Dit scherm sluiten", num_in_queue = "Aantal patiënten in de rij", num_expected = "Aantal patiënten die door de receptioniste worden verwacht zich aan te sluiten", front_of_queue = "Sleep een patiënt hier naartoe om ze vooraan de rij te plaatsen", dec_queue_size = "Maximum rijlengte verkleinen", max_queue_size = "Maximum rijlengte die de receptioniste zal proberen aan te houden", inc_queue_size = "Maximum rijlengte vergroten", patient = "Sleep een patiënt naar een specifieke plaats in de rij. Klik op de rechtermuisknop om een patiënt naar huis te sturen of naar een rivaliserend ziekenhuis door te verwijzen", patient_dropdown = { send_home = "Patiënt uit ziekenhuis ontslaan", hospital_2 = "Patiënt naar een ander ziekenhuis verwijzen", reception = "Patiënt naar receptioniste verwijzen", hospital_1 = "Patiënt naar een ander ziekenhuis verwijzen", hospital_3 = "Patiënt naar een ander ziekenhuis verwijzen", }, }, jukebox = { rewind = "Vorig nummer", loop = "Nummer herhalen", stop = "Stoppen", close = "Sluiten", current_title = "Jukebox", play = "Afspelen", fast_forward = "Volgend nummer", }, graphs = { deaths = "Doden", close = "Scherm sluiten", scale = "Schaal", money_out = "Uitgaven", visitors = "Bezoekers", wages = "Salarissen", balance = "Saldo", money_in = "Inkomsten", cures = "Genezingen", reputation = "Waarde", }, toolbar = { reputation = "Je reputatie", casebook = "Behandelingen", edit = "Aanpassen", staff_list = "Personeel", policy = "Beleid", date = "Datum", charts = "Grafieken", objects = "Gangartikelen", balance = "Je saldo", research = "Onderzoek", hire = "Personeel inhuren", status = "Status", town_map = "Kaart", rooms = "Bouwen", bank_button = "Klik voor het kasboek. Klik op de rechtermuisknop voor de bankafschriften", }, pay_rise_window = { accept = "Aan de eis voldoen", decline = "Niet betalen en ontslaan.", }, town_map = { close = "Kaart sluiten", plants = "Planten weergeven", fire_extinguishers = "Brandblussers weergeven", people = "Mensen weergeven", balance = "Saldo", heat_dec = "Verwarming lager zetten", heating_bill = "Energierekening", radiators = "Radiatoren weergeven", objects = "Voorwerpen weergeven", heat_level = "Verwarming", heat_inc = "Verwarming hoger zetten", }, custom_game_window = { start_game_with_name = "%s starten", free_build = "Klik hier als je wilt spelen zonder geld, en zonder win en verliesvoorwaarden", --Kan ook overwinningsvoorwaarden worden genoemd, maar is misschien net te weinig info }, casebook = { sent_home = "Aantal afgewezen patiënten", cure_requirement = { possible = "Je kunt deze behandeling uitvoeren", not_possible = "Je kunt deze behandeling nog niet uitvoeren", ward_hire_nurse = "Je hebt een zuster en een slaapzaal nodig om deze behandeling uit te voeren", build_ward = "Je hebt een slaapzaal nodig om deze behandeling uit te voeren", research_machine = "De benodigde apparatuur is nog niet uitgevonden", hire_staff = "Je hebt een %s nodig om deze behandeling uit te voeren", build_room = "Je mist de relevante kamer om deze behandeling uit te voeren", hire_surgeon = "Je hebt een tweede chirurg nodig om een operatie uit te voeren", hire_surgeons = "Je hebt twee chirurgen nodig om operaties uit te voeren", hire_staff_old = "Je moet een %s aannemen om deze behandeling uit te voeren", }, increase = "Verhogen", up = "Naar boven", reputation = "Reputatie", research = "Klik hier om het laboratorium zich op deze specialisatie te laten concentreren", close = "Scherm sluiten", earned_money = "Tot nu toe verdiend", cure_type = { psychiatrist = "Een psychiater voert deze behandeling uit", drug_percentage = "Deze behandeling gebruikt medicijnen. Die van jou zijn %d%% effectief.", drug = "Deze behandeling maakt gebruik van medicijnen", machine = "Deze behandeling maakt gebruik van apparatuur", surgery = "Deze behandeling maakt gebruik van operaties", unknown = "Je weet nog niet hoe je deze ziekte moet behandelen", }, decrease = "Verlagen", deaths = "Aantal sterfgevallen", cured = "Aantal genezingen", down = "Naar beneden", treatment_charge = "Prijs", }, policy = { diag_termination = "Het diagnoseproces zal doorlopen worden tot artsen zo zeker zijn als STOP PROCEDURE aangeeft, of tot alle diagnostische testen zijn uitgevoerd", close = "Sluit beleidsscherm", staff_leave = "Artsen en zusters mogen bijspringen waar nodig", diag_procedure = "Als de diagnose van een arts minder zeker is dan het WEGSTUREN percentage, zal de patiënt naar huis gestuurd worden. Als de diagnose beter is dan GOKKEN aangeeft, zal de patiënt de betreffende behandeling ondergaan", staff_rest = "Hoe moe personeelsleden moeten zijn voordat ze mogen uitrusten", staff_stay = "Artsen en zusters blijven in de kamer waar je ze plaatst", }, bank_manager = { graph = "Verwachte betalingen van %s", close = "Kasboek sluiten", hospital_value = "Waarde ziekenhuis", graph_return = "Terug naar vorig venster", current_loan = "Nog uitstaande leningen", borrow_5000 = "$5000 lenen van de bank", balance = "Je huidige saldo", interest_payment = "Maandelijkse rente", inflation_rate = "Inflatie", interest_rate = "Rentevoet", repay_5000 = "$5000 aflossen", show_graph = "Toon grafiek met verwachte betalingen van %s", insurance_owed = "Nog tegoed van %s", }, main_menu = { exit = "Nee! Nee! Verlaat ons niet!", custom_level = "Als uitzendkracht ben je verantwoordelijk voor maar één ziekenhuis", network = "Start een netwerkspel", quit = "Afsluiten", continue = "Doorgaan met vorig spel", options = "Verschillende instellingen aanpassen", load_menu = { load_slot = "SPEL LADEN", empty_slot = "LEEG", }, new_game = "Begin met een compleet nieuw spel", load_game = "Een opgeslagen spel laden", }, patient_window = { graph = "Klik om te schakelen tussen de gezondheid en de geschiedenis van deze persoon", casebook = "Details bekijken van de ziekte van deze patiënt", close = "Venster sluiten", queue = "Bekijk de rij waarin deze persoon staat", happiness = "Tevredenheid van deze patiënt", warmth = "Hoe warm deze persoon het heeft", center_view = "Deze persoon bekijken", thirst = "Hoe dorstig deze patiënt is", send_home = "Uit ziekenhuis ontslaan", abort_diagnosis = "Behandel deze patiënt nu, zonder een complete diagnose", }, menu_list_window = { back = "Dit venster sluiten", save_date = "Klik hier om te sorteren op datum van opslaan", name = "Klik hier om te sorteren op naam", }, watch = { emergency = "Noodgeval: tijd over om alle patiënten te genezen.", hospital_opening = "Bouwtijd: dit is hoelang het nog duurt voor je ziekenhuis opengaat. Klik op de START knop om je ziekenhuis nu te openen.", epidemic = "Epidemie: tijd over om de epidemie te verbergen. Als de tijd om is OF een besmettelijke patiënt je ziekenhuis verlaat, komt er een inspecteur langs. De knop zet vaccinatiemodus aan en uit. Klik ermee op een patiënt om hem of haar te laten inenten door een zuster.", }, save_game_window = { new_save_game = "Voer hier de naam in", save_game = "Spel %s overschrijven", }, information = { close = "Informatievenster sluiten", }, rooms = { ultrascan = "Een arts gebruikt de echoscopie om diagnoses te stellen", research_room = "Artsen die een kwalificatie hebben als onderzoeker kunnen nieuwe medicijnen en machines ontwikkelen in het laboratorium", fracture_clinic = "Een zuster gebruikt de gipskamer om botfracturen te verhelpen", gps_office = "Patiënten krijgen hun eerste consult en resultaten in de spreekkamer.", inflation = "Een arts gebruikt de inflatiekliniek om patiënten met plofkop te genezen", staffroom = "Artsen en zusters ontspannen in de personeelsruimte en raken zo hun moeheid kwijt", jelly_vat = "Een arts gebruikt de gelatinetank om gelatinis te genezen", scanner = "Een arts gebruikt de scanner om een diagnose te stellen", decontamination = "Een arts gebruikt de ontsmettingscabine om radioactiviteit te genezen", pharmacy = "Een zuster geeft medicijnen uit een apotheek aan patiënten om hen te genezen van verschillende kwalen.", cardiogram = "Een arts gebruikt de cardiogram om een diagnose te stellen", ward = "Slaapzalen worden door zusters gebruikt om diagnoses te stellen en patiënten te behandelen. Patiënten worden hier naartoe gestuurd ter observatie en rusten hier voordat ze een operatie moeten ondergaan", training_room = "Een klaslokaal met een specialist kan worden gebruikt om andere artsen op te leiden", operating_theatre = "De operatiekamer heeft twee gekwalificeerde chirurgen nodig", psychiatry = "De psychiatrie geneest geesteszieke patiënten en helpt het diagnostisch proces. Het vereist echter wel een gekwalificeerde psychiater", hair_restoration = "Een arts gebruikt de haarrestaurateur om kaalheid te genezen", tongue_clinic = "Een arts gebruikt de snijmachine om lamme tong te genezen", dna_fixer = "Een arts gebruikt DNA hersteller om patiënten met buitenaards DNA te genezen", general_diag = "Een arts gebruikt de spreekkamer om een basisdiagnose voor zijn patiënten te stellen. Goedkoop en vaak zeer effectief", toilets = "Bouw toiletten, zodat mensen geen zooi maken van je ziekenhuis!", electrolysis = "Een arts gebruikt de elektrolysekamer om pilitis te genezen", x_ray = "Een arts gebruikt de röntgenkamer om een diagnose te stellen", blood_machine = "Een arts gebruikt de bloedmachinekamer om een diagnose te stellen", }, statement = { close = "Afschriftenscherm sluiten", }, buy_objects_window = { confirm = "Voorwerp(en) kopen", cancel = "Annuleren", increase = "Koop nog een exemplaar van dit voorwerp", total_value = "Totale aankoopwaarde", price = "Prijs per stuk", decrease = "Koop een exemplaar minder van dit voorwerp", }, staff_window = { doctor_seniority = "Niveau - assistent, basisarts of specialist", psychiatrist = "Psychiater", close = "Annuleren", ability = "Competentie", pick_up = "Oppakken", sack = "Ontslaan", surgeon = "Chirurg", happiness = "Tevredenheid", salary = "Salaris per maand", name = "Naam", tiredness = "Moeheid", center_view = "Persoon bekijken", skills = "Speciale bekwaamheden", researcher = "Onderzoeker", face = "Foto", }, status = { percentage_cured = "Je moet %d bezoekers hebben behandeld. Tot nu toe heb je er %d behandeld", thirst = "Gemiddelde dorst van de mensen in je ziekenhuis", close = "Overzicht sluiten", population_chart = "Dit diagram geeft aan welk deel van de zieken naar welk ziekenhuis gaat", win_progress_own = "Laat vooruitgang zien tot je ziekenhuis aan de eisen voldoet", reputation = "Je reputatie moet minimaal %d bedragen. Momenteel bedraagt deze %d", population = "Je moet %d%% van de bevolking aantrekken.", warmth = "Algemene warmte van de mensen in je ziekenhuis", percentage_killed = "Niet meer dan %d%% van je bezoekers mogen overlijden. Tot nu toe is %d%% overleden", balance = "Je saldo moet ten minste %d bedragen. Momenteel bedraagt deze %d", value = "Je ziekenhuis moet $%d waard zijn. Momenteel is deze $%d waard", win_progress_other = "Laat vooruitgang zien tot het ziekenhuis van %s aan de eisen voldoet", num_cured = "Je doel is %d patiënten te genezen. Tot nu toe heb je er %d genezen", happiness = "Algemene tevredenheid van de mensen in je ziekenhuis", }, window_general = { confirm = "Bevestigen", cancel = "Annuleren", }, objects = { chair = "Stoel: patiënten zitten hierop als ze over hun ziekte vertellen.", litter = "Troep: op de grond gegooid door een patiënt, omdat hij geen prullenbak kon vinden.", sofa = "Bankstel: werknemers rusten uit op een bankstel tenzij ze een betere manier vinden om zich te ontspannen.", operating_table = "30 OB_OP_TABLE", bed2 = "unused", bench = "Bank: hier kunnen patiënten comfortabel wachten op hun beurt.", scanner = "14 OB_SCANNER", couch = "18 OB_COUCH", blood_machine = "42 OB_BLOOD_MC", table1 = "Table (REMOVED): holds collection of magazines to keep waiting patients happy.", --[[ Schijnbaar hebben ze geen tafels in ziekenhuizen. --]] video_game = "Videospelletje: laat je personeel zich ontspannen met Hi-Octane.", lamp = "Lamp: geeft licht zodat je personeel kan zien.", op_sink2 = "34 OB_OP_SINK_2", door = "Deur: mensen openen deze vaak. Ook doen ze deze wel eens dicht.", auto_autopsy = "Autopsie: een grote hulp in het ontdekken van nieuwe behandelingen", reception_desk = "Receptie: een receptioniste stuurt mensen vanaf hier door naar artsen.", hair_restorer = "25 OB_HAIR_RESTORER", projector = "Beamer: een specialist gebruikt visuele hulp bij de lesstof", crash_trolley = "20 OB_CRASH", tv = "TV: nu hoeft je personeel hun favoriete programma niet meer te missen.", ultrascanner = "Echo apparaat", surgeon_screen = "35 OB_SURGEON_SCREEN", litter_bomb = "Afvalbom: saboteer het ziekenhuis van je tegenstander", inflator = "Compressor: geneest mensen met plofkop.", table2 = "12 OB_BTABLE", desk = "Bureau: essentieel voor een arts om zijn computer op te zetten.", pool_table = "Biljarttafel: helpt je personeel zich te ontspannen.", x_ray_viewer = "29 OB_XRAY_VIEWER", radiation_shield = "28 OB_RAD_SHIELD", bed = "Bed: erg zieke mensen liggen hierop.", swing_door2 = "53 OB_DOUBLE_DOOR2", console = "15 OB_SCANNER_CONSOLE", op_sink1 = "33 OB_OP_SINK_1", bookcase = "Boekenkast: referentiemateriaal voor artsen.", drinks_machine = "Frisdrankautomaat: lest de dorst van patiënten en zorgt voor inkomsten.", comfortable_chair = "61 OB_COMFY_CHAIR", skeleton = "Geraamte: gebruikt voor opleidingen en Halloween.", computer = "Computer: belangrijk voor onderzoek", bin = "Prullenbak: hier gooien patiënten hun afval in.", pharmacy_cabinet = "Apotheek: waar de medicijnen worden bewaard.", radiator = "Radiator: zo wordt het niet te koud in je ziekenhuis.", cast_remover = "24 OB_CAST_REMOVE", atom_analyser = "Pulsmixer: wordt geplaatst in het laboratorium. Versnelt het onderzoeksproces.", plant = "Plant: houdt patiënten tevreden en zuivert de lucht.", jelly_moulder = "47 OB_JELLY_VAT", cardio = "13 OB_CARDIO", toilet = "Pot: patiënten, eh, gebruiken dit.", electrolyser = "46 OB_ELECTRO", fire_extinguisher = "Blusser: verkleint het gevaar van defecte apparatuur.", bed3 = "unused", swing_door1 = "52 OB_DOUBLE_DOOR1", lecture_chair = "Schoolbank: je studerende artsen zitten hier om aantekeningen te maken, zich dood te vervelen en doelloos poppetjes te tekenen. Hoe meer schoolbanken je plaatst, des te groter je klas kan zijn.", screen = "16 OB_SCREEN", toilet_sink = "Wasbak: de patiënten die zich wat meer bewust zijn van hygiëne kunnen hier hun vieze handen in wassen. Als er niet genoeg wasbakken zijn, raken patiënten nukkig.", shower = "54 OB_DECON_SHOWER", gates_of_hell = "48 OB_HELL", entrance_right = "59 OB_ENT_RDOOR", entrance_left = "58 OB_ENT_LDOOR", slicer = "26 OB_SLICER", dna_fixer = "23 OB_DNA_FIXER", x_ray = "27 OB_XRAY", cabinet = "Dossierkast: bevat dossiers, aantekeningen en rapportages van patiënten.", }, build_room_window = { cost = "Kosten van deze kamer", room_classes = { treatment = "Behandelkamers", diagnosis = "Diagnostische kamers", facilities = "Speciale faciliteiten", clinic = "Gespecialiseerde klinieken", }, close = "Venster sluiten en terugkeren naar het spel", }, options_window = { fullscreen = "Wil je het spel in volledig scherm of in een venster spelen?", --Hoe kun je ''Windowed mode'' het beste verwoorden? Omni: wat vind je hiervan?-- resolution = "Verander de resolutie naar wat er rechts is ingevuld", apply = "Pas de ingevoerde resolutie toe", language_dropdown_item = "Kies %s als taal", language = "De taal waarin het spel wordt weergeven", select_language = "Selecteer de taal waarin je het spel wilt spelen", cancel = "Annuleren", select_resolution = "Een andere resolutie selecteren", fullscreen_button = "Volledig scherm", change_resolution = "Verander de resolutie naar wat er links is ingevuld", height = "Voer de gewenste verticale resolutie in", width = "Voer de gewenste horizontale resolutie in", language = "Kies %s als taal", back = "Sluit het instellingenvenster", audio_button = "Zet alle spelgeluiden aan of uit.", folder_button = "Mapopties.", audio_toggle = "Zet aan of uit.", customise_button = "Meer instellingen om je spel aan te passen.", }, research_policy = { research_progress = "Voortgang tot de volgende ontdekking in deze categorie: %1%/%2%", no_research = "Naar deze categorie wordt momenteel geen onderzoek gedaan", }, customise_window = { intro = "Zet de intro video aan of uit. Zet deze instelling aan om de intro video te tonen als CorsixTH wordt gestart.", fractured_bones = "Omdat de animatie niet mooi is, zijn vrouwelijke patiëntien met gebroken botten standaard uitgeschakeld. Om vrouwelijke patiënten met gebroken botten in je ziekenhuis te ontvangen zet je deze instelling uit.", movies = "Met algemene video instellingen zet je alle video's aan of uit.", volume = "Als de 'volume-lager' knop ook het behandelingenboek opent, zet deze instelling aan om de sneltoets naar het behandelingenboek te veranderen naar shift+C", aliens = "Vanwege de sleche animatie bezoeken patiënten met alien-DNA je ziekenhuis alleen bij een noodgeval. Om patiënten met alien-DNA ook buiten noodgevallen je ziekenhuis te laten bezoeken zet je deze instelling uit.", paused = "In Theme Hospital was het niet mogelijk de menubalk te gebruiken als het spel was gepauzeerd. De standaard instelling in CorsixTH is het zelfde, maar met deze instelling aan is dit tijdens pauze wel toegestaan.", average_contents = "Als het spel moet onthouden wat je gemiddeld genomen aan meubilair in een kamer bouwt, zet deze instelling aan.", back = "Sluit dit menu af en ga terug naar het instellingen menu.", }, update_window = { download = "Ga naar de download pagina voor de nieuwste versie van CorsixTH", ignore = "Negeer deze update. Je wordt opnieuw herinnerd als je CorsixTH de volgende keer start.", }, folders_window = { browse_font = "Zoek naar een ander lettertype ( huidige locatie: %1% ) ", screenshots_location = "Standaard worden screenshots opgeslagen bij het configuratie bestand. Als dit niet gewenst is, kies dan hier een andere locatie.", browse_music = "Zoek naar een andere locatie voor je muziek bestand ( huidige locatie: %1% ) ", data_location = "De map waar de originele Theme Hospital installatie in staat. Deze is nodig om CorsixTH te laten werken.", browse_data = "Zoek naar een andere locatie van je Theme Hospital installatie ( huidige lacatie: %1% )", savegames_location = "Standaard worden opgeslagen spellen in de saves map bij het configuratie bestand opgeslagen. Als dit niet gewenst is, kies dan hier een andere locatie.", back = "Sluit dit menu af en ga terug naar het instellingen menu.", browse_saves = "Zoek naar een andere locatie voor je saves map ( huidige locatie: %1% ) ", browse = "Zoek naar de lacatie van de map", browse_screenshots = "Zoek naar een andere locatie voor je screenshots map ( huidige locatie: %1% ) ", not_specified = "Nog geen map ingesteld!", font_location = "Locatie van een lettertype bestand dat de Unicode karakters van je taal kan weergeven. Als dit niet is ingesteld is het niet mogelijk talen te kiezen die meer karakters nodig hebben dan het originele spel kan tonen. Bijvoorbeeld Russisch of Chinees.", reset_to_default = "Herstel de map naar de standaard locatie.", default = "Standaard locatie.", no_font_specified = "Nog geen lettertype locatie ingesteld!", music_location = "Selecteer de locatie van je MP3 bestanden. Deze moet van te voren zijn gemaakt, zoek vervolgens hier naar de locatie.", }, } menu_debug_overlay = { byte_w_wall = " BYTE W WALL ", byte_6 = " BYTE 6 ", byte_0_1 = " BYTE 0 & 1 ", byte_7 = " BYTE 7 ", byte_5 = " BYTE 5 ", byte_floor = " BYTE FLOOR ", positions = " POSITIES ", flags = " FLAGS ", parcel = " PARCEL ", byte_n_wall = " BYTE N WALL ", none = " NONE ", heat = " TEMPERATUUR " } menu_charts = { bank_manager = " (%1%) KASBOEK ", statement = " (%1%) AFSCHRIFTEN ", staff_listing = " (%1%) PERSONEELSLIJST ", town_map = " (%1%) KAART ", casebook = " (%1%) BEHANDELINGEN ", research = " (%1%) ONDERZOEK ", status = " (%1%) STATUS ", graphs = " (%1%) GRAFIEKEN ", policy = " (%1%) BELEID ", briefing = " OPDRACHT ", } progress_report = { quite_unhappy = "De mensen zijn nogal ongelukkig. ", header = "Voortgang", very_unhappy = "De mensen zijn zeer ongelukkig. ", more_drinks_machines = "Plaats meer frisdrankautomaten. ", too_cold = "Het is veel te koud. Plaats radiatoren. ", too_hot = "Kijk naar je verwarming. Het is veel te heet. ", percentage_pop = "% bevolking", win_criteria = "Overwinningsvoorwaarden", free_build = "VRIJ BOUWEN", } dynamic_info = { --[['' - '' is hier verschillende malen vervangen door een '';''.]]-- patient = { emergency = "Noodgeval: %s", guessed_diagnosis = "Vermoede diagnose: %s ", diagnosis_progress = "Voortgang diagnose", actions = { sent_to_other_hospital = "Ergens anders naartoe verwezen", prices_too_high = "Je bent veel te duur; ik ga naar huis.", no_gp_available = "Wacht tot je een spreekkamer bouwt", waiting_for_treatment_rooms = "Wacht tot je een behandelkamer bouwt voor me", dying = "Sterft!", no_diagnoses_available = "Geen diagnoses meer; ik ga naar huis", epidemic_sent_home = "Naar huis gestuurd door de inspecteur", cured = "Genezen!", waiting_for_diagnosis_rooms = "Wacht tot je meer diagnostische kamers bouwt", epidemic_contagious = "Ik ben besmettelijk", awaiting_decision = "Wacht op je beslissing", sent_home = "Naar huis gestuurd", fed_up = "Heeft er schoon genoeg van en vertrekt", no_treatment_available = "Geen behandeling beschikbaar; ik ga naar huis", on_my_way_to = "Onderweg naar %s", queueing_for = "In de rij voor %s", epidemic_vaccinated = "Ik ben niet langer besmettelijk", }, diagnosed = "Diagnose: %s ", }, health_inspector = "Gezondheidsinspecteur", vip = "VIP", object = { times_used = "%d keer gebruikt", queue_size = "Rijlengte %d", strength = "Kracht %d", queue_expected = "Verwachte rijlengte %d", }, staff = { ability = "Competentie", psychiatrist_abbrev = "Psych.", actions = { waiting_for_patient = "Wacht op patiënt", wandering = "Loopt wat rond", going_to_repair = "Gaat %s repareren", heading_for = "Gaat naar %s", fired = "Ontslagen", }, tiredness = "Moeheid", }, } adviser = { tutorial = { hire_receptionist = "Je hebt ook een receptioniste nodig om je patiënten de weg te wijzen.", build_pharmacy = "Gefeliciteerd! Bouw nu een apotheek en neem een zuster aan, zodat je een werkend ziekenhuis hebt.", hire_doctor = "Je hebt een arts nodig om diagnoses te stellen en de zieken te behandelen.", place_receptionist = "Plaats de receptioniste ergens in je ziekenhuis.", place_windows = "Je kunt ramen op dezelfde manier als deuren plaatsen. Je hebt ze niet echt nodig, maar het houdt je personeel wel tevreden.", confirm_room = "Klik op het knipperende icoontje om je kamer open te stellen of klik op de X om een stap terug te gaan.", rotate_and_place_reception = "Klik op de rechtermuisknop om het Bureau te draaien en klik op de linkermuisknop om het te plaatsen.", build_reception = "Hallo. Ten eerste moet je ziekenhuis een receptie hebben. Klik hiervoor op de gangartikelenknop.", doctor_in_invalid_position = "Hee! Daar kun je de arts niet plaatsen.", receptionist_invalid_position = "Daar kun je de receptioniste niet neerzetten.", room_too_small_and_invalid = "De blauwdruk is te klein en staat niet op bebouwbare grond. Kom op.", window_in_invalid_position = "Dit raam bevindt zich op een onmogelijke positie. Probeer het eens ergens anders te plaatsen.", choose_doctor = "Kijk goed naar wat een arts kan voor je er een aanneemt.", build_gps_office = "Om diagnoses te kunnen stellen moet je eerst een spreekkamer bouwen.", select_doctors = "Klik op het knipperende icoontje om te zien welke artsen je kunt inhuren.", place_objects = "Klik op de rechtermuisknop om voorwerpen te draaien en op de linkermuisknop om ze te plaatsen.", select_receptionists = "Klik op het knipperende icoontje om de beschikbare receptionistes te bekijken. Het nummer onder het icoontje geeft aan uit hoeveel sollicitantes kunt kiezen.", order_one_reception = "Klik eenmaal op de knipperende regel om een receptie te bestellen.", choose_receptionist = "Kies een receptioniste met voldoende competentie en een redelijke salariseis. Klik ten slotte op het knipperende icoontje om haar aan te nemen.", place_doctor = "Plaats de arts ergens in het ziekenhuis. Zodra er een diagnose gesteld moet worden, zal hij zich naar de spreekkamer begeven.", accept_purchase = "Klik op het knipperende icoontje om de bestelling af te ronden.", place_door = "Beweeg de muis langs de muren van de blauwdruk om te bepalen waar je de deur wil hebben.", next_receptionist = "Dit is de eerste receptioniste in de lijst. Klik op het knipperende icoontje om de volgende sollicitante te bekijken.", room_in_invalid_position = "Hé! De kamer kan niet gebouwd worden; de rode vakjes geven aan waar je een andere kamer of een muur overlapt", room_big_enough = "De blauwdruk is nu groot genoeg. Laat de muisknop los en pas eventueel nog de grootte of de locatie aan.", room_too_small = "De blauwdruk is rood omdat hij te klein is. Sleep net zolang door tot de blauwdruk groot genoeg is.", click_gps_office = "Klik op de knipperende regel om de spreekkamer te kiezen.", reception_invalid_position = "De receptie is grijs omdat er iets in de weg staat. Probeer het bureau te draaien of ergens anders neer te zetten.", click_and_drag_to_build = "Om een Praktijk te bouwen moet je eerst beslissen hoe groot hij moet worden. Klik en sleep de blauwdruk uit tot de gewenste grootte.", door_in_invalid_position = "Oeps! Je kunt de deur daar niet plaatsen. Probeer het op een ander stuk muur.", object_in_invalid_position = "Dit voorwerp kan hier niet geplaatst worden. Plaats het ergens anders of draai het tot het past.", select_diagnosis_rooms = "Klik op het knipperende icoontje om de lijst met diagnosekamers te bekijken.", prev_receptionist = "Klik op het knipperende icoontje om de vorige sollicitante te bekijken.", start_tutorial = "Lees je opdracht en druk op de linkermuisknop om te beginnen.", information_window = "De hulpbox verteld je alles over die prachtige spreekkamer die je net gebouwd hebt.", }, epidemic = { hurry_up = "Als je die epidemie nu niet snel oplost zit je straks flink in de knoei. Schiet op!", serious_warning = "Deze besmettelijke ziekte ziet er ernstig uit. Je moet snel actie ondernemen!", multiple_epidemies = "Zo te zien heersen er meerdere epidemieën tegelijk. Dit kan op een enorme ramp uitlopen, dus doe er snel wat aan.", }, staff_advice = { need_handyman_machines = "Je zult conciërges moeten inhuren om je apparatuur te onderhouden.", need_doctors = "Je hebt meer artsen nodig. Zet de beste artsen in de kamers met de langste wachtrijen.", need_handyman_plants = "Je zult een conciërge moeten aannemen om de planten water te geven.", need_handyman_litter = "Mensen maken een zootje van je ziekenhuis. Huur een conciërge in om het op te ruimen.", need_nurses = "Je moet zusters aannemen. Slaapzalen en apotheken hebben zusters nodig.", too_many_doctors = "Je hebt teveel artsen. Sommigen hebben nu niets te doen.", too_many_nurses = "Ik denk dat je teveel zusters hebt aangenomen.", }, earthquake = { damage = "Die aardbeving heeft %d beschadigd en %d bezoekers getroffen.", alert = "Een aardbeving. Tijdens een aardbeving raakt je apparatuur beschadigd. Ze kunnen zelfs vernietigd worden als ze niet goed zijn onderhouden.", ended = "Poeh poeh. Dat zal de moeder geweest zijn: %d op de Schaal van Richter.", }, multiplayer = { everyone_failed = "Niemand heeft dat laatste doel gehaald. Dus iedereen mag vrolijk doorspelen!", players_failed = "De volgende speler(s) hebben het laatste doel niet gehaald: ", poaching = { in_progress = "Ik laat je nog wel weten of deze medewerker voor je wil werken.", not_interested = "Ha! Ze zijn totaal niet geïnteresseerd om voor jou te werken. Ze zijn tevreden met hun huidige baan.", already_poached_by_someone = "Dat gaat niet door! Iemand anders probeert deze medewerker al te stropen.", }, objective_completed = "Je hebt het doel behaald! Gefeliciteerd!", objective_failed = "Je hebt je doel helaas niet behaald", }, surgery_requirements = { need_surgeons_ward_op = "Om operaties uit te kunnen voeren moet je twee chirurgen aannemen, een slaapzaal en een operatiekamer bouwen.", need_surgeon_ward = "Om operaties uit te kunnen voeren moet je nog een chirurg inhuren, een slaapzaal en een operatiekamer bouwen.", }, vomit_wave = { started = "Zo te zien waart er een kotsvirus rond in je ziekenhuis. Dit had je kunnen voorkomen door je ziekenhuis schoner te houden. Misschien moet je meer conciërges aannemen.", ended = "Poeh poeh. Het ziet ernaar uit dat die kotsgolf voorbij is. Hou je ziekenhuis in het vervolg wat beter schoon.", }, level_progress = { nearly_won = "Je hebt dit level bijna gewonnen.", three_quarters_lost = "Je bent driekwart onderweg naar verlies van dit level.", halfway_won = "Je bent halverwege naar de winst van dit level.", halfway_lost = "Je bent halverwege naar verlies van dit level.", nearly_lost = "Je hebt dit level bijna verloren.", three_quarters_won = "Je bent driekwart op weg naar de winst van dit level.", dont_kill_more_patients = "Je kunt echt niet meer patiënten afmaken!", another_patient_killed = "Oh nee! Je hebt nog een patiënt vermoord. Dat zijn er nu al %d.", close_to_win_increase_value = "Je hebt bijna gewonnen, verhoog de waarde van je ziekenhuis met %d.", financial_criteria_met = "Je hebt aan alle financiële eisen van dit level voldaan. Hou je banksaldo boven de %d, en zorg ervoor dat je ziekenhuis soepel draait.", hospital_value_enough = "Hou de waarde van je ziekenhuis boven de %d en los alle andere problemen in de gaten om dit level te winnen", another_patient_cured = "Goed gedaan; nog een patiënt is genezen, dat zijn er nu al %d.", reputation_good_enough = "Oké, je reputatie is goed genoeg om dit level te winnen, hou het boven %d en los andere problemen op om te winnen", cured_enough_patients = "Je hebt genoeg van je patiënten genezen om dit level te winnen, nu moet je je ziekenhuis nog efficiënter maken om te winnen.", improve_reputation = "Je moet je reputatie met %d punten verbeteren om dit level te kunnen winnen.", }, staff_place_advice = { receptionists_only_at_desk = "Receptionistes kunnen alleen op de receptie werken.", only_psychiatrists = "Artsen kunnen alleen in de psychiatrie werken als ze gediplomeerd psychiater zijn.", only_surgeons = "Artsen kunnen alleen in de operatiekamer werken als ze chirurg zijn.", only_nurses_in_room = "Alleen zusters kunnen werken in de %s", only_doctors_in_room = "Alleen artsen kunnen werken in de %s", only_researchers = "Artsen kunnen alleen in het laboratorium werken als ze onderzoekers zijn.", nurses_cannot_work_in_room = "Zusters kunnen niet werken in de %s", doctors_cannot_work_in_room = "Artsen kunnen niet werken in de %s", }, room_forbidden_non_reachable_parts = "Als je de kamer hier bouwt zijn andere delen van het ziekenhuis onbereikbaar.", research = { machine_improved = "De %s is verbeterd door het laboratorium.", autopsy_discovered_rep_loss = "Je Auto-Autopsie machine is ontdekt. Verwacht negatieve reacties van het publiek.", drug_fully_researched = "Je onderzoek op het gebied van %s is voltooid.", new_machine_researched = "Het laboratorium heeft een %s uitgevonden.", drug_improved = "Het medicijn voor %s is verbeterd door het laboratorium.", drug_improved_1 = "%s medicijn is vebeterd door het laboratorium.", --is dit netjes in het spel? of kunnen we beter bovenstaande string kopiëren? new_available = "Er is nu een %s beschikbaar.", new_drug_researched = "Het laboratorium heeft een middel tegen %s uitgevonden.", }, boiler_issue = { minimum_heat = "Aha, daar ben je. De boiler in de kelder is kapot. De mensen in je ziekenhuis zullen het straks nogal fris krijgen.", maximum_heat = "De boiler in de kelder is op hol geslagen. De verwarming zit vast op maximum. Mensen zullen het snikheet krijgen. Plaats wat frisdrankautomaten ter compensatie.", resolved = "Goed nieuws. De boiler en verwarming doen het weer normaal. De temperatuur zou nu weer goed moeten zijn voor je personeel en patiënten.", }, competitors = { staff_poached = "Eén van je personeelsleden is gestroopt door een tegenstander.", hospital_opened = "Er is door %s een concurrerend ziekenhuis geopend.", land_purchased = "%s heeft zojuist land gekocht.", }, room_requirements = { research_room_need_researcher = "Je moet nog een arts met een onderzoeksgraad aannemen voor het laboratorium.", op_need_another_surgeon = "Je hebt nog één chirurg nodig om de operatiekamer te kunnen gebruiken.", op_need_ward = "Je moet nog een slaapzaal bouwen voor de patiënten die uit moeten rusten voor de operatie.", reception_need_receptionist = "Je moet een receptioniste aannemen om je patiënten wegwijs te maken.", psychiatry_need_psychiatrist = "Nu je een psychiatrie gebouwd hebt, zal je een psychiater moeten aannemen.", pharmacy_need_nurse = "Je zult een zuster moeten aannemen voor de apotheek.", ward_need_nurse = "Je moet nog een zuster aannemen om in deze slaapzaal te werken.", op_need_two_surgeons = "Neem twee chirurgen aan om operaties uit te kunnen voeren in de operatiekamer.", training_room_need_consultant = "Je hebt een specialist nodig om les te kunnen geven in dat klaslokaal.", gps_office_need_doctor = "Je moet een arts aannemen voor de spreekkamer.", }, goals = { win = { money = "Je hebt nog %d nodig om het financiële doel te halen voor dit level.", cure = "Genees nog %d patiënten en je hebt genoeg mensen genezen om dit level te winnen.", reputation = "Bouw je reputatie op naar %d punten om je doel te behalen.", value = "Bouw je ziekenhuis uit tot het %d waard is om dit doel te behalen.", }, lose = { kill = "Als er nog %d patiënten overlijden heb je dit level verloren!", }, }, warnings = { charges_too_low = "Je behandelingen zijn te goedkoop. Dit brengt wel mensen binnen, maar je verdient erg weinig aan ze.", charges_too_high = "Je vraagt veel geld. Op de korte termijn brengt dat geld in het laatje, maar uiteindelijk jaag je er mensen mee weg.", plants_thirsty = "Je moet een oogje houden op je planten. Ze zien er dorstig uit.", staff_overworked = "Je personeel is overwerkt. Ze worden inefficiënt en gaan fouten maken, met alle rampzalige gevolgen van dien.", queue_too_long_at_reception = "Er staan teveel mensen te wachten om een kamer toegewezen te krijgen door de receptioniste. Plaats nog een receptie en neem een receptioniste aan.", queue_too_long_send_doctor = "De rij voor de %s is te lang. Is er daar wel een arts aan het werk?", handymen_tired = "Je conciërges zijn erg moe. Laat ze uitrusten.", money_low = "Je hebt bijna geen geld meer!", money_very_low_take_loan = "Je hebt amper geld over. Je kunt een lening afsluiten, weet je.", staff_unhappy = "Je personeel is ongelukkig. Geef ze een bonus, of beter nog: geef ze een personeelsruimte! Je kunt ook je beleid aanpassen in het beleidsscherm.", no_patients_last_month = "Ik ben geschokt! Er is in de afgelopen maand geen enkele nieuwe patiënt binnengekomen.", queues_too_long = "Je wachtrijen zijn te lang.", patient_stuck = "Er is iemand verdwaald. Plan de opzet van je ziekenhuis beter.", patients_too_hot = "De patiënten krijgen het te heet. Verwijder wat radiatoren, zet de verwarming wat lager of plaats meer frisdrankautomaten.", doctors_tired = "Je artsen zijn hartstikke moe. Laat ze onmiddellijk uitrusten.", need_toilets = "Patiënten hebben toiletten nodig. Bouw ze op een plek waar mensen snel bij kunnen komen.", machines_falling_apart = "Je apparatuur valt haast uit elkaar. Stuur er snel conciërges op af!", nobody_cured_last_month = "Er is in de afgelopen maand helemaal niemand genezen.", patients_thirsty = "Mensen krijgen dorst. Misschien zou je wat frisdrankautomaten kunnen plaatsen?", nurses_tired = "Je zusters zijn moe. Laat ze uitrusten.", machine_severely_damaged = "%s is bijna onherstelbaar beschadigd.", reception_bottleneck = "Er is een opstopping bij de receptie. Neem nog een receptioniste aan.", bankruptcy_imminent = "Hé! Straks ben je nog failliet. Pas op!", receptionists_tired = "Je receptionistes zijn erg moe. Laat ze eens uitrusten.", too_many_plants = "Je hebt veel te veel planten. Het lijkt wel een regenwoud.", many_killed = "Je hebt nu %d doden op je geweten. Je weet toch wel dat het de bedoeling is dat je ze geneest, hè?", need_staffroom = "Bouw een personeelsruimte, zodat je werknemers kunnen uitrusten.", staff_too_hot = "Je personeel raakt oververhit. Zet de verwarming wat lager of verwijder radiatoren uit hun kamers.", patients_unhappy = "Patiënten hebben geen hoge pet op van je ziekenhuis. Je zou iets aan hun omgeving kunnen doen.", people_did_it_on_the_floor = "Sommige patiënten konden het niet meer ophouden. Iemand zal het toch op moeten ruimen.", patients_very_thirsty = "Patiënten hebben echt dorst; als je niet snel frisdrankautomaten neerzet zullen veel patiënten je ziekenhuis verlaten en naar huis gaan om cola te drinken.", machinery_very_damaged = "Spoed! Zorg dat een conciërge je machines gaat repareren! Ze exploderen bijna!", handymen_tired2 = "Je conciërges zijn totaal uitgeput, zorg dat ze meteen uit kunnen rusten.", desperate_need_for_watering = "Je moet echt een conciërge inhuren om de planten water te geven.", too_much_litter = "Er is een afvalprobleem, meer conciërges zouden hier tegen kunnen helpen.", place_plants4 = "Vrolijk de patiënten op met wat planten in je ziekenhuis.", change_priorities_to_plants = "Je moet de prioriteiten van je conciërges aanpassen zodat ze meer tijd besteden aan de planten.", finanical_trouble2 = "Zorg dat je wat inkomsten krijgt of je wordt ontslagen. Je zult het level verliezen als je nog %d verder in de min komt.", litter_everywhere = "Er ligt overal troep. Zet er wat conciërges op.", nurses_tired2 = "Je zusters zijn erg moe, zorg dat ze wat rust krijgen.", plants_dying = "Je planten gaan dood: ze zijn wanhopig op zoek naar water. Zorg dat je er meer conciërges op zet want patiënten houden helemaal niet van dode planten.", reduce_staff_rest_threshold = "Verkort de tijd dat je personeel moet doorwerken tussen pauzes op het beleidsscherm, zodat ze wat vaker kunnen rusten. Het is maar een idee.", more_toilets = "Je hebt meer toiletten nodig. Mensen in de rij beginnen kabouters te kleien!", hospital_is_rubbish = "Mensen zeggen openlijk dat je ziekenhuis slecht is. Als je niet oppast, zullen ze hun ziektes ergens anders mee naartoe nemen.", pay_back_loan = "Je hebt meer dan genoeg geld. Misschien kun je nu die lening afbetalen?", financial_trouble3 = "Je banksaldo is zorgelijk. Misschien moet je je inkomsten wat verhogen, je zit %d af van een faillissement.", build_toilet_now = "Bouw nu een toilet, mensen houden het niet meer! Niet lachen, dit is serieus.", more_benches = "Misschien moet je meer bankjes plaatsen, zieke mensen blijven namelijk niet graag staan", many_epidemics = "Het lijkt erop dat er meer dan één epidemie tegelijk plaatsvind. Dit zou een enorme ramp kunnen worden dus doe er snel iets aan.", place_plants_to_keep_people = "Mensen gaan weg. Als je wat planten plaatst, zou dat kunnen helpen.", patients_thirsty2 = "Mensen klagen over dorst. Je zou wat frisdrankautomaten neer moeten zetten of bestaande automaten dichter bij de mensen moeten zetten.", people_freezing = "Onvoorstelbaar. In deze tijd van centrale verwarming vriezen sommige patiënten dood. Bouw radiatoren om het weer warmer te krijgen in je ziekenhuis en zet de thermostaat hoger.", patients_very_cold = "Patiënten hebben het erg koud. Probeer de thermostaat hoger te zetten of plaats meer radiatoren.", build_toilets = "Bouw nu meteen een toilet of je zult iets onplezierigs zien, om over de stank nog maar te zwijgen.", place_plants2 = "Mensen lopen weg. Wat meer planten zou ze misschien op andere gedachten kunnen brengen.", staff_tired = "Je personeel is helemaal kapot. Als je ze niet laat uitrusten in een personeelsruimte kunnen ze gek worden van de stress.", place_plants3 = "Patiënten worden ongelukkig, zet wat meer planten neer om ze op te vrolijken.", staff_unhappy2 = "Je personeel is over het algemeen ongelukkig, dat betekend dat ze binnenkort om een hoger salaris zullen vragen.", cash_low_consider_loan = "Je hoeveelheid cash is erg laag, heb je al eens aan een lening gedacht?", financial_trouble = "Je zit zwaar in de financiële problemen, los dit zo snel mogelijk op! Als je nog %d verliest is al je moeite voor niks geweest!", doctors_tired2 = "Je doktoren zijn ongelofelijk moe, laat ze nu meteen rusten.", patient_leaving = "Er gaat een patiënt weg. De reden? Je slecht draaiende ziekenhuis.", machinery_damaged2 = "Je moet een conciërge aannemen om je machines te laten repareren.", patients_leaving = "Patiënten gaan weg. Verbeter het ziekenhuis voor je bezoekers door bijvoorbeeld planten, bankjes en frisdrankautomaten te plaatsen.", epidemic_getting_serious = "Die besmettelijke ziekte is serieus. Je moet er snel iets aan doen!", machinery_damaged = "Repareer je machines snel. Het zal niet lang meer duren voordat ze uit elkaar gaan vallen.", people_have_to_stand = "Zieke en zwakke mensen moeten blijven staan? Zorg dat ze ergens kunnen zitten!", build_staffroom = "Bouw meteen een personeelsruimte. Je personeel werkt te hard, ze storten bijna in! Kom op!", machinery_slightly_damaged = "Je machines zijn enigszins beschadigd geraakt. Vergeet niet om ze zo af en toe te onderhouden.", patients_getting_hot = "Patiënten hebben het te warm. Probeer de thermostaat wat lager te zetten of verwijder wat radiatoren.", machinery_deteriorating = "Je machines zijn zojuist behoorlijk achteruit gegaan, doordat ze te veel gebruikt worden. Hou een oogje in het zeil.", litter_catastrophy = "Het afvalprobleem heeft epische proporties aangenomen. Trek een blik conciërges open en zet ze aan het werk!", staff_very_cold = "Personeel klaagt over de kou. Zet de thermostaat hoger of plaats meer radiatoren.", deal_with_epidemic_now = "Als je die epidemie niet snel oplost zal je de gevolgen moeten ondervinden. Aan het werk!", patients_really_thirsty = "Patiënten hebben erg veel dorst. Plaats meer frisdrankautomaten of verplaats bestaande automaten naar de langste rijen.", some_litter = "Conciërges kunnen die rommel opruimen voordat het echt een probleem wordt.", patients_annoyed = "Mensen hebben genoeg van de manier waarop je dit ziekenhuis bestuurd en ik kan ze geen ongelijk geven. Verbeter of verdwijn!", receptionists_tired2 = "Je receptionistes zijn erg vermoeid, laat ze zo snel mogelijk rusten.", doctor_crazy_overwork = "Oh nee! Een van je artsen is overspannen door overwerk. Misschien komt hij er nog bovenop als je hem meteen laat rusten.", falling_1 = "Hé! Daar kan ik niet om lachen, kijk uit waar je met die muis klikt; straks raken er mensen gewond!", falling_2 = "Stop daarmee, zou jij dat leuk vinden?", falling_3 = "Au, dat doet vast zeer, is er een dokter in de buurt?!", falling_4 = "Dit is een ziekenhuis, geen pretpark!", falling_5 = "Dit is niet de plek om mensen omver te duwen, je ziet toch dat ze ziek zijn?!", falling_6 = "Het is hier geen bowlingbaan! Zieken horen niet zo behandeld te worden!", no_desk = "Je zult op enig moment wel een receptiebalie moeten bouwen en een receptioniste moeten aannemen!", no_desk_1 = "Als je wilt dat patiënten je ziekenhuis bezoeken, moet je een receptioniste inhuren en een receptiebalie bouwen, zodat ze haar werk kan doen!", no_desk_2 = "Lekker gedaan, dit moet een nieuw record zijn: bijna een jaar zonder patiënten! Als je hier manager wilt blijven, neem dan nu een receptioniste aan en bouw een receptiebalie waar ze kan werken!", no_desk_3 = "Fantastisch, bijna een jaar voorbij en je hebt nog steeds geen bemande receptie. Hoe denk je dat je patiënten gaat krijgen? Los het onmiddellijk op, en stop met dat gerommel!", no_desk_4 = "Een receptioniste moet haar eigen werkplek hebben om de patiënten te begroeten bij binnenkomst.", no_desk_5 = "Nou, het werd tijd! Je zult binnekort een paar patiënten zien arriveren!", no_desk_6 = "Je hebt een receptioniste aangenomen, dus zou je niet een receptiebalie bouwen waar ze haar werk kan doen?", no_desk_7 = "Je hebt een receptiebalie gebouwd, dus zou je niet een receptioniste aannemen? Je zult geen patiënten zien binnenkomen tot je dit opgelost hebt!", cannot_afford = "Je hebt niet genoeg geld op je rekening staan om dit personeelslid aan te nemen.", cannot_afford_2 = "Je hebt niet genoeg geld op de bank staan om dit te kopen!", research_screen_open_1 = "Je moet eerst een laboratorium bouwen, voordat je het onderzoeksscherm kunt bekijken.", research_screen_open_2 = "Onderzoek is in dit level nog niet toegankelijk.", researcher_needs_desk_1 = "Een onderzoeker heeft een bureau nodig om aan te werken.", researcher_needs_desk_2 = "Je onderzoeker is blij dat je hem op pauze laat gaan. Als het je bedoeling was om meer onderzoekers tegelijk te laten werken, dan moet je voor elk van hen een bureau neerzetten zodat ze hun werk kunnen doen.", researcher_needs_desk_3 = "Elke onderzoeker heeft zijn eigen bureau nodig om aan te werken.", nurse_needs_desk_2 = "Je zuster is blij dat je haar een pauze gunt. Als het je bedoeling was om meer zusters tegelijk in de slaapzaal te laten werken, dan moet je voor elk van hen een bureau neerzetten.", nurse_needs_desk_1 = "Elke zuster heeft haar eigen bureau nodig om aan te werken.", }, placement_info = { door_can_place = "Je kunt hier een deur plaatsen als je wilt.", window_can_place = "Jahoor, je kunt hier een raam plaatsen.", door_cannot_place = "Sorry, maar je kunt hier geen deur plaatsen.", object_can_place = "Je kunt dit voorwerp hier plaatsen.", reception_can_place = "Je kunt de receptie hier plaatsen.", staff_cannot_place = "Je kunt hier geen werknemer neerzetten. Sorry.", staff_can_place = "Je kunt hier een werknemer neerzetten. ", object_cannot_place = "Hé, je kunt dat voorwerp daar niet plaatsen.", room_cannot_place = "Je kunt hier de kamer niet bouwen.", room_cannot_place_2 = "De kamer kan hier niet gebouwd worden.", window_cannot_place = "Eh, dat raam kun je daar niet plaatsen", reception_cannot_place = "Je kunt daar geen receptie plaatsen.", }, praise = { many_benches = "Patiënten hebben nu genoeg zitplaats. Netjes.", many_plants = "Heerlijk. Je hebt planten zat. Dat zullen je patiënten fijn vinden.", patients_cured = "%d patiënten genezen.", plants_are_well = "Oh mooi. Je zorgt goed voor je planten, prachtig.", few_have_to_stand = "Bijna niemand hoeft te blijven staan in jouw ziekenhuis. De patiënten zullen daar blij mee zijn", plenty_of_benches = "Er is voldoende zitplaats, dus dat is geen probleem", plants_thriving = "Erg goed. Je planten bloeien prachtig en zien er fantastisch uit. Als dat zo doorgaat kun je een prijs verwachten.", }, information = { larger_rooms = "Grotere kamers strelen het ego van het personeel, waardoor ze beter gaan werken.", extra_items = "Extra voorwerpen in de kamer zorgen voor comfort, waardoor je personeel beter gaan werken.", epidemic = "Je hebt een besmettelijke ziekte in je ziekenhuis. Daar moet je meteen achteraan!", promotion_to_doctor = "Eén van je ASSISTENTEN is zojuist BASISARTS geworden", emergency = "We hebben een noodgeval! Hup hup hup!", patient_abducted = "Eén van je patiënten wordt ontvoerd door aliens!", first_cure = "Goed werk! Je hebt zojuist je eerste patiënt genezen.", promotion_to_consultant = "Eén van je BASISARTSEN is zojuist SPECIALIST geworden.", handyman_adjust = "Je kunt de conciërges effectiever laten werken door hun prioriteiten aan te passen.", promotion_to_specialist = "Een van je artsen is gepromoveerd tot %s.", initial_general_advice = { rats_have_arrived = "Ratten hebben zich in je ziekenhuis genesteld. Schiet ze dood met je muis!", autopsy_available = "De Auto-Autopsie machine is uitgevonden. Als je een lastige patiënt hebt, kun je ze hiermee 'kwijtraken' en onderzoek doen op hun lichaam. Wees gewaarschuwd: deze machine is erg berucht.", --[[''Berucht'' is toch een goede vertaling voor ''controversieel?'' Controversieel kent namelijk niet iedereen.]]-- first_patients_thirsty = "Er zijn dorstige mensen in je ziekenhuis. Plaats een frisdrankautomaat.", research_now_available = "Je hebt je eerste laboratorium gebouwd. Nu kun je naar het onderzoeksscherm gaan.", psychiatric_symbol = "Artsen die psychiatrie hebben gestudeerd dragen het symbool: |", decrease_heating = "Mensen hebben het te heet in je ziekenhuis. Draai de verwarming wat lager. Dit kun je doen bij de kaart.", surgeon_symbol = "Artsen die kunnen opereren dragen het symbool: {", first_emergency = "Patiënten van een Noodgeval hebben een blauwe sirene boven hun hoofd. Genees ze voor ze sterven of de tijd is voorbij.", first_epidemic = "Er is een epidemie gaande! Beslis of je het in de doofpot wil stoppen of wil opbiechten.", taking_your_staff = "Iemand probeert je personeel weg te stropen. Je zult moeten vechten om ze bij je te houden.", place_radiators = "Mensen in je ziekenhuis hebben het koud. Je kunt meer radiatoren in het gangartikelen menu kopen.", epidemic_spreading = "Er waart een besmettelijke ziekte rond. Probeer de geïnfecteerde patiënten te genezen voor ze kunnen vertrekken.", research_symbol = "Dokters die onderzoek kunnen doen dragen dit symbool: }", machine_needs_repair = "Er is een apparaat dat gerepareerd moet worden. Zoek naar een rokend apparaat en klik erop. Klik dan op de conciërgeknop.", increase_heating = "Mensen hebben het koud. Zet de verwarming hoger in het kaartscherm.", first_VIP = "Straks komt er voor het eerst een VIP langs. Zorg ervoor dat de VIP geen onhygiënische dingen of ongelukkige patiënten ziet.", }, patient_leaving_too_expensive = "Een patiënt is vertrokken zonder te betalen voor je %s. Schijnbaar is het te duur.", vip_arrived = "Let op; %s is zojuist gearriveerd! Zorg dat alles gladjes verloopt, zodat hij tevreden is.", epidemic_health_inspector = "Nieuws van je epidemie is aangekomen bij het Ministerie van Volksgezondheid. Verwacht een bezoekje van de inspectie.", first_death = "Je hebt zojuist je eerste patiënt gedood. Hoe voelt dat?", pay_rise = "Een personeelslid dreigt op te stappen. Kies of je de eis inwilligt of hem ontslaat. Klik op het bericht linksonder om te zien welk personeelslid dreigt ontslag te nemen.", place_windows = "Ramen plaatsen zorgt voor lichtere kamers en komt het moraal van je werknemers ten goede.", fax_received = "Het icoontje dat zojuist in de linkeronderhoek omhoog is gekomen, betekent dat er een belangrijk stuk informatie te lezen valt of dat er een beslissing moet worden genomen.", }, build_advice = { placing_object_blocks_door = "Dat voorwerp daar plaatsen, zou de toegang tot een deur blokkeren.", blueprint_would_block = "Met deze blauwdruk zou een andere kamer worden geblokkeerd. Probeer een andere grootte of een andere locatie!", door_not_reachable = "Zo kunnen mensen niet bij een deur komen. Hou je koppie erbij.", blueprint_invalid = "Dat is geen geldige blauwdruk.", }, cheats = { th_cheat = "Gefeliciteerd, je hebt de cheats ontdekt!", roujin_on_cheat = "Roujin's uitdaging geactiveerd, succes...", roujin_off_cheat = "Roujin's uitdaging gedeactiveerd.", }, } room_descriptions = { ultrascan = { [1] = "Echoscopie//", [2] = "De echoscopie is zo'n beetje het ultieme in diagnostische apparatuur. Het kost een aardige duit, maar dan heb je ook wat als je gaat voor fantastische diagnoses in je ziekenhuis.//", [3] = "De echoscopie wordt gebruikt door een arts. Het moet ook onderhouden worden. ", }, gp = { [1] = "Spreekkamer//", [2] = "Dit is het fundament van alle diagnoses. Nieuwe patiënten komen hier langs zodat er gekeken kan worden wat er met hen aan de hand is. Vanaf hier worden ze doorverwezen naar andere diagnostische kamers of naar een kamer waar ze genezen kunnen worden. Als de eerste spreekkamer te druk wordt, zal je er waarschijnlijk nog één willen bouwen. Hoe groter de kamer, hoe meer voorwerpen je erin kwijt kunt, en hoe beter de arts in functie zich zal voelen. Dit geldt trouwens voor alle kamers.//", [3] = "De spreekkamer wordt gebruikt door een arts. ", }, fracture_clinic = { [1] = "Gipskamer//", [2] = "Hier worden patiënten die de pech hebben een Botfactuur te hebben opgelopen geholpen. De gipsverwijderaar gebruikt krachtige industriële lasers om verhard gips weg te snijden, met slechts een kleine martelgang voor de patiënt.//", [3] = "De gipskamer heeft een zuster nodig. Het moet ook eens in de zoveel tijd onderhouden worden. ", }, tv_room = { [1] = "TV ROOM NOT USED", }, inflation = { [1] = "Inflatiekliniek//", [2] = "Patiënten met de pijnlijke doch grappige plofkop worden naar de inflatiekliniek gestuurd, waar het opgeblazen hoofd wordt doorgeprikt en meteen weer opgeblazen tot de juiste luchtdruk is bereikt.//", [3] = "De inflatiekliniek heeft een arts nodig. Het moet ook in de gaten worden gehouden door een conciërge. ", }, jelly_vat = { [1] = "Gelatinekliniek//", [2] = "Patiënten die tot de lachwekkende ziekte gelatinis zijn overgeleverd blubberen zichzelf naar de gelatinekliniek, waar ze in een gelatinetank worden geplaatst. Dit geneest ze op een manier die zelfs de medische wetenschap nog niet helemaal duidelijk is.//", [3] = "De gelatinekliniek heeft een arts nodig, en het waakzame oog van een conciërge voor onderhoud. ", }, scanner = { [1] = "Scanner//", [2] = "Met de moderne scanner kan er een nauwkeurige diagnose gesteld worden. Wanneer de diagnose is afgerond gaat de patiënt weer naar de spreekkamer voor verdere behandelingen.//", [3] = "De scanner heeft zowel een arts als onderhoud nodig. ", }, blood_machine = { [1] = "Bloedmachine//", [2] = "De bloedmachine is een diagnosemachine die de bloedcellen van een patiënt analyseert om te zien wat er mis is.//", [3] = "De bloedmachine wordt gebruikt door een arts. Het heeft ook onderhoud nodig. ", }, pharmacy = { [1] = "Apotheek//", [2] = "Patiënten die behandeld worden met een medicinaal drankje brengen een bezoekje aan de apotheek. Hoe meer geneesmiddelen er worden uitgevonden, hoe drukker het hier zal worden. Waarschijnlijk zal je later nog een apotheek willen bouwen.//", [3] = "Alleen zusters kunnen in een apotheek werken. ", }, cardiogram = { [1] = "Cardio//", [2] = "Patiënten gaan hier naar toe voor controle en diagnose. Daarna gaan ze terug naar de spreekkamer om zich te laten behandelen.", [3] = "De cardio heeft een arts en onderhoud nodig. ", }, ward = { [1] = "Slaapzaal//", [2] = "Patiënten verblijven hier kort voor observatie door een zuster. Ze rusten hier ook uit als ze zich klaar moeten maken voor een operatie.//", [3] = "De slaapzaal heeft een zuster nodig. ", }, psych = { [1] = "Psychiatrie//", [2] = "Patiënten die een psychisch probleem hebben worden naar de psychiatrie gestuurd voor therapie. psychiaters kunnen ook diagnoses stellen. Als een patiënt aan een geestelijk probleem lijdt, kunnen ze met behulp van de trouwe ligbank de patiënt behandelen.//", [3] = "De psychiatrie heeft een arts nodig die een diploma heeft voor psychiater. ", }, staff_room = { [1] = "Personeelsruimte//", [2] = "Op den duur worden je personeelsleden moe en moeten ze uitrusten. Ze gaan dan naar deze kamer toe zodat ze later weer met frisse moed en energie aan de slag kunnen. Personeelsleden die moe zijn gaan langzamer werken, fouten maken, meer geld vragen en zullen uiteindelijk ontslag nemen. Een personeelsruimte met genoeg ruimte is dus het geld en de ruimte waard. Richt de kamer zo in dat er genoeg mensen tegelijk gebruik kunnen maken van de kamer. ", }, operating_theatre = { [1] = "Operatiekamer//", [2] = "De operatiekamer is onmisbaar in een ziekenhuis. Patiënten met verschillende lichamelijke kwalen kunnen hier worden geopereerd door twee chirurgen. Het is van belang dat de operatiekamer groot genoeg is en dat de juiste apparatuur aanwezig is.//", [3] = "Om de operatiekamer te kunnen gebruiken moet je twee chirurgen aannemen. ", }, training = { [1] = "Klaslokaal//", [2] = "Je assistenten en basisartsen kunnen waardevolle ervaring opdoen en kwalificaties behalen door in dit lokaal te studeren onder een specialist. Deze specialist geeft zijn kennis van chirurgie, psychiatrie en/of onderzoek door aan de leerlingen. Artsen die al deze kwalificaties hebben zullen leren hoe ze hun vak nog beter kunnen uitvoeren.//", --[[''en/of:'' wordt de ''/'' hierbij getoond in het spel?]]-- [3] = "Het klaslokaal heeft een specialist en leerlingen nodig. ", }, dna_fixer = { [1] = "DNA hersteller//", [2] = "Patiënten waarmee gerotzooid is door bewoners van een andere wereld moeten hun DNA laten vervangen in deze kamer. De DNA reparatiemachine is een ingewikkeld en duur instrument en er zal altijd, gewoon voor het geval dat, een brandblusser bij de hand gehouden moeten worden.//", [3] = "De DNA reparatiemachine heeft onderhoud nodig van een conciërge. Alleen een arts met een onderzoeksgraad kan van deze machine gebruik maken. ", }, research = { [1] = "Laboratorium//", [2] = "Hier worden nieuwe medicijnen en behandelingen uitgevonden. Dit belangrijke onderdeel van je ziekenhuis zal je beter in staat stellen je patiënten te genezen met als resultaat dat er meer patiënten zijn die je ziekenhuis gezond zullen verlaten.//", [3] = "Het laboratorium heeft een arts met een onderzoeksgraad nodig. ", }, hair_restoration = { [1] = "Haarrestauratiekliniek//", [2] = "Patiënten die last hebben van extreme kaalheid worden naar de haarrestaurateur gestuurd. Een arts zal met deze machine het hoofd van de patiënt van een frisse, nieuwe coupe voorzien.//", [3] = "De haarrestauratie heeft een arts nodig. Ook moet een conciërge zo nu en dan wat onderhoud plegen. ", }, general_diag = { [1] = "Algemene diagnose//", [2] = "Patiënten die een verdere diagnose moeten ondergaan worden hier naartoe gestuurd voor controle. Als men er in de spreekkamer niet achter komt wat er mis is, zal dit na de algemene diagnose vaak wel lukken. Na deze kamer gaan ze terug naar de spreekkamer om de resultaten te laten analyseren.//", [3] = "Algemene diagnose heeft alleen een arts nodig. ", }, electrolysis = { [1] = "Elektrolyse//", [2] = "Patiënten met pilitis worden naar deze kamer gestuurd waar een speciale machine, de elektrolyseerder, de haren uitrukt en de poriën elektrisch sluit met een substantie die veel weg heeft van beton.//", [3] = "De elektrolysekamer wordt gebruikt door een arts en onderhouden door een conciërge. ", }, slack_tongue = { [1] = "Lamme tongkliniek//", [2] = "Patiënten waarvan in de spreekkamer wordt vastgesteld dat ze lijden aan lamme tong, worden naar deze kliniek gestuurd voor een behandeling. De arts gebruikt hier een technisch hoogstandje om de tong uit te rekken en het overtollige spierweefsel weg te snijden. Hierna mag de patiënt weer volledig gezond zijn of haar weg naar huis vinden.//", [3] = "De lamme tongkliniek heeft een arts nodig. Het moet ook zo nu en dan onderhouden worden door een conciërge. ", }, toilets = { [1] = "Toiletten//", [2] = "Ook patiënten voelen af en toe in hun binnenste dat het tijd is om een bruine trui te breien. Dit kunnen ze doen op je comfortabele toiletten. Als je veel bezoekers verwacht, kun je extra wasbakken en toiletten bouwen. Soms zal je meerdere faciliteiten willen bouwen verspreid over het ziekenhuis, zodat iedereen snel zijn behoefte kan doen. ", }, no_room = { [1] = "", }, x_ray = { [1] = "Röntgenkamer//", [2] = "Het röntgenapparaat maakt met speciale stralen een foto van het binnenste van de patiënt zodat ze een goed idee hebben van wat er met hem aan de hand is.//", [3] = "De röntgenkamer heeft een arts nodig. Ook moet het af en toe nagekeken worden door een conciërge. ", }, decontamination = { [1] = "Ontsmettingskliniek//", [2] = "Patiënten die aan Straling zijn blootgesteld worden snel naar de ontsmettingskliniek doorverwezen. Deze kamer heeft een ontsmettingscabine die de patiënt reinigt van al die verschrikkelijke radioactiviteit.//", [3] = "De ontsmettingscabine heeft een arts nodig voor gebruik en een conciërge voor onderhoud. ", }, } introduction_texts = { level17 = "Nog een laatste waarschuwing: hou een oogje op je reputatie. Je reputatie is namelijk iets wat patiënten van heinde en verre naar je ziekenhuis laat komen. " .. "Als je niet teveel mensen doodt en ze redelijk gelukkig houdt, zou je niet al teveel problemen moeten hebben met dit level!//" .. "En nu mag je het zelf opknappen. Veel succes ermee!", level1 = "Welkom in je eerste ziekenhuis!//" .. "Zorg dat de boel op gang komt door een receptie te plaatsen en een spreekkamer te bouwen. Neem ook een receptioniste en een arts in dienst. " .. "Wacht dan tot er mensen langskomen. " .. "Het is een goed idee om een psychiatrische afdeling te bouwen en een arts in te huren met de benodigde kwalificaties. " .. "Een apotheek en een zuster zijn essentieel voor het genezen van je patiënten. " .. "Kijk uit voor ernstige gevallen van plofkop. Een inflatiekliniek lost deze probleempjes op. " .. "Genees, om de spits af te bijten, 10 mensen en hou je reputatie boven de 200.", level9 = "Nu je de kas van het ministerie flink hebt gespekt en de minister dankzij jouw donaties vrolijk in zijn splinternieuwe limousine rondrijdt, kun je nu weer terug naar je echte taak: het bouwen van een ziekenhuis dat niet alleen goed draait maar ook duidelijk om haar arme en zieke patiënten geeft. " .. "Verwacht dat er een boel problemen de kop opsteken. " .. "Als je genoeg kamers en een goed getrainde staf hebt, zal je die problemen makkelijk het hoofd moeten kunnen bieden. " .. "Je ziekenhuis moet uiteindelijk $200,000 waard zijn. Verzamel ook een comfortabele $400.000 op je bankrekening. " .. "Met minder dan dat kun je het level niet uitspelen.", level2 = "Er zijn hier in de omgeving een stuk meer ziektes. " .. "Zet je ziekenhuis zo op dat je de grotere hoeveelheid patiënten kunt behapstukken en bouw ook nog een laboratorium. " .. "Hou je ziekenhuis schoon en je reputatie zo hoog mogelijk. Je zult te maken krijgen met ziektes zoals lamme tong, dus je hebt een lamme tongkliniek nodig. " .. "Je hebt ook een cardio nodig zodat je betere diagnoses kunt stellen en nieuwe ziektes kunt ontdekken. " .. "Beide kamers moeten worden onderzocht voor je ze kunt bouwen. Je kunt nu ook extra gebouwen kopen om je ziekenhuis uit te breiden. Gebruik hier het kaartscherm voor. " .. "Probeer een reputatie van 300 te behalen, een saldo van 10,000 op de teller te hebben staan en 40 mensen te genezen.", level7 = "Je wordt in de gaten gehouden door het Ministerie van Volksgezondheid, dus zorg ervoor dat je flinke winst draait en dat je reputatie constant hoog blijft. " .. "We kunnen ons geen doden veroorloven; dat is slecht voor zaken. " .. "Zorg dat je personeel in vorm is en dat je alle apparatuur hebt die nodig is. " .. "Zorg voor een reputatie van 600 en een saldo $200.000.", level5 = "Dit wordt een druk ziekenhuis met een grote variatie aan ziektebeelden. " .. "Je artsen komen allemaal net van school af, dus bouw een klaslokaal en geef ze een opleiding tot een acceptabel niveau. " .. "Je hebt maar drie specialisten om de rest van je personeel op te leiden, dus hou ze tevreden. " .. "Daarbij is je ziekenhuis gebouwd op de San Androïde-breuk. " .. "Aardbevingen kunnen dus elk moment toeslaan. " .. "Deze zullen je machines beschadigen en je goedlopende ziekenhuis flink verstoren. " .. "Bouw je reputatie op tot boven de 400 en zorg voor een nette $50.000 op je bankrekening. Zorg daarnaast dat je 200 patiënten geneest.", level4 = "Hou al je patiënten tevreden en werk ze zo efficiënt mogelijk af. Voorkom sterfgevallen zoveel mogelijk." .. "Je reputatie staat op het spel, dus hou die zo hoog mogelijk. " .. "Maak je niet al teveel zorgen over geld; dat komt wel als die o zo belangrijke reputatie groeit. " .. "Je kunt nu je ook artsen trainen, zodat ze beter gekwalificeerd zullen zijn. " .. "Waarschijnlijk zal je heel wat patiënten tegenkomen die nogal doorzichtig zijn. " .. "Bouw je reputatie op tot deze de 500 heeft bereikt.", --[[ Level 13 and 14 are rat shooting galleries and are thus not available through the File menu as of yet. --]] level14 = "Je hebt nog een uitdaging gekregen; een compleet onverwacht verrassingsziekenhuis! " .. "Als je hier een succes van kunt maken ben je de winnaar van alle winnaars. " .. "Maar denk niet dat het een eitje is. Het is de moeilijkste opdracht die je ooit zult aannemen. " .. "Veel succes!", --[[ Level 15 is most likely just removed content. I translated it as usual just in case the team finds something to do with it. --]] level15 = "Goed, dat is dus de basis van een ziekenhuis bouwen.//" .. "Je artsen zullen alle hulp nodig hebben die ze kunnen gebruiken bij het stellen van diagnoses. Je kunt ze helpen " .. "door meerdere diagnostische kamers te bouwen, zoals de algemene diagnose.", level8 = "Het is aan jou om het meeste efficiënte ziekenhuis op te zetten voor zo weinig mogelijk geld. " .. "De mensen zitten hier goed in de slappe was, dus pers zoveel mogelijk geld uit ze als mogelijk is. " .. "Ja, mensen genezen is heel leuk, maar je hebt het geld dat ze binnenbrengen echt NODIG. " .. "Schudt die zieke mensen dus maar flink uit. " .. "Verzamel een fortuin van $300.000 om dit level uit te spelen.", level13 = "Je fantastische werk als directeur is ondertussen bij de Speciale Geheime Divisie van de Geheime Speciale Dienst bekend. " .. "Ze hebben een bonus voor je; er is een ziekenhuis geïnfecteerd met ratten en ze hebben een echte Terminator nodig. " .. "Vermorzel zoveel mogelijk ratten voordat de conciërges de boel hebben opgeruimd. " .. "Denk je dat je die taak aankunt?", level16 = "Zodra je wat diagnoses hebt gesteld zal je behandelkamers en klinieken moeten bouwen om voor de mensen te zorgen. Een goede om mee te beginnen is de apotheek. " .. "Je moet ook een zuster inhuren zodat ze de verschillende medicijnen kan toedienen.", level6 = "Gebruik al je kennis om je ziekenhuis soepel te laten draaien, een gezonde winst te maken en alle ziektes te genezen die de mensen met zich meedragen. " .. "Wees je ervan bewust dat de atmosfeer hier erg geschikt is voor het overdragen van bacteriën en infecties. " .. "Hou je ziekenhuis dus schoon, tenzij je een lange rits van epidemieën onder je patiënten wilt brengen. " .. "Zorg ervoor dat je $150.000 verdient en dat je ziekenhuis meer dan $140.000 waard is.", level12 = "Dit is de moeder van alle uitdagingen. " .. "Het ministerie is zo onder de indruk van je succes, dat ze je de hoogste positie hebben aangeboden. Ze willen iemand hebben die nog een ultiem ziekenhuis kan bouwen, veel geld kan verdienen en een fantastische reputatie kan opbouwen. " .. "Je wordt verwacht alle, maar dan ook echt alle ziektes te kunnen genezen en alle prijzen in de wacht te slepen. " .. "Denk je dat je dat aankunt?" .. "Verdien $650.000, genees 750 mensen en verdien krijg een reputatie van 800 om dit te winnen.", level3 = "Dit keer bouw je een ziekenhuis in een rijke buurt. " .. "Het Ministerie van Volksgezondheid vraagt een gezonde winst van je. " .. "Je zult eerst een goede reputatie moeten opbouwen, maar schakel zodra je ziekenhuis volloopt over op zoveel mogelijk geld binnenhalen. " .. "Er kunnen zich ook noodgevallen voordoen. " .. "Dit zijn gevallen waarin er meerdere patiënten binnenkomen met dezelfde ziekte. " .. "Als je ze allemaal binnen een bepaalde tijd geneest, zit er een vette bonus aan vast en gaat je reputatie erop vooruit. " .. "Ziektes als het King Complex kunnen voorkomen en er wordt aangeraden om wat geld opzij te zetten voor een operatiekamer in de buurt van een slaapzaal. " .. "Verdien $20.000 om het level te halen.", level10 = "Het ministerie vraagt nu niet alleen dat je alle ziektes in deze buurt aanpakt, maar ook dat je je concentreert op de efficiëntie van je medicijnen. " .. "Er zijn wat klachten binnengekomen van Ofziek, de waakhond van de gezondheidszorg, dus als je goed over wil komen, zorg je ervoor dat je medicijnen goed werken. " .. "Zorg ook dat er niets te klagen valt over je ziekenhuis zelf. Hou die sterfgevallen zeldzaam. " .. "Hint: Hou wat ruimte vrij voor een gelatinetank. " .. "Ontwikkel al je medicijnen door tot ze ten minste 80 procent effectief zijn, behaal een reputatie van 650 en behaal een saldo van $500.000. ", level11 = "Je hebt de kans gekregen het ultieme ziekenhuis te bouwen. " .. "Dit is een zeer prestigieuze omgeving, en het ministerie wil een zo goed mogelijk ziekenhuis zien. " .. "We verwachten dat je flink geld binnenhaalt, een fantastische reputatie hebt en elke situatie aan kunt. " .. "Dit is een belangrijke taak. " .. "Je bent heel wat als je dit lukt. " .. "Opmerkenswaardig is dat er UFO's in de omgeving gezien zijn. Zorg ervoor dat je personeel klaar is voor onverwachte bezoekers. " .. "Je ziekenhuis moet $240.000 waard zijn en je moet $500.000 op de bank hebben staan. Ook moet je reputatie minimaal 700 bedragen.", level18 = "", demo = "Welkom in het demo ziekenhuis!//" .. "Jammer genoeg bevat de demo versie buiten zelfgemaakte levels alleen dit ziekenhuis, maar er is meer dan genoeg te doen om je voorlopig bezig te houden! " .. "Je zult verschillende kwalen tegenkomen die verschillende ruimtes nodig hebben om genezen te worden, af en toe kunnen zich noodgevallen voordoen, en je zult nieuwe ruimtes uit moeten vinden met het laboratorium. " .. "Jouw doel is om $100,000 te verdienen, de waarde van je ziekenhuis te verhogen naar $70,000 en een reputatie van 700 te behalen, terwijl je 75% van je patiënten geneest. " .. "Zorg er voor dat je reputatie niet lager wordt dan 300 en dat je niet meer dan 40% van je patiënten vermoord, anders zal je ontslagen worden!//" .. "Succes!", } humanoid_name_starts = { [1] = "GOUD", [2] = "HOOGE", [3] = "EEN", [4] = "BENE", [5] = "BAN", [6] = "BILT", [7] = "WIJDE", [8] = "WATER", [9] = "POOT", [10] = "KONINGS", [11] = "VAN BAR", [12] = "DE PET", [13] = "MAR", [14] = "BAAI", [15] = "WARS", [16] = "RIDDER", [17] = "VAN KRAB", [18] = "VIS", [19] = "WATER", [20] = "MOLEN", [21] = "DE BIJ", [22] = "VEEN", [23] = "RICHT", [24] = "SCHOOTS", [25] = "BOERE", [26] = "VAN PRIJK", [27] = "KOERS", [28] = "WIT", [29] = "BINNENS", [30] = "BON", [31] = "VD POOG", [32] = "VAN REGT", [33] = "VD KERK", } humanoid_name_ends = { [1] = "SMID", [2] = "WIJK", [3] = "WEGE", [4] = "SEN", [5] = "TEN", [6] = "VELD", [7] = "WEG", [8] = "ZOON", [9] = "HOUT", [10] = "BEEK", [11] = "BOOM", [12] = "ING", [13] = "LAAT", [14] = "PLAAT", [15] = "DIJK", [16] = "POORTE", [17] = "MARS", [18] = "HEIDE", [19] = "MOND", [20] = "MAN", [21] = "SPRAEK", [22] = "BERGH", [23] = "BOER", [24] = "MOER", [25] = "PLEIJN", [26] = "GRAAF", } vip_names = { [1] = "De Burgemeester van Lagerzand", [2] = "Marko Boerzaato", [3] = "Koning Filip van België", [4] = "Aung Sang Su Kyi, de Myanmarese Oppositieleidster", [5] = "De helderziende Zomanda", [6] = "De schrijver Jan Volkerts", [7] = "Jan Peter Bakellende", [8] = "Hans Spreeuwen", [9] = "Een Eredivise voetballer", [10] = "Albert Zweijn", health_minister = "De Minister van Volksgezondheid", } custom_game_window = { caption = "Uitzendwerk", free_build = "Vrij bouwen", } transactions = { --[[Hier geen veranderingen in aanbrengen. Sommige woorden zijn bewust weggelaten vanwege ruimtegebrek ingame!]]-- severance = "Ontslagpremie", research = "Onderzoekskosten", eoy_trophy_bonus = "Prijzengeld", buy_object = "Aankoop", cure_colon = "Genezen:", epidemy_coverup_fine = "Boete verbergen epidemie", final_treat_colon = "Laatste behandeling:", jukebox = "Inkomen: jukebox", loan_interest = "Rente lening", overdraft = "Rente rood staan", wages = "Salaris", loan_repayment = "Afbetaling lening", personal_bonus = "Persoonlijke bonus", drug_cost = "Medicijnen", cure = "Genezen", heating = "Stookkosten", treat_colon = "Behandeld:", compensation = "Compensatie v. overheid", epidemy_fine = "Boete epidemie", buy_land = "Land gekocht", research_bonus = "Bonus onderzoek", general_bonus = "Algemene bonus uitbetaling", deposit = "Treatment Deposit", --[[geen functie]] eoy_bonus_penalty = "Eindejaarsbonus / -boete", cheat = "Gefraudeerd", drinks = "Inkomen: frisdrankautomaat", vaccination = "Inenting", advance_colon = "Advance:", --[[geen functie]] vip_award = "VIP bonus", hire_staff = "Inhuren personeel", bank_loan = "Lening", machine_replacement = "Vervanging apparatuur", emergency_bonus = "Noodgeval bonus", build_room = "Constructie", insurance_colon = "Verzekering:", sell_object = "Verkoop", } letter = { [1] = { [1] = "Beste %s//", [2] = "Fantastisch! Je hebt dit ziekenhuis goed onder controle gehouden. Wij, hoge pieten van het Ministerie van Volksgezondheid, zouden graag willen weten of je geïnteresseerd bent in een groter project. Wij denken dat je een perfecte kandidaat bent voor een andere locatie. Het salaris is $%d. Denk er maar eens over na.//", [3] = "Ben je geïnteresseerd in een baan in het %s-ziekenhuis?", }, [2] = { [1] = "Beste %s//", [2] = "Goed werk! Je hebt fantastische vooruitgang geboekt met je ziekenhuis. We hebben een andere locatie die je kunt managen als je eens een andere omgeving en een paar frisse uitdagingen wilt tegemoetzien. Je hoeft het niet te accepteren, maar het is het wel waard. Het salaris is $%d//", [3] = "Wil je een baan in Ziekenhuis %s?", }, [3] = { [1] = "Beste %s//", [2] = "Je bent erg succesvol geweest tijdens je termijn in dit ziekenhuis. We zien grootse dingen in je toekomst en willen je graag een andere positie aanbieden. Het salaris bedraagt $%d, en volgens ons zal je de nieuwe uitdaging fantastisch vinden.//", [3] = "Wil je een positie in het %s-ziekenhuis?", }, [4] = { [1] = "Beste %s//", [2] = "Gefeliciteerd! Wij van het ministerie zijn erg onder de indruk van je kundigheid met ziekenhuizen. Je bent zeker weten een ster in de gezondheidszorg. Toch denken we dat je voorkeur uitgaat naar een iets moeilijkere positie. Je zou een salaris van $%d krijgen, maar de keuze is helemaal aan jou.//", [3] = "Ben je geïnteresseerd in werken in het ziekenhuis bij %s?", }, [5] = { [1] = "Beste %s//", [2] = "We hebben respect voor je beslissing in dit fantastische ziekenhuis te blijven, maar we willen je verzoeken het nog eens te overdenken. We zullen je het fantastische salaris van $%d aanbieden als je bereid bent om te verhuizen naar een ander ziekenhuis, waar je het net zo gladjes kan laten draaien als op je huidige plek.//", [3] = "Wil je nu naar Ziekenhuis %s?", }, [6] = { [1] = "Beste %s//", [2] = "Gegroet. We weten hoe gelukkig je bent met dit prachtige instituut, maar waarschijnlijk zou je eens over de voortgang van je carrière moeten nadenken. Je zult beschikken over een salaris van $%d als je besluit te verhuizen. Het is het overdenken waard.//", [3] = "Wil je een positie in het %s-ziekenhuis?", }, [7] = { [1] = "Beste %s//", [2] = "Goedendag! Het Ministerie van Volksgezondheid wil graag weten of je terug wilt komen op je beslissing om bij het huidige ziekenhuis te blijven. We vinden dat je een prachtig ziekenhuis hebt, maar je zou er goed aan doen een uitdagendere positie aan te nemen met een salaris van $%d.//", [3] = "Wil je een positie in het ziekenhuis van %s accepteren?", }, [8] = { [1] = "Beste %s//", [2] = "Nogmaals goedendag. Op onze afgelopen brief heb je afwijzend gereageerd, toen we je een prachtige positie aanboden in een nieuw ziekenhuis en een salaris van $%d. We denken echter dat je nog eens zou moeten nadenken over deze beslissing. We hebben de perfect baan voor je!//", [3] = "Wil je de positie in het ziekenhuis van %s accepteren? Asjeblieft?", }, [9] = { [1] = "Beste %s//", [2] = "Je hebt bewezen de beste ziekenhuisdirecteur te zijn die de medische wereld ooit heeft gekend. Het is een goliathprestatie die niet onbeloond gelaten kan worden, dus we willen je bij dezen de positie van Opperdirecteur van Alle Ziekenhuizen aanbieden. Dit is een hele eer met het riante salaris van $%d. Je krijgt een parade met confetti en mensen zullen hun dankbaarheid tonen waar je ook gaat.//", [3] = "Bedankt voor alles dat je hebt gedaan. Geniet van je semi-pensionering.//", [4] = "", }, [10] = { [1] = "Beste %s//", [2] = "Gefeliciteerd met het fantastische werk dat je hebt geleverd bij elk ziekenhuis waar we je hebben over aangesteld. Zo'n geweldige prestatie geeft je de vrijheid van alle steden ter wereld. Je krijgt een pensioen van $%d, een limousine en alles wat we vragen is dat je van stad tot stad reist, je aanbidders gedag zeggen en lezingen houden ter promotie van ziekenhuizen waar nodig.//", [3] = "We zijn allemaal erg trots op je. Een ieder van ons is dankbaar voor het harde werk dat je hebt verzet, zodat vele levens gered konden worden.//", [4] = "", }, [11] = { [1] = "Beste %s//", [2] = "Je hebt een voorbeeldige carrière achter de rug en je bent een inspiratie voor ons allen. Hartelijk bedankt voor het geweldige werk dat je hebt gedaan in alle ziekenhuizen waar we je over hebben aangesteld. We willen je eren met een levenslang salaris van $%d als je ons helpt door in een officiële cabrio van stad naar stad te reizen, waar je lezingen geeft over hoe je zo veel, zo snel voor elkaar hebt gekregen.//", [3] = "Je bent een voorbeeld voor elk verstandig mens en iedereen ter wereld, zonder uitzondering. Iedereen ziet je als een geschenk uit de hemel.//", [4] = "", }, [12] = { [1] = "Beste %s//", [2] = "Je succesvolle carrière naar de beste ziekenhuisdirecteur sinds Mozes is tot een einde gekomen. De impact op het knusse wereldje van gezondheidszorg is echter zo groot geweest dat het ministerie je graag een salaris van $%d wil aanbieden om in onze naam festivals te openen, schepen te dopen en in praatprogramma's te verschijnen. De hele wereld kijkt uit naar je eerste verschijning! Het zou fantastische PR zijn voor ons allemaal!//", [3] = "Accepteer asjeblieft deze positie. Het werk is niet zwaar. Ook geven we je een auto en een politie escorte waar je ook gaat.//", [4] = "", }, dear_player = "Beste %s", custom_level_completed = "Goed werk! Je hebt alle doelen voor dit ziekenhuis behaald!", return_to_main_menu = "Wil je teruggaan naar het hoofdmenu of doorspelen?", } install = { title = "--------------------------------- CorsixTH Setup ---------------------------------", th_directory = "CorsixTH heeft de databestanden van de originele Theme Hospital (of de demo) nodig om te kunnen draaien. Geef hieronder aan waar Theme Hospital staat geïnstalleerd.", exit = "Afsluiten", ok = "OK", cancel = "Annuleren", } casebook = { sent_home = "weggestuurd", deaths = "doden", treatment_charge = "kosten behandeling", reputation = "reputatie", research = "onderzoek specialiseren", cure = "behandeling", cured = "genezen", earned_money = "omzet", cure_desc = { hire_psychiatrists = "Je moet psychiaters aannemen.", improve_cure = "Behandeling verbeteren.", hire_nurses = "Je moet zusters aannemen.", build_ward = "Je moet nog een slaapzaal bouwen.", no_cure_known = "Geen geneesmiddel bekend.", cure_known = "Geneesmiddel.", build_room = "Ik raad je aan een %s te bouwen", hire_doctors = "Je moet artsen aannemen.", hire_surgeons = "Je moet chirurgen aannemen.", }, } errors = { dialog_missing_graphics = "Sorry, de demobestanden bevatten geen data voor dit scherm.", load_quick_save = "Error, kan de quicksave niet laden, omdat het niet bestaat. Maak je maar geen zorgen, we hebben er eentje voor je aangemaakt!", load_prefix = "Fout bij het laden van het spel: ", save_prefix = "Fout bij het opslaan van het spel: ", map_file_missing = "Bestand %s voor dit level is niet gevonden!", minimum_screen_size = "Voer een resolutie in van minstens 640x480.", unavailable_screen_size = "De resolutie die je hebt ingevoerd is niet beschikbaar in fullscreen", alien_dna = "LET OP: Er zijn geen animaties voor alien patiënten die zitten, op deuren kloppenen, deuren openen, enz. Daarom veranderen ze naar een normaal mens als ze dit doen en veranderen dan weer terug, net als in Them Hospital. Patiënten met alien-DNA verschijnen alleen wanneer dit in het level is toegestaan.", fractured_bones = "LET OP: De animatie voor vrouwelijke patiënten met gebrokken botten is niet goed.", no_games_to_contine = "Er zijn geen opgeslagen spellen.", } diseases = { diag_ward = { name = "Diag slaapzaal", }, diag_ultrascan = { name = "Diag echoscopie", }, autopsy = { name = "Autopsie", }, diag_blood_machine = { name = "Diag bloedmachine", }, diag_x_ray = { name = "Diag röntgen", }, diag_psych = { name = "Diag psychiater", }, diag_general_diag = { name = "Diag algemeen", }, general_practice = { name = "Spreekkamerbezoek", }, diag_cardiogram = { name = "Diag cardio", }, diag_scanner = { name = "Diag scanner", }, third_degree_sideburns = { --[[3rd Degree Sideburns (een woordspeling op derdegraads brandwonden en bakkebaarden--]]-- cause = "Oorzaak: nostalgisch verlangen naar de seventies.", cure = "Behandeling: de psychiater probeert de patiënt er via moderne conversatietechnieken van te overtuigen dat die flamboyante stijlen echt niet meer kunnen.", name = "Derdegraads brandhaar", symptoms = "Symptomen: fel geverfd haar, bakkebaarden, plateauschoenen en glitter make-up.", }, discrete_itching = { cause = "Oorzaak: kleine insecten met scherpe tandjes.", cure = "Behandeling: patiënt drinkt een farmaceutische klodder anti-jeuksiroop.", name = "Onregelmatige jeuk", symptoms = "Symptomen: krabben met lokale ontstekingen tot gevolg.", }, the_squits = { cause = "Oorzaak: het eten van aan de binnenkant van de oven aangebakken stukjes pizza.", cure = "Behandeling: een plakkerige mix van draderige chemicaliën drinken om de binnenkant van de patiënt weer wat te laten stollen.", name = "Sproeipoep", symptoms = "Symptomen: ugh. Dat kun je vast zelf wel bedenken.", }, spare_ribs = { cause = "Oorzaak: op koude stenen vloeren zitten.", cure = "Behandeling: het stukje rib wordt verwijderd door twee chirurgen en aan de patiënt in een zakje meegegeven.", name = "Spare Ribs", --its has the same double meaning as in English. symptoms = "Symptomen: een iets te grote borstkas.", }, king_complex = { cause = "Oorzaak: de geest van de King neemt bezit van de patiënt.", cure = "Behandeling: een psychiater vertelt de patiënt hoe belachelijk hij of zij eruit ziet.", name = "King Complex", symptoms = "Symptomen: een dieet van cheeseburgers en felgekleurd suedè schoeisel.", }, pregnancy = { cause = "Oorzaak: stroomuitval in steden.", cure = "Behandeling: de baby wordt verwijderd in de operatiekamer en aan de patiënt gegeven.", name = "Zwangerschap", symptoms = "Symptomen: veel eten met bolle buik tot gevolg.", }, fake_blood = { cause = "Oorzaak: de patiënt is het slachtoffer van een flauwe grap.", cure = "Behandeling: de kalmerende stem van een psychiater is het enige dat dit kan oplossen.", name = "Nepbloed", symptoms = "Symptomen: rode vloeistof in aderen die oplost bij contact met kleding.", }, invisibility = { cause = "Oorzaak: gebeten worden door een radioactieve (en onzichtbare) mier.", cure = "Behandeling: een fel drankje uit de apotheek toont weer de ware kleuren van de patiënt.", name = "Onzichtbaarheid", symptoms = "Symptomen: patiënten lijden er niet onder. Sommigen maken misbruik van de situatie door grapjes uit te halen met hun familie.", }, golf_stones = { cause = "Oorzaak: blootstelling aan giftig gas uit golfballen.", cure = "Behandeling: verwijdering via operatie door twee chirurgen.", name = "Golfstenen", symptoms = "Symptomen: ijlen en grote schaamte.", }, infectious_laughter = { cause = "Oorzaak: klassieke comedyseries.", cure = "Behandeling: een gekwalificeerde psychiater vertelt de patiënt hoe verschrikkelijk zijn ziekte wel niet is.", name = "Aanstekelijke lach", symptoms = "Symptomen: constant gegniffel en het herhalen van flauwe kantlijngrapjes.", }, baldness = { cause = "Oorzaak: liegen en verhalen verzinnen om populair te zijn.", cure = "Behandeling: het haar wordt naadloos vastgesmolten in het hoofd van de patiënt met deze pijnlijke machine.", name = "Kaalheid", symptoms = "Symptomen: een glimmend hoofd en schaamte.", }, heaped_piles = { cause = "Oorzaak: rondhangen bij het koffieautomaat.", cure = "Behandeling: een prettig, krachtig drankje met een zuurgraad waarvan de kruisbessen van binnenuit oplossen.", name = "Kuise kruisbessen", symptoms = "Symptomen: het is voor de patiënt net alsof hij op een zak knikkers zit.", }, unexpected_swelling = { cause = "Oorzaak: iets onverwachts.", cure = "Behandeling: de zwelling kan alleen worden doorgeprikt door twee chirurgen.", name = "Onverwachte zwelling", symptoms = "Symptomen: een zwelling.", }, jellyitis = { cause = "Oorzaak: gelatinerijk dieet en teveel beweging.", cure = "Behandeling: de patiënt wordt in een gelatinetank gegoten om daar een beetje te stollen.", name = "Gelatinis", symptoms = "Symptomen: uitzonderlijke drillerigheid en vallen.", }, hairyitis = { cause = "Oorzaak: overmatige blootstelling aan de maan.", cure = "Behandeling: een elektrolysemachine verwijdert het haar en dicht de poriën.", name = "Pilitis", symptoms = "Symptomen: de zieke ervaart een betere reukzin.", }, alien_dna = { cause = "Oorzaak: gezichtzuigers met het bloed van intelligente aliens.", cure = "Behandeling: het DNA wordt machinaal verwijderd, de buitenaardse elementen worden gefilterd en het DNA wordt snel weer teruggepompt.", name = "Buitenaards DNA", symptoms = "Symptomen: langzame monsterachtige metamorfose en een drang tot het vernietigen van onze steden.", }, bloaty_head = { cause = "Oorzaak: het opsnuiven van kaas en het drinken van ongezuiverd regenwater.", cure = "Behandeling: het opgezwollen hoofd wordt doorgeprikt en weer opgeblazen met een handige machine.", name = "Plofkop", symptoms = "Symptomen: een enorm opgezwollen hoofd; zeer ongemakkelijk voor de zieke.", }, gastric_ejections = { cause = "Oorzaak: pittig Mexicaans of Indiaas eten.", cure = "Behandeling: een speciaal bindend drankje zorgt ervoor dat er niets meer uit wordt geworpen.", name = "Gastrische uitstoot", symptoms = "Symptomen: halfverteerd voedsel wordt in willekeurige clusters uit de patiënt gestoten.", }, uncommon_cold = { cause = "Oorzaak: deeltjes snot in de lucht.", cure = "Behandeling: een grote slok speciale hoestdrank uit de apotheek, gemaakt van speciale ingrediënten.", name = "Verguurheid", symptoms = "Symptomen: loopneus, niezen en verkleurde longen.", }, corrugated_ankles = { cause = "Oorzaak: het rijden over infrastructurele aanpassingen die het verkeer behoren te vertragen.", cure = "Behandeling: het drinken van een licht bijtend kruidenmengsel zou de enkels weer recht moeten trekken.", name = "Geribbelde enkels", symptoms = "Symptomen: schoeisel zit niet zo lekker.", }, sleeping_illness = { cause = "Oorzaak: een overactieve slaapklier in het gehemelte.", cure = "Behandeling: een hoge dosis oppepmiddel wordt door een zuster toegediend.", name = "Slaapkwaal", symptoms = "Symptomen: een onbedwingbare zin om gewoon ergens in slaap te vallen.", }, sweaty_palms = { cause = "Oorzaak: angst voor sollicitaties.", cure = "Behandeling: een psychiater moet de patiënt overtuigen dat dit geen echte ziekte is.", name = "Zweethanden", symptoms = "Symptomen: de hand van de patiënt voelt aan als een natte spons.", }, serious_radiation = { cause = "Oorzaak: plutoniumisotopen verwarren met kauwgom.", cure = "Behandeling: de patiënt wordt voor grondige reiniging in een ontsmettingscabine geplaatst.", name = "Zware straling", symptoms = "Symptomen: patiënten met deze aandoening voelen zich heel, heel erg ziek.", }, gut_rot = { cause = "Oorzaak: tante Triens Vrolijke Whiskey Hoestsiroop.", cure = "Behandeling: een zuster dient een selectie opgeloste chemicaliën toe om het buikje van binnen te bekleden.", name = "Buikrot", symptoms = "Symptomen: geen hoest, maar ook geen maagwand.", }, iron_lungs = { cause = "Oorzaak: smog van de binnenstad vermengd met kebabrestjes.", cure = "Behandeling: twee chirurgen verwijderen de massieve longen in een operatiekamer.", name = "IJzeren longen", symptoms = "Symptomen: vuurspuwen en luid onder water kunnen schreeuwen.", }, broken_wind = { cause = "Oorzaak: een loopband gebruiken net na de maaltijd.", cure = "Behandeling: in de apotheek wordt er snel een zware mix van speciale waterige atomen gedronken.", name = "Wind tegen", symptoms = "Symptomen: de patiënt verschijnt altijd chagrijnig op het werk. Dat geld ook voor mensen die dezelfde kant op fietsen.", }, kidney_beans = { cause = "Oorzaak: kauwen op ijsklontjes uit drankjes.", cure = "Behandeling: twee chirurgen verwijderen het froliet zonder gevoelige lichaamsdelen aan te raken.", name = "Nierfroliet", --combinatie van Nierstenen en synoniem Nefroliet symptoms = "Symptomen: pijn en de patiënt moet heel vaak naar het toilet.", }, transparency = { cause = "Oorzaak: het aflikken van bladfolie-lipjes van vers geopende zuivelproducten.", cure = "Behandeling: een drankje uit de apotheek, gemaakt van speciaal gekoeld en gekleurd water, verhelpt deze ziekte.", name = "Doorzichtigheid", symptoms = "Symptomen: organen worden doorzichtig en zien er ranzig uit.", }, broken_heart = { cause = "Oorzaak: iemand die rijker, jonger en slanker is dan de patiënt.", cure = "Behandeling: twee chirurgen openen de borstkas en herstellen ademloos en liefdevol het hart.", name = "Gebroken hart", symptoms = "Symptomen: huilen en RSI door het constante verscheuren van vakantiefoto's.", }, slack_tongue = { cause = "Oorzaak: eindeloos geklets over soaps.", cure = "Behandeling: de tong wordt in de Snijmachine geplaatst en snel, efficiënt en pijnlijk verwijderd.", name = "Lamme tong", symptoms = "Symptomen: tong zwelt op tot vijf maal de normale lengte.", }, tv_personalities = { cause = "Oorzaak: dagtelevisie.", cure = "Behandeling: een getrainde psychiater moet de patiënt overtuigen zijn televisie te verkopen en een radio aan te schaffen.", name = "TV persoonlijkheid", symptoms = "Symptomen: de patiënt denkt dat hij of zij een kookprogramma kan presenteren.", }, ruptured_nodules = { cause = "Oorzaak: bungeejumpen in de kou.", cure = "Behandeling: twee gekwalificeerde chirurgen verwijderen de knobbels met vaste hand.", name = "Gebarsten knobbels", symptoms = "Symptomen: niet lekker kunnen liggen.", }, fractured_bones = { cause = "Oorzaak: van hoge dingen afvallen en op beton landen.", cure = "Behandeling: er wordt gips gezet en vervolgens verwijderd met een lasergestuurde machine.", name = "Botfractuur", symptoms = "Symptomen: luid gekraak en betreffend ledemaat niet meer kunnen gebruiken.", }, chronic_nosehair = { cause = "Oorzaak: het ophalen van de neus in verachting voor mensen die slechter af zijn dan de patiënt.", cure = "Behandeling: een smerig, haar verwijderend drankje wordt door een zuster in de apotheek klaargemaakt en wordt door de patiënt gedronken.", name = "Chronisch neushaar", symptoms = "Symptomen: neushaar waarin een marter zich zou kunnen nestelen.", }, } policy = { header = "Ziekenhuisbeleid", diag_termination = "diagnose stoppen", sliders = { guess = "GOKKEN", send_home = "WEGSTUREN", stop = "STOP PROCEDURE", staff_room = "GA NAAR DE PERSONEELSRUIMTE", }, diag_procedure = "diagnostische procedures", staff_rest = "personeel laten rusten", staff_leave_rooms = "personeel verlaat kamers", } competitor_names = { [1] = "ORAC", [2] = "HAL", [3] = "COLOSSUS", [4] = "MULTIVAC", [5] = "HOLLY", [6] = "DEEP THOUGHT", [7] = "ZEN", [8] = "LEON", [9] = "AKIRA", [10] = "SAM", [11] = "CHARLIE", [12] = "JAYNE", [13] = "ARTHUR", [14] = "MAGNUS", [15] = "MOTHER", [16] = "SAL", [17] = "MARVIN", [18] = "JOSHUA", [19] = "DANEEL", [20] = "OLIVAW", [21] = "NIC", [22] = "DANEEL", [23] = "OLIVAW", [24] = "NIC", } main_menu = { exit = "Afsluiten", custom_level = "Uitzendwerk", new_game = "Nieuwe carrière", load_game = "Spel laden", options = "Instellingen", version = "Versie: ", savegame_version = "Savegame versie: ", continue = "Zet spel voort", } confirmation = { --spaces on the end make the text fit properly in text windows quit = "Weet je zeker dat je het spel wilt verlaten? ", return_to_blueprint = "Weet je zeker dat je terug wil gaan naar de blauwdrukmodus? ", needs_restart = "Om deze instellingen toe te passen, moet CorsixTH opnieuw opstarten. Niet opgeslagen vooruitgang zal hierdoor verloren gaan. Weet je zeker dat je dit wil doen? ", overwrite_save = "Er is hier al een spel opgeslagen. Weet je zeker dat je het bestaande spel wilt overschrijven? ", delete_room = "Weet je zeker dat je deze kamer wilt verwijderen? ", sack_staff = "Weet je zeker dat je dit personeelslid wilt ontslaan? ", replace_machine = "Weet je zeker dat je de %s wilt vervangen voor $%d? ", abort_edit_room = "Je bent een ruimte aan het bouwen of aanpassen. Wanneer alle benodigde objecten geplaatst zijn, is de ruimte af. Zo niet, dan wordt de ruimte vernietigd. ", restart_level = "Weet je zeker dat je het level opnieuw wilt beginnen? ", maximum_screen_size = "De resolutie die je hebt ingevoerd is groter dan 3000x2000. Een hoge resolutie is mogelijk, mits je hardware goed genoeg is om een speelbare framerate te behalen. Weet je zeker dat je wilt doorgaan?", music_warning = "Voordat je MP3's gaat gebruiken als ingame muziek, heb je smpeg.dll (of gelijkwaardig voor je systeem) nodig, anders werkt de muziek niet. Wil je doorgaan?", } menu_display = { mcga_lo_res = " LAGE RES ", shadows = " SHADUWEN ", high_res = " HOGE RES ", } menu_list_window = { back = "Terug", save_date = "Gewijzigd op", name = "Naam", } menu_options_volume = { [50] = " 50% ", [100] = " 100% ", [30] = " 30% ", [60] = " 60% ", [90] = " 90% ", [10] = " 10% ", [20] = " 20% ", [40] = " 40% ", [80] = " 80% ", [70] = " 70% ", } menu_file_load = { [1] = " GAME 1 ", [2] = " GAME 2 ", [3] = " GAME 3 ", [4] = " GAME 4 ", [5] = " GAME 5 ", [6] = " GAME 6 ", [7] = " GAME 7 ", [8] = " GAME 8 ", } menu_file = { quit = " (%1%) AFSLUITEN ", save = " (%1%) OPSLAAN ", load = " (%1%) LADEN ", restart = " (%1%) HERSTARTEN ", } high_score = { categories = { deaths = "DODEN", total_value = "TOTALE WAARDE", money = "RIJKSTE", cures = "GENEZEN", visitors = "MEESTE BEZOEKERS", staff_number = "MEESTE PERSONEEL", cure_death_ratio = "GENEZINGEN VS DODEN", patient_happiness = "KLANTTEVREDENHEID", staff_happiness = "PERSONEELSTEVREDENHEID", salary = "HOOGSTE SALARIS", clean = "REINHEID", }, player = "SPELER", score = "SCORE", pos = "POS", best_scores = "HALL OF FAME", worst_scores = "HALL OF SHAME", killed = "Gedood", } --[[ Ik denk niet dat het belangrijk is om dit stukje te vertalen. Als iemand geen Engels spreekt, zou hij sowieso niet met debug tools moeten zitten klooien. ]]-- menu_debug = { porter_pagers = " PORTER PAGERS ", --[[ Wat? "portier biepers"? --]] display_pager = " TOON PAGER ", --[[ Een pager is zo een apparaatje dat in de nineties razend populair was... --]] disable_salary_raise = " SALARISVERHOGINGEN UITSCHAKELEN ", display_big_cells = " BIG CELLS TONEN ", make_debug_patient = " DEBUG PATIENT ", mapwho_checking = " MAPWHO CHECKING ", sprite_viewer = " SPRITE VIEWER ", keep_clear_cells = " LEGE CELLS BEHOUDEN ", dump_strings = " (%1%) STRINGDUMP MAKEN ", machine_pagers = " MACHINE PAGERS ", remove_objects = " VOORWERPEN VERWIJDEREN ", enter_nav_debug = " GA NAAR NAV DEBUG ", lose_game_anim = { [1] = " VERLOREN 1 ANIM ", [2] = " VERLOREN 2 ANIM ", [3] = " VERLOREN 3 ANIM ", [4] = " VERLOREN 4 ANIM ", [5] = " VERLOREN 5 ANIM ", [6] = " VERLOREN 6 ANIM ", [7] = " VERLOREN 7 ANIM ", }, map_overlay = " MAP OVERLAYS ", display_room_status = " KAMERSTATUS TONEN ", win_game_anim = " SPEL GEWONNEN ANIM ", object_cells = " VOORWERP CELLS ", limit_camera = " CAMERABEGRENZING ", nav_bits = " NAV BITS ", remove_walls = " MUREN ONZICHTBAAR MAKEN ", dump_gamelog = " (%1%) GAME LOG DUMPEN ", win_level_anim = " LEVEL GEWONNEN ANIM ", pixbuf_cells = " PIXBUF CELLS ", transparent_walls = " (%1%) TRANSPARANTE MUREN ", show_help_hotspot = " HELP HOTSPOTS TONEN ", show_nav_cells = " NAV CELLS TONEN ", entry_cells = " ENTRY CELLS ", plant_pagers = " PLANT PAGERS ", lua_console = " (%1%) LUA CONSOLE ", make_debug_fax = " DEBUG FAX ", calls_dispatcher = " CALLS DISPATCHER ", cheats = " (%1%) CHEATS ", jump_to_level = " SPRING NAAR LEVEL ", debug_script = " (%1%) LAAT FOUTSCRIPT LOPEN ", connect_debugger = " (%1%) MAAK VERBINDING MET LUA DBGp SERVER ", } drug_companies = { [1] = "Machtige Medicatie", [2] = "GeneesGoed", [3] = "Pimpelpaarse Kruis", [4] = "Per Vers BV.", [5] = "OmniPharma VOF", } graphs = { deaths = "Doden", money_in = "Geld bij", money_out = "Geld af", visitors = "Bezoekers", wages = "Salaris", balance = "Saldo", time_spans = { [1] = "1 Jaar", [2] = "12 Jaar", [3] = "48 Jaar", }, cures = "Genezingen", reputation = "Reputatie", } menu_file_save = { } months = { [1] = "Jan", [2] = "Feb", [3] = "Maa", [4] = "Apr", [5] = "Mei", [6] = "Jun", [7] = "Jul", [8] = "Aug", [9] = "Sep", [10] = "Okt", [11] = "Nov", [12] = "Dec", } date_format.daymonth = "%1% %2:months%" menu_options = { game_speed = " SNELHEID ", sound_vol = " VOLUME GELUID ", music_vol = " VOLUME MUZIEK ", announcements = " OMROEPBERICHTEN ", lock_windows = " VENSTERS VASTZETTEN ", sound = " (%1%) GELUID ", announcements_vol = " (%1%) VOLUME OMROEPBERICHTEN ", music = " (%1%) MUZIEK ", autosave = " AUTOSAVE ", jukebox = " (%1%) JUKEBOX ", edge_scrolling = " RANDSCROLLEN ", adviser_disabled = " (%1%) ADVISEUR ", warmth_colors = " WARMTE KLEUREN ", twentyfour_hour_clock = " 24 UUR KLOK ", wage_increase = " SALARIS VERZOEKEN ", } menu_options_wage_increase = { deny = " AFWIJZEN ", grant = " TOEKENNEN ", } menu_options_game_speed = { pause = " (%1%) PAUZE ", slowest = " (%1%) EN NOG LANGZAMER ", slower = " (%1%) LANGZAAM ", normal = " (%1%) NORMAAL ", max_speed = " (%1%) MAX SNELHEID ", and_then_some_more = " (%1%) EN NOG EEN BEETJE ", } menu_options_warmth_colors = { choice_1 = " ROOD ", choice_2 = " BLAUW, GROEN EN ROOD ", choice_3 = " GEEL, ORANJE EN ROOD ", } menu = { debug = " DEBUG ", display = " BEELD ", file = " BESTAND ", options = " OPTIES ", charts = " OVERZICHTEN ", } rooms_short = { ultrascan = "Echoscopie", research_room = "Laboratorium", fracture_clinic = "Gipskamer", gps_office = "Spreekkamer", destroyed = "Vernietigd", staffroom = "Personeelsruimte", jelly_vat = "Gelatinetank", scanner = "Scanner", decontamination = "Ontsmetting", pharmacy = "Apotheek", cardiogram = "Cardio", reception = "Receptie", training_room = "Klaslokaal", corridor_objects = "Gangartikelen", operating_theatre = "Operatiekamer", dna_fixer = "DNA hersteller", ward = "Slaapzaal", psychiatric = "Psychiatrie", hair_restoration = "Haarrestauratie", general_diag = "Algemene diagnose", inflation = "Inflatie", tongue_clinic = "Lamme tongkliniek", toilets = "Toiletten", electrolysis = "Elektrolyse", x_ray = "Röntgenkamer", blood_machine = "Bloedmachine", } object = { chair = "Stoel", litter = "Afval", sofa = "Sofa", operating_table = "Operatietafel", bed2 = "Bed", bench = "Bank", scanner = "Scanner", couch = "Sofa", blood_machine = "Bloedmachine", table1 = "Tafel", video_game = "Videospel", lamp = "Lamp", op_sink2 = "Wastafel", door = "Deur", auto_autopsy = "Auto Autopsie", reception_desk = "Receptie", hair_restorer = "Haarrestaurateur", projector = "Projector", crash_trolley = "Werktafel", tv = "Televisie", ultrascanner = "Echo apparaat", surgeon_screen = "Omkleedscherm", litter_bomb = "Afvalbom", inflator = "Compressor", table2 = "Tafel", desk = "Bureau", pool_table = "Biljarttafel", x_ray_viewer = "Röntgenscherm", radiation_shield = "Radiatieschild", bed = "Bed", swing_door2 = "Klapdeur", console = "Paneel", op_sink1 = "Wasbak", bookcase = "Boekenkast", drinks_machine = "Frisdrankautomaat", comfortable_chair = "Luie stoel", skeleton = "Geraamte", computer = "Computer", bin = "Prullenbak", pharmacy_cabinet = "Medicijnkast", radiator = "Radiator", cast_remover = "Gipsverwijderaar", atom_analyser = "Pulsmixer", plant = "Plant", jelly_moulder = "Gelatinetank", cardio = "Cardio", toilet = "Toilet", electrolyser = "Elektrolysator", fire_extinguisher = "Brandblusser", bed3 = "Bed", swing_door1 = "Klapdeur", lecture_chair = "Schoolbank", screen = "Screen", toilet_sink = "Wastafel", shower = "Cabine", gates_of_hell = "Poort naar de hel", entrance_right = "Rechterkant ingang", entrance_left = "Linkerkant ingang", slicer = "Snijmachine", dna_fixer = "DNA reparatiemachine", x_ray = "Röntgen", cabinet = "Dossierkast", } pay_rise = { definite_quit = "Niets kan mij hier nog houden. Ik heb hier schoon genoeg van.", regular = { [1] = "Ik ben kapot. Ik moet eens goed uitrusten en een salarisverhoging krijgen van %d, tenzij je graag wil zien hoe ik dit rotbaantje vaarwel zeg.", [2] = "Ik ben erg moe. Ik heb rust nodig en een salarisverhoging van %d naar %d. En snel een beetje, slavendrijver!", [3] = "Kom op! Ik werk me uit de naad. Geef me een bonus van %d, dan blijf ik in je ziekenhuis.", [4] = "Ik ben hier erg ongelukkig. Ik eis een opslag van %d, zodat mijn salaris %d wordt, anders pak ik mijn biezen.", [5] = "Mijn ouders vertelden me dat het salaris van een medicus fantastisch was. Geef me dus een opslag van %d, anders word ik programmeur.", [6] = "Ik ben het zat. Geef me een fatsoenlijk salaris. Een opslag van %d moet genoeg zijn.", }, poached = "Ik heb een aanbod van %d gekregen van %s. Als je me niet hetzelfde betaalt ben ik weg.", } town_map = { number = "Landnummer", not_for_sale = "Niet voor verkoop", chat = "Chatroom", price = "Landprijs", for_sale = "Te koop", owner = "Eigenaar", area = "Gebied", } level_names = { [1] = "Ziekwijk", [2] = "Rustenvreugd", [3] = "Grootzand", [4] = "Uitwijk-aan-Zee", [5] = "Eenwoud", [6] = "Pusch-aan-de-Gaas", [7] = "Groenpoel", [8] = "Manwerf", [9] = "Oostdorp", [10] = "Schakendam", [11] = "Ferekhart", [12] = "Knuppelenburg", [13] = "Laagschorem", [14] = "Klein Hildrecht", [15] = "Diepegraven", } build_room_window = { pick_room_type = "Kies soort", pick_department = "Kies afdeling", cost = "Kosten: ", } insurance_companies = { --[[''VOF'' em ''BV'' regelmatig verwijderd i.v.m. de niet passende tekst.]]-- [1] = "ZwaanBlat BV", [2] = "Oorha", [3] = "FTBA", [4] = "Achweeja", [5] = "Zwemblaas BV", [6] = "Noordelijk Beheer", [7] = "Aagod", [8] = "Leo Katjes NV.", [9] = "Pokkie en Keppie", [10] = "Blij met Blijheid", [11] = "De Familie", out_of_business = "FAILLIET", } menu_file_save = { [1] = " SPEL 1 ", [2] = " SPEL 2 ", [3] = " SPEL 3 ", [4] = " SPEL 4 ", [5] = " SPEL 5 ", [6] = " SPEL 6 ", [7] = " SPEL 7 ", [8] = " SPEL 8 ", } new_game_window = { player_name = "Gebruikersnaam", difficulty = "Selecteer moeilijkheid", hard = "Specialist (Moeilijk)", medium = "Arts (Gemiddeld)", easy = "Assistent (Makkelijk)", start = "Begin", cancel = "Annuleren", tutorial = "Leermodus", option_on = "Aan", option_off = "Uit", caption = "Nieuwe carrière", } calls_dispatcher = { repair = "Reparatie", summary = "%d oproepen, %d toegewezen", close = "Sluiten", watering = "Watergeven @ %d,%d", staff = "%s - %s", } debug_patient_window = { caption = "Debug patiënt", } lua_console = { execute_code = "Uitvoeren", close = "Sluiten", } cheats_window = { cheats = { end_month = "Einde van de maand", emergency = "Creëer noodgeval", vip = "Creëer VIP", win_level = "Win Level", create_patient = "Creëer patiënt", money = "Geld cheat (+ $10.000)", lose_level = "Verlies Level", all_research = "All research cheat", end_year = "Einde van het jaar", earthquake = "Creëer aardbeving", epidemic = "Besmettelijke patient laten verschijnen", toggle_infected = "Aan/uit zetten besmet iconen", }, cheated = { no = "Cheats gebruikt: Nee", yes = "Cheats gebruikt: Ja", }, close = "Sluiten", caption = "Cheats", warning = "Waarschuwing: wanneer je cheat zul je aan het einde van het level geen bonuspunten verdienen", } handyman_window = { all_parcels = "Overal", --Translates to: Everywhere, because the full Dutch translation would be far too long to fit the ingame window parcel = "Gebouw", } original_credits = { [1] = " ", [2] = " ", [3] = " ", [4] = " ", [5] = " ", [6] = " ", [7] = " ", [8] = " ", [9] = " ", [10] = " ", [11] = " ", [12] = ":Designed and Created by", [13] = ":Bullfrog Productions", [14] = " ", [15] = ":Pluto Development Team", [16] = ",", [17] = "Mark Webley", [18] = "Gary Carr", [19] = "Matt Chilton", [20] = "Matt Sullivan", [21] = "Jo Rider", [22] = "Rajan Tande", [23] = "Wayne Imlach", [24] = "Andy Bass", [25] = "Jon Rennie", [26] = "Adam Coglan", [27] = "Natalie White", [28] = " ", [29] = " ", [30] = " ", [31] = ":Programming", [32] = ",", [33] = "Mark Webley", [34] = "Matt Chilton", [35] = "Matt Sullivan", [36] = "Rajan Tande", [37] = " ", [38] = " ", [39] = " ", [40] = ":Art", [41] = ",", [42] = "Gary Carr", [43] = "Jo Rider", [44] = "Andy Bass", [45] = "Adam Coglan", [46] = " ", [47] = " ", [48] = " ", [49] = ":Additional Programming", [50] = ",", [51] = "Ben Deane", [52] = "Gary Morgan", [53] = "Jonty Barnes", [54] = " ", [55] = " ", [56] = " ", [57] = ":Additional Art", [58] = ",", [59] = "Eoin Rogan", [60] = "George Svarovsky", [61] = "Saurev Sarkar", [62] = "Jason Brown", [63] = "John Kershaw", [64] = "Dee Lee", [65] = " ", [66] = " ", [67] = " ", [68] = ":Intro Sequence", [69] = ",", [70] = "Stuart Black", [71] = " ", [72] = " ", [73] = " ", [74] = ":Music and Sound Effects", [75] = ",", [76] = "Russell Shaw", [77] = "Adrian Moore", [78] = " ", [79] = " ", [80] = " ", [81] = ":Additional Music", [82] = ",", [83] = "Jeremy Longley", [84] = "Andy Wood", [85] = " ", [86] = " ", [87] = " ", [88] = ":Announcer Voiceover", [89] = ",", [90] = "Rebecca Green", [91] = " ", [92] = " ", [93] = " ", [94] = ":Level Design", [95] = ",", [96] = "Wayne Imlach", [97] = "Natalie White", [98] = "Steven Jarrett", [99] = "Shin Kanaoya", [100] = " ", [101] = " ", [102] = " ", [103] = ":Scripting", [104] = ",", [105] = "James Leach", [106] = "Sean Masterson", [107] = "Neil Cook", [108] = " ", [109] = " ", [110] = " ", [111] = ":R&D", [112] = " ", [113] = ":Graphics Engine", [114] = ",", [115] = "Andy Cakebread", [116] = "Richard Reed", [117] = " ", [118] = " ", [119] = " ", [120] = ":R&D Support", [121] = ",", [122] = "Glenn Corpes", [123] = "Martin Bell", [124] = "Ian Shaw", [125] = "Jan Svarovsky", [126] = " ", [127] = " ", [128] = " ", [129] = ":Library and Tools", [130] = " ", [131] = "Dos and Win 95 Library", [132] = ",", [133] = "Mark Huntley", [134] = "Alex Peters", [135] = "Rik Heywood", [136] = " ", [137] = " ", [138] = " ", [139] = ":Network Library", [140] = ",", [141] = "Ian Shippen", [142] = "Mark Lamport", [143] = " ", [144] = " ", [145] = " ", [146] = ":Sound Library", [147] = ",", [148] = "Russell Shaw", [149] = "Tony Cox", [150] = " ", [151] = " ", [152] = " ", [153] = ":Installer Programming", [154] = ",", [155] = "Andy Nuttall", [156] = "Tony Cox", [157] = "Andy Cakebread", [158] = " ", [159] = " ", [160] = " ", [161] = ":Moral Support", [162] = ",", [163] = "Peter Molyneux", [164] = " ", [165] = " ", [166] = " ", [167] = ":Testing Manager", [168] = ",", [169] = "Andy Robson", [170] = " ", [171] = " ", [172] = " ", [173] = ":Lead Testers", [174] = ",", [175] = "Wayne Imlach", [176] = "Jon Rennie", [177] = " ", [178] = " ", [179] = " ", [180] = ":Play Testers", [181] = ",", [182] = "Jeff Brutus", [183] = "Wayne Frost", [184] = "Steven Lawrie", [185] = "Tristan Paramor", [186] = "Nathan Smethurst", [187] = " ", [188] = "Ryan Corkery", [189] = "Simon Doherty", [190] = "James Dormer", [191] = "Martin Gregory", [192] = "Ben Lawley", [193] = "Joel Lewis", [194] = "David Lowe", [195] = "Robert Monczak", [196] = "Dominic Mortoza", [197] = "Karl O'Keeffe", [198] = "Michael Singletary", [199] = "Andrew Skipper", [200] = "Stuart Stephen", [201] = "David Wallington", [202] = " ", [203] = "And all our other Work Experience Play Testers", [204] = " ", [205] = " ", [206] = " ", [207] = ":Technical Support", [208] = ",", [209] = "Kevin Donkin", [210] = "Mike Burnham", [211] = "Simon Handby", [212] = " ", [213] = " ", [214] = " ", [215] = ":Marketing", [216] = ",", [217] = "Pete Murphy", [218] = "Sean Ratcliffe", [219] = " ", [220] = " ", [221] = " ", [222] = ":With thanks to:", [223] = ",", [224] = "Tamara Burke", [225] = "Annabel Roose", [226] = "Chris Morgan", [227] = "Pete Larsen", [228] = " ", [229] = " ", [230] = " ", [231] = ":PR", [232] = ",", [233] = "Cathy Campos", [234] = " ", [235] = " ", [236] = " ", [237] = ":Documentation", [238] = ",", [239] = "Mark Casey", [240] = "Richard Johnston", [241] = "James Lenoel", [242] = "Jon Rennie", [243] = " ", [244] = " ", [245] = " ", [246] = ":Documentation & Packaging Design", [247] = ",", [248] = "Caroline Arthur", [249] = "James Nolan", [250] = " ", [251] = " ", [252] = " ", [253] = ":Localisation Project Manager", [254] = ",", [255] = "Carol Aggett", [256] = " ", [257] = " ", [258] = " ", [259] = ":Localisation", [260] = ",", [261] = "Sandra Picaper", [262] = "Sonia 'Sam' Yazmadjian", [263] = " ", [264] = "Bettina Klos", [265] = "Alexa Kortsch", [266] = "Bianca Normann", [267] = " ", [268] = "C.T.O. S.p.A. Zola Predosa (BO)", [269] = "Gian Maria Battistini", [270] = "Maria Ziino", [271] = "Gabriele Vegetti", [272] = " ", [273] = "Elena Ruiz de Velasco", [274] = "Julio Valladares", [275] = "Ricardo Martinez", [276] = " ", [277] = "Kia Collin", [278] = "CBG Consult", [279] = "Ulf Thor", [280] = " ", [281] = " ", [282] = " ", [283] = ":Production", [284] = ",", [285] = "Rachel Holman", [286] = " ", [287] = " ", [288] = " ", [289] = ":Producer", [290] = ",", [291] = "Mark Webley", [292] = " ", [293] = " ", [294] = " ", [295] = ":Associate Producer", [296] = ",", [297] = "Andy Nuttall", [298] = " ", [299] = " ", [300] = " ", [301] = ":Operations", [302] = ",", [303] = "Steve Fitton", [304] = " ", [305] = " ", [306] = " ", [307] = ":Company Administration", [308] = ",", [309] = "Audrey Adams", [310] = "Annette Dabb", [311] = "Emma Gibbs", [312] = "Lucia Gobbo", [313] = "Jo Goodwin", [314] = "Sian Jones", [315] = "Kathy McEntee", [316] = "Louise Ratcliffe", [317] = " ", [318] = " ", [319] = " ", [320] = ":Company Management", [321] = ",", [322] = "Les Edgar", [323] = "Peter Molyneux", [324] = "David Byrne", [325] = " ", [326] = " ", [327] = ":All at Bullfrog Productions", [328] = " ", [329] = " ", [330] = " ", [331] = ":Special Thanks to", [332] = ",", [333] = "Everyone at Frimley Park Hospital", [334] = " ", [335] = ":Especially", [336] = ",", [337] = "Beverley Cannell", [338] = "Doug Carlisle", [339] = " ", [340] = " ", [341] = " ", [342] = ":Keep On Thinking", [343] = " ", [344] = " ", [345] = " ", [346] = " ", [347] = " ", [348] = " ", [349] = " ", [350] = " ", [351] = " ", [352] = " ", [353] = " ", [354] = " ", [355] = " ", [356] = " ", [357] = " ", [358] = " ", [359] = " ", [360] = " ", [361] = ".", } CorsixTH-0.63/CorsixTH/Lua/languages/english.lua000066400000000000000000001160701347163623700215140ustar00rootroot00000000000000--[[ Copyright (c) 2010-2014 Manuel "Roujin" Wolf, Edvin "Lego3" Linge et al 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. --]] Language("English", "en", "eng") Inherit("original_strings", 0) ------------------------------- OVERRIDE ---------------------------------- adviser.warnings.money_low = "Your money is getting low!" -- Funny. Exists in German translation, but not existent in english? -- TODO: tooltip.graphs.reputation -- this tooltip talks about hospital value. Actually it should say reputation. -- TODO: tooltip.status.close -- it's called status window, not overview window. -- tooltip.staff_list.next_person, prev_person is rather next/prev page (also in german, maybe more languages?) tooltip.staff_list.next_person = "Show next page" tooltip.staff_list.prev_person = "Show previous page" tooltip.status.reputation = "Your Reputation should not be less than %d. Currently it's %d" tooltip.status.balance = "Your bank balance should not be less than %d. Currently it's %d" -- The originals of these two contain one space too much fax.emergency.cure_not_possible_build = "You will need to build a %s" fax.emergency.cure_not_possible_build_and_employ = "You will need to build a %s and employ a %s" fax.emergency.num_disease = "There are %d people with %s and they require immediate attention." adviser.goals.lose.kill = "Kill another %d patients to lose the level!" -- Improve tooltips in staff window to mention hidden features tooltip.staff_window.face = "This person's face - click to open management screen" tooltip.staff_window.center_view = "Left click to zoom to staff, right click to cycle through staff members" -- These strings are missing in some versions of TH (unpatched?) confirmation.restart_level = "Are you sure you want to restart the level?" -- TODO adviser.multiplayer.objective_completed -- TODO adviser.multiplayer.objective_failed -- Replace Billy Savile -- this is only relevant to the English game so does not need adding -- in other language files vip_names = { [6] = "Sir Lancelot Spratt", } -- A small error in the introduction text of level 2 introduction_texts.level2 = "There is a greater variety of ailments in this area. Set up your hospital to deal with more patients, " .. "and plan to build a Research Department. Remember to keep your establishment clean, and try to get your " .. "reputation as high as possible - you'll be dealing with diseases like Slack Tongue, so you'll need a Slack " .. "Tongue Clinic. You can also build a Cardiogram to help you diagnose new illnesses. Both these rooms will " .. "need to be researched before you can build them. Now you can also buy extra plots of land to expand your " .. "hospital - use the Town map for this. Aim for a reputation of 300 a bank balance of $10,000 and 40 people cured." -- An override for the squits becoming the the squits see issue 1646 adviser.research.drug_improved_1 = "%s drug has been improved by your Research Department." ------------------------------- NEW STRINGS ------------------------------- date_format = { daymonth = "%1% %2:months%", } object.litter = "Litter" tooltip.objects.litter = "Litter: Left on the floor by a patient because he did not find a bin to throw it in." object.rathole = "Rathole" tooltip.objects.rathole = "Home of a rat family that found your hospital dirty enough to live here." tooltip.fax.close = "Close this window without deleting the message" tooltip.message.button = "Left click to open message" tooltip.message.button_dismiss = "Left click to open message, right click to dismiss it" tooltip.casebook.cure_requirement.hire_staff = "You need to employ staff to handle this treatment" tooltip.casebook.cure_type.unknown = "You do not yet know how to treat this disease" tooltip.research_policy.no_research = "No research is being carried out in this category at the moment" tooltip.research_policy.research_progress = "Progress towards the next discovery in this category: %1%/%2%" menu["player_count"] = "PLAYER COUNT" menu_file = { load = " (%1%) LOAD ", save = " (%1%) SAVE ", restart = " (%1%) RESTART", quit = " (%1%) QUIT " } menu_options = { sound = " (%1%) SOUND ", announcements = " (%1%) ANNOUNCEMENTS ", music = " (%1%) MUSIC ", jukebox = " (%1%) JUKEBOX ", lock_windows = " LOCK WINDOWS ", edge_scrolling = " EDGE SCROLLING ", capture_mouse = " CAPTURE MOUSE ", adviser_disabled = " (%1%) ADVISER ", warmth_colors = " WARMTH COLOURS ", wage_increase = " WAGE REQUESTS ", twentyfour_hour_clock = " 24 HOUR CLOCK " } menu_options_game_speed = { pause = " (%1%) PAUSE ", slowest = " (%1%) SLOWEST ", slower = " (%1%) SLOWER ", normal = " (%1%) NORMAL ", max_speed = " (%1%) MAX SPEED ", and_then_some_more = " (%1%) AND THEN SOME MORE ", } menu_options_warmth_colors = { choice_1 = " RED ", choice_2 = " BLUE GREEN RED ", choice_3 = " YELLOW ORANGE RED ", } menu_options_wage_increase = { grant = " GRANT ", deny = " DENY ", } -- Add F-keys to entries in charts menu (except briefing), also town_map was added. menu_charts = { bank_manager = " (%1%) BANK MANAGER ", statement = " (%1%) STATEMENT ", staff_listing = " (%1%) STAFF LISTING ", town_map = " (%1%) TOWN MAP ", casebook = " (%1%) CASEBOOK ", research = " (%1%) RESEARCH ", status = " (%1%) STATUS ", graphs = " (%1%) GRAPHS ", policy = " (%1%) POLICY ", } menu_debug = { jump_to_level = " JUMP TO LEVEL ", connect_debugger = " (%1%) CONNECT LUA DBGp SERVER ", transparent_walls = " (%1%) TRANSPARENT WALLS ", limit_camera = " LIMIT CAMERA ", disable_salary_raise = " DISABLE SALARY RAISE ", make_debug_fax = " MAKE DEBUG FAX ", make_debug_patient = " MAKE DEBUG PATIENT ", cheats = " (%1%) CHEATS ", lua_console = " (%1%) LUA CONSOLE ", debug_script = " (%1%) RUN DEBUG SCRIPT ", calls_dispatcher = " CALLS DISPATCHER ", dump_strings = " (%1%) DUMP STRINGS ", dump_gamelog = " (%1%) DUMP GAME LOG ", map_overlay = " MAP OVERLAY ", sprite_viewer = " SPRITE VIEWER ", } menu_debug_overlay = { none = " NONE ", flags = " FLAGS ", positions = " POSITIONS ", heat = " TEMPERATURE ", byte_0_1 = " BYTE 0 & 1 ", byte_floor = " BYTE FLOOR ", byte_n_wall = " BYTE N WALL ", byte_w_wall = " BYTE W WALL ", byte_5 = " BYTE 5 ", byte_6 = " BYTE 6 ", byte_7 = " BYTE 7 ", parcel = " PARCEL ", } menu_player_count = { players_1 = " 1 PLAYER ", players_2 = " 2 PLAYERS ", players_3 = " 3 PLAYERS ", players_4 = " 4 PLAYERS ", } adviser = { room_forbidden_non_reachable_parts = "Placing the room in this location would result in parts of the hospital not being reachable.", warnings = { no_desk = "You should build a reception desk and hire a receptionist at some point!", no_desk_1 = "If you want patients to come to your hospital, you will need to hire a receptionist and build her a desk to work at!", no_desk_2 = "Well done, that must be a world record: nearly a year and no patients! If you want to continue as Manager of this hospital, you will need to hire a receptionist and build a reception desk for her to work from!", no_desk_3 = "That's just brilliant, nearly a year and you don't have a staffed reception! How do you expect to get any patients, now get it sorted out and stop messing around!", no_desk_4 = "A Receptionist needs to have her own work station to greet your patients as they arrive", no_desk_5 = "Well it's about time, you should start to see some patients arriving soon!", no_desk_6 = "You have a receptionist, so how about building a reception desk for her to work from?", no_desk_7 = "You've built the reception desk, so how about hiring a receptionist? You won't see any patients until you get this sorted out you know!", cannot_afford = "You don't have enough money in the bank to hire that person!", -- I can't see anything like this in the original strings cannot_afford_2 = "You don't have enough money in the bank to make that purchase!", falling_1 = "Hey! that is not funny, watch where you click that mouse; someone could get hurt!", falling_2 = "Stop messing about, how would you like it?", falling_3 = "Ouch, that had to hurt, someone call a Doctor!", falling_4 = "This is an Hospital, not a Theme Park!", falling_5 = "This is not the place for knocking people over, they're ill you know!", falling_6 = "This is not a bowling alley, sick people should not be treated like that!", research_screen_open_1 = "You have to build a Research Department before you can access the Research screen.", research_screen_open_2 = "Research is disabled for the current level.", researcher_needs_desk_1 = "A Researcher needs to have a desk to work at.", researcher_needs_desk_2 = "Your Researcher is pleased that you have allowed him to have a break. If you were intending to have more staff researching, then you need to provide them each with a desk to work from.", researcher_needs_desk_3 = "Each Researcher needs to have his own desk to work from.", nurse_needs_desk_1 = "Each Nurse needs to have her own desk to work from.", nurse_needs_desk_2 = "Your Nurse is pleased that you have allowed her to have a break. If you were intending to have more than one working in the ward, then you need to provide them each with a desk to work from.", low_prices = "You're charging too little for %s. This will bring people to your hospital, but you won't make a lot of profit from each one.", high_prices = "Your charges for %s are high. This will make big profits in the short-term, but ultimately you'll start to drive people away.", fair_prices = "Your charges for %s seem fair and balanced.", patient_not_paying = "A patient left without paying for %s because it's too expensive!", }, cheats = { th_cheat = "Congratulations, you have unlocked cheats!", roujin_on_cheat = "Roujin's challenge activated! Good luck...", roujin_off_cheat = "Roujin's challenge deactivated.", }, } dynamic_info.patient.actions.no_gp_available = "Waiting for you to build a GP's office" dynamic_info.staff.actions.heading_for = "Heading for %s" dynamic_info.staff.actions.fired = "Fired" dynamic_info.patient.actions.epidemic_vaccinated = "I am no longer contagious" progress_report.free_build = "FREE BUILD" fax = { choices = { return_to_main_menu = "Return to the main menu", accept_new_level = "Move on to the next level", decline_new_level = "Continue playing a while longer", }, emergency = { num_disease_singular = "There is 1 person with %s and they require immediate attention.", free_build = "If you are successful your reputation will increase but if you fail your reputation will be seriously dented.", }, vip_visit_result = { remarks = { free_build = { "It is a very nice hospital you have there! Not very hard to get it working without money limitations though, eh?", "I'm no economist, but I think I could run this hospital too if you know what I mean...", "A very well run hospital. Watch out for the recession though! Right... you don't have to worry about that.", } } } } letter = { dear_player = "Dear %s\n", custom_level_completed = "Well done! You've completed all goals on this custom level!", return_to_main_menu = "Would you like to return to the main menu or continue playing?", campaign_level_completed = "Good job! You beat the level. But it's not over yet!\n Would you like a position at %s Hospital?", campaign_completed = "Incredible! You managed to finish all the levels. You can now relax and enjoy filling forums across the Internet of your achievements. Good luck!", campaign_level_missing = "Sorry, but the next level of this campaign seems to be missing. (Name: %s)", } install = { title = "--------------------------------- CorsixTH Setup ---------------------------------", th_directory = "CorsixTH needs a copy of the data files from the original Theme Hospital game (or demo) in order to run. Please use the below selector to locate the Theme Hospital install directory.", ok = "OK", exit = "Exit", cancel = "Cancel", } misc.not_yet_implemented = "(not yet implemented)" misc.no_heliport = "Either no diseases have been discovered yet, or there is no heliport on this map. It might be that you need to build a reception desk and hire a receptionist" main_menu = { new_game = "Campaign", custom_campaign = "Custom Campaign", custom_level = "Single Scenario", continue = "Continue Game", load_game = "Load Game", options = "Settings", map_edit = "Map Editor", savegame_version = "Savegame version: ", version = "Version: ", exit = "Exit", } tooltip.main_menu = { new_game = "Start the first level on the campaign", custom_campaign = "Play a campaign created by the community", custom_level = "Build your hospital in a single scenario", continue = "Continue your latest saved game", load_game = "Load a saved game", options = "Tweak various settings", map_edit = "Create a custom map", exit = "No, no, please don't leave!", quit = "You are about to quit from CorsixTH. Are you sure this is what you want to do?", } load_game_window = { caption = "Load Game (%1%)", } tooltip.load_game_window = { load_game = "Load game %s", load_game_number = "Load game %d", load_autosave = "Load autosave", } custom_game_window = { caption = "Custom Game", free_build = "Free Build", load_selected_level = "Start", } tooltip.custom_game_window = { choose_game = "Click a level to read more about it", free_build = "Tick this box if you want to play without money or winning and losing conditions", load_selected_level = "Load and play the selected level", } custom_campaign_window = { caption = "Custom Campaign", start_selected_campaign = "Start campaign", } tooltip.custom_campaign_window = { choose_campaign = "Choose a campaign to read more about it", start_selected_campaign = "Load the first level of this campaign", } save_game_window = { caption = "Save Game (%1%)", new_save_game = "New Savegame", } tooltip.save_game_window = { save_game = "Overwrite savegame %s", new_save_game = "Enter name for a new savegame", } save_map_window = { caption = "Save Map (%1%)", new_map = "New Map", } tooltip.save_map_window = { map = "Overwrite map %s", new_map = "Enter name for a map savegame", } menu_list_window = { name = "Name", save_date = "Modified", back = "Back", } tooltip.menu_list_window = { name = "Click here to sort the list by name", save_date = "Click here to sort the list by last modification date", back = "Close this window", } options_window = { caption = "Settings", option_on = "On", option_off = "Off", fullscreen = "Fullscreen", resolution = "Resolution", capture_mouse = "Capture Mouse", custom_resolution = "Custom...", width = "Width", height = "Height", audio = "Global Audio", customise = "Customise", folder = "Folders", language = "Game language", apply = "Apply", cancel = "Cancel", back = "Back", scrollspeed = "Scroll Speed", shift_scrollspeed = "Shift Scroll Speed", zoom_speed = "Zoom Speed", hotkey = "Hotkeys", } tooltip.options_window = { fullscreen = "Whether the game should run in fullscreen or windowed mode", fullscreen_button = "Click to toggle fullscreen mode", resolution = "The resolution the game should run in", select_resolution = "Select a new resolution", capture_mouse = "Click to toggle capturing the cursor in the game window", width = "Enter desired screen width", height = "Enter desired screen height", apply = "Apply the entered resolution", cancel = "Return without changing the resolution", audio_button = "Turn on or off all game audio", audio_toggle = "Toggle on or off", customise_button = "More settings you can change to customise your game play experience", folder_button = "Folder Options", language = "The language texts in the game will appear in", select_language = "Select the game language", language_dropdown_item = "Choose %s as language", back = "Close the Settings window", scrollspeed = "Set the scroll speed between 1 (slowest) to 10 (fastest). The default is 2.", shift_scrollspeed = "Set the speed of scrolling when the shift key is pressed while scrolling. 1 (slowest) to 10 (fastest). Default: 4.", zoom_speed = "Set the camera zoom speed from 10 (slowest) to 1000 (fastest). The default is 80.", apply_scrollspeed = "Apply the entered scroll speed.", cancel_scrollspeed = "Return without changing the scroll speed.", apply_shift_scrollspeed = "Apply the entered shift scroll speed.", cancel_shift_scrollspeed = "Return without changing the shift scroll speed.", apply_zoomspeed = "Apply the entered zoom speed.", cancel_zoomspeed = "Return without changing the zoom speed.", hotkey = "Change keyboard hotkeys.", } customise_window = { caption = "Custom Settings", option_on = "On", option_off = "Off", back = "Back", movies = "Global Movie Control", intro = "Play Intro Movie", paused = "Build on Paused", volume = "Volume down hotkey", aliens = "Alien Patients", fractured_bones = "Fractured Bones", average_contents = "Average contents", } tooltip.customise_window = { movies = "Global movie control, this will allow you to disable all the movies", intro = "Turn off or on the intro movie, global movies will need to be on if you want the intro movie to play each time you load CorsixTH", paused = "In Theme Hospital the player would only be allowed to use the top menu if the game was paused. That is the default setting in CorsixTH too, but by turning this on everything is allowed while the game is paused", volume = "If the volume down button is opening the casebook as well, turn this on to change the hotkey for the casebook to Shift + C", aliens = "Because of the lack of proper animations we have by default made patients with Alien DNA so that they can only come from an emergency. To allow patients with Alien DNA to visit your hospital, other than by an emergency, turn this off", fractured_bones = "Because of a poor animation we have by default made it so there are no patients with Fractured Bones that are female. To allow female patients with Fractured Bones to visit your hospital, turn this off", average_contents = "If you would like the game to remember what extra objects you usually add when you build rooms, then turn this option on", back = "Close this menu and go back to the Settings Menu", } folders_window = { caption = "Folder Locations", data_label = "TH Data", font_label = "Font", music_label = "Music", savegames_label = "Saves", screenshots_label = "Screenshots", -- next four are the captions for the browser window, which are called from the folder setting menu new_th_location = "Here you can specify a new Theme Hospital installation directory. As soon as you choose the new directory the game will be restarted.", savegames_location = "Select the directory you want to use for Saves", music_location = "Select the directory you want to use for your Music", screenshots_location = "Select the directory you want to use for Screenshots", back = "Back", } tooltip.folders_window = { browse = "Browse for folder location", data_location = "The directory of the original Theme Hospital installation, which is required to run CorsixTH", font_location = "Location of a font file that is capable of displaying Unicode characters required by your language. If this is not specified you will not be able to choose languages that need more characters than the original game can supply. Example: Russian and Chinese", savegames_location = "By default, the Saves directory is alongside the config file and will be used for storing saved games in. Should this not be suitable, then you can choose your own, just browse to the directory which you want to use.", screenshots_location = "By default, the Screenshots are stored in a folder alongside the config file. Should this not be suitable, then you can choose your own, just browse to the directory which you want to use.", music_location = "Select a location for your music files. You must have created the directory already, then browse to the directory which you just created.", browse_data = "Browse for another location of a Theme Hospital installation (current location: %1%)", browse_font = "Browse for another font file ( current location: %1% )", browse_saves = "Browse for another location for your Saves directory ( Current location: %1% ) ", browse_screenshots = "Browse for another location for your Screenshots directory ( Current location: %1% ) ", browse_music = "Browse for another location for your music directory ( Current location: %1% ) ", no_font_specified = "No font location specified yet!", not_specified = "No folder location specified yet!", default = "Default location", reset_to_default = "Reset the directory to its default location", -- original_path = "The currently chosen directory of the original Theme Hospital installation", -- where is this used, I have left if for the time being? back = "Close this menu and go back to the Settings Menu", } hotkey_window = { caption_main = "Hotkey Assignment", caption_panels = "Panel Keys", button_accept = "Accept", button_defaults = "Reset to Defaults", button_cancel = "Cancel", button_back = "Back", button_toggleKeys = "Toggle Keys", button_recallPosKeys = "Recall Position Keys", panel_globalKeys = "Global Keys", panel_generalInGameKeys = "General In-Game Keys", panel_scrollKeys = "Scroll Keys", panel_zoomKeys = "Zoom Keys", panel_gameSpeedKeys = "Game Speed Keys", panel_miscInGameKeys = "Misc. In-Game Keys", panel_toggleKeys = "Toggle Keys", panel_debugKeys = "Debug Keys", panel_storePosKey = "Store Position Keys", panel_recallPosKeys = "Recall Position Keys", panel_altPanelKeys = "Alternate Panel Keys", global_confirm = "Confirm", global_confirm_alt = "Confirm Alt", global_cancel = "Cancel", global_cancel_alt = "Cancel Alt", global_fullscreen_toggle = "Fullscreen", global_exitApp = "Exit App", global_resetApp = "Reset App", global_releaseMouse = "Release Mouse", global_connectDebugger = "Debugger", global_showLuaConsole = "Lua Console", global_runDebugScript = "Debug Script", global_screenshot = "Screenshot", global_stop_movie_alt = "Stop Movie", global_window_close_alt = "Close Window", ingame_scroll_up = "Scroll Up", ingame_scroll_down = "Scroll Down", ingame_scroll_left = "Scroll Left", ingame_scroll_right = "Scroll Right", ingame_scroll_shift = "Speed Shift", ingame_zoom_in = "Zoom In", ingame_zoom_in_more = "Zoom In More", ingame_zoom_out = "Zoom Out", ingame_zoom_out_more = "Zoom Out More", ingame_showmenubar = "Show Menu Bar", ingame_showCheatWindow = "Cheat Menu", ingame_loadMenu = "Load Game", ingame_saveMenu = "Save Game", ingame_jukebox = "Jukebox", ingame_openFirstMessage = "Level Message", ingame_pause = "Pause", ingame_gamespeed_slowest = "Slowest", ingame_gamespeed_slower = "Slower", ingame_gamespeed_normal = "Normal", ingame_gamespeed_max = "Max", ingame_gamespeed_thensome = "Then Some", ingame_gamespeed_speedup = "Speed Up", ingame_panel_bankManager = "Bank Manager", ingame_panel_bankStats = "Bank Status", ingame_panel_staffManage = "Manage Staff", ingame_panel_townMap = "Town Map", ingame_panel_casebook = "Casebook", ingame_panel_research = "Research", ingame_panel_status = "Status", ingame_panel_charts = "Charts", ingame_panel_policy = "Policy", ingame_panel_map_alt = "Town Map 2", ingame_panel_research_alt = "Research 2", ingame_panel_casebook_alt = "Casebook 2", ingame_panel_casebook_alt02 = "Casebook 3", ingame_panel_buildRoom = "Build Room", ingame_panel_furnishCorridor = "Furnish Corridor", ingame_panel_editRoom = "Edit Room", ingame_panel_hireStaff = "Hire Staff", ingame_rotateobject = "Rotate Object", ingame_quickSave = "Quick Save", ingame_quickLoad = "Quick Load", ingame_restartLevel = "Restart Level", ingame_quitLevel = "Quit Level", ingame_setTransparent = "Transparent", ingame_toggleAnnouncements = "Announcements", ingame_toggleSounds = "Sounds", ingame_toggleMusic = "Music", ingame_toggleAdvisor = "Advisor", ingame_toggleInfo = "Info", ingame_poopLog = "Dump Log", ingame_poopStrings = "Dump Strings", ingame_patient_gohome = "Send Home", ingame_storePosition_1 = "1", ingame_storePosition_2 = "2", ingame_storePosition_3 = "3", ingame_storePosition_4 = "4", ingame_storePosition_5 = "5", ingame_storePosition_6 = "6", ingame_storePosition_7 = "7", ingame_storePosition_8 = "8", ingame_storePosition_9 = "9", ingame_storePosition_0 = "10", ingame_recallPosition_1 = "1", ingame_recallPosition_2 = "2", ingame_recallPosition_3 = "3", ingame_recallPosition_4 = "4", ingame_recallPosition_5 = "5", ingame_recallPosition_6 = "6", ingame_recallPosition_7 = "7", ingame_recallPosition_8 = "8", ingame_recallPosition_9 = "9", ingame_recallPosition_0 = "10", } tooltip.hotkey_window = { button_accept = "Accept hotkey assignment above and save them to the disk", button_defaults = "Reset all hotkeys to the program's defaults", button_cancel = "Cancel the assignment and go back to the options menu", caption_panels = "Open window to assign panel keys", button_recallPosKeys = "Open window to set keys to store and recall camera positions", button_back_02 = "Go back to the main hotkey window. Hotkeys changed in this window can be accepted there", } font_location_window = { caption = "Choose font (%1%)", } handyman_window = { all_parcels = "All plots", parcel = "Plot" } tooltip.handyman_window = { parcel_select = "The plot where the handyman accepts tasks, click to change setting" } new_game_window = { caption = "Campaign", player_name = "Player name", option_on = "On", option_off = "Off", difficulty = "Difficulty", easy = "Junior (Easy)", medium = "Doctor (Medium)", hard = "Consultant (Hard)", tutorial = "Tutorial", start = "Start", cancel = "Cancel", } tooltip.new_game_window = { player_name = "Enter the name you wish to be referred to as in the game", difficulty = "Select the difficulty level you want to play the game in", easy = "If you are new to simulation games this is the option for you", medium = "This is the middle way to go if you are unsure what to choose", hard = "If you are used to this kind of game and want more of a challenge, pick this option", tutorial = "Click here to turn on some help to get you started once in the game", start = "Start the game with the chosen settings", cancel = "Oh, I didn't really mean to start a new game!", } lua_console = { execute_code = "Execute", close = "Close", } tooltip.lua_console = { textbox = "Enter Lua code to run here", execute_code = "Run the code you have entered", close = "Close the console", } errors = { dialog_missing_graphics = "Sorry, the demo data files don't contain this dialog.", save_prefix = "Error while saving game: ", load_prefix = "Error while loading game: ", no_games_to_contine = "There are no saved games.", load_quick_save = "Error, cannot load the quicksave as it does not exist, not to worry as we have now created one for you!", map_file_missing = "Could not find the map file %s for this level!", minimum_screen_size = "Please enter a screen size of at least 640x480.", unavailable_screen_size = "The screen size you requested is not available in fullscreen mode.", alien_dna = "NOTE: There are no animations for Alien patients for sitting down, opening or knocking on doors etc. So, like with Theme Hospital to do these things they will appear to change to normal looking and then change back. Patients with Alien DNA will only appear if they are set to in the level file", fractured_bones = "NOTE: The animation for female patients with Fractured Bones is not perfect", could_not_load_campaign = "Failed to load the campaign: %s", could_not_find_first_campaign_level = "Could not find the first level of this campaign: %s", } warnings = { levelfile_variable_is_deprecated = "Notice: The level '%s' contains a deprecated variable definition in the level file." .. "'%LevelFile' has been renamed to '%MapFile'. Please advise the map creator to update the level.", } confirmation = { needs_restart = "Changing this setting requires CorsixTH to restart. Any unsaved progress will be lost. Are you sure you want to do this?", abort_edit_room = "You are currently building or editing a room. If all required objects are placed it will be finished, but otherwise it will be deleted. Continue?", maximum_screen_size = "The screen size you have entered is greater than 3000 x 2000. Larger resolutions are possible, but will require better hardware in order to maintain a playable frame rate. Are you sure you want to continue?", } information = { custom_game = "Welcome to CorsixTH. Have fun with this custom map!", no_custom_game_in_demo = "Sorry, but in the demo version you can't play any custom maps.", cannot_restart = "Unfortunately this custom game was saved before the restart feature was implemented.", very_old_save = "There have been a lot of updates to the game since you started this level. To be sure that all features work as intended please consider restarting it.", level_lost = { "Bummer! You failed the level. Better luck next time!", "The reason you lost:", reputation = "Your reputation fell below %d.", balance = "Your bank balance fell below %d.", percentage_killed = "You killed more than %d percent of the patients.", cheat = "This was your choice or did you select the wrong button? So you can't even cheat correctly, not that funny huh?", }, cheat_not_possible = "Cannot use that cheat on this level. You even fail to cheat, not that funny huh?", } tooltip.information = { close = "Close the information dialog", } totd_window = { tips = { "Every hospital needs a reception desk and a GP's office to get going. After that, it depends on what kind of patients are visiting your hospital. A pharmacy is always a good choice, though.", "Machines such as the Inflator need maintenance. Employ a handyman or two to repair your machines, or you'll risk your staff and patients getting hurt.", "After a while, your staff will get tired. Be sure to build a staff room, so they can relax.", "Place enough radiators to keep your staff and patients warm, or they will become unhappy. Use the town map to locate any spots in your hospital that need more heating.", "A doctor's skill level greatly influences the quality and speed of his diagnoses. Place a skilled doctor in your GP's office, and you won't need as many additional diagnosis rooms.", "Juniors and doctors can improve their skills by learning from a consultant in the training room. If the consultant has a special qualification (surgeon, psychiatrist or researcher), he will also pass on this knowledge to his pupil(s).", "Did you try to enter the European emergency number (112) into the fax machine? Make sure your sound is on!", "You can adjust some settings such as the resolution and language in the options window found both in the main menu and ingame.", "You selected a language other than English, but there's English text all over the place? Help us by translating missing texts into your language!", "The CorsixTH team is looking for reinforcements! Are you interested in coding, translating or creating graphics for CorsixTH? Contact us at our Forum, Mailing List or IRC Channel (corsix-th at freenode).", "If you find a bug, please report it at our bugtracker: th-issues.corsix.org", "Each level has certain requirements to fulfill before you can move on to the next one. Check the status window to see your progression towards the level goals.", "If you want to edit or remove an existing room, you can do so with the edit room button found in the bottom toolbar.", "In a horde of waiting patients, you can quickly find out which ones are waiting for a particular room by hovering over that room with your mouse cursor.", "Click on the door of a room to see its queue. You can do useful fine tuning here, such as reordering the queue or sending a patient to another room.", "Unhappy staff will ask for salary rises frequently. Make sure your staff is working in a comfortable environment to keep that from happening.", "Patients will get thirsty while waiting in your hospital, even more so if you turn up the heating! Place vending machines in strategic positions for some extra income.", "You can abort the diagnosis progress for a patient prematurely and guess the cure, if you already encountered the disease. Beware that this may increase the risk of a wrong cure, resulting in death for the patient.", "Emergencies can be a good source for some extra cash, provided that you have enough capacities to handle the emergency patients in time.", }, previous = "Previous Tip", next = "Next Tip", } tooltip.totd_window = { previous = "Display the previous tip", next = "Display the next tip", } debug_patient_window = { caption = "Debug Patient", } cheats_window = { caption = "Cheats", warning = "Warning: You will not get any bonus points at the end of the level if you cheat!", cheated = { no = "Cheats used: No", yes = "Cheats used: Yes", }, cheats = { money = "Money Cheat", all_research = "All Research Cheat", emergency = "Create Emergency", vip = "Create VIP", earthquake = "Create Earthquake", epidemic = "Spawn contagious patient", toggle_infected = "Toggle infected icons", create_patient = "Create Patient", end_month = "End of Month", end_year = "End of Year", lose_level = "Lose Level", win_level = "Win Level", increase_prices = "Increase prices", decrease_prices = "Decrease prices", }, close = "Close", } tooltip.cheats_window = { close = "Close the cheats dialog", cheats = { money = "Adds 10.000 to your bank balance.", all_research = "Completes all research.", emergency = "Creates an emergency.", vip = "Creates a VIP.", earthquake = "Creates an earthquake.", epidemic = "Creates an contagious patient who may cause an epidemic to happen", toggle_infected = "Toggle the infected icons for the active, discovered epidemic", create_patient = "Creates a Patient at the map border.", end_month = "Jumps to the end of the month.", end_year = "Jumps to the end of the year.", lose_level = "Lose the current level.", win_level = "Win the current level.", increase_prices = "Increase all prices by 50% (max. 200%)", decrease_prices = "Decrease all prices by 50% (min. 50%)", } } introduction_texts = { demo = "Welcome to the demo hospital!//" .. "Unfortunately the demo version only contains this level. However, there is more than enough to do here to keep you busy for a while! " .. "You will encounter various diseases that require different rooms to cure. From time to time, emergencies may occur. And you will need to research additional rooms using a research room. " .. "Your goal is to earn $100,000, have a hospital value of $70,000 and a reputation of 700, while having cured at least 75% of your patients. " .. "Make sure your reputation does not fall below 300 and that you don't kill off more than 40% of your patients, or you will lose.//" .. "Good luck!", } calls_dispatcher = { -- Dispatcher description message. Visible in Calls Dispatcher dialog summary = "%d calls; %d assigned", staff = "%s - %s", watering = "Watering @ %d,%d", repair = "Repair %s", close = "Close", } tooltip.calls_dispatcher = { task = "List of tasks - click task to open assigned staff's window and scroll to location of task", assigned = "This box is marked if someone is assigned to the corresponding task.", close = "Close the calls dispatcher dialog", } update_window = { caption = "Update Available!", new_version = "New Version:", current_version = "Current Version:", download = "Go to download page", ignore = "Skip and go to main menu", } tooltip.update_window = { download = "Go to the download page for the very latest version of CorsixTH", ignore = "Ignore this update for now. You will be notified again when you next open CorsixTH", } map_editor_window = { pages = { inside = "Inside", outside = "Outside", foliage = "Foliage", hedgerow = "Hedgerow", pond = "Pond", road = "Road", north_wall = "North wall", west_wall = "West wall", helipad = "Helipad", delete_wall = "Delete walls", parcel_0 = "Parcel 0", parcel_1 = "Parcel 1", parcel_2 = "Parcel 2", parcel_3 = "Parcel 3", parcel_4 = "Parcel 4", parcel_5 = "Parcel 5", parcel_6 = "Parcel 6", parcel_7 = "Parcel 7", parcel_8 = "Parcel 8", parcel_9 = "Parcel 9", camera_1 = "Camera 1", camera_2 = "Camera 2", camera_3 = "Camera 3", camera_4 = "Camera 4", heliport_1 = "Heliport 1", heliport_2 = "Heliport 2", heliport_3 = "Heliport 3", heliport_4 = "Heliport 4", paste = "Paste area", } } hotkeys_file_err = { file_err_01 = "Unable to load hotkeys.txt file. Please ensure that CorsixTH " .. "has permission to read/write ", file_err_02 = ", or use the --hotkeys-file=filename command line option to specify a writable file. " .. "For reference, the error loading the hotkeys file was: ", } -------------------------------- UNUSED ----------------------------------- ------------------- (kept for backwards compatibility) ---------------------- options_window.change_resolution = "Change resolution" tooltip.options_window.change_resolution = "Change the window resolution to the dimensions entered on the left" CorsixTH-0.63/CorsixTH/Lua/languages/finnish.lua000066400000000000000000004521111347163623700215200ustar00rootroot00000000000000--[[ Copyright (c) 2010 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. ------------------------------------------------------------------------------- READ BEFORE DOING ANY CHANGES ------------------------------------------------------------------------------- Since the Finnish language isn't in the original Theme Hospital game, this file is split in two sections (A and B). The first section contains all the new language strings, made by the Corsix-TH team, and the second section contains the override translation of all the original english strings. FORMATING AND FINNISH LETTERS This file contains UTF-8 text. Make sure your editor is set to UTF-8. ------------------------------------------------------------------------------- Table of Contents ------------------------------------------------------------------------------- -- SECTION A - NEW STRINGS 1. Global settings 2. Faxes 3. Menu 4. Adviser 5. Main menu 6. Tooltip 7. Letter 8. Installation 9. Level introduction 10. Tips 11. Room descriptions 12. Lua console 13. Information 14. Handyman window 15. Misc -- SECTION B - OLD STRINGS (OVERRIDE) Huge section with all original strings, translated from english. New strings to existing string sets have been placed here instead of section A to keep similar strings close to each other. -----------------------------------------------------------------------------]] ------------------------------------------------------------------------------- -- SECTION A - NEW STRINGS ------------------------------------------------------------------------------- -- 1. Global setings (do not edit!) Language("Suomi", "Finnish", "fi", "fin") Inherit("english") -- 2. Faxes fax = { choices = { return_to_main_menu = "Palaa päävalikkoon", accept_new_level = "Siirry seuraavalle tasolle", decline_new_level = "Jatka pelaamista vielä jonkin aikaa", }, } -- 3. Menu menu_debug = { jump_to_level = " SIIRRY TASOLLE ", transparent_walls = " (%1%) LÄPINÄKYVÄT SEINÄT ", limit_camera = " RAJOITETTU KAMERA ", disable_salary_raise = " ESTÄ PALKAN KOROTTAMINEN ", make_debug_fax = " LUO DEBUG-FAKSI ", make_debug_patient = " LISÄÄ DEBUG-POTILAS ", cheats = " (%1%) HUIJAUKSET ", lua_console = " (%1%) LUA-KOMENTORIVI ", calls_dispatcher = " TEHTÄVIEN VÄLITYS ", dump_strings = " (%1%) DUMPPAA TEKSTIT ", dump_gamelog = " (%1%) DUMPPAA PELILOGI ", map_overlay = " KARTTAKERROKSET ", sprite_viewer = " SPRITE-KATSELIN ", } menu_debug_overlay = { none = " TYHJÄ ", flags = " LIPUT ", positions = " SIJAINNIT ", heat = " LÄMPÖTILA ", byte_0_1 = " TAVU 0 & 1 ", byte_floor = " TAVU LATTIA ", byte_n_wall = " TAVU N SEINÄ ", byte_w_wall = " TAVU W SEINÄ ", byte_5 = " TAVU 5 ", byte_6 = " TAVU 6 ", byte_7 = " TAVU 7 ", parcel = " ALUE ", } menu_options_game_speed = { slowest = " (%1%) HITAIN ", slower = " (%1%) HITAAMPI ", normal = " (%1%) NORMAALI ", max_speed = " (%1%) MAKSIMINOPEUS ", and_then_some_more = " (%1%) JA VÄHÄN PÄÄLLE ", pause = " (%1%) PYSÄYTÄ " } menu_options_volume = { [10] = " 10% ", [20] = " 20% ", [30] = " 30% ", [40] = " 40% ", [50] = " 50% ", [60] = " 60% ", [70] = " 70% ", [80] = " 80% ", [90] = " 90% ", [100] = " 100% ", } menu_file_save = { [1] = " PELI 1 ", [2] = " PELI 2 ", [3] = " PELI 3 ", [4] = " PELI 4 ", [5] = " PELI 5 ", [6] = " PELI 6 ", [7] = " PELI 7 ", [8] = " PELI 8 ", } cheats_window = { caption = "Huijaukset", warning = "Varoitus: Et saa yhtään bonuspisteitä tason jälkeen, jos käytät huijauksia!", close = "Sulje", cheated = { no = "Huijauksia käytetty: Ei", yes = "Huijauksia käytetty: Kyllä", }, cheats = { money = "Rahahuijaus", all_research = "Kaikki tutkimus -huijaus", emergency = "Luo hätätilanne", create_patient = "Luo potilas", end_month = "Siirry kuukauden loppuun", end_year = "Siirry vuoden loppuun", lose_level = "Häviä", win_level = "Voita", vip = "Luo VIP", earthquake = "Maanjäristys", }, } debug_patient_window = { caption = "Debug-potilas", } calls_dispatcher = { -- Dispatcher description message. Visible in Calls Dispatcher dialog summary = "%d tehtävää; %d välitetty", staff = "%s - %s", watering = "Kastellaan @ %d,%d", repair = "Korjaa %s", close = "Sulje", } -- 4. Adviser adviser = { room_forbidden_non_reachable_parts = "Huoneen sijoittaminen tähän estäisi pääsyn joihinkin sairaalan osiin.", cheats = { th_cheat = "Onnittelut, olet saanut huijaukset käyttöösi! Tai olisit saanut, jos tämä olisi alkuperäinen peli. Kokeile jotain muuta.", crazy_on_cheat = "Voi ei! Kaikki lääkärit ovat tulleet hulluiksi!", crazy_off_cheat = "Huh... lääkärit ovat jälleen tulleet järkiinsä.", roujin_on_cheat = "Roujinin haaste otettu käyttöön! Onnea...", roujin_off_cheat = "Roujinin haaste poistettu käytöstä.", hairyitis_cheat = "Turkinkasvu-huijaus otettu käyttöön!", hairyitis_off_cheat = "Turkinkasvu-huijaus poistettu käytöstä.", bloaty_cheat = "Pallopäisyys-huijaus otettu käyttöön!", bloaty_off_cheat = "Pallopäisyys-huijaus poistettu käytöstä.", }, } -- 5. Main menu main_menu = { custom_level = "Luo oma sairaala", exit = "Lopeta", load_game = "Lataa peli", new_game = "Uusi peli", options = "Asetukset", savegame_version = "Tallennetun pelin versio: ", version = "Versio: ", } load_game_window = { caption = "Lataa peli", } custom_game_window = { caption = "Luo oma sairaala", free_build = "Rakenna vapaasti", } save_game_window = { caption = "Talenna peli", new_save_game = "Uusi tallennus", } menu_list_window = { back = "Takaisin", name = "Nimi", save_date = "Muokattu", } options_window = { fullscreen = "Koko ruutu", width = "Leveys", height = "Korkeus", change_resolution = "Vaihda resoluutio", browse = "Selaa...", new_th_directory = "Tässä voit määrittää uuden Theme Hospital -pelin asennushakemiston. Kun olet valinnut uuden hakemiston, peli käynnistyy uudestaan.", cancel = "Peruuta", back = "Takaisin", } errors = { dialog_missing_graphics = "Pahoittelut, demon pelitiedostot eivät sisällä tämän ikkunan grafiikkaa.", save_prefix = "Virhe tallennettaessa peliä: ", load_prefix = "Virhe ladattaessa peliä: ", map_file_missing = "Tasolle %s ei löydetty karttatiedostoa!", minimum_screen_size = "Ole hyvä ja syötä resoluutio, joka on vähintään 640x480.", maximum_screen_size = "Ole hyvä ja syötä resoluutio, joka on enintään 3000x2000.", unavailable_screen_size = "Syöttämäsi resoluutio ei ole käytettävissä koko ruutu -tilassa.", } new_game_window = { hard = "Konsultti (Vaikea)", cancel = "Peruuta", tutorial = "Esittely", easy = "Harjoittelija (Helppo)", medium = "Tohtori (Keskitaso)", } -- 6. Tooltip tooltip = { objects = { litter = "Roska: Potilas on jättänyt sen lattialle, koska ei löytänyt roskakoria, johon sen olisi voinut heittää", }, totd_window = { previous = "Näytä edellinen vihje", next = "Näytä seuraava vihje", }, main_menu = { new_game = "Aloita uusi peli aivan alusta", custom_level = "Rakenna oma sairaala itse suunnittelemaasi rakennukseen", load_game = "Lataa aiemmin tallennettu peli", options = "Muuta pelin asetuksia", exit = "Ei, ei, ole kiltti äläkä lähde!", }, load_game_window = { load_game = "Lataa peli %s", load_game_number = "Lataa peli numero %d", load_autosave = "Lataa viimeisin automaattitallennus", }, custom_game_window = { free_build = "Valitse tämä, jos haluat pelata ilman rahaa ja mahdollisuutta voittaa tai hävitä", start_game_with_name = "Lataa taso %s", }, save_game_window = { save_game = "Tallenna tallennuksen %s tilalle", new_save_game = "Anna nimi uudelle tallennukselle", }, menu_list_window = { back = "Sulje tämä ikkuna", name = "Järjestä lista nimen mukaan", save_date = "Järjestä lista viimeisimmän muutoshetken mukaan", }, options_window = { fullscreen_button = "Klikkaa kytkeäksesi koko ruudun -tilan päälle tai pois", width = "Syötä peli-ikkunan haluttu leveys", height = "Syötä peli-ikkunan haluttu korkeus", change_resolution = "Muuta ikkunan resoluutio vasemmalla annettujen arvojen mukaiseksi", language = "Valitse kieleksi %s", original_path = "Käytössä oleva Theme Hospital -pelin asennushakemisto", browse = "Selaa hakemistoja valitaksesi uuden Theme Hospital -pelin asennushakemiston", back = "Sulje tämä ikkuna", }, new_game_window = { hard = "Jos olet pelannut tällaista peliä aiemminkin ja kaipaat haastetta, valitse tämä", cancel = "Hups, ei minun oikeasti pitänyt aloittaa uutta peliä!", tutorial = "Jos haluat vähän apua alkuun pääsemisessä, valitse tämä", easy = "Jos tämä on ensimmäinen kertasi tämän tyyppisen pelin parissa, tämä vaikeustaso on sinua varten", medium = "Tämä on kultainen keskitie, jos et ole varma, mitä valitsisit", }, lua_console = { textbox = "Syötä suoritettava Lua-koodi tähän", execute_code = "Suorita syöttämäsi koodi", close = "Sulje komentorivi", }, fax = { close = "Sulje ikkuna poistamatta viestiä", }, message = { button = "Avaa viesti klikkaamalla", button_dismiss = "Klikkaa vasemalla avataksesi viestin, klikkaa oikealla poistaaksesi sen", }, cheats_window = { close = "Sulje huijaukset-ikkuna", cheats = { money = "Lisää 10 000$ pankkitilillesi", all_research = "Saat kaiken tutkimuksen valmiiksi", emergency = "Luo hätätilanteen", create_patient = "Luo potilaan kartan reunalle", end_month = "Siirtää aikaa eteenpäin kuukauden loppuun", end_year = "Siirtää aikaa eteenpäin vuoden loppuun", lose_level = "Häviät tämän tason", win_level = "Voitat tämän tason", vip = "Luo VIP-potilaan", earthquake = "Aiheuttaa maanjäristyksen" }, }, calls_dispatcher = { task = "Tehtävälista - klikkaa tehtävää avataksesi sitä suorittavan henkilökunnan jäsenen ikkunan ja keskittääksesi näkymän tehtävän kohteeseen", assigned = "Tässä on merkki, kun vastaava tehtävä on välitetty jonkun tehtäväksi", close = "Sulje tehtävien välitys -ikkuna", }, casebook = { cure_requirement = { hire_staff = "Sinun täytyy palkata lisää henkilökuntaa tämän taudin hoitamiseksi", }, cure_type = { unknown = "Et vielä tiedä, miten tätä tautia pitää hoitaa", }, }, research_policy = { no_research = "Tämän aiheen parissa ei tehdä tutkimusta tällä hetkellä", research_progress = "Edistyminen kohti seuraavaa löytöä tällä aihealueella: %1%/%2%", }, } -- 7. Letter letter = { dear_player = "Hyvä %s", --%s (player's name) custom_level_completed = "Hienosti tehty! Olet suorittanut kaikki tämän itse laaditun tason tavoitteet!", return_to_main_menu = "Haluatko palata takaisin päävalikkoon vai jatkaa pelaamista?", } -- 8. Installation install = { title = "-------------------------------- CorsixTH asennus --------------------------------", th_directory = "CorsixTH tarvitsee kopion alkuperäisen Theme Hospital -pelin (tai demon) tiedostoista toimiakseen. Ole hyvä ja käytä alla olevaa valitsinta Theme Hospital-pelin asennushakemiston etsimiseen.", exit = "Sulje", } -- 9. Level introductions introduction_texts = { demo = "Tervetuloa demosairaalaan!//" .. "Valitettavasti demoversio sisältää ainoastaan tämän tason. Täällä on kuitenkin enemmän kuin tarpeeksi tekemistä! " .. "Kohtaat erilaisia sairauksia, joiden hoitaminen vaatii erilaisia huoneita. Hätätilanteita saattaa tapahtua ajoittain. Lisäksi sinun pitää kehittää lisää huoneita tutkimusosaston avulla. " .. "Tavoitteesi on ansaita 100 000$, nostaa sairaalan arvo yli 70 000$:n ja maineesi yli 700:n parantaen samalla vähintään 75% potilaistasi. " .. "Pidä huoli, ettei maineesi putoa alle 300:n ja ettei yli 40 prosenttia potilaistasi pääse kuolemaan, tai häviät tason.//" .. "Onnea!", level1 = "Tervetuloa ensimmäiseen sairaalaasi!//" .. "Pääset alkuun rakentamalla vastaanottopöydän ja yleislääkärin toimiston sekä palkkaamalla vastaanottoapulaisen ja lääkärin. " .. "Sitten vain odotat asiakkaiden saapumista." .. "Olisi hyvä ajatus rakentaa psykiatrin vastaanotto ja palkata lääkäri, joka on erikoistunut psykiatriaan. " .. "Apteekki ja sairaanhoitaja ovat myös tärkeä yhdistelmä potilaidesi parantamiseksi. " .. "Tarkkaile pallopäisyydestä kärsiviä potilaitasi - pumppaushuone hoitaa heidät alta aikayksikön. " .. "Tavoitteenasi on parantaa kaikkiaan 10 potilasta ja varmistaa, ettei maineesi putoa alle 200:n.", level2 = "Tällä alueella on enemmän erilaisia sairauksia kuin edellisellä. " .. "Sairaalasi pitää selvitä suuremmasta potilasmäärästä, ja sinun kannattaa varautua tutkimusosaston rakentamiseen. " .. "Muista pitää laitoksesi puhtaana, ja yritä nostaa maineesi niin korkeaksi kuin mahdollista - alueella on liikkeellä velttokielisyyttä, joten tarvitset kieliklinikan. " .. "Voit myös rakentaa kardiogrammihuoneen auttamaan uusien sairauksien diagnosoinnissa. " .. "Molemmat näistä huoneista täytyy kehittää ennen kuin voit rakentaa niitä. Nyt voit myös ostaa lisää maata sairaalasi laajentamiseksi - Tämä tapahtuu kartta-ikkunassa. " .. "Tavoitteesi ovat 300:n maine, 10 000$ pankissa and 40 parannettua potilasta.", level3 = "Tällä kertaa sairaalasi sijaitsee varakkaalla alueella. " .. "Terveysministeriö odottaa sinun saavan täältä muhkeat voitot. " .. "Alussa sinun täytyy hankkia sairaalallesi hyvä maine. Kun saat sairaalan pyörimään kunnolla, keskity ansaitsemaan niin paljon rahaa kuin pystyt. " .. "Alueella saattaa myös sattua hätätapauksia. " .. "Näissä tilanteissa suuri joukko samalla tavoin loukkaantuneita potilaita saapuu sairaalaasi yhtä aikaa. " .. "Jos onnistut parantamaan heidät annetun aikarajan puitteissa saat lisää mainetta ja ison bonuksen. " .. "Kuningas-kompleksin kaltaisia sairauksia saattaa esiintyä, joten kannattaa budjetoida rahaa leikkaussalin ja vuodeosaston rakentamiseen lähelle toisiaan. " .. "Ansaitse 20 000$ päästäksesi seuraavalle tasolle.", level4 = "Pidä kaikki potilaasi tyytyväisinä, hoida heitä niin tehokkaasti kuin pystyt ja pidä kuolemantapaukset minimissään. " .. "Maineesi on kyseessä, joten pidä huolta, että se pysyy niin korkealla kuin mahdollista. " .. "Älä huolehdi rahasta liikaa - sitä alkaa kyllä tulla lisää maineesi kasvaessa. " .. "Voit myös kouluttaa lääkäreitäsi parantaaksesi heidän osaamistaan. " .. "He saattavat hyvinkin joutua hoitamaan tavallista läpinäkyvämpiä potilaita. " .. "Nosta maineesi yli 500:n.", level5 = "Tästä tulee kiireinen sairaala, joka joutuu hoitamaan laajaa kirjoa sairauksia. " .. "Kaikki lääkärisi ovat vastavalmistuneita, joten on ensiarvoisen tärkeää, että rakennat koulutushuoneen ja nostat lääkäreidesi osaamisen hyväksyttävälle tasolle. " .. "Sinulla on vain kolme konsulttia opettamassa kokematonta henkilökuntaasi, joten pidä heidät tyytyväisinä. " .. "Huomaa myös, että sairaalasi on rakennettu geologisen siirroksen läheisyyteen. " .. "Maanjäristysten riski on siis koko ajan olemassa. " .. "Ne aiheuttavat sattuessaan mittavia vahinkoja laitteillesi ja häiritsevät sairaalasi sujuvaa toimintaa. " .. "Hanki sairaalallesi 400 mainetta ja kasvata 50 000$:n pankkitili onnistuaksesi. Paranna samalla 200 potilasta.", level6 = "Käytä kaikkea oppimaasi ja rakenna sujuvasti toimiva sairaala, joka on taloudellisesti terveellä pohjalla ja pystyy selviytymään kaikista eteen tulevista tilanteista. " .. "Sinun on hyvä tietää, että ilmasto täällä levittää erityisen tehokkaasti bakteereja ja viruksia. " .. "Ellet onnistu pitämään sairaalaasi putipuhtaana, potilaasi voivat joutua epidemioiden kierteeseen. " .. "Pidä huolta, että ansaitset 150 000$ ja sairaalasi arvo ylittää 140 000$.", level7 = "Täällä joudut terveysministeriön tiukan valvonnan kohteeksi, joten pidä huolta, että tilikirjoissasi näkyy suuria voittoja ja maineesi pysyy korkealla. " .. "Meillä ei ole varaa ylimääräisiin kuolemantapauksiin - ne ovat huonoja liiketoiminnan kannalta. " .. "Varmista, että henkilökuntasi on parasta mahdollista ja heillä on kaikki tarvittavat toimitilat ja tarvikkeet. " .. "Tavoitteesi ovat 600 mainetta ja 200 000$ pankkitilillä.", level8 = "Sinun tehtäväsi on rakentaa tehokkain ja tuottavin mahdollinen sairaala. " .. "Ihmiset täällä ovat melko varakkaita, joten heiltä kannattaa kerätä niin paljon rahaa kuin mahdollista. " .. "Muista, että niin kivaa kuin ihmisten parantaminen onkin, tarvitset kipeästi rahaa, jota se tuottaa. " .. "Putsaa näiltä ihmisiltä tuhkatkin pesästä. " .. "Sinun tulee kerätä vaikuttavat 300 000$ läpäistäksesi tason.", level9 = "Täytettyäsi ministeriön pankkitilin ja kustannettuasi uuden limusiinin ministerille itselleen pääset taas luomaan huolehtivan ja hyvin hoidetun sairaalan sairaiden avuksi. " .. "Voit odottaa monia erilaisia ongelmia tällä alueella." .. "Jos sinulla on riittävästi hyvin koulutettua henkilökuntaa ja huoneita, sinulla pitäisi olla kaikki hallinnassa. " .. "Sairaalasi arvon tulee olla 200 000$ ja sinulla pitää olla 400 000$ pankissa. " .. "Pienemmillä summilla et pääse tätä tasoa läpi.", level10 = "Sen lisäksi, että huolehdit kaikista sairauksista, joita täällä päin ilmenee, ministeriö pyytää, että käytät aikaa lääkkeidesi tehon parantamiseen. " .. "Terveysjärjestöt ovat esittäneet joitakin valituksia, joten näyttääkseen hyvältä sairaalasi täytyy varmistaa, että kaikki käyttettävät lääkkeet ovat erittäin tehokkaita. " .. "Varmista myös, että sairaalasi on arvostelun yläpuolella. Pidä kuolemantapausten määrä kurissa. " .. "Ihan vihjeenä: saattaa olla hyvä idea säästää tilaa hyytelömuovainhuoneelle. " .. "Kehitä kaikki lääkkeesi vähintään 80%%:n tehokkuuteen, nosta maineesi vähintään 650:n ja kokoa 500 000$ pankkitilillesi voittaaksesi. ", level11 = "Sinulle tarjoutuu nyt mahdollisuus rakentaa yksi maailman parhaista sairaaloista. " .. "Tämä on erittäin arvostettu asuinalue ja ministeriö haluaa tänne parhaan mahdollisen sairaalan. " .. "Odotamme sinun ansaitsevan runsaasti rahaa, hankkivan erinomaisen maineen sairaalallesi ja pystyvän hoitamaan vaikeimmatkin tapaukset. " .. "Tämä on hyvin tärkeä työ. " .. "Sinun täytyy käyttää kaikkea osaamistasi selvitäksesi tästä kunnialla. " .. "Huomaa, että alueella on havaittu UFOja. Pidä huolta, että henkilökuntasi on valmiina odottamattomien vierailijoiden varalta. " .. "Sairaalasi arvon pitää olla 240 000$, pankkitililläsi pitää olla 500 000$ ja maineesi pitää olla 700.", level12 = "Tämä on kaikkien haasteiden äiti. " .. "Vaikuttuneena saavutuksistasi ministeriö on päättänyt antaa sinulle huipputyön; he haluavat toisen maailmanluokan sairaalan, joka tuottaa mainiosti ja jolla on erinomainen maine. " .. "Sinun odotetaan myös ostavan kaikki saatavilla olevat maa-alueet, parantavan kaikki sairaudet (ja me tosiaan tarkoitamme kaikki) ja voittavan kaikki palkinnot. " .. "Luuletko onnistuvasi?" .. "Ansaitse 650 000$, paranna 750 ihmistä ja hanki 800 mainetta voittaaksesi tämän.", level13 = "Uskomattomat kykysi sairaalanjohtajana ovat tulleet Salaisen erityispalvelun erityisen salaosaston tietoon. " .. "Heillä on sinulle erityinen bonus: täynnä rottia oleva sairaala, joka kaipaa kipeästi tehokasta tuholaistorjuntaa. " .. "Sinun pitää ampua mahdollisimman monta rottaa ennen kuin huoltomiehet siivoavat kaikki roskat pois. " .. "Uskotko olevasi tehtävän tasalla?", level14 = "Vielä yksi haaste on tarjolla - täysin odottamaton yllätyssairaala. " .. "Jos onnistut saamaan tämän paikan toimimaan, olet todellinen mestareiden mestari. " .. "Älä kuvittelekkaan, että tästä tulee helppoa kuin puistossa kävely, sillä tämä on pahin haaste, jonka saat vastaasi. " .. "Paljon onnea!", level15 = "Nyt olemme käsitelleet perusteet sairaalan saamiseksi toimintaan.//" .. "Lääkärisi tarvitsevat kaiken mahdollisen avun diagnosoidessaan osan näistä potilaista. " .. "Voit auttaa heitä rakentamalla toisen diagnoosihuoneen kuten yleislääkärin vastaanoton.", level16 = "Diagnosoituasi potilaita tarvitset hoitohuoneita ja klinikoita heidän parantamisekseen " .. "Apteekista on hyvä aloittaa. Toimiakseen se tarvitsee sairaanhoitajan annostelemaan lääkkeitä.", level17 = "Viimeinen varoituksen sana: pidä tarkasti silmällä mainettasi, sillä se houkuttelee sairaalaasi potilaita niin läheltä kuin kaukaa. " .. "Jos potilaita ei kuole liikaa ja he pysyvät kohtuullisen tyytyväisinä, sinulla ei ole mitään hätää tällä tasolla!//" .. "Olet nyt omillasi. Onnea ja menestystä!.", level18 = "", } -- 10. Tips totd_window = { tips = { "Jokainen sairaala tarvitsee vastaanoton ja yleislääkärin toimiston. Tämän jälkeen kaikki riippuu siitä, mitä potilaasi tarvitsevat. Apteekki on kuitenkin yleensä hyvä alku.", "Kaikki laitteet, kuten verikone, tarvitsevat huoltoa. Palkkaa huoltomies tai pari korjaamaan laitteitasi tai työntekijöillesi ja potilaillesi saattaa käydä hassusti.", "Työntekijäsi kaipaavat välillä taukoja. Muista rakentaa heille henkilökunnan huone, jossa he voivat käydä lepäämässä.", "Asenna sairaalaasi riittävästi lämpöpattereita, jotta henkilökunnalle ja asiakkaille ei tule kylmä.", "Lääkärin taidot vaikuttavat paljon hänen tekemiensä diagnoosien laatuun ja nopeuteen. Palkkaamalla hyvän lääkärin yleislääkärin toimistoon tarvitset vähemmän muita diagnoosihuoneita.", "Tohtorit ja harjoittelijat voivat parantaa taitojaan oppimalla konsulteilta koulutushuoneessa. Jos konsultti on erikoistunut johonkin alaan (kirurgia, psykiatria tai tutkimus) hän siirtää tämän alan osaamisensa myös oppilailleen.", "Oletko kokeillut syöttää yleisen hätänumeron (112) faksiin? Varmista, että sinulla on äänet päällä!", "Asetukset-valikkoa ei ole vielä toteutettu, mutta voit muuttaa asetuksia kuten resoluutiota ja kieltä muokkaamalla config.txt-tiedostoa pelin asennushakemistossa.", "Olet vaihtanut kielen suomeksi. Jos kuitenkin näet pelissä englannin kielistä tekstiä, voit auttaa suomentamalla puuttuvia tekstejä!", "CorsixTH-tiimi etsii aina vahvistuksia! Oletko kiinnostunut ohjelmoimaan, kääntämään tai laatimaan grafiikkaa CorsixTH:ta varten? Saat meihin yhteyden Foorumimme, Sähköpostilistamme tai IRC-kanavamme (corsix-th at freenode) kautta.", "Jos löydät pelistä bugin, ilmoitathan niistä buginseurantaamme: th-issues.corsix.org.", "Jokaisella tasolla on joukko vaatimuksia, jotka sinun tulee täyttää ennen kuin pääset siirtymään seuraavalle tasolle. Voit tarkastella edistymistäsi tilanne-valikosta.", "Jos haluat muokata huonetta tai poistaa sen, voit tehdä niin ruudun alareunassa olevasta työkalupalkista löytyvän muokkaa huonetta -painikkeen avulla.", "Viemällä hiiren osoittimen huoneen päälle saat nopeasti tietää, ketkä ulkopuolella olevien potilaiden rykelmässä odottavat pääsyä kyseiseen huoneeseen.", "Klikkaa huoneen ovea nähdäksesi sen jonon. Tässä ikkunassa voit tehdä hyödyllistä hienosäätöä kuten järjestää jonon uudestaan tai lähettää potilaita toiseen huoneeseen.", "Tyytymättömät työntekijät pyytävät useammin palkankorotuksia. Pidä huolta, että he työskentelevät mukavassa ympäristössä välttääksesi tätä.", "Potilaat tulevat janoisiksi odottaessaan sairaalassasi; erityisesti, jos nostat lämpötilaa! Aseta juoma-automaatteja strategisesti ympäri sairaalaasi saadaksesi vähän lisätuloja.", "Voit peruuttaa potilaan diagnosoinnin ennenaikaisesti ja arvata hoidon, jos olet törmännyt kyseiseen tautiin jo aiemmin. Muista kuitenkin, että tämä lisää väärästä hoidosta aiheutuvan kuoleman riskiä.", "Hätätilanteet voivat olla hyvä ylimääräisen rahan lähde olettaen, että sairaalallasi on riittävästi kapasiteettia hätätilannepotilaiden hoitamiseen ajoissa.", }, previous = "Edellinen vihje", next = "Seuraava vihje", } -- 11. Room descriptions (These were not present with the old strings so I assume they are new then) room_descriptions = { blood_machine = { [1] = "Verikonehuone//", [2] = "Verikone tutkii potilaan verisoluja selvittääkseen mikä häntä vaivaa.//", [3] = "Verikone tarvitsee käyttäjäkseen lääkärin ja huoltoa huoltomieheltä. ", }, cardiogram = { [1] = "Kardiogrammihuone//", [2] = "Potilaan sydän tutkitaan täällä ja hänet lähetetään takaisin yleislääkärin vastaanotolle, jossa määrätään sopiva hoito.//", [3] = "Kardiogrammikone tarvitsee käyttäjäkseen lääkärin ja huoltoa huoltomieheltä. ", }, decontamination = { [1] = "Säteilyklinikka//", [2] = "Säteilylle altistuneet potilaat ohjataan nopeasti säteilyklinikalle. Huoneessa on suihku, jolla huuhdellaan potilaista kaikki kammottava radioaktiivinen aines ja lika.//", [3] = "Puhdistussuihku tarvitsee käyttäjäkseen lääkärin ja huoltoa huoltomieheltä. ", }, dna_fixer = { [1] = "DNA-klinikka//", [2] = "Potilaat, jotka ovat joutuneet alieneiden kynsiin, tarvitsevat DNA-vaihdon tässä huoneessa. DNA-korjain on hyvin monimutkainen kone, joten on suositeltavaa pitää vaahtosammutin sen kanssa samassa huoneessa varmuuden vuoksi.//", [3] = "DNA-korjain tarvitsee käyttäjäkseen tutkimukseen erikoistuneen lääkärin ja säännöllistä huoltoa huoltomieheltä. ", }, electrolysis = { [1] = "Elektrolyysihuone//", [2] = "Turkinkasvusta kärsivät potilaat ohjataan tähän huoneeseen, jossa elektrolyysikone nyppii karvat pois ja sulkee huokoset sähköisesti käyttäen ainetta joka muistuttaa saumauslaastia.//", [3] = "Elektrolyysikone tarvitsee käyttäjäkseen lääkärin ja huoltoa huoltomieheltä. ", }, fracture_clinic = { [1] = "Murtumaklinikka//", [2] = "Ne epäonniset potilaat, joilla on murtumia luissaan lähetetään tänne. Kipsinpoistin leikkaa voimakkailla laser-säteillä kovettuneet kipsit pois aiheuttaen vain vähän tuskaa potilaalle.//", [3] = "Kipsinpoistin tarvitsee käyttäjäkseen sairaanhoitajan ja satunnaista huoltoa huoltomieheltä. ", }, general_diag = { [1] = "Yleinen diagnoosihuone//", [2] = "Potilaat, jotka tarvitsevat jatkotutkimusta lähetetään tänne tutkittaviksi. Jos yleislääkärin vastaanotolla ei selviä, mikä potilasta vaivaa, yleisessä diagnoosihuoneessa monesti selviää. Potilaat lähetetään täältä takaisin yleislääkärin vastaanotolle tulosten analysointia varten.//", [3] = "Yleiseen diagnoosihuoneeseen tarvitaan lääkäri. ", }, gp = { [1] = "Yleislääkärin vastaanotto//", [2] = "Tämä on sairaalasi perusdiagnoosihuone. Kaikki uudet potilaat lähetetään tänne lääkärin tutkittaviksi ja täältä heidät ohjataan joko jatkotutkimuksiin tai huoneeseen, jossa heidät voidaan parantaa. Saatat tarvita toisen yleislääkärin vastaanoton, jos ensimmäisestä tulee liian kiireinen. Mitä suurempi huone ja mitä enemmän lisäkalusteita sinne ostat sitä arvostetummaksi lääkäri tuntee itsensä. Tämä pätee myös kaikkiin muihin huoneisiin, joissa tarvitaan henkilökuntaa.//", [3] = "Yleislääkärin vastaanotolle tarvitaan lääkäri. ", }, hair_restoration = { [1] = "Hiusklinikka//", [2] = "Kaljuudesta kärsivät potilaat ohjataan tällä klinikalla olevalle hiustenpalauttimelle. Lääkäri ohjaa konetta, joka kylvää potilaan päähän nopealla tahdilla tuorreita hiuksia.//", [3] = "Hiustenpalautin tarvitsee käyttäjäkseen lääkärin ja huoltoa huoltomieheltä. ", }, inflation = { [1] = "Pumppaushuone//", [2] = "Kivuliaasta mutta huvittavasta pallopäisyydestä kärsivien potilaiden pitää mennä pumppaushuoneeseen, jossa heidän ylisuuri nuppinsa puhkaistaan ja täytetään sopivaan paineeseen.//", [3] = "Pumppauskone tarvitsee käyttäjäkseen lääkärin ja säännöllistä huoltoa huoltomieheltä. ", }, jelly_vat = { [1] = "Hyytelöklinikka//", [2] = "Potilaiden, jotka sairastavat hyytelöitymistä, täytyy huojua hyytelöklinikalle ja asettua hyytelömuovaimeen. Tämä parantaa heidät vielä lääketieteelle tuntemattomalla tavalla.//", [3] = "Hyytelömuovain tarvitsee käyttäjäkseen lääkärin ja huoltoa huoltomieheltä. ", }, no_room = { [1] = "", }, operating_theatre = { [1] = "Leikkaussali//", [2] = "Tämä on tärkeä huone, sillä täällä hoidetaan lukuisia eri sairauksia. Leikkaussalin tulee olla riittävän suuri ja siellä pitää olla oikeat välineet. Se on elintärkeä osa sairaalaasi.//", [3] = "Leikkaussaliin tarvitaan kaksi kirurgiaan erikoistunutta lääkäriä. ", }, pharmacy = { [1] = "Apteekki//", [2] = "Potilaat, joilla on diagnosoitu lääkkeillä parantuva sairaus, ohjataan apteekkiin hakemaan lääkkeensä. Sitä mukaa, kun uusia lääkehoitoja kehitetään, apteekki tulee kiireisemmäksi, joten toisen apteekin rakentaminen myöhemmin saattaa tulla tarpeen.//", [3] = "Apteekkiin tarvitaan sairaanhoitaja. ", }, psych = { [1] = "Psykiatrin vastaanotto//", [2] = "Psykologisista sairauksista kärsivät potilaat lähetetään keskustelemaan psykiatrin kanssa. Psykiatrit voivat tarkentaa potilaan diagnoosia ja hoitaa psykologisia sairauksia uskollisen sohvansa avulla.//", [3] = "Psykiatrin vastaanotolle tarvitaan psykiatriaan erikoistunut lääkäri. ", }, research = { [1] = "Tutkimusosasto//", [2] = "Täällä kehitetään uusia lääkkeitä ja hoitoja sekä parannellaan vanhoja. Tutkimusosasto on tärkeä osa tehokasta sairaalaa ja se tekee ihmeitä hoitoprosentillesi.//", [3] = "Tutkimusosastolle tarvitaan tutkimukseen erikoistunut lääkäri. ", }, scanner = { [1] = "Magneettikuvaushuone//", [2] = "Potilaille saadaan tarkka diagnoosi edistyneen magneettikuvaimen avulla. Tämän jälkeen heidät lähetetään takaisin yleislääkärin vastaanotolle, jossa heille määrätään sopiva hoito.//", [3] = "Magneettikuvain tarvitsee käyttäjäkseen lääkärin ja huoltoa huoltomieheltä. ", }, slack_tongue = { [1] = "Kieliklinikka//", [2] = "Potilaat, joilla yleislääkäri on todennut velttokielisyyden, lähetetään tänne hoitoon. Lääkäri käyttää kehittynyttä paloittelukonetta kielen venyttämiseen ja katkaisee sen normaaliin mittaansa parantaen potilaan.//", [3] = "Paloittelukone tarvitsee käyttäjäkseen lääkärin ja huoltoa huoltomieheltä. ", }, staff_room = { [1] = "Henkilökunnan taukohuone//", [2] = "Henkilökuntasi väsyy suorittaessaan työtehtäviään. He käyttävät tätä huonetta rentoutumiseen ja lepäämiseen. Väsyneet työntekijät toimivat hitaammin, tekevät enemmän kohtalokkaita virheitä, vaativat palkankorotuksia ja eroavat lopulta palveluksestasi. Taukohuoneen rakentaminen on siis hyvin kannattavaa. Varmista, että huone on riittävän suuri useammalle henkilölle ja että siellä on riittävästi tekemistä henkilökunnallesi. ", }, toilets = { [1] = "Käymälä//", [2] = "Potilaat, joita luonto kutsuu, voivat helpottaa oloaan käymälässäsi. Voit rakentaa enemmän eriöitä ja pesualtaita, jos odotat paljon potilaita. Joissain tilanteissa voi olla parempi rakentaa useampia käymälöitä eri puolille sairaalaasi. ", }, training = { [1] = "Koulutushuone//", [2] = "Harjoittelijasi ja tohtorisi voivat oppia arvokkaita erikoistumistaitoja opiskelemalla tässä huoneessa. Konsultti, joka on erikoistunut kirurgiaan, tutkimukseen tai psykiatriaan siirtää näitä taitojaan koulutettavina oleville lääkäreille. Lääkärit, joilla jo on koulutus opetettavista erikoistumisaloista parantavat kykyään käyttää taitojaan täällä.//", [3] = "Koulutushuoneeseen tarvitaan konsultti. ", }, tv_room = { [1] = "TV-HUONE EI KÄYTÖSSÄ", }, ultrascan = { [1] = "Ultraäänihuone//", [2] = "Ultraäänilaite on pitkälle kehittynyt diagnoosilaite. Se maksaa paljon, mutta on sen arvoinen, jos haluat saada ensiluokkaisia diagnooseja sairaalassasi.//", [3] = "Ultraäänilaite tarvitsee käyttäjäkseen lääkärin ja huoltoa huoltomieheltä. ", }, ward = { [1] = "Vuodeosasto//", [2] = "Potilaita pidetään täällä vuodelevossa tarkkailtavina diagnosoinnin aikana ja ennen leikkausta.//", [3] = "Vuodeosastolle tarvitaan sairaanhoitaja. ", }, x_ray = { [1] = "Röntgenhuone//", [2] = "Röntgenillä kuvataan potilaiden sisäelimet ja luusto käyttäen erityistä säteilylähdettä. Hoitohenkilökunta saa näin hyvän kuvan siitä, mikä potilasta vaivaa.//", [3] = "Röntgen tarvitsee käyttäjäkseen lääkärin ja huoltoa huoltomieheltä. ", }, } -- 12. Lua console lua_console = { execute_code = "Suorita", close = "Sulje", } -- 13. Information information = { custom_game = "Tervetuloa pelaamaan CorsixTH:ta. Toivottavasti viihdyt tällä itse laaditulla kartalla!", cannot_restart = "Valitettavasti tämä peli on tallennettu ennen uudelleen käynnistämisen toteuttamista.", level_lost = { "Harmin paikka! Olet hävinnyt tämän tason. Parempaa onnea ensi kerralla!", "Syy tappioosi oli:", reputation = "Maineesi putosi alle %d:n.", balance = "Pankkitilisi saldo putosi alle %d$:n.", percentage_killed = "Olet tappanut yli %d prosenttia potilaista.", }, } -- 14. Handyman window handyman_window = { all_parcels = "Kaikkialla", parcel = "Alue", } -- 15. Misc misc = { not_yet_implemented = "(ei toteutettu vielä)", no_heliport = "Joko yhtään tautia ei vielä tunneta tai sairaalalla ei ole helikopterikenttää", } date_format.daymonth = "%1%. %2:months%" ------------------------------------------------------------------------------- -- SECTION B - OLD STRINGS (OVERRIDE) ------------------------------------------------------------------------------- -- Staff class -- each of these corresponds to a sprite staff_class = { nurse = "Sairaanhoitaja", doctor = "Lääkäri", handyman = "Huoltomies", receptionist = "Vastaanottoapulainen", surgeon = "Kirurgi", } -- Staff titles -- these are titles used e.g. in the dynamic info bar staff_title = { receptionist = "Vastaanottoapulainen", general = "Yleinen", -- unused? nurse = "Sairaanhoitaja", junior = "Harjoittelija", doctor = "Tohtori", surgeon = "Kirurgi", psychiatrist = "Psykiatri", consultant = "Konsultti", researcher = "Tutkija", } -- Pay rises pay_rise = { definite_quit = "Et voi enää pidätellä minua mitenkään. Se on loppu nyt!", regular = { "Olen ihan loppuunpalanut. Vaadin kunnon tauon ja %d$:n palkankorotuksen, jos et halua nähdä minun kävelevän ympäriinsä ja valittavan käytävillä.", -- %d (rise) "Olen hyvin väsynyt. Vaadin lepoa ja %d$:n palkankorotuksen eli yhteensä %d$ palkkaa. Se saa kelvata, senkin tyranni!", -- %d (rise) %d (new total) "Anteeksi kuinka? Raadan täällä kuin orja. Anna minulle %d$:n bonus niin tulen sairaalaasi.", -- %d (rise) "Olen niin masentunut, että haluan %d$:n palkankorotuksen, joka tekee yhteensä %d$, tai muuten otan lopputilin.", -- %d (rise) %d (new total) "Vanhempani käskivät opiskella lääkäriksi, että saisin kunnon palkkaa. Anna minulle siis %d$ lisää liksaa, tai lähden täältä nopeammin kuin uskotkaan.", -- %d (rise) "Nyt olen vihainen. Anna minulle enemmän palkkaa. Uskoisin, että %d$ lisää riittää tällä erää.", -- %d (rise) }, poached = "Minulle on tarjottu %d$ palkkaa %s-nimisen kilpailijasi sairaalassa. Siirryn sinne töihin, ellet anna minulle vastaavaa palkankorotusta.", -- %d (new total) %s (competitor) } -- Staff descriptions staff_descriptions = { good = { [1] = "Hyvin nopea ja ahkera työntekijä. ", [2] = "Hyvin velvollisuudentuntoinen. Oikein huolellinen. ", [3] = "Todella monipuolinen. ", [4] = "Ystävällinen ja aina hyvällä tuulella. ", [5] = "Äärimmäisen sisukas. Työskentelee yöt ja päivät. ", [6] = "Uskomattoman kohtelias ja hyvätapainen. ", [7] = "Uskomattoman ammattitaitoinen ja osaava. ", [8] = "Hyvin keskittynyt ja arvostettu työssään. ", [9] = "Perfektionisti, joka ei koskaan luovuta. ", [10] = "Auttaa aina ihmisiä hymyssä suin. ", [11] = "Hurmaava, kohtelias ja auttavainen. ", [12] = "Hyvin motivoitunut ja omistautunut työlleen. ", [13] = "Luonteeltaan kiltti ja ahkera. ", [14] = "Lojaali ja ystävällinen. ", [15] = "Huomaavainen. Rauhallinen ja luotettava hätätilanteissa. ", }, misc = { [1] = "Pelaa Golfia. ", [2] = "Pitää kampasimpukoista. ", [3] = "Veistää jääpatsaita. ", [4] = "Juo viiniä. ", [5] = "Ajaa rallia. ", [6] = "Harrastaa benjihyppyä. ", [7] = "Kerää lasinalusia. ", [8] = "Harrastaa yleisösurffausta. ", [9] = "Nauttii vauhdikkaasta surffaamisesta. ", [10] = "Pitää ankeriaiden venyttämisestä. ", [11] = "Tislaa viskiä. ", [12] = "Tee-se-itse ekspertti. ", [13] = "Pitää ranskalaisista taide-elokuvista. ", [14] = "Pelaa OpenTTD-peliä. ", [15] = "C-ajokortin ylpeä omistaja. ", [16] = "Osallistuu moottoripyöräkilpailuihin. ", [17] = "Soittaa klassista viulua ja selloa. ", [18] = "Innokas junanromuttaja. ", [19] = "Koiraihminen. ", [20] = "Kuuntelee radiota. ", [21] = "Kylpee usein. ", [22] = "Opettaa bambunletitystä. ", [23] = "Valmistaa saippuakuppeja vihanneksista. ", [24] = "Osa-aikainen miinanraivaaja. ", [25] = "Visailumestari. ", [26] = "Kerää sirpaleita 2. maailmansodasta. ", [27] = "Pitää sisustamisesta. ", [28] = "Kuuntelee rave- ja trip-hop-musikkia. ", --see original for trip-hop [29] = "Tappaa hyönteisiä deodorantilla. ", [30] = "Pitää kamalia stand up -esityksiä. ", [31] = "Tekee ostoksia sairaalaneuvostolle. ", [32] = "Salaperäinen puutarhuri. ", [33] = "Salakuljettaa piraattikelloja. ", [34] = "Rock-bändin laulaja. ", [35] = "Rakastaa TV:n katselua päivällä. ", [36] = "Kalastaa taimenia. ", [37] = "Houkuttelee turisteja museoon. ", }, bad = { [1] = "Hidas ja nirso. ", [2] = "Laiska ja heikosti motivoitunut. ", [3] = "Huonosti koulutettu ja hyödytön. ", [4] = "Tyhmä ja ärsyttävä. Toimii sijaisena. ", [5] = "Alhainen kestävyys. Hänellä on huono ryhti. ", [6] = "Tyhmä kuin saapas. Haisee kaalilta. ", [7] = "Ei välitä työstään. Ei ota vastuuta. ", [8] = "Keskittymisvaikeuksia, häiriintyy helposti. ", [9] = "Stressaantunut ja tekee runsaasti virheitä. ", [10] = "Suuttuu helposti. Mököttää vihaisena. ", [11] = "Varomaton ja epäonninen. ", [12] = "Ei välitä työstään. Epäaktiivinen. ", [13] = "Uhkarohkea ja piittaamaton. ", [14] = "Viekas ja ovela. Puhuu muista pahaa. ", [15] = "Ylimielinen ja mahtaileva. ", }, } -- Staff list staff_list = { morale = "MORAALI", tiredness = "VÄSYMYS", skill = "TAITO", total_wages = "KOKONAISPALKKA", } -- Objects object = { desk = "Toimistopöytä", cabinet = "Arkistokaappi", door = "Ovi", bench = "Penkki", table1 = "Pöytä", -- unused object chair = "Tuoli", drinks_machine = "Juoma-automaatti", bed = "Sänky", inflator = "Pumppauskone", pool_table = "Biljardipöytä", reception_desk = "Vastaanottopöytä", table2 = "Pöytä", -- unused object & duplicate cardio = "Kardiogrammikone", scanner = "Magneettikuvain", console = "Konsoli", screen = "Sermi", litter_bomb = "Roskapommi", couch = "Sohva", sofa = "Sohva", crash_trolley = "Kärry", tv = "TV", ultrascanner = "Ultraäänilaite", dna_fixer = "DNA-korjain", cast_remover = "Kipsinpoistin", hair_restorer = "Hiustenpalautin", slicer = "Paloittelukone", x_ray = "Röntgen", radiation_shield = "Säteilysuoja", x_ray_viewer = "Röntgenkatselin", operating_table = "Leikkauspöytä", lamp = "Lamppu", -- unused object toilet_sink = "Pesuallas", op_sink1 = "Allas", op_sink2 = "Lavuaari", surgeon_screen = "Kirurgin sermi", lecture_chair = "Luentotuoli", projector = "Projektori", bed2 = "Sänky", -- unused duplicate pharmacy_cabinet = "Lääkekaappi", computer = "Tietokone", atom_analyser = "Atomianalysaattori", blood_machine = "Verikone", fire_extinguisher = "Vaahtosammutin", radiator = "Lämpöpatteri", plant = "Kasvi", electrolyser = "Elektrolyysikone", jelly_moulder = "Hyytelömuovain", gates_of_hell = "Manalan portit", bed3 = "Sänky", -- unused duplicate bin = "Roskakori", toilet = "Eriö", swing_door1 = "Heiluriovi", swing_door2 = "Heiluriovi", shower = "Puhdistussuihku", auto_autopsy = "Ruumiinavauskone", bookcase = "Kirjahylly", video_game = "Videopeli", entrance_left = "Sisäänkäynnin vasen ovi", entrance_right = "Sisäänkäynnin oikea ovi", skeleton = "Luuranko", comfortable_chair = "Mukava tuoli", litter = "Roska", } -- Place objects window place_objects_window = { drag_blueprint = "Muuta suunnitelmaa kunnes olet tyytyväinen siihen", place_door = "Aseta ovi paikalleen", place_windows = "Aseta joitakin ikkunoita, jos haluat. Vahvista, kun olet valmis", place_objects = "Aseta kalusteet paikalleen. Vahvista, kun olet valmis", confirm_or_buy_objects = "Voit hyväksyä huoneen, jatkaa kalusteiden ostamista tai siirtää kalusteita", pick_up_object = "Klikkaa kalusteita poimiaksesi ne ylös tai tee toinen valinta ikkunasta", place_objects_in_corridor = "Aseta kalusteita käytävään", } -- Competitor names competitor_names = { [1] = "ORAAKKELI", [2] = "TÖPPÖ", [3] = "KOLOSSI", [4] = "NULJASKA", [5] = "PYHIMYS", [6] = "SYVÄ AJATUS", [7] = "ZEN", [8] = "LEO", [9] = "AKIRA", [10] = "SAMI", [11] = "KAARLE", [12] = "JANNE", [13] = "ARTTURI", [14] = "MATTI", [15] = "MAMMA", [16] = "SARI", [17] = "KUNKKU", [18] = "JOONAS", [19] = "TANELI", [20] = "OLIVIA", [21] = "NIKKE", } -- Months months = { "Tam", "Hel", "Maa", "Huh", "Tou", "Kes", "Hei", "Elo", "Syy", "Lok", "Mar", "Jou", } -- Graphs graphs = { money_in = "Tulot", money_out = "Menot", wages = "Palkat", balance = "Rahavarat", visitors = "Vierailijoita", cures = "Parantumisia", deaths = "Kuolemia", reputation = "Maine", time_spans = { "1 vuosi", "12 vuotta", "48 vuotta", } } -- Transactions transactions = { --null = S[8][ 1], -- not needed wages = "Palkat", hire_staff = "Palkkaa henkilökuntaa", buy_object = "Osta kalusteita", build_room = "Rakenna huoneita", cure = "Hoitokeino", buy_land = "Osta maata", treat_colon = "Hoito:", final_treat_colon = "Viimeisin hoito:", cure_colon = "Hoitokeino:", deposit = "Hoitomaksut", advance_colon = "Ennakko:", research = "Tutkimuskustannukset", drinks = "Tulot: juoma-automaatti", jukebox = "Tulot: jukeboksi", -- unused cheat = "Huijaukset", heating = "Lämmityskustannukset", insurance_colon = "Vakuutus:", bank_loan = "Pankkilaina", loan_repayment = "Lainan lyhennys", loan_interest = "Lainan korko", research_bonus = "Tutkimusbonus", drug_cost = "Lääkekustannukset", overdraft = "Tilin ylitys", severance = "Irtisanomiskustannukset", general_bonus = "Yleisbonus", sell_object = "Myy kalusteita", personal_bonus = "Henkilökunnan bonukset", emergency_bonus = "Hätätilannebonukset", vaccination = "Rokotukset", epidemy_coverup_fine = "Sakot epidemian peittelystä", compensation = "Valtion tuet", vip_award = "VIP-palkkinnot", epidemy_fine = "Epidemiasakot", eoy_bonus_penalty = "Vuosittaiset bonukset/sakot", eoy_trophy_bonus = "Vuoden palkintobonukset", machine_replacement = "Vaihtolaitteiden kustannukset", } -- Level names level_names = { "Lahjala", "Unikylä", "Isola", "Kotokartano", "Lepikylä", "Susimetsä", "Kaukala", "Puolitie", "Tammikuja", "Tiukylä", "Kaarela", "Kannosto", "Kamukylä", "Pikku-Rajala", "Vaatimala", } -- Town map town_map = { chat = "Chat", for_sale = "Myytävänä", not_for_sale = "Ei myytävänä", number = "Tonttinumero", owner = "Omistaja", area = "Pinta-ala", price = "Hinta", } -- Rooms short -- NB: includes some special "rooms" -- reception, destroyed room and "corridor objects" rooms_short = { reception = "Vastaanotto", destroyed = "Tuhoutunut", corridor_objects = "Käytäväkalusteet", gps_office = "Yleislääkäri", psychiatric = "Psykiatria", ward = "Vuodeosasto", operating_theatre = "Leikkaussali", pharmacy = "Apteekki", cardiogram = "Kardiogrammi", scanner = "Magneettikuvaus", ultrascan = "Ultraääni", blood_machine = "Verikone", x_ray = "Röntgen", inflation = "Pumppaushuone", dna_fixer = "DNA-klinikka", hair_restoration = "Hiusklinikka", tongue_clinic = "Kieliklinikka", fracture_clinic = "Murtumaklinikka", training_room = "Koulutushuone", electrolysis = "Elektrolyysiklinikka", jelly_vat = "Hyytelöklinikka", staffroom = "Taukohuone", -- rehabilitation = "Vieroitushuone", -- unused general_diag = "Yleinen diagnoosi", research_room = "Tutkimusosasto", toilets = "Käymälä", decontamination = "Säteilyklinikka", } -- Rooms long rooms_long = { general = "Yleinen", -- unused? emergency = "Hätätilanne", corridors = "Käytävät", gps_office = "Yleislääkärin vastaanotto", psychiatric = "Psykiatrin vastaanotto", ward = "Vuodeosasto", operating_theatre = "Leikkaussali", pharmacy = "Apteekki", cardiogram = "Kardiogrammihuone", scanner = "Magneettikuvaushuone", ultrascan = "Ultraäänihuone", blood_machine = "Verikonehuone", x_ray = "Röntgenhuone", inflation = "Pumppaushuone", dna_fixer = "DNA-klinikka", hair_restoration = "Hiusklinikka", tongue_clinic = "Kieliklinikka", fracture_clinic = "Murtumaklinikka", training_room = "Koulutushuone", electrolysis = "Elektrolyysiklinikka", jelly_vat = "Hyytelöklinikka", staffroom = "Henkilökunnan taukohuone", -- rehabilitation = "Vieroitushuone", -- unused general_diag = "Yleinen diagnoosihuone", research_room = "Tutkimusosasto", toilets = "Käymälä", decontamination = "Säteilyklinikka", } -- Drug companies drug_companies = { "Hoidake Yhtiöt", "Para 'N' Nus", "Pyöreät pikku-pillerit Oy", "Tyyrislääke Oyj", "Kaik-tabletit Ky", } -- Build rooms build_room_window = { pick_department = "Valitse osasto", pick_room_type = "Valitse huonetyyppi", cost = "Hinta: ", } -- Build objects buy_objects_window = { choose_items = "Valitse kalusteet", price = "Hinta:", total = "Yhteensä:", } -- Research research = { categories = { cure = "Hoitomenetelmät", diagnosis = "Diagnoosimenetelmät", drugs = "Lääketutkimus", improvements = "Laitteisto", specialisation = "Erikoistuminen", }, funds_allocation = "Myönnettävissä rahastosta", allocated_amount = "Myönnetty rahasumma", } -- Policy screen policy = { header = "SAIRAALAN KÄYTÄNNÖT", diag_procedure = "diagnosointikäytäntö", diag_termination = "hoidon lopettaminen", staff_rest = "taukokäytäntö", staff_leave_rooms = "salli tauolle poistuminen", sliders = { guess = "ARVAA HOITO", -- belongs to diag_procedure send_home = "LÄHETÄ KOTIIN", -- also belongs to diag_procedure stop = "LOPETA HOITO", -- belongs to diag_termination staff_room = "PIDÄ TAUKO", -- belongs to staff_rest } } -- Rooms room_classes = { -- S[19][2] -- "Käytävät" - unused for now diagnosis = "Diagnoosi", treatment = "Hoito", clinics = "Klinikat", facilities = "Toimitilat", } -- Insurance companies insurance_companies = { out_of_business = "KONKURSSISSA", "Kuorittu Sipuli Oy", "Pohjanmaalainen", "Sääntövakuutukset Oy", "Itikka Yhtiöt", "Uniturva", "Vam Pyyri Ky", "Sureol Vakuutusyhtiö", "Okto Pus ja kumppanit", "Larinnon Henkiturva", "Glade Vakuutukset Oy", "Mafia Vakuutus Oyj", } -- Menu root -- Keep 2 spaces as prefix and suffix menu = { file = " TIEDOSTO ", options = " VALINNAT ", display = " NÄYTÄ ", charts = " TILASTOT ", debug = " DEBUG ", } -- Menu File menu_file = { load = " (%1%) LATAA ", save = " (%1%) TALLENNA ", restart = " (%1%) ALOITA ALUSTA ", quit = " (%1%) LOPETA ", } menu_file_load = { [1] = " PELI 1 ", [2] = " PELI 2 ", [3] = " PELI 3 ", [4] = " PELI 4 ", [5] = " PELI 5 ", [6] = " PELI 6 ", [7] = " PELI 7 ", [8] = " PELI 8 ", } -- Menu Options menu_options = { adviser_disabled = " (%1%) AVUSTAJA ", announcements = " (%1%) KUULUTUKSET ", announcements_vol = " KUULUTUSTEN VOIMAKKUUS ", autosave = " AUTOMAATTITALLENNUS ", edge_scrolling = " REUNAVIERITYS ", game_speed = " PELINOPEUS ", jukebox = " (%1%) JUKEBOKSI ", lock_windows = " LUKITSE IKKUNAT ", music = " (%1%) MUSIIKKI ", music_vol = " MUSIIKIN VOIMAKKUUS ", settings = " ASETUKSET ", sound = " (%1%) ÄÄNI ", sound_vol = " ÄÄNENVOIMAKKUUS ", } -- Menu Display menu_display = { high_res = " KORKEA RESOLUUTIO ", mcga_lo_res = " MCGA - MATALA RESOLUUTIO ", shadows = " VARJOT ", } -- Menu Charts menu_charts = { statement = " (%1%) TILIOTE ", casebook = " (%1%) TAPAUSKIRJA ", policy = " (%1%) KÄYTÄNNÖT ", research = " (%1%) TUTKIMUS ", graphs = " (%1%) GRAAFIT ", staff_listing = " (%1%) TYÖNTEKIJÄT ", bank_manager = " (%1%) PANKINJOHTAJA ", status = " (%1%) TILANNE ", briefing = " TIIVISTELMÄ ", } -- Menu Debug menu_debug = { object_cells = " KALUSTESOLUT ", entry_cells = " SYÖTESOLUT ", keep_clear_cells = " PIDÄ TYHJÄNÄ -SOLUT ", nav_bits = " NAVIGOINTIBITIT ", remove_walls = " POISTA SEINÄT ", remove_objects = " POISTA KALUSTEET ", display_pager = " NÄYTÄ VIESTIT ", mapwho_checking = " MAPWHO-TARKISTUS ", plant_pagers = " KASVIVIESTIT ", porter_pagers = " KANTOVIESTIT ", pixbuf_cells = " PIXBUF-SOLUT ", enter_nav_debug = " SYÖTÄ NAVIG. DEBUG ", show_nav_cells = " NÄYTÄ NAVIG. SOLUT ", machine_pagers = " LAITEVIESTIT ", display_room_status = " NÄYTÄ HUONEEN TILA ", display_big_cells = " NÄYTÄ SUURET SOLUT ", show_help_hotspot = " NÄYTÄ APUPISTEET ", win_game_anim = " PELIN VOITTOANIM. ", win_level_anim = " KENTÄN VOITTOANIM. ", lose_game_anim = { [1] = " HÄVITTY PELI 1 ANIM ", [2] = " HÄVITTY PELI 2 ANIM ", [3] = " HÄVITTY PELI 3 ANIM ", [4] = " HÄVITTY PELI 4 ANIM ", [5] = " HÄVITTY PELI 5 ANIM ", [6] = " HÄVITTY PELI 6 ANIM ", [7] = " HÄVITTY PELI 7 ANIM ", }, } -- High score screen high_score = { pos = "SIJOITUS", player = "PELAAJA", score = "PISTEITÄ", best_scores = "HALL OF FAME", worst_scores = "HALL OF SHAME", killed = "Kuolleita", -- is this used? categories = { money = "RIKKAIN", salary = "KORKEIN PALKKA", clean = "PUHTAIN", cures = "PARANTUNEIDEN MÄÄRÄ", deaths = "KUOLLEIDEN MÄÄRÄ", cure_death_ratio = "PARANTUNEET-KUOLLEET-SUHDE", patient_happiness = "POTILAIDEN TYYTYVÄISYYS", staff_happiness = "HENKILÖSTÖN TYYTYVÄISYYS", staff_number = "ENITEN HENKILÖKUNTAA", visitors = "ENITEN POTILAITA", total_value = "KOKONAISARVO", }, } -- Trophy room trophy_room = { many_cured = { awards = { "Onnittelut Marie Curie -palkinnosta: olet onnistunut parantamaan suurimman osan sairaalaan saapuneista potilaista viime vuonna.", }, trophies = { "Kansainvälinen lääkintähallitus toivottaa onnea hyvästä paranemisten osuudesta sairaalassasi viime vuonna. He myöntävät täten sinulle Puolet parannettu -kunniamaininnan.", "Sinulle on myönnetty Ei sairaana kotiin -kunniamaininta, koska ole parantanut suurimman osan sairaalaasi saapuneista potilaista viime vuonna.", }, }, all_cured = { awards = { "Onnittelut Marie Curie -palkinnosta: olet onnistunut parantamaan kaikki sairaalaan saapuneet potilaat viime vuonna.", }, trophies = { "Kansainvälinen lääkintähallitus toivottaa onnea hyvästä paranemisten osuudesta sairaalassasi viime vuonna. He myöntävät täten sinulle Kaikki parannettu -kunniamaininnan.", "Sinulle on myönnetty Ei sairaana kotiin -kunniamaininta, koska ole parantanut kaikki sairaalaasi saapuneet potilaat.", }, }, high_rep = { awards = { "Sinulle myönnetään täten sisäministeriön Kiiltävät sairaalastandardit -palkinto, joka myönnetään vuosittain parhaan maineen saavuttaneelle sairaalalle. Onneksi olkoon!", "Ole hyvä ja ota vastaan Bullfrog-palkinto, joka myönnetään maineeltaan vuoden parhaalle sairaalalle. Olet ehdottomasti ansainnut sen!", }, }, happy_staff = { awards = { }, trophies = { "Sinulle on myönnetty Hymynaama-kunniamaininta ahkeran henkilökuntasi pitämisestä niin tyytyväisenä kuin mahdollista.", "Mielialainstituutti on todennut, ettei kenelläkään ollut sinun sairaalassassi huolia tai murheita viime vuonna ja se antaa sinulle tunnustuksena tästä kunniamaininnan.", "Aurinko paistaa aina -kunniamaininta myönnetään täten sinulle, koska olet onnistunut pitämään henkilöstösi tyytyväisenä koko vuoden huolimatta valtaisasta työmäärästä. Hymyä huuleen!", }, }, happy_vips = { trophies = { "Tunnettujen henkilöiden toimisto haluaa palkita sinut Julkkis-kunniamaininnalla, koska olet pitänyt hyvää huolta kaikista VIP-potilaistasi. Olet jo itsekin melkein tunnettu!", }, }, no_deaths = { awards = { "Olet voittanut Elä pitkään -palkinnon pidettyäsi viime vuoden aikana 100 prosenttia potilaistasi hengissä.", }, trophies = { "Elämä jatkuu -komitea on myöntänyt sinulle nimikkokunniamainintansa, koska olet selvinnyt ilman ainuttakaan kuolemantapausta koko viime vuoden.", "Sinulle on myönnetty Pidä elämästä kiinni -kunniamaininnan onnistuttuasi välttämään kuolemantapaukset kuluneena vuonna kokonaan. Mahtavuutta!", }, }, rats_killed = { awards = { }, trophies = { "Sinulle on myönnetty Nolla tuholaista -kunniamaininta, koska sairaalassasi on ammuttu %d rottaa vuoden aikana.", -- %d (number of rats) "Otat vastaaan rottien ja hiirten vastaisen järjestön kunniamaininnan erinomaisen rotta-ammuntasi johdosta. Otit hengiltä %d jyrsijää viime vuonna.", -- %d (number of rats) "Onnittelut Rotta-ampuja-kunniamaininnasta, jonka sait osoitettuasi erityistä lahjakkuutta hävittämällä %d rottaa sairaalastasi kuluneen vuoden aikana.", -- %d (number of rats) }, }, rats_accuracy = { awards = { }, trophies = { "Sinulle on myönnetty Kiitettävä ampuja toivottomassa sodassa -kunniamaininta, koska osamatarkkuutesi inhottavien rottien jahtaamisessa oli %d%% viime vuonna.", -- %d (accuracy percentage) "Tämä kunniamaininta on osoitus taitavuudestasi saatuasi hengiltä %d%% rotista, joita ammuit viime vuonna.", -- %d (accuracy percentage) "Olet osoittanut suurta tarkkuutta tappaessasi %d%% kaikista sairaalasi rotista ja sinulle on myönnetty Dungeon Keeper -kunniamaininta. Rottaiset onnittelut!", -- %d (accuracy percentage) }, }, healthy_plants = { awards = { "Onnittelut Kasvukausi-palkinnosta! Olet onnistunut pitämään sairaalasi kasvit erinomaisessa kunnossa koko vuoden.", }, trophies = { "Ruukasvien ystävät -järjestö myöntää sinulle Vihreä terveys -kunniamaininnan, koska olet pitänyt hyvää huolta sairaalasi kasveista viimeiset 12 kuukautta.", "Sinulle on myönnetty Viherpeukalo-kunniamainnita, koska kasveiltasi ei ole puuttunut vettä eikä hoitoa viime vuonna.", }, }, sold_drinks = { awards = { }, trophies = { "Kansainvälinen automaattiyhdistys on ylpeä voidessaan antaa sinulle kunniamaininnan sairaalassasi viime vuonna myytyjen virvoitusjuomien suuresta määrästä.", "Sairaalallesi on myönnetty Ravistetut tölkit -kunniamaininta viime vuoden aikana myytyjen virvoitusjuomatölkkien määrästä.", "Suomen hammaspaikat Oy on myöntänyt sinulle kunniamaininnan, koska sairaalasi on ansiokkaasti edistänyt virvoitusjuomien myyntiä viime vuonna.", }, }, } -- Casebook screen casebook = { reputation = "maine", treatment_charge = "hoidon hinta", earned_money = "tulot yhteensä", cured = "parannettuja", deaths = "kuolleita", sent_home = "kotiin lähetettyjä", research = "kohdista tutkimusta", cure = "hoito", cure_desc = { build_room = "Tarvitset huoneen: %s", -- %s (room name) build_ward = "Tarvitset nopeasti vuodeosaston.", hire_doctors = "Tarvitset lisää lääkäreitä.", hire_surgeons = "Tarvitset lisää kirurgeja.", hire_psychiatrists = "Tarvitset lisää psykologeja.", hire_nurses = "Tarvitset lisää sairaanhoitajia.", no_cure_known = "Ei tunnettuja hoitoja.", cure_known = "Hoito tunnetaan.", improve_cure = "Parannettu hoito", }, } -- Tooltips tooltip = { -- Build room window build_room_window = { room_classes = { diagnosis = "Valitse diagnoosihuone", treatment = "Valitse yleinen hoitohuone", clinic = "Valitse erityisklinikka", facilities = "Valitse laitokset", }, cost = "Kustannukset nykyisestä huoneesta", close = "Keskeytä toiminto ja palaa peliin", }, -- Toolbar toolbar = { bank_button = "Vasen klikkaus: pankinjohtaja, oikea klikkaus: tiliote", balance = "Tilin saldo", reputation = "Maine:", -- NB: no %d! Append " ([reputation])". date = "Päivä", rooms = "Rakenna huone", objects = "Osta kalusteita", edit = "Muuta huonetta/kalusteita", hire = "Palkkaa henkilökuntaa", staff_list = "Henkilökuntaluettelo", town_map = "Kartta", casebook = "Hoitokirja", research = "Tutkimus", status = "Tilanne", charts = "Kuvaajat", policy = "Sairaalan käytännöt", }, -- Hire staff window hire_staff_window = { doctors = "Näytä työtä etsivät lääkärit", nurses = "Näytä työtä etsivät sairaanhoitajat", handymen = "Näytä työtä etsivät huoltomiehet", receptionists = "Näytä työtä etsivät vastaanottoapulaiset", prev_person = "Näytä edellinen", next_person = "Näytä seuraava", hire = "Palkkaa", cancel = "Peruuta", doctor_seniority = "Kokemus (Harjoittelija, Tohtori, Konsultti)", staff_ability = "Kyvyt", salary = "Palkkavaatimus", qualifications = "Erikoistumisalat", surgeon = "Kirurgi", psychiatrist = "Psykiatri", researcher = "Tutkija", }, -- Buy objects window buy_objects_window = { price = "Kalusteen hinta", total_value = "Ostettujen kalusteiden kokonaisarvo", confirm = "Osta kaluste(et)", cancel = "Peruuta", increase = "Kasvata valitun kalusteen ostetavaa määrää", decrease = "Pienennä valitun kalusteen ostettavaa määrää", }, -- Staff list staff_list = { doctors = "Näytä katsaus lääkäreistäsi", nurses = "Näytä katsaus sairaanhoitajistasi", handymen = "Näytä katsaus huoltomiehistäsi", receptionists = "Näytä katsaus vastaanottoapulaisistasi", happiness = "Näyttää, kuinka tyytyväisiä työntekijäsi ovat", tiredness = "Näyttää, kuinka väsyneitä työntekijäsi ovat", ability = "Näyttää työntekijöidesi kyvyt", salary = "Työntekijälle maksettava palkka", happiness_2 = "Työntekijän tyytyväisyys", tiredness_2 = "Työntekijän väsymys", ability_2 = "Työntekijän kyvyt", prev_person = "Näytä edellinen sivu", next_person = "Näytä seuraava sivu", bonus = "Anna työntekijälle 10%:n bonus", sack = "Anna työntekijälle potkut", pay_rise = "Nosta työntekijän palkkaa 10%", close = "Sulje ikkuna", doctor_seniority = "Lääkärin kokemus", detail = "Yksityiskohtien huomioimiskyky", view_staff = "Näytä työntekijä", surgeon = "Erikoistunut kirurgiaan", psychiatrist = "Erikoistunut psykiatriaan", researcher = "Erikoistunut tutkimukseen", surgeon_train = "%d%% suoritettu kirurgiaan erikoistumisesta", -- %d (percentage trained) psychiatrist_train = "%d%% suoritettu psykiatriaan erikoistumisesta", -- %d (percentage trained) researcher_train = "%d%% suoritettu tutkimukseen erikoistumisesta", -- %d (percentage trained) skills = "Taidot", }, -- Queue window queue_window = { num_in_queue = "Jonottavien potilaiden määrä", num_expected = "Vastaanotosta jonoon pian saapuvien potilaiden määrä", num_entered = "Tässä huoneessa tähän mennessä hoidettujen potilaiden kokonaismäärä", max_queue_size = "Vastaanotosta jonoon päästettävien potilaiden enimmäismäärä", dec_queue_size = "Pienennä jonoon päästettävien potilaiden enimmäismäärää", inc_queue_size = "Kasvata jonoon päästettävien potilaiden enimmäismäärää", front_of_queue = "Vedä potilas tähän asettaaksesi hänet jonon ensimmäiseksi", end_of_queue = "Vedä potilas tähän asettaaksesi hänet jonon viimeiseksi", close = "Sulje ikkuna", patient = "Siirrä potilasta jonossa vetämällä. Klikkaa oikealla lähettääksesi potilas kotiin, vastaanottoon tai kilpailevaan sairaalaan", patient_dropdown = { reception = "Lähetä potilas vastaanottoon", send_home = "Lähetä potilas kotiin", hospital_1 = "Lähetä potilas toiseen sairaalaan", hospital_2 = "Lähetä potilas toiseen sairaalaan", hospital_3 = "Lähetä potilas toiseen sairaalaan", }, }, -- Main menu main_menu = { new_game = "Aloita uusi peli", load_game = "Lataa aiemmin tallennettu peli", continue = "Jatka edellistä peliä", network = "Aloita verkkopeli", quit = "Lopeta", load_menu = { load_slot = " PELI ", -- NB: no %d! Append " [slotnumber]". empty_slot = " TYHJÄ ", }, }, -- Window general window_general = { cancel = "Peruuta", confirm = "Vahvista", }, -- Information dialog information = { close = "Sulje tiedoteikkuna", }, -- Patient window patient_window = { close = "Sulje ikkuna", graph = "Klikkaa vaihtaaksesi potilaan terveyskuvaajan ja hoitohistorian välillä", happiness = "Potilaan tyytyväisyys", thirst = "Potilaan jano", warmth = "Potilaan lämpötila", casebook = "Näytä lisätietoja potilaan sairaudesta", send_home = "Lähetä potilas kotiin sairaalasta", center_view = "Keskitä näkymä potilaaseen", abort_diagnosis = "Lähetä potilas suoraan hoitoon ennen diagnoosin valmistumista", queue = "Näytä jono, jossa potilas on", }, -- window staff_window = { name = "Työntekijän nimi", close = "Sulje ikkuna", face = "Työntekijän kuva - avaa henkilökuntaluettelo klikkaamalla", happiness = "Tyytyväisyys", tiredness = "Väsymys", ability = "Kyvyt", doctor_seniority = "Kokemus (Harjoittelija, Tohtori, Konsultti)", skills = "Erikoistuminen", surgeon = "Kirurgi", psychiatrist = "Psykiatri", researcher = "Tutkija", salary = "Kuukausipalkka", center_view = "Keskitä näkymä työntekijään klikkaamalla vasemmalla, selaa työntekijöitä klikkaamalla oikealla", sack = "Anna potkut", pick_up = "Poimi työntekijä", }, -- Machine window machine_window = { name = "Koneen nimi", close = "Sulje ikkuna", times_used = "Käyttökertojen määrä", status = "Koneen tila", repair = "Kutsu huoltomies huoltamaan kone", replace = "Korvaa kone uudella", }, -- Handyman window -- Apparently handymen have their own set of strings (partly) containing "handyman". -- We could just get rid of this category and include the three prios into staff_window. handyman_window = { ability = "Kyvyt", center_view = "Keskitä näkymä huoltomieheen", -- contains "handyman" close = "Sulje ikkuna", face = "Huoltomiehen kuva", -- contains "handyman" happiness = "Tyytyväisyys", name = "Huoltomiehen nimi", -- contains "handyman" parcel_select = "Alue, jolla huoltomies hoitaa tehtäviään. Klikkaa vaihtaaksesi asetusta", pick_up = "Poimi huoltomies", prio_litter = "Pyydä huoltomiestä keskittymään lattioiden siivoamiseen", -- contains "handyman" prio_plants = "Pyydä huoltomiestä keskittymään kasvien kastelemiseen", -- contains "handyman" prio_machines = "Pyydä huoltomiestä keskittymään koneiden huoltamiseen", -- contains "handyman" sack = "Anna potkut", salary = "Kuukausipalkka", tiredness = "Väsymys", }, -- Place objects window place_objects_window = { cancel = "Peruuta", buy_sell = "Osta/Myy kalusteita", pick_up = "Poimi kaluste", confirm = "Vahvista", }, -- Casebook casebook = { up = "Vieritä ylös", down = "Vieritä alas", close = "Sulje hoitokirja", reputation = "Hoito- ja diagnoosimaine lähialueella", treatment_charge = "Hoidon hinta", earned_money = "Tähän mennessä ansaittu rahasumma", cured = "Parannettujen potilaiden määrä", deaths = "Hoidon seurauksena kuolleiden potilaiden määrä", sent_home = "Kotiin lähetettyjen potilaiden määrä", decrease = "Laske hintaa", increase = "Nosta hintaa", research = "Klikkaa käyttääksesi tutkimusbudjettia taudin tutkimukseen ja sen hoitoon erikoistumiseen", cure_type = { drug = "Tämä tauti vaatii lääkitystä", drug_percentage = "Tämä tauti vaatii lääkitystä - sinun lääkkeesi tehokkuus on %d%%", -- %d (effectiveness percentage) psychiatrist = "Tämä tauti vaatii psykiatrin hoitoa", surgery = "Tämä tauti vaatii leikkauksen", machine = "Tämä tauti vaatii erikoislaitteen", }, cure_requirement = { possible = "Voit hoitaa potilaan terveeksi", research_machine = "Sinun täytyy kehittää erikoislaite hoitaaksesi sairautta", build_room = "Sinun täytyy rakentaa hoitohuone hoitaaksesi sairautta", hire_surgeons = "Tarvitset kaksi kirurgia hoitaaksesi sairautta", -- unused hire_surgeon = "Tarvitset yhden kirurgin hoitaaksesi sairautta", -- unused hire_staff_old = "Sinun täytyy palkata %s hoitaaksesi sairautta", -- %s (staff type), unused. Use hire_staff instead. build_ward = "Sinun täytyy rakentaa vuodeosasto hoitaaksesi sairautta", -- unused ward_hire_nurse = "Tarvitset sairaanhoitajan vuodeosastollesi hoitaaksesi sairautta", -- unused not_possible = "Et voi vielä hoitaa sairautta", -- unused }, }, -- Statement statement = { close = "Sulje tiliote", }, -- Research research = { close = "Poistu tutkimusosastolta", cure_dec = "Laske hoitotutkimuksen tärkeysastetta", diagnosis_dec = "Laske diagnoositutkimuksen tärkeysastetta", drugs_dec = "Laske lääketutkimuksen tärkeysastetta", improvements_dec = "Laske laitteistotutkimuksen tärkeysastetta", specialisation_dec = "Laske erikoistumistutkimuksen tärkeysastetta", cure_inc = "Nosta hoitotutkimuksen tärkeysastetta", diagnosis_inc = "Nosta diagnoositutkimuksen tärkeysastetta", drugs_inc = "Nosta lääketutkimuksen tärkeysastetta", improvements_inc = "Nosta laitteistotutkimuksen tärkeysastetta", specialisation_inc = "Nosta erikoistumistutkimuksen tärkeysastetta", allocated_amount = "Tutkimukseen suunnattu rahoitus", }, -- Graphs graphs = { close = "Sulje kuvaajaikkuna", scale = "Skaalaa diagrammia", money_in = "Näytä/Piilota tulot", money_out = "Näytä/Piilota menot", wages = "Näytä/Piilota palkat", balance = "Näytä/Piilota tilin saldo", visitors = "Näytä/Piilota potilaat", cures = "Näytä/Piilota parannetut", deaths = "Näytä/Piilota kuolleet", reputation = "Näytä/Piilota maine", }, -- Town map town_map = { people = "Näytä/Piilota ihmiset", plants = "Näytä/Piilota kasvit", fire_extinguishers = "Näytä/Piilota vaahtosammuttimet", objects = "Näytä/Piilota kalusteet", radiators = "Näytä/Piilota lämpöpatterit", heat_level = "Lämpötila", heat_inc = "Nosta lämpötilaa", heat_dec = "Laske lämpötilaa", heating_bill = "Lämmityskustannukset", balance = "Tilin saldo", close = "Sulje kartta", }, -- Jukebox. jukebox = { current_title = "Jukeboksi", close = "Sulje jukeboksi-ikkuna", play = "Käynnistä jukeboksi", rewind = "Kelaa jukeboksia taakse", fast_forward = "Kelaa jukeboksia eteen", stop = "Pysäytä jukeboksi", loop = "Toista jukeboksia silmukassa", }, -- Bank Manager bank_manager = { hospital_value = "Sairaalasi tämänhetkinen arvo", balance = "Pankkitilisi saldo", current_loan = "Pankkilainan määrä", repay_5000 = "Maksa pankille 5000 takaisin", borrow_5000 = "Lainaa pankilta 5000 lisää", interest_payment = "Kuukausittaiset korkokustannukset", inflation_rate = "Vuotuinen inflaatio", interest_rate = "Vuotuinen korko", close = "Poistu pankista", insurance_owed = "Määrä, jonka %s on sinulle velkaa", -- %s (name of debitor) show_graph = "Näytä velallisen %s maksusuunnitelma", -- %s (name of debitor) graph = "Velallisen %s maksusuunnitelma", -- %s (name of debitor) graph_return = "Palaa edelliseen näyttöön", }, -- Status status = { win_progress_own = "Näytä pelaajan edistyminen tämän tason vaatimusten suhteen", win_progress_other = "Näytä kilpailijan %s edistyminen tämän tason vaatimusten suhteen", -- %s (name of competitor) population_chart = "Kuvaaja, joka näyttää kuinka suuri osa paikallisesta väestöstä hakeutuu mihinkin sairaalaan hoidettavaksi", happiness = "Kaikkien sairaalassasi olevien keskimääräinen tyytyväisyys", thirst = "Kaikkien sairaalassasi olevien keskimääräinen janoisuus", warmth = "Kaikkien sairaalassasi olevien keskimääräinen lämpötila", close = "Sulje tilanneikkuna", reputation = "Maineesi pitää olla vähintään %d. Tällä hetkellä se on %d", -- %d (target reputation) %d (current reputation) balance = "Sinulla tulee olla rahaa tililläsi vähintää %d$. Tällä hetkellä sitä on %d$", -- %d (target balance) %d (current balance) population = "%d%% alueen väestöstä pitää kuulua asiakaskuntaasi", num_cured = "Tavoitteenasi on parantaa %d ihmistä. Tähän mennessä olet parantanut %d", percentage_killed = "Tavoitteenasi on tappaa vähemmän kuin %d%% potilaistasi. Tähän mennessä olet tappanut %d%% heistä", value = "Sairaalasi arvon tulee olla vähintään $%d. Nyt se on $%d", percentage_cured = "Sinun pitää parantaa %d%% sairaalaasi saapuneista potilaista. Tähän mennessä olet parantanut %d%% heistä", }, -- Policy policy = { close = "Sulje käytännöt-ikkuna", staff_leave = "Klikkaa tästä asettaaksesi henkilökunnan liikkumaan vapaasti huoneiden välillä ja auttamaan kollegojaan tarvittaessa", staff_stay = "Klikkaa tästä asettaaksesi henkilökunnan pysymään huoneissa, joihin olet heidät asettanut", diag_procedure = "Jos lääkärin diagnoosi on epävarmempi kuin LÄHETÄ KOTIIN-prosentti, lähetetään potilas kotiin. Jos diagnoosi on varmempi kuin ANNA HOITO-prosentti, lähetetään potilas suoraan hoitoon", diag_termination = "Potilaan diagnoosia jatketaan, kunnes lääkärit ovat yhtä varmoja kuin KESKEYTÄ PROSESSI-prosentti tai kaikkia diagnoosikoneita on kokeiltu", staff_rest = "Kuinka väsynyttä henkilöstön pitää olla ennen kuin he saavat levätä", }, -- Pay rise window pay_rise_window = { accept = "Myönny vaatimuksiin", decline = "Kieltäydy vaatimuksista - Anna lopputili sen sijaan", }, -- Watch watch = { hospital_opening = "Rakennusaika: sinulla on tämän verran aikaa jäljellä ennen kuin sairaala avataan potilaille. Paina vihreää AVAA-nappia avataksesi sairaalasi välittömästi.", emergency = "Hätätilanne: Akuuttien potilaiden parantamiseen jäljellä oleva aika.", epidemic = "Epidemia: Epidemian taltuttamiseen jäljellä oleva aika. Kun aika kuluu loppuun TAI tartunnan saanut potilas poistuu sairaalasta, terveystarkastaja saapuu vierailulle. Paina nappia aloittaaksesi ja lopettaaksesi rokotukset. Klikkaa potilaita kutsuaksesi sairaanhoitajan rokottamaan heidät.", }, -- Rooms rooms = { gps_office = "Potilaat tutkitaan ja diagnosoidaan alustavasti yleislääkärin toimistossa.", psychiatry = "Psykiatrin vastaanotolla hoidetaan mielenhäiriöistä kärsiviä potilaita ja autetaan diagnosoinnissa. Vaatii psykiatriaan erikoistuneen lääkärin", ward = "Vuodeosasto on hyödyllinen sekä diagnosoinnissa että hoidossa. Potilaita lähetetään tänne tarkkailtavaksi ja toipumaan leikkauksen jälkeen. Vaatii sairaanhoitajan", operating_theatre = "Leikkaussalissa tarvitaan kaksi kirurgiaan erikoistunutta lääkäriä", pharmacy = "Apteekissa sairaanhoitaja jakaa lääkkeitä niitä tarvitseville potilaille", cardiogram = "Lääkäri tutkii potilaiden sydänkäyriä kardiogrammin avulla ja diagnosoi sydäntauteja", scanner = "Lääkäri käyttää magneettikuvausta potilaiden diagnosoimiseen", ultrascan = "Lääkäri käyttää ultraääntä potilaiden diagnosoimiseen", blood_machine = "Lääkäri käyttää verikonetta potilaiden veren tutkimiseen ja diagnosoimiseen", x_ray = "Lääkäri kuvaa röntgenillä potilaiden luut ja tekee niiden perusteella diagnooseja", inflation = "Lääkäri käyttää pumppauskonetta pallopäisyyttä sairastavien potilaiden hoitoon", dna_fixer = "Lääkäri käyttää DNA-konetta alienin DNA:sta kärsivien potilaiden hoidossa", hair_restoration = "Lääkäri käyttää hiustenpalautinta kaljuuntumisesta kärsivien potilaiden hoitoon", tongue_clinic = "Kieliklinikalla lääkäri hoitaa potilaita, joilla on löyhä kieli", fracture_clinic = "Murtumaklinikkalla sairaanhoitaja korjaa potilaiden murtumia", training_room = "Konsultointiin erikoistunut lääkäri pitää luentoja koulutushuoneessa ja opettaa muita lääkäreitä", electrolysis = "Elektrolyysiklinikkalla lääkäri hoitaa turkinkasvua sairastavia potilaita", jelly_vat = "Lääkäri käyttää hyytelömuovainta hyytelöitymisestä kärsivien potilaiden parantamiseen", staffroom = "Lääkärit, sairaanhoitajat ja huoltomiehet käyttävät taukohuonetta lepäämiseen ja mielialansa parantamiseen", -- rehabilitation = S[33][27], -- unused general_diag = "Lääkäri suorittaa täällä perusdiagnoosin yleislääkärillä vierailleille potilaille. Halpa ja monien sairauksien diagnosointiin varsin tehokas huone", research_room = "Tutkimukseen erikoistunut lääkäri voi kehittää täällä uusia lääkkeitä ja koneita sairauksien parantamiseksi", toilets = "Rakenna käymälä, jotta potilaat eivät sotke sairaalaasi!", decontamination = "Säteilyklinikalla lääkäri hoitaa vakavasta säteilystä kärsiviä potilaita", }, -- Objects objects = { -- NB: most objects do not have a tooltip because they're not (extra-)buyable desk = "Pöytä: Lääkäri voi käyttää pöydällä tietokonettaan.", cabinet = "Arkistokaappi: Pitää sisällään potilastietoja, muistiinpanoja ja tutkimusaineistoa.", door = "Ovi: Ihmiset avaavat ja sulkevat tätä vähän väliä.", bench = "Penkki: Tarjoaa potilaille istumapaikan ja tekee odottamisesta mukavampaa.", table1 = S[40][ 6], -- unused chair = "Tuoli: Potilaat istuvat tässä ja kertovat ongelmistaan ja oireistaan.", drinks_machine = "Juoma-automaatti: Pitää potilaiden janon kurissa ja tuottaa tuloja sairaalalle.", bed = "Sänky: Vakavasti sairaat potilaat makaavat näissä.", inflator = "Pumppauskone: Parantaa potilaat, jotka sairastavat pallopäisyyttä.", pool_table = "Biljardipöytä: Auttaa henkilökuntaasi rentoutumaan.", reception_desk = "Vastaanotto: Vaatii vastaanottoapulaisen, joka opastaa potilaita eteenpäin.", table2 = S[40][13], -- unused & duplicate cardio = S[40][14], -- no description scanner = S[40][15], -- no description console = S[40][16], -- no description screen = S[40][17], -- no description litter_bomb = "Roskapommi: Sabotoi kilpailijan sairaalaa", couch = S[40][19], -- no description sofa = "Sohva: Työntekijät, jotka ovat taukohuoneessa, istuvat paikallaan sohvalla kuin parempaa rentoutumistapaa ei olisikaan.", crash_trolley = S[40][21], -- no description tv = "TV: Harmi, ettei henkilökunnallasi ole yleensä aikaa katsoa lempiohjelmaansa loppuun.", ultrascanner = S[40][23], -- no description dna_fixer = S[40][24], -- no description cast_remover = S[40][25], -- no description hair_restorer = S[40][26], -- no description slicer = S[40][27], -- no description x_ray = S[40][28], -- no description radiation_shield = S[40][29], -- no description x_ray_viewer = S[40][30], -- no description operating_table = S[40][31], -- no description lamp = S[40][32], -- unused toilet_sink = "Pesuallas: Hygieniariippuvaiset potilaasi voivat pestä likaantuneet kätensä tässä. Jos altaita ei ole riittävästi, he tulevat tyytymättömiksi.", op_sink1 = S[40][34], -- no description op_sink2 = S[40][35], -- no description surgeon_screen = S[40][36], -- no description lecture_chair = "Luentotuoli: Lääkäriopiskelijasi istuvat tässä ja tuhertavat innokkaasti muistiinpanoja. Mitä enemmän tuoleja luokassa on sitä enemmän opiskelijoita sinne mahtuu.", projector = S[40][38], -- no description bed2 = S[40][39], -- unused duplicate pharmacy_cabinet = "Lääkekaappi: Lääkevalikoimasi löytyy täältä.", computer = "Tietokone: Nerokas tiedonlähde", atom_analyser = "Atomianalysaattori: Sijoitettuna tutkimusosastolle tämä nopeuttaa koko tutkimusprosessia.", blood_machine = S[40][43], -- no description fire_extinguisher = "Vaahtosammutin: Minimoi vaaran, jonka laitteiden vikaantuminen voi aiheuttaa.", radiator = "Lämpöpatteri: Pitää huolta, ettei sairaalassasi pääse tulemaan kylmä.", plant = "Kasvi: Pitää potilaiden mielialan korkealla ja puhdistaa ilmaa.", electrolyser = S[40][47], -- no description jelly_moulder = S[40][48], -- no description gates_of_hell = S[40][49], -- no description bed3 = S[40][50], -- unused duplicate bin = "Roskakori: Potilaat heittävät roskansa tänne.", toilet = "Eriö: Potilaat, öh... tekevät tarpeensa tänne.", swing_door1 = S[40][53], -- no description swing_door2 = S[40][54], -- no description shower = S[40][55], -- no description auto_autopsy = "Ruumiinavauskone: Mahtava apuväline uusien hoitomenetelmien kehittämisessä.", bookcase = "Kirjahylly: Referenssimateriaalia lääkärille.", video_game = "Videopeli: Anna henkilökuntasi rentoutua Hi-Octane-pelin parissa.", entrance_left = S[40][59], -- no description entrance_right = S[40][60], -- no description skeleton = "Luuranko: Käytetään opetuksessa ja Halloween-koristeena.", comfortable_chair = S[40][62], -- no description }, } -- 32. Adviser adviser = { -- Tutorial tutorial = { start_tutorial = "Lue tason kuvaus ja klikkaa hiiren vasemmalla painikkeella aloittaaksesi esittelyn.", build_reception = "Hei! Ensimmäisenä sairaalasi tarvitsee vastaanoton. Löydät sen osta kalusteita -valikosta.", order_one_reception = "Klikkaa hiiren vasemmalla painikkeella kerran vilkkuvaa aluetta valitaksesi yhden vastaanoton.", accept_purchase = "Klikkaa nyt vilkkuvaa aluetta ostaaksesi valitsemasi kalusteet.", rotate_and_place_reception = "Klikkaa hiiren oikeaa painikketta pyörittääksesi vastaanotto haluamaasi suuntaan ja klikkaa vasemalla asettaaksesi se paikalleen.", reception_invalid_position = "Vastaanotto näkyy harmaana, koska sitä ei voida sijoittaa tähän. Kokeile siirtää tai pyörittää sitä.", hire_receptionist = "Nyt tarvitset vastaanottoapulaisen ottamaan potilaasi vastaan ja ohjaamaan heidät oikeisiin huoneisiin.", select_receptionists = "Klikkaa vilkkuvaa ikonia käydäksesi läpi saatavilla olevia vastaanottoapulaisia. Ikonissa näkyvä numero kertoo saatavilla olevien apulaisten määrän.", next_receptionist = "Tämä on listan ensimmäinen vastaanottoapulainen. Klikkaa vilkkuvaa ikonia nähdäksesi seuraavan henkilön.", prev_receptionist = "Klikkaa vilkkuvaa ikonia nähdäksesi edellisen henkilön.", choose_receptionist = "Valitse vastaanottoapulainen, jolla on hyvät taidot ja hyväksyttävä palkkavaatimus. Klikkaa vilkkuvaa ikonia palkataksesi hänet.", place_receptionist = "Poimi vastaanottoapulainen ja aseta hänet minne tahansa sairaalassasi. Hän löytää kyllä rakentamaasi vastaanottoon omin avuin.", receptionist_invalid_position = "Et voi asettaa työntekijääsi tähän. Kokeile asettaa hänet sairaalan sisälle paikkaan, jossa on tyhjää lattiaa.", window_in_invalid_position = "Ikkuna ei sovi tähän. Ole hyvä ja yritä asettaa se toiseen kohtaan seinällä.", choose_doctor = "Käy läpi kaikkien lääkäreiden taidot ja palkkavaatimukset ennen kuin päätät kenet haluat palkata.", click_and_drag_to_build = "Rakentaaksesi yleislääkärin toimiston sinun pitää ensin päättää kuinka suuri siitä tulee. Pidä hiiren vasen nappi pohjassa ja vedä hiirtä muuttaaksesi huoneen kokoa.", build_gps_office = "Jotta voit alkaa diagnosoida potilaita, sinun pitää rakentaa yleislääkärin toimisto.", door_in_invalid_position = "Hupsista! Yritit sijoittaa oven epäsopivaan paikkaan. Kokeile jotain toista kohtaa pohjapiirrustuksen seinässä.", confirm_room = "Klikkaa hiiren vasemmalla painikkeella vilkkuvaa ikonia, kun huone on valmis tai klikkaa X:ää palataksesi edelliseen vaiheeseen.", select_diagnosis_rooms = "Klikkaa hiiren vasemmalla painikkeella vilkkuvaa ikonia nähdäksesi listan diagnoosihuoneista, joita voit rakentaa.", hire_doctor = "Tarvitset lääkärin tutkimaan ja hoitamaan potilaita.", select_doctors = "Klikkaa hiiren vasemmalla painikkeella vilkkuvaa ikonia nähdäksesi lääkärit, jotka ovat saatavilla työmarkkinoilla.", place_windows = "Aseta ikkunat paikalleen samaan tapaan kuin asetit oven. Sinun ei ole pakko rakentaa ikkunoita, mutta työntekijäsi eivät pitäisi siitä lainkaan.", place_doctor = "Aseta lääkäri minne tahansa sairaalassasi. Hän menee yleislääkärin toimistoon heti, kun joku tarvitsee hoitoa.", room_in_invalid_position = "Hups! Tämä pohjapiirrustus ei kelpaa: punaiset alueet näyttävät, missä kohdin suunnitelmasi menee toisen huoneen päälle tai sairaalan ulkoseinien läpi.", doctor_in_invalid_position = "Hei! Et voi laittaa lääkäriä tähän. Koeta sijoittaa hänet tyhjälle lattia-alueelle.", place_objects = "Klikkaa hiiren oikeaa painikketta pyörittääksesi kalusteita ja vasenta asettaaksesi ne paikalleen.", room_too_small = "Tämä pohjapiirrustus näkyy punaisena, koska se on liian pieni. Vedä hiirtä pidempi matka saadaksesi suurempi huone.", click_gps_office = "Klikkaa hiiren vasemmalla painikkeella vilkkuvaa aluetta valitaksesi yleislääkärin toimiston.", room_too_small_and_invalid = "Pohjapiirrustus on liian pieni ja väärin aseteltu. Kokeile uudestaan.", object_in_invalid_position = "Tämä kaluste on väärin asetettu. Ole hyvä ja sijoita se toiseen paikkaan tai pyöritä sitä saadaksesi se sopimaan.", place_door = "Siirrä hiiri pohjapiirrustuksen reunalle asettaaksesi ovi haluamaasi paikkaan.", room_big_enough = "Pohjapiirrustus on riittävän suuri. Kun päästät hiiren painikkeen, asetat sen paikalleen. Voit halutessasi jatkaa sen muokkaamista.", build_pharmacy = "Onnittelut! Seuraavaksi kannattaa rakentaa Apteekki ja palkata sairaanhoitaja, jotta sairaalasi on täysin toimintavalmis.", information_window = "Tiedoteikkunassa kerrotaan lisätietoja juuri rakentamastasi yleislääkärin toimistosta.", }, -- Epidemic epidemic = { hurry_up = "Jos et ota nopeasti epidemiaa hallintaasi, siitä seuraa suuria ongelmia. Kiirehdi!", serious_warning = "Tartuntatauti leviää sairaalassasi ja alkaa muodostua vakavaksi ongelmaksi. Sinun on tehtävä jotain ja pian!", multiple_epidemies = "Sinulla näyttää olevan useampi kuin yksi epidemia riesanasi. Tästä voi seurata pahaa jälkeä, joten nyt on tulenpalava kiire.", }, -- Staff advice staff_advice = { need_handyman_machines = "Sinun täytyy palkata huoltomiehiä, jos haluat koneidesi pysyvän kunnossa.", need_doctors = "Tarvitset useita lääkäreitä. Kokeile siirtää parhaat lääkärisi huoneisiin, joihin on pisin jono.", need_handyman_plants = "Sinun täytyy palkata huoltomies kastelemaan kasvejasi, etteivät ne kuole.", need_handyman_litter = "Ihmiset valittavat, että sairaalasi muistuttaa kaatopaikkaa. Palkkaa huoltomies siivoamaan potilaidesi sotkut.", need_nurses = "Tarvitset useita sairaanhoitajia. Vuodeosastoa ja apteekkia voivat hoitaa vain sairaanhoitajat.", too_many_doctors = "Sairaalassasi on liikaa lääkäreitä. Osalla heistä ei ole mitään tekemistä.", too_many_nurses = "Uskoisin, että sinulla on liikaa sairaanhoitajia palkkalistoillasi.", }, -- Earthquake earthquake = { damage = "Maanjäristys on vioittanut %d laitetta ja %d potilasta on loukkaantunut sairaalassasi.", -- %d (count machines), &d (count patients) alert = "Maanjäristysvaroitus. Maanjäristys vahingoittaa laitteitasi ja ne voivat lakata toimimasta kokonaan, jos niitä ei ole huollettu kunnolla.", ended = "Huh. Se tuntui voimakkaalta järistykseltä - magnitudiksi mitattiin %d Richterin asteikolla.", }, -- Multiplayer multiplayer = { objective_completed = "Olet saavuttanut kaikki tämän tason tavoitteet. Onnittelut!", everyone_failed = "Kukaan ei ole saavuttanut asetettuja tavoitteita. Kaikki saavat siis jatkaa yrittämistä!", players_failed = "Seuraavat pelaajat eivät ole saavuttaneet asetettuja tavoitteita: ", objective_failed = "Et ole onnistunut saavuttamaan tämän tason tavoitteita.", poaching = { in_progress = "Yritän tiedustella josko tämä henkilö olisi kiinnostunut siirtymään palvelukseesi.", not_interested = "Hah! Häntä ei kiinnosta tulla töihin sinulle - hänellä on kaikki hyvin nykyisissä työpaikassaan.", already_poached_by_someone = "Turha haaveilla! Joku muu yrittää jo parhaillaan viedä tätä työntekijää.", }, }, -- Surgery requirements surgery_requirements = { need_surgeons_ward_op = "Tarvitset kaksi kirurgia ja vuodeosaston leikkaussalin lisäksi voidaksesi suorittaa kirurgisia toimenpiteitä.", need_surgeon_ward = "Tarvitset vuodeosaston ja yhden kirurgin lisää voidaksesi suorittaa kirurgisia toimenpiteitä.", }, -- Vomit wave vomit_wave = { started = "Sairaalaasi näyttää levinneen oksennustautia aiheuttava virus. Jos olisit palkannut lisää huoltomiehiä pitämään paikat puhtaina, näin ei olisi päässyt käymään.", ended = "Huh! Viruksen aiheuttama oksennustauti on saatu kuriin. Pidä sairaalasi puhtaampana jatkossa.", }, -- Level progress level_progress = { nearly_won = "Olet miltei saavuttanut tämän tason tavoitteet.", three_quarters_lost = "Vain yksi neljännes erottaa sinut lopullisesta tappiosta.", halfway_won = "Olet jo puolittain voittanut tämän tason.", halfway_lost = "Toinen jalkasi on jo haudassa tavotteiden suhteen.", nearly_lost = "Tappiosi on viimeistä naulaa vaille valmis.", three_quarters_won = "Vain yksi neljännes tavoitteista on enää suorittamatta.", }, -- Staff place advice staff_place_advice = { receptionists_only_at_desk = "Vain vastaanottoapulaiset voivat työskennellä vastaanotossa.", only_psychiatrists = "Vain psykiatriaan erikoistuneet lääkärit voivat työskennellä psykiatrin vastaanotolla.", only_surgeons = "Vain kirurgiaan erikoistuneet lääkärit voivat työskennellä leikkaussalissa.", only_nurses_in_room = "%s sopii ainoastaan sairaanhoitajan hoidettavaksi.", only_doctors_in_room = "%s sopii ainoastaan lääkärin hoidettavaksi.", only_researchers = "Vain tutkimukseen erikoistuneet lääkärit voivat työskennellä tutkimusosastolla.", nurses_cannot_work_in_room = "%s ei sovellu sairaanhoitajan hoidettavaksi.", doctors_cannot_work_in_room = "%s ei sovellu lääkärin hoidettavaksi.", }, -- Research research = { machine_improved = "Kehittyneempi %s on valmistunut tutkimusosastollasi.", autopsy_discovered_rep_loss = "Tieto automaattisesta ruumiinavauskoneestasi on vuotanut julkisuuteen. Ihmisiltä on odotettavissa negatiivinen reaktio.", drug_fully_researched = "Lääkkeen %s kehitystyö on saatu päätökseen.", new_machine_researched = "Uusi %s on saatu kehitettyä.", drug_improved = "Kehittyneempi %s-lääke on valmistunut tutkimusosastollasi.", new_available = "Uusi %s on nyt saatavilla.", new_drug_researched = "Sairauteen %s on kehitetty uusi lääke.", }, -- Boiler issue boiler_issue = { minimum_heat = "Keskuslämmitys on sanonut työsopimuksensa irti. Vaikuttaisi siltä, että sairaalassasi oleville ihmisille tulee pian jäiset oltavat.", maximum_heat = "Kellarissa oleva lämmitysuuni on hajonnut. Uuni on jumiutunut täydelle teholle ja ihmiset sulavat sairaalassasi! Sijoita runsaasti juoma-automaatteja kaikkialle.", resolved = "Hyviä uutisia. Keskuslämmitys toimii taas niin kuin pitääkin. Lämpötilan ei enää pitäisi vaivata potilaita eikä henkilökuntaa.", }, -- Competitors competitors = { staff_poached = "Yksi työntekijöistäsi on palkattu kilpailevaan sairaalaan.", hospital_opened = "Kilpaileva sairaala on avattu lähellä aluetta %s.", land_purchased = "%s on ostanut itselleen tontin.", }, -- Room requirements room_requirements = { research_room_need_researcher = "Sinun täytyy palkata tutkimukseen erikoistunut lääkäri ennen kuin voit ottaa tutkimusosaston käyttöön.", op_need_another_surgeon = "Tarvitset vielä yhden kirurgin lisää ennen kuin voit ottaa leikkaussalin käyttöön.", op_need_ward = "Sinun täytyy rakentaa vuodeosasto, jotta voit valvoa leikkauksessa käyneiden potilaiden paranemista.", reception_need_receptionist = "Sinun täytyy palkata vastaanottoapulainen ottamaan potilaat vastaan sairaalaasi.", psychiatry_need_psychiatrist = "Sinun täytyy palkata psykiatriaan erikoistunut lääkäri nyt, kun olet rakentanut psykiatrin vastaanoton.", pharmacy_need_nurse = "Tarvitset sairaanhoitajan huolehtimaan apteekistasi.", ward_need_nurse = "Sinun täytyy palkata sairaanhoitaja työskentelemään vuodeosastolla.", op_need_two_surgeons = "Sinun täytyy palkata kaksi kirurgia, jotta voit suorittaa kirurgisia toimenpiteitä leikkaussalissasi.", training_room_need_consultant = "Tarvitset konsultti-lääkärin opettamaan nuorempia lääkäreitäsi koulutushuoneessa.", gps_office_need_doctor = "Sinun täytyy palkata lääkäri tekemään alustavia diagnooseja yleislääkärin toimistossa.", }, -- Goals goals = { win = { money = "Sinulta puuttuu %d$ rahaa tämän tason taloudellisten tavoitteiden saavuttamiseksi.", cure = "Sinun pitää parantaa vielä %d potilasta tämän tason vaatimusten täyttämiseksi.", reputation = "Suosiosi pitää olla vähintään %d edetäksesi suraavalle tasolle.", value = "Sairaalasi arvon tulee ylittää %d, jotta saat tämän tason suoritettua onnistuneesti.", }, lose = { kill = "Jos sairaalassasi kuolee vielä %d potilasta, häviät tämän tason!", }, }, -- Warnings warnings = { charges_too_low = "Veloitat palveluistasi liian vähän. Tämä houkuttelee kyllä sairaalaasi runsaasti potilaita, mutta ansaitset vähemmän jokaista potilasta kohden.", charges_too_high = "Hintasi ovat liian korkeat. Se tuottaa sinulle runsaasti rahaa lyhyellä tähtäimellä, mutta pitkällä tähtäimellä korkeat hinnat karkoittavat asiakkaita.", plants_thirsty = "Sinun täytyy huolehtia kasveistasi. Ne ovat janoisia.", staff_overworked = "Työntekijäsi ovat ylityöllistettyjä. Heistä tulee tehottomia ja he tekevät hengenvaarallisia virheitä ollessaan väsyneitä.", queue_too_long_at_reception = "Sinulla on liikaa potilaita odottamassa vastaanotossasi. Rakenna lisää vastaanottoja ja palkkaa niihin vastaanottoapulaiset.", queue_too_long_send_doctor = "Jono huoneeseen %s on liian pitkä. Varmista, että huoneessa on lääkäri.", handymen_tired = "Huoltomiehesi ovat erittäin väsyneitä. Anna heidän levätä riittävästi.", money_low = "Rahasi uhkaavat loppua, jollet puutu asioihin!", money_very_low_take_loan = "Rahasi ovat miltei lopussa. Voit ottaa lainaa pankilta selvitäksesi tästä ainakin hetkeksi.", staff_unhappy = "Henkilökuntasi on tyytymätön. Kokeile antaa heille bonuksia tai rakentaa heille taukohuone. Voit myös muuttaa taukokäytäntöä Sairaalan käytännöt -ikkunasta.", no_patients_last_month = "Sairaalaasi ei tullut ainuttakaan uutta potilasta viime kuussa. Shokki!", queues_too_long = "Jonot ovat liian pitkiä sairaalassasi.", patient_stuck = "Yksi potilaistasi on eksynyt. Sinun pitäisi järjestää sairaalasi paremmin.", patients_too_hot = "Potilailla on liian kuuma. Voit poistaa ylimääräisiä lämpöpattereita, laskea lämmityksen tehoa tai rakentaa lisää juoma-automaatteja.", doctors_tired = "Lääkärisi ovat erittäin väsyneitä. Anna heille lepotaukoja ennen kuin jollekulle käy hassusti.", need_toilets = "Potilaasi tarvitsevat käymälöitä. Rakenna ne helposti saavutettaviin paikkoihin.", machines_falling_apart = "Laitteesi ovat hajoamispisteessä. Käske huoltomiehiäsi huoltamaan niitä välittömästi!", nobody_cured_last_month = "Yhtä ainuttakaan potilasta ei saatu parannettua viime kuussa.", patients_thirsty = "Potilaasi ovat janoisia. Sinun pitäisi antaa heille mahdollisuus ostaa juotavaa.", nurses_tired = "Sairaanhoitajasi ovat erittäin väsyneitä. Anna heidän levätä riittävästi.", machine_severely_damaged = "%s on hyvin lähellä täydellistä tuhoutumista.", reception_bottleneck = "Vastaanotto on sairaalasi pullonkaula. Palkaa toinen vastaanottoapulainen.", bankruptcy_imminent = "Huhuu! Tilanteesi lähestyy uhkaavasti konkurssia. Ole varovainen!", receptionists_tired = "Vastaanottoapulaisesi ovat erittäin väsyneitä. Anna heidän levätä riittävästi.", too_many_plants = "Sinulla on liikaa kasveja. Sairaalasi näyttää jo ihan viidakolta.", many_killed = "Sairaalassasi on kuollut jo %d potilasta. Tiesitkö, että tarkoituksena olisi ollut parantaa heidät.", need_staffroom = "Rakenna henkilökunnan taukohuone viipymättä, jotta he pääsevät välillä lepäämäänkin.", staff_too_hot = "Henkilökuntasi on sulamispisteessä. Laske sairaalasi lämpötilaa tai vähennä lämpöpattereita heidän huoneistaan.", patients_unhappy = "Potilaasi ovat tyytymättömiä sairaalaasi. Sinun pitäisi tehdä jotakin saadaksesi sairaalasi mukavammaksi.", pay_back_loan = "Sinulla on runsaasti rahaa. Voisit harkita lainasi lyhentämistä.", }, -- Placement info placement_info = { door_can_place = "Voit asettaa oven tähän, jos haluat.", window_can_place = "Ikkuna voidaan rakentaa tähän. Se onnistuu hienosti.", door_cannot_place = "Valitettavasti et voi rakentaa ovea tähän.", object_can_place = "Valitsemasi kaluste voidaan sijoittaa tähän.", reception_can_place = "Vastaanotto voidaan asettaa tähän.", staff_cannot_place = "Et voi asettaa työntekijääsi tähän. Pahoittelut.", staff_can_place = "Voit asettaa työntekijän tähän. ", object_cannot_place = "Huhuu, ei tätä kalustetta voi sijoittaa tähän.", room_cannot_place = "Huonetta ei voi sijoittaa tähän.", room_cannot_place_2 = "Huonetta ei voi rakentaa tähän.", window_cannot_place = "Et voi rakentaa ikkunaa tähän.", reception_cannot_place = "Vastaanottoa ei voi sijoittaa tähän.", }, -- Praise praise = { many_benches = "Potilailla on tarpeeksi istumapaikkoja. Hienoa.", many_plants = "Mahtavaa. Sinulla on paljon kasveja. Potilaasi arvostavat sitä varmasti.", patients_cured = "%d potilasta parannettu.", }, -- Information information = { larger_rooms = "Suurempi huone saa työntekijät tuntemaan itsensä tärkeämmiksi, mikä parantaa heidän suoritustasoaan.", extra_items = "Ylimääräiset kalusteet huoneissa parantavat työntekijöiden viihtyvyyttä ja heidän suoritustasonsa paranee.", epidemic = "Sairaalassasi riehuu tarttuva epidemia. Sinun pitää tehdä jotain ja pian!", promotion_to_doctor = "Yhdestä harjoittelijastasi on tullut tohtori.", emergency = "Hätätilanne! Nyt tuli kiire! Vauhtia siellä!", patient_abducted = "Avaruusolennot ovat siepanneet yhden potilaasi.", first_cure = "Hyvää työtä! Olet onnistunut parantamaan ensimmäisen potilaasi.", promotion_to_consultant = "Yhdestä tohtoristasi on tullut konsultti.", handyman_adjust = "Voit parantaa huoltomiestesi tehokkuutta säätämällä heidän prioriteettejaan.", promotion_to_specialist = "Yksi lääkäreistäsi on saanut päätökseen erikoistumisensa %sksi.", patient_leaving_too_expensive = "Eräs potilas lähtee sairaalastasi maksamatta laskuaan hoidosta huoneessa %s. Se oli liian kallista.", vip_arrived = "Huomio! - %s on saapunut sairaalaasi! Tee kaikkesi, jotta hänen jokainen tarpeensa tulee ripeästi täytetyksi.", epidemic_health_inspector = "Terveysministeriö on kuullut sairaalaasi vaivaavasta epidemiasta. Voit valmistautua siihen, että terveystarkastaja saapuu varsin pian.", first_death = "Sairaalassasi on sattunut ensimmäinen kuolemantapaus. Kuinkas tässä nyt näin pääsi käymään?", pay_rise = "Yksi työntekijöistäsi uhkaa irtisanoutua. Valitse haluatko suostua hänen palkkavaatimukseensa vai antaa hänelle potkut. Klikkaa vasemmalla alalaidassa olevaa ikonia nähdäksesi kenestä on kyse.", place_windows = "Ikkunat tekevät huoneista valoisampia ja parantavat työntekijöidesi mielialaa.", fax_received = "Vasempaan alanurkkaan ilmestyvät ikonit ilmoittavat sinulle tärkeistä tiedoista ja päätöksistä, joita voit tehdä.", initial_general_advice = { rats_have_arrived = "Rotat ovat vallanneet sairaalasi. Yritä ampua niitä hiirelläsi.", autopsy_available = "Tutkijasi ovat keksineet ruumiinavauskoneen, jonka avulla voit hankkiutua eroon ei-toivotuista potilaista ja tehdä tutkimusta heidän jäänteillään. Koneen käyttämisen moraalinen hyväksyttävyys on kuitenkin erittäin kiistanalaista.", first_patients_thirsty = "Sairaalassasi on janoisia ihmisiä. Osta lisää juoma-automaatteja heidän käyttöönsä.", research_now_available = "Olet rakentanut ensimmäisen tutkimusosastosi. Nyt pääset käsiksi tutkimus-ikkunaan.", psychiatric_symbol = "Psykiatriaan erikoistuneet lääkärit on merkitty symbolilla: |", decrease_heating = "Ihmisillä on liian kuuma sairaalassasi. Säädä lämmitystäsi pienemälle kartta-ikkunasta.", surgeon_symbol = "Kirurgiaan erikoistuneet lääkärit on merkitty symbolilla: {", first_emergency = "Hätätilannepotilaiden pään päällä on sininen hälytysvalo. Paranna heidät ennen kuin he kuolevat tai aika loppuu kesken.", first_epidemic = "Sairaalassasi on havaittu epidemia! Päätä, haluatko salata sen vai tehdä lain vaatiman ilmoituksen.", taking_your_staff = "Joku yrittää houkutella henkilökuntaasi loikkaamaan palvelukseensa. Sinun täytyy taistella, jos et halua menettää heitä.", place_radiators = "Ihmisillä on liian kylmä sairaalassasi. Voit asentaa lisää lämpöpattereita ostamalla niitä kalusteet-valikosta.", epidemic_spreading = "Sairaalassasi on vakavaan tartuntatautiin sairastuneita. Yritä parantaa sairastuneet ennen kuin he lähtevät kotiin.", research_symbol = "Tutkimukseen erikoistuneet lääkärit on merkitty symbolilla: }", machine_needs_repair = "Sairaalassasi on kone joka täytyy korjata. Etsi rikkoutunut kone, joka epäilemättä jo savuaa, ja klikkaa sitä. Aukeavasta ruudusta saat käskettyä huoltomiehen korjaamaan sen.", increase_heating = "Ihmisillä on liian kylmä sairaalassasi. Säädä lämmitystäsi suuremmalle kartta-ikkunasta.", first_VIP = "Sairaalaasi on saapumassa ensimmäinen VIP-potilas. Yritä varmistaa, ettei hän pääse näkemään mitään epähygienistä tai yhtään tyytymättömiä potilaita.", }, }, -- Build advice build_advice = { placing_object_blocks_door = "Jos sijoitat kalusteita tähän, kukaan ei pääse ovesta sisään eikä ulos.", blueprint_would_block = "Tämä huoneen pohjapiirrustus estäisi pääsyn joihinkin muihin huoneisiin. Kokeile muuttaa huoneen kokoa tai siirrä se toiseen paikkaan!", door_not_reachable = "Ihmiset eivät pääse mitenkään ovelle, jos asetat sen tähän. Mietihän vähän.", blueprint_invalid = "Tämä pohjapiirrustus ei ole kelvollinen.", }, } -- Confirmation confirmation = { quit = "Jos poistut nyt, kaikki tallentamattomat tiedot menetetään. Oletko varma, että haluat lopettaa pelin?", return_to_blueprint = "Oletko varma, että haluat palauttaa tämän huoneen pohjapiirros-tilaan?", replace_machine = "Oletko varma, että haluat korvata koneen %s hintaan %d$?", -- %s (machine name) %d (price) overwrite_save = "Tällä nimellä on jo tallennettu peli. Oletko varma, että haluat tallentaa sen päälle?", delete_room = "Oletko varma, että haluat poistaa tämän huoneen?", sack_staff = "Oletko varma, että haluat irtisanoa tämän työntekijän?", restart_level = "Oletko varma, että haluat aloittaa tason alusta?", needs_restart = "Tämän asetuksen muuttaminen vaatii CorsixTH:n käynnistämisen uudelleen. Kaikki tallentamattomat muutokset menetetään. Oletko varma, että haluat jatkaa?", abort_edit_room = "Huoneen rakentaminen tai muokkaaminen on kesken. Jos kaikki pakolliset kalusteet on asetettu huoneeseen, se valmistuu, mutta muutoin se poistetaan. Oletko varma, että haluat poistua?", } -- Bank manager bank_manager = { hospital_value = "Sairaalan arvo", balance = "Rahaa tilillä", current_loan = "Maksettavaa lainaa", interest_payment = "Vuokrakulut", insurance_owed = "Vakuutusvelka", inflation_rate = "Inflaatio", interest_rate = "Korkotaso", statistics_page = { date = "Päivä", details = "Tiedot", money_out = "Kulut", money_in = "Tulot", balance = "Saldo", current_balance = "Tilillä", }, } -- Newspaper headlines newspaper = { -- Seven categories of funny headlines. I think each category is related -- to one criterion you can lose to. TODO: categorize { "TOHTORI KAUHUN KIROUS", "OUTO LÄÄKÄRI LEIKKII JUMALAA", "TOHTORI EBOLA SHOKEERAA", "KUKA USKOO VIILTÄJÄKIRURGIIN?", "RATSIA PÄÄTTI VAARALLISEN LÄÄKETUTKIMUKSEN" }, { "TOHTORI ANKKURI", "ITKEVÄT PSYKIATRIT", "KONSULTIN PAKOMATKA", "KIRURGINEN LAUKAUS", "KIRURGI JUO LASINSA TYHJÄKSI", "KIRURGIN HENKI" }, { "LEIKKIVÄ PSYKIATRI", "TOHTORI ILMAN-HOUSUJA", "TOHTORI KAUHUISSAAN", "KIRURGIN NÄLKÄ" }, { "LÄÄKÄRI VETÄÄ VÄLISTÄ", "ELINKAUPPA KUKOISTAA", "PANKKIHOLVIN OHITUSLEIKKAUS", "LÄÄKÄRIN PIKKURAHAT" }, { "HOITAJAT PENKOVAT RUUMISARKUN", "LÄÄKÄRI TYHJENSI HAUDAN", "VUOTO VAATEKAAPISSA", "TOHTORI KUOLEMAN HIENO PÄIVÄ", "VIIMEISIN HOITOVIRHE", "KADONNEET LÄÄKÄRIT" }, { "LÄÄKÄRI EROAA!", "LEPSU PUOSKARI", "HENGENVAARALLINEN DIAGNOOSI", "VAROMATON KONSULTTI", }, { "TOHTORI HUOKAA HELPOTUKSESTA", "KIRURGI 'LEIKKAA' ITSENSÄ", "LÄÄKÄRIN PURKAUS", "LÄÄKÄRI LASKEE KAAPELIA", "LÄÄKE OLIKIN KURAA" }, } -- Letters -- TODO letter = { --original line-ends: 5 4 2 3 [1] = { [1] = "Hyvä %s//", [2] = "Mahtavaa! Olet johtanut tätä sairaalaa erinomaisesti. Me täällä hallinnossa haluamme tietää, oletko kiinnostunut lähtemään suuremman projektin johtoon. Meillä on työtarjous, johon uskomme sinun sopivan täydellisesti. Voimme tarjota sinulle palkkaa %d$. Mieti toki kaikessa rauhassa.//", [3] = "Oletko kiinnostunut työskentelemään %sn sairaalassa?", }, [2] = { [1] = "Hyvä %s//", [2] = "Oikein hyvää työtä! Sairaalasi on kehittynyt hienosti. Meillä on toinen instituutio, jonka johtoon haluaisimme sinut sijoittaa, jos olet saatavilla. Voit jättää tarjouksen hyväksymättä, mutta takaamme, että tämä on ainakin harkitsemisen arvoista. Palkka on %d$//", [3] = "Haluatko töihin %sn sairaalaan?", }, [3] = { [1] = "Hyvä %s//", [2] = "Sinun kautesi tässä sairaalassa on ollut todellinen onnistumistarina. Näemme, että sinulla on kirkas tulevaisuus edessäsi ja haluamme tarjota sinulle pestiä toisessa paikassa. Palkka on %d$ ja uskomme sinun ihastuvan sen tarjoamiin uusiin haasteisiin.//", [3] = "Otatko vastaan paikan %sn sairaalassa?", }, [4] = { [1] = "Hyvä %s//", [2] = "Onnittelut! Me täällä hallinnosssa olemme erittäin vaikuttuneita saavutuksistasi sairaalasi johdossa. Olet todellinen terveysministeriön kultapoika. Me uskomme kuitenkin, että kaipaat vähän haastavampaa työtä. Saisit palkkaa %d$, mutta päätös on sinun.//", [3] = "Oletko kiinnostunut ottamaan vastaan työn %sn sairaalassa?", }, [5] = { [1] = "Hyvä %s//", [2] = "Hei taas. Kunnioitamme toiveitasi, jos et halua jättää tätä upeaa sairaalaa taaksesi, mutta pyydämme, että harkitset tarjoustamme vakavasti. Tarjoamme %d$ palkkaa, jos suostut siirtymään toisen sairaalan johtoon ja saat hoidon sujumaan yhtä hyvin kuin tässä sairaalassa.//", [3] = "Haluaisitko siirtyä %sn sairaalaan?", }, [6] = { [1] = "Hyvä %s//", [2] = "Tervehdys. Tiedämme miten onnellinen olet ollut tässä upeassa ja hyvin johdetussa instituutiossa, mutta uskomme, että sinulla olisi nyt oikea hetki edistää uraasi. Saat kunnioitettavan johtajan palkan: %d$, jos päätät suostua. Ainakin sitä kannattaa harkita.//", [3] = "Haluatko ottaa vastaan paikan %sn sairaalassa?", }, [7] = { [1] = "Hyvä %s//", [2] = "Hyvää päivää! Terveysministeriö haluaa tietää suostutko harkitsemaan uudelleen päätöstäsi pysyä tämän sairaalan johdossa. Me arvostamme nykyistä sairaalaasi, mutta uskomme, että haastavampi tehtävä sopisi sinulle paremmin. Palkkatarjouksemme on %d$.//", [3] = "Hyväksytkö työn %sn sairaalassa?", }, [8] = { [1] = "Hyvä %s//", [2] = "Hei taas. Kieltäydyit aiemmasta tarjouksestamme, joka käsitti ensiluokkaisen paikkan upouuden sairaalan johdossa ja korotetun palkan: %d$. Meidän mielestämme sinun kannattaisi harkita päätöstäsi uudelleen. Kyseessä on nimittäin täydellinen työ juuri sinulle.//", [3] = "Otatko paikan vastaan %sn sairaalassa? Ole niin kiltti ja suostu!", }, [9] = { [1] = "Hyvä %s//", [2] = "Olet todistanut olevasi paras sairaalanjohtaja lääketieteen pitkän ja kunniakkaan historian aikana. Tällainen uskomaton saavutus ei voi jäädä palkitsematta, joten tarjoamme sinulle sairaalaosaston pääjohtajan virkaa. Tämä on kunniavirka ja siihen kuuluu %d$ palkkaa. Kunniaksesi järjestetään paraati ja ihmiset osoittavat sinulle kiitollisuuttaan mihin ikinä menetkin.//", [3] = "Kiitokset kaikesta tekemästäsi työstä. Toivotamme sinulle leppoisia puoliaikaisia eläkepäiviä.//", }, [10] = { [1] = "Hyvä %s//", [2] = "Onnittelut! Olet onnistunut menestyksekkäästi johtamaan kaikkia sairaaloita, joiden johtoon olemme sinut asettaneet. Tämän mahtavan saavutuksen johdosta saat vapauden matkustaa ympäri maailmaa, %d$ eläkettä ja limusiinin. Haluaisimme sinun matkoillasi keskustelevan kiitollisten kansalaisten kanssa ja edistävän kaikkien sairaalojen toimintaa kaikkialla.//", [3] = "Olemme kaikki ylpeitä sinusta. Joukossamme ei ole ketään, joka ei olisi kiitollinen ihmishenkien pelastamiseksi tekemästäsi työstä.//", }, [11] = { [1] = "Hyvä %s//", [2] = "Urasi on ollut esimerkillinen ja olet inspiraation lähde meille kaikille. Kiitokset kaikkien näiden sairaaloiden johtamisesta ja hyvästä työstä jokaisessa niistä. Haluamme myöntää sinulle %d$ elinikäistä palkkaa ja pyydämme ainoastaan, että kierrät kaupungista toiseen pitämässä luentoja siitä kuinka sait aikaan niin paljon niin nopeasti.//", [3] = "Olet esimerkki kaikille järkeville ihmisille ja nautit poikkeuksetta kaikkien ihmisten ihailua ympäri maailman.//", }, [12] = { [1] = "Hyvä %s//", [2] = "Voitokas urasi parhaana sairaalanjohtajana sitten Mooseksen aikojen lähestyy loppuaan. Vaikutuksesi lääketieteen ihmeelliseen maailmaan on ollut niin mahtava, että ministeriö haluaa myöntää sinulle %d$ palkkaa, jos suostut silloin tällöin pitämään puheita, osallistumaan laivojen vesillelaskuihin ja esiintymään TV:n chatti-ohjelmissa.//", [3] = "Voit huoletta hyväksyä tämän tarjouksen, sillä työ ei ole rankkaa ja tarjoamme sinulle auton ja poliisisaattueen minne ikinä menetkin.//", }, } -- Humanoid start of names humanoid_name_starts = { [1] = "LEPPÄ", [2] = "VIIMA", [3] = "KUUSI", [4] = "KOIVU", [5] = "MÄNTY", [6] = "PAJU", [7] = "TAMMI", [8] = "PYÖKKI", [9] = "LAUTA", [10] = "NAULA", [11] = "SUUR", [12] = "SUVI", [13] = "VIIMA", [14] = "LOVI", [15] = "HURME", [16] = "KOTO", [17] = "NURMI", [18] = "PALO", [19] = "KULO", [20] = "PAASI", [21] = "KAIVO", [22] = "HAVU", [23] = "KARE", [24] = "HALLA", [25] = "NOKI", [26] = "KYTÖ", [27] = "KIVI", [28] = "KALJU", [29] = "TALAS", [30] = "VESI", [31] = "ILMA", [32] = "KANTO", [33] = "SUMU", } -- Humanoid end of names humanoid_name_ends = { [1] = "KOSKI", [2] = "PELTO", [3] = "JÄRVI", [4] = "MAA", [5] = "LAAKSO", [6] = "MÄKI", [7] = "RINTA", [8] = "RANTA", [9] = "JOKI", [10] = "VAARA", [11] = "PURO", [12] = "VIITA", [13] = "VUORI", [14] = "PIHA", [15] = "VIRTA", [16] = "METSÄ", [17] = "RINNE", [18] = "HARJU", [19] = "LEHTO", [20] = "MALMI", [21] = "KORPI", [22] = "SAARI", [23] = "LAHTI", [24] = "KUNNAS", [25] = "KANGAS", [26] = "PÄÄ", } -- VIP names vip_names = { health_minister = "Terveysministeri", "Namikkalan kunnanjohtaja", -- the rest is better organized in an array. "Walesin Prinssi", "Norjan suurlähettiläs", "Aung Sang Su Kyi", "Kaino Vieno Nuppu Lahdelma", "Sir David", "Dalai Lama", "Nobel-palkittu kirjailija", "Valioliigan jalkapalloilija", "Vuorineuvos Viita", } -- Deseases diseases = { general_practice = { name = "Yleishoito", }, alien_dna = { name = "Alienin DNA", cause = "Aiheuttaja - joutuminen facehugger-alienin uhriksi.", symptoms = "Oireet - vaiheittainen muodonmuutos täysikasvuiseksi alieniksi ja halu tuhota kaikki kaupunkimme.", cure = "Hoito - DNA poistetaan mekaanisesti, puhdistetaan ja siirretään nopeasti takaisin.", }, baldness = { name = "Kaljuus", cause = "Aiheuttaja - valehteleminen ja tarinoiden keksiminen suosion toivossa.", symptoms = "Oireet - kiiltävä kupoli ja nolotus.", cure = "Hoito - Uudet hiukset sulautetaan saumattomasti potilaan päähän käyttäen kivuliasta konetta.", }, bloaty_head = { name = "Pallopäisyys", cause = "Aiheuttaja - juuston haistelu ja puhdistamattoman sadeveden juominen.", symptoms = "Oireet - hyvin epämukavat potilaalle.", cure = "Hoito - Pää puhkaistaan ja pumpataan takaisin oikeaan paineeseen nokkelalla laitteella.", }, broken_heart = { name = "Särkynyt sydän", cause = "Aiheuttaja - joku rikkaampi, nuorempi ja laihempi kuin potilas.", symptoms = "Oireet - hallitsematon itku ja rasitusvamma jatkuvan lomakuvien repimisen johdosta.", cure = "Hoito - Kaksi kirurgia avaa rintakehän ja korjaa sydämen hellästi pidättäen hengitystään.", }, broken_wind = { name = "Kaasujen karkailu", cause = "Aiheuttaja - kuntosalin juoksumaton käyttäminen heti ruoan jälkeen.", symptoms = "Oireet - takana seisovien ihmisten ärsyyntyminen.", cure = "Hoito - Potilas juo nopeasti raskaan sekoituksen erityisiä vetisiä atomeja apteekissa.", }, chronic_nosehair = { name = "Krooniset nenäkarvat", cause = "Aiheuttaja - nenän nyrpistäminen itseään heikompiosaisille ihmisille.", symptoms = "Oireet - nenäparta, johon orava voisi tehdä pesän.", cure = "Hoito - Sairaanhoitaja valmistaa apteekissa ällöttävän rohdon, joka nautitaan suun kautta.", }, corrugated_ankles = { name = "Taipuneet nilkat", cause = "Aiheuttaja - liiallinen hidastetöyssyjen yli ajaminen.", symptoms = "Oireet - kengät eivät sovi hyvin jalkaan.", cure = "Hoito - Lievästi myrkyllinen seos yrttejä ja mausteita juodaan nilkkojen oikaisemiseksi.", }, discrete_itching = { name = "Paikallinen kutina", cause = "Aiheuttaja - pienet hyönteiset, joilla on terävät hampaat.", symptoms = "Oireet - raapiminen, joka johtaa ruumiinosien tulehduksiin.", cure = "Hoito - Potilaalle juotetaan lääkesiirappia kutinan ehkäisemiseksi.", }, fake_blood = { name = "Valeveri", cause = "Aiheuttaja - potilas on yleensä joutunut käytännön pilan uhriksi.", symptoms = "Oireet - suonissa punaista nestettä, joka haihtuu joutuessaan kosketuksiin kankaan kanssa.", cure = "Hoito - Psykiatrinen rauhoittelu on ainoa keino hoitaa ongelmaa.", }, fractured_bones = { name = "Murtuneet luut", cause = "Aiheuttaja - putoaminen korkealta betonille.", symptoms = "Oireet - voimakas napsahdus ja kyvyttömyys käyttää kyseisiä raajoja.", cure = "Hoito - Potilaalle asetetaan kipsi, joka sitten poistetaan laser-toimisella kipsinpoistokoneella.", }, gastric_ejections = { name = "Vääntelehtivä vatsa", cause = "Aiheuttaja - mausteinen meksikolainen tai intialainen ruoka.", symptoms = "Oireet - puolittain sulanutta ruokaa poistuu potilaan elimistöstä satunnaisesti.", cure = "Hoito - Erityisen sitouttamisnesteen juominen estää ruokapäästöjen syntymisen.", }, golf_stones = { name = "Golf-kivet", cause = "Aiheuttaja - altistuminen golfpallojen sisältämälle myrkkykaasulle.", symptoms = "Oireet - sekavuus ja edistynyt häpeä.", cure = "Hoito - Kivet poistetaan leikkauksella, johon tarvitaan kaksi kirurgia.", }, gut_rot = { name = "Mahamätä", cause = "Aiheuttaja - rouva Malisen 'Hauskaa iltaa' -viskiyskänlääke.", symptoms = "Oireet - ei yskää, mutta ei vatsan limakalvojakaan.", cure = "Hoito - Sairaanhoitaja sekoittaa apteekissa lääkeliemen, joka päälystää mahalaukun sisäpinnan.", }, hairyitis = { name = "Turkinkasvu", cause = "Aiheuttaja - pitkittynyt altistuminen kuun valolle.", symptoms = "Oireet - potilaille kehittyy herkistynyt hajuaisti.", cure = "Hoito - Elektrolyysikone poistaa karvat ja sulkee huokoset.", }, heaped_piles = { name = "Kasautuneet pukamat", cause = "Aiheuttaja - vesiautomaatin lähellä seisoskeleminen.", symptoms = "Oireet - potilaasta tuntuu kuin hän istuisi marmorikuulapussin päällä.", cure = "Hoito - Miellyttävä, mutta vahvasti hapokas juoma sulattaa pukamat sisältä.", }, infectious_laughter = { name = "Tarttuva nauru", cause = "Aiheuttaja - klassiset TV:n komediasarjat.", symptoms = "Oireet - avuton hihitys ja kuluneiden fraasien toistelu.", cure = "Hoito - Ammattitaitoisen psykiatrin täytyy muistuttaa potilaalle, kuinka vakava hänen tilansa on.", }, invisibility = { name = "Näkymättömyys", cause = "Aiheuttaja - radioaktiivisen (ja näkymättömän) muurahaisen purema", symptoms = "Oireet - potilaat eivät kärsi lainkaan ja monet heistä hyödyntävät tilaansa tekemällä kepposia perheelleen", cure = "Hoito - Apteekista saatava värikäs juoma palauttaa potilaat pikaisesti näkyviin", }, iron_lungs = { name = "Rautakeuhkot", cause = "Aiheuttaja - kantakaupungin savusumu yhdistettynä kebabin jäänteisiin.", symptoms = "Oireet - kyky syöstä tulta ja huutaa kovaa veden alla.", cure = "Hoito - Kaksi kirurgia poistaa jähmettyneet keuhkot leikkaussalissa.", }, jellyitis = { name = "Hyytelöityminen", cause = "Aiheuttaja - Runsaasti gelatiinia sisältävä ruokavalio ja liiallinen liikunta.", symptoms = "Oireet - liiallinen hytkyminen ja runsas kaatuilu.", cure = "Hoito - Potilas asetetaan vähäksi aikaa hyytelömuovaimeen erityisessä hyytelömuovainhuoneessa.", }, kidney_beans = { name = "Munuaispavut", cause = "Aiheuttaja - jääkuutioiden murskaaminen juomaan.", symptoms = "Oireet - kipuja ja jatkuvaa vessassa käymistä.", cure = "Hoito - Kahden kirurgin täytyy poistaa pavut koskematta munuaisiin.", }, king_complex = { name = "Kuningas-kompleksi", cause = "Aiheuttaja - Kuninkaan henki tunkeutuu potilaan tajuntaan ja ottaa vallan.", symptoms = "Oireet - värikkäisiin samettikenkiin pukeutuminen ja juustohampurilaisten syöminen", cure = "Hoito - Psykiatri kertoo vastaanotollaan potilaalle, kuinka älyttömän typerältä tämä näyttää", }, pregnancy = { name = "Raskaus", cause = "Aiheuttaja - sähkökatkot kaupungistuneilla alueilla.", symptoms = "Oireet - taukoamaton syöminen ja siihen liittyvä kaljamaha.", cure = "Hoito - Lapsi poistetaan keisarinleikkauksella, pestään ja ojennetaan potilaalle.", }, -- unused ruptured_nodules = { name = "Repeytyneet kyhmyt", cause = "Aiheuttaja - benjihyppääminen kylmässä säässä.", symptoms = "Oireet - potilaan on mahdotonta istua mukavasti.", cure = "Hoito - Kaksi kirurgia poistaa kyhmyt vakain käsin.", }, serious_radiation = { name = "Vakava säteily", cause = "Aiheuttaja - erehtyminen plutonium-isotooppien ja purukumin välillä.", symptoms = "Oireet - potilaat tuntevat itsensä hyvin, hyvin huonovointisiksi.", cure = "Hoito - Potilas tulee asettaa puhdistussuihkuun ja pestä huolellisesti.", }, slack_tongue = { name = "Velttokielisyys", cause = "Aiheuttaja - krooninen saippuaoopperoista puhuminen.", symptoms = "Oireet - kieli turpoaa viisi kertaa pidemmäksi kuin normaalisti.", cure = "Hoito - Kieli asetetaan paloittelijaan, joka lyhentää sen nopeasti, tehokkaasti ja kivuliaasti.", }, sleeping_illness = { name = "Unitauti", cause = "Aiheuttaja - yliaktiivinen unirauhanen kitalaessa.", symptoms = "Oireet - ylitsepääsemätön tarve käydä nukkumaan kaikkialla.", cure = "Hoito - Sairaanhoitaja annostelee suuren annoksen voimakasta piristysainetta.", }, spare_ribs = { name = "Liikakyljykset", cause = "Aiheuttaja - kylmillä kivilattioilla istuminen.", symptoms = "Oireet - epämiellyttävä rintavuuden tunne.", cure = "Hoito - Kaksi kirurgia poistaa kyljykset ja antaa ne folioon käärittynä potilaalle kotiin vietäväksi.", }, sweaty_palms = { name = "Hikiset kädet", cause = "Aiheuttaja - työhaastattelujen kammo.", symptoms = "Oireet - kätteleminen potilaan kanssa on kuin pitelisi vastakasteltua pesusientä.", cure = "Hoito - Psykiatrin pitää saada potilas luopumaan päässään luomastaan sairaudesta.", }, the_squits = { name = "Oksennustauti", cause = "Aiheuttaja - lattialta löytyneen pizzan syöminen.", symptoms = "Oireet - yäk, osaat varmaan arvatakin.", cure = "Hoito - Kuitupitoinen sekoitus lankamaisia lääkekemikaaleja kiinteyttää potilaan sisuskalut.", }, third_degree_sideburns = { name = "Kolmannen asteen pulisongit", cause = "Aiheuttaja - kaipuu takaisin 1970-luvulle.", symptoms = "Oireet - iso kampaus, leveälahkeiset housut, korokepohjakengät ja kiillemeikit.", cure = "Hoito - Psykiatrin täytyy vakuuttaa potilas siitä, että hänen karvakehyksensä ovat inhottavat.", }, transparency = { name = "Läpinäkyvyys", cause = "Aiheuttaja - jogurtin nuoleminen purkkien kansista.", symptoms = "Oireet - potilaan liha muuttuu läpinäkyväksi ja kammottavaksi.", cure = "Hoito - Apteekista saatava erityisellä tavalla jäähdytetty ja värjätty vesi parantaa taudin.", }, tv_personalities = { name = "TV-kasvous", cause = "Aiheuttaja - päiväsaikaan lähetettävä ohjelmatarjonta.", symptoms = "Oireet - kuvitelma, että potilas pystyy juontamaan ruoanlaitto-ohjelman.", cure = "Hoito - Psykiatrin tulee suostutella potilas myymään televisionsa ja ostamaan radio sen tilalle.", }, uncommon_cold = { name = "Epätavallinen flunssa", cause = "Aiheuttaja - pienet räkähiukkaset ilmassa.", symptoms = "Oireet - vuotava nenä, aivastelu ja värjäytyneet keuhkot.", cure = "Hoito - Iso kulaus apteekissa valmisteltua epätavallista flunssalääkettä tekee taudista menneen talven lumia.", }, unexpected_swelling = { name = "Odottamaton turvotus", cause = "Aiheuttaja - mikä tahansa odottamaton.", symptoms = "Oireet - turvotus.", cure = "Hoito - Kahden kirurgin suorittama puhkomistoimenpide poistaa turvotuksen.", }, diag_scanner = { name = "Diagn. magn. kuvaus", }, diag_blood_machine = { name = "Diagn. verikone", }, diag_cardiogram = { name = "Diagn. kardiogrammi", }, diag_x_ray = { name = "Diagn. röntgen", }, diag_ultrascan = { name = "Diagn. ultraääni", }, diag_general_diag = { name = "Diagn. yleisdiagn.", }, diag_ward = { name = "Diagn. vuodeosasto.", }, diag_psych = { name = "Diagn. psykiatria", }, autopsy = { name = "Ruumiinavaus", }, } -- Faxes fax = { -- Debug fax debug_fax = { -- never seen this, must be a debug option of original TH -- TODO: make this nicer if we ever want to make use of it close_text = "Kyllä, kyllä, kyllä!", text1 = "PARAS MÄÄRÄ %d", -- %d text2 = "IHMISIÄ YHTEENSÄ SAIRAALASSA %d VERRATTUNA %d:N", -- %d %d text3 = "LUVUT : LÄÄKÄRIT %d HOITAJAT %d ALUE %d HUONEET %d HINTA %d", -- %d %d %d %d %d text4 = "KERTOIMET: LÄÄKÄRIT %d HOITAJAT %d ALUE %d HUONEET %d HINTA %d", -- %d %d %d %d %d text5 = "OSUUS : LÄÄKÄRIT %d HOITAJAT %d ALUE %d HUONEET %d HINTA %d PROSENTTIA", -- %d %d %d %d %d text6 = "SEURAAVAT KERTOIMET OTETAAN MYÖS HUOMIOON", text7 = "MAINE: %d ODOTETTU %d VÄHENNYS %d", -- %d %d %d text8 = "WC-TILAT %d IHMISIÄ PALVELTU %d VÄHENNYS %d", -- %d %d %d text9 = "ONNETTOMUUDET %d SALLITTU (KK) %d (%d)VÄHENNYS %d", -- %d %d %d %d text10 = "KUOLEMAT %d SALLITTU (KK) %d (%d) VÄHENNYS %d", -- %d %d %d %d text11 = "IHMISIÄ TÄSSÄ KUUSSA %d", -- %d }, -- Emergency emergency = { choices = { accept = "Kyllä, minä pystyn hoitamaan sen", refuse = "Ei, en voi ottaa potilaita vastaan", }, location = "%s on sattunut onnettomuus.", num_disease = "%d ihmisellä on diagnosoitu %s, joka vaatii välitöntä hoitoa.", num_disease_singular = "Yhdellä henkilöllä on havaittu %s, joka vaatii välitöntä hoitoa.", cure_possible_drug_name_efficiency = "Sinulla on jo tarvittavat laitteet ja taidot. Tarvittava lääke on %s ja sen teho on %d%%.", cure_possible = "Sinulla on jo tarvittavat laitteet ja taidot, joten sinun pitäisi selviytyä tilanteesta ongelmitta.", cure_not_possible_build_and_employ = "Sinun täytyy rakentaa %s ja palkata %s.", cure_not_possible_build = "Sinun täytyy rakentaa %s.", cure_not_possible_employ = "Sinun täytyy palkata %s.", cure_not_possible = "Et pysty hoitamaan tätä sairautta tällä hetkellä.", bonus = "Jos pystyt hoitamaan tämän hätätapauksen täydellisesti, saat bonuksena %d$. Jos kuitenkin epäonnistut, sairaalasi maine saa aimo kolauksen.", locations = { "Tomin asekellarissa", "Innovaatioyliopistossa", "Puskalan puutarhakeskuksessa", "Vaarallisten aineiden tutkimuskesuksessa", "Tanssimessuilla", "Mykkä Papukaija -baarissa", "Ison Taunon hautajaispaviljongissa", "Taj-curryravintolassa", "Pekan petrokemikaalikirpputorilla", }, }, emergency_result = { close_text = "Sulje ikkuna", earned_money = "Enimmäisbonus oli %d$ ja ansaitsit %d$.", saved_people = "Pelastit %d ihmistä, kun potilaita oli %d.", }, -- Deseace discovered disease_discovered_patient_choice = { choices = { send_home = "Lähetä potilas kotiin.", wait = "Pyydä potilasta odottamaan sairaalassa vähän aikaa.", research = "Lähetä potilas tutkimusosastolle.", }, need_to_build_and_employ = "Sinun täytyy rakentaa %s ja palkkata %s, jotta voit hoitaa sairautta.", need_to_build = "Sinun täytyy rakentaa %s, jotta voit hoitaa sairautta.", need_to_employ = "Palkkaa %s auttamaan potilasta.", can_not_cure = "Et voi hoitaa tätä sairautta.", disease_name = "Työntekijäsi ovat havainneet uuden sairauden, jonka nimi on %s.", what_to_do_question = "Miten haluat meidän toimivan potilaan kanssa?", guessed_percentage_name = "Työntekijäsi ovat joutuneet arvaamaan, mikä potilasta vaivaa. %d%%:n todennäköisyydellä sairaus on %s.", }, disease_discovered = { close_text = "Uusi sairaus on löydetty.", can_cure = "Pystyt parantamaan sairauden.", need_to_build_and_employ = "Sinun täytyy rakentaa %s ja palkata %s, jotta voit hoitaa sairautta.", need_to_build = "Sinun täytyy rakentaa %s, jotta voit hoitaa sairautta.", need_to_employ = "Palkkaa %s hoitamaan potilaita, joilla on tämä sairaus.", discovered_name = "Työntekijäsi ovat havainneet uuden sairauden, jonka nimi on %s.", }, -- Epidemic epidemic = { choices = { declare = "Julkista epidemia, maksa sakko ja hyväksy vahinko sairaalasi maineelle.", cover_up = "Yritä hoitaa kaikki tartunnan saaneet potilaat ennen kuin annettu aika loppuu tai kukaan lähtee sairaalastasi.", }, disease_name = "Lääkärisi ovat löytäneet helposti tarttuvan %s-kannan.", declare_explanation_fine = "Jos julkistat epidemian, sinun täytyy maksaa sakkoja %d$, sairaalasi maine kokee kolauksen ja kaikki potilaasi rokotetaan automaattisesti.", cover_up_explanation_1 = "Toisaalta, jos yrität salata epidemian, sinulla on rajoitetusti aikaa parantaa kaikki tartunnan saaneet potilaat.", cover_up_explanation_2 = "Jos vierailulle saapuva terveystarkastaja saa selville, että olet salaillut epidemiaa, seuraukset voivat olla hyvin vakavat.", }, -- Epidemic result epidemic_result = { close_text = "Hurraa!", failed = { part_1_name = "Yrittäessään salata sairaalassasi riehuneen helposti tarttuvan %s-epidemian", part_2 = "henkilökuntasi on päästänyt sairauden leviämään sairaalan ympärillä asuvaan väestöön.", }, succeeded = { part_1_name = "Terveystarkastaja on kuullut huhuja, että sairaalassasi on riehunut %s-epidemia", part_2 = "Hän ei ole kuitenkaan pystynyt näyttämään näitä huhuja todeksi.", }, compensation_amount = "Hallitus on myöntänyt sinulle %d$ korvauksena vahingoista, joita nämä valheet ovat sairaalasi maineelle aiheuttaneet.", fine_amount = "Hallitus on julistanut kansallisen hätätilan ja määrännyt sinulle %d$ sakkoja.", rep_loss_fine_amount = "Sanomalehdet pääsevät huomenna kirjoittamaan tästä etusivullaan. Maineesi tahrautuu pahasti ja joudut maksamaan %d$ sakkoja.", hospital_evacuated = "Terveyslautakunnalla ei ole muuta vaihtoehtoa kuin evakuoida sairaalasi.", }, -- VIP visit query vip_visit_query = { choices = { invite = "Lähetä virallinen kutsu VIP-potilaalle.", refuse = "Kieltäydy ottamasta VIP-vierasta vastaan jollakin tekosyyllä.", }, vip_name = "%s on esittänyt toiveen päästä käymään sairaalassasi.", }, -- VIP visit result vip_visit_result = { close_text = "Kiitos käynnistä ja tervetuloa uudestaan.", telegram = "Sähke!", vip_remarked_name = "%s kommentoi vierailuaan sairaalassasi seuraavasti:", cash_grant = "Sairaalallesi on tehty käteislahjoitus, jonka arvo on %d$.", rep_boost = "Sairaalasi maine on parantunut.", rep_loss = "Sairaalasi maine on huonontunut.", remarks = { super = { "Mikä mahtava sairaala. Seuraavan kerran, kun olen sairas, haluan sinne hoitoon.", "No tuota voi jo kutsua sairaalaksi.", "Uskomaton sairaala. Ja minun pitäisi tietää; olen käynyt aika monessa.", }, good = { "Hyvin johdettu laitos. Kiitos, että kutsuit minut sinne.", "Hmm. Ei totisesti yhtään hullumpi sairaala.", "Nautin käynnistä mukavassa sairaalassasi. Tekeekö kenenkään mieli intialaista?", }, mediocre = { "No, olen nähnyt huonompiakin, mutta voisit kyllä tehdä hieman parannuksia.", "Voi että. Ei mikään mukava paikka, jos tuntee olonsa kurjaksi.", "Rehellisesti sanoen se oli ihan perussairaala. Odotin vähän enemmän.", }, bad = { "Miksi vaivauduin? Se oli kauheampaa kuin nelituntinen ooppera!", "Inhottava paikka. Kutsutaanko tuota sairaalaksi? Sikolättihän tuo oli!", "Olen kyllästynyt käymään tuollaisissa haisevissa koloissa julkisuuden henkilönä. Minä eroan!", }, very_bad = { "Mikä läävä! Yritän saada sen lakkautettua.", "En ole koskaan nähnyt noin kamalaa sairaalaa. Mikä häpeätahra!", "Olen järkyttynyt. Ei tuota voi kutsua sairaalaksi! Minä tarvitsen juotavaa.", }, }, }, -- Diagnosis failed diagnosis_failed = { choices = { send_home = "Lähetä potilas kotiin", take_chance = "Ota riski ja kokeile luultavinta hoitoa.", wait = "Pyydä potilasta odottamaan, että saat rakennettua lisää diagnoosihuoneita.", }, situation = "Olemme käyttäneet kaikkia diagnoosimenetelmiämme potilaan tutkimiseen, mutta emme tiedä vieläkään varmasti, mikä on vialla.", what_to_do_question = "Miten toimimme potilaan kanssa?", partial_diagnosis_percentage_name = "Tiedämme %d%%:n todennäköisyydellä, että potilaan sairaus on %s.", }, } -- Queue window queue_window = { num_in_queue = "Jono", num_expected = "Odotettu", num_entered = "Käyntejä", max_queue_size = "Jono enint.", } -- Dynamic info dynamic_info = { patient = { actions = { dying = "Tekee kuolemaa!", awaiting_decision = "Odottaa päätöstäsi", queueing_for = "Jonossa: %s", -- %s on_my_way_to = "Matkalla: %s", -- %s cured = "Parantunut!", fed_up = "Saanut tarpeekseen ja lähtee sairaalasta", sent_home = "Lähetetty kotiin", sent_to_other_hospital = "Lähetetty toiseen sairaalaan", no_diagnoses_available = "Ei diagnosointivaihtoehtoja jäljellä", no_treatment_available = "Hoitoa ei ole tarjolla - Menen kotiin", waiting_for_diagnosis_rooms = "Odottaa, että rakennat lisää diagnoosihuoneita", waiting_for_treatment_rooms = "Odottaa, että rakennat lisää hoitohuoneita", prices_too_high = "Hinnat ovat liian korkeat - Menen kotiin", epidemic_sent_home = "Terveystarkastaja lähettänyt kotiin", epidemic_contagious = "Tautini on tarttuva", no_gp_available = "Odottaa, että rakennat yleislääkärin toimiston", }, diagnosed = "Diagnoosi: %s", -- %s guessed_diagnosis = "Arvattu diagnoosi: %s", -- %s diagnosis_progress = "Diagnosointiprosessi", emergency = "Hätätilanne: %s", -- %s (disease name) }, vip = "Vieraileva VIP", health_inspector = "Terveystarkastaja", staff = { psychiatrist_abbrev = "Psyk.", tiredness = "Väsymys", ability = "Kyvyt", -- unused? actions = { waiting_for_patient = "Odottaa potilasta", wandering = "Vaeltaa ympäriinsä", going_to_repair = "Korjattava: %s", -- %s (name of machine) heading_for = "Matkalla kohteeseen: %s", fired = "Erotettu", }, }, object = { strength = "Kestävyys: %d", -- %d (max. uses) times_used = "Käyttökertoja: %d", -- %d (times used) queue_size = "Jonon pituus: %d", -- %d (num of patients) queue_expected = "Odotettu jonon pituus: %d", -- %d (num of patients) }, } -- Miscellangelous -- Category of strings that fit nowhere else or we are not sure where they belong. -- If you think a string of these fits somewhere else, please move it there. -- Don't forget to change all references in the code and other language files. misc = { grade_adverb = { mildly = "lievästi", moderately = "keskimääräisesti", extremely = "vakavasti", }, done = "Valmis", pause = "Keskeytä", send_message = "Lähetä viesti pelaajalle %d", -- %d (player number) send_message_all = "Lähetä viesti kaikille pelaajille", save_success = "Peli tallennettu", save_failed = "VIRHE: Pelin tallentaminen ei onnistunut", hospital_open = "Sairaala avattu", out_of_sync = "Peli ei ole synkronisoitu", load_failed = "VIRHE: Pelin lataaminen ei onnistunut", low_res = "Matala resol.", balance = "Tasapainotiedosto:", mouse = "Hiiri", force = "Voima", } original_credits = { " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", ":Suunnittelu ja toteutus", ":Bullfrog Productions", " ", ":Pluto Development Team", ",", "Mark Webley", "Gary Carr", "Matt Chilton", "Matt Sullivan", "Jo Rider", "Rajan Tande", "Wayne Imlach", "Andy Bass", "Jon Rennie", "Adam Coglan", "Natalie White", " ", " ", " ", ":Ohjelmointi", ",", "Mark Webley", "Matt Chilton", "Matt Sullivan", "Rajan Tande", " ", " ", " ", ":Ulkoasu", ",", "Gary Carr", "Jo Rider", "Andy Bass", "Adam Coglan", " ", " ", " ", ":Oheisohjelmointi", ",", "Ben Deane", "Gary Morgan", "Jonty Barnes", " ", " ", " ", ":Oheisulkoasu", ",", "Eoin Rogan", "George Svarovsky", "Saurev Sarkar", "Jason Brown", "John Kershaw", "Dee Lee", " ", " ", " ", ":Alkuanimaatio", ",", "Stuart Black", " ", " ", " ", ":Musiikki ja äänet", ",", "Russell Shaw", "Adrian Moore", " ", " ", " ", ":Oheismusiikki", ",", "Jeremy Longley", "Andy Wood", " ", " ", " ", ":Kuuluttajan ääni", ",", "Rebecca Green", " ", " ", " ", ":Tasojen suunnittelu", ",", "Wayne Imlach", "Natalie White", "Steven Jarrett", "Shin Kanaoya", " ", " ", " ", ":Skriptaus", ",", "James Leach", "Sean Masterson", "Neil Cook", " ", " ", " ", ":Tuotekehitys", " ", ":Grafiikkamoottori", ",", "Andy Cakebread", "Richard Reed", " ", " ", " ", ":Tuotekehitystuki", ",", "Glenn Corpes", "Martin Bell", "Ian Shaw", "Jan Svarovsky", " ", " ", " ", ":Kirjastot ja työkalut", " ", ":Dos ja Win 95 kirjasto", ",", "Mark Huntley", "Alex Peters", "Rik Heywood", " ", " ", " ", ":Verkkokirjasto", ",", "Ian Shippen", "Mark Lamport", " ", " ", " ", ":Äänikirjasto", ",", "Russell Shaw", "Tony Cox", " ", " ", " ", ":Asennusohjelma", ",", "Andy Nuttall", "Tony Cox", "Andy Cakebread", " ", " ", " ", ":Moraalinen tuki", ",", "Peter Molyneux", " ", " ", " ", ":Testausmanageri", ",", "Andy Robson", " ", " ", " ", ":Päätestaajat", ",", "Wayne Imlach", "Jon Rennie", " ", " ", " ", ":Pelitestaajat", ",", "Jeff Brutus", "Wayne Frost", "Steven Lawrie", "Tristan Paramor", "Nathan Smethurst", " ", "Ryan Corkery", "Simon Doherty", "James Dormer", "Martin Gregory", "Ben Lawley", "Joel Lewis", "David Lowe", "Robert Monczak", "Dominic Mortoza", "Karl O'Keeffe", "Michael Singletary", "Andrew Skipper", "Stuart Stephen", "David Wallington", " ", "Ja kaikki pelitestaajina toimineet harjoittelijat", " ", " ", " ", ":Tekninen tuki", ",", "Kevin Donkin", "Mike Burnham", "Simon Handby", " ", " ", " ", ":Markkinointi", ",", "Pete Murphy", "Sean Ratcliffe", " ", " ", " ", ":Kiittäen:", ",", "Tamara Burke", "Annabel Roose", "Chris Morgan", "Pete Larsen", " ", " ", " ", ":PR", ",", "Cathy Campos", " ", " ", " ", ":Dokumentaatio", ",", "Mark Casey", "Richard Johnston", "James Lenoel", "Jon Rennie", " ", " ", " ", ":Dokumentaatio & pakkaussuunnittelu", ",", "Caroline Arthur", "James Nolan", " ", " ", " ", ":Lokalisaation projektimanageri", ",", "Carol Aggett", " ", " ", " ", ":Lokalisaatio", ",", "Sandra Picaper", "Sonia 'Sam' Yazmadjian", " ", "Bettina Klos", "Alexa Kortsch", "Bianca Normann", " ", "C.T.O. S.p.A. Zola Predosa (BO)", "Gian Maria Battistini", "Maria Ziino", "Gabriele Vegetti", " ", "Elena Ruiz de Velasco", "Julio Valladares", "Ricardo Martínez", " ", "Kia Collin", "CBG Consult", "Ulf Thor", " ", " ", " ", ":Tuotanto", ",", "Rachel Holman", " ", " ", " ", ":Tuottaja", ",", "Mark Webley", " ", " ", " ", ":Apulaistuottaja", ",", "Andy Nuttall", " ", " ", " ", ":Toiminnot", ",", "Steve Fitton", " ", " ", " ", ":Yrityshallinto", ",", "Audrey Adams", "Annette Dabb", "Emma Gibbs", "Lucia Gobbo", "Jo Goodwin", "Sian Jones", "Kathy McEntee", "Louise Ratcliffe", " ", " ", " ", ":Yritysjohto", ",", "Les Edgar", "Peter Molyneux", "David Byrne", " ", " ", ":Kaikki Bullfrog Productions -työntekijät", " ", " ", " ", ":Erityiskiitokset", ",", "Kaikille Frimley Park Hospital -sairaalassa", " ", ":Erityisesti", ",", "Beverley Cannell", "Doug Carlisle", " ", " ", " ", ":Pitäkää ajatukset liikkeessä", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", ".", } CorsixTH-0.63/CorsixTH/Lua/languages/french.lua000066400000000000000000002024641347163623700213330ustar00rootroot00000000000000--[[ Copyright (c) 2010-2015 Nicolas "MeV" Elie 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. --]] Language(utf8 "Français", "French" , "fr", "fre", "fra") Inherit("english") Inherit("original_strings", 1) ----------------------------------------------------------- Override ----------------------------------------------------------- misc.save_failed = "ERREUR : partie non sauvegardée." -- Much more french tooltip.policy.diag_termination = "L'auscultation d'un patient continuera jusqu'à ce que les médecins soient sûrs à hauteur du pourcentage FIN PROCEDURE ou jusqu'à ce que toutes les machines de diagnostic aient été essayées. " -- Remove a superfluous word adviser.goals = { win = { -- Why are these strings uppercase? reputation = "Portez votre réputation à %d pour pouvoir gagner.", value = "Portez la valeur de votre hôpital à %d.", } } adviser.goals.lose.kill = "Tuez encore %d patients pour perdre !" -- tooltip.staff_list.next_person, prev_person is rather next/prev page (also in german, maybe more languages?) tooltip.staff_list.next_person = "Voir la page suivante" tooltip.staff_list.prev_person = "Voir la page précédente" -- Improve tooltips in staff window to mention hidden features tooltip.staff_window.face = "Visage - cliquez pour ouvrir la fenêtre de gestion" tooltip.staff_window.center_view = "clic gauche pour focaliser sur la personne, pour faire défiler les membres du personnel" -- Fix Winning texts letter = { [1] = { -- Level one: Fix issue 329 [1] = "Estimable %s", [2] = "Splendide ! Vous avez admirablement géré cet hôpital. Nous, pontes du Ministère de la Santé, souhaitons savoir si vous aimeriez prendre en charge un plus grand projet. Nous comptons sur vous. Le salaire serait de %d$ et ça vaut la peine d'y réfléchir.", [3] = "Que diriez-vous de travailler à l'hôpital de %s ?", }, [2] = { -- Level two: Add missing spaces before punctuation marks [1] = "Estimable %s", [2] = "Formidable ! Vous avez fait de grands progrès dans votre hôpital. Nous vous avons trouvé un autre établissement pour exercer vos talents et relever des défis. Vous pouvez refuser mais ce serait dommage. Le salaire est de %d$.", [3] = "Acceptez-vous le poste à l'hôpital de %s ?", }, [3] = { -- Level three: Add missing spaces before punctuation marks [1] = "Estimable %s", [2] = "Vous avez parfaitement réussi dans cet hôpital. C'est la raison pour laquelle nous vous proposons une nouvelle situation. Le salaire serait de %d$ et nous pensons que vous adorerez relever ce nouveau défi.", [3] = "Acceptez-vous de gérer l'hôpital de %s ?", }, [4] = { -- Level four: Add missing spaces before punctuation marks [1] = "Estimable %s", [2] = "Félicitations ! Le Ministère de la Santé est très impressionné par vos capacités à gérer cet hôpital. Vous êtes un exemple de réussite dans ce domaine. Vous voudrez peut-être une situation plus élevée, toutefois. Vous seriez payé %d$, et la décision vous revient.", [3] = "Êtes-vous prêt à accepter un poste à l'hôpital de %s ?", }, [5] = { -- Level five: Add missing spaces before punctuation marks and between words [1] = "Estimable %s", [2] = "Nouvelles salutations. Nous respectons votre souhait de ne pas quitter ce charmant hôpital, mais nous vous supplions d'y réfléchir. Nous vous proposons la coquette somme de %d$ pour accepter de diriger un autre hôpital avec autant de succès.", [3] = "Aimeriez-vous prendre la tête de l'hôpital de %s ?", }, [6] = { -- Level six: Add missing spaces before punctuation marks, fix last string which contained an anglicism [1] = "Estimable %s", [2] = "Nous savons que vous êtes heureux de vous occuper de cette délicieuse institution mais nous pensons que vous devez penser à l'avenir. Vous pourriez prétendre au salaire de %d$ si vous acceptez de changer de situation. Pensez-y.", [3] = "Voulez-vous un poste à l'hôpital de %s ?", }, [7] = { -- Level seven: Add missing spaces before punctuation marks [1] = "Estimable %s", [2] = "Le Ministère de la Santé souhaite que vous reconsidériez votre décision de rester dans cet hôpital. Nous savons que vous avez un charmant établissement mais il est temps de relever un nouveau défi, avec un salaire attrayant de %d$.", [3] = "Êtes-vous prêt à travailler à l'hôpital de %s ?", }, [8] = { -- Level height: Add missing spaces before punctuation marks [1] = "Estimable %s", [2] = "Vous aviez donné une réponse négative à notre dernière lettre vous proposant un grand poste dans un nouvel hôpital, avec un coquet salaire de %d$. Nous pensons que vous devez revoir votre décision car nous avons pour vous un poste idéal.", [3] = "Voulez-vous bien accepter un poste à l'hôpital de %s ? S'il vous plaît !", }, [9] = { -- Level nine: Add missing spaces before punctuation marks, fix some sentences, add missing diacritics [1] = "Estimable %s", [2] = "Vous vous êtes montré le meilleur directeur d'hôpital jamais connu dans la longue et mouvementée histoire de la médecine. Nous sommes fiers de vous offrir le poste de Chef Suprême des Hôpitaux. Ce titre honorifique vous garantit un salaire de %d$. On fera pour vous une parade pleine de serpentins et les gens vous baiseront les pieds.", [3] = "Merci pour tout ce que vous avez fait. Vous avez mérité cette semi-retraite.", }, [10] = { -- Level ten: Fix some sentences [1] = "Estimable %s", [2] = "Félicitations pour avoir réussi dans tous les hôpitaux que vous avez dirigés. Une telle performance fait de vous un héros. Vous recevrez une pension de %d$ plus une limousine. Tout ce que nous vous demandons, c'est d'aller de ville en ville rencontrer votre public en adoration et défendre le renom des hôpitaux.", [3] = "Nous sommes tous fiers de vous et notre coeur déborde de gratitude pour votre dévouement à sauver des vies.", }, [11] = { -- Level eleven: No change [1] = "Estimable %s", [2] = "Votre carrière est exemplaire et vous êtes une inspiration pour nous tous. Merci d'avoir géré tous ces hôpitaux avec autant de talent. Nous souhaitons vous offrir une rente à vie de %d$ pour simplement aller de ville en ville à bord d'une voiture de prestige pour saluer la foule et donner des conférences sur votre incroyable réussite.", [3] = "Vous êtes un exemple pour toute personne sensée et tout le monde, sans exception, vous considère comme un modèle absolu.", }, [12] = { -- Level twelve: Add missing spaces before punctuation marks [1] = "Estimable %s", [2] = "Votre carrière réussie en tant que meilleur directeur d'hôpital depuis la nuit des temps arrive à sa fin. Toutefois, vous avez eu sur le monde tranquille de la médecine une telle influence que le Ministre vous offre un salaire de %d$ uniquement pour paraître en public, faire des inaugurations, baptiser des navires et participer à des débats. Le monde entier vous acclame et c'est la meilleure des publicités pour le Ministère de la Santé !", [3] = "Veuillez accepter cette situation : ce n'est pas trop difficile et vous aurez, en plus, une escorte de police partout où vous irez.", }, } -- The originals of some of these string lack a space before punctuation marks and or between words misc.balance = "Ajustage :" tooltip.pay_rise_window.decline = "Ne payez pas, licenciez !" tooltip.watch = { emergency = "Urgence : temps qui reste pour soigner les patients entrés en urgence.", hospital_opening = "Délai : ceci est le temps qui reste avant que votre hôpital soit ouvert. Cliquez sur GO pour l'ouvrir tout de suite.", epidemic = "Épidémie : temps qui reste pour arrêter l'épidémie. Si ce délai expire OU si un malade contagieux quitte l'hôpital, un inspecteur sanitaire viendra... Le bouton active ou désactive la vaccination. Cliquez sur un patient pour lancer la vaccination par une infirmière.", } tooltip.objects = { chair = "Chaise : le patient s'y assied pour parler de ses symptômes.", sofa = "Sofa : c'est ce qui permet aux employés de se relaxer... sauf s'ils trouvent mieux...", bench = "Banc : pour que les patients puissent attendre confortablement.", video_game = "Jeu vidéo : l'équipe se relaxe en jouant à Hi-Octane.", lamp = "Lampe : vous avez déjà essayé de travailler dans le noir ?", door = "Porte : les gens aiment les ouvrir et les fermer.", auto_autopsy = "Autopsie : très utile pour la recherche.", tv = "TV : votre équipe ne doit pas manquer ses programmes favoris.", litter_bomb = "Bombe à détritus : pour saboter les hôpitaux concurrents.", inflator = "Gonfleur : pour soigner l'encéphalantiasis.", desk = "Bureau : essentiel pour poser un ordinateur.", pool_table = "Billard : pour la relaxation du personnel.", bed = "Lit : les cas graves ont besoin de rester couchés.", bookcase = "Étagère : pour les ouvrages de référence.", drinks_machine = "Distributeurs : contre la soif et pour ramasser des gros sous.", skeleton = "Squelette : utile pour l'enseignement et pour Halloween.", computer = "Ordinateur : une composante essentielle de la recherche.", bin = "Poubelle : les patients y jettent leurs détritus.", pharmacy_cabinet = "Pharmacie : c'est là qu'on dispense les médicaments.", radiator = "Radiateur : permet de garder l'hôpital au chaud.", atom_analyser = "Mélangeur : installé au Département Recherche, cette machine accélère tout le processus d'étude.", plant = "Plante : plaît aux patients et purifie l'air.", toilet = "Toilettes : les patients en ont, euh, besoin.", fire_extinguisher = "Extincteur : pour minimiser les dangers causés par des machines défectueuses.", lecture_chair = "Chaise : les médecins en formation s'asseyent là pour prendre des notes et s'ennuyer. Plus vous mettrez des chaises, plus vous pourrez former de médecins.", toilet_sink = "Lavabo : s'il n'y en a pas assez, les patients qui apprécient l'hygiène seront mécontents.", cabinet = "Placard : dossiers des patients, notes de recherche.", } room_descriptions = { gp = { [2] = "C'est une salle de diagnostic fondamentale pour votre hôpital. Elle accueille les nouveaux patients pour les ausculter. Ils sont ensuite orientés vers une autre salle, soit pour un autre diagnostic soit pour être soignés. Vous devriez construire un autre cabinet de médecine générale au cas où celui-ci serait débordé. Plus l'endroit est grand et plus vous pouvez y placer des équipements, sans compter que c'est bon pour le prestige du médecin. C'est valable pour toutes les salles, en fait.", }, pharmacy = { [2] = "Les patients dont le mal a été diagnostiqué et dont le traitement est un médicament peuvent se rendre à la pharmacie. Comme la recherche découvre toujours de nouveaux traitements, l'activité de cette salle est en constante évolution. Vous aurez à construire une autre pharmacie plus tard.", }, general_diag = { [3] = "La salle de diagnostic nécessite un médecin. Il faut également un agent de maintenance pour un entretien périodique. ", }, fracture_clinic = { [2] = "Les patients dont les os étaient en morceaux se rendront dans cette salle. Le déplâtreur dégagera les membres en ne causant qu'une faible douleur.", }, inflation = { [2] = "Les patients souffrant de l'affreuse-mais-si-drôle encéphalantiasis sont soignés à la salle de gonflage, où leur tête démesurée sera dégonflée puis regonflée à la bonne taille.", }, hair_restoration = { [2] = "Les patients souffrant de sévère calvitie se rendront dans cette salle équipée d'un moumouteur. Un médecin utilisera la machine pour donner aux patients une nouvelle chevelure.", }, electrolysis = { [2] = "Les patients souffrant de pilose viennent dans cette salle où une machine arrache les poils et scelle les pores selon un procédé qui n'est pas sans rappeler la cimentation.", }, staff_room = { [2] = "Votre équipe finit par se fatiguer et a besoin de cette salle pour se remettre. Une équipe fatiguée est lente, revendicatrice et peut même envisager de démissionner. De plus, elle risque de commettre des erreurs. Il est avisé de construire une salle de repos bien aménagée et de prévoir assez de place pour plusieurs membres à la fois.", } } progress_report.too_hot = "Réglez le chauffage : on étouffe." adviser.tutorial.build_pharmacy = "Félicitations ! Construisez maintenant une pharmacie et embauchez une infirmière." adviser.epidemic.serious_warning = "Cette maladie contagieuse est dangereuse. Vous devez prendre des mesures d'urgence !" adviser.staff_advice.too_many_doctors = "Il y a trop de médecins. Certains n'ont rien à faire !" adviser.earthquake.ended = "Ouh là ! J'ai cru que c'était la fin ! C'était du %d sur l'échelle de Richter." adviser.multiplayer.poaching = { not_interested = "Ha ! Ils ne veulent pas travailler pour vous, ils sont satisfaits comme ça.", already_poached_by_someone = "Eh non ! Quelqu'un s'intéresse déjà à cette personne.", } adviser.vomit_wave.ended = "Ouf ! On dirait que le virus qui provoquait des nausées est enfin enrayé. Gardez l'hôpital propre, à l'avenir." adviser.research.new_available = "Nouveau : un(e) %s est disponible." adviser.research.drug_improved_1 = "Le traitement contre la %s a été amélioré par votre département de recherche." adviser.warnings = { money_low = "Les fonds sont en baisse !", no_patients_last_month = "Pas de nouveaux patients le mois dernier. Honteux !", machines_falling_apart = "Les machines tombent en panne. Faites-les réparer !", bankruptcy_imminent = "Hé ! Vous courez à la faillite. Attention !", too_many_plants = "Il y a bien trop de plantes. C'est la jungle, ici !", many_killed = "Vous avez laissé mourir %d personnes. Idiot ! Vous êtes censé les soigner.", falling_1 = "Hé ! Ce n'est pas drôle, regardez ou vous cliquez, quelqu'un pourrait être blessé !", falling_2 = "Arrêtez de faire n'importe quoi, qu'en penseriez-vous à leur place ?", falling_3 = "Aïe, ça doit faire mal, qu'on appelle un médecin !", falling_4 = "C'est un hôpital, pas un parc d'attraction !", falling_5 = "Ce n'est pas un endroit pour bousculer les gens, ils sont malades vous savez ?", falling_6 = "Ce n'est pas un bowling, les gens malades ne devraient pas être traités comme ça !", handymen_tired = "Les agents de maintenance sont très fatigués. Laissez-les se reposer.", -- Add a missing letter } adviser.placement_info.object_cannot_place = "Hé ! Vous ne pouvez pas placer cet objet ici." adviser.information = { epidemic = "Une maladie contagieuse sévit dans votre hôpital. Vous devez l'enrayer immédiatement !", emergency = "C'est une urgence ! Vite ! Vite ! VITE !", initial_general_advice = { first_epidemic = "Il y a une épidémie dans votre hôpital ! A vous de voir si vous étouffez l'affaire ou si vous en parlez.", }, patient_leaving_too_expensive = "Un patient part sans payer la facture pour %s. Sacrée perte !", vip_arrived = "Attention ! %s arrive pour visiter votre hôpital ! Faites en sorte de lui faire bonne impression.", first_death = "Vous venez de tuer votre premier patient. Alors, heureux ?", promotion_to_specialist = "L'un de vos MÉDECIN est devenu un SPÉCIALISTE.", -- Fix the famous "Level 5 bug" } buy_objects_window = { price = "Prix : ", total = "Total : ", } fax = { epidemic_result = { close_text = "Hourra !", rep_loss_fine_amount = "Les journaux vont s'en donner à cœur joie avec cette affaire. Votre réputation va en prendre un coup ! Sans oublier l'amende de %d.", }, vip_visit_result = { telegram = "Télégramme !", vip_remarked_name = "Après avoir visité votre hôpital, %s a dit : ", remarks = { very_bad = { [1] = "Quelle déception ! On devrait fermer cet endroit.", [2] = "Je n'ai jamais vu ça. Quelle honte !", [3] = "Je suis sous le choc. Et on appelle ça un hôpital ! Il me faut un verre pour m'en remettre.", }, bad = { [2] = "Ce que j'ai vu est révoltant. Ce n'est pas un hôpital, c'est une porcherie !", [3] = "J'en ai assez de devoir faire des visites officielles dans des trous puants comme celui-ci. Je démissionne !", }, }, }, disease_discovered_patient_choice = { what_to_do_question = "Que voulez-vous faire du patient ?", }, debug_fax = { close_text = "Ouais, ouais, ouais !", }, diagnosis_failed = { what_to_do_question = "Que faire du patient ?", partial_diagnosis_percentage_name = "Il y a %d pour cent de chances que la maladie soit %s." }, } fax.epidemic.declare_explanation_fine = "Si vous déclarez l'épidémie, vous aurez une amende de %d, un changement de réputation et tous les patients seront vaccinés automatiquement." fax.emergency.num_disease = "Il y a %d personnes atteintes de %s qui ont besoin de soins immédiats." dynamic_info = { patient = { actions = { prices_too_high = "C'est trop cher : je rentre chez moi.", no_diagnoses_available = "Plus de diagnostic : je rentre chez moi.", cured = "Guéri !", no_treatment_available = "Pas de traitement : je rentre chez moi.", }, diagnosed = "Ausculté : %s", } } transactions = { cure_colon = "Guérison :", final_treat_colon = "Trait final :", treat_colon = "Trait :", advance_colon = "Avance :", insurance_colon = "Assurance :", } diseases = { third_degree_sideburns = { cause = "Cause : regret pathologique des années 70.", cure = "Traitement : un psychiatre doit faire comprendre au patient qu'il faut changer d'époque comme de chemise.", name = "Rétrostalgie", symptoms = "Symptômes : passion immodérée des pantalons à pattes d'éléphant et des paillettes.", }, discrete_itching = { cause = "Cause : petits bestioles à dents aiguës.", cure = "Traitement : un sirop gluant est administré pour empêcher les démangeaisons.", name = "Morpionnite", symptoms = "Symptômes : le patient se gratte jusqu'au sang.", }, the_squits = { cause = "Cause : avoir mangé de la pizza ramassée derrière la cuisinière.", cure = "Traitement : un mélange gluant de diverses substances synthétiques est administré au patient pour solidifier son, euh, contenu.", name = "Courante", symptoms = "Symptômes : hum. Vous voyez le genre.", }, spare_ribs = { cause = "Cause : trop de temps passé sur un sol froid.", cure = "Traitement : deux chirurgiens retirent les côtes flottantes et les donnent au patient dans un sac à emporter.", name = "Excès costal", symptoms = "Symptômes : déplaisante sensation de flottement.", }, diag_blood_machine = { name = "Diag Sanguimachine", }, king_complex = { cause = "Cause : l'esprit du King s'est emparé de celui du patient et l'a envahi.", cure = "Traitement : un psychiatre explique au patient à quel point tout ceci est ridicule.", name = "Syndrome du King", symptoms = "Symptômes : passion pour les chaussures en daim bleu et pour les cheeseburgers.", }, diag_x_ray = { name = "Diag Rayons X", }, pregnancy = { cause = "Cause : pannes de courant en zones urbaines.", cure = "Traitement : le bébé est prélevé en salle d'opération puis soigneusement nettoyé pour faire son entrée dans le monde.", name = "Grossesse", symptoms = "Symptômes : gloutonnerie avec hypertrophie du ventre.", }, fake_blood = { cause = "Cause : avoir été victime d'une très mauvaise plaisanterie.", cure = "Traitement : seule une cure psychiatrique peut calmer le patient.", name = "Sang factice", symptoms = "Symptômes : le patient voit son sang s'évaporer.", }, diag_psych = { name = "Diag Psychiatre", }, invisibility = { cause = "Cause : morsure par une fourmi radioactive (et invisible).", cure = "Traitement : il suffit de faire boire au patient un liquide coloré dispensé à la pharmacie pour le rendre pleinement observable.", name = "Invisibilité", symptoms = "Symptômes : le patient ne souffre pas mais a une forte propension à utiliser son état pour faire des farces à son entourage.", }, golf_stones = { cause = "Cause : exposition au gaz empoisonné contenu dans les balles de golf.", cure = "Traitement : résection des surplus par une équipe de deux chirurgiens.", name = "Pierres de golf", symptoms = "Symptômes : formation nodules excédentaires.", }, diag_general_diag = { name = "Diag Généraliste", }, infectious_laughter = { cause = "Cause : exposition à un comique de situation.", cure = "Traitement : un psychiatre doit faire comprendre au patient à quel point son état est sérieux.", name = "Fou rire", symptoms = "Symptômes : gloussement irrépressible et répétition compulsive d'accroches même pas drôles.", }, general_practice = { name = "Généraliste", }, baldness = { cause = "Cause : avoir raconté trop de mensonges pour se rendre intéressant.", cure = "Traitement : pose très douloureuse de cheveux à l'aide d'un moumouteur.", name = "Calvitie", symptoms = "Symptômes : tête en boule de billard et gros complexe.", }, heaped_piles = { cause = "Cause : s'être assis sur un jet de jacuzzi.", cure = "Traitement : une potion agréable bien que puissamment acide dissout les rectoïdes de l'intérieur.", name = "Rectoïdes", symptoms = "Symptômes : le patient a l'impression de s'asseoir sur un sac de billes.", }, unexpected_swelling = { cause = "Cause : n'importe quoi d'inattendu.", cure = "Traitement : le dégonflement est obtenu par une délicate opération pratiquée par deux chirurgiens.", name = "Bouffissure", symptoms = "Symptômes : bouffissure généralisée.", }, jellyitis = { cause = "Cause : abus de produits riches en gélifiant et trop d'exercice.", cure = "Traitement : le patient est immergé dans un dégélifiant.", name = "Gélatine", symptoms = "Symptômes : grande mollesse et tendance à l'écroulement.", }, hairyitis = { cause = "Cause : exposition prolongée au clair de lune.", cure = "Traitement : on fait disparaître les poils avec un électrolyseur et les pores sont scellés.", name = "Pilose", symptoms = "Symptômes : le patient développe un odorat accru.", }, alien_dna = { cause = "Cause : agrippeurs faciaux munis de sang extraterrestre intelligent.", cure = "Traitement : l'ADN est retiré par un correcteur pour être nettoyé puis restitué rapidement.", name = "ADN Alien", symptoms = "Symptômes : le patient se métamorphose progressivement en sale machin d'outre-espace et veut tout détruire.", }, bloaty_head = { cause = "Cause : avoir reniflé du fromage et bu de l'eau de pluie.", cure = "Traitement : la tête est éclatée puis regonflée à la bonne dimension à l'aide d'une astucieuse machine.", name = "Encéphalantiasis", symptoms = "Symptômes : affreux maux de tête.", }, gastric_ejections = { cause = "Cause : nourriture mexicaine ou indienne très épicée.", cure = "Traitement : administration par voie orale d'une solution spéciale pour endiguer les rejets.", name = "Éjections gastriques", symptoms = "Symptômes : le patient rejette par accès des bribes de nourriture mal digérée.", }, uncommon_cold = { cause = "Cause : divers trucmuches volant dans l'air", cure = "Traitement : absorption d'une grande rasade d'un sirop spécial élaboré à la pharmacie.", name = "Catarhume", symptoms = "Symptômes : nez qui coule, éternuements, poumons décolorés.", }, corrugated_ankles = { cause = "Cause : avoir roulé trop vite sur des ralentisseurs.", cure = "Traitement : le patient doit absorber un mélange d'herbes et d'épices légèrement toxique dont l'effet redressera illico les chevilles.", name = "Chevilles ondulées", symptoms = "Symptômes : les chaussures ne s'ajustent plus.", }, sleeping_illness = { cause = "Cause : hypertrophie de la glande palatale de Morphée.", cure = "Traitement : une infirmière administre une forte dose d'un puissant stimulant.", name = "Roupillance", symptoms = "Symptômes : tendance irrépressible à tomber de sommeil.", }, sweaty_palms = { cause = "Cause : terreur des entretiens d'embauche.", cure = "Traitement : un psychiatre détend le patient en lui racontant celle du fou qui repeint son plafond.", name = "Mains moites", symptoms = "Symptômes : serrer la main du patient revient à presser une éponge détrempée.", }, serious_radiation = { cause = "Cause : avoir pris du plutonium pour des bonbons.", cure = "Traitement : le patient est passé à la douche de décontamination et consciencieusement récuré.", name = "Radionite", symptoms = "Symptômes : le patient ne se sent vraiment, vraiment pas bien.", }, diag_cardiogram = { name = "Diag Cardio", }, diag_scanner = { name = "Diag Scanner", }, gut_rot = { cause = "Cause : la Bonne Vieille Bibine de la Mère Sam.", cure = "Traitement : une infirmière doit administrer diverses substances chimiques pour tenter de colmater le tout.", name = "Tripurulente", symptoms = "Symptômes : aucun microbe mais plus de paroi intestinale non plus.", }, iron_lungs = { cause = "Cause : pollution atmosphérique combinée aux remugles de kébab.", cure = "Traitement : deux chirurgiens enlèvent le blindage en salle d'opération.", name = "Poumons de fer", symptoms = "Symptômes : envie de respirer du feu et de hurler sous l'eau.", }, broken_wind = { cause = "Cause : utilisation d'un appareil de musculation juste après un repas.", cure = "Traitement : une mixture d'eau lourde est administrée à la pharmacie.", name = "Pétomanie", symptoms = "Symptômes : pollution de l'air des personnes situées derrière le patient.", }, kidney_beans = { cause = "Cause : avoir croqué les glaçons de son cocktail.", cure = "Traitement : deux chirurgiens extraient les cristaux sans endommager le rein.", name = "Cristaux rénaux", symptoms = "Symptômes : douleur et fréquentes visites aux toilettes.", }, transparency = { cause = "Cause : avoir léché le yaourt adhérent au couvercle à l'ouverture d'un pot.", cure = "Traitement : administration d'une potion fraîche et colorée préparée à la pharmacie.", name = "Transparence", symptoms = "Symptômes : la chair est horrible et transparente.", }, broken_heart = { cause = "Cause : avoir croisé quelqu'un de plus riche, plus jeune et plus beau.", cure = "Traitement : deux chirurgiens ouvrent la poitrine et réparent doucement le coeur en retenant leur souffle.", name = "Coeur brisé", symptoms = "Symptômes : pleurnicheries et crampes causées par des heures à regarder de vieilles photos de vacances.", }, slack_tongue = { cause = "Cause : trop de discussion à propos des romans-feuilletons.", cure = "Traitement : la langue est placée dans un taille-langue puis elle est coupée rapidement, efficacement et douloureusement.", name = "Hyperlangue", symptoms = "Symptômes : la langue s'étire jusqu'à cinq fois sa longueur normale.", }, tv_personalities = { cause = "Cause : avoir abusé des programmes télévisés.", cure = "Traitement : un psychiatre doit convaincre le patient d'échanger sa télévision contre une radio.", name = "Téléincarnation", symptoms = "Symptômes : le patient a l'illusion d'être capable de présenter une émission de cuisine.", }, ruptured_nodules = { cause = "Cause : saut à l'élastique par temps froid.", cure = "Traitement : deux chirurgiens doivent réajuster les parties concernées d'une main sûre.", name = "Casse-boules", symptoms = "Symptômes : impossibilité de s'asseoir confortablement.", }, fractured_bones = { cause = "Cause : chute spectaculaire sur du béton.", cure = "Traitement : un plâtre est posé puis ôté à l'aide d'un équipement au laser.", name = "Fractures", symptoms = "Symptômes : affreux craquement et incapacité à utiliser les membres touchés.", }, chronic_nosehair = { cause = "Cause : avoir reniflé avec dédain à la vue de plus malheureux que soi.", cure = "Traitement : une épouvantable potion dépilatoire est administrée par une infirmière à la pharmacie.", name = "Poilonisme", symptoms = "Symptômes : poils au nez si drus qu'un oiseau pourrait y nicher.", }, } confirmation = { quit = "Vous avez choisi Quitter. Voulez-vous vraiment quitter le jeu ?", return_to_blueprint = "Êtes-vous sûr de vouloir revenir au mode Tracé ?", restart_level = "Êtes-vous sûr de vouloir relancer ce niveau ?", overwrite_save = "Il y a déjà une partie sauvegardée ici. Êtes-vous sûr de vouloir l'écraser ?", delete_room = "Voulez-vous vraiment détruire cette salle ?", sack_staff = "Êtes-vous sûr de vouloir licencier ?", replace_machine = "Voulez-vous vraiment remplacer cette machine ?", } -- The originals of these strings contain one space too much trophy_room.sold_drinks.trophies[2] = "Vous recevez le prix Bubulles du Syndicat des Vendeurs de Limonade pour récompenser la quantité de sodas vendus dans votre hôpital au cours de l'année écoulée. " tooltip.status.percentage_cured = "Vous devez soigner %d%% des visiteurs de l'hôpital. Actuellement, vous en avez soigné %d%%" tooltip.status.num_cured = "L'objectif est de soigner %d personnes. Pour le moment, vous en avez soigné %d" dynamic_info.staff.actions.going_to_repair = "Pour réparer %s" adviser.staff_place_advice.only_doctors_in_room = "Seuls les médecins peuvent travailler en %s" adviser.staff_place_advice.nurses_cannot_work_in_room = "Les infirmières ne peuvent travailler en %s" pay_rise.definite_quit = "Rien ne me fera rester ici. J'en ai assez." place_objects_window.confirm_or_buy_objects = "Vous pouvez valider ainsi ou bien soit acheter soit déplacer des objets." ----------------------------------------------------------- New strings ----------------------------------------------------------- date_format = { daymonth = "%1% %2:months%", } -- Objects object.litter = "Déchet" tooltip.objects.litter = "Déchet : laissé sur le sol par un patient car il n'a pas trouvé de poubelle où le jeter." tooltip.fax.close = "Fermer cette fenêtre sans supprimer le message" tooltip.message.button = "clic gauche pour ouvrir le message" tooltip.message.button_dismiss = "clic gauche pour ouvrir le message, clic droit pour le rejeter" tooltip.casebook.cure_requirement.hire_staff = "Vous devez embaucher du personnel pour gérer ce traitement" tooltip.casebook.cure_type.unknown = "Vous ne savez pas encore comment traiter cette maladie" tooltip.research_policy.no_research = "Aucune recherche n'est actuellement effectuée dans cette catégorie" tooltip.research_policy.research_progress = "Progrès vers la prochaine découverte dans cette catégorie : %1%/%2%" menu_file = { load = " (%1%) CHARGER ", save = " (%1%) ENREGISTRER ", restart = " (%1%) RELANCER", quit = " (%1%) QUITTER ", } -- Options menu menu_options = { lock_windows = " FIGER LES FENETRES ", edge_scrolling = " DEFILEMENT PAR BORD ", adviser_disabled = " (%1%) ASSISTANT ", warmth_colors = " COULEURS CHAUDES ", wage_increase = " AUGMENTATION DE SALAIRE ", twentyfour_hour_clock = " HORLOGE 24 HEURES ", } menu_options_game_speed = { pause = " (%1%) PAUSE ", slowest = " (%1%) AU PLUS LENT ", slower = " (%1%) PLUS LENT ", normal = " (%1%) NORMAL ", max_speed = " (%1%) VITESSE MAXI ", and_then_some_more = " (%1%) ET ENCORE PLUS ", } menu_options_warmth_colors = { choice_1 = " ROUGE ", choice_2 = " BLEU VERT ROUGE ", choice_3 = " JAUNE ORANGE ROUGE ", } menu_options_wage_increase = { grant = " ACCORDER ", deny = " REFUSER ", } -- Charts Menu ' Temporary; must see in-game for correct translation menu_charts = { bank_manager = " (%1%) GESTION BANCAIRE ", statement = " (%1%) DECLARATION ", staff_listing = " (%1%) LISTE DU PERSONNEL ", town_map = " (%1%) CARTE DE LA VILLE ", casebook = " (%1%) MALLETTE ", research = " (%1%) RECHERCHE ", status = " (%1%) STATUTS ", graphs = " (%1%) GRAPHIQUES ", policy = " (%1%) POLITIQUE ", } -- Debug menu menu_debug = { jump_to_level = " ALLER AU NIVEAU ", connect_debugger = " (%1%) CONNECTER AU SERVEUR DE DÉBOGUAGE ", transparent_walls = " (%1%) MURS TRANSPARENTS ", limit_camera = " LIMITER LA CAMERA ", disable_salary_raise = " DÉSACTIVER LES AUGMENTATIONS DE SALAIRE ", make_debug_fax = " CRÉER UN FAX DE TEST ", make_debug_patient = " CRÉER UN PATIENT DE TEST ", cheats = " (%1%) TRICHES ", lua_console = " (%1%) CONSOLE LUA ", debug_script = " (%1%) ACTIVER LE DÉBOGUAGE PAR SCRIPT ", calls_dispatcher = " RÉPARTITION DES TÂCHES ", dump_strings = " (%1%) EXTRAIRE LES TEXTES ", dump_gamelog = " (%1%) EXTRAIRE LE JOURNAL DE JEU ", map_overlay = " INCRUSTATIONS DE CARTE ", sprite_viewer = " VISIONNEUSE DE SPRITES ", } menu_debug_overlay = { none = " AUCUN ", flags = " DRAPEAUX ", positions = " POSITIONS ", heat = " TEMPÉRATURE ", byte_0_1 = " OCTETS 0 & 1 ", byte_floor = " OCTET SOL ", byte_n_wall = " OCTET MUR N ", byte_w_wall = " OCTET MUR O ", byte_5 = " OCTET 5 ", byte_6 = " OCTET 6 ", byte_7 = " OCTET 7 ", parcel = " PARCELLE ", } menu_player_count = { players_1 = " 1 JOUEUR ", players_2 = " 2 JOUEURS ", players_3 = " 3 JOUEURS ", players_4 = " 4 JOUEURS ", } -- Adviser adviser = { room_forbidden_non_reachable_parts = "Placer la pièce à cet endroit rendrait inaccessibles certaines parties de l'hôpital", warnings = { no_desk = "Vous devriez construire un bureau de réception et engager une réceptionniste un de ces jours !", no_desk_1 = "Si vous voulez que des patients viennent dans votre hôpital, vous devez embaucher une réceptionniste et lui construire un bureau pour travailler !", no_desk_2 = "Bien joué, ça doit être un record : presque un an et pas de patient ! Si vous voulez continuer comme directeur de cet hôpital, vous devez embaucher une réceptionniste et lui construire un bureau pour travailler !", no_desk_3 = "C'est tout simplement génial, presque un an et vous n'avez pas embauché de réceptionniste ! Comment espérez obtenir le moindre patient ? Arrangez-ça et arrêtez de perdre votre temps !", no_desk_4 = "Une réceptionniste aura besoin d'un bureau pour accueillir des patients", no_desk_5 = "Il était temps, maintenant les patients devraient commencer à arriver bientôt !", no_desk_6 = "Vous avez une réceptionniste, peut-être il est temps de construire un bureau où elle peut travailler ?", no_desk_7 = "Maintenant, que vous avez une réception, que diriez-vous d'embaucher une réceptionniste également ? Vous n'aurez pas de patients avant de l'avoir fait !", cannot_afford = "Vous n'avez pas assez d'argent à la banque pour embaucher cette personne !",-- I can't see anything like this in the original strings cannot_afford_2 = "Vous n'avez pas assez d'argent à la banque pour effectuer l'achat !", research_screen_open_1 = "Vous devez construire une salle de recherche avant de pouvoir accéder à l'écran des recherches.", research_screen_open_2 = "La recherche est désactivée pour le niveau en cours.", researcher_needs_desk_1 = "Chaque chercheur a besoin d'un bureau pour travailler.", researcher_needs_desk_2 = "Vos chercheurs sont heureux d'obtenir une pause bien méritée. Si vous voulez que plusieurs chercheurs puissent travailler en même temps.", researcher_needs_desk_3 = "Un chercheur a toujours besoin d'un bureau.", nurse_needs_desk_1 = "Chaque infirmière a besoin de son propre bureau.", nurse_needs_desk_2 = "Votre infirmière est heureuse d'avoir une pause. Si vous comptez y faire travailler plusieurs personnes en même temps, vous devez leur construire un bureau à chacune.", low_prices = "Vous facturez trop peu pour %s. Ça va amener des gens dans votre hôpital, mais vous ne ferez pas beaucoup de profit sur chacun d'eux.", high_prices = "Votre tarif pour %s est trop élevé. Ça va générer plus de profit sur le court-terme, mais à la longue les gens vont fuir.", fair_prices = "Le prix pour %s semble juste et équilibré.", patient_not_paying = "Un patient est parti sans payer pour %s parce que c'est trop cher !", }, cheats = { th_cheat = "Félicitations, vous avez débloqué les triches !", roujin_on_cheat = "Défi de Roujin activé ! Bonne chance...", roujin_off_cheat = "Défi de Roujin désactivé.", }, } -- Dynamic information dynamic_info.patient.actions.no_gp_available = "Attente d'un cabinet de médecine générale" dynamic_info.staff.actions.heading_for = "Va vers %s" dynamic_info.staff.actions.fired = "Renvoyé" dynamic_info.patient.actions.epidemic_vaccinated = "Je ne suis plus contagieux" -- Progress report progress_report.free_build = "CONSTRUCTION LIBRE" -- Fax messages fax = { choices = { return_to_main_menu = "Retourner au menu principal", accept_new_level = "Aller au niveau suivant", decline_new_level = "Continuer la partie encore un peu", }, emergency = { num_disease_singular = "Il y a 1 personne atteinte de %s qui a besoin de soins immédiats.", free_build = "Si vous réussissez votre réputation augmentera mais si vous échouez votre réputation sera sérieusement entachée.", }, vip_visit_result = { remarks = { free_build = { "C'est vraiment un bel hôpital que vous avez là ! Pas trop difficile d'y arriver sans limite d'argent, hein ?", "Je ne suis pas économiste, mais je pense que je pourrais faire tourner cet hôpital aussi si vous voyez ce que je veux dire...", "Un hôpital très bien tenu. Cependant, attention à la récession ! Ah oui... vous n'avez pas à vous soucier de cela.", }, }, }, } -- Winning texts letter = { dear_player = "Cher %s", custom_level_completed = "Félicitations ! Vous avez réussi tous les objectifs de ce niveau personnalisé !", return_to_main_menu = "Voulez-vous retourner au menu principal ou continuer la partie ?", campaign_completed = "Incroyable ! Vous avez réussi à terminer tous les niveaux. Vous pouvez maintenant vous détendre et profiter de remplir des forums sur Internet de vos réalisations. Bonne chance !", campaign_level_missing = "Désolé, mais le prochain niveau de cette campagne semble manquer. (Nom: %s)", campaign_level_completed = "Bon travail ! Vous avez battu le niveau. Mais ce n'est pas fini !\n Aimeriez-vous un poste à l'hôpital %s ?", } -- Installation install = { title = "----------------------------- Installation de CorsixTH -----------------------------", th_directory = "CorsixTH nécessite une copie des données du jeu Theme Hospital originel (ou la démo) pour fonctionner. Veuillez utiliser le sélecteur ci-dessous pour indiquer le dossier d'installation de Theme Hospital.", ok = "OK", exit = "Quitter", cancel = "Annuler", } -- Misc misc.not_yet_implemented = "(pas encore implémenté)" misc.no_heliport = "Aucune maladie n'a été découverte pour l'instant, ou il n'y a pas d'héliport sur cette carte." -- Main menu main_menu = { new_game = "Nouvelle partie", custom_level = "Niveau personnalisé", continue = "Continuer la partie", load_game = "Charger une partie", options = "Options", savegame_version = "Version de la sauvegarde : ", version = "Version : ", exit = "Quitter", map_edit = "Éditeur de carte", custom_campaign = "Campagne personnalisée", } tooltip.main_menu = { new_game = "Commencer une nouvelle partie", custom_level = "Construire votre hôpital dans un niveau personnalisé", continue = "Continuer la partie", load_game = "Charger une partie sauvegardée", options = "Modifier quelques paramètres", exit = "Non, non, SVP, ne quittez pas !", map_edit = "Créer une carte personnalisée", custom_campaign = "Jouer une campagne créée par la communauté", } -- Load game window load_game_window = { caption = "Charger une partie", } tooltip.load_game_window = { load_game = "Charger la partie %s", load_game_number = "Charger la partie %d", load_autosave = "Charger la sauvegarde automatique", } -- Custom game window custom_game_window = { caption = "Niveau personnalisé", free_build = "Construction libre", } tooltip.custom_game_window = { free_build = "Cochez cette case si vous souhaitez jouer sans limite d'argent et sans conditions de victoire ou de défaite", choose_game = "Cliquez sur un niveau pour en savoir plus", load_selected_level = "Charger et jouer le niveau sélectionné", } -- Custom campaign window custom_campaign_window = { caption = "Campagne personnalisée", start_selected_campaign = "Démarrer la campagne", } tooltip.custom_campaign_window = { choose_campaign = "Choisissez une campagne pour en savoir plus à son sujet", start_selected_campaign = "Charger le premier niveau de cette campagne", } -- Save game window save_game_window = { caption = "Enregistrer la partie", new_save_game = "Nouvelle sauvegarde", } tooltip.save_game_window = { save_game = "Écraser la sauvegarde %s", new_save_game = "Entrez un nom pour la sauvegarde", } save_map_window = { caption = "Sauvegarder la carte (%1%)", new_map = "Nouvelle carte", } tooltip.save_map_window = { map = "Ecraser la carte %s", new_map = "Entrez le nom pour une sauvegarde de la carte", } -- Menu list window menu_list_window = { back = "Précédent", save_date = "Modifié", name = "Nom" } tooltip.menu_list_window = { back = "Fermer cette fenêtre", save_date = "Cliquez ici pour classer la liste par date de dernière modification", name = "Cliquez ici pour classer la liste par par nom", } -- Options window options_window = { fullscreen = "Plein Écran", width = "Largeur", height = "Hauteur", change_resolution = "Changer la résolution", cancel = "Annuler", back = "Précédent", custom_resolution = "Personnaliser...", option_on = "Activer", option_off = "Désactiver", caption = "Paramètres", language = "Langue du jeu", apply = "Appliquer", resolution = "Résolution", audio = "Audio Global", folder = "Dossier", customise = "Personnaliser", } tooltip.options_window = { fullscreen = "Mode plein écran ou mode fenêtré", fullscreen_button = "Basculer en mode plein écran/fenêtré", resolution = "La résolution vidéo pour le jeu", select_resolution = "Sélectionner une nouvelle résolution", width = "Entrez la largeur désirée", height = "Entrez la hauteur désirée", change_resolution = "Changer la résolution pour les dimensions entrées à gauche", language = "Utiliser la langue %s", back = "Fermer la fenêtre des options", cancel = "Retour sans changement de résolution", apply = "Appliquer la résolution choisie", language_dropdown_item = "Choisir %s comme langue", select_language = "Sélectionner la langue du jeu", audio_button = "Activer ou désactiver le système audio dans le jeu", audio_toggle = "Activer ou désactiver", folder_button = "Dossier des paramètres", customise_button = "Paramètres supplémentaires qui peuvent être modifiés pour personnaliser votre expérience de jeu", } customise_window = { caption = "Paramètres Supplémentaires", option_on = "Activer", option_off = "Désactiver", back = "Retour", movies = "Contrôle des cinématiques", intro = "Jouer la cinématique d'intro", paused = "Construction en pause", volume = "Touche de raccourci pour diminuer le volume", aliens = "Extraterrestres", fractured_bones = "Fractures", average_contents = "Achats mémorisés", } tooltip.customise_window = { movies = "Sélectionnez si les cinématiques doivent être joués.", intro = "Passer la cinématique d'introduction lorsque vous démarrez le jeu. Le contrôle des cinématiques doit être activé si vous jouez la cinématique d'introduction à chaque fois que vous chargez CorsixTH", paused = "Dans Theme Hospital le joueur ne sera autorisé à utiliser le menu principal que si le jeu est en pause. C'est le paramètre par défaut dans CorsixTH aussi, mais en l'activant tout est permis pendant que le jeu est en pause", volume = "Si la touche de réduction du volume ouvre également le journal de médecine, activer cette option pour modifier le raccourci des dossiers médicaux à Maj + C", aliens = "Comme il y a des animations appropriées, nous avons fait de sorte que les patients avec l'ADN extraterrestre montrent seulement comme des situations d'urgence. Désactivez cette option pour obtenir cas de l'ADN extraterrestre visites régulières", fractured_bones = "En raison de la qualité faible de l'animation il n'y a pas de patientes avec des fractures. Désactivez cette option si vous désirez avoir des femmes avec des fractures.", average_contents = "Si vous voulez que le jeu se rappelle des articles supplémentaires que vous avez tendance à normalement magasiner pour une nouvelle salle, activer cette option", back = "Fermer ce menu et revenir au menu d'options", } folders_window = { caption = "Paramètres de dossier", data_label = "Données de TH", font_label = "Police", music_label = "MP3", savegames_label = "Sauvegarde", screenshots_label = "Captures d'écran", -- next four are the captions for the browser window, which are called from the folder setting menu new_th_location = "Ici vous pouvez spécifier un nouveau répertoire d'installation de Theme Hospital. Dès que vous choisissez le nouveau répertoire, le jeu sera redémarré.", savegames_location = "Sélectionner le répertoire que vous voulez utiliser pour les sauvegardes", music_location = "Sélectionner le répertoire que vous voulez utiliser pour la musique", screenshots_location = "Sélectionner le répertoire que vous voulez utiliser pour les captures d'écran", back = "Retour", } tooltip.folders_window = { browse = "Parcourir l'emplacement du dossier", data_location = "Le répertoire d'origine de l'installation de Theme Hospital, qui est requis pour faire fonctionner CorsixTH", font_location = "Emplacement d'un fichier de police qui est capable d'afficher des caractères Unicode requises par votre langue. Si aucun emplacement n'est spécifié vous ne serez pas en mesure de choisir des langues qui ont des caractères que le jeu original ne peut pas fournir. Exemple : Russe et Chinois", savegames_location = "Par défaut, le répertoire de sauvegardes est à côté du fichier de configuration et sera utilisé pour stocker les sauvegardes. Si cela n'est pas approprié vous pouvez modifier ce répertoire.", screenshots_location = "Par défaut, les captures d'écran sont stockés dans un dossier avec le fichier de configuration. Si cela ne convient pas vous pouvez choisir votre propre dossier.", music_location = "Sélectionnez un emplacement pour vos fichiers MP3.", browse_data = "Parcourir un autre emplacement d'une installation de Theme Hospital (emplacement actuel : %1%)", browse_font = "Parcourir un autre fichier de police (emplacement actuel : %1%)", browse_saves = "Parcourir un autre répertoire de sauvegardes (emplacement actuel : %1%)", browse_screenshots = "Parcourir un autre répertoire de captures d'écrans (emplacement actuel : %1%)", browse_music = "Parcourir un autre répertoire de musique (emplacement actuel : %1%)", no_font_specified = "Aucun répertoire de police spécifié !", not_specified = "Aucun répertoire spécifié !", default = "Emplacement par défaut", reset_to_default = "Réinitialiser le répertoire à son emplacement par défaut", back = "Fermer ce menu et revenir au menu Paramètres", } font_location_window = { caption = "Choisir une police (%1%)", } -- Handyman window handyman_window = { all_parcels = "Partout", parcel = "Parcelle", } tooltip.handyman_window = { parcel_select = "Les parcelles où les agents de maintenance peuvent travailler : cliquez pour changer le paramètre.", } --- New game window new_game_window = { easy = "Interne (Facile)", medium = "Médecin (Moyen)", hard = "Consultant (Difficile)", tutorial = "Tutoriel", cancel = "Annuler", option_on = "Activer", option_off = "Désactiver", difficulty = "Difficulté", caption = "Campagne", player_name = "Nom du joueur", start = "Démarrer", } tooltip.new_game_window = { easy = "Si vous jouez pour la première fois à un jeu de simulation, cette option est pour vous", medium = "C'est la voie du milieu à prendre si vous ne savez pas quoi choisir", hard = "Si vous êtes habitué à ce genre de jeu et que vous souhaitez plus d'un défi, choisissez cette option", tutorial = "Si vous voulez un peu d'aide pour démarrer une fois dans le jeu, cochez cette case", cancel = "Oh, je n'avais pas vraiment l'intention de commencer une nouvelle partie !", difficulty = "Sélectionnez le niveau de difficulté que vous voulez dans le jeu", start = "Démarrer le jeu avec les paramètres sélectionnés", player_name = "Entrez le nom par lequel vous voulez être appelé dans le jeu", } -- Lua Console lua_console = { execute_code = "Exécuter", close = "Fermer", } tooltip.lua_console = { textbox = "Entrez du code Lua à exécuter ici", execute_code = "Exécuter le code que vous avez entré", close = "Fermer la console", } -- Errors errors = { dialog_missing_graphics = "Désolé, les données de démo ne contiennent pas cette boîte de dialogue.", save_prefix = "Erreur lors de la sauvegarde de la partie : ", load_prefix = "Erreur lors du chargement de la partie : ", no_games_to_contine = "Pas de parties sauvegardées.", map_file_missing = "Impossible de trouver le fichier de carte %s pour ce niveau !", minimum_screen_size = "Veuillez entrer une résolution supérieure à 640x480.", unavailable_screen_size = "La résolution que vous avez demandée n'est pas disponible en plein écran.", alien_dna = "NOTE : Il n'y a pas d'animations pour les patients étrangers pour s'asseoir, ouvrir ou de frapper aux portes, etc. Donc, comme avec Theme Hospital pour faire ces choses, ils semblent changer à la normale et ensuite changer de nouveau. Les patients avec l'ADN Alien apparaîtront seulement s'ils sont définis dans le fichier de niveau.", fractured_bones = "NOTE : L'animation pour les patients de sexe féminin avec des os fracturés n'est pas parfaite.", load_quick_save = "Erreur, impossible de charger la sauvegarde rapide car elle n'existe pas, ne vous inquiétez pas nous avons créé une pour vous !", } -- Confirmation dialog confirmation = { needs_restart = "Changer ce paramètre va nécessiter un redémarrage de CorsixTH. Tout progrès non sauvegardé sera perdu. Êtes-vous sûr de vouloir faire cela ?", abort_edit_room = "Vous êtes actuellement en train de construire ou d'éditer une pièce. Si tous les objets requis sont placés, elle sera validée, mais sinon elle sera détruite. Continuer ?", maximum_screen_size = "La taille de l'écran que vous avez entrée est supérieure à 3000 x 2000. Des plus hautes résolutions sont possibles, mais il faudra un meilleur matériel afin de maintenir un taux de trame jouable. Êtes-vous sûr de vouloir continuer?", music_warning = "Avant de choisir d'utiliser des MP3 pour votre musique dans le jeu, vous aurez besoin d'avoir smpeg.dll ou l'équivalent pour votre système d'exploitation, sinon vous n'aurez pas de musique dans le jeu. Voulez-vous continuer?", could_not_load_campaign = "Impossible de charger la campagne : %s", could_not_find_first_campaign_level = "Impossible de trouver le premier niveau de cette campagne : %s", } -- Information dialog information = { custom_game = "Bienvenue dans CorsixTH. Amusez-vous bien avec cette carte personnalisée !", no_custom_game_in_demo = "Désolé, mais dans la version démo vous ne pouvez jouer avec aucune des cartes personnalisées.", cannot_restart = "Malheureusement cette partie personnalisée a été sauvegardée avant que la fonctionnalité de redémarrage soit implémentée.", very_old_save = "Il y a eu beaucoup de mises à jour du jeu depuis que vous avez commencé ce niveau. Pour être sûr que tout fonctionne comme prévu, pensez à recommencer le niveau.", cheat_not_possible = "Vous ne pouvez pas utiliser ce code de triche dans ce niveau. Vous n'arrivez même pas à tricher, pas marrant hein ?", level_lost = { "Quelle poisse ! Vous avez raté le niveau. Vous ferez mieux la prochaine fois !", "Voilà pourquoi vous avez perdu : ", reputation = "Votre réputation est tombée en dessous de %d.", balance = "Votre solde bancaire est tombé en dessous %d.", percentage_killed = "Vous avez tué plus de %d pourcents de vos patients.", cheat = "Étais-ce votre choix, ou bien avez-vous appuyé sur le mauvais bouton ? Vous n'arrivez même pas à tricher correctement, n'est-ce pas désolant ?" }, } tooltip.information = { close = "Fermer cette boîte de dialogue.", } -- "Tip of the day" window totd_window = { tips = { "Chaque hôpital a besoin d'un bureau de réception et d'un cabinet de médecine générale. Après, tout dépend du type de patients qui visitent votre hôpital. Une pharmacie est toujours un bon choix malgré tout.", "Les machines telles que le Gonflage ont besoin de maintenance. Embauchez un ou deux agents de maintenance pour réparer vos machines, ou vous risquerez d'avoir des blessés parmi le personnel ou les patients.", "Après un certain temps, vos employés seront fatigués. Pensez à construire une salle de repos où ils pourront se détendre.", "Placez suffisamment de radiateurs pour garder vos employés et patients au chaud, ou ils deviendront mécontents. Utilisez la carte de la ville pour localiser les endroits de votre hôpital qui nécessitent plus de chauffage.", "Le niveau de compétence d'un docteur influence beaucoup la qualité et la rapidité de ses diagnostiques. Utilisez un médecin expérimenté comme généraliste et vous n'aurez plus besoin d'autant de salles de diagnostiques.", "Les internes et les médecins peuvent augmenter leurs compétences auprès d'un consultant dans la salle de formation. Si le consultant a des qualifications particulières (chirurgien, psychiatre ou chercheur), il transférera ses connaissances à ses élèves.", "Avez-vous essayé d'entrer le numéro d'urgence Européen (112) dans le fax ? Vérifiez que vous avez du son !", "Vous pouvez ajuster certains paramètres tels que la résolution et la langue dans la fenêtre d'options accessible à la fois depuis le menu principal et pendant le jeu.", "Vous avez choisi une autre langue que l'anglais, mais il y du texte en anglais partout ? Aidez-nous à traduire les textes manquants dans votre langue !", "L'équipe de CorsixTH cherche du renfort ! Vous êtes intéressé à coder, traduire ou faire des graphismes pour CorsixTH ? Contactez-nous sur notre Forum, Liste de Diffusion ou Canal IRC (#corsix-th sur freenode).", "Si vous avez trouvé un bug, SVP, reportez-le sur notre gestionnaire de bugs : th-issues.corsix.org.", "Chaque niveau possède des objectifs qu'il vous faudra remplir pour pouvoir passer au suivant. Vérifiez la fenêtre de statuts pour voir votre progression dans les objectifs du niveau.", "Si vous voulez éditer ou détruire une pièce, vous pouvez le faire avec le bouton d'édition situé sur la barre d'outils en bas.", "Dans un groupe de patients en attente, vous pouvez rapidement découvrir lesquels attendent une pièce particulière en survolant cette pièce avec votre curseur de souris.", "Cliquez sur la porte d'une pièce pour visualiser sa file d'attente. Vous pouvez faire des réglages très utiles ici, comme réorganiser la file d'attente ou envoyer un patient vers une autre pièce.", "Le personnel mécontent vous demandera des augmentations de salaires fréquemment. Assurez-vous de leur offrir un environnement de travail confortable pour éviter cela.", "Les patients auront soif en attendant dans votre hôpital, encore plus si vous augmentez le chauffage ! Placez des distributeurs automatiques dans les points stratégiques pour un revenu d'appoint.", "Vous pouvez interrompre le processus de diagnostic d'un patient et proposer un traitement, si vous avez déjà rencontré la maladie. Notez que cela peut accroître le risque d'erreur de traitement, et provoquer la mort du patient.", "Les urgences peuvent être une bonne source de revenus additionnels, à condition que vous ayez les capacités suffisantes pour traiter les patients à temps.", }, previous = "Astuce précédente", next = "Astuce suivante", } tooltip.totd_window = { previous = "Afficher l'astuce précédente", next = "Afficher l'astuce suivante", } -- Debug patient window debug_patient_window = { caption = "Patient de test", } -- Cheats window cheats_window = { caption = "Triches", warning = "Attention : vous n'aurez aucun point de bonus à la fin du niveau si vous trichez !", cheated = { no = "Triches utilisées : non", yes = "Triches utilisées : oui", }, cheats = { money = "Plus d'argent", all_research = "Toutes les recherches", emergency = "Créer une situation d'urgence", vip = "Créer un VIP", earthquake = "Créer un tremblement de terre", create_patient = "Créer un patient", end_month = "Fin du mois", end_year = "Fin de l'année", lose_level = "Perdre le niveau", win_level = "Gagner le niveau", epidemic = "Reproduire des patients contagieux", toggle_infected = "Faire apparaître des patients contagieux.", increase_prices = "Augmenter les prix", decrease_prices = "Diminuer les prix", }, close = "Fermer", } tooltip.cheats_window = { close = "Fermer le dialogue de triches", cheats = { money = "Ajoute $10.000 à votre solde bancaire.", all_research = "Termine toutes les recherches.", emergency = "Crée une situation d'urgence.", vip = "Crée un VIP.", earthquake = "Crée un tremblement de terre.", create_patient = "Crée un patient au bord de la carte.", end_month = "Va directement à la fin du mois.", end_year = "Va directement à la fin de l'année.", lose_level = "Vous fait perdre le niveau actuel.", win_level = "Vous fait gagner le niveau actuel.", epidemic = "Crée un patient contagieux qui peut causer une épidémie.", toggle_infected = "Bascule les icônes infectés pour l'épidémie, découverte active.", increase_prices = "Augmenter tous les prix de 50% (max. 200%)", decrease_prices = "Diminuer tous les prix de 50% (min. 50%)", } } -- Introduction Texts introduction_texts = { demo = "Bienvenue dans l'hôpital de démonstration !// " .. "Malheureusement, la version démo ne contient que ce niveau. Malgré tout, il y a assez à faire ici pour vous occuper un moment !" .. "Vous allez rencontrer différentes maladies qui nécessitent des salles pour les soigner. De temps en temps, des urgences peuvent se produire. Et vous aurez besoin d'une salle de recherche pour trouver des nouvelles salles. " .. "Votre but est de gagner 100,000$, de faire monter la valeur de votre hôpital à 70,000$ et d'obtenir une réputation de 700, tout en ayant soigné au moins 75% de vos patients. " .. "Veillez à ce que votre réputation ne tombe pas en dessous de 300 et de ne pas tuer plus de 40% de vos patients, ou vous perdrez.//" .. "Bonne chance !", level1 = "Bienvenue dans votre premier hôpital !//Démarrez l'activité en installant un bureau de réception et " .. "en construisant un cabinet de médecine générale. Embauchez une réceptionniste et un médecin. Il vous " .. "suffit d'attendre des admissions. Il serait bon de construire un cabinet de psychiatrie et d'embaucher " .. "un médecin formé dans ce domaine. Une pharmacie et une infirmière sont également indispensables pour soigner " .. "les patients. Attention aux cas d'encéphalantiasis : une salle de gonflage suffit pour traiter cette maladie. " .. "Il vous faut soigner 10 personnes et vous assurer que votre réputation ne tombe pas en-dessous de 200", level8 = "A vous de gérer l'hôpital le plus efficace et le plus rentable possible.//Les gens du coin sont bien nantis alors " .. "pompez-leur tout le fric que vous pourrez. Soigner les gens c'est bien joli mais vous avez BESOIN de l'argent que ça " .. "rapporte. Ratissez tous ces malades ! Amassez un joli paquet de $300.000 pour terminer ce niveau.", level12 = "Côté défi, vous allez être servi ! Impressionné par votre succès, le Ministère veut vous assigner une mission de confiance. " .. "Vous devrez construire un autre hôpital de pointe, gagner des sommes scandaleuses et vous faire une réputation fabuleuse. " .. "Vous devrez également acheter tout le terrain possible, soigner toutes les maladies (nous avons bien dit TOUTES) et remporter " .. "toutes les récompenses. Alors, heureux ? Gagnez $650.000, soignez 750 personnes et affichez une réputation de 800 pour gagner ce niveau.", level13 = "Votre incroyable talent en tant que directeur d'hôpital a attiré l'attention de la Division Spéciale Secrète des " .. "Services Spéciaux Secrets. On vous propose un bonus : il y a un hôpital infesté de rats qui réclame un Nettoyeur efficace. " .. "Vous devez descendre le plus de rats possible avant que les agents de maintenance fassent leur boulot. Vous pensez y arriver ?", level14 = "Et encore un défi ! Eh oui, voici l'hôpital-surprise ! Si vous réussissez cette épreuve, vous serez le gagnant des gagnants. " .. "Mais ça ne sera pas du gâteau car vous n'aviez encore rien vu de pareil... Bonne chance !", level17 = "Un bon conseil : veillez à votre réputation car c'est elle qui vous garantira une clientèle. Si vous ne tuez pas trop de " .. "gens et les gardez raisonnablement satisfaits, vous n'aurez pas trop de difficultés à ce niveau. //A vous de jouer, maintenant. " .. "Bonne chance et tout ça, quoi !", } -- Calls Dispatcher Dialog calls_dispatcher = { -- Dispatcher description message. Visible in Calls Dispatcher dialog summary = "%d appels; %d assignés", staff = "%s - %s", watering = "Arrose @ %d,%d", repair = "Répare %s", close = "Fermer", } tooltip.calls_dispatcher = { task = "Liste des tâches - cliquez sur une tâche pour ouvrir la fenêtre du membre du personnel à qui elle est assignée et aller jusqu'à l'endroit où a lieu la tâche.", assigned = "Cette case est cochée si la tâche est assignée à quelqu'un.", close = "Ferme la boîte de dialogue de répartitions des tâches", } -- Updates update_window = { caption = "Une mise à jour est disponible !", new_version = "Nouvelle version :", current_version = "Version actuelle :", download = "Aller à la page de téléchargement", ignore = "Sauter et aller au menu principal", } tooltip.update_window = { download = "Accédez à la page de téléchargement pour la toute dernière version de CorsixTH", ignore = "Ignorer cette mise à jour pour l'instant. Vous serez averti à nouveau lorsque vous ouvrez CorsixTH de nouveau", } map_editor_window = { pages = { inside = "À l'intérieur", outside = "À l'extérieur", foliage = "Feuillage", hedgerow = "Haie", pond = "Étang", road = "Route", north_wall = "Mur nord", west_wall = "Mur ouest", helipad = "Héliport", delete_wall = "Supprimer des murs", parcel_0 = "Parcelle 0", parcel_1 = "Parcelle 1", parcel_2 = "Parcelle 2", parcel_3 = "Parcelle 3", parcel_4 = "Parcelle 4", parcel_5 = "Parcelle 5", parcel_6 = "Parcelle 6", parcel_7 = "Parcelle 7", parcel_8 = "Parcelle 8", parcel_9 = "Parcelle 9", camera_1 = "Caméra 1", camera_2 = "Caméra 2", camera_3 = "Caméra 3", camera_4 = "Caméra 4", heliport_1 = "Héliport 1", heliport_2 = "Héliport 2", heliport_3 = "Héliport 3", heliport_4 = "Héliport 4", paste = "Coller la zone", } } menu.player_count = "COMPTE DE JOUEURS" warnings.levelfile_variable_is_deprecated = "Remarque: Le niveau '%s' contient une définition de variable obsolète dans le fichier de niveau. '%LevelFile' a été renommé '%MapFile'. Veuillez aviser le créateur de la carte pour mettre à jour le niveau." CorsixTH-0.63/CorsixTH/Lua/languages/german.lua000066400000000000000000001235611347163623700213370ustar00rootroot00000000000000 --[[ Copyright (c) 2010 Manuel "Roujin" Wolf 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. --]] -- Thanks to Michael "michederoide" Armbruster for some additional corrections! -- Note: This file contains UTF-8 text. Make sure your editor is set to UTF-8. Language("Deutsch", "German", "de", "ger", "deu") Inherit("english") Inherit("original_strings", 2) ------------------------------- OVERRIDE ---------------------------------- diseases.broken_wind.cure = " Therapie: Eine spezielle Mixtur aus der Pharma-Theke sorgt für Windstille." -- original string mentioned inflation, which is plain wrong. diseases.corrugated_ankles.cure = "Therapie: Eine Schwester verabreicht dem Patienten ein leicht toxisches Gebräu, welches das Bein wieder strafft." -- original string mentioned applying a cast, which is wrong and misleads people to think of fracture clinic fax.vip_visit_query.vip_name = "%s hat den Wunsch geäußert, ihr Krankenhaus besuchen zu wollen." -- text was missing fax.vip_visit_query.choices.invite = "Lassen Sie dem V.I.P. eine offizielle Einladung zukommen." -- text was ferusing instead of inviting fax.vip_visit_query.choices.refuse = "Speisen Sie den V.I.P. mit einer Entschuldigung ab." -- text was missing fax.vip_visit_result.remarks.super[1] = "Was für ein Spitzen-Krankenhaus! Wenn ich das nächste Mal ernsthaft krank bin, will ich hier hin!" -- storming should not be translated with 'turbulent' here fax.vip_visit_result.vip_remarked_name = "%s hat Ihr Krankenhaus besucht." fax.vip_visit_result.cash_grant = "Ihnen wurde ein Geldbonus von %d gewährt." fax.vip_visit_result.rep_boost = "Ihr Ruf in der Öffentlichkeit hat sich gebessert." fax.vip_visit_result.rep_loss = "Ihr Ruf hat gelitten." fax.vip_visit_result.close_text = "Danke, dass Sie unser Krankenhaus besucht haben." -- text was missing fax.emergency.choices.accept = "Ja, ich übernehme diesen Notfall!" fax.emergency.choices.refuse = "Nein, ich weigere mich diesen Notfall zu übernehmen!" fax.emergency.location = "Wir haben einen Notruf aus dem %s erhalten." -- wrong spelling fax.emergency.num_disease = "Es handelt sich um %d Personen mit %s, die sofort behandelt werden müssen." -- wrong spelling fax.emergency.num_disease_singular = "Es handelt sich um eine Person mit %s, die sofort behandelt werden muss." -- wrong spelling fax.emergency.cure_possible = "Wir können diesen Notfall übernehmen." fax.emergency.cure_not_possible_build_and_employ = "Um den Notfall übernehmen zu können, müssen wir eine %s bauen und zusätzliches Personal einstellen." fax.emergency.cure_not_possible_build = "Um den Notfall übernehmen zu können, müssen wir eine %s bauen." fax.emergency.cure_not_possible_employ = "Um den Notfall übernehmen zu können, müssen wir zusätzliches Personal einstellen." fax.emergency.cure_not_possible = "Wir können diesen Notfall im Moment keinesfalls übernehmen." fax.emergency.bonus = "Wenn wir keinen Patienten verlieren, erhalten wir einen Geldbonus von maximal %d. Sollten wir es jedoch vermasseln, wird unser Ruf Schaden nehmen." fax.emergency_result.close_text = "Danke, ich habe gerne geholfen." fax.emergency_result.earned_money = "Sie erhalten von maximal %d einen Geldbonus von %d." fax.emergency_result.saved_people = "Vielen Dank für Ihre Hilfe! Sie haben %d von insgesamt %d gerettet." fax.disease_discovered_patient_choice.choices.send_home = "Schicken Sie den Patienten nach Hause." -- wrong text for button fax.disease_discovered_patient_choice.choices.wait = "Sorgen Sie dafür, dass der Patient eine Weile im Krankenhaus wartet." -- wrong text for button fax.disease_discovered_patient_choice.choices.research = "Schicken Sie den Patienten in die Forschungsabteilung." -- wrong text for button fax.disease_discovered_patient_choice.need_to_build_and_employ = "Um diese Krankheit heilen zu können, müssen wir eine %s bauen und zusätzliches Personal einstellen." -- text was missing fax.disease_discovered_patient_choice.need_to_build = "Um diese Krankheit heilen zu können, müssen wir eine %s bauen." -- text was missing fax.disease_discovered_patient_choice.need_to_employ = "Um diese Krankheit heilen zu können, müssen wir zusätzliches Personal einstellen." fax.disease_discovered_patient_choice.can_not_cure = "Im Moment können wir diese Krankheit nicht behandeln." fax.disease_discovered_patient_choice.disease_name = "Unser Ärzteteam hat herausgefunden, an was für einer Art von %s der Patient leidet." -- text was missing fax.disease_discovered_patient_choice.what_to_do_question = "Was sollen wir jetzt mit dem Patienten anstellen?" -- text was missing fax.disease_discovered_patient_choice.guessed_percentage_name = "Unser Ärzteteam ist sich zu %d Prozent sicher, dass der Patient an einer Form von %s leidet." -- text was missing fax.disease_discovered.close_text = "Eine neue Krankheit wurde entdeckt." fax.disease_discovered.can_cure = "Wir können diese Krankheit problemlos behandeln." -- text was missing fax.disease_discovered.need_to_build_and_employ = "Um diese Krankheit heilen zu können, müssen wir eine %s bauen und zusätzliches Personal einstellen." -- text was missing fax.disease_discovered.need_to_build = "Um diese Krankheit heilen zu können, müssen wir eine %s bauen." -- text was missing fax.disease_discovered.need_to_employ = "Um diese Krankheit heilen zu können, müssen wir zusätzliches Personal einstellen." fax.disease_discovered.discovered_name = "Unser Ärzteteam hat einen Fall von %s entdeckt." fax.diagnosis_failed.choices.send_home = "Schicken Sie den Patienten nach Hause." -- wrong text for button fax.diagnosis_failed.choices.take_chance = "Nehmen Sie die wahrscheinliche Möglichkeit zur Heilung wahr." -- wrong text for button fax.diagnosis_failed.choices.wait = "Der Patient soll eine Weile im Krankenhaus warten, wir stellen bald neue Diagnosearten zur Verfügung." fax.diagnosis_failed.situation = "Dieser Patient hat all unsere Diagnosegeräte zum qualmen gebracht. Trotzdem wissen wir immer noch nicht genau, was ihm fehlt." -- text was missing fax.diagnosis_failed.what_to_do_question = "Was sollen wir jetzt mit dem Patienten anstellen?" -- wrong spelling fax.diagnosis_failed.partial_diagnosis_percentage_name = "Unser Ärzteteam ist sich zu %d Prozent sicher, dass der Patient an einer Form von %s leidet." fax.epidemic.choices.declare = "Wir melden die Epidemie und zahlen die Geldstrafe!" fax.epidemic.choices.cover_up = "Wir versuchen die Epidemie einzudämmen bevor sie das Krankenhaus verlässt!" fax.epidemic.declare_explanation_fine = "Wenn wir die Epidemie melden, zahlen wir eine Strafe von %d und unser Ruf leidet. Dafür werden die Patienten automatisch geimpft." -- extend to mention reputation hit and automatic vaccination fax.epidemic.cover_up_explanation_1 = "Wenn wir versuchen, die Epidemie zu vertuschen, müssen wir die Infizierten heilen, bevor das Gesundheitsministerium davon Wind bekommt." fax.epidemic.cover_up_explanation_2 = "Wenn der Gesundheitsinspektor die Vertuschungsaktion bemerkt, wird das Konsequenzen haben." fax.epidemic.disease_name = "Unser Ärzteteam hat eine hochgradig ansteckende Form von %s entdeckt!" fax.epidemic_result.close_text = "Hurra!" fax.epidemic_result.failed.part_1_name = "Ihr Versuch diese %s-Epidemie zu vertuschen ist fehlgeschlagen! Sie konnten nicht verhindern," fax.epidemic_result.failed.part_2 = "dass sich die Epidemie in Ihrem ganzen Krankenhaus ausbreitet." fax.epidemic_result.succeeded.part_1_name = "Dem Gesundheitsinspektor ist zu Ohren gekommen, dass Sie mit einem schweren Fall von %s zu kämpfen haben." fax.epidemic_result.succeeded.part_2 = "Allerdings hat er dafür keine Beweise finden können." fax.epidemic_result.compensation_amount = "Die Behörden haben beschlossen, Sie für die entstandene Rufschädigung mit %d zu entschädigen." fax.epidemic_result.fine_amount = "Die Behörden haben den nationalen Notstand ausgerufen und sie zu einer Geldstrafe von %d verurteilt." fax.epidemic_result.rep_loss_fine_amount = "Die Zeitungen haben Wind von der Epidemie bekommen und ziehen Ihren Ruf in den Dreck. Darüber hinaus hat man zu einer Geldstrafe von %d verurteilt." fax.epidemic_result.hospital_evacuated = "Die Behörden haben keine andere Wahl, als ihr Krankenhaus zu evakuieren." dynamic_info.patient.actions.dying = "Ins Jenseits befördert!" -- wrong verb case dynamic_info.patient.actions.epidemic_vaccinated = "Ich bin nicht mehr infiziert." adviser.research.drug_fully_researched = "Sie haben die Effektivität Ihres %s-Medikaments auf 100% gesteigert." -- grammatical error in original tooltip.graphs.reputation = "Ruf ein- und ausschalten" -- original mentioned hospital value, while it's actually reputation. staff_title.researcher = "Forscher" -- one of the most annoying (since prominent) wrong strings in original bank_manager.insurance_owed = "Zahlungen von Vers." -- original was too long graphs.deaths = "Todesfälle" -- origin was too long insurance_companies[7] = "Leben-und-Tod KG" -- %% in original string (maybe this was rendered as &) object.skeleton = "Skelett" -- second most annoying mistake in german translation tooltip.staff_list.detail = "Aufmerksamkeit" -- was translated as an imperative tooltip.staff_list.surgeon_train = "Wurde zu %d%% zum Chirurgen ausgebildet." -- the three strings made no sense grammatically tooltip.staff_list.psychiatrist_train = "Wurde zu %d%% zum Psychiater ausgebildet." tooltip.staff_list.researcher_train = "Wurde zu %d%% zum Forscher ausgebildet." -- tooltip.staff_list.next_person, prev_person is rather next/prev page (also in english) tooltip.staff_list.next_person = "Zur nächsten Seite blättern" tooltip.staff_list.prev_person = "Zur vorherigen Seite blättern" tooltip.queue_window.inc_queue_size = "Warteschlange vergrößern" tooltip.queue_window.dec_queue_size = "Warteschlange verkleinern" -- Improve tooltips in staff window to mention hidden features tooltip.staff_window.face = "Gesicht dieser Person - klicken, um das Personal-Management zu öffnen" tooltip.staff_window.center_view = "Linksklick, um zur Person zu springen, Rechtsklick um durch das Personal zu blättern" -- These strings are missing in some versions of TH (unpatched?) confirmation.restart_level = "Sind Sie sicher, dass Sie das aktuelle Level von vorne beginnen möchten?" ------------------------------- NEW STRINGS ------------------------------- date_format = { daymonth = "%1%. %2:months%", } object.litter = "Müll" tooltip.objects.litter = "Müll: Wurde von einem Patienten fallengelassen, nachdem er keinen Mülleimer fand." tooltip.fax.close = "Das Fenster schließen, ohne die Nachricht zu löschen" tooltip.message.button = "Linksklick, um die Nachricht zu öffnen" tooltip.message.button_dismiss = "Linksklick, um die Nachricht zu öffnen, Rechtsklick um sie zu entfernen" tooltip.casebook.cure_requirement.hire_staff = "Sie müssen Personal einstellen, um diese Behandlung durchführen zu können" tooltip.casebook.cure_type.unknown = "Sie wissen noch nicht, wie Sie diese Krankheit behandeln können" tooltip.research_policy.no_research = "In dieser Kategorie wird momentan keine Forschung durchgeführt" tooltip.research_policy.research_progress = "Fortschritt in dieser Kategorie: %1%/%2%" menu_options = { lock_windows = " FENSTER FESTHALTEN ", edge_scrolling = " AM BILDSCHIRMRAND SCROLLEN ", adviser_disabled = " (%1%) BERATER ", warmth_colors = " FARBEN FÜR WÄRMEDARSTELLUNG ", twentyfour_hour_clock = " 24-STUNDEN-UHR ", wage_increase = " GEHALTSERHÖHUNGEN ", } menu_options_wage_increase = { deny = " ABLEHNEN ", grant = " GEWÄHREN ", } menu_options_game_speed = { pause = " (%1%) PAUSE ", slowest = " (%1%) AM LANGSAMSTEN ", slower = " (%1%) LANGSAM ", normal = " (%1%) NORMAL ", max_speed = " (%1%) MAXIMALE GESCHWINDIGKEIT ", and_then_some_more = " (%1%) UND NOCH MEHR ", } menu_options_warmth_colors = { choice_1 = " ROTTÖNE ", choice_2 = " BLAU-GRÜN-ROT ", choice_3 = " GELB-ORANGE-ROT ", } menu_charts = { bank_manager = " (%1%) BANK-MANAGER ", statement = " (%1%) BILANZ ", staff_listing = " (%1%) PERSONALLISTE ", town_map = " (%1%) ÜBERSICHTSKARTE ", casebook = " (%1%) BEHANDLUNGSMAPPE ", research = " (%1%) FORSCHUNG ", status = " (%1%) STATUS ", graphs = " (%1%) DIAGRAMME ", policy = " (%1%) EINSTELLUNGEN ", } customise_window = { option_on = "Ein", option_off = "Aus", average_contents = "Einrichtung merken", paused = "In Pause bauen", intro = "Introfilm abspielen", caption = "Spezialeinstellungen", back = "Zurück", movies = "Alle Filme zeigen", aliens = "Außerird. Patienten", fractured_bones = "Gebrochene Knochen", volume = "Leiser-Taste", } tooltip.customise_window = { aliens = "Aufgrund des Fehlens einer anständigen Animation haben wir standardmäßig Patienten mit außerirdischer DNA deaktiviert, damit sie nur zu einem Notfall kommen. Um Patienten mit außerirdischer DNA es zu erlauben, Ihr Krankenhaus nicht nur bei Notfällen zu besuchen, schalten Sie dies ab.", average_contents = "Wenn Sie möchten, dass sich das Spiel merkt, welche zusätzlichen Objekte Sie üblicherweise beim Gebäudebau hinzufügen, dann schalten Sie diese Option ein.", back = "Dieses Menü schließen und zum Einstellungsmenü zurückkehren", movies = "Globale Filmsteuerung: Hiermit können Sie sämtliche Filme abschalten", fractured_bones = "Aufgrund einer armseligen Animation haben wir uns entschieden, dass es standardmäßig keine weiblichen Patienten mit gebrochenen Knochen gibt. Wenn weibliche Patienten mit gebrochenen Knochen ihr Krankenhaus besuchen sollen, dann schalten Sie dies ab.", volume = "Wenn die Leiser-Taste auch das Fallbuch öffnet, dann schalten Sie dies ein, um die Schnellzugriffstaste für das Fallbuch auf Umschalt + C zu wechseln.", intro = "Den Introfilm abschalten. Das Intro wird nur gespielt, wenn Sie nicht auch gleichzeitig alle Filme abgeschaltet haben.", paused = "In Theme Hospital würde es dem Spieler während der Pause nur gestattet sein, das obere Menü zu benutzen. Dies ist in CorsixTH ebenfalls die Standardeinstellung, aber wenn Sie dies einschalten, ist alles in der Pause erlaubt.", } -- The demo does not contain this string menu_file.restart = " NEUSTART " menu_debug = { jump_to_level = " SPRINGE ZU LEVEL ", transparent_walls = " (%1%) DURCHSICHTIGE WÄNDE ", limit_camera = " KAMERA BEGRENZEN ", disable_salary_raise = " KEINE GEHALTSERHÖHUNGEN ", make_debug_fax = " DEBUG-FAX ERSTELLEN ", make_debug_patient = " DEBUG-PATIENTEN ERSTELLEN ", cheats = " (%1%) CHEATS ", lua_console = " (%1%) LUA-KONSOLE ", calls_dispatcher = " AUFRUF-VERTEILER ", dump_strings = " TEXTE ABSPEICHERN ", dump_gamelog = " (STRG+D) SPIELPROTOKOLL ABSPEICHERN ", map_overlay = " KARTEN-OVERLAY ", sprite_viewer = " SPRITE-BETRACHTER ", connect_debugger = " (%1%) ZUM LUA-DEBUG-SERVER VERBINDEN ", debug_script = " (%1%) DEBUG-SKRIPT STARTEN ", } menu_debug_overlay = { none = " KEIN ", flags = " FLAGS ", positions = " POSITION ", heat = " TEMPERATUR ", byte_0_1 = " BYTE 0 & 1 ", byte_floor = " BYTE BODEN ", byte_n_wall = " BYTE N WAND ", byte_w_wall = " BYTE W WAND ", byte_5 = " BYTE 5 ", byte_6 = " BYTE 6 ", byte_7 = " BYTE 7 ", parcel = " GRUNDSTÜCK ", } adviser = { room_forbidden_non_reachable_parts = "Sie können den Raum hier nicht bauen, da dann Teile des Krankenhauses nicht mehr erreichbar wären.", warnings = { no_desk ="Sie sollten beizeiten mal eine Rezeption bauen und eine Empfangsdame einstellen!", no_desk_1 = "Wenn Sie wollen, dass Patienten in Ihr Krankenhaus kommen, müssen Sie eine Empfangsdame einstellen und eine Rezeption für sie bauen!", no_desk_2 = "Na Klasse, das muss ja ein Weltrekord sein: Fast ein Jahr ohne einen einzigen Patienten! Wenn Sie dieses Krankenhaus weiter leiten wollen, müssen Sie eine Empfangsdame einstellen und eine Rezeption bauen!", no_desk_3 = "Ich glaub ich spinne, fast ein Jahr ist um und Sie haben keine besetzte Rezeption! Wie denken Sie denn, dass die Patienten zu Ihnen finden? Schauen Sie mal zu, dass Sie Ihren Kram auf die Reihe bekommen!", no_desk_4 = "Eine Empfangsdame muss ihren eigenen Arbeitsplatz haben, um die Patienten bei ihrer Ankunft zu begrüßen.", no_desk_5 = "Na, das wurde aber auch Zeit! Sie sollten in Kürze ein paar Patienten hier eintreffen sehen!", no_desk_6 = "Sie haben eine Empfangsdame, also sollten Sie eine Rezeption für sie bauen.", no_desk_7 = "Sie haben die Rezeption gebaut, also wie wäre es damit, eine Empfangsdame einzustellen? Sie werden keine Patienten sehen, bis sie das geregelt haben, wissen Sie?", falling_1 = "He! Vorsicht mit dem Mauszeiger, jemand könnte sich verletzen!", falling_2 = "Hören Sie schon auf damit, wie würde das Ihnen denn gefallen?", falling_3 = "Autsch, das sah schmerzhaft aus. Ruft einen Arzt!", falling_4 = "Dies ist ein Krankenhaus, kein Vergnügungspark!", falling_5 = "Sie sind nicht hier um Leute umzustoßen. Sie sind krank, okay?", falling_6 = "Dies ist keine Bowlingbahn. Patienten sollten nicht so behandelt werden!", cannot_afford = "Sie haben nicht genügend Geld auf dem Konto, um diese Person einzustellen!", cannot_afford_2 = "Sie haben nicht genügend Geld auf dem Konto, um dies zu kaufen!", research_screen_open_1 = "Sie müssen eine Forschungseinrichtung errichten, um auf das Forschungsmenü zugreifen zu können.", research_screen_open_2 = "Forschung ist im aktuellen Level nicht verfügbar.", researcher_needs_desk_1 = "Ein Forscher braucht einen Schreibtisch, um daran arbeiten zu können.", researcher_needs_desk_2 = "Ihr Forscher ist froh darüber, dass Sie ihm eine Pause gegönnt haben. Falls Sie vorhatten, dass noch mehr Personal forscht, dann müssen Sie jedem Forscher einen eigenen Schreibtisch zur Verfügung stellen.", researcher_needs_desk_3 = "Jeder Forscher braucht einen eigenen Schreibtisch, an dem er arbeiten kann.", nurse_needs_desk_1 = "Jede Krankenschwester braucht ihren eignen Schreibtisch, an dem sie arbeiten kann.", nurse_needs_desk_2 = "Ihre Krankenschwester ist froh darüber, dass Sie ihr eine Pause gegönnt haben. Falls Sie vorhatten, dass mehr als nur eine Krankenschwester in der Station arbeitet, dann müssen Sie jeder Krankenschwester einen eigenen Schreibtisch zur Verfügung stellen.", low_prices = "Sie berechnen zu wenig für %s. Dadurch bekommen Sie viele Patienten, verdienen aber wenig an jedem einzelnen von ihnen.", high_prices = "Sie berechnen zu viel für %s. Dadurch verdienen Sie kurzfristig viel Geld, aber langfristig vertreiben Sie die damit Patienten aus ihrem Krankenhaus.", fair_prices = "Die Beandlungskosten für %s sind fair und angemessen.", patient_not_paying = "Ein Patient ist gegangen ohne für %s zu bezahlen weil es zu teuer ist!", }, research = { drug_improved = "Die Effektivität Ihres %s-Medikaments wurde von Ihrer Forschungsabteilung verbessert.", drug_improved_1 = "Das Medikament %s wurde von Ihrer Forschungsabteilung verbessert.", }, cheats = { th_cheat = "Gratulation, Sie haben die Cheats aktiviert!", roujin_on_cheat = "Roujins Herausforderungs-Cheat aktiviert! Viel Glück ...", roujin_off_cheat = "Roujins Herausforderung deaktiviert.", }, } dynamic_info.patient.actions.no_gp_available = "Wartet darauf, dass Sie eine Allgemeinmedizin bauen" dynamic_info.staff.actions.heading_for = "Geht zu: %s" dynamic_info.staff.actions.fired = "Gefeuert" fax = { choices = { return_to_main_menu = "Ins Hauptmenü zurückkehren", accept_new_level = "Zum nächsten Level wechseln", decline_new_level = "Noch ein wenig im aktuellen Level weiterspielen", }, vip_visit_result = { remarks = { free_build = { "Echt ein hübsches Krankenhaus haben Sie da! War aber wohl nicht so schwer zum Laufen zu bekommen, so ohne finanzielle Beschränkungen, was? Haha ...", "Ich bin zwar kein BWLer, aber ich denke, dieses Krankenhaus könnte ich auch führen. Sie wissen schon, was ich meine.", "Ein gut organisiertes Krankenhaus. Aber hüten Sie sich vor der Finanzkrise! Ach ja ... da müssen Sie sich ja keine Sorgen machen.", }, }, }, emergency = { num_disease_singular = "Hier ist eine Person mit %s, sie braucht sofortige Aufmerksamkeit.", free_build = "Wenn wir erfolgreich sind, wird unser Ruf steigen. Falls wir versagen, wird unser Ruf Schaden nehmen.", }, } letter = { dear_player = "Hallo %s", custom_level_completed = "Gut gemacht! Sie haben alle Ziele dieses eigenen Levels erreicht!", return_to_main_menu = "Möchten Sie ins Hauptmenü zurückkehren, oder weiterspielen?", } install = { title = "----------------------------- CorsixTH-Konfiguration -----------------------------", th_directory = "CorsixTH benötigt einige Dateien des Originalspiels Theme Hospital (oder der Demo davon), um zu funktionieren. Bitte das Installationsverzeichnis von Theme Hospital auswählen.", exit = "Beenden", ok = "OK", cancel = "Abbrechen", } misc.not_yet_implemented = "(noch nicht implementiert)" misc.no_heliport = "Entweder wurden noch keine Krankheiten entdeckt, oder es existiert kein Heliport auf dieser Karte." main_menu = { new_game = "Neues Spiel", custom_level = "Eigenes Level", load_game = "Spiel laden", options = "Optionen", exit = "Verlassen", version = "Version: ", savegame_version = "Spielstandsversion: ", continue = "Spiel fortsetzen", } tooltip.main_menu = { new_game = "Ein komplett neues Spiel anfangen", custom_level = "Ein Krankenhaus in einem eigenen Level errichten", load_game = "Ein zuvor gespeichertes Spiel fortsetzen", options = "Diverse Einstellungen verändern", exit = "Bitte lassen Sie mich nicht allein!", quit = "Sie sind im Begriff, CorsixTH zu verlassen. Sind Sie sich sicher, dass Sie das tun wollen?", } load_game_window = { caption = "Spiel laden", } tooltip.load_game_window = { load_game = "Spiel %s laden", load_game_number = "Spiel %d laden", load_autosave = "Automatisch gespeichertes Spiel laden", } custom_game_window = { caption = "Eigenes Level", free_build = "Freies Spiel", } tooltip.custom_game_window = { start_game_with_name = "Level %s starten", free_build = "Auswählen, um ohne Geld und Sieg-/Niederlagebedingungen zu spielen", } save_game_window = { caption = "Spiel Speichern", new_save_game = "Neuer Spielstand", } tooltip.save_game_window = { save_game = "Spielstand %s überschreiben", new_save_game = "Namen für einen neuen Spielstand eingeben", } menu_list_window = { name = "Dateiname", save_date = "Änderungsdatum", back = "Zurück", } tooltip.menu_list_window = { name = "Hier klicken, um nach Dateinamen zu sortieren", save_date = "Hier klicken, um nach dem letzten Änderungsdatum zu sortieren", back = "Das Fenster schließen", } options_window = { caption = "Einstellungen", option_on = "Ein", option_off = "Aus", fullscreen = "Vollbild", resolution = "Auflösung", custom_resolution = "Benutzerdefiniert ...", width = "Breite", height = "Höhe", apply = "Akzeptieren", cancel = "Abbrechen", language = "Spielsprache", cancel = "Abbrechen", back = "Zurück", folder = "Verzeichnisse", customise = "Spezialeinstellungen", audio = "Globales Audio", } tooltip.options_window = { fullscreen = "Darstellung im Vollbild- oder Fenstermodus", fullscreen_button = "Klicken, um zwischen Vollbild- und Fenstermodus zu wechseln", resolution = "Die Bildschirmauflösung, in der das Spiel läuft", select_resolution = "Eine neue Auflösung auswählen", width = "Gewünschte Bildschirmbreite eingeben", height = "Gewünschte Bildschirmhöhe eingeben", apply = "Die eingegebene Auflösung akzeptieren", cancel = "Zurückkehren, ohne die Auflösung zu ändern", language = "Die Sprache, in der Texte im Spiel erscheinen", select_language = "Die Spielsprache ändern", language_dropdown_item = "%s als Sprache auswählen", back = "Das Optionsfenster schließen", audio_button = "Sämtliche Toneffekte im Spiel ein- bzw. ausschalten", audio_toggle = "Ein- oder ausschalten", customise_button = "Weitere Einstellungen, die Sie ändern können, um Ihr Spielerlebnis anzupassen", folder_button = "Verzeichniseinstellungen", } font_location_window.caption = "Schrift auswählen (%1%)" new_game_window = { caption = "Neues Spiel", option_on = "Ein", option_off = "Aus", difficulty = "Schwierigkeit", easy = "AIP (Einfach)", medium = "Arzt (Mittel)", hard = "Berater (Schwer)", tutorial = "Einführung", start = "Start", cancel = "Abbrechen", player_name = "Spielername", } tooltip.new_game_window = { difficulty = "Hier kann der Schwierigkeitsgrad des Spiels eingestellt werden", easy = "Die richtige Option für Simulations-Neulinge", medium = "Der Mittelweg - für diejenigen, die sich nicht entscheiden können", hard = "Wer diese Art von Spielen schon gewöhnt ist und eine Herausforderung will, sollte hier klicken", tutorial = "Dieses Feld abhaken, um zu Beginn des Spieles eine Einführung zu erhalten", start = "Das Spiel mit den gewählten Einstellungen starten", cancel = "Oh, eigentlich wollte ich gar kein neues Spiel starten!", player_name = "Geben Sie den Namen ein, mit dem Sie im Spiel genannt werden möchten", } lua_console = { execute_code = "Ausführen", close = "Schließen", } tooltip.lua_console = { textbox = "Hier Lua-Code zum Ausführen eingeben", execute_code = "Den eingegebenen Code ausführen", close = "Die Konsole schließen", } errors = { dialog_missing_graphics = "Entschuldigung, aber dieses Fenster ist in den Demo-Dateien nicht enthalten.", save_prefix = "Fehler beim Speichern: ", load_prefix = "Fehler beim Laden: ", map_file_missing = "Die Kartendatei %s für das Level konnte nicht gefunden werden!", minimum_screen_size = "Bitte eine Auflösung von mindestens 640×480 eingeben.", unavailable_screen_size = "Die gewünschte Auflösung ist im Vollbildmodus nicht verfügbar.", no_games_to_contine = "Es gibt keine Spielstände.", fractured_bones = "BEACHTEN SIE: Die Animation für weibliche Patienten mit gebrochenen Knochen ist nicht perfekt.", load_quick_save = "Fehler: Der Schnellspeicherspielstand konnte nicht geladen werden, weil er nicht existiert. Kein Grund zur Sorge, wir haben nun einen für Sie erzeugt!", alien_dna = "BEACHTEN SIE: Für außerirdische Patienten gibt es keine Animationen für das Sitzen, das Öffnen von Türen, das Anklopfen, usw. Daher werden sie, wie bei Theme Hospital, normal aussehen und sich dann wieder zurückverwandeln. Patienten mit außerirdischer DNA werden nur auftauchen, wenn sie in der Leveldatei gesetzt sind.", } confirmation = { needs_restart = "Um diese Änderung, vorzunehmen muss CorsixTH neu gestartet werden. Nicht gespeicherter Fortschritt geht verloren. Sicher, dass Sie fortfahren wollen?", abort_edit_room = "Sie bauen oder ändern gerade einen Raum. Wenn alle benötigten Objekte platziert sind, wird der Raum fertiggestellt, ansonsten wird er gelöscht. Fortfahren?", maximum_screen_size = "Die von Ihnen gewählte Bildschirmauflösung ist größer als 3000×2000. Größere Auflösungen sind möglich, aber erfordern eine bessere Hardware, um eine akzeptable Bildwiederholrate zu gewährleisten. Sind Sie sich sicher, dass Sie fortfahren möchten?", music_warning = "Bevor Sie sich dafür entscheiden, MP3s für Ihre Spielmusik verwenden, müssen Sie smpeg.dll oder eine entsprechende Datei für Ihr Betriebssystem haben, ansonsten werden Sie keine Musik im Spiel haben. Möchten Sie fortfahren?", } information = { custom_game = "Willkommen zu CorsixTH. Viel Spaß mit diesem eigenen Level!", cannot_restart = "Leider wurde dieses eigene Level vor Implementierung des Neustart-Features gespeichert.", level_lost = { }, level_lost = { "So ein Mist! Sie haben das Level leider nicht geschafft. Vielleicht klappts ja beim nächsten Mal!", "Der Grund, warum Sie verloren haben:", reputation = "Ihr Ruf ist unter %d gesunken.", balance = "Ihr Kontostand ist unter %d gesunken.", percentage_killed = "Sie haben mehr als %d Prozent der Patienten getötet.", cheat = "Sie haben das selbst so gewollt. Oder haben Sie etwa auf den falschen Knopf gedrückt? Sie können also nichtmal richtig cheaten. Traurig.", }, very_old_save = "Seit dieses Level gestartet wurde, wurden einige Änderungen am Spiel durchgeführt. Sie sollten ein neues Spiel starten, damit alle Änderungen wirksam werden.", no_custom_game_in_demo = "Tut uns Leid, aber in der Demo-Version sind keine eigenen Level spielbar.", cheat_not_possible = "Dieser Cheat ist in diesem Level nicht verfügbar. Sogar beim Cheaten versagen Sie, wie armselig!", } tooltip.information = { close = "Das Informationsfenster schließen", } totd_window = { tips = { "Zu Beginn benötigt jedes Krankenhaus eine Rezeption und eine Allgemeinmedizin. Danach kommt es darauf an, was für Patienten im Krankenhaus auftauchen. Eine Pharma-Theke ist aber immer eine gute Wahl.", "Maschinen wie die Entlüftung müssen gewartet werden. Stellen Sie ein paar Handlanger ein, oder die Patienten und das Personal könnte verletzt werden.", "Nach einer Weile wird das Personal müde. Bauen Sie unbedingt einen Personalraum, damit es sich ausruhen kann.", "Platzieren Sie genug Heizkörper, um das Personal und die Patienten warm zu halten, sonst werden sie unglücklich. Benutzen Sie die Übersichtskarte, um Stellen im Krankenhaus zu finden, die noch etwas besser beheizt werden müssen.", "Der Fähigkeiten-Level eines Arztes beeinflusst die Qualität und Geschwindigkeit seiner Diagnosen deutlich. Ein geübter Arzt in der Allgemeinmedizin erspart so manchen zusätzlichen Diagnoseraum.", "AIPler und Ärzte können ihre Fähigkeiten verbessern, indem sie in der Ausbildung von Beratern lernen. Wenn der Berater eine zusätzliche Qualifikation (Chirurg, Psychiater oder Forscher) besitzt, gibt er dieses Wissen ebenfalls weiter.", "Haben Sie schon versucht, die europäische Notruf-Nummer (112) in das Faxgerät einzugeben? Schalten Sie vorher den Sound an!", "Im Options-Menü hier im Hauptmenü oder im laufenden Spiel können Einstellungen wie die Auflösung oder die Sprache geändert werden.", "Haben Sie eine andere Sprache als Englisch ausgewählt, aber es erscheinen englische Texte? Helfen Sie uns, die Übersetzung zu vervollständigen, indem Sie fehlende Texte in Ihre Sprache übersetzten!", "Das CorsixTH-Team sucht Verstärkung! Haben Sie Interesse, beim Programmieren, Übersetzen oder der Grafikerstellung zu helfen? Kontaktieren Sie uns in unserem Forum, der Mailing-Liste oder unserem IRC-Channel (#Corsix-TH auf Freenode).", "Wenn Sie einen Bug finden, bitte melden Sie ihn in unserem Bug-Tracker: th-issues.corsix.org", "In jedem Level müssen bestimmte Voraussetzungen erfüllt werden, bevor man zum Nächsten wechseln kann. Im Status-Fenster können Sie Ihren Fortschritt bezüglich der Levelziele sehen.", "Um existierende Räume zu bearbeiten oder gar zu löschen, kann man den Raum-Bearbeiten-Knopf in der unteren Werkzeugleiste verwenden.", "Um aus einer Horde wartender Patienten diejenigen zu finden, die für einen bestimmten Raum warten, einfach mit dem Mauszeiger über den entsprechenden Raum fahren.", "Klicken Sie auf die Tür eines Raumes, um seine Warteschlange zu sehen. Hier kann man nützliche Feineinstellungen vornehmen, wie etwa die Warteschlange umzusortieren oder einen Patienten zu einem anderen Raum zu senden.", "Unglückliches Personal verlangt öfter Gehaltserhöhungen. Gestalten Sie die Arbeitsumgebung Ihres Personals möglichst angenehm, um dies zu verhindern.", "Patienten werden beim Warten durstig, besonders wenn die Heizungen aufgedreht sind! Strategisch platzierte Getränkeautomaten sind eine nette zusätzliche Einnahmequelle.", "Sie können die Diagnose für einen Patienten vorzeitig abbrechen und ihn direkt zur Behandlung schicken, falls seine Krankheit zuvor schon entdeckt wurde. Allerdings erhöht sich dadurch das Risiko, dass das Heilmittel falsch ist und der Patient stirbt.", "Notfälle können eine gute Einnahmequelle abgeben, sofern genügend Kapazitäten vorhanden sind, um die Notfallpatienten rechtzeitig zu behandeln.", }, previous = "Vorheriger Tipp", next = "Nächster Tipp", } tooltip.totd_window = { previous = "Den vorherigen Tipp anzeigen", next = "Den nächsten Tipp anzeigen", } debug_patient_window = { caption = "Debug-Patient", } update_window = { caption = "Update verfügbar!", new_version = "Neue Version:", current_version = "Aktuelle Version:", download = "Zur Downloadseite gehen", ignore = "Überspringen und zum Hauptmenü gehen", } tooltip.update_window = { download = "Zur Downloadseite für die allerneueste Version von CorsixTH gehen", ignore = "Dieses Update im Moment ignorieren. Sie werden erneut benachrichtigt, wenn Sie CorsixTH das nächste Mal starten.", } cheats_window = { caption = "Cheats", warning = "Warnung: Cheater bekommen am Ende des Levels keine Bonus-Punkte!", cheated = { no = "Cheats benutzt: Nein", yes = "Cheats benutzt: Ja", }, cheats = { money = "Geld-Cheat", all_research = "Alle-Forschungen-Cheat", emergency = "Notfall erzeugen", vip = "VIP erzeugen", earthquake = "Erdbeben starten", create_patient = "Patienten erzeugen", end_month = "Ende des Monats", end_year = "Ende des Jahres", lose_level = "Level verlieren", win_level = "Level gewinnen", epidemic = "Infizierten Patienten erzeugen", toggle_infected = "Infektions-Symbole umschalten", }, close = "Schließen", } tooltip.cheats_window = { close = "Das Cheat-Fenster schließen", cheats = { money = "10.000 zum Konto hinzufügen.", all_research = "Alle Forschungen abschließen.", emergency = "Einen Notfall erzeugen.", vip = "Einen VIP vorbeischicken.", earthquake = "Ein Erdbeben starten.", create_patient = "Einen Patienten am Kartenrand erzeugen.", end_month = "Zum Monatsende springen.", end_year = "Zum Jahresende springen.", lose_level = "Das aktuelle Level verlieren.", win_level = "Das aktuelle Level gewinnen.", epidemic = "Einen infizierten Patienten, der eine Epidemie auslösen kann, erzeugen.", toggle_infected = "Die Infektions-Symbole für die aktive, entdeckte Epidemie umschalten.", } } folders_window = { data_label = "TH-Daten", music_location = "Wählen Sie hier das Verzeichnis, welches Sie für Ihre Musik benutzen möchten, aus.", music_label = "MP3s", new_th_location = "Hier können Sie ein neues Theme-Hospital-Installationsverzeichnis auswählen. Sobald Sie das neue Verzeichnis auswählen, wird das Spiel neu gestartet.", caption = "Verzeichnisort", screenshots_label = "Screenshots", font_label = "Schrift", savegames_label = "Spielstände", back = "Zurück", savegames_location = "Wählen Sie das Verzeichnis, welches Sie für Spielstände benutzen möchten, aus.", screenshots_location = "Wählen Sie das Verzeichnis, welches Sie für Screenshots benutzen möchten, aus.", } tooltip.folders_window = { browse_font = "Nach einer anderen Schriftdatei suchen (aktueller Ort: %1%)", browse_screenshots = "Nach einem anderem Ort für ihr Screenshotverzeichnis suchen (aktueller Ort: %1%)", reset_to_default = "Das Verzeichnis zur Standardeinstellung zurücksetzen", back = "Dieses Menü schließen und zum Einstellungsmenü zurückkehren", music_location = "Wählen Sie einen Ort für ihre MP3-Musikddateien aus. Sie müssen dieses Verzeichnis bereits erstellt haben, dann wählen Sie ebendieses Verzeichnis aus.", font_location = "Pfad einer Schrift-Datei, die Unicode-Zeichen Ihrer Sprache unterstützt. Wenn diese Einstellung nicht vorgenommen wird, können Sie keine Sprachen auswählen, die mehr Zeichen benötigen, als das Originalspiel unterstützt. Beispiel: Russisch und Chinesisch.", savegames_location = "Standardmäßig wird das Spielstandsverzeichnis im selben Verzeichnis wie die Konfigurationsdatei gespeichert und es wird benutzt, um die Spielstände darin abzuspeichern. Sollte das nicht erwünscht sein, können Sie sich ihr eigenes Verzeichnis aussuchen, wählen Sie einfach das Verzeichnis, das Sie verwenden möchten", screenshots_location = "Standardmäßig wird das Screenshotverzeichnis im selben Verzeichnis wie die Konfigurationsdatei gespeichert. Sollte das nicht erwünscht sein, können Sie sich ihr eigenes Verzeichnis aussuchen, wählen Sie einfach das Verzeichnis, das Sie verwenden möchten", browse_data = "Nach einem anderem Ort einer Theme-Hospital-Installation durchsuchen (aktueller Ort: %1%)", browse = "Nach einem Verzeichnis durchsuchen", browse_music = "Nach einem anderem Ort für Ihr Musikverzeichnis durchsuchen (aktueller Ort: %1%)", no_font_specified = "Es wurde kein Schriftverzeichnis festgelegt!", not_specified = "Es wurde kein Verzeichnis festgelegt!", browse_saves = "Nach einem anderem Ort für Ihr Spielstandsverzeichnis durchsuchen (aktueller Ort: %1%)", default = "Standardort", data_location = "Das Verzeichnis der Original-Theme-Hospital-Installation, welche benötigt wird, um CorsixTH zu spielen", } introduction_texts = { demo = "Willkommen im Demo-Krankenhaus!//" .. "Leider beinhaltet die Demo-Version nur dieses eine Level. Dafür gibt es hier aber mehr als genug zu tun, um Sie eine Weile zu beschäftigen! " .. "Sie werden diversen Krankheiten begegnen, die unterschiedliche Räume zur Behandlung benötigen. Ab und zu können auch Notfälle eintreffen. " .. "Und Sie werden mithilfe einer Forschungsabteilung neue Räume erforschen müssen. " .. "Ihr Ziel ist es, 100.000 DM zu verdienen, einen Krankenhauswert von 70.000 DM und einen Ruf von 700 vorzuweisen, und gleichzeitig mindestens 75% der Patienten erfolgreich zu behandeln. " .. "Stellen Sie sicher, dass Ihr Ruf nicht unter 300 fällt und dass Sie nicht mehr als 40% ihrer Patienten sterben lassen, oder Sie werden verlieren.//" .. "Viel Glück!", } calls_dispatcher = { summary = "%d Aufrufe; %d zugewiesen", staff = "%s - %s", watering = "Bewässern @ %d,%d", repair = "Repariert %s", close = "Schließen", } tooltip.calls_dispatcher = { task = "Liste der Aufgaben - Aufgabe anklicken, um das Fenster des zugewiesenen Personalmitglieds zu öffnen und zum Ort der Aufgabe zu scrollen.", assigned = "Diese Box ist markiert, wenn jemand der Aufgabe zugewiesen ist.", close = "Das Aufruf-Verteiler-Fenster schließen", } handyman_window = { all_parcels = "Alle Grundstücke", parcel = "Grundstück", } tooltip.handyman_window = { parcel_select = "Der Arbeitsbereich des Handlangers. Klicken zum Ändern.", } progress_report = { free_build = "FREIES SPIEL", } ------------------------------- FIX FOR MISSING CREDITS LINES ---------------------------------- original_credits[301] = " " original_credits[302] = " " original_credits[303] = " " original_credits[304] = " " original_credits[305] = " " original_credits[306] = " " original_credits[307] = " " original_credits[308] = " " original_credits[309] = " " original_credits[310] = " " original_credits[311] = " " original_credits[312] = " " original_credits[313] = " " original_credits[314] = " " original_credits[315] = " " original_credits[316] = " " original_credits[317] = " " original_credits[318] = " " original_credits[319] = " " original_credits[320] = " " original_credits[321] = " " original_credits[322] = " " original_credits[323] = " " original_credits[324] = " " original_credits[325] = " " original_credits[326] = " " original_credits[327] = " " original_credits[328] = " " original_credits[329] = " " original_credits[330] = " " original_credits[331] = " " original_credits[332] = " " original_credits[333] = " " original_credits[334] = " " original_credits[335] = " " original_credits[336] = " " original_credits[337] = " " original_credits[338] = " " original_credits[339] = " " original_credits[340] = " " original_credits[341] = " " original_credits[342] = " " original_credits[343] = " " original_credits[344] = " " original_credits[345] = " " original_credits[346] = " " original_credits[347] = " " original_credits[348] = " " original_credits[349] = " " original_credits[350] = " " original_credits[351] = " " original_credits[352] = " " original_credits[353] = " " original_credits[354] = " " original_credits[355] = " " original_credits[356] = " " original_credits[357] = " " original_credits[358] = " " original_credits[359] = " " original_credits[360] = " " original_credits[361] = " " -------------------------------- UNUSED ----------------------------------- ------------------- (kept for backwards compatibility) ---------------------- options_window.change_resolution = "Auflösung ändern" tooltip.options_window.change_resolution = "Die Fensterauflösung auf die links eingegebenen Werte ändern" CorsixTH-0.63/CorsixTH/Lua/languages/hungarian.lua000066400000000000000000002305011347163623700220330ustar00rootroot00000000000000 --[[ Copyright (c) 2011 David "ChronosHD" Horváth & Adam Kirkósa 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. ------------------------------------------------------------------------------- A FEW NOTES ------------------------------------------------------------------------------- As the Nowegian translation seemd very well structured, i've used that file. Thanks for the Norwegian translators for their work. ------------------------------------------------------------------------------- READ BEFORE DOING ANY CHANGES ------------------------------------------------------------------------------- Since the Hungarian language isn't in the original Theme Hospital game, this file is split in two sections (A and B). The first section contains all the new language strings, made by the Corsix-TH team, and the second section contains the override translation of all the original english strings. FORMATING AND HUNGARIAN LETTERS This file contains UTF-8 text. Make sure your editor is set to UTF-8. ------------------------------------------------------------------------------- Table of Contents ------------------------------------------------------------------------------- -- SECTION A - NEW STRINGS 1. Global settings 2. Faxes 3. Objects 4. Menu 5. Adviser 6. Dynamic info 7. Tooltip -- SECTION B - OLD STRINGS (OVERRIDE) Huge section with all original strings, translated from english. -----------------------------------------------------------------------------]] ------------------------------------------------------------------------------- -- SECTION A - NEW STRINGS ------------------------------------------------------------------------------- Font("unicode") Language("Magyar", "Hungarian", "hu", "hun") Inherit("English") Encoding(utf8) -- 2. Faxes fax = { choices = { return_to_main_menu = "Vissza a főmenübe", accept_new_level = "Ugrás a következő pályára", decline_new_level = "Pálya folytatása még egy kicsit", }, } letter = { dear_player = "Kedves %s", custom_level_completed = "Ez igen! Minden kitűzött célt elértél ezen az egyedi pályán!", return_to_main_menu = "Szeretnél visszaugrani a főmenübe, vagy inkább játszol tovább?", } install = { title = "--------------------------------- CorsixTH Beállítások ---------------------------------", th_directory = "CorsixTH-nak a futáshoz szüksége van az eredeti (teljes vagy demó) játék adatfájljaira. Kérlek az alábbi választómenü segítségével keresd ki a Theme Hospital telepítőfájljait tartalmazó könyvtárat.", exit = "Kilépés", } -- 3. Objects object = { litter = "Szemét", } tooltip.fax.close = "Ablak bezárása az üzenet törlése nélkül" tooltip.message.button = "Bal klikk az üzenet megnyitásához" tooltip.message.button_dismiss = "Bal klikk az üzenet megnyitásához, jobb klikk a figyelmen kívül hagyáshoz" -- 4. Menu menu_options = { lock_windows = " Ablak rögzítése ", edge_scrolling = " Görgetés széleknél ", settings = " Beállítások ", } menu_options_game_speed.pause = " Játék megállítása " -- The demo does not contain this string menu_file.restart = " Újrakezdés " menu_debug = { jump_to_level = " UGRÁS PÁLYÁRA ", transparent_walls = " (%1%) ÁTLÁTSZÓ FALAK ", limit_camera = " KAMERA HATÁROLÁSA ", disable_salary_raise = " FIZETÉSEMELÉS KIKAPCSOLÁSA ", make_debug_fax = " FAX HIBAKERESÉS ", make_debug_patient = " BETEG HIBAKERESÉS ", cheats = " (%1%) CSALÁSOK ", lua_console = " (%1%) LUA KONZOL ", calls_dispatcher = " HÍVÁS ELOSZTÓ ", dump_strings = " (%1%) SZTRINGEK LEMENTÉSE ", dump_gamelog = " (%1%) JÁTÉK LOG LEMENTÉSE ", map_overlay = " TÉRKÉP RÉTEG ", sprite_viewer = " SPRITE NÉZEGETŐ ", } menu_debug_overlay = { none = " SEMMI ", flags = " ZÁSZLÓK ", positions = " POZÍCIÓK ", heat = " HŐMÉRSÉKLET ", byte_0_1 = " BYTE 0 & 1 ", byte_floor = " BYTE TALAPZAT ", byte_n_wall = " BYTE N FAL ", byte_w_wall = " BYTE W FAL ", byte_5 = " BYTE 5 ", byte_6 = " BYTE 6 ", byte_7 = " BYTE 7 ", parcel = " TELEKRÉSZ ", } -- 5. Adviser adviser = { room_forbidden_non_reachable_parts = "A szoba jelenlegi elhelyezése elérhetetlenné tenne bizonyos részeket a kórház területén.", praise = { plants_are_well = "Kellemes látvány. Ügyesen gondoskodtál a növényekről. Szép munka.", few_have_to_stand = "Majdhogynem senkinek se kell állnia a kórházadban. A betegek hálásak ezért.", plenty_of_benches = "Rengetek az ülőhely, úgyhogy gond egy szál se.", plants_thriving = "Nagyon jó. A növények virítanak. Kellemes látvány. Ha így folytatod, még trófeát is kaphatsz értük." }, } -- 6. Dynamic info dynamic_info.patient.actions.no_gp_available = "Várakozás, hogy több általános rendelőt építs" dynamic_info.staff.actions.heading_for = "Ide megy: %s" dynamic_info.staff.actions.fired = "Elbocsájtott" -- 7. Tooltip tooltip.objects.litter = "Szemét: Egy haszontalan tárgy, amit a beteg azért dobott a földre, mert nem talált szemetest." -- Misc misc.not_yet_implemented = "(Még nem beépített)" misc.no_heliport = "Nem lett még új betegség felfedezve, vagy nincs helikopterleszálló ezen a pályán." -- Main menu main_menu = { new_game = "Új játék", custom_level = "Egyedi pálya", load_game = "Betöltés", options = "Beállítások", exit = "Kilépés", } tooltip.main_menu = { new_game = "Egy teljesen új játék kezdése az alapoktól", custom_level = "Saját kórház építése egy egyedi pályán", load_game = "Elmentett játék betöltése", options = "Beállítások megváltoztatása", exit = "Ne, ne! Kérlek ne lépj ki!", } load_game_window = { caption = "Játék betöltése", } tooltip.load_game_window = { load_game = "%s betöltése", load_game_number = "%d betöltése", load_autosave = "Automatikus mentés betöltése", } custom_game_window = { caption = "Egyedi játék", } tooltip.custom_game_window = { start_game_with_name = "%s pálya betöltése", } save_game_window = { caption = "Játék mentése", new_save_game = "Új mentés", } tooltip.save_game_window = { save_game = "%s mentés felülírása", new_save_game = "Írd be az új mentés nevét", } menu_list_window = { back = "Vissza", } tooltip.menu_list_window = { back = "Ablak bezárása", } options_window = { fullscreen = "Teljes képernyő", width = "Szélesség", height = "Magasság", change_resolution = "Felbontás megváltoztatása", browse = "Tallózás...", new_th_directory = "Itt egy új Theme Hospital telepítési útvonalat adhatsz meg. Amint kiválasztottad az új könyvtárat, a játék újraindul.", cancel = "Mégse", back = "Vissza", } tooltip.options_window = { fullscreen_button = "Kattints a teljes képernyős módba való váltáshoz", width = "Add meg a kívánt szélességet", height = "Add meg a kívánt magasságot", change_resolution = "Az ablak felbontásának alkalmazása a bal oldalon lévő adatok szerint", language = "%s nyelv kiválasztása", original_path = "Az eredeti Theme Hospital telepítés jelenlegi elérési útvonala", browse = "Másik elérési útvonal kiválasztása a Theme Hospital fájljaihoz", back = "Beállítások ablak bezárása", } calls_dispatcher = { -- Dispatcher description message. Visible in Calls Dispatcher dialog summary = "%d hívás; %d hozzárendelve", staff = "%s - %s", watering = "Öntözés @ %d,%d", repair = "%s Javítás", close = "Bezárás", } tooltip.calls_dispatcher = { task = "Teendők listája - kattints, hogy megnyitsd a beosztott személyzet ablakát és a teendő helyszínéhez gördülj.", assigned = "Ez a doboz akkor van bejelölve, ha a teendőhöz már van rendelve alkalmazott.", close = "Hozzárendelő ablak bezárása", } cheats_window = { caption = "Csalás", warning = "Figyelem: Nem fogsz bónuszpontokat kapni a pálya végén, ha csalsz!", cheated = { no = "Csalás aktív: Nem", yes = "Csalás aktív: Igen", }, cheats = { money = "Pénz csalás", all_research = "Minden kutatás kész csalás", emergency = "Vészhelyzet létrehozása", create_patient = "Beteg létrehozása", end_month = "Ugrás hónap végére", end_year = "Ugrás év végére", lose_level = "Pálya elvesztése", win_level = "Pálya megnyerése", }, close = "Bezárás", } tooltip.cheats_window = { close = "Csalás párbeszédablak bezárása", cheats = { money = "Egyenleghez $10.000 hozzáadása.", all_research = "Összes kutatás kész.", emergency = "Vészhelyzet előidézése.", create_patient = "Beteg létrehozása a térkép határán.", end_month = "Ugrás hónap végére.", end_year = "Ugrás év végére.", lose_level = "Pálya elvesztése.", win_level = "Pálya megnyerése.", } } new_game_window = { easy = "Rezidens (Könnyű)", medium = "Doktor (Közepes)", hard = "Konzuláns (Nehéz)", tutorial = "Oktatópálya", cancel = "Mégse", } tooltip.new_game_window = { easy = "Amennyiben a szimulációs játék fogalma számodra új, ez az opció való neked.", medium = "Ez a középút, ajánlott ha bizonytalan vagy melyiket válaszd.", hard = "Ha hozzá vagy szokva az ilyenfajta játékokhoz és szeretnél kihívást, válaszd ezt", tutorial = "Ha szeretnél játék közben segítséget kapni a kezdéshez, jelöld be ezt a négyzetet", cancel = "Áh, nem is akarok igazán új játékot kezdeni!!", } lua_console = { execute_code = "Végrehajtás", close = "Bezárás", } tooltip.lua_console = { textbox = "Írd ide a Lua kódot a futtatáshoz", execute_code = "Beírt kód futtatása", close = "Konzol bezárása", } errors = { dialog_missing_graphics = "Sajnálom, a demó fájlok nem tartalmazzák ezt a párbeszédet", save_prefix = "Hiba mentés közben", load_prefix = "Hiba betöltés közben", map_file_missing = "Nem találom a %s fájlt ehhez a pályához!", minimum_screen_size = "Kérlek írj be olyan felbontást ami nagyobb mint 640x480.", maximum_screen_size = "Kérlek olyan felbontást írj be ami kisebb mint 3000x2000.", unavailable_screen_size = "A felbontás amit szeretnél nem elérhető teljes képernyős módban.", } confirmation = { needs_restart = "Ezen beállítás megváltoztatása megköveteli CorsixTH újraindulását. Minden nem mentett állás el fog veszni. Biztos vagy benne hogy ezt szeretnéd?", abort_edit_room = "Éppen építesz vagy szerkesztesz egy szobát. Ha minden szükséges tárgyat elhelyezel, a szoba kész lesz, ellenkező esetben azonban törlődik. Folytatod?", } information = { custom_game = "Üdvözöllek a CorsixTH-ban. Jó szórakozást ehhez az egyedi pályához!", cannot_restart = "Sajnos ez az egyedi pálya az újrakezdés funkció implementálása előtt lett mentve.", level_lost = { "A fenébe! Elbuktál a pályán. Több szerencsét legközelebb!", "A vesztés oka:", reputation = "A hírneved %d alá esett.", balance = "A banki egyenleged %d alá esett.", percentage_killed = "Több mint %d százalékát ölted meg a betegeknek.", }, } tooltip.information = { close = "Információs ablak bezárása", } -- Tips totd_window = { tips = { "A kezdéshez minden kórháznak szüksége van egy recepciós asztalra és egy orvosi irodára (GP's office). Innentől kezdve minden azon múlik, hogy milyen betegek látogatják a kórházadat. Akárhogy is: egy gyógyszertár mindenképpen jó döntés.", "A gépek, mint például a Felfújó, karbantartást igényelnek. Alkalmazz egy-két ezermestert, hogy megjavítság a készülékeidet, máskülönben a személyzetet és a betegeket teszed ki veszélynek.", "Kis idő elteltével a személyezeted elfárad. Bizonyosodj meg róla, hogy építettél személyzeti szobát, hogy pihenni tudjanak.", "Helyezz el megfelelő mennyiségű radiátort, hogy a személyzeted és a betegek ne fázzanak, máskülönben szomorúak lesznek. Használd a térképet, hogy megtaláld azokat a helyeket a kórházadban, melyek fűtést igányelnek.", "Egy doktor szakképzettsége nagyban befolyásolja a diagnózisainak minőségét és gyorsaságát. Helyezz az orvosi irodába (GP's office) egy szakképzett doktort és nem lesz szükséged annyi diagnózishoz szükséges szobára.", "Rezidensek (junior) és doktorok úgy tudják fejleszteni a szaktudásukat, hogy a tréning szobában (training room) tanulnak egy konzutlánstól. Ha a konzultánsnak különleges szaktudása is van (segész, pszichológus vagy kutató), azt is átadja a tanulóinak.", "Próbáltad már beütni a faxba az európai segélyhívó számot (112)? Legyenek bekapcsolva a hangszóróid!", "A képernyőfelbontást, a nyelvet és más jellegzetességeket a beállítások alatt tudod meghatározni, mely elérhető a főmenüben és a játék közben is.", "Nem angol nyelvet választottál ki és angol szöveget látsz mindenfelé? Segíts nekünk lefordítani a hiányzó szövegeket a saját nyelvedre!", "A CorsixTH csapatnak erősítésre van szüksége! Szeretnél programozni, fordítani vagy grafikákat készíteni a CorsixTH-nak? Értesíts minket a Fórumban, a levelező listánkon vagy az IRC csatornánkon(corsix-th at freenode).", "Ha találsz valamilyen hibát, kérünk téged, jelezd azt a hibanyomkövetőnknél, a: th-issues.corsix.org címen!", "Minden szint teljesítéséhez különböző követelményeknek kell megfelelned, hogy a következő szintre léphess. Ellenőrizd az állapotjelző ablakot, hogy hogy állsz.", "Ha szerkeszteni vagy törölni szeretnél egy szobát, azt az alsó eszközsoron található szerkesztő gombbal tudod megtenni.", "Ha nagyon sok várakozó beteggel futsz össze, úgy tudod gyorsan megállapítani, hogy ki mire vár, hogy a szobák fölé húzod az egered mutatóját, .", "Kattints egy szoba ajtajára, hogy megjelenítsd az oda várakozó sort. Itt további finomhangolásokra van lehetőséged, mint például a sorrend megváltoztatása vagy egy-egy beteg másik szobához küldése.", "A nem elégedett személyzet gyakran fog fizetésemelést kérni. Győződj meg róla, hogy a személyzeted kényelmes körülmények között dolgozik és így elkerülheted ezt.", "A betegek várakozás közben szomlyasak lesznek, különösen akkor, ha a fűtés nagyon fel van tekerve! Helyezz el italautomatákat megfelelő helyeken, hogy egy kis pluszbevételhez juss.", "Véglegesen megszakíthatod egy beteg diagnózisának felállítását és megtippelheted a betegségét, ha már találkoztál azzal a kórral. Tudd viszont, hogy ez növeli a rossz gyógymód veszélyét, ami a páciens halálát jelenti.", "A vészhelyzetek kiváló pluszbevételt jelentenek abban az esetben, ha elegendő kapacitásod van ahhoz, hogy időben ellásd a betegeket.", }, previous = "Előző tipp", next = "Következő tipp", } tooltip.totd_window = { previous = "Mutasd az előző tippet", next = "Mutasd az következő tippet", } ------------------------------------------------------------------------------- -- SECTION B - OLD STRINGS (OVERRIDE) ------------------------------------------------------------------------------- -- Staff class -- each of these corresponds to a sprite staff_class = { nurse = "Nővér", doctor = "Orvos", handyman = "Gondnok", receptionist = "Recepciós", surgeon = "Sebész", } -- Staff titles -- these are titles used e.g. in the dynamic info bar staff_title = { receptionist = "Recepciós", general = "Általános", -- unused? nurse = "Nővér", junior = "Rezidens", doctor = "Doktor", surgeon = "Sebész", psychiatrist = "Pszichiáter", consultant = "Konzuláns", researcher = "Kutató", } -- Pay rises pay_rise = { definite_quit = "Semmit sem tehetsz annak érdekében, hogy itt tarts. Elegem van ebből a helyből!", regular = { "Teljesen kimerültem. Szükségem van egy kis pihenésre és egy %d -os fizetésemelésre ha nem akarod látni, ahogy a folyosón nyafogok.", "Nagyon fáradt vagyok. Szükségem van egy kis pihenésre és egy %d -os emelésre, hogy összesen total% d -t keressek, te zsarnok!", --% d (rise)% d (new total) "Ne csináld már! Úgy dolgozom itt, mint egy igás ló. Adj egy %d -os bónuszt és a kórháznál maradok.", --% d (rise) "Annyira el vagyok keseredve. Követelek egy %d -os emelést, amivel összesen % d -t fogok keresni, különben végeztem ezzel a hellyel.", --% d (rise)% d (new total) "A szüleim azt mondták nekem, hogy az orvosi pályán sok pénzt fogok keresni. Úgyhogy adj nekedm egy %d -os emelést, máskülönben végeztünk egymással.", --% d (rise) "Mérges vagyok! Adj nekem rendes fizetést! Nagyjából %d elegendő is volna.", --% d (rise) }, poached = "% d ajánlott nekem % s. Ha nem kapok ugyanennyit, lelépek.", --% d (new total)% s (Competitor) } -- Staff descriptions staff_descriptions = { good = { [1] = "Nagyon gyors és szorgalmas.", [2] = "Nagyon lelkiismeretes és gondos.", [3] = "Nagyon sokoldalú.", [4] = "Barátságos és mindig jókedvű.", [5] = "Rettenetesen kitartó. Reggeltől estig dolgozik.", [6] = "Nagyon udvarias és jó modorú.", [7] = "Hihetetlenül tehetséges és hozzáértő.", [8] = "Nagyon szeret teljesíteni a munkában.", [9] = "Maximalista, aki soha nem adja fel.", [10] = "Mosolyával mindig jobb kedvre deríti az embereket.", [11] = "Elragadó, udvarias és segítőkész.", [12] = "Motivált és elkötelezett a munka iránt.", [13] = "Természetesen viselkedik és keményen dolgozik.", [14] = "Hűséges és barátságos.", [15] = "Figyelmes és lehet rá számítani vészhelyzetekben.", }, misc = { [1] = "Golfozik.", [2] = "Kagylóbúvárkodik.", [3] = "Jégszobrai vannak.", [4] = "Szereti a borokat.", [5] = "Versenyez.", [6] = "Bungee jumpingol.", [7] = "Poháralátéteket gyűjt.", [8] = "Szeret koncerten a közönségre ugrani.", [9] = "Szeret szörfölni.", [10] = "Szeret folyókat tágítani.", [11] = "Whiskey-t párol.", [12] = "Csináld-magad szakember.", [13] = "Szereti a francia művészfilmeket.", [14] = "Sokszor játszik a Theme Park-kal.", [15] = "C-típusú bizonyítványa van.", [16] = "Motorversenyző.", [17] = "Hegedűn és csellón játszik.", [18] = "Megszállott vonatrajongó.", [19] = "Kutyabarát.", [20] = "Rádiós.", [21] = "Gyakran jár fürdőkbe.", [22] = "Bambuszács szakkör vezetője.", [23] = "Zöldségből készült szappantartói vannak.", [24] = "Részmunkaidős bányászengedélye van.", [25] = "Egy kvíműsor házigazdája.", [26] = "2. világháborús ereklyéket gyűjt.", [27] = "Szeret átalakítani.", [28] = "Rave és trip-hop zenét hallgat.", [29] = "Dezodorral öli meg a rovarokat.", [30] = "Kiszúrja a rossz standup-osokat.", [31] = "Vásárol a kórház bizottságának.", [32] = "Titokban kertészkedik.", [33] = "Hamis karórákat csempész.", [34] = "Egy rock'n'roll bandában énekes.", [35] = "Imád napközben televíziót nézni.", [36] = "Pisztrángra horgászik.", [37] = "Turista minden múzeumban.", }, bad = { [1] = "Lassú és kicsinyes.", [2] = "Lusta és nem ambíciózus.", [3] = "Rosszul képzett és használhatatlan.", [4] = "Buta és fárasztó. Tartalékos katona.", [5] = "Alacsony tűrőképességű. Rossz a magatartása.", [6] = "Süket mint az ágyú. Káposzta szaga van.", [7] = "Piszkos munkát végez. Nem vállal nagy felelősséget.", [8] = "Nehezen koncentrál és könnyen elterelődik a figyelme. ", [9] = "Stresszre hajlamos és sok hibát vét.", [10] = "könnyen dühbe jön. Sok gyűlölet van benne.", [11] = "Inkorrekt és alkalmatlan.", [12] = "nem érdekli a munka. Tétlen.", [13] = "Felelőtlen és gondatlan.", [14] = "Zsémbes, ravasz és mindenki agyára megy.", [15] = "Arogáns és felsőbbrendűsködő.", }, } -- Staff list staff_list = { morale = "Morál", tiredness = "Fáradtság", skill = "Szakismeret", total_wages = "Teljes kereset", } -- Objects object = { desk = "Íróasztal", cabinet = "Szekrény", door = "Ajtó", bench = "Pad", table1 = "Asztal", -- unused object chair = "Szék", drinks_machine = "Üdítőautomata", bed = "Ágy", inflator = "Pumpa", pool_table = "Biliárdasztal", reception_desk = "Recepcióspult", table2 = "Asztal", -- unused object & duplicate cardio = "Kardió", scanner = "Szkenner", console = "Konzol", screen = "Képernyő", litter_bomb = "Szemétbomba", couch = "Dívány", sofa = "Szófa", crash_trolley = "Gurulós szekrény", tv = "TV", ultrascanner = "Ultrahang", dna_fixer = "DNS javító", cast_remover = "Gipszhámozó", hair_restorer = "Hajvisszanövesztő", slicer = "Szeletelő", x_ray = "Röntgen", radiation_shield = "Sugárzás elleni pajzs", x_ray_viewer = "Röntgenvizsgáló", operating_table = "Operálóasztal", lamp = "Lámpa", -- unused object toilet_sink = "WC kagyló", op_sink1 = "WC kagyló", op_sink2 = "WC kagyló", surgeon_screen = "Függöny", lecture_chair = "Hallgatói szék", projector = "Vetítő", bed2 = "Ágy", -- unused duplicate pharmacy_cabinet = "Gyógyszeres vitrin", computer = "Számítógép", atom_analyser = "Atomelemző", blood_machine = "Vérkezelő-gép", fire_extinguisher = "Tűzoltókészülék", radiator = "Fűtőtest", plant = "Növény", electrolyser = "Elektrolizáló", jelly_moulder = "Zselésítő", gates_of_hell = "Pokol kapuja", bed3 = "Ágy", -- unused duplicate bin = "Szemetes", toilet = "Mosdó", swing_door1 = "Lengőajtó", swing_door2 = "Lengőajtó", shower = "Zuhany", auto_autopsy = "Auto-boncoló", bookcase = "Könyvespolc", video_game = "Videojáték", entrance_left = "Bejárat bal ajtó", entrance_right = "Bejárat jobb ajtó", skeleton = "Csontváz", comfortable_chair = "Kényelmes szék", } -- Place objects window place_objects_window = { drag_blueprint = "Addig állítsd az alaprejzot, amíg megfelelő méretűnek nem találod,", place_door = "Válaszd ki az ajtó helyét,", place_windows = "Csinálj pár ablakot, ha szeretnél. Véglegesítsd, ha kész vagy", place_objects = "Helyezd el a tárgyakat. Véglegesítsd, ha boldog vagy,", confirm_or_buy_objects = "Befejezheted a szobát vagy vásárolhatsz még további tárgyakat is,", pick_up_object = "Kattints egy tárgyra, hogy felemeld vagy válassz ki valami mást a dobozból", place_objects_in_corridor = "Helyezd el a tárgyakat a folyosón", } -- Months months = { "Jan", "Feb", "Már", "Ápr", "Máj", "Jún", "Júl", "Aug", "Szep", "Okt", "Nov", "Dec", } -- Date format date_format.daymonth = "%1% %2:months%" -- Graphs graphs = { money_in = "Bevétel", money_out = "Kiadás", wages = "Fizetések", balance = "Mérleg", visitors = "Látogatók", cures = "Gyógyulások", deaths = "Halálesetek", reputation = "Hírnév", time_spans = { "1 óra", "12 óra", "48 óra", } } -- Transactions transactions = { --null = S[8][ 1], -- not needed wages = "Fizetések", hire_staff = "Személyzet felvétele", buy_object = "Tárgy vásárlása.", build_room = "Szoba építése", cure = "Gyógyítás", buy_land = "Telek felvásárlása", treat_colon = "Kezelés:", final_treat_colon = "Teljes kezelés:", cure_colon = "Gyógyult:", deposit = "Letét", advance_colon = "Előlép:", research = "Kutatás költsége", drinks = "Bevétel: Üdítők", jukebox = "Bevétel: Zenegép", -- unused cheat = "Monopolipénz", heating = "Fűtésköltség", insurance_colon = "Biztosítás:", bank_loan = "Hitel", loan_repayment = "Banki letét", loan_interest = "Banki kamat", research_bonus = "Kutatási bónusz", drug_cost = "Gógyszerár", overdraft = "Hiteltúllépési kamat", severance = "Végkielégítés", general_bonus = "Általános bónusz", sell_object = "Tárgy eladás", personal_bonus = "Személyi bónsuz", emergency_bonus = "Vészhelyzet bónusz", vaccination = "Védőoltás", epidemy_coverup_fine = "Járványeltitkolási bírság", compensation = "Kompenzáció", vip_award = "VIP-jutalom", epidemy_fine = "Járványbírság", eoy_bonus_penalty = "Év végi bónusz/büntetés", eoy_trophy_bonus = "Év végi trófea-bónusz", machine_replacement = "Gépcsere", } -- Town map town_map = { chat = "Térképcsevegés", for_sale = "Eladó", not_for_sale = "Nem eladó", number = "Telekszám", owner = "Tulajdonos", area = "Telekfelszín", price = "Telekár", } -- Rooms short -- NB: includes some special "rooms" -- reception, destroyed room and "corridor objects" rooms_short = { reception = "Recepció", destroyed = "Megsemmisült", corridor_objects = "Folyosói tárgyak", gps_office = "Orvosi iroda", psychiatric = "Pszichiátria", ward = "Kórterem", operating_theatre = "Műtő", pharmacy = "Gyógyszertár", cardiogram = "Kardiogramm", scanner = "Szkenner", ultrascan = "Ultrahang", blood_machine = "Vérgép", x_ray = "Röntgen", inflation = "Pumpa", dna_fixer = "DNS-klinika", hair_restoration = "Hajklinika", tongue_clinic = "Nyelvklinika", fracture_clinic = "Gipszelő", training_room = "Tréningszoba", electrolysis = "Elektrolizáló", jelly_vat = "Kocsonyakád", staffroom = "Személyzeti szoba", -- rehabilitation = "Rehabilitering", -- unused general_diag = "Általános vizsgáló", research_room = "Kutatószoba.", toilets = "WC", decontamination = "Fertőtlenítő", } -- Rooms long rooms_long = { general = "ÁLtalános", -- unused? emergency = "Vészhelyzet", corridors = "Folyosó", gps_office = "Orvosi iroda", psychiatric = "Pszichiátria", ward = "Kórterem", operating_theatre = "Műtő", pharmacy = "Gyógyszertár", cardiogram = "Kardiogramm", scanner = "Szkenner", ultrascan = "Ultrahang", blood_machine = "Vérgép", x_ray = "Röntgen", inflation = "Pumpa", dna_fixer = "DNS-klinika", hair_restoration = "Hajklinika", tongue_clinic = "Nyelvklinika", fracture_clinic = "Gipszelő", training_room = "Tréning szoba", electrolysis = "Elektrolizáló", jelly_vat = "Kocsonyakád", staffroom = "Személyzeti szoba", -- rehabilitation = "Rehabiliteringsrom", -- unused general_diag = "Általános vizsgáló", research_room = "Kutatószoba", toilets = "WC", decontamination = "Fertőtlenítő", } -- Drug companies drug_companies = { "Gyógyi Neked Kft.", "Meggyógyít Zrt.", "Tabi Mámor Kft.", "Jótabletta Zrt.", "Mindenre Jó Zrt.", } -- Build rooms build_room_window = { pick_department = "Osztály kiválasztása", pick_room_type = "Típus kiválasztása", cost = "Ár: ", } -- Build objects buy_objects_window = { choose_items = "Elemek kiválasztása", price = "Ár:", total = "Összesen:", } -- Research research = { categories = { cure = "Gyógymód", diagnosis = "Diagnózis", drugs = "Gyógyszerek", improvements = "Fejlesztések", specialisation = "Specializáció", }, funds_allocation = "Tőke elosztás", allocated_amount = "Elosztott összeg", } -- Research policy tooltip tooltip.research_policy = { research_progress = "Előrehaladottság ebben a felfedezés-kategóriában: %1%/%2%", no_research = "Nem végzel kutatást ebben a kategóriában", } -- Policy screen policy = { header = "Kórházi szabályzat", diag_procedure = "Diagnózis állása", diag_termination = "Diagnózis lezárása", staff_rest = "Személyzet pihenőre küldése", staff_leave_rooms = "Személyzet szobákból való kiküldése", sliders = { guess = "Gyógykezelés megtippelése", -- belongs to diag_procedure send_home = "Hazaküldés", -- also belongs to diag_procedure stop = "Kezelés leállítása", -- belongs to diag_termination staff_room = "Személyzeti szobába küldés", -- belongs to staff_rest } } -- Rooms room_classes = { -- S[19][2] -- "corridors" - unused for now diagnosis = "Diagnózis", treatment = "Kezelés", clinics = "Klinikák", facilities = "Egyéb létesítmények", } -- Insurance companies insurance_companies = { out_of_business = "Üzemen kívül", "Hattyúlevél Kft.", "Norfolk Hagyma Bt.", "Darázsheg Kft.", "Úszó Hólyag Zrt.", "Barát Béla Kft.", "DagiDezső Holdings", "Lusta Leon Vállalat", "Ping és Pong Kft.", "Vidám Biztosító Vállalat", "Szakszervezeti Biztosító", "Kölcsönös Előny Zrt.", } -- Menu root -- Keep 2 spaces as prefix and suffix menu = { file = " Fájl ", options = " Beállítások ", display = " Nézet ", charts = " Grafikonok ", debug = " Hibakeresés ", } -- Menu File menu_file = { load = " (%1%) Betöltés ", save = " (%1%) Mentés ", restart = " (%1%) Újrakezdés ", quit = " (%1%) Kilépés ", } menu_file_load = { [1] = " Mentés 1 ", [2] = " Mentés 2 ", [3] = " Mentés 3 ", [4] = " Mentés 4 ", [5] = " Mentés 5 ", [6] = " Mentés 6 ", [7] = " Mentés 7 ", [8] = " Mentés 8 ", } menu_file_save = { [1] = " Mentés 1 ", [2] = " Mentés 2 ", [3] = " Mentés 3 ", [4] = " Mentés 4 ", [5] = " Mentés 5 ", [6] = " Mentés 6 ", [7] = " Mentés 7 ", [8] = " Mentés 8 ", } -- Menu Options menu_options = { sound = " (%1%) Hang ", announcements = " (%1%) Hangosbemondó ", music = " (%1%) Zene ", sound_vol = " Hangerő ", announcements_vol = " Hangosbemondó hangereje ", music_vol = " Zene hangereje ", autosave = " Automatikus mentés ", game_speed = " Játék sebessége ", jukebox = " (%1%) Zenegép ", } -- Menu Options Volume menu_options_volume = { [10] = " 10% ", [20] = " 20% ", [30] = " 30% ", [40] = " 40% ", [50] = " 50% ", [60] = " 60% ", [70] = " 70% ", [80] = " 80% ", [90] = " 90% ", [100] = " 100% ", } -- Menu Options Game Speed menu_options_game_speed = { slowest = " (%1%) Leglassabb ", slower = " (%1%) Lassú ", normal = " (%1%) Normál ", max_speed = " (%1%) Maximum sebesség ", and_then_some_more = " (%1%) Még egy kicsivel több ", } -- Menu Display menu_display = { high_res = " Jó felbontás ", mcga_lo_res = " MCGA alacsony felbontás ", shadows = " Árnyékok ", } -- Menu Charts menu_charts = { statement = " (%1%) Egyenleg ", casebook = " (%1%) Esetek ", policy = " (%1%) Szabályzat ", research = " (%1%) Kutatás ", graphs = " (%1%) Grafikonok ", staff_listing = " (%1%) Személyzet ", bank_manager = " (%1%) Bankár ", status = " (%1%) Állapot ", briefing = " Eligazítás ", } -- Menu Debug menu_debug = { object_cells = " Objektumcellák ", entry_cells = " Bejáratcellák ", keep_clear_cells = " Szabadon hagyandó cellák ", nav_bits = " Navigációs bitek ", remove_walls = " Falak eltávolítása ", remove_objects = " Objektumok eltávolítása ", display_pager = " Személyhívó megjelenítése ", mapwho_checking = " MAPWHO ellenőrzés ", plant_pagers = " PLANT PAGERS ", porter_pagers = " PORTER PAGERS ", pixbuf_cells = " PIXBUff CELLS ", enter_nav_debug = " NAV hibakereső beütése ", show_nav_cells = " Navigációs cellák mutatása ", machine_pagers = " Gép PAGEREK ", display_room_status = " Szoba állapotának mutatása ", display_big_cells = " Nagy cellák mutatása ", show_help_hotspot = " Segédpontok mutatása ", win_game_anim = " Játék megnyerésének animációja ", win_level_anim = " Pálya megnyerésének animációja ", lose_game_anim = { [1] = " Játék elveszítése animáció 1 ", [2] = " Játék elveszítése animáció 2 ", [3] = " Játék elveszítése animáció 3 ", [4] = " Játék elveszítése animáció 4 ", [5] = " Játék elveszítése animáció 5 ", [6] = " Játék elveszítése animáció 6 ", [7] = " Játék elveszítése animáció 7 ", }, } debug_patient_window = { caption = "Próbabeteg", } -- High score screen high_score = { pos = "Poz", player = "Játékos", score = "Eredmény", best_scores = "Legjobbak csarnoka", worst_scores = "Szégyenfal", killed = "Megölt", -- is this used? categories = { money = "Pénz", salary = "Kereset", clean = "Tiszta", cures = "Gyógyulás", deaths = "Haláleset", cure_death_ratio = "Gyógyulás és halálesetek aránya", patient_happiness = "Betegek elégedettsége", staff_happiness = "Személyzet elégedettsége", staff_number = "Személyzet száma", visitors = "Látogatók", total_value = "Teljes érték", }, } -- Casebook screen casebook = { reputation = "népszerűség", treatment_charge = "gyógyítás díja", earned_money = "összegyüjtött pénz", cured = "meggyógyítottak", deaths = "halálesetek sázma", sent_home = "hazaküldöttek száma", research = "kutatás", cure = "gyógymód", cure_desc = { build_room = "Javaslom építs ilyen szobát: %s", -- %s (room name) build_ward = "Még mindíg szükség van egy kórteremre.", hire_doctors = "Szükség van még orvosra.", hire_surgeons = "Vegyél fel sebészt.", hire_psychiatrists = "Vegyél fel pszichológust.", hire_nurses = "Vegyél fel nővért.", no_cure_known = "Nincs ismert gyógymód.", cure_known = "Van gyógymód.", improve_cure = "Gyógymód fejlesztése", }, } -- Tooltips tooltip = { -- Build room window build_room_window = { room_classes = { diagnosis = "Diagnózis", treatment = "Kezelés", clinic = "Klinikák", facilities = "Egyéb létesítmények", }, cost = "Ár", close = "Bezárás", }, -- Toolbar toolbar = { bank_button = "Bal gombbal a bankmenedzser-ablakod nyitod meg, jobbal pedig a banki kimutatást", balance = "Egyenleged", reputation = "Hírneved: ", -- NB: no %d! Append " ([reputation])". date = "A dátum", rooms = "Szobák építése", objects = "Folyosók díszítése", edit = "Szobák/tárgyak szerkesztése", hire = "Alkalmazottak szerződtetése", staff_list = "Személyzetmenedzsment", town_map = "Várostérkép", casebook = "Esetnapló", research = "Kutatás", status = "Állapot", charts = "Grafikonok", policy = "Házirend", }, -- Hire staff window hire_staff_window = { doctors = "Az elérhető doktorok áttekintése", nurses = "Az elérhető nővérek áttekintése", handymen = "Az elérhető ezermesterek áttekintése", receptionists = "Az elérhető recepciósok áttekintése", prev_person = "Előző személy", next_person = "Következő személy", hire = "A személy felvétele", cancel = "Mégsem", doctor_seniority = "A doktor fokozata (rezidens, doktor, konzuláns)", staff_ability = "A jelentkező képességei", salary = "Fizetés", qualifications = "A doktor további végzettségei", surgeon = "Sebész", psychiatrist = "Pszichológus", researcher = "Kutató", }, -- Buy objects window buy_objects_window = { price = "A tárgy ára", total_value = "A megrendelt tárgyak összára", confirm = "Tárgy(ak) megvásárlása", cancel = "Mégsem", increase = "Eggyel több tárgy vásárlása ebből", decrease = "Eggyel kevesebb tárgy vásárlása ebből", }, -- Staff list staff_list = { doctors = "Az alkalmazott doktorok listájának megjelenítése", nurses = "Az alkalmazott nővérek listájának megjelenítése", handymen = "Az alkalmazott ezermesterek listájának megjelenítése", receptionists = "Az alkalmazott recepciósok listájának megjelenítése", happiness = "A kiválasztott alkalmazottak boldogsága", tiredness = "A kiválasztott alkalmazottak fáradtsága", ability = "A kiválasztott alkalmazottak képessége", salary = "Az alkalmazott jelenlegi fizetése", happiness_2 = "Az alkalmazott morálja", tiredness_2 = "Az alkalmazottak fáradtsága", ability_2 = "Az alkalmazott képessége", prev_person = "Következő oldal", next_person = "Előző oldal", bonus = "10 suzázalékos bónusz fizetése ennek az alkalmazottnak", sack = "Az alkalmazott kirúgása", pay_rise = "Az alkalmazott fizetésének megemelése 10 százalékkal", close = "Kilépés és visszatérés a játékba", doctor_seniority = "A doktor fokozata", detail = "Részleteknek odafigyelés", view_staff = "Személyre közelítés", surgeon = "Képzett sebész", psychiatrist = "Képzett pszichológus", researcher = "Képzett kutató", surgeon_train = "Sebésszé képzés mértéke: %d%%", -- %d (percentage trained) psychiatrist_train = "Pszichológussá képzés mértéke: %d%%", -- %d (percentage trained) researcher_train = "Kutatóvá képzés mértéke: %d%%", -- %d (percentage trained) skills = "További készségek", }, -- Queue window queue_window = { num_in_queue = "A sor hossza", num_expected = "A recepciós szerint ennyien fognak nemsokára a sorba állni", num_entered = "Ennyian jártak a szobában", max_queue_size = "A sor maximális mérete", dec_queue_size = "Sor maximális méretének csökkentése", inc_queue_size = "Sor maximális méretének növelése", front_of_queue = "Húzz egy beteget ehhez az ikonhoz, hogy a sor elejére állítsd", end_of_queue = "Húzz egy beteget ehhez az ikonhoz, hogy a sor végére állítsd", close = "Bezárás", patient = "Húzd a betegeket a soron belül bal gombbal, küldd haza vagy a rivális kórházak valamelyikébe jobb gombbal.", patient_dropdown = { reception = "Beteg küldése a recepcióhoz", send_home = "Beteg hazaküldése", hospital_1 = "Beteg átirányítása egy másik kórházba", hospital_2 = "Beteg átirányítása egy másik kórházba", hospital_3 = "Beteg átirányítása egy másik kórházba", }, }, -- Main menu main_menu = { new_game = "Új kampány kezdése", load_game = "Korábbi játék betöltése", continue = "Korábbi játék folytatása", network = "Hálózati játék kezdése", quit = "Kilépés", load_menu = { load_slot = " Mentés [slotnumber] ", -- NB: no %d! Append " [slotnumber]". empty_slot = " Üres ", }, }, -- Window general window_general = { cancel = "Mégse", confirm = "Megerősít", }, -- Patient window patient_window = { close = "Ablak bezárása", graph = "Kattints, hogy átválts a beteg egészség-grafikonja és kezelésnaplója között", happiness = "A beteg boldogsága", thirst = "A beteg szomjúsága", warmth = "A beteg melegség érzete", casebook = "Részletek megjelenítése a személy betegségéről", send_home = "A beteg elbocsátása ebből a kórházból", center_view = "A kamera betegre rögzítése", abort_diagnosis = "A beteg azonnali kezelése, a diagnózis befejezése helyett", queue = "Részletek megjelenítése a beteg előtt álló sorról", }, -- window staff_window = { name = "Alkalmazott neve", close = "Ablak bezárása", face = "A személy arca - kattints, hogy megnyitsd a kezelőablakot", happiness = "Boldogság", tiredness = "Fáradtság", ability = "Képesség", doctor_seniority = "Doktor fokozata (Rezidens, Doktor, Konzuláns)", skills = "Képességek", surgeon = "Sebész", psychiatrist = "Pszichológus", researcher = "Kutató", salary = "Fizetés", center_view = "Kattints bal gombbal a közelítéshez, jobb gombbal pedig az alkalmazottak közötti lapozáshoz.", sack = "Kirúgás", pick_up = "Felkapás", }, -- Machine window machine_window = { name = "Név", close = "Ablak bezárása", times_used = "Ennyiszer volt használatban a gép", status = "A gép állapota", repair = "Ezermester hívása, hogy megjavítsa a gépet", replace = "Gép kicserélése", }, -- Handyman window -- Spparently handymen have their own set of strings (partly) containing "handyman". -- We could just get rid of this category and include the three prios into staff_window. handyman_window = { name = "Ezermester neve", -- contains "handyman" close = "Ablak bezárása", face = "Ezermester arca", -- contains "handyman" happiness = "Boldogság", tiredness = "Fáradtság", ability = "Képesség", prio_litter = "Szemétszedés prioritásának növelése ennél az ezermesternél", -- contains "handyman" prio_plants = "Növényápolás prioritásának növelése ennél az ezermesternél", -- contains "handyman" prio_machines = "Gépszerelés prioritásának növelése ennél az ezermesternél", -- contains "handyman" salary = "Fizetés", center_view = "Ugrás az ezermesterre", -- contains "handyman" sack = "Kirúgás", pick_up = "Felkapás", }, -- Place objects window place_objects_window = { cancel = "Mégsem", buy_sell = "Tárgyak vásárlása/eladása", pick_up = "Tárgy felemelése", confirm = "Megerősít", }, -- Casebook casebook = { up = "Felfelé gördítés", down = "Lefelé gördítés", close = "Gyógyszeres könyv bezárása", reputation = "A kezelés népszerűsége", treatment_charge = "Kezelés költsége", earned_money = "A kezelésből eddig befolyt bevétel", cured = "Sikeres kezelések száma", deaths = "Halálesetet előidéző kezelések száma", sent_home = "Elutasított betegek száma", decrease = "Ár csökkentése", increase = "Ár növelése", research = "Kattints, hogy a specializációkra szánt kutatási pénzt erre a kezelésre használd", cure_type = { drug = "A kezeléshez gyógyszerre van szükség", drug_percentage = "A kezeléshez gyógyszerre van szükség - a tiéd %d%% hatásos", -- %d (effectiveness percentage) psychiatrist = "Pszichológus végzi ezt a kezelést", surgery = "Sebész végzi ezt a kezelést", machine = "Ehhez a kezeléshez egy gépre van szükség", unknown = "Egyelőre nem tudod, hogy miként kell kezelni ezt a betegséget", }, cure_requirement = { possible = "Kezelni tudod ezt a betegséget", research_machine = "Fel kell találnod pár gépet, hogy ezt a betegséget kezelni tudd", build_room = "Egy szoba megépítésére van szükség, hogy ezt a betegséget kezelni tudd", -- NB: no %s! hire_surgeons = "Két sebészt kell alkalmaznod, hogy operációkat tudj végrehajtani", hire_surgeon = "Egy második sebészre is szükséged van, hogy operációkat tudj végrehajtani", hire_staff = "Az alábbi személyzetre van szükséged ehhez a kezeléshez: %s", -- %s (staff type) hire_staff_old = "Az alábbi személyzetre van szükséged ehhez a kezeléshez: %s", build_ward = "Ehhez a kezeléshez egy kórteremre van szükséged", ward_hire_nurse = "Egy kórteremben dolgozó nővérre van szükséged ennek a betegségnek a kezeléséhez", not_possible = "Még nem tudod kezelni ezt a betegséget", }, }, -- Statement statement = { close = "Bezárás", }, -- Research research = { close = "Kutatás ablak bezárása", cure_dec = "Kutatás mértékének csökkentése", diagnosis_dec = "Berendezéskutatás mértékének csökkentése", drugs_dec = "Gyógyszerkutatás mértékének csökkentése", improvements_dec = "Fejlesztéskutatás mértékének csökkentése ", specialisation_dec = "Specializációs kutatás mértékének csökkentése", cure_inc = "Kutatás mértékéne növelése", diagnosis_inc = "Berendezéskutatás mértékének növelése", drugs_inc = "Gyógyszerkutatás mértékének növelése", improvements_inc = "Fejlesztéskutatás mértékének növelése", specialisation_inc = "Specializációs kutatás mértékének növelése", allocated_amount = "A büdzséből erre szánt összeg", }, -- Graphs graphs = { close = "Grafikonok ablak bezárása", scale = "Skála", money_in = "Bevétel bekapcsolása/kikapcsolása", money_out = "Kiadás bekapcsolása/kikapcsolása", wages = "Fizetések bekapcsolása/kikapcsolása", balance = "Banki egyenleg bekapcsolása/kikapcsolása", visitors = "Látogatók számának bekapcsolása/kikapcsolása", cures = "Sikeres kezelések számának bekapcsolása/kikapcsolása", deaths = "Halálozások számának bekapcsolása/kikapcsolása", reputation = "Hírnév bekapcsolása/kikapcsolása", }, -- Town map town_map = { people = "Emberek bekapcsolása/kikapcsolása", plants = "Növények bekapcsolása/kikapcsolása", fire_extinguishers = "Poroltók bekapcsolása/kikapcsolása", objects = "Táryak bekapcsolása/kikapcsolása", radiators = "Radiátorok bekapcsolása/kikapcsolása", heat_level = "Hő bekapcsolása/kikapcsolása", heat_inc = "Hőmérséklet növelése", heat_dec = "Hőmérséklet csökkentése", heating_bill = "Gázszámla", balance = "Egyenleg", close = "Térkép bezárása", }, -- Jukebox. jukebox = { current_title = "Zenegép", close = "Zenegép bezárása", play = "Zenegép elindítása", rewind = "Visszatekerés", fast_forward = "Előretekerés", stop = "Zenedoboz megállítása", loop = "Lejtászás végtelenítése", }, -- Bank Manager bank_manager = { hospital_value = "A kórház pillanatnyi értéke", balance = "Bankegyenleged", current_loan = "Kölcsöneid jelenlegi mértéke", repay_5000 = "$5000 visszafizetése a banknak", borrow_5000 = "$5000 hitel felvétele", interest_payment = "Havi kamat", inflation_rate = "Éves inflációs ráta", interest_rate = "Éves kamatráta", close = "Ablak bezárása", insurance_owed = "Ennyivel tartozik neked %s", -- %s (name of debitor) show_graph = "%s várható kifizetésének mértéke", -- %s (name of debitor) graph = "%s várható kifizetéseinek grafikonja", -- %s (name of debitor) graph_return = "Visszatérés az előző nézetre", }, -- Status status = { percentage_cured = "A betegek %d% -át kell meggyógyítanod. Egyelőre %d% -ot gyógyítottál meg", thirst = "A betegek szomjúsága összesen", close = "Az áttekintő ablak bezárása", population_chart = "A diagramm, ami a azt mutatja, hogy a helyi lakosság mekkora részét gyógyította meg egy-egy kórház", win_progress_own = "A nyeréshez szükséges kritérium teljesítettségének mutatása", reputation = "A népszerűségednek legalább ennyinek kell lennie: %d. Jelenleg ennyi: %d", population = "A helyi lakosság legalább %d%% -ának kell a te kórházadba jönnie", warmth = "A betegek melegség érzete összesen", percentage_killed = "A cél az, hogy a betegeid legfeljebb %d%% -át öld meg. Eddig %d%% -ukat ölted meg", balance = "A banki egyenlegednek legalább ennyinek kell lennie: %d. Jelenleg ennyi: %d", value = "A kórházad értékének legalább ennyinek kell lennie: $%d. Jelenleg ennyi: $%d", win_progress_other = "%s nyerési előremenetelének mutatása", -- %s (name of competitor) num_cured = "Legalább %d beteget kell meggyógyítanod. Eddig ennyit gyógyítottál meg: %d", happiness = "A kórházad betegeinek boldogsága", }, -- Policy policy = { close = "Ablak bezárása", staff_leave = "Kattintással utasíthatod a jelenleg nem elfoglalt orvosaidat a többiek megsegítésére", staff_stay = "Kattintással maradásra utasítod az adott orvost abban a szobában, ahová helyezted", diag_procedure = "Ha egy orvos diagnózisa kevésbé biztos, mint a HAZAKÜLDÉS korlátja, a beteget hazaküldik. Ha a diagnózis biztosabb, mint a KEZELÉS MEGTIPPELÉSE mérték, a beteget kezelni fogják", diag_termination = "Egy beteg diagnosztizálása addig tart, ameddig a doktorok bizonyossága el nem éri a FOLYAMAT LEÁLLÍTÁSA szintet vagy pedig meg nem próbálnak minden lehetséges diagnósztizáló eszközt", staff_rest = "Azt mutatja, hogy mennyire lehet fáradt a személyzet, mielőtt a személyzeti szobába menne", }, -- Pay rise window pay_rise_window = { accept = "Beleegyezés a fizetésemelésbe", decline = "Nem emeled a fizetést - inkább kirúgod", }, -- Watch watch = { hospital_opening = "Építési idő: ennyi időd maradt a kórházad nyitásáig. Kattintással azonnal megnyithatod a kórházat.", emergency = "Vészhelyzet: azt mutatja, hogy mennyi időd van az összes veszélyeztetett beteged meggyógyítására", epidemic = "Járvány: ennyi időd maradt felszámolni a járványt. Ha az időd lejárt VAGY egy fertőző beteg elhagyja a kórházadat, egy tisztiorvos jön látogatóba. A gombbal az beoltás üzemmódot tudod be illetve kikapcsolni. Kattints egy betegre, hogy beoltasd egy nővérrel.", }, -- Rooms rooms = { gps_office = "A betegek az orvosi irodában konzultálnak orvosaikkal és kapják meg leleteik eredményét", psychiatry = "Az pszichiátra meggyógyítja az őrülteket és segít más betegséket diagnosztizálásában, azonban a működtetéséhez szükséged van egy pszichológus végzettségű orvosra", ward = "A kórtermek mind a diagnosztizálásra, mind pedig a kezelésre alkalmasak. Ide kerülnek a betegek megfigyelésre és felépülésre egyaránt, melyhez egy nővérre van szükség", operating_theatre = "A műtőnek a működéshez két szebész végzettségű orvosra van szüksége", pharmacy = "Egy nővér osztja ki a megfelelő gyógyszereket a betegeknek", cardiogram = "Egy doktor kezeli a kardiogrammot a diagnózis felállításához", scanner = "Egy doktor kezeli a szkennert a diagnózis felállításához", ultrascan = "Egy doktor kezeli az ultrahangot a diagnózis felállításához", blood_machine = "Egy doktor kezeli a vérgépet a diagnózis felállításához", x_ray = "Egy doktor kezeli a röntgent a diagnózis felállításához", inflation = "Egy doktor kezeli a fejfúvót a duzzadt fejű betegek kezeléséhez", dna_fixer = "Egy doktor kezeli a DNS-javítót az idegen DNS-es betegek kezeléséhez", hair_restoration = "Egy doktor kezeli a hajnövesztőt a kopasz betegek kezeléséhez ", tongue_clinic = "Egy doktor kezeli a nyelvmetszőt a petyhüdt nyelvű betegek kezeléséhez", fracture_clinic = "Egy nővér üzemelteti a gipszklinikát a törött csontok helyreállításához", training_room = "A tréning szoba doktorok továbbképzésére alkalmas, ha egy konzuláns fokozatú doktor üzemelteti", electrolysis = "Egy doktor kezeli az elektrolizálót a hajitiszes betegek kezeléséhez ", jelly_vat = "Egy doktor kezeli a zselékádat a kocsonyásodott betegek gyógyításához ", staffroom = "Doktorok, nővérek és ezermesterek pihennek a személyzeti szobában, hogy kiheverjék fáradalmaikat", -- rehabilitation = S[33][27], -- unused general_diag = "Egy doktor tudja ellátni az általános kivizsgálót az elsődleges diagnózis felállításához. Olcsó és sokszor nagyon hatásos", research_room = "Kutató végzettségű orvosok tudnak kifejleszteni új gépeket és gyógyszereket a kutatószobában", toilets = "Építs WC-t annak érdekében, hogy a betegeid ne csináljanak nagy felfordulást a kórházadban!", decontamination = "Egy doktor kezeli a fertőtlenítő készüléket a radioaktív betegek gyógyításához", }, -- Objects objects = { -- NB: most objects do not have a tooltip because they're not (extra-)buyable desk = "Íróasztal: Nélkülönözhetetlen az orvosok számára. Erre teszik a számítógépüket.", cabinet = "Szekrény: Kórlapokat, jegyzeteket és kutatási anyagokat tartalmaz.", door = "Ajtó: az emberek gyakran nyitják és csukják ezeket.", bench = "Pad: helyet teremt a várakozó betegeknek, kényelmesebbé téve ezzel a múló perceket.", table1 = "Asztal (eltávolított): magazinokat tartalmaz, hogy a betegeknek gyorsabban teljes az idő.", chair = "Szék: ide ül a beteg, hogy elmondja a bajait.", drinks_machine = "Italautomata: Csökkenti a betegek szomját és egy kis bevételt hoz neked.", bed = "Ágy: az igazán beteg emberek ezen fekszenek.", inflator = "Pumpa: .", }, } -- Confirmation confirmation = { quit = "Tényleg ki szeretnél lépni a játékból? ", return_to_blueprint = "Biztosan vissza szeretnél lépni tervrajz módba?", replace_machine = "Biztosan ki szeretnéd cserélni %s-t ennyiért $%d?", -- %s (machine name) %d (price) overwrite_save = "Egy állás már létezik ezen a helyen. Biztos hogy felül akarod írni?", delete_room = "Biztosan le akarod bontani ezt a szobát?", sack_staff = "Biztos hogy ki akarod rúgni ezt a dolgozót?", restart_level = "Biztos hogy újra akarod kezdeni ezt a pályát?", } -- Miscellangelous -- Category of strings that fit nowhere else or we are not sure where they belong. -- If you think a string of these fits somewhere else, please move it there. -- Don't forget to change all references in the code and other language files. misc = { grade_adverb = { mildly = "lágyan", moderately = "közepesen", extremely = "extrémen", }, done = "Kész", pause = "Megállít", send_message = "Üzenet küldése %d játékosnak", -- %d (player number) send_message_all = "Üzenet küldése az összes játékosnak", save_success = "Mentés sikeres", save_failed = "HIBA: Mentés sikertelen", hospital_open = "Korház megnyitott", out_of_sync = "A játék kiesett a szinkronból", load_failed = "Nem tudtam betölteni az állást", low_res = "Alacsony felbontás.", balance = "Egyenleg:", mouse = "Egér", force = "Kényszerít", } -- Original credits (untranslated) original_credits = { [1] = " ", [2] = " ", [3] = " ", [4] = " ", [5] = " ", [6] = " ", [7] = " ", [8] = " ", [9] = " ", [10] = " ", [11] = " ", [12] = ":Designed and Created by", [13] = ":Bullfrog Productions", [14] = " ", [15] = ":Pluto Development Team", [16] = ",", [17] = "Mark Webley", [18] = "Gary Carr", [19] = "Matt Chilton", [20] = "Matt Sullivan", [21] = "Jo Rider", [22] = "Rajan Tande", [23] = "Wayne Imlach", [24] = "Andy Bass", [25] = "Jon Rennie", [26] = "Adam Coglan", [27] = "Natalie White", [28] = " ", [29] = " ", [30] = " ", [31] = ":Programming", [32] = ",", [33] = "Mark Webley", [34] = "Matt Chilton", [35] = "Matt Sullivan", [36] = "Rajan Tande", [37] = " ", [38] = " ", [39] = " ", [40] = ":Art", [41] = ",", [42] = "Gary Carr", [43] = "Jo Rider", [44] = "Andy Bass", [45] = "Adam Coglan", [46] = " ", [47] = " ", [48] = " ", [49] = ":Additional Programming", [50] = ",", [51] = "Ben Deane", [52] = "Gary Morgan", [53] = "Jonty Barnes", [54] = " ", [55] = " ", [56] = " ", [57] = ":Additional Art", [58] = ",", [59] = "Eoin Rogan", [60] = "George Svarovsky", [61] = "Saurev Sarkar", [62] = "Jason Brown", [63] = "John Kershaw", [64] = "Dee Lee", [65] = " ", [66] = " ", [67] = " ", [68] = ":Intro Sequence", [69] = ",", [70] = "Stuart Black", [71] = " ", [72] = " ", [73] = " ", [74] = ":Music and Sound Effects", [75] = ",", [76] = "Russell Shaw", [77] = "Adrian Moore", [78] = " ", [79] = " ", [80] = " ", [81] = ":Additional Music", [82] = ",", [83] = "Jeremy Longley", [84] = "Andy Wood", [85] = " ", [86] = " ", [87] = " ", [88] = ":Announcer Voiceover", [89] = ",", [90] = "Rebecca Green", [91] = " ", [92] = " ", [93] = " ", [94] = ":Level Design", [95] = ",", [96] = "Wayne Imlach", [97] = "Natalie White", [98] = "Steven Jarrett", [99] = "Shin Kanaoya", [100] = " ", [101] = " ", [102] = " ", [103] = ":Scripting", [104] = ",", [105] = "James Leach", [106] = "Sean Masterson", [107] = "Neil Cook", [108] = " ", [109] = " ", [110] = " ", [111] = ":R&D", [112] = " ", [113] = ":Graphics Engine", [114] = ",", [115] = "Andy Cakebread", [116] = "Richard Reed", [117] = " ", [118] = " ", [119] = " ", [120] = ":R&D Support", [121] = ",", [122] = "Glenn Corpes", [123] = "Martin Bell", [124] = "Ian Shaw", [125] = "Jan Svarovsky", [126] = " ", [127] = " ", [128] = " ", [129] = ":Library and Tools", [130] = " ", [131] = "Dos and Win 95 Library", [132] = ",", [133] = "Mark Huntley", [134] = "Alex Peters", [135] = "Rik Heywood", [136] = " ", [137] = " ", [138] = " ", [139] = ":Network Library", [140] = ",", [141] = "Ian Shippen", [142] = "Mark Lamport", [143] = " ", [144] = " ", [145] = " ", [146] = ":Sound Library", [147] = ",", [148] = "Russell Shaw", [149] = "Tony Cox", [150] = " ", [151] = " ", [152] = " ", [153] = ":Installer Programming", [154] = ",", [155] = "Andy Nuttall", [156] = "Tony Cox", [157] = "Andy Cakebread", [158] = " ", [159] = " ", [160] = " ", [161] = ":Moral Support", [162] = ",", [163] = "Peter Molyneux", [164] = " ", [165] = " ", [166] = " ", [167] = ":Testing Manager", [168] = ",", [169] = "Andy Robson", [170] = " ", [171] = " ", [172] = " ", [173] = ":Lead Testers", [174] = ",", [175] = "Wayne Imlach", [176] = "Jon Rennie", [177] = " ", [178] = " ", [179] = " ", [180] = ":Play Testers", [181] = ",", [182] = "Jeff Brutus", [183] = "Wayne Frost", [184] = "Steven Lawrie", [185] = "Tristan Paramor", [186] = "Nathan Smethurst", [187] = " ", [188] = "Ryan Corkery", [189] = "Simon Doherty", [190] = "James Dormer", [191] = "Martin Gregory", [192] = "Ben Lawley", [193] = "Joel Lewis", [194] = "David Lowe", [195] = "Robert Monczak", [196] = "Dominic Mortoza", [197] = "Karl O'Keeffe", [198] = "Michael Singletary", [199] = "Andrew Skipper", [200] = "Stuart Stephen", [201] = "David Wallington", [202] = " ", [203] = "And all our other Work Experience Play Testers", [204] = " ", [205] = " ", [206] = " ", [207] = ":Technical Support", [208] = ",", [209] = "Kevin Donkin", [210] = "Mike Burnham", [211] = "Simon Handby", [212] = " ", [213] = " ", [214] = " ", [215] = ":Marketing", [216] = ",", [217] = "Pete Murphy", [218] = "Sean Ratcliffe", [219] = " ", [220] = " ", [221] = " ", [222] = ":With thanks to:", [223] = ",", [224] = "Tamara Burke", [225] = "Annabel Roose", [226] = "Chris Morgan", [227] = "Pete Larsen", [228] = " ", [229] = " ", [230] = " ", [231] = ":PR", [232] = ",", [233] = "Cathy Campos", [234] = " ", [235] = " ", [236] = " ", [237] = ":Documentation", [238] = ",", [239] = "Mark Casey", [240] = "Richard Johnston", [241] = "James Lenoel", [242] = "Jon Rennie", [243] = " ", [244] = " ", [245] = " ", [246] = ":Documentation & Packaging Design", [247] = ",", [248] = "Caroline Arthur", [249] = "James Nolan", [250] = " ", [251] = " ", [252] = " ", [253] = ":Localisation Project Manager", [254] = ",", [255] = "Carol Aggett", [256] = " ", [257] = " ", [258] = " ", [259] = ":Localisation", [260] = ",", [261] = "Sandra Picaper", [262] = "Sonia 'Sam' Yazmadjian", [263] = " ", [264] = "Bettina Klos", [265] = "Alexa Kortsch", [266] = "Bianca Normann", [267] = " ", [268] = "C.T.O. S.p.A. Zola Predosa (BO)", [269] = "Gian Maria Battistini", [270] = "Maria Ziino", [271] = "Gabriele Vegetti", [272] = " ", [273] = "Elena Ruiz de Velasco", [274] = "Julio Valladares", [275] = "Ricardo Martínez", [276] = " ", [277] = "Kia Collin", [278] = "CBG Consult", [279] = "Ulf Thor", [280] = " ", [281] = " ", [282] = " ", [283] = ":Production", [284] = ",", [285] = "Rachel Holman", [286] = " ", [287] = " ", [288] = " ", [289] = ":Producer", [290] = ",", [291] = "Mark Webley", [292] = " ", [293] = " ", [294] = " ", [295] = ":Associate Producer", [296] = ",", [297] = "Andy Nuttall", [298] = " ", [299] = " ", [300] = " ", [301] = ":Operations", [302] = ",", [303] = "Steve Fitton", [304] = " ", [305] = " ", [306] = " ", [307] = ":Company Administration", [308] = ",", [309] = "Audrey Adams", [310] = "Annette Dabb", [311] = "Emma Gibbs", [312] = "Lucia Gobbo", [313] = "Jo Goodwin", [314] = "Sian Jones", [315] = "Kathy McEntee", [316] = "Louise Ratcliffe", [317] = " ", [318] = " ", [319] = " ", [320] = ":Company Management", [321] = ",", [322] = "Les Edgar", [323] = "Peter Molyneux", [324] = "David Byrne", [325] = " ", [326] = " ", [327] = ":All at Bullfrog Productions", [328] = " ", [329] = " ", [330] = " ", [331] = ":Special Thanks to", [332] = ",", [333] = "Everyone at Frimley Park Hospital", [334] = " ", [335] = ":Especially", [336] = ",", [337] = "Beverley Cannell", [338] = "Doug Carlisle", [339] = " ", [340] = " ", [341] = " ", [342] = ":Keep On Thinking", [343] = " ", [344] = " ", [345] = " ", [346] = " ", [347] = " ", [348] = " ", [349] = " ", [350] = " ", [351] = " ", [352] = " ", [353] = " ", [354] = " ", [355] = " ", [356] = " ", [357] = " ", [358] = " ", [359] = " ", [360] = " ", [361] = ".", } confirmation.maximum_screen_size = "Az általad beállított képernyőfelbontás magasabb mint 3000 X 2000. Van lehetőség ilyen felbontások beállítására, viszont ezekhez erősebb hardver szükségeltetik az akadozásmentes futtatáshoz. Biztosan folytatod?" confirmation.music_warning = "Mielőtt kiválaszthatnád az mp3-akat amelyek játék közben fognak szólni szükséged lesz az smpeg.dll nevű (vagy azzal egyenértékű) file-ra, különben nem lesz zene. Folytatod?" menu_options_wage_increase.deny = " MEGTAGAD" menu_options_wage_increase.grant = " ENGEDÉLYEZ" tooltip.options_window.audio_button = "Minden hang ki/be kapcsolása" tooltip.options_window.audio_toggle = "Ki vagy bekapcsol" tooltip.options_window.folder_button = "Könyvtár opciók" tooltip.options_window.customise_button = "További beállítások, hogy finomhangolhasd a játékélményt" tooltip.update_window.download = "Látogasd meg a letöltőoldalt, hogy megszerezhesd a CorsixTH legfrissebb verzióját" tooltip.update_window.ignore = "A frissítés kihagyása. Újra értesítést fogsz kapni róla, amikor legközelebb elindítod a CorsixTH-t" tooltip.folders_window.browse_font = "Válassz másik betűtípusfile-t ( jelenlegi hely: %1% )" tooltip.folders_window.screenshots_location = "Alaphelyzetben a kilopott képek a konfigurációs file-ok könyvtárába kerülnek. Amennyiben máshova szeretnéd menteni őket csak tallózd ki a számodra megfelelő célkönyvtárat." tooltip.folders_window.reset_to_default = "Elérési út alaphelyzetbe állítása" tooltip.folders_window.back = "Menü bezárása, és vissza a Beállításokhoz" tooltip.folders_window.music_location = "Válaszd ki az mp3 file-jaid elérési útját. A könyvtárt először létre kell hoznod, utána pedig ki kell választanod." tooltip.folders_window.font_location = "Szükség van egy olyan betűtípusfile elérési útjára, amely alkalmas a magyar nyelv betűit Unicode karakterek segítségével megjeleníteni. Amennyiben ezt elmulasztod nem leszel képes olyan nyelveket beállítani, amelyeknek szükségük van a játék eredeti nyelvében nem fellelhető karakterekre. Például: orosz és kínai" tooltip.folders_window.savegames_location = "Alaphelyzetben a játék mentéseit tartalmazó file-ok a konfigurációs file-ok könyvtárába kerülnek. Amennyiben máshova szeretnéd menteni őket csak tallózd ki a számodra megfelelő célkönyvtárat." tooltip.folders_window.browse_data = "Tallózd ki a Theme Hospital telepítési helyét (jelenlegi hely: %1%)" tooltip.folders_window.browse = "Tallózz elérési utat" tooltip.folders_window.browse_screenshots = "Válassz másik könyvtárat a kilopott képeidnek ( jelenlegi hely: %1% )" tooltip.folders_window.browse_music = "Válassz másik könyvtárat a zenéidnek ( jelenlegi hely: %1% )" tooltip.folders_window.no_font_specified = "Még nem adtál meg betűtípusfile elérési utat!" tooltip.folders_window.not_specified = "Még nem adtál meg könyvtár elérési utat!" tooltip.folders_window.browse_saves = "Válassz másik könyvtárat az elmentett játékállásaidnak ( jelenlegi hely: %1% )" tooltip.folders_window.default = "Alapértelmezett elérési út" tooltip.folders_window.data_location = "Az eredeti Theme Hospital telepítési helye (szükséges a CorsixTH futtatásához)" tooltip.customise_window.aliens = "Mivel nincsenek megfelelő animációink az idegen DNA-val rendelkező páciensek megjelenítésére, ezért ők csak vészhelyzetek esetén jelennek meg a kórházadban. Ha szeretnéd, hogy ne csak ilyen esetekben jöjjenek, akkor ezt kapcsold ki" tooltip.customise_window.average_contents = "Ha szeretnéd, hogy a játék megjegyezze milyen extra tárgyakkal szoktad a szobákat általában berendezni, akkor kapcsold be ezt" tooltip.customise_window.back = "Menü bezárása, és vissza a Beállításokhoz" tooltip.customise_window.movies = "Ezzel le tudod tiltani az összes átvezető videót" tooltip.customise_window.fractured_bones = "Mivel csak félkész animációink van a törött csontú női páciensek megjelenítésére, ezért ők nem jelennek meg a kórházadban. Ha mégis szeretnéd, hogy érkezzenek ilyen betegek is, akkor ezt kapcsold ki" tooltip.customise_window.volume = "Ha hangerő halkítása gomb használata megnyitja az esetleírásokat is, akkor ezt bekapcsolva átállíthatod az esetleírások gyorsbillentyű kombinációját Shift + C -re" tooltip.customise_window.intro = "A bevezető videó (intro) ki/be kapcsolása - az átvezető videóknak engedélyezve kell lenniük, ha szeretnéd ezt bekapcsolni" tooltip.customise_window.paused = "Az eredeti Theme Hospitalban a játékos csak a felső menüt használhatta ha a játék szüneteltetve volt. Ez az alapbeállítás a CorsixTH-ban is, de ha ezt bekapcsolod, akkor szüneteltetés alatt is elérsz minden menüt" update_window.caption = "Frissítés elérhető!" update_window.new_version = "Új verzió:" update_window.current_version = "Jelenlegi verzió:" update_window.download = "Ugrás a letöltőoldalra" update_window.ignore = "Kihagy és tovább a főmenühöz" errors.fractured_bones = "MEGJEGYZÉS: a törött csontú női páciens animációja nem tökéletes" errors.alien_dna = "MEGJEGYZÉS: nincsenek megfelelő animációink az idegen DNA-val rendelkező páciensek helyes megjelenítésére (például: leülés, ajtón kopogás, stb.), ezért amikor ezeket a cselekvéseket végzik olyankor átváltoznak normális kinézetűre, majd annak végeztével vissza. Az idegen DNA-val rendelkező páciensek csak akkor jelennek meg, ha a pálya file-jában ezt beállítottad" errors.load_quick_save = "Hiba történt: a gyorsmentés betöltése sikertelen volt, mivel nem állt rendelkezésre betölthető állás. Nincs ok az aggodalomra, ugyanis most létrehoztunk neked egyet!" folders_window.data_label = "TH adat" folders_window.music_location = "Válaszd ki a könyvtárat ahol a zenéidet tárolod" folders_window.music_label = "MP3-ak" folders_window.new_th_location = "Itt tudsz beállítani új Theme Hospital telepítési könyvtárat. Mihelyst kiválasztod a játék újra fog indulni." folders_window.caption = "Könyvtár elérési utak" folders_window.screenshots_label = "Kilopott képek" folders_window.font_label = "Betűtípus" folders_window.savegames_label = "Játékállások" folders_window.back = "Vissza" folders_window.savegames_location = "Válaszd ki a könyvtárat ahová a játékállásaid kerüljenek" folders_window.screenshots_location = "Válaszd ki a könyvtárat ahová a kilopott képeid kerüljenek" customise_window.average_contents = "Átlagos tartalmak" customise_window.option_on = "Be" customise_window.paused = "Építés szüneteltetés közben" customise_window.option_off = "Ki" customise_window.intro = "Bevezető videó lejátszása" customise_window.caption = "Egyéni beállítások" customise_window.back = "Vissza" customise_window.movies = "Általános átvezető videó vezérlő" customise_window.volume = "Halkítás gyorsbillentyű" customise_window.aliens = "Alien páciensek" customise_window.fractured_bones = "Törött Csontok" options_window.folder = "Könyvtárak" options_window.customise = "Személyre szab" options_window.audio = "Fő hangerő" menu_options.twentyfour_hour_clock = " 24 ÓRÁS MEGJELENÍTÉS" menu_options.wage_increase = " FIZETÉSIGÉNYEK" install.ok = "OK" install.cancel = "Mégse" adviser.research.drug_improved_1 = "A kutatórészleged feljavította a %s szer hatását." adviser.warnings.no_desk_7 = "Most hogy leraktál egy recepciós pultot mi lenne ha felvennél egy recepcióst is? Amíg ez meg nincs nem fogsz tudni páciensekkel foglalkozni!" adviser.warnings.researcher_needs_desk_1 = "A Kutatónak szüksége van egy íróasztalra aminél dolgozhatna." adviser.warnings.no_desk_6 = "Már van egy recepciósod. Mi lenne, ha leraknál neki egy recepciós pultot, ahol dolgozhatna?" adviser.warnings.nurse_needs_desk_1 = "Minden Nővérkének szüksége van egy saját íróasztalra, ahol dolgozhat." adviser.warnings.researcher_needs_desk_2 = "A kutatód boldog, hogy megengedted neki, hogy szünetet tartson. Ha a kutatórészleg személyzetének bővítését fontolgatod ne felejtsd el, hogy mindegyiknek szüksége lesz külön asztalra." adviser.warnings.no_desk_5 = "Éppen ideje volt már, hamarosan megérkeznek az első betegek!" adviser.warnings.no_desk_4 = "A recepciósnak szüksége van egy saját pultra, hogy üdvözölhesse az érkező betegeket" adviser.warnings.researcher_needs_desk_3 = "Minden Kutatónak szüksége van egy íróasztalra aminél dolgozhat." adviser.warnings.cannot_afford_2 = "Nincs elég pénzed a számládon ehhez a vásárláshoz!" adviser.warnings.nurse_needs_desk_2 = "A nővérke boldog, hogy megengedted neki, hogy szünetet tartson. Ha a kórtermeid személyzetének bővítését fontolgatod ne felejtsd el, hogy mindegyiknek szüksége lesz külön asztalra." CorsixTH-0.63/CorsixTH/Lua/languages/iberic_portuguese.lua000066400000000000000000001057201347163623700236020ustar00rootroot00000000000000--[[ Copyright (c) 2010 Manuel "Roujin" Wolf, "Fabiomsouto" Copyright (c) 2011 Sérgio "Get_It" Ribeiro Copyright (c) 2012 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. --]] Language(utf8 "Português", "Portuguese", "pt", "pt") Inherit("english") ------------------------------- OVERRIDE ---------------------------------- adviser.warnings.money_low = "Estás a ficar sem dinheiro!" -- Funny. Exists in German translation, but not existent in english? -- TODO: tooltip.graphs.reputation -- this tooltip talks about hospital value. Actually it should say reputation. -- TODO: tooltip.status.close -- it's called status window, not overview window. -- The originals of these two contain one space too much fax.emergency.cure_not_possible_build = "Vais precisar de construir %s" fax.emergency.cure_not_possible_build_and_employ = "Vais precisar de construir um %s e empregar um %s" -- Improve tooltips in staff window to mention hidden features tooltip.staff_window.face = "A cara desta pessoa - clique para abrir o ecrã de gestão de pessoal" tooltip.staff_window.center_view = "Clique esquerdo para ir para onde está a pessoa, clique direito para navegador através dos funcionários" -- These strings are missing in some versions of TH (unpatched?) confirmation.restart_level = "Tem a certeza que deseja reiniciar este nível?" ------------------------------- NEW STRINGS ------------------------------- confirmation.maximum_screen_size = "A resolução de ecrã que escolheu é maior que 3000 x 2000. Resoluções mais altas são possíveis, mas requerem melhor hardware de forma a manter uma taxa de fotogramas (FPS) jogável. De certeza que deseja continuar?" confirmation.music_warning = "Antes de escolher usar mp3 para a música dentro do jogo, necessita de ter o smpeg.dll ou equivalente para o seu sistema operativo, caso contrário, não terá música no jogo. Deseja continuar?" menu_options_wage_increase.deny = " NEGAR " menu_options_wage_increase.grant = " PERMITIR " tooltip.options_window.audio_button = "Ligar ou desligar todo o som do jogo" tooltip.options_window.audio_toggle = "Ligar ou desligar" tooltip.options_window.folder_button = "Opções de pastas" tooltip.options_window.customise_button = "Mais opões que pode alterar para personalizar a sua experiência de jogo." tooltip.update_window.download = "Vá para a página de transferências para a última versão de CorsixTH" tooltip.update_window.ignore = "Ignorar esta actualização agora. Será notificado de novo na próxima vez que inicializar CorsixTH" tooltip.folders_window.browse_font = "Procurar outro tipo de letra (localização actual: %1% )" tooltip.folders_window.screenshots_location = "Por defeito, as capturas de ecrã são armazenadas numa pasta junto do ficheiro de configuração. Caso isto não seja apropriado, pode escolher a sua própria, simplesmente indique qual a pasta que deseja utilizar." tooltip.folders_window.reset_to_default = "Reinicializar a directoria para a localização por defeito" tooltip.folders_window.back = "Fechar este menu e voltar às definições." tooltip.folders_window.music_location = "Escolha a localização dos seus ficheiros mp3. A pasta já deve ter sido criada, e agora escolha o directório que acabou de criar." tooltip.folders_window.font_location = "Localização de um tipo de letra capaz de mostrar caracteres Unicode requeridos pela sua língua. Se isto não for especificado, não será capaz de escolher línguas que necessitam de mais caracteres que o jogo original consegue fornecer. Exemplo: Russo e Chinês." tooltip.folders_window.savegames_location = "Por defeito, os jogos gravados são armazenados numa pasta junto do ficheiro de configuração. Caso isto não seja apropriado, pode escolher a sua própria, simplesmente indique qual a pasta que deseja utilizar." tooltip.folders_window.browse_data = "Escolha outra localização da instalação do Theme Hospital (localização actual: %1% )" tooltip.folders_window.browse = "Escolha a localização da pasta" tooltip.folders_window.browse_screenshots = "Escolha outra localização para a pasta das capturas de ecrã (Localização actual: %1%) " tooltip.folders_window.browse_music = "Escolha outra localização para a pasta da música (Localização actual: %1%) " tooltip.folders_window.no_font_specified = "Nenhum tipo de letra especificado!" tooltip.folders_window.not_specified = "Nenhuma pasta especificada!" tooltip.folders_window.browse_saves = "Escolha outra localização para a pasta dos jogos gravados (Localização actual: %1%) " tooltip.folders_window.default = "Localização por defeito" tooltip.folders_window.data_location = "O directório da instalação do Theme Hospital original, que é necessário para correr o CorsixTH" tooltip.customise_window.aliens = "Devido à falta de animações apropriadas, colocamos por defeito que pacientes com ADN Extraterrestre só possam surgir numa emergência. Para permitir que estes pacientes possam visitar o hospital de outra forma, desligue esta opção." tooltip.customise_window.average_contents = "Se quer que o jogo lhe lembre que objectos adicionais costuma adicionar quando cria uma sala, ligue esta opção." tooltip.customise_window.back = "Fechar este menu e voltar às definições." tooltip.customise_window.movies = "Controle geral de vídeos, isto irá permitir desligar todos os vídeos" tooltip.customise_window.fractured_bones = "Devido a uma má animação colocamos por defeito que não existem pacientes femininas com Ossos Partidos. De forma a permitir que pacientes femininas com Ossos Partidos visitem o hospital, desligue esta opção." tooltip.customise_window.volume = "Se o botão para baixar o volume está a abrir também o livro médico, ligue esta opção para mudar o atalho para o livro médico para Shift + C" tooltip.customise_window.intro = "Ligar ou desligar o vídeo de introdução, o controle geral de vídeos tem que estar ligado se quer ver a introdução cada vez que começa o CorsixTH" tooltip.customise_window.paused = "No Theme Hospital o jogador apenas podia utilizar o menu de topo se o jogo estivesse pausado. Esta é também a opção por defeito no CorsixTH, mas ao activar esta opção, tudo é permitido com o jogo pausado." update_window.caption = "Actualização Disponível!" update_window.new_version = "Nova Versão:" update_window.current_version = "Versão Actual:" update_window.download = "Ir à página de transferências" update_window.ignore = "Saltar e ir para o menu principal" errors.fractured_bones = "AVISO: A animação para pacientes femininas com Ossos Partidos não é perfeita." errors.alien_dna = "AVISO: Não existem animação para pacientes Extraterrestres a sentarem-se, abrir ou bater em portas, etc. Então, como no Theme Hospital, para executarem estas animações eles ficam com um aspecto normal, e depois voltam ao aspecto original. Pacientes com ADN Extraterrestre só irão aparecer se estiver previsto no nível." errors.load_quick_save = "Erro, não foi possível carregar o quick save já que não existe. Nada de preocupações, já que criamos agora um para si!" folders_window.data_label = "Dados TH" folders_window.music_location = "Escolha a directoria que usar para a sua música" folders_window.music_label = "MP3's" folders_window.new_th_location = "Aqui pode especificar uma nova pasta de instalação do Theme Hospital. Assim que escolher a nova directoria, o jogo irá reiniciar." folders_window.caption = "Localizações de pastas" folders_window.screenshots_label = "Capturas de ecrã" folders_window.font_label = "Tipos de letra" folders_window.savegames_label = "Jogos gravados" folders_window.back = "Retroceder" folders_window.savegames_location = "Escolha a directoria que usar para jogos gravados" folders_window.screenshots_location = "Escolha a directoria que usar para capturas de ecrã" customise_window.average_contents = "Itens comuns" customise_window.option_on = "Ligado" customise_window.paused = "Construir com o jogo pausado" customise_window.option_off = "Desligado" customise_window.intro = "Reproduzir vídeo de introdução" customise_window.caption = "Definições Personalizadas" customise_window.back = "Retroceder" customise_window.movies = "Controle Geral de Vídeos" customise_window.volume = "Atalho para baixar o volume" customise_window.aliens = "Pacientes Extraterrestres" customise_window.fractured_bones = "Ossos Partidos" options_window.folder = "Pastas" options_window.customise = "Personalizar" options_window.audio = "Som Geral" menu_options.twentyfour_hour_clock = " RELÓGIO DE 24 HORAS " menu_options.wage_increase = " EXIGÊNCIAS SALARIAIS" install.ok = "OK" install.cancel = "Cancelar" adviser.research.drug_improved_1 = "A droga para %s foi melhorada pelo Departamento de Pesquisa" adviser.warnings.no_desk_7 = "Já construiu o balcão de atendimento, então que tal contratar uma recepcionista? Não irá atender clientes até que resolva isto!" adviser.warnings.researcher_needs_desk_1 = "Um Investigador precisa de ter uma secretária onde trabalhar." adviser.warnings.no_desk_6 = "Já tem a recepcionista, então que tal construir uma balcão de atendimento para ela trabalhar?" adviser.warnings.nurse_needs_desk_1 = "Cada Enfermeira necessita de uma secretária onde trabalhar." adviser.warnings.researcher_needs_desk_2 = "O seu Investigador está satisfeito que o tenha deixado descansar um pouco. Se quer ter mais pessoal a fazer pesquisa, então precisa de dar uma secretária a cada um deles." adviser.warnings.no_desk_5 = "Está na hora, devem estar a chegar pacientes a qualquer momento!" adviser.warnings.no_desk_4 = "Uma recepcionista precisa de ter o seu posto de trabalho para atender os pacientes assim que chegam." adviser.warnings.researcher_needs_desk_3 = "Cada Investigador necessita de uma secretária onde trabalhar." adviser.warnings.cannot_afford_2 = "Não tem dinheiro suficiente no banco para fazer essa compra!" adviser.warnings.nurse_needs_desk_2 = "A sua Enfermeira está satisfeita que a tenha deixado descansar um pouco. Se quer ter mais que uma a trabalhar na enfermaria, então precisa de dar uma secretária a cada uma delas." object.litter = "Lixo" tooltip.objects.litter = "Lixo: Deitado fora por um paciente porque não encontrou um caixote do lixo onde o colocar." menu_options.lock_windows = " BLOQUEAR JANELAS " menu_options_game_speed.pause = " (%1%) PAUSA " menu_debug = { transparent_walls = " (%1%) PAREDES TRANSPARENTES ", limit_camera = " LIMITAR CAMARA ", disable_salary_raise = " DESACTIVAR AUMENTO DOS SALÁRIOS ", make_debug_patient = " MAKE DEBUG PATIENT ", spawn_patient = " GERAR PACIENTE ", make_adviser_talk = " MAKE ADVISER TALK ", show_watch = " MOSTRAR RELÓGIO ", create_emergency = " CRIAR EMERGENCIA ", place_objects = " COLOCAR OBJECTOS ", dump_strings = " (%1%) DUMP DAS STRINGS ", map_overlay = " OVERLAY DO MAPA ", sprite_viewer = " VISUALIZAR SPRITES ", } menu_debug_overlay = { none = " NENHUM ", flags = " FLAGS ", positions = " POSIÇOES ", byte_0_1 = " BYTE 0 & 1 ", byte_floor = " BYTE FLOOR ", byte_n_wall = " BYTE N WALL ", byte_w_wall = " BYTE W WALL ", byte_5 = " BYTE 5 ", byte_6 = " BYTE 6 ", byte_7 = " BYTE 7 ", parcel = " PARCEL ", } adviser.room_forbidden_non_reachable_parts = "Colocar o espaço neste sítio bloquearia o acesso a zonas do hospital." dynamic_info.patient.actions.no_gp_available = "À espera que seja construidos um consultório de CG." dynamic_info.staff.actions.heading_for = "Indo para %s" misc.not_yet_implemented = "(not yet implemented)" misc.no_heliport = "Hm... Ou não foram desocbertas novas doenças ou não existe um heliporto neste mapa." main_menu = { new_game = "Novo jogo", custom_level = "Nível Personalizado", load_game = "Carregar Jogo", options = "Opçoes", exit = "Sair", } tooltip.main_menu = { new_game = "Começar um jogo de raíz", custom_level = "Construir o meu hospital", load_game = "Carregar um jogo", options = "Ajustar preferencias", exit = "Nao, por favor, nao saias!", } load_game_window = { back = "Voltar", } tooltip.load_game_window = { load_game_number = "Carregar o jogo %d", load_autosave = "Carregar o jogo gravado automaticamente", back = "Fechar a janela de carregamento", } errors = { dialog_missing_graphics = "Desculpa, mas a versão de demonstração não tem este diálogo!", save_prefix = "Erro durante a gravação do jogo: ", load_prefix = "Erro durante o carregamento do jogos: ", } totd_window = { tips = { "Todos os hospitais precisam de uma recepção e de um consultório de CG para começar. Depois disso, depende do tipo de pacientes que recebes. Uma farmácia é sempre uma boa escolha, no entanto.", "Máquinas como a Bomba de Encher Cabeças precisam de manutenção. Contrata um ou dois funcionários para reparar as tuas máquinas, ou arriscas-te a que o pessoal ou os pacientes se aleijem quando elas avariarem.", "Após algum tempo, o teu pessoal vai ficar cansado. Constrói um Quarto do Pessoal, para que eles possam relaxar.", "Coloca radiadores em quantidade suficiente para que o teu pessoal e pacientes estejam quentinhos... caso contrário irao ficar aborrecidos!", "O nível de perícia de um médico influencia a qualidade e velocidade do seu diagnóstico. Coloca um médico com perícia nas salas de CGs, e não precisarás de tantas salas de diagnóstico.", "Médicos júniores e regulares podem aumentar a sua perícia se aprenderem com um consultante numa Sala de Treino. Se o consultante for especialista (cirurgiao, psiquiatra ou investigador), também ensinará a sua especialização aos seus pupilos.", "Já tentaste escrever o número de emergência (112) no fax? Não te esqueças de ligar as colunas!", "O menu de opçoes ainda não está implementado, mas podes ajustar algumas preferencias tais como resoluçao e língua no ficheiro config.txt na pasta do jogo.", "Seleccionaste outra linguagem além do Ingles, mas ves Ingles em todo o lado? Ajuda-nos a traduzir esse texto!", "A equipa do CorsixTH está à procura de reforços! Estás interessado em programar, traduzir ou criar arte gráfica para o CorsixTH? Contacta-nos no fórum, IRC (corsix-th no freenode) ou via Mailing List.", "Se encontrares um bug, diz-nos em: th-issues.corsix.org", "Tens que cumprir certos requisitos para poder avançar de nível. Consulta a tua janela de status para veres o progresso em relaçao aos objectivos do nível.", -- dicas juntas "Se quiseres alterar ou remover alguma sala existente,utiliza o botao editar na barra de ferramentas em baixo no teu ecra.", "Se tiveres muitos pacientes na fila de espera, podes saber rapidamente quais estao à espera de uma determinada sala passando com o cursor por cima desta.", "Clica numa porta para ver a lista de espera.Podes alterar a ordem dos pacientes ou mandá-los para outra sala.", "Staffs descontentes irao pedir aumentos de salário frequentemente , assegura que tens um bom ambiente de trabalho para isto não acontecer!", "Os pacientes ficarao com sede enquanto esperam no hospital,ainda mais se os radiadores estiverem muito quentes.Coloca máquinas de bebidas em locais estratégicos para ganhares mais uns trocos.", "Podes abortar o processo de diagnóstico para um paciente e tentar adivinhar a cura caso já tenhas descoberto a doença. Cuidado que este processo pode aumentar o risco de uma cura errada levando à morte do paciente.", "Emergencias sao uma boa forma de ganhar algum dinheiro extra,garante que o teu hospital tem condiçoes para as completar.", }, previous = "Dica anterior", next = "Próxima dica", } tooltip.totd_window = { previous = "Mostrar dica anterior", next = "Mostrar a próxima dica", } debug_patient_window.caption = "Debug Paciente" totd_window = { tips = { "Tens que cumprir certos requisitos para poder avançar de nível. Consulta a tua janela de status para veres o progresso em relaçao aos objectivos do nível.", "Se quiseres alterar ou remover alguma sala existente,utiliza o botao editar na barra de ferramentas em baixo no teu ecra.", "Se tiveres muitos pacientes na fila de espera, podes saber rapidamente quais estao à espera de uma determinada sala passando com o cursor por cima desta.", "Clica numa porta para ver a lista de espera.Podes alterar a ordem dos pacientes ou mandá-los para outra sala.", "Staffs descontentes irao pedir aumentos de salário frequentemente , assegura que tens um bom ambiente de trabalho para isto não acontecer!", "Os pacientes ficarao com sede enquanto esperam no hospital,ainda mais se os radiadores estiverem muito quentes.Coloca máquinas de bebidas em locais estratégicos para ganhares mais uns trocos.", "Podes abortar o processo de diagnóstico para um paciente e tentar adivinhar a cura caso já tenhas descoberto a doença. Cuidado que este processo pode aumentar o risco de uma cura errada levando à morte do paciente.", "Emergencias sao uma boa forma de ganhar algum dinheiro extra,garante que o teu hospital tem condiçoes para as completar.", }, } tooltip.casebook.cure_requirement.hire_staff = "Precisas de contratar alguém para fazer este tratamento." tooltip.casebook.cure_type.unknown = "Ainda não sabes tratar esta doença." tooltip.information.close = "Fecha o diálogo de informação" tooltip.load_game_window.load_game = "Ler jogo: %s" tooltip = { message = { button = "Clica com o botão esquerdo para abrir a mensagem.", button_dismiss = "Click esquerdo para abrir a mensagem,click direito para apagar", }, custom_game_window = { start_game_with_name = "Ir para o nível %s", }, cheats_window = { close = "Fecha a janela dos truques", cheats = { end_month = "Salta para o final do mês.", create_patient = "Cria um paciente no mapa.", money = "Adiciona 10000 à tua conta bancária", emergency = "Cria uma emergência", win_level = "Vence o nível.", lose_level = "Perde o nível.", vip = "Cria um VIP.", all_research = "Completa toda a pesquisa.", end_year = "Salta para o final do ano.", }, }, menu_list_window = { save_date = "Coloca a lista por data de modificação.", name = "Coloca a lista por nome.", back = "Fecha esta janela.", }, new_game_window = { hard = "Se estás habituado a este tipo de jogos e procuras um desafio escolhe esta opçao.", cancel = "Oh mas eu não queria começar um jogo de novo!", tutorial = "Se precisas de umas dicas para começar a jogar,marca esta caixa.", easy = "Se és novo em jogos de simulaçoes,esta é a opçao para ti.", medium = "Se já te sentes à vontade tenta a opção média!", }, save_game_window = { new_save_game = "Nome para salvar o jogo.", save_game = "Gravar por cima da gravação? %s", }, calls_dispatcher = { assigned = "Esta caixa estrá marcada, se alguém esttiver a tratar da tarefa correspondente.", task = "Lista de tarefas - Clica em tarefas para abrir as tarefas atribuídas ao staff e encontrares a localização de determinada tarefa.", close = "Fecha a janela de diálogo do expedidor de chamadas.", }, research_policy = { research_progress = "Progresso em relação à próxima descoberta: %1%/%2%", no_research = "Não está a ser feita nenhuma pesquisa de momento.", }, lua_console = { textbox = "Coloca aqui o código Lua para executar", execute_code = "Executa o código colocado.", close = "Fecha a consola.", }, fax = { close = "Fecha esta janela sem apagar a mensagem.", }, options_window = { fullscreen_button = "Clica para modo de tela cheia", original_path = "A directoria da instalaçao original de Theme Hospital", browse = "Procura outra localizaçao da instalaçao original. %1%", change_resolution = "Altera a resoluçao da janela para as dimensoes colocadas à esquerda", height = "Coloca a altura desejada.", width = "Coloca a largura desejada.", language = "Escolhe %s como a tua linguagem.", back = "Fecha a janela de opçoes.", }, } custom_game_window.caption = "Jogo Customizado" cheats_window = { cheats = { end_month = "Fim do Mês", create_patient = "Criar Paciente", money = "Truque para Dinheiro", emergency = "Criar emergência", win_level = "Vencer nível", lose_level = "Perder nível", vip = "Criar VIP", all_research = "Pesquisa Completa", end_year = "Fim do Ano", }, close = "Fechar", caption = "Truques", cheated = { no = "Truques usados?: Nao", yes = "Truques usados?: Sim", }, warning = "Aviso:Se utilizares truques não irás ganhar pontos de reputação no final do nível!", } errors = { unavailable_screen_size = "Esta resolução não está disponível no modo de tela cheia.", maximum_screen_size = "Resolução máxima de 3000x2000.", map_file_missing = "Não foi encontrado o ficheiro do mapa %s para este nível!", minimum_screen_size = "Resolução mínima de 640x480.", } date_format.daymonth = "%1% - %2% -" menu_debug = { lua_console = " (%1%) CONSOLA LUA", make_debug_fax = " DEBUG FAX", calls_dispatcher = " CHAMAR EXPEDIDOR", cheats = " (%1%) TRUQUES", dump_gamelog = " (%1%) CRIAR LOG DO JOGO", jump_to_level = " SALTAR PARA OUTRO NIVEL", } menu_options = { edge_scrolling = " EDGE SCROLLING ", settings = " PREFERENCIAS ", } lua_console = { execute_code = "Executar", close = "Fechar", } install= { exit = "Sair", th_directory = "CorsixTH precisa dos ficheiros de dados da instalação original de Theme Hospital(ou demo) para funcionar. Localize a sua instalação atráves da caixa em baixo.", title = "--------------------------------- Instalação CorsixTH ---------------------------------", } load_game_window.caption = "Ler Jogo" adviser = { cheats = { th_cheat = "Parabéns batoteiro! Acabaste de desbloquear os truques!", hairyitis_cheat = "Activado cheat da doença Olfatis", roujin_on_cheat = "Activado o desafio Roujin! Boa sorte...", crazy_on_cheat = "Oh não! Os teus médicos estão malucos!", bloaty_off_cheat = "Desactivado truque das Cabeças Gigantes!", bloaty_cheat = "Activado truque das Cabeças Gigantes!", crazy_off_cheat = "Ufa... os teus médicos voltaram ao normal.", roujin_off_cheat = "Desafio Roujin desactivado.", hairyitis_off_cheat = "Desactivado truque da doença Olfatis", }, warnings = { no_desk_2 = "Bom trabalho! Deve ser um recorde mundial: quase um ano completo e não há pacientes! Se desejas continuar a gerir este hospital tens que contratar uma recepcionista e construir uma recepção para receberes os pacientes!", no_desk = "Constrói uma recepçao e uma recepcionista para começar!", no_desk_1 = "Se queres que os pacientes venham ao teu hospital vais precisar de uma recepçao e uma recepcionista!", }, } calls_dispatcher = { repair = "Reparar %s", summary = "%d Chamadas; %d atribuídas", close = "Fechar", watering = "Regar @ %d,%d", staff = "%s - %s ", } information = { level_lost = { "Que chatice! Perdeste. Mais sorte para a próxima!", "Razões da derrota:", reputation = "A tua reputação ficou abaixo de %d.", balance = "A tua conta bancària ficou abaixo de %d.", percentage_killed = "Mataste mais do que %d por cento dos pacientes.", }, cannot_restart = "Infelizmente este jogo customizado foi gravado antes da implementação da função de reinício.", custom_game = "Bem-vindo ao CorsixTH. Diverte-te neste mapa customizado!", } new_game_window = { hard = "Consultor (Difícil)", cancel = "Cancelar", tutorial = "Tutorial ", easy = "Junior (Fácil)", medium = "Doutor (Médio)", } options_window = { fullscreen = "Tela cheia", cancel = "Cancelar", browse = "Procurar...", width = "Largura", height = "Altura", new_th_directory = "Aqui podes escolher uma nova localizaçao da instalaçao de Theme Hospital,assim que o fizeres o jogo será reiniciado.", change_resolution = "Alterar resoluçao", back = "Voltar", } menu_list_window = { save_date = "Modificado", name = "Nome", back = "Voltar", } save_game_window = { caption = "Gravar jogo", new_save_game = "Nova gravaçao", } fax.emergency.num_disease_singular = "Existe uma pessoa com %s e necessita de atenção imediata!" fax.choices = { decline_new_level = "Continuar a jogar", accept_new_level = "Avançar para o nível seguinte", return_to_main_menu = "Voltar para o menu principal", } menu_debug_overlay.heat = " TEMPERATURA " confirmation.abort_edit_room = "Estás a construir ou a editar uma sala. Se todos os objectos necessários estiverem colocados a sala estará terminada, caso contrário será eliminada. Continuar?" confirmation.needs_restart = "Estas alterações requerem que reinicies o jogo,O progresso não gravado será perdido. Desejas continuar?" dynamic_info.staff.actions.fired = "Despedido" introduction_texts.demo = "Bem-vindo ao hospital do demo!//" .. "Infelizmente este demo só tem este nível.Contudo existe aqui muito trabalho para te manter ocupado! " .. "Encontrarás várias doenças que requerem salas diferentes para os seus tratamentos.Ao longo do tempo " .. "irão ocorrer algumas emergências e precisarás de descobrir novos tratamentos atráves da sala de pesquisa. " .. "O teu objectivo é ganhar 100,000$,ter um hospital avaliado em 70,000$,uma reputação de 700 e uma cura de 75% dos pacientes. " .. "Garante que a tua reputação não cai abaixo de 300 e que não mates 40% dos teus pacientes senão perderás o nível.//" .. "Boa sorte!" letter = { custom_level_completed = "Bom trabalho!Completaste todos os objectivos deste nível!", dear_player = "Caro %s", return_to_main_menu = "Desejas regressar ao menu principal ou continuar a jogar?", } staff_class = { nurse = "Enfermeira", doctor = "Doutor", handyman = "Contínuo", receptionist = "Recepcionista", surgeon = "Cirurgião", } -- Staff titles -- these are titles used e.g. in the dynamic info bar staff_title = { receptionist = "Recepcionista", general = "General", -- unused? nurse = "Enfermeira", junior = "Junior", doctor = "Doutor", surgeon = "Cirurgião", psychiatrist = "Psiquiatra", consultant = "Consultor", researcher = "Pesquisador", } staff_list = { morale = "MORAL", tiredness = "CANSAÇO", skill = "QUALIFICAÇOES", total_wages = "SALÁRIO", } -- Objects object = { desk = "Secretária", cabinet = "Arquivador", door = "Porta", bench = "Banco", table1 = "Mesa", -- unused object chair = "Cadeira", drinks_machine = "Máquina de Bebidas", bed = "Cama", inflator = "Inflador", pool_table = "Mesa de Bilhar", reception_desk = "Recepçao", table2 = "Mesa", -- unused object & duplicate cardio = "Cardio", scanner = "Scanner", console = "Consola", screen = "Ecra", litter_bomb = "Bomba de lixo", couch = "Sofá", sofa = "Sofá", crash_trolley = "Trolley", tv = "TV", ultrascanner = "Ultrascanner", dna_fixer = "Fixador de DNA", cast_remover = "Removedor de Gesso", hair_restorer = "Recuperador de Cabelo", slicer = "Fatiador", x_ray = "Raio-X", radiation_shield = "Escudo de Radiaçao", x_ray_viewer = "Visualizador de Radiação", operating_table = "Mesa de Operação", lamp = "Lampâda", -- unused object toilet_sink = "Pia", op_sink1 = "Pia", op_sink2 = "Pia", surgeon_screen = "Ecra de Operaçao", lecture_chair = "Cadeira de aluno", projector = "Projector", bed2 = "Cama", -- unused duplicate pharmacy_cabinet = "Gabinete de Farmácia", computer = "Computador", atom_analyser = "Analisador de Átomos", blood_machine = "Máquina de Análise Sanguínea", fire_extinguisher = "Extintor", radiator = "Radiador", plant = "Planta", electrolyser = "Electrolisador", jelly_moulder = "Moldador gelatinoso", gates_of_hell = "Portões do Inferno", bed3 = "Cama", -- unused duplicate bin = "Balde do lixo", toilet = "WC", swing_door1 = "Porta", swing_door2 = "Porta", shower = "Chuveiro", auto_autopsy = "Auto-Autópsia", bookcase = "Estante", video_game = "Máquina de Arcade", entrance_left = "Entrada esquerda", entrance_right = "Entrada direita", skeleton = "Esqueleto", comfortable_chair = "Cadeira de conforto", } -- Months months = { "Jan", "Fev", "Mar", "Abr", "Mai", "Jun", "Jul", "Ago", "Set", "Out", "Nov", "Dez", } -- Rooms short -- NB: includes some special "rooms" -- reception, destroyed room and "corridor objects" rooms_short = { reception = "Recepçao", destroyed = "Destruído", corridor_objects = "Objectos de Corredor", gps_office = "Consultório Geral", psychiatric = "Psiquiatria", ward = "Enfermaria", operating_theatre = "Sala de Operações", pharmacy = "Farmácia", cardiogram = "Cardio", scanner = "Scanner", ultrascan = "Ultrascanner", blood_machine = "Sala de Análises Sanguíneas", x_ray = "Raio-X", inflation = "Inflador", dna_fixer = "Fixador de DNA", hair_restoration = "Recuperador de Cabelo", tongue_clinic = "Fatiador", fracture_clinic = "Clínica de Fracturas", training_room = "Sala de Aprendizagem", electrolysis = "Sala de Electrolisador", jelly_vat = "Moldador Gelatinoso", staffroom = "Sala do Pessoal", -- rehabilitation = "Reabilitação", -- unused general_diag = "Diagnóstico Geral", research_room = "Sala de Pesquisa", toilets = "Casas de Banho", decontamination = "Descontaminação", } -- Menu Options Game Speed menu_options_game_speed = { slowest = " (%1%) MUITO LENTO ", slower = " (%1%) LENTO ", normal = " (%1%) NORMAL ", max_speed = " (%1%) RAPIDO ", and_then_some_more = " (%1%) AINDA MAIS RAPIDO ", } -- Menu Display menu_display = { high_res = " ALTA RESOLUÇAO ", mcga_lo_res = " BAIXA RESOLUCAO ", shadows = " SOMBRAS ", } -- Menu Charts menu_charts = { statement = " (%1%) INDICACOES ", casebook = " (%1%) PONTUARIO DE DOENÇAS ", policy = " (%1%) POLITICAS DO HOSPITAL ", research = " (%1%) PESQUISA ", graphs = " (%1%) GRAFICOS ", staff_listing = " (%1%) LISTA DO STAFF ", bank_manager = " (%1%) CONTA BANCARIA ", status = " (%1%) STATUS ", briefing = " BRIEFING ", } menu = { file = " FICHEIRO ", options = " OPÇOES ", display = " DISPLAY", charts = " TABELAS ", debug = " DEBUG ", } -- Menu File menu_file = { load = " (%1%) LER JOGO ", save = " (%1%) SALVAR JOGO ", restart = " (%1%) REINICIAR ", quit = " (%1%) SAIR ", } -- Menu Options menu_options = { sound = " (%1%) SOM ", announcements = " (%1%) ANUNCIOS ", music = " (%1%) MUSICA ", sound_vol = " VOLUME DOS SONS ", announcements_vol = " SOM DOS ANUNCIOS ", music_vol = " VOLUME DA MUSICA ", autosave = " AUTOSAVE ", game_speed = " VELOCIDADE DO JOGO ", jukebox = " (%1%) JUKEBOX ", } -- Menu Options Volume menu_options_volume = { [10] = " 10% ", [20] = " 20% ", [30] = " 30% ", [40] = " 40% ", [50] = " 50% ", [60] = " 60% ", [70] = " 70% ", [80] = " 80% ", [90] = " 90% ", [100] = " 100% ", } confirmation = { abort_edit_room = "Estás a construir ou a editar uma sala. Se todos os objectos necessários estiverem colocados a sala estará terminada, caso contrário será eliminada. Continuar?", return_to_blueprint = "Tens a certeza que desejas voltar ao modo de desenho?", restart_level = "Tens a certeza que queres reiniciar o nível?", delete_room = "Desejas apagar esta sala?", quit = "Queres mesmo sair do jogo?", needs_restart = "Estas alterações requerem que reinicies o jogo,O progresso não gravado será perdido. Desejas continuar?", overwrite_save = "Já existe uma gravação nesta slot.Desejas gravar por cima?", sack_staff = "Queres mesmo despedir este membro do staff?", replace_machine = "Queres mesmo repor %s por $%d?", } vip_names = { [1] = "Presidente da Cruz Vermelha", [2] = "Ricardo Araújo Pereira", [3] = "D. Duarte Pio de Bragança", [4] = "Joe Berardo", [5] = "José Mourinho", [6] = "Alberto João Jardim", [7] = "Marcelo Rebelo de Sousa", [8] = "Cavaco Silva", [9] = "Cristiano Ronaldo", [10] = "Tradutor Filipe Carvalho", health_minister = "Ministro da Saúde", } -- Rooms room_classes = { -- S[19][2] -- "corridors" - unused for now diagnosis = "Diagnóstico", treatment = "Tratamento", clinics = "Clínicas", facilities = "Acomodaçoes", } CorsixTH-0.63/CorsixTH/Lua/languages/italian.lua000066400000000000000000001103011347163623700214730ustar00rootroot00000000000000--[[ Copyright (c) 2010 Manuel "Roujin" Wolf 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. --]] Language("Italiano", "Italian", "it", "ita") Inherit("english") Inherit("original_strings", 3) Encoding(utf8) -- override -- TODO? Any more original strings that are off in italian translation? adviser.warnings.money_low = "Stai finendo i soldi!" -- TODO: tooltip.graphs.reputation -- this tooltip talks about hospital value. Actually it should say reputation. -- TODO: tooltip.status.close -- it's called status window, not overview window. -- The originals of these two contain one space too much fax.emergency.cure_not_possible_build = "E' necessario costruire un %s" fax.emergency.cure_not_possible_build_and_employ = "E' necessario costruire un %s e assumere un %s" -- An override for the squits becoming the the squits see issue 1646 adviser.research.drug_improved_1 = "Il medicinale per %s è stato migliorato dal Reparto Ricerca." ------------------------------- NEW STRINGS ------------------------------- date_format = { daymonth = "%1% %2:months%", } object.litter = "Spazzatura" tooltip.objects.litter = "Spazzatura: Lasciata sul pavimento da un paziente perché non ha trovato un cestino in cui gettarla." object.rathole = "Tana di ratti" tooltip.objects.rathole = "La casa di una famiglia di ratti che trova l'ospedale abbastanza sporco da poterci vivere." tooltip.fax.close = "Chiudi questa finestra senza cancellare il messaggio" tooltip.message.button = "Click sinistro per aprire il messaggio" tooltip.message.button_dismiss = "Click sinistro per aprire il messaggio, click destro per eliminarlo" tooltip.casebook.cure_requirement.hire_staff = "Hai bisogno di assumere personale per somministrare questa cura" tooltip.casebook.cure_type.unknown = "Ancora non sei a conoscenza di un modo per curare questa malattia" tooltip.research_policy.no_research = "Non c'è nessuna ricerca in corso in questa categoria al momento" tooltip.research_policy.research_progress = "Progresso verso una nuova scoperta in questa categoria: %1%/%2%" menu["player_count"] = "CONTA GIOCATORI" menu_file = { load = " (%1%) CARICA ", save = " (%1%) SALVA ", restart = " (%1%) RIAVVIA", quit = " (%1%) ESCI " } menu_options = { sound = " (%1%) SONORO ", announcements = " (%1%) ANNUNCI ", music = " (%1%) MUSICA ", jukebox = " (%1%) JUKEBOX ", lock_windows = " BLOCCA FINESTRE ", edge_scrolling = " SCORRIMENTO AI LATI ", capture_mouse = " INTRAPPOLA MOUSE ", adviser_disabled = " (%1%) CONSIGLIERE ", warmth_colors = " COLORI RISCALDAMENTO ", wage_increase = " RICHIESTE STIPENDI", twentyfour_hour_clock = " OROLOGIO 24 ORE " } menu_options_game_speed = { pause = " (%1%) PAUSA ", slowest = " (%1%) LENTISSIMO ", slower = " (%1%) LENTO ", normal = " (%1%) NORMALE ", max_speed = " (%1%) VELOCITA' MASSIMA ", and_then_some_more = " (%1%) E ANCORA DI PIU' ", } menu_options_warmth_colors = { choice_1 = " ROSSO ", choice_2 = " BLU VERDE ROSSO ", choice_3 = " GIALLO ARANCIONE ROSSO ", } menu_options_wage_increase = { grant = " CONCEDI ", deny = " NEGA ", } -- Add F-keys to entries in charts menu (except briefing), also town_map was added. menu_charts = { bank_manager = " (%1%) BANCA ", statement = " (%1%) RENDICONTO ", staff_listing = " (%1%) PERSONALE ", town_map = " (%1%) MAPPA CITTADINA ", casebook = " (%1%) REGISTRO CURE ", research = " (%1%) RICERCA ", status = " (%1%) RIEPILOGO ", graphs = " (%1%) GRAFICI ", policy = " (%1%) GESTIONE ", } -- The demo does not contain this string menu_file.restart = " RIAVVIA " menu_debug = { jump_to_level = " SALTA AL LIVELLO ", connect_debugger = " (%1%) CONNETTI SERVER LUA DBGp ", transparent_walls = " (%1%) MURA TRASPARENTI ", limit_camera = " LIMITA TELECAMERA ", disable_salary_raise = " DISABILITA AUMENTI DI SALARIO ", make_debug_fax = " CREA FAX DI DEBUG ", make_debug_patient = " CREA UN PAZIENTE DI DEBUG ", cheats = " (%1%) CHEAT ", lua_console = " (%1%) CONSOLE LUA ", debug_script = " (%1%) ESEGUI SCRIPT DI DEBUG ", calls_dispatcher = " GESTORE CHIAMATE ", dump_strings = " (%1%) FAI IL DUMP DELLE STRINGHE ", dump_gamelog = " (%1%) FAI IL DUMP DEL GAMELOG ", map_overlay = " MAPPA IN SOVRAPPOSIZIONE ", sprite_viewer = " VISUALIZZATORE SPRITE ", } menu_debug_overlay = { none = " NESSUN OVERLAY ", flags = " FLAGS ", positions = " POSIZIONI ", heat = " TEMPERATURA ", byte_0_1 = " BYTE 0 & 1 ", byte_floor = " BYTE PAVIMENTO ", byte_n_wall = " BYTE N MURO ", byte_w_wall = " BYTE W MURO ", byte_5 = " BYTE 5 ", byte_6 = " BYTE 6 ", byte_7 = " BYTE 7 ", parcel = " LOTTO ", } menu_player_count = { players_1 = " 1 GIOCATORE ", players_2 = " 2 GIOCATORI ", players_3 = " 3 GIOCATORI ", players_4 = " 4 GIOCATORI ", } adviser = { room_forbidden_non_reachable_parts = "Mettere la stanza in questa posizione risulterebbe nel blocco dell'accesso ad alcune parti dell'ospedale.", warnings = { no_desk = "Prima o poi dovrai costruire un banco di accettazione ed assumere una receptionist!", no_desk_1 = "Se vuoi che i pazienti vengano nel tuo ospedale dovrai assumere una receptionist e costruirle una scrivania dove farla lavorare!", no_desk_2 = "Ben fatto, deve essere un record mondiale: quasi un anno e nessun paziente! Se vuoi continuare come Manager di questo ospedale dovrai assumere una receptionist e costruire un banco di accettazione dove farla lavorare!", no_desk_3 = "Grandioso, quasi un anno e ancora non hai personale all'accettazione! Come ti aspetti di trovare pazienti, ora vedi di rimediare e di non fare più casini!", no_desk_4 = "Una receptionist ha bisogno della sua stazione di lavoro per accogliere i clienti quando arrivano", no_desk_5 = "Beh, era ora, presto dovresti cominciare a vedere arrivare i pazienti!", no_desk_6 = "Hai una receptionist, che ne dici quindi di costruirle un banco di accettazione dove poter lavorare?", no_desk_7 = "Hai costruito il banco di accettazione, quindi che ne dici di assumere una receptionist? Non vedrai pazienti finché non risolvi questa cosa!", cannot_afford = "Non hai abbastanza soldi in banca per assumere quella persona!", -- I can't see anything like this in the original strings cannot_afford_2 = "Non hai abbastanza soldi in banca per fare quell'acquisto!", falling_1 = "Ehi! Non è divertente, attento a dove clicchi: qualcuno potrebbe farsi male!", falling_2 = "Basta fare casini, a te piacerebbe?", falling_3 = "Ahi, deve far male, qualcuno chiami un dottore!", falling_4 = "Questo è un ospedale, non un parco giochi!", falling_5 = "Non è il luogo adatto per far cadere le persone, sono malate sai!", falling_6 = "Non è una sala da bowling, i malati non dovrebbero essere trattati così!", research_screen_open_1 = "Devi costruire un Reparto Ricerca prima di poter accedere alla schermata Ricerca.", research_screen_open_2 = "La Ricerca è disabilitata in questo livello.", researcher_needs_desk_1 = "Un ricercatore ha bisogno di una scrivania su cui lavorare.", researcher_needs_desk_2 = "Al tuo ricercatore ha fatto piacere tu gli abbia concesso una pausa. Se invece volevi assegnare più personale alla ricerca devi procurare a ognuno di loro una scrivania sulla quale lavorare.", researcher_needs_desk_3 = "Ogni ricercatore ha bisogno della propria scrivania su cui poter lavorare.", nurse_needs_desk_1 = "Ogni infermiera ha bisogno della propria scrivania su cui poter lavorare.", nurse_needs_desk_2 = "Alla tua infermiera ha fatto piacere tu le abbia concesso una pausa. Se invece volevi assegnare più personale al reparto devi procurare a ognuna di loro una scrivania sulla quale lavorare.", low_prices = "I tuoi prezzi per %s sono troppo bassi. Questo attirerà più persone nel tuo ospedale, ma non guadagnerai molto da ognuno di loro.", high_prices = "I tuoi prezzi per %s sono alti. In questo modo vedrai buoni guadagni sul breve periodo, ma a lungo andare spingerai molte persone ad andarsene.", fair_prices = "I tuoi prezzi per %s sembrano giusti ed equilibrati.", patient_not_paying = "Un paziente è andato via senza pagare %s perché è troppo costosa!", }, cheats = { th_cheat = "Congratulazioni, hai sbloccato i cheat!", roujin_on_cheat = "Sfida di Roujin attivata! Buona fortuna...", roujin_off_cheat = "Sfida di Roujin disattivata.", }, } dynamic_info.patient.actions.no_gp_available = "Aspettando che venga costruito un ambulatorio" dynamic_info.staff.actions.heading_for = "Andando verso %s" dynamic_info.staff.actions.fired = "Licenziato" dynamic_info.patient.actions.epidemic_vaccinated = "Non sono più infetto" progress_report.free_build = "COSTRUZIONE LIBERA" fax = { choices = { return_to_main_menu = "Ritorna al menu principale", accept_new_level = "Vai al livello successivo", decline_new_level = "Continua a giocare un altro po'", }, emergency = { num_disease_singular = "C'è una persona con %s che richiede la tua immediata attenzione.", free_build = "Se hai successo la tua reputazione aumenterà, ma se fallisci la tua reputazione verrà intaccata pesantemente.", }, vip_visit_result = { remarks = { free_build = { "Hai proprio un bell'ospedale! Anche se non è difficile ottenerlo con fondi illimitati, eh?", "Non sono un economista, ma penso che anch'io avrei potuto dirigere quest'ospedale, non so se mi spiego...", "Un ospedale molto ben gestito. Attento alla crisi economica però! Ah, giusto... non te ne sei dovuto preoccupare.", } } } } letter = { dear_player = "Caro %s\n", custom_level_completed = "Ben fatto! Hai completato tutti gli obiettivi di questo livello personalizzato!", return_to_main_menu = "Vuoi tornare al menu principale o vuoi continuare a giocare?", campaign_level_completed = "Ottimo lavoro! Hai battuto il livello. Ma non è ancora finita!\n Saresti interessato a una posizione nell'ospedale %s?", campaign_completed = "Incredibile! Sei riuscito a completare tutti i livelli. Ora puoi rilassarti e divertirti a riempire i forum su internet con i tuoi fantastici risultati. Buona fortuna!", campaign_level_missing = "Mi dispiace, ma sembra che il livello successivo di questa campagna non sia presente. (Nome: %s)", } install = { title = "----------------------------- Installazione CorsixTH -----------------------------", th_directory = "CorsixTH ha bisogno di una copia dei file dati di Theme Hospital (o della demo) per essere eseguito. Per favore indica la posizione della cartella di installazione di Theme Hospital.", ok = "Ok", exit = "Esci", cancel = "Annulla", } misc.not_yet_implemented = "(non ancora implementato)" misc.no_heliport = "O non è stata ancora scoperta nessuna malattia, oppure non c'è un eliporto sulla mappa. Oppure potrebbe essere necessario costruire un banco accettazione e assumere una receptionist" main_menu = { new_game = "Nuova partita", custom_campaign = "Campagna personalizzata", custom_level = "Livello personalizzato", continue = "Continua partita", load_game = "Carica partita", options = "Opzioni", map_edit = "Editor mappe", savegame_version = "Versione salvataggi: ", version = "Versione: ", exit = "Esci", } tooltip.main_menu = { new_game = "Inizia una nuova partita", custom_campaign = "Gioca una campagna creata dalla comunità", custom_level = "Costruisci il tuo ospedale in un livello personalizzato", load_game = "Carica una partita salvata in precedenza", options = "Modifica le impostazioni", map_edit = "Crea una mappa personalizzata", exit = "No, per favore non andartene!", } load_game_window = { caption = "Carica Partita (%1%)", } tooltip.load_game_window = { load_game = "Carica la partita %s", load_game_number = "Carica la partita %d", load_autosave = "Carica autosalvataggio", } custom_game_window = { caption = "Partita personalizzata", free_build = "Costruzione Libera", load_selected_level = "Inizia", } tooltip.custom_game_window = { choose_game = "Clicca su un livello per avere più informazioni", free_build = "Spunta questa casella per giocare senza soldi, né vittoria o sconfitta", load_selected_level = "Carica e gioca il livello selezionato", } custom_campaign_window = { caption = "Campagna personalizzata", start_selected_campaign = "Inizia campagna", } tooltip.custom_campaign_window = { choose_campaign = "Seleziona una campagna per avere più informazioni", start_selected_campaign = "Carica il primo livello di questa campagna", } save_game_window = { caption = "Salva Partita (%1%)", new_save_game = "Nuovo Salvataggio", } tooltip.save_game_window = { save_game = "Sovrascrivere salvataggio %s", new_save_game = "Inserisci il nome per un nuovo salvataggio", } save_map_window = { caption = "Salva mappa (%1%)", new_map = "Nuova mappa", } tooltip.save_map_window = { map = "Sovrascrivi mappa %s", new_map = "Inserisci il nome per salvataggio mappa", } menu_list_window = { name = "Nome", save_date = "Modificata", back = "Indietro", } tooltip.menu_list_window = { name = "Clicca qui per ordinare la lista in ordine alfabetico", save_date = "Clicca qui per ordinare la lista in base alla data dell'ultima modifica", back = "Chiudi questa finestra", } -- Width / height's translation doesn't fit - had to write "larghezza" and "altezza" shorter options_window = { caption = "Opzioni", option_on = "On", option_off = "Off", fullscreen = "Schermo intero", resolution = "Risoluzione", capture_mouse = "Intrappola Mouse", custom_resolution = "Personalizzata...", width = "Largh", height = "Alt", audio = "Audio globale", customise = "Personalizza", folder = "Cartelle", language = "Lingua del gioco", apply = "Applica", cancel = "Cancella", back = "Indietro", } tooltip.options_window = { fullscreen = "Decide se il gioco verrà eseguito a tutto schermo o in finestra", fullscreen_button = "Clicca per selezionare o deselezionare la modalità a schermo intero", resolution = "La risoluzione a cui il gioco dovrebbe essere eseguito", select_resolution = "Seleziona una nuova risoluzione", capture_mouse = "Clicca per attivare o disattivare l'intrappolamento del mouse all'interno della finestra di gioco", width = "Inserisci la larghezza dello schermo desiderata", height = "Inserisci l'altezza dello schermo desiderata", apply = "Applica la risoluzione inserita", cancel = "Esci senza cambiare la risoluzione", audio_button = "Attiva o disattiva tutti i suoni del gioco", audio_toggle = "Audio on o off", customise_button = "Altre impostazioni che puoi cambiare per personalizzare la tua esperienza di gioco", folder_button = "Opzioni cartelle", language = "La lingua in cui verrà mostrato il testo", select_language = "Seleziona la lingua del gioco", language_dropdown_item = "Seleziona %s come lingua", back = "Chiudi la finestra delle opzioni", } customise_window = { caption = "Impostazioni personalizzate", option_on = "On", option_off = "Off", back = "Indietro", movies = "Controllo filmati globale", intro = "Riproduci filmato introduttivo", paused = "Costruzione durante la pausa", volume = "Scorciatoia volume basso", aliens = "Pazienti alieni", fractured_bones = "Ossa Rotte", average_contents = "Oggetti frequenti", } tooltip.customise_window = { movies = "Controllo filmati globale, questo ti permette di disattivare tutti i filmati", intro = "Disattiva o attiva la riproduzione del filmato introduttivo. I filmati globali devono essere attivati se vuoi che il filmato introduttiva venga riprodotto ogni volta che avvii CorsixTH", paused = "In Theme Hospital il giocatore può usare il menù superiore solo quando il gioco era in pausa. Questa è l'impostazione predefinita anche in CorsixTH, ma attivando questa opzione non ci saranno limiti di utilizzo mentre il gioco è in pausa", volume = "Se il pulsante per abbassare il volume ti fa aprire anche il Registro Cure, attiva questa opzione per impostare Shift + C come scorciatoia per il Registro Cure", aliens = "A causa dell'assenza delle giuste animazioni abbiamo fatto sì che i pazienti con DNA Alieno possano arrivare solo con un'emergenza. Per permettere ai pazienti con DNA Alieno di visitare il tuo ospedale anche al di fuori delle emergenze disattiva questa opzione", fractured_bones = "A causa della scarsa qualità di alcune animazioni abbiamo fatto sì che non ci siano pazienti donne con Ossa Rotte. Per far sì che donne con Ossa Rotte visitino il tuo ospedale, disattiva questa opzione", average_contents = "Se vuoi che il gioco ricordi quali oggetti extra aggiungi di solito quando crei una stanza attiva questa opzione", back = "Chiudi questo menù e torna al menù delle impostazioni", } folders_window = { caption = "Posizione cartelle", data_label = "Posizione TH", font_label = "Font", music_label = "MP3", savegames_label = "Salvataggi", screenshots_label = "Screenshot", -- next four are the captions for the browser window, which are called from the folder setting menu new_th_location = "Qui puoi specificare una nuova cartella dell'installazione di Theme Hospital. Appena selezionerai una nuova cartella il gioco verrà riavviato.", savegames_location = "Seleziona la cartella che vuoi usare per i salvataggi", music_location = "Seleziona la cartella che vuoi usare per la tua musica", screenshots_location = "Seleziona la cartella che vuoi usare per i tuoi screenshot", back = "Indietro", } tooltip.folders_window = { browse = "Sfoglia le cartelle", data_location = "La cartella dell'installazione originale di Theme Hospital, che è richiesto per eseguire CorsixTH", font_location = "Posizione di un font che è in grado di mostrare i caratteri Unicode richiesti dalla tua lingua. Se non specificata, non potrai scegliere lingue che hanno bisogno di più caratteri rispetto a quelli di cui dispone il gioco originale. Esempio: Russo e Cinese", savegames_location = "Di default la cartella dei salvataggi è posizionata vicina al file di configurazione e ci vengono messi i file di salvataggio. Se non dovesse andare bene puoi scegliere la cartella che preferisci, basta selezionare quella che vuoi usare.", screenshots_location = "Di default gli screenshot vengono salvati in una cartella vicina al file di configurazione. Se non dovesse andare bene puoi scegliere la cartella che preferisci, basta selezionare quella che vuoi usare.", music_location = "Seleziona la posizione per i tuoi file MP3. Devi aver già creato la cartella e poi selezionare la cartella che hai creato.", browse_data = "Sfoglia per selezionare un'altra posizione di un'installazione di Theme Hospital (posizione attuale: %1%)", browse_font = "Sfoglia per selezionare un altro file font ( posizione attuale: %1% )", browse_saves = "Sfoglia per selezionare un'altra posizione per la tua cartella dei salvataggi ( Posizione attuale: %1% ) ", browse_screenshots = "Sfoglia per selezionare un'altra posizione per la tua cartella degli screenshot ( Posizione attuale: %1% ) ", browse_music = "Sfoglia per selezionare un'altra posizione per la tua cartella della musica ( Posizione attuale: %1% ) ", no_font_specified = "Non è stata ancora specificata nessuna posizione per il font!", not_specified = "Non è stata ancora specificata nessuna posizione per la cartella!", default = "Posizione di default", reset_to_default = "Ripristina la cartella alla sua posizione di default", -- original_path = "The currently chosen directory of the original Theme Hospital installation", -- where is this used, I have left if for the time being? back = "Chiudi questo menù e torna al menù delle impostazioni", } font_location_window = { caption = "Scegli il font (%1%)", } handyman_window = { all_parcels = "Tutti i lotti", parcel = "Lotto" } tooltip.handyman_window = { parcel_select = "Il lotto dove l'inserviente può operare, clicca per cambiarlo" } new_game_window = { caption = "Campagna", player_name = "Nome del giocatore", option_on = "On", option_off = "Off", difficulty = "Difficoltà", easy = "Assistente (Facile)", medium = "Dottore (Medio)", hard = "Consulente (Difficile)", tutorial = "Tutorial", start = "Comincia", cancel = "Annulla", } tooltip.new_game_window = { player_name = "Inserisci il nome col quale vuoi essere chiamato nel gioco", difficulty = "Seleziona il livello di difficoltà a cui vuoi giocare", easy = "Se non sei pratico di simulatori questa è l'opzione per te", medium = "Questa è la via di mezzo se non sei sicuro su cosa scegliere", hard = "Se sei abituato a questo tipo di giochi e vuoi una sfida più impegnativa, scegli questa opzione", tutorial = "Se vuoi aiuto per cominciare mentre sei in gioco, spunta questa casella", start = "Avvia il gioco con le impostazioni scelte", cancel = "Oh, non volevo davvero cominciare una nuova partita!", } lua_console = { execute_code = "Esegui", close = "Chiudi", } tooltip.lua_console = { textbox = "Inserisci qui il codice Lua da eseguire", execute_code = "Esegui il codice che hai inserito", close = "Chiudi la console", } errors = { dialog_missing_graphics = "I file dei dati della demo non contengono questa stringa.", save_prefix = "Errore durante il salvataggio: ", load_prefix = "Errore durante il caricamento: ", no_games_to_contine = "Non ci sono partite salvate.", load_quick_save = "Errore, non è possibile caricare il salvataggio veloce perché non esiste, ma non preoccuparti: ne abbiamo appena creato uno al posto tuo!", map_file_missing = "Non ho potuto trovare la mappa %s per questo livello!", minimum_screen_size = "Per favore inserisci almeno una risoluzione di 640x480.", unavailable_screen_size = "La risoluzione che hai richiesto non è disponibile a schermo intero.", alien_dna = "NOTA: Non ci sono animazioni per i pazienti Alieni per quando si siedono, aprono o bussano sulle porte etc. Quindi, così come in Theme Hospital, mentre fanno queste cose appariranno normali per poi tornare ad apparire alieni. I pazienti con DNA Alieno appariranno solo se impostati dal file del livello", fractured_bones = "NOTA: L'animazione per i pazienti donne con Ossa Rotte non è perfetta", could_not_load_campaign = "Errore nel caricare la campagna: %s", could_not_find_first_campaign_level = "Non è stato possibile trovare il primo livello di questa campagna: %s", } warnings = { levelfile_variable_is_deprecated = "Attenzione: Il livello %s contiene una definizione di variabile deprecata nel file di livello." .. "'%LevelFile' è stato rinominato in '%MapFile'. Per favore richiedi al creatore della mappa di aggiornare il livello.", } confirmation = { needs_restart = "Cambiare questa impostazione richiede che CorsixTH sia riavviato. Ogni progresso non salvato sarà perduto. Sei sicuro di volerlo fare?", abort_edit_room = "Stai attualmente costruendo o modificando una stanza. Se tutti gli oggetti richiesti sono stati posizionati sarà completata, altrimenti sarà cancellata. Continuare?", maximum_screen_size = "La risoluzione che hai inserito è superiore a 3000x2000. Risoluzioni maggiori sono supportate, ma richiederanno un hardware migliore per mantenere un livello di frame rate giocabile. Sei sicuro di voler continuare?", music_warning = "Nota: E' necessario avere la libreria smpeg.dll o equivalente nel tuo sistema operativo, altrimenti non sentirai alcuna musica nel gioco. Vuoi continuare?", --This next line isn't in the english.lua, but when strings are dump it is reported missing restart_level = "Sei sicuro di voler riavviare il livello?", } information = { custom_game = "Benvenuto in CorsixTH. Divertiti con questa mappa personalizzata!", no_custom_game_in_demo = "Spiacente, ma nella versione demo non puoi giocare mappe personalizzate.", cannot_restart = "Sfortunatamente questa mappa personalizzata è stata salvata prima che venisse implementata la funzione per riavviare.", very_old_save = "Il gioco è stato molto aggiornato da quando hai avviato questo livello. Per assicurarti che tutto funzioni come dovrebbe prendi in considerazione l'idea di riavviarlo.", level_lost = { "Peccato! Hai perso il livello. Avrai più fortuna la prossima volta!", "Hai perso perchè:", reputation = "La tua reputazione è scesa sotto %d.", balance = "Il tuo conto in banca è sceso sotto %d.", percentage_killed = "Hai ucciso più del %d dei pazienti.", cheat = "È stata una tua scelta o hai selezionato il pulsante sbagliato? Non riesci nemmeno a barare correttamente, non è così divertente, eh?", }, cheat_not_possible = "Non puoi usare cheat in questo livello. Fallisci anche nel barare, non è così divertente, eh?", } tooltip.information = { close = "Chiudi la finestra delle informazioni", } totd_window = { tips = { "Ogni ospedale per funzionare ha bisogno di alcune strutture di base. Inizia con una reception e un ambulatorio, e il personale necessario. Una volta iniziato, dipenderà tutto dal tipo di pazienti che visiteranno il tuo ospedale. Qualche stanza per le diagnosi e una farmacia sono una buona scelta per iniziare.", "I macchinari come la Pompa hanno bisogno di manutenzione più o meno costante. Assumi qualche tuttofare per ripararle, o rischierai che i pazienti e il tuo staff si facciano male.", "Il tuo staff lavora duramente, e ogni tanto ha bisogno di riposare. Costruisci una sala del personale per loro.", "Ricordati di fornire il tuo ospedale di un impianto di riscaldamento funzionante, o lo staff ed i pazienti rimarranno infelici e infreddoliti.", "Il livello di competenza influenza in maniera enorme la qualità e la velocità delle diagnosi. Assegnando un dottore molto abile al tuo ambulatorio non avrai bisogno di costruire molte strutture di diagnosi addizionali.", "Assistenti e dottori possono aumentare il loro livello di competenza imparando da un consulente nella sala tirocinio. Se il consulente è anche uno specialista (chirurgo, psichiatra e/o ricercatore), passerà le sue conoscente ai suoi studenti.", "Hai provato a digitare il numero di emergenza europea (112) nel fax? Assicurati di avere l'audio attivato!", "Il menu d'opzioni non è ancora implementato, ma puoi regolare le impostazioni modificando il file config.txt nella directory di gioco.", "Hai selezionato il tuo linguaggio, ma tutto è in inglese? Aiutaci a convertire il gioco in più linguaggi!", "Il team di CorsixTH sta cercando rinforzi! Sei interessato in programmare, tradurre o creare nuovi elementi grafici per CorsixTH? Contattaci nei forum, tramite mail o sul canale IRC (corsix-th su freenode).", "Trovato un bug? Vuoi segnalare un errore di qualsiasi genere? Inviaci un rapporto su ciò che hai trovato al nostro bug tracker: th-issues.corsix.org", "Ogni livello ha degli obiettivi da raggiungere prima di poter passare al successivo. Controlla la finestra del riepilogo per vedere a che punto sei.", "Se vuoi modificare o rimuovere una stanza esistente, puoi farlo con il tasto modifica stanza nella barra degli strumenti in basso.", "In un'orda di pazienti in attesa, puoi vedere velocemente chi sta aspettando il proprio turno per una stanza particolare spostando il mouse sulla stanza.", "Clicca sulla porta di una stanza per vederne la coda. Puoi fare diverse cose utili, come riordinare la coda o mandare il paziente in un'altra stanza.", "Se il personale è infelice chiederà spesso aumenti di salario. Assicurati che il tuo staff stia lavorando in un'ambiente di lavoro confortevole per evitare che accada.", "I pazienti avranno sete durante le attese, soprattutto se alzi il riscaldamento! Piazza i distributori di bevande in posizioni strategiche per un po' di guadagni extra. ", "Puoi cancellare prematuramente il processo di diagnosi per un paziente e deciderne la cura se hai già incontrato la malattia. Fai attenzione però, dato che fare ciò può incrementare il rischio di una cura sbagliata, risultando nella morte del paziente.", "Le emergenze possono essere una buona fonte di guadagno extra, sempre che tu abbia i mezzi sufficienti a gestire l'emergenza in tempo.", }, previous = "Suggerimento Precedente", next = "Suggerimento Successivo", } tooltip.totd_window = { previous = "Passa al suggerimento precedente", next = "Passa al suggerimento successivo", } debug_patient_window = { caption = "Debug Paziente", } cheats_window = { caption = "Cheat", warning = "Attenzione: Non riceverai alcun punto bonus alla fine del livello se usi i cheat!", cheated = { no = "Cheat usati: No", yes = "Cheat usati: Sì", }, cheats = { money = "Cheat soldi", all_research = "Completa Ricerche", emergency = "Crea Emergenza", vip = "Crea VIP", earthquake = "Crea Terremoto", epidemic = "Genera paziente contagioso", toggle_infected = "Attiva o disattiva icone infetti", create_patient = "Crea Paziente", end_month = "Fine Mese", end_year = "Fine Anno", lose_level = "Perdi Livello", win_level = "Vinci Livello", increase_prices = "Aumenta prezzi", decrease_prices = "Diminuisci prezzi", }, close = "Chiudi", } tooltip.cheats_window = { close = "Chiudi il menu dei cheat", cheats = { money = "Aggiunge 10.000 al tuo conto in banca.", all_research = "Completa tutte le ricerche.", emergency = "Crea un'emergenza.", vip = "Crea un VIP.", earthquake = "Crea un terremoto.", epidemic = "Crea un paziente contagioso che potrebbe causare un'epidemia", toggle_infected = "Attiva o disattiva le icone infetti per le epidemie attive scoperte", create_patient = "Crea un Paziente sul bordo della mappa.", end_month = "Salta alla fine del mese.", end_year = "Salta alla fine dell'anno.", lose_level = "Perdi il livello corrente.", win_level = "Vinci il livello corrente.", increase_prices = "Aumenta tutti i prezzi del 50% (max 200%)", decrease_prices = "Diminuisci tutti i prezzi del 50% (min 50%)", } } introduction_texts = { demo = "Benvenuto nell'ospedale demo!//" .. "Sfortunatamente la versione demo contiene solo questo livello. Ad ogni modo c'è abbastanza da fare per tenerti occupato per un bel po'! " .. "Incontrerai diverse malattie che richiederanno diverse cliniche per essere curate. Ogni tanto potrebbero presentarsi delle emergenze. " .. "E avrai bisogno di ricercare nuove strumentazioni tramite il centro ricerche. " .. "Il tuo obiettivo è di guadagnare $100,000, avere un ospedale che valga $70,000 e una reputazione di 700, oltre che curare almeno il 75% dei tuoi pazienti. " .. "Assicurati che la tua reputazione non scenda al di sotto di 300 e di non uccidere più del 40% dei tuoi pazienti, o perderai.//" .. "Buona fortuna!", } calls_dispatcher = { -- Dispatcher description message. Visible in Calls Dispatcher dialog summary = "%d chiamate; %d assegnate", staff = "%s - %s", watering = "Annaffiare @ %d,%d", repair = "Riparazione %s", close = "Chiudi", } tooltip.calls_dispatcher = { task = "Lista dei compiti - clicca il compito per aprire la finestra del membro del personale assegnato e scorrere alla posizione del compito", assigned = "Questo box è segnato se qualcuno è assegnato al compito corrispondente.", close = "Chiude la finestra del gestore chiamate", } update_window = { caption = "Aggiornamento disponibile!", new_version = "Nuova versione:", current_version = "Versione corrente:", download = "Vai alla pagina del download", ignore = "Salta e vai al menù principale", } tooltip.update_window = { download = "Vai alla pagina del download per trovare l'ultima versione di CorsixTH", ignore = "Ignora l'aggiornamento per ora. Questa notifica apparirà di nuovo al prossimo avvio di CorsixTH", } map_editor_window = { pages = { inside = "Interno", outside = "Esterno", foliage = "Fogliame", hedgerow = "Siepe", pond = "Laghetto", road = "Strada", north_wall = "Muro nord", west_wall = "Muro ovest", helipad = "Eliporto", delete_wall = "Cancella mura", parcel_0 = "Lotto 0", parcel_1 = "Lotto 1", parcel_2 = "Lotto 2", parcel_3 = "Lotto 3", parcel_4 = "Lotto 4", parcel_5 = "Lotto 5", parcel_6 = "Lotto 6", parcel_7 = "Lotto 7", parcel_8 = "Lotto 8", parcel_9 = "Lotto 9", camera_1 = "Camera 1", camera_2 = "Camera 2", camera_3 = "Camera 3", camera_4 = "Camera 4", heliport_1 = "Eliporto 1", heliport_2 = "Eliporto 2", heliport_3 = "Eliporto 3", heliport_4 = "Eliporto 4", paste = "Incolla area", } } -------------------------------- UNUSED ----------------------------------- ------------------- (kept for backwards compatibility) ---------------------- options_window.change_resolution = "Cambia risoluzione" tooltip.options_window.change_resolution = "Cambia la risoluzione della finestra con le dimensioni inserite a sinistra" -- I added those lines because I didn't like 'em to show up in every diff dump! original_credits[302] = "," original_credits[303] = "Steve Fitton" original_credits[304] = " " original_credits[305] = " " original_credits[306] = " " original_credits[307] = ":Company Administration" original_credits[308] = "," original_credits[309] = "Audrey Adams" original_credits[310] = "Annette Dabb" original_credits[311] = "Emma Gibbs" original_credits[312] = "Lucia Gobbo" original_credits[313] = "Jo Goodwin" original_credits[314] = "Sian Jones" original_credits[315] = "Kathy McEntee" original_credits[316] = "Louise Ratcliffe" original_credits[317] = " " original_credits[318] = " " original_credits[319] = " " original_credits[320] = ":Company Management" original_credits[321] = "," original_credits[322] = "Les Edgar" original_credits[323] = "Peter Molyneux" original_credits[324] = "David Byrne" original_credits[325] = " " original_credits[326] = " " original_credits[327] = ":Tutti alla Bullfrog Productions" original_credits[328] = " " original_credits[329] = " " original_credits[330] = " " original_credits[331] = ":Un Ringraziamento Speciale A" original_credits[332] = "," original_credits[333] = "Tutti al Frimley Park Hospital" original_credits[334] = " " original_credits[335] = ":Specialmente" original_credits[336] = "," original_credits[337] = "Beverley Cannell" original_credits[338] = "Doug Carlisle" original_credits[339] = " " original_credits[340] = " " original_credits[341] = " " original_credits[342] = ":Keep On Thinking" original_credits[343] = " " original_credits[344] = " " original_credits[345] = " " original_credits[346] = " " original_credits[347] = " " original_credits[348] = " " original_credits[349] = " " original_credits[350] = " " original_credits[351] = " " original_credits[352] = " " original_credits[353] = " " original_credits[354] = " " original_credits[355] = " " original_credits[356] = " " original_credits[357] = " " original_credits[358] = " " original_credits[359] = " " original_credits[360] = " " original_credits[361] = "." CorsixTH-0.63/CorsixTH/Lua/languages/korean.lua000066400000000000000000004774731347163623700213630ustar00rootroot00000000000000--[[ Copyright (c) 2013 nullstein 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. --]] Font("unicode") Language("한국어", "Korean", "kor", "ko") Inherit("English") Encoding(utf8) misc = { hospital_open = "병원이 문을 열었습니다", save_success = "게임이 저장되었습니다", save_failed = "오류: 게임을 저장하지 못했습니다", low_res = "저해상도", no_heliport = "아직 아무 질병도 발견되지 않았거나 이 지도에 헬리콥터 이착륙장이 없습니다. 아니면 접수대를 배치하고 접수원을 고용해야 될지도 모릅니다.", grade_adverb = { extremely = "매우", mildly = "약간", moderately = "적당히", }, not_yet_implemented = "(미구현)", send_message = "플레이어 %d 에게 메시지를 보냅니다", out_of_sync = "게임 동기화에 실패했습니다", balance = "밸런스 파일:", load_failed = "저장된 게임을 불러오지 못했습니다", mouse = "마우스", done = "모두 완료됨", --[[force = "Force",--]] pause = "일시 정지", send_message_all = "모든 플레이어에게 메시지를 보냅니다", } font_location_window = { caption = "폰트를 선택하세요 (%1%)", } staff_list = { morale = "사기", tiredness = "피로도", skill = "기술", total_wages = "전체 임금", } research = { allocated_amount = "할당량", funds_allocation = "자금 할당", categories = { improvements = "개선", drugs = "신약 개발", diagnosis = "진단 장비", cure = "치료 장비", specialisation = "집중 연구", }, } debug_patient_window = { caption = "환자 디버그", } totd_window = { previous = "이전 팁", tips = { [1] = "모든 병원은 접수대와 진료실이 있어야 돌아갑니다. 그 이후에는 어떤 종류의 환자가 방문하는지에 달려있습니다. 약국을 설치하는건 언제나 좋은 선택이지만요.", [2] = "팽창기와 같은 기계들은 정비를 해줘야 합니다. 잡역부를 한 두명 고용해서 기계들을 수리하지 않으면, 직원들이나 환자들이 다첼 수 있습니다.", [3] = "어느 정도 지나면 직원들은 지치게 됩니다. 직원 휴게실을 만들어서 직원들이 쉴 수 있게 해주세요.", [4] = "라디에이터를 충분히 배치해서 직원들과 환자들을 따뜻하게 해주지 않으면 그들이 점차 불행해질 겁니다. 마을 지도를 이용해서 난방이 더 필요한 지점을 찾으세요.", [5] = "의사의 숙련도는 진단의 정확도와 속도에 큰 영향을 미칩니다. 진료실에 숙련된 의사를 배치하면 추가적인 진단 시설이 많이 필요하지 않게 됩니다.", [6] = "수련의와 전공의는 교육실에서 전문의에게 배움으로써 숙련도를 올릴 수 있습니다. 가르치는 전문의가 전문 분야 자격이 있다면 (외과, 정신과, 또는 연구), 전문 지식도 함께 전수됩니다.", [7] = "팩스 기계에 비상전화 번호(112)를 입력해 보셨나요? 소리가 켜져있는지 꼭 확인하세요!", [8] = "화면 해상도나 언어등의 설정은 메인 메뉴 혹은 게임 내의 옵션 창에서 조절할 수 있습니다.", [9] = "영어가 아닌 언어를 선택했지만 여기저기에 영어로된 글들이 보이시나요? 빠진 글들을 여러분의 언어로 번역하는 일을 도와주세요!", [10] = "CorsixTX 팀에는 증원 부대가 필요합니다! CorsixTH 의 코딩, 번역, 혹은 그래픽 작업에 관심이 있으신가요? 포럼, 메일링 리스트, 또는 IRC 채널 (freenode의 corsix-th)을 통해서 우리에게 연락 주세요.", [11] = "버그를 발견하면 버그 트래커(th-issues.corsix.org) 에 제보해주세요", [12] = "각 레벨은 다음 레벨로 넘어가기 위해 달성해야할 복표들이 있습니다. 레벨 목표 달성의 진행 상황을 보려면 상태 창을 확인하세요.", [13] = "이미 지어진 방을 삭제하거나 편집하기 원할 때는 아래쪽 툴바에 있는 편집 버튼을 사용하면 됩니다.", [14] = "기다리는 환자가 너무 많을 때에는, 마우스 커서를 특정 방 위에 올려서 그 방에 기다리고 있는 환자들이 누구인지 금방 알아낼 수 있습니다.", [15] = "특정 방의 문을 클릭하면 그 방의 대기열을 볼 수 있습니다. 여기서 대기 순서를 변경하거나 환자를 다른 방으로 보내는 등의 유용한 조율이 가능합니다.", [16] = "불행한 직원은 급여 인상을 자주 요구할 것입니다. 이런 일이 일어나지 않도록 직원들이 일하기 편안한 환경을 조성해주세요.", [17] = "환자들은 병원 안에서 기다리는 동안 목이 말라지며, 난방이 강할 수록 더욱 그렇습니다! 자판기를 전략적인 위치에 설치해서 추가 수입을 노리세요.", [18] = "환자의 진단 절차를 중단하고 추측에 의한 치료를 하는 것이 가능합니다 (해당 질병을 만났던 적이 있는 경우). 하지만 잘못된 치료를 해 환자를 죽음에 이르게 할 위험을 감수해야 합니다.", [19] = "응급 환자들을 시간 내에 치료할 수 있는 설비를 충분히 갖추고 있다는 전제 하에, 응급 사태는 좋은 추가 수입원이 될 수 있습니다.", }, next = "다음 팁", } queue_window = { num_in_queue = "줄 길이", num_entered = "방문자 수", max_queue_size = "최대 줄 길이", num_expected = "예상", } staff_class = { doctor = "의사", handyman = "잡역부", receptionist = "접수원", nurse = "간호사", surgeon = "외과의", } tooltip = { hire_staff_window = { prev_person = "이전 사람 보기", cancel = "취소", psychiatrist = "정신과 의사", salary = "급여", next_person = "다음 사람 보기", nurses = "고용 가능한 간호사 보기", surgeon = "외과 의사", handymen = "고용 가능한 잡역부 보기", doctors = "고용 가능한 의사 보기", doctor_seniority = "의사의 계급 (수련의, 전공의, 전문의)", hire = "고용", researcher = "연구원", qualifications = "전문 분야 자격", receptionists = "고용 가능한 접수원 보기", staff_ability = "직원 능력", }, handyman_window = { parcel_select = "잡역부가 일하는 구획입니다. 설정을 변경하려면 클릭하세요.", close = "요청 취소", ability = "능력", face = "잡역부의 얼굴", prio_machines = "기계 수리의 우선순위를 높입니다.", prio_litter = "바닥 쓰레기 청소의 우선순위를 높입니다.", happiness = "행복도", prio_plants = "화초 물주기의 우선순위를 높입니다.", name = "잡역부의 이름", tiredness = "피로도", center_view = "잡역부 살펴보기", salary = "급여", sack = "해고", pick_up = "집어 들기", }, staff_list = { ability_2 = "고용인의 능력", next_person = "다음 페이지 보기", detail = "세부 사항에 대한 주의력", happiness = "고용인들이 얼마나 만족하고 있는지 보여줍니다", researcher_train = "연구원 교육을 %d%% 이수함", handymen = "이 병원에 고용된 잡역부 목록 보기", tiredness = "고용인들이 얼마나 피곤한지 보여줍니다", researcher = "연구원 자격 소지", happiness_2 = "고용인의 행복도", pay_rise = "이 사람의 급여를 10% 인상", bonus = "이 사람에게 10%의 보너스 지급", prev_person = "이전 페이지 보기", nurses = "이 병원에 고용된 간호사 목록 보기", psychiatrist = "정신과 의사 자격 소지", salary = "이 사람의 현재 급여", ability = "고용인들의 능력 수치를 보여줍니다", close = "게임으로 돌아가기", sack = "이 사람을 해고", surgeon = "외과 의사 자격 소지", tiredness_2 = "고용인의 피로도", doctors = "이 병원에 고용된 의사 목록 보기", doctor_seniority = "의사의 계급", view_staff = "이 사람이 일하는 모습 보기", surgeon_train = "외과 의사 교육을 %d%% 이수함", skills = "특수 기술", receptionists = "이 병원에 고용된 접수원 목록 보기", psychiatrist_train = "정신과 의사 교육을 %d%% 이수함", }, research = { cure_dec = "치료 장비 연구 비율 감소", cure_inc = "치료 장비 연구 비율 증가", diagnosis_dec = "진단 장비 연구 비율 감소", diagnosis_inc = "진단 장비 연구 비율 증가", drugs_dec = "신약 개발 연구 비율 감소", drugs_inc = "신약 개발 연구 비율 증가", improvements_dec = "개선 연구 비율 감소", improvements_inc = "개선 연구 비율 증가", specialisation_dec = "집중 연구 비율 감소", specialisation_inc = "집중 연구 비율 증가", allocated_amount = "할당된 예산", close = "연구 화면 닫기", }, customise_window = { intro = "인트로 영상을 켜거나 끕니다. CorsixTH 를 플레이할 때마다 인트로 영상을 재생하게 하려면 영상 컨트롤이 켜져 있어야 합니다", fractured_bones = "조잡한 애니메이션의 문제로, 기본적으로 여성 골절 환자는 등장하지 않도록 되어있습니다. 여성 골절 환자들이 병원을 방문하게 하려면 이 옵션을 끄세요", movies = "이 옵션을 끄면 게임 내의 모든 영상이 재생되지 않습니다", volume = "음량 감소 버튼이 약물 사례집을 열게 되는 경우, 이 옵션을 켜서 약물 사례집 단축키를 Shift + C 로 변경하세요", aliens = "적절한 애니메이션의 부재로, 외계인 DNA 환자들은 응급 상황에서만 방문하도록 되어있습니다. 외계 DNA 환자들이 병원을 평소에도 방문하게 하려면 이 옵션을 끄세요", paused = "테마 병원에서 기본적으로 플레이어는 게임이 일시 정지 되었을 때 상위 메뉴만을 사용할 수 있고, CorsixTH 에서도 마찬가지 입니다. 이 옵션을 켜면 게임이 정지된 상태에서도 모든 기능이 활성화 됩니다", average_contents = "방을 건설할 때 당신이 보통 어떤 비품들을 추가로 배치하는지 게임이 기억하도록 하려면 이 옵션을 켜세요", back = "이 메뉴를 닫고 옵션 메뉴로 돌아감", }, machine_window = { repair = "잡역부를 불러서 수리하기", name = "이름", close = "요청 취소", times_used = "기계가 사용된 횟수", status = "기계의 상태", replace = "기계 교환", }, place_objects_window = { confirm = "확인", cancel = "취소", pick_up = "물건 집어 들기", buy_sell = "물건 구매/판매", }, totd_window = { previous = "이전 팁 보기", next = "다읍 팁 보기", }, status = { percentage_cured = "당신은 병원에서 %d 명의 환자를 치료해야 합니다. 지금까지 %d 명을 치료했습니다.", population_chart = "각 병원이 현지 손님을 끌어오는 비율을 나타내는 도표", win_progress_own = "당신의 병원의 승리 요건 진행 상황 보기", win_progress_other = "%s 병원의 승리 요건 진행 상황 보기", reputation = "당신의 평판은 %d 이상이어야 합니다. 현재 평판은 %d 입니다.", population = "당신은 %d%% 이상의 현지 손님을 끌어와야 합니다.", percentage_killed = "이 목표는 %d%% 미만의 환자를 죽이는 것입니다. 지금까지 당신은 %d%% 의 환자를 죽였습니다.", balance = "당신의 은행 잔고는 %d 이상이어야 합니다. 현재 잔고는 %d 입니다.", value = "당신의 병원 가치는 $%d 이상이어야 합니다. 현재 가치는 $%d 입니다.", num_cured = "이 목표는 %d 명의 환자를 치료하는 것입니다. 지금까지 당신은 %d 명을 치료했습니다.", happiness = "당신의 병원에 있는 사람들의 전체적인 행복도", thirst = "당신의 병원에 있는 사람들의 전체적인 목마름 정도", warmth = "당신의 병원에 있는 사람들의 전체적인 온도", close = "개요 창 닫기", }, queue_window = { front_of_queue = "환자를 줄 맨 앞으로 보내려면 드래그해서 이 아이콘 위에 놓으세요", end_of_queue = "환자를 줄 맨 끝으로 보내려면 드래그해서 이 아이콘 위에 놓으세요", num_entered = "지금까지 이 방에서 치료된 환자 수", num_in_queue = "대기중인 환자 수", num_expected = "접수원이 예상하는 이 곳에서 곧 추가로 대기하게 될 환자 수", dec_queue_size = "최대 줄 길이 감소", max_queue_size = "접수원이 유지하려고 노력해야 하는 최대 줄 길이", inc_queue_size = "최대 줄 길이 증가", patient = "환자를 줄 내에 특정 위치로 옮기려면 드래그 하세요. 오른클릭으로 집으로 돌려 보내거나 경쟁 병원에 보내세요.", patient_dropdown = { send_home = "환자를 병원에서 내보냄", hospital_1 = "환자에게 다른 병원 소개하기", hospital_2 = "환자에게 다른 병원 소개하기", hospital_3 = "환자에게 다른 병원 소개하기", reception = "환자를 접수원에게 보내기", }, close = "닫기", }, jukebox = { rewind = "주크박스 되감기", loop = "주크박스 반복 재생", stop = "주크박스 정지", current_title = "주크박스", play = "주크박스 재생", fast_forward = "주크박스 빨리 감기", close = "주크박스 닫기", }, graphs = { deaths = "죽은 환자 수 켜기/끄기", scale = "그래프 비율", money_out = "돈 지출 켜기/끄기", visitors = "방문자 수 켜기/끄기", wages = "급여 켜기/끄기", balance = "잔고 켜기/끄기", money_in = "돈 수입 켜기/끄기", cures = "치료 수 켜기/끄기", reputation = "병원 가치 켜기/끄기", close = "그래프 창 닫기", }, toolbar = { reputation = "당신의 평판", casebook = "약물 사례집", edit = "방/아이템 편집", staff_list = "직원 관리", policy = "정책", date = "날짜", charts = "도표", objects = "복도에 물건 설치", balance = "당신의 잔고", research = "연구", hire = "작원 고용", status = "상태", town_map = "마을 지도", rooms = "방 만들기", bank_button = "은행 지점장을 보려면 왼쪽 클릭, 명세서를 보려면 오른쪽 클릭", }, message = { button = "메시지를 보려면 왼쪽 클릭", button_dismiss = "메시지를 보려면 왼쪽 클릭, 무시하려면 오른쪽 클릭", }, pay_rise_window = { accept = "급여 인상 요구를 들어줌", decline = "인상하지 않음 - 해고", }, town_map = { people = "사람 켜기/끄기", plants = "화초 켜기/끄기", fire_extinguishers = "소화기 켜기/끄기", objects = "기물 켜기/끄기", radiators = "라디에이터 켜기/끄기", heat_dec = "난방 감소", heat_inc = "난방 증가", heat_level = "난방 정도", heating_bill = "난방비", balance = "잔고", close = "마을 창 닫기", }, custom_game_window = { start_game_with_name = "%s 레벨 불러오기", free_build = "돈이나 승리/패배 조건 없이 자유롭게 플레이하려면 체크하세요", }, cheats_window = { cheats = { end_month = "이 달의 마지막으로 점프", create_patient = "지도 가장자리에 환자를 생성", money = "은행 잔고에 10.000 추가", emergency = "응급 상황 만들기", win_level = "현재 레벨 승리", vip = "VIP 생성", lose_level = "현재 레벨 패배", earthquake = "지진 생성", all_research = "모든 연구 완료", end_year = "이 해의 마지막으로 이동", }, close = "치트 창 닫기", }, casebook = { reputation = "치료 혹은 진단 평판", treatment_charge = "치료 비용", decrease = "비용 감소", increase = "비용 증가", earned_money = "지금까지 벌어들인 돈", cured = "치료 환자 수", deaths = "사망 환자 수", sent_home = "돌려보낸 환자 수", research = "집중 연구 예산을 이 치료에 투자하려면 클릭하세요", cure_type = { psychiatrist = "정신과 의사가 치료할 수 있습니다", drug_percentage = "약물로 치료 가능합니다 - 당신의 약은 %d%% 효과가 있습니다", drug = "약물로 치료 가능합니다", machine = "치료하기 위해서는 치료 장비가 필요합니다", surgery = "수술로 치료 가능합니다", unknown = "당신은 이 병을 어떻게 치료하는지 모릅니다", }, cure_requirement = { hire_staff_old = "치료를 위해서는 %s를 한 명 고용해야 합니다", hire_staff = "치료를 위해서는 직원을 고용해야 합니다", possible = "당신은 이 병을 치료할 수 있습니다", not_possible = "당신은 아직 이 병을 치료할 수 없습니다", ward_hire_nurse = "치료를 위해서는 병동에서 일하는 간호사가 필요합니다", hire_surgeon = "수술하기 위해서는 두 명째 외과 의사를 고용해야 합니다", research_machine = "치료를 위한 장비를 연구해야 합니다", build_room = "치료를 위해서는 방을 만들어야 합니다", build_ward = "치료를 위해서는 병동을 만들어야 합니다", hire_surgeons = "수술하기 위해서는 두 명의 외과 의사를 고용해야 합니다", }, up = "위로 스크롤", down = "아래로 스크롤", close = "사례집 닫기", }, policy = { diag_procedure = "의사의 진단이 [돌려 보내기] 퍼센트 미만으로 확실할 경우에는 환자를 집으로 돌려 보냅니다. 진단이 [추측에 의한 치료] 퍼센트 이상으로 확실할 경우에는 환자를 적절한 치료 시설로 보냅니다.", diag_termination = "환자에 대한 진단은 의사들이 [절차 중지] 퍼센트 만큼 확신이 있거나, 모든 진단 장비들을 시도해볼 때까지 계속됩니다.", staff_rest = "직원이 휴식을 취하러 갈 수 있는 최소한의 피로도", staff_leave = "바쁘지 않은 직원이 도움을 필요로 하는 동료를 돕도록 하려면 여기를 클릭하세요.", staff_stay = "특정 직원이 배치된 방 안에서 계속 일하도록 하려면 여기를 클릭하세요.", close = "정책 화면 닫기", }, bank_manager = { hospital_value = "당신의 병원의 현재 가치", balance = "당신의 은행 잔고", current_loan = "지불해야할 대출금", repay_5000 = "은행에 $5000 갚기", borrow_5000 = "은행에서 $5000 빌리기", interest_payment = "매달 지불하는 이자", insurance_owed = "%s 가 당신에게 지불해야할 금액", show_graph = "%s 의 예상 지불 그래프 보기", graph = "%s 의 예상 지불 그래프", inflation_rate = "연간 인플레이션 비율", interest_rate = "연간 이자율", graph_return = "이전 화면으로 돌아가기", close = "은행 지점장 화면 닫기", }, main_menu = { exit = "안돼요, 제발 나가지 마세요!", custom_level = "단일 시나리오 내에서 병원을 짓기", network = "네트워크 게임 시작", quit = "종료", continue = "지난 게임 이어하기", options = "설정 변경", load_menu = { load_slot = "게임 불러오기", empty_slot = "비어있음", }, new_game = "캠페인 시작", load_game = "저장된 게임 불러오기", }, patient_window = { graph = "이 사람의 건강 그래프와 병력 사이를 오가려면 클릭", close = "닫기", queue = "이 사람이 속한 줄 자세히 보기", happiness = "이 사람의 행복도", thirst = "이 사람의 목마름 정도", warmth = "이 사람의 따뜻함 정도", casebook = "이 사람의 병에 대해 자세히 보기", center_view = "이 사람의 위치로 이동", send_home = "이 사람을 집으로 돌려보내기", abort_diagnosis = "진단 끝나기 기다리지 않고 이 사람을 치료 시설로 보냄", }, menu_list_window = { save_date = "마지막으로 수정된 날짜를 기준으로 목록을 정렬하려면 여기를 클릭", name = "이름을 기준으로 목록을 정렬하려면 여기를 클릭", back = "이 창 닫기", }, watch = { emergency = "응급 상황: 응급 환자들을 모두 치료하기 위해 남은 시간", hospital_opening = "건설 시간: 이 시간은 당신의 병원이 개원을 선언하기까지 남은 시간입니다. 버튼을 누르면 병원 문을 즉시 엽니다.", epidemic = "전염병: 전염병을 처리하기 위해 남은 시간. 제한 시간이 다 지나거나 또는 전염병에 걸린 환자가 당신의 병원을 떠나게 되면, 건강 검사관이 병원을 방문할 것입니다. 버튼을 누르면 백신 모드가 켜지거나 꺼집니다. 환자를 클릭하여 간호사에게 예방 접종을 맞게 할 수 있습니다.", }, new_game_window = { player_name = "게임 내에서 당신이 불리기 원하는 이름을 입력하세요", tutorial = "클릭하여 게임 내에서 플레이하는 방법을 배울 수 있습니다", difficulty = "게임의 난이도를 선택하세요", easy = "시뮬레이션 게임을 처음 접한다면, 이것이 당신을 위한 옵션입니다", medium = "어떤 난이도를 선택할지 잘 모르겠다면 중간 난이도로 플레이 하세요", hard = "이런 종류의 게임에 익숙하며 좀 더 도전하고 싶다면 이 옵션을 선택하세요", start = "선택한 설정으로 게임을 시작합니다", cancel = "새 게임을 시작할 생각은 없었어요!", }, save_game_window = { new_save_game = "저장될 게임의 이름을 입력하세요", save_game = "저장된 게임 %s 덮어쓰기", }, update_window = { download = "가장 최신 버전의 CorsixTH 다운로드 페이지로 이동합니다", ignore = "이 업데이트를 무시합니다. 다음 번에 CorsixTH 를 열 때 다시 알립니다", }, calls_dispatcher = { assigned = "누군가가 해당 과업에 할당되어 있으면 이 상자가 표시됩니다", task = "과업 목록 - 할당된 직원의 정보와 과업의 위치를 보려면 과업을 클릭하세요", close = "콜 디스패쳐 창 닫기", }, research_policy = { research_progress = "이 분야에서 새로운 발견을 하기 위한 진행 상황: %1%/%2%", no_research = "지금은 이 분야에 대한 연구가 이뤄지고 있지 않습니다", }, information = { close = "정보 창 닫기", }, lua_console = { textbox = "실행할 루아 코드를 여기 입력하세요", execute_code = "입력한 코드 실행", close = "콘솔 닫기", }, folders_window = { browse_font = "다른 폰트 파일을 지정합니다 ( 현재 위치: %1% )", screenshots_location = "기본적으로, 스크린샷들은 설정 파일이 있는 곳에 함께 저장됩니다. 필요한 경우 스크린샷을 원하는 곳에 저장할 수 있습니다. 사용하기 원하는 디렉토리를 선택하세요.", browse_music = "다른 음악 디렉토리를 지정합니다 ( 현재 위치: %1% )", music_location = "mp3 음악 파일들이 있는 위치를 지정하세요. 디렉토리는 미리 만들어져 있어야 합니다.", data_location = "오리지널 테마 병원 설치 경로 (CorsixTH 를 플레이 하기 위해 필요)", browse_data = "테마 병원 설치 경로를 다시 설정합니다 ( 현재 위치: %1% )", savegames_location = "기본적으로, 저장된 게임들은 설정 파일이 있는 곳에 함께 저장됩니다. 필요한 경우 저장된 게임들을 원하는 곳에 저장할 수 있습니다. 사용하기 원하는 디렉토리를 선택하세요.", back = "이 메뉴를 닫고 설정 메뉴로 돌아갑니다", browse_saves = "다른 저장 디렉토리를 지정합니다 ( 현재 위치: %1% )", browse = "폴더 위치를 지정합니다", browse_screenshots = "다른 스크린샷 디렉토리를 지정합니다 ( 현재 위치: %1% )", not_specified = "폴더 위치 지정되지 않음!", font_location = "사용중인 언어를 표시하는데 필요한 폰트 파일의 위치를 지정합니다. 이것을 설정하지 않으면 오리지널 게임에 포함되지 않은 문자들은 표시되지 않습니다 (예: 러시아어, 중국어)", reset_to_default = "디렉토리를 기본 위치로 되돌립니다", default = "기본 위치", no_font_specified = "폰트 위치 지정되지 않음!", }, staff_window = { name = "직원 이름", face = "이 사람의 얼굴 - 관리 화면을 보려면 클릭", happiness = "행복도", tiredness = "피로도", ability = "능력", doctor_seniority = "계급 - 수련의, 전공의, 또는 전문의", skills = "전문 분야 자격", surgeon = "외과 의사", psychiatrist = "정신과 의사", researcher = "연구원", salary = "월급", center_view = "왼쪽 클릭으로 직원 보기, 오른쪽 클릭으로 다음 직원으로 넘어가기", sack = "해고", pick_up = "집어 들기", close = "닫기", }, rooms = { gps_office = "환자는 진료실에서 최초의 상담을 받습니다", general_diag = "의사는 일반 진단실을 사용해 환자들의 기본 진단을 수행합니다. 값이 싸고 매우 효과적인 편입니다", psychiatry = "정신과에서는 미친 환자들을 치료하거나, 다른 환자들의 진단을 도울 수 있지만 정신과 의사 자격이 있는 의사가 필요합니다", cardiogram = "의사는 심전도실을 사용해 환자들을 진단합니다", scanner = "의사는 스캐너실을 사용해 환자들을 진단합니다", x_ray = "의사는 X-레이실을 사용해서 환자들을 진단합니다", ultrascan = "의사는 울트라스캔 시설을 사용해 환자들을 진단합니다", blood_machine = "의사는 혈액 분석실을 사용해 환자들을 진단합니다", pharmacy = "간호사는 약국에서 환자들을 치료할 약을 조제합니다", ward = "병동은 진단과 치료에 모두 유용합니다. 환자들을 이곳에 보내서 간호사를 통해 관찰하거나 수술 후 회복기간을 갖게 합니다", operating_theatre = "수술실에는 외과 의사 자격이 있는 의사 두 명이 필요합니다", inflation = "의사는 팽창기를 사용해서 부은 머리를 치료합니다", tongue_clinic = "의사는 혀 절단실을 사용해 늘어진 혀를 치료합니다", fracture_clinic = "간호사는 골절 클리닉을 사용해서 부러진 뼈를 고칩니다", jelly_vat = "의사는 젤리통으로 젤리염을 치료합니다", electrolysis = "의사는 전기분해실을 사용해서 모발과다증을 치료합니다", hair_restoration = "의사는 모발 재생기를 사용해 대머리를 치료합니다", decontamination = "의사는 오염제거 샤워를 통해 방사능 오염을 치료합니다", dna_fixer = "의사는 DNA 정정실을 사용해 외계인 DNA를 가진 환자들을 치료합니다", research_room = "연구원 자격을 가진 의사들은 연구실에서 신약과 새로운 기계등을 발견해낼 수 있습니다", training_room = "교육실에서는 전문의가 다른 의사들을 교육시킬 수 있습니다", toilets = "화장실을 지어 환자들이 당신의 병원을 어지럽히는걸 막으세요!", staffroom = "의사들과 간호사들은 직원 휴게실에서 긴장을 풀고 피로를 풉니다", }, statement = { close = "명세서 화면 닫기", }, buy_objects_window = { price = "이 물건의 가격", confirm = "선택된 기물(들) 구매", cancel = "취소", decrease = "이 물건 하나 덜 구매", increase = "이 물건 하나 더 구매", total_value = "주문하는 물건들의 총 가격", }, load_game_window = { load_game = "%s 게임 불러오기", load_autosave = "자동 저장 불러오기", load_game_number = "%d번 게임 불러오기", }, window_general = { confirm = "확인", cancel = "취소", }, fax = { close = "메시지를 삭제하지 않고 창 닫기", }, objects = { chair = "의자: 환자들이 여기 앉아서 병에 대해 상담합니다", litter = "쓰레기: 환자가 버릴 쓰레기통을 찾기 못해서 바닥에 버려짐", sofa = "소파: 직원 휴게실에서 쉬는 직원들은 특별히 나은 휴식 방법이 없다면 소파에 조용히 앉아있습니다", bench = "벤치: 환자 한 명이 편하게 앉아서 기다릴 수 있는 자리를 제공합니다", video_game = "비디오 게임: 당신의 직원이 Hi-Octane 을 즐기며 긴장을 풀게 해줍니다", lamp = "전등: 빛을 비춰서 직원들이 볼 수 있게 합니다", door = "문: 사람들이 시도 때도 없이 열고 닫습니다", auto_autopsy = "자동부검기: 새로운 치료법을 발견하는 데 큰 도움을 줍니다", reception_desk = "접수대: 환자들을 의사들에게 안내하는 접수원을 필요로 합니다", tv = "TV: 당신의 직원이 좋아하는 방송을 놓치지 않게 해주세요", litter_bomb = "쓰레기 폭탄: 경쟁 병원을 고의로 방해합니다", inflator = "팽창기: 부은 머리 환자들을 치료합니다", desk = "책상: 의사가 PC를 사용하는 데 필요합니다", pool_table = "당구대: 당신의 직원이 긴장을 푸는 데 좋습니다", bed = "침대: 굉장히 아픈 사람들이 침대에 눕습니다", drinks_machine = "자판기: 환자들이 목마르지 않게 하고 이윤을 남깁니다", bookcase = "책장: 의사들의 참고 자료", skeleton = "해골: 교육과 할로윈 용도로 사용", computer = "컴퓨터: 핵심 연구 요소", bin = "쓰레기통: 환자들이 쓰레기를 여기 버립니다", pharmacy_cabinet = "약장: 약이 보관되는 장소", radiator = "라디에이터: 당신의 병원이 추워지지 않게 합니다", atom_analyser = "화학 혼합기: 연구소에 배치되어 연구 프로세스 전체를 가속화 합니다", plant = "화초: 환자들이 행복하게 하고 공기를 정화합니다", toilet = "변소: 환자들이 이걸, 음, 어쨌든 사용합니다", fire_extinguisher = "소화기: 오동작하는 기계의 위험을 최소화합니다", lecture_chair = "강의 의자: 교육 받는 의사들이 여기에 앉아서 필기하고, 지루해하며 빈둥거립니다. 의자를 많이 배치할 수록 많은 학생이 수업을 들을 수 있습니다", toilet_sink = "세면대: 위생에 신경쓰는 환자들은 여기서 더러운 손을 씻을지도 모릅니다. 충분한 수의 세면대가 없으면 환자들은 불행해집니다", cabinet = "캐비넷: 환자들에 대한 서류철, 노트, 연구 문서 등을 보관합니다", }, build_room_window = { cost = "현재 선택된 방의 비용", room_classes = { diagnosis = "진료 시설을 선택", treatment = "일반 치료 시설을 선택", clinic = "특화 클리닉 시설을 선택", facilities = "편의, 특수 시설 선택", }, close = "요청을 취소하고 게임으로 돌아감", }, options_window = { fullscreen = "게임을 전체화면으로 플레이할 것인지 설정합니다", cancel = "해상도를 변경하지 않고 돌아갑니다", back = "옵션 창을 닫습니다", language = "게임 내의 글을 표시할 언어", apply = "입력된 해상도를 적용합니다", change_resolution = "왼쪽에 입력된 해상도로 변경합니다", fullscreen_button = "전체화면 설정을 변경하려면 클릭하세요", width = "원하는 화면 너비를 입력하세요", language_dropdown_item = "%s 을(를) 언어로 선택합니다", height = "원하는 화면 높이를 입력하세요", select_language = "게임 언어를 선택하세요", select_resolution = "새로운 해상도를 선택하세요", resolution = "게임이 실행될 해상도", audio_button = "게임 전체의 오디오를 켜고 끕니다", folder_button = "폴더 옵션", audio_toggle = "켜고 끄기", customise_button = "게임 플레이 경험을 커스터마이즈 하기 위한 세부 설정", }, } menu_charts = { bank_manager = " (%1%) 은행 지점장 ", statement = " (%1%) 명세서 ", staff_listing = " (%1%) 직원 목록 ", town_map = " (%1%) 마을 지도 ", casebook = " (%1%) 사례집 ", research = " (%1%) 연구 ", status = " (%1%) 상태 ", graphs = " (%1%) 그래프 ", policy = " (%1%) 정책 ", briefing = " 브리핑 ", } town_map = { number = "구획 번호", not_for_sale = "소유 불가", price = "구획 가격", for_sale = "판매중", owner = "구획 소유주", area = "구획 면적", } custom_game_window = { caption = "커스텀 게임", free_build = "자유 건설", } cheats_window = { caption = "치트", warning = "경고: 치트를 사용하면 레벨이 끝나고 보너스 점수를 전혀 받을 수 없게 됩니다!", cheats = { money = "돈 치트", all_research = "모든 연구 치트", emergency = "응급 상황 생성", vip = "VIP 생성", earthquake = "지진 생성", create_patient = "환자 생성", end_month = "월말", end_year = "연말", lose_level = "레벨 패배", win_level = "레벨 승리", }, close = "닫기", cheated = { no = "치트 사용됨: 아니오", yes = "치트 사용됨: 예", }, } room_descriptions = { ultrascan = { [1] = "울트라스캔//", [2] = "울트라스캔은 궁극의 진단 장비라고 할 수 있습니다. 비용이 많이 들지만 최고의 진단을 원한다면 충분히 가치가 있습니다.//", [3] = "울트라스캔을 작동하려면 의사가 필요합니다. 기계의 정비 또한 필요합니다.", }, gp = { [1] = "진료실//", [2] = "이것은 병원의 가장 기본이 되는 진료실입니다. 새로 방문한 환자는 어떤 이상이 있는지 알아보기 위해 일단 진료실로 보내집니다. 그러고 나서는 다른 진단 시설로 보내지거나 치료할 수 있는 시설로 보내집니다. 만약 이 진료실이 너무 바빠진다면 다른 진료실을 추가로 지을 수도 있습니다. 방의 크기가 클 수록, 추가 기물들을 많이 배치할 수록 의사의 위신이 서게 됩니다. 이것은 다른 방들에 대해서도 마찬가지로 적용됩니다.//", [3] = "진료실에는 의사가 필요합니다.", }, fracture_clinic = { [1] = "골절 클리닉//", [2] = "운이 없이 뼈가 부러진 환자들이 이곳으로 옵니다. 깁스 제거기는 강력한 공업용 레이저로 굳은 깁스를 잘라내면서 환자에게는 아주 미약한 통증만을 유발합니다.//", [3] = "골절 클리닉에는 간호사가 필요합니다. 그리고 기계도 자주 정비해 주어야 합니다.", }, tv_room = { [1] = "TV실은 사용되지 않음", }, inflation = { [1] = "팽창 클리닉//", [2] = "고통스럽지만 우스운 모습의 부은 머리 증상을 가진 환자들이 팽창 클리닉에 오면, 그들의 대두를 터뜨려서 곧바로 적정 압력으로 부풀립니다.//", [3] = "팽창 클리닉에는 의사가 필요합니다. 그리고 잡역부가 기계를 정비해 주어야 합니다.", }, jelly_vat = { [1] = "젤리 클리닉//", [2] = "우스운 병인 젤리염의 저주를 받은 환자들은 비틀거리며 젤리 클리닉에 와서 젤리 통에 들어가야 합니다. 그러면 의학적으로 완전히 해명되지 않은 신기한 방법으로 치료됩니다.//", [3] = "젤리 클리닉에는 의사가 필요합니다. 그리고 잡역부의 정비도 필요합니다.", }, scanner = { [1] = "스캐너//", [2] = "정교한 스캐너로 환자들을 정확히 진단합니다. 그러고 나서 환자들은 다시 진료실로 돌아가 다음 처방을 받습니다.//", [3] = "스캐너에는 의사가 필요합니다. 그리고 정비도 필요합니다.", }, blood_machine = { [1] = "혈액 분석기//", [2] = "혈액 분석기는 환자의 혈액 내의 세포를 확인하여 어디가 잘못되었는지 확인하는 진단 장비입니다.//", [3] = "혈액 분석기에는 의사가 필요합니다. 그리고 정비도 필요합니다.", }, pharmacy = { [1] = "약국//", [2] = "약물 처방을 받은 환자들은 약국에 가서 약을 받아야 합니다. 더 많은 약물 치료법이 연구될수록 약국은 더 바빠집니다. 나중에는 약국을 더 짓는 것도 좋습니다.//", [3] = "약국에는 간호사가 필요합니다.", }, cardiogram = { [1] = "심전도실//", [2] = "환자들은 다시 진료실에 돌아가서 처방을 받기 전에 이곳에 와서 진단을 받습니다.//", [3] = "심전도실에는 의사가 필요합니다. 그리고 정비도 필요합니다.", }, ward = { [1] = "병동//", [2] = "환자들의 진단 도중 이곳에 와서 간호사가 살펴볼 수 있습니다. 환자들은 수술을 받기 전까지 이곳에 머무릅니다.//", [3] = "병동에는 간호사가 필요합니다.", }, psych = { [1] = "정신과//", [2] = "정진 질환으로 판명된 환자들은 정신과에 방문해서 상담을 받아야 합니다. 정신과 의사들은 또한 환자들이 어떤 병이 있는지 진단도 가능하고, 그것이 정신 질환인 경우에는 침상을 사용해 치료할 수 있습니다.//", [3] = "정신과에는 정신과 교육을 받은 의사가 필요합니다.", }, staff_room = { [1] = "직원 휴게실//", [2] = "직원들도 일을 하다보면 지치게 됩니다. 그들은 긴장을 풀고 생기를 찾기 위해서 이 방을 필요로 합니다. 피로한 직원은 일하는 속도가 느려지고, 급여를 더 요구하며, 결국에는 병원을 나가게 됩니다. 또한 피로한 직원들은 실수를 더 자주 합니다. 다양한 할 것들이 있는 직원 휴게실은 지을 만한 가치가 있습니다. 여러 명의 직원이 동시에 쉴 수 있는 공간이 나오도록 해주세요.", }, operating_theatre = { [1] = "수술실//", [2] = "이 중요한 시설에서 다양한 증상들이 치료됩니다. 수술실의 크기는 적절해야 하며, 올바른 장비들로 채워져야 합니다. 이 시설은 병원에 필수 불가결한 존재입니다.//", [3] = "수술실에는 외과 의사 자격이 있는 의사 두 명이 필요합니다.", }, training = { [1] = "교육실//", [2] = "수련의와 전공의는 여기서 교육받으면서 추가 자격을 취득할 수 있습니다. 외과, 연구원, 정신과 자격을 가진 전문의는 자신에게 교육받는 의사들에게 이런 전문 분야 지식도 함께 전수하게 됩니다. 이미 자격이 있는 의사들은, 여기서 교육받는 동안 해당 지식을 어떻게 더 잘 사용할 수 있는지 깨우치게 될 겁니다.//", [3] = "교육실에는 전문의가 한 명 필요합니다.", }, dna_fixer = { [1] = "DNA 클리닉//", [2] = "다른 세계에서 온 외계인에게 감염된 환자들은 그들의 DNA 를 교체받아야 합니다. DNA 정정기는 굉장히 복잡한 설비이므로, 만약을 위해 소화기를 비치해 두는 것이 현명할 것입니다.//", [3] = "DNA 정정기는 잡역부가 주기적으로 정비해주어야 합니다. 또한, DNA 정정기를 작동하려면 연구원 자격을 갖춘 의사가 필요합니다.", }, research = { [1] = "연구실//", [2] = "연구실에서는 신약과 치료법 등이 새로 발견되거나 개선됩니다. 병원의 중요한 부분으로서, 당신의 치료율에 기적을 선사할 것입니다.//", [3] = "연구실에는 연구원 자격이 있는 의사가 필요합니다.", }, hair_restoration = { [1] = "모발 재생 클리닉//", [2] = "극단적인 탈모를 겪는 환자들은 이 클리닉의 모발 재생기로 오게 됩니다. 의사가 기계를 작동하면, 환자의 머리에 새로운 머리카락이 신속하게 심겨집니다.//", [3] = "모발 재생 클리닉에는 의사가 필요합니다. 그리고 주기적인 정비가 필요합니다.", }, general_diag = { [1] = "일반 진단실//", [2] = "더 진단받아야 하는 환자들은 이곳으로 보내집니다. 진료실에서 이상을 발견하지 못한 경우, 일반 진단실에서는 대개 발견됩니다. 여기서 나온 결과를 분석하기 위해 환자들은 다시 진료실로 보내집니다.//", [3] = "일반 진단실에는 의사가 필요합니다.", }, electrolysis = { [1] = "전기분해실//", [2] = "모발 과다증 환자들이 이곳으로 보내지며, 여기서는 전기분해기 라고 불리는 특수한 기계로 털을 확 잡아뺀 뒤, 시멘트와 크게 다르지 않은 물질로 모공을 전기적으로 봉쇄합니다.//", [3] = "전기분해실에는 의사가 필요합니다. 그리고 잡역부가 정비해 주어야 합니다.", }, slack_tongue = { [1] = "늘어진 혀 클리닉//", [2] = "진료실에서 늘어진 혀로 진단받은 환자들은 이 클리닉에 와서 치료 받게 됩니다. 의사는 고도 기술의 기계로 혀를 연장해서 잘라내어 환자를 일상의 건강한 상태로 돌려놓습니다.//", [3] = "늘어진 혀 클리닉에는 의사가 필요합니다. 그리고 자주 정비해 주어야 합니다.", }, toilets = { [1] = "화장실//", [2] = "생리 현상을 느끼는 환자들은 화장실에 가서 일을 봐 주어야 합니다. 방문자가 아주 많을 것으로 예상된다면, 당신은 추가로 칸이나 세면대를 더 지을 수 있습니다. 어떤 경우에는 병원 안의 다른 곳에 화장실 시설을 더 짓는 것을 고려해야 할 지도 모릅니다.", }, no_room = { [1] = "", }, x_ray = { [1] = "X-레이//", [2] = "X-레이 기계는 특수 방사선을 통해서 인체의 내부 사진을 찍어서, 환자의 어디가 이상이 있는지 더 잘 이해하게 해 줍니다.//", [3] = "X-레이에는 의사가 필요합니다. 그리고 정비도 필요합니다.", }, decontamination = { [1] = "오염제거 클리닉//", [2] = "방사선에 노출된 환자들은 신속하게 오염 제거 클리닉으로 오게 됩니다. 이 방에는 온갖 무시무시한 방사능과 진창을 씻어주는 샤워기가 설치되어 있습니다.//", [3] = "오염제거 클리닉에는 의사가 필요합니다. 그리고 잡역부가 정비해 주어야 합니다.", }, } errors = { unavailable_screen_size = "요청한 화면 크기는 전체화면에서 지원되지 않습니다.", dialog_missing_graphics = "죄송합니다, 데모 데이터 파일은 이 대화창이 포함되어 있지 않습니다.", load_prefix = "게임을 불러오는 중 오류 발생: ", load_quick_save = "에러, 빠른 저장이 존재하지 않아 읽어올 수 없습니다. 지금 막 빠른 저장 파일을 생성했습니다!", save_prefix = "게임을 저장하는 중 오류 발생: ", map_file_missing = "이 레벨의 맵 파일(%s)을 찾을 수 없습니다!", minimum_screen_size = "최소 640x480 의 화면 크기를 입력해 주세요.", alien_dna = "주의: 외계인 환자들이 앉을 때, 문을 열거나 두드릴 때 등의 애니메이션이 없습니다. 따라서, 원본 테마 병원에서와 같이 환자들은 이런 행동을 취할 때 잠시동안 평상시의 모습으로 변했다가 되돌아오게 됩니다. 외계 DNA 환자들은 해당 레벨에서 나타나도록 설정되어 있을 경우에만 나타납니다", fractured_bones = "주의: 여성 골절 환자들의 애니메이션은 완전하지 못합니다", } menu_options_warmth_colors = { choice_2 = " 파랑 초록 빨강 ", choice_1 = " 빨강 ", choice_3 = " 노랑 주황 빨강 ", } bank_manager = { hospital_value = "병원 가치", balance = "잔고", current_loan = "대출금", interest_payment = "이자", insurance_owed = "보험금", inflation_rate = "인플레이션 비율", interest_rate = "이자율", statistics_page = { date = "날짜", details = "상세", money_out = "지출", money_in = "수입", balance = "잔고", current_balance = "현재 잔고", }, } main_menu = { exit = "종료", custom_level = "단일 시나리오", version = "버전: ", new_game = "캠페인", load_game = "불러오기", options = "옵션", savegame_version = "저장 버전: ", } date_format = { daymonth = "%2%월 %1%일", } menu_display = { mcga_lo_res = " MCGA 저해상도 ", shadows = " 그림자 ", high_res = " 고해상도 ", } pay_rise = { definite_quit = "당신이 무슨짓을 해도 날 붙잡을 수 없습니다. 여기와는 이제 끝이에요.", regular = { [1] = "난 너무 지쳤어요. 이 망할 직장 때려치는 것 보고싶지 않으면, 좀 쉬게 해주고, %d 만큼 급여를 올려주세요.", [2] = "정말 피곤합니다. 휴식도 좀 필요하고, 월급을 %d 만큼 올려서 %d 로 만들어줘요. 지금 당장이요, 노동력 착취자 양반.", [3] = "이봐요. 난 지금 개처럼 일하고 있어요. %d 만큼 보너스를 주면 이 병원에 남도록 하죠.", [4] = "난 굉장히 불행해요. 급여를 %d 인상해서 %d 로 만들어주지 않으면 난 나가겠어요.", [5] = "우리 부모님은 의료계로 오면 돈 잘 벌거라고 하셨는데. 그러니까 %d 만큼 급여 인상해주지 않으면 컴퓨터 게임 제작자가 돼버리고 말겠어요.", [6] = "이젠 넌덜머리가 나요. 월급을 웬만큼 올려주세요. %d 정도 인상해주면 적당할 것 같군요.", }, poached = "저에게 %d 만큼 주겠다고 %s 에서 이직 제의가 왔어요. 최소한 이만큼 주지 않으면 떠나겠어요.", } menu_debug = { jump_to_level = " 다음 레벨로 점프 ", transparent_walls = " (%1%) 투명한 벽 ", limit_camera = " 카메라 제한 ", disable_salary_raise = " 급여 인상 비활성화 ", make_debug_fax = " 디버그 팩스 만들기 ", make_debug_patient = " 디버그 환자 만들기 ", cheats = " (%1%) 치트 ", lua_console = " (%1%) 루아 콘솔 ", calls_dispatcher = " 콜 디스패쳐 ", dump_strings = " (%1%) 문자열 덤프 ", dump_gamelog = " (%1%) 게임 로그 덤프 ", map_overlay = " 맵 오버레이 ", sprite_viewer = " 스프라이트 뷰어 ", } progress_report = { free_build = "자유 건설", too_hot = "난방 시스템을 좀 추려내세요. 지금은 너무 더워요.", percentage_pop = "% 인구", win_criteria = "승리 요건", very_unhappy = "사람들이 굉장히 불행합니다.", quite_unhappy = "사람들이 꽤 불행합니다.", header = "진행 상황 보고서", too_cold = "너무 춥습니다. 라디에이터를 좀 설치하세요.", more_drinks_machines = "자판기를 더 설치하세요.", } menu_options = { sound = " (%1%) 효과음 ", announcements = " (%1%) 공지 ", music = " (%1%) 음악 ", sound_vol = " 효과음 볼륨 ", announcements_vol = " 공지 볼륨 ", music_vol = " 음악 볼륨 ", jukebox = " (%1%) 주크박스 ", lock_windows = " 창 잠그기 ", edge_scrolling = " 가장자리 스크롤 ", adviser_disabled = " (%1%) 조언자 ", twentyfour_hour_clock = " 24 시간 시계 ", warmth_colors = " 온도 표시 색 ", game_speed = " 게임 속도 ", autosave = " 자동 저장 ", wage_increase = " 급여 인상 ", } menu_options_game_speed = { pause = " (%1%) 일시 정지 ", slowest = " (%1%) 가장 느림 ", slower = " (%1%) 느림 ", normal = " (%1%) 보통 ", max_speed = " (%1%) 최고 속도 ", and_then_some_more = " (%1%) 에서 더 빠르게 ", } rooms_short = { gps_office = "진료실", general_diag = "일반 진단실", ultrascan = "울트라스캔", research_room = "연구실", fracture_clinic = "골절 클리닉", destroyed = "파괴됨", staffroom = "직원 휴게실", jelly_vat = "젤리 클리닉", scanner = "스캐너", decontamination = "오염제거 클리닉", pharmacy = "약국", cardiogram = "심전도실", reception = "접수처", training_room = "교육실", corridor_objects = "복도 기물", operating_theatre = "수술실", dna_fixer = "DNA 정정기", ward = "병동", psychiatric = "정신과", hair_restoration = "모발 재생 클리닉", inflation = "팽창 클리닉", tongue_clinic = "늘어진 혀 클리닉", toilets = "화장실", electrolysis = "전기분해실", x_ray = "X-레이", blood_machine = "혈액 분석기", } lua_console = { execute_code = "실행", close = "닫기", } staff_descriptions = { good = { [1] = "상당히 빠르고 성실함. ", [2] = "굉장히 세심하고 사려깊음. ", [3] = "다양한 능력을 보유. ", [4] = "굉장히 친절하고 잘 웃음. ", [5] = "체력이 뛰어남. 오래 지속할 수 있음. ", [6] = "놀랄만큼 공손하고 온화함. ", [7] = "재능이 특출남. ", [8] = "주어진 일에 최선을 다함. ", [9] = "포기하지 않는 완벽주의자. ", [10] = "미소로 사람들을 돕는데 전념함. ", [11] = "매력적이고, 공손하며, 도움이 됨. ", [12] = "의욕적이고 헌신적임. ", [13] = "사람이 좋고 아주 열심히 일함. ", [14] = "성실하고 친근함. ", [15] = "신중하고 응급 상황에 믿을만함. ", }, misc = { [1] = "골프를 침. ", [2] = "스쿠버 다이버. ", [3] = "얼음 조각상 제작. ", [4] = "와인 애호가. ", [5] = "경주용 자동차 운전. ", [6] = "번지 점프를 함. ", [7] = "맥주잔 받침 수집가. ", [8] = "무대 아래로 뛰어내리는 것을 즐김. ", [9] = "방귀대장. ", [10] = "강을 넓히는 것을 즐김. ", [11] = "위스키를 증류. ", [12] = "DIY 에 능숙함. ", [13] = "프랑스 예술 영화를 즐김. ", [14] = "테마 공원을 플레이 함. ", [15] = "대형 트럭 운전 면허 소지자. ", [16] = "오토바이 경주에 나감. ", [17] = "클래식 바이올린과 첼로를 연주. ", [18] = "철도 약탈에 능함. ", [19] = "개 애호가. ", [20] = "라디오 청취자. ", [21] = "목욕을 자주 즐김. ", [22] = "짚 공예 강사. ", [23] = "채소 속을 파내어 비누통으로 사용함. ", [24] = "파트타임 특수 경찰. ", [25] = "전 퀴즈 쇼 진행자. ", [26] = "WW2 유산탄 파편 수집가. ", [27] = "가구 재배치를 즐김. ", [28] = "광란의 댄스 음악을 감상. ", [29] = "데오드란트 스프레이로 곤충들의 화를 돋굼. ", [30] = "재미없는 개그맨들에게 야유함. ", [31] = "의회를 기웃거리며 도청함. ", [32] = "은밀한 정원사. ", [33] = "짝퉁 시계들을 거래. ", [34] = "락앤롤 밴드에서 노래함. ", [35] = "오후 시간대 텔레비전에 열광함. ", [36] = "송어 간지럼의 대가. ", [37] = "박물관에서 여행객들을 꼬심. ", }, bad = { [1] = "느리고 귀찮음. ", [2] = "게으르고 동기 부여가 안됨. ", [3] = "훈련이 덜되고 무능함. ", [4] = "무례하고 불쾌함. 사람들을 적대시함. ", [5] = "최악의 체력 - 태도가 불량함. ", [6] = "귀머거리. 양배추 냄새 같은 것이 남. ", [7] = "일하는 데 거치적거림. 없는게 나을 수 있음. ", [8] = "성질 급하고 쉽게 산만해짐. ", [9] = "스트레스가 심하고 실수가 잦음. ", [10] = "심성이 뒤틀려있고 화를 잘 냄 - 미움으로 가득 차 있음. ", [11] = "주의력이 없고 사고를 잘 냄. ", [12] = "일에 신경을 쓰지 않음. 엄청나게 게으름. ", [13] = "바보같이 위험을 감수하려 함. ", [14] = "교활하고 간사하며, 질서를 파괴함. ", [15] = "거만하고 잘난체 함. ", }, } room_classes = { diagnosis = "진단", clinics = "클리닉", facilities = "부대시설", treatment = "치료", } install = { ok = "확인", cancel = "취소", exit = "종료", th_directory = "CorsixTH 를 실행하기 위해서는 테마병원 원본 (또는 데모) 게임 데이터가 필요합니다. 아래의 선택 버튼을 눌러서 테마 병원 설치 디렉토리를 지정하세요.", title = "--------------------------------- CorsixTH 설치 ---------------------------------", } place_objects_window = { drag_blueprint = "마음에 드는 크기가 될 때까지 청사진을 드래그 하세요", place_door = "문을 배치하세요", place_windows = "원하는 만큼 창문을 배치하고 확인 버튼을 누르세요", confirm_or_buy_objects = "방의 모습을 확정짓거나, 기물들을 구매/이동시킬 수 있습니다", place_objects_in_corridor = "기물들을 복도에 배치하세요", pick_up_object = "물건을 클릭해서 집어 올리거나, 다른 기능을 선택하세요", place_objects = "마음에 들 때까지 기물들을 배치/이동시키고 확인을 누르세요", } load_game_window = { caption = "게임 불러오기 (%1%)", } staff_title = { junior = "수련의", psychiatrist = "정신과 의사", consultant = "전문의", surgeon = "외과 의사", doctor = "전공의", researcher = "연구원", nurse = "간호사", receptionist = "접수원", general = "일반", } graphs = { deaths = "사망", money_in = "수입", money_out = "지출", visitors = "방문자", wages = "급여", balance = "잔액", time_spans = { [1] = "1 년", [2] = "12 년", [3] = "48 년", }, cures = "치료", reputation = "평판", } adviser = { tutorial = { hire_receptionist = "환자들을 접수하려면 접수원도 고용해야 할 겁니다.", build_pharmacy = "축하합니다! 이제 병원이 제대로 돌아가게 하려면 약국을 짓고 간호사를 고용하면 됩니다.", hire_doctor = "아픈 사람들을 진단하고 치료하려면 의사를 고용해야 합니다.", place_receptionist = "접수원을 데려다가 아무 데나 놓아보세요. 똑똑하게도, 알아서 접수대 쪽으로 이동할 것입니다.", place_windows = "문을 설치한 것과 동일한 방식으로 창문들을 배치하세요. 꼭 창문이 있어야 하는 것은 아니지만, 밖에 볼 것이 있으면 직원들이 더 행복해 할 것입니다.", confirm_room = "점멸하는 아이콘을 왼쪽 클릭해서 방을 가동하거나 X 버튼을 클릭해서 뒤로 돌아가세요.", rotate_and_place_reception = "오른쪽 클릭으로 책상을 돌리거나 왼쪽 버튼으로 책상을 병원 내에 배치하세요.", build_reception = "안녕하세요. 우선, 당시늬 병원에는 접수대가 필요합니다. 복도 기물 메뉴에서 접수대를 선택하세요.", doctor_in_invalid_position = "이봐요! 여기에는 의사를 배치할 수 없어요.", start_tutorial = "임무 브리핑을 읽고 나서 튜토리얼을 시작하기 위해 마우스 왼쪽 버튼을 클릭하세요.", receptionist_invalid_position = "접수원을 여기에 배치할 수 없습니다.", room_too_small_and_invalid = "청사진이 너무 작거나 잘못된 곳에 배치되었습니다. 제대로 해보세요.", window_in_invalid_position = "창문이 잘못된 곳에 배치되었습니다. 벽 위의 다른 곳에 설치해 보세요.", choose_doctor = "고용할 의사를 고르기 전에 능력이 얼마나 되는지 잘 살펴보세요.", information_window = "정보 창은 당신이 방금 지은 진료실에 대한 모든 것을 알려줍니다.", build_gps_office = "환자들의 질병을 진단하기 시작하려면 먼저 진료실을 지어야 합니다.", select_doctors = "점멸하는 아이콘을 왼쪽 클릭하여 고용할 수 있는 의사들의 목록을 보세요.", select_diagnosis_rooms = "점멸하는 아이콘을 왼쪽 클릭하여 진단 시설들의 목록을 보세요.", select_receptionists = "점멸하는 아이콘을 클릭하여 고용할 수 있는 접수원들의 목록을 보세요. 아이콘에 적힌 숫자는 몇 명의 접수원 중에서 고를 수 있는지를 나타냅니다.", order_one_reception = "점멸하는 아이템을 왼쪽 클릭하여 접수대를 하나 주문하세요.", choose_receptionist = "어느 접수원이 괜찮은 능력을 가졌으며 적절한 급료를 원하는지 정한 후에 점멸하는 아이콘을 클릭하여 고용하세요.", prev_receptionist = "점멸하는 아이콘을 왼쪽 클릭하여 고용 가능한 이전 접수원을 확인하세요.", accept_purchase = "점멸하는 아이콘을 왼쪽 클릭하여 구매하세요.", place_door = "청사진상의 벽 주위로 마우스를 움직여서 원하는 곳에 출입문을 배치하세요.", click_and_drag_to_build = "진료실을 짓기 위해서는 우선 얼마나 크게 지을 것인지를 결정해야 합니다. 왼쪽 마우스 버튼을 클릭한 채로 드래그 하여 방의 크기를 결정하세요.", room_in_invalid_position = "이런! 이 청사진은 부적절합니다 - 붉은 영역은 병원의 벽 밖으로 나갔거나 다른 방과 겹치는 부분을 나타냅니다.", place_objects = "오른쪽 클릭으로 기물을 회전시키고, 왼쪽 클릭으로 기물을 배치하세요.", room_too_small = "이 방의 청사진은 너무 작기 때문에 붉은 색으로 표시됩니다. 드래그 하여 방을 더 크게 만드세요.", click_gps_office = "점멸하는 아이템을 왼쪽 클릭해서 진료실을 선택하세요.", reception_invalid_position = "접수대가 회색으로 표시되는 이유는 배치할 수 없는 위치에 있기 때문입니다. 다른 곳으로 옮기거나 회전시켜 보세요.", next_receptionist = "이 사람이 목록의 첫 번째 접수원입니다. 점멸하는 아이콘을 왼쪽 클릭해서 다음 사람을 확인하세요.", room_big_enough = "이제 청사진이 충분히 큽니다. 마우스 버튼을 놓으면 방이 배치됩니다. 원한다면 이 상태에서 방의 위치를 옮기거나 크기를 변경할 수도 있습니다.", object_in_invalid_position = "이 기물은 잘못된 위치에 있습니다. 다른 곳으로 옮기거나 회전시켜서 기물이 들어맞도록 조정하세요.", door_in_invalid_position = "아차! 잘못된 위치에 출입문을 설치하려고 했군요. 청사진 벽의 다른 곳에 시도해 보세요.", place_doctor = "의사를 병원 내의 아무 곳에나 배치하세요. 진료받을 환자가 생기면 의사가 알아서 진료실로 이동할 것입니다.", }, epidemic = { hurry_up = "전염병이 지금 당장 해결되지 않으면, 당신은 곤경에 처하게 될 겁니다. 빨리 빨리 움직이세요!", serious_warning = "그 전염성 질병은 점점 심각해 지고 있습니다. 빠른 시간 내에 뭔가 조치를 취해야 합니다!", multiple_epidemies = "두 가지 이상의 전염병이 동시에 돌고 있는 것 같네요. 어마어마한 재앙이 될지 모르니 신속하게 움직이세요.", }, staff_advice = { need_handyman_machines = "병원 내에 있는 기계 장치들을 정비하려면 잡역부를 고용해야 합니다.", need_doctors = "의사가 더 많이 필요합니다. 당신의 가장 뛰어난 의사들을 대기열이 긴 방에 배치하도록 해 보세요.", need_handyman_plants = "화초에 물을 주려면 잡역부를 고용해야 합니다.", need_handyman_litter = "사람들이 병원에 쓰레기를 버리기 시작했습니다. 잡역부를 고용해서 바닥을 청소하도록 하세요.", need_nurses = "간호사가 더 필요합니다. 병동과 약국에는 간호사가 필요합니다.", too_many_doctors = "의사가 너무 많습니다. 몇몇에게는 아예 할 일이 배정되지 않았습니다.", too_many_nurses = "간호가를 너무 많이 고용한 것 같습니다.", }, earthquake = { damage = "지진이 %d 개의 기계 장치와 %d 명의 사람들에게 피해를 입혔습니다.", alert = "지진 경보. 지진이 일어나면 기계 장치들이 피해를 입게 됩니다. 제대로 정비되지 않은 기계들은 부서지는 수도 있습니다.", ended = "휴. 거대한 지진이었네요. 리히터 척도로 진도 %d 의 지진이었습니다.", }, multiplayer = { everyone_failed = "마지막 목표를 아무도 달성하지 못했습니다. 따라서 모두가 계속해서 플레이 합니다!", players_failed = "다음 플레이어가 마지막 목표를 달성하지 못했습니다:", poaching = { in_progress = "이 사람이 당신과 함께 일하기 원하는지 알아보겠습니다.", not_interested = "허 참! 그들은 당신과 일하는 데에 별 관심이 없군요 - 지금 있는 곳이 만족스럽답니다.", already_poached_by_someone = "이런! 다른 사람이 이미 이 사람에게 접촉중입니다.", }, }, surgery_requirements = { need_surgeons_ward_op = "수술을 위해서 두 명의 외과 의사를 고용하고, 병동과 수술질을 지어야 합니다.", need_surgeon_ward = "외과 의사를 한 명 더 고용하고 병동을 지어야 수술을 시작할 수 있습니다.", }, vomit_wave = { started = "병원에 구토 바이러스가 퍼진 것 같네요. 애초에 병원을 깨끗하게 관리했다면 벌어지지 않았을 일입니다. 잡역부를 더 고용해야 할 것 같습니다.", ended = "휴! 구토를 유발하던 바이러스가 거의 잡힌 것 같네요. 앞으로 병원을 깨끗하게 유지하세요.", }, cheats = { th_cheat = "축하합니다, 치트를 해제했습니다!", roujin_on_cheat = "로우진의 도전이 활성화 되었습니다! 행운을 빌어요...", roujin_off_cheat = "로우진의 도전이 비활성화 되었습니다.", }, level_progress = { halfway_lost = "레벨 패배 조건에 절반정도 도달했습니다.", dont_kill_more_patients = "더 이상 환자들을 죽게 하면 안됩니다!", another_patient_killed = "이런! 또다른 환자가 사망했군요. 지금까지 총 %d 명의 환자가 사망했습니다.", halfway_won = "이 레벨을 승리하는 데 절반정도 왔습니다.", close_to_win_increase_value = "승리가 눈앞에 있습니다. 병원 가치를 %d 만큼 끌어올리세요.", financial_criteria_met = "이 레벨의 재정 관련 목표는 모두 달성했습니다. 은행 잔고를 %d 이상으로 유지하고 병원이 효율적으로 돌아가도록 신경쓰세요.", nearly_won = "이 레벨을 거의 승리했습니다.", hospital_value_enough = "병원 가치를 %d 이상으로 유지하면서 다른 문제들을 해결하면 승리할 수 있습니다.", another_patient_cured = "잘 했어요 - 또 한 명의 환자를 치료했군요. 지금까지 총 %d 명을 치료했습니다.", three_quarters_lost = "이 레벨을 패배하는데 3/4 정도 왔습니다.", reputation_good_enough = "좋아요, 당신의 평판은 레벨을 클리어하기에 충분할 정도로 올라갔습니다. %d 이상으로 유지하면서 다른 문제들을 해결하면 승리할 수 있습니다.", cured_enough_patients = "충분한 수의 환자들을 치료했지만, 병원을 더 잘 운영해야 승리할 수 있습니다.", nearly_lost = "이 레벨을 거의 실패했습니다.", improve_reputation = "당신은 평판을 %d 만큼 더 올려야 이 레벨을 승리할 수 있습니다.", three_quarters_won = "이 레벨을 승리하는 데 3/4 정도 왔습니다.", }, staff_place_advice = { receptionists_only_at_desk = "접수원들은 접수대에서만 일할 수 있습니다.", only_psychiatrists = "의사들은 정신과 자격이 있는 경우에만 정신과실에서 일할 수 있습니다.", only_surgeons = "의사들은 외과 자격이 있는 경우에만 수술실에서 일할 수 있습니다.", only_nurses_in_room = "간호사들만이 %s에서 일할 수 있습니다.", only_doctors_in_room = "의사들만이 %s에서 일할 수 있습니다.", only_researchers = "의사들은 연구 자격이 있는 경우에만 연구소에서 일할 수 있습니다.", nurses_cannot_work_in_room = "간호사는 %s에서 일할 수 없습니다.", doctors_cannot_work_in_room = "의사는 %s에서 일할 수 없습니다.", }, room_forbidden_non_reachable_parts = "방을 이 곳에 배치하면 당신의 병원의 사람들이 갈 수 없는 지역이 생기게 됩니다.", research = { machine_improved = "%s 기계가 연구소에서 개선되었습니다.", autopsy_discovered_rep_loss = "당신의 자동 부검 기계가 발명되었습니다. 대중에게서 부정적인 반응이 나올 것은 각오하세요.", drug_fully_researched = "%s 약을 100% 연구했습니다.", new_machine_researched = "새로운 %s 기계가 성공적으로 연구되었습니다.", drug_improved = "%s 약이 연구소에서 개선되었습니다.", drug_improved_1 = "%s 약이 연구소에서 개선되었습니다.", new_available = "새로운 %s 을(를) 사용할 수 있습니다.", new_drug_researched = "%s 질병의 치료약이 연구되었습니다.", }, boiler_issue = { minimum_heat = "아, 거기 계셨군요. 지하의 보일러가 고장입니다. 병원 안의 사람들이 한동안 춥겠군요.", maximum_heat = "지하의 보일러가 발광하고 있습니다. 라디에이터 출력이 최대로 고정되어 버렸습니다. 사람들이 녹아내리기 시작할 겁니다! 음료 자판기를 더 설치하는 것이 도움이 될 지도 모릅니다.", resolved = "좋은 소식입니다. 보일러와 라디에이터가 다시 정상적으로 작동하시 시작했습니다. 환자들과 직원들을 위한 실내 온도가 적절히 유지될 것입니다.", }, competitors = { staff_poached = "당신의 직원 중 한 명이 다른 병원으로부터 스카웃 당했습니다.", hospital_opened = "%s 지역에 경쟁 병원이 개원했습니다.", land_purchased = "%s 이(가) 약간의 토지를 매입했습니다.", }, room_requirements = { research_room_need_researcher = "연구실을 사용하기 위해서는 연구 능력을 갖춘 의사를 고용해야 합니다.", op_need_another_surgeon = "수술실을 사용하기 위해서는 외과 의사가 한 명 더 필요합니다.", op_need_ward = "환자들이 수술을 받으려면 먼저 병동을 지어서 수술전 처방을 받도록 해야 합니다.", reception_need_receptionist = "환자들을 보려면 먼저 접수원을 고용해야 합니다.", psychiatry_need_psychiatrist = "정신과실을 지었으니 이제 정신과 의사를 고용해야 합니다.", pharmacy_need_nurse = "그 약국을 돌아가게 하려면 간호사를 고용해야 합니다.", ward_need_nurse = "이 병동에서 일할 간호사를 고용해야 할 것입니다.", op_need_two_surgeons = "수술실에서 수술을 진행하려면 두 명의 외과 의사를 고용하세요.", training_room_need_consultant = "그 교육실에서 의사들을 훈련시키려면 전문의를 고용해서 강의하게 해야 합니다.", gps_office_need_doctor = "의사를 고용해서 진료실에서 일하도록 하세요.", }, goals = { win = { money = "%d 만큼 더 벌어야 이 레벨의 재정 조건을 만족할 수 있습니다.", cure = "%d 명의 환자를 더 치료하면 이 레벨을 승리하는데 필요한 수를 채우게 됩니다.", reputation = "당신의 평판을 %d 까지 올려서 승리 조건을 만족하세요.", value = "당신은 병원의 가치를 %d 만큼 올려야 합니다.", }, lose = { kill = "%d 명의 환자를 더 죽이게 되면 이 레벨을 실패하게 됩니다!", }, }, warnings = { bankruptcy_imminent = "이봐요! 당신 지금 파산으로 치닫고 있습니다. 조심하세요!", build_staffroom = "지금 당장 직원 휴게실을 지어주세요. 당신의 직원들은 너무 과하게 일하고 있고 부서지기 직전입니다. 상식적으로 생각을 좀 해보세요!", build_toilet_now = "지금 화장실을 지으세요. 사람들은 더 이상 참지 못하고 있습니다. 웃지 마요, 지금 심각합니다.", build_toilets = "지금 당장 화장실을 짓지 않으면 굉장히 불쾌한 것을 보게될지도 모릅니다. 그리고 당신의 병원에 어떤 냄새가 날지 한 번 상상해 보세요.", cannot_afford = "그 사람을 고용할만큼의 충분한 돈이 없습니다!", cannot_afford_2 = "그것을 구매할만큼 충분한 돈이 은행에 없습니다!", cash_low_consider_loan = "당신 현금 사정이 매우 좋지 않네요. 대출은 고려해 보셨습니까?", change_priorities_to_plants = "잡역부들의 업무 우선순위를 바꿔서 화초에 물을 잘 주도록 해야 합니다.", charges_too_high = "당신은 너무 많이 청구하고 있습니다. 단기적으로 보면 이윤이 많이 남겠지만, 결과적으로 환자들을 많이 잃게 될 것입니다.", charges_too_low = "당신은 환자들에게 너무 적게 청구하고 있습니다. 물론 더 많은 사람들이 병원에 방문하겠지만, 각 환자로부터 얻는 이득은 미미할 것입니다.", deal_with_epidemic_now = "그 전염병이 지금 당장 처리되지 않으면, 못볼 꼴을 보게 될 겁니다. 당장 움직여요!", desperate_need_for_watering = "당신의 화초들을 돌볼 잡역부가 절실히 필요합니다.", doctor_crazy_overwork = "이런! 당신의 의사들중 한 명이 과로로 인해 정신이 나갔습니다. 당장 쉬게 해주면 회복될 수 있을 것입니다.", doctors_tired = "당신의 의사들은 많이 지쳤습니다. 가끔씩 쉬게끔 해 주세요.", doctors_tired2 = "의사들이 말도 안되게 지쳐있습니다. 그들은 즉시 휴식을 취해야 합니다.", epidemic_getting_serious = "그 전염성 질병이 점점 심각해지고 있습니다. 당장 뭔가 해줘야 합니다!", falling_1 = "이봐요! 그거 장난이 아니에요. 마우스로 어디를 클릭하는지 잘 보세요. 누군가 다칠 수도 있어요!", falling_2 = "그만 장난치세요, 그러면 좋아요?", falling_3 = "아야, 다쳤잖아요, 누가 의사좀 불러줘!", falling_4 = "여긴 병원이지 놀이 공원이 아니에요!", falling_5 = "여긴 사람들을 넘어뜨리는 곳이 아니에요. 아픈 사람들이라고요, 알잖아요!", falling_6 = "여긴 볼링장이 아니에요. 아픈 사람들을 그렇게 다루면 안돼요!", financial_trouble = "당신은 지금 심각한 재정난을 겪고 있습니다. 재정 상황을 당장 확인하세요! %d 만큼 더 손해를 보면 이 레벨에 실패하게 될겁니다!", finanical_trouble2 = "돈이 더 들어오도록 하지 않으면 당신은 완전히 쓸모없어질 것입니다. %d 만큼을 더 잃으면 이 레벨을 실패하게 됩니다.", financial_trouble3 = "당신의 은행 잔고가 불안해 보이는군요. 돈을 더 벌도록 하세요. 실패하는데 %d 밖에 남지 않았습니다.", handymen_tired = "잡역부들이 많이 지쳤습니다. 좀 쉬게 해주세요.", handymen_tired2 = "잡역부들이 완전히 기진맥진 했습니다. 지금 당장 어떻게든 좀 쉬게 해주세요.", hospital_is_rubbish = "사람들이 공공연하게 당신의 병원이 지저분하다고 말하고 다닙니다. 이대로라면 사람들이 점점 다른 병원을 찾게 될 것입니다.", litter_catastrophy = "쓰레기 상황이 아주 지옥같습니다. 지금 잡역부 팀을 꾸려서 쓰레기들을 정리하도록 하세요!", litter_everywhere = "온통 쓰레기 천지입니다. 잡역부에게 일을 좀 시키세요.", machine_severely_damaged = "%s 기계가 고칠 수 없는 상황에 거의 다다랐습니다.", machines_falling_apart = "당신의 기계들이 고장나고 있습니다. 지금 당장 잡역부들이 고치도록 하세요!", machinery_slightly_damaged = "병원의 기계들이 약간 손상되었습니다. 어느 시점에서 수리해 주는 것을 잊지 마세요.", machinery_deteriorating = "당신의 기계 장치들이 지나친 사용으로 악화되고 있습니다. 주의 깊게 지켜보세요.", machinery_damaged = "당신의 기계들을 빠른 시일 내에 수리하세요. 고장나기 시작하는데 그리 오래 걸리지 않을겁니다.", machinery_damaged2 = "잡역부를 고용해서 어서 기계들을 수리해주어야 합니다.", machinery_very_damaged = "긴급상황! 지금 당장 잡역부를 불러서 기계들을 수리하세요! 폭발하기 직전입니다!", many_epidemics = "둘 이상의 전염병이 동시에 돌고 있는 것으로 보이는군요. 이거 아주 엄청난 재난이 될지도 모르니 어서 조치를 취하세요.", many_killed = "지금까지 %d 명의 환자를 죽였군요. 알고 있겠지만 더 잘 해야 합니다.", money_low = "돈이 거의 바닥나고 있습니다!", money_very_low_take_loan = "은행 잔고가 절망적으로 낮습니다. 필요하다면 대출을 할 수도 있습니다.", more_benches = "벤치를 더 배치하는 것을 고려해 보세요. 아픈 사람들은 서서 기다려야 하는 것을 원망합니다.", more_toilets = "화장실이 더 필요합니다. 사람들에게 변비가 생기고 있어요.", need_staffroom = "직원 휴게실을 지어서 직원들이 쉴 수 있게 해 주세요.", need_toilets = "환자들이 화장실을 필요로 합니다. 쉽게 접근할 수 있는 곳에 배치해 주세요.", no_desk = "어느 시점에는 반드시 접수대를 배치하고 접수원을 고용해야 합니다!", no_desk_1 = "환자들이 병원에 방문하도록 하려면, 접수원을 고용하고 접수원이 일할 접수대를 마련해 주어야 합니다!", no_desk_2 = "아주 좋~아요, 아마 세계 기록이겠군요: 1년이 다 되어가는데 환자가 한 명도 없다니! 이 병원의 관리자로 계속 남고 싶다면, 접수원을 고용하고 접수대를 설치해주어야 할 겁니다!", no_desk_3 = "아주 끝내주는군요, 1년이 다 되었는데 접수원조차 없다니! 환자가 방문하길 바라기는 하는건지 모르겠군요. 어서 해결하세요!", no_desk_4 = "접수원은 방문하는 환자들을 안내하기 위해서 일할 장소가 필요합니다.", no_desk_5 = "흠, 이제 시간이 되었군요. 이제 곧 환자들이 방문하는 것을 볼 수 있을 것입니다!", no_desk_6 = "접수원을 고용했으니, 이제 접수원이 일할 접수대를 설치해주는 것이 어때요?", no_desk_7 = "접수대를 설치했으니 이제 접수원을 고용하는 것이 어때요? 아시겠지만 이게 제대로 해결되지 않으면 환자들이 방문하지 않을겁니다!", no_patients_last_month = "지난 달에 새로운 환자가 한 명도 오지 않았습니다. 충격이네요!", nobody_cured_last_month = "지난달에는 정말 아무도 치료하지 못했군요.", nurse_needs_desk_1 = "각 간호사는 일할 책상이 필요합니다.", nurse_needs_desk_2 = "당신의 간호사는 당신이 허락한 휴식에 즐거워하고 있습니다. 병동에 두 명 이상의 간호사가 일하도록 하려면 한 사람당 책상 하나씩을 배치해 주어야 합니다.", nurses_tired = "간호사들이 지쳤습니다. 좀 쉬게 해주세요.", nurses_tired2 = "간호사들이 매우 지쳤습니다. 지금 바로 휴식을 취하게 해주세요.", patient_leaving = "환자가 떠나고 있군요. 이유가 뭐냐고요? 당신 병원의 형편없는 운영과 불친절한 직원들, 부족한 설비 때문이죠.", patient_stuck = "누군가가 길을 잃었네요. 병원 설계를 좀 더 잘 해보세요.", patients_annoyed = "사람들은 당신이 병원을 운영하는 방식에 굉장히 불만이 많습니다. 그 사람들을 뭐라고 할 수가 없네요. 제대로 관리하거나 아니면 그에 따르는 결과를 직면하세요!", patients_getting_hot = "환자들이 굉장히 더워하고 있습니다. 온도를 낮추거나 라디에이터가 너무 많다면 조금씩 제거해주세요.", patients_leaving = "환자들이 떠나고 있습니다. 화초, 벤치, 자판기 등을 더 설치해서 병원을 방문하는 사람들에게 좋은 인상을 주세요.", patients_really_thirsty = "환자들이 매우 목마릅니다. 음료 자판기를 더 설치하거나, 긴 대기열 주변으로 위치를 옮겨보세요.", patients_thirsty = "사람들이 목말라 하고 있습니다. 자판기를 더 설치해면 좋을 것 같네요.", patients_thirsty2 = "사람들이 목마르다고 불평하고 있습니다. 자판기를 더 설치하거나 이미 있는 자판기들을 사람들 근처로 옮겨 보세요.", patients_too_hot = "환자들이 너무 더워합니다. 라디에이터들을 좀 제거하거나, 온도를 낮추거나, 아니면 음료 자판기들을 더 많이 배치해 주세요.", patients_unhappy = "환자들이 당신의 병원을 싫어합니다. 병원 환경을 개선하기 위해서 뭔가 해야 합니다.", patients_very_cold = "환자들이 매우 추워합니다. 난방을 올리거나 병원에 라디에이터를 더 많이 배치하세요.", patients_very_thirsty = "환자들이 심각한 갈증을 느끼고 있습니다. 어서 음료 자판기를 설치하지 않으면, 사람들이 콜라를 마시러 집으로 돌아가버릴지도 모릅니다.", pay_back_loan = "돈이 많이 쌓여있습니다. 대출금을 상환하는 것은 어떤가요?", people_did_it_on_the_floor = "몇몇 환자들이 생리현상을 참지 못했군요. 치우려면 누군가가 고생하겠네요.", people_freezing = "놀랍군요. 이런 중앙 난방의 시대에 얼어죽을만큼 추워하는 환자들이 있다니요. 라디에이터들을 더 설치하고 온도를 높여서 환자들을 따뜻하게 해주세요.", people_have_to_stand = "앓고 있는 사람들이 서서 기다려야 합니다. 지금 당장 앉을 자리를 더 만들어 주세요.", place_plants_to_keep_people = "사람들이 떠나고 있습니다. 화초들을 배치하면 그들이 머물도록 설득하는 데 도움이 될 수 있습니다.", place_plants2 = "사람들이 나가고 있습니다. 화초를 더 많이 배치하면 그들을 여기 좀 더 오래 머물게 할 수 있을지도 모릅니다.", place_plants3 = "환자들의 불행해 하고 있습니다. 화초를 좀 더 배치해서 기분을 풀어주세요.", place_plants4 = "더 많은 화초로 이 곳 주변의 환자들을 격려해 주세요.", plants_dying = "화초들이 죽어갑니다. 물을 절실히 필요로 하고 있습니다. 잡역부들을 시켜서 물을 주게 하세요. 환자들은 죽은 화초를 보고 싫어 합니다.", plants_thirsty = "화초를 좀 돌봐야 하겠습니다. 화초들이 목말라 하고 있어요.", queue_too_long_at_reception = "접수대에서 안내를 기다리는 환자들이 너무 많습니다. 접수대를 추가로 설치하고 접수원을 새로 고용하세요.", queue_too_long_send_doctor = "당신의 %s 대기열이 너무 깁니다. 방에 의사가 있는지 반드시 확인하세요.", queues_too_long = "대기열이 너무 깁니다.", reception_bottleneck = "접수대가 병목이 되고 있습니다. 접수원을 더 고용하세요.", receptionists_tired = "접수원들이 심하게 지쳤습니다. 지금 바로 쉬게 해주세요.", receptionists_tired2 = "접수원들이 많이 피로한 상태입니다. 바로 휴식을 좀 취하게 해주세요.", reduce_staff_rest_threshold = "직원들이 더 자주 휴식을 취할 수 있도록, 정책 화면에서 직원 휴식 문턱을 낮춰보세요. 그냥 아이디어 입니다.", research_screen_open_1 = "연구 화면을 사용하려면 먼저 연구실을 지어야 합니다.", research_screen_open_2 = "이 레벨에서는 연구 기능을 사용할 수 없습니다.", researcher_needs_desk_1 = "연구원에게는 일할 책상이 필요합니다.", researcher_needs_desk_2 = "당신의 연구원은 당신이 쉴 수 있도록 해준 것에 감사하고 있습니다. 더 많은 연구원을 배치하고 싶었던 것이라면, 한 사람당 책상 하나씩을 배치해 주어야 합니다.", researcher_needs_desk_3 = "각각의 연구원은 자신이 일할 책상이 있어야 합니다.", some_litter = "잡역부는 쓰레기 문제가 심각해지기 전에 그것들을 없앨 수 있습니다.", staff_overworked = "당신의 직원은 심각하게 과로한 상태입니다. 그들은 점점 비효율적이 되어 가고 끔찍한 실수들을 저지르기 시작할 겁니다.", staff_tired = "당신의 직원들이 말도안되게 지쳤습니다. 직원 휴게실에서 쉬게 해주지 않으면 그들이 무리해서 완전히 녹초가 되어버릴 겁니다.", staff_too_hot = "당신의 직원들이 과열되고 있습니다. 난방을 낮추거나 방에 배치한 라디에이터들을 제거하세요.", staff_unhappy = "직원들이 불행합니다. 보너스를 지급해 주거나, 아니면 직원 휴게실을 지어 주는 것이 더 낫겠습니다. 또한 병원 정책 화면에서 직원 휴식 정책을 조정할 수도 있습니다.", staff_unhappy2 = "당신의 직원들은 이래저래 불만입니다. 그리고 곧 돈을 더 달라고 요구하게 될 겁니다.", staff_very_cold = "직원들이 춥다고 불평하고 있습니다. 난방을 올리거나 라디에이터를 더 설치하세요.", too_many_plants = "화초가 지나치게 많습니다. 이거 뭐 완전히 정글이네요.", too_much_litter = "바닥의 쓰레기가 문제가 되고 있습니다. 잡역부를 더 고용하는 것이 답이겠지요.", }, placement_info = { door_can_place = "원한다면 문을 여기에 설치할 수 있습니다.", door_cannot_place = "죄송하시만 문을 여기에 설치할 수 없습니다.", window_can_place = "창문을 여기 설치할 수 있습니다.", window_cannot_place = "아. 여기에는 창문을 설치할 수 없습니다.", object_can_place = "이 물건을 여기 배치할 수 있습니다.", object_cannot_place = "저기, 여기에는 이 물건을 배치할 수 없습니다.", reception_can_place = "이 접수대를 여기 설치할 수 있습니다.", reception_cannot_place = "이 접수대는 여기에 설치할 수 없습니다.", staff_can_place = "이 직원을 여기 배치할 수 있습니다.", staff_cannot_place = "미안하지만, 이 직원을 여기 배치할 수 없습니다.", room_cannot_place = "이 방을 여기 배치할 수 없습니다.", room_cannot_place_2 = "이 방을 여기 배치할 수 없습니다.", }, praise = { many_benches = "환자들을 앉힐 의자가 충분하군요. 잘했어요.", many_plants = "멋지군요. 화초가 아주 많네요. 환자들이 좋아할 겁니다.", plants_are_well = "화초들을 잘 관리하고 있군요. 아주 좋아요.", few_have_to_stand = "병원 내의 사람들이 서 있어야 하는 일이 거의 없군요. 환자들이 기뻐할 것입니다.", plenty_of_benches = "앉을 자리가 충분하니 문제 없을 겁니다.", plants_thriving = "아주 좋아요. 화초들이 무럭무럭 자라고 있군요. 아주 멋져 보입니다. 계속 잘 관리한다면 상을 받을 수도 있겠군요.", patients_cured = "%d 명의 환자가 치료되었습니다.", }, information = { larger_rooms = "방이 크면 클수록 직원들이 자신을 중요하게 여기며 성과가 올라갑니다.", extra_items = "방에 있는 추가저인 기물들은 직원들을 편안하게 하며 그들의 성과를 높입니다.", epidemic = "당신의 병원에 전염병이 들어왔습니다. 당장 조치를 취해야 합니다!", promotion_to_doctor = "당신의 수련의중 한 명이 전공의가 되었습니다.", emergency = "응급 상황입니다! 어서 움직여요! 어서!", patient_abducted = "환자들중 한 명이 외계인에 의해 납치되고 있습니다.", first_cure = "잘 했습니다! 첫 환자를 치료했군요.", promotion_to_consultant = "당신의 전공의중 한 명이 전문의가 되었습니다.", handyman_adjust = "당신은 잡역부의 업무 우선순위를 조정해서 더욱 효과적으로 일하도록 할 수 있습니다.", promotion_to_specialist = "당신의 의사중 한 명이 %s로 승진했습니다.", initial_general_advice = { rats_have_arrived = "병원에 쥐가 창궐했습니다. 마우스로 쥐들을 날려버리세요.", autopsy_available = "자동 부검 기계가 연구되었습니다. 이것으로 문제를 일삼거나 귀찮은 환자를 처치할 수 있고, 남은 것으로 연구도 진행할 수 있습니다. 주의하세요 - 이 기계를 사용하면 엄청난 물의를 일으키게 될 겁니다.", first_patients_thirsty = "병원 내에 목말라하는 사람들이 있습니다. 그런 사람들을 위해 음료 자판기들을 배치하세요.", research_now_available = "당신의 첫 연구실을 지었군요. 이제 당신은 연구 화면을 사용할 수 있습니다.", psychiatric_symbol = "정신과 훈련을 받은 의사들은 다음과 같은 표식을 지닙니다: |", decrease_heating = "병원이 너무 덥습니다. 난방을 좀 낮추세요. 마을 지도 화면에서 조절할 수 있습니다.", surgeon_symbol = "수술을 집도할 수 있는 의사들은 다음과 같은 표식을 지닙니다: {", first_emergency = "응급 환자들의 머리 위에는 파란 불이 깜빡거립니다. 그들이 사망하기 전에, 혹은 제한된 시간이 지나기 전에 치료하세요.", first_epidemic = "병원에 전염병이 돌기 시작했군요! 이 사실을 숨긴채 조용히 처리할지, 아니면 사실대로 공개할지 결정하세요.", taking_your_staff = "누군가가 당신의 직원을 꼬시고 있습니다. 직원들을 뺏기지 않으려면 싸워야 할 겁니다.", place_radiators = "병원이 너무 춥습니다 - 복도 기물 메뉴에서 추가로 라디에이터를 주문해서 병원에 배치할 수 있습니다.", epidemic_spreading = "병원에 전염병이 돌고 있습니다. 감염된 환자들이 떠나기 전에 치료하도록 시도하세요.", research_symbol = "연구 능력이 있는 의사들은 다음과 같은 표식을 지닙니다: }", machine_needs_repair = "수리가 필요한 기계가 있습니다. 우선 기계를 찾아낸 뒤 - 연기가 나고 있을 거예요 - 클릭하세요. 그런 뒤 잡역부 버튼을 누르세요.", increase_heating = "사람들이 추워합니다. 마을 지도 화면으로 가서 난방을 올리세요.", first_VIP = "당신의 첫 VIP가 곧 방문할 예정입니다. VIP가 비위생적인 모습이나 불행해보이는 환자를 보지 못하도록 주의를 기울이세요.", }, patient_leaving_too_expensive = "환자가 %s 의 비용을 지불하지 않고 병원을 떠납니다. 너무 비싸요.", vip_arrived = "조심하세요! - %s 이(가) 당신의 병원을 방문했습니다! 모든 것이 원만하게 돌아가도록 하고 그를 만족시키세요.", epidemic_health_inspector = "보건부에 당신의 전염병 상황이 보고되었습니다. 건강 감시관의 방문에 대비하세요.", first_death = "첫 번째 환자를 죽였군요. 기분이 어때요?", pay_rise = "직원중 한 명이 그만두겠다고 협박하고 있습니다. 요구를 들어줄지 해고해 버릴지 결정하세요. 왼쪽 아래에 있는 아이콘을 클릭해서 어떤 직원이 협박하고 있는지 확인하세요.", place_windows = "창문을 배치하면 방이 밝아지고 직원의 사기가 올라갑니다.", fax_received = "화면 왼쪽 아래에 방금 나타난 아이콘은 중요한 정보 혹은 당신이 결정해야할 상황을 알려줍니다.", }, build_advice = { placing_object_blocks_door = "그 물건을 거기 배치하면 사람들이 문을 사용하지 못하게 됩니다.", blueprint_would_block = "그 청사진은 다른 방을 가로막을 겁니다. 방의 크기를 조절하거나 다른 곳으로 옮기세요!", door_not_reachable = "사람들은 그 문을 사용할 수 없을 것입니다. 생각을 해보세요.", blueprint_invalid = "올바른 청사진이 아닙니다.", }, } update_window = { new_version = "새 버전:", caption = "업데이트 가능!", download = "다운로드 페이지로 이동", current_version = "현재 버전:", ignore = "건너 뛰고 메인 메뉴로 이동", } calls_dispatcher = { repair = "%s 을(를) 수리", summary = "%d 건의 요청; %d 건 할당됨", close = "닫기", watering = "%d,%d 에서 물주는 중", staff = "%s - %s", } information = { cheat_not_possible = "이 레벨에서는 해당 치트를 사용할 수 없습니다. 치트하면서까지 실패하네요, 웃기지 않아요?", very_old_save = "이 레벨을 시작한 이후로 수많은 업데이트가 있었습니다. 모든 기능이 원활히 동작하게 하려면 재시작하는 것을 권합니다.", no_custom_game_in_demo = "죄송합니다. 데모 버전에서는 커스텀 맵을 플레이할 수 없습니다.", cannot_restart = "안타깝지만, 이 커스텀 게임은 재시작 기능이 구현되기 전에 만들어졌습니다.", custom_game = "CorsixTH 에 오신 것을 환영합니다. 이 커스텀 맵을 마음껏 즐겨주세요!", level_lost = { [1] = "이런! 당신은 이 레벨을 실패했습니다. 다음 기회에!", [2] = "실패한 이유:", reputation = "당신의 평판이 %d 아래로 떨어졌습니다.", balance = "당신의 은행 잔고가 %d 아래로 떨어졌습니다.", percentage_killed = "당신은 %d 퍼센트보다 많은 환자를 사망하게 했습니다.", cheat = "당신이 일부러 그랬거나 버튼을 잘못 눌렀나봐요? 치트도 하나 제대로 못하다니 어이없죠?", }, } new_game_window = { hard = "전문의 (어려움)", cancel = "취소", tutorial = "튜토리얼", option_on = "켜짐", option_off = "꺼짐", difficulty = "난이도", easy = "수련의 (쉬움)", caption = "캠페인", player_name = "플레이어 이름", start = "시작", medium = "전공의 (보통)", } casebook = { sent_home = "돌려 보냄", deaths = "치사", treatment_charge = "치료 비용", reputation = "평판", research = "집중 연구", cure = "치료방법", cured = "치료", earned_money = "벌어들인 돈", cure_desc = { hire_doctors = "당신은 의사들을 고용해야 합니다.", hire_psychiatrists = "당신은 정신과 의사를 고용해야 합니다.", hire_surgeons = "당신은 외과 의사들을 고용해야 합니다.", hire_nurses = "간호사들을 고용해야 합니다.", build_ward = "당신은 여전히 병동을 지어야 합니다.", no_cure_known = "알려진 치료법 없음.", improve_cure = "치료법 개선.", cure_known = "치료 가능.", build_room = "%s 을(를) 지을 것을 추천합니다.", }, } handyman_window = { all_parcels = "모든 구획", parcel = "구획", } folders_window = { screenshots_location = "스크린샷을 저장할 디렉토리를 선택하세요", music_label = "MP3들", back = "뒤로", savegames_label = "저장된 게임들", caption = "폴더 위치", savegames_location = "게임을 저장할 디렉토리를 선택하세요", font_label = "폰트", new_th_location = "여기서 테마 병원 설치 디렉토리를 새로 지정할 수 있습니다. 새 위치를 지정하는 즉시 게임이 재시작 됩니다.", screenshots_label = "스크린샷", music_location = "음악을 재생할 디렉토리를 선택하세요", data_label = "테마 병원 데이터", } customise_window = { movies = "영상 컨트롤", option_on = "켜짐", option_off = "꺼짐", back = "뒤로", paused = "정지 상태에서 건설", intro = "인트로 영상 재생", volume = "음량 감소 단축키", caption = "커스텀 설정", fractured_bones = "골절", average_contents = "일반 비품", aliens = "외계인 환자", } diseases = { alien_dna = { name = "외계 DNA", cause = "원인 - 사람의 얼굴에 달라붙는 지적인 외계 생명의 혈액.", symptoms = "증상 - 서서히 외계 생명체로 변해가며 인간의 도시를 파괴하고 싶은 욕망이 생김.", cure = "치료 - 환자의 DNA 를 기계적으로 추출한 뒤, 외계 요소를 제거하고 다시 집어 넣음.", }, autopsy = { name = "부검", }, baldness = { name = "대머리", cause = "원인 - 인기를 얻기 위해 거짓말을 하고 지어낸 이야기들을 함.", symptoms = "증상 - 반짝이는 머리와 동반되는 부끄러움.", cure = "치료 - 고통스러운 기계를 사용해 환자의 두부에 머리카락을 심음.", }, bloaty_head = { name = "부은 머리", cause = "원인 - 치즈 냄새를 맡고 정수되지 않은 빗물을 마심.", symptoms = "증상 - 굉장히 불편해짐.", cure = "치료 - 팽창된 머리를 뻥 터뜨린 뒤, 똑똑한 기계를 사용해 정확한 압력으로 재 팽창시킴.", }, broken_heart = { name = "가슴 앓이", cause = "원인 - 환자보다 부유하거나 젊고 날씬한 사람.", symptoms = "증상 - 울음과 나들이 사진들을 반복적으로 찢어서 생기는 근육 손상.", cure = "치료 - 외과 의사 두 명이 환자의 흉부를 열고 숨을 참은 채로 조심스레 심장을 고침.", }, broken_wind = { name = "지속성 방귀", cause = "원인 - 식사 직후에 헬스장에서 런닝머신을 뜀.", symptoms = "증상 - 환자 바로 뒤에 있는 사람들을 불편하게 함.", cure = "치료 - 물같은 특수한 물질들을 섞은 혼합 용액을 약국에서 신속하게 마심.", }, chronic_nosehair = { name = "만성 콧털", cause = "원인 - 환자보다 가난한 사람들을 심하게 경멸하며 코웃음 침.", symptoms = "증상 - 오소리가 둥지를 틀어도 될만큼 거대한 콧털.", cure = "치료 - 약국에서 간호사가 조제한 역겨운 모발 제거 물약을 마심.", }, corrugated_ankles = { name = "주름잡힌 발목", cause = "원인 - 도로 상의 서행 표지를 차로 밟고 지나감.", symptoms = "증상 - 신발 등을 신기가 매우 불편해짐.", cure = "치료 - 발목을 펴기 위해 약간의 독성이 있는 허브와 향신료 혼합물을 마심.", }, diag_blood_machine = { name = "혈액 분석기 진단", }, diag_cardiogram = { name = "심전도 진단", }, diag_general_diag = { name = "일반 진단", }, diag_psych = { name = "정신과 진단", }, diag_scanner = { name = "스캐너 진단", }, diag_ultrascan = { name = "울트라스캔 진단", }, diag_ward = { name = "병동 진단", }, diag_x_ray = { name = "X-레이 진단", }, fake_blood = { name = "가짜피", cause = "원인 - 환자가 짓궂은 장난에 너무 쉽게 당함.", symptoms = "증상 - 정맥에 혈액 대신 천에 닿으면 증발하는 붉은 액체가 흐름.", cure = "치료 - 정신과적인 진정이 유일한 해결책.", }, discrete_itching = { name = "간헐성 가려움증", cause = "원인 - 날카로운 이빨을 지닌 작은 곤충.", symptoms = "증상 - 심하게 긁어서 몸 여기저기에 염증이 생김.", cure = "치료 - 피부의 가려움을 방지하기 위해 끈적끈적한 시럽을 마심.", }, fractured_bones = { name = "골절", cause = "원인 - 높은 곳에서 콘크리트 위로 떨어짐.", symptoms = "증상 - 쿵 하는 소리와 함께 부러진 팔/다리를 사용할 수 없게 됨.", cure = "치료 - 깁스를 한 뒤 레이저 기반 제거 기계로 제거함.", }, gastric_ejections = { name = "위액 분출", cause = "원인 - 아주 매운 멕시코, 인도 음식.", symptoms = "증상 - 반쯤 소화된 음식이 환자에게서 닥치는 대로 분출됨.", cure = "치료 - 특수한 경화 용액을 마셔서 토하는 것을 막음.", }, general_practice = { name = "진료", }, golf_stones = { name = "골프 결석", cause = "원인 - 골프공 내부의 독가스에 노출됨.", symptoms = "증상 - 정신 착란 증세와 심각한 수치심.", cure = "치료 - 두 명의 외과 의사가 수술을 통해 결석을 제거해야 함.", }, gut_rot = { name = "썩은 창자", cause = "원인 - O'Malley 부인의 끝내주는 기침약 위스키.", symptoms = "증상 - 기침이 사라지지만, 위장벽의 보호막도 함께 사라짐.", cure = "치료 - 간호사가 적절히 선택한 용해 혼합물로 위장벽을 코팅.", }, hairyitis = { name = "모발 과다증", cause = "원인 - 달빛에 오랫동안 노출됨.", symptoms = "증상 - 환자들은 후각이 굉장히 예민해짐.", cure = "치료 - 전기분해 기계로 모발을 제거하고 모공을 봉함.", }, heaped_piles = { name = "치질", cause = "원인 - 냉각기 주위에 서있음.", symptoms = "증상 - 마치 구슬 주머니 위에 앉아있는 것 같은 느낌을 받음.", cure = "치료 - 기분좋은, 그러나 아주 강력한 산성의 음료를 마셔서 장에 쌓인 물질을 녹임.", }, infectious_laughter = { name = "전염성 웃음병", cause = "원인 - 고전 상황 코메디.", symptoms = "증상 - 끝없이 킥킥거리며 웃고 재미없는 캐치프레이즈를 반목해서 말함.", cure = "치료 - 자격을 갖춘 정신과 의사가 환자에게 지금 상황이 얼마나 심각한지 상기시킴.", }, invisibility = { name = "투명인간", cause = "원인 - 눈에 안보이는 방사능 개미에게 물림.", symptoms = "증상 - 환자는 특별히 불편하지 않음. 사실 많은 환자들은 이 병으로 가족들에게 짓궂은 장난을 침.", cure = "치료 - 약국에서 다채로운 색의 액체를 마시면 곧 눈에 보이게 됨.", }, iron_lungs = { name = "철화된 폐", cause = "원인 - 도시 내의 스모그와 케밥 찌꺼기가 섞여서 생김.", symptoms = "증상 - 불을 뿜거나 깊은 물 속에서 소리지를 수 있음.", cure = "치료 - 두 명의 외과 의사가 수술실에서 폐의 굳은 부분을 제거함.", }, jellyitis = { name = "젤리염", cause = "원인 - 젤라틴 성분이 풍부한 식단과 너무 과한 운동.", symptoms = "증상 - 엄청난 비틀거림과 자주 넘어짐.", cure = "치료 - 특수한 방에서 젤리통에 환자의 몸을 잠시동안 담금.", }, kidney_beans = { name = "콩팥콩", cause = "원인 - 음료수에 든 얼음을 씹어먹음.", symptoms = "증상 - 통증과 잦은 화장실 출입.", cure = "치료 - 두명의 외과 의사가 콩팥을 유지한 채 콩만 제거해내야 함.", }, king_complex = { name = "왕자병", cause = "원인 - 왕의 영혼이 환자의 정신을 지배함.", symptoms = "증상 - 색상이 화려한 스웨이드 신발을 신으며 치즈버거를 먹음.", cure = "치료 - 정신과 의사가 지금 환자가 얼마나 우습게 보이는지 말해줌.", }, pregnancy = { name = "임신", cause = "원인 - 도시 지역의 정전.", symptoms = "증상 - 변덕스럽게 음식을 먹으며 결과적으로 배불뚝이가 됨.", cure = "치료 - 수술실에서 아기를 받아 씻긴 뒤 환자에게 돌려줌.", }, ruptured_nodules = { name = "혹 파열", cause = "원인 - 추운 날씨에 번지 점프를 함.", symptoms = "증상 - 편안하게 앉지를 못함.", cure = "치료 - 두 명의 자격있는 외과 의사가 떨림 없는 손으로 혹을 제거해야 함.", }, serious_radiation = { name = "심각한 방사능 오염", cause = "원인 - 플루토늄 동위 원소를 껌으로 착각함.", symptoms = "증상 - 이 상태의 환자는 아주 많이 기분이 좋지 않음.", cure = "치료 - 환자를 오염제거 샤워기로 깨끗하게 씻어줘야 함.", }, slack_tongue = { name = "늘어진 혀", cause = "원인 - 아침 드라마에 대한 지속적인 과다 논쟁.", symptoms = "증상 - 혀가 원래 크기의 다섯 배 정도로 팽창함.", cure = "치료 - 혀를 절단기에 넣고 효과적이지만 고통스러운 방법으로 재빨리 절단해냄.", }, sleeping_illness = { name = "수면증", cause = "원인 - 입 천장의 수면 분비선의 과활성화.", symptoms = "증상 - 아무데서나 일어나는 압도적인 수면욕.", cure = "치료 - 간호사의 관리 하에 강력한 자극제를 충분히 투약.", }, spare_ribs = { name = "여분의 늑골", cause = "원인 - 차가운 돌바닥에 앉음.", symptoms = "증상 - 가슴 부위의 불편한 느낌.", cure = "치료 - 2명의 외과 의사가 여분의 늑골을 제거한 뒤, 강아지 간식용 봉투에 넣어 환자에게 돌려줌.", }, sweaty_palms = { name = "다한증", cause = "원인 - 구직 면접에 대한 두려움.", symptoms = "증상 - 환자와 악수하는 것이 마치 방금 물에 푹 적신 스펀지를 잡는 것 같음.", cure = "치료 - 정신과 의사가 환자와 대화하여 이 만들어진 병에서 벗어나게 해야 함.", }, the_squits = { name = "설사병", cause = "원인 - 오븐 밑에 떨어져 있던 피자를 섭취.", symptoms = "증상 - 으. 말 안해도 알겠죠.", cure = "치료 - 섬유질 성분의 점성의 액체로 환자의 내부를 굳힘.", }, third_degree_sideburns = { name = "3도 구렛나룻", cause = "원인 - 70년대에 대한 진한 향수", symptoms = "증상 - 풍성한 머리, 나팔바지, 플랫폼과 현란한 화장.", cure = "치료 - 정신과 의사가 최신 기술들을 사용해서 이런 북실북실한 치장은 지저분해 보인다고 확신시켜야 함.", }, transparency = { name = "투과증", cause = "원인 - 열려 있던 항아리 뚜껑에 묻은 요구르트를 핥음.", symptoms = "증상 - 살이 투명해지며 속이 비쳐 끔찍한 모습이 됨.", cure = "치료 - 특수하게 냉각 및 착색된 음료를 약국에서 마심.", }, tv_personalities = { name = "TV 중독", cause = "원인 - 낮시간 텔레비전 프로그램.", symptoms = "증상 - 자신이 요리 프로그램을 상영할 수 있을거라는 착각.", cure = "치료 - 훈련된 정신과 의사가 환자를 설득해서 TV를 팔고 라디오를 구매하도록 함.", }, uncommon_cold = { name = "희한한 감기", cause = "원인 - 공기중에 떠다니는 작은 콧물 방울.", symptoms = "증상 - 흐르는 콧물, 재채기, 변색된 폐.", cure = "치료 - 약국에서 조제한 특이 감기약을 쭉 들이키면 나음.", }, unexpected_swelling = { name = "뜻밖의 팽창", cause = "원인 - 뭔가 예상치 못한 것.", symptoms = "증상 - 팽창.", cure = "치료 - 두 명의 외과 의사가 수술을 통해 팽창된 부분을 찔러서 터뜨리는 수 밖에 없음.", }, } policy = { header = "병원 정책", diag_procedure = "진단 절차", diag_termination = "진단 종료", staff_rest = "직원의 휴식", staff_leave_rooms = "직원이 방을 떠남", sliders = { guess = "추측에 의한 치료", send_home = "돌려 보내기", stop = "절차 중지", staff_room = "직원 휴게실로 이동", }, } options_window = { fullscreen = "전체화면", cancel = "취소", custom_resolution = "커스텀...", option_on = "켜짐", option_off = "꺼짐", back = "뒤로", caption = "옵션", language = "게임 언어", apply = "적용", width = "너비", change_resolution = "해상도 변경", height = "높이", resolution = "해상도", folder = "폴더", audio = "오디오", customise = "커스터마이즈", } trophy_room = { all_cured = { awards = { [1] = "작년 한해 동안 모든 환자들을 성공적으로 치료한 것으로 '마리 퀴리 상 (Marie Curie Award)'을 수상하게 된 것을 축하합니다.", }, trophies = { [1] = "국제 치료 재단은 당신이 작년 한해 동안 모든 사람을 치료했다는 사실을, '전원치료 트로피 (Cure-All Trophy)'를 수여하는 것으로 기리고자 합니다.", [2] = "당신은 작년에 방문한 모든 환자를 치료한 공로로 '무병 가글러 트로피 (No-ill Gargler Trophy)'를 수상했습니다.", }, }, best_value_hosp = { trophies = { [1] = "작년 한해 동안 가장 높은 평가를 받은 병원에게 주어지는 '완전무결 트로피 (SqueakiKlean Trophy)'를 수상하게 된 것을 축하합니다. 당신은 충분히 받을 자격이 있습니다.", }, penalty = { [1] = "주변의 모든 병원이 당신 병원보다 더 가치가 있습니다. 이 수치스러운 상황을 수습해 보세요. 비싼 물건들을 좀 들여놓으세요!", }, regional = { [1] = "게임 내에서 가장 가치 있는 병원을 가진 것을 축하드립니다. 잘 해냈군요. 계속 분발해 주세요.", }, }, consistant_rep = { trophies = { [1] = "금년에 가장 모범이 되며 가장 높은 평판을 유지한 것에 의거, 당신은 '내각 장관 상 (Cabinet Minister's Award)'을 수상했습니다. 훌륭합니다.", [2] = "작년 한해 동안 가장 높은 평가를 받은 병원에게 주어지는 '완전무결 트로피 (SqueakiKlean Trophy)'를 수상하게 된 것을 축하합니다. 당신은 충분히 받을 자격이 있습니다.", }, }, cleanliness = { regional_good = { [1] = "당신의 병원은 지역 내에서 가장 깨끗하지 못한 병원 중 하나로 꼽혔습니다. 지저분한 병원은 냄새나고 위험합니다. 당신은 이 어지러운 것들에 신경을 더 써야 합니다.", }, award = { [1] = "검사관들은 당신의 병원이 매우 청결하다고 평가했습니다. 청결한 병원은 안전한 병원입니다. 계속 힘써주세요.", }, regional_bad = { [1] = "당신의 병원은 지역 내에서 가장 지저분한 병원입니다. 다른 모든 병원 책임자들은 그들의 복도를 더 깨끗하게 유지해 냈습니다. 당신은 의료계의 수치입니다.", }, }, curesvdeaths = { awards = { [1] = "작년 당신의 병원이 인상적인 치료대 사망 비율을 달성한 것에 진심어린 축하를 드립니다.", }, penalty = { [1] = "당신의 치료수 대 사망 수는 극도로 나쁩니다. 죽는 환자의 수 보다 치료하는 환자의 수가 훨씬 많아지도록 유지해야 합니다. 우리를 실망시키지 마세요.", }, }, emergencies = { regional_good = { [1] = "보건부는 작년 한해 동안 당신이 다른 어떤 병원보다 응급상황을 잘 처리한 것을 감사하며 이 상을 수여합니다.", }, penalty = { [1] = "당신은 응급상황을 제대로 처리하지 못했습니다. 응급 환자들에게 필요한 신속하고 정확한 처치를 하는 데 실패했습니다.", }, regional_bad = { [1] = "당신의 병원은 지역 내에서 응급상황을 처리하는데 최악이었습니다. 지역내 응급 처치 순위권에서 최하위로 머물게 된 것은 모두 당신 책임입니다.", }, award = { [1] = "축하합니다: 당신의 신속하고 효과적인 응급 처치가 이 특별 상을 수상하게 했습니다. 잘 했습니다.", [2] = "당신의 응급 처리는 특별합니다. 이 상은 대규모의 환자들을 치료하는 데 절대적으로 최고임을 증명한 당신에게 수여합니다.", }, }, gen_repairs = { awards = { [1] = "당신의 잡역부들이 빈틈없이 병원의 기계 장치들을 정비한 것에 대한 특별 상을 수여합니다. 잘 했습니다. 휴가라도 다녀오세요.", [2] = "당신의 잡역부들은 다른 어떤 병원의 잡역부들 보다 잘 일해주었습니다. 이것은 축하받을 만한 주요 성과입니다.", [3] = "당신의 기계들은 최상의 상태로 정비되었습니다. 잡역부들의 헌신적인 노력은 놀랄 만한 일입니다. 당신은 이 권위있는 상을 받을 자격이 있습니다. 훌륭합니다.", }, penalty = { [1] = "당신의 잡역부들은 기계들을 제대로 정비하지 못했습니다. 그들을 더 잘 관리하거나 좀 더 고용해서 일을 분담시킬 필요가 있을 것 같군요.", [2] = "기계들을 정비하는 데 아주 엉망입니다. 직원들이 설비들을 신속하고 세심하게 정비하도록 해야 합니다.", }, }, happy_patients = { awards = { [1] = "작년 한해 동안 귀하의 병원내의 사람들이 매우 만족했다는 것은 자랑할만 한 일입니다.", [2] = "당신의 병원을 방문하는 사람들은 게임 내의 다른 병원에 방문한 사람들보다 평균적으로 치료에 더 만족했습니다.", }, penalty = { [1] = "당신의 병원에 방문하는 사람들은 아주 형편없는 취급을 받고 있습니다. 보건부로부터 인정을 받고 싶다면 더 잘해야 할 겁니다.", [2] = "당신의 병원에서 치료받는 사람들은 이 곳의 상태에 대해 굉장히 불만족스러워 합니다. 환자들의 복지를 좀 더 세심하게 신경써야 합니다.", }, }, happy_staff = { trophies = { [1] = "열심히 일하는 당신의 직원들을 계속 행복하게 유지한 공로로 '미소 트로피 (Smiley Trophy)'를 수여합니다.", [2] = "'아다미 행복 연구소'는 작년 한해 동안 불행한 직원이 하나도 없도록 관리한 것에 대한 보상으로 이 트로피를 수여합니다.", [3] = "이 트로피, '더욱 환한 미소 컵 (Beam-more Cup)'은 작년 한해간 일반적인 기대를 훨씬 뛰어 넘도록 귀하의 직원들을 행복하게 해준 당신에게 수여합니다. 모두에게 미소를!", }, awards = { [1] = "당신의 직원들이 이 상을 줍니다. 직원들의 말에 따르면, 약간의 개선의 여지는 있지만 당신의 처우는 전체적으로 좋았다는군요.", [2] = "당신의 직원들은 당신 밑에서 일하는 것이 너무 즐거워서 웃음이 떠나지 않는다고 합니다. 당신은 훌륭한 매니저 입니다.", }, penalty = { [1] = "당신의 직원들은 지금의 처우에 대해 굉장히 불만스럽다는 것을 알리고 싶어 합니다. 좋은 직원들은 재산입니다. 그들을 행복하게 해주지 못한다면 당신을 떠나버리고 말 겁니다.", }, regional_good = { [1] = "당신의 직원들은 다른 모든 병원들에 비해 만족도가 높았습니다. 행복한 직원은 곧 높은 이윤과 적은 사망으로 이어집니다. 보건부는 이 소식에 기쁨을 표합니다.", }, regional_bad = { [1] = "당신의 직원들은 작년 내내 아주 최악의 대우를 받았습니다. 당신도 눈치를 좀 챘어야 합니다. 지금 상태로는 다른 모든 병원들이 당신보다 더 행복한 직원들을 데리고 있는 셈입니다.", }, }, happy_vips = { trophies = { [1] = "귀하는 '노벨 VIP 감명 상 (Nobel Prize for Impressing VIPs)'을 수상했습니다. 작년에 당신의 병원을 방문한 VIP 들 모두가 입이 마르도록 칭찬을 하고 있습니다.", [2] = "'유명인사국'은 귀하에게 당신의 기관을 방문한 모든 VIP 를 만족시킨 공로로 '유명인 트로피 (Celebrity Trophy)'를 수여하고자 합니다.", [3] = "'VIP 여행상 (VIP TRIP award)'을 수상하게된 것을 축하합니다. 이 상은 공공의 눈 아래에서 열심히 일하는 유명 인사들을 만족시킨 공로를 기리기 위함입니다. 훌륭합니다.", }, }, healthy_plants = { awards = { [1] = "작년 내내 화초들을 매우 생생하게 관리한 공로로 '무럭무럭 비료 상 (Gro-More Fertiliser award)'을 수상하게 된 것을 축하합니다.", }, trophies = { [1] = "화분 식물 연합 일동은 '건강의 녹색 트로피 (Green Trophy of Health)'로 당신이 지난 12개월간 화초들을 건강하게 관리해준 것을 기리고자 합니다.", [2] = "트리피드 연합은 당신의 병원 화초들을 작년 한해 동안 최고의 상태로 유지한 것에 대해 '녹색손가락 트로피 (Greenfinger Trophy)'를 수여합니다.", }, }, high_rep = { penalty = { [1] = "당신은 작년 한해간 평판이 형편없었던 것에 대해 징계를 받게 될겁니다. 추후에는 개선될 수 있도록 해주세요.", [2] = "당신 병원의 평판은 지역 내에서 가장 나쁩니다. 아주 불명예스럽군요. 앞으로 더 잘 하거나 다른 직업을 찾아보시죠.", }, awards = { [1] = "잘 하셨습니다. 작년에 꽤 인상적인 좋은 평판을 남겼던 공로로 소정의 상을 수여합니다.", [2] = "훌륭합니다! 귀하의 병원에 작년 한해동안 가장 높은 명성을 쌓은 것으로 이 상을 수여합니다.", }, regional = { [1] = "작년 한해간 모든 병원중에 가장 높은 평판을 쌓은 병원에게 주어지는 '불프로그 상 (Bullfrog Award)'을 받아주세요. 즐기세요 - 당신은 받을 만한 자격이 있습니다.", [2] = "이번 해에 당신 병원의 평판은, 다른 모든 병원의 평판을 합친 것을 상회했습니다. 두드러진 성과입니다.", }, }, hosp_value = { penalty = { [1] = "당신 병원의 가치를 일정 수준 이상으로 유지하는데 실패했습니다. 돈과 관련된 잘못된 결정을 많이 내렸군요. 기억하세요, 좋은 병원은 또한 값비싼 병원이기도 합니다.", }, awards = { [1] = "보건부는 이 자리를 빌어 전체적으로 매우 높은 귀하의 병원 가치를 축하하고자 합니다.", }, regional = { [1] = "당신은 재정분야의 귀재로군요. 당신의 병원은 지역 내의 다른 병원들을 모두 합친 것보다 가치가 높습니다.", }, }, many_cured = { trophies = { [1] = "작년 한해 동안 거의 모든 환자들을 성공적으로 치료한 것으로 '마리 퀴리 상 (Marie Curie Award)'을 수상하게 된 것을 축하합니다.", [2] = "국제 치료 재단은 당신이 작년 한해 동안 대단히 많은 사람을 치료했다는 사실을, '많이치료 트로피 (Cure-A-Lot Trophy)'를 수여하는 것으로 기리고자 합니다.", [3] = "당신은 작년에 방문한 환자들의 대다수를 치료한 공로로 '무병 가글러 트로피 (No-ill Gargler Trophy)'를 수상했습니다.", }, penalty = { [1] = "당신의 병원은 환자들에게 필요한 적절한 치료를 제공해주지 못하고 있습니다. 치료법들이 더 잘 듣도록 개선하는 데 집중하세요.", [2] = "당신의 병원은 다른 모든 병원들에 비해 환자를 치료하는데 덜 능숙합니다. 당신 자신 뿐만 아니라 보건부의 얼굴에 먹칠을 하고 있군요. 더 긴 말 하지 않겠습니다.", }, awards = { [1] = "작년동안 대량의 환자들을 치료한 것을 축하드립니다. 많은 사람들이 당신 덕분에 몸이 한결 좋아졌습니다.", [2] = "다른 모든 병원보다 더 많은 환자들을 치료한 것에 대한 이 상을 받아주세요. 아주 확실한 성과입니다.", }, regional = { [1] = "당신은 다른 모든 병원의 치료 환자 수를 합친 것보다도 더 많은 환자를 치료한 공로로 궁극의 치료 상을 수상했습니다.", }, }, no_deaths = { trophies = { [1] = "당신은 작년동안 100%의 환자를 살린 공로로 '해치지 않아요 상 (No-Croak Award)'을 수상했습니다.", [2] = "'사단 법인 지속되는 인생'은 작년동안 아무도 죽게 하지 않은 것에 대해 이 트로피를 수여합니다.", [3] = "당신은 올해에 어떠한 사망자도 나오지 않도록 하는 데 성공한 공로로 '생존 트로피 (Staying Alive Trophy)'를 수상했습니다. 훌륭합니다.", }, penalty = { [1] = "작년도 당신의 병원 내 사망자 수는 너무 많았습니다. 더 신경을 써 주세요. 추후에는 반드시 더 많은 사람이 살아남도록 하세요.", [2] = "당신의 병원은 환자들의 건강에 있어 위험요소 입니다. 당신의 일은 많은 사람들을 치료하는 것이지, 그들을 죽게 놔두는 것이 아닙니다.", }, awards = { [1] = "올해 귀 병원의 적은 사망자 수를 기념하기 위해 이 상을 수여합니다.", [2] = "당신의 능력이 병원의 사망자 수를 최소한으로 유지했습니다. 아주 기뻐할만한 성과입니다.", }, regional = { [1] = "작년 귀 병원의 치사율은 다른 어떤 병원보다도 낮았습니다. 이 상을 받아주세요.", }, }, pop_percentage = { awards = { [1] = "작년 한해간 귀 병원이 도시 인구의 높은 점유율을 기록했음을 주목하세요. 잘 하셨습니다.", [2] = "축하합니다. 다른 기관들보다 당신의 병원에 더 많은 지역 주민들이 방문하였습니다.", [3] = "멋지군요. 당신의 병원은 다른 병원들의 환자 수를 합친 것보다 더 많은 환자들을 끌어들였습니다.", }, penalty = { [1] = "올해 당신의 병원에는 사람들이 거의 오지 않았습니다. 돈을 벌기 위해서는 돈을 내 줄 환자들이 필요하겠죠.", [2] = "지역 내의 다른 모든 병원은 당신의 병원보다 많은 비율의 환자들을 데려오는 데 성공했습니다. 부끄러운줄 아세요.", }, }, rats_accuracy = { trophies = { [1] = "당신은 쥐들을 저격하는 데 %d%% 의 정확도를 가진 것을 기념하여 '신디케이트 워즈 저격 트로피 (Syndicate Wars Accurate Shooting Trophy)'를 수상하였습니다.", [2] = "이 트로피는 작년동안 쥐를 %d%% 의 확률로 사살한 당신의 놀라운 정확도를 기념하기 위함입니다.", [3] = "당신의 병원에 나타는 쥐들을 %d%% 박멸한 것을 기념하기 위해 '던전 키퍼 해수제로 트로피 (Dungeon Keeper Vermin-Free Trophy)'를 수여합니다. 축하합니다!", }, }, rats_killed = { trophies = { [1] = "당신은 작년에 병원 내에서 %d 마리의 쥐를 저격한 공로로 '반-해수 트로피 (Anti-Vermin Trophy)'를 수상하였습니다.", [2] = "당신은 놀라운 쥐 저격 능력을 %d 마리의 쥐를 퇴치하여 '쥐 퇴치 연맹' 으로부터 이 트로피를 받을 자격을 갖추었습니다.", [3] = "귀하는 작년에 병원내의 %d 마리의 쥐를 해치움으로써 '날려버리쥐 트로피 (Ratblast Trophy)'를 수상할 자격을 얻었습니다.", }, }, research = { regional_good = { [1] = "귀하의 연구 수준은 최신 기술들과 어깨를 나란히 했습니다. 귀하의 연구진은 이 상을 받을 자격이 있습니다. 잘 하셨습니다.", }, penalty = { [1] = "당신은 새로운 치료법, 기계, 약물 등을 개발하는 데 매우 부진했습니다. 기술적인 진보가 필수라는 것을 감안할 때, 이것은 매우 나쁜 징조입니다.", }, regional_bad = { [1] = "지역 내의 다른 모든 병원들은 당신의 병원보다 연구 수준이 높습니다. 연구가 병원에 끼치는 중요한 역할에 기인하여 보건부는 귀 병원에 분노하고 있습니다.", }, awards = { [1] = "귀하의 연구 수준은 최신 기술들과 어깨를 나란히 했습니다. 귀하의 연구진은 이 상을 받을 자격이 있습니다. 잘 하셨습니다.", [2] = "작년 한해 동안 귀하는 사람들의 기대 이상으로 많은 신약과 치료장비들을 연구해냈습니다. 보건부의 모두가 드리는 이 상을 받아주세요.", }, }, sold_drinks = { trophies = { [1] = "'세계 치과 의사 연맹'은 당신의 병원에서 대량의 캔음료를 판매한 것에 대해 이 트로피와 상장을 수여합니다.", [2] = "당신의 병원은 작년에 병원에서 팔린 막대한 양의 탄산 음료를 기념하여 이 '탄산 트로피 (Fizzy-Bizz Trophy)'를 수상했습니다.", [3] = "주식회사 'DK Fillings'를 대표하여, 이 초콜릿 덮인 트로피로 올해 당신의 병원이 탄산 음료를 특출나게 많이 판매한 것을 기념하고자 합니다.", }, }, wait_times = { award = { [1] = "축하합니다. 당신의 병원은 꾸준하게 짧은 대기시간을 유지해왔습니다. 이것은 아주 중요한 상입니다.", }, penalty = { [1] = "당신 병원의 환자들은 너무 오랫동안 기다려야 합니다. 어디를 가든 납득이 안되는 긴 줄이 있습니다. 할 마음만 있다면 환자들을 좀 더 효율적으로 관리할 수 있을 겁니다.", }, }, reputation = "평판", cash = "소지금", } buy_objects_window = { price = "가격: ", choose_items = "기물 선택", total = "합계: ", } menu_list_window = { save_date = "수정됨", name = "이름", back = "뒤로", } menu_options_volume = { [50] = " 50% ", [100] = " 100% ", [30] = " 30% ", [60] = " 60% ", [90] = " 90% ", [10] = " 10% ", [20] = " 20% ", [40] = " 40% ", [80] = " 80% ", [70] = " 70% ", } menu_file_load = { [1] = " 게임 1 ", [2] = " 게임 2 ", [3] = " 게임 3 ", [4] = " 게임 4 ", [5] = " 게임 5 ", [6] = " 게임 6 ", [7] = " 게임 7 ", [8] = " 게임 8 ", } menu_file = { quit = " (%1%) 종료 ", save = " (%1%) 저장 ", load = " (%1%) 불러오기 ", restart = " (%1%) 재시작", } menu_options_wage_increase = { deny = " 거절 ", grant = " 승인 ", } save_game_window = { caption = "저장 게임 (%1%)", new_save_game = "새로운 저장 게임", } rooms_long = { ultrascan = "울트라스캔실", research_room = "연구 부서", general = "일반", gps_office = "진료실", inflation = "팽창실", staffroom = "직원 휴게실", jelly_vat = "젤리 통", scanner = "스캐너실", emergency = "응급실", decontamination = "오염 제거실", corridors = "복도", cardiogram = "심전도실", ward = "병동", training_room = "교육실", psychiatric = "정신과실", operating_theatre = "수술실", dna_fixer = "DNA 정정기", tongue_clinic = "늘어진 혀 클리닉", hair_restoration = "모발 재생 클리닉", general_diag = "일반 진단실", pharmacy = "약국", fracture_clinic = "골절 클리닉", toilets = "화장실", electrolysis = "전기분해 클리닉", x_ray = "X-레이실", blood_machine = "혈액 분석실", } fax = { epidemic_result = { fine_amount = "정부는 국가적 비상사태를 선언했으며 당신에게 %d 의 벌금을 청구합니다.", close_text = "만세!", hospital_evacuated = "보건 위원회는 당신의 병원을 비우는 수 밖에 없었습니다.", succeeded = { part_1_name = "건강 검사관은 당신의 기관이 악성의 %s 을(를) 겪고 있다는 소문을 들었습니다.", part_2 = "그러나 이러한 소문을 뒷받침하는 어떤 근거도 찾을 수 없었습니다.", }, compensation_amount = "정부는 이러한 거짓말이 당신의 병원의 명성에 끼친 악영향에 대해 %d 만큼의 보상을 지불하기로 결정했습니다.", failed = { part_1_name = "전염성 %s 을(를) 겪고 있다는 사실을 숨기려 함으로써", part_2 = "당신의 병원 직원들은 질병이 병원 주변의 대중에게 퍼져나가도록 방치했습니다.", }, rep_loss_fine_amount = "언론사들이 이를 집중 취재할 것이며, 당신의 평판은 심각하게 훼손될 것입니다. 또한, 당신은 %d 의 벌금을 물게 될 것입니다.", }, vip_visit_query = { choices = { invite = "공식적으로 V.I.P. 를 초대", refuse = "적당한 핑계로 V.I.P. 를 회피", }, vip_name = "%s 이(가) 당신의 병원을 방문하고 싶어합니다", }, vip_visit_result = { telegram = "전문!", remarks = { good = { [1] = "괜찮게 운영되는 병원이군요. 초대해 주셔서 감사합니다.", [2] = "흠. 확실히 나쁘지 않은 의료 시설이로군요.", [3] = "좋은 병원을 방문하게 되어 즐거웠습니다. 이제 저와 함께 괜찮은 카레라도 드실 분?", }, super = { [1] = "훌륭한 병원이군요. 제가 다음에 많이 아프게 되면 거기로 데려다 주세요.", [2] = "바로 이런게 병원이라 불릴 만 하죠.", [3] = "굉장한 병원이네요. 몇몇 다른 병원들도 둘러보았으니 확실히 말할 수 있어요.", }, bad = { [1] = "내가 뭐하러 방문했나 몰라요? 네시간 짜리 오페라를 보러가는 것보다도 나빴어요!", [2] = "거기서 본 것 때문에 메스껍네요. 그게 병원이라고요? 돼지우리에 더 가깝죠!", [3] = "공인으로서 이런 냄새나는 소굴을 방문해야 하는 것도 질렸어요! 이젠 그만두겠어요.", }, free_build = { [1] = "굉장히 멋진 병원이네요! 그치만 돈 제한 없이 이렇게 운영하는게 크게 어려운일은 아니죠, 안그래요?", [2] = "내가 특별히 경제학자이거나 한 것은 아니지만, 나라도 이런 병원은 운영할 수 있겠네요.. 무슨말인지 알죠?", [3] = "훌륭하게 운영되는 병원이네요. 그치만 불경기를 조심하세요! 아, 그러고보니... 당신은 그런 걱정 할 필요가 없군요.", }, mediocre = { [1] = "뭐, 더 심한곳도 봤는걸요. 그래도 당신 병원은 좀 개선할 필요가 있겠어요.", [2] = "오 이런. 아플 때 갈만한 장소는 아니로군요.", [3] = "솔직히 말해서 그냥 평범한 병원이네요. 사실 좀 더 낫길 바랐어요.", }, very_bad = { [1] = "이런 지저분할 데가. 어떻게든 이 병원 문을 닫게끔 해야겠어요.", [2] = "이런 끔찍한 병원은 본 적이 없어요. 이런 망신이 있나요!", [3] = "충격적이군요. 이런건 병원이라고 할 수도 없어요! 가서 한잔 해야겠어요.", }, }, rep_boost = "당신의 평판이 올랐습니다.", vip_remarked_name = "당신의 병원을 방문한 뒤, %s 이(가) 말했습니다:", cash_grant = "당신은 현찰로 %d 의 지원금을 받았습니다.", rep_loss = "이로인해 당신의 평판이 떨어졌습니다.", close_text = "병원에 방문해 주셔서 감사합니다.", }, disease_discovered_patient_choice = { need_to_build = "이것을 해결하기 위해서 당신은 %s 을(를) 지어야 합니다.", need_to_employ = "이 상황을 해결하려면 %s 을(를) 고용해야 합니다.", what_to_do_question = "이 환자를 어떻게 하시겠습니까?", guessed_percentage_name = "당신의 의료진은 환자의 상태에 대해서 추측할 수 밖에 없었습니다. 이 환자는 %d 의 확률로 %s 입니다.", choices = { send_home = "환자를 집으로 돌려보냄.", research = "환자를 연구실로 보냄.", wait = "환자를 얼마동안 병원 안에서 기다리도록 함.", }, disease_name = "당신의 의료진은 새로운 병을 발견했습니다. %s 입니다.", need_to_build_and_employ = "당신이 %s 을(를) 짓고 %s 을(를) 고용하면 치료할 수 있습니다.", can_not_cure = "당신은 이 질병을 치료할 수 없습니다.", }, emergency_result = { earned_money = "최대로 받을 수 있는 보너스 %d 중에서 당신은 %d 만큼 벌었습니다.", close_text = "나가려면 클릭.", saved_people = "당신은 %d 명의 환자를 구했습니다. (총 %d 명의 응급환자 중)", }, disease_discovered = { discovered_name = "당신의 의료진은 새로운 병을 발견했습니다. %s 입니다.", need_to_employ = "이 상황을 해결하려면 %s 을(를) 고용해야 합니다.", need_to_build_and_employ = "당신이 %s 을(를) 짓고 %s 을(를) 고용하면 치료할 수 있습니다.", need_to_build = "이것을 해결하기 위해서 당신은 %s 을(를) 지어야 합니다.", close_text = "새로운 질병이 발견되었습니다.", can_cure = "당신은 이 병을 치료할 수 있습니다.", }, emergency = { num_disease = "%d 명의 환자들이 %s 을(를) 앓고 있으며, 당장 치료해야만 합니다.", cure_possible_drug_name_efficiency = "당신은 이미 치료에 필요한 장비와 능력을 갖추고 있습니다. 당신은 그들에게 필요한 약을 가지고 있습니다. %s 병에 대한 당신의 약은 %d 퍼센트의 효과가 있습니다.", cure_not_possible_employ = "당신은 %s 을(를) 고용해야 합니다.", free_build = "당신이 성공하면 평판이 오르겠지만, 실패할 경우 당신의 평판은 심각하게 훼손될 것입니다.", cure_not_possible = "지금은 이 질병을 치료할 수 없습니다.", num_disease_singular = "한 명의 환자가 %s 을(를) 앓고 있으며, 당장 치료해야만 합니다.", cure_possible = "당신은 치료에 필요한 장비와 능력을 갖추고 있으며, 이 응급상황을 해결할 수 있을 것입니다.", choices = { accept = "예. 이 응급 환자들을 치료하겠습니다.", refuse = "아니오. 이 응급 상황을 해결하는 것을 거절합니다.", }, location = "%s 에서 사건이 일어났습니다.", cure_not_possible_build = "당신은 %s 을(를) 지어야 할 것입니다.", cure_not_possible_build_and_employ = "당신은 %s 을(를) 짓고 %s 을(를) 고용해야 할 것입니다.", bonus = "이 응급 상황을 해결하면 최대 %d 의 보너스를 받을 수 있습니다. 하지만 실패한다면, 당신의 평판은 심각하게 훼손될 것입니다.", }, choices = { decline_new_level = "얼마간 더 플레이 하기", accept_new_level = "다음 레벨로 넘어가기", return_to_main_menu = "메인 메뉴로 돌아가기", }, epidemic = { cover_up_explanation_1 = "하지만, 당신이 전염병을 숨기고 직접 치료하려 하면, 당신은 보건 당국이 눈치채기 전에 감염된 모든 환자를 제한된 시간 내에 치료해야 합니다.", cover_up_explanation_2 = "만약 건강 검사관이 방문하여 전염병 치료가 여전히 진행중인 것을 알게되면, 그는 당신의 병원에 강경한 조치를 취할 수 있습니다.", choices = { cover_up = "주어진 시간 내에, 그리고 아무도 병원에서 나가기 전에 모든 감염된 환자들의 치료를 시도함", declare = "전염병을 선언함. 벌금을 물고 평판 하락을 감수함.", }, disease_name = "당신의 의사들이 유행성의 %s 을(를) 발견했습니다.", declare_explanation_fine = "당신이 전염병이 돌고 있다고 선언하면, %d 의 벌금을 물고 평판이 하락하겠지만 당신의 모든 환자들은 자동으로 백신을 맞게 됩니다.", }, diagnosis_failed = { choices = { send_home = "환자를 집으로 돌려보냄.", take_chance = "가능한 치료를 시도해봄.", wait = "진단 시설을 좀 더 짓는 동안 환자가 병원 안에서 기다리도록 함", }, situation = "병원의 모든 진단 장비들을 동원해 보았지만 이 환자의 문제를 정확히 알아내지 못했습니다.", what_to_do_question = "이 환자를 어떻게 할까요?", partial_diagnosis_percentage_name = "%d 퍼센트의 확률로 이 환자가 %s 의 질병을 가지고 있다는 것을 알아냈습니다.", }, } confirmation = { abort_edit_room = "현재 방을 짓거나 편집하는 중입니다. 모든 기물들이 배치되면 완료되지만, 그렇지 않은 경우 방이 삭제될 것입니다. 계속하시겠습니까?", return_to_blueprint = "정말로 청사진 모드로 돌아가기 원합니까?", restart_level = "정말로 현재 레벨을 처음부터 다시 시작하기 원합니까?", delete_room = "정말로 이 방을 삭제합니까?", quit = "종료를 선택했습니다. 정말로 게임을 끝내기 원합니까?", needs_restart = "이 설정을 바꾸려면 CorsixTH 를 재시작해야 합니다. 저장되지 않은 부분은 모두 잃어버리게 됩니다. 정말로 바꾸기 원합니까?", overwrite_save = "이 슬롯에 이미 다른 게임이 저장되어 있습니다. 정말로 덮어쓰기 원합니까?", sack_staff = "정말로 이 직원을 해고하기 원합니까?", replace_machine = "정말로 %s 기계를 $%d 의 비용으로 교체합니까?", maximum_screen_size = "입력한 화면 크기가 3000 x 2000 보다 큽니다. 큰 해상도도 가능하지만, 플레이할만한 프레임 수를 유지하려면 하드웨어 성능이 충분히 좋아야 합니다. 계속하시겠습니까?", music_warning = "게임중에 mp3 파일들을 재생하도록 하기 전에, smpeg.dll 파일이나 그에 상응하는 파일이 운영 체제에 설치되어 있어야 합니다. 그렇지 않으면 음악이 재생되지 않을 것입니다. 계속하시겠습니까?", } months = { [1] = "1월", [2] = "2월", [3] = "3월", [4] = "4월", [5] = "5월", [6] = "6월", [7] = "7월", [8] = "8월", [9] = "9월", [10] = "10월", [11] = "11월", [12] = "12월", } dynamic_info = { patient = { emergency = "응급: %s", guessed_diagnosis = "추측된 진단: %s ", diagnosis_progress = "진단 프로세스", actions = { sent_to_other_hospital = "다른 병원을 소개받음", prices_too_high = "가격이 너무 비싸요 - 그냥 집에 갈래요", no_gp_available = "당신이 진료실을 짓기를 기다리고 있음", waiting_for_diagnosis_rooms = "당신이 진료 시설을 더 짓기를 기다리고 있음", waiting_for_treatment_rooms = "당신이 치료 시설을 짓기를 기다리고 있음", dying = "죽어감!", no_diagnoses_available = "더이상 진단할 방법이 없군요 - 돌아갈래요", epidemic_sent_home = "검사관에 의해 돌려보내짐", cured = "치료됨!", epidemic_contagious = "전염병에 걸렸어요", awaiting_decision = "당신의 결정을 기다리는 중", sent_home = "집으로 돌려보내짐", fed_up = "질려서 떠나는중", no_treatment_available = "치료할 방법이 없네요 - 돌아갈래요", on_my_way_to = "%s에 가는 중", queueing_for = "%s에 대기 중", }, diagnosed = "진단: %s ", }, health_inspector = "건강 검사관", vip = "VIP 방문자", object = { times_used = "사용된 횟수 %d", queue_size = "대기열 길이 %d", strength = "힘 %d", queue_expected = "예상 대기열 %d", }, staff = { ability = "능력", psychiatrist_abbrev = "정신과 의사", actions = { going_to_repair = "다음 기계를 수리하러 가는 중: %s", fired = "해고됨", waiting_for_patient = "환자를 기다리는 중", wandering = "그냥 돌아다니는 중", heading_for = "다음으로 향하는 중: %s", }, tiredness = "피로도", }, } introduction_texts = { demo = "데모 병원에 오신 것을 환영합니다!//" .. "안타깝게도 데모 버전에서는 (커스텀 레벨을 제외하면) 이 레벨만 플레이할 수 있습니다. 그렇지만, 여기에도 당신을 한동안 바쁘게 할만큼의 일거리는 충분히 있습니다! " .. "당신은 치료를 위해 다른 종류의 시설을 필요로 하는 다양한 질병을 만나게 될 것입니다. 가끔은 응급 상황이 발생할지도 모릅니다. 그리고 당신은 연구실을 지어 새로운 시설들을 연구해야 할 것입니다. " .. "당신의 목표는 $100,000 를 벌고, 병원 가치를 $70,000 만큼 올리며, 평판을 700 만큼 유지하고, 방문하는 환자의 75% 이상을 완치시키는 것입니다. " .. "당신의 평판이 300 아래로 떨어지거나 40% 이상의 환자들을 죽게 하지 마세요. 어느 하나라도 발생하면 당신은 게임에서 지게 됩니다.//" .. "행운을 바랍니다!", level1 = "당신의 첫 병원에 오신 것을 환영합니다!//" .. "접수대와 진료실을 짓고 접수원과 의사를 고용해서 이 곳이 제대로 돌아가게끔 하세요. " .. "그러고 나서 할일이 생길 때까지 어느 정도 기다리세요. " .. "정신과를 짓고 정신과 자격이 있는 의사를 고용하는 것은 좋은 생각입니다. " .. "약국을 짓고 간호사를 고용하는 것도 환자들을 치료하는 데 꼭 필요합니다. " .. "부은 머리 증상을 호소하는 환자들을 주의하세요 - 팽창실을 지으면 이 문제를 해결할 수 있을 것입니다. " .. "당신의 목표는 10 명의 환자를 치료하고 평판이 200 아래로 떨어지지 않도록 하는 것입니다.", level2 = "이 지역에는 더 다양한 병이 도사리고 있습니다. " .. "더 많은 환자들을 치료할 수 있도록 병원을 구성하고, 연구 시설을 지을 계획을 세우세요. " .. "당신의 시설들을 깨끗하게 유지하는 것을 잊지 말고, 평판을 최대한 높에 유지하도록 노력하세요. 당신은 늘어진 혀를 발견하게 될텐데, 늘어진 혀 클리닉을 지어서 치료할 수 있습니다. " .. "또한, 심전도실을 지으면 새로운 질병들을 진단하는 데 도움이 될 것입니다. " .. "이 두 가지 방을 짓기 위해서는 먼저 연구를 해야 합니다. 그리고 이제 당신은 병원을 확장하기 위한 새로운 토지를 구매할 수도 있습니다. 그러려면 마을 지도를 사용하세요. " .. "300 의 평판과, $10,000 의 은행 잔고, 그리고 40 명의 환자를 치료하는 것을 목표로 하세요.", level3 = "이번에는 부유한 지역에 당신의 병원을 세우게 될 것입니다. " .. "보건부는 이 곳에서 당신이 상당한 이익을 남기기를 바라고 있습니다. " .. "처음에는 어느 정도 평판을 쌓아야 하겠지만, 병원이 안정적으로 돌아가기 시작하면, 최대한 돈을 많이 버는 것에 집중하세요. " .. "또한 응급 상황이 발생할 가능성도 있습니다. " .. "응급 상황에는 동일한 질병을 가진 많은 사람들이 한꺼번에 몰려오게 됩니다. " .. "제한된 시간 내에 모두를 치료하게 되면 당신의 평판이 올라가며 큰 보너스를 받게 됩니다. " .. "왕자병과 같은 질병이 발생할 수 있으며, 당신은 수술실을 짓고 또한 가까운 곳에 병동을 지을 예산을 마련해 두어야 할 것입니다. " .. "성공하기 위해 $20,000 만큼을 버세요.", level4 = "모든 환자들을 행복하게 해주고, 그들을 가능한한 효율적으로 치료하며, 사망자의 수는 정말 최소한으로 유지하세요. " .. "당신의 평판이 이 레벨의 성공을 좌우하므로, 평판을 최대한 높게 유지하도록 노력하세요. " .. "돈에 대해서는 너무 신경쓰지 마세요. 돈은 평판이 높아지면 자연스럽게 따라오게 될 겁니다. " .. "또한, 당신은 이제 의사들의 능력을 향상시키기 위해 그들을 교육시키는 것도 가능합니다. " .. "교육받은 의사들은, 어떤 질병인지 아주 확실치 않은 환자들을 더 잘 치료할 수 있을 것입니다. " .. "500 이상의 평판을 달성하세요.", level5 = "여기는 가지각색의 질병들을 치료하느라 아주 분주한 병원이 될 겁니다. " .. "당신이 고용할 수 있는 의사들은 모두 의대를 갓 졸업한 신입들이기 때문에, 교육실을 지어서 적정 수준으로 훈련시키는 것이 필수입니다. " .. "의사들을 교육할 수 있는 딱 세 명의 전문의들만 주어져 있으므로, 이들을 행복하게 해 주세요. " .. "또 유념해야할 것은, 병원이 샌 안드로이드 단층 위에 지어져 있다는 것입니다. " .. "다시말해, 이 병원은 언제나 지진의 위험에 노출되어 있습니다. " .. "지진은 당신의 기계들을 손상시키고, 병원을 원만하게 운영하는 것을 방해할 것입니다. " .. "성공하려면 평판을 400 만큼 올리고, $50,000 를 예금하세요. 또한, 200 명의 환자를 치료하세요.", level6 = "당신의 모든 지식을 동원해서, 적절한 이윤을 남기면서도 병약한 대중이 가진 온갖 질병들을 치료할 수 있도록 원만하게 운영되는 병원을 지으세요. " .. "이 곳 주변의 공기는 특별히 세균과 질병을 옮기는 데 좋다는 것을 알아두세요. " .. "병원을 정말 구석구석 깨끗하게 유지하지 않으면, 환자들 사이에서 아주 심각한 전염병이 도는 것을 보게 될 것입니다. " .. "돈을 $150,000 만큼 벌고, 병원의 가치가 $140,000 이상이 되도록 하세요.", level7 = "이번에는 당신의 병원이 보건부의 철저한 감시 하에 놓여있게 될 것이므로, 당신이 돈을 충분히 많이 벌고 있다는 것을 은행 잔고로 보여주고, 평판을 올리도록 하세요. " .. "환자들이 사망하는 것은 최대한 피해야 합니다 - 사업하는데 전혀 도움이 안되니까요. " .. "최고의 직원들을 고용하도록 하고, 필요한 장비들을 갖추도록 하세요. " .. "600 의 평판과 $200,000 의 잔고를 얻으세요.", level8 = "얼마나 비용대비 효율이 높은 병원을 짓는 것은 당신에게 달렸습니다. " .. "이 주변 주민들은 상당히 부유한 편이니, 할 수 있는 만큼 쥐어 짜내세요. " .. "사람들을 치료하는 것도 좋지만, 돈을 모으는 것이 목표라는 것을 기억해야 합니다. " .. "이 아픈 사람들을 아주 빈털터리로 만들어 버리세요. " .. "이 레벨을 완료하려면 재산을 $300,000 만큼 쌓아야 합니다.", level9 = "보건부의 재산을 좀 불려주고 장관님께 리무진도 한 대 뽑아드렸으니, 이제 다시 몸이 아픈 사람들을 잘 돌보는 훌륭한 병원을 짓는 일을 재개할 수 있습니다. " .. "여기서는 굉장히 다양한 문제들을 마주치게 될 것입니다. " .. "당신이 충분히 훈련받은 직원들과 필요한 시설들을 갖춘다면, 이 천사 같은 사람들을 회복시켜줄 수 있습니다. " .. "당신의 병원 가치가 $200,000 이상이 되어야 하고, 은행에 $400,000 만큼의 돈이 있어야 합니다. " .. "이것 보다 적다면 이 레벨을 클리어 하는 것은 어림도 없습니다.", level10 = "이 동네에 창궐하는 질병들을 치료하는 것 뿐만 아니라, 보건부는 당신의 의약품의 효용성을 높일 것을 요구합니다. " .. "보건 검사관인 Ofsick 으로부터 불만이 접수되었기 때문에, 좋은 인상을 주기 위해서는 당신의 약들이 엄청나게 잘 듣도록 만들어야 합니다. " .. "또한, 당신의 병원이 비난 받지 않도록 하는 것도 잊지 마세요. 사망자 수를 낮게 유지하세요. " .. "힌트를 주자면, 젤리통을 지을 공간을 미리 확보해 두는 것이 좋을 겁니다. " .. "모든 약의 효율을 80% 이상으로 끌어 올리고, 650 의 평판과 $500,000 을 벌면 승리할 수 있습니다.", level11 = "당신은 궁극의 병원을 지을 기회를 얻었습니다. " .. "이 곳은 굉장히 이름난 지역이고, 보건부는 가능한 최고의 병원을 보고 싶어 합니다. " .. "우리는 당신이 큰 돈을 벌고, 엄청나게 높은 평판을 얻으며 모든 질병들을 치료할 있기를 기대합니다. " .. "이건 굉장히 중요한 일입니다. " .. "성공하기 위해서는 당신은 특별한 사람이 되어야 할 겁니다. " .. "또 주의할 것은, 이 지역에서 UFO 가 여러번 목격되었다는 것입니다. 당신의 직원들이 뜻밖의 방문에 대비할 수 있도록 해 주세요. " .. "당신의 병원은 $240,000 이상의 가치를 해야 하고, 은행에 $500,000 의 돈과 700 의 평판을 얻어야 할 겁니다.", level12 = "당신은 최고의 도전에 직면해 있습니다. " .. "지금까지의 당신의 성공에 크게 인상을 받은 보건부가 당신을 최고의 자리에 앉혀주었습니다. 그들은 당신이 또다른 궁극의 병원을 짓고, 막대한 돈을 벌며 놀라운 평판을 얻기를 원합니다. " .. "또한 당신이 매입할 수 있는 모든 부지를 사들이고, 모든 질병을 치료하며 (정말 '모든' 질병 말이에요), 모든 상을 수상하기를 원합니다. " .. "도전해 볼 준비가 되었나요?" .. "$650,000 을 벌고, 750 명의 환자를 치료하며, 800 의 평판을 얻어 이 레벨을 클리어 하세요.", level13 = "병원 책임자로서의 놀라운 능력을 보고 '비밀 특수 관청'의 '비밀 특수 부서'에서 당신에게 관심을 가지기 시작했습니다. " .. "그들이 당신에게 주는 보너스가 있습니다. 쥐가 득실거리는 병원에서 쥐를 없애야 합니다. " .. "당신은 잡역부들이 더러운 것들을 치우기 전에 최대한 쥐들을 쏘아 맞춰야 합니다. " .. "준비 되셨나요?", level14 = "또다른 도전입니다 - 전혀 예상치 못한 놀라운 병원을 짓는 것이죠. " .. "이것을 성공한다면, 당신은 승자 중의 승자로 기억될 것입니다. " .. "쉬운 일이 될 것이라고 기대하지 마세요. 당신이 마주하게 될 가장 어려운 과제가 될 테니까요. " .. "행운을 빕니다!", level15 = "좋아요, 그게 바로 병원을 운영하는 기본적인 방법입니다.//" .. "당신의 의료진은 특정 환자들을 진단하기 위해서 도움을 필요로 할 수 있습니다." .. "일반 진단실 등과 같은 진단 설비들을 더 많이 지어서 의료진이 정확한 진단을 할 수 있도록 도울 수 있습니다.", level16 = "환자들을 진단한 후에는, 치료 시설과 클리닉 등을 지어서 환자들을 치료해야 합니다. " .. "약국에서부터 시작하는 것이 좋습니다. 약국에서 제대로 약을 조제하기 위해서는 간호사도 필요할 것입니다.", level17 = "마지막 당부입니다 - 당신의 평판에서 눈을 떼지 마세요. 평판이 높아야 더 먼 곳의 환자들을 끌어올 수 있습니다. " .. "너무 많은 환자들을 죽게 하지 않고 적절히 행복도를 유지해 준다면 이 레벨을 클리어 하는 데 큰 문제는 없을 것입니다!//" .. "이제 모든 것은 당신에게 달렸습니다. 행운을 빌어요.", } transactions = { severance = "퇴직금", research = "연구비", eoy_trophy_bonus = "연말 기념 보너스", buy_object = "기물 구매", cure_colon = "치료:", epidemy_coverup_fine = "전염병 은폐 벌금", final_treat_colon = "최종 처방:", jukebox = "수입: 주크박스", loan_interest = "대출 이자", overdraft = "당좌 대월 이자", wages = "급여", loan_repayment = "대출 상환", personal_bonus = "개인 보너스 지급", drug_cost = "약물 비용", cure = "치료", heating = "난방비", treat_colon = "처방:", compensation = "정부 보상금", epidemy_fine = "전염병 벌금", buy_land = "토지 매입", research_bonus = "연구 보너스", general_bonus = "일반 보너스 지급", deposit = "처방 보증금", eoy_bonus_penalty = "연말 보너스/벌금", cheat = "돈 치트", drinks = "수입: 음료 자판기", vaccination = "백신", advance_colon = "가불:", vip_award = "VIP 현금 상여", hire_staff = "직원 고용", bank_loan = "은행 이자", machine_replacement = "기계 교환 비용", emergency_bonus = "응급 상황 보너스 지급", build_room = "방 건설", insurance_colon = "보험:", sell_object = "기물 판매", } object = { chair = "의자", litter = "쓰레기", sofa = "소파", operating_table = "수술대", bed2 = "침대", bench = "벤치", scanner = "스캐너", couch = "침상", blood_machine = "혈액 분석기", table1 = "탁자", video_game = "비디오 게임", lamp = "전등", op_sink2 = "세면대", door = "문", auto_autopsy = "자동부검기", reception_desk = "접수대", hair_restorer = "모발 재생기", projector = "영사기", crash_trolley = "운반차", tv = "TV", ultrascanner = "울트라스캐너", surgeon_screen = "외과 의사용 스크린", litter_bomb = "쓰레기 폭탄", inflator = "팽창기", table2 = "탁자", desk = "책상", pool_table = "당구대", x_ray_viewer = "X-레이 뷰어", radiation_shield = "방사선 차폐기", bed = "침대", swing_door2 = "여닫이 문", console = "콘솔", op_sink1 = "세면대", bookcase = "책장", drinks_machine = "자판기", comfortable_chair = "안락의자", skeleton = "해골", computer = "컴퓨터", bin = "쓰레기통", pharmacy_cabinet = "약장", radiator = "라디에이터", cast_remover = "깁스 제거기", atom_analyser = "원자 분석기", plant = "화초", jelly_moulder = "젤리 주형기", cardio = "심전도", toilet = "변소", electrolyser = "전기분해기", fire_extinguisher = "소화기", bed3 = "침대", swing_door1 = "여닫이 문", lecture_chair = "강의 의자", screen = "스크린", toilet_sink = "세면대", shower = "샤워", gates_of_hell = "지옥의 문", entrance_right = "우측 문", entrance_left = "좌측 문", slicer = "절단기", dna_fixer = "DNA-정정기", x_ray = "X-레이", cabinet = "서류 캐비넷", } letter = { [1] = { [1] = "%s 님에게//", [2] = "멋지군요! 당신은 이 병원을 운영하는 일을 훌륭하게 해냈습니다. 우리 보건부 고위 인사들은 당신이 더 큰 프로젝트를 진행할 생각이 있는지 궁금합니다. 당신에게 딱 맞는 자리가 있습니다. 연봉은 $%d 만큼 드릴 수 있습니다. 생각해 보시고 연락 부탁드립니다.//", [3] = "%s 병원에서 일해볼 생각이 있습니까?", }, [2] = { [1] = "%s 님에게//", [2] = "아주 좋아요! 당신은 병원을 뛰어나게 발전시켰습니다. 당신이 다른 풍경과 새로운 도전을 원한다면, 우리가 찾아낸 곳이 있습니다. 이 제의를 반드시 수락해야 하는 것은 아니지만, 수락할만한 가치는 있을 것입니다. 급여는 $%d 입니다.//", [3] = "%s 병원의 자리를 원하십니까?", }, [3] = { [1] = "%s 님에게//", [2] = "이 병원에서 재직하는 중 당신은 대단히 큰 성공을 거두었습니다. 우리는 당신의 가능성을 높이 평가하며, 다른 곳에서의 포지션을 제의하고자 합니다. 연봉은 $%d 가 될 것이고, 당신이 이 새로운 곳에서의 도전을 즐기리라고 믿습니다.//", [3] = "%s 병원에서의 일하고 싶습니까?", }, [4] = { [1] = "%s 님에게//", [2] = "축하드립니다! 보건부의 우리는 병원을 운영하는 당신의 능력에 큰 인상을 받고 있습니다. 당신은 확실히 보건계의 큰 손입니다. 하지만 당신이 조금 더 어려운 일을 하기 원하지 않을까 싶군요. 당신은 $%d 의 급여를 받게 되겠지만, 결정은 당신 몫입니다.//", [3] = "%s 병원에서 일하는 것에 흥미가 있습니까?", }, [5] = { [1] = "%s 님에게//", [2] = "오랜만이군요. 이 매력적인 병원에 남기 원하는 당신의 생각은 존중하지만, 그것에 대해 재고해보셨으면 합니다. 당신이 우리가 지정하는 다른 병원으로 옮겨서 원만하게 운영해 낸다면 $%d 의 높은 급여를 드릴 의향이 있습니다.//", [3] = "%s 병원으로 지금 이직하시겠습니까?", }, [6] = { [1] = "%s 님에게//", [2] = "안녕하세요. 당신이 이렇게 부드럽게 돌아가는 멋진 병원에 있는 것을 얼마나 행복하게 여기는지는 잘 알지만, 우리는 당신의 커리어를 좀 더 키우는 것이 좋을 것이라고 생각합니다. 물론 이직하실 경우 $%d 만큼의 돈은 드리겠습니다. 고려해볼만 할 겁니다.//", [3] = "%s 병원의 자리를 수락하시겠습니까?", }, [7] = { [1] = "%s 님에게//", [2] = "안녕하십니까! 보건부는 당신이 지금의 병원에 머물겠다는 생각을 재고해볼 여지가 있는지 궁금합니다. 당신의 멋진 병원은 높이 평가하고 있지만, $%d 의 급료를 받고 더 도전적인 일을 해보는 것은 어떨까 하고 생각합니다.//", [3] = "%s 병원의 포지션을 수락하시겠습니까?", }, [8] = { [1] = "%s 님에게//", [2] = "안녕하세요. 지난 번에 당신은 $%d 의 급료와 최상의 조건으로 이직하겠냐는 제안을 거절했습니다. 하지만 이 제안을 다시 고려해보실 것을 부탁 드립니다. 단언컨대, 당신에게 꼭 맞는 완벽한 자리입니다.//", [3] = "%s 병원에서 일하라는 제안을 수락하시겠습니까? 제발요?", }, [9] = { [1] = "%s 님에게//", [2] = "당신은 변화무쌍한 의료계 역사상 최고의 병원 책임자로서의 자신의 능력을 증명했습니다. 이런 중대한 업적에 대한 보상의 의미로, 당신을 모든 병원의 최고 책임자로 모시려 합니다. 이것은 명예로운 직책이며, $%d 의 연봉이 보장됩니다. 당신을 위해 사람들이 색종이 테이프를 뿌리며 행진할 것이고, 당신이 어디를 가든지 사람들이 감사를 표할 것입니다.//", [3] = "당신이 이룩한 모든 것에 감사합니다. 당신이 은퇴 생활을 즐기기를 바랍니다.//", [4] = "", }, [10] = { [1] = "%s 님에게//", [2] = "우리가 배정한 모든 병원을 성공적으로 운영한 것을 축하드립니다. 이러한 놀라운 성과로 볼 때, 당신은 세계의 모든 도시들을 자유롭게 방문할 자격이 있습니다. 당신은 $%d 만큼의 연금과 리무진을 방게 될 것이며, 다만 우리가 당신에게 원하는 것은 각 도시들을 여행하며 당신을 동경하는 대중을 만나고, 여기 저기에 있는 병원을 고무시키는 것입니다.//", [3] = "우리는 당신을 자랑스럽게 생각합니다. 단 한 사람도 인명을 구하는 일에 헌신한 당신의 노력에 감사를 표하지 않는 사람이 없습니다.//", [4] = "", }, [11] = { [1] = "%s 님에게//", [2] = "귀하의 커리어는 타의 모범이 되며, 우리 모두에게 영감을 줍니다. 그렇게 많은 병원을 운영하면서 모든 일을 훌륭히 처리해낸 것에 감사를 표합니다. 우리는 당신에게 평생 $%d 의 급료를 지급하고자 하며, 단 한가지 부탁드리는 것은 공식 오픈카를 타고 이 도시 저 도시를 여행하며, 어떻게 그 짧은 기간동안 그렇게 많은 일을 이룰 수 있었는지 강연을 해주셨으면 합니다.//", [3] = "당신은 바른 생각을 가진 모든 사람들의 귀감이며, 한 사람도 예외 없이 당신을 귀한 재산으로 여기고 있습니다.//", [4] = "", }, [12] = { [1] = "%s 님에게//", [2] = "모세 이후의 최고의 병원 책임자로서의 당신의 커리어가 끝을 향해가고 있습니다. 그러나, 의료계에서의 당신의 영향력은 지대하며, 보건부는 당신에게 $%d 의 급료를 지급하고 우리를 대표해서 여기 저기에서 행사에 참여하고 토크쇼 등에 출연해주셨으면 합니다. 온 세계가 당신으로 인해 떠들썩한 이 때에, 우리를 홍보하는 데 큰 도움이 될 겁니다!//", [3] = "이 제안을 꼭 수락해 주세요. 크게 어려운 일은 아닐 것이고, 승용차도 지급할 것이며 어디로 가시든지 경찰의 에스코트가 동반될 것입니다.//", [4] = "", }, custom_level_completed = "잘했습니다! 이 커스텀 레벨의 목표를 모두 달성했습니다!", dear_player = "%s 님에게", return_to_main_menu = "메인 메뉴로 돌아갑니까, 아니면 계속 플레이 합니까?", } high_score = { categories = { deaths = "사망 수", total_value = "총 가치", money = "돈", cures = "치료 수", visitors = "방문자 수", staff_number = "직원 수", cure_death_ratio = "치료 사망 비율", patient_happiness = "고객 만족도", staff_happiness = "직원 만족도", salary = "높은 임금", clean = "청결함", }, player = "플레이어", score = "점수", best_scores = "명예의 전당", worst_scores = "수치의 전당", killed = "죽임", } menu_file_save = { [1] = " 게임 1 ", [2] = " 게임 2 ", [3] = " 게임 3 ", [4] = " 게임 4 ", [5] = " 게임 5 ", [6] = " 게임 6 ", [7] = " 게임 7 ", [8] = " 게임 8 ", } build_room_window = { pick_department = "범주를 선택하세요", pick_room_type = "방 종류를 선택하세요", cost = "가격: ", } menu = { debug = " 디버그 ", display = " 화면 표시 ", file = " 파일 ", options = " 옵션 ", charts = " 도표 ", } CorsixTH-0.63/CorsixTH/Lua/languages/norwegian.lua000066400000000000000000005367621347163623700220720ustar00rootroot00000000000000--[[ Copyright (c) 2018 Erlend Mongstad, Ola Skogrand 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. ------------------------------------------------------------------------------- READ BEFORE DOING ANY CHANGES ------------------------------------------------------------------------------- Since the norwegian language isn't in the original Theme Hospital game, this file is split in two sections (A and B). The first section contains all the new language strings, made by the Corsix-TH team, and the second section contains the override translation of all the original english strings. FORMATING AND NORWEGIAN LETTERS This file contains UTF-8 text. Make sure your editor is set to UTF-8. For the norwegian letters ø and Ø, you must use the old-style ö and Ö instead. That is because the letters ø and Ø is not included in the original ingame-font. ------------------------------------------------------------------------------- Table of Contents ------------------------------------------------------------------------------- -- SECTION A - NEW STRINGS 1. Global settings 2. Faxes 3. Objects 4. Menu 5. Adviser 6. Dynamic info 7. Tooltip -- SECTION B - OLD STRINGS (OVERRIDE) Huge section with all original strings, translated from english. -----------------------------------------------------------------------------]] -- TODO GENERAL: Skal det benevnes "spill", "brett", "nivå" eller noe annet? ------------------------------------------------------------------------------- -- SECTION A - NEW STRINGS ------------------------------------------------------------------------------- -- 1. Global setings (do not edit!) --Font("unicode") --todo: Add unicode/freefont Language("Norsk", "Norwegian", "nb", "nob") Inherit("english") Encoding(utf8) -- 2. Faxes fax = { choices = { return_to_main_menu = "Gå tilbake til hovedmenyen", accept_new_level = "Fortsett til neste nivå", decline_new_level = "Fortsett å spille litt til", }, } letter = { dear_player = "Kjære %s", custom_level_completed = "Bra gjort! Du har fullfört alle utfordringene på dette brukerdefinerte brettet.!", return_to_main_menu = "Vil du gå tilbake til hovedmenyen eller fortsette å spille?", } install = { title = "--------------------------------- CorsixTH Setup ---------------------------------", exit = "Avslutt", th_directory = "CorsixTH trenger en kopi av datafilene fra et ekte Theme Hospital spill (eller demo) for å kjöre. Vennligst velg plasseringen til originalspillet nedenfor.", ok = "Ok", cancel = "Avbryt", } -- 3. Objects object = { litter = "Söppel", rathole = "Rottehull", } -- 4. Menu menu_options = { lock_windows = " LÅS VINDUER ", edge_scrolling = " KANTSCROLLING ", adviser_disabled = " RÅDGIVER ", warmth_colors = " VARMEFARGER", --Todo: Open for suggestions for a better word for it (warmth colours). } menu_options_game_speed.pause = " PAUSE " -- The demo does not contain this string menu_file.restart = " (%1%) RESTART " menu_debug = { jump_to_level = " GÅ TIL NIVÅ ", transparent_walls = " (%1%) GJENNOMSIKTIGE VEGGER ", limit_camera = " BEGRENS KAMERA ", disable_salary_raise = " DEAKTIVER LÖNNSÖKNINGER ", make_debug_patient = " LAG TESTPASIENT ", cheats = " (%1%) JUKSEKODER ", make_debug_fax = " LAG DEBUG FAKS ", dump_strings = " (%1%) DUMP SPRÅKSTRENGER ", dump_gamelog = " (%1%) DUMP SPILL-LOGGEN ", map_overlay = " KARTOVERLEGG ", sprite_viewer = " SPRITE-VISNING ", lua_console = " (%1%) LUA KONSOLL ", calls_dispatcher = " ANROPSEKSPEDERING ", } menu_debug_overlay = { none = " INGEN ", flags = " FLAGG ", positions = " POSISJONER ", heat = " TEMPERATUR ", byte_0_1 = " BYTE 0 & 1 ", byte_floor = " BYTE GULV ", byte_n_wall = " BYTE N VEGG ", byte_w_wall = " BYTE W VEGG ", byte_5 = " BYTE 5 ", byte_6 = " BYTE 6 ", byte_7 = " BYTE 7 ", parcel = " TOMT ", } -- 5. Adviser adviser = { room_forbidden_non_reachable_parts = "Ved å plassere et rom her vil noen områder på sykehuset bli utilgjengelig.", praise = { plants_are_well = "Det er fint. Du tar godt vare på plantene dine. Storartet.", few_have_to_stand = "Nesten ingen trenger å stå i Sykehuset ditt. Pasientene dine vil være glade for det.", plenty_of_benches = "Det er masse sitteplasser, så det er ikke noe problem.", plants_thriving = "Veldig bra. Plantene dine blomstrer. De ser fantastiske ut. Fortsett slik, så vinner du kanskje en trofé for dem." }, } -- 6. Dynamic info dynamic_info.patient.actions.no_gp_available = "Venter på at du skal bygge Allmennpraksis" dynamic_info.staff.actions.heading_for = "På vei til %s" dynamic_info.staff.actions.fired = "Sparket" -- 7. Tooltip tooltip = { fax = { close = "Lukk dette vinduet uten å slette meldingen", }, message = { button = "Venstreklikk for å lese faksen", button_dismiss = "Venstreklikk for å åpne faksen, höyreklikk for å ignorere den", }, options_window = { fullscreen_button = "Klikk for å gå i fullskjermmodus", width = "Skriv inn önsket skjermbredde", height = "Skriv inn önsket skjermhöyde", change_resolution = "Endre opplösningen til dimensjonene du har angitt til venstre.", language = "Velg %s som språk", back = "Lukk vinduet med innstillinger", fullscreen = "Om spillet skal kjöre i fullskjerm eller vindusmodus", cancel = "Returner uten å endre opplösning", apply = "Bruk den innskrevne opplösningen", language_dropdown_item = "Velg %s som språk", select_language = "Velg språk", select_resolution = "Velg en ny opplösning", resolution = "Opplösningen spillet skal kjöres i.", audio_button = "Slå av eller på all lyd", folder_button = "Mappeinnstillinger", audio_toggle = "Slå av eller på", customise_button = "¨Flere innstillinger", --todo: mer utfyllende beskrivelse? var "More settings you can change to customise your game play experience" capture_mouse = "Slå av eller på låsing av musepeker i spillvinduet", }, folders_window = { --todo: skrive mer konsekvent på "se etter", "velg" osv. browse_font = "Se etter en annen font-fil ( nåværende beliggenhet: %1% )", screenshots_location = "Skjermdumper er normalt lagret i en mappe sammen med konfigurasjonsfila. Om du önsker kan du plassere den et annet sted.", browse_music = "Se etter en annen lokasjon for musikk ( nåværende beliggenhet: %1% ) ", music_location = "Velg en lokasjon for mp3-musikk. Mappen må være laget på forhånd.", data_location = "Banen til den originale Theme Hospital-installasjonen, som du trenger for å spille CorsixTH", browse_data = "Se etter en annen lokasjon for Theme Hospital-installasjonen ( nåværende beliggenhet: %1%)", savegames_location = "Normalt er de lagrede spillene lagret i en mappe sammen med konfigurasjonsfila. Om du önsker kan du plassere den et annet sted.", back = "Lukk denne menyen og gå tilbake", browse_saves = "Se etter en annen lokasjon for dine lagrede spill ( nåværende beliggenhet: %1% ) ", browse = "Se etter mappelokasjon", browse_screenshots = "Se etter en annen lokasjon for skjermdumper ( nåværende beliggenhet: %1% ) ", not_specified = "Ingen mappe er valgt enda!", font_location = "Lokasjon for en font som kan vise Unicode-bokstaver som er nödvendig for ditt språk. Om denne ikke velges så er bokstavtyåene begrenset til de som er i Theme Hospital.", reset_to_default = "Tilbakestill mappen til standard lokasjon", default = "Standard lokasjon", no_font_specified = "Ingen font-fil er valgt enda!", }, update_window = { download = "Gå til nedlastingssiden for den seneste versjonen av CorsixTH", ignore = "Ignorer oppdateringen denne gangen. Du vil få en ny beskjed neste gang du starter CorsixTH", }, menu_list_window = { back = "Lukk dette vinduet", name = "Klikk her for å sortere listen etter navn", save_date = "Klikk her for å sortere listen etter siste endringer", }, save_game_window = { save_game = "Overskriv spill %s", new_save_game = "Skriv navn på nytt spill", }, custom_game_window = { free_build = "Huk av denne boksen om du vil spille uten penger og uten bestemte forutsetninger for å vinne eller tape", --todo: finne en bedre oversettelse eller omskrive load_selected_level = "Last og spill valgt brett", choose_game = "Klikk på et brett for å lese mer om det", }, load_game_window = { load_game = "Last spill %s", load_game_number = "Last spill %d", load_autosave = "Last autolagring", }, calls_dispatcher = { assigned = "Denne boksen er huket av om noen er tildet oppdraget.", task = "Liste over oppdrag - Klikk på oppdrag for å se lokasjonen", close = "Lukk ekspedisjonsvinduet", }, cheats_window = { close = "Lukk juksekodevinduet", cheats = { decrease_prices = "Senk alle priser med 50 % (min. 50 %)", increase_prices = "Hev alle priser med 50 % (maks. 200 %)", end_month = "Gå til slutten av denne måneden.", emergency = "Lag en nödssituasjon.", win_level = "Vinn dette nivået.", create_patient = "Lag en pasient på enden av kartet.", vip = "Lag en VIP.", money = "Sett 10,000 i bankkontoen din.", lose_level = "Tap dette nivået.", all_research = "Fullförer all forskning.", end_year = "Gå til slutten av dette året.", earthquake = "Forårsaker et jordskjelv.", epidemic = "Lager en smittsom pasient som kan forårsake en epidemi", toggle_infected = "Slå av eller på ikoner for smittsomme pasienter for den aktive, oppdagede epidemien", }, }, customise_window = { --todo kanskje en opprensking her. få det mer konsekvent. movies = "Slår av alle videoer i spillet", paused = " I Theme Hospital ville spilleren kun få lov til å bruke toppmenyen om spillet var satt til pause. Dette er standard i CorsixTH også, men ved å slå denne på, så er alle bevegelser lov", back = "Gå tilbake", intro = "Slå av eller på introfilmen. Den andre filminnstillingen må også være på for å spille av introfilmen hver ganger du starter spillet", volume = "Om en fysisk volum ned-knapp åpner Medisinboka i spillet, så kan du slå på denne for å endre hurtigtasten til Shift+C", fractured_bones = "På grunn av mangelfulle animasjoner har vi stilt standardoppsettet til å slå av kvinnelige benbrudd. For å tillate dette, slå denne av", aliens = "På grunn av manglende animasjoner har vi slått av pasienter med Utenomjordisk DNA slik at de bare kan komme fra nödstilfeller. For å tillate pasienter med Utenomjordisk DNA å gå til sykehuset, slå denne av.", average_contents = "Om du önsker at spillet skal huske hvilke objekter du vanligvis kjöper til hver rom (gjennomsnittlig), så bör du slå på denne", }, new_game_window = { easy = "Om du ikke har erfaring med simulatorspill er dette tingen for deg", medium = "Om du er usikker på hva du skal velge, så er dette mellomtingen", hard = "Om du er komfortabel med slike spill og önsker utfordring, bör du velge dette.", tutorial = "Om du önsker litt hjelp for å komme i gang må du merke av denne boksen.", cancel = "Hmm... Det var ikke meningen å starte et nytt spill!", difficulty = "Velg vanskelighetsgrad du vil spille på", start = "Start spillet med de valgte innstillingene", player_name = "Skriv inn hva du vil hete i spillet", }, lua_console = { textbox = "Skriv Lua-kode du vil kjöre her", execute_code = "Kjör koden", close = "Lukk konsollen", }, save_map_window = { map = "Overskriv brett %s", -- Overskriv/lagre? new_map = "Skriv inn navn for nytt brett", }, information = { close = "Lukk informasjonsdialogen", }, totd_window = { previous = "Vis forrige tips", next = "Vis neste tips", }, -- Research policy tooltip research_policy = { research_progress = "Progresjon mot den nesten oppdagelsen i denne kategorien: %1%/%2%", no_research = "Ingen forskning blir utfört i denne kategorien for öyeblikket", }, -- Build room window build_room_window = { room_classes = { diagnosis = "Velg diagnoserom", treatment = "Velg generelle behandlingsrom", clinic = "Velg spesielle klinikker", facilities = "Velg fasiliteter", }, cost = "Kostnad for gjeldende rom", close = "Avbryt prosessen og returner til spillet", }, -- Toolbar toolbar = { bank_button = "Venstreklikk for Bankmanager, höyreklikk for Kontoutskrift", balance = "Din Balanse", reputation = "Ditt omdömme: ", -- NB: no %d! Append " ([reputation])". date = "Dato", rooms = "Bygg rom", objects = "Kjöp gjenstander", edit = "Endre rom/gjenstander", hire = "Ansett personale", staff_list = "Personalbehandling", town_map = "Områdekart", casebook = "Medisinbok", research = "Forskning", status = "Status", charts = "Diagrammer", policy = "Sykehuspolicy", }, -- Hire staff window hire_staff_window = { doctors = "Vis Leger tilgjengelig på arbeidsmarkedet", nurses = "Vis Sykepleiere tilgjengelig på arbeidsmarkedet", handymen = "Vis Vaktmestere tilgjengelig på arbeidsmarkedet", receptionists = "Vis Resepsjonister tilgjengelig på arbeidsmarkedet", prev_person = "Vis forrige person", next_person = "Vis neste person", hire = "Ansett person", cancel = "Avbryt", doctor_seniority = "Legens erfaring (Turnuslege, Doktor, Konsulent)", staff_ability = "Evner", salary = "Lönnskrav", qualifications = "Legens spesialisering", surgeon = "Kirurg", psychiatrist = "Psykiater", researcher = "Forsker", }, -- Buy objects window buy_objects_window = { price = "Pris på gjenstand", total_value = "Total verdi på kjöpte gjenstander", confirm = "Kjöp gjenstand(er)", cancel = "Avbryt", increase = "Kjöp en til av denne gjenstanden", decrease = "Kjöp en mindre av denne gjenstanden", }, -- Staff list staff_list = { doctors = "Se en oversikt over dine Leger", nurses = "Se en oversikt over dine Sykepleiere", handymen = "Se en oversikt over dine Vaktmestere", receptionists = "Se en oversikt over dine Resepsjonister", happiness = "Viser hvordan humöret på dine ansatte er", tiredness = "Viser hvor trött dine ansatte er", ability = "Viser evnene til dine ansatte", salary = "Den enkeltes gjeldende lönn", happiness_2 = "Den ansattes moral", tiredness_2 = "Den ansattes tretthetsnivå", ability_2 = "Den ansattes evner", prev_person = "Velg forrige side", next_person = "Velg neste side", bonus = "Gi denne ansatte 10% bonus", sack = "Si opp denne ansatte", pay_rise = "Hev lönnen til denne ansatte med 10%", close = "Lukk og returner til spillet", doctor_seniority = "Legens erfaring", detail = "Oppmerksom på detaljer", view_staff = "Vis ansatt på jobb", surgeon = "Kvalifisert Kirurg", psychiatrist = "Kvalifisert Psykiater", researcher = "Kvalifisert Forsker", surgeon_train = "%d%% ferdig med fordypning innen kirurgi", -- %d (percentage trained) psychiatrist_train = "%d%% ferdig med fordypning innen psykiatri", -- %d (percentage trained) researcher_train = "%d%% ferdig med fordypning innen forskning", -- %d (percentage trained) skills = "Ekstra evner", }, -- Queue window queue_window = { num_in_queue = "Antall pasienter i köen", num_expected = "Antall pasienter Resepsjonisten forventer i köen innen kort tid", num_entered = "Antall pasienter som er behandlet i dette rommet så langt", max_queue_size = "Maksimal lengde på köen som Resepsjonisten skal etterstrebe", dec_queue_size = "Senk maksimal kölengde", inc_queue_size = "Ök maksimal kölengde", front_of_queue = "Dra en pasient hit for å stille han/henne fremst i köen", end_of_queue = "Dra en pasient hit for å stille han/henne bakerst i köen", close = "Lukk vindu", patient = "Dra en pasient for å flytte han/henne i köen. Höyreklikk på en pasient for å sende han/henne hjem eller til et konkurrerende sykehus", patient_dropdown = { reception = "Henvis pasient til Resepsjonist", send_home = "Send pasienten hjem", hospital_1 = "Henvis pasienten til et annet sykehus", hospital_2 = "Henvis pasienten til et annet sykehus", hospital_3 = "Henvis pasienten til et annet sykehus", }, }, -- Main menu main_menu = { new_game = "Start en ny karriere", -- todo: Nytt ord fore karriere (campaign)? custom_campaign = "Start en ny karriere skapt av andre spillere", -- todo: Nytt ord fore karriere (campaign)? custom_level = "Bygg sykehuset ditt på et brett skapt av andre spillere", -- todo: forbedre tekst? load_game = "Last inn et lagret spill", continue = "Fortsett på sist spilte spill", network = "Start nettverksspill", map_edit = "Lag ditt eget brett", quit = "Du er på vei til å avslutte spillet. Er du sikker på at du vil dette?", options = "Endre spillets innstillinger", exit = "Nei, nei, vær så snill, ikke avslutt!", load_menu = { load_slot = " SPILL [slotnumber] ", -- NB: no %d! Append " [slotnumber]". empty_slot = " TOM ", }, }, -- Window general window_general = { cancel = "Avbryt", confirm = "Bekreft", }, -- Custom campaign custom_campaign_window = { choose_campaign = "Velg en karriere for å lese mer om den", start_selected_campaign = "Last det förste brettet i denne karrieren", }, -- Patient window patient_window = { close = "Lukk vindu", graph = "Klikk for å veksle mellom graf med personens helse og personens behandlingshistorikk", happiness = "Personens humör", thirst = "Personens törste", warmth = "Personens temperatur", casebook = "Vis detaljer for pasientens sykdom", send_home = "Send pasienten hjem fra sykehuset", center_view = "Sentrer personen i skjermbildet", abort_diagnosis = "Send personen til behandling istedenfor å vente til diagnosen er ferdigstilt", queue = "Se köen pasienten befinner seg i", }, -- window staff_window = { name = "Den ansattes navn", close = "Lukk vindu", face = "Ansiktet til personen - Klikk for å administrere de ansatte", happiness = "Humörnivå", tiredness = "Tretthetsnivå", ability = "Evner", doctor_seniority = "Stilling (Turnuslege, Doktor, Konsulent)", skills = "Spesialisering", surgeon = "Kirurg", psychiatrist = "Psykiater", researcher = "Forsker", salary = "Månedslönn", center_view = "Venstreklikk for å finne den ansatte, höyreklikk for å bla gjennom de ansatte.", sack = "Si opp", pick_up = "Plukk opp", }, -- Machine window machine_window = { name = "Navn", close = "Lukk vindu", times_used = "Antall gangen maskinen er brukt", status = "Maskinstatus", repair = "Kall på Vaktmester for å fikse maskinen", replace = "Erstatt maskin", }, -- Handyman window -- Apparently handymen have their own set of strings (partly) containing "handyman". -- We could just get rid of this category and include the three prios into staff_window. handyman_window = { name = "Vaktmesterens navn", -- contains "handyman" close = "Lukk vindu", face = "Vaktmesterens ansikt", -- contains "handyman" happiness = "Humörnivå", tiredness = "Tretthetsnivå", ability = "Evner", prio_litter = "Be Vaktmesteren om å prioritere rengjöring av gulv höyere", -- contains "handyman" prio_plants = "Be Vaktmesteren om å prioritere vanning av planter höyere", -- contains "handyman" prio_machines = "Be Vaktmesteren om å prioritere reparasjon av maskiner höyere", -- contains "handyman" salary = "Månedslönn", center_view = "Sentrer i skjermbildet", -- contains "handyman" sack = "Si opp", pick_up = "Plukk opp", parcel_select = "Steder hvor Vaktmesteren utförer oppgaver. Klikk for å endre innstilling.", }, -- Place objects window place_objects_window = { cancel = "Avbryt", buy_sell = "Kjöp/Selg gjenstander", pick_up = "Plukk opp en gjenstand", confirm = "Bekreft", }, -- Casebook casebook = { up = "Rull oppover", down = "Rull nedover", close = "Lukk medisinbok", reputation = "Ryktet behandlingen eller diagnosen har i nærområdet", treatment_charge = "Pris for behandling", earned_money = "Totalt opptjente penger frem til i dag", cured = "Antall kurerte pasienter", deaths = "Antall pasienter drept som fölge av behandlingen", sent_home = "Antall pasienter som har snudd og gått hjem", decrease = "Senk pris", increase = "Ök pris", research = "Trykk her for å bruke forskingsbudsjettet for spesialisering til å forske på denne behandlingen", cure_type = { drug = "Denne behandlingen krever medisin", drug_percentage = "Denne behandlingen krever medisin - din er %d%% effektiv", -- %d (effectiveness percentage) psychiatrist = "En Psykiater kreves for behandling", surgery = "Denne sykdommen krever en operasjon", machine = "Denne sykdommen krever en maskin for behandling", unknown = "Du vet ikke hvordan du skal behandle denne sykdommen enda", }, cure_requirement = { possible = "Du kan gjennomföre behandling", research_machine = "Du må forske på maskiner for å gjennomföre behandlingen", build_room = "Du må bygge et rom for å gjennomföre behandlingen", -- NB: no %s! hire_surgeons = "Du trenger to Kirurger for å gjennomföre behandlingen", hire_surgeon = "Du trenger en Kirurg til for å gjennomföre behandlingen", hire_staff = "Du må ansette en %s for å gjennomföre behandlingen", -- %s (staff type) hire_staff_old = "Du må ansette en %s for å gjennomföre behandlingen", build_ward = "Du må bygge en Sykestue for å kunne gjennomföre behandlingen", ward_hire_nurse = "Du trenger en Sykepleier på Sengeavdelingen for å gjennomföre behandlingen", not_possible = "Du kan ikke håndtere denne behandlingen enda", }, }, -- Statement statement = { close = "Lukk kontoutskriften", }, -- Research research = { close = "Gå ut av forskningsavdelingen", cure_dec = "Senk prioritering av forskning på behandlingsutstyr", diagnosis_dec = "Senk prioritering av forskning på diagnoseutstyr", drugs_dec = "Senk prioritering av forskning på medisiner", improvements_dec = "Senk prioritering av forskning på forbedringer", specialisation_dec = "Senk prioritering av forskning på spesialiseringer", cure_inc = "Ök prioritering av forskning på behandlingsutstyr", diagnosis_inc = "Ök prioritering av forskning på diagnoseutstyr", drugs_inc = "Ök prioritering av forskning på medisiner", improvements_inc = "Ök prioritering av forskning på forbedringer", specialisation_inc = "Ök prioritering av forskning på spesialiseringer", allocated_amount = "Penger satt av til forskning", }, -- Graphs graphs = { close = "Gå ut av diagramvinduet", scale = "Skala på diagram", money_in = "Vis/skjul Inntekter", money_out = "Vis/skjul Utgifter", wages = "Vis/skjul Lönninger", balance = "Vis/skjul Balanse", visitors = "Vis/skjul Besökende", cures = "Vis/skjul Kurerte", deaths = "Vis/skjul Dödsfall", reputation = "Vis/skjul Omdömme", }, -- Town map town_map = { people = "Vis/Skjul mennesker", plants = "Vis/Skjul planter", fire_extinguishers = "Vis/Skjul brannslukningsapparat", objects = "Vis/Skjul gjenstander", radiators = "Vis/Skjul radiatorer", heat_level = "Temperatur", heat_inc = "Skru opp temperaturen", heat_dec = "Skru ned temperaturen", heating_bill = "Varmekostnader", balance = "Balanse", close = "Lukk områdekart", }, -- Jukebox. jukebox = { current_title = "Jukebox", close = "Lukk jukebox", play = "Spill jukebox", rewind = "Spol tilbake jukebox", fast_forward = "Spol fremover jukebox", stop = "Stopp jukebox", loop = "Repeter jukebox", }, -- Bank Manager bank_manager = { hospital_value = "Nåværende verdi på sykehuset ditt", balance = "Din balanse i banken", current_loan = "Gjeldende lån i banken", repay_5000 = "Betal tilbake 5000 til banken", borrow_5000 = "Lån 5000 av banken", interest_payment = "Månedlige rentekostnader", inflation_rate = "Årlig inflasjon", interest_rate = "Årlig rente", close = "Lukk bankmanageren", insurance_owed = "Penger %s skylder deg", -- %s (name of debitor) show_graph = "Vis forventet tilbakebetalingsplan fra %s", -- %s (name of debitor) graph = "Forventet tilbakebetalingsplan fra %s", -- %s (name of debitor) graph_return = "Returner til forrige visning", }, -- Status status = { percentage_cured = "Du må kurere %d% besökende på sykehuset ditt. Nå har du kurert %d%", thirst = "Gjennomsnittlig törste på personene på ditt sykehus", close = "Lukk oversikten", population_chart = "Figur som viser hvor stor andel av lokalbefolkningen hvert sykehus tiltrekker seg", win_progress_own = "Vis progresjon i forhold til kravene for dette nivået", reputation = "Omdömmet ditt må være minst %d. Nå er det %d", population = "Du må ha %d%% av befolkningen til å bruke ditt sykehus", warmth = "Gjennomsnittlig temperatur på personene på ditt sykehus", percentage_killed = "Du må drepe færre enn %d%% av dine besökende. Så langt har du tatt livet av %d%%", balance = "Din bankbalanse må være på minst %d. Nå er den %d", value = "Sykehuset ditt må være verdt $%d. Så langt er det verdt $%d", win_progress_other = "Vis progresjon i forhold til kravene for dette nivået for %s", -- %s (name of competitor) num_cured = "Du må kurere %d mennesker. Så langt har du kurert %d", happiness = "Gjennomsnittlig humör på personene på ditt sykehus", }, -- Policy policy = { close = "Lukk sykehuspolicy", staff_leave = "Klikk her for å få personale som ikke er opptatt til å hjelpe kollegaer som trenger det", staff_stay = "Klikk her for å få personale til å bli i rommene du plasserer dem i", diag_procedure = "Om en Leges stilte diagnose er mindre sikker enn SEND HJEM prosenten, vil pasienten bli sendt hjem. Om diagnosen er sikrere enn GJETT KUR prosenten, vil pasienten sendes til aktuell behandling", diag_termination = "En pasients diagnostisering vil fortsette helt til Legene er så sikker som AVBRYT PROSESS prosenten, eller til alle diagnosemaskiner er forsökt på pasienten", staff_rest = "Hvor trött personalet må være för de kan hvile", }, -- Pay rise window pay_rise_window = { accept = "Imötekom kravene", decline = "Ikke godta kravene - Si opp istedenfor", }, -- Watch watch = { hospital_opening = "Byggetid: Dette er tiden du har igjen för sykehuset åpner. Klikk på ÅPNE-knappen, så vil sykehuset åpne umiddelbart.", emergency = "Nödstilfelle: Tid som gjenstår til å behandle alle akutte pasienter.", epidemic = "Epidemi: Tid som gjenstår til å skjule epidemien. Når tiden er ute ELLER en smittsom pasient forlater sykehuset, så kommer en Helseinspektör på besök. Knappen skrur av og på vaksineringsmodus. Klikk på pasienter for å få en Sykepleier til å vaksinere dem.", }, -- Rooms rooms = { gps_office = "Pasientene får sin förste konsultasjon og tilhörende resultater på Allmennpraksisen", psychiatry = "Psykiatrien kurerer gale pasienter og hjelper til med diagnostiseringen av andre pasienter, men trenger en Lege med spesialisering innenfor Psykiatri", ward = "Sengeavdelinger er nyttige for både diagnostisering og behandling. Pasienter blir sendt hit for observasjon men også for overvåkning etter operasjoner. Sengeavdelingen krever en Sykepleier", operating_theatre = "Operasjonssalen krever to Leger med spesialisering innenfor Kirurgi", pharmacy = "Sykepleieren skriver ut medisiner på apoteket for å kurere pasienter", cardiogram = "En Lege bruker Kardio for å diagnostisere pasienter", scanner = "En Lege bruker Skanneren for å diagnostisere pasienter", ultrascan = "En Lege bruker Ultraskanneren for å diagnostisere pasienter", blood_machine = "En Lege bruker Blodmaskinen for å diagnostisere pasienter", x_ray = "En Lege bruker Röntgen for å diagnostisere pasienter", inflation = "En Lege bruker Pumperommet for å behandle pasienter med Ballonghode", dna_fixer = "En Lege bruker DNA-maskinen for å behandle pasienter med Utenomjordisk DNA", hair_restoration = "En Lege bruker Hårklinikken for å behandle pasienter med Flintskalle", tongue_clinic = "En Lege bruker Tungekutteren for å behandle pasienter med Lös tunge", fracture_clinic = "En Sykepleier bruker Benbruddsklinikken for å reparere Benbrudd", training_room = "Et klasserom med en Konsulent kan brukes til å lære opp andre Leger", electrolysis = "En Lege bruker Elektrolyseklinikken for å behandle pasienter med Pelssyndrom", jelly_vat = "En Lege bruker Gelétönnen for å behandle pasienter med Gelésyndrom", staffroom = "Leger, Sykepleiere og Vaktmestre bruker personalrommet for å hvile og heve humöret", -- rehabilitation = S[33][27], -- unused general_diag = "En Lege bruker trallen for å stille grunnleggende diagnose på pasienter. Billig og ofte veldig effektivt", research_room = "Leger med spesialisering innen Forskning kan forske frem nye medisiner og maskiner på Forskningsavdelingen", toilets = "Bygg toaletter for å få pasientene til å stoppe å skitne til sykehuset!", decontamination = "En Lege bruker Saneringsdusjen for å behandle pasienter med Alvorlig Stråling", }, -- Objects objects = { -- NB: most objects do not have a tooltip because they're not (extra-)buyable desk = "Pult: en Lege kan bruke pulten til PC-en sin.", cabinet = "Kabinett: inneholder pasientdata, notater og forskningsdokumenter.", door = "Dör: personer åpner og lukker disse en del.", bench = "Benk: gir pasienter en plass å sitte og gjör ventingen mer komfortabel.", table1 = S[40][ 6], -- unused chair = "Stol: Pasienter sitter her og diskuterer sine problemer.", drinks_machine = "Brusautomat: hindrer pasientene å bli törste og genererer inntekter.", bed = "Seng: virkelig syke pasienter ligger i disse.", inflator = "Pumpe: Kurerer pasienter med Ballonghode.", pool_table = "Biljardbord: Hjelper personalet ditt med å slappe av.", reception_desk = "Resepsjon: trenger en Resepsjonist som kan henvise pasienter videre.", table2 = S[40][13], -- unused & duplicate cardio = S[40][14], -- no description scanner = S[40][15], -- no description console = S[40][16], -- no description screen = S[40][17], -- no description litter_bomb = "Söppelbombe: saboterer konkurrenters sykehus", couch = S[40][19], -- no description sofa = "Sofa: ansatte som slapper av på Personalrommet vil sitte stille i en sofa så fremt det ikke er en bedre måte å slappe av på.", crash_trolley = S[40][21], -- no description tv = "TV: sörg for at personalet ditt ikke går glipp av favorittprogrammet sitt.", ultrascanner = S[40][23], -- no description dna_fixer = S[40][24], -- no description cast_remover = S[40][25], -- no description hair_restorer = S[40][26], -- no description slicer = S[40][27], -- no description x_ray = S[40][28], -- no description radiation_shield = S[40][29], -- no description x_ray_viewer = S[40][30], -- no description operating_table = S[40][31], -- no description lamp = S[40][32], -- unused toilet_sink = "Vask: dine hygienebevisste pasienter kan vaske sine tilgrisede hender i disse. Om det ikke er nok vasker, blir pasientene sure.", op_sink1 = S[40][34], -- no description op_sink2 = S[40][35], -- no description surgeon_screen = S[40][36], -- no description lecture_chair = "Forelesningsstol: dine Legestudenter sitter her og tar notater, kjeder seg og rabler ivrig. Jo flere stoler du har, jo större kan klassen være.", projector = S[40][38], -- no description bed2 = S[40][39], -- unused duplicate pharmacy_cabinet = "Apotekskap: medisinbeholdningen din finnes her", computer = "Datamaskin: genialt forskningsverktöy", atom_analyser = "Atomanalyser: plassert i Forskningsavdelingen, gjör denne gjenstanden hele forskningsprosessen raskere.", blood_machine = S[40][43], -- no description fire_extinguisher = "Brannslukningsapparat: minimerer faren for feil i dine maskiner.", radiator = "Radiator: sörger for at sykehuset ditt ikke blir kaldt.", plant = "Plante: holder pasientenes humör oppe og renser luften.", electrolyser = S[40][47], -- no description jelly_moulder = S[40][48], -- no description gates_of_hell = S[40][49], -- no description bed3 = S[40][50], -- unused duplicate bin = "Söppelbötte: pasientene kaster söppelet her.", toilet = "Toalett: pasientene, æh..., bruker dette.", swing_door1 = S[40][53], -- no description swing_door2 = S[40][54], -- no description shower = S[40][55], -- no description auto_autopsy = "Obduksjonsautomat: flott hjelpemiddel for å oppdage nye behandlingsmetoder.", bookcase = "Bokhylle: referansemateriell for Leger.", video_game = "Videospill: la personalet ditt slappe av med Hi-Octane.", entrance_left = S[40][59], -- no description entrance_right = S[40][60], -- no description skeleton = "Skjelett: brukt til undervisning og Halloween.", comfortable_chair = S[40][62], -- no description rathole = "Hjemmet til en rottefamilie som syns sykehuset ditt er mökkete nok til å bo i.", litter = "Söppel: Slengt på gulvet av en pasient, fordi vedkommende ikke fant en söppelbötte i nærheten.", }, -- TOOLTIP END } -- STRINGS BELOW ARE NOT YET FULLY SORTED -- Misc misc.not_yet_implemented = "(ikke implementert enda)" misc.no_heliport = "Enten er ingen sykdommer utforsket enda, eller så er det ingen heliport ved dette sykehuset." -- Main menu main_menu = { new_game = "Ny karriere", custom_level = "Valgfritt brett", load_game = "Last inn", options = "Innstillinger", version = "Versjon: ", continue = "Fortsett siste spill", savegame_version = "Lagringsversjon: ", --todo: en bedre oversettelse eller omskriving? custom_campaign = "Brukerskapt karriere", -- todo: en bedre oversettelse eller omskriving? map_edit = "Brettkonstruksjon", exit = "Avslutt", } load_game_window = { caption = "Last inn spill", } custom_game_window = { caption = "Brukerdefinert spill", free_build = "Bygg fritt", load_selected_level = "Start", } save_game_window = { caption = "Lagre spill", new_save_game = "Nytt spill", } menu_list_window = { back = "Tilbake", name = "Navn", save_date = "Endret", } options_window = { fullscreen = "Fullskjerm", width = "Bredde", height = "Höyde", change_resolution = "Endre opplösning", back = "Tilbake", cancel = "Avbryt", custom_resolution = "Egendefinert...", option_on = "På", option_off = "Av", caption = "Innstillinger", language = "Språk", apply = "Bruk", resolution = "Opplösning", folder = "Mapper", audio = "Global lyd", customise = "Tilpass", capture_mouse = "Lås musepeker", } folders_window = { screenshots_location = "Velg banen du vil bruke for skjermdumper", music_label = "MP3", --todo: annet ordvalg? "MP3's" back = "Tilbake", savegames_label = "Lagrede spill", --todo: annet ordvalg? "saves" caption = "Mappebane", --todo: annet ordvalg? "folder locations" savegames_location = "Velg banen du vil bruke for lagrede spill", font_label = "Font", new_th_location = "Her kan du spesifisere en ny bane for Theme Hospital. Spillet startes på nytt når du velger en ny bane.", screenshots_label = "Skjermdumper", music_location = "Velg banen du vil bruke for musikk", data_label = "TH-data", --todo: annet ordvalg? "TH Data" } update_window = { current_version = "Gjeldende versjon:", ignore = "Hopp over og gå til hovedmenyen", new_version = "Ny versjon:", caption = "Oppdatering tilgjengelig!", download = "Gå til nedlastingsside", } font_location_window = { caption = "Velg font (%1%)", } calls_dispatcher = { repair = "Reparere %s", summary = "%d Tilkallinger; %d tildelt", close = "Lukk", watering = "Vanne @ %d,%d", staff = "%s - %s", } cheats_window = { close = "Lukk", caption = "Juksekoder", warning = "Advarsel: Du vil ikke få noen bonuspoeng på slutten av nivået om du bruker juksekoder!", cheated = { no = "Juksekoder benyttet: Nei", yes = "Juksekoder benyttet: Ja", }, cheats = { decrease_prices = "Senk prisene", increase_prices = "Hev prisene", end_month = "Slutten av måneden", emergency = "Lag nödstilfelle", win_level = "Vinn nivå", create_patient = "Lag pasient", vip = "Lag VIP", money = "Penger", lose_level = "Tap nivå", all_research = "All forskning", end_year = "Slutten av året", earthquake = "Lag jordskjelv", epidemic = "Lag smittsom pasient", toggle_infected = "Slå av/på smitte-ikoner", }, } new_game_window = { easy = "Turnuslege (Lett)", medium = "Lege (Medium)", hard = "Konsulent (Vanskelig)", tutorial = "Innföring", cancel = "Avbryt", option_on = "På", option_off = "Av", difficulty = "Vanskelighetsgrad", caption = "Karriere", player_name = "Spillernavn", start = "Start", } customise_window = { movies = "Global videostyring", option_on = "På", option_off = "Av", back = "Tilbake", paused = "Bygging i pause", intro = "Spill introvideo", volume = "Hurtigtast volumsenking", caption = "Egendefinerte innstillinger", fractured_bones = "Benbrudd", average_contents = "Gjennomsnittlig rominnhold", aliens = "Utenomjordiske pasienter", } lua_console = { execute_code = "Kjör", close = "Lukk", } errors = { dialog_missing_graphics = "Beklager, datafilene i demoen tillater ikke denne dialogen.", save_prefix = "Feil under lagring av spill: ", load_prefix = "Feil under lasting av spill: ", load_quick_save = "Spillet kunne ikke laste inn sist hurtiglagring, siden den ikke eksisterer. Vi har ikke tenkt til å lage en for deg!", map_file_missing = "Kunne ikke finne kartfilen %s for dette nivået!", minimum_screen_size = "Vennligst sett opplösningen til minst 640x480.", unavailable_screen_size = "Skjermopplösningen du valgte er ikke tilgjengelig i fullskjermmodus.", alien_dna = "Merk: Det er ingen originale animasjoner for utenomjordiske pasienter som sitter, åpner eller banker på dörer osv. Utenomjordiske vil bare komme på besök om det er slått på i levelfila", --todo: bedre beskrivelse? levelfila? var "NOTE: There are no animations for Alien patients for sitting down, opening or knocking on doors etc. So, like with Theme Hospital to do these things they will appear to change to normal looking and then change back. Patients with Alien DNA will only appear if they are set to in the level file" fractured_bones = "Merk: De originale animasjonene for kvinnelige personer med benbrudd er ikke perfekte", no_games_to_contine = "Det fins ingen lagrede spill", could_not_load_campaign = "Lasting av brettet feilet: %s", -- todo: skal det kalles "brett" her? could_not_find_first_campaign_level = "Kunne ikke finne det förste brettet i denne karrieren: %s", -- todo: skal det hete karrieren her? } confirmation = { needs_restart = "Å forandre denne innstillingen krever en omstart av CorsixTH. Spill som ikke er lagret vil gå tapt. Er du sikker på at du vil endre innstillingen?", abort_edit_room = "Du holder på å bygge eller endre et rom. Om alle obligatoriske gjenstander er plassert ut, ferdigstilles rommet. Om ikke, slettes rommet. Fortsette?", } information = { custom_game = "Velkommen til CorsixTH. Kos deg med dette egenutviklede kartet!", no_custom_game_in_demo = "Unnskyld, men i demoversjonen kan du ikke spille egenutviklede kart.", cannot_restart = "Dette spillet ble dessverre lagret för restartfunksjonen ble implementert.", very_old_save = "Det har vært mange oppdateringer siden du startet på dette nivået. For å være sikker på at alle funksjoner virker riktig, vennligst vurder å starte nivået på nytt.", cheat_not_possible = "Juksekoder kan ikke brukes på dette nivået. Du klarer ikke engang å jukse!", level_lost = { "Kjipt! Du klarte ikke brettet. Bedre lykke neste gang!", "Grunnen til at du tapte:", reputation = "Omdömmet ditt gikk under %d.", balance = "Banksaldoen din (minus lån) falt under %d.", percentage_killed = "Du drepte mer enn %d prosent av pasientene.", --bruke %-tegn? cheat = "Dette var ditt eget valg, eller trykket du bare på feil knapp? Du klarer ikke engang å jukse skikkelig. Det var ikke så morsomt likevel?", }, } -- Tips totd_window = { tips = { "Ethvert sykehus trenger en Resepsjon og en Allmennpraksis for å fungere. Etter det avhenger det av hvilke pasienter som besöker sykehuset. Apotek er som regel en god start.", "Maskiner som f.eks. Pumpen i Pumperommet trenger vedlikehold. Ansett en Vaktmester eller to for å vedlikeholde maskinene, ellers risikerer du å skade ansatte og pasienter.", "Etter en stund blir personalet ditt trött. Sörg for å bygge et Personalrom så de kan hvile seg.", "Plasser radiatorer nok til å holde pasientene og personalet varme, ellers blir de fort misfornöyd. Bruk kartet for å lokalisere områder på sykehuset ditt som trenger mer varme.", "En Lege sine evner påvirker hvor langt tid han bruker på å stille diagnose, samt kvaliteten på diagnosen. Plasser en flink Lege i Allmennpraksisen, da trenger du færre diagnoserom.", "Turnusleger og Doktorer kan utvikle sine evner ved å bli undervist av en Konsulent i Klasserommet. Om Konsulenten har spesielle kvalifikasjoner (Kirurgi, Psykiatri eller Forskning) vil han også lære sine elever dette.", "Har du prövd å slå inn det europeiske nödnummeret (112) på faksen? Sörg for at lyden er på!", "Du kan forandre noen innstillinger som opplösning og språk i innstillinger-vinduet som du finner på hovedmenyen eller på menyen inne i spillet.", "Hvert nivå har en rekke utfordringer som må fullföres för du kan gå videre til neste nivå. Sjekk statusen på utfordringene for nivået i Statusvinduet.", "Om du vil endre eller fjerne et rom, kan du gjöre det med å klikke på Endre Rom knappen på panelet i bunnen av skjermen.", "Du kan alltids finne fort ut hvilke pasienter som venter på å slippe inn i de ulike rommene, ved å flytte musepekeren over rommet.", "Klikk på dören til et rom for å se köen. Du kan gjöre nyttige finjusteringer her, som å organisere köen og sende pasienter til andre lignende rom.", "Irritert personale vil spörre om lönnspålegg jevnlig. Sörg for at dine ansatte jobber i komfortable omgivelser for å hindre at det skjer.", "Pasientene svetter av spenning når de venter på behandling, og gjerne enda mer om du fyrer opp varmen. Plasser noen Brusautomater i strategiske punkter på sykehuset for å tjene noen ekstra lapper.", "Du kan avbryte diagnose-prosessen ganske tidlig og gjette på riktig behandling, dersom du allerede har truffet på tilfeller av sykdommen. Vær oppmerksom på at dette öker sjangsen for feilbehandling. Du vil vel ikke avlive pasientene dine, vel?", "Nödtilfeller kan gjöre deg rik, så sant du har kapasitet til å behandle pasientene i tide.", "Har du valgt norsk språk, men ser likevel engelsk tekst rundt omkring i spillet? Hjelp oss å oversette resten av spillet til norsk!", "CorsixTH-teamet er ute etter forsterkninger! Er du interessert i å programmere, oversette, eller kanskje lage grafikk til CorsixTH? Kontakt oss gjennom Forum, Nyhetsbrev eller IRC (corsix-th på freenode).", "Om du finner feil eller mangler, vær snill å rapportere det gjennom vår feilmeldingstjeneste: th-issues.corsix.org", }, previous = "Forrige tips", next = "Neste tips", } -- Mapmaker? save_map_window = { -- Usikker på om denne hörer til her, eller om den skal flyttes? caption = "Lagre brett (%1%)", new_map = "Nytt brett", } -- Custom campaign custom_campaign_window = { caption = "Brukerskapte karrierer", -- todo: Forbedre? Sjekke om det passer når spillet har implementer dette. start_selected_campaign = "Start karriere", } map_editor_window = { -- Sjekkes når de er implementert. Mulig hjelpeteksten må korrigeres! pages = { pond = "Dam", hedgerow = "Hekk", inside = "Innside", -- Riktig? Innvendig? outside = "Utside", road = "Vei", delete_wall = "Slett vegger", parcel_9 = "Tomt 9", camera_1 = "Kamera 1", camera_2 = "Kamera 2", camera_3 = "Kamera 3", camera_4 = "Kamera 4", foliage = "Beplantning", west_wall = "Vestvegg", north_wall = "Nordvegg", helipad = "Helikopterplass", parcel_0 = "Tomt 0", parcel_1 = "Tomt 1", parcel_2 = "Tomt 2", parcel_3 = "Tomt 3", parcel_4 = "Tomt 4", parcel_5 = "Tomt 5", parcel_6 = "Tomt 6", -- Riktig å bruke "tomt"? parcel_7 = "Tomt 7", parcel_8 = "Tomt 8", paste = "Innlimingsområde", heliport_1 = "Helikopterplass 1", heliport_2 = "Helikopterplass 2", heliport_3 = "Helikopterplass 3", heliport_4 = "Helikopterplass 4", }, } ------------------------------------------------------------------------------- -- SECTION B - OLD STRINGS (OVERRIDE) ------------------------------------------------------------------------------- -- Staff class -- each of these corresponds to a sprite staff_class = { nurse = "Sykepleier", doctor = "Lege", handyman = "Vaktmester", receptionist = "Resepsjonist", surgeon = "Kirurg", } -- Staff titles -- these are titles used e.g. in the dynamic info bar staff_title = { receptionist = "Resepsjonist", general = "Generelt", -- unused? nurse = "Sykepleier", junior = "Turnuslege", doctor = "Doktor", surgeon = "Kirurg", psychiatrist = "Psykiater", consultant = "Konsulent", researcher = "Forsker", } -- Pay rises pay_rise = { definite_quit = "Du kan ikke gjöre noe for å beholde meg lenger. Jeg er ferdig her!", regular = { "Jeg er helt utslitt. Jeg trenger en god pause, pluss en lönnsökning på %d om du ikke vil se meg gå rundt å sutre i korridorene.", -- %d (rise) "Jeg er veldig trött. Jeg trenger hvile og en lönnsökning på %d, totalt %d. Fiks det nå, din tyrann!", -- %d (rise) %d (new total) "Kom igjen. Jeg jobber som en hund her. Gi meg en bonus på %d og jeg blir på sykehuset ditt.", -- %d (rise) "Jeg er så deppa. Jeg krever en lönnsökning på %d, som blir totalt %d, ellers er jeg ferdig her.", -- %d (rise) %d (new total) "Foreldrene mine sa at medisinyrket ville gi meg mye penger. Så gi meg en lönnsökning på %d, ellers blir jeg spillutvikler istedenfor.", -- %d (rise) "Nå er jeg sint. Gi meg en anstendig lönn. Jeg tror en ökning på %d skal gjöre susen.", -- %d (rise) }, poached = "Jeg er blitt tilbudt %d av %s. Om ikke du gir meg det samme, så stikker jeg.", -- %d (new total) %s (competitor) } -- Staff descriptions staff_descriptions = { good = { [1] = "Veldig rask og flittig arbeider. ", [2] = "Veldig pliktoppfyllende. Meget omsorgsfull. ", [3] = "Er meget allsidig. ", [4] = "Vennlig og alltid i godt humör. ", [5] = "Ekstremt utholden. Jobber dag og natt. ", [6] = "Utrolig höflig og har gode manerer. ", [7] = "Utrolig talentfull og dyktig. ", [8] = "Er meget opptatt av å prestere på jobben. ", [9] = "Er en perfeksjonist som aldri gir opp. ", [10] = "Hjelper alltid mennesker med et smil. ", [11] = "Sjarmerende, höflig og hjelpsom. ", [12] = "Godt motivert og dedikert til jobben. ", [13] = "Snill av natur og meget hardt arbeidende. ", [14] = "Lojal og vennlig. ", [15] = "Omtenksom og til å stole på i akutte situasjoner. ", }, misc = { [1] = "Spiller golf. ", [2] = "Dykker etter kamskjell. ", [3] = "Lager isskulpturer. ", [4] = "Drikker vin. ", [5] = "Kjörer rally. ", [6] = "Bedriver strikkhopping på fritiden. ", [7] = "Samler på ölbrikker. ", [8] = "Liker å stage-dive. ", [9] = "Morer seg med fjert-surfing. ", [10] = "Liker å utvide elver. ", [11] = "Destillerer whisky. ", [12] = "Gjör-det-selv ekspert. ", [13] = "Liker franske kunstfilmer. ", [14] = "Spiller mye Theme Park. ", [15] = "Har sertifikat klasse C. ", [16] = "Deltar i motorsykkelrace. ", [17] = "Spiller klassisk fiolin og cello. ", [18] = "Entusiastisk tog-vraker. ", [19] = "Hundeelsker. ", [20] = "Hörer på radio. ", [21] = "Bader ofte. ", [22] = "Instruktör i bambusfletting. ", [23] = "Lager såpeholdere av grönnsaker. ", [24] = "Deltids minerydder. ", [25] = "Quizvert. ", [26] = "Samler på splinter fra 2.verdenskrig. ", [27] = "Liker å ommöblere. ", [28] = "Hörer på rave og trip-hop musikk. ", [29] = "Dreper insekter med deodorantspray. ", [30] = "Piper ut dårlige standupartiser. ", [31] = "Gjör innkjöp for sykehusrådet. ", [32] = "Hemmelighetsfull gartner. ", [33] = "Smugler falske klokker. ", [34] = "Vokalist i et rockeband. ", [35] = "Forguder tv-titting på dagtid. ", [36] = "Fisker etter örret. ", [37] = "Lurer turister på museum. ", }, bad = { [1] = "Langsom og masete. ", [2] = "Lat og lite motivert. ", [3] = "Dårlig trent og ubrukelig. ", [4] = "Dum og slitsom. Er en reserve. ", [5] = "Lav utholdenhet. Har en dårlig holdning. ", [6] = "Döv som et papir. Lukter kål. ", [7] = "Skitner til jobben. Tar lite ansvar. ", [8] = "Konsentrasjonsvansker og lett distrahert. ", [9] = "Stresset og gjör mye feil. ", [10] = "Lett antennelig. Sitter inne med mye hat. ", [11] = "Uforsiktig og uheldig. ", [12] = "Bryr seg ikke om jobben. Inaktiv. ", [13] = "Dumdristig og bryr seg lite. ", [14] = "Slu, utspekulert og baksnakker andre. ", [15] = "Arrogant og ovenpå. ", }, } -- Staff list staff_list = { morale = "MORAL", tiredness = "TRETTHET", skill = "FERDIGHETER", total_wages = "TOTAL LÖNN", } -- Objects object = { desk = "Kontorpult", cabinet = "Arkivskap", door = "Dör", bench = "Benk", table1 = "Bord", -- unused object chair = "Stol", drinks_machine = "Brusautomat", bed = "Seng", inflator = "Pumpe", pool_table = "Biljardbord", reception_desk = "Resepsjon", table2 = "Bord", -- unused object & duplicate cardio = "Kardio", scanner = "Skanner", console = "Konsoll", screen = "Skjerm", litter_bomb = "Söppelbombe", couch = "Sofa", sofa = "Sofa", crash_trolley = "Tralle", tv = "TV", ultrascanner = "Ultraskanner", dna_fixer = "DNA-fikser", cast_remover = "Gipsfjerner", hair_restorer = "Hårrenoverer", slicer = "Tungekutter", x_ray = "Röntgen", radiation_shield = "Strålingsvern", x_ray_viewer = "Röntgenfremviser", operating_table = "Operasjonsbord", lamp = "Lampe", -- unused object toilet_sink = "Vask", op_sink1 = "Vask", op_sink2 = "Vask", surgeon_screen = "Forheng", lecture_chair = "Forelesningsstol", projector = "Prosjektor", bed2 = "Seng", -- unused duplicate pharmacy_cabinet = "Medisinskap", computer = "Datamaskin", atom_analyser = "Atomanalyser", blood_machine = "Blodmaskin", fire_extinguisher = "Brannslukningsapp.", radiator = "Radiator", plant = "Plante", electrolyser = "Elektrolysator", jelly_moulder = "Gelétönne", gates_of_hell = "Helvetesporten", bed3 = "Seng", -- unused duplicate bin = "Söppelbötte", toilet = "Toalett", swing_door1 = "Svingdör", swing_door2 = "Svingdör", shower = "Saneringsdusj", auto_autopsy = "Obdksjonsautomat", bookcase = "Bokhylle", video_game = "Videospill", entrance_left = "Inngang venstre dör", entrance_right = "Inngang höyre dör", skeleton = "Skjelett", comfortable_chair = "Komfortabel stol", } -- Place objects window place_objects_window = { drag_blueprint = "Juster blåkopien til du er fornöyd med störrelsen", place_door = "Velg hvor dören skal være", place_windows = "Lag noen vinduer om du vil. Bekreft når du er ferdig", place_objects = "Plasser gjenstandene. Bekreft når du er fornöyd", confirm_or_buy_objects = "Du kan ferdigstille rommet, evt. fortsette å kjöpe eller flytte gjenstander", pick_up_object = "Klikk på gjenstander for å plukke de opp, eller gjör et annet valg fra boksen", place_objects_in_corridor = "Plasser gjenstander i korridoren", } -- Competitor names competitor_names = { [1] = "ORAKEL", [2] = "HALL", [3] = "KOLOSS", [4] = "SLAMSUGER", [5] = "HELLIG", [6] = "DYPE TANKER", [7] = "ZEN", [8] = "LEO", [9] = "AKIRA", [10] = "SAM", [11] = "CHARLIE", [12] = "JANNE", [13] = "ARTUR", [14] = "MAGNUS", [15] = "MAMMA", [16] = "STEFAN", [17] = "MATS", [18] = "JONAS", [19] = "DANIEL", [20] = "OLIVIA", [21] = "NILS", [22] = "THOR", [23] = "RISK", [24] = "NIC", } -- Months months = { "Jan", "Feb", "Mar", "Apr", "Mai", "Jun", "Jul", "Aug", "Sep", "Okt", "Nov", "Des", } -- Date format date_format.daymonth = "%1% %2:months%" -- Graphs graphs = { money_in = "Inntekter", money_out = "Utgifter", wages = "Lönninger", balance = "Balanse", visitors = "Besökende", cures = "Kurerte", deaths = "Dödsfall", reputation = "Omdömme", time_spans = { "1 år", "12 år", "48 år", } } -- Transactions transactions = { --null = S[8][ 1], -- not needed wages = "Lönninger", hire_staff = "Ansett personale", buy_object = "Kjöp inv.", build_room = "Bygg rom", cure = "Kur", buy_land = "Kjöp område", treat_colon = "Behandling:", final_treat_colon = "Siste behandling:", cure_colon = "Kurert:", deposit = "Behandlingsinnskudd", advance_colon = "Forskudd:", research = "Forskningskostnader", drinks = "Inntekt: Brusautomater", jukebox = "Inntekt: Jukebox", -- unused cheat = "Monopolpenger", heating = "Oppvarmingskostnader", insurance_colon = "Forsikring:", bank_loan = "Banklån", loan_repayment = "Bankinnskudd", loan_interest = "Lånerente", research_bonus = "Forskningsbonus", drug_cost = "Medisinkostnader", overdraft = "Strafferente", severance = "Oppsigelseskostnader", general_bonus = "Bonus Generell", sell_object = "Salg inventar", personal_bonus = "Bonusutbetaling Personale", emergency_bonus = "Bonusutbetaling Nödstilfeller", vaccination = "Vaksinering", epidemy_coverup_fine = "Opprydningskostnader epidemiutbrudd", compensation = "Statlig erstatning", vip_award = "Pengepremier VIP", epidemy_fine = "Epidemiböter", eoy_bonus_penalty = "Årsbonus/böter", eoy_trophy_bonus = "Årets trofé bonus", machine_replacement = "Utskiftning av maskiner", } -- Level names level_names = { "Giftigby", "Soveby", "Storestad", "Frimpton-på-Sjöen", "Lettåker", "Varberget", "Langtbort", "Halvestrad", "Austby", "Eggtorp", "Kvekkestad", "Snylteby", "Polartorp", "Lille Riseby", "Gravland", } -- Town map town_map = { chat = "Bykart Chat", for_sale = "Til salgs", not_for_sale = "Ikke til salgs", number = "Tomt nummer", owner = "Tomt eier", area = "Tomt område", price = "Tomt pris", } -- Rooms short -- NB: includes some special "rooms" -- reception, destroyed room and "corridor objects" rooms_short = { reception = "Resepsjon", destroyed = "Ödelagt", corridor_objects = "Korridorgjenstander", gps_office = "Allmennpraksis", psychiatric = "Psykiatri", ward = "Sykestue", operating_theatre = "Operasjonssal", pharmacy = "Apotek", cardiogram = "Kardio", scanner = "Skanner", ultrascan = "Ultraskanner", blood_machine = "Blodmaskin", x_ray = "Röntgen", inflation = "Pumperom", dna_fixer = "DNA-klinikk", hair_restoration = "Hårklinikk", tongue_clinic = "Tungeklinikk", fracture_clinic = "Benbruddsklinikk", training_room = "Klasserom", electrolysis = "Elektrolyseklinikk", jelly_vat = "Gelétönne", staffroom = "Personalrom", -- rehabilitation = "Rehabilitering", -- unused general_diag = "Generell diagnose", research_room = "Forskningsavd.", toilets = "Toalett", decontamination = "Saneringsklinikk", } -- Rooms long rooms_long = { general = "Generell", -- unused? emergency = "Nödstilfelle", corridors = "Korridorer", gps_office = "Allmennpraksis", psychiatric = "Psykiatri", ward = "Sykestue", operating_theatre = "Operasjonssal", pharmacy = "Apotek", cardiogram = "Kardiorom", scanner = "Skannerrom", ultrascan = "Ultraskanner", blood_machine = "Blodmaskinrom", x_ray = "Röntgenrom", inflation = "Pumperom", dna_fixer = "DNA-klinikk", hair_restoration = "Hårklinikk", tongue_clinic = "Tungeklinikk", fracture_clinic = "Benbruddsklinikk", training_room = "Klasserom", electrolysis = "Elektrolyseklinikk", jelly_vat = "Gelétönnerom", staffroom = "Personalrom", -- rehabilitation = "Rehabiliteringsrom", -- unused general_diag = "Generell diagnose", research_room = "Forskningsavd.", toilets = "Toalett", decontamination = "Saneringsklinikk", } room_descriptions = { ultrascan = { [1] = "Ultraskanner//", [2] = "Ultraskanneren er virtuelt i toppklassen innenfor diagnoseutstyr. Den koster mye, men det lönner seg om du vil ha superb diagnostisering på ditt sykehus.//", [3] = "Ultraskanneren kan kun håndteres av ".. staff_class.doctor .."r. Den krever også vedlikehold. ", }, gp = { [1] = "Allmennpraksis//", [2] = "Dette er det fundamentale diagnoserommet på ditt sykehus. Nye pasienter blir sendt hit for å finne ut hva som feiler dem. Videre blir de sendt enten til dypere diagnostisering eller til et rom hvor de kan få behandling for sine plager. Du trenger sannsynligvis flere Allmennpraksiser om det oppstår lange köer. Jo större rommet er og jo mer utstyr du plasserer i rommet, desto bedre presterer Legen. Dette gjelder også for alle andre rom.//", [3] = "Allmennpraksisen kan kun håndteres av Leger. ", }, fracture_clinic = { [1] = "Benbruddsklinikk//", [2] = "Pasienter som uheldigvis har Benbrudd vil bli behandlet her. Gipsfjerneren bruker en kraftig industrilaser for å kutte vekk gipsen, og forårsaker bare litt smerte for pasienten.//", [3] = "Benbruddsklinikken kan kun håndteres av Sykepleiere. Den krever også vedlikehold. ", }, tv_room = { [1] = "TV ROOM NOT USED", }, inflation = { [1] = "Pumperom//", [2] = "Pasienter med sitt smertefulle, men dog humoristiske Ballonghode, må behandles på Pumperommet. Her blir hodet stukket hull på, trykket forsvinner, og en Lege pumper hodet opp til riktig trykknivå.//", [3] = "Pumperommet kan kun håndteres av Leger. Regelmessig vedlikehold er også viktig. ", }, jelly_vat = { [1] = "Gelétönne//", [2] = "Pasienter med den snodige sykdommen gelésyndrom må skjelve seg fram til gelétönnerommet, for så å bli plassert i gelétönnen. Dette vil kurere dem på en måte som ikke er helt begripelig for det medisinske faget.//", [3] = "Gelétönnen kan kun håndteres av Leger. Det kreves også vedlikehold. ", }, scanner = { [1] = "Skanner//", [2] = "Pasienter får veldig nöyaktig diagnostisert sin sykdom ved bruk av den sofistikerte Skanneren. Deretter går de til Allmennpraksisen og snakker med en Lege for videre behandling.//", [3] = "Skanneren kan kun håndteres av Leger. Det kreves også vedlikehold. ", }, blood_machine = { [1] = "Blodmaskin//", [2] = "Blodmaskinen er et diagnoseverktöy som sjekker alle cellene i pasientens blod for å finne ut hva som feiler dem.//", [3] = "Blodmaskinen kan kun håndteres av Leger. Det kreves også vedlikehold. ", }, pharmacy = { [1] = "Apotek//", [2] = "Pasienter som har blitt diagnostisert og trenger behandling av et medikament må besöke Apoteket for å få medisinen sin. Ettersom fler og fler medisinkurer er forsket på og blir tilgjengelige, blir dette rommet stadig travlere. Du önsker kanskje å bygge et nytt Apotek senere.//", [3] = "Apoteket kan kun håndteres av Sykepleiere. ", }, cardiogram = { [1] = "Kardiorom//", [2] = "Pasienter blir undersökt og diagnostisert her, för de går tilbake til Allmennpraksisen for å få utpekt en kur.//", [3] = "Kardiorommet kan kun håndteres av Leger. Det kreves også vedlikehold. ", }, ward = { [1] = "Sykestue//", [2] = "Pasientene blir lagt inn her for observasjon av en Sykepleier mens de diagnostiseres. De forblir her til de er klare for å legges under kniven på Operasjonssalen.//", [3] = "Sengeavdelingen kan kun håndteres av Sykepleiere. ", }, psych = { [1] = "Psykiatri//", [2] = "Pasienter diagnostisert med psykiske lidelser må gå til Psykiatrien for å få rådgivning. Psykiatrene kan kjöre diagnose for å finne ut hva slags type sykdom pasientene lider av, og hvis mental opprinnelse, så behandle dem ved å benytte den trygge sofaen.//", [3] = "Psykiatrien kan kun håndteres av kvalifisert Psykiater. ", }, staff_room = { [1] = "Personalrom//", [2] = "De ansatte blir slitne etter hvert som de utförer pliktene sine. De trenger dette rommet for å slappe av og heve humöret. Om de ansatte er slitne, så blir de tregere, krever mer lönn og vil til slutt si opp. De gjör også flere feilgrep. Å bygge et Personalrom med masse aktiviteter for dem er vel anvendte penger. Pass på at det er plass til flere ansatte på en gang. ", }, operating_theatre = { [1] = "Operasjonssal//", [2] = "Denne viktige installasjonen er der en rekke forhold blir behandlet. Operasjonssalen må være av en god störrelse, og må fylles med riktig utstyr. Det er en viktig del av sykehuset.//", [3] = "Operasjonssalen kan kun håndteres av to Kvalifiserte Kirurger. ", }, training = { [1] = "Klasserom//", [2] = "Turnuslegene og Doktorene dine kan få, verdifulle, ekstra kvalifikasjoner ved å studere i dette rommet. En Konsulent med Kirurgi-, Forsker- eller Psykiatri-fordypning vil lære bort dette til de Legene som sitter i rommet. Leger som allerede har disse ferdighetene vil bli enda flinkere mens de er her.//", [3] = "Klasserommet kan kun håndteres av en Konsulent. ", }, dna_fixer = { [1] = "DNA-klinikk//", [2] = "Pasienter som har befattet seg med romvesener fra en annen verden må få DNA-et sitt byttet ut i dette rommet. DNA-fikseren er en veldig kompleks maskin, og det ville være fornuftig å holde et brannslukningsapparat i nærheten av den, bare i tilfelle.//", [3] = "DNA-fikseren kan kun håndteres av en kvalifisert Forsker. Den behöver periodisk vedlikehold av en Vaktmester. ", }, research = { [1] = "Forskningsavdeling//", [2] = "Nye medikamenter og kurer blir funnet opp og forbedret i Forskningsavdelingen. Det er en vital del av sykehuset ditt, og vil gjöre underverker for kureringsstatistikken din.//", [3] = "Forskningsavdelingen kan kun håndteres av en kvalifisert Forsker. ", }, hair_restoration = { [1] = "Hårklinikk//", [2] = "Pasienter som lider av ekstreme tilfeller av Flintskallethet må henvende seg til Hårrenoveringsmaskinen i denne klinikken. En Lege vil operere maskinen, og den vil sette avleggere i pasientens hode som raskt blir til nytt hår.//", [3] = "Hårklinikken kan kun håndteres av Leger. Det kreves også periodisk vedlikehold. ", }, general_diag = { [1] = "Generell Diagnose//", [2] = "Pasienter som trenger videre diagnose blir sendt hit for undersökelse. Om Allmennpraksisen ikke finner ut hva som feiler dem, så vil Generell Diagnose ofte finne det ut. Herfra vil de bli sendt tilbake til Allmennpraksisen for analyse av resultatet.//", [3] = "Generell Diagnose kan kun håndteres av Leger. ", }, electrolysis = { [1] = "Elektrolyseklinikk//", [2] = "Pasienter med Pelssyndrom blir sendt hit, hvor en spesialmaskin brenner av håret og forsegler porene elektrisk med en sammensetning som ikke er ulik fugemasse.//", [3] = "Elektrolyseklinikken kan kun håndteres av Leger. Den behöver vedlikehold av en Vaktmester. ", }, slack_tongue = { [1] = "Tungeklinikk//", [2] = "Pasienter som blir diagnostisert med Lös tunge fra Allmennpraksisen, vil bli sendt til denne klinikken for behandling. Legen bruker en höyteknologisk maskin som forlenger tungen og kutter den av, dermed bringes pasienten tilbake til normal, god helse.//", [3] = "Tungekutteren kan kun håndteres av Leger. Det kreves også vedlikehold nok så ofte. ", }, toilets = { [1] = "Toalett//", [2] = "Pasienter som föler at naturen kaller, må gå og lette på trykket i dine behagelige toalettfasiliteter. Du kan bygge ekstra toalettbåser og vasker om du forventer mange besökende. I noen tilfeller bör du kanskje vurdere å bygge flere Toaletter andre steder i sykehuset. ", }, no_room = { [1] = "", }, x_ray = { [1] = "Röntgenrom//", [2] = "Röntgenmaskinen fotograferer pasientenes innside ved bruk av spesiell stråling for å gi en god indikasjon på hva som er galt med dem.//", [3] = "Röntgenmaskinen kan kun håndteres av Leger. Det kreves også vedlikehold. ", }, decontamination = { [1] = "Saneringsklinikk//", [2] = "Pasienter som har blitt utsatt for Stråling blir fort henvist til Saneringsklinikken. Dette rommet inneholder en dusj som skyller av dem all den vemmelige Radioaktiviteten og skitt.//", [3] = "Saneringsdusjen kan kun håndteres av Leger. Den behöver vedlikehold av en Vaktmester. ", }, } -- Drug companies drug_companies = { "Medisiner-For-Deg", "Kur R Oss", "Runde Små Piller Co.", "Dyremedisin AS", "Alle Piller Co.", } -- Build rooms build_room_window = { pick_department = "Velg avdeling", pick_room_type = "Velg romtype", cost = "Pris: ", } -- Build objects buy_objects_window = { choose_items = "Velg gjenstander", price = "Pris:", total = "Sum:", } -- Research research = { categories = { cure = "Behandlingsutstyr", diagnosis = "Diagnoseutstyr", drugs = "Medisinforskning", improvements = "Forbedringer", specialisation = "Spesialisering", }, funds_allocation = "Tildelt fondmiddel", allocated_amount = "Tildelt belöp", } -- Policy screen policy = { header = "SYKEHUSPOLICY", diag_procedure = "diagnoserutiner", diag_termination = "diagnostisering", staff_rest = "pauserutiner", staff_leave_rooms = "forlate rom", sliders = { guess = "GJETT KUR", -- belongs to diag_procedure send_home = "SEND HJEM", -- also belongs to diag_procedure stop = "AVBRYT PROSESS", -- belongs to diag_termination staff_room = "TIL PERSONALROM", -- belongs to staff_rest } } -- Rooms room_classes = { -- S[19][2] -- "corridors" - unused for now diagnosis = "Diagnose", treatment = "Behandling", clinics = "Klinikker", facilities = "Fasiliteter", } -- Insurance companies insurance_companies = { out_of_business = "IKKE I DRIFT", "Nykjöpt Lök", "Böljan Blå", "Årlige Forskudd AS", "Stygge Arr Co.", "Svömmeblære Co.", "Dönn Ehrlig AS", "Sverres Beholdninger", "Kate Pus Og Kompani", "Larsen Jr. Forsikring", "Glade Forsikringer AS", "Mafia Forsikringer", } -- Menu root -- Keep 2 spaces as prefix and suffix menu = { file = " FIL ", options = " INNSTILLINGER ", display = " VIS ", charts = " OVERSIKTER ", player_count = "SPILLERANTALL", -- In map editor debug = " DEBUG ", } -- Menu File menu_file = { load = " (%1%) LAST INN ", save = " (%1%) LAGRE ", restart = " (%1%) START PÅ NYTT ", quit = " (%1%) AVSLUTT ", } menu_player_count = { -- In map editor players_1 = " 1 SPILLER ", players_2 = " 2 SPILLERE ", players_3 = " 3 SPILLERE ", players_4 = " 4 SPILLERE ", } menu_file_load = { [1] = " SPILL 1 ", [2] = " SPILL 2 ", [3] = " SPILL 3 ", [4] = " SPILL 4 ", [5] = " SPILL 5 ", [6] = " SPILL 6 ", [7] = " SPILL 7 ", [8] = " SPILL 8 ", } menu_file_save = { [1] = " SPILL 1 ", [2] = " SPILL 2 ", [3] = " SPILL 3 ", [4] = " SPILL 4 ", [5] = " SPILL 5 ", [6] = " SPILL 6 ", [7] = " SPILL 7 ", [8] = " SPILL 8 ", } -- Menu Options menu_options = { sound = " (%1%) LYD ", announcements = " (%1%) SPEAKER ", music = " (%1%) MUSIKK ", sound_vol = " LYDVOLUM ", announcements_vol = " SPEAKERVOLUM ", music_vol = " MUSIKKVOLUM ", autosave = " AUTOLAGRING ", game_speed = " SPILLHASTIGHET ", jukebox = " (%1%) JUKEBOX ", twentyfour_hour_clock = " 24 TIMERS KLOKKE ", wage_increase = " LÖNNSBEGJÆRINGER", --todo: annet ord? "wage requests" capture_mouse = " LÅS MUSEPEKER ", } menu_options_wage_increase = { deny = " AVSLÅ ", grant = " GODKJENN ", } -- Menu Options Volume menu_options_volume = { [10] = " 10% ", [20] = " 20% ", [30] = " 30% ", [40] = " 40% ", [50] = " 50% ", [60] = " 60% ", [70] = " 70% ", [80] = " 80% ", [90] = " 90% ", [100] = " 100% ", } -- Menu Options Game Speed menu_options_game_speed = { slowest = " (%1%) TREGEST ", slower = " (%1%) TREGERE ", normal = " (%1%) NORMAL ", max_speed = " (%1%) MAKSIMAL HASTIGHET ", and_then_some_more = " (%1%) ENDA LITT RASKERE ", } -- Menu Options Warmth Colours menu_options_warmth_colors = { choice_1 = " RÖD ", choice_2 = " BLÅ GRÖNN RÖD ", choice_3 = " GUL ORANGE RÖD ", } -- Menu Display menu_display = { high_res = " HÖY OPPLÖSNING ", mcga_lo_res = " MCGA LAV OPPL. ", shadows = " SKYGGER ", } -- Menu Charts menu_charts = { statement = " (%1%) KONTOUTSKRIFT ", casebook = " (%1%) MEDISINBOK ", policy = " (%1%) SYKEHUSPOLICY ", research = " (%1%) FORSKNING ", graphs = " (%1%) DIAGRAMMER ", staff_listing = " (%1%) PERSONALBEHANDLING ", bank_manager = " (%1%) BANKMANAGER ", status = " (%1%)STATUS ", briefing = " BRIEFING ", town_map = " (%1%) BYKART ", } -- Menu Debug menu_debug = { object_cells = " OBJEKTCELLER ", entry_cells = " INNGANGSCELLER ", keep_clear_cells = " KEEP-CLEAR CELLER ", nav_bits = " NAV BITS ", remove_walls = " FJERN VEGGER ", remove_objects = " FJERN GJENSTANDERER ", display_pager = " VIS PAGER ", mapwho_checking = " MAPWHO SJEKK ", plant_pagers = " PLANT PAGERS ", porter_pagers = " PORTER PAGERS ", pixbuf_cells = " PIXBUE CELLS ", enter_nav_debug = " SKRIV INN NAV DEBUG ", show_nav_cells = " VIS NAV CELLS ", machine_pagers = " MASKIN PAGERS ", display_room_status = " VIS ROMSTATUS ", display_big_cells = " VIS STORE CELLER ", show_help_hotspot = " VIS HJELP HOTSPOTS ", win_game_anim = " VINN SPILL ANIM ", win_level_anim = " VINN BANE ANIM ", debug_script = " (%1%) KJÖR DEBUG SCRIPT ", connect_debugger = " (%1%) KOBLE TIL LUA DEBUG SERVER ", lose_game_anim = { [1] = " TAPT SPILL 1 ANIM ", [2] = " TAPT SPILL 2 ANIM ", [3] = " TAPT SPILL 3 ANIM ", [4] = " TAPT SPILL 4 ANIM ", [5] = " TAPT SPILL 5 ANIM ", [6] = " TAPT SPILL 6 ANIM ", [7] = " TAPT SPILL 7 ANIM ", }, } debug_patient_window = { caption = "Testpasient", } -- High score screen high_score = { pos = "POS", player = "SPILLER", score = "POENG", best_scores = "HALL OF FAME", worst_scores = "HALL OF SHAME", killed = "Drepte", -- is this used? categories = { money = "RIKEST", salary = "HÖYESTE LÖNN", clean = "RENSLIGHET", cures = "ANTALL KURERT", deaths = "ANTALL DÖDSFALL", cure_death_ratio = "ANTALL BEHANDLINGSDÖDSFALL", patient_happiness = "TILFREDSTILLHET PASIENTER", staff_happiness = "TILFREDSTILLHET PERSONALE", staff_number = "MEST PERSONALE", visitors = "FLEST PASIENTER", total_value = "TOTAL VERDI", }, } -- Trophy room trophy_room = { reputation = "OMDÖMME", cash = "KONTANTER", wait_times = { award = { [1] = "Gratulerer. Sykehuset ditt har lav kötid i lang tid. Dette er en viktig pris.", --todo: skal det brukes ordet "pris"? }, penalty = { [1] = "Pasienter i sykehuset ditt må stå for lenge i kö. Det er alltid uakseptabelt lange köer. Du kunne behandlet pasientene dine mer effektivt, om du bare hadde gått inn for det.", }, }, pop_percentage = { awards = { [1] = "Legg merke til at du har fått en höy andel av byen befolkning til ditt sykehus det siste året. Bra gjort", [2] = "Gratulerer. En höyere andel av lokalbefolkningen besöker sykehuset ditt enn noen andre institusjoner.", [3] = "Strålende. Du har lokket mer av befolkningen inn ditt sykehus enn det som har besökt alle de andre sykehusene til sammen.", }, penalty = { [1] = "Merk deg at du fikk en höy andel av byen befolkningen til sykehuset ditt det siste året. Godt gjort.", [2] = "Gratulerer. En höyere andel av lokalbefolkningen besöker sykehuset ditt enn noen av de andre institusjonene.", }, }, many_cured = { awards = { [1] = "Gratulerer med Marie Curie Prisen for å ha klart å kurere nesten alle pasientene på sykehuset ditt i fjor.", [2] = "Gratulerer med å ha kurert mengder av pasienter det siste året. Mange mennesker föler seg mye bedre på grunn av ditt arbeid.", }, trophies = { [1] = "Den Internasjonale Behandlingsstiftelsen önsker å ære deg fordi du kurerte en haug med mennesker på sykehuset ditt i fjor. De gir deg derfor Kurert-En-Haug Trofeet.", [2] = "Du er blitt tildelt Ingen-Syke-Gurglere troféet for å ha kurert en stor prosent av pasientene på sykehuset ditt i fjor.", [3] = "Du er blitt tildelt Ingen-Syke-Gurglere troféet for å ha kurert en stor prosent av pasientene på sykehuset ditt i fjor.", --todo: Denne er overflödig (dobbelt opp), men debug-strings-diff.txt insisterer på at denne linjen skal være her. }, penalty = { [1] = "Ditt sykehus klarer ikke å gi effektive botemidler til pasienter som trenger det. Konsentrer deg om dine kurer for å gjöre dem mer effektive.", [2] = "Ditt sykehus er mindre effektivt ved kurering av pasienter enn noen annen. Du har sviktet departementet og du har sviktet deg selv. Vi sier ikke mer.", }, regional = { [1] = "Du er herved tildelt Den-Ultimate-Kur-prisen for å ha kurert flere mennesker enn alle de andre sykehusene til sammen.", }, }, research = { regional_good = { [1] = "Din forskning har holdt ditt sykehus à jour med den siste utviklingen. Ditt forskningspersonale fortjener denne prisen. Godt gjort.", }, regional_bad = { [1] = "Alle andre sykehus i regionen er bedre på forskning enn deg. Forskning bör være en avgjörende del av sykehuset ditt. Departementet er rasende.", }, penalty = { [1] = "Du har vært dårlig på å forske på nye kurer, utstyr og legemidler. Dette er svært dårlig. Teknologisk utvikling er viktig.", }, awards = { [1] = "Din forskning har holdt ditt sykehus à jour med den siste utviklingen. Ditt forskningspersonale fortjener denne prisen. Godt gjort.", [2] = "I löpet av det siste året, har du forsket på flere legemidler og utstyr enn noen kunne ha håpet på. Vennligst godta denne prisen fra alle oss i departementet.", }, }, gen_repairs = { awards = { [1] = "Du er tildelt en spesiell premie for dine Vaktmesteres evne til å holde sykehusets maskiner velholdt. Godt gjort. Ta en ferie.", [2] = "Dine Vaktmestere har gjort det bedre enn noen andre sykehus. Dette er en stor prestasjon for deg.", [3] = "Dine maskiner er praktfullt vedlikeholdt. Dedikasjonen til dine Vaktmestere er ekstraordinær. Dere fortjener denne utmerkelsen. Strålende arbeid.", }, penalty = { [1] = "Vaktmesterne har ikke vedlikeholdt dine maskiner godt. Du bör kontrollere dem mer nöye, eller ansette flere til å håndtere arbeidsmengden.", [2] = "Du har gjort et dårlig vedlikehold. Vaktmesterne bör se til utstyret straks.", }, }, curesvdeaths = { awards = { [1] = "Solide gratulasjoner på å oppnå et imponerende kurerte kontra dödsfall-forhold på sykehuset det siste året.", }, penalty = { [1] = "Din andel av kurerte-vs-dödsfall-forhold er ekstremt dårlig. Du bör sörge for at du kurerer mange flere mennesker enn du lot dö. Ikke svikt oss.", }, }, emergencies = { regional_good = { [1] = "Departementet erkjenner at sykehuset håndterte kriser bedre enn noen andre sykehus i fjor og gir deg denne prisen.", }, regional_bad = { [1] = "Ditt sykehus er det verste i regionen til å håndtere kriser. Det er din skyld at du blir liggende nederst i den lokale akuttbehandlingsligaen.", }, penalty = { [1] = "Du har vært dårlig til å håndtere kriser. Innkommende beredskap pasientene fortjener rask og nöyaktig oppmerksomhet, som du har unnlatt å gi.", }, award = { [1] = "Gratulerer: din effektive håndtering av kriser har gjort deg fortjent til denne spesielle prisen. Godt arbeid.", [2] = "Din håndtering av kriser er eksepsjonell. Denne prisen er for å være den absolutt beste på å håndtere stor tilströmning av syke og lidende.", }, }, cleanliness = { award = { [1] = "Inspektörer gjör oppmerksom på at sykehuset er veldig rent. Rene sykehus er trygge sykehus. Hold oppe det gode arbeidet.", }, regional_good ={ [1] = "Ditt sykehus har blitt bemerket som en av de minst rene i området. Et skitten sykehus er stinkende og farlig. Du bör sette mer oppmerksomhet på å fjerne rot.", }, regional_bad = { [1] = "Ditt sykehus er det skitneste i regionen. Alle andre har klart å beholde sine korridorer renere. Du er en skam for den medisinske profesjon.", }, }, happy_patients = { awards ={ [1] = "Du kan være selvtilfreds om det faktum at folk i sykehuset har vært svært fornöyde i löpet av det siste året.", [2] = "Personer som besöker sykehuset ditt var gjennomsnittlig lykkeligere under deres behandling hos deg enn på noe annet sykehus i spillet.", }, penalty = { [1] = "Folk som kommer til sykehuset ditt synes opplevelsen er elendig. Du må gjöre det mye bedre hvis du önsker å få respekt av departementet.", [2] = "Folk som får behandling på sykehuset ditt var svært misfornöyd med tilstanden der. Du bör sette mer fokus på pasientenes velferd.", }, }, consistant_rep = { trophies = { [1] = "Du er herved tildelt statsrådens pris for de mest plettfrie standarder og höyest mulig omdömme i år. Bra gjort.", [2] = "Gratulerer. Du mottar GnukkiRen-Troféet for sykehuset med best omdömme det siste året. Vel fortjent er det også.", }, }, all_cured = { awards = { "Gratulerer med Marie Curie Prisen for å ha klart å kurere alle pasienter på sykehuset ditt i fjor.", }, trophies = { "Den Internasjonale Behandlingsstiftelsen önsker å ære deg fordi du kurerte alle pasienter på sykehuset ditt i fjor. De gir deg derfor Kurert-Alle Trofeet.", "Du er blitt tildelt Ingen-Syke-Gurglere Trofeet for å ha kurert alle pasienter på sykehuset ditt i fjor.", }, }, high_rep = { awards = { [1] = "Du er herved tildelt statsministerens Glitrende Sykehusstandard Pris, som tildeles sykehuset med best omdömme i fjor. Flott!", [2] = "Vær snill å ta imot Bullfrog-prisen som tildeles sykehuset med best omdömme i fjor. Nyt det - det er vel fortjent!", }, penalty = { [1] = "Man skal være veldig disiplinert for å klare å opprettholde et så dårlig rykte gjennom hele det siste året. Sörg for at det forbedrer i fremtiden.", [2] = "Ditt Sykehus sitt omdömme er det verste i området. Du er en skam. Gjör det bedre eller få deg en annen jobb.", }, regional = { [1] = "Vennligst godta Bullfrog-prisen for det höyeste omdömmet det siste året. Nyt det - du har fortjent det.", [2] = "I år har ditt sykehus sitt omdömme overgått alle de andre sykehusene til sammen. En stor prestasjon.", }, }, happy_staff = { awards = { [1] = "De ansatte gir deg denne prisen. De sier det er rom for forbedringer, men behandlingen av dem var generelt god.", [2] = "De ansatte er så glad å arbeide for deg at kan de ikke holde smilet borte fra ansiktene sine. Du er en ypperlig sjef.", }, trophies = { "Du er tildelt Smilefjes Trofeet for å holde ditt hardt-arbeidende personale så blid og fornöyd som mulig.", "Instituttet for Humörspredere berömmer deg for at du ikke hadde noen sure og sinte ansatte på sykehuset ditt i fjor, og gir deg derfor dette trofeet.", "Dette troféet, Stråle Mer Begeret, er herved tildelt deg for å ha klart å holde alt personell blid og fornöyd, tross en iherdig arbeidsinnsats i fjor. Dine ansatte stråler!", }, penalty = { [1] = "De ansatte önsker det skal bli kjent at de er svært misfornöyde. Gode ansatte er en ressurs. Gjör dine lykkeligere, ellers vil du miste dem en dag.", }, regional_good = { [1] = "De ansatte er lykkeligere enn på noe annet sykehus. Glade ansatte betyr mer overskudd og mindre död. Departementet er fornöyd.", }, regional_bad = { [1] = "De ansatte har alle vært veldig sure det siste året. Du burde ha lagt merke til at alle andre sykehus har lykkeligere personalet enn deg.", }, }, happy_vips = { trophies = { [1] = "Du har vunnet Nobelprisen for Mest Imponerte VIP-er. Alle som besökte sykehuset i fjor var svært komplimenterende.", [2] = "Byrået for Kjente Personer vil belönne deg med Kjendistroféet for å ha tatt godt vare på alle VIP-er som besökte institusjonen din i fjor. Du nærmer deg kjendis-status, nesten en av oss.", [3] = "Gratulerer med VIP-prisen for å ha gjort livene til hardtarbeidende kjendiser bedre, ved å sette alle som besökte sykehuset ditt i fjor i et bedre lys. Fantastisk.", }, }, no_deaths = { awards = { [1] = "Du har vunnet Leve Lenge-troféet for å holde 100 prosent av pasientene levende i hele fjor.", [2] = "Du har fått denne prisen til minne om lavt antall dödsfall på ditt sykehus dette året. Dette er flott.", }, trophies = { [1] = "Livet Går Videre Stiftelsen belönner deg med dette trofeet for å ha oppnådd null dödsfall i hele fjor.", [2] = "Du er tildelt Holde Seg I Live-troféet for å ha unngått dödsfall på ditt flotte sykehus dette året. Storartet.", [3] = "Du er tildelt Holde Seg I Live-troféet for å ha unngått dödsfall på ditt flotte sykehus dette året. Storartet.", --todo: Denne er overflödig (dobbelt opp), men debug-strings-diff.txt insisterer på at denne linjen skal være her. }, penalty = { [1] = "Antallet dödsfall i sykehuset ditt i fjor var uakseptabelt höyt. Gi mer oppmerksomhet til ditt arbeid. Vær sikker på at flere mennesker overlever i fremtiden.", [2] = "Ditt sykehus er en risiko for pasientenes helse. Du forventes å kurere mange mennesker, ikke la dem dö.", }, regional = { [1] = "Dödstallene i ditt sykehus i fjor var lavere enn noen andre sykehus. Vennligst godta denne prisen.", }, }, rats_killed = { awards = { }, trophies = { "Du er tildelt Null Uhyrer Trofeet for å ha skutt %d rotter på sykehuset ditt i löpet av fjoråret.", -- %d (number of rats) "Du mottar dette trofeet fra Organisasjonen Mot Rotter og Mus, pga. dine unike rotteskytende evner. Du drepte %d dyr i fjor.", -- %d (number of rats) "Du mottar Rotteskytter Trofeet for å ha vist unike evner i utryddelsen av %d rotter på sykehuset ditt i fjor.", -- %d (number of rats) }, }, rats_accuracy = { awards = { }, trophies = { "Du er tildelt Nöyaktige Skudd I Håplös Krig Trofeet for å ha en treffprosent på %d%% i jakten på ekle rotter.", -- %d (accuracy percentage) "Dette trofeet er for å berömme din nöyaktighet ved å drepe %d%% av rottene du sköyt på i fjor.", -- %d (accuracy percentage) "For å hedre prestasjonen det er å drepe %d%% av alle rottene på sykehuset ditt, blir du tildelt Dungeon Keepers Skadedyrfrie Trofe, gRATulerer!", -- %d (accuracy percentage) }, }, healthy_plants = { awards = { "Gratulerer med Voks-Videre prisen for å ha holdt plantene dine ekstremt friske i hele år.", }, trophies = { "Venner Av Potteplanter önsker å gi deg Grönn Helse Trofeet, for å ha tatt godt vare på plantene dine de siste tolv måneder.", "Foreningen For Grönne Gamlinger önsker å gi deg Grönnfinger Trofeet for å ha holdt plantene dine friske i hele fjor.", }, }, hosp_value = { awards = { [1] = "Helsedepartementet vil gjerne benytte anledningen til å gratulere deg med den imponerende samlede verdien av sykehuset ditt.", }, penalty = { [1] = "Ditt sykehus har unnlatt å oppnå en anstendig verdi. Du har gjort dårlige pengebeslutninger. Husk at et godt sykehus også er et kostbart sykehus.", }, regional = { [1] = "Du er en fremgangsrik ung forretningsmann. Ditt sykehus er mer verdifullt enn alle de andre sykehusene i området til sammen.", }, }, best_value_hosp = { trophies = { [1] = "Gratulerer. Du mottar GnukkiRen-Troféet for sykehuset med best omdömme det siste året. Vel fortjent er det også.", }, penalty = { [1] = "Hvert sykehus i nærområdet er verdt mer enn ditt. Gjör noe med denne skammelige situasjonen. Få inn noen dyrere ting!", }, regional = { [1] = "Gratulerer med å ha det mest verdifulle sykehuset i spillet. Godt arbeid. Pröv å holde det slik.", }, }, sold_drinks = { awards = { }, trophies = { "Foreningen for Globale Tannleger er stolt over å kunne gi deg dette trofeet for å ha solgt store menger brus på sykehuset ditt i fjor.", "Sykehuset ditt er blitt tildelt Sprudlende-Begjær Trofeet for antall leskedrikker som ble solgt på sykehuset ditt i fjor.", "På vegne av DK Fyllinger Co., tildeles du herved dette trofeet dekket av sjokolade, for å ha solgt enorme mengder leskedrikker på sykehuset ditt forrige år.", }, }, } -- Casebook screen casebook = { reputation = "omdömme", treatment_charge = "behandlingspris", earned_money = "totale inntekter", cured = "behandlet", deaths = "dödsfall", sent_home = "sendt hjem", research = "konsentrer forskning", cure = "kur", cure_desc = { build_room = "Jeg anbefaler deg å bygge %s", -- %s (room name) build_ward = "Du trenger fremdeles en Sykestue.", hire_doctors = "Du må ansette noen Leger.", hire_surgeons = "Du må ansette Kirurger.", hire_psychiatrists = "Du må ansette Psykiatere.", hire_nurses = "Du må ansette Sykepleiere.", no_cure_known = "Ingen kjente kurer.", cure_known = "Kur.", improve_cure = "Forbedre kur", }, } -- 32. Adviser adviser = { -- Tutorial tutorial = { start_tutorial = "Les Oppdragsbriefingen og klikk venstre museknapp for å starte innföring.", information_window = "Hjelpeboksen forteller deg alt om den fine Allmennpraksisen du nettopp har bygd.", build_reception = "Heisann. Först, trenger sykehuset ditt en Resepsjon. Velg en fra Inventarmenyen.", order_one_reception = "Klikk en gang på den blinkende linjen med venstre museknapp for å kjöpe en Resepsjon.", accept_purchase = "Venstreklikk på den blinkende linjen for å kjöpe den.", rotate_and_place_reception = "Klikk med höyre museknapp for å rotere Resepsjonen, og venstreklikk for å plassere den i sykehuset.", reception_invalid_position = "Resepsjonen er nå grå fordi det er en ugyldig plassering. Pröv å flytte eller rotere den.", hire_receptionist = "Du trenger nå en Resepsjonist til å stå i resepsjonen og henvise dine pasienter.", select_receptionists = "Venstreklikk på det blinkende ikonet for å se gjennom tilgjengelige Resepsjonister. Nummeret på ikonet viser antall som er tilgjengelig.", next_receptionist = "Dette er den förste Resepsjonisten i listen. Venstreklikk på det blinkende ikonet for å se på neste person.", prev_receptionist = "Venstreklikk på det blinkende ikonet for å se på forrige person.", choose_receptionist = "Avgjör hvilken Resepsjonist som har gode evner og akseptable lönnskrav, og venstreklikk på det blinkende ikonet for å ansette henne.", place_receptionist = "Flytt Resepsjonisten og plasser henne hvor som helst. Hun klarer å finne veien til resepsjonen selv.", receptionist_invalid_position = "Du kan ikke plassere henne der.", window_in_invalid_position = "Dette vinduet kan ikke være her. Pröv å plassere det en annen plass på veggen, er du snill.", choose_doctor = "Se nöye gjennom evnene til hver enkelt Lege för du bestemmer deg for hvem du vil ansette.", click_and_drag_to_build = "For å bygge en Allmennpraksis, må du först avgjöre hvor stor den skal være. Klikk og hold inne venstre museknapp for å justere rommets störrelse.", build_gps_office = "For å starte å diagnostisere pasientene dine, må du ha en Allmennpraksis.", door_in_invalid_position = "Oj, sann! Du prövde å plassere dören i en ugyldig posisjon. Pröv en annen plass på veggen av blåkopien.", confirm_room = "Venstreklikk på det blinkende ikonet for å ferdigstille rommet ditt, eller klikk på X-en for å gå et trinn tilbake.", select_diagnosis_rooms = "Venstreklikk på det blinkende ikonet for å se en liste over diagnoserom du kan bygge.", hire_doctor = "Du trenger en Lege for å diagnostisere og behandle syke mennesker.", select_doctors = "Venstreklikk på det blinkende ikonet for å se hvilke Leger som er tilgjengelig i arbeidsmarkedet.", place_windows = "Plasser vinduer på samme måten som du plasserte dören. Du trenger ikke vinduer, men de ansatte setter veldig pris på det, og blir blidere når de har noe å se ut gjennom.", place_doctor = "Plasser Legen hvor som helst i Sykehuset. Han vil spasere til Allmennpraksisen så snart noen trenger å diagnostiseres.", room_in_invalid_position = "Oj! Denne blåkopien er ikke gyldig - det röde området indikerer hvor du har overlappet et annet rom eller sykehusets vegger.", doctor_in_invalid_position = "Hei! Du kan ikke slippe Legen her.", place_objects = "Höyreklikk for å rotere gjenstander, og venstreklikk for å plassere dem.", room_too_small = "Denne blåkopien er röd fordi den er for liten. Strekk den ut for å gjöre den större.", click_gps_office = "Venstreklikk på den blinkende linjen for å velge en Allmennpraksis.", room_too_small_and_invalid = "Blåkopien er for liten og er ugyldig plassert. Kom igjen.", object_in_invalid_position = "Denne gjenstanden er ugyldig plassert. Vær vennlig å plasser den et annet sted, eller roter den for å få den til å passe.", place_door = "Flytt musen rundt om kring på blåkopiens vegger for å plassere dören der du vil ha den.", room_big_enough = "Blåkopien er nå stor nok. Når du slipper museknappen, plasserer du den. Du kan allikevel fortsette å flytte den eller endre störrelse om du vil.", build_pharmacy = "Gratulerer! Nå må du bygge et Apotek og ansette en Sykepleier for å ha et fungerende sykehus.", }, -- Cheats cheats = { th_cheat = "Gratulerer du har låst opp juksekodene!", roujin_on_cheat = "Roujins utfordring aktivert! Lykke til...", roujin_off_cheat = "Roujins utfordring deaktivert.", }, -- Epidemic epidemic = { hurry_up = "Om du ikke tar deg av epidemien nå, får du store problemer. Fort deg!", serious_warning = "Den smittsomme sykdomen begynner å bli et seriöst problem. Du må gjöre noe snart!", multiple_epidemies = "Det ser ut som at du har mer enn en epidemi gående samtidig. Dette kan bli en enorm katastrofe, så fort deg.", }, -- Staff advice staff_advice = { need_handyman_machines = "Du må ansette Vaktmestre om du vil holde maskinene dine ved like.", need_doctors = "Du trenger flere Leger. Pröv å plassere dine beste Leger i rommene med lengst kö.", need_handyman_plants = "Du må ansette en Vaktmester for å vanne plantene.", need_handyman_litter = "Folk har begynt å forsöple sykehuset ditt. Ansett en Vaktmester for å rydde opp etter pasientene dine.", need_nurses = "Du trenger flere Sykepleiere. Sengeavdelinger og Apotek kan bare driftes av Sykepleiere.", too_many_doctors = "Du har for mange Leger. Noen av dem har ingenting å gjöre.", too_many_nurses = "Jeg tror du har for mange Sykepleiere.", }, -- Earthquake earthquake = { damage = "Det jordskjelvet skadet %d maskiner og %d pasienter på sykehuset.", -- %d (count machines), &d (count patients) alert = "Jordskjelv-varsel. Under et jordskjelv blir maskinene dine skadet. De kan bli ödelagt om de er dårlig vedlikeholdt.", ended = "Puh. Jeg trodde det var et stort skjelv - Det målte %d på Richters skala.", }, -- Multiplayer multiplayer = { objective_completed = "Du har fullfört utfordringene for dette nivået. Gratulerer!", everyone_failed = "Ingen klarte de forrige utfordringene. Så alle får spille videre !", players_failed = "Fölgende spiller(e) klarte ikke den forrige utfordringen : ", poaching = { in_progress = "Jeg skal si ifra om denne personen vil komme å jobbe for deg.", not_interested = "Ha! De er ikke interessert i å jobbe for deg - de har det bra der de er.", already_poached_by_someone = "Ikke snakk om! Noen pröver allerede å overtale personen.", }, objective_failed = "Du har ikke lykkes i å fullföre utfordringene.", }, -- Surgery requirements surgery_requirements = { need_surgeons_ward_op = "Du trenger to Kirurger og en Sykestue i tillegg til Operasjonssal for å gjöre kirurgiske inngrep.", need_surgeon_ward = "Du trenger en Kirurg til og en Sykestue for å gjöre kirurgiske inngrep.", }, -- Vomit wave vomit_wave = { started = "Ser ut som du har et magevirus på sykehuset ditt. Om du hadde holdt det renere ville ikke dette skjedd. Kanskje du burde hatt flere Vaktmestre.", ended = "Puh! Ser ut som viruset som forårsaket bölgen med oppkast er så godt som borte. Hold sykehuset ditt rent i fremtiden.", }, -- Level progress level_progress = { nearly_won = "Du har nesten fullfört dette nivået nå.", three_quarters_lost = "Du er nå tre fjerdedeler på vei til å tape dette nivået.", halfway_won = "Du er nå omtrent halvveis på dette nivået.", halfway_lost = "Du er omtrent halvveis til å tape dette nivået.", nearly_lost = "Det er like för du taper dette nivået nå.", three_quarters_won = "Du er nå tre fjerdedeler på vei til å fullföre dette nivået.", dont_kill_more_patients = "Du har virkelig ikke råd til å drepe flere pasienter!", another_patient_killed = "Å nei! Du har drept enda en pasient. Du har drept %d nå.", close_to_win_increase_value = "Du er virkelig nær ved å vinne. Ök sykehusets verdi med %d.", financial_criteria_met = "Du har tilfredsstilt de finansielle kriteriene for dette nivået. Hold banksaldoen din over %d, mens du passer på at sykehuset ditt drives effektivt.", hospital_value_enough = "Hold verdien av ditt sykehus over %d og forsök å fölge med på de andre problemene for å vinne dette nivået.", another_patient_cured = "Bra jobbet - enda en pasient kurert. Det blir den %d.", reputation_good_enough = "Ok, omdömmet ditt er er godt nok for å vinne dette nivået. Hold det over %d og fiks eventuelle andre problemet for klare det.", cured_enough_patients = "Du har kurert nok pasienter, men du trenger å få sykehuset ditt i bedre stand for å vinne dette nivået.", improve_reputation = "Du må forbedre omdömmet ditt med %d for å ha en sjanse til å vinne dette nivået.", }, -- Staff place advice staff_place_advice = { receptionists_only_at_desk = "Resepsjonister kan kun jobbe i Resepsjoner.", only_psychiatrists = "Leger kan bare jobbe i Psykiatri dersom de er kvalifiserte Psykiatere.", only_surgeons = "Leger kan bare jobbe i Operasjonssalen dersom de er kvalifiserte Kirurger.", only_nurses_in_room = "Det er kun Sykepleiere som kan jobbe på %s", only_doctors_in_room = "%s kan kun håndteres av Leger", only_researchers = "Leger kan bare jobbe på Forskningsavdelingen dersom de er kvalifiserte Forskere.", nurses_cannot_work_in_room = "%s kan ikke håndteres av Sykepleiere", doctors_cannot_work_in_room = "%s kan ikke håndteres av Leger", }, -- Research research = { machine_improved = "%s er forbedret av Forskningsavdelingen.", autopsy_discovered_rep_loss = "Din Obduseringsautomat er blitt offentlig kjent. Forvent en negativ reaksjon fra allmennheten.", drug_fully_researched = "Du har utforsket %s til 100%.", new_machine_researched = "En ny %s er akkurat utviklet.", drug_improved = "%s medisinen er forbedret av Forskningsavdelingen din.", drug_improved_1 = "%s medisinen er forbedret av Forskningsavdelingen din.", --todo: Denne er overflödig (dobbelt opp), men debug-strings-diff.txt insisterer på at denne linjen skal være her. new_available = "En ny %s er tilgjengelig.", new_drug_researched = "En ny medisin for å kurere %s er utviklet.", }, -- Boiler issue boiler_issue = { minimum_heat = "Der er du! Sentralfyren i kjelleren er gått i stykker. Ser ut som at personene på sykehuset ditt kommer til å fryse litt.", maximum_heat = "Sentralfyren i kjelleren er löpt löpsk. Radiatorene har hengt seg opp på maksimal varme. Folk kommer til å smelte! Plasser ut flere Brusautomater.", resolved = "Gode nyheter. Sentralvarmen fungerer slik som den skal nå. Temperaturen skal nå være grei både for pasientene og personalet.", }, -- Competitors competitors = { staff_poached = "En av dine ansatte har fått seg jobb på et annet sykehus.", hospital_opened = "Et konkurrerende sykehus er åpnet i området av %s.", land_purchased = "%s har akkurat kjöpt en tomt.", }, -- Room requirements room_requirements = { research_room_need_researcher = "Du må ansette en Lege med spesialisering innenfor Forskning for å kunne ta i bruk Forskningsavdelingen.", op_need_another_surgeon = "Du trenger fremdeles en Kirurg til, for å kunne ta i bruk Operasjonssalen.", op_need_ward = "Du må bygge en Sykestue for å overvåke pasienter som skal opereres.", reception_need_receptionist = "Du må ansette en Resepsjonist for å ta imot pasientene.", psychiatry_need_psychiatrist = "Du må ansette en Psykiater nå som du har bygget Psykiatri.", pharmacy_need_nurse = "Du må ansette en Sykepleier for å drifte Apoteket.", ward_need_nurse = "Du må ansette en Sykepleier som kan jobbe på denne Sengeavdelingen.", op_need_two_surgeons = "Ansett to Kirurger for å utföre kirurgiske inngrep i Operasjonssalen.", training_room_need_consultant = "Du må ansette en Konsulent som kan undervise i Klasserommet.", gps_office_need_doctor = "Du må ansette en Lege som kan jobbe på Allmennpraksisen.", }, -- Goals goals = { win = { money = "Du trenger %d til for å oppnå de finansielle kriteriene på dette nivået.", cure = "Kurer %d pasienter til og du har kurert nok for å fullföre dette nivået.", reputation = "Sörg for å ha et omdömme på over %d for at du skal kunne fullföre nivået.", value = "Sykehuset ditt må ha en verdi på over %d for at du skal kunne fullföre dette nivået.", }, lose = { kill = "Drep %d pasienter til for å tape dette nivået!", }, }, -- Warnings warnings = { low_prices = "Du tar deg for lite betalt for %s. Dette vil tiltrekke mange syke mennesker til sykehuset ditt, men du tjener mindre på hver pasient.", fair_prices = "Prisene dine for %s virker rettferdige og balanserte.", high_prices = "Prisene for %s er for høye. Dette gir deg god avkastning på kort sikt, men på lengre sikt vil de höye prisene skremme bort pasientene.", patient_not_paying = "En pasient har dratt uten å betale for %s fordi det var for dyrt!", charges_too_low = "Du tar deg for lite betalt. Dette vil tiltrekke mange syke mennesker til sykehuset ditt, men du tjener mindre på hver pasient", charges_too_high = "Dine priser er for höye. Dette gir deg god avkastning på kort sikt, men på lengre sikt vil de höye prisene skremme bort pasientene.", plants_thirsty = "Du må huske på plantene dine. De er törste.", staff_overworked = "Personalet ditt er meget overarbeidet. De blir ineffektive og gjör fatale feil når de er trötte.", queue_too_long_at_reception = "Du har for mange pasienter som venter ved Resepsjonen. Plasser ut flere Resepsjoner og ansett en Resepsjonist til.", queue_too_long_send_doctor = "Köen til %s er for lang. Sörg for at det er en Lege i rommet.", handymen_tired = "Dine Vaktmestere er veldig trött. Gi dem hvile nå.", money_low = "Du begynner å gå tom for penger!", money_very_low_take_loan = "Din bankbalanse er ganske så lav. Du kan jo alltids låne penger av banken.", staff_unhappy = "Personalet ditt er i dårlig humör. Pröv å gi dem bonuser, eller bedre, bygg et Personalrom. Du kan også forandre Hvilepraksisen på Sykehuspolicy-skjermen.", no_patients_last_month = "Ingen nye pasienter besökte sykehuset ditt forrige måned. Sjokkerende!", queues_too_long = "Köene dine er for lange.", patient_stuck = "Noen har gått seg vill. Du må organisere sykehuset ditt bedre.", patients_too_hot = "Pasientene er for varme. Du må enten fjerne noen radiatorer, skru ned temperaturen, eller plassere ut flere Brusautomater.", doctors_tired = "Dine Leger er veldig trötte. Gi dem hvile snarest.", need_toilets = "Pasientene trenger toaletter. Bygg dem på lett tilgjengelige steder.", machines_falling_apart = "Maskinene dine faller sammen. Få Vaktmestre til å fikse de snarest!", nobody_cured_last_month = "Absolutt ingen ble kurert forrige måned.", patients_thirsty = "Pasientene dine er törste. Du burde gi dem tilgang på brus.", nurses_tired = "Sykepleierne dine er trötte. Gi dem hvile nå.", machine_severely_damaged = "%s er veldig nær å bli totalskadet.", reception_bottleneck = "Det er en flaskehals i Resepsjonen. Ansett en Resepsjonist til.", bankruptcy_imminent = "Hallo! Du nærmer deg konkurs. Vær forsiktig!", receptionists_tired = "Resepsjonistene dine er meget trötte. Gi dem hvile nå.", too_many_plants = "Du har for mange planter. Dette er jo rene jungelen.", many_killed = "Du har nå drept %d mennesker. Poenget er liksom å gjöre de friske, vet du.", need_staffroom = "Bygg et Personalrom slik at dine ansatte kan slappe av.", staff_too_hot = "Dine ansatte holder på å smelte bort. Skru ned temperaturen eller fjern noen radiatorer fra rommene deres.", patients_unhappy = "Pasientene misliker sykehuset ditt. Du burde gjöre noe for å forbedre miljöet på sykehuset.", people_did_it_on_the_floor = "Noen av pasientene dine klarte ikke å holde seg. Oppryddingen vil bli en stor jobb for noen.", -- Bruke ordet opprydning eller vasking? patients_very_thirsty = "Pasientene dine er virkelig törste. Om du ikke setter opp noen Brusautomater snart, vil du snart se at alle går hjem for å hente cola.", machinery_very_damaged = "Hastesak! Få en Vaktmester til å reparere maskinene dine öyeblikkelig! De kommer til å sprenge!", handymen_tired2 = "Vaktmestrene dine er helt utkjörte. Gi dem litt hvile med en gang.", desperate_need_for_watering = "Du trenger sårt å ansette en Vaktmester for å stelle med plantene dine.", too_much_litter = "Det er et söppelproblem. Flere Vaktmestere kan være svaret.", place_plants4 = "Få pasientene i bedre humör ved å sette ut litt flere planter rundt omkring.", change_priorities_to_plants = "Du må endre prioriteringene for Vaktmestrene dine slik at de bruker mer tid på plantene.", finanical_trouble2 = "Du må få inn litt penger snart, ellers er du snart ute på söppeldynga. Du vil tape nivået om du mister %d til.", litter_everywhere = "Det er söppel over alt. Sett noen Vaktmestere på saken.", nurses_tired2 = "Sykepleierne dine er veldig trötte. La dem hvile med en gang.", plants_dying = "Plantene dine dör. De er desperate etter vannr. Få flere Vaktmestere til å jobbe med dette. Pasientene liker ikke döde planter.", reduce_staff_rest_threshold = "Pröv å endre Personalets hvileterskel i Sykehuspolicy-vinduet, slik at Personalet hviler oftere. Det var bare en idé.", more_toilets = "Du trenger flere Toaletter. Folk begynner å få præriehunder.", --"People are getting the turtle's head" hospital_is_rubbish = "Folk sier åpenlyst at sykehuset ditt bare er söppel. För du vet ordet av det, så tar de med seg sykdommene sine til et annet sted.", pay_back_loan = "Du har masse penger. Hvorfor har du ikke tenkt på å betale tilbake lånet?", financial_trouble3 = "Banksaldoen din ser bekymringsfull ut. Vurder å skaffe mer penger. Du er %d unna fra en katastrofe.", build_toilet_now = "Bygg et Toalett nå. Folk kan ikke holde seg lenger. Ikke glis - Dette er seriöst.", more_benches = "Vurder å plassere flere benker. Syke folk anser det som en fornærmelse å måtte stå oppreist.", many_epidemics = "Det ser ut som du har mer enn en epidemi på samme tid. Dette kan bli en kjempekatastrofe, så du må handle raskt.", place_plants_to_keep_people = "Folk stikker av. Å plassere noen planter kan kanskje overtale dem til å bli.", patients_thirsty2 = "Folk klager over at de er törste. Du burde plassere noen fler Brusmaskiner eller flytte de eksisterende nærmere dem.", people_freezing = "Utrolig, med nåtidens sentralfyring, så klager noen av pasientene dine over at det er iskaldt. Sett ut noen radiatorer for å varme dem opp, og skru opp temperaturen.", patients_very_cold = "Pasientene er veldig kalde. Pröve å skru opp temperaturen eller å plassere flere radiatorer i sykehuset.", build_toilets = "Bygg et Toalett med en gang, ellers vil du se noe virkelig ubehagelig. Og forestill deg hva sykehuset ditt vil lukte da.", place_plants2 = "Folk går hjem. Litt flere planter ville kanskje holdt dem her lenger.", staff_tired = "Dine ansatte er veldig slitne. Om du ikke lar dem få litt hvile i Personalrommet, så kan noen knekke av presset.", place_plants3 = "Pasientene din er utilfreds. Plasser litt flere planter for muntre dem opp.", staff_unhappy2 = "Personalet ditt er generelt ulykkelige. Snart vil de ha mer penger.", cash_low_consider_loan = "Pengesituasjonen din er ganske dårlig. Har du tenkt på å ta opp et lån?", financial_trouble = "Du er i en seriös finansiell krise. Få orden på ökonomien med en gang! Om du taper %d til, så har du kastet bort dette nivået!", doctors_tired2 = "Legene dine er utrolig slitne. De burde hvule umiddelbart.", patient_leaving = "En pasient drar hjem. Grunnen til det? Ditt dårlig styrte, dårlig bemannet og dårlig utstyrt sykehus.", machinery_damaged2 = "Du må ansette en Vaktmester for å reparere maskinene dine snart.", patients_leaving = "Pasientene forlater sykehuset. Forbedre sykehuset for de besökende ved å plassere planter, benker, brusmaskiner og så videre.", epidemic_getting_serious = "Den smittsomme sykdommen begynner å bli alvorlig. Du må gjöre noe snart!", machinery_damaged = "Reparer maskinene dine snart. Det er ikke lenge för de begynner å falle fra hverandre.", people_have_to_stand = "Lidende mennesker må stå oppreist. Skaff flere sitteplasser nå.", build_staffroom = "Bygg et Personalrom nå. Personalet ditt jobber for hardt og er på randen til kollaps. Kom igjen - se sammenhengen!", machinery_slightly_damaged = "Sykehusmaskineriet ditt er lettere skadet. Ikke glem å få det vedlikeholdt ved en anledning.", patients_getting_hot = "Pasientene er veldig varme. Pröv å skru ned temperaturen litt, eller til og med fjerne noen radiatorer.", machinery_deteriorating = "Maskinene dine har nettopp begynt å bli dårligere på grunn av overforbruk. Hold et öye med dem.", litter_catastrophy = "Söppelsituasjonen er bunnlös. Få et lag av Vaktmestere til å ta fatt i det nå!", staff_very_cold = "Personalet klager over at det er kaldt. Skru opp temperaturen eller plasser ut flere radiatorer.", deal_with_epidemic_now = "Om den epidemien ikke blir behandlet med en gang, så vil få tröbbel helt opp til örene. Få opp farten!", patients_really_thirsty = "Pasientene er virkelig törste. Plasser flere brusmaskiner, eller flytt de eksisterende nærmere de störste köene.", some_litter = "Vaktmestere kan bli kvitt söpla för den blir et alvorlig problem.", patients_annoyed = "Folk er utrolig misfornöyd med måten du driver sykehuset ditt. Og jeg kan ikke si jeg klandrer dem. Ta deg sammen eller ta konsekvensene!", receptionists_tired2 = "Resepsjonistene din er veldig slitne. La dem hvile med en gang.", doctor_crazy_overwork = "Å nei! En av dine Doktorer har blitt gal på grunn av overarbeid. Han kan komme seg hvis du lar ham hvile umiddelbart.", no_desk = "Du burde bygge en resepsjon og ansette en Resepsjonist snart.", no_desk_1 = "Om du vil at pasienter skal komme til sykehuset ditt bör du ansette en Resepsjonsist og bygge en resepsjon der hun kan arbeide!", no_desk_2 = "Bra gjort! Dette må være en verdensrekord: nesten ett år uten å få noen pasienter! Om du vil fortsette som sjef for dette sykehuset bör du ansette en Resepsjonist og bygg en respsjon der hun kan arbede!", no_desk_3 = "Glimrende! Nesten et år har gått og du har ikke engang en betjent resepsjon! Hvordan tror du at du skal få noen pasienter? Slutt å tulle rundt og få orden på problemet!", no_desk_4 = "En Resepsjonist må ha sin egen arbeidsplass for å motta pasientene som ankommer", no_desk_5 = "Det var på tide! Du burde se noen pasienter ankomme snart.", no_desk_6 = "Du har en Resepsjonist, så hva med å sette opp en resepsjon hun kan jobbe i?", no_desk_7 = "Du har bygd en resepsjon, så hva med å ansette en Resepsjonist? Du får ingen pasienter för du har fikset dette!", nurse_needs_desk_1 = "Hver Sykepleier trenger sin egen kontorpult å arbeide ved.", nurse_needs_desk_2 = "Sykepleieren din er glad for at du har gitt henne en pause. Om hensikten var å ha mer enn én Sykepleier arbeidende her, så må du gi dem begge en kontorpult.", cannot_afford = "Du har ikke nok penger på konto til å ansette denne personen!", cannot_afford_2 = "Du har ikke nok penger på konto til å gjöre dette kjöpet!", falling_1 = "Hei! Det der er ikke moro. Pass på hvor du klikker med den musa; noen kan bli skadet!", falling_2 = "Slutt å tulle. Hvordan ville du likt det?", falling_3 = "Au, det måtte gjöre vondt. Noen burde ringe etter en Lege!", falling_4 = "Dette er et sykehus, ikke en temapark!", falling_5 = "Dette er ikke et sted der du kan dytte folk over ende, de er jo syke!", falling_6 = "Dette er ingen bowlingbane. Syke folk bör ikke behandles slik!", research_screen_open_1 = "Du må bygge en forskningsavdeling för du får tilgang til forskningsvinduet.", research_screen_open_2 = "Forskning er deaktivert for dette nivået.", researcher_needs_desk_2 = "En av dine Forskere er glad for at du gir ham en pause. Om du önsker å ha flere ansatte som faktisk forsker, så må du gi dem et skrivebord hver.", researcher_needs_desk_1 = "En Forsker må ha et skrivebord for å kunne arbeide.", researcher_needs_desk_3 = "Hver Forsker må ha hvert sitt skrivebord for å kunne gjöre jobben sin.", }, -- Placement info placement_info = { door_can_place = "Du kan plassere dören her, om du vil.", window_can_place = "Du kan plassere vinduet her. Det går fint.", door_cannot_place = "Beklager, men du kan ikke plassere dören her.", object_can_place = "Du kan plassere gjenstanden her.", reception_can_place = "Du kan plassere Resepsjonen her.", staff_cannot_place = "Du kan ikke plassere den ansatte her. Beklager.", staff_can_place = "Du kan plassere den ansatte her. ", object_cannot_place = "Hallo, du kan ikke plassere gjenstanden her.", room_cannot_place = "Du kan ikke plassere rommet her.", room_cannot_place_2 = "Du kan ikke bygge rommet her.", window_cannot_place = "Ah. Du kan faktisk ikke plassere vinduet her.", reception_cannot_place = "Du kan ikke plassere Resepsjonen her.", }, -- Praise praise = { many_benches = "Pasientene har nok sitteplasser nå. Fint.", many_plants = "Flott. Du har mange planter. Pasientene vil sette pris på det.", patients_cured = "%d pasienter kurert.", }, -- Information information = { larger_rooms = "Större rom gjör at de ansatte föler seg viktigere, og det forbedrer deres prestasjoner.", extra_items = "Ekstra gjenstander i rommene får de ansatte til å föle seg mer komfortabel og prestasjonene blir bedre.", epidemic = "Du har en smittsom epidemi på sykehuset ditt. Det må du gjöre noe med nå!", promotion_to_doctor = "En av dine TURNUSLEGER er nå blitt DOKTOR.", emergency = "Nödstilfelle! Unna vei! Flytt dere!", patient_abducted = "En av dine pasienter er blitt bortfört av romvesen.", first_cure = "Bra jobbet! Du har akkurat kurert din förste pasient.", promotion_to_consultant = "En av dine DOKTORER er nå blitt KONSULENT.", handyman_adjust = "Du kan gjöre Vaktmestrene mer effektiv ved å justere deres prioriteringer.", promotion_to_specialist = "En av dine Leger er blitt forfremmet til %s.", patient_leaving_too_expensive = "En pasient forlater sykehuset ditt uten å gjöre opp for seg ved %s. Det er for dyrt.", vip_arrived = "Pass på! - %s har akkurat ankommet sykehuset ditt! La alt gå på skinner nå, for å tilfredstille han.", epidemic_health_inspector = "Helseministeren har nå fått med seg nyhetene om epidemien din. Du må forberede deg på et besök av ministeren ganske snart.", first_death = "Du har akkurat drept din förste pasient. Hvordan föles det?", pay_rise = "En av dine ansatte truer med å si opp. Velg om du vil gå med på lönnskravene eller om du vil sparke han/henne. Klikk på ikonet nede i venstre hjörne for å se hvem som truer med oppsigelse.", place_windows = "Vinduer gjör rommene lysere og öker arbeidslysten til dine ansatte.", fax_received = "Ikonet som akkurat poppet opp nede i venstre hjörne av skjermen, varsler deg om viktig informasjon og beslutninger du må ta.", initial_general_advice = { rats_have_arrived = "Rotter har infisert sykehuset ditt. Pröv å skyt dem med musen din.", autopsy_available = "Obduksjonsautomaten er nå ferdigutviklet. Med denne kan du kvitte deg med tröblete eller ikke-velkomne pasienter, og gjöre forskning ut av restene. Advarsel - Å benytte denne er svært kontroversielt.", first_patients_thirsty = "Flere av pasientene dine begynner å bli dehydrert. De ville satt pris på en Brusautomat.", research_now_available = "Du har bygd din förste Forskningsavdeling. Du har nå tilgang til Forskningsskjermen.", psychiatric_symbol = "Leger med spesialisering innen Psykiatri gjenkjennes med symbolet: |", decrease_heating = "Folk på sykehuset ditt svetter. Skru ned sentralvarmen. Dette gjöres på Områdekartet.", surgeon_symbol = "Leger kan utföre kirurgiske inngrep om de har symbolet: {", first_emergency = "Akutte pasienter har et blinkende blått lys over hodet. Behandle dem i tide, ellers dör de.", first_epidemic = "Du har en epidemi på sykehuset ditt! Avgjör om du vil rydde opp, eller legge deg paddeflat.", taking_your_staff = "Noen pröver å stjele personalet ditt. Du må kjempe for å beholde de.", place_radiators = "Pasientene fryser - du kan plassere flere radiatorer ved å gå inn på oversikten med gjenstander.", epidemic_spreading = "Det er smittefare på sykehuset. Kurer infiserte pasienter för de forlater sykehuset.", research_symbol = "Forskere er leger med symbolet: }", machine_needs_repair = "Du har utstyr som trenger reparasjon. Finn utstyret - det ryker av det - og klikk på den. Klikk deretter på Vaktmestersymbolet.", increase_heating = "Folk fryser. Skru opp sentralvarmen på Områdekartet.", first_VIP = "Du er i ferd med å ta imot ditt förste VIP-besök. Sörg for at VIP-er ikke ser noe uhygienisk eller pasienter som henger med hodet.", }, }, -- Build advice build_advice = { placing_object_blocks_door = "Om du plasserer gjenstander der, kommer ikke folk seg til dören.", blueprint_would_block = "Den blåkopien kommer til å blokkere andre rom. Pröv å endre rommets störrelse, eller flytt det en annen plass!", door_not_reachable = "Folk kommer ikke til å komme seg til den dören. Tenk litt.", blueprint_invalid = "Det er ikke en gyldig blåkopi.", }, } -- Warnings (more warnings in adviser.warnings) warnings = { levelfile_variable_is_deprecated = "Merk: Brett '%s' inneholder en forringet variabeldefinisjon i brettfilen.'%LevelFile' har fått endret navn til '%MapFile'. Vennligst gi beskjed til brett-designeren om å oppdatere brettet", -- Forbedre tekst? } -- Confirmation confirmation = { quit = "Du har valgt å avslutte. Er du sikker på at du vil forlate spillet?", return_to_blueprint = "Er du sikker på at du vil returnere til Blåkopi-modus?", replace_machine = "Er du sikker på at du vil erstatte %s for $%d?", -- %s (machine name) %d (price) overwrite_save = "Et spill er allerede lagret her. Er du sikker på at du vil overskrive det?", delete_room = "Önsker du virkelig å fjerne dette rommet?", sack_staff = "Er du sikker på at du vil si opp denne personen?", restart_level = "Er du sikker på at du vil starte dette nivået på nytt?", maximum_screen_size = "Opplösningen du har valgt er större enn 3000 x 2000. Större opplösninger er mulig, men det krever bedre maskinvare om det ikke skal hakke. Önsker du å fortsette?", music_warning = "För du får brukt mp3-er som spillmusikk, så må du ha smpeg.dll eller tilsvarende for operativsystemet ditt. Eller vil du ikke få musikk i spillet. Önsker du å fortsette?", } -- Bank manager bank_manager = { hospital_value = "Sykehusets verdi", balance = "Din balanse", current_loan = "Nåværende lån", interest_payment = "Rentekostnader", insurance_owed = "Forsikringsgjeld", inflation_rate = "Inflasjon", interest_rate = "Rentesats", statistics_page = { date = "Dato", details = "Detaljer", money_out = "Utg.", money_in = "Innt.", balance = "Saldo", current_balance = "Balanse", }, } -- Progress Report window progress_report = { quite_unhappy = "Folket ditt er i dårlig humör. ", header = "Progresjonsrapport", very_unhappy = "Folket ditt er i svært dårlig humör. ", more_drinks_machines = "Bygg flere Brusautomater. ", too_cold = "Det er alt for kaldt. Sett ut noen radiatorer. ", too_hot = "Du bör regulere sentralvarmen. Det er alt for varmt. ", percentage_pop = "% befolkning", win_criteria = "KRITERIER FOR Å VINNE", free_build = "FRI BYGGING", } -- Newspaper headlines newspaper = { -- Seven categories of funny headlines. I think each category is related -- to one criterion you can lose to. TODO: categorize { "DR SKREKK OG GRU", "SKUMMEL LEGE LEKER GUD", "DR ACULA SJOKKERER", "HVEM FALT FOR KNIVEN?", "FARLIG FORSKNING STOPPET ETTER RAZZIA" }, { "DR ANKER", "KNUST KIRURG", "KONSULENT PÅ KJÖRET", "KIRURGISK SHOT", "KIRURG DRIKKER OPP", "KIRURGISK SPIRIT" }, { "LEKENDE KIRURG", "DOKTOR PANTSDOWN", "DOKTOR LANGT NEDE", "GLUPSK KIRURG" }, { "LEGE TUKLER MED BALANSEN", "ORGAN-ISERT KRIMINALITET", "BANKMESSIG BYPASS-OPERASJON", "LEGE MED KONTANTBEHOLDNING" }, { "MEDISINSK RAID AV KISTER", "DOKTOR TÖMMER GRAVPLASS", "LIK I GARDEROBEN", "FIN DAG FOR DR DÖD", "SISTE FEILBEHANDLING", "GRAVENDE DOKTOR OPPDAGET" }, { "LEGE SPIST OPP!", "SLAKK KVAKK", "LIVSFARLIG DIAGNOSE", "UFORSIKTIG KONSULENT", }, { "DOKTOR BLÅSER LETTET UT", "KIRURG 'OPERERER' SEG SELV", "LEGE MED UTBLÅSNING", "DOKTOR LEGGER KABEL", "MEDISIN ER NOE DRITT" }, } -- Letters -- TODO letter = { campaign_level_completed = "Bra jobbet! Du klarte brettet, men det er ike over enda! Kunne du tenkt den en stilling hos %s Sykehus?", campaign_completed = "Utrolig! Du har fullført alle brettene. Nå kan du slappe av og skryte på utallige nettforum om dine bragder!", campaign_level_missing = "Beklaer, men det neste brette i denne karrieren ser ut til å mangle (Navn: %s).", --original line-ends: 5 4 2 3 [1] = { [1] = "Kjære %s//", [2] = "Fantastisk! Dette sykehuset har du driftet helt utmerket. Vi i departementet vil vite om du er interessert i å gå lös på et större prosjekt. Vi har en jobbstilling vi tror du ville passet perfekt i. Vi kan friste deg med en lönn på $%d. Tenk litt på det.//", [3] = "Er du interessert i å jobbe på sykehuset %s?", }, [2] = { [1] = "Kjære %s//", [2] = "Veldig bra! Sykehuset ditt har hatt en fantastisk utvikling. Vi har en annen institusjon vi vil du skal ta over, om du er klar for forandringer. Du MÅ ikke ta utfordringen, men det vil nok lönne seg. Lönnen er $%d//", [3] = "Vil du jobbe på sykehuset %s?", }, [3] = { [1] = "Kjære %s//", [2] = "Din tid på dette sykehuset har vært enormt vellykket. Vi spår en stor fremtid for deg, og önsker å tilby deg en stilling et annet sted. Lönnen vil være $%d, og vi tror du vil elske de nye utfordringene stillingen förer med seg.//", [3] = "Vil du ha stillingen på sykehuset %s?", }, [4] = { [1] = "Kjære %s//", [2] = "Gratulerer! Vi i departementet er meget imponert over dine evner til å drifte sykehus. Du er definitivt en gullgutt i Helsedepartementet. Vi tror derimot at du foretrekker en litt töffere jobb. Du får en lönn på $%d, men det er din beslutning.//", [3] = "Er du interessert i å jobbe på sykehuset %s?", }, [5] = { [1] = "Kjære %s//", [2] = "Hei igjen. Vi respekterer dine önsker om å ikke forlate dette sjarmerende sykehuset, men vi ber deg om å ta en ny vurdering. Vi vil tilby deg en god lönn på $%d om du er klar for å flytte til et annet sykehus, og får opp driften til et respektabelt nivå.//", [3] = "Er du interessert i å flytte til sykehuset %s nå?", }, [6] = { [1] = "Kjære %s//", [2] = "Departementet hilser deg. Vi vet hvor glad du er blitt i denne nydelige, velorganiserte institusjonen, men vi tror du bör vurdere å fremme karrieren din nå. Du vil få en respektabel lederlönn på $%d om du bestemmer deg for å flytte. Det er verdt å tenke på det i hvertfall.//", [3] = "Vil du ta imot stillingen på sykehuset %s?", }, [7] = { [1] = "Kjære %s//", [2] = "God dag! Helseministeren lurer på om du vil revurdere din stilling på ditt nåværende sykehus. Vi setter pris på ditt nydelige sykehus, men vi tror du vil gjöre mye for en litt mer utfordrende stilling, og en lönn på $%d.//", [3] = "Tar du utfordringen på sykehuset %s?", }, [8] = { [1] = "Kjære %s//", [2] = "Hallo igjen. Du tok ikke vår forrige utfordring, der vi tilba deg en alle tiders stilling på et nytt sykehus, og en ökt lönn på $%d. Vi mener, derimot, at du bör revurdere beslutningen din. Vi har den perfekte jobben for deg, skjönner du.//", [3] = "Tar du imot stillingen på sykehuset %s? Vær så snill?", }, [9] = { [1] = "Kjære %s//", [2] = "Du har nok en gang bevist at du er den beste innen helseadministrasjon. Ingen tvil! En slik betydningsfull prestasjon må belönnes, så vi önsker å tilby deg stillingen som Administrerende Direktör for Alle Sykehus. Dette er en ærefull stilling, og gir deg en lönn på hele $%d. Du får din egen Ticker-Tape parade, og folk kommer til å vise sin takknemlighet ovenfor deg, hvor enn du går.//", [3] = "Takk for alt du har gjort. Vi önsker deg en lang og trivelig pensjonstid.//", [4] = "", }, [10] = { [1] = "Kjære %s//", [2] = "Gratulerer! Du har driftet alle sykehus vi har gitt deg på en utmerket måte. En slik prestasjon kvalifiserer deg for friheten til å reise rundt i verden. Du blir belönnet med en pensjon på $%d, pluss en limousin, og alt vi ber om er at du reiser fra by til by, möter dine lidenskaplige fans, og promoterer sykehusets arbeid hvor enn du måtte befinne deg.//", [3] = "Vi er alle stolte av deg. Det er ikke en av oss som ikke er takknemlig for ditt harde arbeid som livredder.//", [4] = "", }, [11] = { [1] = "Kjære %s//", [2] = "Din karriere har vært eksemplarisk, og du er en stor inspirasjon for oss alle. Takk for at du har driftet så mange sykehus, og gjort det så bra i alle jobbene. Vi önsker å gi deg en livslang lönn på $%d, og alt vi ber deg om er å reise offisielt med kabriolet fra by til by, og fortelle folk hvordan du tjente så mye penger så fort.//", [3] = "Du er et prakteksempel for alle höyrepolitiske mennesker, og alle i verden, uten unntak, er dine kjæreste eiendeler.//", [4] = "", }, [12] = { [1] = "Kjære %s//", [2] = "Din suksessrike karriere som den beste sykehusadministratoren siden Moses sin tid er ved veis ende. Men siden du har hatt så stor innvirkning på den koselige medisinverdenen, önsker departementet å tilby deg en lönn på $%d bare for å være til stede på våre vegne i åpne fester, sjösette skip og stille opp på show. Hele verden etterlyser deg og det ville vært god PR for oss alle!//", [3] = "Vær så snill å ta imot denne stillingen, det blir ikke hardt arbeid!//", [4] = "", }, } -- Humanoid start of names humanoid_name_starts = { [1] = "BJÖRN", [2] = "HÖY", [3] = "STOR", [4] = "GULL", [5] = "RIK", [6] = "SOL", [7] = "LANGE", [8] = "FLAT", [9] = "HARD", [10] = "MYK", [11] = "BAR", [12] = "SKODDE", [13] = "MÖRKE", [14] = "BLÅ", [15] = "KRIG", [16] = "LAT", [17] = "KRABBE", [18] = "FISK", [19] = "VÅT", [20] = "SEN", [21] = "GRAV", [22] = "BAK", [23] = "LAVE", [24] = "UT", [25] = "ENGE", [26] = "GRÖN", [27] = "KUR", [28] = "KVIT", [29] = "KJEVE", [30] = "TRYGLE", [31] = "KVERN", [32] = "KRYKKE", [33] = "SKADE", } -- Humanoid end of names humanoid_name_ends = { [1] = "STAD", [2] = "BERG", [3] = "NES", [4] = "DAL", [5] = "LID", [6] = "HEIM", [7] = "HEM", [8] = "LAND", [9] = "SETH", [10] = "RUD", [11] = "VIK", [12] = "BÖ", [13] = "GAARD", [14] = "GÅRD", [15] = "HAUG", [16] = "LUND", [17] = "LOFT", [18] = "VER", [19] = "SAND", [20] = "LIE", [21] = "VOLD", [22] = "STRÖM", [23] = "LI", [24] = "DALEN", [25] = "DAHL", [26] = "BAKKEN", } -- VIP names vip_names = { health_minister = "Helseministeren", "Ordföreren i Greater Trumpton", -- the rest is better organized in an array. "Lawrence Nightingale", "Kong Bernard av Nederland", "Aung Sang Su Kyi, den Burmesisk Demokratiske Opposisjonslederen", "Sir Reginald Crumbly", "Billy Savile OBE", "Rådgiver Crawford Purves", "Rocket Ronnie Jepson", "En Fotballspiller i Eliteserien", "L. F. Probst, III", } -- Deseases diseases = { general_practice = { name = "Allmennpraksis", }, bloaty_head = { name = "Ballonghode", cause = "Årsak - Pasienten har sniffet ost og drukket forurenset vann.", symptoms = "Symptomer - Den rammede er meget ukomfortabel.", cure = "Behandling - Man stikker hull på det oppsvulmede hodet, og pumper det opp igjen til korrekt PSI med en intelligent maskin.", }, hairyitis = { name = "Pelssyndrom", cause = "Årsak - Fullmåne.", symptoms = "Symptomer - Ökt luktesans.", cure = "Behandling - En elektrosjokkmaskin fjerner håret og tetter igjen porene.", }, king_complex = { name = "Rock'n'Roll syndrom", cause = "Årsak - Elivs' ånd tar over kontrollen over pasientens hode", symptoms = "Symptomer - Går med fargede lærsko, og spiser cheeseburgere", cure = "Behandling - En Psykiater forteller pasienten hvor tåpelig han eller hun ser ut", }, invisibility = { name = "Usynlighet", cause = "Årsak - Bitt av en radioaktiv (og usynlig) maur", symptoms = "Symptomer - Pasienten lider ikke - tvert imot! De utnytter situasjonen, og lurer familie og venner trill rundt", cure = "Behandling - En fargerik kur fra apoteket gjör pasienten fullt synlig igjen", }, serious_radiation = { name = "Alvorlig stråling", cause = "Årsak - Har forvekslet plutonium-isotoper med tyggegummi.", symptoms = "Symptomer - Pasienten föler seg meget ukomfortabel.", cure = "Behandling - Pasienten blir plassert i en saneringsdusj og renset fullstendig.", }, slack_tongue = { name = "Lös tunge", cause = "Årsak - Kronisk overivrig i diskusjoner om såpeopera.", symptoms = "Symptomer - Tungen hever seg til det femdoble.", cure = "Behandling - Tungen blir plassert i en tungekutter. Hevelsen fjernes deretter hurtig, effektivt og smertefullt.", }, alien_dna = { name = "Utenomjordisk DNA", cause = "Årsak - Bitt av facehuggere utstyrt med intelligent utenomjordisk blod.", symptoms = "Symptomer - Er under gradvis forvandling til romvesen, og har et önske om å ta over våre byer.", cure = "Behandling - Alt DNA blir fjernet mekanisk, renset for utenomjordiske celler, og blir hurtig erstattet.", }, fractured_bones = { name = "Benbrudd", cause = "Årsak - Fall fra store höyder mot betong.", symptoms = "Symptomer - Höye knaselyder og liten bevegelighet på utsatte steder.", cure = "Behandling - Gipsen blir fjernet ved hjelp av en laserstyrt gipsfjerner.", }, baldness = { name = "Flintskalle", cause = "Årsak - Forteller lögner og dikter opp historier for å öke sin popularitet.", symptoms = "Symptomer - Forlegen pasient med skinnende skalle.", cure = "Behandling - Hår blir hurtig smeltet fast til pasientens hode med en smertefull hårmaskin.", }, discrete_itching = { name = "Skrapesyke", cause = "Årsak - Små insekter med skarpe tenner.", symptoms = "Symptomer - Pasienten klör intenst, og huden flasser.", cure = "Behandling - En Sykepleier gir pasienten en sirupaktig drikk som leger huden og hindrer videre klöe.", }, jellyitis = { name = "Gelésyndrom", cause = "Årsak - Gelatinrik diett og for mye mosjon.", symptoms = "Symptomer - Meget ustödig og faller mye.", cure = "Behandling - Pasienten blir presset ned i en gelétönne i et spesielt rom.", }, sleeping_illness = { name = "Sövnsyke", cause = "Forårsaket av overaktive sövnkjertler i munnens gane.", symptoms = "Symptomer - Sterkt önske om å sove, hvor og når som helst.", cure = "Behandling - En sterk dose stimulerende medisin blir delt ut av en Sykepleier.", }, pregnancy = { name = "Graviditet", cause = "Forårsaket av strömbrudd i urbane strök.", symptoms = "Symptomer - Lei av å spise med konstant ölmage.", cure = "Behandling - Spedbarnet blir fjernet med keisersnitt, blir deretter vasket og presentert for sin nye mor.", }, -- unused transparency = { name = "Gjennomsiktighet", cause = "Årsak - Slikket folien på et gammelt yoghurtbeger.", symptoms = "Symptomer - Kroppen blir gjennomsiktig og ekkel.", cure = "Behandling - En kald og fargerik drikk fra apoteket gjör susen.", }, uncommon_cold = { name = "Forkjölelse", cause = "Årsak - Små snörrpartikler i luften.", symptoms = "Symptomer - Rennende nese, hoste og misfarget slim fra lungene.", cure = "Behandling - En real slurk hostesaft fra apoteket vil gjöre susen.", }, broken_wind = { name = "Forurensende gasser", cause = "Årsak - Har löpt på 3d-mölle rett etter middag.", symptoms = "Symptomer - Ubehag hos folk som befinner seg rett bak pasienten.", cure = "Behandling - En sterk blanding av spesielle vannatomer må svelges hurtig.", }, spare_ribs = { name = "Juleribbe", cause = "Årsak - Pasienten har sittet på kalde steingulv.", symptoms = "Symptomer - Ubehagelig fölelse i brystet.", cure = "Behandling - Ribben fjernes av to Kirurger, og leveres til pasienten i en doggybag.", }, kidney_beans = { name = "Kikkerter", cause = "Årsak - Pasienten har spist isbiter.", symptoms = "Symptomer - Smerte og hyppige turer til toalettet.", cure = "Behandling - To Kirurger fjerner de erteliknende parasittene, uten å beröre nyrene!", }, broken_heart = { name = "Knust hjerte", cause = "Årsak - Noen er rikere, yngre og slankere enn pasienten.", symptoms = "Symptomer - Hysterisk gråtende. Blodsprengte fingertupper etter å ha revet opp feriebilder.", cure = "Behandling - To Kirurger spretter opp brystet og setter deretter hjertet forsiktig sammen, mens de holder pusten.", }, ruptured_nodules = { name = "Knekte nötter", cause = "Årsak - Strikkhopp om vinteren.", symptoms = "Symptomer - Umulig å sitte behagelig.", cure = "Behandling - To kvalifiserte Kirurger må fjerne nöttene med stödige hender.", }, tv_personalities = { name = "Programledersyndrom", cause = "Årsak - TV-titting på dagtid.", symptoms = "Symptomer - Forestiller seg at han eller hun er programleder i frokost-tv, og elsker å introdusere kjökkenseansen.", cure = "Behandling - En Psykiater må overtale pasienten til å selge fjernsynet og heller kjöpe radio.", }, infectious_laughter = { name = "Smittsom latter", cause = "Årsak - Klassisk situasjonskomedie på TV.", symptoms = "Symptomer - Ler hjelpelöst hele tiden, og repeterer stadig dårlige poeng som absolutt ikke er morsomme.", cure = "Behandling - En kvalifisert Psykiater må minne pasienten på at dette faktisk er en alvorlig tilstand.", }, corrugated_ankles = { name = "Böyde ankler", cause = "Årsak - Busskjöring over fartsdempere.", symptoms = "Symptomer - Skoene passer ikke.", cure = "Behandling - En giftig blanding av urter og krydder må drikkes for å rette ut anklene.", }, chronic_nosehair = { name = "Kronisk nesehår", cause = "Årsak - Snöfter med forakt på folk med lavere inntekt.", symptoms = "Symptomer - Så mye nesehår at en grevling kunne bodd der.", cure = "Behandling - En ekkel hårfjernende drikk blir inntatt gjennom munnen. Fås på apoteket.", }, third_degree_sideburns = { name = "Tredjegrads koteletter", cause = "Årsak - Lengter tilbake til 70-tallet.", symptoms = "Symptomer - Stort hår, tettsittende klær, langt skinnskjegg og glitter.", cure = "Behandling - Psykiatrisk personell må, ved hjelp av nymoderne teknikker, overbevise pasienten om at parykk er noe tull.", }, fake_blood = { name = "Teaterblod", cause = "Årsak - Pasienten er ofte utsatt for narrestreker.", symptoms = "Symptomer - Rödt blod som dunster ved kontakt med klær.", cure = "Behandling - Eneste måten å behandle dette på, er å få en Psykiater til å roe ned pasienten.", }, gastric_ejections = { name = "Krydrede oppstöt", cause = "Årsak - Sterkt krydret meksikansk eller indisk mat har skylden.", symptoms = "Symptomer - Gulper karrikylling og tacolefser.", cure = "Behandling - En Sykepleier gir pasienten en bindende indisk kumelk-blanding som forhindrer nye oppstöt.", }, the_squits = { name = "Lös mage", cause = "Årsak - Har spist pizzabiter som har falt bak komfyren.", symptoms = "Symptomer - Æsj! Tipper du vet symptomene.", cure = "Behandling - En klebrig blanding kjemikalier må drikkes for å stabilisere magen innvendig.", }, iron_lungs = { name = "Jernlunger", cause = "Årsak - Forurenset byluft blandet med kebabrester.", symptoms = "Symptomer - Kan puste flammer og bröle höyt under vann.", cure = "Behandling - To Kirurger mykner de solide lungene i operasjonssalen.", }, sweaty_palms = { name = "Håndsvette", cause = "Årsak - Er livredd jobbintervjuer.", symptoms = "Symptomer - Å håndhilse på pasienten er som å ta tak i en våt svamp.", cure = "Behandling - En Psykiater må snakke pasienten ut av denne oppdiktede lidelsen.", }, heaped_piles = { name = "Hemoroider", cause = "Årsak - Står i nærheten av drikkevannskjölere.", symptoms = "Symptomer - Pasienten föler at han eller hun sitter på en pose med stein.", cure = "Behandling - En behagelig, men meget syrlig drikk, lösner opp hemoroidene innenifra.", }, gut_rot = { name = "Mageråte", cause = "Årsak - Onkel Georgs miks av hostesaft og whisky.", symptoms = "Symptomer - Ingen hoste, men ingen magesekk heller.", cure = "Behandling - En Sykepleier skriver ut en rekke kjemikalier og gjenskaper veggen i magesekken.", }, golf_stones = { name = "Golfsteiner", cause = "Årsak - Utsatt for giftige gasser fra golfballer.", symptoms = "Symptomer - Forvirring og kraftig skamfölelse.", cure = "Behandling - Steinene fjernes kjapt og effektivt av to Kirurger.", }, unexpected_swelling = { name = "Uventet hevelse", cause = "Årsak - Hva som helst uventet.", symptoms = "Symptomer - Hevelse.", cure = "Behandling - Hevelsen må skjæres bort av to Kirurger.", }, diag_scanner = { name = "Diag Skanner", }, diag_blood_machine = { name = "Diag Blodmaskin", }, diag_cardiogram = { name = "Diag Kardio", }, diag_x_ray = { name = "Diag Röntgen", }, diag_ultrascan = { name = "Diag Ultraskanner", }, diag_general_diag = { name = "Diag Generell", }, diag_ward = { name = "Diag Sengeavd.", }, diag_psych = { name = "Diag Psykiatri", }, autopsy = { name = "Obduksjon", }, } -- Faxes fax = { -- Debug fax debug_fax = { -- never seen this, must be a debug option of original TH -- TODO: make this nicer if we ever want to make use of it close_text = "Yes, yes, yes!", text1 = "BEST COUNT %d", -- %d text2 = "TOTAL PEOPLE IN HOSPITAL %d CHECKING AGAINST %d", -- %d %d text3 = "FIGURES : DOCS %d NURSES %d AREA %d ROOMS %d PRICING %d", -- %d %d %d %d %d text4 = "FACTORS : DOCS %d NURSES %d AREA %d ROOMS %d PRICING %d", -- %d %d %d %d %d text5 = "CONTRIBN : DOCS %d NURSES %d AREA %d ROOMS %d PRICING %d PERCENT", -- %d %d %d %d %d text6 = "THE FOLLOWING FACTORS ARE ALSO APPLIED", text7 = "REPUTATION: %d EXPECTED %d REDUCTION %d", -- %d %d %d text8 = "AMENITIES %d PEEPS HANDLED %d REDUCTION %d", -- %d %d %d text9 = "DISASTERS %d ALLOWED (MTHS) %d (%d)REDUCTION %d", -- %d %d %d %d text10 = "KILLS %d ALLOWED (MTHS) %d (%d) REDUCTION %d", -- %d %d %d %d text11 = "PEOPLE THIS MONTH %d", -- %d }, -- Emergency emergency = { choices = { accept = "Ja, jeg er klar til å håndtere dette", refuse = "Nei, jeg nekter å ta meg av dette", }, location = "Det har skjedd en ulykke ved %s", num_disease = "Det er %d mennesker med %s som trenger akutt behandling.", num_disease_singular = "Det er 1 person med %s som trenger akutt behandling.", cure_possible_drug_name_efficiency = "Du har det som trengs av nödvendig utstyr og ferdigheter, og du har medisinen de trenger. Det er %s og medisinen er %d prosent effektiv.", cure_possible = "Du har nödvendig utstyr og de ferdigheter som trengs for å ta deg av dette.", cure_not_possible_build_and_employ = "Du vil måtte bygge %s og ansette en %s", cure_not_possible_build = "Du mangler %s for å håndtere dette", cure_not_possible_employ = "Du mangler en %s for å kunne håndtere dette", cure_not_possible = "Du kan ikke behandle denne sykdommen for öyeblikket", bonus = "Om du klarer å håndtere dette nödstilfellet, vil du få en bonus på maksimalt %d. Om du feiler derimot, vil ryktet ditt få en kraftig smell.", free_build = "Hvis du lykkes, vil ditt omdömme vil öke. Men hvis du mislykkes, vil ditt omdömme bli alvorlig svekket!", locations = { "A.Toms Våpenkjeller", "Snobbeuniversitetet", "Buskerud Hagesenter", "Forskningsinstituttet For Farlige Emner", "Foreningen For Folkedansende Menn", "puben Frosk Og Kyr", "Hallgeir Juniors Begravelsesbyrå Og Spritbutikk", "Mama-Tai Krydderhus", "Berts Varehus For Brukt Petrokjemi", }, }, emergency_result = { close_text = "Klikk for å gå ut", earned_money = "Av en maksimal bonus på %d, har du tjent %d.", saved_people = "Du reddet %d personer av totalt %d.", }, -- Disease discovered disease_discovered_patient_choice = { choices = { send_home = "Send pasienten hjem.", wait = "Få pasienten til å vente litt på sykehuset.", research = "Send pasienten til forskningsavdelingen.", }, need_to_build_and_employ = "Om du bygger %s og ansetter en %s kan du löse problemet med en gang.", need_to_build = "Du må bygge %s for å håndtere dette.", need_to_employ = "Ansett en %s for å hjelpe pasienten.", can_not_cure = "Du kan ikke behandle denne sykdommen.", disease_name = "Dine ansatte har stött på et tilfelle av %s.", what_to_do_question = "Hva vil du gjöre med pasienten?", guessed_percentage_name = "Teamet ditt mener de vet hva som feiler pasienten. Det er %d prosent sannsynlighet for at det er %s", }, disease_discovered = { close_text = "En ny sykdom er oppdaget.", can_cure = "Du kan behandle denne sykdommen.", need_to_build_and_employ = "Om du bygger %s og ansetter en %s kan du håndtere dette.", need_to_build = "Du må bygge %s for å håndtere dette.", need_to_employ = "Ansett en %s for å behandle pasienter med denne sykdommen.", discovered_name = "Ditt team har oppdaget et tilfelle av %s.", }, -- Epidemic epidemic = { choices = { declare = "Offentliggjör epidemi, betal boten og godta at ryktet ditt blir svekket.", cover_up = "Forsök å behandle alle infiserte pasienter för tiden renner ut, og för noen forlater sykehuset.", }, disease_name = "Dine Leger har oppdaget en svært smittsom form for %s.", declare_explanation_fine = "Om du offentliggjör epidemien, må du betale en bot på %d, ditt rykte får en smell, og samtlige pasienter blir vaksinert automatisk.", cover_up_explanation_1 = "Om du derimot forsöker å holde epidemien skjult, må du behandle samtlige infiserte pasienter för helsemyndighetene får rede på det.", cover_up_explanation_2 = "Om en Helseinspektör kommer på besök og finner ut at du pröver å skjule epidemien, kan han gå drastisk til verks.", }, -- Epidemic result epidemic_result = { close_text = "Hurra!", failed = { part_1_name = "Gjennom forsöket på å skjule det faktum at vi sto ovenfor et smittsomt utbrudd av %s", part_2 = "klarte personalet ditt selvfölgelig å spre epidemien ut til alle sykehusets naboer.", }, succeeded = { part_1_name = "Helseinspektören hörte rykter om at institusjonen din slet med et alvorlig tilfelle av %s.", part_2 = "Han har derimot ikke lykkes i å finne beviser som bekrefter ryktene.", }, compensation_amount = "Myndighetene har besluttet å gi deg %d i kompensasjon for skaden disse lögnene har påfört ditt gode rykte.", fine_amount = "Myndighetene har erklært nasjonal unntakstilstand og bötelegger deg med %d.", rep_loss_fine_amount = "Avisene har nå nytt forsidestoff, og ditt rykte får en kraftig smell. I tillegg blir du bötelagt med %d.", hospital_evacuated = "Helserådet har ikke annet valg enn å evakuere sykehuset ditt.", }, -- VIP visit query vip_visit_query = { choices = { invite = "Send offisiell invitasjon til V.I.P.", refuse = "Avvis forespörselen fra V.I.P med dårlige unnskyldninger.", }, vip_name = "%s har ytret et önske om å få besöke sykehuset ditt", }, -- VIP visit result vip_visit_result = { close_text = "Takk for at du besökte sykehuset.", telegram = "Telegram!", vip_remarked_name = "Etter sitt besök på sykehuset ditt, sa %s fölgende:", cash_grant = "Du er blitt tildelt %d i kontanter.", rep_boost = "Ditt rykte i nærområdet har fått en opptur.", rep_loss = "Ditt rykte har fått seg en smell.", remarks = { free_build = { [1] = "Det er et veldig fint sykehus du har der! Men det er ikke veldig vanskelig å få det til å fungerer uten pengebegrensninger.", [2] = "Jeg er ingen ökonom, men jeg tror jeg kunne styrt dette sykehuset også, hvis du skjönner hva jeg mener.", [3] = "Et meget veldrevet sykehus. Men se opp for ökonomiske nedgangstider! Å, det er sant. Du trenger ikke å bekymre deg for det.", }, super = { "For et flott sykehus. Neste gang jeg blir alvorlig syk vil jeg hit.", "Dette er hva jeg kaller et sykehus.", "Et supert sykehus. Og jeg vet hva jeg snakker om, for jeg har vært med på en del.", }, good = { "For et velorganisert sykehus. Takk for at jeg fikk komme hit.", "Hmm. Ingen dårlig medisinsk institusjon dette, det skal være visst.", "Jeg likte ditt sjarmerende sykehus. Forresten, noen som blir med å spise indisk?", }, mediocre = { "Vel, jeg har sett verre. Men du burde gjöre noen forbedringer.", "Å kjære min tid. Dette er ikke stedet å gå om du föler deg dårlig.", "Et helt alminnelig sykehus, for å være ærlig. Jeg hadde forventet meg noe mer.", }, bad = { "Hva gjör jeg her egentlig? Dette her var verre enn en firetimers opera!", "Dette var ekkelt. Kaller du dette et sykehus? Ser mer ut som en svinesti!", "Jeg er lei av å være en offentlig person og lei stinkende hull som dette! Jeg sier opp.", }, very_bad = { "For et syn. Dette sykehuset skal jeg pröve å få lagt ned.", "Jeg har aldri sett på maken. For en skandale!", "Jeg er sjokkert. Du kan ikke kalle dette et sykehus! Jeg går og tar meg en sterk drink.", }, }, }, -- Diagnosis failed diagnosis_failed = { choices = { send_home = "Send pasienten hjem", take_chance = "Gjett sannsynlig behandling.", wait = "Få pasienten til å vente mens du bygger flere diagnoserom.", }, situation = "Vi har brukt alle våre diagnosemetoder på denne pasienten, men vi vet fremdeles ikke sikkert hva som er galt.", what_to_do_question = "Hva skal vi gjöre med pasienten?", partial_diagnosis_percentage_name = "Det er %d prosent sannsynlighet for at vi vet hvilken type %s pasienten har.", }, } -- Queue window queue_window = { num_in_queue = "Kölengde", num_expected = "Ventet", num_entered = "Antall besök", max_queue_size = "Maks str.", } -- Handyman window handyman_window = { parcel = "Tomt", all_parcels = "Alle tomter", } -- Dynamic info dynamic_info = { patient = { actions = { dying = "Döende", awaiting_decision = "Venter din beslutning", queueing_for = "I köen til %s", -- %s on_my_way_to = "På vei til %s", -- %s cured = "Kurert!", fed_up = "Sint, forlater sykehuset", sent_home = "Sendt hjem", sent_to_other_hospital = "Henvist til annet sykehus", no_diagnoses_available = "Ingen flere diagnosemuligheter", no_treatment_available = "Ingen behandling mulig - Jeg går hjem", waiting_for_diagnosis_rooms = "Venter på at du skal bygge flere diagnoserom for meg", waiting_for_treatment_rooms = "Venter på at du skal bygge behandlingsrom for meg", prices_too_high = "Prisene er for höye - Jeg går hjem", epidemic_sent_home = "Sendt hjem av inspektör", epidemic_contagious = "Jeg er smittsom", epidemic_vaccinated = "Jeg er ikke smittsom lenger", }, diagnosed = "Diagnose: %s", -- %s guessed_diagnosis = "Gjettet diagnose: %s", -- %s diagnosis_progress = "Diagnoseprosess", emergency = "Akutt: %s", -- %s (disease name) }, vip = "Besökende VIP", health_inspector = "Helseinspektör", staff = { psychiatrist_abbrev = "Psyk.", actions = { waiting_for_patient = "Venter på pasient", wandering = "Vandrer rundt omkring", going_to_repair = "Skal reparere %s", -- %s (name of machine) }, tiredness = "Tretthet", ability = "Evner", -- unused? }, object = { strength = "Holdbarhet: %d", -- %d (max. uses) times_used = "Ganger brukt: %d", -- %d (times used) queue_size = "Kölengde: %d", -- %d (num of patients) queue_expected = "Forventet kölengde: %d", -- %d (num of patients) }, } introduction_texts = { demo = "Velkommen til demonstrasjonssykehuset!//" .. "Uheldigvis inneholder demoversjonen kun dette nivået. Uansett så er det mer enn nok å gjöre her for å holde deg opptatt en stund! " .. "Du vil möte på forskjellige sykdommer som krever forskjellige rom for å kureres. Fra tid til annen kan nödstilfeller oppstå. Du må også forske frem nye rom ved hjelp av en forskningsavdeling. " .. "Målet ditt er å tjene $100,000, ha et sykehus som er verdt $70,000 og et omdömme på 700, samt kurert minst 75% av pasientene. " .. "Pass på at omdömmet ditt ikke faller under 300 og at du ikke dreper mer enn 40% av pasientene, for ellers vil du tape nivået.//" .. "Lykke til!", level1 = "Velkommen til ditt förste sykehus!//" .. "Få stedet opp og gå ved å plassere en Resepsjon, bygge en Allmennpraksis, og ansette en Resepsjonist og en Lege. " .. "Vent så til det begynner å skje ting." .. "Det er smart å bygge Psykiatri og ansette en Lege med fordypning innenfor psykiatri. " .. "Et Apotek og en Sykepleier er essensielt for å kurere pasientene dine. " .. "Se opp for mange tilfeller av Ballonghode - et Pumperom vil fort kunne være til stor hjelp. " .. "Du må kurere 10 pasienter og sörge for at omdömmet ditt ikke blir mindre enn 200. ", level2 = "Det er et större spekter av plager i dette området. " .. "Bygg sykehuset for å behandle flere pasienter, og planlegg en egen Forskningsavdeling. " .. "Husk å holde institusjonen ren, og streb etter så höyt omdömme som mulig - du vil måtte håndtere plager som Lös tunge, så du trenger en Tungeklinikk. " .. "Du kan også bygge Kardiorom for å forbedre diagnostisering. " .. "Begge disse rommene vil måtte forskes på för du kan bygge de. Du kan også utvide sykehustomten slik at du får mer plass å boltre deg på - Bruk Områdekartet til dette. " .. "Streb etter et omdömme på 300 og en banksaldo på $10,000, samt 40 kurerte pasienter. ", level3 = "Du setter opp et sykehus i et velstående område denne gangen. " .. "Helsedepartementet er ute etter at du klarer å sikre en sunn profitt her. " .. "Du må få et godt rykte til å begynne med, men når sykehuset går av seg selv, så konsentrer deg om å tjene så mye penger du klarer. " .. "Det er også en sjanse for at nödssituasjoner oppstår. " .. "Dette er når store mengder mennesker kommer på en gang med samme tilstand. " .. "Kurerer du alle innen tidsfristen så får du et bedre rykte, og en stor xbonus. " .. "Sykdommer som Rock'n'Roll-syndrom kan inntreffe og du bör budsjettere for en Operasjonssal med en Sykestue i nærheten. " .. "Tjen opp $20,000 for å klare nivået.", level4 = "Hold alle pasientene dine fornöyde, ta deg av dem så effektivt som mulig og hold dödsfall til et absolutt minimum. " .. "Ditt omdömme står på spill, så sörg for at du får det så höyt som mulig. " .. "Ikke bekymre deg for mye over penger - det vil komme etter som ditt vitale omdömme vokser. " .. "Du vil kunne skolere Leger til å utvide sine evner. " .. "Du kan komme til få pasienter som synes å være mer gjennomsiktig enn de fleste. " .. --sjekk english.lua er det bra nok oversettelse? "Oppnå et omdömme på over 500.", level5 = "Dette blir et travelt sykehus, siden du må håndtere et bredt spekter av tilfeller. " .. "Legene du kan ansette kommer rett fra skolen, så det kommer til å være avgjörende for deg å bygge et Klasserom og skolere dem til et akseptabelt nivå. " .. "Du har kun tre Konsulenter til å lære opp de uerfarne medarbeiderne, så hold dem lykkelige slik at de ikke slutter. " .. "Merk deg også at sykehusets fundament står på en grunn full av geologiske feil. " .. "Faren for jordskjelv er alltid tilstedeværende. " .. "De vil forårsake betydelig skade på maskiner, og forstyrre den jevne driften av sykehuset. " .. "Få omdömmet ditt opp til 400, og ha $50,000 i banken for å lykkes. Du må også kurere 200 pasienter.", level6 = "Bruk all din kunnskap til å sette opp et velsmurt og kompetent sykehus som gjör et sunt overskudd og kan håndtere alt som den sykelige offentligheten kan kaste på det. " .. --todo - godt nok oversatt? "Du bör være klar over at atmosfæren rundt her er kjent for å bære med seg bakterier og infeksjoner. " .. "Med mindre du klarer å holde institusjonen din omhyggelig ren, kan du stå overfor en rekke epidemier blant pasientene. " .. "Pass på at du skaffer deg $150,000, og at sykehuset er verdt over $140,000.", level7 = "Her vil du være under nöye gransking fra Helsedepartementet, så sörg for at kontoene dine viser at du tjener en masse penger, og at omdömmet ditt er svært bra. " .. "Vi har ikke råd til unödvendige dödsfall - det er dårlig for forretningene. " .. "Sörg for at personalet er i tipp-topp form, og at du har alt utstyret du trenger. " .. "Få et omdömme på 600, pluss $200,000 i banken.", level8 = "Det er opp til deg å sette opp det mest effektive og kostnadseffektive sykehuset som mulig. " .. "Menneskene rundt her er ganske velstående, så flå dem for så mye grunker du bare klarer. " .. "Husk at det å kurere mennesker er veldig fint, men du trenger virkelig pengene det bringer. " .. "Behandle disse syke personene med Pengeutsugeren. " .. "Samle opp en pengehaug på $300,000 for å fullföre dette nivået.", level9 = "Etter å ha fylt opp Ministerens bankkonto og finansiert Ministerens nye limousin, kan du nå konsentrere deg om å lage et omsorgsfullt og velfungerende sykehus for de trengende. " .. "Du må forvente å stöte på en rekke problemer her." .. "Om du har nok av rom og flinke ansatte, skal du kunne ha dette under kontroll. " .. "Sykehuset ditt må ha en verdi på $200,000, og du må ha $400,000 i banken. " .. "Med noe mindre får du ikke fullfört dette nivået.", level10 = "I tillegg til å få bukt med alle sykdommene som dukker opp i denne skogkanten, så vil Departementet at du bruker litt tid på å konsentrere deg om effektiviteten av legemidlene dine. " .. "Det har kommet noen klager fra Ofsick, Helsedepartementets vakthund, så for at alt skal se bra ut du må sörge for at alle legemidler er svært effektive. " .. --todo (bytte ut "Ofsick" med et norskt navn).. "Kontroller også at sykehuset i tillegg er uklanderlig. Hold dödsfallene nede. " .. "Som et hint, så kanskje du bör holde av litt plass til en Gelétönne. " .. "Utvikle alle dine medisiner til minst 80 prosent effektivitet, få et omdömme på 650 og gjem unna $500,000 i banken for å vinne. ", level11 = "Du har fått muligheten til å bygge det ultimate innen sykehus. " .. "Dette er et meget prestisjefylt område, og Departementet önsker å se det best mulige sykehuset. " .. "Vi vil forvente at du gjör store penger, har et ypperlig og godt omdömme og dekker alle mulige hendelser. " .. "Dette er en viktig jobb. " .. "Du må være virkelig begavet for å gjennomföre det. " .. "Merk også at det har vært observasjoner av UFO-er i området. Sörg for at personalet er forberedt på noen uventede gjester. " .. "Sykehuset ditt må være verdt $240,000, du må ha $500,000 i banken og ditt omdömme må være på minst 700.", level12 = "Du har fått moderen av alle utfordringer nå. " .. "Departementet er imponert over din suksess, og har skaffet toppjobben for deg; de vil at du skal bygge enda et storslagent sykehus, skaffe en stor haug med penger og få et bra utrolig rykte. " .. "Det forventes at du kjöper opp alle områdene du klarer, kurerer alle sykdommer (og da mener vi alle) og vinner alle premiene. " .. "Tror du at du klarer det?" .. "Tjen $650,000, kurer 750 pasienter og få et omdömme på 800 for å vinne dette nivået.", level13 = "Din enestående dyktighet som sykehusadministrator har blitt oppdaget av Hemmelig Super-avdeling fra Superhemmelige Tjenester. " .. "De har en spesiell bonus for deg; det er et rotteinfisert sykehus som trenger en effektiv Terminator. " .. "Du må skyte så mange rotter som mulig för Vaktmesterne rydder opp all söpla. " .. "Tror du at du klarer oppgaven?", level14 = "Det er nok en utfordring - det helt uventede overraskelsessykehuset. " .. "Om du klarer å gjöre en suksess ut av dette, vil du bli vinneren over alle andre vinnere. " .. "Ikke forvent at det skal være fort gjort, ettersom det er det töffeste oppdraget du noensinne vil få. " .. "Lykke til!", level15 = "Ok, det var den grunnleggende teknikken i å sette et sykehus sammen.//" .. "Legene dine kommer til å trenge all den hjelpen de kan få til å diagnostisere noen av disse pasientene. Du kan hjelpe dem ved å " .. "bygg et ny diagnoserom, for eksempel Generell Diagnose.", level16 = "Når du har diagnostisert noen av pasientene må du bygge behandlingsrom og klinikker for å kurere dem - en god idé å begynne " .. "med Apoteket. Du trenger også en Sykepleier for å utlevere ulike legemidler fra Apoteket.", level17 = "Siste advarsel - hold öye med omdömmet ditt - det er dette som tiltrekker pasienter til sykehuset ditt. " .. "Om du ikke dreper for mange mennesker og samtidig holder pasientene noenlunde i godt humör, skal du ikke ha for store problemer med dette nivået!//" .. "Nå må du klare deg selv. Lykke til med det.", level18 = "", } -- Miscellaneous -- Category of strings that fit nowhere else or we are not sure where they belong. -- If you think a string of these fits somewhere else, please move it there. -- Don't forget to change all references in the code and other language files. misc = { grade_adverb = { mildly = "mild", moderately = "moderat", extremely = "ekstrem", }, done = "Ferdig", pause = "Pause", send_message = "Send beskjed til spiller %d", -- %d (player number) send_message_all = "Send beskjed til alle spillere", save_success = "Spill lagret", save_failed = "FEIL: Kunne ikke lagre spill", hospital_open = "Sykehus åpent", out_of_sync = "Spillet ute av synk", load_failed = "Kunne ikke laste tidligere spill", low_res = "Lav oppl.", balance = "Balansefil:", mouse = "Mus", force = "Styrke", } -- Original credits (untranslated) original_credits = { [1] = " ", [2] = " ", [3] = " ", [4] = " ", [5] = " ", [6] = " ", [7] = " ", [8] = " ", [9] = " ", [10] = " ", [11] = " ", [12] = ":Designed and Created by", [13] = ":Bullfrog Productions", [14] = " ", [15] = ":Pluto Development Team", [16] = ",", [17] = "Mark Webley", [18] = "Gary Carr", [19] = "Matt Chilton", [20] = "Matt Sullivan", [21] = "Jo Rider", [22] = "Rajan Tande", [23] = "Wayne Imlach", [24] = "Andy Bass", [25] = "Jon Rennie", [26] = "Adam Coglan", [27] = "Natalie White", [28] = " ", [29] = " ", [30] = " ", [31] = ":Programming", [32] = ",", [33] = "Mark Webley", [34] = "Matt Chilton", [35] = "Matt Sullivan", [36] = "Rajan Tande", [37] = " ", [38] = " ", [39] = " ", [40] = ":Art", [41] = ",", [42] = "Gary Carr", [43] = "Jo Rider", [44] = "Andy Bass", [45] = "Adam Coglan", [46] = " ", [47] = " ", [48] = " ", [49] = ":Additional Programming", [50] = ",", [51] = "Ben Deane", [52] = "Gary Morgan", [53] = "Jonty Barnes", [54] = " ", [55] = " ", [56] = " ", [57] = ":Additional Art", [58] = ",", [59] = "Eoin Rogan", [60] = "George Svarovsky", [61] = "Saurev Sarkar", [62] = "Jason Brown", [63] = "John Kershaw", [64] = "Dee Lee", [65] = " ", [66] = " ", [67] = " ", [68] = ":Intro Sequence", [69] = ",", [70] = "Stuart Black", [71] = " ", [72] = " ", [73] = " ", [74] = ":Music and Sound Effects", [75] = ",", [76] = "Russell Shaw", [77] = "Adrian Moore", [78] = " ", [79] = " ", [80] = " ", [81] = ":Additional Music", [82] = ",", [83] = "Jeremy Longley", [84] = "Andy Wood", [85] = " ", [86] = " ", [87] = " ", [88] = ":Announcer Voiceover", [89] = ",", [90] = "Rebecca Green", [91] = " ", [92] = " ", [93] = " ", [94] = ":Level Design", [95] = ",", [96] = "Wayne Imlach", [97] = "Natalie White", [98] = "Steven Jarrett", [99] = "Shin Kanaoya", [100] = " ", [101] = " ", [102] = " ", [103] = ":Scripting", [104] = ",", [105] = "James Leach", [106] = "Sean Masterson", [107] = "Neil Cook", [108] = " ", [109] = " ", [110] = " ", [111] = ":R&D", [112] = " ", [113] = ":Graphics Engine", [114] = ",", [115] = "Andy Cakebread", [116] = "Richard Reed", [117] = " ", [118] = " ", [119] = " ", [120] = ":R&D Support", [121] = ",", [122] = "Glenn Corpes", [123] = "Martin Bell", [124] = "Ian Shaw", [125] = "Jan Svarovsky", [126] = " ", [127] = " ", [128] = " ", [129] = ":Library and Tools", [130] = " ", [131] = "Dos and Win 95 Library", [132] = ",", [133] = "Mark Huntley", [134] = "Alex Peters", [135] = "Rik Heywood", [136] = " ", [137] = " ", [138] = " ", [139] = ":Network Library", [140] = ",", [141] = "Ian Shippen", [142] = "Mark Lamport", [143] = " ", [144] = " ", [145] = " ", [146] = ":Sound Library", [147] = ",", [148] = "Russell Shaw", [149] = "Tony Cox", [150] = " ", [151] = " ", [152] = " ", [153] = ":Installer Programming", [154] = ",", [155] = "Andy Nuttall", [156] = "Tony Cox", [157] = "Andy Cakebread", [158] = " ", [159] = " ", [160] = " ", [161] = ":Moral Support", [162] = ",", [163] = "Peter Molyneux", [164] = " ", [165] = " ", [166] = " ", [167] = ":Testing Manager", [168] = ",", [169] = "Andy Robson", [170] = " ", [171] = " ", [172] = " ", [173] = ":Lead Testers", [174] = ",", [175] = "Wayne Imlach", [176] = "Jon Rennie", [177] = " ", [178] = " ", [179] = " ", [180] = ":Play Testers", [181] = ",", [182] = "Jeff Brutus", [183] = "Wayne Frost", [184] = "Steven Lawrie", [185] = "Tristan Paramor", [186] = "Nathan Smethurst", [187] = " ", [188] = "Ryan Corkery", [189] = "Simon Doherty", [190] = "James Dormer", [191] = "Martin Gregory", [192] = "Ben Lawley", [193] = "Joel Lewis", [194] = "David Lowe", [195] = "Robert Monczak", [196] = "Dominic Mortoza", [197] = "Karl O'Keeffe", [198] = "Michael Singletary", [199] = "Andrew Skipper", [200] = "Stuart Stephen", [201] = "David Wallington", [202] = " ", [203] = "And all our other Work Experience Play Testers", [204] = " ", [205] = " ", [206] = " ", [207] = ":Technical Support", [208] = ",", [209] = "Kevin Donkin", [210] = "Mike Burnham", [211] = "Simon Handby", [212] = " ", [213] = " ", [214] = " ", [215] = ":Marketing", [216] = ",", [217] = "Pete Murphy", [218] = "Sean Ratcliffe", [219] = " ", [220] = " ", [221] = " ", [222] = ":With thanks to:", [223] = ",", [224] = "Tamara Burke", [225] = "Annabel Roose", [226] = "Chris Morgan", [227] = "Pete Larsen", [228] = " ", [229] = " ", [230] = " ", [231] = ":PR", [232] = ",", [233] = "Cathy Campos", [234] = " ", [235] = " ", [236] = " ", [237] = ":Documentation", [238] = ",", [239] = "Mark Casey", [240] = "Richard Johnston", [241] = "James Lenoel", [242] = "Jon Rennie", [243] = " ", [244] = " ", [245] = " ", [246] = ":Documentation & Packaging Design", [247] = ",", [248] = "Caroline Arthur", [249] = "James Nolan", [250] = " ", [251] = " ", [252] = " ", [253] = ":Localisation Project Manager", [254] = ",", [255] = "Carol Aggett", [256] = " ", [257] = " ", [258] = " ", [259] = ":Localisation", [260] = ",", [261] = "Sandra Picaper", [262] = "Sonia 'Sam' Yazmadjian", [263] = " ", [264] = "Bettina Klos", [265] = "Alexa Kortsch", [266] = "Bianca Normann", [267] = " ", [268] = "C.T.O. S.p.A. Zola Predosa (BO)", [269] = "Gian Maria Battistini", [270] = "Maria Ziino", [271] = "Gabriele Vegetti", [272] = " ", [273] = "Elena Ruiz de Velasco", [274] = "Julio Valladares", [275] = "Ricardo Martínez", [276] = " ", [277] = "Kia Collin", [278] = "CBG Consult", [279] = "Ulf Thor", [280] = " ", [281] = " ", [282] = " ", [283] = ":Production", [284] = ",", [285] = "Rachel Holman", [286] = " ", [287] = " ", [288] = " ", [289] = ":Producer", [290] = ",", [291] = "Mark Webley", [292] = " ", [293] = " ", [294] = " ", [295] = ":Associate Producer", [296] = ",", [297] = "Andy Nuttall", [298] = " ", [299] = " ", [300] = " ", [301] = ":Operations", [302] = ",", [303] = "Steve Fitton", [304] = " ", [305] = " ", [306] = " ", [307] = ":Company Administration", [308] = ",", [309] = "Audrey Adams", [310] = "Annette Dabb", [311] = "Emma Gibbs", [312] = "Lucia Gobbo", [313] = "Jo Goodwin", [314] = "Sian Jones", [315] = "Kathy McEntee", [316] = "Louise Ratcliffe", [317] = " ", [318] = " ", [319] = " ", [320] = ":Company Management", [321] = ",", [322] = "Les Edgar", [323] = "Peter Molyneux", [324] = "David Byrne", [325] = " ", [326] = " ", [327] = ":All at Bullfrog Productions", [328] = " ", [329] = " ", [330] = " ", [331] = ":Special Thanks to", [332] = ",", [333] = "Everyone at Frimley Park Hospital", [334] = " ", [335] = ":Especially", [336] = ",", [337] = "Beverley Cannell", [338] = "Doug Carlisle", [339] = " ", [340] = " ", [341] = " ", [342] = ":Keep On Thinking", [343] = " ", [344] = " ", [345] = " ", [346] = " ", [347] = " ", [348] = " ", [349] = " ", [350] = " ", [351] = " ", [352] = " ", [353] = " ", [354] = " ", [355] = " ", [356] = " ", [357] = " ", [358] = " ", [359] = " ", [360] = " ", [361] = ".", } CorsixTH-0.63/CorsixTH/Lua/languages/original_strings.lua000066400000000000000000002013651347163623700234420ustar00rootroot00000000000000--[[ Copyright (c) 2010 Manuel "Roujin" Wolf 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. --]] -- Note: This is a pseudo language that defines the mapping between new string -- identifiers and original strings. This language cannot be selected directly. Language("original_strings") SetSpeechFile("Sound-".. ... ..".dat") local S = LoadStrings("Lang-".. ... ..".dat") Encoding(utf8) -- Fix inconsistencies/bugs in german lang file. local function fixGermanStrings(lang_num) if lang_num ~= 2 then return end -- Strings [44][168] (which contains a %s) and [44][169] (contains %d) were -- replaced with a single string [44][168] with %s and %d in german full version. -- Due to this, the remaining strings in section 44 were also off by one. -- Solve it by splitting the string into two. -- NB: ONLY in full version, in demo this is NOT broken (thus do length check) if #S[44][168] == 108 then for str = 218, 169, -1 do S[44][str+1] = S[44][str] end S[44][169] = S[44][168]:sub(46) S[44][168] = S[44][168]:sub(1, 45) end -- Strings [28][32] and [28][33] are equal in the German translation of the full -- version, this causes a mismatch with the English strings -- eng-strings [28][33] to [28][63] are equal to ger-strings [28][34] to [28][64] -- NB: ONLY in full version, demo version is not affected (thus do checks) if S[28][32] == S[28][33] and #S[28] == 64 then for str = 33, 63 do S[28][str] = S[28][str+1] end end -- German spelling reform: eszett changed to double s in a number of words. -- Mass-apply this change here, so we don't have to override all those strings. local repl = { ["daß"] = "dass", ["muß"] = "muss", -- includes occurrences of mußte, mußten ["läßt"] = "lässt", -- includes occurrences of verläßt ["Engpaß"] = "Engpass", ["bißchen"] = "bisschen", ["Streß"] = "Stress", ["Biß"] = "Biss", ["Freßpaket"] = "Fresspaket", ["Paßt"] = "Passt", ["Läßt"] = "Lässt", ["verantwortungsbewußt"] = "verantwortungsbewusst", ["verläßlich"] = "verlässlich", ["Schlußlicht"] = "Schlusslicht", ["unerläßlich"] = "unerlässlich", } for c, cat in ipairs(S) do for s, str in ipairs(cat) do for from, to in pairs(repl) do while str:find(from) do str = str:gsub(from, to) end end S[c][s] = str end end -- good and bad (but not misc) staff description strings are missing space at the end for s, _ in ipairs(S[47]) do S[47][s] = S[47][s] .. " " end for s, _ in ipairs(S[48]) do S[48][s] = S[48][s] .. " " end end fixGermanStrings(...) deprecated = S -- For compatibility -- each of these corresponds to a sprite staff_class = { nurse = S[1][1], doctor = S[1][2], handyman = S[1][3], receptionist = S[1][4], surgeon = S[1][5], -- S[1][6] unused } -- these are titles used e.g. in the dynamic info bar staff_title = { receptionist = S[34][1], general = S[34][2], -- unused? nurse = S[34][3], junior = S[34][4], doctor = S[34][5], surgeon = S[34][6], psychiatrist = S[34][7], consultant = S[34][8], researcher = S[34][9], } object = { -- S[2][ 1] unused desk = S[2][ 2], cabinet = S[2][ 3], door = S[2][ 4], bench = S[2][ 5], table1 = S[2][ 6], -- unused object chair = S[2][ 7], drinks_machine = S[2][ 8], bed = S[2][ 9], inflator = S[2][10], pool_table = S[2][11], reception_desk = S[2][12], table2 = S[2][13], -- unused object & duplicate cardio = S[2][14], scanner = S[2][15], console = S[2][16], screen = S[2][17], litter_bomb = S[2][18], couch = S[2][19], sofa = S[2][20], crash_trolley = S[2][21], tv = S[2][22], ultrascanner = S[2][23], dna_fixer = S[2][24], cast_remover = S[2][25], hair_restorer = S[2][26], slicer = S[2][27], x_ray = S[2][28], radiation_shield = S[2][29], x_ray_viewer = S[2][30], operating_table = S[2][31], lamp = S[2][32], -- unused object toilet_sink = S[2][33], op_sink1 = S[2][34], op_sink2 = S[2][35], surgeon_screen = S[2][36], lecture_chair = S[2][37], projector = S[2][38], bed2 = S[2][39], -- unused duplicate pharmacy_cabinet = S[2][40], computer = S[2][41], atom_analyser = S[2][42], blood_machine = S[2][43], fire_extinguisher = S[2][44], radiator = S[2][45], plant = S[2][46], electrolyser = S[2][47], jelly_moulder = S[2][48], gates_of_hell = S[2][49], bed3 = S[2][50], -- unused duplicate bin = S[2][51], toilet = S[2][52], swing_door1 = S[2][53], swing_door2 = S[2][54], shower = S[2][55], auto_autopsy = S[2][56], bookcase = S[2][57], video_game = S[2][58], entrance_left = S[2][59], entrance_right = S[2][60], skeleton = S[2][61], comfortable_chair = S[2][62], } -- S[3][1]: unused -- S[3][2]: what's this for? Apparently some command line option of original TH -- let you start a specific level directly - on difficult and named HORZA. pay_rise = { definite_quit = S[3][3], regular = { S[3][ 4], -- %d (rise) S[3][ 5], -- %d (rise) %d (new total) S[3][ 6], -- %d (rise) S[3][ 7], -- %d (rise) %d (new total) S[3][ 8], -- %d (rise) S[3][ 9], -- %d (rise) }, poached = S[3][10], -- %d (new total) %s (competitor) } place_objects_window = { drag_blueprint = S[3][11], place_door = S[3][12], place_windows = S[3][13], place_objects = S[3][14], confirm_or_buy_objects = S[3][15], pick_up_object = S[3][16], place_objects_in_corridor = S[3][17], } -- Category of strings that fit nowhere else or we are not sure where they belong. -- If you think a string of these fits somewhere else, please move it there. -- Don't forget to change all references in the code and other language files. misc = { grade_adverb = { mildly = S[3][18], moderately = S[3][19], extremely = S[3][20], }, done = S[3][21], pause = S[3][22], send_message = S[3][23], -- %d (player number) send_message_all = S[3][24], save_success = S[3][25], save_failed = S[3][26], hospital_open = S[3][27], out_of_sync = S[3][28], load_failed = S[3][29], low_res = S[3][30], balance = S[3][31], mouse = S[11][5], force = S[11][6], } -- 4: diseases. This also already handles disease descriptions in 44. -- helper function for diseases local function D(name_str, cause_str) local list = {} list.name = S[4][name_str] if cause_str then list.cause = S[44][cause_str] list.symptoms = S[44][cause_str + 1] list.cure = S[44][cause_str + 2] end return list end diseases = { -- none = D( 1), -- not used/needed? general_practice = D( 2), bloaty_head = D( 3, 62), hairyitis = D( 4, 65), king_complex = D( 5, 68), invisibility = D( 6, 71), serious_radiation = D( 7, 74), slack_tongue = D( 8, 77), alien_dna = D( 9, 80), fractured_bones = D(10, 83), baldness = D(11, 86), discrete_itching = D(12, 89), jellyitis = D(13, 92), sleeping_illness = D(14, 95), pregnancy = D(15, 98), -- unused transparency = D(16, 101), uncommon_cold = D(17, 104), broken_wind = D(18, 107), spare_ribs = D(19, 110), kidney_beans = D(20, 113), broken_heart = D(21, 116), ruptured_nodules = D(22, 119), tv_personalities = D(23, 122), infectious_laughter = D(24, 125), corrugated_ankles = D(25, 128), chronic_nosehair = D(26, 131), third_degree_sideburns = D(27, 134), fake_blood = D(28, 137), gastric_ejections = D(29, 140), the_squits = D(30, 143), iron_lungs = D(31, 146), sweaty_palms = D(32, 149), heaped_piles = D(33, 152), gut_rot = D(34, 155), golf_stones = D(35, 158), unexpected_swelling = D(36, 161), diag_scanner = D(37), diag_blood_machine = D(38), diag_cardiogram = D(39), diag_x_ray = D(40), diag_ultrascan = D(41), diag_general_diag = D(42), diag_ward = D(43), diag_psych = D(44), autopsy = D(45), -- mixer = D(46), -- not used/needed? } competitor_names = { S[5][ 1], S[5][ 3], S[5][ 2], S[5][ 4], S[5][ 5], S[5][ 6], S[5][ 7], S[5][ 8], S[5][17], S[5][ 9], S[5][15], S[5][12], "CORSIX", -- Main developers just for fun. "ROUJIN", "EDVIN", S[5][10], S[5][11], S[5][13], S[5][14], S[5][16], S[5][18], S[5][19], S[5][20], S[5][21], } months = { S[6][ 1], S[6][ 2], S[6][ 3], S[6][ 4], S[6][ 5], S[6][ 6], S[6][ 7], S[6][ 8], S[6][ 9], S[6][10], S[6][11], S[6][12], } -- S[7][ 1], -- not needed? -- S[7][ 2], -- unused(?) -- S[7][ 3], -- unused(?) graphs = { money_in = S[7][ 4], money_out = S[7][ 5], wages = S[7][ 6], balance = S[7][ 7], visitors = S[7][ 8], cures = S[7][ 9], deaths = S[7][10], reputation = S[7][11], time_spans = { S[7][12], S[7][13], S[7][14], } } transactions = { --null = S[8][ 1], -- not needed wages = S[8][ 2], hire_staff = S[8][ 3], buy_object = S[8][ 4], build_room = S[8][ 5], cure = S[8][ 6], buy_land = S[8][ 7], treat_colon = S[8][ 8], final_treat_colon = S[8][ 9], cure_colon = S[8][10], deposit = S[8][11], advance_colon = S[8][12], research = S[8][13], drinks = S[8][14], jukebox = S[8][15], -- unused cheat = S[8][16], heating = S[8][17], insurance_colon = S[8][18], bank_loan = S[8][19], loan_repayment = S[8][20], loan_interest = S[8][21], research_bonus = S[8][22], drug_cost = S[8][23], overdraft = S[8][24], severance = S[8][25], general_bonus = S[8][26], sell_object = S[8][27], personal_bonus = S[8][28], emergency_bonus = S[8][29], vaccination = S[8][30], epidemy_coverup_fine = S[8][31], compensation = S[8][32], vip_award = S[8][33], epidemy_fine = S[8][34], eoy_bonus_penalty = S[8][35], eoy_trophy_bonus = S[8][36], machine_replacement = S[8][37], } humanoid_name_starts = S[9] -- 33 entries humanoid_name_ends = S[10] -- 26 entries adviser = { tutorial = { -- 1) build reception build_reception = S[11][30], -- start of the tutorial order_one_reception = S[11][41], accept_purchase = S[11][43], rotate_and_place_reception = S[11][42], reception_invalid_position = S[11][47], -- 2) hire receptionist hire_receptionist = S[11][31], select_receptionists = S[11][34], next_receptionist = S[11][38], prev_receptionist = S[11][39], choose_receptionist = S[11][35], place_receptionist = S[11][37], receptionist_invalid_position = S[11][61], -- 3) build GP's office -- 3.1) room window build_gps_office = S[11][33], select_diagnosis_rooms = S[11][44], click_gps_office = S[11][45], -- 3.2) blueprint -- [11][58] was maybe planned to be used in this place, but is not needed. click_and_drag_to_build = S[11][48], room_in_invalid_position = S[11][52], room_too_small = S[11][53], room_too_small_and_invalid = S[11][62], room_big_enough = S[11][57], -- 3.3) door and windows place_door = S[11][49], door_in_invalid_position = S[11][54], place_windows = S[11][50], window_in_invalid_position = S[11][55], -- 3.4) objects place_objects = S[11][51], object_in_invalid_position = S[11][56], confirm_room = S[11][59], information_window = S[11][64], -- 4) hire doctor hire_doctor = S[11][32], select_doctors = S[11][36], choose_doctor = S[11][46], place_doctor = S[11][40], doctor_in_invalid_position = S[11][60], -- (currently) unused start_tutorial = S[11][63], build_pharmacy = S[11][65], }, staff_advice = { need_doctors = S[11][ 8], too_many_doctors = S[11][ 9], -- too_many_doctors_2 = S[21][ 4] -- duplicate need_handyman_litter = S[11][ 70], need_handyman_plants = S[11][ 93], need_handyman_machines = S[11][ 94], need_nurses = S[11][101], too_many_nurses = S[11][102], }, -- used when you place staff in a wrong place staff_place_advice = { only_researchers = S[11][124], -- in research center only_surgeons = S[11][125], -- in operating theatre only_psychiatrists = S[11][126], -- in psychiatry only_nurses_in_room = S[11][127], -- %s (room name) doctors_cannot_work_in_room = S[11][128], -- %s (room name) nurses_cannot_work_in_room = S[11][129], -- %s (room name) only_doctors_in_room = S[11][130], -- %s (room name) receptionists_only_at_desk = S[11][131], }, build_advice = { blueprint_invalid = S[21][5], blueprint_would_block = S[21][6], door_not_reachable = S[21][7], placing_object_blocks_door = S[21][8], }, -- these are used when completing a room with certain requirements (if they are not met yet) room_requirements = { psychiatry_need_psychiatrist = S[11][ 79], pharmacy_need_nurse = S[11][ 80], training_room_need_consultant = S[11][ 81], research_room_need_researcher = S[11][ 84], op_need_two_surgeons = S[11][ 85], op_need_another_surgeon = S[11][ 86], op_need_ward = S[11][ 87], ward_need_nurse = S[11][ 88], gps_office_need_doctor = S[11][105], reception_need_receptionist = S[11][106], }, surgery_requirements = { need_surgeons_ward_op = S[11][103], need_surgeon_ward = S[11][104], }, warnings = { money_low = S[11][ 2], money_very_low_take_loan = S[11][ 73], cash_low_consider_loan = S[28][ 16], bankruptcy_imminent = S[11][ 3], financial_trouble = S[28][ 29], -- %d amount left before level is lost finanical_trouble2 = S[28][ 30], -- %d same as above financial_trouble3 = S[28][ 31], -- %d same again pay_back_loan = S[28][ 57], machines_falling_apart = S[11][ 4], no_patients_last_month = S[11][ 10], nobody_cured_last_month = S[11][ 11], queues_too_long = S[11][ 12], patient_stuck = S[11][ 13], patients_unhappy = S[11][ 15], patient_leaving = S[28][ 50], patients_leaving = S[28][ 51], patients_really_thirsty = S[28][ 52], patients_annoyed = S[28][ 8], patients_thirsty = S[11][ 16], patients_thirsty2 = S[28][ 5], patients_very_thirsty = S[28][ 6], patients_too_hot = S[11][ 18], patients_getting_hot = S[28][ 53], patients_very_cold = S[28][ 54], people_freezing = S[28][ 14], staff_overworked = S[11][ 17], staff_tired = S[28][ 9], staff_too_hot = S[11][ 19], staff_very_cold = S[28][ 55], staff_unhappy = S[11][ 89], staff_unhappy2 = S[28][ 15], doctor_crazy_overwork = S[11][ 95], reduce_staff_rest_threshold = S[28][ 45], nurses_tired = S[11][ 96], doctors_tired = S[11][ 97], handymen_tired = S[11][ 98], receptionists_tired = S[11][ 99], nurses_tired2 = S[28][ 46], doctors_tired2 = S[28][ 47], handymen_tired2 = S[28][ 48], receptionists_tired2 = S[28][ 49], -- What? need_toilets = S[11][ 20], build_toilets = S[28][ 11], build_toilet_now = S[28][ 39], more_toilets = S[28][ 12], people_did_it_on_the_floor = S[28][ 13], need_staffroom = S[11][ 74], build_staffroom = S[28][ 10], many_killed = S[11][ 77], -- %d (number of killed patients) plants_thirsty = S[11][ 91], too_many_plants = S[11][ 92], charges_too_high = S[11][119], charges_too_low = S[11][120], machine_severely_damaged = S[11][121], -- %s (name of machine) machinery_slightly_damaged = S[28][ 32], machinery_damaged = S[28][ 33], machinery_damaged2 = S[28][ 34], machinery_very_damaged = S[28][ 35], machinery_deteriorating = S[28][ 36], queue_too_long_send_doctor = S[11][132], -- %s (name of room) queue_too_long_at_reception = S[11][133], reception_bottleneck = S[11][134], -- TODO find out why there's 133 and 134. epidemic_getting_serious = S[28][ 2], deal_with_epidemic_now = S[28][ 3], many_epidemics = S[28][ 4], hospital_is_rubbish = S[28][ 7], more_benches = S[28][ 25], people_have_to_stand = S[28][ 28], too_much_litter = S[28][ 17], litter_everywhere = S[28][ 18], litter_catastrophy = S[28][ 19], some_litter = S[28][ 20], place_plants_to_keep_people = S[28][ 21], place_plants2 = S[28][ 22], place_plants3 = S[28][ 23], place_plants4 = S[28][ 24], desperate_need_for_watering = S[28][ 40], change_priorities_to_plants = S[28][ 41], plants_dying = S[28][ 42], }, praise = { many_plants = S[11][75], plants_are_well = S[28][43], plants_thriving = S[28][44], many_benches = S[11][76], plenty_of_benches = S[28][26], few_have_to_stand = S[28][27], patients_cured = S[11][82], -- %d (number of cured patients) }, information = { epidemic = S[11][ 14], emergency = S[11][ 22], promotion_to_doctor = S[11][ 23], promotion_to_specialist = S[11][ 69], -- %s (type: psychiatrist, scientist, surgeon) promotion_to_consultant = S[11][138], first_death = S[11][ 72], first_cure = S[11][ 83], place_windows = S[11][108], larger_rooms = S[11][109], extra_items = S[11][110], patient_abducted = S[11][111], -- what the heck is this? I never got that far in the original... patient_leaving_too_expensive = S[11][118], pay_rise = S[11][ 29], -- TODO only in tutorial / first time? handyman_adjust = S[11][ 71], -- TODO only in tutorial / first time? fax_received = S[11][136], -- Once only vip_arrived = S[21][ 9], -- %s (name of VIP) epidemic_health_inspector = S[21][ 10], initial_general_advice = { research_now_available = S[62][02], research_symbol = S[62][03], surgeon_symbol = S[62][04], psychiatric_symbol = S[62][05], rats_have_arrived = S[62][06], autopsy_available = S[62][07], first_epidemic = S[62][08], first_VIP = S[62][09], taking_your_staff = S[62][10], machine_needs_repair = S[62][11], epidemic_spreading = S[62][12], increase_heating = S[62][13], place_radiators = S[62][14], decrease_heating = S[62][15], first_patients_thirsty = S[62][16], first_emergency = S[62][17], }, }, earthquake = { alert = S[11][107], damage = S[11][100], -- %d (damaged machines) %d (injured people) ended = S[11][ 78], -- %d (severance of earthquake) }, boiler_issue = { maximum_heat = S[21][ 11], minimum_heat = S[21][ 12], resolved = S[21][ 13], }, vomit_wave = { started = S[21][ 14], ended = S[21][ 15], }, goals = { win = { money = S[11][ 21], -- %d (remaining amount) reputation = S[11][ 67], -- %d (required amount) value = S[11][ 68], -- %d (required amount) cure = S[11][137], -- %d (remaining amount) }, lose = { kill = S[11][ 66], -- %d (remaining amount) }, }, level_progress = { nearly_won = S[11][112], three_quarters_won = S[11][113], halfway_won = S[11][114], nearly_lost = S[11][115], three_quarters_lost = S[11][116], halfway_lost = S[11][117], another_patient_cured = S[28][37], another_patient_killed = S[28][38], financial_criteria_met = S[28][56], -- %d money threshold for the level cured_enough_patients = S[28][58], dont_kill_more_patients = S[28][59], reputation_good_enough = S[28][60], -- %d rep threshold for the level improve_reputation = S[28][61], -- %d amount to improve by hospital_value_enough = S[28][62], -- %d keep it above this value close_to_win_increase_value = S[28][63], }, research = { new_machine_researched = S[11][ 24], -- %s (machine(?) name) new_drug_researched = S[11][ 25], -- %s (disease name) drug_improved = S[11][ 26], -- %s (disease name) machine_improved = S[11][ 27], -- %s (machine name) new_available = S[11][ 28], -- %s TODO What is this? Where to use this and where [11][24]? -- ANSWER: It is used if research is not conducted in an area for very long. Some diagnosis equipment -- becomes available anyway after some years. Then this message is displayed instead of [11][24] drug_fully_researched = S[11][122], -- %s (drug(?) name) autopsy_discovered_rep_loss = S[11][123], }, competitors = { hospital_opened = S[11][135], -- %s (competitor name) land_purchased = S[11][ 7], -- %s (competitor name) staff_poached = S[11][ 90], }, multiplayer = { -- S[21][1] unused everyone_failed = S[21][ 2], players_failed = S[21][ 3], poaching = { already_poached_by_someone = S[21][16], not_interested = S[21][17], in_progress = S[21][18], }, objective_completed = S[21][19], -- missing in some TH versions objective_failed = S[21][20], -- missing in some TH versions }, placement_info = { -- S[22][1] unused room_cannot_place = S[22][ 2], room_cannot_place_2 = S[22][ 3], -- hmm. why? maybe the previous one should've been "can" reception_can_place = S[22][ 4], reception_cannot_place = S[22][ 5], door_can_place = S[22][ 6], door_cannot_place = S[22][ 7], window_can_place = S[22][ 8], window_cannot_place = S[22][ 9], staff_can_place = S[22][10], staff_cannot_place = S[22][11], object_can_place = S[22][12], object_cannot_place = S[22][13], }, epidemic = { -- S[28][1] unused serious_warning = S[28][ 2], hurry_up = S[28][ 3], multiple_epidemies = S[28][ 4], }, } level_names = { -- S[12][ 1] -- unused S[12][ 2], S[12][ 3], S[12][ 4], S[12][ 5], S[12][ 6], S[12][ 7], S[12][ 8], S[12][ 9], S[12][10], S[12][11], S[12][12], S[12][13], S[12][14], S[12][15], S[12][16], } town_map = { -- S[13][ 1] -- unused chat = S[13][ 2], for_sale = S[13][ 3], not_for_sale = S[13][ 4], number = S[13][ 5], owner = S[13][ 6], area = S[13][ 7], price = S[13][ 8], } -- NB: includes some special "rooms" -- reception, destroyed room and "corridor objects" rooms_short = { -- S[14][1] -- unused -- S[14][3] -- unused reception = S[14][ 2], destroyed = S[14][ 4], corridor_objects = S[14][29], gps_office = S[14][ 5], psychiatric = S[14][ 6], ward = S[14][ 7], operating_theatre = S[14][ 8], pharmacy = S[14][ 9], cardiogram = S[14][10], scanner = S[14][11], ultrascan = S[14][12], blood_machine = S[14][13], x_ray = S[14][14], inflation = S[14][15], dna_fixer = S[14][16], hair_restoration = S[14][17], tongue_clinic = S[14][18], fracture_clinic = S[14][19], training_room = S[14][20], electrolysis = S[14][21], jelly_vat = S[14][22], staffroom = S[14][23], -- rehabilitation = S[14][24], -- unused general_diag = S[14][25], research_room = S[14][26], toilets = S[14][27], decontamination = S[14][28], } rooms_long = { -- S[53][1] -- unused general = S[53][2], -- unused? emergency = S[53][3], corridors = S[53][29], gps_office = S[53][ 5], psychiatric = S[53][ 6], ward = S[53][ 7], operating_theatre = S[53][ 8], pharmacy = S[53][ 9], cardiogram = S[53][10], scanner = S[53][11], ultrascan = S[53][12], blood_machine = S[53][13], x_ray = S[53][14], inflation = S[53][15], dna_fixer = S[53][16], hair_restoration = S[53][17], tongue_clinic = S[53][18], fracture_clinic = S[53][19], training_room = S[53][20], electrolysis = S[53][21], jelly_vat = S[53][22], staffroom = S[53][23], -- rehabilitation = S[53][24], -- unused general_diag = S[53][25], research_room = S[53][26], toilets = S[53][27], decontamination = S[53][28], } drug_companies = { -- S[15][1], -- unused S[15][2], S[15][3], S[15][4], S[15][5], S[15][6], } build_room_window = { -- S[16][1], -- unused pick_department = S[16][2], pick_room_type = S[16][3], cost = S[16][5], } buy_objects_window = { choose_items = S[16][4], price = S[16][6], total = S[16][7], } research = { categories = { cure = S[17][1], diagnosis = S[17][2], drugs = S[17][3], improvements = S[17][4], specialisation = S[17][5], }, funds_allocation = S[17][6], allocated_amount = S[17][7], } policy = { header = S[18][1], diag_procedure = S[18][2], diag_termination = S[18][3], staff_rest = S[18][4], staff_leave_rooms = S[18][5], sliders = { guess = S[18][6], -- belongs to diag_procedure send_home = S[18][7], -- also belongs to diag_procedure stop = S[18][8], -- belongs to diag_termination staff_room = S[18][9], -- belongs to staff_rest } } room_classes = { -- S[19][1] -- unused -- S[19][2] -- "corridors" - unused for now -- S[19][3] -- unused diagnosis = S[19][4], treatment = S[19][5], clinics = S[19][6], facilities = S[19][7], } -- These are better of in a list with numbers insurance_companies = { out_of_business = S[20][ 1], S[20][ 2], S[20][ 3], S[20][ 4], S[20][ 5], S[20][ 6], S[20][ 7], S[20][ 8], S[20][ 9], S[20][10], S[20][11], S[20][12], } -- 21 and 22: some more adviser strings, see above. -- 23: menu strings -- Menu strings are a little complicated: Different versions of the original -- game have slightly different menu strings. The strings are also organised -- by more levels than traditional strings. For the most part, this extra -- organisation can be use to offset the differences in menu string indices. local M = {{}} do local i = 2 local section = 1 while true do local s = S[23][i] if s == "." then section = section + 1 M[section] = {} elseif s == ".." then break else M[section][#M[section] + 1] = s end i = i + 1 end end menu = { file = M[1][1], options = M[1][2], display = M[1][3], charts = M[1][4], debug = M[1][5], } menu_file = { load = M[2][1], save = M[2][2], restart = #M[2] == 4 and M[2][3] or "(no string) restart", quit = M[2][#M[2]], } menu_file_load = M[7] menu_file_save = menu_file_load --[[{ [1] = S[23][73], [2] = S[23][74], [3] = S[23][75], [4] = S[23][76], [5] = S[23][77], [6] = S[23][78], [7] = S[23][79], [8] = S[23][80], }]] menu_options = { sound = M[3][1], announcements = M[3][2], music = M[3][3], sound_vol = M[3][4], announcements_vol = M[3][5], music_vol = M[3][6], autosave = M[3][7], game_speed = M[3][8], jukebox = M[3][9], } menu_options_volume = { -- redundant in original strings: M[10] and M[11] [100] = M[9][ 1], [ 90] = M[9][ 2], [ 80] = M[9][ 3], [ 70] = M[9][ 4], [ 60] = M[9][ 5], [ 50] = M[9][ 6], [ 40] = M[9][ 7], [ 30] = M[9][ 8], [ 20] = M[9][ 9], [ 10] = M[9][10], } menu_options_game_speed = { slowest = M[12][1], slower = M[12][2], normal = M[12][3], max_speed = M[12][4], and_then_some_more = M[12][5], } menu_display = { high_res = M[4][1], mcga_lo_res = M[4][2], shadows = M[4][3], } menu_charts = { statement = M[5][1], casebook = M[5][2], policy = M[5][3], research = M[5][4], graphs = M[5][5], staff_listing = M[5][6], bank_manager = M[5][7], status = M[5][8], briefing = M[5][#M[5]], } menu_debug = { object_cells = M[6][ 1], entry_cells = M[6][ 2], keep_clear_cells = M[6][ 3], nav_bits = M[6][ 4], remove_walls = M[6][ 5], remove_objects = M[6][ 6], display_pager = M[6][ 7], mapwho_checking = M[6][ 8], plant_pagers = M[6][ 9], porter_pagers = M[6][10], pixbuf_cells = M[6][11], enter_nav_debug = M[6][12], show_nav_cells = M[6][13], machine_pagers = M[6][14], display_room_status = M[6][15], display_big_cells = M[6][16], show_help_hotspot = M[6][17], win_game_anim = M[6][18], win_level_anim = M[6][19], lose_game_anim = { M[6][20], M[6][21], M[6][22], M[6][23], M[6][24], M[6][25], M[6][26], }, } staff_list = { -- S[24][1] unused -- S[24][2] -- I have no idea what this is. morale = S[24][3], tiredness = S[24][4], skill = S[24][5], total_wages = S[24][6], } high_score = { -- S[25][1] unused pos = S[25][2], player = S[25][3], score = S[25][4], best_scores = S[25][5], worst_scores = S[25][6], killed = S[25][7], -- is this used? categories = { money = S[26][ 1], salary = S[26][ 2], clean = S[26][ 3], cures = S[26][ 4], deaths = S[26][ 5], cure_death_ratio = S[26][ 6], patient_happiness = S[26][ 7], staff_happiness = S[26][ 8], staff_number = S[26][ 9], visitors = S[26][10], total_value = S[26][11], }, } trophy_room = { -- S[27][1] unused many_cured = { awards = { S[55][ 5], S[55][ 6], }, penalty = { S[56][ 5], S[56][ 6], }, trophies = { S[27][ 2], -- for around 100% cure rate S[27][ 3], -- for around 100% cure rate S[27][ 4], -- for around 100% cure rate }, regional = { S[55][ 7], }, }, all_cured = { -- not implemented awards = { S[27][29], -- for 100% treat rate (does that mean none sent home or killed?) }, trophies = { S[27][30], -- for 100% cure rate S[27][31], -- for 100% cure rate }, }, hosp_value = { awards = { S[55][20], }, penalty = { S[56][20], }, regional = { S[55][22], }, }, best_value_hosp = { -- not implemented trophies = { S[27][ 6], }, regional = { S[55][21], }, penalty = { S[56][21], }, }, consistant_rep = { trophies = { S[27][ 5], S[27][ 6], }, }, high_rep = { awards = { S[55][ 2], S[55][ 3], }, penalty = { S[56][ 2], -- is this the penalty for consistant poor rep? S[56][ 3], }, regional = { -- not implemented S[27][ 7], S[55][ 4], }, }, happy_staff = { -- not implemented awards = { S[55][23], S[55][25], }, penalty = { S[56][23], }, regional_good = { S[55][24], }, regional_bad = { S[56][24], }, trophies = { S[27][ 8], S[27][ 9], S[27][10], }, }, happy_vips = { trophies = { S[27][11], S[27][12], S[27][13], }, }, no_deaths = { awards = { S[55][ 8], S[55][10], }, penalty = { S[56][ 8], -- this may need an over-ride as it looks wrong "unacceptably" not "acceptably" IMO S[56][ 9], }, trophies = { S[27][14], S[27][15], S[27][16], }, regional = { -- not implemented S[55][ 9], }, }, rats_killed = { -- not implemented trophies = { S[27][17], -- %d (number of rats) S[27][18], -- %d (number of rats) S[27][19], -- %d (number of rats) }, }, rats_accuracy = { -- not implemented trophies = { S[27][20], -- %d (accuracy percentage) S[27][21], -- %d (accuracy percentage) S[27][22], -- %d (accuracy percentage) }, }, healthy_plants = { -- not implemented awards = { S[27][23], }, trophies = { S[27][24], S[27][25], }, }, sold_drinks = { trophies = { S[27][26], S[27][27], S[27][28], }, }, pop_percentage = { -- not implemented awards = { S[55][11], S[55][12], S[55][13], }, penalty = { S[56][11], S[56][12], }, }, gen_repairs = { -- not implemented awards = { S[55][38], S[55][39], S[55][40], }, penalty = { S[56][38], S[56][39], }, }, curesvdeaths = { awards = { S[55][14], }, penalty = { S[56][14], }, }, research = { -- not implemented awards = { S[55][35], S[55][37], }, penalty = { S[56][35], }, regional_good = { S[55][35], }, regional_bad = { S[56][36], }, }, cleanliness = { -- not implemented award = { S[55][26], }, regional_good = { S[56][26], }, regional_bad = { S[56][27], }, }, emergencies = { -- not implemented award = { S[55][32], S[55][34], }, penalty = { S[56][32], }, regional_good = { S[55][33], }, regional_bad = { S[56][33], }, }, wait_times = { -- not implemented award = { S[55][29], }, penalty = { S[56][29], }, }, happy_patients = { -- not implemented awards = { S[55][17], S[55][18], }, penalty = { S[56][17], S[56][18], }, }, -- Strings used in the plaques to show what has been won reputation = S[63][1], cash = S[63][2], } -- Section 28: more adviser strings (see above) casebook = { reputation = S[29][ 1], treatment_charge = S[29][ 2], earned_money = S[29][ 3], cured = S[29][ 4], deaths = S[29][ 5], sent_home = S[29][ 6], research = S[29][ 7], cure = S[29][ 8], cure_desc = { build_room = S[29][ 9], -- %s (room name) build_ward = S[29][10], hire_doctors = S[29][11], hire_surgeons = S[29][12], hire_psychiatrists = S[29][13], hire_nurses = S[29][14], no_cure_known = S[29][15], cure_known = S[29][16], improve_cure = S[29][17], }, } -- 30, 31: multiplayer. not needed for now. tooltip = { -- S[32][1] unused build_room_window = { room_classes = { diagnosis = S[32][ 2], treatment = S[32][ 3], clinic = S[32][ 4], facilities = S[32][ 5], }, cost = S[32][ 6], close = S[32][ 7], }, toolbar = { bank_button = S[32][ 8], balance = S[32][ 9], reputation = S[32][ 10], -- NB: no %d! Append " ([reputation])". date = S[32][ 11], rooms = S[32][ 12], objects = S[32][ 13], edit = S[32][ 14], hire = S[32][ 15], staff_list = S[32][ 16], town_map = S[32][ 17], casebook = S[32][ 18], research = S[32][ 19], status = S[32][ 20], charts = S[32][ 21], policy = S[32][ 22], }, hire_staff_window = { doctors = S[32][ 23], nurses = S[32][ 24], handymen = S[32][ 25], receptionists = S[32][ 26], prev_person = S[32][ 27], next_person = S[32][ 28], hire = S[32][ 29], cancel = S[32][ 30], doctor_seniority = S[32][ 31], staff_ability = S[32][ 32], salary = S[32][ 33], qualifications = S[32][ 34], surgeon = S[32][ 35], psychiatrist = S[32][ 36], researcher = S[32][ 37], }, buy_objects_window = { price = S[32][ 38], total_value = S[32][ 39], confirm = S[32][ 40], cancel = S[32][ 41], decrease = S[32][ 42], increase = S[32][ 43], }, staff_list = { doctors = S[32][ 44], nurses = S[32][ 45], handymen = S[32][ 46], receptionists = S[32][ 47], happiness = S[32][ 48], tiredness = S[32][ 49], ability = S[32][ 50], salary = S[32][ 51], happiness_2 = S[32][ 52], tiredness_2 = S[32][ 53], ability_2 = S[32][ 54], prev_person = S[32][ 55], next_person = S[32][ 56], bonus = S[32][ 57], sack = S[32][ 58], pay_rise = S[32][ 59], close = S[32][ 60], doctor_seniority = S[32][ 61], detail = S[32][ 62], view_staff = S[32][ 63], surgeon = S[32][ 64], psychiatrist = S[32][ 65], researcher = S[32][ 66], surgeon_train = S[32][ 67], -- %d (percentage trained) psychiatrist_train = S[32][ 68], -- %d (percentage trained) researcher_train = S[32][ 69], -- %d (percentage trained) skills = S[32][ 70], }, queue_window = { num_in_queue = S[32][ 71], num_expected = S[32][ 72], num_entered = S[32][ 73], max_queue_size = S[32][ 74], dec_queue_size = S[32][ 75], inc_queue_size = S[32][ 76], front_of_queue = S[32][ 77], end_of_queue = S[32][ 78], close = S[32][ 79], patient = S[32][ 80], patient_dropdown = { reception = S[32][186], send_home = S[32][187], hospital_1 = S[32][188], hospital_2 = S[32][189], hospital_3 = S[32][190], }, }, main_menu = { new_game = S[32][ 81], load_game = S[32][ 82], continue = S[32][ 83], network = S[32][ 84], quit = S[32][ 85], load_menu = { load_slot = S[41][ 1], -- NB: no %d! Append " [slotnumber]". empty_slot = S[41][ 2], }, }, window_general = { cancel = S[32][ 86], confirm = S[32][ 87], }, patient_window = { close = S[32][ 88], graph = S[32][ 89], happiness = S[32][ 90], thirst = S[32][ 91], warmth = S[32][ 92], casebook = S[32][ 93], send_home = S[32][ 94], center_view = S[32][ 95], abort_diagnosis = S[32][ 96], queue = S[32][ 97], }, staff_window = { name = S[32][ 98], close = S[32][ 99], face = S[32][100], happiness = S[32][101], tiredness = S[32][102], ability = S[32][103], doctor_seniority = S[32][104], skills = S[32][105], surgeon = S[32][106], psychiatrist = S[32][107], researcher = S[32][108], salary = S[32][109], center_view = S[32][110], sack = S[32][111], pick_up = S[32][112], }, machine_window = { name = S[32][113], close = S[32][114], times_used = S[32][115], status = S[32][116], repair = S[32][117], replace = S[32][118], }, -- Apparently handymen have their own set of strings (partly) containing "handyman". -- We could just get rid of this category and include the three prios into staff_window. handyman_window = { name = S[32][119], -- contains "handyman" close = S[32][120], face = S[32][121], -- contains "handyman" happiness = S[32][122], tiredness = S[32][123], ability = S[32][124], prio_litter = S[32][125], -- contains "handyman" prio_plants = S[32][126], -- contains "handyman" prio_machines = S[32][127], -- contains "handyman" salary = S[32][128], center_view = S[32][129], -- contains "handyman" sack = S[32][130], pick_up = S[32][131], }, place_objects_window = { cancel = S[32][132], buy_sell = S[32][133], pick_up = S[32][134], confirm = S[32][135], }, casebook = { up = S[32][136], down = S[32][137], close = S[32][138], reputation = S[32][139], treatment_charge = S[32][140], earned_money = S[32][141], cured = S[32][142], deaths = S[32][143], sent_home = S[32][144], decrease = S[32][145], increase = S[32][146], research = S[32][147], cure_type = { drug = S[32][148], drug_percentage = S[32][149], -- %d (effectiveness percentage) psychiatrist = S[32][150], surgery = S[32][151], machine = S[32][152], }, cure_requirement = { possible = S[32][153], research_machine = S[32][154], build_room = S[32][155], hire_surgeons = S[32][156], -- unused hire_surgeon = S[32][157], -- unused hire_staff_old = S[32][158], -- %s (staff type), unused. Use hire_staff instead. build_ward = S[32][159], -- unused ward_hire_nurse = S[32][160], -- unused not_possible = S[32][161], -- unused }, }, statement = { close = S[32][162], }, research = { close = S[32][163], cure_dec = S[32][164], diagnosis_dec = S[32][165], drugs_dec = S[32][166], improvements_dec = S[32][167], specialisation_dec = S[32][168], cure_inc = S[32][169], diagnosis_inc = S[32][170], drugs_inc = S[32][171], improvements_inc = S[32][172], specialisation_inc = S[32][173], -- S[32][174] unused allocated_amount = S[32][175], }, graphs = { close = S[32][176], scale = S[32][177], money_in = S[32][178], money_out = S[32][179], wages = S[32][180], balance = S[32][181], visitors = S[32][182], cures = S[32][183], deaths = S[32][184], reputation = S[32][185], }, -- S[32][186] through S[32][190] inserted further above town_map = { people = S[32][191], plants = S[32][192], fire_extinguishers = S[32][193], objects = S[32][194], radiators = S[32][195], heat_level = S[32][196], heat_inc = S[32][197], heat_dec = S[32][198], heating_bill = S[32][199], balance = S[32][200], close = S[32][201], }, -- S[32][202] unused. jukebox = { current_title = S[32][203], close = S[32][204], play = S[32][205], rewind = S[32][206], fast_forward = S[32][207], stop = S[32][208], loop = S[32][209], }, bank_manager = { hospital_value = S[32][210], balance = S[32][211], current_loan = S[32][212], repay_5000 = S[32][213], borrow_5000 = S[32][214], interest_payment = S[32][215], inflation_rate = S[32][216], interest_rate = S[32][217], close = S[32][218], insurance_owed = S[32][219], -- %s (name of debitor) show_graph = S[32][220], -- %s (name of debitor) graph = S[32][221], -- %s (name of debitor) graph_return = S[32][222], }, status = { win_progress_own = S[32][223], win_progress_other = S[32][224], -- %s (name of competitor) population_chart = S[32][225], happiness = S[32][226], thirst = S[32][227], warmth = S[32][228], close = S[32][229], -- Criteria to win reputation = S[64][ 1], balance = S[64][ 2], population = S[64][ 3], num_cured = S[64][ 4], percentage_killed = S[64][ 5], value = S[64][ 6], percentage_cured = S[64][ 7], }, policy = { close = S[32][230], staff_leave = S[32][231], staff_stay = S[32][232], diag_procedure = S[32][233], diag_termination = S[32][234], staff_rest = S[32][235], }, pay_rise_window = { accept = S[32][236], decline = S[32][237], }, watch = { hospital_opening = S[32][238], emergency = S[32][239], epidemic = S[32][240], }, rooms = { -- S[33][1] through S[33][7] unused. gps_office = S[33][ 8], psychiatry = S[33][ 9], ward = S[33][10], operating_theatre = S[33][11], pharmacy = S[33][12], cardiogram = S[33][13], scanner = S[33][14], ultrascan = S[33][15], blood_machine = S[33][16], x_ray = S[33][17], inflation = S[33][18], dna_fixer = S[33][19], hair_restoration = S[33][20], tongue_clinic = S[33][21], fracture_clinic = S[33][22], training_room = S[33][23], electrolysis = S[33][24], jelly_vat = S[33][25], staffroom = S[33][26], -- rehabilitation = S[33][27], -- unused general_diag = S[33][28], research_room = S[33][29], toilets = S[33][30], decontamination = S[33][31], }, objects = { -- S[40][1] unused. -- NB: most objects do not have a tooltip because they're not (extra-)buyable desk = S[40][ 2], cabinet = S[40][ 3], door = S[40][ 4], bench = S[40][ 5], table1 = S[40][ 6], -- unused chair = S[40][ 7], drinks_machine = S[40][ 8], bed = S[40][ 9], inflator = S[40][10], pool_table = S[40][11], reception_desk = S[40][12], table2 = S[40][13], -- unused & duplicate cardio = S[40][14], -- no description scanner = S[40][15], -- no description console = S[40][16], -- no description screen = S[40][17], -- no description litter_bomb = S[40][18], couch = S[40][19], -- no description sofa = S[40][20], crash_trolley = S[40][21], -- no description tv = S[40][22], ultrascanner = S[40][23], -- no description dna_fixer = S[40][24], -- no description cast_remover = S[40][25], -- no description hair_restorer = S[40][26], -- no description slicer = S[40][27], -- no description x_ray = S[40][28], -- no description radiation_shield = S[40][29], -- no description x_ray_viewer = S[40][30], -- no description operating_table = S[40][31], -- no description lamp = S[40][32], -- unused toilet_sink = S[40][33], op_sink1 = S[40][34], -- no description op_sink2 = S[40][35], -- no description surgeon_screen = S[40][36], -- no description lecture_chair = S[40][37], projector = S[40][38], -- no description bed2 = S[40][39], -- unused duplicate pharmacy_cabinet = S[40][40], computer = S[40][41], atom_analyser = S[40][42], blood_machine = S[40][43], -- no description fire_extinguisher = S[40][44], radiator = S[40][45], plant = S[40][46], electrolyser = S[40][47], -- no description jelly_moulder = S[40][48], -- no description gates_of_hell = S[40][49], -- no description bed3 = S[40][50], -- unused duplicate bin = S[40][51], toilet = S[40][52], swing_door1 = S[40][53], -- no description swing_door2 = S[40][54], -- no description shower = S[40][55], -- no description auto_autopsy = S[40][56], bookcase = S[40][57], video_game = S[40][58], entrance_left = S[40][59], -- no description entrance_right = S[40][60], -- no description skeleton = S[40][61], comfortable_chair = S[40][62], -- no description }, } -- 34: staff titles, inserted further above confirmation = { quit = S[35][1], return_to_blueprint = S[35][2], replace_machine = S[35][3], -- %s (machine name) %d (price) overwrite_save = S[35][4], delete_room = S[35][5], sack_staff = S[35][6], restart_level = S[35][7], -- missing in some TH versions } bank_manager = { hospital_value = S[36][1], balance = S[36][2], current_loan = S[36][3], interest_payment = S[36][4], insurance_owed = S[36][5], inflation_rate = S[36][6], interest_rate = S[36][7], statistics_page = { date = S[37][1], details = S[37][2], money_out = S[37][3], money_in = S[37][4], balance = S[37][5], current_balance = S[37][6], }, } newspaper = { -- Seven categories of funny headlines. I think each category is related -- to one criterion you can lose to. TODO: categorize { S[38][ 1], S[38][ 2], S[38][ 3], S[38][ 4], S[38][ 5] }, { S[38][ 7], S[38][ 8], S[38][ 9], S[38][10], S[38][11], S[38][12] }, { S[38][14], S[38][15], S[38][16], S[38][17] }, { S[38][19], S[38][20], S[38][21], S[38][22] }, { S[38][24], S[38][25], S[38][26], S[38][27], S[38][28], S[38][29] }, { S[38][31], S[38][32], S[38][33], S[38][34], }, { S[38][36], S[38][37], S[38][38], S[38][39], S[38][40] }, } -- 39: letters -- Letters are organized in another level, just like menu strings. local L = {{""}} do local i = 1 local section = 1 while true do local s = S[39][i] if s == "." then section = section + 1 L[section] = {} L[section][1] = "" elseif s == ".." then L[section] = nil break else L[section][#L[section]] = L[section][#L[section]] .. s if s:find("//") then L[section][#L[section] + 1] = "" end end i = i + 1 end end letter = L -- table of 12 tables (one for each level) -- each sub-table contains a varying number of strings that form the letter together -- 40: object tooltips, inserted further above -- 41: load menu, inserted further above vip_names = { health_minister = S[42][1], S[42][ 2], -- the rest is better organized in an array. S[42][ 3], S[42][ 4], S[42][ 5], S[42][ 6], S[42][ 7], S[42][ 8], S[42][ 9], S[42][10], S[42][11], } -- 43: credits -- Maybe we could include them somewhere as a tribute. Maybe not. -- Translators, please do not bother translating these... original_credits = S[43] -- 44: faxes and disease descriptions (cause/symptoms/cure) -- diseases were already covered above fax = { debug_fax = { -- never seen this, must be a debug option of original TH -- TODO: make this nicer if we ever want to make use of it close_text = S[44][ 1], text1 = S[44][ 3], -- %d text2 = S[44][ 4], -- %d %d text3 = S[44][ 5], -- %d %d %d %d %d text4 = S[44][ 6], -- %d %d %d %d %d text5 = S[44][ 7], -- %d %d %d %d %d text6 = S[44][ 8], text7 = S[44][ 9], -- %d %d %d text8 = S[44][10], -- %d %d %d text9 = S[44][11], -- %d %d %d %d text10 = S[44][12], -- %d %d %d %d text11 = S[44][13], -- %d }, emergency = { choices = { accept = S[44][15], refuse = S[44][16], }, location = S[44][18], num_disease = S[44][19], cure_possible_drug_name_efficiency = S[44][20], cure_possible = S[44][21], cure_not_possible_build_and_employ = S[44][22], cure_not_possible_build = S[44][23], cure_not_possible_employ = S[44][24], cure_not_possible = S[44][25], bonus = S[44][26], locations = { S[44][27], S[44][28], S[44][29], S[44][30], S[44][31], S[44][32], S[44][33], S[44][34], S[44][35], }, }, emergency_result = { close_text = S[44][38], earned_money = S[44][40], saved_people = S[44][41], }, disease_discovered_patient_choice = { choices = { send_home = S[44][43], wait = S[44][44], research = S[44][45], }, need_to_build_and_employ = S[44][47], need_to_build = S[44][48], need_to_employ = S[44][49], can_not_cure = S[44][50], disease_name = S[44][51], what_to_do_question = S[44][52], guessed_percentage_name = S[44][53], }, disease_discovered = { close_text = S[44][55], can_cure = S[44][57], need_to_build_and_employ = S[44][58], need_to_build = S[44][59], need_to_employ = S[44][60], discovered_name = S[44][61], -- After this come cause, symptoms and cure of disease }, epidemic = { choices = { declare = S[44][165], cover_up = S[44][166], }, disease_name = S[44][168], declare_explanation_fine = S[44][169], cover_up_explanation_1 = S[44][170], cover_up_explanation_2 = S[44][171], }, epidemic_result = { close_text = S[44][173], failed = { part_1_name = S[44][175], part_2 = S[44][176], }, succeeded = { part_1_name = S[44][177], part_2 = S[44][178], }, compensation_amount = S[44][179], fine_amount = S[44][180], rep_loss_fine_amount = S[44][181], hospital_evacuated = S[44][182], }, vip_visit_query = { choices = { invite = S[44][184], refuse = S[44][185], }, vip_name = S[44][187], }, vip_visit_result = { close_text = S[44][189], telegram = S[44][191], vip_remarked_name = S[44][192], cash_grant = S[44][193], rep_boost = S[44][194], rep_loss = S[44][195], remarks = { super = { S[44][196], S[44][197], S[44][198], }, good = { S[44][199], S[44][200], S[44][201], }, mediocre = { S[44][202], S[44][203], S[44][204], }, bad = { S[44][205], S[44][206], S[44][207], }, very_bad = { S[44][208], S[44][209], S[44][210], }, }, }, diagnosis_failed = { choices = { send_home = S[44][212], take_chance = S[44][213], wait = S[44][214], }, situation = S[44][216], what_to_do_question = S[44][217], partial_diagnosis_percentage_name = S[44][218], }, } -- 45: strange texts, maybe linked to some cheat codes.. -- Seems we won't need them. staff_descriptions.misc = S[46] staff_descriptions.good = S[47] staff_descriptions.bad = S[48] -- remove last string from each category (".") staff_descriptions.misc[38] = nil staff_descriptions.good[16] = nil staff_descriptions.bad[16] = nil queue_window = { num_in_queue = S[49][1], num_expected = S[49][2], num_entered = S[49][3], max_queue_size = S[49][4], } -- TODO: continue here with section 50 -- ... -- 54: Introduction texts to each level local T = {} local level_index = 0 local text_index = 2 while true do local text = S[54][text_index] if text == "." then level_index = level_index + 1 T["level" .. level_index] = "" elseif text == ".." then break else T["level" .. level_index] = T["level" .. level_index] .. " " .. text end text_index = text_index + 1 end introduction_texts = T -- 55: Award texts inserted in the trophy room section (27) -- 57: Information texts for the different rooms local R = {} -- Note that if an id of a room is changed this will need to be changed too. -- TODO: A better solution maybe? local ids = { "gp", "psych", "ward", "operating_theatre", "pharmacy", "cardiogram", "scanner", "ultrascan", "blood_machine", "x_ray", "inflation", "dna_fixer", "hair_restoration", "slack_tongue", "fracture_clinic", "training", "electrolysis", "jelly_vat", "staff_room", "tv_room", "general_diag", "research", "toilets", "decontamination", "no_room", } local id_index = 0 text_index = 14 while true do local text = S[57][text_index] if text == "." then id_index = id_index + 1 R[ids[id_index]] = {""} elseif text == ".." then break else R[ids[id_index]][#R[ids[id_index]]] = R[ids[id_index]][#R[ids[id_index]]] .. text if R[ids[id_index]][#R[ids[id_index]]]:sub(-1) == "." then R[ids[id_index]][#R[ids[id_index]]] = R[ids[id_index]][#R[ids[id_index]]] .. " " end if text:find("//") then R[ids[id_index]][#R[ids[id_index]] + 1] = "" end end text_index = text_index + 1 end room_descriptions = R -- 59: The dynamic info bar dynamic_info = { patient = { actions = { dying = S[59][ 5], awaiting_decision = S[59][ 6], queueing_for = S[59][ 7], -- %s on_my_way_to = S[59][ 8], -- %s cured = S[59][ 9], fed_up = S[59][10], sent_home = S[59][11], sent_to_other_hospital = S[59][12], no_diagnoses_available = S[59][16], no_treatment_available = S[59][17], waiting_for_diagnosis_rooms = S[59][18], waiting_for_treatment_rooms = S[59][19], prices_too_high = S[59][20], epidemic_sent_home = S[59][25], epidemic_contagious = S[59][26], }, diagnosed = S[59][13], -- %s guessed_diagnosis = S[59][14], -- %s diagnosis_progress = S[59][15], emergency = S[59][23], -- %s (disease name) }, vip = S[59][21], health_inspector = S[59][22], staff = { psychiatrist_abbrev = S[59][27], actions = { waiting_for_patient = S[59][24], wandering = S[59][28], going_to_repair = S[59][35], -- %s (name of machine) }, tiredness = S[59][29], ability = S[59][30], -- unused? }, object = { strength = S[59][31], -- %d (max. uses) times_used = S[59][32], -- %d (times used) queue_size = S[59][33], -- %d (num of patients) queue_expected = S[59][34], -- %d (num of patients) }, } -- 60: The progress report window progress_report = { header = S[60][1], very_unhappy = S[60][2], quite_unhappy = S[60][3], more_drinks_machines = S[60][4], too_hot = S[60][5], too_cold = S[60][6], percentage_pop = S[60][7], win_criteria = S[60][8], } -- 62: Some initial advice from the adviser. These are under the adviser variable above. -- 63: Two strings inserted in trophy_room, used for trophies. -- 64: Tooltip for the winning conditions -- These are inserted in the tooltip section under status. -- ... CorsixTH-0.63/CorsixTH/Lua/languages/polish.lua000066400000000000000000004767031347163623700213750ustar00rootroot00000000000000--[[ Copyright (c) 2013 - translation - BuTcHeR (extragry.pl) The study, diagnosis and surgery on the translation performed by: - Bemberg, the anesthesiologist - translation, corrections, testing (grajpopolsku.pl) - Butcher, as the head - the originator, translation, corrections, fonts, tests (extragry.pl) - Johnny, as a doctor - correction (grajpopolsku.pl) - Machiner, as a GP - translation, corrections (grajpopolsku.pl) - Mziab, as a surgeon - translation, font, corrections, tools and preparing script to CAT software (mziab.grajpopolsku.pl) - Spec0071, as a doctor - correction, tests - Twig, as a consultant - technical issues (grajpopolsku.pl) 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. --]] Font("unicode") Language("Polski", "Polish", "pl", "pol") Inherit("English") Encoding(utf8) font_location_window.caption = "Wybierz czcionkę (%1%)" misc = { hospital_open = "Szpital otwarty", save_success = "Gra zapisana poprawnie", save_failed = "BŁĄD: Gra nie została zapisana", low_res = "Niska Rozdz.", no_heliport = "Albo nadal nie odkryto żadnych chorób, bądź na tej mapie nie ma lądowiska dla helikopterów.", grade_adverb = { extremely = "maksymalnie", mildly = "nieznacznie", moderately = "średnio", }, not_yet_implemented = "(jeszcze nie wdrożono)", send_message = "Wyślij wiadomość do gracza %d", out_of_sync = "Błąd synchronizacji gry", balance = "Poziom Trudności:", load_failed = "Wczytywanie nieudane", mouse = "Mysz", done = "Zrobione", force = "Siła", pause = "Pauza", send_message_all = "Wyślij wiadomość do wszystkich graczy", } handyman_window = { all_parcels = "Wszystkie", parcel = "Parcela", } staff_list = { morale = "MORALE", tiredness = "ZMĘCZENIE", skill = "UMIEJĘTNOŚCI", total_wages = "WYPŁATY", } research = { allocated_amount = "Przeznaczona Suma", funds_allocation = "Przeznaczenie Funduszy", categories = { improvements = "Ulepszenia", drugs = "Badania nad Lekami", diagnosis = "Sprzęt do Diagnozowania", cure = "Sprzęt do Leczenia", specialisation = "Specjalizacje", }, } debug_patient_window = { caption = "Debug Pacjenta", } totd_window = { previous = "Poprzednia Porada", tips = { [1] = "Każdy szpital potrzebuje recepcji oraz Gabinetu Lekarskiego, aby móc normalnie funkcjonować. Później to zależy od rodzaju pacjentów którzy odwiedzają szpital. Budowa apteki to zawsze dobry wybór.", [2] = "Maszyny takie jak Napowietrzacz wymagają konserwacji. Zatrudnienij dozorcę albo dwóch do naprawy twoich urządzeń, w przeciwnym wypadku będziesz ryzykował, że twój personel oraz pacjenci zostaną ranni.", [3] = "Po chwili Twój personel będzie zmęczony. Upewnij się, że wybudujesz pokój socjalny, aby mogli się oni zrelaksować.", [4] = "Umieść odpowiednią ilość kaloryferów aby utrzymać personel oraz pacjentów w cieple, w przeciwnym razie będą oni niezadowoleni. Skorzystaj z mapy miasta aby zlokalizować miejsca w szpitalu, które potrzebują więcej ogrzewania.", [5] = "Poziom umiejśtności lekarzy ma ogromny wpływ na prędkość oraz jakość diagnozowania. Umieść wykwalifikowanego lekarza w Gabinecie Lekarskim a nie będziesz potrzebował wielu dodatkowych gabinetów diagnostycznych.", [6] = "Asystenci oraz doktorzy mogą doskonalić swoje umiejętności ucząc się od konsultanta w sali treningowej. Jeżeli konsultant posiada specjalne kwalifikacje (chirurg, psychiatra, naukowiec), będzie on również przekazywał i tą wiedzę swoim uczniom.", [7] = "Czy próbowałeś wpisać Europejski numer alarmowy (112) na faxie? Upewnij się, że masz włączony dźwięk!", [8] = "Niektóre ustawienia gry, takie jak rozdzielczość oraz język, możesz dostosować w oknie opcji, dostępnym w głównym menu gry.", [9] = "Wybrano język inny niż angielski jednak cały tekst jest wyświetlany po angielsku? Pomóż nam przetłumaczyć brakujące teksty na Twój język ojczysty!", [10] = "Ekipa CorsixTH poszukuje wzmocnień! Czy jesteś zainteresowany kodowaniem, tłumaczeniem lub tworzeniem grafiki dla CorsixTH? Skontaktuj się z nami na naszym forum, liście email lub kanale IRC (corsix-th na freenode).", [11] = "Jeśli znajdziesz jakiś błąd, zgłoś go w naszym systemie: th-issues.corsix.org", [12] = "Na każdym poziomie należy spełnić pewne wymagania, zanim będzie można przejść do kolejnego. Sprawdź, w oknie statusu, aby zobaczyć postęp w realizacji celów poziou.", [13] = "Jeśli chcesz edytować lub usunąć istniejące pomieszczenia, można to zrobić za pomocą przycisku edycji pomieszczenia znajdującego się w pasku narzędzi na dole.", [14] = "W tłumie oczekujących pacjentów, można szybko dowiedzieć się, którzy z nich czekają do danego gabinetu. Wystarczy najechać kursorem myszy na pacjenta.", [15] = "Kliknij na drzwi gabinetu, aby zobaczyć oczekującą do niego kolejkę. Można dokonać tam również przydatnych zmian, takich jak na przykład zmiana kolejności w kolejce lub wysyłanie pacjenta do innego gabinetu.", [16] = "Niezadowolony personel będzie często prosił o podwyżki. Upewnij się, że Twój personel pracuje w komfortowych warunkach aby tego uniknąć.", [17] = "Pacjenci będą spragnieni podczas czekania w szpitalu, tym bardziej jeśli podkręcisz ogrzewanie! Umiejscowienie Automatów do napoi w strategicznych miejscach przyniesie dodatkowy dochód.", [18] = "Jeżeli już spotkał się z daną chorobą, w każdym momencie możesz przerwać diagnozowanie pacjenta i odgadnąć jak go wyleczyć. Pamiętaj jednak, że może to zwiększyć ryzyko błędnej kuracji, co może prowadzić do śmierci pacjenta.", [19] = "Nagłe wypadki mogą być dobrym źródłem dodatkowych pieniędzy, pod warunkiem, że posiadasz niezbędne gabinety do wyleczenia pacjentów w wyznaczonym czasie.", }, next = "Następna Porada", } queue_window = { num_in_queue = "Długość Kolejki", num_entered = "Odwiedzono", max_queue_size = "Maks. Roz.", num_expected = "Spodziewani", } staff_class = { doctor = "Lekarz", handyman = "Dozorca", receptionist = "Recepcjonistka", nurse = "Pielęgniarka", surgeon = "Chirurg", } tooltip = { hire_staff_window = { prev_person = "Zobacz poprzednią osobę", cancel = "Anuluj", psychiatrist = "Psychiatra", salary = "Pensja", next_person = "Zobacz następną osobę", nurses = "Zobacz dostępne Pielęgniarki", surgeon = "Chirurg", handymen = "Zobacz dostępnych Dozorców", doctors = "Zobacz dostępnych Lekarzy", doctor_seniority = "Rangi Lekarzy (Asystent, Doktor, Konsultant)", hire = "Zatrudnij", researcher = "Naukowiec", qualifications = "Dodatkowe specjalizacje Lekarzy", receptionists = "Zobacz dostępne Recepcjonistki", staff_ability = "Umiejętności personelu", }, handyman_window = { parcel_select = "Miejsce, w którym dozorca przyjmuje zadania, kliknij aby zmienić ustawienia.", close = "Anuluj żądanie", ability = "Umiejętności", face = "Twarz Dozorcy", prio_machines = "Zwiększ priorytet naprawy urządzeń", prio_litter = "Zwiększ priorytet sprzątania", happiness = "Zadowolenie", prio_plants = "Zwiększ priorytet podlewania roślin", name = "Imię Dozorcy", tiredness = "Zmęczenie", center_view = "Zbliżenie na Dozorcę", salary = "Pensja", sack = "Zwolnij", pick_up = "Podnieś", }, staff_list = { ability_2 = "Poziom Umiejętności Pracowników", next_person = "Zobacz następną osobę", detail = "Troska o Detale", happiness = "Zadowolenie pracowników", researcher_train = "%d%% szkolony na Naukowca", handymen = "Zobacz listę Dozorców zatrudnionych w tym szpitalu", tiredness = "Zmęczenie pracowników", researcher = "Wykwalifikowany Naukowiec", happiness_2 = "Morale Pracowników", pay_rise = "Podnieś pensję tej osoby o 10%", bonus = "Daj tej osobie 10% premii", prev_person = "Zobacz poprzednią osobę", nurses = "Zobacz listę Pielęgniarek zatrudnionych w tym szpitalu", psychiatrist = "Wykwalifikowany Psychiatra", salary = "Indywidualne pensje pracowników", ability = "Umiejętności pracowników", close = "Wyjdź i wróć do gry", sack = "Zwolnij tę osobę", surgeon = "Wykwalifikowany Chirurg", tiredness_2 = "Zmęczenie Pracowników", doctors = "Zobacz listę Lekarzy zatrudnionych w tym szpitalu", doctor_seniority = "Ranga Lekarza", view_staff = "Zobacz osobę w pracy", surgeon_train = "%d%% szkolony na Chirurga", skills = "Dodatkowe specjalizacje", receptionists = "Zobacz listę Recepcjonistek zatrudnionych w tym szpitalu", psychiatrist_train = "%d%% szkolony na Psychiatrę", }, research = { cure_inc = "Zwiększ procenty", close = "Zamknij ekran Badań", specialisation_dec = "Zmniejsz procenty", diagnosis_dec = "Zmniejsz procenty", allocated_amount = "Ilość przeznaczonego budżetu", improvements_inc = "Zwiększ procenty", drugs_dec = "Zmniejsz procenty", drugs_inc = "Zwiększ procenty", cure_dec = "Zmniejsz procenty", specialisation_inc = "Zwiększ procenty", improvements_dec = "Zmniejsz procenty", diagnosis_inc = "Zwiększ procenty", }, machine_window = { repair = "Wyślij Dozorcę do naprawy urządzenia", name = "Nazwa", close = "Anuluj żądanie", times_used = "Liczba użyć", status = "Stan urządzenia", replace = "Wymień urządzenie", }, place_objects_window = { confirm = "Potwierdź", cancel = "Anuluj", pick_up = "Podnieś obiekt", buy_sell = "Kup/sprzedaj obiekty", }, totd_window = { previous = "Pokaż poprzednią poradę", next = "Pokaż następną poradę", }, status = { percentage_cured = "Musisz wyleczyć przynajmniej %d%% pacjentów odwiedzających twój szpital. Do tej pory wyleczyłeś %d%%", thirst = "Ogólny poziom pragnienia ludzi w twoim szpitalu", close = "Zamknij okno Statystyk", population_chart = "Diagram pokazuje jaki odsetek ludności odwiedza każdy szpital", win_progress_own = "Pokaż postęp twojego szpitala ku wygranej", reputation = "Poziom reputacji musi wynosić co najmniej %d. Obecnie jest to %d", population = "Musisz ściągnąć do swego szpitala %d%% ogólnej populacji", warmth = "Ogólny poziom ciepła w twoim szpitalu", percentage_killed = "W tej misji umrzeć może nie więcej niż %d%% pacjentów szpitala. Do tej pory umarło %d%%", balance = "Stan twojego konta musi wynosić co najmniej %d. Obecnie jest to %d", value = "Twój szpital musi być wart przynajmniej %d PLN. Obecna jego wartość to %d PLN", win_progress_other = "Pokaż postęp %s ku wygranej", num_cured = "W tej misji musisz wyleczyć %d ludzi. Do tej pory wyleczyłeś %d", happiness = "Ogólne zadowolenie ludzi w twoim szpitalu", }, queue_window = { end_of_queue = "Przeciągnij pacjenta na tę ikonę, aby przesunąć go na tył kolejki", num_entered = "Liczba pacjentów odwiedzających do tej pory", close = "Zamknij to okno", num_in_queue = "Liczba pacjentów w kolejce", num_expected = "Liczba pacjentów oczekiwanych wkrótce ", front_of_queue = "Przeciągnij pacjenta na tę ikonę, aby przesunąć go na przód kolejki", dec_queue_size = "Zmniejsz maksymalny rozmiar kolejki", max_queue_size = "Maksymalny rozmiar kolejki", inc_queue_size = "Zwiększ maksymalny rozmiar kolejki", patient = "Przeciągnij pacjenta, aby przesunąć go w kolejce. Prawy-klik na pacjencie, aby wysłać go do domu lub do szpitala konkurencji", patient_dropdown = { send_home = "Wypisz pacjenta ze szpitala", hospital_2 = "Wyślij pacjenta do innego szpitala", reception = "Wyślij pacjenta do Recepcji", hospital_1 = "Wyślij pacjenta do innego szpitala", hospital_3 = "Wyślij pacjenta do innego szpitala", }, }, jukebox = { rewind = "Poprzedni utwór", loop = "Odtwarzanie zapętlone", stop = "Stop", close = "Zamknij szafę grającą", current_title = "Szafa grająca", play = "Odtwarzaj", fast_forward = "Następny utwór", }, graphs = { deaths = "Przełącz zgony", close = "Zamknij Wykresy", scale = "Skala wykresu", money_out = "Przełącz wydatki", visitors = "Przełącz odwiedzających", wages = "Przełącz wypłaty", balance = "Przełącz stan konta", money_in = "Przełącz dochody", cures = "Przełącz wyleczonych", reputation = "Przełącz reputację", }, toolbar = { reputation = "Twoja reputacja", casebook = "Teczka z lekami", edit = "Edytuj pomieszczenia/przedmioty", staff_list = "Przegląd personelu", policy = "Strategia szpitala", date = "Data", charts = "Wykresy", objects = "Wyposaż korytarz", balance = "Twój stan konta", research = "Badania", hire = "Zatrudnij personel", status = "Pozycja", town_map = "Mapa miasta", rooms = "Zbuduj pomieszczenie", bank_button = "Lewe Kliknięcie - Menadżer Banku, Prawe Kliknięcie - Raport Bankowy", }, message = { button = "Kliknij lewym przyciskiem myszy aby otworzyć wiadomość", button_dismiss = "Lewy przycisk myszy otwiera wiadomość, prawy ją usuwa", }, pay_rise_window = { accept = "Spełnij żądania płacowe", decline = "Nie dawaj podwyżki, tylko zwolnij", }, town_map = { close = "Wyjdź z mapy miasta", plants = "Przełącz rośliny", fire_extinguishers = "Przełącz gaśnice", people = "Przełącz ludzi", balance = "Bilans", heat_dec = "Zmniejsz ogrzewanie", heating_bill = "Rachunek za ogrzewanie", radiators = "Przełącz kaloryfery", objects = "Przełącz obiekty", heat_level = "Poziom ciepła", heat_inc = "Zwiększ ogrzewanie", }, custom_game_window = { start_game_with_name = "Wczytaj poziom %s", free_build = "Zaznacz, jeżeli chcesz grać bez limitów finansowych oraz ustalonych warunków przegranej lub zwycięstwa", }, cheats_window = { close = "Zamknij okno oszustw", cheats = { end_month = "Przeskakuje na koniec miesiąca.", create_patient = "Tworzy pacjenta na skraju mapy.", money = "Dodaje 10.000 do swojego konta.", emergency = "Tworzy nagły wypadek.", win_level = "Wygrywa obecny poziom.", vip = "Tworzy VIP'a.", lose_level = "Przegrywa obecny poziom.", earthquake = "Tworzy trzęsienie ziemi.", all_research = "Dokańcza wszystkie badania.", end_year = "Przeskakuje na koniec roku.", }, }, casebook = { sent_home = "Liczba pacjentów odesłanych do domu", cure_requirement = { hire_staff_old = "Musisz zatrudnić %s, aby leczyć to schorzenie", possible = "Możesz leczyć to schorzenie", not_possible = "Nie możesz jeszcze leczyć tego schorzenia", ward_hire_nurse = "Potrzebujesz Pielęgniarki do pracy na Oddziale, aby leczyć to schorzenie", hire_surgeon = "Musisz zatrudnić drugiego Chirurga, aby przeprowadzać operacje", hire_staff = "Musisz zatrudnić personel aby poradzić sobie z tym schorzeniem", research_machine = "Musisz wynaleźć urządzenie do tej kuracji", build_room = "Musisz zbudować gabinet, aby leczyć to schorzenie", build_ward = "Musisz zbudować Oddział, aby prowadzić kuracje", hire_surgeons = "Musisz zatrudnić dwóch Chirurgów, aby przeprowadzać operacje", }, increase = "Zwiększ kwotę", up = "Przewiń w górę", reputation = "Reputacja Leczenia lub Diagnozowania", research = "Kliknij tutaj, aby użyć specjalnego budżetu badawczego na tę kurację", close = "Zamknij Teczkę", earned_money = "Całkowity zarobek", cure_type = { psychiatrist = "Psychiatra zajmuje się tą kuracją", drug_percentage = "Ta kuracja używa leku, który jest efektywny w %d%%", drug = "Ta kuracja wymaga leków", machine = "Ta kuracja wymaga urządzenia", unknown = "Nadal nie wiesz jak leczyć to schorzenie", surgery = "To schorzenie wymaga operacji", }, decrease = "Zmniejsz kwotę", deaths = "Liczba zgonów", cured = "Liczba wyleczonych osób", down = "Przewiń w dół", treatment_charge = "Koszt", }, policy = { diag_termination = "Diagnozowanie pacjenta będzie kontynuowane, dopóki Lekarz nie będzie pewny jak ustawiony jest wskaźnik ZATRZYMAJ PROCEDURĘ, lub dopóki wszystkie urządzenia diagnostyczne nie zostaną sprawdzone", close = "Zamknij okno Strategii Szpitala", staff_leave = "Kliknij tutaj, aby wysłać wolnych pracowników do pomocy swoim kolegom", diag_procedure = "Jeżeli diagnoza Lekarza jest mniej pewna niż ustalony wskaźnik WYPISZ DO DOMU, pacjent będzie odesłany do domu. Jeżeli diagnoza jest lepsza niż wskaźnik POSTAW DIAGNOZĘ, pacjent zostanie wysłany na odpowiednie leczenie", staff_rest = "Jak bardzo personel musi być zmęczony, zanim pójdzie odpocząć", staff_stay = "Kliknij tutaj, aby pracownicy pozostali w gabinetach, które im przydzieliłeś", }, bank_manager = { graph = "Wykres spodziewanych wpłat od %s", close = "Zamknij okno banku", hospital_value = "Wartość szpitala", graph_return = "Wróć do poprzedniego widoku", current_loan = "Zaciągnięte pożyczki", borrow_5000 = "Pożycz 5000 PLN z banku", balance = "Stan konta", interest_payment = "Miesięczne odsetki", inflation_rate = "Roczna stawka inflacji", interest_rate = "Roczna stawka odsetek", repay_5000 = "Spłać 5000 PLN bankowi", show_graph = "Pokaż wykres spodziewanych wpłat od %s", insurance_owed = "Ilość pieniędzy, które jest winien %s", }, main_menu = { exit = "Nie, nie, proszę nie odchodź!", custom_campaign = "Rozegraj kampanię stworzoną przez społeczność", custom_level = "Zbuduj swój szpital na dodatkowych poziomach", network = "Rozpocznij grę sieciową", quit = "Wyjdź", continue = "Kontynuuj poprzednią grę", options = "Zmień różne ustawienia gry", load_menu = { load_slot = "WCZYTAJ GRĘ", empty_slot = "PUSTY", }, new_game = "Zacznij grę od samego początku‏", load_game = "Wczytaj zapisaną grę", map_edit = "Stwórz własną mapę", }, patient_window = { graph = "Kliknij, aby przełączyć się pomiędzy wykresem zdrowia osób a ich historią leczenia", casebook = "Pokaż detale choroby", close = "Anuluj żądanie", queue = "Zobacz detale kolejki", happiness = "Zadowolenie", warmth = "Temperatura", center_view = "Zbliżenie na osobę", thirst = "Pragnienie", send_home = "Wypisz osobę ze szpitala", abort_diagnosis = "Wyślij osobę na leczenie bez skończenia diagnozowania choroby", }, menu_list_window = { save_date = "Kliknij tutaj aby sortować listę według ostatniej daty modyfikacji", name = "Kliknij tutaj aby sortować listę według nazwy", back = "Wróć", }, watch = { emergency = "Nagły wypadek: czas pozostały na wyleczenie wszystkich pacjentów z wypadku.", hospital_opening = "Czas budowy: to czas pozostały do oficjalnego otwarcia szpitala. Kliknij na przycisk, aby natychmiast otworzyć szpital.", epidemic = "Epidemia: czas pozostały na opanowanie epidemii. Gdy czas upłynie lub zarażony pacjent opuści szpital, odwiedzi cię Inspektor Zdrowia. Przycisk włącza/wyłącza tryb szczepienia. Kliknij na pacjenta, aby zaszczepiła go Pielęgniarka.", }, new_game_window = { player_name = "Wprowadź nazwę jaka będzie używana podczas gry", difficulty = "Wybierz poziom trudności na jakim chcesz rozpocząć grę", easy = "Jeżeli jesteś początkującym graczem, jest to dla ciebie odpowiedni poziom", medium = "Jest to średni poziom trudności, zalecany dla większości graczy", hard = "Jeżeli chcesz mieć więcej wyzwań a tego typu gry to twój chleb powszedni wybierz tą opcję", tutorial = "Jeżeli potrzebujesz pomocy przy rozpoczęciu gry zaznacz to pole.", start = "Rozpocznij grę z wybranymi ustawieniami", cancel = "Och, tak naprawdę nie chcę rozpoczynać nowej gry!", }, save_game_window = { new_save_game = "Wprowadź nazwę dla zapisanej gry", save_game = "Nadpisz zapisaną grę %s", }, calls_dispatcher = { assigned = "To pole jest zaznaczone, jeśli ktoś jest przypisany do wybranego zadania.", task = "Lista zadań - kliknij na zadanie, aby otworzyć okno poleceń dla personelu i przejść do wybranej lokacji zadania.", close = "Zamknij okno dyspozycji.", }, research_policy = { research_progress = "Postęp w kierunku nowego odkrycia w tej dziedzinie: %1%/%2%", no_research = "W tym momencie nie są prowadzone żadne badania w tej dziedzinie", }, information = { close = "Zamknij okno informacji", }, lua_console = { textbox = "Tutaj wprowadź kod Lua aby go uruchomić", execute_code = "Uruchom kod który wprowadziłeś", close = "Zamknij konsolę", }, staff_window = { doctor_seniority = "Ranga - Asystent, Doktor lub Konsultant", psychiatrist = "Psychiatra", close = "Anuluj żądanie", ability = "Poziom umiejętności", pick_up = "Podnieś", sack = "Zwolnij", surgeon = "Chirurg", happiness = "Poziom zadowolenia", salary = "Miesięczna pensja", name = "Imię i nazwisko pracownika", tiredness = "Poziom zmęczenia", center_view = "Lewe kliknięcie przybliża pracownika, prawe kliknięcie przełącza między pracownikami", skills = "Specjalizacje", researcher = "Naukowiec", face = "Twarz tej osoby - kliknij aby otworzyć ekran zarządzania", }, rooms = { ultrascan = "Lekarz używa Ultraskanera do diagnozowania pacjentów", research_room = "Lekarze ze specjalizacją Naukowca mogą wynajdować nowe leki i urządzenia w Dziale Badawczym", fracture_clinic = "Pielęgniarka korzysta z Gabinetu Ortopedycznego do składania Zgruchotanych Kości", gps_office = "Pacjenci otrzymują wstępną konsultację w Gabinecie Lekarskim", inflation = "Lekarz używa Napowietrzacza do leczenia pacjentów z Głowowzdęciem", staffroom = "Lekarze i Pielęgniarki odpoczywają i regenerują siły w pokoju dla personelu", jelly_vat = "Lekarz używa Galaretownicę do leczenia Galaretowatości", scanner = "Lekarz używa Skanera do diagnozowania pacjentów", decontamination = "Lekarz używa Prysznica Odkażającego, aby wyleczyć Radioaktywność", pharmacy = "Pielęgniarka wydaje pacjentom leki w Aptece", cardiogram = "Lekarz używa Kardiografu do diagnozowania pacjentów", ward = "Oddział jest przydatny zarówno do diagnozowania jak i leczenia. Pacjenci są tu przysyłani na obserwację oraz rekonwalescencję pooperacyjną", training_room = "Sala Szkoleniowa z Konsultantem może być używana do szkolenia innych Lekarzy", operating_theatre = "Sala Operacyjna potrzebuje dwóch Lekarzy ze specjalizacją chirurga", psychiatry = "Gabinet Psychiatryczny leczy szalonych pacjentów i diagnozuje różne choroby, potrzebuje jednak lekarza ze specjalizacją Psychiatry", hair_restoration = "Lekarz używa Przeszczepiacza Włosów do leczenia łysych pacjentów", tongue_clinic = "Lekarz używa Krajalnicy do leczenia Obwisłego Języka", dna_fixer = "Lekarz używa Re-GEN-eratora do leczenia pacjentów z DNA Obcych", general_diag = "Lekarz używa gabinetu do przeprowadzenia Podstawowych Badań. Tanie a zarazem bardzo efektywne", toilets = "Zbuduj Toalety, aby pacjenci nie zapaskudzili szpitala!", electrolysis = "Lekarz używa Elektrolizera do leczenia Włochacizny", x_ray = "Lekarz używa Rentgena do diagnozowania pacjentów", blood_machine = "Lekarz używa Analizatora Krwi do diagnozowania pacjentów", }, statement = { close = "Zamknij ekran Raportu", }, buy_objects_window = { confirm = "Kup przedmiot(y)", cancel = "Anuluj", increase = "Kup o jeden przedmiot więcej", total_value = "Wartość zamówionych przedmiotów", price = "Cena przedmiotu", decrease = "Kup o jeden przedmiot mniej", }, load_game_window = { load_game = "Wczytaj grę %s", load_autosave = "Wczytaj autozapis", load_game_number = "Wczytaj grę %d", }, window_general = { confirm = "Potwierdź", cancel = "Anuluj", }, fax = { close = "Zamknij okno bez usuwania wiadomości", }, objects = { chair = "Krzesło: tutaj siedzą pacjenci i mówią o swoich dolegliwościach.", litter = "Odpadek: Rzucony przez pacjenta na podłogę, gdyż nie znalazł on śmietnika, do którego mógł go wyrzucić.", sofa = "Sofa: pracownicy będą grzecznie na niej siedzieli, dopóki nie znajdą sobie lepszej formy relaksu.", operating_table = "30 OB_OP_TABLE", bed2 = "nieużywane", bench = "Ławka: zapewnia siedzenie dla jednego pacjenta, dzięki czemu oczekiwanie jest komfortowe.", scanner = "14 OB_SCANNER", couch = "18 OB_COUCH", blood_machine = "42 OB_BLOOD_MC", table1 = "Stół (REMOVED): na nim leżą czasopisma, aby pacjenci się nie nudzili.", video_game = "Gra video: personel relaksuje się grając w Hi-Octane.", lamp = "Lampa: świeci i zapewnia widoczność personelowi.", op_sink2 = "34 OB_OP_SINK_2", door = "Drzwi: ludzie je często otwierają i zamykają.", auto_autopsy = "Autopsja: znacznie pomaga w odkrywaniu nowych leków", reception_desk = "Biurko Recepcji: wymaga Recepcjonistki, która pokieruje pacjentów do Lekarzy.", hair_restorer = "25 OB_HAIR_RESTORER", projector = "37 OB_PROJECTOR", crash_trolley = "20 OB_CRASH", tv = "TV: dzięki niemu pracownicy nie przegapią ulubionych programów.", ultrascanner = "22 OB_ULTRASCAN", surgeon_screen = "35 OB_SURGEON_SCREEN", litter_bomb = "Bomba Śmieciowa: sabotuje konkurencyjne szpitale", inflator = "Napowietrzacz: leczy ludzi z Głowowzdęciem.", table2 = "12 OB_BTABLE", desk = "Biurko: Wymagane do postawienia na nim komputera.", pool_table = "Bilard: pomaga personelowi się zrelaksować.", x_ray_viewer = "29 OB_XRAY_VIEWER", radiation_shield = "28 OB_RAD_SHIELD", bed = "Łóżko: leżą tutaj ciężko chorzy ludzie.", swing_door2 = "53 OB_DOUBLE_DOOR2", console = "15 OB_SCANNER_CONSOLE", op_sink1 = "33 OB_OP_SINK_1", bookcase = "Biblioteczka: źródło informacji dla Lekarzy.", drinks_machine = "Automat do napoi: zapobiega pragnieniu oraz przynosi dochody.", comfortable_chair = "61 OB_COMFY_CHAIR", skeleton = "Szkielet: używany w celach szkoleniowych oraz na Halloween.", computer = "Komputer: klucz do prowadzenia badań", bin = "Śmietnik: pacjenci wrzucają tu odpadki.", pharmacy_cabinet = "Apteka: tutaj trzymane są leki", radiator = "Kaloryfer: zapewnia ciepło w całym szpitalu.", cast_remover = "24 OB_CAST_REMOVE", atom_analyser = "Analizator Atomów: umieszczony w Dziale Badawczym, przyspiesza cały proces badawczy.", plant = "Roślina: zwiększa zadowolenie pacjentów i oczyszcza powietrze.", jelly_moulder = "47 OB_JELLY_VAT", cardio = "13 OB_CARDIO", toilet = "Klozet: pacjenci, noo... używają go.", electrolyser = "46 OB_ELECTRO", fire_extinguisher = "Gaśnica: minimalizuje zagrożenie ze strony uszkodzonych urządzeń.", bed3 = "nieużywane", swing_door1 = "52 OB_DOUBLE_DOOR1", lecture_chair = "Krzesło ucznia: twoi uczący się lekarze siedzą tutaj i robią notatki, nudzą się i bezmyślnie bazgrolą. Im więcej krzeseł, tym większa może być klasa.", screen = "16 OB_SCREEN", toilet_sink = "Zlew: twoi bardziej świadomi higieny pacjenci mogą umyć tu brudne ręce. Jeśli zabraknie zlewów, pacjenci robią się niezadowoleni.", shower = "54 OB_DECON_SHOWER", gates_of_hell = "48 OB_HELL", entrance_right = "59 OB_ENT_RDOOR", entrance_left = "58 OB_ENT_LDOOR", slicer = "26 OB_SLICER", dna_fixer = "23 OB_DNA_FIXER", x_ray = "27 OB_XRAY", cabinet = "Szafka: zawiera akta pacjentów, notatki oraz dokumenty naukowe.", }, build_room_window = { cost = "Koszt wybranego pomieszczenia", room_classes = { treatment = "Wybierz gabinety Podstawowego Leczenia", diagnosis = "Wybierz gabinety Diagnostyczne", facilities = "Wybierz gabinety Udogodnień", clinic = "Wybierz gabinety Specjalistyczne", }, close = "Przerwij i wróć do gry", }, options_window = { fullscreen = "Wybór pomiędzy trybem pełnoekranowym lub grą w oknie", fullscreen_button = "Kliknij aby włączyć tryb pełnoekranowy", resolution = "Rozdzielczość w jakiej powinna działać gra", select_resolution = "Wybierz nową rozdzielczość", audio_toggle = "Włącz/wyłącz", folder_button = "Opcje folderów", customise_button = "Dodatkowe ustawienia modifikujące twoją rozgrywkę", width = "Wpisz żądaną szerokość ekranu", height = "Wpisz żądaną wysokość ekranu", apply = "Zatwierdź wybraną rozdzielczość", cancel = "Powrót bez zmiany rozdzielczośći", data_location = "Katalog z zainstalowaną oryginalną grą Theme Hospital, która wymagana jest do uruchomienia CorsixTH", font_location = "Lokalizacja pliku z czcionką, która jest w stanie wyświetlić znaki wymagane przez twój język. Jeżeli nie będzie ona wybrana, wybór języka obsługującego inne znaki niż oryginalna gra nie będzie możliwy. Przykłady: Rosyjski i Chiński", language = "Język, w którym wyświetlone zostaną teksty gry", select_language = "Wybierz język gry", language_dropdown_item = "Wybierz %s jako język gry", original_path = "Aktualnie wybrany katalog z zainstalowaną grą Theme Hospital", browse = "Zmień ścieżkę zainstalowanej gry Theme Hospital (obecna lokalizacja: %1%)", browse_font = "Zmień ścieżkę dla innego pliku z czcionką (obecna lokalizacja: %1%)", no_font_specified = "Lokalizacja czcionki nie została jeszcze wybrana!", back = "Zamknij okno opcji", }, } menu_charts = { bank_manager = " (%1%) MENADŻER BANKU ", statement = " (%1%) RAPORT ", staff_listing = " (%1%) LISTA PERSONELU ", town_map = " (%1%) MAPA MIASTA ", casebook = " (%1%) TECZKA ", research = " (%1%) BADANIA ", status = " (%1%) POZYCJA ", graphs = " (%1%) WYKRESY ", policy = " (%1%) STRATEGIA SZPITALA ", briefing = " ODPRAWA ", } town_map = { number = "Numer Gruntu", not_for_sale = "Nie na Sprzedaż", chat = "Inf. o Mieście", price = "Cena Gruntu", for_sale = "Na Sprzedaż", owner = "Właściciel", area = "Rozmiar", } vip_names = { [1] = "Burmistrz Trumpton", [2] = "Lawrence Nightingale", [3] = "Bernard, król Niderlandów", [4] = "Aung Sang Su Kyi, lider birmańskiej opozycji demokratycznej", [5] = "Sir Reginald Crumbly", [6] = "Billy Savile, Oficer Orderu", [7] = "Radny Crawford Purves", [8] = "Rakieta Ronnie Jepson", [9] = "Piłkarz ligi Premiership", [10] = "L. F. Probst III", health_minister = "Minister Zdrowia", } custom_game_window = { caption = "Gra niestandardowa", free_build = "Wolna budowa", } cheats_window = { cheats = { end_month = "Koniec miesiąca", create_patient = "Stwórz pacjenta", money = "Pieniądze", emergency = "Nagły wypadek", win_level = "Wygraj poziom", vip = "Stwórz VIP", lose_level = "Przegraj poziom", earthquake = "Stwórz trzęsienie ziemi", all_research = "Dokończ badania", end_year = "Koniec roku", }, close = "Zamknij", caption = "Oszustwa", cheated = { no = "Używano oszustw: Nie", yes = "Używano oszustw: Tak", }, warning = "Uwaga: Jeżeli będziesz oszukiwć nie dostaniesz dodatkowych punktów na koniec poziomu!", } room_descriptions = { ultrascan = { [1] = "Ultraskaner//", [2] = "Udoskonalony przyrząd diagnozujący. Jest wart swej wysokiej ceny, o ile chcesz zapewnić pacjentom najlepsze warunki diagnozowania.//", [3] = "Ultraskaner wymaga Lekarza. Musi być także konserwowany. ", }, gp = { [1] = "Gabinet Lekarski//", [2] = "To najważniejszy gabinet w Twoim szpitalu. Nowi pacjenci są tu wysyłani, aby dowiedzieć się co im dolega. Następnie odsyłani są do dalszej diagnozy lub do gabinetów, w których mogą zostać wyleczeni. Możesz zbudować kolejny Gabinet Lekarski, jeżeli w tym będzie zbyt tłoczno. Rozmiar gabinetu i liczba urządzeń są wyznacznikiem autorytetu jakim cieszy się pracujący w nim Lekarz. To dotyczy również innych pomieszczeń.//", [3] = "Do funkcjonowania Gabinetu Lekarskiego niezbędny jest Lekarz. ", }, fracture_clinic = { [1] = "Gabinet Ortopedyczny//", [2] = "Usuwacz Gipsu używa potężnego przemysłowego lasera do przecięcia stwardniałego gipsu, wywołując przy tym nieznaczny ból u pacjenta.//", [3] = "Gabinet Ortopedyczny potrzebuje Pielęgniarki. Wymaga również częstej konserwacji. ", }, tv_room = { [1] = "SALA TV NIE UŻYWANA", }, inflation = { [1] = "Napowietrzalnia//", [2] = "Pacjenci z bolesnym, acz zabawnym Głowowzdęciem muszą odwiedzić Napowietrzalnię, gdzie przerośnięta głowa zostaje przebita, a następnie napompowana do odpowiednich rozmiarów.//", [3] = "Napowietrzalnia musi mieć Lekarza do obsługi. Musi być także pod stałym nadzorem Dozorcy. ", }, jelly_vat = { [1] = "Przychodnia Galaretowatości//", [2] = "Pacjenci dotknięci przezabawnym choróbskiem Galaretowatość, muszą dokiwać się do Przychodni Galaretowatości, gdzie umieszcza się ich w Galaretownicy. Właśnie w ten, nie do końca jasny dla medycyny sposób, zostają wyleczeni.//", [3] = "Przychodnia Galaretowatości potrzebuje Lekarza. Jak również nadzoru Dozorcy. ", }, scanner = { [1] = "Skaner//", [2] = "Pacjenci są diagnozowani przy użyciu wymyślnego Skanera, po czym wracają do Gabinetu Lekarskiego w celu dalszego leczenia.//", [3] = "Skaner wymaga Lekarza. Musi być także konserwowany. ", }, blood_machine = { [1] = "Analizator Krwi//", [2] = "Analizator Krwi jest częścią wyposażenia diagnozującego, które sprawdza komórki krwi pacjenta i określa ich stan.//", [3] = "Analizator Krwi wymaga Lekarza. Musi być także konserwowany. ", }, pharmacy = { [1] = "Apteka//", [2] = "Pacjenci, którzy zostali zdiagnozowani i mogą być wyleczeni dzięki lekom, muszą zgłosić się po nie do Apteki. W miarę jak będą wymyślane nowe leki, ten gabinet stanie się naprawdę oblegany. Prawdopodobnie będziesz musiał wtedy zbudować drugą Aptekę.//", [3] = "Do pracy w Aptece potrzebna jest Pielęgniarka. ", }, cardiogram = { [1] = "Kardiograf//", [2] = "Diagnozuje się tutaj pacjentów zanim wrócą do Gabinetu Lekarskiego i zostaną wysłani na leczenie.//", [3] = "Kardiograf wymaga Lekarza. Musi być także konserwowany. ", }, ward = { [1] = "Oddział//", [2] = "Pacjenci przebywają tu na obserwacji podczas diagnozy. Poza tym kierowani są tu przed zabiegiem chirurgicznym.//", [3] = "Oddział potrzebuje Pielęgniarki. ", }, psych = { [1] = "Psychiatra//", [2] = "Pacjenci ze zdiagnozowaną chorobą psychiczną muszą odwiedzić Gabinet Psychiatryczny, aby otrzymać poradę. Psychiatra diagnozuje pacjenta pod kątem dolegliwości i jeśli mają one podłoże psychiczne, leczy go z wykorzystaniem swej niezawodnej kozetki.//", [3] = "W Gabinecie Psychiatrycznym wymagany jest Lekarz ze specjalizacją Psychiatry. ", }, staff_room = { [1] = "Pokój Socjalny//", [2] = "Twój personel podczas pracy męczy się. W tym pokoju pracownicy mogą się odprężyć i zrelaksować. Gdy są zmęczeni, pracują wolniej, domagają się większych podwyżek i popełniają więcej błędów. Budowa Pokoju Socjalnego z bogatym wyposażeniem jest bardzo opłacalna. Upewnij się, że znajdzie się tam miejsce dla kilku osób jednocześnie. ", }, operating_theatre = { [1] = "Sala Operacyjna//", [2] = "Ważne pomieszczenie, w którym leczy się różnorodne schorzenia. Sala musi mieć sporą powierzchnię oraz powinna zawierać odpowiednie wyposażenie. Jest to nieodzowna część twojego szpitala.//", [3] = "Sala operacyjna wymaga dwóch Lekarzy ze specjalizacją Chirurga. ", }, training = { [1] = "Sala Szkoleniowa//", [2] = "Twoi Asystenci oraz Doktorzy mogą tutaj zdobywać dodatkowe specjalizacje. Konsultant ze specjalizacją Chirurga, Psychiatry lub Naukowca przekazuje swoją wiedzę każdemu szkolonemu Lekarzowi. Lekarze, którzy posiadają już te specjalizacje, będą mogli je tutaj rozwijać.//", [3] = "Sala Szkoleniowa potrzebuje Konsultanta. ", }, dna_fixer = { [1] = "Przychodnia DNA//", [2] = "DNA pacjentów, którzy zostali porwani przez obcych, musi zostać wymienione w tym gabinecie. Re-GEN-erator to bardzo skomplikowane urządzenie, dlatego wskazane jest mieć w pogotowiu gaśnicę, tak na wszelki wypadek.//", [3] = "Re-GEN-erator wymaga okresowego przeglądu przez Dozorcę. Potrzebny jest także Lekarz ze specjalizacją Naukowca. ", }, research = { [1] = "Dział Badawczy//", [2] = "Tutaj wymyśla się lub ulepsza leki oraz sposoby leczenia. To bardzo ważna część szpitala, dzięki której liczba wyleczonych poszybuje w górę.//", [3] = "W Dziale Badawczym musi pracować Lekarz ze specjalizacją Naukowca. ", }, hair_restoration = { [1] = "Gabinet Przeszczepu Włosów//", [2] = "Pacjenci cierpiący na ekstremalne Łysienie są kierowani do tego gabinetu w celu przeszczepienia włosów. Lekarz obsługuje maszynę, która szybko obsiewa łysą głowę pacjenta nowymi cebulkami.//", [3] = "W gabinecie Przeszczepu Włosów potrzebny jest Lekarz. Wymaga on także okresowej konserwacji. ", }, general_diag = { [1] = "Badania Podstawowe//", [2] = "Pacjenci wymagający dalszej diagnozy są wysyłani tutaj. Jeżeli w Gabinecie Lekarskim nie wykryta zostanie przypadłość pacjenta, zazwyczaj zostanie to dokonane w gabinecie Badań Podstawowych. Stąd pacjenci zostają odesłani do Gabinetu Lekarskiego w celu analizy wyników przeprowadzonych tu badań.//", [3] = "Do pracy w gabinecie Badań Podstawowych wymagany jest Lekarz. ", }, electrolysis = { [1] = "Gabinet Elektrolizy//", [2] = "Pacjenci cierpiący na Włochaciznę są kierowani do tego gabinetu, gdzie specjalna maszyna zwana Elektrolizerem wyszarpuje włosy i zalepia elektrycznie pory specjalną mieszaniną podobną do tynku.//", [3] = "Gabinet Elektrolizy potrzebuje Lekarza. Musi być także doglądany przez Dozorcę. ", }, slack_tongue = { [1] = "Przychodnia Obrzynania//", [2] = "Pacjenci zdiagnozowani w Gabinecie Lekarskim z chorobą Obwisłego Języka są kierowani do tego gabinetu. Przy pomocy nowoczesnej aparatury Lekarz wyciąga i obcina język, przywracając pacjenta do zdrowia.//", [3] = "Przychodnia Obrzynania potrzebuje Lekarza. Wymaga również częstej konserwacji. ", }, toilets = { [1] = "Toalety//", [2] = "Pacjenci, którzy poczują zew matki natury, będą musieli skorzystać z twoich komfortowych toalet. Jeżeli spodziewasz się dużo gości, możesz zbudować dodatkowe latryny i umywalki. Być może trzeba będzie rozważyć budowę kolejnych toalet w innych częściach szpitala. ", }, no_room = { [1] = "", }, x_ray = { [1] = "Rentgen//", [2] = "Rentgen używa specjalnych promieni, aby zrobić zdjęcie wnętrza pacjenta. Dzięki temu lekarz wie, co dzieje się wewnątrz chorego.//", [3] = "Rentgen wymaga Lekarza. Musi być także konserwowany. ", }, decontamination = { [1] = "Gabinet Odkażania//", [2] = "Pacjenci, którzy zostali narażeni na Napromieniowanie są natychmiast kierowani do Gabinetu Odkażania. Pomieszczenie to posiada prysznic, który oczyszcza ich ze strasznego napromieniowania i brudu.//", [3] = "Do obsługi Prysznica wymagany jest Lekarz. Musi być także nadzorowany przez Dozorcę. ", }, } errors = { unavailable_screen_size = "Rozmiar ekranu, który podałeś, nie jest obsługiwany w trybie pełnoekranowym.", dialog_missing_graphics = "Niestety, demo nie zawiera tego dialogu.", maximum_screen_size = "Proszę wpisać rozmiar ekranu, maksimum 3000x2000.", load_prefix = "Błąd podczas ładowania gry: ", no_games_to_contine = "Nie ma zapisanych gier.", save_prefix = "Błąd podczas zapisywania gry: ", map_file_missing = "Nie można znaleźć pliku z mapą %s dla tego poziomu!", minimum_screen_size = "Proszę wpisać rozmiar ekranu, minimum 640x480.", } bank_manager = { current_loan = "Pożyczka", balance = "Bilans", interest_payment = "Odsetki", hospital_value = "Wartość Szpitala", interest_rate = "Poziom Odsetek", insurance_owed = "Ubezpieczalnie", statistics_page = { balance = "Bilans", details = "Szczegóły", date = "Data", current_balance = "Obecny Stan Konta", money_in = "Dochody", money_out = "Wydatki", }, inflation_rate = "Poziom Inflacji", } main_menu = { exit = "Wyjście", custom_level = "Gra niestandardowa", version = "Wersja: ", new_game = "Nowa gra", custom_campaign = "Własna kampania", continue = "Powrót do gry", load_game = "Wczytaj grę", options = "Ustawienia", savegame_version = "Wersja zapisu: ", map_edit = "Edytor map" } date_format = { daymonth = "%1% %2:months%", } menu_display = { mcga_lo_res = " NISKA ROZDZIELCZOŚĆ", shadows = " CIENIE ", high_res = " WYSOKA ROZDZIELCZOŚĆ", } original_credits = { [1] = " ", [2] = " ", [3] = " ", [4] = " ", [5] = " ", [6] = " ", [7] = " ", [8] = " ", [9] = " ", [10] = " ", [11] = " ", [12] = ":Zaprojektowane i stworzone przez", [13] = ":Bullfrog Productions", [14] = " ", [15] = ":ekipa Pluto Development ", [16] = ",", [17] = "Mark Webley", [18] = "Gary Carr", [19] = "Matt Chilton", [20] = "Matt Sullivan", [21] = "Jo Rider", [22] = "Rajan Tande", [23] = "Wayne Imlach", [24] = "Andy Bass", [25] = "Jon Rennie", [26] = "Adam Coglan", [27] = "Natalie White", [28] = " ", [29] = " ", [30] = " ", [31] = ":Programowanie", [32] = ",", [33] = "Mark Webley", [34] = "Matt Chilton", [35] = "Matt Sullivan", [36] = "Rajan Tande", [37] = " ", [38] = " ", [39] = " ", [40] = ":Oprawa graficzna", [41] = ",", [42] = "Gary Carr", [43] = "Jo Rider", [44] = "Andy Bass", [45] = "Adam Coglan", [46] = " ", [47] = " ", [48] = " ", [49] = ":Dodatkowe programowanie", [50] = ",", [51] = "Ben Deane", [52] = "Gary Morgan", [53] = "Jonty Barnes", [54] = " ", [55] = " ", [56] = " ", [57] = ":Dodatkowa grafika", [58] = ",", [59] = "Eoin Rogan", [60] = "George Svarovsky", [61] = "Saurev Sarkar", [62] = "Jason Brown", [63] = "John Kershaw", [64] = "Dee Lee", [65] = " ", [66] = " ", [67] = " ", [68] = ":Intro", [69] = ",", [70] = "Stuart Black", [71] = " ", [72] = " ", [73] = " ", [74] = ":Muzyka i efekty dźwiękowe", [75] = ",", [76] = "Russell Shaw", [77] = "Adrian Moore", [78] = " ", [79] = " ", [80] = " ", [81] = ":Dodatkowa muzyka", [82] = ",", [83] = "Jeremy Longley", [84] = "Andy Wood", [85] = " ", [86] = " ", [87] = " ", [88] = ":Lektor", [89] = ",", [90] = "Rebecca Green", [91] = " ", [92] = " ", [93] = " ", [94] = ":Projekty poziomów", [95] = ",", [96] = "Wayne Imlach", [97] = "Natalie White", [98] = "Steven Jarrett", [99] = "Shin Kanaoya", [100] = " ", [101] = " ", [102] = " ", [103] = ":Skrypty", [104] = ",", [105] = "James Leach", [106] = "Sean Masterson", [107] = "Neil Cook", [108] = " ", [109] = " ", [110] = " ", [111] = ":R&D", [112] = " ", [113] = ":Silnik graficzny", [114] = ",", [115] = "Andy Cakebread", [116] = "Richard Reed", [117] = " ", [118] = " ", [119] = " ", [120] = ":Wsparcie R&D", [121] = ",", [122] = "Glenn Corpes", [123] = "Martin Bell", [124] = "Ian Shaw", [125] = "Jan Svarovsky", [126] = " ", [127] = " ", [128] = " ", [129] = ":Biblioteki i narzędzia", [130] = " ", [131] = "Biblioteki Dos i Win 95", [132] = ",", [133] = "Mark Huntley", [134] = "Alex Peters", [135] = "Rik Heywood", [136] = " ", [137] = " ", [138] = " ", [139] = ":Biblioteki sieciowe", [140] = ",", [141] = "Ian Shippen", [142] = "Mark Lamport", [143] = " ", [144] = " ", [145] = " ", [146] = ":Biblioteki dźwięku", [147] = ",", [148] = "Russell Shaw", [149] = "Tony Cox", [150] = " ", [151] = " ", [152] = " ", [153] = ":Instalator", [154] = ",", [155] = "Andy Nuttall", [156] = "Tony Cox", [157] = "Andy Cakebread", [158] = " ", [159] = " ", [160] = " ", [161] = ":Wsparcie duchowe", [162] = ",", [163] = "Peter Molyneux", [164] = " ", [165] = " ", [166] = " ", [167] = ":Menadżer testowania", [168] = ",", [169] = "Andy Robson", [170] = " ", [171] = " ", [172] = " ", [173] = ":Główni testerzy", [174] = ",", [175] = "Wayne Imlach", [176] = "Jon Rennie", [177] = " ", [178] = " ", [179] = " ", [180] = ":Testerzy", [181] = ",", [182] = "Jeff Brutus", [183] = "Wayne Frost", [184] = "Steven Lawrie", [185] = "Tristan Paramor", [186] = "Nathan Smethurst", [187] = " ", [188] = "Ryan Corkery", [189] = "Simon Doherty", [190] = "James Dormer", [191] = "Martin Gregory", [192] = "Ben Lawley", [193] = "Joel Lewis", [194] = "David Lowe", [195] = "Robert Monczak", [196] = "Dominic Mortoza", [197] = "Karl O'Keeffe", [198] = "Michael Singletary", [199] = "Andrew Skipper", [200] = "Stuart Stephen", [201] = "David Wallington", [202] = " ", [203] = "oraz pozostali testerzy", [204] = " ", [205] = " ", [206] = " ", [207] = ":Wsparcie techniczne", [208] = ",", [209] = "Kevin Donkin", [210] = "Mike Burnham", [211] = "Simon Handby", [212] = " ", [213] = " ", [214] = " ", [215] = ":Marketing", [216] = ",", [217] = "Pete Murphy", [218] = "Sean Ratcliffe", [219] = " ", [220] = " ", [221] = " ", [222] = ":Z podziękowaniami dla:", [223] = ",", [224] = "Tamara Burke", [225] = "Annabel Roose", [226] = "Chris Morgan", [227] = "Pete Larsen", [228] = " ", [229] = " ", [230] = " ", [231] = ":PR", [232] = ",", [233] = "Cathy Campos", [234] = " ", [235] = " ", [236] = " ", [237] = ":Dokumentacja", [238] = ",", [239] = "Mark Casey", [240] = "Richard Johnston", [241] = "James Lenoel", [242] = "Jon Rennie", [243] = " ", [244] = " ", [245] = " ", [246] = ":Dokumentacja i projekt pudełka", [247] = ",", [248] = "Caroline Arthur", [249] = "James Nolan", [250] = " ", [251] = " ", [252] = " ", [253] = ":Menadżer lokalizacji", [254] = ",", [255] = "Carol Aggett", [256] = " ", [257] = " ", [258] = " ", [259] = ":Lokalizacja", [260] = ",", [261] = "Sandra Picaper", [262] = "Sonia 'Sam' Yazmadjian", [263] = " ", [264] = "Bettina Klos", [265] = "Alexa Kortsch", [266] = "Bianca Normann", [267] = " ", [268] = "C.T.O. S.p.A. Zola Predosa (BO)", [269] = "Gian Maria Battistini", [270] = "Maria Ziino", [271] = "Gabriele Vegetti", [272] = " ", [273] = "Elena Ruiz de Velasco", [274] = "Julio Valladares", [275] = "Ricardo Martínez", [276] = " ", [277] = "Kia Collin", [278] = "CBG Consult", [279] = "Ulf Thor", [280] = " ", [281] = " ", [282] = " ", [283] = ":Realizacja", [284] = ",", [285] = "Rachel Holman", [286] = " ", [287] = " ", [288] = " ", [289] = ":Producent", [290] = ",", [291] = "Mark Webley", [292] = " ", [293] = " ", [294] = " ", [295] = ":Współproducent", [296] = ",", [297] = "Andy Nuttall", [298] = " ", [299] = " ", [300] = " ", [301] = ":Wdrożenie", [302] = ",", [303] = "Steve Fitton", [304] = " ", [305] = " ", [306] = " ", [307] = ":Administracja firmy", [308] = ",", [309] = "Audrey Adams", [310] = "Annette Dabb", [311] = "Emma Gibbs", [312] = "Lucia Gobbo", [313] = "Jo Goodwin", [314] = "Sian Jones", [315] = "Kathy McEntee", [316] = "Louise Ratcliffe", [317] = " ", [318] = " ", [319] = " ", [320] = ":Zarząd spółki", [321] = ",", [322] = "Les Edgar", [323] = "Peter Molyneux", [324] = "David Byrne", [325] = " ", [326] = " ", [327] = ":Zespół Bullfrog Productions", [328] = " ", [329] = " ", [330] = " ", [331] = ":Specjalne podziękowania dla", [332] = ",", [333] = "Pracowników szpitala Frimley Park", [334] = " ", [335] = ":a zwłaszcza dla", [336] = ",", [337] = "Beverley Cannell", [338] = "Doug Carlisle", [339] = " ", [340] = " ", [341] = " ", [342] = ":Do spolszczenia szpitalnych perypetii przyczynili się", [343] = "bemberg, jako anestezjolog - tłumaczenie, korekta, testy", [344] = "Butcher, jako ordynator - pomysłodawca, tłumaczenie, korekta, czcionka, testy", [345] = "Johnny, jako pielęgniarz - korekta", [346] = "Machiner, jako lekarz pierwszego kontaktu - tłumaczenie, korekta", [347] = "mziab, jako chirurg - tłumaczenie, czcionka, korekta,", [348] = "narzędzia i przygotowanie skryptu do oprogramowania CAT", [349] = "spec0071, jako pielęgniarz - korekta, testy", [350] = "twig, jako konsultant - sprawy techniczne", [351] = " ", [352] = ":Miej głowę na karku", [353] = " ", [354] = " ", [355] = " ", [356] = " ", [357] = " ", [358] = " ", [359] = " ", [360] = " ", [361] = ".", } pay_rise = { definite_quit = "Cokolwiek zrobisz, nic mnie tu już nie zatrzyma. Mam dość tego miejsca.", regular = { [1] = "Jestem wykończony. Jeżeli nie chcesz, bym rzucił tę zakichaną robotę, pozwól mi odpocząć oraz daj podwyżkę o %d.", [2] = "Jestem bardzo zmęczony. Żądam odpoczynku i podwyżki o %d, z pensją %d. No dalej, tyranie!", [3] = "Daj spokój. Haruję tu jak pies. Daj mi premię %d, to zostanę w twoim szpitalu.", [4] = "Jestem bardzo niezadowolony. Żądam podwyżki o %d, dającej mi pensję %d, inaczej spadam stąd.", [5] = "Rodzice mówili mi, że w medycynie można sporo zarobić. Albo więc dasz mi podwyżkę o %d, albo zostanę producentem gier.", [6] = "Mam dosyć. Daj mi przyzwoitą pensję. Podwyżka o %d powinna wystarczyć.", }, poached = "%s zaproponowali mi %d. Jeśli nie zapłacisz mi tyle samo, odchodzę.", } menu_debug = { lua_console = " (%1%) KONSOLA LUA ", porter_pagers = " PORTER PAGERS ", object_cells = " OBJECT CELLS ", display_pager = " DISPLAY PAGER ", disable_salary_raise = " DISABLE SALARY RAISE ", make_debug_fax = " MAKE DEBUG FAX ", display_big_cells = " DISPLAY BIG CELLS ", make_debug_patient = " MAKE DEBUG PATIENT ", mapwho_checking = " MAPWHO CHECKING ", sprite_viewer = " SPRITE VIEWER ", keep_clear_cells = " KEEP CLEAR CELLS ", dump_strings = " (%1%) DUMP STRINGS ", machine_pagers = " MACHINE PAGERS ", remove_walls = " USUŃ ŚCIANY ", enter_nav_debug = " ENTER NAV DEBUG ", lose_game_anim = { [1] = " LOSE GAME 1 ANIM ", [2] = " LOSE GAME 2 ANIM ", [3] = " LOSE GAME 3 ANIM ", [4] = " LOSE GAME 4 ANIM ", [5] = " LOSE GAME 5 ANIM ", [6] = " LOSE GAME 6 ANIM ", [7] = " LOSE GAME 7 ANIM ", }, map_overlay = " MAP OVERLAY ", calls_dispatcher = " CALLS DISPATCHER ", show_nav_cells = " SHOW NAV CELLS ", win_game_anim = " WIN GAME ANIM ", display_room_status = " DISPLAY ROOM STATUS ", cheats = " (%1%) CHEATS ", remove_objects = " USUŃ OBIEKTY ", nav_bits = " NAV BITS ", win_level_anim = " WIN LEVEL ANIM ", dump_gamelog = " (%1%) DUMP GAME LOG ", limit_camera = " LIMIT CAMERA ", pixbuf_cells = " PIXBUF CELLS ", transparent_walls = " (%1%) TRANSPARENT WALLS ", show_help_hotspot = " SHOW HELP HOTSPOTS ", jump_to_level = " JUMP TO LEVEL ", entry_cells = " ENTRY CELLS ", plant_pagers = " PLANT PAGERS ", } progress_report = { free_build = "WOLNA BUDOWA", too_hot = "Zrób coś z centralnym ogrzewaniem. Jest za gorąco. ", percentage_pop = "% populacji", win_criteria = "KRYTERIA ZWYCIĘSTWA", very_unhappy = "Twoi ludzie są bardzo niezadowoleni. ", quite_unhappy = "Twoi ludzie są niezadowoleni. ", header = "Informacje o postępie", too_cold = "Jest zdecydowanie za zimno. Dokup kaloryfery. ", more_drinks_machines = "Kup więcej Automatów do napoi. ", } menu_options = { game_speed = " SZYBKOŚĆ GRY ", music_vol = " GŁOŚNOŚĆ MUZYKI ", sound_vol = " GŁOŚNOŚĆ DŹWIĘKU ", adviser_disabled = " (%1%) DORADCA ", warmth_colors = " CIEPŁOŚĆ BARW ", wage_increase = " ŻĄDANIA PODWYŻKI", twentyfour_hour_clock = " ZEGAR 24 GODZINNY ", edge_scrolling = " PRZEWIJANIE PRZY KRAWĘDZIACH ", announcements = " (%1%) POWIADOMIENIA ", lock_windows = " ZABLOKUJ OKNA ", settings = " USTAWIENIA ", sound = " (%1%) DŹWIĘK ", announcements_vol = " GŁOŚNOŚĆ POWIADOMIEŃ ", music = " (%1%) MUZYKA ", autosave = " AUTOZAPIS ", jukebox = " (%1%) SZAFA GRAJĄCA ", } menu_options_wage_increase = { grant = " PRZYZNAWAJ ", deny = " ODMAWIAJ ", } menu_options_warmth_colors = { choice_1 = " CZERWONY ", choice_2 = " NIEBIESKI ZIELONY CZERWONY ", choice_3 = " ŻÓŁTY POMARAŃCZOWY CZERWONY ", } menu_options_game_speed = { pause = " (%1%) PAUZA ", slowest = " (%1%) NAJWOLNIEJ ", slower = " (%1%) WOLNO ", normal = " (%1%) NORMALNIE ", max_speed = " (%1%) NAJSZYBCIEJ ", and_then_some_more = " (%1%) I JESZCZE TROCHĘ ", } rooms_short = { ultrascan = "Ultraskaner", research_room = "Dział Badawczy", fracture_clinic = "Gab. Ortopedyczny", gps_office = "Gabinet Lekarski", destroyed = "Zniszczone", staffroom = "Pokój Socjalny", jelly_vat = "Galaretownica", scanner = "Skaner", decontamination = "Gabinet Odkażania", pharmacy = "Apteka", cardiogram = "Kardiograf", reception = "Recepcja", training_room = "Sala Szkoleniowa", corridor_objects = "Obiekty Korytarza", operating_theatre = "Sala Operacyjna", dna_fixer = "Re-GEN-erator", ward = "Oddział", psychiatric = "Psychiatra", hair_restoration = "Przeszczep Włosów", general_diag = "Podst. Badania", inflation = "Napowietrzalnia", tongue_clinic = "Przych. Obrzynania", toilets = "Toalety", electrolysis = "Gabinet Elektrolizy", x_ray = "Rentgen", blood_machine = "Analizator Krwi", } level_names = { [1] = "BIAŁOBYL", [2] = "ŚPIOCHY DUŻE", [3] = "ŚWIĄDEK ZDRÓJ", [4] = "ZASTRZYKI GÓRNE", [5] = "PROSTACZKOWO", [6] = "ROPIEŃ DOLNY", [7] = "ZIELONA GULA", [8] = "ZAKICHANE", [9] = "SZARYSTOK", [10] = "JAJECZNICA MAŁA", [11] = "ŻABOBRZEGI", [12] = "CHORUŃ", [13] = "MIŁOGRÓD", [14] = "WYCISK MAŁY", [15] = "ZIELSKO-BIAŁA", } insurance_companies = { [1] = "Łabądek Ltd.", [2] = "Cebula z Norfolk ", [3] = "Lodołamacz S.A.", [4] = "Potężny Żołądź Ltd.", [5] = "Pęcherz Walenia", [6] = "Poczciwy Józef S.A.", [7] = "Holding Pulchnego", [8] = "Leon Katz Corp.", [9] = "Buch i Faja S.A.", [10] = "Fikuśne Westalki", [11] = "Ubezp. Syndykatowe", out_of_business = "ZAKOŃCZYŁ DZIAŁALNOŚĆ", } lua_console = { execute_code = "Start", close = "Zamknij", } staff_descriptions = { good = { [1] = "Bardzo szybki i pilny pracownik. ", [2] = "Bardzo sumienny pracownik. Przykłada się. ", [3] = "Ma szeroką skalę umiejętności. ", [4] = "Bardzo przyjazny i lubiący śmiech pracownik. ", [5] = "Super wytrzymały pracownik. Ciągle brnie naprzód. ", [6] = "Nadzwyczaj uprzejmy i miły pracownik. ", [7] = "Niewiarygodnie utalentowany pracownik. ", [8] = "Zawsze dba o to, co robi. ", [9] = "Perfekcjonista, który się nie poddaje. ", [10] = "Pomaga ludziom z uśmiechem na ustach. ", [11] = "Czarujący, miły i pomocny pracownik. ", [12] = "Generalnie dobrze zmotywowany i oddany pracownik. ", [13] = "Przyjacielski i bardzo wydajny pracownik. ", [14] = "Lojalny i przyjazny pracownik. ", [15] = "Pracownik staranny i niezawodny w nagłych wypadkach. ", }, misc = { [1] = "Gra w golfa. ", [2] = "Nurkuje. ", [3] = "Rzeźbi w lodzie. ", [4] = "Pija wino. ", [5] = "Jeździ wyścigówkami. ", [6] = "Skacze na bungie. ", [7] = "Kolekcjonuje pokale. ", [8] = "Lubi skoki ze sceny. ", [9] = "Lubi surfing. ", [10] = "Poszerza rzeki. ", [11] = "Destyluje bimber. ", [12] = "Złota rączka. ", [13] = "Lubi francuskie kino. ", [14] = "Często gra w Theme Park. ", [15] = "Jeździ TIRem. ", [16] = "Ściga się na motorach. ", [17] = "Gra na skrzypcach i wiolonczeli. ", [18] = "Wysadza pociągi. ", [19] = "Uwielbia psy. ", [20] = "Słucha radia. ", [21] = "Bierze częste kąpiele. ", [22] = "Plecie kosze z wikliny. ", [23] = "Przerabia warzywa na mydelniczki. ", [24] = "Pracuje w policji na pół etatu. ", [25] = "Była hostessa w TV. ", [26] = "Kolekcjonuje szrapnele. ", [27] = "Przestawia meble. ", [28] = "Słucha muzyki rave i trip-hopu. ", [29] = "Rozwściecza insekty dezodorantami. ", [30] = "Przeszkadza satyrykom w występach. ", [31] = "Węszy w urzędach. ", [32] = "Skryty ogrodnik. ", [33] = "Przemyca trefne zegarki. ", [34] = "Śpiewa w zespole rockowym. ", [35] = "Uwielbia telewizję śniadaniową. ", [36] = "Łaskocze pstrągi. ", [37] = "Drażni turystów w muzeach. ", }, bad = { [1] = "Powolny i kapryśny pracownik. ", [2] = "Leniwy i słabo zmotywowany pracownik. ", [3] = "Niekompetentny i nieudolny pracownik. ", [4] = "Niegrzeczny i zgryźliwy pracownik. Czepia się ludzi. ", [5] = "Ma straszliwą wytrzymałość - i złe nastawienie. ", [6] = "Głuchy jak pień pracownik. Trochę cuchnie kapustą. ", [7] = "W pracy do niczego. Jest jak kula u nogi. ", [8] = "Lekkomyślny i roztargniony pracownik. ", [9] = "Zestresowany pracownik, popełnia błędy. ", [10] = "Pracownik zgorzkniały i obrażony - płonący z nienawiści. ", [11] = "Flejtuch powodujący wypadki. ", [12] = "Nie dba o pracę. W sumie nie dba o nic. ", [13] = "Bezmyślny ryzykant, któremu wszystko zwisa. ", [14] = "Szczwany, przebiegły wywrotowiec. ", [15] = "Arogancki i próżny pracownik. ", }, } room_classes = { diagnosis = "Diagnozy", clinics = "Przychodnie", facilities = "Udogodnienia", treatment = "Leczenie", } install = { exit = "Wyjście", th_directory = "CorsixTH potrzebuje plików z originalnej gry Theme Hospital (lub dema), do poprawnego działania. Proszę użyć poniższego pola, w celu zlokalizowania zainstalowanej gry Theme Hospital.", title = "--------------------------------- Ustawienia CorsixTH ---------------------------------", } place_objects_window = { pick_up_object = "Kliknij na obiekt, aby go podnieść lub wybierz inną opcję", place_objects_in_corridor = "Rozmieść obiekty na korytarzu", place_windows = "Jeżeli chcesz, wstaw okna i kliknij zatwierdź", confirm_or_buy_objects = "Możesz zatwierdzić pokój lub dokupić nowe przedmioty", drag_blueprint = "Rozciągnij niebieskie pole do odpowiedniego rozmiaru", place_door = "Wstaw drzwi", place_objects = "Rozmieść i poprzesuwaj wszystkie obiekty, następnie zatwierdź", } newspaper = { [1] = { [1] = "ORTOPEDA WILKOŁAKIEM!", [2] = "INTERNISTA UDAJE BOGA!", [3] = "SZOK FRANKENSTEINA", [4] = "CO KRYŁA MASKA CHIRURGA?", [5] = "RYZYKOWNE BADANIA ZATRZYMANE ", }, [2] = { [1] = "ULULANY KONOWAŁ", [2] = "CHIRURG PŁUCZE NERKI", [3] = "KONSULTANT NA GAZIE", [4] = "BEŁT NA ZNIECZULENIE", [5] = "ON ZA KITEL NIE WYLEWA", [6] = "ORDYNATORYJNY DENATURAT", }, [3] = { [1] = "CHCIWY CHIRURG", [2] = "LEKARZ Z RĘKĄ W BASENIE", [3] = "ZEJŚCIE DOKTORA", [4] = "NIENASYCONY CHIRURG", }, [4] = { [1] = "NIEULECZALNY PRZEKRĘT", [2] = "WRZÓD PRZESTĘPCZY", [3] = "OPERACJA PRZESZCZEPU PIENIĘDZY", [4] = "ZATOR FINANSOWY", }, [5] = { [1] = "ZDROWOTNE ŁUPIENIE GROBÓW", [2] = "LEKARZ HIENĄ CMENTARNĄ", [3] = "PO JEGO TRUPIE", [4] = "DZIEŃ ROZRACHUNKU DOKTORA ŚMIERCI", [5] = "ŚMIERTELNA NIEDBAŁOŚĆ", [6] = "CMENTARNE WYKOPKI", }, [6] = { [1] = "DOKTOR ZASZYTY!", [2] = "NIEUWAŻNY ZNACHOR", [3] = "PONURA DIAGNOZA", [4] = "NIESPECJALNY SPECJALISTA", }, [7] = { [1] = "DOKTOROWI POSYPAŁY SIĘ KULKI", [2] = "CHIRURG SAM SIĘ ZOPEROWAŁ", [3] = "ROBÓTKI RĘCZNE W LATRYNIE", [4] = "DOKTOR GWIAZDĄ SKANDALU", [5] = "LEKARZ ZDROWO NAMIESZAŁ", }, } load_game_window = { caption = "Wczytaj Grę (%1%)", } staff_title = { junior = "Asystent", psychiatrist = "Psychiatra", consultant = "Konsultant", surgeon = "Chirurg", doctor = "Lekarz", researcher = "Naukowiec", nurse = "Pielęgniarka", receptionist = "Recepcjonistka", general = "Ogólne", } graphs = { deaths = "Zgony", money_in = "Dochody", money_out = "Wydatki", visitors = "Pacjenci", wages = "Wypłaty", balance = "Bilans", time_spans = { [1] = "1 Rok", [2] = "12 Lat", [3] = "48 Lat", }, cures = "Wyleczeni", reputation = "Reputacja", } adviser = { tutorial = { hire_receptionist = "Będzie ci także potrzebna Recepcjonistka do rejestrowania pacjentów.", build_pharmacy = "Gratulacje! Teraz zbuduj Aptekę i zatrudnij w niej Pielęgniarkę, aby szpital wreszcie mógł zacząć pracę.", hire_doctor = "Potrzebujesz Lekarza do diagnozowania i leczenia chorych.", place_receptionist = "Umieść Recepcjonistkę w którymkolwiek miejscu szpitala. Jest ona na tyle sprytna, że sama znajdzie drogę do biurka.", place_windows = "Umieść okna w ten sam sposób co drzwi. Okna nie są wymagane, jednak twój personel będzie szczęśliwszy, gdy wyjrzy sobie na zewnątrz.", confirm_room = "Kliknij na migającą ikonę, aby otworzyć gabinet lub kliknij X, aby anulować.", rotate_and_place_reception = "Kliknij prawym przyciskiem myszy, aby obrócić Biurko, a lewym, aby umieścić je w wybranym miejscu.", build_reception = "Witaj. Na początku twój szpital potrzebuje Biurko Recepcji. Wybierz je z menu Wyposażenie Korytarza.", doctor_in_invalid_position = "Hej! Nie możesz tutaj umieścić Lekarza.", start_tutorial = "Przeczytaj Zadania Misji, a następnie kliknij, aby rozpocząć szkolenie.", receptionist_invalid_position = "Nie możesz tutaj umieścić Recepcjonistki.", room_too_small_and_invalid = "Pomieszczenie jest za małe i stoi w niewłaściwym miejscu. Bez żartów.", window_in_invalid_position = "To okno jest w niewłaściwym miejscu. Byłoby miło, gdybyś wstawił je gdzie indziej.", choose_doctor = "Sprawdź dokładnie kwalifikacje każdego Lekarza, zanim któregoś wybierzesz.", information_window = "Okno pomocy powie ci wszystko na temat tego pięknego Gabinetu Lekarskiego, który właśnie zbudowałeś.", build_gps_office = "Aby rozpocząć diagnozowanie chorych, musisz wybudować Gabinet Lekarski.", select_doctors = "Kliknij lewym przyciskiem myszy na migającej ikonie, aby zobaczyć dostępnych Lekarzy.", select_diagnosis_rooms = "Kliknij w migającą ikonę, aby wyświetlić listę gabinetów diagnostycznych.", select_receptionists = "Kliknij na migającej ikonie, aby wyświetlić dostępne Recepcjonistki. Numer na ikonie informuje, ile jest chętnych do pracy.", order_one_reception = "Kliknij lewym przyciskiem myszy w migającą linię, aby zamówić jedno Biurko Recepcyjne.", choose_receptionist = "Wybierz Recepcjonistkę, która ma dobre kwalifikacje oraz jest niedroga, a następnie kliknij na migającej ikonie, aby ją zatrudnić.", prev_receptionist = "Kliknij w migającą ikonę, aby zobaczyć poprzednią Recepcjonistkę.", accept_purchase = "Kliknij w migającą ikonę, aby je zakupić.", place_door = "Przesuń kursor po niebieskiej linii, aby umieścić drzwi w wybranym miejscu.", click_and_drag_to_build = "Zanim zbudujesz Gabinet Lekarski, musisz zdecydować o jego rozmiarach. Przytrzymaj lewy przycisk myszy i rozciągnij gabinet do odpowiedniej wielkości.", room_in_invalid_position = "Ojej! Rozmiar pomieszczenia jest niewłaściwy - czerwona strefa pokazuje miejsce, gdzie nachodzi on na inne pomieszczenia lub na ściany szpitala.", place_objects = "Prawy przycisk myszy obraca przedmioty, lewy ustawia je w danym miejscu.", room_too_small = "Kolor czerwony oznacza, że pokój jest za mały. Rozciągnij go trochę, aby go powiększyć.", click_gps_office = "Kliknij w migającą linię, aby wybrać Gabinet Lekarski.", reception_invalid_position = "Biurko Recepcji jest szare, gdyż znajduje się w niewłaściwym miejscu. Spróbuj je przesunąć lub obrócić.", next_receptionist = "To pierwsza Recepcjonistka na liście. Kliknij w migającą ikonę, aby zobaczyć następną Recepcjonistkę.", room_big_enough = "Rozmiar gabinetu jest teraz odpowiedni. Kiedy puścisz przycisk, gabinet zostanie zbudowany. Pamiętaj, że zawsze możesz go przesunąć lub zmienić jego rozmiary.", object_in_invalid_position = "Ten przedmiot jest w niewłaściwym miejscu. Obróć go lub umieść gdzie indziej.", door_in_invalid_position = "Ech! Próbujesz umieścić drzwi w niewłaściwym miejscu. Spróbuj wstawić je gdzie indziej.", place_doctor = "Umieść doktora w którymkolwiek miejscu szpitala. Samodzielnie uda się do Gabinetu Lekarskiego i rozpocznie pracę.", }, epidemic = { hurry_up = "Jeżeli natychmiast nie zaradzisz tej epidemii, znajdziesz się w niezłych tarapatach. Rusz się!", serious_warning = "Ta Zaraźliwa Choroba zaczyna być poważna. Musisz szybko coś zrobić!", multiple_epidemies = "Wygląda na to, że w szpitalu szaleje więcej niż jedna epidemia. To może skończyć się kolosalna katastrofą, więc lepiej zacznij działać.", }, staff_advice = { need_handyman_machines = "Jeśli chcesz zachować przyrządy szpitalne w dobrym stanie, musisz zatrudnić Dozorcę.", need_doctors = "Potrzebujesz więcej Lekarzy. Umieść najlepszych Lekarzy w gabinetach z najdłuższą kolejką.", need_handyman_plants = "Musisz zatrudnić Dozorcę, aby podlewał rośliny.", need_handyman_litter = "Ludzie zaczęli zaśmiecać twój szpital. Zatrudnij Dozorcę, aby po nich sprzątał.", need_nurses = "Musisz zatrudnić więcej Pielęgniarek. Oddział oraz Apteka potrzebują Pielęgniarki.", too_many_doctors = "Masz za dużo Lekarzy. Niektórzy z nich nie mają w tej chwili co robić.", too_many_nurses = "Myślę, że obecnie zatrudniasz zbyt wiele Pielęgniarek.", }, earthquake = { damage = "W wyniku trzęsienia ziemi %d urządzeń zostało uszkodzonych i %d ludzi rannych.", alert = "Zbliża się trzęsienie ziemi, podczas którego przyrządy szpitalne ulegną uszkodzeniu. Mogą też zostać zniszczone, jeśli są w kiepskim stanie.", ended = "Uff... A już myślałem, że to Gruba Berta - %d w skali Richtera.", }, multiplayer = { objective_completed = "Poradziłeś sobie z ostatnim zadaniem. Gratulacje!", everyone_failed = "Nikt nie poradził sobie z ostatnim zadaniem. W związku z tym wszyscy pozostają w grze!", players_failed = "Następujący gracz(e) nie wykonali ostatniego zadania: ", poaching = { in_progress = "Dam ci znać, czy ta osoba chce pracować dla ciebie.", not_interested = "Ha! Nie mają ochoty pracować dla ciebie - dobrze im tam, gdzie teraz są.", already_poached_by_someone = "Niemożliwe! Ktoś próbuje podkupić tę osobę.", }, objective_failed = "Nie poradziłeś sobie z ostatnim zadaniem.", }, surgery_requirements = { need_surgeons_ward_op = "Musisz zatrudnić dwóch Chirurgów oraz zbudować Oddział i Salę Operacyjną, aby rozpocząć przeprowadzanie operacji.", need_surgeon_ward = "Musisz zatrudnić jeszcze jednego Chirurga i wybudować Oddział, aby rozpocząć prowadzenie Operacji.", }, vomit_wave = { started = "Wygląda na to, że w twoim szpitalu zalągł się wirus wymiocin. Gdybyś bardziej dbał o czystość, ta sytuacja nie miałaby miejsca. Może powinieneś zatrudnić więcej Dozorców?", ended = "Uff! Zdaje się, że wirus, który wywołał tę falę wymiotów prawie całkiem zginął. Od tej chwili staraj się utrzymywać szpital w czystości.", }, cheats = { th_cheat = "Gratulacje, odblokowałeś oszustwa!", hairyitis_cheat = "Oszustwo Włochacizna aktywowane!", roujin_on_cheat = "Wyzwanie Roujinowa aktywowane! Powodzenia...", crazy_on_cheat = "O nie! Wszyscy lekarze oszaleli!", bloaty_off_cheat = "Oszustwo Głowowzdęcie deaktywowane.", bloaty_cheat = "Oszustwo Głowowzdęcie aktywowane!", crazy_off_cheat = "Uff... lekarze wrócili do zdrowych zmysłów.", roujin_off_cheat = "Wyzwanie Roujinowa deaktywowane.", hairyitis_off_cheat = "Oszustwo Włochacizna deaktywowane.", }, level_progress = { halfway_lost = "Jesteś w połowie drogi do przegrania tego poziomu.", dont_kill_more_patients = "Nie możesz sobie pozwolić na śmierć kolejnych pacjentów!", another_patient_killed = "O nie! Zabiłeś kolejnego pacjenta. Masz już na koncie %d zgonów.", halfway_won = "Jesteś w połowie drogi do ukończenia tego poziomu.", close_to_win_increase_value = "Zbliżasz się do zwycięstwa. Zwiększ wartość swojego szpitala o %d.", financial_criteria_met = "Osiągnąłeś kryteria finansowe tego poziomu. Teraz utrzymaj stan konta powyżej %d i upewnij się, że szpital jest sprawnie prowadzony.", nearly_won = "Jesteś już bardzo blisko wygrania poziomu.", hospital_value_enough = "Utrzymaj wartość szpitala powyżej %d i zajmij się innymi problemami, aby wygrać ten poziom.", another_patient_cured = "Dobra robota - kolejny pacjent wyleczony. To juz %d.", three_quarters_lost = "Jeżeli nic nie zmienisz przegrasz ten poziom.", reputation_good_enough = "Twoja reputacja jest wystarczająca, aby wygrać ten poziom. Utrzymaj ją powyżej %d i rozwiąż pozostałe problemy, aby go ukończyć.", cured_enough_patients = "Wyleczyłeś wystarczająco pacjentów, ale musisz zaprowadzić w szpitalu większy porządek, aby wygrać ten poziom.", nearly_lost = "Jesteś bardzo bliski przegrania tego poziomu.", improve_reputation = "Musisz zwiększyć swoją reputację o %d, aby mieć szansę na zwycięstwo.", three_quarters_won = "Jeszcze trochę zostało ci do wygranej na tym poziomie.", }, staff_place_advice = { receptionists_only_at_desk = "Recepcjonistka może pracować tylko w Recepcji.", only_psychiatrists = "Tylko Lekarz, który posiada specjalizację Psychiatry, może pracować w Gabinecie Psychiatrycznym.", only_surgeons = "Tylko Lekarz, który posiada specjalizację Chirurga, może pracować na Sali Operacyjnej.", only_nurses_in_room = "Jedynie Pielęgniarka może pracować w %s", only_doctors_in_room = "Jedynie Lekarz może pracować w %s", only_researchers = "Tylko Lekarz, który posiada specjalizację Naukowca, może pracować w Dziale Badawczym.", nurses_cannot_work_in_room = "Pielęgniarka nie może pracować w %s", doctors_cannot_work_in_room = "Lekarz nie może pracować w %s", }, room_forbidden_non_reachable_parts = "Budując tutaj to pomieszczenie, zablokujesz dostęp do pozostałych części szpitala.", research = { machine_improved = "Urządzenie %s zostało ulepszone przez Dział Badawczy.", autopsy_discovered_rep_loss = "Wyciekły informacje o używaniu maszyny do Auto-Autopsji. Spodziewaj się negatywnych reakcji opinii publicznej.", drug_fully_researched = "Doprowadziłeś badanie %s do 100%.", new_machine_researched = "Nowy %s właśnie został odkryty.", drug_improved = "Lek %s właśnie został udoskonalony przez twój Dział Badawczy.", new_available = "Nowy %s został udostępniony.", new_drug_researched = "Nowy specyfik leczący %s właśnie został odkryty.", }, boiler_issue = { minimum_heat = "Ach, tutaj jesteś. Bojler w piwnicy się zepsuł. Wygląda na to, że ludzie w twoim szpitalu zaczną nieco marznąć.", maximum_heat = "Bojler w piwnicy dostał bzika i kaloryfery strasznie się rozgrzały. Ludzie zaraz zaczną się roztapiać! Postaw więcej Automatów do napoi.", resolved = "Dobra wiadomość. Bojler i kaloryfery znowu działają poprawnie. Temperatura powinna być już odpowiednia dla pacjentów i personelu.", }, competitors = { staff_poached = "Jeden z twoich pracowników został podkupiony przez inny Szpital.", hospital_opened = "%s otworzył w okolicy konkurencyjny szpital. ", land_purchased = "%s właśnie kupił nowe tereny.", }, room_requirements = { research_room_need_researcher = "W Gabinecie Badawczym musisz zatrudnić Lekarza że specjalizacją Naukowca.", op_need_another_surgeon = "Musisz zatrudnić jeszcze jednego Chirurga, aby możliwe było prowadzenie operacji.", op_need_ward = "Zanim poddasz pacjentów operacji, musisz zbudować Oddział Przedzabiegowy.", reception_need_receptionist = "Musisz zatrudnić Recepcjonistkę, aby rejestrować pacjentów.", psychiatry_need_psychiatrist = "Zbudowałeś Gabinet Psychiatryczny, musisz jeszcze zatrudnić Psychiatrę.", pharmacy_need_nurse = "Musisz zatrudnić Pielęgniarkę w tej Aptece.", ward_need_nurse = "Musisz zatrudnić Pielęgniarkę do pracy na tym Oddziale.", op_need_two_surgeons = "Zatrudnij dwóch Chirurgów do pracy w Sali Operacyjnej.", training_room_need_consultant = "Musisz zatrudnić Konsultanta w tej Sali Szkoleniowej.", gps_office_need_doctor = "Musisz zatrudnić Lekarza do pracy w Gabinecie Lekarskim.", }, goals = { win = { money = "Potrzebujesz kolejnych %d, aby spełnić wymogi finansowe tego poziomu.", cure = "Wylecz kolejnych %d pacjentów, a będziesz miał ich wystarczająco dużo, aby wygrać ten poziom.", reputation = "Zwiększ swoja reputację do %d, aby spełnić wymóg misji.", value = "Musisz zwiększyć wartość swojego szpitala do %d", }, lose = { kill = "Zabij kolejnych %d pacjentów, a przegrasz misję!", }, }, warnings = { charges_too_low = "Pobierasz za niskie opłaty. Ludzie będą wybierać twój szpital, jednak nie zostawią w nim dużo pieniędzy.", charges_too_high = "Wprowadziłeś zbyt wysokie opłaty. Przez jakiś czas będziesz miał spore zyski, ale potem pacjenci zaczną rezygnować z twoich usług.", staff_overworked = "Twoi pracownicy są niezmiernie przepracowani. Stają się nieefektywni i mogą popełniać katastrofalne błędy.", doctor_crazy_overwork = "O nie! Jeden z twoich Lekarzy oszalał z przepracowania. Jeżeli natychmiast pozwolisz mu odpocząć, to może wyzdrowieje.", doctors_tired = "Twoi Lekarze są bardzo zmęczeni. Daj im odpocząć.", people_did_it_on_the_floor = "Niektórzy z twoich pacjentów nie wytrzymali. Szykuje się dla kogoś duże sprzątanie.", queues_too_long = "Kolejki w twoim szpitalu są za długie.", money_very_low_take_loan = "Stan twojego konta jest zatrważająco niski. Mógłbyś rozważyć wzięcie kredytu.", falling_2 = "Przestaniesz się w końcu wygłupiać?", patients_very_thirsty = "Pacjenci naprawdę są spragnieni. Jeżeli nie kupisz szybko Automatów do napoi, będziesz świadkiem wielkiej migracji ludzi do domu po własną colę.", machinery_very_damaged = "Pilne! Bezzwłocznie wezwij Dozorcę! Urządzenia za chwilę eksplodują!", handymen_tired2 = "Twoi Dozorcy słaniają się ze zmęczenia. Daj im natychmiast odpocząć.", desperate_need_for_watering = "Musisz koniecznie zatrudnić Dozorcę, aby dbał o twoje rośliny.", nurses_tired = "Twoje Pielęgniarki są zmęczone. Daj im odpocząć.", too_much_litter = "Jest problem ze śmieciami, który rozwiązać może większa liczba Dozorców.", reception_bottleneck = "W recepcji utworzył się korek. Zatrudnij nową Recepcjonistkę.", place_plants4 = "Rozwesel pacjentów stawiając wokół więcej roślin.", place_plants3 = "Pacjenci są przygnębieni. Kup więcej roślin, aby ich rozweselić.", staff_too_hot = "Twoim pracownikom jest za gorąco. Obniż temperaturę lub usuń kaloryfery z ich gabinetów.", finanical_trouble2 = "Zdobądź jakieś pieniądze albo szpital pójdzie pod młotek. Nie ukończysz poziomu, jeśli stracisz kolejne %d.", plants_thirsty = "Musisz dbać o szpitalne rośliny. Zaczynają usychać.", litter_everywhere = "Śmieci są wszędzie. Niech Dozorcy zajmą się tym problemem.", nurses_tired2 = "Twoje Pielęgniarki są bardzo zmęczone. Daj im natychmiast odpocząć.", no_desk_2 = "Dobra robota, to musi być rekord świata: prawie rok bez pacjentów! Jeżeli chcesz nadal być kierownikiem tego szpitala, musisz zatrudnić recepcjonistkę i kupić jej biurko aby mogła pracować!", plants_dying = "Rośliny umierają błagając o kroplę wody. Niech Dozorcy się tym zajmą. Pacjenci nie lubią martwych roślin.", reduce_staff_rest_threshold = "Spróbuj obniżyć próg zmęczenia personelu na ekranie Strategii Szpitala tak, aby załoga mogła częściej odpoczywać.", more_toilets = "Potrzebujesz więcej Toalet. Ludzie muszą się załatwić.", hospital_is_rubbish = "Ludzie otwarcie mówią, że twój szpital jest do niczego. Chyba wiesz co będzie dalej: zabiorą się ze swoimi choróbskami do innego szpitala.", pay_back_loan = "Masz dużo pieniędzy. Może byś pomyślał o spłacie pożyczki?", financial_trouble3 = "Stan twojego konta wygląda niepokojąco. Pomyśl jak zarobić więcej pieniędzy. Jesteś o %d od katastrofy.", bankruptcy_imminent = "Hej! Zmierzasz do bankructwa. Bądź ostrożny!", build_toilet_now = "Zbuduj Toalety! Ludzie nie mogą już dłużej wytrzymać. Nie śmiej się, to poważna sprawa.", patient_stuck = "Ktoś się zaklinował. Musisz lepiej rozplanować swój szpital.", no_patients_last_month = "W poprzednim miesiącu żaden nowy pacjent nie pojawił się w twoim szpitalu. Tragedia!", falling_5 = "To nie miejsce na przewracanie ludzi, wiesz przecież, że są chorzy!", patients_too_hot = "Pacjentom jest za gorąco. Usuń kilka kaloryferów, obniż temperaturę, albo dokup automaty do napoi.", many_epidemics = "Wygląda na to, że w szpitalu szaleje więcej niż jedna epidemia. To może skończyć się kolosalna katastrofą, więc lepiej zacznij działać.", falling_4 = "To jest szpital, nie wesołe miasteczko!", place_plants_to_keep_people = "Ludzie odchodzą. Umieszczenie roślin mogłoby ich przekonać do pozostania.", patients_thirsty2 = "Ludziom chce się pić. Powinieneś kupić więcej Automatów do napoi, albo przesunąć te, które już masz bliżej pacjentów.", money_low = "Kończą ci się pieniądze!", staff_unhappy = "Twoi pracownicy są niezadowoleni. Daj im podwyżkę, a najlepiej zbuduj dla nich Pokój Socjalny. Możesz także przydzielić im więcej czasu wolnego w dziale Strategia.", people_freezing = "Aż trudno uwierzyć, ale w epoce centralnego ogrzewania niektórzy z twoich pacjentów marzną na kość. Zamontuj kaloryfery i podkręć ogrzewanie.", falling_6 = "To nie kręgielnia, chorzy nie powinni być traktowani w taki sposób!", need_toilets = "Pacjenci potrzebują toalet. Zbuduj je w łatwo dostępnym miejscu.", falling_3 = "Auć, to musiało boleć, niech ktoś wezwie doktora!", nobody_cured_last_month = "W poprzednim miesiącu nie wyleczyłeś absolutnie nikogo.", financial_trouble = "Jesteś w poważnych finansowych tarapatach. Natychmiast uporządkuj swoje finanse! Jeżeli stracisz kolejne %d, zawalisz ten poziom!", patients_very_cold = "Pacjentom jest bardzo zimno. Spróbuj podkręcić ogrzewanie lub zamontuj więcej kaloryferów.", no_desk_3 = "Po prostu wspaniale, minął prawie rok a ty nadal nie masz recepcji! W jako sposób zamierzasz zdobyć pacjentów? Zajmij się tym natychmiast i przestań się w końcu wygłupiać!", build_toilets = "Czym prędzej zbuduj Toalety, albo ujrzysz coś nieprzyjemnego. Wyobraź sobie także zapach swojego szpitala.", cannot_afford = "Nie masz wystarczającej ilości pieniędzy aby zatrudnić tą osobę!", no_desk = "Powinieneś zakupić biurko recepcji i zatrudnić recepcjonistkę!", patients_annoyed = "Ludzie są strasznie zdenerwowani twoim sposobem prowadzenia szpitala. I wcale im się nie dziwię. Weź się do roboty albo poniesiesz konsekwencje!", many_killed = "Masz już na sumieniu %d ludzi. A powinieneś ich leczyć i dobrze o tym wiesz.", place_plants2 = "Ludzie odchodzą. Więcej roślin mogłoby ich tu zatrzymać dłużej.", staff_tired = "Twoi pracownicy są strasznie zmęczeni. Jeżeli nie dasz im choć trochę odpocząć, niektórzy mogą paść z wycieńczenia.", machines_falling_apart = "Przyrządy w twoim szpitalu psują się. Wyślij natychmiast Dozorcę do ich naprawy!", patients_unhappy = "Pacjenci nie lubią twojego szpitala. Powinieneś coś zrobić, by poprawić im warunki.", no_desk_1 = "Jeżeli chcesz aby pacjenci odwiedzali twój szpital, będziesz musiał zatrudnić recepcjonistkę i zakupić jej biurko, przy którym będzie pracować!", staff_unhappy2 = "Twoi pracownicy są niezadowoleni. Poza tym wkrótce będą chcieli więcej pieniędzy.", cash_low_consider_loan = "Twoja sytuacja finansowa jest bardzo zła. Czy rozważałeś wzięcie kredytu?", queue_too_long_at_reception = "Zbyt wielu pacjentów czeka na rejestrację. Postaw nowe Biurko Recepcji i zatrudnij Recepcjonistkę.", queue_too_long_send_doctor = "Kolejki do %s są za długie. Upewnij się, że w gabinecie jest Lekarz.", falling_1 = "Hej! To nie jest śmieszne, uważaj gdzie klikasz tą myszką; komuś może stać się krzywda!", doctors_tired2 = "Twoi Lekarze ledwo żyją. Potrzebują natychmiastowego odpoczynku.", handymen_tired = "Twoi Dozorcy są bardzo zmęczeni. Daj im odpocząć.", patient_leaving = "Jakiś pacjent odchodzi. Powód? Twój kiepsko zarządzany i słabo wyposażony szpital.", deal_with_epidemic_now = "Jeżeli natychmiast nie zaradzisz tej epidemii, znajdziesz się w niezłych tarapatach. Rusz się!", patients_leaving = "Pacjenci odchodzą. Ulepsz swój szpital umieszczając w nim rośliny, ławki, automaty do napoi, itd.", machinery_damaged2 = "Musisz zatrudnić Dozorcę do naprawy urządzeń.", epidemic_getting_serious = "Ta Zaraźliwa Choroba zaczyna być poważna. Musisz szybko coś zrobić!", people_have_to_stand = "Zmuszasz cierpiący lud do stania. Kup natychmiast więcej ławek.", receptionists_tired = "Twoje Recepcjonistki są strasznie zmęczone. Daj im odpocząć.", build_staffroom = "Natychmiast zbuduj Pokój Socjalny! Twój personel pracuje ponad siły i jest na skraju wyczerpania. Nabierz wreszcie rozumu!", machinery_slightly_damaged = "Maszyny w szpitalu są nieco uszkodzone. Nie zapomnij o ich konserwacji.", need_staffroom = "Zbuduj Pokój Socjalny, aby twoi pracownicy mieli gdzie odpocząć.", patients_getting_hot = "Pacjentom jest bardzo gorąco. Spróbuj zmniejszyć ogrzewanie lub usuń niektóre kaloryfery.", machinery_deteriorating = "Twoje urządzenia właśnie zaczęły niszczeć na skutek zużycia. Miej na nie oko.", machinery_damaged = "Niedługo będziesz musiał zająć się naprawą urządzeń szpitalnych, bo zaczną się rozpadać.", patients_thirsty = "Ludziom chce się pić. Może powinieneś kupić jakieś automaty do napoi.", machine_severely_damaged = "%s wkrótce ulegnie nieodwracalnemu uszkodzeniu.", litter_catastrophy = "Sytuacja ze śmieciami wygląda strasznie. Niech brygada Dozorców szybko się tym zajmie!", staff_very_cold = "Personel narzeka na zimno. Podkręć ogrzewanie lub zamontuj więcej kaloryferów.", more_benches = "Pomyśl o wstawieniu większej liczby ławek. Pacjenci nie znoszą stania.", too_many_plants = "Masz zdecydowanie za dużo roślin. Tu jest jak w dżungli.", change_priorities_to_plants = "Musisz zmienić zadania swoim Dozorcom tak, aby spędzali więcej czasu na podlewaniu roślin.", some_litter = "Dozorcy mogą pozbyć się śmieci, zanim staną się one poważnym problemem.", receptionists_tired2 = "Twoje Recepcjonistki opadły z sił. Daj im trochę odpocząć.", patients_really_thirsty = "Pacjenci są naprawdę spragnieni. Wstaw nowe Automaty do napoi, lub przesuń stare bliżej dużych kolejek.", research_screen_open_2 = "Na obecnym poziomie badania są niedostępne.", research_screen_open_1 = "Najpierw musisz wybudować Dział Badawczy aby mieć dostęp do ekranu badań.", }, placement_info = { door_can_place = "Jeżeli chcesz, możesz umieścić tutaj drzwi.", window_can_place = "Możesz wstawić to okno tutaj. Będzie pasowało.", door_cannot_place = "Niestety nie możesz tu wstawić drzwi.", object_can_place = "Możesz umieścić ten przedmiot tutaj.", reception_can_place = "Nie możesz tu umieścić Biurka Recepcji.", staff_cannot_place = "Przykro mi, ale nie możesz tu umieścić tego pracownika.", staff_can_place = "Możesz umieścić tego pracownika tutaj. ", object_cannot_place = "Hej, nie możesz tu umieścić tego przedmiotu.", room_cannot_place = "Nie możesz tu zbudować pomieszczenia.", room_cannot_place_2 = "Nie możesz tu zbudować pomieszczenia.", window_cannot_place = "Ach, prawdę mówiąc nie możesz tu wstawić okna.", reception_cannot_place = "Nie możesz tu umieścić Biurka Recepcji.", }, praise = { many_benches = "Teraz pacjenci mają wystarczającą liczbę ławek. Świetnie.", many_plants = "Wspaniale. W twoim szpitalu jest mnóstwo roślin. Pacjenci to docenią.", plants_are_well = "Jak miło. Widzę, że dbasz o swoje rośliny. To wspaniale.", few_have_to_stand = "Nikt nie musi stać w twoim szpitalu. Pacjenci będą zadowoleni.", plenty_of_benches = "Jest dużo miejsc do siedzenia, więc nie ma problemu.", plants_thriving = "Bardzo dobrze. Twoje rośliny dosłownie rozkwitają. Wyglądają cudownie. Tak trzymaj, a może wygrasz za nie trofeum.", patients_cured = "Wyleczono %d pacjentów.", }, information = { larger_rooms = "Większe pomieszczenia zwiększają zadowolenie i wydajność twojego personelu.", extra_items = "Dodatkowe przedmioty w pokojach zapewniają pracownikom większy komfort i zwiększają ich wydajność.", epidemic = "W twoim szpitalu rozpleniła się zaraźliwa choroba. Musisz natychmiast rozwiązać ten problem!", promotion_to_doctor = "Jeden z twoich ASYSTENTÓW awansował na DOKTORA.", emergency = "Mamy nagły wypadek! Ruchy! Ruchy! RUCHY!", patient_abducted = "Jednego z twoich pacjentów próbują uprowadzić kosmici.", first_cure = "Dobra robota! Właśnie wyleczyłeś swojego pierwszego pacjenta.", promotion_to_consultant = "Jeden z twoich LEKARZY awansował na KONSULTANTA.", handyman_adjust = "Możesz zmusić Dozorców do efektywniejszego sprzątania poprzez zmianę ich priorytetów.", promotion_to_specialist = "Jeden z twoich Lekarzy awansował do stopnia: %s.", initial_general_advice = { rats_have_arrived = "Szczury nawiedziły twój szpital. Spróbuj wystrzelać je za pomocą myszy.", autopsy_available = "Wynaleziono urządzenie do Auto Autopsji. Dzięki temu możesz pozbyć się kłopotliwych lub niepożądanych pacjentów i prowadzić badania na ich zwłokach. Uważaj jednak - używanie tej maszyny jest bardzo kontrowersyjne.", first_patients_thirsty = "Ludzie w twoim szpitalu są spragnieni. Postaw więcej Automatów do napoi.", research_now_available = "Zbudowałeś swój pierwszy Dział Badawczy. Teraz masz dostęp do ekranu Badań.", psychiatric_symbol = "Lekarze wyszkoleni w psychiatrii posiadają symbol: |", decrease_heating = "Ludziom w twoim szpitalu jest za gorąco. Zmniejsz poziom ogrzewania. Możesz tego dokonać w ekranie Mapy Miasta.", surgeon_symbol = "Lekarze mogący przeprowadzać operacje posiadają symbol: {", first_emergency = "Pacjenci z nagłych wypadków maja nad głowami niebieskie lampki. Wylecz ich zanim umrą lub upłynie limit czasu.", first_epidemic = "W twoim szpitalu wybuchła epidemia! Zdecyduj czy chcesz zakamuflować czy ujawnić ten problem.", taking_your_staff = "Ktoś podkupuje twoich pracowników. Będziesz musiał walczyć, aby ich zatrzymać.", place_radiators = "Ludzie w twoim szpitalu marzną - możesz zamontować więcej kaloryferów kupując je w menu Wyposażenie Korytarza.", epidemic_spreading = "W twoim szpitalu wykryto zakażenie. Spróbuj wyleczyć wszystkich zakażonych pacjentów, nim opuszczą szpital.", research_symbol = "Lekarze mogący prowadzić badania posiadają symbol: }", machine_needs_repair = "Jedno z twoich urządzeń wymaga naprawy. Zlokalizuj je - będzie dymiło - i kliknij na nie. Następnie kliknij na przycisk Dozorcy.", increase_heating = "Ludziom jest zimno. Podkręć ogrzewanie na ekranie Mapy Miasta.", first_VIP = "Twój szpital czeka pierwsza wizytacja VIPa. Upewnij się, że nie zobaczy on niczego niehigienicznego ani nie spotka niezadowolonych pacjentów.", }, patient_leaving_too_expensive = "Pacjent wychodzi bez płacenia za %s. To zbyt kosztowna usługa.", vip_arrived = "Uwaga! Przed chwilą przyjechał %s w celu wizytacji twojego szpitala! Miej wszystko pod kontrolą, aby był zadowolony.", epidemic_health_inspector = "Wieści o epidemii z twojego szpitala dotarły do Ministerstwa Zdrowia. Przygotuj się na wizytę Inspektora Zdrowia.", first_death = "Właśnie zabiłeś swojego pierwszego pacjenta. Jakie to uczucie?", pay_rise = "Członek personelu grozi odejściem. Zdecyduj czy zgadzasz się na jego żądania czy też zwolnisz go z pracy. Kliknij na ikonie po lewej stronie, aby zobaczyć kto grozi odejściem.", place_windows = "Dzięki oknom pomieszczenia są nasłonecznione, a twoi pracownicy mają lepszy nastrój.", fax_received = "Ikona, która właśnie pojawiła się w lewej, dolnej części ekranu, alarmuje cię o ważnych informacjach lub decyzjach, które musisz podjąć.", }, build_advice = { placing_object_blocks_door = "Umieszczenie tego obiektu tutaj uniemożliwi dostanie się do drzwi.", blueprint_would_block = "Projekt blokuje inne pomieszczenia. Spróbuj zmienić rozmiar pomieszczenia lub przesunąć je gdzie indziej!", door_not_reachable = "Ludzie nie będą mogli dostać się do tych drzwi. Zastanów się.", blueprint_invalid = "Projekt pomieszczenia jest niewłaściwy.", }, } calls_dispatcher = { repair = "Naprawa %s", summary = "%d wezwań; %d przydzielono", close = "Zamknij", watering = "Podlewanie @ %d,%d", staff = "%s - %s", } information = { cheat_not_possible = "Nie można używać oszustwa na tym poziomie. Nie potrafisz nawet oszukiwać, niezbyt to śmieszne co?", very_old_save = "Zaszło sporo zmian w grze od czasu, gdy rozpoczęty został ten poziom. Aby mieć pewność, że wszystko działa jak należy, zaleca się rozpoczęcie poziomu od nowa.", no_custom_game_in_demo = "Przepraszamy ale w wersji demonstracyjnej nie można grać na niestandardowych mapach.", cannot_restart = "Niestety ta dodatkowa mapa była zapisana zanim wprowadzona została możliwość ponownego rozpoczynania gry.", custom_game = "Witaj w CorsixTH. Życzymy dużo zabawy z dodatkowymi mapami!", level_lost = { [1] = "Pech! Nie udało Ci się ukończyć poziomu. Powodzenia następnym razem!", [2] = "Powód dla którego przegrałeś:", reputation = "Twoja reputacja spadła poniżej %d.", balance = "Twój stan konta był mniejszy niż %d.", percentage_killed = "Zabiłeś więcej niż %d procent pacientów.", cheat = "To był twój wybór czy wcisnąłeś zły przycisk? Więc nawet nie wiesz jak oszukiwać, nie jest ci teraz do śmiechu co?", }, } casebook = { sent_home = "odprawionych", deaths = "zgony", treatment_charge = "koszt leczenia", reputation = "reputacja", research = "skoncentruj badania", cure = "leczenie", cured = "wyleczonych", earned_money = "zarobiono", cure_desc = { hire_psychiatrists = "Musisz zatrudnić Psychiatrów.", improve_cure = "Ulepsz Leczenie.", hire_nurses = "Powinieneś zatrudnić Pielęgniarki.", build_ward = "Musisz jeszcze zbudować Oddział.", no_cure_known = "Nieznane Leczenie.", cure_known = "Leczenie.", build_room = "Zalecam, abyś zbudował %s", hire_doctors = "Musisz zatrudnić Lekarzy.", hire_surgeons = "Musisz zatrudnić Chirurgów.", }, } new_game_window = { caption = "Kampania", player_name = "Imię gracza", option_on = "Włączone", option_off = "Wyłączone", difficulty = "Poziom trudności", easy = "Asystent (Łatwy)", medium = "Doktor (Średni)", hard = "Konsultan (Trudny)", tutorial = "Samouczek", start = "Rozpocznij", cancel = "Anuluj", } diseases = { diag_ward = { name = "Diag. Oddział", }, diag_ultrascan = { name = "Diag. Ultraskan", }, autopsy = { name = "Sekcja zwłok", }, third_degree_sideburns = { cause = "Przyczyna - tęsknota za latami 70-tymi.", cure = "Leczenie - używając najnowszych metod Psychiatra musi przekonać pacjenta, że brokat i buty na koturnach to obciach.", name = "Bokobrody", symptoms = "Objawy - fryzura afro, spodnie dzwony i brokatowy makijaż.", }, discrete_itching = { cause = "Przyczyna - małe insekty z ostrymi zębami.", cure = "Leczenie - Pacjent pije apteczny kleisty syrop zapobiegający swędzeniu.", name = "Intymny Świąd", symptoms = "Objawy - drapanie, prowadzące do częściowego zapalenia ciała.", }, the_squits = { cause = "Przyczyna - jedzenie pizzy znalezionej pod kuchenką.", cure = "Leczenie - kleista mieszanina włóknistych chemikaliów zespala wnętrzności pacjenta.", name = "Rozwolnienie", symptoms = "Objawy - fuj, pewnie się domyślasz.", }, spare_ribs = { cause = "Przyczyna - siadanie na zimnej podłodze.", cure = "Leczenie - to coś musi być usunięte przez dwóch Chirurgów i oddane pacjentowi w papierowej torbie.", name = "Żeberka", symptoms = "Objawy - nieprzyjemne uczucie w klatce piersiowej.", }, diag_blood_machine = { name = "Diag. Morfologia", }, king_complex = { cause = "Wywołane przez ducha Króla, przejmującego kontrolę nad umysłem pacjenta.", cure = "Leczenie - Psychiatra mówi pacjentowi jak idiotycznie wygląda.", name = "Kompleks Króla", symptoms = "Objawy - przywdziewanie kolorowego, zamszowego obuwia i jedzenie cheeseburgerów.", }, diag_x_ray = { name = "Diag. Rentgen", }, pregnancy = { cause = "Przyczyna - braki prądu w obszarach miejskich.", cure = "Leczenie - owoc obżarstwa jest usuwany operacyjnie, myty i pokazywany pacjentowi.", name = "Ciąża", symptoms = "Objawy - mięsień piwny jako następstwo objadania się.", }, fake_blood = { cause = "Przyczyna - osoba będąca zwykle ofiarą psikusów.", cure = "Leczenie - psychiatryczne uspokajanie jest jedynym rozwiązaniem tego problemu.", name = "Sztuczna Krwistość", symptoms = "Objawy - czerwony płyn w żyłach, który wyparowuje przy kontakcie z odzieżą.", }, diag_psych = { name = "Diag. Psychiatra", }, invisibility = { cause = "Przyczyna - ugryzienie przez radioaktywną (i niewidzialną) mrówkę.", cure = "Leczenie - kolorowy płyn wypity w Aptece szybko przywróci pacjenta do pełnej widzialności.", name = "Niewidzialność", symptoms = "Objawy - żaden dyskomfort dla pacjenta; wielu wręcz używa tej przypadłości, by robić kawały swym rodzinom.", }, golf_stones = { cause = "Przyczyna - wdychanie gazu z wnętrza piłek golfowych.", cure = "Leczenie - objawy usuwane operacyjnie przez dwóch Chirurgów.", name = "Kamienie Golfowe", symptoms = "Objawy - delirium i wielki wstyd.", }, diag_general_diag = { name = "Podst. Badania", }, infectious_laughter = { cause = "Przyczyna - typowy serial komediowy.", cure = "Leczenie - Psychiatra uświadamia pacjentowi, że w tej dolegliwości nie ma nic zabawnego.", name = "Zaraźliwy Śmiech", symptoms = "Objawy - ciągły chichot i powtarzanie nieśmiesznych dowcipów.", }, general_practice = { name = "Wizyta u Lekarza", }, baldness = { cause = "Przyczyna - mówienie kłamstw i niestworzonych historii, aby być popularnym.", cure = "Leczenie - włosy są gładko nakładane na głowę pacjenta przy użyciu bolesnej maszynerii.", name = "Łysienie", symptoms = "Objawy - lśniąca glaca i zakłopotanie.", }, heaped_piles = { cause = "Przyczyna - przebywanie w pobliżu automatów z zimnymi napojami.", cure = "Leczenie - smaczny, choć mocno kwaśny napój rozpuszcza hemoroidy od wewnątrz.", name = "Hemoroidy", symptoms = "Objawy - Pacjent czuje się jakby siedział na torbie z kulkami.", }, unexpected_swelling = { cause = "Przyczyna - coś niespodziewanego.", cure = "Leczenie - opuchlizna może być zmniejszona tylko przez chirurgiczne nacięcie.", name = "Nagłe Wzdęcia", symptoms = "Objawy - opuchlizna.", }, jellyitis = { cause = "Przyczyna - dieta bogata w żelatynę i nadmiar ćwiczeń.", cure = "Leczenie - Pacjent jest zanurzany na chwilę w Galaretownicy.", name = "Galaretowatość", symptoms = "Objawy - drżenie i częste upadki.", }, hairyitis = { cause = "Przyczyna - nadmiar naświetlenia księżycowego.", cure = "Leczenie - maszyna do elektrolizy usuwa włosy i uszczelnia pory.", name = "Włochacizna", symptoms = "Objawy - poszkodowani posiadają wyostrzony zmysł węchu.", }, alien_dna = { cause = "Przyczyna - twarzołapy z inteligentną krwią obcych.", cure = "Leczenie - DNA jest mechanicznie usuwane, czyszczone z obcych elementów i szybko wymieniane.", name = "DNA Obcego", symptoms = "Objawy - stopniowa metamorfoza w obcego i chęć niszczenia miasta.", }, bloaty_head = { cause = "Przyczyna - wąchanie sera i picie nieoczyszczonej deszczówki.", cure = "Leczenie - opuchnięta głowa jest przebijana, następnie nadmuchiwana do odpowiedniej wielkości.", name = "Głowowzdęcie", symptoms = "Objawy - bardzo przykre dla ofiary.", }, gastric_ejections = { cause = "Przyczyna - pikantne meksykańskie lub hinduskie jedzenie.", cure = "Leczenie - wypicie specjalnego roztworu zapobiega wypuszczaniu czegokolwiek.", name = "U-Pierdliwość", symptoms = "Objawy - wpół strawione jedzenie uchodzi z pacjenta w małych ilościach.", }, uncommon_cold = { cause = "Przyczyna - małe cząsteczki smarków w powietrzu.", cure = "Leczenie - duży łyk niezwykłej medycznej mikstury ze specjalnych składników zrobionych w Aptece.", name = "Nietypowa Grypa", symptoms = "Objawy - zasmarkany nos, kichanie i przebarwione płuca.", }, corrugated_ankles = { cause = "Przyczyna - rozjeżdżanie autem znaków ostrzegawczych.", cure = "Leczenie - lekko toksyczna mieszanka ziół i przypraw pita w celu naprostowania kostek.", name = "Sfałdowane Kostki", symptoms = "Objawy - problemy z wkładaniem butów.", }, sleeping_illness = { cause = "Przyczyna - nadaktywny gruczoł snu w podniebieniu.", cure = "Leczenie - stężona dawka silnego stymulanta podawana przez Pielęgniarkę.", name = "Narkolepsja", symptoms = "Objawy - przeszywająca chęć spania gdzie popadnie.", }, sweaty_palms = { cause = "Przyczyna - strach przed rozmowami kwalifikacyjnymi.", cure = "Leczenie - Psychiatra musi wybić pacjentowi z głowy tę urojoną chorobę.", name = "Spocone Dłonie", symptoms = "Objawy - uścisk dłoni pacjenta to jak ściskanie nasiąkniętej gąbki.", }, serious_radiation = { cause = "Przyczyna - pomylenie izotopów plutonu z gumą do żucia.", cure = "Leczenie - Pacjent musi być umieszczony w Prysznicu Odkażającym i porządnie umyty.", name = "Napromieniowanie", symptoms = "Objawy - pacjenci z tą przypadłością czują się bardzo, bardzo źle.", }, diag_cardiogram = { name = "Diag. Kardiograf", }, diag_scanner = { name = "Diag. Skaner", }, gut_rot = { cause = "Przyczyna - picie domowej roboty syropów na kaszel.", cure = "Leczenie - specjalna mikstura na odbudowanie warstwy ochronnej brzuszka.", name = "Gnijące Jelita", symptoms = "Objawy - brak kaszlu - oraz brak żołądka.", }, iron_lungs = { cause = "Przyczyna - smog miejski zmieszany z pozostałościami kebabu.", cure = "Leczenie - dwaj Chirurdzy usuwają dużą bryłę z płuc pacjenta.", name = "Żelazne Płuca", symptoms = "Objawy - umiejętnosć ziania ogniem i krzyczenia pod wodą.", }, broken_wind = { cause = "Przyczyna - korzystanie z bieżni gimnastycznej po posiłku.", cure = "Leczenie - sążnista wodna mikstura wypijana szybko w Aptece.", name = "Trujące Wiatry", symptoms = "Objawy - pacjent niepokoi ludzi znajdujących się tuż za nim.", }, kidney_beans = { cause = "Przyczyna - miażdżenie kostek lodu w drinkach.", cure = "Leczenie - dwóch Chirurgów usuwa kamienie bez naruszania nerek.", name = "Kamionka Nerkowa", symptoms = "Objawy - ból i częste wizyty w toalecie.", }, transparency = { cause = "Przyczyna - oblizywanie sreberka z jogurtu po otwarciu pojemniczka.", cure = "Leczenie - specjalnie barwiona i chłodzona woda apteczna leczy tę chorobę.", name = "Przezroczystość", symptoms = "Objawy - ciało staje się obrzydliwie przezroczyste.", }, broken_heart = { cause = "Przyczyna - ktoś bogatszy, młodszy i szczuplejszy od pacjenta.", cure = "Leczenie - Chirurdzy otwierają klatkę piersiową i, wstrzymując oddech, zszywają serce.", name = "Złamane serce", symptoms = "Objawy - płacz i ból mięśni spowodowane godzinami darcia zdjęć z wakacji.", }, slack_tongue = { cause = "Przyczyna - nałogowe dyskusje o telenowelach.", cure = "Leczenie - język umieszczany jest w Krajalnicy i usuwany szybko, skutecznie i boleśnie.", name = "Obwisły Język", symptoms = "Objawy - pięciokrotnie powiększony, obwisły język.", }, tv_personalities = { cause = "Przyczyna - telewizja śniadaniowa.", cure = "Leczenie - doświadczony Psychiatra musi przekonać pacjenta do sprzedaży TV i zakupu radia.", name = "Osobowość Medialna", symptoms = "Objawy - złudzenie, że można poprowadzić program o gotowaniu.", }, ruptured_nodules = { cause = "Przyczyna - skoki na bungie podczas mrozu.", cure = "Leczenie - dwóch wykwalifikowanych Chirurgów usuwa bąble swymi opanowanymi dłońmi.", name = "Przepuklina", symptoms = "Objawy - niemożność komfortowego siedzenia.", }, fractured_bones = { cause = "Przyczyna - spadanie z dużych wysokości na beton.", cure = "Leczenie - gips jest zakładany, po czym zdejmowany przez maszynę sterowaną laserowo.", name = "Połamane Kości", symptoms = "Objawy - głośne pęknięcie i niemożność używania chorych kończyn.", }, chronic_nosehair = { cause = "Przyczyna - Wtykanie nosa w nie swoje sprawy.", cure = "Leczenie - obrzydliwy, usuwający włosy napój, zażywany doustnie, robiony przez Pielęgniarkę w Aptece.", name = "Włosy w Nosie", symptoms = "Objawy - włosów w nosie starczyłoby na gniazdo dla borsuka.", }, } policy = { header = "STRATEGIA SZPITALA", diag_termination = "zatrzymanie diagnozowania", sliders = { guess = "POSTAW DIAGNOZĘ", send_home = "WYPISZ DO DOMU", stop = "ZATRZYMAJ", staff_room = "IDŹ ODPOCZĄĆ", }, diag_procedure = "procedura diagnozowania", staff_rest = "wyślij personel na odpoczynek", staff_leave_rooms = "personel opuszcza gabinet", } competitor_names = { [1] = "ORAC", [2] = "COLOSSUS", [3] = "HAL", [4] = "MULTIVAC", [5] = "HOLLY", [6] = "DEEP THOUGHT", [7] = "ZEN", [8] = "LEON", [9] = "MARVIN", [10] = "AKIRA", [11] = "MOTHER", [12] = "JAYNE", [13] = "CORSIX", [14] = "ROUJIN", [15] = "EDVIN", [16] = "EMIL", [17] = "CHARLIE", [18] = "ARTUR", [19] = "MAGNUS", [20] = "SAL", [21] = "JOSHUA", [22] = "DANEEL", [23] = "OLIVAW", [24] = "NIC", } options_window = { caption = "Opcje", option_on = "Włączone", option_off = "Wyłączone", fullscreen = "Pełny ekran", resolution = "Rozdzielczość", custom_resolution = "Niestandardowa...", browse = "Przeglądaj...", width = "Szerokość", height = "Wysokość", new_th_directory = "Tutaj możesz określić nowy katalog z zainstalowaną grą Theme Hospital. Jak tylko dokonasz wyboru gra będzie uruchomiona ponownie.", apply = "Zatwierdź", cancel = "Anuluj", data_location = "Lokalizacja danych", font_location = "Lokalizacja czcionki", language = "Język gry", cancel = "Anuluj", back = "Wróć", audio = "Dźwięk", customise = "Modyfikuj", folder = "Foldery", } folders_window = { caption = "Ścieżki folderów", data_label = "Dane TH", font_label = "Czcionka", music_label = "MP3", savegames_label = "Zapisane stany gry", screenshots_label = "Zrzuty ekranu", new_th_location = "Tutaj możesz na nowo wybrać folder, w którym zainstalowana jest gra Theme Hospital. Po wybraniu folderu gra zostanie uruchomiona ponownie.", savegames_location = "Wybierz folder, w którym chcesz zapisywać stany gry", music_location = "Wybierz folder z muzyką, której chcesz użyć", screenshots_location = "Wybierz folder, w którym chcesz zapisywać zrzuty ekranu", back = "Wstecz", } tooltip.folders_window = { browse = "Przeglądaj foldery", data_location = "Folder z orginalną grą Theme Hospital, wymagany do uruchomienia CorsixTH", font_location = "Ścieżka do pliku czcionki będącej w stanie wyświetlić znaki Unicode wymagane przez twój język. Bez podania czcionki nie będzie możliwe wybrania języka, który używa znaki niewspierane przez orginalną grę. Przykład: Rosujski, Chinski, Polski.", savegames_location = "Domyślnie folder 'Saves', w którym umieszczane są stany gry, leży obok pliku konfiguracyjnego. Jeśli to Ci nie odpowiada możesz wybrać swój własny folder.", screenshots_location = "Domyślnie folder 'Screenshots', w którym umieszczane są zrzuty ekranu, leży obok pliku konfiguracyjnego. Jeśli to Ci nie odpowiada możesz wybrać swój własny folder.", music_location = "Wybierz folder z plikami MP3. Folder musi już być stworzony.", browse_data = "Wskaż inną ścieżkę instalacji Theme Hospital (aktualnie: %1%)", browse_font = "Wskaż inny plik czcionki ( aktualnie: %1% )", browse_saves = "Wskaż inną ścieżkę folderu ze stanami gry ( aktualnie: %1% ) ", browse_screenshots = "Wskaż inną ścieżkę folderu ze zrzutami ekranu ( aktualnie: %1% ) ", browse_music = "Wskaż inną ścieżkę folderu z twoją muzyką ( aktualnie: %1% ) ", no_font_specified = "Nie podano jeszcze pliku czcionki!", not_specified = "Nie podano jeszcze ścieżki folderu!", default = "Domyślna ścieżka", reset_to_default = "Przywróć domyślną ścieżkę dla folderu", back = "Zamknij to menu i wróć do ustawień", } customise_window = { caption = "Własne ustawienia", option_on = "Wł", option_off = "Wył", back = "Wróć", movies = "Zarządzanie filmami", intro = "Odtwórz intro", paused = "Budoowanie w czasie pauzy", volume = "Skrót ściszania", aliens = "Pacjenci Obcy", fractured_bones = "Pogruchotane kości", average_contents = "Standardowe wyposarzenie", } tooltip.customise_window = { movies = "Globalne zarządzanie filmami pozwoli Tobie na wyłączenie wszystkich filmików", intro = "Włącz lub wyłącz intro. Filmiki muszą być globalnie włączone jeśli chcesz oglądać intro przy każdym uruchomieniu CorsixTH", paused = "W grze Theme Hospital gracz mógł jedynie używać górnego menu podczas pauzy. Jest to również domyślne ustawianie CorsixTH, ale przez włączenie tej opcji wszystko jest dozwolone podczas pauzy", volume = "Jeśli przycisk ściszania otwiera również 'Teczkę z lekami' , włącz tę opcję aby zmienić skrót do 'Teczki...' na Shift + C", aliens = "Z powodu braku dobrych animacji dokonaliśmy zmian aby pacjęci z DNA Obcego domyślnie przybywali tylko z nagłych wypadków. Jeśli chcesz aby pacjensi z DNA Obcego mogli odwiedzać twój szpital nie tylko po nagłym wypadku wyłącz tę opcję", fractured_bones = "Z powodu kiepskich animacji domyślnie wyłączyliśmy damskie modele pacjętów ze Zgruchotanymi Koścmi. Aby zezwolić, żeby pacjentki ze Zgruchotanymi koścmi odwiedzały twój szpital, wyłącz tę opcję", average_contents = "Jeśli chcesz, żeby gra zapamiętała jakie dodatkowe wyposarzenie używasz zazwyczaj budując dany typ pomieszczenia, włącz tę opcję", back = "Zamknij to menu i wróć do ustawień", } buy_objects_window = { price = "Cena: ", choose_items = "Wybierz Przedmioty", total = "Suma: ", } trophy_room = { wait_times = { award = { [1] = "Gratulacje. Kolejki w twoim szpitalu są zawsze wyjątkowo krótkie. To bardzo ważne wyróżnienie.", }, penalty = { [1] = "Ludzie w twoim szpitalu muszą zbyt długo czekać. Kolejki są za długie. Gdybyś tylko chciał, mógłbyś bardziej efektywnie obsługiwać pacjentów.", }, }, happy_vips = { trophies = { [1] = "Agencja Znani&Bogaci chciałaby cię nagrodzić Trofeum Sławy za uszczęśliwienie każdego VIPa, jaki odwiedził twój szpital. Możesz uznać się za dość sławnego i prawie jednego z nas.", [2] = "Agencja Znani&Bogaci chciałaby cię nagrodzić Trofeum Sławy za uszczęśliwienie każdego VIPa, jaki odwiedził twój szpital. Możesz uznać się za dość sławnego i prawie jednego z nas.", [3] = "Gratulacje z okazji nagrody JAZDA VIPa, za pokazanie odwiedzającym jaką to ciężko pracującą placówką jest twój szpital. Wyśmienicie.", }, awards = { [1] = "Zdobyłeś Nagrodę Nobla za zaimponowanie VIPom. Wszyscy odwiedzający twój szpital w ostatnim roku byli z niego bardzo zadowoleni.", [2] = "Gratulacje z okazji nagrody JAZDA VIPa, za pokazanie odwiedzającym jaką to ciężko pracującą placówką jest twój szpital. Wyśmienicie.", }, }, hosp_value = { penalty = { [1] = "Twój szpital nie osiągnął przyzwoitej wartości. Podejmujesz decyzje błędne pod względem finansowym. Pamiętaj, dobry szpital to także drogi szpital.", }, awards = { [1] = "Ministerstwo Zdrowia chciałoby ci pogratulować imponującej wartości, jaką osiągnął twój szpital.", }, regional = { [1] = "Jesteś geniuszem finansów. Twój szpital jest wart więcej niż wszystkie inne razem wzięte.", }, }, rats_accuracy = { trophies = { [1] = "Otrzymałeś Trofeum Najcelniejszego Strzelca im. gry Syndicate Wars za %d%% precyzję w strzelaniu do szczurów.", [2] = "Tym trofeum pragniemy uczcić niezwykłą precyzję z jaką wymordowałeś %d%% szczurów, strzelając do nich w zeszłym roku.", [3] = "Aby upamiętnić wybicie %d%% wszystkich szczurów w twoim szpitalu, przyznano ci Trofeum Lochy Bez Gryzoni im. Dungeon Keepera. Gratulacje!", }, awards = { }, }, all_cured = { awards = { [1] = "Gratulacje z okazji zdobycia nagrody im. Marii Curie, za udane wyleczenie wszystkich pacjentów w ostatnim roku.", }, trophies = { [1] = "Międzynarodowa Fundacja Zdrowia, za fakt wyleczenia wszystkich pacjentów twojego szpitala w ostatnim roku, honoruje cię Trofeum Wyleczę Wszystko.", [2] = "Zostałeś obdarowany Trofeum Nie-Chorobom, za wyleczenie wszystkich pacjentów szpitala w zeszłym roku.", }, }, best_value_hosp = { trophies = { [1] = "Gratulacje z okazji otrzymania Trofeum, za szpital z najlepszą reputacją w ciągu ostatniego roku. Cóż, zasłużyłeś na to.", }, penalty = { [1] = "Każdy szpital w okolicy jest wart więcej niż twój. Zrób coś z tym, bo jest to żenujące. Dokup jakieś droższe urządzenia!", }, regional = { [1] = "Gratulacje, twój szpital jest najbardziej wartościowy w całej grze. Dobra robota i oby tak dalej.", }, }, high_rep = { trophies = { [1] = "Gratulacje z okazji otrzymania Trofeum, za szpital z najlepszą reputacją w ciągu ostatniego roku. Cóż, zasłużyłeś na to.", }, penalty = { [1] = "Zostajesz ukarany za utrzymywanie bardzo niskiej reputacji w przeciągu ostatniego roku. Postaraj się, by w przyszłości było lepiej.", [2] = "Reputacja twojego szpitala jest najgorsza w okolicy. To hańba. Jak tak dalej pójdzie, możesz szukać nowej pracy.", }, awards = { [1] = "Niniejszym zostajesz nominowany do Nagrody Rządowej, za nieskazitelne standardy i najwyższą możliwą reputację w tym roku. Pięknie.", [2] = "Przyjmij, proszę, Nagrodę Bullfroga, za najwyższą reputację wśród szpitali w ciągu ostatniego roku. Masz powody do zadowolenia, zapracowałeś na to.", [3] = "Dobra robota. Zdobywasz niewielką nagrodę za osiągniecie całkiem niezłej reputacji w ostatnim roku.", [4] = "Cudownie! Twój szpital wygrywa nagrodę za osiągniecie najlepszej reputacji w zeszłym roku.", [5] = "W tym roku reputacja twojego szpitala przekroczyła reputację wszystkich szpitali razem wziętych. Znaczące osiągnięcie.", }, regional = { [1] = "Przyjmij, proszę, Nagrodę Bullfroga, za najwyższą reputację wśród szpitali w ciągu ostatniego roku. Masz powody do zadowolenia, zapracowałeś na to.", [2] = "W tym roku reputacja twojego szpitala przekroczyła reputację wszystkich szpitali razem wziętych. Znaczące osiągnięcie.", }, }, consistant_rep = { trophies = { [1] = "Niniejszym zostajesz nominowany do Nagrody Rządowej, za nieskazitelne standardy i najwyższą możliwą reputację w tym roku. Pięknie.", [2] = "Gratulacje z okazji otrzymania Trofeum, za szpital z najlepszą reputacją w ciągu ostatniego roku. Cóż, zasłużyłeś na to.", }, }, curesvdeaths = { awards = { [1] = "Szczere gratulacje za osiągnięcie imponującej proporcji wyleczeń-zgonów w twoim szpitalu w zeszłym roku.", }, penalty = { [1] = "Twój współczynnik wyleczeń w stosunku do zgonów jest bardzo mały. Powinieneś się upewnić, że leczysz więcej ludzi niż zabijasz. Nie zawiedź nas.", }, }, cleanliness = { regional_good = { [1] = "Twój szpital jest znany jako jeden z najmniej czystych w okolicy. Brudny szpital jest śmierdzący i niebezpieczny. Powinieneś zwracać większą uwagę na bałagan.", }, award = { [1] = "Inspekcja odnotowała, że twój szpital jest bardzo czysty. Czysty szpital to bezpieczny szpital. Tak trzymać.", }, regional_bad = { [1] = "Twój szpital jest najbrudniejszy w okolicy. Inni administratorzy zdołali utrzymać korytarze w czystości. Przynosisz wstyd środowisku medycznemu.", }, }, happy_patients = { awards = { [1] = "Możesz być zadowolony z faktu, że ludzie w twoim szpitalu byli bardzo zadowoleni podczas ostatniego roku.", [2] = "Ludzie odwiedzający twój szpital byli bardziej zadowoleni z kuracji niż gdziekolwiek indziej.", }, penalty = { [1] = "Ludzie uważają wizyty w twoim szpitalu za niemiłe doświadczenie. Musisz coś z tym zrobić, jeżeli chcesz zdobyć poważanie Ministerstwa.", [2] = "Ludzie leczący się w twoim szpitalu byli bardzo niezadowoleni ze stanu tego miejsca. Pamiętaj, najważniejsze jest dobro pacjenta.", }, }, emergencies = { regional_good = { [1] = "Ministerstwo zauważyło, że twój szpital radził sobie lepiej z nagłymi wypadkami niż inne szpitale w zeszłym roku i przyznało ci nagrodę.", }, penalty = { [1] = "Nie radzisz sobie z nagłymi wypadkami. Pacjenci z nagłych wypadków potrzebują natychmiastowej i właściwej opieki, której ty nie zapewniasz.", }, regional_bad = { [1] = "Twój szpital najgorzej w regionie w radzi sobie z nagłymi wypadkami. To twoja wina, że wylądowałeś na szarym końcu lokalnej opieki zdrowotnej.", }, award = { [1] = "Gratulacje: skuteczne leczenie nagłych wypadków pozwoliło nam przyznać ci to specjalne wyróżnienie. Dobra robota. ", [2] = "Twoja zaradność w nagłych wypadkach jest wyjątkowa. Ta nagroda jest dla najlepszych za radzenie sobie z dużym napływem chorych i cierpiących.", }, }, gen_repairs = { awards = { [1] = "Zostałeś nominowany do specjalnej nagrody za błyskotliwość twoich Dozorców w naprawianiu sprzętu szpitalnego. Dobra robota. Weź urlop.", [2] = "Twoi Dozorcy są lepsi niż w innych szpitalach. To znaczące osiągnięcie, za które ci gratulujemy.", [3] = "Twój sprzęt jest w świetnym stanie. Poświęcenie twoich Dozorców jest niezwykłe. Wszyscy zasługujecie na tę prestiżową nagrodę. Świetna robota.", }, penalty = { [1] = "Dozorcy nie dbają za bardzo o twoje urządzenia. Powinieneś ich lepiej nadzorować lub zatrudnić nowych, aby poradzić sobie z natłokiem pracy.", [2] = "Masz bałagan w konserwacji urządzeń. Twoi pracownicy powinni szybko i starannie opiekować się wyposażeniem.", }, }, no_deaths = { trophies = { [1] = "Towarzystwo Życie Płynie Dalej przyznało ci to trofeum za absolutny brak zgonów w zeszłym roku.", [2] = "Zostałeś nominowany do Trofeum Pozostań Żywy za uniknięcie jakichkolwiek zgonów w twoim świetnym szpitalu w tym roku. Super.", [3] = "Zostałeś nominowany do Trofeum Pozostań Żywy za uniknięcie jakichkolwiek zgonów w twoim świetnym szpitalu w tym roku. Super.", }, penalty = { [1] = "Liczba zgonów w twoim szpitalu przez ostatni rok jest nie do przyjęcia. Zwróć większą uwagę na to, co robisz. Spraw, aby w przyszłości wyleczyć więcej osób.", [2] = "Twój szpital niesie ryzyko dla zdrowia pacjentów. Oczekujemy od ciebie leczenia ludzi a nie ich zabijania.", }, awards = { [1] = "Zdobyłeś Nagrodę Nie-Odwal-Kity za utrzymanie przy życiu 100 procent pacjentów w ostatnim roku.", [2] = "Otrzymujesz tę nagrodę, aby uczcić niską liczbę zgonów w twoim szpitalu w tym roku. Świetna robota.", [3] = "Śmiertelność w twoim szpitalu w ubiegłym roku była niższa niż w innych szpitalach. Proszę, przyjmij tę nagrodę.", [4] = "Dzięki twojemu talentowi poziom zgonów nie przekroczył minimum. Możesz być z siebie dumny.", }, regional = { [1] = "Śmiertelność w twoim szpitalu w ubiegłym roku była niższa niż w innych szpitalach. Proszę, przyjmij tę nagrodę.", }, }, rats_killed = { trophies = { [1] = "Przyznano ci Trofeum Anty-Szkodnik za zeszłoroczny odstrzał %d szczurów w twoim szpitalu.", [2] = "Zakwalifikowano cię do trofeum z Federacji Przeciw Szczurom i Myszom, dzięki twym wyjątkowym umiejętnościom w wystrzeleniu %d tych stworzeń.", [3] = "Zakwalifikowałeś się do otrzymania Trofeum Wysadzić-Szczura za niebywałą umiejętność likwidacji %d szczurów w szpitalu w zeszłym roku.", }, awards = { }, }, happy_staff = { trophies = { [1] = "Zostałeś nagrodzony Radosnym Trofeum za utrzymanie szczęśliwym ciężko pracującego personelu.", [2] = "Instytut Szczęścia nagrodził cię, za brak niezadowolonego personelu w twoim szpitalu w ciągu ostatniego roku.", [3] = "To trofeum, Więcej Radości jest niniejszym wręczone tobie, za utrzymanie zadowolonego personelu podczas ostatniego roku. Uśmiechajcie się wszyscy!", }, awards = { [1] = "Twoi pracownicy fundują ci tę nagrodę. Mówią, że można wprowadzić jeszcze kilka usprawnień, ale ogólnie jest dobrze.", [2] = "Twój pracownicy są tak zadowoleni, że uśmiech nie schodzi im z ust. Jesteś wyśmienitym menadżerem.", }, penalty = { [1] = "Twój personel nie kryje faktu, że jest bardzo niezadowolony. Dobrzy pracownicy to skarb. Uszczęśliw ich albo dużo na tym stracisz.", }, regional_good = { [1] = "Twój personel jest szczęśliwszy niż w innych szpitalach. Zadowolona załoga oznacza większe profity i mniej zgonów.", }, regional_bad = { [1] = "Twoi pracownicy podczas ostatniego roku byli bardzo przygnębieni. Powinieneś był to zauważyć. Każdy inny szpital ma szczęśliwszych pracowników niż twój.", }, }, healthy_plants = { awards = { [1] = "Gratulacje z okazji wygrania nagrody Jak Na Drożdżach za utrzymywanie roślin w dobrym stanie przez ostatni rok.", }, trophies = { [1] = "Przyjaciele Roślin Doniczkowych fundują ci Zielone Trofeum Zdrowia za utrzymanie roślin w dobrym stanie przez ostatni rok.", [2] = "Od Słodkich Rosiczek otrzymujesz Trofeum Wielkiego Ogrodnika za utrzymanie szpitalnych roślin w rewelacyjnej kondycji przez ostatni rok.", }, }, sold_drinks = { trophies = { [1] = "Światowe Stowarzyszenie Dentystów ma zaszczyt przyznać ci trofeum i odznakę za wysoką sprzedaż napojów w puszkach w twoim szpitalu.", [2] = "Twój szpital otrzymał nagrodę Gazowanego Zeusa Handlu Detalicznego za sprzedaż dużej liczby napojów w ostatnim roku.", [3] = "W imieniu kompanii Plomba Bomba Inc, otrzymujesz to pokryte czekoladą trofeum, aby uczcić niezwykle wysoką tegoroczną sprzedaż napojów w twoim szpitalu.", }, awards = { }, }, many_cured = { trophies = { [1] = "Za wyleczenie ogromnej liczby ludzi w ciągu ostatniego roku, Międzynarodowa Fundacja Zdrowia chce uhonorować cię Trofeum WieloLecz.", [2] = "Za wyleczenie znacznego odsetka pacjentów odwiedzających twój szpital w ciągu ostatniego roku, przyznano ci Płukankowe Trofeum Nie Chorobom!", [3] = "Za wyleczenie znacznego odsetka pacjentów odwiedzających twój szpital w ciągu ostatniego roku, przyznano ci Płukankowe Trofeum Nie Chorobom!", }, penalty = { [1] = "Twój szpital zawodzi w skutecznym niesieniu pomocy potrzebującym. Skoncentruj się na większej wydajności w leczeniu ludzi.", [2] = "Twój szpital jest mniej efektywny w leczeniu niż jakikolwiek inny. Zawiodłeś Ministerstwo i zawiodłeś samego siebie. Nic więcej nie mamy do powiedzenia.", }, awards = { [1] = "Gratulacje! Zdobywasz Nagrodę Marii Curie za wyleczenie prawie wszystkich pacjentów twojego szpitala w ciągu ostatniego roku.", [2] = "Gratulacje za wyleczenie masy ludzi podczas ostatniego roku. Dużo pacjentów czuje się znacznie lepiej dzięki twojej pracy.", [3] = "Przyjmij tę nagrodę, za wyleczenie większej liczby pacjentów niż inne szpitale. Niebagatelny uczynek.", [4] = "Z zaszczytem wręczamy ci nagrodę za wyleczenie większej ilości pacjentów, niż wszystkie szpitale razem wzięte.", }, regional = { [1] = "Z zaszczytem wręczamy ci nagrodę za wyleczenie większej ilości pacjentów, niż wszystkie szpitale razem wzięte.", }, }, pop_percentage = { awards = { [1] = "Wiedz, że twój szpital w zeszłym roku odwiedziło bardzo dużo ludzi. Dobra robota.", [2] = "Gratulacje. Liczba miejscowej ludności odwiedzającej twój szpital w zeszłym roku była dużo wyższa niż gdzie indziej.", [3] = "Wspaniale. Zwabiłeś więcej populacji do swojego szpitala, niż było odwiedzających we wszystkich innych szpitalach razem.", }, penalty = { [1] = "Bardzo mało ludzi odwiedziło twój szpital w tym roku. Aby zarabiać pieniądze, ta instytucja potrzebuje pacjentów.", [2] = "Każdy szpital w tej okolicy zdołał przyjąć większą liczbę pacjentów, niż twój. Powinieneś się wstydzić.", }, }, research = { regional_good = { [1] = "Dzięki badaniom naukowym twój szpital przoduje w nowoczesności. Twój sztab naukowy zasłużył na tę nagrodę. Świetnie.", }, penalty = { [1] = "Nie radziłeś sobie z wynajdowaniem nowych kuracji, urządzeń i leków. To niedobrze, gdyż postęp technologiczny jest niezwykle ważny.", }, regional_bad = { [1] = "Jesteś najsłabszy w okolicy pod względem badań naukowych. Ministerstwo jest wściekłe, ponieważ powinno ci na tym szczególnie zależeć.", }, awards = { [1] = "Dzięki badaniom naukowym twój szpital przoduje w nowoczesności. Twój sztab naukowy zasłużył na tę nagrodę. Świetnie.", [2] = "Podczas ostatniego roku wynalazłeś więcej leków i sprzętu, niż ktokolwiek mógł przypuszczać. Proszę, przyjmij tę nagrodę od całego Ministerstwa.", }, }, reputation = "REPUTACJA", cash = "GOTÓWKA", } menu_list_window = { save_date = "Utworzony", name = "Nazwa", back = "Wróć", } menu_options_volume = { [50] = " 50% ", [100] = " 100% ", [30] = " 30% ", [60] = " 60% ", [90] = " 90% ", [10] = " 10% ", [20] = " 20% ", [40] = " 40% ", [80] = " 80% ", [70] = " 70% ", } menu_file_load = { [1] = " GRA 1 ", [2] = " GRA 2 ", [3] = " GRA 3 ", [4] = " GRA 4 ", [5] = " GRA 5 ", [6] = " GRA 6 ", [7] = " GRA 7 ", [8] = " GRA 8 ", } menu_file = { quit = " (%1%) WYJDŹ ", save = " (%1%) ZAPISZ ", load = " (%1%) WCZYTAJ ", restart = " (%1%) ZACZNIJ OD NOWA ", } rooms_long = { ultrascan = "Ultraskaner", research_room = "Dział Badawczy", general = "Ogólne", gps_office = "Gabinet Lekarski", inflation = "Napowietrzalnia", staffroom = "Pokój Socjalny", jelly_vat = "Galaretownica", scanner = "Skaner", emergency = "Nagły Wypadek", decontamination = "Gabinet Odkażania", corridors = "Korytarz", cardiogram = "Kardiograf", ward = "Oddział", training_room = "Sala Szkoleniowa", psychiatric = "Psychiatra", operating_theatre = "Sala Operacyjna", dna_fixer = "Re-GEN-erator", tongue_clinic = "Przych. Obrzynania", hair_restoration = "Przeszczepiacz Włosów", general_diag = "Podst. Badania", pharmacy = "Apteka", fracture_clinic = "Gab. Ortopedyczny", toilets = "Toalety", electrolysis = "Gabinet Elektrolizy", x_ray = "Rentgen", blood_machine = "Analizator Krwi", } save_game_window = { caption = "Zapisz Grę (%1%)", new_save_game = "Nowy Zapis", } fax = { epidemic_result = { fine_amount = "Rząd ogłosił stan zagrożenia i nałożył na ciebie grzywnę %d.", close_text = "Hura!", hospital_evacuated = "Komisja Zdrowia nie miała wyboru i postanowiła ewakuować twój szpital.", succeeded = { part_1_name = "Inspektor Zdrowia usłyszał plotki, że twoja instytucja miała do czynienie ze złą sytuacją z %s.", part_2 = "Jednakże nie dał rady znaleźć dowodów potwierdzających te plotki.", }, compensation_amount = "Rząd postanowił wypłacić ci odszkodowanie %d za oszczerstwa, które naruszyły dobre imię twojego szpitala.", failed = { part_1_name = "Usiłujesz ukryć fakt zetknięcia się z zaraźliwym wybuchem %s", part_2 = "Twój personel spowodował, że choroba przeszła na ludność żyjącą w pobliżu szpitala.", }, rep_loss_fine_amount = "Prasa będzie miała używanie w związku z tą sprawą, która poważnie zszarga twoją reputację. Poza tym dostaniesz grzywnę %d.", }, vip_visit_query = { choices = { invite = "Wyślij VIPowi Oficjalne Zaproszenie .", refuse = "Spróbuj zbyć VIPa jakąś wymówką.", }, vip_name = "%s wyraził chęć odwiedzenia twojego szpitala", }, vip_visit_result = { telegram = "Telegram!", remarks = { good = { [1] = "Doskonale zarządzany szpital. Dziękuję, że mnie tu zaprosiłeś.", [2] = "Hmm. Całkiem niezła placówka służby zdrowia.", [3] = "Podobał mi się twój czarujący szpital. No dobrze, idzie ktoś na tajskie curry?", }, super = { [1] = "Cóż za fantastyczny szpital. Jeśli poważnie zachoruję, przywieźcie mnie tutaj.", [2] = "To jest dopiero szpital!", [3] = "Super szpital. A wiem co mówię, bo już ich trochę widziałem.", }, bad = { [1] = "Po co sobie zawracałem głowę? To było gorsze, niż oglądanie czterogodzinnej opery!", [2] = "Odrażający widok. To ma być szpital?! Chyba raczej chlew!", [3] = "Jako osoba publiczna mam już dosyć odwiedzania takich nor jak ta! Rezygnuję.", }, free_build = { [1] = "Masz tu bardzo ładny szpital! Nie trudno się go prowadzi bez ograniczeń finansowych czyż nie?", [2] = "Nie jestem ekonomistą ale wydaje mi się, że też mógłbym poprowadzić ten szpital, jeżeli wiesz o czym mówię...", [3] = "Bardzo dobrze prowadzony szpital. Pamiętaj jednak o recesji! Racja... nie musisz się o to martwić.", }, mediocre = { [1] = "No cóż, widywałem gorsze, ale powinieneś się bardziej postarać.", [2] = "Ojej. Jeśli kiepsko się czujesz, to nie jest miejsce dla ciebie.", [3] = "Szczerze mówiąc, to zwyczajny szpital. Oczekiwałem czegoś więcej.", }, very_bad = { [1] = "Co za melina. Zrobię co w mojej mocy, żeby ją zamknęli.", [2] = "Skandal! W życiu nie widziałem tak koszmarnego szpitala. ", [3] = "Jestem w szoku. Tego nie da się nazwać szpitalem! Idę na piwo.", }, }, rep_boost = "Twoja reputacja w środowisku umocniła się.", vip_remarked_name = "Po wizycie w twoim szpitalu %s zdecydował:", cash_grant = "Otrzymasz dotację w wysokości %d.", rep_loss = "Dlatego też twoja reputacja ucierpiała.", close_text = "Dziękuję za odwiedzenie szpitala.", }, disease_discovered_patient_choice = { need_to_build = "Musisz zbudować %s, aby sobie z tym poradzić.", need_to_employ = "Zatrudnij %s żeby poradzić sobie z tą sytuacją.", what_to_do_question = "Co chcesz zrobić z pacjentem?", guessed_percentage_name = "Twoja ekipa musiała domyślać się przypadłości pacjenta. Jest %d procent szans, że to jest %s", choices = { send_home = "Wypisz Pacjenta do domu.", research = "Wyślij pacjenta do Działu Badawczego.", wait = "Każ Pacjentowi zaczekać chwilę w szpitalu.", }, disease_name = "Twoja ekipa odkryła nową dolegliwość: %s", need_to_build_and_employ = "Jeżeli zbudujesz %s i zatrudnisz %s możesz osiągnąć cel.", can_not_cure = "Nie możesz wyleczyć tej choroby.", }, emergency_result = { earned_money = "Mogłeś otrzymać maksymalnie %d, zarobiłeś %d.", close_text = "Kliknij, aby wyjść.", saved_people = "Uratowałeś %d ludzi z %d poszkodowanych.", }, disease_discovered = { discovered_name = "Twoja ekipa odkryła nową dolegliwość: %s", need_to_employ = "Zatrudnij %s, aby poradzić sobie z tym kryzysem.", need_to_build_and_employ = "Jeżeli zbudujesz %s i zatrudnisz %s możesz osiągnąć cel.", need_to_build = "Musisz zbudować %s, aby sobie z tym poradzić.", close_text = "Dokonano odkrycia.", can_cure = "Możesz wyleczyć tę chorobę.", }, emergency = { locations = { [1] = "Palmiarni Rośliny Chemiczne Rosiczka", [2] = "Lipnym Uniwersytecie", [3] = "Centrum Ogrodniczym Parakwiat", [4] = "Instytucie Naukowym Niebezpieczne Substancje", [5] = "Zajeździe Od Zmierzchu do Świtu", [6] = "Knajpie pod Żabą i Bykiem", [7] = "Salonie Pogrzebowym i Sklepie Monopolowym Radość", [8] = "Tajskim Sklepie z Curry", [9] = "Imperium Używana Petrochemia", }, num_disease = "Jest %d ludzi z %s wymagających natychmiastowej pomocy.", cure_possible_drug_name_efficiency = "Już masz niezbędny sprzęt i umiejętności. Masz lek, którego potrzebują. To %s, a lek jest skuteczny w %d procentach.", cure_not_possible_employ = "Musisz zatrudnić %s", free_build = "Jeżeli ci się powiedzie, twoja reputacja wzrośnie, jeżeli jednak zawiedziesz, twoja reputacja poważnie ucierpi.", cure_not_possible = "W tej chwili nie możesz wyleczyć tej choroby.", num_disease_singular = "Jest 1 osoba z %s i wymaga natychmiastowej pomocy..", cure_possible = "Masz odpowiedni sprzęt i umiejętności, więc powinieneś poradzić sobie z tym nagłym wypadkiem.", choices = { accept = "Tak, jestem gotowy przyjąć nagły wypadek. ", refuse = "Nie, odmawiam przyjęcia nagłego wypadku.", }, location = "W %s miał miejsce wypadek", cure_not_possible_build = "Musisz zbudować %s", cure_not_possible_build_and_employ = "Musisz zbudować %s i zatrudnić %s", bonus = "Za przyjęcie tego wypadku dostaniesz maksymalną premię w wysokości %d. Jeżeli zawiedziesz, twoja reputacja poważnie ucierpi.", }, choices = { decline_new_level = "Kontynuuj grę jeszcze chwilę", accept_new_level = "Przejdź do następnego poziomu", return_to_main_menu = "Wróc do głównego menu", }, debug_fax = { text4 = "PARAMETRY : LEKARZE %d PIELĘGNIARKI %d OBSZAR %d POKOJE %d CENNIK %d", text5 = "WKŁAD : LEKARZE %d PIELĘGNIARKI %d OBSZAR %d POKOJE %d CENNIK %d PROCENT", text3 = "LICZBY : LEKARZE %d PIELĘGNIARKI %d OBSZAR %d POKOJE %d CENNIK %d", text9 = "KATASTROFY %d DOZWOLONE (MIES) %d (%d)REDUKCJA %d", close_text = "Tak, tak, tak!", text1 = "NAJLEPSZY WYNIK %d", text6 = "NASTĘPUJĄCE PARAMETRY RÓWNIEŻ SĄ LICZONE", text8 = "UŁATWIENIA %d PORADY %d REDUKCJA %d", text2 = "SUMA LUDZI W SZPITALU %d PORÓWNUJĄC DO %d", text10 = "ZGONY %d DOZWOLONE (MIES) %d (%d) REDUKCJA %d", text11 = "LUDZI W TYM MIES %d", text7 = "REPUTACJA: %d OCZEKIWANA %d REDUKCJA %d", }, epidemic = { cover_up_explanation_1 = "Jeśli jednak spróbujesz to zataić, dostaniesz limit czasu na wyleczenie wszystkich pacjentów, nim o sprawie dowiedzą się władze.", cover_up_explanation_2 = "Jeżeli Inspektor Zdrowia przeprowadzi wizytację i odkryje epidemię, może powziąć zdecydowane kroki przeciwko tobie.", choices = { cover_up = "Wylecz wszystkich zainfekowanych pacjentów w wyznaczonym czasie, nim ktokolwiek opuści szpital.", declare = "Ogłoś Epidemię. Zapłać karę i przyjmij cios w reputację.", }, disease_name = "Twoi Lekarze odkryli zaraźliwy szczep wirusa: %s.", declare_explanation_fine = "Jeżeli ogłosisz epidemię, zapłacisz karę %d, ucierpi twoja reputacja i wszyscy pacjenci zostaną zaszczepieni automatycznie.", }, diagnosis_failed = { choices = { send_home = "Wypisz Pacjenta do domu.", take_chance = "Podejmij ryzyko leczenia.", wait = "Zatrzymaj pacjenta, aż wybudujesz więcej gabinetów diagnostycznych.", }, situation = "Próbowaliśmy wszystkich urządzeń na tym pacjencie i nadal nie jesteśmy pewni co mu dolega.", what_to_do_question = "Co powinniśmy zrobić z pacjentem?", partial_diagnosis_percentage_name = "Jest %d procent szans, że zidentyfikowaliśmy jaki typ %s dolega pacjentowi.", }, } drug_companies = { [1] = "U Goździkowej", [2] = "Proszki i Groszki", [3] = "Harda Pigułka i Spółka", [4] = "Ropiejący Czopek S.A.", [5] = "MegaProch Corp.", } humanoid_name_ends = { [1] = "SMITH", [2] = "WICK", [3] = "CLIFFE", [4] = "SON", [5] = "INGTON", [6] = "BURY", [7] = "TON", [8] = "SON", [9] = "LEY", [10] = "BERRY", [11] = "BAUM", [12] = "LAN", [13] = "HAM", [14] = "SILL", [15] = "WIN", [16] = "LET", [17] = "ERS", [18] = "TON", [19] = "MOND", [20] = "MAN", [21] = "ELTON", [22] = "E", [23] = "MORE", [24] = "MOOR", [25] = "LET", [26] = "LIN", } menu_debug_overlay = { heat = " TEMPERATURA ", byte_0_1 = " BYTE 0 & 1 ", byte_6 = " BYTE 6 ", flags = " FLAGS ", byte_7 = " BYTE 7 ", byte_5 = " BYTE 5 ", byte_floor = " BYTE FLOOR ", positions = " POSITIONS ", byte_w_wall = " BYTE W WALL ", parcel = " PARCEL ", byte_n_wall = " BYTE N WALL ", none = " NONE ", } confirmation = { abort_edit_room = "W chwili obecnej budujesz lub edytujesz gabinet. Jeżeli wszystkie wymagane obiekty są w nim umieszczone, będzie on ukończony, w przeciwnym razie zostanie on usunięty. Czy na pewno chcesz kontynuować?", return_to_blueprint = "Czy na pewno chcesz powrócić do trybu Projektowania?", restart_level = "Czy na pewno chcesz rozpocząć poziom od początku?", delete_room = "Czy na pewno chcesz usunąć ten gabinet?", quit = "Wybrałeś wyjście z gry. Czy na pewno chcesz zakończyć grę?", needs_restart = "Zmiana tego ustawienia wymaga ponownego uruchomienia CorsixTH. Wszystkie niezapisane postępy zostaną utracone. Czy na pewno chcesz kontynuować?", overwrite_save = "Masz tu już zapisaną grę. Czy na pewno chcesz ją nadpisać?", sack_staff = "Czy na pewno chcesz zwolnić tę osobę?", replace_machine = "Czy na pewno chcesz wymienić %s za %d PLN?", } months = { [1] = "sty", [2] = "lut", [3] = "mar", [4] = "kwi", [5] = "maj", [6] = "cze", [7] = "lip", [8] = "sie", [9] = "wrz", [10] = "paź", [11] = "lis", [12] = "gru", } dynamic_info = { patient = { emergency = "Nagły wypadek: %s", guessed_diagnosis = "Odgadnięta diagnoza: %s ", diagnosis_progress = "Postęp diagnozy", actions = { sent_to_other_hospital = "Odesłany gdzie indziej", prices_too_high = "Twoje ceny są za wysokie - idę do domu", no_gp_available = "Czekam, aż zbudujesz Gabinet Lekarski", waiting_for_treatment_rooms = "Czekam, aż zbudujesz gabinet, w którym mnie wyleczysz", dying = "Umiera!", no_diagnoses_available = "Brak możliwości dalszej diagnozy - idę do domu", epidemic_sent_home = "Odesłany do domu przez Inspektora", cured = "Wyleczony!", waiting_for_diagnosis_rooms = "Czekam, aż zbudujesz więcej gabinetów diagnostycznych", epidemic_contagious = "Jestem zakażony", awaiting_decision = "Czeka na twoją decyzję", sent_home = "Wypisany do domu", fed_up = "Ma dosyć i wychodzi", no_treatment_available = "Brak możliwości leczenia - idę do domu", on_my_way_to = "W drodze do %s", queueing_for = "W kolejce do %s", }, diagnosed = "Zdiagnozowano: %s ", }, health_inspector = "Inspektor Zdrowia", vip = "Wizytator - VIP", object = { times_used = "Liczba użyć %d", queue_size = "Długość kolejki %d", strength = "Wytrzymałość %d", queue_expected = "Spodziewana kolejka %d", }, staff = { ability = "Umiejętności", psychiatrist_abbrev = "Psych.", actions = { going_to_repair = "Idzie naprawić %s", fired = "Fired", waiting_for_patient = "Czeka na pacjenta", wandering = "Chodzi w kółko bez celu", heading_for = "Zmierza do %s", }, tiredness = "Zmęczenie", }, } introduction_texts = { level17 = "Ostatnia rada - dbaj o Reputację - to ona przyciąga lub zniechęca do twojej placówki pacjentów z całej okolicy. " .. "Jeśli tylko uda ci się nie zabić zbyt wielu ludzi i będą oni w miarę zadowoleni, nie powinieneś mieć problemów z tym poziomem!//" .. "Teraz już musisz radzić sobie sam. Życzę powodzenia.", level1 = "Witaj w swoim pierwszym szpitalu!//" .. "Aby rozpocząć działalność, postaw Biurko Recepcji, zbuduj Gabinet Lekarski i zatrudnij Recepcjonistkę oraz Lekarza. " .. "Następnie zaczekaj, aż pojawią się kolejne zadania. " .. "Dobrym pomysłem jest budowa Gabinetu Psychiatrycznego oraz zatrudnienie Lekarza Psychiatry. " .. "Apteka i Pielęgniarka są także niezbędne w leczeniu pacjentów. " .. "Zwróć uwagę na ciężkie przypadki Głowowzdęcia - Napowietrzalnia rozwiąże ten problem. " .. "Będziesz musiał wyleczyć 10 ludzi i upewnić się, że twoja reputacja nie spadnie poniżej 200.", level9 = "Skoro już wzbogaciłeś konto Ministerstwa oraz ufundowałeś nową limuzynę samemu Ministrowi, możesz wracać do szpitala i nieść pomoc chorym i potrzebującym. " .. "Tutaj napotkasz wiele różnych trudności. " .. "Z dobrze wyszkolonym personelem i gabinetami, nie powinieneś się niczego obawiać. " .. "Twój szpital musi być wart 200,000 PLN, a na konto ma trafić 400,000 PLN. " .. "Ani grosza mniej, bo nie ukończysz poziomu.", level2 = "Na tym obszarze jest dużo więcej rodzajów schorzeń. " .. "Urządź swój szpital tak, aby przyjął więcej pacjentów oraz zaplanuj budowę Działu Badawczego. " .. "Pamiętaj o utrzymywaniu czystości i postaraj się o możliwie najwyższą reputację - będziesz miał do czynienia z chorobami takimi jak Obwisły Język, więc potrzebujesz Przychodni Obrzynania. " .. "Możesz także zbudować Kardiograf, aby lepiej diagnozować nowe choroby. " .. "Oba te gabinety muszą zostać wynalezione zanim będziesz mógł je zbudować. Teraz możesz także kupić dodatkowy grunt, aby rozwinąć swój szpital - w tym celu użyj Mapy Miasta. " .. "Twój cel to reputacja na poziomie 300, stan konta 10000 PLN, i 40 wyleczonych osób.", level7 = "Będziesz tu pod ścisłym nadzorem Ministerstwa Zdrowia, dopilnuj więc by twoje konto wykazywało duże zyski, a reputacja szybowała w górę. " .. "Nie stać nas na niepotrzebne zgony - nie służy to biznesowi. " .. "Upewnij się, że personel jest w dobrej formie i że masz wszystkie wymagane urządzenia. " .. "Wypracuj reputację 600 oraz 200,000 PLN na koncie.", level5 = "To będzie szpital pełen życia, leczący wiele różnych dolegliwości. " .. "Twoi Lekarze dopiero skończyli studia, więc trzeba będzie wybudować salę szkoleniową, aby zdobyli niezbędne kwalifikacje. " .. "Masz tylko trzech Konsultantów szkolących twój personel. Dbaj więc o to, by byli zadowoleni. " .. "Zauważ także, że fundamenty szpitala znajdują się na uskoku tektonicznym San Android. " .. "Występuje tu duże ryzyko trzęsień ziemi. " .. "Trzęsienia mogą w znacznym stopniu uszkodzić urządzenia i zakłócić pracę szpitala. " .. "Aby odnieść sukces, dociągnij reputację do 400, zgromadź w banku okrągłe 50,000 PLN i wylecz 200 pacjentów.", level4 = "Staraj się zadowolić swych pacjentów, obłsuguj ich najlepiej jak potrafisz, utrzymaj również liczbę zgonów na absolutnym minimum." .. "Stawką jest twoja reputacja, więc dopilnuj żeby osiągnęła wysoki poziom. " .. "Nie martw się za bardzo o pieniądze - uzyskasz je wraz z rosnącą reputacją. " .. "Będziesz też mógł szkolić swoich Lekarzy, aby zwiększać ich umiejętności. " .. "Wyszkolony personel będzie lepiej zajmować się pacjentami, którzy wyglądają na ciężej chorych niż pozostali. " .. "Osiągnij reputację na poziomie ponad 500.", level14 = "Jest jeszcze jedno wyzwanie - totalnie niespodziewany szpital niespodzianka. " .. "Jeżeli tutaj odniesiesz sukces, będziesz zwycięzcą wszech czasów. " .. "Tylko nie myśl, że to będzie bułka z masłem, ponieważ jest to najtrudniejsze zadanie jakiemu stawisz czoła. " .. "Powodzenia!", level15 = "Tak wyglądają podstawowe mechanizmy działalności szpitala.//" .. "Twoi Lekarze będą potrzebować wszelkiej możliwej pomocy do diagnozowania niektórych pacjentów. Możesz im pomóc budując " .. "kolejne obiekty, takie jak Gabinet Badań Podstawowych.", level8 = "Do ciebie należy zadanie urządzenia wydajnego i opłacalnego szpitala. " .. "Ludzie tutaj są dość zamożni, więc oskub ich z forsy jak tylko się da. " .. "Miło jest leczyć ludzi, ale pamiętaj, że tak naprawdę liczą się PIENIĄDZE. " .. "Wyczyść tych chorych ludzi z pieniędzy. " .. "Aby ukończyć ten poziom, zgromadź sumę 300,000 PLN.", level13 = "Twoje niewiarygodne umiejętności w administrowaniu szpitala zwróciły uwagę Trzeciego Wydziału Tajnych Służb Specjalnych. " .. "Mają dla ciebie ekstra zadanie: w szpitalu zaatakowanym przez szczury potrzeba Terminatora. " .. "Musisz ustrzelić tyle szczurów, ile zdołasz, zanim Dozorcy uprzątną bałagan. " .. "Myślisz, że poradzisz sobie z zadaniem?", demo = "Witaj w szpitalu demonstracyjnym!//" .. "Niestety wersja demo zawiera tylko ten poziom. Jednakże, jest to więcej niż wystarczająco, aby zając ci trochę czasu! " .. "Napotkasz tutaj rozmaite choroby, które będą wymagały różnych gabinetów do ich wyleczenia. Od czasu do czasu moga tu również wystąpić nagłe wypadki. Będziesz musiał równiez wynaleźć nowe pomieszczenia przy użyciu gabinetu badawczego. " .. "Twoim celem jest zarobienie 100,000 PLN, mieć szpital warty 70,000 PLN i reputację 700, przy czym musisz wyleczyć co najmniej 75% swoich pacjentów. " .. "Upewnij się, że Twoja reputacja nie spadnie poniżej 300 oraz, że nie zabijesz więcej niż 40% pacjentów, albo przegrasz.//" .. "Powodzenia!", level16 = "Kiedy już przebadasz część pacjentów, będziesz musiał zbudować pomieszczenia lecznicze oraz przychodnie, aby ich leczyć - " .. "dobrze jest zacząć od budowy Apteki. Do wydawania leków w Aptece będzie potrzebna Pielęgniarka .", level6 = "Użyj całej swojej wiedzy, aby gładko poprowadzić szpital, który przyniesie dobry zysk i poradzi sobie ze wszystkim, co przyniesie mu chore społeczeństwo. " .. "Powinieneś uważać na panujący tu klimat, gdyż sprzyja on rozwojowi bakterii i infekcji. " .. "Jeśli nie utrzymasz tego miejsca we wzorowej czystości, musisz się liczyć z wybuchem epidemii wśród pacjentów. " .. "Powinieneś zarobić 150,000 PLN a twój szpital osiągnąć wartość co najmniej 140,000 PLN.", level12 = "Masz teraz do czynienia z matką wszystkich wyzwań. " .. "Zachwycone twoimi sukcesami Ministerstwo ma dla ciebie zadanie specjalne. Masz zbudować kolejny wspaniały szpital, zarobić bajeczną ilość kasy i zyskać gigantyczną reputację. " .. "Musisz także wykupić wszystkie możliwe grunty, wyleczyć wszystko (tak - wszystko) oraz zgarnąć wszystkie nagrody. " .. "I jak? Dasz radę?" .. "Zarób 650,000 PLN, wylecz 750 ludzi oraz osiągnij reputację 800, aby wygrać.", level3 = "Tym razem urządzisz swój szpital w zamożej okolicy. " .. "Ministerstwo Zdrowia ma nadzieję, że osiągniesz tu znaczne zyski. " .. "Musisz wypracować dobrą reputację, jednak gdy szpital będzie już działał, skoncentruj się na zarabianiu tak dużo, jak tylko możliwe. " .. "Prawdopodobnie wystąpią tu też Nagłe Wypadki. " .. "Mają miejsce, gdy do szpitala przybywa duża grupa ludzi z tą samą dolegliwością. " .. "Wyleczenie ich wszystkich przed upływem czasu podnosi twoją reputację i zapewnia premię. " .. "Mogą wystąpić choroby takie jak Syndrom Króla. Przeznacz więc pieniądze na budowę Sali Operacyjnej z Oddziałem tuż obok. " .. "Aby stanąć na wysokości zadania, zarób 20,000 PLN.", level10 = "Ministerstwo prosi, abyś poza leczeniem chorób typowych dla tych stron, poświęcił nieco czasu na poprawę skuteczności leków. " .. "Zrzeszenie Pacjentów Bolibrzuch zgłosiło kilka krytycznych uwag. Nie daj im powodów do skarg i dopilnuj, by leki były jak najskuteczniejsze. " .. "Nikt nie powinien też czynić zarzutów samemu szpitalowi. Zmniejsz poziom umieralności. " .. "Dobrze będzie, jeśli zarezerwujesz trochę miejsca na Galaretownicę. " .. "Aby wygrać, udoskonal wszystkie leki do 80% skuteczności, zdobądź reputację 650 i zbierz w banku 500,000 PLN. ", level11 = "Dostałeś szansę budowy szpitala najdoskonalszego ze wszystkich. " .. "W tej niezwykle renomowanej okolicy Ministerstwo chciałoby mieć szpital najlepszy z możliwych. " .. "Oczekujemy, że zarobisz mnóstwo pieniędzy, zyskasz znakomitą reputację i poradzisz sobie ze wszelkimi ewentualnościami. " .. "To jest bardzo ważna robota. " .. "Będziesz musiał naprawdę się czymś wyróżnić. " .. "Trzeba ci wiedzieć, że w tych okolicach widywane jest UFO. Twój personel powinien być przygotowany na niespodziewanych gości. " .. "Warunki wygranej to: wartość szpitala 240,000 PLN, 500,000 PLN na koncie i reputacja na poziomie co najmniej 700.", level18 = "", } humanoid_name_starts = { [1] = "GOLD", [2] = "HIGH", [3] = "AND", [4] = "BEN", [5] = "BAN", [6] = "BILL", [7] = "WY", [8] = "WAT", [9] = "POD", [10] = "KING", [11] = "BAR", [12] = "PET", [13] = "MAN", [14] = "BOY", [15] = "WAR", [16] = "JACK", [17] = "CRAB", [18] = "FISH", [19] = "WATER", [20] = "MIL", [21] = "BY", [22] = "FEN", [23] = "RICH", [24] = "SCOT", [25] = "BUR", [26] = "PIKE", [27] = "CUR", [28] = "WHIT", [29] = "BINN", [30] = "BONN", [31] = "POG", [32] = "WRIGHT", [33] = "KER", } transactions = { severance = "Odprawa", research = "Koszty Badań", eoy_trophy_bonus = "Trofeum za Cały Rok", buy_object = "Zakup Przedmiotu", cure_colon = "Wyleczony:", epidemy_coverup_fine = "Kara za Tuszowanie Epidemii", final_treat_colon = "Końcowe Leczenie:", jukebox = "Dochody: Szafa Grająca", loan_interest = "Koszty Pożyczki", overdraft = "Koszty Debetu", wages = "Wypłaty", loan_repayment = "Spłata Pożyczki", personal_bonus = "Premia Indywidualna", drug_cost = "Koszty Leków", cure = "Leczenie", heating = "Koszty Ogrzewania", treat_colon = "Leczenie:", compensation = "Odszkodowanie Rządowe", epidemy_fine = "Kara za Epidemię", buy_land = "Kupno Terenu", research_bonus = "Premia za Badania", general_bonus = "Premia Ogólna", deposit = "Depozyt Leczenia", eoy_bonus_penalty = "Premia/Kara za Cały Rok", cheat = "Kasa za Przekręty", drinks = "Dochody: Automaty do Napoi", vaccination = "Szczepienie", advance_colon = "Awans:", vip_award = "Nagroda Pieniężna od VIPa", hire_staff = "Zatrudnienie Personelu", bank_loan = "Pożyczka Bankowa", machine_replacement = "Koszt Wymiany Urządzeń", emergency_bonus = "Premia za Nagłe Wypadki", build_room = "Budowa Pomieszczenia", insurance_colon = "Ubezp. :", sell_object = "Sprzedaż Obiektu", } object = { chair = "Krzesło", litter = "Śmieci", sofa = "Sofa", operating_table = "Stół Operacyjny", bed2 = "Łóżko", bench = "Ławka", scanner = "Skaner", couch = "Kozetka", blood_machine = "Analizator Krwi", table1 = "Stół", video_game = "Gra Wideo", lamp = "Lampa", op_sink2 = "Zlew", door = "Drzwi", auto_autopsy = "Auto Autopsja", reception_desk = "Biurko Recepcji", hair_restorer = "Przeszczepiacz", projector = "Projektor", crash_trolley = "Wózek Lekarski", tv = "Telewizor", ultrascanner = "Ultraskaner", surgeon_screen = "Parawan", litter_bomb = "Bomba Śmieciowa", inflator = "Napowietrzacz", table2 = "Stół", desk = "Biurko", pool_table = "Bilard", x_ray_viewer = "Monitor", radiation_shield = "Komputer Sterujący", bed = "Łóżko", swing_door2 = "Drzwi obrotowe", console = "Konsola", op_sink1 = "Zlew", bookcase = "Biblioteczka", drinks_machine = "Automat do napoi", comfortable_chair = "Fotel", skeleton = "Szkielet", computer = "Komputer", bin = "Śmietnik", pharmacy_cabinet = "Szafka z Lekami", radiator = "Kaloryfer", cast_remover = "Usuwacz Gipsu", atom_analyser = "Analizator Atomów", plant = "Rośliny", jelly_moulder = "Galaretownica", cardio = "Kardiograf", toilet = "Toalety", electrolyser = "Elektrolizer", fire_extinguisher = "Gaśnica", bed3 = "Łóżko", swing_door1 = "Drzwi obrotowe", lecture_chair = "Krzesło ucznia", screen = "Parawan", toilet_sink = "Zlew", shower = "Prysznic", gates_of_hell = "Bramy Piekieł", entrance_right = "Prawe drzwi wejściowe", entrance_left = "Lewe drzwi wejściowe", slicer = "Krajalnica", dna_fixer = "Re-GEN-erator", x_ray = "Rentgen", cabinet = "Szafka z aktami", } letter = { [1] = { [1] = "Drogi %s//", [2] = "Cudownie! Poradziłeś sobie wspaniale z prowadzeniem tego szpitala. My, grube ryby z Ministerstwa Zdrowia, chcemy wiedzieć czy byłbyś zainteresowany większym projektem. Mamy pracę, do której wydajesz się być wręcz stworzony. Wynagrodzenie będzie wynosiło %d PLN. Bądź łaskaw rozważyć naszą propozycję.//", [3] = "Czy jesteś zainteresowany pracą w Szpitalu %s?", }, [2] = { [1] = "Drogi %s//", [2] = "Wyśmienicie! Dokonałeś wielkiego postępu w swoim szpitalu. Chcielibyśmy przenieść cię w inne miejsce, o ile masz ochotę na zmianę scenerii oraz nowe wyzwania. Nie musisz się zgadzać, jednak to może być w sam raz coś dla ciebie. Oferujemy pensję w wysokości %d PLN//", [3] = "Czy chcesz pracę w Szpitalu %s?", }, [3] = { [1] = "Drogi %s//", [2] = "Przez ostatni czas bardzo pomyślnie zarządzałeś tą placówką. Uważamy, że możesz dokonać wielkich rzeczy i chcemy zaoferować ci pozycję w innym szpitalu. Twoja pensja wyniesie %d PLN. Jesteśmy przekonani, że pokochasz tamtejsze nowe wyzwania.//", [3] = "Czy chcesz przyjąć posadę w Szpitalu %s?", }, [4] = { [1] = "Drogi %s//", [2] = "Gratulacje! My w Ministerstwie, jesteśmy zachwyceni twoimi umiejętnościami. Prawdę mówiąc, cały Departament Zdrowia uważa cię za złotego chłopaka. Wydaje nam się jednak, że wolałbyś nieco większe wyzwanie. Oferujemy ci pensję w wysokości %d PLN, ale decyzja należy do ciebie.//", [3] = "Czy jesteś zainteresowany pracą dla Szpitala %s?", }, [5] = { [1] = "Drogi %s//", [2] = "Witamy ponownie. Respektujemy twoje życzenie, aby pozostać w tym uroczym szpitalu, jednak zachęcamy cię do zmiany decyzji. Zaoferujemy ci pensję w wysokości %dPLN, jeżeli odejdziesz do innego szpitala i dobrze go poprowadzisz.//", [3] = "Czy zechcesz się teraz przenieść do Szpitala %s?", }, [6] = { [1] = "Drogi %s//", [2] = "Witamy. Wiemy jak szczęśliwy jesteś w tej uroczej i świetnie prowadzonej instytucji, jednak powinieneś posunąć swą karierę do przodu. Za przeniesienie będziesz miał prawo żądać %d PLN wynagrodzenia. Co ty na to?//", [3] = "Czy zechcesz poprowadzić Szpital %s?", }, [7] = { [1] = "Drogi %s//", [2] = "Dzień dobry! Ministerstwo Zdrowia chce wiedzieć, czy zdecydowałbyś się opuścić obecny szpital. Zdajemy sobie sprawę, że jest on uroczy i wspaniale prowadzony. Wiemy jednak, że sprostałbyś większym wyzwaniom, za które dostałbyś pensję w wysokości %d PLN.//", [3] = "Czy akceptujesz stanowisko w Szpitalu %s?", }, [8] = { [1] = "Drogi %s//", [2] = "Witamy ponownie. Odpowiedziałeś negatywnie na list, w którym oferowaliśmy ci czołowe stanowisko w nowym Szpitalu, z wynagrodzeniem %d PLN. Wydaje nam się jednak, że powinieneś przemyśleć tę decyzję. Tak się składa, że mamy dla ciebie idealną pracę.//", [3] = "Czy przyjmiesz stanowisko w Szpitalu %s?", }, [9] = { [1] = "Drogi %s//", [2] = "Udowodniłeś, że jesteś najlepszym administratorem szpitala w całej historii medycyny. Tak wspaniałe osiągnięcie nie mogło zostać niezauważone, chcielibyśmy więc powierzyć ci stanowisko Naczelnego Szefa Wszystkich Szpitali. Z tą prestiżową posadą wiąże się pensja w wysokości %d PLN. Od teraz ludzie będą witali cię brawami i okazywali uznanie, gdziekolwiek byś się nie znalazł.//", [3] = "Dziękujemy za wszystko co zrobiłeś. Niech ci służy ta ciepła posadka.//", [4] = "", }, [10] = { [1] = "Drogi %s//", [2] = "Gratulujemy udanego kierowania wszystkimi placówkami jakie ci powierzyliśmy. Dzięki tak wspaniałym wynikom cały świat stoi przed tobą otworem. Oferujemy ci pensję w wysokości %d PLN oraz limuzynę. W zamian prosimy tylko, byś podróżował z miasta do miasta, spotykał się z wielbiącym cię społeczeństwem i promował ideę płatnego szpitalnictwa.//", [3] = "Jesteśmy z ciebie dumni. Nie ma wśród nas nikogo, kto nie doceniałby twej ciężkiej pracy na rzecz ratowania życia.//", [4] = "", }, [11] = { [1] = "Drogi %s//", [2] = "Twoja wzorowa kariera stanowi inspirację dla każdego z nas. Dziękujemy za prowadzenie tak wielu szpitali i świetne radzenie sobie z każdym problemem. Pragniemy uhonorować cię dożywotnim wynagrodzeniem w wysokości %d PLN. Czy zechciałbyś podróżować odkrytą limuzyną od miasta do miasta i prowadzić wykłady o tym, jak osiągnąłeś tak wiele w tak krótkim czasie?//", [3] = "Jesteś przykładem dla wszystkich myślących istot i każdy bez wyjątku uważa cię za bezcenny skarb.//", [4] = "", }, [12] = { [1] = "Drogi %s//", [2] = "Twoja kariera najlepszego zarządcy szpitala od czasów Mojżesza dobiega końca. Mając jednak na uwadze wpływ jaki wywarłeś na kameralny świat medycyny, Minister oferuje ci honorarium w wysokości %d PLN. Twoim jednym zadaniem byłoby otwierać festiwale w naszym imieniu, wodować statki i uczestniczyć w różnych pokazach. Cały świat pada przed tobą na kolana, a my skorzystalibyśmy na twojej popularności!//", [3] = "Usilnie prosimy, przyjmij tę propozycję. To nie będzie ciężka praca, a dostaniesz samochód i eskortę policji, gdziekolwiek się wybierzesz.//", [4] = "", }, custom_level_completed = "Dobra robota! Ukończyłeś wszystkie zadania w tym niestandardowym poziomie!", dear_player = "Drogi %s", return_to_main_menu = "Czy chcesz wrócić do głównego menu czy kontynuować grę?", } high_score = { categories = { deaths = "LICZBA ZGONÓW", total_value = "CAŁKOWITA WARTOŚĆ", money = "NAJBOGATSZY", cures = "LICZBA WYLECZEŃ", visitors = "NAJWIĘCEJ ODWIEDZAJĄCYCH", staff_number = "NAJWIĘCEJ PERSONELU", cure_death_ratio = "STOSUNEK WYLECZENI/ZGONY", patient_happiness = "ZADOWOLENIE KLIENTÓW", staff_happiness = "ZADOWOLENIE PERSONELU", salary = "NAJLEPSZE ZAROBKI", clean = "NAJCZYSTSZY", }, player = "GRACZ", score = "WYNIK", pos = "POZ", best_scores = "SALA SŁAWY", worst_scores = "SALA WSTYDU", killed = "Zabici", } menu_file_save = { [1] = " GRA 1 ", [2] = " GRA 2 ", [3] = " GRA 3 ", [4] = " GRA 4 ", [5] = " GRA 5 ", [6] = " GRA 6 ", [7] = " GRA 7 ", [8] = " GRA 8 ", } build_room_window = { pick_room_type = "Wybierz Gabinet", pick_department = "Wybierz Dział", cost = "Koszt: ", } menu = { debug = " BŁĄD ", display = " WYŚWIETLANIE", file = " PLIK ", options = " OPCJE ", charts = " STATYSTYKI ", } map_editor_window = { pages = { inside = "Wnętrze", outside = "Na zewnątrz", foliage = "Ulistowienie", hedgerow = "Żywopłot", pond = "Sadzawka", road = "Droga", north_wall = "Ściana północna", west_wall = "Ściana zachodnia", helipad = "Lądowisko", delete_wall = "Usuń ściany", parcel_0 = "Parcela 0", parcel_1 = "Parcela 1", parcel_2 = "Parcela 2", parcel_3 = "Parcela 3", parcel_4 = "Parcela 4", parcel_5 = "Parcela 5", parcel_6 = "Parcela 6", parcel_7 = "Parcela 7", parcel_8 = "Parcela 8", parcel_9 = "Parcela 9", camera_1 = "Kamera 1", camera_2 = "Kamera 2", camera_3 = "Kamera 3", camera_4 = "Kamera 4", heliport_1 = "Lądowisko 1", heliport_2 = "Lądowisko 2", heliport_3 = "Lądowisko 3", heliport_4 = "Lądowisko 4", paste = "Wklej obszar", } } menu["player_count"] = "LICZBA GRACZY" menu_player_count = { players_1 = " 1 GRACZ ", players_2 = " 2 GRACZY ", players_3 = " 3 GRACZY ", players_4 = " 4 GRACZY ", } -------------------------------- UNUSED ----------------------------------- ------------------- (kept for backwards compatibility) ---------------------- options_window.change_resolution = "Zmień rozdzielczość" tooltip.options_window.change_resolution = "Zmień rozdzielczość okna do rozmiarów wpisanych po lewo" CorsixTH-0.63/CorsixTH/Lua/languages/russian.lua000066400000000000000000007542601347163623700215600ustar00rootroot00000000000000 --[[ Copyright (c) 2011 Sergei Larionov, Alexey Pinyagin 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. --]] Font("unicode") Language("Русский", "Russian", "ru", "rus") Inherit("English") Encoding(utf8) --[[ Оглавление 1. Главное меню 2. Игровое меню и панель инструментов 3. Отчеты 4. Окна интерфейса 5. Болезни 6. Факсы 7. Советчик 8. Письма из министерства (WIP) --]] -- 1. Главное меню main_menu = { new_game = "Новая игра", continue = "продолжить игру", custom_level = "Дополнительные уровни", load_game = "Загрузить игру", options = "Настройки", exit = "Выход", savegame_version = "Версия файлов сохранений: ", version = "Версия: ", } new_game_window = { tutorial = "Обучение", easy = "Студент (Легкий)", medium = "Доктор (Средний)", hard = "Консультант (Трудный)", cancel = "Отмена", difficulty = "Сложность", option_on = "Вкл.", option_off = "Выкл.", caption = "Кампания", player_name = "Имя Игрока", start = "Старт", } menu_options_warmth_colors = { choice_2 = " СИНИЙ ЗЕЛЕНЫЙ КРАСНЫЙ ", choice_1 = " КРАСНЫЙ ", choice_3 = " ЖЕЛТЫЙ ОРАНЖЕВЫЙ КРАСНЫЙ ", } date_format = { daymonth = "%1% %2:months%", } custom_game_window = { caption = "Дополнительные уровни", } load_game_window = { caption = "Загрузить игру", } save_game_window = { caption = "Сохранить игру", new_save_game = "Новое сохранение", } folders_window = { data_label = "Данные TH", music_location = "Выберите папку, которую хотите использовать под вашу Музыку", music_label = "MP3", new_th_location = "Здесь вы можете указать новую папку с установкой оригинальной Theme Hospital. Как только вы выберете новую папку, игра будет перезапущена.", caption = "Расположение папок", screenshots_label = "Скриншоты", font_label = "Шрифт", savegames_label = "Сохранения", back = "Назад", savegames_location = "Выберите папку для размещения сохраненных игр.", screenshots_location = "Выберите папку для размещения скриншотов.", } customise_window = { average_contents = "Дополнительные объекты", option_on = "Вкл.", paused = "Строительство на Паузе", option_off = "Выкл.", intro = "Проигрывать вступительный ролик", caption = "Пользовательские настройки", back = "Назад", movies = "Общий контроль за видео", volume = "Кнопка уменьшения громкости", aliens = "Пациенты - пришельцы", fractured_bones = "Сломаные кости", } options_window = { fullscreen = "Во весь экран", height = "Высота", width = "Ширина", change_resolution = "Сменить разрешение", back = "Назад", original_path = "Папка с установленной оригинальной игрой Theme Hospital", browse = "Выбрать папку", folder = "ПАПКИ", option_off = "Выкл.", apply = "Применить", option_on = "Вкл.", custom_resolution = "Выбрать...", caption = "Настройки", cancel = "Отмена", customise = "Настроить", audio = "Общие звуки", resolution = "Разрешение", language = "Язык в игре", } menu_list_window = { back = "Назад", } update_window = { caption = "Доступно обновление!", new_version = "Новая Версия:", current_version = "Текущая Версия: ", download = "Перейти на страницу загрузки", ignore = "Пропустить и перейти в Главное меню", } tooltip = { main_menu = { exit = "Стой! Пожалуйста, не уходи!", custom_level = "Играть отдельный уровень", options = "Изменить всякие параметры", new_game = "Начать совершенно новую игру с самого начала", continue = "продолжить последнюю сохраненную игру", load_game = "Загрузить сохраненную ранее игру", }, new_game_window = { tutorial = "Поставьте галочку здесь, чтобы пройти режим обучения", easy = "Нажимайте сюда, если вы новичок в подобных играх", medium = "Самый обычный средний уровень сложности", hard = "Выберите этот вариант, если хотите усложнить себе игру", cancel = "Отмена", }, totd_window = { previous = "Показать предыдущий совет", next = "Показать следующий совет", }, options_window = { fullscreen_button = "Включить/отключить полноэкранный режим", change_resolution = "Сменить разрешение экрана на указанное слева", height = "Введите разрешение экрана по вертикали", width = "Введите разрешение экрана по горизонтали", language = "Выбрать %s язык", back = "Закрыть окно настроек", }, save_game_window = { new_save_game = "Введите имя для сохраненной игры", save_game = "Перезаписать игру «%s»", }, load_game_window = { load_game = "Загрузить игру «%s»", load_autosave = "Загрузить автосохранение", }, } -- 2. Игровое меню и панель инструментов menu = { file = " Файл", options = " Опции", charts = " Отчеты", display = " ОТОБРАЖЕНИЕ ", debug = " ОТЛАДКА ", } menu_file = { save = " (%1%) Сохранить", load = " (%1%) Загрузить", restart = " (%1%) Начать заново", quit = " (%1%) Выйти в главное меню", } menu_options = { game_speed = " Скорость игры", sound_vol = " Громкость звука", music_vol = " Громкость музыки", edge_scrolling = " Прокрутка мышью", announcements = " (%1%) Сообщения", lock_windows = " Не двигать окна", settings = " Настройки", sound = " (%1%) Звуки", announcements_vol = " Громкость сообщений", music = " (%1%) Музыка", autosave = " Автосохранение", jukebox = " (%1%) Музыкальный автомат", twentyfour_hour_clock = " 24-х часовой формат времени ", wage_increase = " ЗАПРОСЫ О ЗАРПЛАТЕ ", warmth_colors = " ЦВЕТА ОТОПЛЕНИЯ ", adviser_disabled = " (%1%) ПОМОЩНИК ", } menu_options_game_speed = { pause = " (%1%) Пауза", slowest = " (%1%) Черепашья", slower = " (%1%) Медленная", normal = " (%1%) Обычная", max_speed = " (%1%) Быстрая", and_then_some_more = " (%1%) Еще быстрее", } menu_options_wage_increase = { deny = " ЗАПРЕТИТЬ ", grant = " РАЗРЕШИТЬ ", } menu_charts = { statement = " (%1%) Баланс банка", casebook = " (%1%) Лабораторный журнал", policy = " (%1%) Политика", research = " (%1%) Исследования", graphs = " (%1%) Графики", staff_listing = " (%1%) Список сотрудников", bank_manager = " (%1%) Управляющий банка", status = " (%1%) Состояние", briefing = " Инструктаж", town_map = " (%1%) карта города ", } menu_file_load = { [1] = " ИГРА 1 ", [2] = " ИГРА 2 ", [3] = " ИГРА 3 ", [4] = " ИГРА 4 ", [5] = " ИГРА 5 ", [6] = " ИГРА 6 ", [7] = " ИГРА 7 ", [8] = " ИГРА 8 ", } menu_debug_overlay = { heat = " TEMPERATURE ", byte_0_1 = " BYTE 0 & 1 ", byte_6 = " BYTE 6 ", flags = " FLAGS ", byte_7 = " BYTE 7 ", byte_5 = " BYTE 5 ", byte_floor = " BYTE FLOOR ", positions = " POSITIONS ", byte_w_wall = " BYTE W WALL ", parcel = " PARCEL ", byte_n_wall = " BYTE N WALL ", none = " NONE ", } menu_file_save = { [1] = " ИГРА 1 ", [2] = " ИГРА 2 ", [3] = " ИГРА 3 ", [4] = " ИГРА 4 ", [5] = " ИГРА 5 ", [6] = " ИГРА 6 ", [7] = " ИГРА 7 ", [8] = " ИГРА 8 ", } menu_display = { shadows = " ТЕНИ ", mcga_lo_res = " MCGA НИЗ.РАЗРЕШЕНИЕ ", high_res = " ВЫСОКОЕ РАЗРЕШЕНИЕ ", } install = { title = "--------------------------------- Установка CorsixTH ---------------------------------", th_directory = "CorsixTH для нормальной работы требуется оригинальная установленная игра Theme Hospital. Нажмите кнопку и выберите папку, в которую установлена оригинальная игра.", exit = "Выход", ok = "OK", cancel = "Отмена", } dynamic_info = { patient = { emergency = "Чрезвычайная ситуация: %s", guessed_diagnosis = "Диагноз навскидку: %s ", diagnosis_progress = "Процесс диагностики", actions = { sent_to_other_hospital = "Отправлен в другую больницу", prices_too_high = "У вас слишком дорого, - я иду домой", no_gp_available = "Ждет постройки кабинета терапевта", waiting_for_treatment_rooms = "Ждет постройки кабинета для лечения", dying = "Умирает!", no_diagnoses_available = "Раз не знаете что со мной, - я иду домой", epidemic_sent_home = "Отправлен домой инспектором", cured = "Здоров!", waiting_for_diagnosis_rooms = "Ждет постройки диагностического кабинета", epidemic_contagious = "Заразный", awaiting_decision = "Ждет вашего решения", sent_home = "Отправлен домой", fed_up = "Сыт по горло и уходит", no_treatment_available = "Раз не можете вылечить, - я иду домой", on_my_way_to = "Идет в %s", queueing_for = "Стоит в очереди в %s", }, diagnosed = "Поставлен диагноз: %s ", }, health_inspector = "Инспектор", vip = "Шишка", object = { times_used = "Использовано раз: %d", queue_size = "Длина очереди: %d", strength = "Прочность: %d", queue_expected = "Ожидается очередь: %d", }, staff = { actions = { going_to_repair = "Идет чинить %s", fired = "Уволен", waiting_for_patient = "Ждет пациента", wandering = "Слоняется без дела", heading_for = "Идет в %s", }, tiredness = "Усталость", psychiatrist_abbrev = "Псих.", ability = "Способность", }, } handyman_window = { all_parcels = "Все корпуса", parcel = "Корпус", } font_location_window = { caption = "Выберите шрифт (%1%)", } staff_title = { junior = "Студент", psychiatrist = "Психиатр", consultant = "Консультант", surgeon = "Хирург", doctor = "Доктор", researcher = "Исследователь", nurse = "Медсестра", receptionist = "Регистратор", general = "Общий", } tooltip = { toolbar = { bank_button = "Левая кнопка - управляющий банка, правая - баланс банка", balance = "Ваш баланс", reputation = "Ваша репутация", date = "Дата", rooms = "Строить кабинеты", objects = "Обставлять коридор", edit = "Редактировать кабинеты/мебель", hire = "Нанять персонал", staff_list = "Управление персоналом", town_map = "Карта", casebook = "Лабораторный журнал", research = "Исследования", status = "Состояние", charts = "Графики", policy = "Политика", }, options_window = { select_language = "Выбрать язык игры", select_resolution = "Выбрать новое разрешение", language_dropdown_item = "Выбрать %s язык", audio_button = "Включить или выключить весь игровой звук", resolution = "Разрешение в котором игра должна работать", audio_toggle = "Переключатель вкл. или выкл.", fullscreen = "Игра должна работать в полноэкранном или оконном режиме", apply = "Использовать введенное разрешение", cancel = "Вернуться без изменения разрешения", folder_button = "Свойства Папки", customise_button = "Выможете изменить больше настроек для индивидуализации игрового опыта", }, menu_list_window = { save_date = "Нажмите тут для сортировки списка по дате последнего изменения", name = "Нажмите тут для сортировки списка по имени", }, cheats_window = { cheats = { earthquake = "Вызвать землетрясение.", vip = "Пригласить ВИП.", }, }, custom_game_window = { free_build = "Отметьте тут если вы хотите играть без денег и условий для победы и поражения", }, new_game_window = { difficulty = "Выберите уровень сложности игры", player_name = "Введите имя, которым вы хотите представляться в игре", start = "Начать игры с выбранными настройками", }, casebook = { cure_type = { drug = "Это лечение будет использовать лекарство", unknown = "Вы все ещё не знаете как лечить это заболевание", }, cure_requirement = { hire_surgeon = "Вы должны нанять второго Хирурка для проведения операции", not_possible = "Вы все ещё не можете справиться с этим лечением", hire_staff_old = "Вам нужно нанять %s для проведения этого лечения", hire_surgeons = "Для проведения операций вам нужно нанять двух Хирургов", build_ward = "Вам необходимо построить Палату для проведения этого лечения", ward_hire_nurse = "Вам нужна Медсестра для работы в Палате для проведения этого лечения", }, }, main_menu = { load_menu = { load_slot = "ЗАГРУЗИТЬ ИГРУ", empty_slot = "ПУСТО", }, continue = "Продолжить предыдущую игру", network = "Начать сетевую игру", quit = "Вы собираетесь выйти из CorsixTH. Вы уверены в том что хотите именно этого?", }, load_game_window = { load_game_number = "Загрузить игру %d", }, update_window = { download = "Перейти на страницу загрузки самой последней версии CorsixTH", ignore = "Игнорировать это обновление. Вы будете снова оповещены когда снова запустите CorsixTH", }, folders_window = { browse_font = "Просмотреть другой файл шрифтаBrowse ( текущее местоположение: %1% )", screenshots_location = "По умолчанию Скриншоты сохраняются в папке вместе с конфигурационным файлом. Если это не подходит, то вы можете выбрать его самостоятельно, просто перейдите в каталог, который вы хотите для этого использовать.", reset_to_default = "Установить папку по умолчанию", back = "Закрть это меню и вернуться в Меню Настроек", music_location = "Выберете папку, где хранятся файлы с mp3 музыкой. Если вы ее только что создали, тогда перейдите в нее.", font_location = "Местонахождение файла шрифта, способного отображать Unicode кодировку, необходимую для вашего языка. Если он не указан, то вы не можете выбрать языки, требующие для отображения больше символов, чем были в оригинальной игре. Например: Русский и Китайский ", savegames_location = "По умолчанию, папка для сохраненных игр находится вместе с конфигурационным файлом. Если это не удобно, тогда вы можете выбрать любую другую просто перейдя в нее. ", browse_data = "Указать другое место нахождения файлов Theme Hospital (текущее местоположение: %1%)", browse = "Просмотр папок", browse_screenshots = "Указать на другое местоположение папки со скиншотами ( текущее местоположение: %1% ) ", browse_music = "Укажите друго расположение папки с Музыкой ( текущее местоположение: %1% ) ", no_font_specified = "Расположение файла со шрифтом ещё не указано!", not_specified = "Местонахождение папки не определено!", browse_saves = "Укажите другое местонахождение папки с сохраненными играми ( текущее местоположение: %1% ) ", default = "Местоположение по-умолчанию", data_location = "Папка, куда установлена оригинальная Theme Hospital, она необходима для запуска CorsixTH", }, customise_window = { aliens = "К сожалению, пациенты с инопланетной ДНК плохо анимированы поэтому в больницу они приходят только по экстренным случаям. Если вы хотите, чтобы они приходили так же как и обычные пациенты, выключите эту опцию.", average_contents = "Если вы хотите, чтобы игра запоминала какие дополнительные объекты вы устанавливаете в том или ином кабинете, когда его строите, включите эту опцию.", back = "Закрыть это меню и вернуться в Главное меню", movies = "Общий контроль за видеороликами. Это позволит вам отключить все видеоролики.", fractured_bones = "Из-за плохой анимации, по-умолчанию мы отключили всех пациентов женщин со Сломанными костями. Для того чтобы женщины со сломанными костями приходили в вашу больницу, выключите эту опцию.", volume = "Если кнопка понижения громкости открывает журнал, включите эту опцию, чтобы изменить горячую клавишу журнала на Shift+C", intro = "Включить или выключить показ вступительного ролика. Общий контроль за видеороликами должен быть включен, если вы хотить видеть вступление каждый раз, когда запускаете CorsixTH", paused = "В оригинальном Theme Hospital использовать меню сверху экрана можно было только если поставить игру на паузу. Мы оставили это по-умолчанию и в CorsixTH. Если вы включите эту опцию, то на паузе можно будет делать все что угодно.", }, handyman_window = { happiness = "Счастье", salary = "Зарплата", parcel_select = "Корпус, в котором рабочий выполняет свои функции, нажмите, чтобы изменить", tiredness = "Усталость", sack = "Уволить", close = "Закрыть", face = "Изображение рабочего", pick_up = "Поднять", center_view = "Центрировать экран на рабочем", name = "Имя рабочего", ability = "Способности", }, research_policy = { research_progress = "Прогресс, необходимый до следующего открытия в этой категории: %1%/%2%", no_research = "В настоящее время исследований в этой категории не производится", }, objects = { lamp = "Лампа: излучает свет и позволяет персоналу видеть.", op_sink1 = "33 РАКОВИНА", litter_bomb = "Заминированное письмо: соботирует работу в больнице конкурента", x_ray = "27 РЕНТГЕН-АППАРАТ", projector = "37 ПРОЭКТОР", radiation_shield = "28 РАДИАЦИОННЫЙ ЩИТ", entrance_left = "58 ЛЕВАЯ ВХОДНАЯ ДВЕРЬ", table2 = "12 СТОЛ", bed2 = "неиспользовалась", console = "15 КОНСОЛЬ УПРАВЛЕНИЯ", operating_table = "30 СТОЛ ДЛЯ ОПЕРАЦИЙ", x_ray_viewer = "29 РЕНТГЕН ЭКРАН", crash_trolley = "20 КРЭШ-ТЕЛЕЖКИ", shower = "54 ОБЕЗЗАРАЖИВАЮЩИЙ ДУШ", electrolyser = "46 ЭЛЕКТРОЛИЗЕР", hair_restorer = "25 ВОССТАНОВИТЕЛЬ ВОЛОС", jelly_moulder = "47 РАЗЖЕЛЕИВАТЕЛЬ", couch = "18 КУШЕТКА", surgeon_screen = "35 ШИРМА ДЛЯ ОПЕРАЦИЙ", bed3 = "неиспользовалась", dna_fixer = "23 ВОССТАНОВИТЕЛЬ ДНК", chair = "Стул: пациенты сидят на нем и обсуждают свое заболевание.", cast_remover = "24 УДАЛИТЕРЬ ГИПСА", entrance_right = "59 ПРАВАЯ ВХОДНАЯ ДВЕРЬ", cardio = "13 КАРДИО АППАРАТ", slicer = "26 ЯЗЫКОРЕЗКА", table1 = "Стол (УДАЛЕН): содержит коллекцию журналов, чтобы занять ожидающих пациентов.", ultrascanner = "22 АППАРАТ УЗИ", scanner = "14 СКАНЕР", op_sink2 = "34 РАКОВИНА", door = "Дверь: люди могут открывать и закрывать ее много раз.", swing_door2 = "53 РАСПАШНАЯ ДВУСТВОРЧАТАЯ ДВЕРЬ", screen = "16 ШИРМА", gates_of_hell = "48 ВОРОТА В АД", blood_machine = "42 МАШИНА ДЛЯ ЗАБОРА КРОВИ", comfortable_chair = "61 КОМФОРТНЫЙ СТУЛ", swing_door1 = "52 РАСПАШНАЯ ДВУСТВОРЧАТАЯ ДВЕРЬ", }, } misc = { hospital_open = "Открыть больницу", save_success = "Игра успешно сохранена", save_failed = "Ошибка: не удалось сохранить игру", low_res = "Низкое разрешение", no_heliport = "Либо заболевания не обнаружены, либо на этой карте нет вертолетной площадки.", grade_adverb = { extremely = "экстремально", mildly = "средне", moderately = "умеренно", }, not_yet_implemented = "(еще не реализовано)", send_message = "Отправить сообщение игроку %d", out_of_sync = "Рассинхронизация игры", balance = "Файл баланса:", load_failed = "Сохранение не загружено", mouse = "Мышь", done = "Готово", force = "Ускорение", pause = "Пауза", send_message_all = "Отправить сообщение всем игрокам", } errors = { unavailable_screen_size = "Установленный размер экрана не поддерживается в полноэкранном режиме.", dialog_missing_graphics = "Сожалеем, но файлы демо версии не содержат этот диалог.", maximum_screen_size = "Максимальный размер экрана не должен превышать 3000x2000.", load_prefix = "Ошибка загрузки игры: ", no_games_to_contine = "Нет сохраненных игр", save_prefix = "Ошибка сохранения игры: ", map_file_missing = "Не найден файл карты %s для этого уровня!", minimum_screen_size = "Размер экрана не должен быть менее, чем 640x480.", alien_dna = "Пояснение: не существует анимации как инопланетные пациенты сидят, открывают или стучатся в дверь и т.п. В оригинальной Theme Hospital они при этом превращались в обычного пациента и потом обратно. пациенты с инопланетной ДНК будут доступны только если они разрешены в файле с уровнем.", fractured_bones = "Пояснение: анимация пациентов со сломанными костями женского пола плохая", } -- 3. Отчеты staff_list = { morale = "Мораль", tiredness = "Бодрость", skill = "Компетентность", total_wages = "ВСЕГО ЗАРПЛАТЫ", } bank_manager = { current_loan = "Текущий заем", balance = "Баланс", interest_payment = "Выплачиваемый процент", hospital_value = "Стоимость госпиталя", interest_rate = "Процентная ставка", inflation_rate = "Уровень инфляции", insurance_owed = "Выплаты страховщиков", statistics_page = { balance = "Баланс", details = "Причина", date = "Дата", current_balance = "Текущий баланс", money_in = "Приход", money_out = "Расход", }, } transactions = { severance = "Выходное пособие", research = "Финансирование исследований", eoy_trophy_bonus = "Приз по итогам года", buy_object = "Покупка", cure_colon = "Лечение:", wages = "Выплата зарплат", personal_bonus = "Выплата премии", drug_cost = "Покупка лекарств", heating = "Счет за отопление", treat_colon = "Обследование:", hire_staff = "Прием на работу", bank_loan = "Заем у банка", insurance_colon = "Страховка:", sell_object = "Продажа", loan_interest = "Выплата процента по займу", loan_repayment = "Возврат по займу", buy_land = "Покупка участка", machine_replacement = "Замена машины", build_room = "Постройка", drinks = "Продажа напитков", cure = "Вылечено", eoy_bonus_penalty = "Призы/Наказания в конце года", cheat = "Чит с деньгами", general_bonus = "Оплата Главной премии", emergency_bonus = "Оплата премии за Экстренные случаи", epidemy_coverup_fine = "Штраф за сокрытие эпидемий", research_bonus = "Премия исследований", final_treat_colon = "Окончательное лечение: ", jukebox = "Входящее: музыкальный автомат", vaccination = "Вакцинация", vip_award = "Денежная премия от ВИП", epidemy_fine = "Штраф за эпидемию", compensation = "Компенсация от Правительства", deposit = "Депозит на лечение", advance_colon = "Дополнительно: ", overdraft = "Проценты по кредиту", } town_map = { number = "Номер участка", not_for_sale = "Не продается", price = "Цена участка", for_sale = "Продается", owner = "Владелец уч-ка", area = "Площадь уч-ка", chat = "Окно детализации города", } high_score = { categories = { deaths = "Пациентов угроблено", total_value = "Общая стоимость", money = "Самый богатый", cures = "Пациентов вылечено", visitors = "Количество посетителей", salary = "Размер зарплаты", clean = "Чистота", patient_happiness = "Удовлетворенность пациентов", cure_death_ratio = "Соотношение убитых и вылеченных", staff_happiness = "Удовлетворенность персонала", staff_number = "Самое большое количество персонала", }, player = "ИГРОК", pos = "ПОЗ", best_scores = "ЗАЛ СЛАВЫ", killed = "Убито", worst_scores = "ЗАЛ ПОЗОРА", score = "ОЧКИ", } research = { allocated_amount = "Распределенное количество", funds_allocation = "Распределение финасирования", categories = { improvements = "Улучшения", drugs = "Исследование лекарств", diagnosis = "Диагностическое оборудование", cure = "Оборудование для лечения", specialisation = "Специализация", }, } policy = { header = "Политика больницы", diag_termination = "Длительность обследования", sliders = { guess = "Диагноз наугад", send_home = "Отправить домой", stop = "Прекратить", staff_room = "Идти отдыхать", }, diag_procedure = "Процедура обследования", staff_rest = "Отправлять персонал отдыхать", staff_leave_rooms = "Покидать кабинеты", } casebook = { sent_home = "Отправлено домой", deaths = "Жертвы", treatment_charge = "Взимаемая плата", reputation = "Репутация", research = "Сосредоточить исследования", cure = "Лекарство", cured = "Вылечено", earned_money = "Денег получено", cure_desc = { hire_surgeons = "Вам необходимо нанять хирургов.", improve_cure = "Улучшить лечение.", no_cure_known = "Нет известного лечения.", build_room = "Я рекомендую вам построить %s", hire_psychiatrists = "Вы должны нанять психиатра.", build_ward = "Вам по прежнему нужно построить Палату.", hire_nurses = "Вам нужно нанять медсестер.", cure_known = "Вылечен.", hire_doctors = "Вам нужно нанять докторов.", }, } progress_report = { quite_unhappy = "Люди вами недовольны", header = "Отчет об успехах", very_unhappy = "Люди вас не любят. Уделяйте им больше внимания", more_drinks_machines = "Пациенты умирают от жажды. Поставьте автоматы с напитками", too_cold = "У вас слишком холодно, поставьте еще батарей", too_hot = "Настройте систему отопления, у вас слишком жарко", percentage_pop = "Доля клиентов", win_criteria = "Условия для победы", free_build = "Свободное строительство", } tooltip = { staff_list = { prev_person = "Предыдущая страница", next_person = "Следующая страница", detail = "Внимание к деталям", happiness = "Насколько ваши сотрудники довольны своей работой в целом", tiredness = "Показывает сколько ваши сотрудники еще смогут поработать без отдыха", ability = "Квалификация ваших сотрудников в среднем по больнице", happiness_2 = "Моральное состояние", ability_2 = "Профессиональные навыки", tiredness_2 = "Запас сил", researcher_train = "На %d%% готов к получению диплома исследователя", surgeon_train = "На %d%% готов к получению диплома хирурга", psychiatrist_train = "На %d%% готов к получению диплома психиатра", researcher = "Дипломированый исследователь", psychiatrist = "Дипломированый психиатр", surgeon = "Дипломированый хирург", handymen = "Показать список всех рабочих вашей больницы", nurses = "Показать список всех медсестер вашей больницы", doctors = "Показать список всех докторов вашей больницы", receptionists = "Показать список всех регистраторов вашей больницы", pay_rise = "Поднять оклад на 10%", bonus = "Выплатить премию в размере 10% от оклада", salary = "Текущая зарплата", close = "Назад к игре", sack = "Вышвырнуть на улицу", doctor_seniority = "Авторитет доктора", view_staff = "Наблюдать за работой", skills = "Дополнительные умения", total_wages = "Общая зарплата", }, town_map = { close = "Закрыть", plants = "Показывать растения", fire_extinguishers = "Показывать огнетушители", people = "Показывать людей", balance = "Баланс", heat_dec = "Уменьшить температуру", heating_bill = "Счет за отопление", radiators = "Показывать батареи", objects = "Показывать мебель", heat_level = "Температура", heat_inc = "Увеличить температуру", }, policy = { diag_termination = "Обследование пациента будет продолжаться, пока доктора не будут на столько процентов уверены в диагнозе или пока у них не закончатся средства диагностики", close = "Закрыть окно политики", staff_leave = "Нажмите здесь чтобы разрешить сотрудникам покидать кабинеты и идти туда где нужна их помощь", diag_procedure = "Если доктор уверен в своем диагнозе менее, чем значение «Отправить домой», пациент будет отправлен домой. Если же шансы выше чем «Диагноз наугад», он будет отправлен на лечение. В остальных случаях потребуется ваше решение", staff_rest = "Насколько усталым должен быть сотрудник, чтобы получить право на отдых", staff_stay = "Нажмите здесь чтобы сотрудники оставались в тех кабинетах, где вы их поставили", }, bank_manager = { graph = "График ожидаемых выплат от %s", close = "Закрыть окно", hospital_value = "Текущая стоимость госпиталя вместе со всем оборудованием", graph_return = "Вернуться назад", current_loan = "Размер текущего займа", borrow_5000 = "Занять у банка 5000$", balance = "Ваш баланс", interest_payment = "Ежемесячные выплаты по займу", inflation_rate = "Размер инфляции за год", interest_rate = "Годовой процент по займу", repay_5000 = "Отдать банку 5000$", show_graph = "Показать график ожидаемых выплат от %s", insurance_owed = "Сколько денег вам должны %s", }, casebook = { sent_home = "Количество пациентов, которым было отказано в лечении", increase = "Поднять стоимость", decrease = "Снизить стоимость", up = "Вверх", down = "Вниз", reputation = "Общая репутация этой практики", research = "Нажмите чтобы сосредоточить бюджет специальных исследований на этой проблеме", close = "Закрыть", earned_money = "Всего заработано на этом", deaths = "Количество летальных исходов", cured = "Количество вылеченных", treatment_charge = " Стоимость для пациентов", cure_type = { psychiatrist = "Это лечит психиатр", drug_percentage = "От этого есть лекарство. Ваше эффективно на %d%", machine = "Для лечения нужно специальное оборудование", surgery = "Лечение требует операции", }, cure_requirement = { possible = "Вы можете это вылечить", build_room = "Вам нужно построить специальный кабинет для лечения", research_machine = "Для лечения нужно изобрести машину", hire_staff = "Вам нужно нанять специалиста для лечения", }, }, status = { population_chart = "Показывает соотношение числа посетителей в разных больницах", percentage_cured = "Вам нужно вылечить %d% всех посетителей. На данный момент вам удалось вылечить %d%", num_cured = "Вам нужно вылечить %d людей. Пока вам удалось исцелить %d", thirst = "Средний уровень жажды людей в больнице", close = "Закрыть окно", win_progress_own = "Показать успехи вашей больницы", reputation = "Ваша репутация должна достигать %d. Сейчас она составляет %d", population = "Добейтесь чтобы к вам приходили лечиться %d%% всех пациентов", warmth = "Средняя температура по больнице", percentage_killed = "Постарайтесь не убивать более чем %d%% посетителей. На данный момент вы угробили %d%%", balance = "На вашем счету должно быть не менее %d$. Сейчас у вас %d$", value = "Ваша больница должна стоить %d$. Сейчас она стоит %d$", win_progress_other = "Показать как идут дела у %s", happiness = "Общее состояние пациентов в вашей больнице", }, } -- 4. Другие окна -- 4.1 Строительство и обстановка build_room_window = { pick_room_type = "Выберите тип кабинета", pick_department = "Выберите кабинет", cost = "Стоимость: ", } room_classes = { diagnosis = "Диагностика", treatment = "Процедуры", clinics = "Лечение", facilities = "Служебные комнаты", } rooms_short = { gps_office = "Кабинет терапевта", general_diag = "Общая диагностика", ultrascan = "Ультрасканер", research_room = "Исследовательский отдел", fracture_clinic = "Лечение переломов", destroyed = "Разрушено", staffroom = "Комната отдыха", jelly_vat = "Лечение ожеления", scanner = "Сканер", decontamination = "Обеззараживание", pharmacy = "Аптека", cardiogram = "Кардиография", reception = "Регистратура", training_room = "Лекционная", corridor_objects = "Обстановка коридоров", operating_theatre = "Операционная", dna_fixer = "Исправление ДНК", ward = "Палата", psychiatric = "Психиатрия", hair_restoration = "Восстановление волос", inflation = "Надувание", tongue_clinic = "Языкорезка", toilets = "Туалет", electrolysis = "Электротерапия", x_ray = "Рентген", blood_machine = "Анализатор крови", } rooms_long = { ultrascan = "Кабинет ультрасканирования", research_room = "Исследовательский отдел", general = "Общий", gps_office = "Кабинет терапевта", inflation = "Кабинет надувания", staffroom = "Комната отдыха", jelly_vat = "Кабинет лечения ожеления", scanner = "Кабинет сканирования", emergency = "Реанимация", decontamination = "Кабинет обеззараживания", corridors = "Коридоры", cardiogram = "Кабинет кардиографии", ward = "Палата", training_room = "Лекционная комната", psychiatric = "Кабинет психиатра", operating_theatre = "Операционная", dna_fixer = "Кабинет исправления ДНК", tongue_clinic = "Кабинет обрезания языка", hair_restoration = "Кабинет восстановления волос", general_diag = "Общая диагностика", pharmacy = "Аптека", fracture_clinic = "Кабинет лечения переломов", toilets = "Туалет", electrolysis = "Кабинет электротерапии", x_ray = "Рентген-кабинет", blood_machine = "Кабинет анализа крови", } buy_objects_window = { price = "Стоимость: ", choose_items = "Выберите предметы", total = "Итого: ", } object = { chair = "Стул", litter = "Мусор", sofa = "Диван", operating_table = "Операционный стол", bench = "Скамья", scanner = "Сканер", couch = "Кушетка", blood_machine = "Анализатор крови", video_game = "Видеоигра", op_sink2 = "Раковина", door = "Дверь", auto_autopsy = "Автовскрывалка", reception_desk = "Регистратура", hair_restorer = "Оволоситель", projector = "Проектор", crash_trolley = "Скорая тележка", tv = "Ящик", ultrascanner = "Ультрасканер", surgeon_screen = "Хирургическая ширма", litter_bomb = "Мусорная бомба", inflator = "Надуватель", desk = "Письменный стол", pool_table = "Бильярд", x_ray_viewer = "Неготоскоп", radiation_shield = "Защита от излучения", bed = "Койка", swing_door2 = "Двустворчатая дверь", console = "Консоль", op_sink1 = "Раковина", bookcase = "Книжный шкаф", drinks_machine = "Автомат с газировкой", comfortable_chair = "Удобное кресло", skeleton = "Скелет", computer = "Компьютер", bin = "Козина для мусора", pharmacy_cabinet = "Аптечный шкаф", radiator = "Батарея", cast_remover = "Разгипсователь", atom_analyser = "Атомный анализатор", plant = "Растение", jelly_moulder = "Форма для желе", cardio = "Беговая дорожка", toilet = "Туалет", electrolyser = "Электролизатор", fire_extinguisher = "Огнетушитель", swing_door1 = "Двустворчатая дверь", lecture_chair = "Лекционный стул", screen = "Ширма", toilet_sink = "Раковина", shower = "Душ", gates_of_hell = "Врата в ад", slicer = "Языкорезка", dna_fixer = "Исправитель ДНК", x_ray = "Рентген", cabinet = "Картотека", lamp = "Лампа", entrance_left = "Левая входная дверь", table2 = "Стол", bed2 = "Кровать", bed3 = "Кровать", entrance_right = "Правая входная дверь", table1 = "Стол", } room_descriptions = { gp = { [1] = "Кабинет терапевта//", [2] = "Это основной диагностический кабинет в вашей больнице. Все новые пациенты приходят сюда чтобы узнать, что с ними не так. Отсюда они отправляются на дальнейшую диагностику или сразу на лечение. Вам может понадобиться несколько таких кабинетов, если пациентов будет слишком много. Чем просторнее помещение, и чем больше в нем предметов, тем выше престиж работающего здесь доктора. Впрочем, это относится ко всем кабинетам.//", [3] = "В кабинете терапевта может работать любой доктор.", }, general_diag = { [1] = "Общая диагностика//", [2] = "Сюда направляются пациенты, которым требуется дополнительная диагностика. Здесь у врача значительно больше инструментов для обследования, чем у терапевта. Пациент вернется к терапевту с результатами обследования для постановки диагноза.//", [3] = "В кабинете общей диагностики может работать любой доктор.", }, ultrascan = { [1] = "Ультрасканер//", [2] = "Ультрасканер - это практически вершина прогресса диагностического оборудования. Он очень дорогой, но он того стоит.//", [3] = "Ультрасканеру для полноценной работы требуется доктор. Также, ему требуется обслуживание.", }, fracture_clinic = { [1] = "Лечение переломов.//", [2] = "Сюда приходят пациенты с поломанными костями. Используя мощный промышленный лазер, разгипсовочная машина срезает застывший гипс, что может вызывать незначительную агонию у пациента.//", [3] = "В этом кабинете работает медсестра. Машине также требуется частый ремонт.", }, inflation = { [1] = "Кабинет надувания//", [2] = "В кабинет надувания направляют пациентов с выводящим из строя и очень болезненным недугом раздутой головы. Здесь их безразмерные черепа хлопнут и немедленно снова надуют до точно рассчитанного нормального давления.//", [3] = "В кабинете надувания может работать любой доктор. Аппарату требуется регулярный ремонт.", }, jelly_vat = { [1] = "Лечение ожеления//", [2] = "Пациенты, страдающие забавной болезнью ожеления, должны дотрястись до этого кабинета, где их поместят в специальный бак. Медицинская наука не знает, что там происходит, но после процедуры им становится лучше.//", [3] = "В этом кабинете может работать любой доктор. Вам также понадобится рабочий для обслуживания машины.", }, scanner = { [1] = "Сканер//", [2] = "При помощи этого сложного оборудования можно поставить очень точный диагноз.//", [3] = "Со сканером может работать любой доктор. Это устройство требует регулярного обслуживания.", }, blood_machine = { [1] = "Анализатор крови//", [2] = "Эта машина разделяет кровь пациента на клетки и выясняет что с ними не в порядке.//", [3] = "С анализатором крови может работать любой доктор. Это устройство требует регулярного обслуживания.", }, pharmacy = { [1] = "Аптека//", [2] = "Пациенты, которым поставлен диагноз и прописано лекарство, получают его в аптеке. Поскольку многие болезни излечиваются медикаментами, со временем тут может стать тесновато, и вам понадобится еще одна аптека.//", [3] = "В аптеке работает медсестра.", }, cardiogram = { [1] = "Кардиография//", [2] = "Здесь пациентов проверяют на наличие болезней сердца и проводят стресс-тест на беговой дорожке. Затем с полученными результатами возвращают к терапевту.//", [3] = "В кардиографии может работать любой доктор. Беговой дорожке требуется регулярное обслуживание.", }, ward = { [1] = "Палата//", [2] = "Во время обследования пациенты содержатся здесь под наблюдением медсестры. Также, тут они готовятся к операции.//", [3] = "В палате работает медсестра.", }, psych = { [1] = "Психиатрия//", [2] = "Пациенты, страдающие от душевных недугов, должны посетить кабинет психиатра. Доктор обследует пациентов, и, если у них не все в порядке с головой, предложит прилечь на кушетку и побеседовать.//", [3] = "В этом кабинете может работать только специально обученный психиатр.", }, staff_room = { [1] = "Комната персонала//", [2] = "После тяжелого рабочего дня, ваши сотрудники могут посетить эту комнату, чтобы отдохнуть и расслабиться. Усталые медики тормозят, хотят повышения зарплаты и могут даже уволиться. Также, они начинают чаще ошибаться. Убедитесь, что в вашей комнате достаточно места и развлечений для нескольких человек сразу.", }, operating_theatre = { [1] = "Операционная//", [2] = "В этом важном помещении излечивают целый ряд заболеваний. Операционная должна быть просторной и хорошо оснащенной. Это очень важная часть любой больницы.//", [3] = "В операционной должны работать два квалифицированных хирурга.", }, training = { [1] = "Лекционная//", [2] = "Ваши доктора могут повышать свою квалификацию в этой комнате. Лектор с дипломом хирурга, психиатра или исследователя может научить своих коллег всему, что знает. Те же, кто уже имеет диплом, здесь могут научиться лучше применять знания на практике.//", [3] = "Читать лекции здесь может только консультант.", }, dna_fixer = { [1] = "Восстановление ДНК//", [2] = "Пациенты, имевшие несчастье войти в контакт с пришельцами из других миров, должны пройти процедуру починки ДНК. Поскольку восстановитель ДНК – машина сложная и высокотехнологичная, настоятельно рекомендуем разместить в кабинете огнетушитель, на всякий пожарный.//", [3] = "Восстановитель требует регулярного обслуживания. И работать с ним могут только доктора с дипломом исследователя.", }, research = { [1] = "Исследовательский отдел//", [2] = "Здесь совершаются открытия и улучшаются существующие лекарства и методы лечения. Это очень полезный отдел, его работа творит чудеса в деле улучшения вашей статистики.//", [3] = "В исследовательском отделе могут работать только доктора с дипломом исследователя.", }, hair_restoration = { [1] = "Восстановление волос//", [2] = "Машина восстановителя волос – последняя надежда для пациентов, страдающих плешивостью в терминальной стадии. При помощи этой машины доктор может быстро насадить совершенно новый волосяной покров.//", [3] = "В кабинете оволосителя может работать любой доктор. Время от времени машине требуется ремонт.", }, electrolysis = { [1] = "Комната электролиза//", [2] = "Больные оволосением направляются в эту комнату, где специальная машина, называемая электролизатором, уничтожает излишние волосы и электрически запаивает поры при помощи состава, сильно напоминающего цемент.//", [3] = "В кабинете электролиза может работать любой доктор. Машина также требует обслуживания.", }, slack_tongue = { [1] = "Лечение длинного языка//", [2] = "Пациенты с этим неутешительным диагнозом направляются в эту комнату для лечения. При помощи высокоточного оборудования, квалифицированный специалист возвращает языку нормальные размер и форму, а пациенту – хорошее самочувствие.//", [3] = "Здесь может работать любой доктор. Машину также надо иногда чинить.", }, toilets = { [1] = "Туалет//", [2] = "Следуя зову природы, пациентам надо иногда облегчиться в комфортной обстановке ваших санитарных помещений. Вы можете установить дополнительные раковины и кабинки, если ожидаете наплыва посетителей. Иногда бывает полезно разместить дополнительные помещения в разных частях больницы.", }, no_room = { [1] = "", }, x_ray = { [1] = "Рентген//", [2] = "Сделанные при помощи специального излучения снимки внутренностей пациентов помогают врачам установить, что там не в порядке.//", [3] = "В кабинете рентгена может работать любой доктор. Также, машине требуется обслуживание.", }, decontamination = { [1] = "Комната обеззараживания//", [2] = "Пациенты, подвергшиеся воздействию радиации, незамедлительно направляются в комнату обеззараживания. Приятный душ смоет с них всю ужасную радиацию и опасные отходы.//", [3] = "Оперировать душем может любой доктор. Также, машине требуется обслуживание.", }, tv_room = { [1] = "Телевизионная комната не использовалась", }, } place_objects_window = { place_objects_in_corridor = "Разместите эти предметы в коридорах.", place_windows = "Добавьте окон, если хотите, и нажмите «Подтвердить».", confirm_or_buy_objects = "Вы можете добавить, убрать или передвинуть объекты.", drag_blueprint = "Растяните комнату до желаемого размера.", place_door = "Разместите дверь", place_objects = "Выберите объект и переместите его на нужное место, потом подтвердите", pick_up_object = "Нажмите на объект, чтобы его поднять или выберете другую опцию из списка", } staff_class = { doctor = "Доктор", handyman = "Рабочий", receptionist = "Регистратор", nurse = "Медсестра", surgeon = "Хирург", } staff_descriptions = { good = { [1] = "Работает быстро и усердно. ", [2] = "Работает на совесть. ", [3] = "Мастер на все руки. ", [4] = "Легко заводит друзей и любит посмеяться. ", [5] = "Никогда не устает. Работает без остановки. ", [6] = "Имеет хорошее воспитание и утонченные манеры. ", [7] = "Проявляет талант и способности. ", [8] = "Очень основательно подходит к делу. ", [9] = "Никогда не сдается и всегда стремится к совершенству. ", [10] = "Помогает людям с улыбкой. ", [11] = "Всегда подбодрит и поможет. ", [12] = "Работает, как правило, хорошо и усердно. ", [13] = "Прилежно работает и ведет себя. ", [14] = "Никогда не подведет и не обидит. ", [15] = "Не оставит в беде. ", }, misc = { [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] = "Переставляет мебель. ", [28] = "Слушает рейв и трип-хоп. ", [29] = "Любит злить насекомых при помощи дезодоранта. ", [30] = "Перебивает плохих комедиантов. ", [31] = "Шпионит на правительство. ", [32] = "Втайне садовник. ", [33] = "Провозит поддельные часы. ", [34] = "Поет рок'н'ролл. ", [35] = "Обожает дневные передачи. ", [36] = "Щекочет форель. ", [37] = "Завлекает туристов в музеи. ", }, bad = { [1] = "Часто тормозит и дергается. ", [2] = "Невозможно заставить работать. ", [3] = "Ничего не умеет и не приносит пользы. ", [4] = "Хамит и ерничает. Не прощает и не забывает. ", [5] = "Быстро устает и на все жалуется. ", [6] = "Ничего не слышит. Пахнет капустой. ", [7] = "Плюет на работу. Предаст при первой возможности. ", [8] = "Ни о чем не думает и легко отвлекается. ", [9] = "Нервничает и часто ошибается. ", [10] = "Обижается и мстит за все. Ненавидит всех и вся. ", [11] = "Не соблюдает технику безопасности. ", [12] = "Видит работу в гробу. Настоящий лентяй. ", [13] = "Рискует зря и плюет на последствия. ", [14] = "Нагло врет и строит козни. ", [15] = "Дерзит и смотрит на всех свысока. ", }, } tooltip = { build_room_window = { cost = "Цена выбранного кабинета", room_classes = { treatment = "Проказать процедурные кабинеты", diagnosis = "Показать комнаты для диагностики", facilities = "Показать служебные помещения", clinic = "Показать специализированные кабинеты для лечения", }, close = "Ничего не строить и вернуться к игре", }, hire_staff_window = { prev_person = "Предыдущий кандидат", cancel = "Отмена", psychiatrist = "Психиатр", surgeon = "Хирург", researcher = "Исследователь", salary = "Зарплата", next_person = "Следующий кандидат", nurses = "Посмотреть медсестер", handymen = "Посмотреть рабочих", doctors = "Посмотреть докторов", receptionists = "Посмотреть регистраторов", doctor_seniority = "Авторитет (Студент, Доктор, Консультант)", hire = "Нанять", qualifications = "Дополнительные дипломы доктора", staff_ability = "Компетентность", }, place_objects_window = { confirm = "Подтвердить", cancel = "Отмена", pick_up = "Поднять объект", buy_sell = "Купить/продать", }, rooms = { ultrascan = "Доктор обследует пациентов при помощи ультрасканера", research_room = "Исследователи придумывают новые лекарства и машины в исследовательском отделе", fracture_clinic = "Здесь медсестра снимает гипс с пациентов со сломанными костями", gps_office = "У терапевта пациенты начинают диагностику, и здесь же им сообщают неутешительные результаты", inflation = "При помощи надувателя доктор лечит пациентов с раздутой головой", staffroom = "В комнате персонала доктора и медсестры отдыхают и набираются сил", jelly_vat = "При помощи специальной машины доктор лечит ожеление", scanner = "Доктор использует сканер для диагностики пациентов", decontamination = "При помощи обеззараживающего душа доктор лечит облученных пациентов", pharmacy = "В аптеке медсестра раздает больным медикаменты", cardiogram = "Доктор снимает кардиограмму для диагностики пациентов", ward = "Палата используется как для диагностики, так и для лечения. Здесь пациенты готовятся к операции под наблюдением медсестры", training_room = "В лекционной консультант может обучать других докторов", operating_theatre = "В операционной работают сразу два хирурга", psychiatry = "Здесь квалифицированный психиатр обследует пациентов и вправляет мозги самым сумасшедшим", hair_restoration = "При помощи оволосителя доктор лечит плешивость", tongue_clinic = "При помощи языкорезки доктор подрезает длинные языки", dna_fixer = "Здесь доктор лечит пациентов с инопланетной ДНК", general_diag = "Здесь доктор проводит общий осмотр пациентов. Дешево и сердито", toilets = "Постройте туалеты, если не хотите чтобы пациенты загадили вам всю больницу", electrolysis = "При помощи электролизатора доктор лечит волосение", x_ray = "Доктор использует рентген для диагностики пациентов", blood_machine = "Доктор использует анализатор крови для диагностики пациентов", }, objects = { litter = "Мусор: какому-то пациенту не удалось найти в вашей больнице мусорной корзины, и он бросил это прямо здесь", sofa = "Диван: если у вас в комнате отдыха нет ничего интереснее, то хотя бы можно посидеть на диване", bench = "Скамья: предоставляет одно сидячее место, скрашивая часы, проведенные в очередях", video_game = "Игральный автомат: предоставляет вашим сотрудникам возможность порубиться в Hi-Octane", auto_autopsy = "Автовскрывалка: очень помогает в исследовании заболеваний", reception_desk = "Регистратура: отсюда регистраторша направит пациента к врачу", tv = "Тель-а-визор: вы же не хотите, чтобы ваши сотрудники пропустили свои любимые передачи", inflator = "Надуватель: излечивает раздутие головы", desk = "Стол: надо ведь доктору куда-то поставить свой компьютер", pool_table = "Бильярдный стол: помогает вашим работникам расслабиться", bed = "Койка: на ней смогут прилечь те, кто уже не в силах стоять", bookcase = "Книжный шкаф: полон справочных материалов на медицинские темы", drinks_machine = "Торговый автомат: не дает пациентам умереть от жажды и приносит прибыль", skeleton = "Скелет: используется как учебное пособие и на Хэллоуин", computer = "Компьютер: незаменимый инструмент исследователя", bin = "Корзина: чтобы пациентам было куда деть свой мусор", pharmacy_cabinet = "Аптечный шкаф: тут хранятся все лекарства", radiator = "Батарея: поддерживает тепло в вашей больнице", atom_analyser = "Атомный анализатор: эта машина ускоряет все исследовательские процессы", plant = "Растение: нравится пациентам и очищает воздух", toilet = "Стульчак: пациенты... мм... пользуются им", fire_extinguisher = "Огнетушитель: несколько уменьшает опасность поломки машин", lecture_chair = "Лекционный стул: ваши доктора на нем сидят, записывают лекции, скучают и рисуют каракули. Чем больше стульев вы поставите, тем больше докторов сможет обучаться одновременно", toilet_sink = "Раковина: наиболее чистоплотные пациенты моют здесь свои грязные руки. Они будут очень недовольны, если не найдут свободной раковины", cabinet = "Картотека: содержит карточки пациентов, записи и научные документы", }, } -- 4.2 Статус queue_window = { num_in_queue = "Длина очереди", num_entered = "Всего посещений", max_queue_size = "Макс. длина", num_expected = "Ожидается", } tooltip = { handyman_window = { prio_machines = "Увеличить приоритет ремонта", prio_litter = "Увеличить приоритет уборки", prio_plants = "Увеличить приоритет поливки", }, machine_window = { repair = "Вызвать рабочего для ремонта", name = "Название", close = "Закрыть", times_used = "Количество использований", status = "Состояние", replace = "Заменить машину", }, patient_window = { graph = "Щелкните чтобы увидеть историю лечения или график график самочувствия", casebook = "Посмотреть статистику по болезни", close = "Закрыть", queue = "Посмотреть очередь", happiness = "Самочувствие пациента", warmth = "Согретость пациента", center_view = "Центрировать экран на пациенте", thirst = "Уровень жажды пациента", send_home = "Выставить из больницы", abort_diagnosis = "Отправить на лечение немедленно, не дожидаясь окончания диагностики", }, staff_window = { doctor_seniority = "Авторитет (Студент, Доктор, Консультант)", psychiatrist = "Психиатр", close = "Закрыть окно", ability = "Компетентность", pick_up = "Взять", sack = "Уволить", surgeon = "Хирург", happiness = "Настроение", salary = "Ежемесячная зарплата", name = "Имя", tiredness = "Запас сил", center_view = "Левая кнопка - центрировать экран, правая - выбрать следующего сотрудника", skills = "Особые умения", researcher = "Исследователь", face = "Портрет - нажмите, чтобы перейти к экрану управления персоналом", }, } -- 4.3 Запросы confirmation = { abort_edit_room = "Вы сейчас строите или редактируете кабинет. Если все необходимое уже на месте, он будет построен, иначе же он будет удален. Продолжить?", return_to_blueprint = "Точно вернуться к режиму разметки?", delete_room = "Вы точно хотите удалить эту комнату?", quit = "Вы выбрали выход. А вы в этом уверены?", needs_restart = "Изменение этого параметра ребует перезапуска CorsixTH. Все несохраненные данные при этом будут потеряны. Продолжить?", overwrite_save = "В этом файле уже есть сохраненная игра. Перезаписать ее?", sack_staff = "Вы правда хотите уволить этого сотрудника?", replace_machine = "Вы правда хотите заменить %s за %d$?", restart_level = "Вы серьёзно хотите начать уровень заново?", maximum_screen_size = "Разрешение экрана, которое вы ввели, больше 3000 x 2000. Большее разрешение возможно, но оно может потребовать более производительного оборудования, чтобы поддерживать играбельную частоту кадров. Вы уверены, что хотите продолжить?", music_warning = "Перед тем, как выбрать mp3 в качестве игровой музыки, вам потребуется smpeg.dll или аналог для вашей операционной системы, иначе музыка не сможет быть проиграна. Вы уверены, что хотите продолжить?", } pay_rise = { definite_quit = "Я увольняюсь, и точка. Я сыт по горло этим местом.", regular = { [1] = "Я крайне устаю. Мне нужен хороший отдых плюс повышение зарплаты на %d$, если хотите меня видеть на этой никчемной работе.", [2] = "Я очень устаю. Мне надо отдохнуть и не помешает получить надбавку в %d$ до %d$. Пошевеливайся, деспот.", [3] = "Ну все. Я тут тружусь как лошадь. Прибавьте мне %d$, а то уволюсь.", [4] = "Я в негодовании. Требую добавить к зарплате %d$, чтобы стало %d$, или я ухожу.", [5] = "Родители всегда говорили мне что в этом деле хорошо платят. Так что повысьте мне зарплату на %d$, или я пойду издавать компьютерные игры.", [6] = "С меня хватит. Платите мне как следует. Я хочу, чтобы мне повысили зарплату на %d$.", }, poached = "Мне предлагают %d$ у %s. Платите мне не меньше, или я ухожу.", } -- 5. Болезни diseases = { general_practice = { name = "Обследование: терапевт", }, diag_ward = { name = "Обследование: палата", }, diag_ultrascan = { name = "Обследование: ультрасканер", }, diag_blood_machine = { name = "Обследование: анализатор крови", }, diag_x_ray = { name = "Обследование: рентген", }, diag_psych = { name = "Обследование: психиатр", }, diag_general_diag = { name = "Обследование: общая диагностика", }, diag_cardiogram = { name = "Обследование: кардиограмма", }, diag_scanner = { name = "Обследование: сканер", }, autopsy = { name = "Вскрытие", }, third_degree_sideburns = { cause = "Причина - непреодолимая тоска по семидесятым.", cure = "Лечение - психиатр должен, используя самые современные методы, убедить пациента, что чрезмерная волосатость уже не в моде.", name = "Бакенбарды третьей степени", symptoms = "Симптомы - длинные волосы, смешные штаны, обувь на платформе и сверкающий макияж.", }, discrete_itching = { cause = "Причина - крошечные насекомые с очень острыми зубами.", cure = "Лечение - пациент выпивает липкий фармацевтический сироп, который защищает кожу.", name = "Спонтанное зудение", symptoms = "Симптомы - интенсивное чесание вплоть до воспламенения.", }, the_squits = { cause = "Причина - поедание кусочков пиццы, упавших под плиту.", cure = "Лечение - клейкая смесь вязких фармацевтических реактивов сгущает все внутри у пациента.", name = "Метания", symptoms = "Симптомы - фу, какая гадость. Не будем об этом.", }, spare_ribs = { cause = "Причина - сидение на холодном каменном полу.", cure = "Лечение - два хирурга должны удалить лишние ребра и завернуть их пациенту с собой.", name = "Лишние ребра", symptoms = "Симптомы - неприятные ощущения от массивной груди.", }, king_complex = { cause = "Причина - дух Короля, который захватил контроль над разумом пациента.", cure = "Лечение - психиатр рассказывает пациенту как нелепо тот выглядит.", name = "Комплекс Короля", symptoms = "Симптомы - слабость к цветастой замшевой обуви и чизбургерам.", }, fake_blood = { cause = "Причина - скорее всего, пациент стал жертвой розыгрыша.", cure = "Лечение - психиатр должен помочь пациенту успокоиться.", name = "Фальшивая кровь", symptoms = "Симптомы - красная жидкость в венах, которая испаряется при контакте с одеждой.", }, invisibility = { cause = "Причина - укус радиоактивного (и, само собой, невидимого) муравья.", cure = "Лечение - напиток насыщенного цвета, приготовленный в аптеке, восстанавливает видимость пациента.", name = "Невидимость", symptoms = "Симптомы - пациент чувствует себя нормально и даже может использовать болезнь чтобы разыгрывать близких.", }, golf_stones = { cause = "Причина - вдыхание ядовитого газа, содержащегося в мячиках для гольфа.", cure = "Лечение - образования удаляются хирургами в операционной.", name = "Мячики в почках", symptoms = "Симптомы - бред и чувство стыда.", }, infectious_laughter = { cause = "Причина - просмотр классических комедий.", cure = "Лечение - квалифицированный психиатр должен напомнить пациенту, что не все в этой жизни смешно.", name = "Заразный смех", symptoms = "Симптомы - непроизвольное фырканье и повторение несмешных шуток.", }, baldness = { cause = "Причина - вранье и придумавание небылиц с целью привлечения внимания.", cure = "Лечение - в ходе болезненной процедуры специальная машина плавно восстанавливает волосяной покров.", name = "Плешивость", symptoms = "Симптомы - блестящесть и смущение.", }, heaped_piles = { cause = "Причина - привычка торчать возле питьевых фонтанчиков.", cure = "Лечение - приятная на вкус смесь сильных кислот растворяет кучи изнутри.", name = "Скученные кучи", symptoms = "Симптомы - у пациента такое чувство, будто он/она сидит на мешке с твердыми шариками.", }, unexpected_swelling = { cause = "Причина - все внезапное.", cure = "Лечение - возбухание может быть уменьшено хирургами при помощи автогена.", name = "Внезапное возбухание", symptoms = "Симптом - возбухание.", }, jellyitis = { cause = "Причина - пища, богатая желатином и избыток физической активности.", cure = "Лечение - пациента помещают в разжелетиватель в специальном кабинете.", name = "Ожеление", symptoms = "Симптомы - пациент чрезмерно трясется и часто падает.", }, hairyitis = { cause = "Причина - длительные прогулки в свете луны.", cure = "Лечение - электролизатор удаляет волосы и запаивает поры.", name = "Оволосение", symptoms = "Симптомы - обостренное обоняние.", }, alien_dna = { cause = "Причина - прыгающие личинки разумных видов пришельцев.", cure = "Лечение - в специальной машине ДНК извлекается, очищается от фрагментов пришельцев и быстро вставляется на место.", name = "ДНК пришельцев", symptoms = "Симптомы - постепенное превращение в пришельца и стремление уничтожить человечество.", }, bloaty_head = { cause = "Причина - нюхание сыра и питье неочищенной дождевой воды.", cure = "Лечение - раздутая голова лопается и затем надувается до нормального давления при помощи хитроумной машины.", name = "Раздутие головы", symptoms = "Симптомы - очень неприятны для пациента.", }, gastric_ejections = { cause = "Причина - острая мексиканская и индийская пища.", cure = "Лечение - выпивание специального связующего состава предотвращает какие бы то ни было извержения.", name = "Гастральные извержения", symptoms = "Симптомы - полупереваренная пища извергается из пациента в случайных местах.", }, uncommon_cold = { cause = "Причина - крошечные капли соплей в воздухе.", cure = "Лечение - большой глоток необычной микстуры от кашля, сваренной из секретных ингредиентов в аптеке.", name = "Необычная простуда", symptoms = "Симптомы - сопли, чихание и обесцвечивание легких.", }, corrugated_ankles = { cause = "Причина - езда через асфальтовые гребни на дорогах.", cure = "Лечение - слегка токсичная смесь трав и специй позволяет пациенту выпрямить лодыжки.", name = "Волнистые лодыжки", symptoms = "Симптомы - привычная обувь больше не подходит пациенту.", }, sleeping_illness = { cause = "Причина - чрезмерная активность сонной железы в глотке пациента.", cure = "Лечение - медсестра должна дать пациенту большую дозу сильных стимуляторов.", name = "Сонная болезнь", symptoms = "Симптомы - непреодолимое желание поспать преследует пациента.", }, sweaty_palms = { cause = "Причина - боязнь собеседований.", cure = "Лечение - психиатр должен уговорить пациента избавиться от этой выдуманной болезни.", name = "Потные ладони", symptoms = "Симптомы - рукопожатие пациента напоминает сжимание мокрой губки.", }, serious_radiation = { cause = "Причина - жевание изотопов плутония.", cure = "Лечение - пациента нужно как следует промыть под обеззараживающим душем.", name = "Сильное облучение", symptoms = "Симптомы - пациент себя очень, очень плохо чувствует.", }, gut_rot = { cause = "Причина - Старая добрая крепкая микстура от кашля тетушки О'Мэлли.", cure = "Лечение - медсестра приготовит специальную смесь химикатов для покрытия внутренностей пациента.", name = "Гнилые кишки", symptoms = "Симптомы - никакого кашля, но и никаких стенок желудка.", }, iron_lungs = { cause = "Причина - городской смог и дым от шашлыков.", cure = "Лечение - два хирурга проводят операцию чтобы удалить затвердевшие легкие.", name = "Железные легкие", symptoms = "Симптомы - способность выдыхать огонь и громко кричать под водой.", }, broken_wind = { cause = "Причина - упражнения на беговой дорожке после еды.", cure = "Лечение - насыщенная особыми водянистыми атомами микстура выпивается залпом.", name = "Бурные ветра", symptoms = "Симптомы - представляют опасность для находящих позади пациента.", }, kidney_beans = { cause = "Причина - разгрызание ледяных кубиков в напитках.", cure = "Лечение - два хирурга должны удалить бобы, не прикасаясь к почкам.", name = "Бобы в почках", symptoms = "Симптомы - боль и частые визиты в туалет.", }, transparency = { cause = "Причина - слизывание йогурта с крышечек упаковок.", cure = "Лечение - специально охлажденная и подкрашенная в аптеке вода вылечит эту болезнь.", name = "Прозрачность", symptoms = "Симптомы - плоть становится прозрачной и ужасно выглядит.", }, broken_heart = { cause = "Причина - кто-нибудь более молодой, богатый и стройный чем пациент.", cure = "Лечение - два хирурга вскрывают грудную клетку и, затаив дыхание, аккуратно собирают сердце.", name = "Разбитое сердце", symptoms = "Симптомы - плач и боли в мышцах от разрывания праздничных фотографий.", }, slack_tongue = { cause = "Причина - хроническое обсуждение мыльных опер.", cure = "Лечение - язык помещается в языкорезку и укорачивается быстро, точно, безжалостно.", name = "Длинный язык", symptoms = "Симптомы - язык примерно в пять раз увеличен в размерах.", }, tv_personalities = { cause = "Причина - просмотр телепередач в дневное время.", cure = "Лечение - квалифицированный психиатр должен убедить пациента выкинуть телевизор и купить радио.", name = "Звезда экрана", symptoms = "Симптомы - пациент думает, что может вести собственное кулинарное шоу.", }, ruptured_nodules = { cause = "Причина - прыжки с тарзанкой в холодную погоду.", cure = "Лечение - хирург удаляет грыжу твердой, уверенной рукой.", name = "Грыжа", symptoms = "Симптомы - невозможность сидеть с комфортом.", }, fractured_bones = { cause = "Причина - падение с большой высоты на бетонные поверхности.", cure = "Лечение - сперва накладывается гипс, затем он удаляется при помощи устройства с лазером.", name = "Сломанные кости", symptoms = "Симптомы - громкий треск и неспособность использовать поврежденные конечности.", }, chronic_nosehair = { cause = "Причина - высокомерное фыркание в присутствии менее успешных людей.", cure = "Лечение - отвратительное противоволосяное зелье приготавливается в аптеке.", name = "Хроническое носоволосение", symptoms = "Симптомы - нособорода, в которой можно свить гнездо.", }, pregnancy = { cure = "Вылечено - ребенка достали в Операционной, отмыли и познакомили с пациентом.", cause = "Причина - отключение электричества в жилых районах.", name = "Беременность", symptoms = "Симптомы - странное питание с последующей непроходимостью кишечника.", }, } -- 6. Факсы fax = { -- Эпидемия epidemic = { cover_up_explanation_1 = "Или вы можете попытаться вылечить всех зараженных, пока про это не узнали в министерстве здравоохранения.", cover_up_explanation_2 = "Если к приезду инспектора эпидемия все еще будет бушевать, приготовьтесь к неприятностям.", choices = { cover_up = "Попытаться вылечить всех зараженных пациентов пока есть время и пока он еще в больнице.", declare = "Объявить об эпидемии. Признать свою вину и заплатить штраф.", }, disease_name = "Ваши доктора обнаружили особо заразный подвид %s.", declare_explanation_fine = "Вы можете объявить об эпидемии, заплатить штраф в %d$, тогда вам немедленно окажут помощь в вакцинации. Ваша репутация несколько пострадает.", }, epidemic_result = { fine_amount = "Правительство объявило чрезвычайное положение, а вас оштрафовали на %d$.", close_text = "Ура!", hospital_evacuated = "У комиссии не осталось другого выбора, кроме как объявить эвакуацию.", succeeded = { part_1_name = "До департамента здоровья дошли слухи, что в вашей больнице бушует эпидемия %s.", part_2 = "Однако, инспектору не удалось найти им подтверждение.", }, compensation_amount = "Правительство решило компенсировать ущерб, который эти враки нанесли репутации вашей больницы, в сумме %d$.", failed = { part_1_name = "В попытке скрыть наличие заразной инфекции %s,", part_2 = "ваши сотрудники вызвали распространение болезни по округе.", }, rep_loss_fine_amount = "Журналисты уже заточили карандаши. Ваша репутация серьезно пострадает. К тому же, вас оштрафовали на %d$.", }, -- Визит шишки vip_visit_query = { choices = { invite = "Отправить шишке официальное приглашение", refuse = "Наврать что-нибудь, чтобы не приходил", }, vip_name = "%s выразил желание посетить вашу больницу", }, vip_visit_result = { telegram = "Телеграмма!", remarks = { good = { [1] = "Какая хорошая больница! Спасибо за приглашение.", [2] = "Хмм... Определенно, неплохое медицинское учреждение.", [3] = "Мне очень понравилась ваша милая больничка. Ну, кто со мной в ресторан?", }, super = { [1] = "Что за невероятная больница! Если я вдруг заболею, отвезите меня туда.", [2] = "Вот это я понимаю - больница!", [3] = "Это супербольница. Уж я-то в них разбираюсь.", }, bad = { [1] = "Не надо было мне приходить. Лучше бы я просидел четырехчасовую оперу!", [2] = "Мне до сих пор не по себе. Они правда называют свое заведение больницей? Больше похоже на свинарник!", [3] = "Я сыт по горло визитами в подобные выгребные ямы и постоянным вниманием прессы! Я подаю в отставку.", }, mediocre = { [1] = "Что ж, я видал и похуже. Им есть куда расти.", [2] = "Не знаю, стоит ли туда обращаться, если почувствуете себя неважно.", [3] = "Что я могу сказать, больница как больница. Я ожидал большего.", }, very_bad = { [1] = "Ну и свалка! Я приложу все усилия чтобы ее закрыли.", [2] = "Никогда не видел больницы хуже. Какой позор!", [3] = "Я потрясен. Это нельзя назвать больницей! Мне надо выпить.", }, free_build = { [1] = "У вас очень милая больница. Не сложно будет заставить ее работать без ограничений по деньгам, правда?", [2] = "Я не экономист, но я думаю что я тоже смогу управлять этой больницей. Если понимаете о чем это я...", [3] = "Отлично работающая больница. Берегитесь кризисов! Хотя... вам тут не о чем беспокоиться.", }, }, rep_boost = "Ваша репутация улучшилась.", vip_remarked_name = "После посещения вашей больницы, %s заметил:", cash_grant = "Вам выдали грант в размере %d$.", rep_loss = "Ваша репутация пострадала.", close_text = "Спасибо за приглашение.", }, -- Болезни disease_discovered = { discovered_name = "Ваша команда обнаружила новое заболевание. Это %s", can_cure = "Вы можете вылечить эту болезнь.", close_text = "Новое состояние было обнаружено.", need_to_build = "Вы должны построить %s чтобы вылечить это.", need_to_build_and_employ = "Если вы построите %s и наймете %s то сможете преуспеть.", need_to_employ = "Наймите %s для того чтобы справиться с этим кризисом.", }, disease_discovered_patient_choice = { need_to_build = "Для лечения нам потребуется %s.", need_to_employ = "Наймите %s чтобы вылечить это.", what_to_do_question = "Что нам делать с этим пациентом?", guessed_percentage_name = "Мы не совсем уверены, что с этим пациентом. Существует вероятность в %d% что это %s", choices = { send_home = "Отправить пациента домой.", research = "Отправить пациента в исследовательский отдел.", wait = "Задержать пациента в больнице на какое-то время.", }, disease_name = "Ваша команда обнаружила новое заболевание. Это %s", need_to_build_and_employ = "Можно будет попробовать, если вы построите %s и наймете %s .", can_not_cure = "Мы не можем это вылечить.", }, diagnosis_failed = { choices = { send_home = "Отправить пациента домой.", take_chance = "Рискнуть и попытаться вылечить.", wait = "Задержать пациента, пока вы не построите еще кабинетов диагностики.", }, situation = "Мы проверили этого пациента на всех наших машинах, но так и не поняли, что с ним случилось.", what_to_do_question = "Что нам с ним делать?", partial_diagnosis_percentage_name = "Есть шанс в %d%, что мы правильно угадаем какой вид %s у этого пациента.", }, -- Чрезвычайная ситуация emergency = { locations = { [1] = "Новоуренгойский химзавод", [2] = "Фальшивый Университет", [3] = "Центр Принудительного Озеленения", [4] = "Институт Разработки Опасных Штук", [5] = "Клуб Хороших Танцоров", [6] = "Издательство «МакулатураПресс»", [7] = "Похоронное бюро «Безенчук и нимфы»", [8] = "Китайский ресторанчик дяди Вонга", [9] = "ГлавХимСбытСтыдЗагранПоставка", }, num_disease = "У нас тут %d человек с диагнозом %s и им требуется немедленное лечение.", cure_possible_drug_name_efficiency = "У вас есть все необходимое оборудование и специалисты. У вас есть нужное лекарство. Это %s и оно эффективно на %d%", cure_not_possible_employ = "Вам потребуется нанять %s", cure_not_possible = "Сейчас вы не можете это вылечить.", cure_possible = "У вас есть все необходимое оборудование и специалисты, так что вы, наверное, справитесь.", choices = { accept = "Да. Я разберусь с этой ситуацией.", refuse = "Нет. Я отказываюсь в этом участвовать.", }, location = "На предприятии %s чрезвычайная ситуация.", cure_not_possible_build = "Вам надо будет построить %s", cure_not_possible_build_and_employ = "Вам надо будет построить %s и нанять %s", bonus = "Вознаграждение за помощь составит %d. Если вы не справитесь, ваша репутация серьезно пострадает.", free_build = "Если вы преуспеете, то ваша репутация повысится, если облажаетесь, то она будет серьезно подпорчена.", num_disease_singular = "Тут 1 пациент с %s и они требуют немедленого внимания.", }, emergency_result = { earned_money = "Из всей суммы %d$ вы заработали %d$.", close_text = "Нажмите чтобы закрыть.", saved_people = "Вы спасли %d из %d человек.", }, choices = { return_to_main_menu = "Вернуться в главное меню", accept_new_level = "Перейти к следующему уровню", decline_new_level = "Продолжить играть ещё некоторое время", }, debug_fax = { text2 = "ВСЕГО ЛЮДЕЙ В БОЛЬНИЦЕ %d ПРОВЕРЕНО %d", text7 = "РЕПУТАЦИЯ: %d ОЖИДАЕТСЯ %d СНИЖЕНИЕ %d", text9 = "КАТАСТРОФЫ %d РАЗРЕШЕНЫ (MTHS) %d (%d)СНИЖЕНИЕ %d", text4 = "ФАКТОРЫ : ДОКТОРА %d МЕДСЕСТРЫ %d ТЕРРИТОРИЯ %d КАБИНЕТ %d СТОИМОСТЬ %d", text1 = "ЛУЧШИЙ СЧЕТ %d", text6 = "СЛЕДУЮЩИЕ ФАКТОРЫ ТАК ЖЕ ПРИМЕНЕНЫ", close_text = "Да, Да, Да!", text3 = "КОЛИЧЕСТВА : ДОКТОРА %d МЕДСЕСТРЫ %d ТЕРРИТОРИЯ %d КАБИНЕТЫ %d СТОИМОСТЬ %d", text5 = "CONTRIBN : ДОКТОРА %d МЕДСЕСТРЫ %d ТЕРРИТОРИЯ %d КАБИНЕТЫ %d СТОИМОСТЬ %d ПРОЦЕНТ(ОВ)", text8 = "AMENITIES %d PEEPS HANDLED %d REDUCTION %d", text10 = "УБИЙСТВА %d ДОПУЩЕНО (MTHS) %d (%d) СНИЖЕНИЕ %d", text11 = "пациентОВ В ЭТОМ МЕСЯЦЕ %d", }, } -- 7. Советчик adviser = { tutorial = { build_reception = "Привет. Прежде всего, вашей новой больнице понадобится регистратура. Выберите ее в меню обстановки коридоров.", order_one_reception = "Щелкните один раз на мигающей строке, чтобы заказать стойку регистратуры.", accept_purchase = "Щелкните на мигающей кнопке, чтобы подтвердить заказ.", reception_invalid_position = "Стойка сейчас серого цвета, потому что ее нельзя разместить здесь. Попробуйте передвинуть или развернуть ее.", rotate_and_place_reception = "Пощелкайте правой кнопкой, чтобы развернуть стойку и установите ее левой кнопкой.", hire_receptionist = "А еще вам понадобится регистратор, чтобы принимать новых посетителей.", select_receptionists = "Нажмите мигающую кнопку, чтобы просмотреть регистраторов, которые ищут работу. Число на кнопке показывает, сколько кандидатур доступно.", next_receptionist = "Это резюме первой регистраторши в нашем списке. Нажмите мигающую кнопку, чтобы посмотреть следующее.", prev_receptionist = "Нажмите мигающую кнопку, чтобы вернуться к предыдущему резюме.", choose_receptionist = "Выберите регистратора, чьи профессиональные способности и зарплата вас устраивают и нажмите мигающую кнопку чтобы нанять ее.", receptionist_invalid_position = "Здесь ее поставить нельзя.", place_receptionist = "Поставьте вашу новую регистраторшу, где хотите. Она достаточно умна, чтобы добраться до своего стола.", build_gps_office = "Чтобы начать прием пациентов, первым делом постройте кабинет терапевта.", select_diagnosis_rooms = "Нажмите мигающую кнопку, чтобы увидеть список комнат диагностики.", click_gps_office = "Нажмите мигающую кнопку, чтобы выбрать кабинет терапевта.", click_and_drag_to_build = "Для начала решите, какого размера будет новый кабинет. Удерживайте левую кнопку мыши и растяните чертеж до нужного размера.", room_too_small = "Чертеж сейчас красного цвета потому, что он слишком мал. Растащите его побольше.", room_in_invalid_position = "Ой! Такой чертеж не пойдет, красная область перекрывает другие кабинеты или находится за стенами больницы.", room_big_enough = "Такого размера достаточно. Вы можете передвинуть кабинет или изменить размер еще раз, если хотите.", place_door = "Двигайте мышью вдоль стен кабинета, чтобы выбрать место для двери.", door_in_invalid_position = "Нет! Здесь нельзя сделать вход в кабинет. Щелкните где-нибудь на стене чертежа.", place_windows = "Проделайте несколько окон точно так же, как вы сделали дверь. Это совсем не обязательно, но так у ваших работников будет, куда глазеть в свободное время.", window_in_invalid_position = "Тут нельзя сделать окно. Будьте добры указать другое место на стене кабинета.", place_objects = "Правая кнопка вращает мебель, а левая устанавливает ее.", object_in_invalid_position = "Это предмет нельзя поставить здесь. Пожалуйста, переместите его или попробуйте повращать, возможно он станет сюда боком.", confirm_room = "Нажмите мигающую кнопку, чтобы завершить строительство, или нажмите на крестик, чтобы вернуться к предыдущему шагу.", information_window = "Справочное сообщение рассказывает вам о кабинете терапевта, который вы только что построили.", hire_doctor = "Чтобы обследовать и лечить пациентов, вам понадобится доктор.", select_doctors = "Нажмите мигающую кнопку, чтобы просмотреть докторов, которые ищут работу.", choose_doctor = "Как следует изучите резюме и рекомендации кандидатов прежде чем сделаете выбор.", place_doctor = "Поставьте доктора где-нибудь в пределах больницы. Он направится в кабинет терапевта, когда к вам придет первый пациент.", doctor_in_invalid_position = "Эй! Тут его поставить нельзя.", start_tutorial = "Прочитайте ваше задание а потом нажмите левую кнопку мыши, чтобы начать обучение.", room_too_small_and_invalid = "Кабинет слишком маленький, да еще размещен в недопустимом месте.", build_pharmacy = "Поздравляем! Теперь постройте Аптеку и наймите Медсестру, чтобы у вас получилась работающая больница.", }, epidemic = { hurry_up = "Если что-то не сделать с этой эпидемией, мы окажемся в беде по самые ноздри. Шевелитесь!", serious_warning = "Эта заразная болезнь распространяется с невиданной скоростью. Сделайте же что-нибудь!", multiple_epidemies = "Похоже, у нас тут несколько эпидемий сразу. Какой кошмар.", }, staff_advice = { need_handyman_machines = "Вам понадобится рабочий, чтобы ремонтировать машины в больнице.", need_doctors = "У вас не хватает врачей. Можно попробовать отправить самых лучших докторов в кабинеты с наибольшими очередями, вдруг поможет.", need_handyman_plants = "Вам понадобится рабочий, чтобы поливать растения.", need_handyman_litter = "Посетители совсем загадили нашу больницу. Наймите рабочего, чтобы подметать за ними.", need_nurses = "Вам нужно нанять медсестру. Аптека и палата не могут работать сами по себе.", too_many_doctors = "У вас слишком много докторов. Некоторые из них болтаются без дела.", too_many_nurses = "Я думаю что у вас слишком много медсестер... Они вам так нравятся?", }, earthquake = { damage = "От землетрясения пострадали %d машин и %d человек.", alert = "Приближается землетрясение. Ваши машины могут пострадать от него, а если они в плохом состоянии, то и вовсе развалиться.", ended = "Фух. Это было довольно сильным, примерно %d по шкале Рихтера.", }, surgery_requirements = { need_surgeons_ward_op = "Чтобы выполнять операции, вам надо нанять двух хирургов, а также построить палату и операционную.", need_surgeon_ward = "Чтобы начать оперировать, вам нужен еще один хирург и палата.", }, vomit_wave = { started = "Похоже, в нашей больнице завелся рвотный вирус. Если бы вы поддерживали чистоту, этого бы не случилось. Наймите больше рабочих.", ended = "Уф! Похоже, волна тошноты отступила. На будущее, постарайтесь содержать больницу в чистоте.", }, level_progress = { halfway_lost = "Вы на полпути к поражению.", dont_kill_more_patients = "Вы больше не можете себе позволить убивать пациентов.", another_patient_killed = "Ну вот! Еще один склеил ласты. И таких уже %d по больнице.", halfway_won = "Вы на полпути к победе.", close_to_win_increase_value = "Вы почти выиграли. Увеличьте стоимость больницы на %d.", financial_criteria_met = "Вы уже заработали достаточно денег. Не давайте балансу опуститься ниже %d и продолжайте эффективно управлять больницей.", nearly_won = "Вы уже почти выграли этот уровень.", hospital_value_enough = "Не давайте стоимости больницы упасть ниже %d и разберитесь с остальными проблемами, чтобы победить.", another_patient_cured = "Отлично, еще один пациент покинул больницу живым и здоровым. Мы вылечили уже %d.", three_quarters_lost = "Вы на три четверти проиграли этот уровень.", reputation_good_enough = "Хорошо, ваша репутация достаточно высока. Не опускайте ее ниже %d и разберитесь с имеющимися проблемами, чтобы победить.", cured_enough_patients = "Вы вылечили достаточно пациентов, но ваша больница еще недостаточно хороша.", nearly_lost = "Еще чуть-чуть - и вы проиграете.", improve_reputation = "Вам надо поднять репутацию еще на %d, чтобы выиграть этот уровень.", three_quarters_won = "Вы прошли три четверти пути к победе.", }, staff_place_advice = { receptionists_only_at_desk = "Регистраторы могут работать только в регистратуре.", only_psychiatrists = "В психиатрии могут работать только доктора с дипломом психиатра.", only_surgeons = "Только хирурги могут работать в операционной.", only_doctors_in_room = "Только Доктора могут работать в %s", only_nurses_in_room = "Только Медсестры могут работать в %s", nurses_cannot_work_in_room = "Медсестры не могут работать в %s", only_researchers = "Доктора могут работать в кабинете исследователей, только если у них есть квалификация исследователя.", doctors_cannot_work_in_room = "Доктора не могут работать в %s", }, room_forbidden_non_reachable_parts = "Так вы заблокируете доступ к другим частям больницы.", research = { machine_improved = "%s улучшен вашим исследовательским отделом.", drug_fully_researched = "Вы исследовали %s на 100%.", new_machine_researched = "Изобретена новая %s.", drug_improved = "Исследовательский отдел улучшил ваше лекарство от %s.", drug_improved_1 = "%s лекарство было улучшенно в вашем Департаменте Исследований.", new_available = "Новый %s стал доступен.", new_drug_researched = "Было исследовано новое лекарство для лечения %s ", autopsy_discovered_rep_loss = "О вашей машине Автоматического Вскрытия стало известно. Ждите негативную реакцию общественности.", }, boiler_issue = { minimum_heat = "Я вас везде ищу! Паровой котел в подвале развалился. Скоро у нас в больнице станет весьма прохладно.", maximum_heat = "Паровой котел в подвале заклинило! Регулятор температуры вышел из строя и мы тут все скоро помрем от жары! Можно попробовать поставить еще автоматов с газировкой.", resolved = "Ну слава Богу! Система отопления снова работает как надо. Теперь температура в больнице станет нормальной.", }, room_requirements = { research_room_need_researcher = "В исследовательском отделе должен работать доктор-исследователь.", op_need_another_surgeon = "Вам нужен еще один хирург, чтобы операционная наконец заработала.", op_need_ward = "Вам нужна палата, чтобы готовить пациентов к операции.", reception_need_receptionist = "Прием пацентов ведет регистратор.", psychiatry_need_psychiatrist = "Раз уж у вас есть кабинет психиатра, наймите и самого психиатра.", pharmacy_need_nurse = "Наймите медсестру, чтобы работать в аптеке.", ward_need_nurse = "Вам нужно нанять медсестру на работу в этой палате.", op_need_two_surgeons = "Наймите двух хирургов, чтобы начать выполнять операции.", training_room_need_consultant = "Вам нужен консультант, чтобы читать лекции.", gps_office_need_doctor = "Вам нужно нанять доктора, который будет вести прием в этом кабинете.", }, goals = { win = { money = "Заработайте еще %d$, чтобы соответствовать финансовым требованиям этого уровня.", cure = "Вылечите еще %d пациентов, чтобы выиграть этот уровень.", reputation = "Поднимите свою репутацию до %d, чтобы удолетворить требования уровня.", value = "Вам нужно поднять стоимость больницы до %d$", }, lose = { kill = "Убейте еще %d пациентов и вы проиграете!", }, }, warnings = { charges_too_low = "Вы мало просите за свои услуги. Хоть это и привлекает новых клиентов, вы с них много не получите.", charges_too_high = "У вас очень высокие цены. Это может временно поднять доходы, но так вы отпугиваете потенциальных клиентов.", staff_overworked = "Ваши люди сильно устают. От этого они работают кое-как и могут соверщать катастрофические ошибки.", doctors_tired = "Ваши доктора сильно устали. Скорее разрешите им отдохнуть.", people_did_it_on_the_floor = "У одного из пациентов иссякло терпение. Теперь кому-то придется все это отмывать.", queues_too_long = "У вас в больнице длинные очереди.", money_very_low_take_loan = "Ваш банковский баланс ниже плинтуса. Я слышала, у них там займы выдают.", patients_very_thirsty = "Ваши пациенты страдают от жажды. Если вы не поставите торговые автоматы, они пойдут пить домой, а лечиться - в другую больницу!", machinery_very_damaged = "Срочно найдите ремонтника, чтобы чинить ваши машины, а то кто-нибудь серьезно пострадает!", handymen_tired2 = "Ваши рабочие спят на ходу. Немедленно отправьте их в комнату отдыха.", desperate_need_for_watering = "Ваши растения умирают от жажды. Наймите рабочего, чтобы поливать их.", nurses_tired = "Ваши медсестры валятся с ног от усталости. Им очень нужен отдых.", too_much_litter = "У вас проблема с мусором. Ее можно решить, наняв еще рабочих.", reception_bottleneck = "Регистратура не справляется с наплывом посетителей. Вам нужно расширить ее и нанять еще регистратора.", place_plants4 = "Поставьте еще горшков с растениями, чтобы облегчить страдания пациентов.", change_priorities_to_plants = "Прикажите вашим рабочим чаще поливать растения.", staff_too_hot = "Вашим сотрудникам жарко. Уберите лишние батареи из кабинетов или уменьшите нагрев.", finanical_trouble2 = "Начинайте зарабатывать деньги или окажетесь за воротами. Потеряйте еще %d$ и вы проиграете.", plants_thirsty = "Присматривайте за растениями, их не помешает поливать почаще.", litter_everywhere = "У вас свалка, а не больница. Направьте еще рабочих на уборку.", nurses_tired2 = "Ваши медсестры засыпают на работе. Отправьте их отдыхать.", plants_dying = "Ваши растения засыхают на глазах, они в жизни не видели лейки. Мертвые растения нагоняют тоску на пациентов.", reduce_staff_rest_threshold = "Я тут подумала, может стоит уменьшить порог усталости для персонала в настройках политики больницы? Я не то, что бы настаиваю.", more_toilets = "Больнице нужны туалеты. Ваши клиенты с трудом сдерживают себя.", hospital_is_rubbish = "Везде говорят, что ваша больница ни к черту. Это ничем не помогает нам привлекать новых клиентов.", pay_back_loan = "У вас полно денег. Как насчет возврата долгов?", financial_trouble3 = "Состояние вашего банковского счета внушает опасения. Вам очень нужны деньги. Вы всего в %d$ от банкротства.", bankruptcy_imminent = "Эй! Еще немного и вы обанкротитесь. Тратьте осторожнее!", build_toilet_now = "Терпение ваших клиентов подходит к концу. Немедленно постройте туалет, или последствия не заставят себя ждать. И перестаньте ухмыляться, это серьезно!", patient_stuck = "Кто-то заблудился в ваших коридорах. У вас тут больница или парк развлечений?", no_patients_last_month = "В этом месяце у нас не было ни одного клиента. Вот так сюрприз.", more_benches = "Не помешает поставить скамеек. Не заставляйте больных стоять.", many_epidemics = "Похоже, у нас тут несколько эпидемий сразу. Это может обернуться серьезными проблемами.", place_plants_to_keep_people = "Люди злятся и уходят. Может горшков с цветами поставить?", patients_thirsty2 = "Пациенты хотят пить. Купите еще торговых автоматов или переставьте те, что есть, поудобнее.", money_low = "У вас заканчиваются деньги!", staff_unhappy = "Ваши сотрудники недовольны работой. Попробуйте подбодрить их премиями, а лучше постройте комнату персонала. Еще можно изменить политику больницы.", people_freezing = "Невероятно, в наш век центрального отопления ваши пациенты дрожат от холода. Поставьте батареи отопления и увеличьте нагрев.", need_toilets = "Пациентам нужны туалеты. И, желательно, поскорее.", nobody_cured_last_month = "В прошедшем месяце вы никого не вылечили.", patients_very_cold = "Пациенты замерзают. Увеличьте нагрев и поставьте побольше батарей в больнице.", build_toilets = "Немедленно постройте туалет или столкнетесь с антисанитарными последствиями. А запах...", many_killed = "Вы уже убили %d человек. Вы же их вроде лечить должны.", place_plants2 = "Люди уходят. Может, им не хватает зеленых растений?", staff_tired = "Ваши сотрудники невероятно устали. Если вы не дадите им отдохнуть в комнате персонала, они могут слететь с катушек.", machines_falling_apart = "Ваши машины разваливаются. Наймите ремонтника немедленно!", patients_unhappy = "Людям не нравится ваша больница. Предпримите что-нибудь по этому поводу.", place_plants3 = "Пациенты пребывают в печали. Поставьте горшков с цветами, чтобы подбодрить их.", staff_unhappy2 = "Ваши сотрудники недовольно ворчат. Скоро они захотят повышения зарплаты.", cash_low_consider_loan = "У вас на счету негусто. Как насчет кредита?", queue_too_long_at_reception = "У вас в регистратуре огромная очередь. Поставьте еще одну стойку и наймите регистратора.", queue_too_long_send_doctor = "В больнице огромная очередь в %s. Убедитесь, что там ведется прием.", financial_trouble = "Ваше финансовое положение удручает. Сделайте же что-нибудь! Потратьте еще %d$ и вы проиграете!", doctors_tired2 = "Ваши доктора невероятно устали. Им нужен отдых.", handymen_tired = "Ваши рабочие невероятно устали. Им нужен отдых.", patient_leaving = "Вот уходит пациент. Причина? У вас никчемная и бесполезная больница.", machinery_damaged2 = "Вашим машинам требуется ремонт, наймите рабочего.", patients_leaving = "Клиенты уходят. Сделайте вашу больницу более терпимой, поставив скамейки, растения, автоматы с газировкой и прочее.", epidemic_getting_serious = "Эта заразная болезнь быстро распространяется. Сделайте же что-нибудь!", machinery_damaged = "Быстрее почините свои машины. Скоро они начнут ломаться.", people_have_to_stand = "Несчастные больные вынуждены стоять. Поставьте еще скамеек.", build_staffroom = "Немедленно постройте комнату персонала. Ваши люди скоро начнут падать в обморок от усталости. Неужели для вас нет ничего святого!", machinery_slightly_damaged = "Оборудование вашего госпиталя понемногу изнашивается. Не забывайте чинить его время от времени.", need_staffroom = "Вашим сотрудникам нужна комната для отдыха.", patients_getting_hot = "В вашей больнице слишком жарко. Пожалуйста, снизьте нагрев или уберите часть батарей.", machinery_deteriorating = "Ваши машины начали изнашиваться от частого использования. Присматривайте за ними.", patients_too_hot = "Пациенты жалуются на жару. Уберите лишние батареи, снизьте температуру или поставьте еще автоматов с газировкой.", patients_thirsty = "Пациенты хотят пить. Может быть, стоит поставить торговые автоматы?", machine_severely_damaged = "%s скоро совсем развалится.", litter_catastrophy = "Мусор в вашей больнице выходит из под контроля. Скорее направьте еще рабочих на уборку!", staff_very_cold = "Сотрудники жалуются на холод. Увеличьте температуру или поставьте еще батарей.", deal_with_epidemic_now = "Если что-то не сделать с этой эпидемией, мы окажемся в беде по самые ноздри. Шевелитесь!", too_many_plants = "Я вижу, вы любите цветы. У вас тут настоящие джунгли.", patients_really_thirsty = "Пациенты очень хотят пить. Поставьте ваши торговые автоматы туда, где самые длинные очереди.", some_litter = "Дайте рабочим указание прибраться в больнице, пока проблема с мусором не разрослась.", patients_annoyed = "Люди терпеть не могут вашу больницу, и я не могу их винить за это. Разберитесь с вашими проблемами, или будет хуже!", doctor_crazy_overwork = "О Нет! Один из ваших докторов стал безумным из-за переработки! Он может вернуться в норму, если вы немедленно отправите его отдыхать.", no_desk_7 = "Вы построили регистратуру, как насчет нанять регистратора? Запомните, у вас не будет никаких пациентов, пока вы с этим не разберетесь!", researcher_needs_desk_1 = "Исследователю нужен стол, чтобы на нем работать.", no_desk_3 = "Это просто необыкновенно, прошел почти года, а вы так и не наняли регистратора! Как вы расчитываете получить пациентов? Теперь разберитесь с этим и прекратите заниматься ерундой.", no_desk_6 = "У вас нанят регистратор, теперь как насчет построить для нее Регистратуру?", no_desk_1 = "Если вы хотите, чтобы пациенты приходили в вашу больницу, вам следует построить Регистратуру и нанять регистратора, чтобы в ней работать.", falling_5 = "Это не место, чтобы выпинывать из него людей! Они больны, знаете ли!", no_desk = "Вам следует построить Регистратуру и нанять регистратора, наконец!", no_desk_2 = "Классно сработано! Это должно быть мировой рекорд: почти год и ни одного пациента! Если вы и дальше хотите управлять этой больницей вам нужно построить Регистратуру и нанять регистратора для работы в ней.", cannot_afford = "У вас недостаточно денег, чтобы нанять этого человека!", research_screen_open_1 = "Для доступа к разделу исследований, сначала нужно построить Исследовательский кабинет.", nurse_needs_desk_1 = "Каждой медсестре нужен собственный стол для работы.", researcher_needs_desk_2 = "Ваш исследователь благодарее вам, что вы разрешили сделать ему перерыв. Если вы намереваетесь иметь больше сотрудников для исследований, то каждому из них нужно купить персональный стол для работы.", research_screen_open_2 = "Исследования отключены на этом уровне.", falling_1 = "Эээй! это не смешно! Смотри куда кликаешь мышью, кое-кто может и пострадать!", receptionists_tired2 = "Ваши регистраторы очень устали. Дайти ем отдохнуть немедленно!", falling_3 = "Ауч, это было больно, кто-нибудь вызовите доктора!", no_desk_5 = "Что ж, это вопрос времени, следует подождать и пациенты скоро начнуть приходить!", no_desk_4 = "Регистратору нужен собственных стол, чтобы приветствовать пациентов, когда они заходят", falling_2 = "Хватит заниматься ерундой! Как вам это нравится?", researcher_needs_desk_3 = "Каждому исследователю нужен собственный стол для работы.", cannot_afford_2 = "У вас недостаточно денег в банке, чтобы сделать эту покупку!", falling_6 = "Это не боулинг, с больными людьми нельзя обращаться подобным образом!", nurse_needs_desk_2 = "Ваша Медсестра очень благодарна, что вы разрешили ей отдохнуть. Если вам нужно чтобы в Палате работало больше 1 медсестры купите каждой отдельный стол.", receptionists_tired = "Ваши регистраторы очень устали. Немедленно отправте их отдыхать.", falling_4 = "Это больница, а не Парк Развлечений!", }, placement_info = { door_cannot_place = "Извините, тут дверь проделать нельзя.", staff_cannot_place = "К сожалению, этого человека нельзя здесь поставить.", object_cannot_place = "Сюда не поместится.", room_cannot_place = "Здесь нельзя устроить кабинет.", room_cannot_place_2 = "Тут кабинет не поместится.", window_cannot_place = "Здесь нельзя сделать окно.", reception_cannot_place = "Регистратура сюда не встанет.", reception_can_place = "Вы можете установить регистратуру здесь.", window_can_place = "Вы можете расположить окно тут. Оно прекрасно.", door_can_place = "Вы можете расположить дверь тут, если хотите.", object_can_place = "Вы можете поставить этот объект здесь.", staff_can_place = "Вы можете разместить этого сотрудника тут. ", }, information = { larger_rooms = "Большие кабинеты повышают самооценку и производительность людей, которые в них работают.", extra_items = "Дополнительные предметы в кабинетах нравятся вашим сотрудникам и повышают производительность.", epidemic = "У вас в больнице распространяется заразная болезнь. Это нужно немедленно пресечь!", promotion_to_doctor = "Один из ваших студентов стал доктором.", emergency = "Чрезвычайная ситуация! Караул! Спасайся кто может!", patient_abducted = "Вашего клиента похищают пришельцы!", first_cure = "Отличная работа! Вы только что вылечили своего первого пациента.", promotion_to_consultant = "Один из ваших докторов стал консультантом.", handyman_adjust = "Вы можете повысить эффективность рабочих, перераспределив их приоритеты.", promotion_to_specialist = "Один из ваших докторов стал %s.", initial_general_advice = { rats_have_arrived = "В вашей больнице завелись крысы. Попробуйте пострелять их своей мышью.", first_patients_thirsty = "Посетители в вашей больнице хотят пить. Поставьте для них автоматы с газировкой.", research_now_available = "Вы построили исследовательский отдел. Теперь вы можете открыть окно исследований.", decrease_heating = "Посетители жалуются на жару. Понизьте уровень нагрева. Это можно сделать в окне карты.", first_emergency = "Над головой чрезвычайных пациентов крутится мигалка. Вылечите их до того, как закончится время.", first_epidemic = "У вас в больнице эпидемия! Примите решение, объявите ли вы о ней или попытаетесь скрыть.", taking_your_staff = "У вас пытаются переманить сотрудника. Вам придется побороться, если хотите удержать его.", place_radiators = "Посетители жалуются на холод. Вы можете заказать дополнительные батареи из меню обстановки коридоров.", epidemic_spreading = "Заразная болезнь распространяется по больнице. Постарайтесь вылечить зараженных до того, как они уйдут домой.", machine_needs_repair = "Одна из ваших машин требует ремонта. Найдите дымящуюся машину и щелкните на ней. Затем нажмите кнопку вызова рабочего.", increase_heating = "Пациенты замерзают. Увеличьте нагрев в окне карты.", first_VIP = "Скоро вас посетит с экскурсией какая-то большая шишка. Постарайтесь, чтобы он не заметил антисанитарии и недовольных пациентов.", psychiatric_symbol = "Доктора, разбирающиеся в вопросах психиатрии, оборзначены символом: |", research_symbol = "Доктора, умеющие проводить исследования, обозначены символом: }", surgeon_symbol = "Доктора, кто может проводить операции, обозначены симвовом: {", autopsy_available = "Исследована машина для автоматического вскрытия. С ее помощью вы можете избавляться от проблемных или нежелательных пациентов и проводить исследования над их останками. Но предупреждаем, что использование этой машины - это крайне спорная практика.", }, patient_leaving_too_expensive = "Пациент ушел, не заплатив за %s. Для него это слишком дорого.", vip_arrived = "Внимание! %s прибыл в вашу больницу с официальным визитом! Проследите, чтобы все прошло как по маслу.", epidemic_health_inspector = "Слухи об эпидемии в вашей больнице достигли министерства здравоохранения. Приготовьтесь в приезду инспектора.", first_death = "Вы только что угробили своего первого пациента. Надеюсь, вы собой довольны?", pay_rise = "Кто-то из ваших сотрудников угрожает уволиться. Вы можете согласиться на повышение зарплаты или отказать. Нажмите на значок слева внизу чтобы увидеть заявление.", place_windows = "Дополнительные окна делают комнаты светлее, а персонал - счастливее.", fax_received = "Значок, который сейчас вылез слева внизу экрана сообщает вам что-то важное или требует ваше решение по какому-либо вопросу.", }, competitors = { staff_poached = "Один из сотрудников вашей больницы перешел на работу в другой госпиталь.", land_purchased = "%s купил участок земли.", hospital_opened = "%s открыл конкурирующую больницу.", }, praise = { many_benches = "пациентам достаточно мест для седения. Прекрасно.", few_have_to_stand = "Очень немногим приходится стоять в вашей больнице. пациенты благодарны вам за это.", plenty_of_benches = "Тут есть много скамеек, так что это не проблема.", plants_thriving = "Очень хорошо. Ваши растения просто процветают. Они выглядят чудесно. Поддерживайте их и вы можете выйграть за них приз.", plants_are_well = "Мило. Вы хорошо заботитесь о своих растениях.", many_plants = "Прекрасно. У вас есть много растений. пациенты будут благодарны за это.", patients_cured = "%d пациентов вылечено." }, build_advice = { placing_object_blocks_door = "Расположение этого объета здесь не позволит людям входить в дверь.", door_not_reachable = "Люди не слогут входить в эту дверь. Подумайте об этом.", blueprint_would_block = "Такая планировка будет блокировать другие комнаты. Попробуйте изменить размер комнаты или переместить ее в другое место!", blueprint_invalid = "Это не допустимая планировка.", }, multiplayer = { poaching = { not_interested = " Ха! Им не интересно работать на вас - они счастливы на своем месте.", already_poached_by_someone = "Невозможно! Кто-то уже пытается переманить этого человека.", in_progress = "Я дам вам знать когда этот человек захочет перейти работать на вас.", }, players_failed = "Нижеследующим игрокам не удалось достичь последней цели : ", everyone_failed = "Всем не удалось достичь последней цели. Поэтому каждый может поиграть на !", }, cheats = { bloaty_cheat = "Обман Надутой головы активирован!", th_cheat = "Поздравляем, вы разблокировали обманки!", hairyitis_cheat = "Обман Оволосителя активирован!", crazy_on_cheat = "О нет! Все доктора сошли с ума!", roujin_off_cheat = "Состязание Roujin'а деактивировано.", crazy_off_cheat = "Уффф... врачи восстановили свое здравомыслие.", hairyitis_off_cheat = "Обман Оволосителя деактивирован.", roujin_on_cheat = "Состязание Roujin'а активировано! Удачи...", bloaty_off_cheat = "Обман Надутой головы деактивирован.", }, } -- 8. Письма из министерства introduction_texts = { demo = "Добро пожаловать в демонстрационную больницу!//" .. "К сожалению демонстрационная версия содержит только этот уровень. Но этого более чем достаточно, чтобы занять вас на некоторое время! " .. "Вы будете сталкиваться с разными заболеваниями, которые будет требовать разных кабинетов для лечения. Время от времени, будут поступать пациенты, требующие немедленного лечения. Так же вам необходимо разрабатывать новые кабинеты используя исследовательский кабинет. " .. "Ваша цель заработать $100 000, стоимость больницы должна быть $70 000, а репутация 700. Кроме того, вы должны вылечивать не менее 75% своих пациентов. " .. "Удостоверьтесь, что ваша репутация не упадет ниже 300 и вы не убиваете более 40% ваших пациентов. Иначе вы проиграете.//" .. "Удачи!", level1 = "Добро пожаловать в вашу первую больницу!//" .. "Чтобы начать принимать пациентов, постройте регистратуру и кабинет терапевта, наймите регистраторшу и доктора. " .. "Потом просто ждите когда придут первые пациенты." .. "Также, вам не помешает построить кабинет психиатра и нанять доктора с соответствующим дипломом. " .. "Чтобы лечить больных, вам потребуется аптека и медсестра. " .. "Приготовьтесь принимать пациентов с раздутой головой. Для них надо будет построить кабинет со специальной машиной. " .. "Попробуйте вылечить 10 человек и смотрите, чтобы ваша репутация не упала ниже 200.", level2 = "В этой местности встречается больше разных заболеваний. " .. "Подготовьте больницу к наплыву пациентов и не забудьте построить исследовательский отдел. " .. "Очень важно поддерживать ваше заведение в чистоте и стараться повысить свою репутацию. Ожидайте прибытия пациентов с длинными языками - постройте для них специальный кабинет. " .. "Комната кардиографии поможет вам точнее ставить диагнозы. " .. "Оба этих кабинета должны быть исследованы прежде, чем вы сможете их построить. В окне карты вы теперь можете приобретать дополнительные корпуса для вашей больницы. " .. "Ваша цель - заработать 10 000$, вылечить 40 человек и не уронить репутацию ниже 300.", level3 = "На этот раз ваша больница будет расположена в богатом районе. " .. "Министерство здравоохранения ожидает получить здесь нехилую прибыль. " .. "Для начала, вам предстоит заработать хорошую репутацию, затем сосредоточтесь на превращении ее в деньги. " .. "Знайте, что вы можете столкнуться с чрезвычайными ситуациями. " .. "Это означает, что к вам в больницу прибудет группа людей с серьезным заболеванием. " .. "Если вы успеете их вылечить за ограниченное время, то заработаете солидный бонус и хорошую репутацию. " .. "Вам придется столкнуться с синдромом Короля, а также выделить деньги на постройку палаты и операционной. " .. "Заработайте 20 000$ чтобы добиться успеха.", level4 = "Проследите, чтобы пациенты были довольны, хорошо обслужены и не умирали. " .. "Ваша репутация имеет большое значение, так что постарайтесь поднять ее как можно выше. " .. "Не беспокойтесь о деньгах - они придут вместе с высокой репутацией. " .. "Теперь вы также можете обучать ваших докторов, чтобы повысить их навыки. " .. "Так они смогут справляться даже с самыми необчными болезнями. " .. "Поднимите вашу репутацию до 500.", level5 = "С таким разнообразием заболеваний, как в этой больнице, вам не придется сидеть без дела." .. "Ваши доктора - вчерашние студенты, так что им необходимо будет подучиться." .. "У вас есть три консультанта, которые помогут обучить новичков, постарайтесь их не разозлить." .. "А еще наша больница стоит прямо над разломом Сан Андроид." .. "Ожидайте землетрясений." .. "Они могут повредить ваши машины и нарушить работу больницы." .. "Поддерживайте репутацию не ниже 400 и заработайте 50 000$. Также, вылечите 200 пациентов.", level6 = "Опираясь на весь свой опыт, постройте хорошо организованную больницу, приносящую стабильный доход и способную вылечить все, что угодно." .. "Знайте, что в этой местности особенно быстро распространяются всякие инфекции." .. "Если в вашей больнице не будет идеально чисто, ждите вспышек эпидемий среди пациентов." .. "Заработайте 150 000$ и доведите стоимость больницы до 140 000$.", level7 = "Здесь вы будете под неусыпным наблюдением министерства здравоохранения, так что постарайтесь, чтобы деньги текли рекой, а репутация стремилась ввысь. " .. "Мы не можем вам позволить убивать пациентов - это плохо для бизнеса. " .. "Проследите, чтобы у вас было все необходимое оборудование и высококлассные специалисты. " .. "Заработайте 600 репутации плюс 200 000$ на банковский счет.", level8 = "Ваша задача - построить как можно более эффективную и рентабельную больницу. " .. "Народ здесь живет на широкую ногу, так что не стесняйтесь стричь капусту изо всех сил. " .. "Нет, конечно, лечить людей - хорошо, и все такое, но вам ОЧЕНЬ нужны их деньги. " .. "Проследите, чтобы ваши пациенты были в состоянии дойти до кассы. " .. "Накопите на счету, ни много ни мало, 300 000$ чтобы завершить этот уровень.", level9 = "Теперь, когда на счету министерства полно денег, и сам министр разъезжает на новеньком лимузине, вы вновь можете заняться постройкой приличной, хорошо организованной больницы для самых нуждающихся. " .. "Будьте готовы к любым неприятностям." .. "Если вы озаботитесь приобретением всего необходимого оборудования и кадров, ничто не сможет причинить вам проблем. " .. "Ваша больница должна стоить 200 000$, а на вашем счету должно быть 400 000$. " .. "Мы не примем меньшего.", level10 = "Помимо излечения всех болезней, которые бывают в этом захолустье, министерство просит вас уделить внимание исследованию лекарств." .. "К нам поступают жалобы от некоего Овсика, местного активиста, так что улучшайте свои лекарства, чттобы не ударить в грязь лицом." .. "Также, не давайте поводов для упреков. Сведите число трупов к минимуму." .. "Кстати, отведите место для кабинета лечения ожеления." .. "Улучшите все лекарства до 80% эффективности, повысьте репутацию до 650 и соберите 500 000$.", level11 = "Вам предоставляется шанс построить идеальную больницу. " .. "Это невероятно престижное место, и министерство хотело бы видеть здесь соответствующее лечебное учреждение. " .. "Мы ожидаем от вас большой прибыли, высокой репутации и использования всех возможных средств для достижения цели. " .. "Это очень важная работа. " .. "Чтобы ее выполнить, вам придется лезть из кожи вон. " .. "Кстати, в этой местности замечены НЛО. Интересно, ваш персонал готов к подобным сюрпризам? " .. "Доведите стоимость больницы до $240,000, соберите $500,000 и поднимите репутацию до 700.", level12 = "Эта задача - вершина всех задач. " .. "Восхищенное вашим успехом, министерство предлагает вам сложную работу: им нужен кто-то, кто построит еще одну идеальную больницу, принесет огромное количество денег и заработает невероятную репутацию. " .. "От вас ожидается, что вы скупите всю землю в округе, вылечите всех (да-да, именно всех) и получите все награды. " .. "Возьметесь за дело?" .. "Заработайте $650,000, вылечите 750 человек и ваша репутация не должна быть ниже 800, чтобы выиграть.", level13 = "Ваше невероятное мастерство владения больницей заинтересовало сверхсекретный отдел сверхсексретной службы. " .. "У них есть для вас сюрприз: переполненная крысами больница требует эффективного вмешательства. " .. "Уничтожьте как можно больше крыс, пока рабочие не убрали весь мусор. " .. "Справитесь?", level14 = "Перед вами очередное задание: эта больница богата разного рода неожиданностями. " .. "Приведите ее к успеху и станьте победителем из победителей. " .. "Не думайте, что все будет очень легко. Перед вашим лицом предстанут весьма жесткие условия " .. "Удачи!", level15 = "Итак, освоим важные моменты для создания хорошей больницы.//" .. "Иногда вашим врачам требуется помощь в постановке правильного диагноза. Для дополнительных обследований " .. "необходимо построить специальные кабинеты, например, кабинет общей диагностики.", level16 = "Вы уже поставили диагнозы нескольким пациентам, и пора приниматься за их лечение. Для этого необходимо построить различные кабинеты. " .. "Для начала постройте аптеку и наймите медсестру, которая будет выдавать пациентам спасительные лекарства.", level17 = "Последнее предупреждение: зорко следите за репутацией, ведь именно она привлекает к вам пациентов из самых дальних уголков страны, а соответственно и их деньги. " .. "Если вы не будете убивать много людей и они будут довольны вашей больницей, особых проблем у вас не возникнет.//" .. "Теперь вы сами себе хозяин. Удачи! На этом все.", level18 = "", } letter = { [1] = { [1] = "Уважаемый %s,//", [2] = "Великолепно! Вы превосходно справляетесь с управлением этой больницей. Мы, большие шишки из министерства здравоохранения, хотим предложить вам заняться более крупным проектом. Вы идеально подходите нам для этой работы. Мы готовы платить вам %d$. Подумайте над нашим предложением.//", [3] = "Вас интересует работа в больнице «%s»?", }, [2] = { [1] = "Уважаемый %s,//", [2] = "Очень хорошо! Вы добились больших успехов в вашей больнице. Если вы не прочь сменить обстановку и не боитесь трудностей, мы можем предложить вам работу в другом месте. Соглашайтесь, и вы не пожалеете. Ваша зарплата составит %d$//", [3] = "Вы хотите работать в больнице «%s»?", }, [3] = { [1] = "Уважаемый %s,//", [2] = "Вы добились огромных успехов, управляя этой больницей. Посему, мы предсказываем вам большое будущее и хотим предложить новый пост. Мы готовы платить вам %d$ и думаем, вы не прочь принять этот вызов.//", [3] = "Вы хотите управлять больницей «%s»?", }, [4] = { [1] = "Уважаемый %s,//", [2] = "Поздравляем! У нас тут в министерстве все под впечатлением от ваши управленческих способностей. Мы возлагаем на вас большие надежды! Поэтому, мы хотим предложить вам работу посложнее. Ваша зарплата составит %d$, решение за вами.//", [3] = "Вас интересует работа в больнице «%s»?", }, [5] = { [1] = "Уважаемый %s,//", [2] = "Снова здравствуйте. Мы понимаем, как вам неохота покидать эту уютную больничку, но все же убедительно просим вас пересмотреть свое мнение. Мы будем платить вам %d$, если вы отправитесь в другую больницу и организуете ее работу так же хорошо.//", [3] = "Вы согласны отправиться работать в больницу «%s»?", }, [6] = { [1] = "Уважаемый %s,//", [2] = "Поздравляем. Представляем, как вы счастливы владеть этой прекрасной больницей, но следующая ступенька карьерной лестницы уже ждет вас. Вы будете получать $%d, если согласитесь. Надеемся, вы сделаете правильный выбор.//", [3] = "Согласны ли вы занять свое место в больнице «%s»?", }, [7] = { [1] = "Уважаемый %s,//", [2] = "Добрый день! В министерстве здравоохранения всем очень интересно, что держит вас в вашей больнице. Может быть, ваше заведение и превосходно, но, все же, хотим предложить вам перевод в новую больницу, где вас ожидают новые песпективы и зарплата в $%d.//", [3] = "Вы согласны перейти работать в больницу «%s»?", }, [8] = { [1] = "Уважаемый %s//,", [2] = "И еще раз, здравствуйте. Вы отклонили наше предыдущее предложение новой работы с зарплатой в %d$. Однако, мы настаиваем на пересмотре вами своего решения. Вот увидите, новое место работы намного лучше!//", [3] = "Пожалуйста, согласитесь занять пост руководителя в больнице «%s».", }, [9] = { [1] = "Уважаемый %s//,", [2] = "На протяжении длительного времени вы зарекомендовали себя как отличный руководитель. Такая заслуга не может остаться без награды, и мы рады предложить вам пост главного управляющего больницами. Это важная должность, и размер зарплаты составит $%d. Вы взойдете на пост по ковровой дорожке, и люди встретят вас с почетом.//", [3] = "Вами пройден большой путь. Спасибо за все, что вы делаете.//", [4] = "", }, [10] = { [1] = "Уважаемый %s//,", [2] = "Примите наши поздравления: вы изумительно справляетесь со всеми поставленными задачами. Ваш профессионализм открывает для вас множество путей. Вы будете получать пенсию в размере $%d и иметь личный лимузин, если согласитесь на наше предложение разъезжать по городам, проводя организационную работу в больницах.//", [3] = "Мы гордимся вами. Еще никто не отдавал столько сил на спасение человеческих жизней.//", [4] = "", }, [11] = { [1] = "Уважаемый %s//,", [2] = "Ваша карьера была образцовой, вы вдохновляли нас. Спасибо за посещение такого количества больниц и огромную проделанную работу. Предлагаем вам пожизненные выплаты в размере $%d, а вы будете разъезжать в роскошном кабриолете по больницам городов и проводить мастер-классы по достижению успеха в карьере.//", [3] = "Вы являетесь примером для каждого здравомыслящего человека, и все, без исключения, хотели бы стать такими же успешными, как вы.//", [4] = "", }, [12] = { [1] = "Уважаемый %s//,", [2] = "Ваша успешная карьера лучшего со времен Моисея управляющего больницей близится к завершению. Однако, учитывая ваши заслуги в медицине, министерство здравоохранения готово предложить вам $%d просто за то, что вы будете появляться на презентациях, открытиях, запусках кораблей и иногда на ток-шоу. Весь мир жаждет видеть вас, и ваше имя будет отличной рекламой для нас!//", [3] = "Пожалуйста, примите наше предложение. Работа несложная, и вам будет предоставлена машина и полицейский эскорт, куда бы вы ни отправились.//", [4] = "", }, custom_level_completed = "Отличная работа! Вы выполнили все задачи на этой карте!", dear_player = "Уважаемый %s", return_to_main_menu = "Вернетесь в главное меню или продолжите игру?", } -- 9. Имена и названия months = { [1] = "янв", [2] = "фев", [3] = "мар", [4] = "апр", [5] = "мая", [6] = "июн", [7] = "июл", [8] = "авг", [9] = "сен", [10] = "окт", [11] = "ноя", [12] = "дек", } humanoid_name_starts = { [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] = "Срам", [28] = "Винт", [29] = "Мал", [30] = "Треп", [31] = "Остр", [32] = "Плот", [33] = "Хрен", } humanoid_name_ends = { [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] = "атич", } vip_names = { [1] = "Мэр Большого Трумптона", [2] = "Лоуренс Найтингейл", [3] = "Бернард, король Нидерландов", [4] = "Онг Сян Су Куй, предводитель бирманской демократической оппозиции", [5] = "Сэр Риджинальд Крамбли", [6] = "Сэр Вилли Сэвил", [7] = "Советник Кроуфорд Первс", [8] = "«Ракета» Ронни Джепсон", [9] = "Футболист премьер-лиги", [10] = "Л. Ф. Пробст III", health_minister = "Министр здравоохранения", } -- 10 WIP -- 10.2 Не для перевода menu_options_volume = { [50] = " 50% ", [100] = " 100% ", [30] = " 30% ", [60] = " 60% ", [90] = " 90% ", [10] = " 10% ", [20] = " 20% ", [40] = " 40% ", [80] = " 80% ", [70] = " 70% ", } cheats_window = { cheats = { end_month = "Закончить Месяц", emergency = "Создать Критическое положение", win_level = "Выиграть Уровень", create_patient = "Создать Пациента", money = "Чит на Деньги", lose_level = "Проиграть Уровень", all_research = "Чит на Все Исследования", end_year = "Закончить Год", earthquake = "Вызвать землетрясение", vip = "Вызвать ВИП", }, close = "Закрыть", caption = "Читы", cheated = { no = "Использование читов: Нет", yes = "Использование читов: Да", }, warning = "Внимание: Вы не получите бонусные очки в конце уровня, если Вы будете использовать читы!", } original_credits = { [1] = " ", [2] = " ", [3] = " ", [4] = " ", [5] = " ", [6] = " ", [7] = " ", [8] = " ", [9] = " ", [10] = " ", [11] = " ", [12] = ":Designed and Created by", [13] = ":Bullfrog Productions", [14] = " ", [15] = ":Pluto Development Team", [16] = ",", [17] = "Mark Webley", [18] = "Gary Carr", [19] = "Matt Chilton", [20] = "Matt Sullivan", [21] = "Jo Rider", [22] = "Rajan Tande", [23] = "Wayne Imlach", [24] = "Andy Bass", [25] = "Jon Rennie", [26] = "Adam Coglan", [27] = "Natalie White", [28] = " ", [29] = " ", [30] = " ", [31] = ":Programming", [32] = ",", [33] = "Mark Webley", [34] = "Matt Chilton", [35] = "Matt Sullivan", [36] = "Rajan Tande", [37] = " ", [38] = " ", [39] = " ", [40] = ":Art", [41] = ",", [42] = "Gary Carr", [43] = "Jo Rider", [44] = "Andy Bass", [45] = "Adam Coglan", [46] = " ", [47] = " ", [48] = " ", [49] = ":Additional Programming", [50] = ",", [51] = "Ben Deane", [52] = "Gary Morgan", [53] = "Jonty Barnes", [54] = " ", [55] = " ", [56] = " ", [57] = ":Additional Art", [58] = ",", [59] = "Eoin Rogan", [60] = "George Svarovsky", [61] = "Saurev Sarkar", [62] = "Jason Brown", [63] = "John Kershaw", [64] = "Dee Lee", [65] = " ", [66] = " ", [67] = " ", [68] = ":Intro Sequence", [69] = ",", [70] = "Stuart Black", [71] = " ", [72] = " ", [73] = " ", [74] = ":Music and Sound Effects", [75] = ",", [76] = "Russell Shaw", [77] = "Adrian Moore", [78] = " ", [79] = " ", [80] = " ", [81] = ":Additional Music", [82] = ",", [83] = "Jeremy Longley", [84] = "Andy Wood", [85] = " ", [86] = " ", [87] = " ", [88] = ":Announcer Voiceover", [89] = ",", [90] = "Rebecca Green", [91] = " ", [92] = " ", [93] = " ", [94] = ":Level Design", [95] = ",", [96] = "Wayne Imlach", [97] = "Natalie White", [98] = "Steven Jarrett", [99] = "Shin Kanaoya", [100] = " ", [101] = " ", [102] = " ", [103] = ":Scripting", [104] = ",", [105] = "James Leach", [106] = "Sean Masterson", [107] = "Neil Cook", [108] = " ", [109] = " ", [110] = " ", [111] = ":R&D", [112] = " ", [113] = ":Graphics Engine", [114] = ",", [115] = "Andy Cakebread", [116] = "Richard Reed", [117] = " ", [118] = " ", [119] = " ", [120] = ":R&D Support", [121] = ",", [122] = "Glenn Corpes", [123] = "Martin Bell", [124] = "Ian Shaw", [125] = "Jan Svarovsky", [126] = " ", [127] = " ", [128] = " ", [129] = ":Library and Tools", [130] = " ", [131] = "Dos and Win 95 Library", [132] = ",", [133] = "Mark Huntley", [134] = "Alex Peters", [135] = "Rik Heywood", [136] = " ", [137] = " ", [138] = " ", [139] = ":Network Library", [140] = ",", [141] = "Ian Shippen", [142] = "Mark Lamport", [143] = " ", [144] = " ", [145] = " ", [146] = ":Sound Library", [147] = ",", [148] = "Russell Shaw", [149] = "Tony Cox", [150] = " ", [151] = " ", [152] = " ", [153] = ":Installer Programming", [154] = ",", [155] = "Andy Nuttall", [156] = "Tony Cox", [157] = "Andy Cakebread", [158] = " ", [159] = " ", [160] = " ", [161] = ":Moral Support", [162] = ",", [163] = "Peter Molyneux", [164] = " ", [165] = " ", [166] = " ", [167] = ":Testing Manager", [168] = ",", [169] = "Andy Robson", [170] = " ", [171] = " ", [172] = " ", [173] = ":Lead Testers", [174] = ",", [175] = "Wayne Imlach", [176] = "Jon Rennie", [177] = " ", [178] = " ", [179] = " ", [180] = ":Play Testers", [181] = ",", [182] = "Jeff Brutus", [183] = "Wayne Frost", [184] = "Steven Lawrie", [185] = "Tristan Paramor", [186] = "Nathan Smethurst", [187] = " ", [188] = "Ryan Corkery", [189] = "Simon Doherty", [190] = "James Dormer", [191] = "Martin Gregory", [192] = "Ben Lawley", [193] = "Joel Lewis", [194] = "David Lowe", [195] = "Robert Monczak", [196] = "Dominic Mortoza", [197] = "Karl O'Keeffe", [198] = "Michael Singletary", [199] = "Andrew Skipper", [200] = "Stuart Stephen", [201] = "David Wallington", [202] = " ", [203] = "And all our other Work Experience Play Testers", [204] = " ", [205] = " ", [206] = " ", [207] = ":Technical Support", [208] = ",", [209] = "Kevin Donkin", [210] = "Mike Burnham", [211] = "Simon Handby", [212] = " ", [213] = " ", [214] = " ", [215] = ":Marketing", [216] = ",", [217] = "Pete Murphy", [218] = "Sean Ratcliffe", [219] = " ", [220] = " ", [221] = " ", [222] = ":With thanks to:", [223] = ",", [224] = "Tamara Burke", [225] = "Annabel Roose", [226] = "Chris Morgan", [227] = "Pete Larsen", [228] = " ", [229] = " ", [230] = " ", [231] = ":PR", [232] = ",", [233] = "Cathy Campos", [234] = " ", [235] = " ", [236] = " ", [237] = ":Documentation", [238] = ",", [239] = "Mark Casey", [240] = "Richard Johnston", [241] = "James Lenoel", [242] = "Jon Rennie", [243] = " ", [244] = " ", [245] = " ", [246] = ":Documentation & Packaging Design", [247] = ",", [248] = "Caroline Arthur", [249] = "James Nolan", [250] = " ", [251] = " ", [252] = " ", [253] = ":Localisation Project Manager", [254] = ",", [255] = "Carol Aggett", [256] = " ", [257] = " ", [258] = " ", [259] = ":Localisation", [260] = ",", [261] = "Sandra Picaper", [262] = "Sonia 'Sam' Yazmadjian", [263] = " ", [264] = "Bettina Klos", [265] = "Alexa Kortsch", [266] = "Bianca Normann", [267] = " ", [268] = "C.T.O. S.p.A. Zola Predosa (BO)", [269] = "Gian Maria Battistini", [270] = "Maria Ziino", [271] = "Gabriele Vegetti", [272] = " ", [273] = "Elena Ruiz de Velasco", [274] = "Julio Valladares", [275] = "Ricardo Mart®ez", [276] = " ", [277] = "Kia Collin", [278] = "CBG Consult", [279] = "Ulf Thor", [280] = " ", [281] = " ", [282] = " ", [283] = ":Production", [284] = ",", [285] = "Rachel Holman", [286] = " ", [287] = " ", [288] = " ", [289] = ":Producer", [290] = ",", [291] = "Mark Webley", [292] = " ", [293] = " ", [294] = " ", [295] = ":Associate Producer", [296] = ",", [297] = "Andy Nuttall", [298] = " ", [299] = " ", [300] = " ", [301] = ":Operations", [302] = ",", [303] = "Steve Fitton", [304] = " ", [305] = " ", [306] = " ", [307] = ":Company Administration", [308] = ",", [309] = "Audrey Adams", [310] = "Annette Dabb", [311] = "Emma Gibbs", [312] = "Lucia Gobbo", [313] = "Jo Goodwin", [314] = "Sian Jones", [315] = "Kathy McEntee", [316] = "Louise Ratcliffe", [317] = " ", [318] = " ", [319] = " ", [320] = ":Company Management", [321] = ",", [322] = "Les Edgar", [323] = "Peter Molyneux", [324] = "David Byrne", [325] = " ", [326] = " ", [327] = ":All at Bullfrog Productions", [328] = " ", [329] = " ", [330] = " ", [331] = ":Special Thanks to", [332] = ",", [333] = "Everyone at Frimley Park Hospital", [334] = " ", [335] = ":Especially", [336] = ",", [337] = "Beverley Cannell", [338] = "Doug Carlisle", [339] = " ", [340] = " ", [341] = " ", [342] = ":Keep On Thinking", [343] = " ", [344] = " ", [345] = " ", [346] = " ", [347] = " ", [348] = " ", [349] = " ", [350] = " ", [351] = " ", [352] = " ", [353] = " ", [354] = " ", [355] = " ", [356] = " ", [357] = " ", [358] = " ", [359] = " ", [360] = " ", [361] = ".", } -- 10.3 Непереведенные tooltip = { queue_window = { end_of_queue = "Перетащите пациента на этот значок, чтобы переместить его в конец очереди", num_entered = "Количество пациентов, посетивших кабинет", close = "Закрыть запрос", num_in_queue = "Количество пациентов в очереди", num_expected = "Количество пациентов, направленных сюда из регистратуры", front_of_queue = "Перетащите пациента на этот значок, чтобы переместить его в начало очереди", dec_queue_size = "Уменьшить максимальный размер очереди", max_queue_size = "Макимальный размер очереди в регистратуру", inc_queue_size = "Увеличить максимальный размер очереди", patient = "Перетащите пациента в нужное место очереди. Щелкните на пациенте правой кнопкой, чтобы отправить его домой или в другую больницу", patient_dropdown = { send_home = "Выгнать пациента из больницы", hospital_2 = "Направить пациента в другую больницу", reception = "Отправить в регистратуру", hospital_1 = "Направить пациента в другую больницу", hospital_3 = "Направить пациента в другую больницу", }, }, jukebox = { rewind = "Предыдущая дорожка", loop = "Повторять текущую дорожку", stop = "Остановить", close = "Закрыть", current_title = "Текущая дорожка", play = "Воспроизвести", fast_forward = "Следующая дорожка", }, graphs = { deaths = "Показать/скрыть умерших", close = "Закрыть окно", scale = "Масштаб графика", money_out = "Показать/скрыть расходы", visitors = "Показать/скрыть посетителей", wages = "Показать/скрыть зарплаты", balance = "Показать/скрыть баланс", money_in = "Показать/скрыть доход", cures = "Показать/скрыть вылеченных", reputation = "Показать/скрыть репутацию", }, message = { button = "Щелкните, чтобы открыть сообщение", button_dismiss = "Щелкните левой кнопкой, чтобы просмотреть сообщение, правой - чтобы отклонить его", }, pay_rise_window = { accept = "Повысить зарплату", decline = "Отказать в повышении зарплаты", }, custom_game_window = { start_game_with_name = "Загрузить уровень %s", free_build = "Свободное строительство", }, cheats_window = { close = "Закрыть окно с читами", cheats = { end_month = "Перепрыгивает в конец месяца.", emergency = "Создает критическое положение.", win_level = "Выиграть уровень.", create_patient = "Создает Пациента в конце карты.", money = "Добавляет 10.000 к Вашему балансу.", lose_level = "Проиграть уровень.", all_research = "Завершает все исследования.", end_year = "Перепрыгивает в конец года.", }, }, menu_list_window = { back = "Закрыть окно", save_date = "Измененялось", name = "Имя", }, watch = { emergency = "Чрезвычайное происшествие: время, оставшееся на лечение срочных пациентов.", hospital_opening = "Время на постройку: по истечении этого времени больница будет открыта. Если вы хотите открыть больницу уже сейчас, нажмите зеленую кнопку.", epidemic = "Эпидемия: время на остановку эпидемии. Когда время закончится или зараженный пациент покинет больницу, приедет инспектор. Кнопка включает/отключает режим вакцинации. Щелкните на пациенте, и медсестра введет ему вакцину.", }, calls_dispatcher = { assigned = "Это поле отмечено, если кому-то присвоено соответствующее задание.", task = "Список заданий - нажмите на задание, чтобы открыть окно назначенного персонала и прокрутить до расположения задачи", close = "Закрыть окно диспетчера", }, information = { close = "Закрыть окно информации", }, lua_console = { textbox = "ВВедите здесь Lua код для запуска", execute_code = "Запустить введенный Вами код", close = "Закрыть консоль", }, staff_window = { doctor_seniority = "Авторитет (Студент, Доктор, Консультант)", psychiatrist = "Психиатр", close = "Закрыть окно", ability = "Компетентность", pick_up = "Взять", sack = "Уволить", surgeon = "Хирург", happiness = "Настроение", salary = "Ежемесячная зарплата", name = "Имя", tiredness = "Запас сил", center_view = "Левая кнопка - центрировать экран, правая - выбрать следующего сотрудника", skills = "Особые умения", researcher = "Исследователь", face = "Портрет - нажмите, чтобы перейти к экрану управления персоналом", }, research = { cure_inc = "Повысить приоритет исследований", close = "Закрыть экран исследований", specialisation_dec = "Понизить приоритет исследований", diagnosis_dec = "Понизить приоритет исследований", allocated_amount = "Выделенные ресурсы", improvements_inc = "Повысить приоритет исследований", drugs_dec = "Понизить приоритет исследований", drugs_inc = "Повысить приоритет исследований", cure_dec = "Понизить приоритет исследований", specialisation_inc = "Повысить приоритет исследований", improvements_dec = "Понизить приоритет исследований", diagnosis_inc = "Повысить приоритет исследований", }, statement = { close = "Закрыть экран баланса", }, buy_objects_window = { confirm = "Купить предмет(ы)", cancel = "Отмена", increase = "Купить на один предмет больше", total_value = "Общая сумма покупки", price = "Стоимость предмета", decrease = "Купить на один предмет меньше", }, fax = { close = "Закрыть окно, не удаляя сообщение", }, window_general = { confirm = "Подтвердить", cancel = "Отмена", }, } totd_window = { previous = "Предыдущая подсказка", tips = { [1] = "Любая больница нуждается в регистратуре и кабинете терапевта. Именно в них решается дальнейшая судьба пациента и он направляется на дальнейшее лечение. Кстати, аптека тоже не помешает.", [2] = "Машины, например, аппарат надувания, требуют регулярного ухода. Для этого нужно нанять одного-двух работников. Испорченные машины могут доставить много неприятностей как персоналу, так и пациентам.", [3] = "Персоналу свойственно уставать. Не забывайте строить комнаты отдыха для них.", [4] = "Устанавливайте достаточно батарей отопления для поддержания тепла в больнице, иначе персонал и пациенты будут недовольны. Распределение тепла по помещению можно посмотреть на карте города.", [5] = "Профессионализм доктора сильно влияет на скорость постановки диагноза и качество лечения. Один профессиональный терапевт способен заменить двух неопытных.", [6] = "Студенты и доктора могут повышать свой профессиональный уровень на лекциях консультанта. Если консультант обладает специальными навыками (психиатра, хирурга или исследователя), он сможет передать их ученикам.", [7] = "А вы пробовали набирать европейский номер службы спасения (112) на факсе? Перед тем, как пробовать, включите звук!", [8] = "Вы можете изменить некоторые настройки, например разрешение экрана или язык игры, перейдя в меню настроек из главного меню или непосредственно из игры.", [9] = "Везде английские слова, хотя вы выбрали в настройках совсем не английский язык? Помогите закончить перевод игры!", [10] = "Команда CorsixTH нуждается в вашей помощи! Если вы хотите помочь в написании кода, создании графики или перевода игры, свяжитесь с нами на форуме, по электронной почте или на IRC-канале (corsix-th at freenode).", [11] = "Если вы нашли ошибки, пишите на наш багтрекер: th-issues.corsix.org", [12] = "Каждый уровень игры требует выполнения определенных условий для его завершения. Периодически заглядывайте в окно статуса, чтобы знать, какие условия выполнены, а какие - еще нет.", [13] = "Для редактирования или удаления кабинета есть специальная кнопка на панели внизу экрана.", [14] = "Чтобы разобраться в толпе пациентов, наведите курсор на кабинет, и ожидающие своей очереди посетители будут выделены.", [15] = "Щелкните на двери кабинета для просмотра очереди. Пациентов, стоящих в очереди можно перемещать, направлять в другие кабинеты и даже выгонять.", [16] = "Недовольный персонал требует повышения зарплат. Убедитесь в том, что ваши работники пребывают в кофортабельных условиях труда.", [17] = "Если в помещении больницы становится слишком жарко, пациентов начинает мучать жажда! Во избежание этого установите достаточное количество автоматов с водой в коридорах.", [18] = "Вы можете прервать диагностику пациента, будучи уверенным в постановке диагноза. Но будьте осторожны: ваша ошибка может повлечь за собой смерть пациента.", [19] = "Чрезвычайные ситуации могут принести вам неплохой доход, конечно, при условии, что у вас есть возможность и время для лечения таких пациентов.", }, next = "Следующая подсказка", } trophy_room = { reputation = "РЕПУТАЦИЯ", gen_repairs = { penalty = { [1] = "Ваши рабочие не обслуживают оборудование должным образом. Вам следует управлять ими рабочими лучше, возможно потребуется нанять больше рабочих, чтобы справиться с нагрузкой.", [2] = "У вас ужасное обслуживание аппаратов. Ваши сотрудники должны ухаживать за оборудованием клиники быстро и с заботой.", }, awards = { [1] = "Вы удостоены специальной награды для рабочих за поддержание оборудования клиники в хорошем состоянии. Отлично сработано! Устройте себе выходной.", [2] = "Ваши рабочие справляются лучше своих коллег в других больницах. Это главное достижение, с которым вас стоит поздравить.", [3] = "Оборудование больницы поддерживается в великолепном состоянии. Усилия ваших рабочих невероятны. Вы все заслуживаете этой престижной награды. Удивительная работа.", }, }, pop_percentage = { awards = { [1] = "Заметим, что вы привлекли большую часть населения города в прошлом году. Отлично сработано.", [2] = "Поздравляем. Более высокая доля местного населения посещает вашу больницу, нежели любую другую.", [3] = "Превосходно. Вы привлекли в свою больницу больше населения, чем посетило все остальные больницы вместе взятые.", }, penalty = { [1] = "Очень немногие пришли лечиться в вашу больницу в прошлом году. Чтобы заработать денег вам нужны платежеспособные страдальцы.", [2] = "Через двери любой больницы в этой местности проходит большая доля населения, чем через ваши. Вам должно быть очень стыдно.", }, }, happy_vips = { awards = { [1] = "Вы получили Нобелевскую премию за впечатления, произведенное на высокопоставленных особ. Все большие шишки, посещавшие вашу больницу за прошедший год, оценили ее выше всяких похвал.", [2] = "Поздравляем! Вы награждены орденом Подлизы за потакание всем большим шишкам, посещавшим вашу больницу в прошедшем году. Шикарно.", }, trophies = { [1] = "Клуб Важных Персон вручает вам кубок Популярности за оказанное внимание всем VIP-персонам, посетившим ваше заведение в прошедшем году. Теперь вы можете считать себя немного известнее.", [2] = "Агентство Известных Людей вручает вам Знаменитую Награду за удовлетворение каждого ВИП, кто посетил ваше предприятие. Считайте себя немного известным, почти одним из нас.", [3] = "Поздравляем с выигрышем ВИП Путешествия в награду за то что сделали жизнь трудолюбивых людей в глазах общественности лучше, угождая каждому из них, кто посетил вашу больницу. Просто чудесно.", }, }, happy_patients = { awards = { [1] = "Вы может быть самодовольны по поводу того, что в прошлом году пациенты были очень довольны находиться в вашей больнице.", [2] = "Люди, посетившие вашу больницу, в среднем были более довольны своим лечением, нежели в любой другой больнице в игре.", }, penalty = { [1] = "Люди, приходящие в вашу больницу, находят ее ужасной. Вам нужно лучше работать, чтобы заслужить уважение Министерства.", [2] = "Люди, лечащиеся в вашей больнице, очень недовольны ее состоянием. Вы должны тщательнее следить за состоянием пациента.", }, }, rats_killed = { awards = { }, trophies = { [1] = "Вы награждены кубком Истребителя за уничтожение %d крыс в вашей больнице за прошедший год.", [2] = "Вы номинированы на награду от Аниткрысной Коалиции за выдающиеся успехи в истреблении %d этих мерзких тварей за прошедший год.", [3] = "Вы награждены орденом Крысобоя за отвагу и доблесть в уничтожении этих гадких созданий. Было убито %d крыс за прошедший год.", }, }, happy_staff = { awards = { [1] = "Ваши сотрудники номинировали вас на эту награду. Они сказали, что хотя и есть что улучшать, ваша забота о них оставалась, в целом, хорошей.", [2] = "Ваши сотрудники счастливы работать на вас, у них не сходит улыбка с лица. Вы потрясающий управляющий.", }, trophies = { [1] = "Вы награждены кубком Улыбки за поддержание хорошего настроения ваших тружеников в течении прошедшего года.", [2] = "Институт Вселенского Счастья вручает вам приз за отсутвие в вашем прекрасном заведении несчастных работников в прошедшем году.", [3] = "Эта награда, Сияющий Позолоченный кубок, вручается вам за поддержание в прошедшем году хорошего настроения работников в любой ситуации!", }, regional_bad = { [1] = "Ваши сотрудники были очень несчастны в течение прошлого года. Вы должны знать об этом. На самом деле, в любой другой больнице персонал чувствует себя лучше, чем в вашей.", }, regional_good = { [1] = "Ваш персонал счастливее коллег в любой другой больнице. Довольный персонал значит больше прибыль и меньше смертность. Министерство этим довольно.", }, penalty = { [1] = "Ваши сотрудники хотят чтобы было известно о том, что они несчастны. Хороший персонал - это преимущество. Сделайте ваших людей счастливее или однажды вы многое потеряете.", }, }, rats_accuracy = { awards = { }, trophies = { [1] = "Вы несомненно заслужили уважение Общества снайперов за %d%% точность при отстреле крыс.", [2] = "Эта награда торжестенно вручается вам за %d%% попадания по крысам вашей больницы в прошедшем году.", [3] = "Чтобы отметить истребление %d%% крыс в вашей больнице, вам вручается премия Почётного крысолова!", }, }, all_cured = { awards = { [1] = "Поздравляем с получением ордена Марии Кюри за успешное излечение всех пациентов, посетивших вашу больницу в прошедшем году!", }, trophies = { [1] = "Международная Ассоциация Излечения с гордостью вручает вам кубок Всездравия за стопроцентное излечение пациентов в прошедшем году.", [2] = "Вы получаете Здоровенную премию за заботу о выздоровлении каждого пациента больницы!", }, }, no_deaths = { awards = { [1] = "Поздравляем! Вы получаете орден имени В. Безтрупова за стопроцентное выживание ваших пациентов.", [2] = "Ваш гейний свел количество смертей в госпитале к минимуму. Вы можете быть очень довольны этим результатом.", }, trophies = { [1] = "Общество Продолжения Жизни вручает вам награду за отсутствие смертей среди пациентов в прошедшем году.", [2] = "Вы награждены кубком Выживания за то, что в прошедшем году сохранили жизни всех своих пациентов. Поразительно!", [3] = "Вы были награждены Кубком ОСТАТЬСЯ В ЖИВЫХ за то что в этом году избежали смертей среди пациентов в вашей милой больнице. Отлично.", }, penalty = { [1] = "Количество смертей в вашей больнице в прошлом году было непреемлемо высокое. Уделяйте больше времени своей работе. Убедитесь, что в будущем выживет больше людей.", [2] = "Ваша больница опасна для здоровья пациентов. От вас ждали, что вы будете лечить своих пациентов, а не убивать их.", }, regional = { [1] = "Число погибших в вашей больнице в прошлом году было ниже, чем в любой другой в округе. Пожалуйста, примите эту награду.", }, }, many_cured = { awards = { [1] = "Примите наши поздравления с получением ордена Матери Терезы за большинство вылеченных пациентов в прошедшем году.", [2] = "Пожалуйста примите эту награду за то что вылечили пациентов больше, чем любая другая больница.", }, trophies = { [1] = "Международная Ассоциация Излечения торжественно вручает вам награду за излечение почти всех пациентов, обратившимся в больницу в прошедшем году.", [2] = "Вы получаете такую ценную награду, как кубок Выживания за невероятно высокий процент вылеченных пациентов вашего заведения за прошедший год.", [3] = "Вы были представлены к вручению Кубка Gargler за поддержание высокого процента вылеченных людей в прошлом году.", }, penalty = { [1] = "Ваша больница не смогла предоставить эффективное лечение, нуждающимся в нем, пациентам. Сконцентрируйтесь на том, чтобы сделать лечение более эффективным.", [2] = "Ваша больница наименее эффективная из всех, что касается лечения пациентов. Вы тащите Министерство на дно и сами опускаетесь туда же. Мне больше нечего сказать.", }, regional = { [1] = "Вы представлены к награде за беспрецедентное исцеление. Это за то, что вы вылечили больше пациентов, чем все остальные больницы вместе взятые.", }, }, curesvdeaths = { awards = { [1] = "Сердечно поздравляем с достижением впечатляющего соотношения вылеченных к убитым в вашей больнице в прошлом году.", }, penalty = { [1] = "Ваше соотношение вылеченных к убитым крайне плохое. Вы должны быть уверены в том, что вылечите больше людей, чем убьете. Помните - не наоборот.", }, }, emergencies = { award = { [1] = "Поздравляем: ваша эффективность и эффективное решение экстренных случаев приносит вам эту особенную награду. Отличная работа!", [2] = "Вы исключительно хорошо справляетесь с экстренными случаями. Эта награда за то что вы лучше всех справляетесь с большим потоком больных и страждущих.", }, regional_good = { [1] = "Министерство выяснило, что ваша больница в прошлом году справлялась с экстренными случаями лучше чем любая другая. Поэтому оно вручает вам эту награду.", }, penalty = { [1] = "Вы ужасно справляетесь с экстренными пациентами. Прилетающие пациенты для немедленного лечения требуют точного и своевременного внимания, чего вы не смогли им дать.", }, regional_bad = { [1] = "Что касается экстренных случаев с пациентами, ваша больница была самой ужасной в регионе. Это ваша вина в том, что вы томитесь в нижней части местной лиги экстренного лечения.", }, }, high_rep = { awards = { [1] = "Вам торжественно вручается награда Кабинета Министров за поддержание стабильно высокой репутации больницы в прошедшем году. Отлично!", [2] = "Пожалуйста, примите награду команды CorsixTH за высочайшую репутацию вашего заведения. Вы это заслужили.", }, trophies = { [1] = "Поздравляем с получением кубка Мегапафоса за достижение такой репутации в прошедшем году. Так держать!", }, penalty = { [1] = "Вы были дисциплинированы в поддержании очень плохой репутации на протяжение прошлого года. Убедитесь в том, что она поднимется в будущем.", [2] = "Репутация вашей больницы самая ужасная в городе. Вы опозорены. Улучшите ее или найдите другую работу.", }, regional = { [1] = "Пожалуйста примите нагдару от Bullfrog за самую высокую репутацию из всех больниц. Наслаждайтесь - вы это заработали.", [2] = "В этом году, репутация вашей больницы превысила все остальные вместе взятые. Это крупное достижение.", } }, consistant_rep = { trophies = { [1] = "Настоящим, вы получаете награду от Кабинета Министров за самые безупречные стандарты и наивысшую репутацию какая только может быть. Хорошо сработано.", [2] = "Поздравляем с получением Кубка СкуаэкиКлин за лучшую репутацию больницы в прошлом году. Вы это заслужили.", }, }, sold_drinks = { awards = { }, trophies = { [1] = "Международная Ассоциация Стоматологов вручает вам награду и медальку за огромное количество проданных газированных напитков за прошедший год.", [2] = "Ваша больница награждается кубком Пыщь-пыщь в честь продажи невероятного количества прохладительных напитков в прошедшем году.", [3] = "Позвольте нам, при поддержке кондитерской фабрики «Синий Пролетарий», вручить вам покрытый шоколадом кубок за высокий уровень продаж газированных напитков в прошедшем году.", }, }, wait_times = { award = { [1] = "Поздравляем. В вашей больнице пациенты почти не проводят время в очередях. Это важная награда.", }, penalty = { [1] = "Людям в вашей больнице приходится ждать слишком долго. Здесь всегда непреемлемые очереди. Вы должны управляться с вашими пациентами более эффективно, раз уж за это взялись.", }, }, healthy_plants = { awards = { [1] = "Поздравляем! Вы награждены орденом Лопаты и Тяпки за поддержание растений в добром здравии круглый год.", }, trophies = { [1] = "В честь того, что вы поддерживали растения в отличном состоянии весь прошедший год, Национальный Ботанический Сад вручает вам премию Листоворотки Дикопроизрастающей.", [2] = "Компания «СемеНа, получи» награждает вас премией имени Мичурина в честь своевременного ухода за растениями в прошедшем году.", }, }, cleanliness = { regional_good = { [1] = "Ваша больница была отмечена как одна из самых не прибранных в округе. В грязной больнице опасно и воняет. Вы лучше должны за этим следить.", }, award = { [1] = "Инспекторы отметили, что ваша больница очень чистая. Чистая больница - это безопасная больница. Поддерживайте ее в том же виде.", }, regional_bad = { [1] = "Ваша больница самая грязная в округе. Любой другой управляющий поддерживает свои коридоры более чистыми. Вы - позор медицины!", }, }, hosp_value = { awards = { [1] = " Министерство Здравоохранения хочет использовать представившуюся возможность, чтобы поздравить вас с впечатляющей общей стоимостью вашей больницы.", }, penalty = { [1] = "Вашей больнице не удалось достичь достойной стоимости. Вы приняли плохие решения по управлению капиталом. Помните, хорошая больница - это так же дорогая больница.", }, regional = { [1] = "Вы финансовый волшебник. Ваша больница стоить больше чем все остальные вместе взятые.", }, }, best_value_hosp = { regional = { [1] = "Поздравляем с владением самой дорогой больницей в игре. Хорошая работа. Постарайтесь сохранить это вдальнейшем.", }, penalty = { [1] = "Любая больница в округе стоит дороже вашей. Сделайте что-нибудь с этой позорной частью дел. Поставте больше дорогого оборудования!", }, trophies = { [1] = "Посздравляем с получением Кубка SqueakiKlean за больницу с лучшей репутацией в прошлом году. Вы это заслужили.", }, }, research = { regional_good = { [1] = "Ваши исследователи поддерживали вашу больницу в курсе последних разработок. Ваши исследователи заслужили эту награду. Продолжайте в том же духе!", }, regional_bad = { [1] = "Любая больница в округе продвинулась в исследованиях лучше вашей. Так как исследования критически важны для вашей больницы, то Министерство пребывает в ярости.", }, penalty = { [1] = "Вы били плохи в исследовании новых лекарств оборудования и методов лечения. Это очень плохо. Технологическое превосходство жизненно необходимо.", }, awards = { [1] = "Ваши исследования сохранили вашу больницу в курсе последних событий. Ваш исследовательский персонал заслужил эту награду. Хорошо сработано.", [2] = "В течение прошлого года вы исследовали больше лекарств и оборудования, чем можно было бы даже надеяться. Пожалуйста примите эту награду от всех нас из Министерства.", }, }, cash = "ДЕНЬГИ", } drug_companies = { [1] = "ГосФармХимПром", [2] = "ИП Лечилкин", [3] = "ОАО Шприцеватор", [4] = "КолесоПлюс", [5] = "ИП Бергман и Ко", } insurance_companies = { [1] = "ООО Вектор", [2] = "ЧП Луковые Кольца", [3] = "ООО Братство Стали", [4] = "ЧП Дедушка Вареник", [5] = "ОДО Лебединая Песня", [6] = "ГосБытСнабСтрах", [7] = "ООО Недострах", [8] = "ЧП Залкинд и сыновья", [9] = "Бивис и Батт-хед Ко", [10] = "ООО Застрахуй-ка", [11] = "ООО Страховой Синдикат", out_of_business = "ВЫШЕЛ ИЗ БИЗНЕСА", } competitor_names = { [1] = "ПРОФИТ", [2] = "МАРВИН", [3] = "МЕДИВАН", [4] = "ГИППОМЕД", [5] = "ТОНУС", [6] = "ЛОЩИНА", [7] = "ДЗЕН", [8] = "САЛВИН", [9] = "АКИРА", [10] = "ПУЛЬМАН", [11] = "ЧАРЛИ", [12] = "КРИОНИКА", [13] = "ГОРГОНА", [14] = "ОЛИФАНТ", [15] = "КАЛИНА", [16] = "НОРМАЛ", [17] = "ВИНСЕНТ", [18] = "МОЗЕС", [19] = "АМБУЛАНТА", [20] = "АХМЕД", [21] = "МАКСВЕЛ", [22] = "ДАНИЭЛ", [23] = "ОЛИВА", [24] = "НИК", } level_names = { [1] = "Отравинск", [2] = "Сонная лощина", [3] = "Полянск", [4] = "Правобережино", [5] = "Простецк", [6] = "Холмопупинка", [7] = "Зеленоград", [8] = "Белочкино", [9] = "Пограничинск", [10] = "Яичкино", [11] = "Квакушкино", [12] = "Избиваловка", [13] = "Большие Чумли", [14] = "Мелкопоповецк", [15] = "Клептоманск", } graphs = { deaths = "Умерло", money_in = "Доход", money_out = "Расход", visitors = "Посетители", wages = "Зарплата", balance = "Баланс", time_spans = { [1] = "1 год", [2] = "12 лет", [3] = "48 лет", }, cures = "Вылечено", reputation = "Репутация", } newspaper = { [1] = { [1] = "УЖАСЫ НАШЕГО КАБИНЕТА", [2] = "ТЕРАПЕВТ ВОЗОМНИЛ СЕБЯ БОГОМ", [3] = "КРУЧЕ ФРАНКЕНШТЕЙНА", [4] = "ЧТО У НАС НА СТОЛЕ?", [5] = "ОБЛАВА НА СУМАСШЕДШИХ ВРАЧЕЙ", }, [2] = { [1] = "ВРАЧ УПОРОЛСЯ В ХЛАМ", [2] = "ОТЪЯВЛЕННЫЙ ХИРУРГ", [3] = "КОНСУЛЬТАНТ-ДЕБОШИР", [4] = "АЛКО-ХИРУРГИЯ", [5] = "ХИРУРГ ПОД НАРКОЗОМ", [6] = "ВРАЧ ДЫШАЛ ПЕРЕГАРОМ", }, [3] = { [1] = "НЕУДАЧНАЯ ХИРУРГИЯ", [2] = "ВРАЧА ЗАСТАЛИ ВРАСПЛОХ", [3] = "ПРОВАЛ ВРАЧА", [4] = "НЕНАСЫТНЫЙ ХИРУРГ", }, [4] = { [1] = "ПОДПОЛЬНЫЕ ОПЕРАЦИИ", [2] = "ОРГАН-ИЗОВАННОЕ ПРЕСТУПЛЕНИЕ", [3] = "ОПЕРАЦИИ...С ДЕНЬГАМИ", [4] = "ВРАЧ ГРЕБ ДЕНЬГИ ЛОПАТКОЙ", }, [5] = { [1] = "МЕДИЦИНСКА НЕКРОФИЛИЯ", [2] = "ВРАЧ РАСКАПЫВАЛ МОГИЛЫ", [3] = "ЗАСТУКАЛИ С ТРУПОМ", [4] = "СУДНЫЙ ДЕНЬ ДЛЯ ДОКТОРА", [5] = "ТЕРМИНАЛЬНАЯ СТАДИЯ ПРАКТИКИ", [6] = "ДОКАЗАТЕЛЬСТВА ВЫКОПАНЫ!", }, [6] = { [1] = "ВРАЧА ПОВЯЗАЛИ!", [2] = "РРАЗ! И ВСЕ!", [3] = "ДИАГНОСТИКА НА КОФЕЙНОЙ ГУЩЕ", [4] = "КОНСУЛЬТАНТ-НЕВЕЖДА", }, [7] = { [1] = "ДОКТОР ЗНАЛ, ЧЕМ ВСЕ КОНЧИТСЯ", [2] = "ХИРУРГ ВСКРЫЛ САМ СЕБЯ", [3] = "В ПУЧИНЕ КОРРУПЦИИ", [4] = "ВРАЧ В ЦЕНТРЕ СКАНДАЛА", [5] = "ДОКТОР ЗАПУТАЛСЯ В СЛОВАХ", }, } -- 10.4 Неиспользуемые/системные/diff/хз что debug_patient_window = { caption = "Debug Patient", } menu_debug = { lua_console = " (%1%) LUA CONSOLE ", porter_pagers = " PORTER PAGERS ", object_cells = " OBJECT CELLS ", display_pager = " DISPLAY PAGER ", disable_salary_raise = " DISABLE SALARY RAISE ", make_debug_fax = " MAKE DEBUG FAX ", display_big_cells = " DISPLAY BIG CELLS ", make_debug_patient = " MAKE DEBUG PATIENT ", mapwho_checking = " MAPWHO CHECKING ", sprite_viewer = " SPRITE VIEWER ", keep_clear_cells = " KEEP CLEAR CELLS ", dump_strings = " (%1%) DUMP STRINGS ", machine_pagers = " MACHINE PAGERS ", remove_walls = " REMOVE WALLS ", enter_nav_debug = " ENTER NAV DEBUG ", lose_game_anim = { [1] = " LOSE GAME 1 ANIM ", [2] = " LOSE GAME 2 ANIM ", [3] = " LOSE GAME 3 ANIM ", [4] = " LOSE GAME 4 ANIM ", [5] = " LOSE GAME 5 ANIM ", [6] = " LOSE GAME 6 ANIM ", [7] = " LOSE GAME 7 ANIM ", }, map_overlay = " MAP OVERLAY ", calls_dispatcher = " CALLS DISPATCHER ", show_nav_cells = " SHOW NAV CELLS ", win_game_anim = " WIN GAME ANIM ", display_room_status = " DISPLAY ROOM STATUS ", cheats = " (%1%) CHEATS ", remove_objects = " REMOVE OBJECTS ", nav_bits = " NAV BITS ", win_level_anim = " WIN LEVEL ANIM ", dump_gamelog = " (%1%) DUMP GAME LOG ", limit_camera = " LIMIT CAMERA ", pixbuf_cells = " PIXBUF CELLS ", transparent_walls = " (%1%) TRANSPARENT WALLS ", show_help_hotspot = " SHOW HELP HOTSPOTS ", jump_to_level = " JUMP TO LEVEL ", entry_cells = " ENTRY CELLS ", plant_pagers = " PLANT PAGERS ", } lua_console = { execute_code = "Выполнить", close = "Закрыть", } calls_dispatcher = { repair = "Починить %s", summary = "%d вызовов; %d назначено", close = "Закрыть", watering = "Полить @ %d,%d", staff = "%s - %s", } information = { level_lost = { [1] = "Бум! Вы проиграли этот уровень! Может быть, повезет в следующий раз.", [2] = "Причина проигрыша:", reputation = "Ваша репутация упала ниже %d.", balance = "Ваш банковский баланс опустился ниже %d.", percentage_killed = "Более %d ваших пациентов отошли в мир иной.", }, cannot_restart = "К сожалению, эта пользовательская игра была сохранена до реализации функции перезапуска.", custom_game = "Добро пожаловать в CorsixTH. Развлекайтесь по полной на пользовательской карте!", very_old_save = "Произошло много улучшений с того момента, как вы в последний раз запускали этот уровень. Чтобы быть уверенным, что все функции работают как положено, пожалуйста перезапустите его.", cheat_not_possible = "Не могу так жульничать на этом уровне. Вы даже обмануть не можете, не смешно, да?", no_custom_game_in_demo = "Извините, но в демонстрационной версии вы не можете играть в дополнительные карты.", } confirmation.maximum_screen_size = "Размер экрана, введённый Вами, превышает 3000 x 2000. Большие разрешения поддерживаются, но требуют хорошее аппаратное обеспечение для поддержания нормальной частоты кадров. Вы уверены, что хотите продолжить?" confirmation.music_warning = "Если Вы хотите использовать mp3 файлы в качестве вашей музыки в игре, Ваша операционная система должна иметь smpeg.dll или его эквивалент, иначе музыка не будет проигрываться. Продолжить?" menu_options_wage_increase.deny = " ОТКАЗАТЬ " menu_options_wage_increase.grant = " РАЗРЕШИТЬ " tooltip.options_window.audio_button = "Включить/Выключить всё аудио в игре" tooltip.options_window.audio_toggle = "Включить/Выключить" tooltip.options_window.folder_button = "Свойства папки" tooltip.options_window.customise_button = "Больше настроек для улучшения игрового опыта" tooltip.update_window.download = "Перейти к странице загрузки новейшей версии CorsixTH" tooltip.update_window.ignore = "Игнорировать это обновление сейчас. Вы снова будете уведомлены при следующем запуске CorsixTH" tooltip.folders_window.browse_font = "Поиск другого файла со шрифтом ( текущее расположение: %1% )" tooltip.folders_window.screenshots_location = "По умолчанию скриншоты сохраняются в папке рядом с файлом конфигурации. По желанию Вы можете выбрать свою папку, просто укажите нужный путь к ней." tooltip.folders_window.reset_to_default = "Вернуть папку в её изначальное расположение" tooltip.folders_window.back = "Закрыть это меню и вернуться к настройкам" tooltip.folders_window.music_location = "Выберите расположение ваших mp3 аудиофайлов. Вы должны были уже создать для них папку, теперь же укажите путь к ней." tooltip.folders_window.font_location = "Расположение файла со шрифтом, который может отображать символы Юникода, необходимые вашему языку. Если это не будет указано, вы не сможете выбрать языки, которым нужно больше символов, чем игра может предложить. Например, китайский и русский." tooltip.folders_window.savegames_location = "По умолчанию папка, куда помещаются сохранения, находится в папке рядом с файлом конфигурации. По желанию Вы можете выбрать свою папку, просто укажите нужный путь к ней." tooltip.folders_window.browse_data = "Обзор расположения установленной версии Theme Hospital (текущее расположение: %1%)" tooltip.folders_window.browse = "Обзор расположения папки" tooltip.folders_window.browse_screenshots = "Обзор расположения папки скриншотов ( Текущее расположение: %1% ) " tooltip.folders_window.browse_music = "Обзор расположения папки музыки ( Текущее расположение: %1% ) " tooltip.folders_window.no_font_specified = "Расположение шрифта ещё не указано!" tooltip.folders_window.not_specified = "Расположение папки ещё не указано!" tooltip.folders_window.browse_saves = "Обзор расположения папки сохранений ( Текущее расположение: %1% ) " tooltip.folders_window.default = "Расположение по умолчанию" tooltip.folders_window.data_location = "Папка с установленной версией Theme Hospital, которая нужна CorsixTH для запуска" tooltip.customise_window.aliens = "Из-за отсутствия подходящих анимаций, по умолчанию пациенты-инопланетяне могут приходить только в крайних случаях. Чтобы разрешить пациентам с инопланетной ДНК приходить в любое время, выключите эту опцию" tooltip.customise_window.average_contents = "Если Вы хотите, чтобы игра запоминала, какие объекты Вы обычно добавляете при создании комнат, включите эту опцию" tooltip.customise_window.back = "Закрыть это меню и вернуться к настройкам" tooltip.customise_window.movies = "Глобальное управление роликами поможет вам выключить все ролики" tooltip.customise_window.fractured_bones = "Из-за плохо сделанной анимации женские пациенты со сломанными костями изначально выключены. Чтобы разрешить женщинам со сломанными костями посещать вашу больницу, выключите это" tooltip.customise_window.volume = "Если кнопка уменьшения громкости также открывает больничный журнал, включите эту опцию, чтобы поменять горячую клавишу для журнала на Shift+C" tooltip.customise_window.intro = "Выключить/Включить заставку; ролики должны быть включены, если Вы хотите, чтобы заставка проигрывалась при запуске CorsixTH" tooltip.customise_window.paused = "Во время паузы игрок в Theme Hospital может использовать только верхнее меню. По умолчанию это верно и для CorsixTH, но, включив эту опцию, вы можете получит доступ ко всему даже во время паузы" update_window.caption = "Доступно новое обновление!" update_window.new_version = "Новая версия:" update_window.current_version = "Текущая версия:" update_window.download = "Перейти к странице загрузки" update_window.ignore = "Пропустить и перейти к главному меню" errors.fractured_bones = "ПРИМЕЧАНИЕ: Анимация женских персонажей с разрушенными костями не идеальна" errors.alien_dna = "ПРИМЕЧАНИЕ: Для пациентов-инопланетян нет анимации сидения, открывания и стучания в двери и т.д. Поэтому, как и в Theme Hospital, они будут на время превращаться в обычных пациентов и обратно. Пациенты с инопланетной ДНК будут появляться только если это указано уровнем." errors.load_quick_save = "Ошибка, не удалось загрузить быстрое сохранение, так как оно не существовало, но мы создали для Вас новое!" folders_window.data_label = "Данные TH" folders_window.music_location = "Выберите папку, которую Вы хотите использовать для музыки" folders_window.music_label = "MP3 файлы" folders_window.new_th_location = "Здесь вы можете указать папку с установленной Theme Hospital. Как только вы выберете новую папку, игра будет перезапущена." folders_window.caption = "Расположения папок" folders_window.screenshots_label = "Скриншоты" folders_window.font_label = "Шрифт" folders_window.savegames_label = "Сохранения" folders_window.back = "Назад" folders_window.savegames_location = "Выберите папку, которую Вы хотите использовать для сохранений" folders_window.screenshots_location = "Выберите папку, которую Вы хотите использовать для скриншотов" customise_window.average_contents = "Среднее содержимое" customise_window.option_on = "Вкл" customise_window.paused = "Строить во время паузы" customise_window.option_off = "Выкл" customise_window.intro = "Проигрывать заставку" customise_window.caption = "Пользовательские настройки" customise_window.back = "Назад" customise_window.movies = "Управление роликами" customise_window.volume = "Горячая клавиша убавления громкости" customise_window.aliens = "Инопланетные пациенты" customise_window.fractured_bones = "Сломанные кости" options_window.folder = "Папки" options_window.customise = "Настроить" options_window.audio = "Глобальное аудио" menu_options.twentyfour_hour_clock = " 24-ЧАСОВОЕ ВРЕМЯ " menu_options.wage_increase = " ЗАПРОСЫ ЗАРПЛАТЫ" install.ok = "ОК" install.cancel = "Отмена" adviser.research.drug_improved_1 = "Лекарство %s было улучшено Вашим департаментом исследований." adviser.warnings.no_desk_7 = "Вы построили приёмную стойку, как насчёт нанятия регистратора? У Вас не будет пациентов, пока Вы с этим не разберётесь!" adviser.warnings.researcher_needs_desk_1 = "Исследователю нужно рабочее место" adviser.warnings.no_desk_6 = "Вы наняли регистратора, как насчёт приёмной стойки для него?" adviser.warnings.nurse_needs_desk_1 = "Каждая медсестра нуждается в собственном рабочем месте." adviser.warnings.researcher_needs_desk_2 = "Ваш исследователь рад, что Вы разрешили ему отдохнуть. Если Вы хотели, чтобы у Вас работали несколько исследователей, Вы должны предоставить каждому из них собственное рабочее место." adviser.warnings.no_desk_5 = "Время пришло, скоро к Вам начнут приходить пациенты!" adviser.warnings.no_desk_4 = "Регистратору нужна приёмная стойка, чтобы он мог приветствовать новых пациентов" adviser.warnings.researcher_needs_desk_3 = "Каждый исследователь нуждается в собственном рабочем месте." adviser.warnings.cannot_afford_2 = "У вас недостаточно денег в банке, чтобы сделать эту покупку!" adviser.warnings.nurse_needs_desk_2 = "Ваша медсестра рада, что Вы разрешили ей отдохнуть. Если Вы хотели, чтобы у Вас работали несколько медсестёр, Вы должны предоставить каждой из них собственное рабочее место." custom_game_window.free_build = "Свободное строительство" menu_list_window.save_date = "Изменено" menu_list_window.name = "Имя" information.level_lost.cheat = "Вы это выбрали или просто нажали не ту кнопку? Вы даже нормально обмануть не можете, не смешно, да?" CorsixTH-0.63/CorsixTH/Lua/languages/simplified_chinese.lua000066400000000000000000004201061347163623700237040ustar00rootroot00000000000000--[[ Copyright (c) 2012 lwglwsss 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. --]] -- Note: This file contains UTF-8 text. Make sure your editor is set to UTF-8. Font("unicode") Language("简体中文", "Chinese (simplified)", "zh(s)", "chi(s)", "zho(s)") Inherit("english") Encoding(utf8) ------------------------------------ --NEW STRINGS IN LANGUAGE "简体中文": ------------------------------------ date_format = { daymonth = "%2%月 %1%日", } misc = { no_heliport = "还没有疾病被发现或者地图上需要一个直升机场", not_yet_implemented = "(尚未实现)", } debug_patient_window = { caption = "病人除错", } totd_window = { tips = { "医院想开张就需要一个前台桌子和一个问诊室.这之后还需要根据不同病人建立各种房间.但有个药房总是对的.", "有一些机器需要维护,比如说充气机.所以雇一两个修理人员还是必要的, 不然那就是个定时炸弹.", "你的员工会不时感到疲倦. 所以建一间休闲室也很必要.", "多放点几个暖气,让你的员工和病人感到春天般温暖.用全景地图来查看它们的覆盖面积以决定是否还需要多放些.", "一个医生的医疗水平很大程度影响他的诊断速度.把最牛逼的医生放在问诊室,这样你会省下其他的问诊室.", "实习生和医生们可以通过在学习室向专家学习来提高水平.如果请来的专家拥有某一项专长,他也会教给他的学生们.", "有没有试过在传真机上拨112?这是欧洲的急救电话.别忘了把你的音箱开到最大!", "在主菜单和游戏菜单里面,找到选项窗口,在那里可以调整分辨率和语言.", "你选择了中文,但是你还是可能会在游戏中不停地看到英文.把他们翻译了吧,我们需要你的帮助!", "CorsixTH小组正在壮大!如果你对编程,翻译,创做主题医院需要的图片等等任何方面感兴趣,请通过我们的论坛,邮件列表或者IRC频道(corsix-th at freenode)联系我们.", "如果你碰到了bug,请提交给我们: th-issues.corsix.org", "每一关都需要满足特定的条件才能过关.你可以通过状态窗口看到你的进度.", "如果你需要编辑或者删除一间房间,屏幕下方找到工具栏,然后点编辑房间按钮.", "在成群结队等待就诊的病人中, 你可以通过指向房间的门来找到哪些病人在等.", "点击房间门可以看到等待队列.你可以做些调整让某些人走个后门,或者送到另一个房间去.", "不开心的员工只有通过涨薪来平衡自己了.你要保证你的员工的工作环境像家一样,才能让他们甘心给你卖命.", "病人等的时间长了,会口渴,如果开了暖气,口渴得会更快!放些自动贩卖机吧,还能多些零花钱.", "如果你见过某种病,你可以中断诊疗过程直接去治,治死了不要找我.", "从紧急事件总能赚一大笔,但是你要按时处理好才行.", }, previous = "前一项提示", next = "下一项提示", } tooltip = { totd_window = { previous = "显示上一个提示", next = "显示下一个提示", }, message = { button = "点击打开消息", button_dismiss = "点击打开消息,右键点击忽略", }, custom_game_window = { start_game_with_name = "%s", }, cheats_window = { close = "关闭作弊窗口", cheats = { end_month = "跳到月末.", emergency = "建一个急诊室.", win_level = "赢得当前关卡.", create_patient = "在地图的边缘生成一个病人.", money = "往银行里存 10.000.", lose_level = "在当前关卡败北.", all_research = "完成所有的研究.", end_year = "跳到年末.", }, }, casebook = { cure_requirement = { hire_staff = "您需要雇佣人员来治疗该疾病", }, cure_type = { unknown = "您还不知道如何治疗该疾病", }, }, main_menu = { exit = "退出", custom_level = "自定义游戏", options = "选项", }, menu_list_window = { back = "返回", }, new_game_window = { hard = "游戏难度:困难", cancel = "返回", tutorial = "游戏上手教程", easy = "游戏难度:简单", medium = "游戏难度:中等", }, save_game_window = { new_save_game = "", save_game = "%s", }, calls_dispatcher = { assigned = "这个框代表是否有人被分配给此任务.", task = "任务列表 - 点击任务打开人员分配窗口然后滚动到任务的位置", close = "关闭接线员窗口", }, research_policy = { research_progress = "此类研究下次发现的进度: %1%/%2%", no_research = "当前没有任何此类研究在进行中", }, information = { close = "关闭", }, lua_console = { textbox = "输入Lua代码可直接运行", execute_code = "运行输入的代码", close = "关闭控制台", }, load_game_window = { load_game = "%s", load_autosave = "载入自动保存的游戏", load_game_number = "载入游戏 %d", }, fax = { close = "关闭此窗口,但不删除消息", }, objects = { litter = "废弃物: 病人找不到垃圾桶,所以随意丢在了地上.", }, options_window = { fullscreen_button = "全屏幕", change_resolution = "更改分辨率", height = "垂直像素", width = "水平像素", language = "转换语言为%s", back = "返回", }, } custom_game_window = { caption = "自定义游戏", } cheats_window = { cheats = { end_month = "月末", emergency = "修建急诊室", win_level = "获胜", create_patient = "生成病人", money = "给我钱!!", lose_level = "失败", all_research = "所有研究", end_year = "年末", }, close = "关闭", caption = "作弊", cheated = { no = "作弊了吗: 否", yes = "作弊了吗: 是", }, warning = "警告: 如果作弊关卡结束时你将得不到任何奖励!", } errors = { unavailable_screen_size = "你设置的屏幕大小无法应用于全屏模式。", dialog_missing_graphics = "哎呀, Demo 数据文件不包含这个对话框.", load_prefix = "载入游戏失败:", save_prefix = "保存游戏失败:", map_file_missing = "找不到该关卡的地图文件 %s!", minimum_screen_size = "最小屏幕大小为 640x480。", } main_menu = { new_game = "开始游戏", custom_level = "自定义游戏", continue = "继续游戏", load_game = "载入游戏", options = "选项", version = "版本: ", exit = "退出" } menu_debug = { lua_console = " (%1%) LUA 控制台 ", disable_salary_raise = " 关闭涨工资 ", make_debug_fax = " 建一个传真DEBUG ", make_debug_patient = " 建一个病人DEBUG ", sprite_viewer = " 图像浏览器 ", dump_strings = " (%1%) 输出字符串 ", map_overlay = " 地图层次 ", calls_dispatcher = " 接线员窗口 ", cheats = " (%1%) 作弊 ", dump_gamelog = " (%1%) 输出游戏记录文本 ", limit_camera = " 限制镜头 ", transparent_walls = " (%1%) 把墙变透明 ", jump_to_level = " 跳关 ", } menu_options = { edge_scrolling = " 边缘滚动", lock_windows = " 锁定窗口", sound = " (%1%) 音效 ", announcements = " (%1%) 公告 ", music = " (%1%) 音乐 ", jukebox = " (%1%) 音乐盒 ", adviser_disabled = " (%1%) 建议 ", warmth_colors = " 暖气区域显示 ", wage_increase = " 涨工资要求", twentyfour_hour_clock = " 24小时时钟 " } menu_options_game_speed = { pause = " 暂停", } lua_console = { execute_code = "运行", close = "关闭", } install = { title = "-------------------------------- CorsixTH 游戏设置 -------------------------------", th_directory = "运行游戏需要原版主题医院。请指定原版主题医院游戏安装文件夹。", ok = "确定", exit = "退出", cancel = "取消" } load_game_window = { caption = "载入游戏", } adviser = { cheats = { th_cheat = "恭喜, 你解锁了作弊选项!", hairyitis_cheat = "Hairyitis 作弊模式已经开启!", roujin_on_cheat = "Roujin's challenge已经开启!祝你好运...", crazy_on_cheat = "不会吧!所有的医生都疯了!", bloaty_off_cheat = "大头病作弊被关闭.", bloaty_cheat = "大头病作弊开启!", crazy_off_cheat = "还好... 所有的一生都恢复理智了.", roujin_off_cheat = "Roujin's challenge关闭.", hairyitis_off_cheat = "Hairyitis 作弊模式关闭.", }, warnings = { no_desk = "你总得有个前台吧!", no_desk_1 = "你得有个前台,这样才会有病人来!", no_desk_2 = "干的不错, 基本上也是个世界纪录了吧:快一年了,一个病人都没有! 如果你想继续当这个经理的话,你需要去雇一个前台,然后给她一张桌子工作!", no_desk_3 = "你真是个天才,一年了连个前台都没有! 你怎么可能有任何的病人来? 赶紧给我搞定,别在那里不务正业了!", no_desk_4 = "前台需要一个桌子来接待来访的病人", no_desk_5 = "Well it's about time, you should start to see some patients arriving soon!", no_desk_6 = "You have a receptionist, so how about building a reception desk for her to work from?", no_desk_7 = "You've built the reception desk, so how about hiring a receptionist? You won't see any patients until you get this sorted out you know!", falling_1 = "嘿!别开玩笑了, 看看你都是怎么点鼠标的, 你可能会伤到人!", falling_2 = "不要再胡搞了, 跟有病似的?", falling_3 = "啊~有人受伤了,赶紧叫医生!", falling_4 = "这里是医院,不是主题公园!", falling_5 = "这里不适合逗人玩,他们是病人好吗?", falling_6 = "这里不是保龄球馆, 应该对待病人如春天般温暖!", cannot_afford = "你已经没有足够的钱来雇这个人!",-- I can't see anything like this in the original strings cannot_afford_2 = "你没有足够的存款来做这件事!", research_screen_open_1 = "你需要建设一个研究科室才能访问研究页面.", research_screen_open_2 = "这一关不能开展研究.", researcher_needs_desk_1 = "研究员需要一张桌子展开工作.", researcher_needs_desk_2 = "你的研究员对你允许他休息片刻表示感谢,但如果你想让每个人都工作,你需要给每个人一张桌子.", researcher_needs_desk_3 = "每个研究院需要自己的桌子.", nurse_needs_desk_1 = "每个护士都需要自己的桌子.", nurse_needs_desk_2 = "你的护士对你允许他休息片刻表示感谢,但如果你想让每个人都工作,你需要给每个人一张桌子.", }, room_forbidden_non_reachable_parts = "在这个地方放置房间会导致医院的部分空间无法到达.", } calls_dispatcher = { repair = "修理 %s", summary = "%d 次电话; %d 被分配", close = "关闭", watering = "浇水 @ %d,%d", staff = "%s - %s", } information = { level_lost = { [1] = "您失败了!游戏结束。", [2] = "由于:", reputation = "声望低于%d。", balance = "银行账户资金低于%d。", percentage_killed = "杀死了%d的病人。", }, cannot_restart = "不幸的是这个自定义地图是在 重新开始 功能开发之前创建的.", custom_game = "欢迎来到 CorsixTH。尽情享受自定义地图吧!", } new_game_window = { caption = "竞争上岗", player_name = "玩家名称", option_on = "开", option_off = "关", difficulty = "难度", easy = "实习医生(容易)", medium = "医生(一般)", hard = "专家(难)", tutorial = "游戏教程", start = "开始", cancel = "返回", } options_window = { caption = "设置", option_on = "开", option_off = "关", fullscreen = "全屏幕", resolution = "分辨率", custom_resolution = "自定义...", width = "宽度", height = "高度", audio = "全局音效", customise = "自定义", folder = "文件夹", language = "语言", apply = "应用", cancel = "取消", back = "返回", } menu_list_window = { name = "名称", save_date = "已修改", back = "返回", } save_game_window = { caption = "保存游戏", new_save_game = "给新游戏存档起个名", } fax = { choices = { decline_new_level = "继续经营这个医院", accept_new_level = "接手下一个医院", return_to_main_menu = "返回到主菜单", }, } menu_debug_overlay = { heat = " 温度 ", byte_0_1 = " BYTE 0 & 1 ", byte_6 = " BYTE 6 ", flags = " FLAGS ", byte_7 = " BYTE 7 ", byte_5 = " BYTE 5 ", byte_floor = " BYTE FLOOR ", positions = " POSITIONS ", byte_w_wall = " BYTE W WALL ", parcel = " PARCEL ", byte_n_wall = " BYTE N WALL ", none = " NONE ", } confirmation = { abort_edit_room = "你正在修建或者就该一个房间.如果所有必需的物品都被放置了就没有问题,否则所做的修改将被删除. 继续吗?", needs_restart = "这项设置的改动需要重新启动 CorsixTH. 尚未保存的进度将会丢失. 确定要这么做吗?", } dynamic_info = { patient = { actions = { no_gp_available = "您需要建造一般诊断室", }, }, staff = { actions = { fired = "已解雇", heading_for = "前往%s", }, }, } introduction_texts = { demo = "欢迎来到演示版医院!//" .. "演示版本只有当前这一个关卡. 但有一堆事情足够你忙一阵了! " .. "你将会遇到各种疾病需要各种医疗室来救治. 紧急情况也会经常性地发生. 你需要通过研究室来研发更多的医疗室. " .. "你的目标是挣够 $100,000, 使医院的价值达到 $70,000 以及得到 700 声望值, 同时你还需要救治超过 75% 的病人. " .. "确保你的声望值不会掉到 300 以下, 你的病人死亡率不超过 40% , 否则你就完了.//" .. "祝你好运!", } object = { litter = "废弃物", } letter = { custom_level_completed = "做的好!你已完成自定义游戏的所有目标!", dear_player = "亲爱的 %s", return_to_main_menu = "你想要回到主菜单还是继续游戏?", } update_window = { caption = "可升级新版本!", new_version = "新版本:", current_version = "当前版本:", download = "打开下载页面", ignore = "回到主菜单" } tooltip.custom_game_window.free_build = "勾选此框你将不需要为钱以及胜利失败而操心" tooltip.cheats_window.cheats.vip = "创建一个 VIP." tooltip.menu_list_window.save_date = "点击整理一个按照最后修改日期排序的列表" tooltip.menu_list_window.name = "点击按照名字整理" custom_game_window.free_build = "自由模式" cheats_window.cheats.vip = "创建 VIP" main_menu.version = "版本: " main_menu.savegame_version = "存档版本: " progress_report.free_build = "自由模式" menu_options.adviser_disabled = " (%1%) 显示建议" install.exit = "退出" information.very_old_save = "你上次存档之后,这个游戏有很多更新. 为了保证你能玩到最新最酷的游戏,请考虑重新来过" options_window.cancel = "取消" menu_list_window.save_date = "修改日期" menu_list_window.name = "名称" fax.vip_visit_result.remarks.free_build[1] = "你的医院相当不错! 没有预算的限制,搞定很容易吧?" fax.vip_visit_result.remarks.free_build[2] = "我不是一个经济学家, 但我要是你我也行. 你懂我啥意思..." fax.vip_visit_result.remarks.free_build[3] = "医院经营的不错. 但要小心经济不景气. 哦对了,你才不操那个心." fax.emergency.free_build = "成功的话,你的声望就会上升,但你要是失败了, 就会一落千丈." fax.emergency.num_disease_singular = "那里有一个人患了 %s ,他们需要马上救治." ------------------------------------ --OLD STRINGS IN LANGUAGE "简体中文": ------------------------------------ misc = { hospital_open = "医院开门", save_success = "游戏存档成功", save_failed = "错误:无法存档", low_res = "低清晰度", grade_adverb = { extremely = "极端的", mildly = "柔和的", moderately = "适当的", }, send_message = "向玩家%d发送信息", out_of_sync = "游戏失去同步", balance = "难度选择:", load_failed = "存档游戏没有被读取", mouse = "老鼠", done = "完成", force = "力量", pause = "暂停", send_message_all = "向所有玩家发送信息", } staff_list = { morale = "士气", tiredness = "疲劳程度", skill = "技能", total_wages = "工资总额", } research = { allocated_amount = "已分配量", funds_allocation = "资金配置", categories = { improvements = "改良", drugs = "药品研究", diagnosis = "诊断仪器", cure = "治疗仪器", specialisation = "专项", }, } queue_window = { num_in_queue = "队伍长度", num_entered = "访问者人数", max_queue_size = "最大长度", num_expected = "预期", } staff_class = { doctor = "医生", handyman = "清洁工", receptionist = "接待员", nurse = "护士", surgeon = "外科医生", } tooltip = { hire_staff_window = { prev_person = "查看前一个人", cancel = "取消", psychiatrist = "精神病医生", salary = "月薪", next_person = "查看后一个人", nurses = "查看可雇佣的护士", surgeon = "外科医生", handymen = "查看可雇佣的清洁工人", doctors = "查看可雇佣的医生", doctor_seniority = "医生资历(实习医生,医生,专家)", hire = "雇佣", researcher = "科研人员", qualifications = "医生的特殊技能", receptionists = "查看可雇佣的接待员", staff_ability = "员工能力", }, handyman_window = { close = "取消请求", ability = "能力", face = "清洁工的面孔", prio_machines = "提高清洁工维修机器的优先级", prio_litter = "提高清洁工清除垃圾的优先级", happiness = "快乐程度", prio_plants = "提高清洁工给植物浇水的优先级", name = "清洁工的名字", tiredness = "疲劳程度", center_view = "切换到当前人物", salary = "工资", sack = "解雇", pick_up = "拾起", }, staff_list = { ability_2 = "员工的能力水平", next_person = "下一页", detail = "细心程度", happiness = "显示员工满意程度", researcher_train = "已经接受了%d%%的研究技能培训", handymen = "查看医院中被雇佣清洁工人名单", tiredness = "显示员工疲劳程度", researcher = "合格研究人员", happiness_2 = "员工士气", pay_rise = "提高员工工资10%", bonus = "付给该员工10%奖金", prev_person = "上一页", nurses = "查看医院中被雇佣护士名单", psychiatrist = "合格精神病医生", salary = "该员工当前工资", ability = "显示员工能力水平", close = "退出并返回游戏", sack = "解雇员工", surgeon = "合格外科医生", tiredness_2 = "员工的疲劳程度", doctors = "查看医院中被雇佣医生名单", doctor_seniority = "医生资历", view_staff = "查看员工工作情况", surgeon_train = "已经接受了%d%%的外科培训", skills = "特殊技能", receptionists = "查看医院中被雇佣接待员名单", psychiatrist_train = "已经接受了%d%%的精神病治疗培训", }, research = { cure_inc = "提高科研百分比", close = "关闭研究画面", specialisation_dec = "降低专门研究百分比", diagnosis_dec = "降低科研百分比", allocated_amount = "已分配预算", improvements_inc = "提高改良研究百分比", drugs_dec = "降低药品研究百分比", drugs_inc = "提高药品研究百分比", cure_dec = "降低疗效研究百分比", specialisation_inc = "提高专门研究百分比", improvements_dec = "降低改良研究百分比", diagnosis_inc = "提高仪器研究百分比", }, machine_window = { repair = "呼叫清洁工维修机器", name = "名字", close = "关闭", times_used = "机器被使用次数", status = "机器状况", replace = "改良机器", }, place_objects_window = { confirm = "确认", cancel = "取消", pick_up = "拾起物品", buy_sell = "买/卖物品", }, status = { percentage_cured = "您需要治疗%d%%前来就诊的病人。当前您已经治疗了%d%%", thirst = "医院中所有人的总体干渴程度", close = "关闭总览画面", population_chart = "图表显示每个医院对当地居民的吸引程度", win_progress_own = "显示当前进展情况", reputation = "您的声望必须至少有%d。当前值为%d", population = "您至少需要总人口的%d%%来访问您的医院", warmth = "医院中所有人的总体温暖程度", percentage_killed = "任务要求最多只能杀死%d%%的就诊病人。到目前为止,您已经杀死了%d%%的病人。", balance = "您的现金必须至少有$%d。当前值为$%d", value = "您的医院价值必须至少有$%d。当前值为$%d", win_progress_other = "显示当前%s方面的进展情况", num_cured = "您的目标是治愈%d个病人。现在您已经治愈%d个", happiness = "医院中所有人的总体快乐程度", }, queue_window = { end_of_queue = "拖动一位病人到该按钮处,将使其移动到队尾", num_entered = "到目前为止该房间已处理病人数目", close = "关闭面板", num_in_queue = "排队等候的病人数目", num_expected = "即将加入队伍的病人数目", front_of_queue = "拖动一位病人到该按钮处,将使其移动到队首", dec_queue_size = "减少队伍的最大长度", max_queue_size = "接待员允许的最大排队人数", inc_queue_size = "增加队伍的最大长度", patient = "拖动病人将改变其排队位置。右击某个病人可以选择将其遣送回家或遣送到竞争对手的医院。", patient_dropdown = { send_home = "让病人离开医院", hospital_2 = "将病人送到其它医院", reception = "将病人送到接待员处", hospital_1 = "将病人送到其它医院", hospital_3 = "将病人送到其它医院", }, }, jukebox = { rewind = "向后", loop = "循环播放", stop = "停止播放", close = "关闭音乐盒", current_title = "音乐盒", play = "播放", fast_forward = "向前", }, graphs = { deaths = "切换死亡人数", close = "关闭图表画面", scale = "比例尺", money_out = "切换支出", visitors = "切换访问人数", wages = "切换工资", balance = "切换现金", money_in = "切换收入", cures = "切换治愈人数", reputation = "切换医院价值", }, toolbar = { reputation = "声望", casebook = "治疗手册", edit = "编辑房间/物品", staff_list = "员工管理", policy = "制度", date = "日期", charts = "图表", objects = "设置走廊", balance = "现金", research = "研究", hire = "雇佣员工", status = "状态", town_map = "城市地图", rooms = "建造房屋", bank_button = "左击进入银行经理画面,右击进入银行帐户", }, pay_rise_window = { accept = "满足要求", decline = "拒绝-将其解雇", }, town_map = { close = "退出城镇地图画面", plants = "切换植物", fire_extinguishers = "切换灭火器", people = "切换人员", balance = "现金", heat_dec = "减少供热", heating_bill = "供暖费", radiators = "切换暖气", objects = "切换物品", heat_level = "供热强度", heat_inc = "增加供热", }, casebook = { sent_home = "转走人数", cure_requirement = { hire_staff_old = "您需要雇佣一名%s来治疗该疾病", possible = "您有能力治疗这种疾病", not_possible = "您还没有能力治疗该种疾病", ward_hire_nurse = "您需要一位护士在病房中照料病人", hire_surgeon = "您需要雇佣第二位外科医生来完成手术", research_machine = "您需要研究一些仪器来治疗这种疾病", build_room = "您需要修建一个房间来治疗这种疾病", build_ward = "您需要建造一个病房来治疗该疾病", hire_surgeons = "您需要雇佣两名外科医生完成手术", }, increase = "增加", up = "向上滚动", reputation = "治疗或诊断声望", research = "点击这里可以为治疗使用专门研究预算", close = "关闭治疗手册", earned_money = "总收入", cure_type = { psychiatrist = "由精神病医生完成治疗工作", drug_percentage = "治疗使用药品-其疗效为%d%%", drug = "治疗时将使用药品", machine = "该疾病需要仪器辅助治疗", surgery = "该疾病需要手术", }, decrease = "减少", deaths = "死亡人数", cured = "治愈人数", down = "向下滚动", treatment_charge = "花费", }, policy = { diag_termination = "对于一个病人的诊断将一直持续到设定的治疗结束百分比,或所有的诊断机器都已经尝试一遍", close = "关闭制度画面", staff_leave = "点击这里可以让处于空闲状态的员工帮助其他员工", diag_procedure = "如果医生的诊断结果为,治愈概率小于设定的遣送回家百分比,则该病人将被自动遣送回家。如果治愈概率大于设定的尝试治疗百分比,则该病人将被自动送去进行治疗", staff_rest = "员工休息时的最低疲劳程度", staff_stay = "点击这里可以使所有员工停留在设定的房间内", }, bank_manager = { graph = "显示%s支付曲线", close = "关闭银行经理画面", hospital_value = "医院当前价值", graph_return = "返回上个画面", current_loan = "当前未偿还贷款", borrow_5000 = "向银行借款$5000", balance = "银行现金", interest_payment = "每月利息支付", inflation_rate = "年通货膨胀率", interest_rate = "年利率", repay_5000 = "向银行偿还$5000", show_graph = "显示%s支付曲线", insurance_owed = "%s欠款的金额", }, main_menu = { new_game = "开始新游戏", load_game = "载入进度", network = "开始网络游戏", exit = "不要,不要,请不要退出游戏!", quit = "确定要退出游戏吗?", continue = "继续游戏最近的游戏", load_menu = { load_slot = "读取进度", empty_slot = "空" } }, patient_window = { graph = "通过点击可以在健康情况和病史之间切换", casebook = "查看有关疾病的详细情况", close = "关闭", queue = "查看队伍详细资料", happiness = "快乐程度", warmth = "温暖程度", center_view = "切换到当前人物", thirst = "干渴程度", send_home = "把病人赶出医院", abort_diagnosis = "无需诊断直接去治疗", }, watch = { emergency = "紧急情况:剩余时间内尽快治愈所有急救病人。", hospital_opening = "建造计时器:它主要用来指示距离医院开门的时间多少。直接点击开门按钮就可以立即开门迎接客人。", epidemic = "传染病:剩余时间内尽快阻止传染病蔓延。当时间耗尽或一个被传染病人离开医院,则卫生巡查员将出现。通过按钮可以切换预防接种模式开或者关。点击病人就可以让护士为其接种。", }, staff_window = { doctor_seniority = "资历-是实习医生,医生还是专家", psychiatrist = "精神病", close = "关闭", ability = "能力", pick_up = "拾起", sack = "解雇", surgeon = "外科", happiness = "快乐程度", salary = "月薪", name = "员工名字", tiredness = "疲劳程度", center_view = "点击鼠标右键切换人物", skills = "特殊技术", researcher = "研究", face = "面孔-点击进入管理", }, rooms = { ultrascan = "医生使用超级扫描仪房间诊断病人", research_room = "拥有研究技能的医生可以在研究部门开发新的药品和机器。", fracture_clinic = "护士使用骨折诊所治疗骨折病人", gps_office = "病人在一般诊断室内接受初始诊断", inflation = "医生使用充气机房间治疗头部肿胀病人", staffroom = "医生和护士在员工休息室内可以恢复疲劳", jelly_vat = "医生使用胶桶诊所治疗失衡患者", scanner = "医生使用扫描仪房间诊断病人", decontamination = "医生使用净化淋浴装置可以治疗放射病", pharmacy = "护士在药房为病人配药治疗", cardiogram = "医生使用心电图室诊断病人", ward = "病房对于诊断和治疗都是非常有用的。病人手术前要在病房中观察一段时间。病房需要护士", training_room = "专家使用培训室对其他医生进行培训", operating_theatre = "手术中心需要两名具备外科技能的医生", psychiatry = "精神病诊断治疗室可以治疗精神病患者同时也能帮助诊断其他病人,但是需要一位拥有精神病治疗技能的医生", hair_restoration = "医生使用毛发恢复房间治疗秃顶病人", tongue_clinic = "医生使用舌头松弛诊断室治疗舌头松弛症病人", dna_fixer = "医生使用DNA恢复装置房间治疗外星人DNA病人", general_diag = "医生使用高级诊断室为患者进行基本诊断。花费很少但效率很高", toilets = "建造洗手间可以防止病人把医院弄得一团糟!", electrolysis = "医生使用电分解房间治疗多毛症病人", x_ray = "医生使用X光房间诊断病人", blood_machine = "医生使用血液机器房间诊断病人", }, statement = { close = "关闭银行帐户画面", }, buy_objects_window = { confirm = "购买物品", cancel = "取消", increase = "多买一个", total_value = "定购物品总值", price = "物品价格", decrease = "少买一个", }, window_general = { confirm = "确定", cancel = "取消", }, objects = { chair = "椅子:供病人使用,以讨论病情。", sofa = "沙发:摆放在员工休息室中,员工如果没有更好的放松方式,则可以坐在上面恢复疲劳。", operating_table = "30 OB_OP_TABLE", bed2 = "未使用", bench = "长椅:为病人提供一个座位,使其可以比较舒适地等待。", scanner = "14 OB_SCANNER", couch = "18 OB_COUCH", blood_machine = "42 OB_BLOOD_MC", table1 = "桌子(已删除):摆放大量杂志,使等待的病人感到快乐。", video_game = "视频游戏:让您的员工在游戏中彻底放松。", lamp = "灯:照明用。", op_sink2 = "34 OB_OP_SINK_2", door = "房门:人们出入房间时必需。", auto_autopsy = "验尸机:对研究新的治疗方法有很大帮助。", reception_desk = "接待台:需要一名接待员为病人服务。", hair_restorer = "25 OB_HAIR_RESTORER", projector = "37 OB_PROJECTOR", crash_trolley = "20 OB_CRASH", tv = "电视:使员工不会错过喜爱的节目。", ultrascanner = "22 OB_ULTRASCAN", surgeon_screen = "35 OB_SURGEON_SCREEN", litter_bomb = "垃圾炸弹:来自对手医院的破坏活动", inflator = "充气机:治疗头部肿胀病患者。", table2 = "12 OB_BTABLE", desk = "办公桌:医生可以在上面放置电脑。", pool_table = "台球桌:帮助员工放松。", x_ray_viewer = "29 OB_XRAY_VIEWER", radiation_shield = "28 OB_RAD_SHIELD", bed = "床:病情严重的病人需要卧床。", swing_door2 = "53 OB_DOUBLE_DOOR2", console = "15 OB_SCANNER_CONSOLE", op_sink1 = "33 OB_OP_SINK_1", bookcase = "书柜:放置医生的参考资料。", drinks_machine = "饮料机:为病人止渴,也是收入来源之一。", comfortable_chair = "61 OB_COMFY_CHAIR", skeleton = "骨骼模型:主要用于培训。", computer = "计算机:关键的研究部件。", bin = "垃圾桶:放置垃圾。", pharmacy_cabinet = "药房:用来保存药品", radiator = "暖气:保持医院内的温度。", cast_remover = "24 OB_CAST_REMOVE", atom_analyser = "化学混合器:摆放在研究部门中,该机器可以加速全部研究进程。", plant = "植物:使病人快乐并净化空气。", jelly_moulder = "47 OB_JELLY_VAT", cardio = "13 OB_CARDIO", toilet = "洗手间:提供给病人使用。", electrolyser = "46 OB_ELECTRO", fire_extinguisher = "灭火器:降低治疗仪器爆炸所产生的危险。", bed3 = "未使用", swing_door1 = "52 OB_DOUBLE_DOOR1", lecture_chair = "演讲座位:接受培训的医生坐在上面,收听无聊的演讲。座位摆放得越多,则教室越大。", screen = "16 OB_SCREEN", toilet_sink = "洗手池:讲卫生的病人可以在洗手池中洗净脏手。如果没有足够的洗手池,病人将感到不高兴。", shower = "54 OB_DECON_SHOWER", gates_of_hell = "48 OB_HELL", entrance_right = "59 OB_ENT_RDOOR", entrance_left = "58 OB_ENT_LDOOR", slicer = "26 OB_SLICER", dna_fixer = "23 OB_DNA_FIXER", x_ray = "27 OB_XRAY", cabinet = "文件柜:包含了病人文件,备忘录以及研究档案。", }, build_room_window = { cost = "当前被选择房间价格", room_classes = { treatment = "选择处理类房间", diagnosis = "选择诊断类房间", facilities = "选择附属类房间", clinic = "选择治疗类房间", }, close = "取消并返回游戏", }, } menu_charts = { briefing = " 任务简报", casebook = " (%1%) 治疗手册", graphs = " (%1%) 图表", policy = " (%1%) 制度", bank_manager = " (%1%) 银行经理", statement = " (%1%) 银行账户", town_map = " (%1%) 城市地图 ", staff_listing= " (%1%) 员工列表", research = " (%1%) 研究", status = " (%1%) 状态", } town_map = { number = "地区编号", not_for_sale = "非拥有的", chat = "城镇细节", price = "地区售价", for_sale = "出售", owner = "地区所有", area = "地区面积", } vip_names = { [1] = "伟大的查普顿市长", [2] = "南丁格尔", [3] = "来自荷兰的伯那德国王", [4] = "缅甸民主党领袖:昂山素季", [5] = "克朗伯先生", [6] = "比利先生", [7] = "克劳福议员", [8] = "罗尼", [9] = "一个超级联赛球星", [10] = "拉里普罗斯特", health_minister = "卫生部部长", } room_descriptions = { ultrascan = { [1] = "超级扫描仪//", [2] = "超级扫描仪是诊断类仪器中最重要的。它虽然花费惊人,但效果卓著,可以使医院对病人的诊断达到完美。//", [3] = "超级扫描仪需要医生。它也需要维护。", }, gp = { [1] = "一般诊断室//", [2] = "这是您的医院中一个基本诊断房间。就诊病人将到这里来检查病因。随后再决定是做进一步的诊断还是立即治疗。如果一间普通诊断室不够用,则您可以再建造另一间。房间越大,则可以在里面摆放更多的特殊物品,从而使医生的威信越高。这对于其它房间也是一样的。//", [3] = "一般诊断室需要一名医生。", }, fracture_clinic = { [1] = "骨折诊所//", [2] = "骨折患者将到这里来接受治疗。石膏剥离装置将使用高能激光将坚硬的石膏切开,而病人只需忍受很小的痛苦。//", [3] = "骨折诊所需要一名护士。它也需要日常维护。", }, tv_room = { [1] = "电视房间没有使用", }, inflation = { [1] = "充气机诊所//", [2] = "患有头部肿胀症的病人需要在充气机诊所接受治疗,病人膨胀的头盖骨将被去掉,并对脑袋重新充气到正常大小。//", [3] = "充气机诊所需要医生。它也需要清洁工人的维护。", }, jelly_vat = { [1] = "胶桶诊所//", [2] = "对于患有失衡症的患者需要到胶桶诊所接受治疗,在这里将被放入胶桶中。该治疗方法的原理医学界目前还无法完全理解。//", [3] = "胶桶诊所需要医生。它也需要清洁工维护机器。", }, scanner = { [1] = "扫描仪//", [2] = "通过扫描仪病人得到确诊。随后他们就可以到一般诊断室接受进一步的治疗指示。//", [3] = "扫描仪需要医生。它也同样需要维护。", }, blood_machine = { [1] = "血液机器//", [2] = "血液机器也是一种诊断用仪器,通过它可以检查病人的血液细胞,从而找出病人的病因。//", [3] = "血液机器需要医生。它也需要维护。", }, pharmacy = { [1] = "药房//", [2] = "被诊断且需要接受药物治疗的病人一定要到药房去抓药。当越来越多的药品被研制出来。该房间也将变得越来越繁忙。这时就需要再建造一间药房。//", [3] = "药房需要一名护士。", }, cardiogram = { [1] = "心电图仪//", [2] = "病人在这里被诊断检查,随后再到一般诊断室接受治疗提示。//", [3] = "心电图仪需要医生。当然它也需要维护。", }, ward = { [1] = "病房//", [2] = "病人在病房中停留一段时间,以便护士进行观察。随后再做手术。//", [3] = "病房需要一名护士。", }, psych = { [1] = "精神病诊断治疗室//", [2] = "被诊断为精神有问题的病人必须到精神病诊断治疗室中接受治疗。精神病医生可以对病人进行诊断,发现其病因,且如果确实是心理问题,将使用长沙发椅对其进行治疗。//", [3] = "精神病诊断治疗室需要一名具有精神病治疗技能的医生。", }, staff_room = { [1] = "员工休息室//", [2] = "您的员工感觉疲劳时,需要房间来放松紧张的神经,从而恢复疲劳。处于极度疲劳的员工效率很低,并不时要求加薪,甚至不辞而别。他们还会常常犯错误。建造一个员工休息室,并在里面摆放尽可能多的物品,这是十分值得的。请确认该房间可以同时使多名员工得到休息。", }, operating_theatre = { [1] = "手术中心//", [2] = "它可以提供非常重要的治疗手段。手术中心必须要有足够的尺寸,必须配置适当的仪器设备。它将是医院中最重要的部门。//", [3] = "手术中心需要两名拥有外科技能的医生。", }, training = { [1] = "培训室//", [2] = "您的实习医生和医生在该房间内可以得到特殊技能的培训。拥有外科,研究或精神病技能的专家将把自己的经验传授给接受培训的医生。对于已拥有这些技能的医生,他们的能力将大幅提高。//", [3] = "培训室需要一名专家。", }, dna_fixer = { [1] = "DNA诊所//", [2] = "这些有外星人DNA的病人必须在这里恢复其原有的DNA。DNA修复装置是最复杂的仪器,因此一定要在其房间内摆放一个灭火器,以防万一。//", [3] = "这台DNA修复装置需要清洁工不时维护。它也需要一名具有研究能力的医生才能够正常工作。", }, research = { [1] = "研究室//", [2] = "在研究室可以研制新的药品和治疗方法,并对各种仪器进行改进提高。这是医院中的一个重要部门,并对提高医院的治愈率产生绝对影响。//", [3] = "研究室需要一名拥有研究技能的医生。", }, hair_restoration = { [1] = "毛发恢复诊所//", [2] = "对于身患秃顶的病人将被送到该毛发恢复诊所,使用其中的毛发恢复装置进行治疗。需要一名医生操作机器,且该机器将很快地使病人的脑袋长满头发。//", [3] = "毛发恢复诊所需要医生。它也需要维护。", }, general_diag = { [1] = "高级诊断室//", [2] = "需要进一步诊断的病人将被送到这里。如果一般诊断室无法发现病人的病因,高级诊断室将有可能找出。诊断结束后,他们将返回一般诊断室分析结果。//", [3] = "高级诊断室需要医生。", }, electrolysis = { [1] = "电分解房间//", [2] = "多毛症患者将到该房间接受电分解机器的治疗,该机器将猛拉毛发并使用一种混合物填充毛孔。//", [3] = "电分解房间需要医生。它也需要清洁工进行维护。", }, slack_tongue = { [1] = "舌头松弛治疗诊所//", [2] = "在普通诊断室中被诊断为舌头松弛的病人将被送到该诊所接受治疗。医生将使用一种高科技的仪器使舌头伸直并切掉多余部分,从而使病人恢复正常。//", [3] = "舌头松弛诊所需要医生。它也需要日常维护。", }, toilets = { [1] = "洗手间//", [2] = "当病人感到需要上厕所时就需要洗手间这类设施。如果您希望洗手间多一些访问者,可以在其中多摆放洗手池和马桶请考虑在医院的其它位置也建造一些附属设施。", }, no_room = { [1] = "", }, x_ray = { [1] = "X光机//", [2] = "X光机可以使用特殊辐射为病人照内部透视照片。它对于医生诊断病因有很大帮助。//", [3] = "X光机需要医生。它也需要维护。", }, decontamination = { [1] = "净化诊所//", [2] = "对于被暴露在强放射性的病人需要快速送到净化诊所。该房间包含了一个淋浴器,可以将病人身上的放射能清除干净。//", [3] = "净化淋浴器需要医生。它也需要清洁工人维护。", }, } bank_manager = { current_loan = "当前贷款", balance = "现金", interest_payment = "应付利息", hospital_value = "医院价值", interest_rate = "利率", insurance_owed = "保险公司欠款", statistics_page = { balance = "现金", details = "细节", date = "日期", current_balance = "当前现金", money_in = "收入", money_out = "支出", }, inflation_rate = "通货膨胀率", } menu_display = { high_res = " 阴影 ", } original_credits = { [1] = "", [2] = "", [3] = "", [4] = "", [5] = "", [6] = "", [7] = "", [8] = "", [9] = "", [10] = "", [11] = "", [12] = ":设计制作", [13] = ":牛蛙制造", [14] = "", [15] = ":冥王星开发组", [16] = ",", [17] = "Mark Webley", [18] = "Gary Carr", [19] = "Matt Chilton", [20] = "Matt Sullivan", [21] = "Jo Rider", [22] = "Rajan Tande", [23] = "Wayne Imlach", [24] = "Andy Bass", [25] = "Jon Rennie", [26] = "Adam Coglan", [27] = "Natalie White", [28] = "", [29] = "", [30] = "", [31] = ":编程", [32] = ",", [33] = "Mark Webley", [34] = "Matt Chilton", [35] = "Matt Sullivan", [36] = "Rajan Tande", [37] = "", [38] = "", [39] = "", [40] = ":美工", [41] = ",", [42] = "Gary Carr", [43] = "Jo Rider", [44] = "Andy Bass", [45] = "Adam Coglan", [46] = "", [47] = "", [48] = "", [49] = ":助理编程", [50] = ",", [51] = "Ben Deane", [52] = "Gary Morgan", [53] = "Jonty Barnes", [54] = "", [55] = "", [56] = "", [57] = ":助理美工", [58] = ",", [59] = "Eoin Rogan", [60] = "George Svarovsky", [61] = "Saurev Sarkar", [62] = "Jason Brown", [63] = "John Kershaw", [64] = "Dee Lee", [65] = "", [66] = "", [67] = "", [68] = ":游戏介绍", [69] = ",", [70] = "Stuart Black", [71] = "", [72] = "", [73] = "", [74] = ":音乐音效", [75] = ",", [76] = "Russell Shaw", [77] = "Adrian Moore", [78] = "", [79] = "", [80] = "", [81] = ":助理音乐", [82] = ",", [83] = "Jeremy Longley", [84] = "Andy Wood", [85] = "", [86] = "", [87] = "", [88] = ":配音", [89] = ",", [90] = "Rebecca Green", [91] = "", [92] = "", [93] = "", [94] = ":任务设计", [95] = ",", [96] = "Wayne Imlach", [97] = "Natalie White", [98] = "Steven Jarrett", [99] = "Shin Kanaoya", [100] = "", [101] = "", [102] = "", [103] = ":剧本", [104] = ",", [105] = "James Leach", [106] = "Sean Masterson", [107] = "Neil Cook", [108] = "", [109] = "", [110] = "", [111] = ":R&D", [112] = "", [113] = ":图形引擎", [114] = ",", [115] = "Andy Cakebread", [116] = "Richard Reed", [117] = "", [118] = "", [119] = "", [120] = ":R&D支持", [121] = ",", [122] = "Glenn Corpes", [123] = "Martin Bell", [124] = "Ian Shaw", [125] = "Jan Svarovsky", [126] = "", [127] = "", [128] = "", [129] = ":库和工具", [130] = "", [131] = "Dos和Win95库", [132] = ",", [133] = "Mark Huntley", [134] = "Alex Peters", [135] = "Rik Heywood", [136] = "", [137] = "", [138] = "", [139] = ":网络库", [140] = ",", [141] = "Ian Shippen", [142] = "Mark Lamport", [143] = "", [144] = "", [145] = "", [146] = ":声音库", [147] = ",", [148] = "Russell Shaw", [149] = "Tony Cox", [150] = "", [151] = "", [152] = "", [153] = ":安装程序", [154] = ",", [155] = "Andy Nuttall", [156] = "Tony Cox", [157] = "Andy Cakebread", [158] = "", [159] = "", [160] = "", [161] = ":支持", [162] = ",", [163] = "Peter Molyneux", [164] = "", [165] = "", [166] = "", [167] = ":测试经理", [168] = ",", [169] = "Andy Robson", [170] = "", [171] = "", [172] = "", [173] = ":测试主管", [174] = ",", [175] = "Wayne Imlach", [176] = "Jon Rennie", [177] = "", [178] = "", [179] = "", [180] = ":测试", [181] = ",", [182] = "Jeff Brutus", [183] = "Wayne Frost", [184] = "Steven Lawrie", [185] = "Tristan Paramor", [186] = "Nathan Smethurst", [187] = "", [188] = "Ryan Corkery", [189] = "Simon Doherty", [190] = "James Dormer", [191] = "Martin Gregory", [192] = "Ben Lawley", [193] = "Joel Lewis", [194] = "David Lowe", [195] = "Robert Monczak", [196] = "Dominic Mortoza", [197] = "Karl O'Keeffe", [198] = "Michael Singletary", [199] = "Andrew Skipper", [200] = "Stuart Stephen", [201] = "David Wallington", [202] = "", [203] = "And all our other Work Experience Play Testers", [204] = "", [205] = "", [206] = "", [207] = ":技术支持", [208] = ",", [209] = "Kevin Donkin", [210] = "Mike Burnham", [211] = "Simon Handby", [212] = "", [213] = "", [214] = "", [215] = ":市场", [216] = ",", [217] = "Pete Murphy", [218] = "Sean Ratcliffe", [219] = "", [220] = "", [221] = "", [222] = ":特别感谢", [223] = ",", [224] = "Tamara Burke", [225] = "Annabel Roose", [226] = "Chris Morgan", [227] = "Pete Larsen", [228] = "", [229] = "", [230] = "", [231] = ":公关", [232] = ",", [233] = "Cathy Campos", [234] = "", [235] = "", [236] = "", [237] = ":文档", [238] = ",", [239] = "Mark Casey", [240] = "Richard Johnston", [241] = "James Lenoel", [242] = "Jon Rennie", [243] = "", [244] = "", [245] = "", [246] = ":文档及包装盒设计", [247] = ",", [248] = "Caroline Arthur", [249] = "James Nolan", [250] = "", [251] = "", [252] = "", [253] = ":本地化项目经理", [254] = ",", [255] = "Carol Aggett", [256] = "", [257] = "", [258] = "", [259] = ":本地化工作", [260] = ",", [261] = "Sandra Picaper", [262] = "Sonia 'Sam' Yazmadjian", [263] = "", [264] = "Bettina Klos", [265] = "Alexa Kortsch", [266] = "Bianca Normann", [267] = "", [268] = "C。T。O。S。p。A。ZolaPredosa(BO)", [269] = "Gian Maria Battistini", [270] = "Maria Ziino", [271] = "Gabriele Vegetti", [272] = "", [273] = "Elena Ruiz de Velasco", [274] = "Julio Valladares", [275] = "Ricardo Mart*nez", [276] = "", [277] = "Kia Collin", [278] = "CBG Consult", [279] = "Ulf Thor", [280] = "", [281] = "", [282] = "", [283] = ":生产", [284] = ",", [285] = "Rachel Holman", [286] = "", [287] = "", [288] = "", [289] = ":制片人", [290] = ",", [291] = "Mark Webley", [292] = "", [293] = "", [294] = "", [295] = ":联合制片人", [296] = ",", [297] = "Andy Nuttall", [298] = "", [299] = "", [300] = "", [301] = ":运作", [302] = ",", [303] = "Steve Fitton", [304] = "", [305] = "", [306] = "", [307] = ":行政", [308] = ",", [309] = "Audrey Adams", [310] = "Annette Dabb", [311] = "Emma Gibbs", [312] = "Lucia Gobbo", [313] = "Jo Goodwin", [314] = "Sian Jones", [315] = "Kathy McEntee", [316] = "Louise Ratcliffe", [317] = " ", [318] = " ", [319] = " ", [320] = ":公司管理", [321] = ",", [322] = "Les Edgar", [323] = "Peter Molyneux", [324] = "David Byrne", [325] = " ", [326] = " ", [327] = ":All at Bullfrog Productions", [328] = " ", [329] = " ", [330] = " ", [331] = ":特别感谢", [332] = ",", [333] = "弗莱利公园医院中每个人", [334] = "", [335] = ":特别是", [336] = ",", [337] = "Beverley Cannell", [338] = "Doug Carlisle", [339] = "", [340] = "", [341] = "", [342] = ":中文版制作", [343] = ",", [344] = "飞龙工作室", [345] = "", [346] = "", [347] = "", [348] = ":监制/项目主管", [349] = ",", [350] = "曲洋", [351] = "", [352] = "", [353] = ":翻译:刘波", [354] = "", [355] = ":录音师:蓝信刚", [356] = "", [357] = "", [358] = ":配音:夏莉莉", [359] = "", [360] = "", [361] = "", [362] = ":中文版包装/手册设计", [363] = ",", [364] = "骆智中 王越鹏", [365] = "", [366] = "", [367] = ":生产", [368] = ",", [369] = "杨平 张威", [370] = "", [371] = "", [372] = "", [373] = ":测试", [374] = ",", [375] = "罗耀 陈雷 赫闻 汤宇力", [376] = "", [377] = "", [378] = ":特别感谢", [379] = ",", [380] = "Les Edgar", [381] = "Rajan Tande", [382] = "Steve Fitton", [383] = "", [384] = "", [385] = "", [386] = "", [387] = "", [388] = "", [389] = "", [390] = "", [391] = "", [392] = "", [393] = "", [394] = "", [395] = "", [396] = "", [397] = ".", } pay_rise = { definite_quit = "不论您做什么都无法留住我了。", regular = { [1] = "我真的太累了。如果您不希望我辞职的话,请让我好好休息,并增加工资$%d。", [2] = "我真的太累了。我需要休息,以及增加工资$%d。立即答应,你这个暴君。", [3] = "好吧。我在这里工作就象一只狗一样。给我奖金$%d我就还留在这个医院里。", [4] = "我很不快乐。我要求增加工资$%d,使我的工资达到$%d,否则我就不干了。", [5] = "我的父母告诉我医学专家的待遇是很高的。因此,请给我加薪$%d,否则我将辞职去做电脑游戏。", [6] = "我已经受够了。请调整我的工资到合理程度。我希望加薪$%d。", }, poached = "%s答应给我工资%d。如果您无法达到这个数目,那么我就要跳槽了。", } menu_debug = { porter_pagers = " PORTER PAGERS ", object_cells = " OBJECT CELLS ", display_pager = " DISPLAY PAGER ", display_big_cells = " DISPLAY BIG CELLS ", mapwho_checking = " MAPWHO CHECKING ", keep_clear_cells = " KEEP CLEAR CELLS ", machine_pagers = " MACHINE PAGERS ", remove_walls = " REMOVE WALLS ", enter_nav_debug = " ENTER NAV DEBUG ", lose_game_anim = { [1] = " LOSE GAME 1 ANIM ", [2] = " LOSE GAME 2 ANIM ", [3] = " LOSE GAME 3 ANIM ", [4] = " LOSE GAME 4 ANIM ", [5] = " LOSE GAME 5 ANIM ", [6] = " LOSE GAME 6 ANIM ", [7] = " LOSE GAME 7 ANIM ", }, show_nav_cells = " SHOW NAV CELLS ", win_game_anim = " WIN GAME ANIM ", display_room_status = " DISPLAY ROOM STATUS ", remove_objects = " REMOVE OBJECTS ", nav_bits = " NAV BITS ", win_level_anim = " WIN LEVEL ANIM ", pixbuf_cells = " PIXBUF CELLS ", show_help_hotspot = " SHOW HELP HOTSPOTS ", entry_cells = " ENTRY CELLS ", plant_pagers = " PLANT PAGERS ", } progress_report = { quite_unhappy = "人们有点不高兴。", header = "进展报告", very_unhappy = "人们感到非常不高兴。", more_drinks_machines = "多摆放一些饮料机。", too_cold = "太冷了。多摆放一些暖气。", too_hot = "调节供热系统。太热了。", percentage_pop = "% 人口", win_criteria = "视窗标准", } menu_options = { game_speed = " 游戏速度", sound_vol = " 音效音量", music_vol = " 音乐音量", announcements = " 语音", sound = " 音效", announcements_vol = " 语音音量", music = " 音乐", autosave = " 自动存盘", jukebox = " 音乐盒", } menu_options_game_speed = { normal = " (%1%) 正常", slower = " (%1%) 较慢", max_speed = " (%1%) 快速", slowest = " (%1%) 非常慢", and_then_some_more = " (%1%) 极快", } rooms_short = { ultrascan = "超级扫描仪", research_room = "研究部门", fracture_clinic = "骨折诊所", gps_office = "一般诊断室", destroyed = "已毁坏", staffroom = "员工休息室", jelly_vat = "胶桶诊所", scanner = "扫描仪", decontamination = "净化设备", pharmacy = "药房", cardiogram = "心电图仪", reception = "接待台", training_room = "培训室", corridor_objects = "走廊物品", operating_theatre = "手术中心", dna_fixer = "DNA修复装置", ward = "病房", psychiatric = "精神病诊疗室", hair_restoration = "毛发恢复机器", general_diag = "高级诊断室", inflation = "充气机", tongue_clinic = "舌头治疗机", toilets = "洗手间", electrolysis = "电分解诊所", x_ray = "X光仪器", blood_machine = "血液机器", } level_names = { [1] = "毒气城", [2] = "昏睡城", [3] = "大柴斯特城", [4] = "福来明顿城", [5] = "新普顿城", [6] = "世界之疮", [7] = "绿池城", [8] = "曼葵城", [9] = "依斯特威尔", [10] = "爱格森海姆城", [11] = "蛙鸣城", [12] = "巴登堡", [13] = "查姆雷城", [14] = "小爪槟城", [15] = "葬礼城", } insurance_companies = { [1] = "天鹅绒有限公司", [2] = "诺福克洋葱公司", [3] = "双峰公司", [4] = "刀疤有限公司", [5] = "潜水艇有限公司", [6] = "诚实的泰瑞公司", [7] = "矮胖先生股份有限公司", [8] = "里昂猫公司", [9] = "普里邦有限公司", [10] = "快乐保险公司", [11] = "辛迪加保险公司", out_of_business = "无", } staff_descriptions = { good = { [1] = "手脚勤快并努力的员工。", [2] = "很有责任心。非常细心。", [3] = "掌握了很多技术。", [4] = "很友善并爱笑。", [5] = "富有活力。", [6] = "很有礼貌并和蔼可亲。", [7] = "富有才干和能力。", [8] = "工作能力极强。", [9] = "意志坚强。", [10] = "微笑着为病人服务。", [11] = "迷人的,有礼貌的并爱帮助别人。", [12] = "专注于工作。", [13] = "本性善良,工作努力。", [14] = "忠实且待人友善。", [15] = "细心并能够独立处理紧急事件。", }, misc = { [1] = "打高尔夫球。", [2] = "潜水运动。", [3] = "冰雕。", [4] = "喝葡萄酒。", [5] = "拉力车赛。", [6] = "蹦跳。", [7] = "收集啤酒盖子。", [8] = "喜欢跳水。", [9] = "喜欢冲浪运动。", [10] = "喜欢游泳。", [11] = "蒸馏威士忌酒。", [12] = "DIY专家。", [13] = "喜欢欣赏法国电影。", [14] = "玩地下城守护者游戏。", [15] = "拥有HGV执照。", [16] = "摩托车比赛。", [17] = "弹奏古典提琴。", [18] = "训练营救员。", [19] = "喜欢养狗。", [20] = "听收音机。", [21] = "经常洗澡。", [22] = "工作指导。", [23] = "种植蔬菜。", [24] = "义务巡警。", [25] = "展览。", [26] = "收集二战武器。", [27] = "重新摆放家具。", [28] = "听刺激音乐。", [29] = "杀虫。", [30] = "喜剧演员。", [31] = "议会调查人员。", [32] = "园艺家。", [33] = "走私假手表。", [34] = "唱歌。", [35] = "喜欢日间电视。", [36] = "喜欢鲑鱼。", [37] = "向观光者介绍博物馆。", }, bad = { [1] = "动作缓慢,且爱烦恼。", [2] = "懒惰。", [3] = "培训很少且没有精神。", [4] = "待人粗鲁。", [5] = "态度恶劣。", [6] = "耳聋。且身上有一股卷心菜的味道。", [7] = "不用心工作。", [8] = "鲁莽而且容易犯错误。", [9] = "容易犯错误。", [10] = "心理变态。", [11] = "粗心大意。", [12] = "懒散。", [13] = "愚蠢。", [14] = "狡猾且有破坏欲。", [15] = "傲慢自大。", }, } room_classes = { diagnosis = "诊断室", clinics = "诊所", facilities = "附属设施", treatment = "治疗室", } place_objects_window = { pick_up_object = "点击物品可以将其拾起,也可以选择不同的选项", place_objects_in_corridor = "将物品放在走廊上", place_windows = "请设置一些窗户,点击鼠标表示确定", confirm_or_buy_objects = "您可以确认该房间,或买入或移动其中的一些物品", drag_blueprint = "拉伸蓝图直到您满意的尺寸", place_door = "设置房门", place_objects = "可以设置并移动这些物品直到满意为止,随后再确定", } newspaper = { [1] = { [1] = "医生震惊四座", [2] = "这医生扮演玩弄上帝", [3] = "科学狂人的震撼", [4] = "实验室地板上摆放着什么?", [5] = "查获一项危险的研究", }, [2] = { [1] = "酗酒", [2] = "外科医生醉酒", [3] = "挑剔的顾问", [4] = "外科医生的酒量", [5] = "外科医生痛饮失态", [6] = "外科医生的灵魂", }, [3] = { [1] = "粗鲁的医生", [2] = "医生臭名远扬", [3] = "医生完了", [4] = "贪得无厌的医生", }, [4] = { [1] = "篡改数据", [2] = "器官买卖犯罪", [3] = "银行危机", [4] = "调查基金数据", }, [5] = { [1] = "医学工作者盗墓", [2] = "医生盗墓", [3] = "医生盗墓,人赃并获", [4] = "医生死期不远了", [5] = "超级渎职", [6] = "医生盗墓", }, [6] = { [1] = "医生?庸医!", [2] = "庸医露馅了", [3] = "令人诅咒的诊断", [4] = "笨蛋专家", }, [7] = { [1] = "医生真情放纵", [2] = "医生自我“手术”", [3] = "医生完了", [4] = "医生大丑闻", [5] = "医生搞得一团糟", }, } staff_title = { junior = "实习医生", psychiatrist = "精神病医生", consultant = "专家", surgeon = "外科医生", doctor = "医生", researcher = "研究员", nurse = "护士", receptionist = "接待员", general = "普通人", } graphs = { deaths = "死亡", money_in = "收入", money_out = "支出", visitors = "访问者", wages = "工资", balance = "现金", time_spans = { [1] = "1 年", [2] = "12 年", [3] = "48 年", }, cures = "治愈", reputation = "声望", } adviser = { tutorial = { hire_receptionist = "您也需要一位接待员来接待病人。", build_pharmacy = "恭喜!现在应建造一个药房并雇佣一位护士,使医院正常运转。", hire_doctor = "您需要一个医生来诊断和治疗病人。", place_receptionist = "移动接待员并将她放到任意位置。她将很聪明地自己走到接待台。", place_windows = "设置窗户的方法与设置房门的方法相同。您可以不需要窗户,但是当您的员工可以从窗户向外张望时,他们将感到快乐。", confirm_room = "左键单击闪动光标就可以开业了,也可以通过点击交叉按钮返回上一步。", rotate_and_place_reception = "点击鼠标右键可以旋转桌子,并用鼠标左键将其放在医院中合适位置。", build_reception = "你好。首先,您的医院需要一个接待台,您可以从布置走廊菜单中选取。", doctor_in_invalid_position = "嗨!您不能将医生放在那里。", start_tutorial = "阅读任务简报,随后点击鼠标左键就可以启动教程。", receptionist_invalid_position = "您不能将接待员放在那里。", room_too_small_and_invalid = "蓝图尺寸太小了且处于非法位置。", window_in_invalid_position = "该窗口处于非法位置。请尝试蓝图墙壁上的其它位置。", choose_doctor = "在选择医生之前,应重点考虑其能力。", information_window = "帮助条将告诉您刚刚建造的一般诊断室信息。", build_gps_office = "您必须建造一般诊断室才可以诊断病人。", select_doctors = "点击闪动的光标挑选可被雇佣的医生。", select_diagnosis_rooms = "点击闪动的光标将弹出诊断类房间列表。", select_receptionists = "使用鼠标左键单击闪动的光标来查看当前可选择的接待员。光标下方的数字表示共有多少个接待员可供选择。", order_one_reception = "使用鼠标左键单击闪动的光标,可以定购一个接待台。", choose_receptionist = "判断哪一个接待员拥有好的能力与合适的工资,再左键单击闪动的光标来雇佣她。", prev_receptionist = "左键单击闪动的光标将可以浏览到前一个可供选择的接待员。", accept_purchase = "点击闪动的光标表示购买。", place_door = "沿着蓝图墙壁移动鼠标,寻找放置房门的合适位置。", click_and_drag_to_build = "建造一般诊断室时应先决定具体的尺寸。点击并按住鼠标左键可以设置房间尺寸。", room_in_invalid_position = "该蓝图是非法的,红色区域表示蓝图与其它房间或墙壁重叠。", place_objects = "右击可以旋转房屋中的各种物品,再左击表示确认。", room_too_small = "该房间的蓝图为红色是因为其尺寸太小了。通过拖动使其尺寸增大。", click_gps_office = "点击闪动光标表示选择一般诊断室。", reception_invalid_position = "如果接待台是灰色的,则表示当前位置是非法的。应尝试移动或旋转它。", next_receptionist = "这是接待员列表中的第一个。左键单击闪动的光标可以浏览下一个可供选用的接待员。", room_big_enough = "蓝图尺寸已经足够大了。当您松开鼠标按键表示确认。如果需要的话,以后还可以根据需要移动或改变其尺寸。", object_in_invalid_position = "该物品当前位置非法。请要么将其放到其它位置,要么对其进行旋转。", door_in_invalid_position = "房门设置位置非法。请尝试蓝图墙壁上的其它位置。", place_doctor = "将医生放在医院中的任意位置。他将直奔一般诊断室,为病人诊断。", }, epidemic = { hurry_up = "如果无法立即控制传染病那么您的医院将出大乱子。加油!", serious_warning = "传染病疫情越来越严重。您必须立即行动!", multiple_epidemies = "看来医院里同时有不只一种传染病。这将是一场空前灾难,加油!", }, staff_advice = { need_handyman_machines = "如果希望维护医院内的各种医疗机器,则需要雇佣清洁工人。", need_doctors = "您需要更多的医生。请将最得力的医生放在排队等候人数最多的房间内。", need_handyman_plants = "您需要雇佣一位清洁工人来为植物浇水。", need_handyman_litter = "医院中出现了垃圾。请雇佣一个清洁工人打扫垃圾。", need_nurses = "您需要雇佣更多的护士。病房和药房都需要护士。", too_many_doctors = "您雇佣的医生太多了。其中有一些人当前正闲着。", too_many_nurses = "我认为您现在雇佣了太多的护士。", }, earthquake = { damage = "地震损坏了医院中%d台机器,并使%d个人受伤。", alert = "地震警报。在地震过程中,医院中的机器将受损。如果它们没有得到及时维护将彻底毁坏。", ended = "我认为这是一个大家伙-按照里氏标准为%d。", }, multiplayer = { objective_completed = "您已经完成任务了。恭喜!", everyone_failed = "每个人都没有完成最终目标。因此每个人都要继续努力!", players_failed = "下面的玩家没有完成最终目标:", poaching = { in_progress = "我将让您了解这个人是否愿意为您工作。", not_interested = "哈哈!他们对为您工作不感兴趣-他们希望找寻自我价值。", already_poached_by_someone = "没门!有人想要挖走这个人。", }, objective_failed = "任务失败。", }, surgery_requirements = { need_surgeons_ward_op = "您需要雇佣两位外科医生,并修建一个病房和手术中心,这样才可以完成外科手术。", need_surgeon_ward = "为了完成外科手术,您还需要雇佣一名外科医生,以及修建一个病房。", }, vomit_wave = { started = "请赶快处理医院中的呕吐物,否则呕吐现象会四处传播。也许您需要多雇佣几个清洁工人。", ended = "嗨!呕吐现象已被控制。今后一定要保持医院的清洁。", }, level_progress = { halfway_lost = "您距离失败还差一半。", dont_kill_more_patients = "您实际上无力支付太多的医疗事故赔款!", another_patient_killed = "哦,不!您已经杀死了一个病人。这已经是第%d个了。", halfway_won = "您距离胜利还差一半。", close_to_win_increase_value = "您距离胜利只有一步之遥了。再增加医院价值%d。", financial_criteria_met = "您已经完成了本任务要求达到的财政目标。现在请保持现金在%d以上,使我们确信您的医院运行良好。", nearly_won = "您已经距离胜利非常接近了。", hospital_value_enough = "保持医院价值在%d以上,并解决好其它问题,就能胜利完成任务了。", another_patient_cured = "干得好-治愈了一个病人。收入$%d。", three_quarters_lost = "您距离失败还差四分之三。", reputation_good_enough = "好的,您的声望已经达到任务要求了。保持在%d以上,并解决好其它方面的问题。", cured_enough_patients = "您已经治愈了足够多的病人,但是您只有达到更高的标准才能胜利完成任务。", nearly_lost = "您距离失败只有一步之遥了。", improve_reputation = "您需要提高声望%d,这样才能有机会完成任务。", three_quarters_won = "您距离胜利还差四分之三。", }, staff_place_advice = { receptionists_only_at_desk = "接待员只能在接待台工作。", only_psychiatrists = "只有具有精神病治疗技能的医生才可以在精神病诊断治疗室中工作。", only_surgeons = "只有拥有外科技能的医生才可以在手术中心工作。", only_nurses_in_room = "只有护士可以在%s中工作", only_doctors_in_room = "只有医生可以在%s中工作", only_researchers = "只有拥有研究技能的医生才可以在研究部门工作。", nurses_cannot_work_in_room = "护士无法在%s中工作", doctors_cannot_work_in_room = "医生无法在%s中工作", }, research = { machine_improved = "%s的疗效被您的研究部门增强了。", autopsy_discovered_rep_loss = "您的自动验尸机已经研制成功。对公众将产生副作用。", drug_fully_researched = "您已经研究%s到达100%%了。", new_machine_researched = "一个新的%s刚刚被成功研究出来。", drug_improved = "治疗%s的药品被您的研究部门改良了。", new_available = "一种新的%s可以使用了。", new_drug_researched = "治疗%s的一种新药被研究成功。", }, boiler_issue = { minimum_heat = "噢,终于找到您了。锅炉坏了。也就是说医院里的人将感到有点冷。", maximum_heat = "锅炉快失控了。暖气的供暖能力已经达到极限了。医院里的人都快被熔化了!多设置一些饮料机。", resolved = "好消息。锅炉和暖气现在工作正常。气温很快就可以恢复到正常水平。", }, competitors = { staff_poached = "您的一位员工被其它医院挖走了。", hospital_opened = "竞争对手%s的医院在本区域内已经开张了。", land_purchased = "%s已经购买了一些土地。", }, room_requirements = { research_room_need_researcher = "您需要为研究室雇佣一个拥有研究技巧的医生。", op_need_another_surgeon = "您至少还需要为手术中心雇佣一名外科医生。", op_need_ward = "您必须为外科手术前的患者建造病房。", reception_need_receptionist = "您必须为病人雇佣一位接待员。", psychiatry_need_psychiatrist = "您需要雇佣一位精神病医生,现在您已经建成了一个精神病诊断治疗室。", pharmacy_need_nurse = "您应该为药房雇佣一位护士。", ward_need_nurse = "您需要为病房雇佣一名护士。", op_need_two_surgeons = "请为手术中心雇佣两名外科医生完成手术。", training_room_need_consultant = "您应该为培训室雇佣一位专家,负责讲演。", gps_office_need_doctor = "您需要为一般诊断室雇佣一名医生。", }, goals = { win = { money = "您还需要%d才能完成本关中的财政指标。", cure = "再治愈%d个病人您就可以满足本关任务的要求了。", reputation = "提高声望%d将达到胜利完成本任务的要求", value = "您需要增加医院收入到$%d", }, lose = { kill = "再杀死%d个病人将导致本任务失败!", }, }, warnings = { charges_too_low = "治疗费用太低了。它将使更多的病人到医院就诊,但您无法从每个病人身上获取太多的利润。", charges_too_high = "治疗费用太高了。短期内它将产生很好的效益,但最终会把病人吓跑的。", staff_overworked = "您的员工已经劳累过度。他们的办事效率正在下降,并将有可能发生医疗事故。", doctor_crazy_overwork = "喔,不!您的一位医生已经由于劳累过度快要发狂了。如果能够立即让他休息,他将得到恢复。", doctors_tired = "您的医生太累了。立即让他们休息。", people_did_it_on_the_floor = "您的一些病人坚持不住了。赶快打扫干净。", queues_too_long = "队伍太长了。", money_very_low_take_loan = "您的现金量太少了。您可以尝试贷款。", patients_very_thirsty = "人们感到太口渴了。如果您不立即设置一些饮料机,则将看到大多数人回家去喝可乐。", machinery_very_damaged = "紧急!立即派清洁工去修理机器!它们要爆炸了!", handymen_tired2 = "您的清洁工太疲倦了。立即让他们休息。", desperate_need_for_watering = "您需要雇佣一名清洁工照料医院中的植物。", nurses_tired = "您的护士感到疲倦了。立即让她们休息。", too_much_litter = "医院中的废弃物不断增多。派几个清洁工人就可以解决。", reception_bottleneck = "接待台已无法满足需要。再雇佣一名接待员。", place_plants4 = "在医院中多摆放一些植物使所有病人感到快乐。", change_priorities_to_plants = "您必须改变清洁工的工作优先级,使他们更多地为植物浇水。", staff_too_hot = "您的工作人员感到太热了。请调低供热标准或拆除房间内的暖气。", finanical_trouble2 = "多增加一些收入。如果再亏损$%d任务就会失败。", plants_thirsty = "您需要对植物进行照料。它们正感到干渴。", litter_everywhere = "医院中的废弃物到处都是。多派几个清洁工人就可以解决。", nurses_tired2 = "您的护士太疲倦了。立即让她们休息。", plants_dying = "您的植物快干死了。它们需要水。多为植物派些清洁工。病人可不愿意看到枯死的植物。", reduce_staff_rest_threshold = "尝试在医院制度画面中减少员工休息时的疲劳程度,这样员工将经常休息。这只是一个主意。", more_toilets = "您需要更多的马桶。人们都已急不可待了。", hospital_is_rubbish = "人们在到处宣扬您的医院是垃圾。要知道您的医院很快就会臭名远扬。", pay_back_loan = "您已经挣到了很多钱。为什么不考虑偿还贷款?", financial_trouble3 = "您的现金状况不太妙。想办法增加一些收入。您距离失败还差$%d。", bankruptcy_imminent = "嗨!您快破产了。小心啊!", build_toilet_now = "立即建造洗手间。人们已经忍无可忍了。别傻笑,这可是一个严重问题。", patient_stuck = "有人被卡住了,更好地规划您的医院。", no_patients_last_month = "上个月,没有新的病人前来您的医院。太可怕了!", more_benches = "是否考虑多摆放一些长椅。一些病情严重的病人现在正被迫站着等待治疗。", many_epidemics = "看来医院里同时有不只一种传染病。这将是一场空前灾难,加油!", place_plants_to_keep_people = "人们正在离开。多摆放一些植物可以挽留他们。", patients_thirsty2 = "人们抱怨口渴。您应该在医院中多设置一些饮料机,或将已有的饮料机移动到他们身边。", money_low = "", staff_unhappy = "您的工作人员不是很快乐。可以尝试给他们一些奖金,或为他们建造一个员工休息室。您也可以在医院制度画面中调整员工需要休息时的疲劳程度。", people_freezing = "无法相信,在这个拥有中央空调的时代,您的一些病人竟然快被冻僵了。赶快摆放一些暖气并打开供暖开关使他们感到温暖。", need_toilets = "病人需要洗手间。请在一些易找的地方建造洗手间。", nobody_cured_last_month = "上个月几乎没有治愈一个病人。", patients_very_cold = "病人们感到太冷了。请增加医院的供热,或在医院中多摆放一些暖气。", build_toilets = "立即建造一个洗手间,否则您将看到非常不雅的事情发生。想象一下医院中将会出现的味道。", many_killed = "您已经杀死了%d个病人。您本应该治愈他们的病。", place_plants2 = "人们正在离开。多摆放一些植物可以使他们多停留一会儿。", staff_tired = "您的员工感到太疲倦了。如果您再不让他们到员工休息室休息一会儿,则某些人会由于长时间的紧张疲劳导致崩溃。", machines_falling_apart = "您的机器快爆炸了。请立即让清洁工进行维修!", patients_unhappy = "病人不喜欢您的医院。您必须为提高环境质量做一些事情。", place_plants3 = "人们的情绪很糟。多摆放一些植物使他们快乐。", staff_unhappy2 = "您的员工都不是很快乐。很快他们就会要求发奖金。", cash_low_consider_loan = "您的流动资金状况十分不妙。是否考虑贷款?", queue_too_long_at_reception = "在接待台前排队等待的病人太多了。请再建一个接待台并雇佣一名接待员。", queue_too_long_send_doctor = "您的%s队伍太长了。请确认房间中是否有医生。", financial_trouble = "您正面临着严重的财政危机。立即整理帐户!如果您再亏损$%d,本关任务将失败。", doctors_tired2 = "您的医生太疲倦了。立即让他们休息。", handymen_tired = "您的清洁工人太劳累了。立即让他们休息。", patient_leaving = "一个病人离开了。原因?医院管理不善,员工工作不力,再加上设施不全。", machinery_damaged2 = "您必须立即雇佣一名清洁工去负责修理维护机器。", patients_leaving = "病人们正在离去。在医院中多摆放一些植物,长椅,饮料机等物品将有助于挽留他们。", epidemic_getting_serious = "传染病疫情越来越严重。您必须立即行动!", machinery_damaged = "立即修理您的机器。它们无法支撑太久。", people_have_to_stand = "病人不得不站立等待。立即多摆放一些长椅。", receptionists_tired = "您的接待员太疲劳了。立即让她们休息。", build_staffroom = "立即建造一个员工休息室。您的员工工作太辛苦了,而且将要精神崩溃了。快点!", machinery_slightly_damaged = "您的医疗仪器有轻微损伤。别忘了维护。", need_staffroom = "建造一个员工休息室使您的员工得以休息。", patients_getting_hot = "病人们感到太热了。请降低医院的供热,或移走一些暖气。", machinery_deteriorating = "您的机器由于过度使用已经出现老化现象。小心。", patients_too_hot = "病人们感到太热了。要么拆除一些暖气,调低供热标准,要么为他们多设置一些饮料机。", patients_thirsty = "人们感到口渴。也许您应该向他们提供饮料机。", machine_severely_damaged = "%s已经快彻底毁坏了。", litter_catastrophy = "医院中的废弃物太多了。立即派一队清洁工人解决这个问题。", staff_very_cold = "员工们感觉太冷了。请增加医院的供热,或在医院中多摆放一些暖气。", deal_with_epidemic_now = "如果无法立即控制传染病那么您的医院将出大乱子。加油!", too_many_plants = "您已经布置了足够多的植物了。医院都快变成丛林了。", patients_really_thirsty = "病人们感到口渴。多放置一些饮料机,或将已有的饮料机移动到最长的队伍旁边。", some_litter = "清洁工人可以在垃圾成堆之前清除所有垃圾。", patients_annoyed = "人们对医院的管理感到极端愤怒。我不能责备他们,抓紧时间解决问题吧!", receptionists_tired2 = "您的接待员太疲倦了。立即让她们休息。", }, placement_info = { door_can_place = "如果您愿意的话可以在这里设置房门。", window_can_place = "你可以在这里设置窗户,这样很好。", door_cannot_place = "抱歉,您无法在这里设置房门。", object_can_place = "您可以在这里摆放物品。", reception_can_place = "您可以在这里放置接待台。", staff_cannot_place = "您无法在这里安置员工。对不起。", staff_can_place = "您可以在这里安置员工。", object_cannot_place = "嗨,您无法在这里摆放物品。", room_cannot_place = "您无法在这里建房。", room_cannot_place_2 = "您无法在这里建房。", window_cannot_place = "您实际上无法在这里设置窗户。", reception_cannot_place = "您无法在这里放置接待台。", }, praise = { many_benches = "病人拥有足够的座位。太棒了。", many_plants = "太可爱了。您已经布置了足够的植物。病人将感到满意。", plants_are_well = "太棒了。植物被照料得很好。", few_have_to_stand = "在您的医院中几乎每个人都有座位。所有的病人都感到快乐。", plenty_of_benches = "座椅已经足够了。", plants_thriving = "太棒了。医院中的植物生长得很茂盛。它们看起来令人感到惊奇。坚持住,您将有可能赢得一个大奖。", patients_cured = "已经治愈了%d个病人。", }, information = { larger_rooms = "大的房间将使员工感觉到自己的重要,并提高他们的表现。", extra_items = "房间中摆放物品将使员工感到舒服并提高他们的表现。", epidemic = "在您的医院中发现了一种传染病。您必须立即处理!", promotion_to_doctor = "您的一个实习医生提升为医生了。", emergency = "紧急情况!快!快!快!", patient_abducted = "您的一位病人被外星人诱拐了。", first_cure = "干得好!您已经治愈了第一个病人。", promotion_to_consultant = "您的一名医生已经提升为专家了。", handyman_adjust = "您可以通过调整清洁工人工作的优先级使其打扫得更干净。", promotion_to_specialist = "您的一个医生被提升为%s。", initial_general_advice = { rats_have_arrived = "老鼠在您的医院中到处乱跑。使用鼠标打死它们。", autopsy_available = "自动验尸机被研制出来了。通过它,您可以处置惹麻烦或不欢迎的病人,还可以对他们进行研究。要注意-能否使用该机器还有很大的争议。", first_patients_thirsty = "医院中的人们感到口渴。为他们多摆放一些饮料机。", research_now_available = "您已经建造了第一个研究房间。现在您可以进入研究画面。", psychiatric_symbol = "拥有精神病技能的医生后跟符号:|", decrease_heating = "医院中的人们感到太热了。在城镇地图画面中,降低供热量。", surgeon_symbol = "拥有外科手术技能的医生后跟符号:{", first_emergency = "急救病人的头顶有一个闪亮的蓝色急救灯。在死亡之前或时间倒数结束之前治愈他们。", first_epidemic = "在医院中爆发了传染病请决定是掩盖病情还是将其清除出去。", taking_your_staff = "有人想要挖走您的员工。您要抓紧与他们进行斗争。", place_radiators = "医院中的人们感到寒冷-您可以多摆放一些暖气。", epidemic_spreading = "您的医院中发现传染病。在病人离开医院之前一定要治愈他们。", research_symbol = "拥有研究技能的医生后跟符号:}", machine_needs_repair = "您有一台机器需要维修。确定机器位置-它可能正在冒烟-在机器上点击一下,再点击清洁工人按钮。", increase_heating = "人们感到寒冷。打开城镇地图画面中的供暖设施。", first_VIP = "您要接待来访的第一位贵宾。一定要确保贵宾没有看到任何不良事件,或其他不高兴的病人。", }, patient_leaving_too_expensive = "一位病人没有为%s付款就离开了。这损失太大了。", vip_arrived = "小心!%s正准备访问您的医院!保持医院运转正常,这样才能使他感到愉快。", epidemic_health_inspector = "您的医院中出现传染病的消息已经到达了卫生部。卫生巡查员很快就要到达,快做准备。", first_death = "这是您第一次杀死病人。感觉如何?", pay_rise = "您的一个员工威胁要辞职。选择是否同意其请求,或将其解雇。点击屏幕左下方的标志可以查看威胁要辞职的员工信息。", place_windows = "设置窗户将使房间更加明亮,并振奋员工的精神。", fax_received = "在屏幕左下角刚刚弹出的标志表示一些重要事件的相关信息,或某些需要您决定的事情。", }, build_advice = { placing_object_blocks_door = "设置该物品可以阻止其他人接近。", blueprint_would_block = "蓝图与其它房间重叠了。请尝试重新设置蓝图尺寸,或移动蓝图位置。", door_not_reachable = "病人无法进入那扇门。仔细想一想。", blueprint_invalid = "蓝图位置非法。", }, } casebook = { sent_home = "转走", deaths = "死亡", treatment_charge = "治疗花费", reputation = "声望", research = "集中研究", cure = "治疗", cured = "治愈", earned_money = "收入", cure_desc = { hire_psychiatrists = "您需要雇佣一些精神病医生。", improve_cure = "提高疗效。", hire_nurses = "您需要雇佣一些护士。", build_ward = "您仍需要建造一个病房。", no_cure_known = "未治愈。", cure_known = "治愈。", build_room = "我建议您修建%s", hire_doctors = "您需要雇佣一些医生。", hire_surgeons = "您需要雇佣一些外科医生。", }, } diseases = { diag_ward = { name = "病房诊断", }, diag_ultrascan = { name = "超级扫描仪诊断", }, autopsy = { name = "验尸", }, third_degree_sideburns = { cause = "病因-向往20世纪70年代。", cure = "治疗-精神病医生必须使用最新科技,使病人认识到这些奇装异服都是垃圾。", name = "络腮胡子", symptoms = "症状-长头发,全身闪闪发光。", }, discrete_itching = { cause = "病因-昆虫叮咬。", cure = "治疗-病人喝下胶状糖浆阻止皮肤发痒。", name = "搔痒症", symptoms = "症状-到处乱抓,引起全身发炎。", }, the_squits = { cause = "病因-吃了变质的比萨饼。", cure = "治疗-服用粘性药剂修补病人的内脏。", name = "呕吐", symptoms = "症状-噢。想必您也可以猜得到。", }, spare_ribs = { cause = "病因-坐在冰冷的石地板上。", cure = "治疗-由两名外科医生执行手术。", name = "瘦骨", symptoms = "症状-胸部感觉不适。", }, diag_blood_machine = { name = "血液机器诊断", }, king_complex = { cause = "病因-猫王的思想进入病人大脑并取而代之。", cure = "治疗-由精神病医生告诉病人其荒谬的举止。", name = "猫王综合症", symptoms = "症状-穿着举止怪异。", }, diag_x_ray = { name = "X光诊断", }, pregnancy = { cause = "病因-怀孕。", cure = "治疗-在手术中心中将婴儿取出,洗净送到病人面前。", name = "产妇", symptoms = "症状-不断增大的啤酒肚。", }, fake_blood = { cause = "病因-病人常常开玩笑。", cure = "治疗-只有精神病医生才能使病人安静下来。", name = "假血", symptoms = "症状-流出红色液体。", }, diag_psych = { name = "精神病诊断", }, invisibility = { cause = "病因-被有放射性的蚂蚁叮咬。", cure = "治疗-在药房喝下彩色液体,将很快使病人恢复正常。", name = "隐身", symptoms = "症状-病人本身感觉不到任何不适,并常常和家里人开玩笑。", }, golf_stones = { cause = "病因-吸入了高尔夫球内部的有毒气体。", cure = "治疗-由两名外科医生执行手术。", name = "高尔夫症", symptoms = "症状-神经错乱且胡言乱语。", }, diag_general_diag = { name = "一般诊断", }, infectious_laughter = { cause = "病因-观看古典喜剧。", cure = "治疗-精神病医生必须让病人了解其当前严重的病情。", name = "狂笑症", symptoms = "症状-不住狂笑。", }, general_practice = { name = "一般诊断", }, baldness = { cause = "病因-向公众说谎话。", cure = "治疗-使用仪器将头发缝合到病人的头上。", name = "秃顶", symptoms = "症状-脑门发亮,十分困窘。", }, heaped_piles = { cause = "病因-站立在水冷却器旁边。", cure = "治疗-服用药剂。", name = "痔疮", symptoms = "症状-病人感觉就象坐在大理石上。", }, unexpected_swelling = { cause = "病因-意外事件。", cure = "治疗-由两名外科医生实行手术。", name = "肿胀", symptoms = "症状-肿胀。", }, jellyitis = { cause = "病因-日常饮食含有过多的胶状物并完成太多的练习。", cure = "治疗-将病人浸入到胶桶中。", name = "失衡症", symptoms = "症状-走路摇摇晃晃并不时摔倒。", }, hairyitis = { cause = "病因-在月光下停留过长时间。", cure = "治疗-使用电分解机器去掉毛发并填补遗留的毛孔。", name = "多毛症", symptoms = "症状-嗅觉特别灵敏。", }, alien_dna = { cause = "病因-拥有了外星人的DNA。", cure = "治疗-利用仪器快速清除病人体内的DNA。", name = "外星人DNA", symptoms = "症状-逐渐蜕变成外星人并阴谋摧毁我们的城市。", }, bloaty_head = { cause = "病因-闻到了坏乳酪并喝了不干净的雨水。", cure = "治疗-打破肿胀脑袋,并使用充气机使脑袋恢复正常。", name = "头部肿胀", symptoms = "症状-非常不舒服。", }, gastric_ejections = { cause = "病因-吃了过辣的四川菜。", cure = "治疗-服用特殊凝固剂从而阻止呕吐。", name = "反胃症", symptoms = "症状-半消化的食物被病人不时吐出。", }, uncommon_cold = { cause = "病因-吸进了空气中的灰尘。", cure = "治疗-服用药房配制的特效药。", name = "感冒", symptoms = "症状-流鼻涕,打喷嚏。", }, corrugated_ankles = { cause = "病因-驾驶时间过长。", cure = "治疗-服用少量毒草和香料制成的药剂,从而打通关节。", name = "脚踝弯曲", symptoms = "症状-脚踝感觉不舒服。", }, sleeping_illness = { cause = "病因-内分泌失调。", cure = "治疗-由护士配制一剂威力强大的兴奋剂给病人服用。", name = "嗜睡症", symptoms = "症状-无论走到那里都想睡觉。", }, sweaty_palms = { cause = "病因-害怕找工作时的面试。", cure = "治疗-精神病医生使病人走出心理误区。", name = "手心出汗症", symptoms = "症状-当与病人握手时,感觉就象攥着一块吸满了水的海绵。", }, serious_radiation = { cause = "病因-不小心错误吞吃了含有钚元素的口香糖。", cure = "治疗-病人必须被放置在净化淋浴器内彻底清洗。", name = "放射病", symptoms = "症状-病人感到非常非常的不舒服。", }, diag_cardiogram = { name = "心电图仪诊断", }, diag_scanner = { name = "扫描仪诊断", }, gut_rot = { cause = "病因-喝了太多的威士忌酒。", cure = "治疗-由护士配制药剂,交给病人服下。", name = "内脏腐烂", symptoms = "症状-不咳嗽,但胃壁也没有了。", }, iron_lungs = { cause = "病因-城市中浑浊的空气。", cure = "治疗-两名外科医生在手术中心执行手术。", name = "铁肺", symptoms = "症状-浑身难受。", }, broken_wind = { cause = "病因-饭后使用健身房的脚踏车进行运动。", cure = "治疗-服用药房配制的特效药。", name = "臭屁症", symptoms = "症状-使身后的人感到极度的不舒服。", }, kidney_beans = { cause = "病因-饮料中加入了大量冰块。", cure = "治疗-由两名外科医生执行手术。", name = "肾豆", symptoms = "症状-疼痛且经常去厕所。", }, transparency = { cause = "病因-舔了打开的容器的铅箔上的酸乳酪。", cure = "治疗-服用药房配制的特殊清凉彩色冲剂就可以治愈疾病。", name = "透明症", symptoms = "症状-肌肉变得透明,对光敏感。", }, broken_heart = { cause = "病因-一些人比病人富有,年轻,瘦。", cure = "治疗-由两名外科医生打开病人的胸腔,轻轻地修补其心脏缺陷。", name = "破碎的心", symptoms = "症状-痛哭流涕。", }, slack_tongue = { cause = "病因-过多地讨论肥皂剧。", cure = "治疗-将舌头放入舌头切片机中,将快速有效地得到治疗。", name = "舌头松弛症", symptoms = "症状-舌头增长到正常的5倍。", }, tv_personalities = { cause = "病因-日间电视节目。", cure = "治疗-精神病医生必须使病人有信心卖掉电视机,而购买收音机。", name = "电视病", symptoms = "症状-产生错觉,以为自己正在表演。", }, ruptured_nodules = { cause = "病因-在寒冷的季节中跳跃。", cure = "治疗-两名称职的外科医生必须使用稳定的双手切除肿瘤。", name = "肿瘤", symptoms = "症状-无法舒适地坐下。", }, fractured_bones = { cause = "病因-从高处摔到混凝土地面上。", cure = "治疗-将已打好的石膏使用仪器去除。", name = "骨折", symptoms = "症状-剧痛且无法使用四肢。", }, chronic_nosehair = { cause = "病因-经常对不如自己的人嗤之以鼻。", cure = "治疗-口服令人厌恶的毛发去除剂,该药剂由护士在药房配制。", name = "鼻毛过多症", symptoms = "症状-鼻毛过长过多,快成鸟巢了。", }, } policy = { header = "医院制度", diag_termination = "诊断结束", sliders = { guess = "尝试治疗", send_home = "遣送回家", stop = "停止治疗", staff_room = "去员工休息室", }, diag_procedure = "诊断程序", staff_rest = "员工休息", staff_leave_rooms = "员工离开房间", } competitor_names = { [1] = "神谕", [2] = "巨人", [3] = "黑尔", [4] = "马笛维克", [5] = "冬青树", [6] = "沉思", [7] = "禅", [8] = "里昂", [9] = "玛文", [10] = "晶体", [11] = "母亲", [12] = "洁尼", [13] = "CORSIX", [14] = "ROUJIN", [15] = "EDVIN", [16] = "萨姆", [17] = "查理", [18] = "亚瑟", [19] = "马格尼斯", [20] = "赛尔", [21] = "约书亚", [22] = "丹尼尔", [23] = "奥利文", [24] = "尼克", } buy_objects_window = { price = "价格:", choose_items = "选择物品", total = "总共:", } trophy_room = { wait_times = { award = { [1] = "恭喜。您的医院的排队等待时间非常短。这是给您的奖励。", }, penalty = { [1] = "病人在您的医院中排队等待时间太长了。您应该好好地管理前来就诊的病人。", }, }, happy_vips = { trophies = { [1] = "由于您的医院在过去一年中给来访的贵宾们留下了深深地好感,特此向您颁发诺贝尔奖。", [2] = "由于您的医院使每位造访贵宾都感到快乐,特此由名人机构颁发著名人士奖。您已经成为我们名人行列中的一员。", [3] = "由于您的医院在过去一年中使每一位来访贵宾都感到了员工的工作热情,特此颁发贵宾满意奖。", }, }, hosp_value = { penalty = { [1] = "您的医院价值太低了。您的理财能力太次了。记住一个好的医院通常也是价值最高的医院。", }, awards = { [1] = "由于您的医院价值不菲,因此卫生部向您表示恭喜。", }, regional = { [1] = "您真是一个理财高手。您的医院的价值比其它医院的总和还要多。", }, }, rats_accuracy = { trophies = { [1] = "由于您击打老鼠的命中率为%d%%,特此颁发极道枭雄2 射击准确奖。", [2] = "由于您的医院在过去一年中以难以置信的命中率%d%%击毙老鼠,特此颁奖。", [3] = "由于您的医院在过去一年中击毙了%d%%的老鼠,特此颁发地下城守护者除害奖。恭喜!", }, }, all_cured = { awards = { [1] = "由于您的医院在过去一年中成功地治疗了所有病人,特此颁发玛丽治疗奖。", }, trophies = { [1] = "由于您的医院在过去一年中成功地治疗了就诊的每个病人,国际治疗基金会特此向您颁发全部治愈奖。", [2] = "由于您的医院在过去一年中治愈了大量患者,特此颁发急病克星奖。", }, }, best_value_hosp = { trophies = { [1] = "由于您的医院在过去一年中赢得了最高的声望,特此颁发白衣天使奖。这是您应得的。", }, penalty = { [1] = "周围每个医院都比您的医院富有。您要加油啊。多购买一些昂贵的东西。", }, regional = { [1] = "恭喜您管理的医院成为最有价值的医院。干得好。保持下去。", }, }, high_rep = { penalty = { [1] = "在过去一年中,您赢得了很低的声望。以后一定要加油啊。", [2] = "您的声望是本区域最低的。真丢人。加油干。", }, awards = { [1] = "干得好。在上一个年度,由于您获得了很高的声望,特此颁发一个小小的奖励。", [2] = "太棒了! 由于您在过去一年中取得了很高的声望,特此颁发奖励。", }, regional = { [1] = "由于您的医院在过去一年中赢得了最高的声望,特此颁发牛蛙奖。这是您应得的。", [2] = "在这一年中,您的医院的声望超过了其它所有医院的总和。真是一项伟大的成就。", }, }, consistant_rep = { trophies = { [1] = "由于您的医院在过去一年中无懈可击的运营以及最高的声望,您被授予内阁大臣奖。干得好。", [2] = "由于您的医院在过去一年中赢得了最高的声望,特此颁发白衣天使奖。这是您应得的。", }, }, curesvdeaths = { awards = { [1] = "恭喜您在过去一年中使医院保持了很高的治愈率和很低的死亡率。", }, penalty = { [1] = "您的治愈率实在是太低了。您应该使治愈的病人多于死亡的病人。不要颠倒了。", }, }, cleanliness = { regional_good = { [1] = "您的医院是最脏乱的医院之一。一个脏乱的医院不仅味道难闻,而且是十分危险的。请密切留意。", }, award = { [1] = "卫生巡查员注意到您的医院非常干净。干净的医院意味着安全的医院。坚持下去。", }, regional_bad = { [1] = "您的医院是本区域中最脏乱的。其它医院都使走廊保持整洁。您使医学界蒙羞。", }, }, happy_patients = { awards = { [1] = "在过去一年中,您的医院使所有访问的病人都感到快乐,您将为此感到骄傲。", [2] = "访问您的医院的病人比其它医院内的病人要快乐得多。", }, penalty = { [1] = "前去您的医院就诊的病人感到非常不满。您必须改进提高才可以获得卫生部的尊重。", [2] = "在您的医院中接受治疗的病人感到非常不高兴。您应多为病人的福利着想。", }, }, emergencies = { regional_good = { [1] = "卫生部认识到您的医院在处理紧急事件时比其它医院都要好,特此颁发奖励。", }, penalty = { [1] = "您处理紧急事件的能力实在太差了。前来就诊的急救病人并没有得到正确的治疗。", }, regional_bad = { [1] = "您的医院是本区域中处理紧急事件最差的。这都是您的过错。", }, award = { [1] = "恭喜:由于您的努力和卓有成效的紧急事件处理能力,使您荣获该特别大奖。干得好。", [2] = "您处理紧急事件的能力非常突出。由于您最佳的处理能力,特此颁发奖励。", }, }, gen_repairs = { awards = { [1] = "由于您的清洁工人使医院内的仪器设备运行良好,特此颁发特别奖金。干得好。假期愉快。", [2] = "您的清洁工人比其它医院的都要好。这真是一件值得庆祝的事情。", [3] = "您的仪器维护得很好。这一切都离不开清洁工人的努力。干得好。", }, penalty = { [1] = "您的清洁工人在维护机器方面表现不是很好。您应该让他们更多地关心维护保养工作,或者再多雇佣几名清洁工人。", [2] = "维修工作一团糟。您的清洁工人无法很好的照料各种医疗仪器。", }, }, no_deaths = { trophies = { [1] = "由于您的医院在过去一年中没有发生任何病人死亡事件,特此颁发安全奖。", [2] = "由于您的医院在过去一年中没有发生病人死亡事件,特此由生命发展组织向您颁奖。", [3] = "由于您的医院在过去一年中避免发生病人死亡事件,特此颁发挽留妙手回春奖。", }, penalty = { [1] = "在过去一年中,您的医院的死亡人数始终很高。一定要多加注意。以后一定要确保病人的存活。", [2] = "您的医院对于病人的健康简直就是在冒险。您应该治愈大量的病人,而不是让他们加速死亡。", }, awards = { [1] = "由于您的医院在本年度保持了很低的死亡人数,特此颁发奖励。太棒了。", [2] = "由于您的天才管理使医院的死亡人数达到最低点。这真是令人高兴的事情。", }, regional = { [1] = "您的医院的死亡人数比其它医院都低。请接受这个奖励。", }, }, rats_killed = { trophies = { [1] = "由于您的医院在过去一年中共击毙了%d只老鼠,特此颁发除害奖。", [2] = "由于您高超的击鼠技巧共击毙老鼠%d只,特此颁发联邦灭鼠奖。", [3] = "由于您的医院在过去一年中共击毙了%d只老鼠,特此颁发老鼠克星奖。", }, }, happy_staff = { trophies = { [1] = "由于您的医院在过去一年中使努力工作的员工保持快乐,特此颁发微笑奖。", [2] = "由于您的医院在过去一年中没有不快乐的员工,特此颁发阿达尼学院奖。", [3] = "由于您的医院在过去一年中使努力工作的员工保持快乐,特此颁发笑星奖杯。快乐地笑吧!", }, awards = { [1] = "您的员工表示要向您颁奖。他们说虽然还有很多需要改进的地方,但您对待他们的态度使他们感到很快乐。", [2] = "您的员工感到能够为您工作是一件非常快乐的事情,他们的笑容挂在脸上。您真是一个超级管理人才。", }, penalty = { [1] = "您的员工希望您知道他们非常不高兴。好的员工就是最有价值的资产。使他们快乐,否则您将在一天之内失去全部。", }, regional_good = { [1] = "您的员工比其它医院的员工都要快乐。快乐的员工意味着更高的利润和更低的死亡率。卫生部感到非常高兴。", }, regional_bad = { [1] = "您的员工在上一年度中非常不幸。您一定要加以留意。其它医院的员工都比您的员工快乐。", }, }, healthy_plants = { awards = { [1] = "由于您的医院在过去一年中是植物保持健康成长,特此颁发茁壮成长奖。", }, trophies = { [1] = "由于您的医院在过去十二个月中使所有植物长势良好,特此盆栽植物协会向您颁发绿色健康奖。", [2] = "由于您的医院在过去一年中使所有植物长势良好,特此颁发绿色名人奖。", }, }, sold_drinks = { trophies = { [1] = "由于您的医院在过去一年中售出了大量的罐装饮料,特此由全球牙医联合会向您颁奖。", [2] = "由于您的医院在过去一年中卖出大量饮料,特此软饮料零售组织向您颁发清凉饮料奖。", [3] = "由于您的医院在过去一年中卖出大量软饮料,特此由DK饮料公司向您颁发巧克力奖杯。", }, }, many_cured = { trophies = { [1] = "由于您的医院在过去一年中成功地治疗了几乎所有病人,特此恭喜您荣获玛丽治疗奖。", [2] = "由于您的医院在过去一年中治愈了大量患者,国际治疗基金会特此向您颁发悬壶济世奖。", [3] = "由于您的医院在过去一年中治愈了大量患者,特此颁发疾病克星奖。", }, penalty = { [1] = "您的医院无法使病人得到很好的治疗。请关注并加以改进。", [2] = "您的医院对病人的治疗效果不如其它医院。您使卫生部和您自己都名声扫地。下不为例。", }, awards = { [1] = "恭喜您在过去一年中治愈了这么多的病人。很多人都感觉不错,感谢您的工作。", [2] = "由于您的医院治愈了比其它医院更多的病人,所以请接受这个奖励。您的表现太棒了。", }, regional = { [1] = "由于您的医院治愈的病人数目比其它医院的总和还多,特此颁发奖励。", }, }, pop_percentage = { awards = { [1] = "在过去一年中,您的医院在城镇人口中获得了很高的份额。干得好。", [2] = "恭喜。访问您的医院的居民人数超过了其它任何一个医院。", [3] = "干得好。访问您的医院的居民人数超过了其它医院的总和。", }, penalty = { [1] = "在过去一年中,您的医院在城镇人口中获得了很高的份额。干得好。", [2] = "恭喜。访问您的医院的居民人数超过了其它任何一个医院。", }, }, research = { regional_good = { [1] = "您的研究使您的医院始终紧跟最新发展。这是您的科研人员应得的奖励。", }, penalty = { [1] = "您研究开发新治疗方案,仪器和药品的速度太慢了。这将无法赶上时代的步伐。", }, regional_bad = { [1] = "本区域中的每个医院在研究方面都强于您的医院。这一点使卫生部感到震怒。", }, awards = { [1] = "您的研究使您的医院始终紧跟最新发展。这是您的科研人员应得的奖励。", [2] = "在过去一年中,您比其它医院研究出更多的药品和仪器设备。请接受卫生部颁发的这个奖励。", }, }, reputation = "声望", cash = "现金", } menu_options_volume = { [50] = " 50%", [100] = " 100%", [30] = " 30%", [60] = " 60%", [90] = " 90%", [10] = " 10%", [20] = " 20%", [40] = " 40%", [80] = " 80%", [70] = " 70%", } menu_file_load = { [1] = " 存档一 ", [2] = " 存档二 ", [3] = " 存档三 ", [4] = " 存档四 ", [5] = " 存档五 ", [6] = " 存档六 ", [7] = " 存档七 ", [8] = " 存档八 ", } menu_file = { quit = " (%1%) 退出", save = " (%1%) 存储", load = " (%1%) 读取", restart = " (%1%) 重新开始", } rooms_long = { ultrascan = "超级扫描仪房间", research_room = "研究部门", general = "一般", gps_office = "一般诊断室", inflation = "充气房间", staffroom = "员工休息室", jelly_vat = "胶桶", scanner = "扫描仪房间", emergency = "紧急事件", decontamination = "净化", corridors = "走廊", cardiogram = "心电图仪房间", ward = "病房", training_room = "培训室", psychiatric = "精神病诊断治疗室", operating_theatre = "手术中心", dna_fixer = "DNA修复装置", tongue_clinic = "舌头松弛诊治所", hair_restoration = "毛发恢复装置", general_diag = "高级诊断室", pharmacy = "药房", fracture_clinic = "骨折诊所", toilets = "洗手间", electrolysis = "电分解诊所", x_ray = "X光房间", blood_machine = "血液机器房间", } fax = { epidemic_result = { fine_amount = "政府宣布全国紧急状态,并对您罚款%d。", close_text = "哈!", hospital_evacuated = "会议决定只能疏散您的医院。", succeeded = { part_1_name = "卫生巡查员听到了传闻,您的医院正在处理严重疾病%s。", part_2 = "然而他还没有能够找到证实传闻的证据。", }, compensation_amount = "政府决定奖励您%d作为补偿谣言对您医院声誉所造成的损失。", failed = { part_1_name = "尝试掩盖病情,他们正面临着传染病%s爆发。", part_2 = "医院中的员工已经制止了传染病向医院附近居民传播。", }, rep_loss_fine_amount = "报纸将整版报道此事。您的声望将大幅受损。另外,还要缴纳罚款%d。", }, vip_visit_query = { choices = { invite = "向贵宾发出邀请。", refuse = "找借口阻止贵宾访问。", }, vip_name = "%s希望能够访问您的医院!", }, vip_visit_result = { telegram = "电报!", remarks = { good = { [1] = "医院经营得太棒了。感谢您能够邀请我来访问。", [2] = "嗯。医院经营得还可以。", [3] = "我很欣赏您的医院。", }, super = { [1] = "医院太棒了。下次我生病一定要到那里去就诊。", [2] = "那就是我访问的医院。", [3] = "那是一个超级医院。并且我想知道更多一点。", }, bad = { [1] = "我为什么烦恼?这比看一场持续4个小时的歌剧好多了!", [2] = "我为我所看到的感到恶心。这也是医院?胡说八道!", [3] = "我已经受够了!", }, mediocre = { [1] = "喔,有点差劲。您应多做一些改进。", [2] = "喔,亲爱的。这个地方可不怎么样。", [3] = "这是一个比较一般的医院。但坦白地讲,我希望能够做得更好。", }, very_bad = { [1] = "真是一个垃圾。我要争取关闭它。", [2] = "我从没有见过这样可怕的医院。真是丢人!", [3] = "我被震惊了。这也能称为医院!给我一点酒。", }, }, rep_boost = "您的声望在公众中是很好的。", vip_remarked_name = "%s访问医院结束后发表评论:", cash_grant = "您将得到奖金%d。", rep_loss = "您的声望因此受到损害。", close_text = "感谢您访问医院。", }, disease_discovered_patient_choice = { need_to_build = "您必需建造一个%s才能处理该疾病。", need_to_employ = "雇佣一名%s就可以处理该情况。", what_to_do_question = "您打算怎样处理这个病人?", guessed_percentage_name = "您的员工正在尝试治疗该病人。我们有%d%%的几率治愈该病:%s", choices = { send_home = "送病人回家。", research = "将病人送到研究部门。", wait = "让病人在医院中等一会儿。", }, disease_name = "发现了新情况。该疾病为%s", need_to_build_and_employ = "如果您建造了一个%s并雇佣了一名%s,您就能成功。", can_not_cure = "您无法治疗该疾病。", }, emergency_result = { earned_money = "最大奖金额为$%d,您得到了$%d。", close_text = "点击这里退出。", saved_people = "您挽救了%d个病人,总共需要治愈%d个。", }, disease_discovered = { discovered_name = "您的员工发现了一种新的疾病。它是%s", need_to_employ = "雇佣一名%s就可以处理这种危机。", need_to_build_and_employ = "如果您建造了一个%s并雇佣了一名%s,您就能成功。", need_to_build = "您必需建造一个%s才能处理该疾病。", close_text = "新发现了一种疾病。", can_cure = "您可以处理这种疾病。", }, emergency = { locations = { [1] = "赛澈化学药品工厂。", [2] = "斯尼得大学。", [3] = "派拉奎特园艺中心。", [4] = "危险物质研究机构。", [5] = "莫理斯舞蹈家协会。", [6] = "青蛙与公牛酒店。", [7] = "大戴维殡葬馆。", [8] = "太子制革店。", [9] = "伯特二手石化产品商场。", }, num_disease = "%d个病人患有%s,他们需要紧急治疗。", cure_possible_drug_name_efficiency = "您已经拥有了要求的设备和技能。您拥有他们所需要的药品。药品%s的疗效为%d%%。", cure_not_possible_employ = "您将需要雇佣一名%s", cure_not_possible = "现在您还不能治疗这种疾病。", cure_possible = "由于您拥有准备和技能,所以您应该可以处理这个紧急事件。", choices = { accept = "好的。我已做好准备处理紧急事件。", refuse = "不。我拒绝处理这个紧急事件。", }, location = "在%s发生了事故", cure_not_possible_build = "您将需要建造一间%s", cure_not_possible_build_and_employ = "您将需要建造一间%s并雇佣一名%s", bonus = "处理这个紧急事件的最大奖金额为%d。如果您失败了,则您的声望将大幅下降。", }, debug_fax = { text4 = "FACTORS : DOCS %d NURSES %d AREA %d ROOMS %d PRICING %d", text5 = "CONTRIBN : DOCS %d NURSES %d AREA %d ROOMS %d PRICING %d PERCENT", text3 = "FIGURES : DOCS %d NURSES %d AREA %d ROOMS %d PRICING %d", text9 = "DISASTERS %d ALLOWED (MTHS) %d (%d)REDUCTION %d", close_text = "嗨,哈,哈!", text1 = "BEST COUNT %d", text6 = "THE FOLLOWING FACTORS ARE ALSO APPLIED", text8 = "AMENITIES %d PEEPS HANDLED %d REDUCTION %d", text2 = "TOTAL PEOPLE IN HOSPITAL %d CHECKING AGAINST %d", text10 = "KILLS %d ALLOWED (MTHS) %d (%d) REDUCTION %d", text11 = "PEOPLE THIS MONTH %d", text7 = "REPUTATION: %d EXPECTED %d REDUCTION %d", }, epidemic = { cover_up_explanation_1 = "如果您想要掩盖传染病,您将必须在有限时间内,即卫生巡查员到来之前,治愈所有被传染的病人。", cover_up_explanation_2 = "如果卫生巡查员到达,并发现了您正在试图掩盖传染病,则他将对您采取严厉的惩罚。", choices = { cover_up = "在指定时间内且病人离开医院之前,尽量治愈所有被感染的病人。", declare = "宣布一种传染病。支付罚款且名誉受损。", }, disease_name = "医生发现了传染病%s。", declare_explanation_fine = "如果您宣布出现传染病,则您将支付罚款%d,且名誉受损。所有病人将自动被接种疫苗。", }, diagnosis_failed = { choices = { send_home = "送病人回家。", take_chance = "尝试治疗病人。", wait = "让病人多等待一会儿,您需要多建造一些诊断室。", }, situation = "我们已经对该病人尝试了所有可供使用的机器,但是仍然没有发现病因。", what_to_do_question = "我们将怎样处置这个病人?", partial_diagnosis_percentage_name = "我们有%d%%的概率确定该病人所患疾病类型。", }, } drug_companies = { [1] = "良药公司", [2] = "名医公司", [3] = "小药片公司", [4] = "普芬公司", [5] = "欧米尼公司", } humanoid_name_ends = { [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] = "林", } confirmation = { return_to_blueprint = "您定要返回蓝图模式吗?", restart_level = "确定要重新开始这个任务吗?", delete_room = "确定要拆除这个房间吗?", quit = "确定要退出游戏吗?", overwrite_save = "该位置已有游戏进度。是否覆盖?", sack_staff = "确定要解雇该员工吗?", replace_machine = "确定要更新%s,并花费$%d?", } months = { [1] = "1 月", [2] = "2 月", [3] = "3 月", [4] = "4 月", [5] = "5 月", [6] = "6 月", [7] = "7 月", [8] = "8 月", [9] = "9 月", [10] = "10 月", [11] = "11 月", [12] = "12 月", } dynamic_info = { patient = { emergency = "紧急情况:%s", guessed_diagnosis = "尝试诊断:%s", diagnosis_progress = "诊断过程", actions = { sent_to_other_hospital = "指派到其它医院", prices_too_high = "费用太高了-我要回家了", waiting_for_treatment_rooms = "等待为我建造一间治疗室", dying = "快死了!", no_diagnoses_available = "无法诊断-我要回家了", epidemic_sent_home = "被巡查员赶回家", cured = "治愈!", waiting_for_diagnosis_rooms = "等待建造更多的诊断室", epidemic_contagious = "我有传染病", awaiting_decision = "等待您的决定", sent_home = "遣送回家", fed_up = "受够了,要离开", no_treatment_available = "无法治疗-我要回家了", on_my_way_to = "在去%s的路上", queueing_for = "排队等待%s", }, diagnosed = "诊断:%s", }, health_inspector = "卫生巡查员", vip = "来访贵宾", object = { times_used = "使用次数%d", queue_size = "排队人数%d", strength = "力量%d", queue_expected = "即将加入队伍人数%d", }, staff = { ability = "能力", psychiatrist_abbrev = "精神分析", actions = { going_to_repair = "前往维修%s", waiting_for_patient = "等待病人", wandering = "正在到处走动", }, tiredness = "疲劳", }, } introduction_texts = { level17 = "最后的警告-时刻关注您的声望-这是真正吸引病人前来就诊的关键。" .. "如果您没有杀死太多的病人,且使就诊病人保持快乐,则不必太担心声望!" .. "决定权就在您的手中。祝您好运。", level1 = "欢迎来到您的第一座医院!//" .. "首先要摆放接待台,建造一般诊断室,并雇佣一名接待员和一名医生。" .. "随后就可以等待开张了。" .. "建造精神病诊断治疗室并雇佣一名精神病医生是一个好主意。" .. "药房和护士也是治疗病人所必需的。" .. "建造一个充气机房间就可以治疗头部肿胀患者。" .. "您需要治愈10个病人,并使声望保持在200以上。", level9 = "当填满了卫生部的银行帐户并为部长大人购买了一辆轿车后,您现在又要开始新的工作了。" .. "在这里您要面对很多问题。" .. "只有拥有足够经验充分的员工和房间,您才能够顺利过关。" .. "医院价值需要达到$200,000,且银行帐户上要有$400,000。" .. "如果无法达到上述要求,则无法胜利完成任务。", level2 = "在该区域内还有一些其它的疾病。" .. "建造医院从而可以治疗更多的病人,并应该考虑建造研究部门。" .. "记住保持内部的清洁,从而使声望尽可能地高-您将遇到患有舌头松弛症的病人,因此需要建造舌头诊治房间。" .. "您也可以建造心电图房间来帮助诊断疾病。" .. "这些房间都需要经过研究才能够被建造。现在你可以购买其它土地扩展医院-使用城镇地图就可以购买土地。" .. "目标是声望300,银行现金为10000,且治愈40个病人。", level7 = "在这里您将受到卫生部的密切监察,因此要在赚钱的同时,努力提高自己的声望。" .. "我们无法处理太多的医疗事故-这对于医院的运营是十分不利的。" .. "确认所有员工都很快乐,并确认已经购买了所有需要的仪器装备。" .. "声望需要达到600,且银行里需要有$200,000。", level5 = "医院将非常繁忙,处理各种各样的病人。" .. "医生都是刚刚毕业的实习医生,因此需要建造一间培训室对他们进行培训,提高能力。" .. "您只有3名专家可以帮助培训这些员工,因此一定要让专家快乐。" .. "另外要注意的是,医院的位置不是很好。" .. "经常会发生地震。" .. "地震将对医院中的机器产生损坏,从而影响医院的运营。" .. "使您声望达到400以上,现金达到$50,000。另外需要治愈200个病人。", level4 = "使所有的病人快乐,保持治疗的高效率并尽量降低死亡人数。" .. "声望是十分重要的,因此尽量赢得更高的声望。" .. "不要太多担心收入情况-当声望提高了,收入也自然会提高。" .. "您需要培训您的医生,拓宽他们的能力。" .. "这样他们就可以更好的为病人服务。" .. "胜利条件是声望达到500以上。", level14 = "这里还有一个挑战-一个充满惊奇的医院。" .. "如果您能够成功完成这个任务,则您将成为所有胜利者中的佼佼者。" .. "不要认为完成这个任务就象吃蛋糕一样,这将是您所遇到的最艰苦的工作。" .. "祝您好运!", level15 = "好的,下面是管理医院的一些技巧。//" .. "医生需要各种帮助来诊断病人。您可以" .. "建造另一个诊断类房间,例如高级诊断室。", level8 = "需要您来建造一座高效的医院。" .. "很多人都无事可做,因此需要适量的裁员以保持高效。" .. "记住治愈病人是很重要的一件事情,但是您更要从中赚钱。" .. "让恶心呕吐的病人靠近清洁工人。" .. "需要赚取$300,000就可以过关。", level13 = "您的高超管理技能被特殊机密部门获知。" .. "他们将向您提高特别奖金,因为他们有一座被老鼠困扰的医院需要有效管理。" .. "您必须杀死尽可能多的老鼠,并让清洁工人打扫干净。" .. "接受这个任务?", level16 = "当对病人完成诊断后,需要建造处理和治疗类房间完成对病人的治疗工作。可以从" .. "建造药房开始。在药房中需要一名护士分配各种药品。", level6 = "使用您的所有知识来建造一个运行平稳的医院,从而可以赚取利润并处理任何问题。" .. "您需要注意一点,医院周围的空气对细菌繁殖,传染病流行非常适宜。" .. "如果您没有保持医院的清洁,则将面对传染病的流行。" .. "赚取$150,000,并使医院价值超过$140,000。", level12 = "您现在遇到了最大的挑战。" .. "我们为您的成功感到由衷地高兴,卫生部为您准备了一项顶级工作;他们需要有人建造另一个超级医院,赚钱的同时获取较高的声望。" .. "您可以购买任何需要的土地,治疗各种疾病赢得各种奖励。" .. "动心了吗?" .. "赚取$650,000,治愈750个病人,使声望达到800就可以胜利过关。", level3 = "这次您将在一个富裕地区建造医院。" .. "卫生部希望您能够在这里赚取更多的利润。" .. "开始时您被要求获取好的声望,但是一旦医院步入正轨,就可以集中精力赚取更多的钱。" .. "有可能会发生紧急事件。" .. "也就是说一次会有大量病人就诊,且他们的病情都一样。" .. "在时间限制内如果能够治愈他们,则不仅可以拿到奖金,声望也会提高。" .. "一些疾病如猫王综合症等有可能发生,因此最好建造一间手术中心和附属病房。" .. "胜利条件是赚取$20,000。", level10 = "随着您的经验不断增长,卫生部要求您集中精力提高药品的治疗效果。" .. "有人对您颇有微辞,为此您必须使所有的药物都非常有效。" .. "另外,一定要降低医疗事故的发生次数,减少死亡人数。" .. "作为提示,您需要为建造胶桶留一些空地。" .. "使所有药物的疗效都达到80%%,声望达到650且在银行帐户上有$500,000,这样就可以胜利过关。", level11 = "现在您有机会建造一座终极医院。" .. "该地区享有极高的声望,因此卫生部希望能够看到最好的医院建造在这里。" .. "我们希望您能够赚取大量的金钱,获得很高的声望,并能够成功地处理任何事件。" .. "这是一项非常重要的工作。" .. "这需要您的努力工作。" .. "注意一点,该区域常常会看到不明飞行物。因此请让您的员工做好准备迎接不速之客。" .. "您的医院价值需要达到$240,000,在银行帐户内需要$500,000,且声望需要达到700。", level18 = "", } humanoid_name_starts = { [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] = "科", [28] = "维特", [29] = "比恩", [30] = "宝恩", [31] = "伯格", [32] = "怀特", [33] = "科尔", } transactions = { severance = "隔离花费", research = "研究花费", eoy_trophy_bonus = "年度物品奖励", buy_object = "购买物品", cure_colon = "治疗:", epidemy_coverup_fine = "隐瞒传染病罚款", final_treat_colon = "最终治疗:", jukebox = "收入:音乐盒", loan_interest = "贷款利率", overdraft = "透支利率", wages = "工资", loan_repayment = "贷款偿还", personal_bonus = "支付个人奖金", drug_cost = "药品花费", cure = "治愈", heating = "供暖费", treat_colon = "治疗:", compensation = "政府赔偿金", epidemy_fine = "传染病罚款", buy_land = "购买土地", research_bonus = "研究奖金", general_bonus = "支付一般奖金", deposit = "治疗收入", eoy_bonus_penalty = "年度奖金/罚款", cheat = "骗钱", drinks = "收入:饮料机", vaccination = "接种疫苗", advance_colon = "进阶:", vip_award = "贵宾现金奖励", hire_staff = "雇佣员工", bank_loan = "银行贷款", machine_replacement = "更换机器花费", emergency_bonus = "支付紧急事件奖金", build_room = "建造房屋", insurance_colon = "保险费:", sell_object = "卖出物品", } object = { chair = "椅子", sofa = "沙发", operating_table = "手术台", bed2 = "床", bench = "长椅", scanner = "扫描仪", couch = "长沙发椅", blood_machine = "血液机器", table1 = "桌子", video_game = "电视游戏", lamp = "灯", op_sink2 = "洗手池", door = "房门", auto_autopsy = "自动验尸仪", reception_desk = "接待台", hair_restorer = "毛发恢复机", projector = "放映机", crash_trolley = "诊断仪器小推车", tv = "电视机", ultrascanner = "超级扫描仪", surgeon_screen = "外科屏风", litter_bomb = "垃圾炸弹", inflator = "充气机", table2 = "桌子", desk = "办公桌", pool_table = "台球桌", x_ray_viewer = "X光透视仪", radiation_shield = "射线防护", bed = "床", swing_door2 = "转门", console = "控制台", op_sink1 = "洗手池", bookcase = "书柜", drinks_machine = "饮料机", comfortable_chair = "舒适座椅", skeleton = "骨骼模型", computer = "计算机", bin = "垃圾桶", pharmacy_cabinet = "医药柜", radiator = "暖气", cast_remover = "石膏剥离装置", atom_analyser = "原子分析仪", plant = "植物", jelly_moulder = "胶桶", cardio = "心电图仪", toilet = "厕所", electrolyser = "电分解机器", fire_extinguisher = "灭火器", bed3 = "床", swing_door1 = "转门", lecture_chair = "演讲座位", screen = "屏风", toilet_sink = "洗手池", shower = "淋浴", gates_of_hell = "地狱之门", entrance_right = "左入口", entrance_left = "右入口", slicer = "舌头治疗机", dna_fixer = "DNA修复装置", x_ray = "X光机", cabinet = "文件柜", } letter = { [1] = { [1] = "亲爱的%s//", [2] = "太令人惊奇了!您已经成功地经营了这个医院。卫生部的官员想要知道您是否有兴趣接手一个大项目。我们认为有一个工作对您很适合。薪水将达到$%d。怎么样。//", [3] = "您是否对%s医院的工作感兴趣?", }, [2] = { [1] = "亲爱的%s//", [2] = "太棒了!您的医院经营得很好。我们又有了一些新的任务如果您喜欢新的挑战,可以接受这项任务。您不要勉强,但这项工作确实很适合您。薪水是$%d//", [3] = "您希望接管%s医院吗?", }, [3] = { [1] = "亲爱的%s//", [2] = "在您接管这座医院期间,管理非常成功。因此,我们对您寄予厚望,并为您找到了一个新的工作。薪水将达到$%d,同时我们也希望您喜欢新的挑战。//", [3] = "您希望接手%s医院吗?", }, [4] = { [1] = "亲爱的%s//", [2] = "恭喜!部门官员对您的能力赞不绝口。您是卫生部的第一高手。我们觉得您一定喜欢更困难的工作。您的薪水将达到$%d,但决定权在您手中。//", [3] = "您是否愿意在%s医院工作?", }, [5] = { [1] = "亲爱的%s//", [2] = "您好。我们尊重您不希望离开这个迷人的医院,但是提醒您要仔细考虑。您的薪水将达到$%d,如果您愿意到其它医院工作并将其运行得很好。//", [3] = "您现在是否愿意移动到%s医院?", }, [6] = { [1] = "亲爱的%s//", [2] = "恭喜。我们理解您在这个可爱的运行良好医院中工作的快乐心情,但是我们认为您现在应该为未来考虑。您的薪水将达到$%d,如果您决定调任。这是很值得考虑的。//", [3] = "您是否愿意接手%s医院?", }, [7] = { [1] = "亲爱的%s//", [2] = "您好!卫生部想要知道您经过重新考虑是否决定仍然留在当前的医院中。我们很欣赏您现在那个可爱的医院,但我们觉得您如果愿意接受这个极富挑战性的工作,也一定能干得很好,并且您的薪水将达到$%d。//", [3] = "您是否愿意接手%s医院?", }, [8] = { [1] = "亲爱的%s//", [2] = "您好。您否定了我们上一封信中提供的新医院,以及薪水$%d。我们觉得不论怎样,您必须重新考虑这个决定。我们已经为您准备了一个很好的工作。//", [3] = "您是否愿意接手%s医院?怎么样?", }, [9] = { [1] = "亲爱的%s//", [2] = "您已经成功地证明了自己是医学界有史以来最棒的管理者。这样的成就一定要给予奖励,因此我们决定任命您为所有医院的至尊主席。这是一项光荣的工作,且薪水可以达到$%d。不论您走到那里,都将受到人们的热烈欢迎。//", [3] = "感谢您的努力工作。希望您好好享受未来的半退休生活。//", [4] = "", }, [10] = { [1] = "亲爱的%s//", [2] = "恭喜您在我们指派的每个医院中的成功管理。您的成功表现使您可以自由出入世界各大城市。您将获得退休金$%d,再加上一辆轿车,我们希望您在旅途中能够促进各个医院管理水平的提高。//", [3] = "我们都为您感到骄傲。我们中间每个人都为您挽救生命感到由衷的感谢。//", [4] = "", }, [11] = { [1] = "亲爱的%s//", [2] = "您的工作十分成功,我们从您身上获得了灵感。谢谢您管理了这么多个医院,并使它们都运行得很出色。我们将给予您终身工资$%d,并提供政府敞蓬轿车使您可以从一个城市到另一个城市,发表演讲告诉公众您是怎样在这么短的时间内达到如此成就。//", [3] = "您是所有人的榜样,毫无例外,世界上每个人都以您为荣。//", [4] = "", }, [12] = { [1] = "亲爱的%s//", [2] = "您的成就使您成为最好的医院管理者。卫生部将向您提供$%d作为奖励,并召开庆祝会。整个世界都在为您沸腾,太棒了!//", [3] = "请接受我们的安排。如果您不再希望辛苦工作,我们将向您提供一辆轿车,且无论走到那里,都有警察为您开路。//", [4] = "", }, } high_score = { categories = { deaths = "死亡人数", total_value = "总价值", money = "最富有", cures = "治愈人数", visitors = "访问者最多", staff_number = "员工数目最多", cure_death_ratio = "医治无效死亡率", patient_happiness = "顾客满意", staff_happiness = "员工满意", salary = "工资最高", clean = "最干净", }, player = "玩家", score = "分数", pos = "名次", best_scores = "荣誉堂", worst_scores = "耻辱堂", killed = "杀死病人数目", } menu_file_save = { [1] = " 存档一 ", [2] = " 存档二 ", [3] = " 存档三 ", [4] = " 存档四 ", [5] = " 存档五 ", [6] = " 存档六 ", [7] = " 存档七 ", [8] = " 存档八 ", } build_room_window = { pick_room_type = "选择房间类型", pick_department = "选择部门", cost = "花费:", } menu = { debug = "除错", display = "显示", file = "文件", options = "选项", charts = "图表", } menu_display.shadows = " 影子 " menu_display.mcga_lo_res = " MCGA低分辨率 " cheats_window.cheats.earthquake = "制造地震" confirmation.maximum_screen_size = "你使用的分辨率比 3000 x 2000 大。大的分辨率是可行的,但是要维持一个可以接受的帧率你需要好点的硬件。是否继续?" confirmation.music_warning = "選擇MP3檔為你的音樂之前,你需要有 smpeg.dll 或者你的作業系統的版本,否則你在遊戲裡不會有任何音樂。是否繼續?" menu_options_wage_increase.deny = " 拒绝 " menu_options_wage_increase.grant = " 允许 " tooltip.options_window.select_language = "选择语言" tooltip.options_window.select_resolution = "选择分辨率" tooltip.options_window.language_dropdown_item = "选择 %s 为语言" tooltip.options_window.audio_button = "开关所有的声音" tooltip.options_window.resolution = "在此分辨率下运行游戏" tooltip.options_window.audio_toggle = "开关" tooltip.options_window.fullscreen = "應該在全屏還是窗口模式運行" tooltip.options_window.apply = "应用此分辨率" tooltip.options_window.cancel = "取消" tooltip.options_window.folder_button = "文件夹选项" tooltip.options_window.customise_button = "更多可以改变游戏体验的选项" tooltip.cheats_window.cheats.earthquake = "制造地震" tooltip.new_game_window.difficulty = "选择游戏难度" tooltip.new_game_window.player_name = "输入你游戏中的名字" tooltip.new_game_window.start = "使用当前设置开始游戏" tooltip.update_window.download = "前往下载页面下载CorsixTH" tooltip.update_window.ignore = "忽略这次更新。你将在下次启动CorsixTH时再次被通知" tooltip.folders_window.browse_font = "寻找另一个字体 ( 现在的位置: %1% )" tooltip.folders_window.screenshots_location = "屏幕截图默认和设置文件在一起。如果不想这样,选择你想存储屏幕截图的位置。" tooltip.folders_window.reset_to_default = "重置到默认选项" tooltip.folders_window.back = "关闭及返回选项菜单" tooltip.folders_window.music_location = "选择存储MP3文件的位置. 此目录必须已经存在." tooltip.folders_window.font_location = "选择可以显示你的语言所需Unicode字体的位置,如果没有指定,你将不能使用原游戏提供字体之外的语言,例如中文和俄语.(你一定已经选了,要不怎么可以看到这句话呢?)" tooltip.folders_window.savegames_location = "游戏存档默认和设置文件在一起。如果不想这样,选择你想存储游戏存档的位置。" tooltip.folders_window.browse_data = "寻找主题医院安装位置 ( 現在的位置: %1% )" tooltip.folders_window.browse = "寻找文件夹的位置" tooltip.folders_window.browse_screenshots = "寻找另一个储存屏幕截图的位置 ( 现在的位置: %1% )" tooltip.folders_window.browse_music = "寻找另一个存储音乐的位置 ( 现在的位置: %1% )" tooltip.folders_window.no_font_specified = "没有指定字体的位置!" tooltip.folders_window.not_specified = "没有指定文件夹位置!" tooltip.folders_window.browse_saves = "寻找另一个储存游戏存档的位置 ( 现在的位置: %1% ) " tooltip.folders_window.default = "默认位置" tooltip.folders_window.data_location = "需要用来运行CorsixTH的主题医院的位置" tooltip.customise_window.aliens = "因为缺少动画,默认设置下外星人DNA病人只会从紧急事件中来. 要在紧急事件以外允许有外星人DNA的病人来你的意愿,请关闭此选项。" CorsixTH-0.63/CorsixTH/Lua/languages/spanish.lua000066400000000000000000002123331347163623700215270ustar00rootroot00000000000000--[[ Copyright (c) 2016 Víctor González a.k.a. "mccunyao" 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. --]] Language("Castellano", "Spanish", "es", "spa", "esp", "sp") Inherit("english") Inherit("original_strings", 4) ------------------------------- OVERRIDE ---------------------------------- adviser.warnings.money_low = "Te estás quedando sin dinero." tooltip.graphs.reputation = "Cambiar reputación" tooltip.status.close = "Cerrar pantalla de estado" -- tooltip.staff_list.next_person, prev_person is rather next/prev page (also in german, maybe more languages?) tooltip.staff_list.next_person = "Mostrar la página siguiente" tooltip.staff_list.prev_person = "Mostrar la página anterior" tooltip.status.reputation = "Tu reputación no debe estar por debajo de %d. Actualmente tienes %d" tooltip.status.balance = "No debes tener menos de %d $ en el banco. Actualmente tienes %d" -- Improve tooltips in staff window to mention hidden features tooltip.staff_window.face = "Rostro de la persona - pulsa para abrir pantalla de recursos." tooltip.staff_window.center_view = "Botón izquierdo para fijarse en la persona, botón derecho para rotar entre los miembros del personal." -- These strings are missing in some versions of TH (unpatched?) confirmation.restart_level = "¿Seguro que quieres reiniciar el nivel?" -- TODO adviser.multiplayer.objective_completed -- TODO adviser.multiplayer.objective_failed fax.emergency.num_disease = "Hay %d personas con %s y necesitan ser atendidas inmediatamente." tooltip.handyman_window.close = "Cerrar ventana" tooltip.machine_window.close = "Cerrar ventana" tooltip.queue_window.close = "Cerrar ventana" tooltip.jukebox.rewind = "Rebobinar reproductor de música" tooltip.jukebox.loop = "El reproductor de música funciona continuamente" tooltip.jukebox.stop = "Parar reproductor de música" tooltip.jukebox.close = "Cerrar reproductor de música" tooltip.jukebox.current_title = "Reproductor de música" tooltip.jukebox.play = "Encender reproductor de música" tooltip.jukebox.fast_forward = "Avance rápido del reproductor de música" tooltip.patient_window.close = "Cerrar ventana" tooltip.staff_window.close = "Cerrar ventana" tooltip.build_room_window.close = "Salir de esta ventana y volver al juego" misc.hospital_open = "Hospital abierto" misc.save_success = "Partida guardada correctamente" misc.save_failed = "ERROR: No se ha podido guardar la partida" misc.out_of_sync = "Partida desincronizada" -- Some overrides as original texts were too long see issue 1355 MarkL high_score = { categories = { deaths = "FALLECIMIENTOS", total_value = "VALOR TOTAL", money = "RIQUEZA", cures = "CURACIONES", visitors = "VISITANTES", staff_number = "PLANTILLA", cure_death_ratio = "PROPORCION", patient_happiness = "CLIENTES CONTENTOS", staff_happiness = "PERSONAL CONTENTO", salary = "SUELDO MAS ALTO", clean = "LIMPIEZA", }, player = "JUGADOR", score = "PUNTOS", pos = "POS", best_scores = "TABLA DEL HONOR", worst_scores = "TABLA DE LA VERGUENZA", killed = "Muerto" } --String text gets outside of window confirmation.quit = "¿Seguro que quieres salir del juego? " --Typos found on the official Spanish translation tooltip.rooms.dna_fixer = "El médico usa el Reparador de ADN para curar a los pacientes con ADN alienígena" diseases.broken_heart.cause = "Causa - alguien más rico, más joven y más delgado que el paciente." fax.emergency.locations[1] = "Planta química González" fax.emergency.locations[3] = "Centro de plantas acuáticas" fax.emergency.locations[5] = "Congreso de bailarines rusos" fax.emergency.locations[8] = "La casa del curry" fax.emergency.locations[9] = "Emporio petroquímico usado Díaz y Díaz" fax.epidemic.cover_up_explanation_2 = "Si un inspector sanitario te visita y encuentra una epidemia encubierta tomará medidas drásticas en tu contra." fax.epidemic.disease_name = "Tus médicos han descubierto una variedad contagiosa de %s." tooltip.main_menu.continue = "Continuar la última partida guardada." tooltip.watch.epidemic = "Epidemia: tiempo que queda para encubrir la epidemia. Cuando este tiempo expire O un paciente contagioso abandone tu hospital, un Inspector de Sanidad puede visitarte. El botón activa o desactiva el modo vacuna. Pulsa en un paciente para que lo vacune una Enfermera." tooltip.watch.hospital_opening = "Tiempo de construcción: es el tiempo que queda para que tu hospital sea declarado abierto. Si pulsas el botón verde abrirás el hospital inmediatamente." rooms_short.decontamination = "Descontaminación" adviser.room_requirements.op_need_another_surgeon = "Tienes que contratar a otro cirujano para poder usar el quirófano." adviser.information.patient_abducted = "Los alienígenas han raptado a uno de tus pacientes." adviser.praise.plants_thriving = "Muy bien. Tus plantas están muy lozanas. Tienen un aspecto maravilloso. Si las mantienes así podrás ganar un premio." adviser.level_progress.reputation_good_enough = "De acuerdo, tu reputación lo es bastante buena para ganar este nivel, manténla por encima de %d y soluciona otros problemas para terminar." adviser.staff_place_advice.only_nurses_in_room = "Sólo pueden trabajar las Enfermeras en el(la) %s" adviser.tutorial.select_receptionists = "Haz click en el icono que parpadea para ver qué recepcionistas están disponibles." rooms_long.decontamination = "Consulta de Descontaminación" dynamic_info.staff.ability = "Habilidad" dynamic_info.staff.actions.going_to_repair = "Yendo a reparar %s" dynamic_info.object.queue_expected = "Fila esperada: %d" fax.vip_visit_result.remarks.super[1] = "¡Qué hospital tan eficaz! La próxima vez que esté gravemente enfermo, llevadme allí." research.categories.drugs = "Investigación farmacéutica" transactions = { machine_replacement = "Coste de máquina de reemplazo", eoy_trophy_bonus = "Primas por trofeo Fin de Año", drinks = "Ingreso: Máquinas de bebidas", jukebox = "Ingreso: Gramolas", cheat = "Dinero de trampas", eoy_bonus_penalty = "Primas/Multas en fin de año", } confirmation.return_to_blueprint = "¿Seguro que quieres sustituir el(la) %s por $%d?" staff_descriptions = { misc = { [9] = "Le gusta hacer surf. ", [10] = "Le gusta el piragüismo. ", [11] = "Destila whisky. ", [12] = "Es un experto en formación. ", [13] = "Le gusta el cine francés. ", [15] = "Conduce coches de carreras. ", [25] = "Participó en un concurso. ", [26] = "Colecciona metralla de la segunda guerra mundial. ", [29] = "Pone furiosos a los insectos rociándolos con desodorante. ", }, good = { [3] = "Sabe de todo.", }, } progress_report.percentage_pop = "% población" letter = { [1] = { [1] = "¡Hola, %s!//", [2] = "¡Estupendo! Diriges este hospital de una manera excelente. Los peces gordos del Ministerio de Sanidad queremos saber si estarías interesado en hacerte cargo de un gran proyecto. Hay un trabajo para el que creemos eres la persona perfecta. El sueldo sería de %d. Piénsalo.//", }, [2] = { [1] = "¡Hola, %s!//", [2] = "¡Felicidades! Has realizado notables mejoras en tu hospital. Tenemos otra cosa de la que podrías encargarte, si te apetece un cambio y afrontar nuevos retos. No tienes que aceptar, pero estaría bien que lo hicieras. El sueldo es de %d//", }, [3] = { [1] = "¡Hola, %s!//", [2] = "Has dirigido con notable acierto este hospital. Creemos que tienes un brillante futuro y nos gustaría ofrecerte un puesto en otra parte. El sueldo sería de %d y creemos que te encantaría el reto que ello supondría.//", }, [4] = { [1] = "¡Hola, %s!//", [2] = "¡Felicidades! En el Ministerio estamos muy impresionados por tu capacidad como director de hospital. Eres sin duda una persona valiosa para el Departamento de Sanidad, pero creemos que preferirías un trabajo más cualificado. Recibirías un sueldo de %d, si bien la decisión es tuya.//", }, [5] = { [1] = "¡Hola, %s!//", [2] = "Saludos de nuevo. Respetamos tus deseos de no trasladarte de tu estupendo hospital, pero te pedimos que lo reconsideres. Te ofreceremos un mejor sueldo de %d si decides marcharte a otro hospital y te encargas de la dirección del mismo.//", }, [6] = { [1] = "¡Hola, %s!//", [2] = "Recibe nuestros saludos. Sabemos lo mucho que has disfrutado de tu estancia en esta institución, tan agradable y bien dirigida, pero creemos que ahora deberías pensar en tu futuro. Naturalmente, tendrías un sueldo de %d si decidieras trasladarte. Merece la pena que lo pienses.//", }, [7] = { [1] = "¡Hola, %s!//", [2] = "¡Buenos días! El Ministerio de Sanidad quisiera saber si vas a reconsiderar tu decisión de quedarte en tu hospital. Comprendemos que tienes un estupendo hospital, pero creemos que harías muy bien en aceptar un trabajo más estimulante, con un sueldo de %d.//", }, [8] = { [1] = "¡Hola, %s!//", [2] = "Buenas de nuevo. Recibimos tu negativa a nuestra última carta, en la que te ofrecíamos un puesto de dirección en otro hospital y un alto sueldo de %d. No obstante, creemos que deberías reconsiderar esta decisión. Como verás, tenemos el trabajo perfecto para ti.//", }, [9] = { [1] = "¡Hola, %s!//", [2] = "Has demostrado ser el mejor director de hospital en la larga y azarosa historia de la medicina. Este importantísimo logro no puede quedar sin recompensa, por lo que nos gustaría ofrecerte el puesto de Director Jefe de Todos los Hospitales. Es un puesto honorífico, con un sueldo de %d. Tendrás una presentación con todos los honores y la gente te demostrará su reconocimiento vayas donde vayas.//", }, [10] = { [1] = "¡Hola, %s!//", [2] = "Enhorabuena, has gestionado tus hospitales satisfactoriamente. Este logro te permitirá viajar dónde quieras, con una paga de %d y una limusina. Aunque por supuesto esperamos que en tus viajes, no defraudes a tu público y sigas promocionando los hospitales.//" }, [11] = { [1] = "¡Hola, %s!//", [3] = "Eres un ejemplo para todos los hombres de bien y todo el mundo, sin excepción, te considera una persona de enorme valía.//", }, [12] = { [1] = "¡Hola, %s!//", [2] = "Tu exitosa carrera como el mejor director de hospital desde Moisés está llegando a su fin. No obstante, has provocado tal efecto en los círculos médicos, que el Ministerio quiere ofrecerte un sueldo de %s sólo por actuar en nuestro nombre inaugurando festejos, botando barcos y organizando coloquios. ¡El mundo entero te aclamaría y serías un excelente relaciones públicas!//", }, } tooltip.staff_window.ability = "Nivel de cualificación" tooltip.policy.diag_termination = "Se mantendrá el diagnóstico de un paciente hasta que los médicos estén seguros del porcentaje de DETENER, o hasta que se hayan usado todos los diagnosticadores" tooltip.staff_list.ability = "Muestra el nivel de habilidad de estos empleados" introduction_texts = { level1 = "¡Bienvenido a tu primer hospital!//" .. "Para hacer que empiece a funcionar, coloca una recepción, construye una consulta y contrata a una recepcionista y a un médico. " .. "Luego espera a que lleguen los pacientes. " .. "Sería una buena idea que construyeras una consulta de psiquiatría y contrataras a un psiquiatra. " .. "Una farmacia y una enfermera son fundamentales para curar a tus pacientes. " .. "Cuidado con los casos malignos de pacientes cabezudos; se solucionan pronto en la consulta de inflatoterapia. " .. "Tendrás que curar a 10 personas y asegurarte de que tu reputación no sea inferior a 200.", level2 = "Hay una gran variedad de indisposiciones en esta zona.//" .. "Prepara tu hospital para tratar a más pacientes y proyecta la construcción de un Departamento de Investigación. " .. "Recuerda que debes mantener limpio el hospital y procura conseguir que tu reputación sea lo más alta posible. Tratarás enfermedades como la Lengua Larga, así que necesitarás una consulta de laringología. " .. "También puedes construir un cardiómetro para diagnosticar nuevas enfermedades. " .. "Estas dos consultas deberán ser investigadas antes de construirlas. También puedes comprar más terreno para ampliar tu hospital. Para ello, utiliza un mapa de la ciudad. ", "Intenta alcanzar una reputación de 300, un saldo bancario de 10.000 dólares y cura a 40 personas.", level3 = "Esta vez colocarás tu hospital en una zona acaudalada.//" .. "El Ministerio de Sanidad espera que consigas curar a muchos pacientes. " .. "Tendrás que ganarte una buena reputación para empezar, pero una vez que el hospital empiece a funcionar, concéntrate en ganar todo el dinero que puedas. " .. "También puede haber urgencias. " .. "Se producen cuando llega mucha gente que padece la misma enfermedad. " .. "Si los curas dentro de un plazo determinado, conseguirás aumentar tu reputación y ganar una prima extra. " .. "Habrá enfermedades, como el síndrome de rey, y deberás tener presupuesto para construir un quirófano y una enfermería adyacente. " .. "Tienes que ganar 20.000 dólares para superar este nivel.", level4 = "Haz que todos tus pacientes estén contentos, atiéndelos con la mayor eficacia e intenta que mueran los menos posibles.//" .. "Tu reputación está en juego, así que procura aumentarla todo lo que puedas. " .. "No te preocupes demasiado por el dinero; Lo irás ganando a medida que crezca tu reputación. " .. "También podrás formar a tus médicos para ampliar sus conocimientos: " .. "ellos podrán curar a los pacientes más difíciles. " .. "Alcanza una reputación por encima de 500.", level5 = "Este será un hospital concurrido, que tratará casos muy variados.//" .. "Tus médicos acaban de salir de la facultad, por lo que es fundamental que construyas una sala de formación para que alcancen el nivel de formación necesario. " .. "Sólo tienes tres especialistas para enseñar a tu personal inexperto, así que procura que estén contentos. " .. "Tienes que tener en cuenta que el hospital está ubicado encima de la falla geológica de San Androide. " .. "Siempre hay riesgo de terremoto. " .. "Los terremotos provocarán daños importantes en tus máquinas y alterarán el buen funcionamiento de tu hospital. " .. "Aumenta tu reputación hasta 400 y consigue unos ingresos de 50.000 dólares para triunfar. También debes curar a 200 pacientes. ", level6 = "Utiliza toda tu capacidad para conseguir un hospital que funcione bien y consiga curar a muchos pacientes y que pueda tratar cualquier caso que presenten los enfermos.//" .. "Estás avisado de que el ambiente, aquí, es especialmente propenso a gérmenes e infecciones. " .. "A menos que mantengas una escrupulosa limpieza en tu institución, tendrás que hacer frente a una serie de epidemias entre los pacientes. " .. "Procura obtener unos ingresos de 20.000 dólares y que el valor de tu hospital supere los 140.000 dólares. ", level7 = "Aquí estarás bajo la estricta vigilancia del Ministerio de Sanidad, así que procura que tus cuentas tengan unos ingresos excelentes y que aumente tu reputación.//" .. "No podemos permitirnos que haya muertes innecesarias; no son nada buenas para el negocio. " .. "Asegúrate de que tu personal está en plena forma y de que tienes todos los equipos necesarios. " .. "Consigue una reputación de 600, y un saldo bancario de 200.000 dólares.", level8 = "De ti depende que puedas construir el hospital más eficiente y rentable posible.//" .. "La gente de por aquí es bastante adinerada, así que sabléalos todo lo que puedas. " .. "Recuerda, curar a la gente está muy bien, pero lo que de verdad NECESITAS es su dinero. " .. "Despluma vivos a estos pacientes. " .. "Acumula 300.000 dólares para completar este nivel. ", level9 = "Después de ingresar dinero en la cuenta bancaria del Ministerio y pagar una nueva limusina para el Ministro, ahora puedes dedicarte a crear un buen hospital para cuidar a los enfermos y necesitados. " .. "Aquí tendrás un montón de problemas diferentes. " .. "Si tu personal tiene una buena formación y cuentas con suficientes consultas, podrás resolver cualquier situación. " .. "Tu hospital tendrá que valer 200.000 dólares y necesitarás tener 400.000 dólares en el banco. " .. "Si no lo consigues no podrás terminar el nivel.", level10 = "Además de ocuparte de curar todas las enfermedades que pueda haber, el Ministerio te pide que emplees algo de tiempo en aumentar la eficacia de tus medicinas.//" .. "Ha habido algunas quejas por parte de D. Salutísimo, el Perro Guardián de la Salud, así que debes procurar que todas tus medicinas sean sumamente eficaces para quedar bien. " .. "También debes asegurarte de que tu hospital tenga una reputación intachable. Procura que mueran pocos pacientes. " .. "Como sugerencia, deberías dejar espacio para un baño gelatinoso. " .. "Para ganar, tus medicinas deberán tener una eficacia de, al menos, un 80%, tienes que conseguir una reputación de 650 y guardar 500.000 dólares en el banco.", level11 = "Tienes la oportunidad de construir el no va más en hospitales. " .. "Esta es una zona de enorme prestigio y al Ministerio le gustaría que éste fuera el mejor hospital. " .. "Esperamos que ganes mucho dinero, alcances una excelente reputación y te ocupes de todos los casos que se presenten. " .. "Este es un trabajo importante. " .. "Tendrás que ser muy hábil para llevarlo a cabo. " .. "También debes tener en cuenta que se han visto ovnis en la zona. Asegúrate de que tu personal esté preparado para recibir alguna visita inesperada. " .. "Tu hospital tendrá que alcanzar un valor de 240.000 dólares, necesitarás tener 500.000 dólares en el banco y una reputación de 700.", level12 = "Ahora te enfrentas al mayor de los retos. " .. "El Ministerio ha quedado impresionado con tus logros y tiene una tarea difícil para ti, quieren que se construya otro magnífico hospital, que tenga unos excelentes ingresos y una reputación increíble. " .. "También se espera que compres todo el terreno que puedas, cures todo (y queremos decir todas las enfermedades) y ganes todos los premios. " .. "¿Crees que podrás conseguirlo? " .. "Gana 650.000 dólares, cura a 750 personas y consigue una reputación de 800 para ganar este nivel. ", level13 = "Tu increíble habilidad como director de hospital ha atraído la atención de la División Secreta Especial del Servicio Secreto Especial. " .. "Tienen un trabajo especial para ti. Hay un hospital infestado de ratas que necesita un exterminador eficiente. " .. "Tienes que matar todas las ratas que puedas antes de que el personal de Mantenimiento limpie toda la suciedad. " .. "¿Crees que eres apto para la misión?", level14 = "Aún tienes un reto más: el hospital sorpresa totalmente imprevisible. " .. "Si consigues tener éxito, serás el ganador de todos los ganadores. " .. "Y no esperes que sea pan comido, porque es la tarea más difícil que jamás afrontarás. " .. "¡Buena suerte!", level15 = "Bien, estos son los mecanismos básicos para poner en marcha un hospital.//" .. "Tus Médicos van a necesitar toda la ayuda que puedan obtener para diagnosticar a algunos de los pacientes. " .. "Puedes ayudarles construyendo otros equipos de diagnóstico como la Sala de Diagnóstico General.", level16 = "Una vez que hayas diagnosticado a alguno de los pacientes necesitarás construir salas de tratamiento y clínicas para curarles: " .. "puedes comenzar con una Farmacia, y necesitarás una Enfermera que dispense las medicinas en la Farmacia.", level17 = "Un último aviso: estate atento a tu Reputación, es lo que atraerá pacientes a tu establecimiento. " .. "¡Si no matas a mucha gente y los mantienes razonablemente felices no deberías tener muchos problemas en este nivel!//" .. "Ahora es cosa tuya, buena suerte y todo eso.", demo = "¡Bienvenido al hospital de demostración!//" .. "Por desgracia, la versión de demostración solo contiene este nivel. Sin embargo, tienes más que suficiente para estar entretenido por un rato. " .. "Te enfrentarás a varias enfermedades que necesitan de ciertas habitaciones para su cura. De vez en cuando pueden surgir emergencias. Y necesitarás " .. "investigar sobre las enfermedades construyendo un Departamento de investigación. " .. "Tu objetivo es ganar 100.000 dólares, que el valor de tu hospital llegue hasta 70.000 dólares y tengas una reputación de 700, con un porcentaje de pacientes curados del 75%. " .. "Procura que tu reputación no caiga por debajo de 300 y que no mates a más del 40% de tus pacientes, o fracasarás.//" .. "¡Buena suerte!", } town_map.area = "Zona" trophy_room = { rats_killed = { trophies = { [2] = "Mereces este premio de la Federación Matarratas por tu excepcional habilidad para eliminar ratas, demostrándolo al acabar con %s ejemplares.", [3] = "Se te concede el Trofeo Exterminador de Ratas por tu gran habilidad para eliminar %d ratas en tu hospital el año pasado.", }, }, hosp_value = { penalty = { [1] = "Tu hospital no ha alcanzado un valor razonable. Has administrado mal el dinero. Recuerda, un buen hospital también es un hospital caro.", }, regional = { [1] = "Eres una promesa de los negocios. Tu hospital es el más valioso de toda la zona.", }, }, happy_patients = { awards = { [2] = "Los pacientes que visitaron tu hospital se sintieron más contentos con su tratamiento que en el resto de los hospitales.", }, penalty = { [1] = "La gente que acude al hospital tiene una experiencia terrible. Tendrás que esforzarte más si quieres ganarte el respeto del Ministerio.", [2] = "La gente que fue atendida en tu hospital se quejó del estado del mismo. Deberías tener más en cuenta el bienestar de los pacientes.", }, }, research = { penalty = { [1] = "Has sido poco eficiente investigando curaciones, máquinas y medicinas nuevas. Esto no es bueno, ya que el avance tecnológico es algo fundamental.", }, regional_bad = { [1] = "Los demás hospitales son mejores que el tuyo en investigación. En el Ministerio están furiosos, tu hospital debería concederle más importancia.", }, }, many_cured = { regional = { [1] = "Se te concede el premio a la curación total por haber curado a más gente que todos los demás hospitales juntos.", }, awards = { [1] = "Felicidades por curar a un montón de gente el año pasado. Un gran número de personas se sienten mucho mejor gracias a tu trabajo.", }, }, best_value_hosp = { penalty = { [1] = "Todos los hospitales de la zona valen más que el tuyo. Haz algo respecto a esta vergonzosa situación. ¡Consigue cosas más caras!", }, }, healthy_plants = { trophies = { [2] = "Salvar a las Plantas quiere concederte el Premio del Ecologista Mayor por mantener bien sanas las plantas de tu hospital durante el pasado año.", }, }, high_rep = { regional = { [1] = "Por favor, acepta el Premio Bullfrog por dirigir el mejor hospital del año. ¡Disfrútalo, te lo has ganado!", }, }, consistant_rep = { trophies = { [2] = "Felicidades por ganar el Premio Sábanas Limpias por ser el hospital con la mejor reputación del año. Te lo has merecido.", }, }, wait_times = { penalty = { [1] = "En tu hospital, los pacientes esperan demasiado tiempo. Siempre hay colas inaceptables. Podrías tratar a tus pacientes con más eficacia si quisieras.", }, }, happy_staff = { awards = { [2] = "Tu personal está tan contento de trabajar para ti que no pueden dejar de sonreír. Eres un director excelente.", }, trophies = { [1] = "Has ganado el Premio Médico Sonriente por mantener lo más contento posible a tu personal.", [3] = "Te concedemos el premio Copa de la Sonrisa Radiante por mantener contento a todo tu personal por encima de todo durante el año pasado.", }, }, emergencies = { award = { [1] = "¡Felicidades! Has ganado este premio por la eficacia con la que has solucionado las urgencias. Buen trabajo.", }, }, } diseases = { corrugated_ankles = { cause = "Causa: Atropellar señales de tráfico en la carretera.", symptoms = "Síntomas: Los pies no entran en los zapatos.", cure = "Cura: Los tobillos se enderezan bebiendo una infusión ligeramente tóxica de hierbas y plantas.", }, jellyitis = { cause = "Causa: Una dieta rica en gelatina y demasiado ejercicio.", symptoms = "Síntomas: Un temblor excesivo y caerse al suelo muchas veces.", cure = "Cura: Se sumerge al paciente durante un rato en el baño gelatinoso en una consulta especial.", }, kidney_beans = { cause = "Causa: Masticar los cubitos de hielo de las bebidas.", symptoms = "Síntomas: Dolor e ir con frecuencia al baño.", cure = "Cura: Dos cirujanos extraen los cálculos sin rozar los bordes del riñón.", }, fractured_bones = { cause = "Causa: Caída de cosas voluminosas sobre el cemento.", symptoms = "Síntomas: Un gran crujido y la imposibilidad de usar los miembros afectados.", cure = "Cura: Se pone una escayola, que después se quita con un láser quitaescayolas.", }, spare_ribs = { cause = "Causa: Sentarse sobre suelos muy fríos.", symptoms = "Síntomas: Malestar en el pecho.", cure = "Cura: Dos cirujanos extraen las costillas y se las dan al paciente en una bolsita.", }, alien_dna = { cause = "Causa: Enfrentarse a gigantes que tienen sangre alienígena inteligente.", symptoms = "Síntomas: Metamorfosis gradual en alienígena y deseos de destruir nuestras ciudades.", cure = "Cura: Se extrae el ADN con una máquina, se purifica de elementos alienígenas y se vuelve a inyectar rápidamente.", }, invisibility = { cause = "Causa: El picotazo de una hormiga radiactiva (e invisible).", symptoms = "Síntomas: Los pacientes no sufren. Muchos aprovechan su enfermedad para gastar bromas a sus familiares.", cure = "Cura: Beber un líquido coloreado en la farmacia que hará completamente visible al paciente.", }, infectious_laughter = { cause = "Causa: Una comedia clásica de situación", symptoms = "Síntomas: No poder parar de reír y repetir frases hechas nada divertidas.", cure = "Cura: Un psiquiatra cualificado debe recordar al paciente que su enfermedad es grave.", }, broken_wind = { cause = "Causa: Usar un aparato gimnástico después de las comidas.", symptoms = "Síntomas: Molestar a la gente que está justo detrás del paciente.", cure = "Cura: En la farmacia se bebe rápidamente una fuerte mezcla de átomos acuosos.", }, chronic_nosehair = { cause = "Causa: Oler con desprecio a aquellos que están peor que el paciente.", symptoms = "Síntomas: Tener tanto pelo en la nariz como para hacer una peluca.", cure = "Cura: Se toma por vía oral un jarabe quitapelo preparado en la farmacia.", }, bloaty_head = { name = "Paciente cabezudo", cause = "Causa: Oler queso y beber agua de lluvia no purificada.", symptoms = "Síntomas: Muy incómodos para el paciente.", cure = "Cura: Se pincha la cabeza hinchada y luego se vuelve a inflar hasta el tamaño correcto con una máquina inteligente.", }, serious_radiation = { name = "Radiación grave", cause = "Causa: Confundir isótopos de plutonio con chicle.", symptoms = "Síntomas: Los pacientes que padecen esta enfermedad se sienten muy, pero que muy mal.", cure = "Cura: Se debe dar al paciente una buena ducha descontaminadora.", }, ruptured_nodules = { cause = "Causa: Tirarse de cabeza al agua fría.", symptoms = "Síntomas: Imposibilidad de sentarse cómodamente.", cure = "Cura: Dos cirujanos cualificados colocan ciertas partes con manos firmes.", }, gastric_ejections = { cause = "Causa: Comida mejicana o india muy condimentada.", symptoms = "Síntomas: El paciente vomita la comida a medio digerir en cualquier momento.", cure = "Cura: Beber un preparado astringente especial para detener los vómitos.", }, hairyitis = { cause = "Causa: Exposición prolongada a la luna.", symptoms = "Síntomas: Los pacientes experimentan un aumento del olfato.", cure = "Cura: Una máquina de electrólisis elimina el vello y cierra los poros.", }, sweaty_palms = { cause = "Causa: Temer las entrevistas de trabajo.", symptoms = "Síntomas: Dar la mano al paciente es como coger una esponja empapada.", cure = "Cura: Un psiquiatra debe discutir a fondo con el paciente sobre esta enfermedad inventada.", }, diag_x_ray = { name = "Diag. de rayos X", }, the_squits = { cause = "Causa: Comer pizza que se ha encontrado debajo de la cocina.", symptoms = "Síntomas: ¡Agh! Seguro que te los puedes imaginar.", cure = "Cura: Una mezcla de sustancias viscosas preparada en la farmacia solidifica las tripas del paciente.", }, slack_tongue = { name = "Lengua caída", cause = "Causa: Hablar sin parar sobre culebrones.", symptoms = "Síntomas: La lengua crece hasta cinco veces su tamaño original.", cure = "Cura: Se coloca la lengua en el acortalenguas y se elimina de forma rápida, eficaz y dolorosa.", }, pregnancy = { cause = "Causa: Cortes de electricidad en zonas urbanas.", symptoms = "Síntomas: Comer por antojo con el consecuente malestar de estómago.", cure = "Cura: Se extrae al bebé en el quirófano, se limpia y se entrega al paciente.", }, sleeping_illness = { cause = "Causa: Una glándula del sueño hiperactiva en el paladar.", symptoms = "Síntomas: Deseo imperioso de echarse una cabezadita en cualquier parte.", cure = "Cura: Una enfermera administra una elevada dosis de un poderoso estimulante.", }, transparency = { cause = "Causa: Lamer el yogur que queda en las tapas de los envases.", symptoms = "Síntomas: La carne se transparenta y se ve horrible.", cure = "Cura: Tomar un preparado de agua enfriada y coloreada en la farmacia.", }, broken_heart = { cause = "Causa: Alguien más rico, más joven y más delgado que el paciente.", symptoms = "Síntomas: Llorar y reír después de pasarse horas rompiendo fotos de las vacaciones", cure = "Cura: Dos cirujanos abren el pecho y miman con delicadeza el corazón mientras contienen la respiración.", }, unexpected_swelling = { cause = "Causa: Cualquier cosa imprevista.", symptoms = "Síntomas: Inflamación.", cure = "Cura: Sólo puede reducirse la inflamación con una lanceta durante una operación que requiere dos cirujanos.", }, discrete_itching = { cause = "Causa: Insectos diminutos con los dientes afilados.", symptoms = "Síntomas: Rascarse, lo que conduce a una inflamación de la parte afectada.", cure = "Cura: El paciente bebe un jarabe pegajoso que evita que la piel pique.", }, third_degree_sideburns = { cause = "Causa: Anhelar con ansia los años 70.", symptoms = "Síntomas: Pelo largo, ropa ancha, zapatos con plataformas y mucho maquillaje.", cure = "Cura: El personal psiquiátrico debe, empleando técnicas actualizadas, convencer al paciente de que esta moda es horrible.", }, uncommon_cold = { cause = "Causa: Pequeñas partículas de moco en el aire.", symptoms = "Síntomas: Mucosidad, estornudos y pulmones descoloridos.", cure = "Cura: Beber un gran trago de una medicina para la tos anormal que se fabrica en la farmacia con ingredientes especiales.", }, heaped_piles = { cause = "Causa: Permanecer de pie junto a refrigeradores de agua.", symptoms = "Síntomas: El paciente se siente como si se sentara sobre una bolsa de canicas.", cure = "Cura: Una bebida agradable, aunque muy ácida, disuelve las hemorroides internas.", }, golf_stones = { cause = "Causa: Inhalar el gas venenoso que contienen las pelotas de golf.", symptoms = "Síntomas: Delirar y sentir mucha vergüenza.", cure = "Cura: Dos cirujanos operan para extraer los cálculos.", }, baldness = { cause = "Causa: Contar mentiras e inventar historias para ser famoso.", symptoms = "Síntomas: Tener la cabeza brillante y pasar vergüenza.", cure = "Cura: El pelo se cose a la cabeza del paciente con una dolorosa máquina.", }, fake_blood = { cause = "Causa: El paciente suele ser la víctima de todas las bromas.", symptoms = "Síntomas: Fluido rojo en las venas que se evapora al contacto con la ropa.", cure = "Cura: Este problema sólo se resuelve con tratamiento psiquiátrico.", }, gut_rot = { cause = "Causa: El jarabe para la tos, a base de whisky, de la Sra. McGuiver.", symptoms = "Síntomas: El paciente no tose, pero tampoco tiene paredes en el estómago.", cure = "Cura: Una enfermera administra una variada disolución de sustancias químicas para revestir el estómago.", }, iron_lungs = { cause = "Causa: Contaminación urbana mezclada con restos de kebab.", symptoms = "Síntomas: Capacidad para aspirar fuego y gritar debajo del agua.", cure = "Cura: Dos cirujanos realizan una operación para eliminar las partes duras del pulmón en el quirófano.", }, king_complex = { cause = "Causa: El espíritu del rey se introduce en la mente del paciente y se apodera de ella.", symptoms = "Síntomas: Calzar unos zapatos de ante teñidos y comer hamburguesas.", cure = "Cura: Un psiquiatra le dice al paciente lo ridículo o ridícula que está.", }, tv_personalities = { cause = "Causa: Ver la televisión durante el día.", symptoms = "Síntomas: Tener la ilusión de presentar en la tele un programa de cocina.", cure = "Cura: Un psiquiatra experto debe convencer al paciente de que venda su televisor y se compre una radio.", }, } room_descriptions = { staff_room = { [1] = "Sala de personal//", [2] = "Tu personal se cansa cuando realiza su trabajo. Necesitan esta sala para descansar y reponer energías. El personal cansado es más lento, pide más dinero, comete más errores y al final dimite. Merece la pena construir una sala para el personal que tenga muchos pasatiempos. Asegúrate de que hay sitio para varios miembros del personal al mismo tiempo. ", }, gp = { [2] = "Esta es la consulta más importante de tu hospital. Los nuevos pacientes son enviados aquí para averiguar qué es lo que les pasa. Entonces, o se les hace otro diagnóstico o se les manda a una consulta donde puedan ser curados. Quizá quieras construir otra consulta si la primera tiene mucho trabajo. Cuanto más grande sea la consulta y cuantos más objetos pongas en ella, mayor prestigio tendrá el médico. Lo mismo sucede con todas las consultas abiertas.//", }, blood_machine = { [3] = "El transfusiómetro requiere un médico. También necesita mantenimiento. ", }, x_ray = { [2] = "Los rayos X fotografían el interior del paciente empleando una radiación especial para ayudar al personal a descubrir lo que le pasa.//", [3] = "La consulta de rayos X requiere un médico. También necesita mantenimiento. ", }, ultrascan = { [1] = "Ultra escáner//", }, training = { [1] = "Sala de formación//", }, fracture_clinic = { [2] = "Los pacientes que tienen la desgracia de tener fracturas vienen aquí. El quitaescayolas emplea un potente láser industrial para cortar las escayolas más duras, causando al paciente sólo una pequeña molestia.//", }, slack_tongue = { [2] = "Los pacientes a los que se les diagnostica lengua caída en la consulta serán enviados aquí para recibir tratamiento. El médico utilizará una máquina de alta tecnología para estirar la lengua y acortarla, con lo que el paciente volverá a estar sano.//", }, jelly_vat = { [1] = "Baño gelatinoso//", }, general_diag = { [1] = "Diagnosis general//", }, } -- An override for the squits becoming the the squits see issue 1646 adviser.research.drug_improved_1 = "Tu departamento de investigación ha mejorado el medicamento para la %s." ------------------------------- NEW STRINGS ------------------------------- date_format = { daymonth = "%1% %2:months%", } object.litter = "Basura" tooltip.objects.litter = "Basura: Un paciente la ha tirado porque no ha encontrado una papelera." object.rathole = "Ratonera" tooltip.objects.rathole = "El hogar de una familia de ratas a la que le ha gustado la suciedad de tu hospital." tooltip.fax.close = "Cierra esta ventana sin borrar el mensaje." tooltip.message.button = "Haz clic izquierdo para abrir el mensaje." tooltip.message.button_dismiss = "Haz clic izquierdo para abrir el mensaje, clic derecho para rechazarlo." tooltip.casebook.cure_requirement.hire_staff = "Necesitas contratar empleados para realizar este tratamiento." tooltip.casebook.cure_type.unknown = "Todavía no sabes cómo curar esta enfermedad." tooltip.research_policy.no_research = "En este momento no se está investigando ningún apartado de esta categoría." tooltip.research_policy.research_progress = "Progreso del siguiente descubrimiento de esta categoría: %1%/%2%" menu["player_count"] = "CANTIDAD DE JUGADORES" menu_file = { load = " (%1%) CARGAR ", save = " (%1%) GUARDAR ", restart = " (%1%) REINICIAR ", quit = " (%1%) SALIR " } --These menus lack uppercase accented characters, so lowercase are a must. menu_options = { sound = " (%1%) SONIDO ", announcements = " (%1%) ANUNCIOS ", music = " (%1%) MúSICA ", jukebox = " (%1%) REPRODUCTOR DE MúSICA ", lock_windows = " BLOQUEAR VENTANAS ", edge_scrolling = " DESPLAZAR POR BORDES ", adviser_disabled = " (%1%) CONSEJERO ", warmth_colors = " COLORES DE TEMPERATURA ", wage_increase = " PETICIONES DE SUELDO ", twentyfour_hour_clock = " RELOJ DE 24 HORAS " } menu_options_game_speed = { pause = " (%1%) PAUSA ", slowest = " (%1%) MUY LENTA ", slower = " (%1%) LENTA ", normal = " (%1%) NORMAL ", max_speed = " (%1%) VELOCIDAD MáXIMA ", and_then_some_more = " (%1%) VELOCIDAD ABSURDA ", } menu_options_warmth_colors = { choice_1 = " ROJO ", choice_2 = " AZUL, VERDE, ROJO ", choice_3 = " AMARILLO, NARANJA, ROJO ", } menu_options_wage_increase = { grant = " CONCEDER ", deny = " RECHAZAR ", } -- Add F-keys to entries in charts menu (except briefing), also town_map was added. menu_charts = { bank_manager = " (%1%) DIRECTOR DEL BANCO ", statement = " (%1%) ESTADO DE CUENTAS ", staff_listing = " (%1%) LISTA DE PERSONAL ", town_map = " (%1%) MAPA DE LA CIUDAD ", casebook = " (%1%) HISTORIAL ", research = " (%1%) INVESTIGACIóN ", status = " (%1%) ESTADO ", graphs = " (%1%) GRáFICAS ", policy = " (%1%) NORMAS ", } menu_debug = { jump_to_level = " CAMBIAR DE NIVEL ", connect_debugger = " (%1%) CONECTAR A SERVIDOR DBGp LUA ", transparent_walls = " (%1%) PAREDES TRANSPARENTES ", limit_camera = " LIMITAR CáMARA ", disable_salary_raise = " DESACTIVAR SUBIDA DE SUELDO ", make_debug_fax = " CREAR FAX DE DEPURACIóN ", make_debug_patient = " CREAR PACIENTE DE DEPURACIóN ", cheats = " (%1%) TRUCOS ", lua_console = " (%1%) CONSOLA LUA ", debug_script = " (%1%) EJECUTAR SCRIPT DE DEPURACIóN ", calls_dispatcher = " LLAMAR A CONTROLADOR ", dump_strings = " (%1%) VOLCAR TEXTOS DEL JUEGO ", dump_gamelog = " (%1%) VOLCAR REGISTRO DEL JUEGO ", map_overlay = " SOBREPONER MAPA ", sprite_viewer = " VISUALIZADOR DE ANIMACIONES ", } menu_debug_overlay = { none = " NADA ", flags = " MARCAS ", positions = " POSICIONES ", heat = " TEMPERATURA ", byte_0_1 = " BYTE 0 Y 1 ", byte_floor = " BYTE SUELO ", byte_n_wall = " BYTE PARED NORTE ", byte_w_wall = " BYTE PARED OESTE ", byte_5 = " BYTE 5 ", byte_6 = " BYTE 6 ", byte_7 = " BYTE 7 ", parcel = " PARCELA ", } menu_player_count = { players_1 = " 1 JUGADOR ", players_2 = " 2 JUGADORES ", players_3 = " 3 JUGADORES ", players_4 = " 4 JUGADORES ", } adviser = { room_forbidden_non_reachable_parts = "Si colocas la habitación ahí bloquearás el acceso a ciertas partes del hospital.", warnings = { no_desk = "¡Deberías construir una mesa de recepción y contratar a una recepcionista en algún momento!", no_desk_1 = "¡Si quieres que los pacientes vayan a tu hospital, necesitas contratar a una recepcionista y construir una mesa donde pueda trabajar!", no_desk_2 = "¡Enhorabuena, has batido un récord mundial: ha pasado un año y no ha aparecido ni un paciente! ¡Si quieres seguir mandando en este hospital, tendrás que contratar a una recepcionista y construir una mesa donde pueda trabajar!", no_desk_3 = "¡Fabuloso, casi ha pasado un año y no tienes recepcionistas! ¿Cómo quieres que vengan los pacientes? ¡Arréglalo y deja de perder el tiempo!", no_desk_4 = "Una recepcionista necesita una mesa para atender a los pacientes que vengan.", no_desk_5 = "¡Ya era hora! Los pacientes empezarán a llegar pronto.", no_desk_6 = "Tienes una recepcionista, ¿qué tal si construyes una mesa de recepción para que pueda trabajar?", no_desk_7 = "Has construido una mesa de recepción, ¿y si contratas a una recepcionista? No verás a ningún paciente hasta que lo arregles, ¿lo sabes, no?", cannot_afford = "¡No tienes dinero para contratar a esa persona!", -- I can't see anything like this in the original strings cannot_afford_2 = "¡No tienes dinero para comprar eso!", falling_1 = "¡Eh! No tiene gracia. Mira dónde haces clic con ese ratón, ¡vas a hacer daño a alguien!", falling_2 = "¿Te importaría dejar de perder el tiempo?", falling_3 = "¡Ay! Eso ha tenido que doler. ¡Llamen a un médico!", falling_4 = "¡Esto es un hospital, no un parque de atracciones!", falling_5 = "¡Este no es lugar para tirar personas al suelo, que están enfermas!", falling_6 = "¡Esto no es una bolera, no trates así a los enfermos!", research_screen_open_1 = "Para acceder a la pantalla de investigación, tienes que construir un departamento de investigación.", research_screen_open_2 = "No se pueden realizar investigaciones en este nivel.", researcher_needs_desk_1 = "Un investigador necesita una mesa en la que trabajar.", researcher_needs_desk_2 = "Tu investigador agradece que le hayas dado un descanso. Si pretendías tener a más personas investigando, tienes que dar a cada uno una mesa para que trabajen.", researcher_needs_desk_3 = "Cada investigador necesita una mesa para trabajar.", nurse_needs_desk_1 = "Cada enfermera necesita una mesa para trabajar.", nurse_needs_desk_2 = "Tu enfermera agradece que le hayas dado un descanso. Si pretendías tener a más personas trabajando en la enfermería, tienes que dar a cada una una mesa para que trabajen.", low_prices = "Estás cobrando muy poco por el uso de %s. Así atraerás a más personas a tu hospital, pero no te darán muchos beneficios.", high_prices = "Estás cobrando mucho por el uso de %s. Así tendrás muchos beneficios a corto plazo, pero harás que los pacientes dejen de venir.", fair_prices = "El precio de %s parece justo.", patient_not_paying = "¡Un paciente se ha ido sin pagar por %s porque es demasiado caro!", }, cheats = { th_cheat = "¡Felicidades, has desbloqueado los trucos!", roujin_on_cheat = "¡Desafío de Roujin activado! Buena suerte...", roujin_off_cheat = "Desafío de Roujin desactivado.", }, } dynamic_info.patient.actions.no_gp_available = "Esperando a que construyas una consulta" dynamic_info.staff.actions.heading_for = "Dirigiéndose a %s" dynamic_info.staff.actions.fired = "Despedido" dynamic_info.patient.actions.epidemic_vaccinated = "Ya no soy contagioso" progress_report.free_build = "CONSTRUCCIÓN LIBRE" fax = { choices = { return_to_main_menu = "Volver al menú principal", accept_new_level = "Continuar al siguiente nivel", decline_new_level = "Seguir jugando un poco más", }, emergency = { num_disease_singular = "Hay 1 persona con %s y necesita ser atendida inmediatamente.", free_build = "Si tienes éxito, mejorarás tu reputación, pero si fracasas tu reputación caerá en picado.", }, vip_visit_result = { remarks = { free_build = { "¡Su hospital es muy bueno! No es difícil mantenerlo sin limitaciones económicas, ¿eh?", "No soy economista, pero hasta yo podría dirigir este hospital, si usted me entiende...", "Un hospital muy bien cuidado. ¡Pero ojo con la crisis financiera! Ah... que a usted no le afecta.", }, mediocre = { [1] = "Bueno, los he visto peores. Pero debería hacer algunas mejoras.", [2] = "¡Oh, cielos! No es un lugar agradable para ir si estás pachucho.", [3] = "Si le soy sincero, es un hospital normalucho. Francamente, yo esperaba más.", }, very_bad = { [1] = "¡Vaya tugurio! Voy a intentar clausurarlo.", [2] = "Nunca he visto un hospital tan espantoso. ¡Qué vergüenza!", [3] = "Estoy horrorizado. ¡Y a esto lo llama un hospital! Me voy de cañas...", }, } } } letter = { dear_player = "Estimado %s,", custom_level_completed = "¡Bien hecho! ¡Has completado todos los objetivos de este nivel personalizado!", return_to_main_menu = "¿Quieres volver al menú principal o seguir jugando?", campaign_level_completed = "¡Buen trabajo! Has superado este nivel, ¡pero aún no has acabado!\n ¿Te interesaría aceptar un puesto en el hospital %s?", campaign_completed = "¡Increíble! Has conseguido superar todos los niveles. Ya puedes relajarte y disfrutar mientras hablas de tus logros en los foros de Internet. ¡Buena suerte!", campaign_level_missing = "Parece que el siguiente nivel de esta campaña está desaparecido. (Nombre: %s)", } install = { title = "--------------------------------- Configuración de CorsixTH ---------------------------------", th_directory = "CorsixTH necesita una copia de los archivos de datos del Theme Hospital original (o de la demo) para poder funcionar. Utiliza el selector de debajo para localizar la carpeta de instalación de Theme Hospital.", ok = "Aceptar", exit = "Salir", cancel = "Cancelar", } misc.not_yet_implemented = "(aún no implementado)" misc.no_heliport = "O no se han descubierto enfermedades, o no hay un helipuerto en este nivel. Quizás te haga falta comprar una mesa de recepción y contratar a una recepcionista." main_menu = { new_game = "Campaña", custom_campaign = "Campaña personalizada", custom_level = "Misión individual", continue = "Continuar partida", load_game = "Cargar partida", options = "Opciones", map_edit = "Editor de mapas", savegame_version = "Versión del guardado: ", version = "Versión: ", exit = "Salir", } tooltip.main_menu = { new_game = "Empezar el primer nivel de la campaña.", custom_campaign = "Juega una campaña creada por la comunidad.", custom_level = "Construir tu hospital en un nivel concreto.", continue = "Reanuda tu última partida guardada.", load_game = "Cargar una partida guardada.", options = "Ajustar la configuración.", map_edit = "Crear un mapa personalizado.", exit = "¡No, no, por favor, no te vayas!", quit = "Estás a punto de salir de CorsixTH. ¿Seguro que quieres continuar?", } load_game_window = { caption = "Cargar partida (%1%)", } tooltip.load_game_window = { load_game = "Cargar partida %s", load_game_number = "Cargar partida %d", load_autosave = "Cargar autoguardado", } custom_game_window = { caption = "Partida personalizada", free_build = "Construcción libre", load_selected_level = "Comenzar", } tooltip.custom_game_window = { choose_game = "Haz clic en un nivel para ver más información sobre el mismo.", free_build = "Marca esta casilla si quieres jugar sin dinero ni condiciones para ganar o perder.", load_selected_level = "Cargar e iniciar el nivel seleccionado.", } custom_campaign_window = { caption = "Campaña personalizada", start_selected_campaign = "Comenzar campaña", } tooltip.custom_campaign_window = { choose_campaign = "Selecciona una campaña para ver más información sobre la misma.", start_selected_campaign = "Cargar el primer nivel de esta campaña.", } save_game_window = { caption = "Guardar partida (%1%)", new_save_game = "Nueva partida guardada", } tooltip.save_game_window = { save_game = "Sobrescribir guardado %s", new_save_game = "Introduce el nombre de la partida guardada.", } save_map_window = { caption = "Guardar mapa (%1%)", new_map = "Nuevo mapa", } tooltip.save_map_window = { map = "Sobrescribir el mapa %s.", new_map = "Introduce el nombre del mapa guardado.", } menu_list_window = { name = "Nombre", save_date = "Modificado", back = "Volver", } tooltip.menu_list_window = { name = "Pulsa aquí para ordenar la lista por nombres.", save_date = "Pulsa aquí para ordenar la lista por la última fecha de modificación.", back = "Cerrar esta ventana.", } options_window = { caption = "Opciones", option_on = "Sí", option_off = "No", fullscreen = "Pantalla completa", resolution = "Resolución", custom_resolution = "Personalizar...", width = "Ancho", height = "Alto", audio = "Sonido", customise = "Personalizar", folder = "Carpetas", language = "Idioma del juego", apply = "Aplicar", cancel = "Cancelar", back = "Volver", } tooltip.options_window = { fullscreen = "Ejecuta el juego en pantalla completa o en una ventana.", fullscreen_button = "Pulsa aquí para activar el modo de pantalla completa.", resolution = "Cambia la resolución en la que funcionará el juego.", select_resolution = "Selecciona una nueva resolución.", width = "Introduce el ancho de la pantalla.", height = "Introduce la altura de la pantalla.", apply = "Aplica la resolución seleccionada.", cancel = "Vuelve sin cambiar la resolución.", audio_button = "Activa o desactiva todos los sonidos del juego.", audio_toggle = "Activa o desactiva el sonido.", customise_button = "Más opciones para personalizar tu experiencia de juego.", folder_button = "Opciones de carpetas.", language = "Selecciona el idioma de los textos.", select_language = "Selecciona el idioma del juego.", language_dropdown_item = "Seleccionar el idioma %s.", back = "Cierra la ventana de opciones.", } customise_window = { caption = "Opciones personalizadas", option_on = "Activado", option_off = "Desactivado", back = "Volver", movies = "Control de vídeos", intro = "Mostrar introducción", paused = "Construir en pausa", volume = "Tecla de volumen", aliens = "Pacientes alienígenas", fractured_bones = "Fracturas óseas", average_contents = "Contenidos habituales", } tooltip.customise_window = { movies = "Control global de vídeos, permite desactivar todos los vídeos.", intro = "Activa o desactiva el vídeo de introducción. Necesitas activar el control global de vídeos si quieres ver la introducción cada vez que arranques CorsixTH.", paused = "En Theme Hospital el jugador solo podía utilizar el menú superior si la partida estaba en pausa. CorsixTH funciona así de forma predeterminada, pero al activar esta opción se puede acceder a todo mientras el juego esté en pausa.", volume = "Si la tecla de bajar volumen abre también el botiquín, utiliza esta opción para cambiar el acceso directo a Mayúsculas + C.", aliens = "Debido a la falta de animaciones decentes disponibles, hemos hecho que los pacientes con ADN alienígena solo aparezcan en una emergencia. Para permitir que los pacientes con ADN alienígena puedan visitar tu hospital, desactiva esta opción.", fractured_bones = "Debido a una animación deficiente, hemos hecho que no existan pacientes con Fracturas óseas femeninas. Para permitir que las pacientes con Fracturas óseas visiten tu hospital, desactiva esta opción.", average_contents = "Activa esta opción si quieres que el juego recuerde los objetos adicionales que sueles añadir cuando construyes habitaciones.", back = "Cerrar este menú y volver al menú de opciones.", } folders_window = { caption = "Ubicación de carpetas", data_label = "Datos de TH", font_label = "Fuente", music_label = "MP3", savegames_label = "Part. guardadas", screenshots_label = "Capt. de pantalla", -- next four are the captions for the browser window, which are called from the folder setting menu new_th_location = "Aquí puedes especificar una nueva carpeta de instalación de Theme Hospital. El juego se reiniciará en cuanto selecciones la nueva carpeta.", savegames_location = "Selecciona la carpeta que quieres utilizar para tus partidas guardadas.", music_location = "Selecciona la carpeta que quieres utilizar para tu música.", screenshots_location = "Selecciona la carpeta que quieres utilizar para tus capturas de pantalla.", back = "Volver", } tooltip.folders_window = { browse = "Buscar la ubicación de la carpeta", data_location = "La carpeta con la instalación del Theme Hospital original, necesario para ejecutar CorsixTH.", font_location = "La ubicación de una fuente de letra capaz de mostrar caracteres Unicode necesarios para tu idioma. Si no se indica, no podrás seleccionar idiomas que tengan más caracteres de los que puede dar el juego original, por ejemplo, ruso y chino.", savegames_location = "La carpeta de partidas guardadas se ubica de forma predeterminada junto al archivo de configuración y se utilizará para almacenar las partidas guardadas. Si no te gusta, puedes seleccionar otra buscando la carpeta que quieres usar.", screenshots_location = "Las capturas de pantalla se guardan de forma predeterminada en una carpeta junto al archivo de configuración. Si no te gusta, puedes seleccionar otra buscando la carpeta que quieres usar.", music_location = "Selecciona una carpeta con tus archivos de música en formato MP3. Necesitas una carpeta ya existente, entonces podrás buscarla.", browse_data = "Buscar otra ubicación con una instalación de Theme Hospital. (Ubicación actual: %1%)", browse_font = "Buscar otro archivo de fuente de letra. (Ubicación actual: %1%)", browse_saves = "Buscar otra ubicación para tu carpeta de partidas guardadas. (Ubicación actual: %1%)", browse_screenshots = "Buscar otra ubicación para tu carpeta de capturas de pantalla. (Ubicación actual: %1%)", browse_music = "Buscar otra ubicación para tu carpeta de música. (Ubicación actual: %1%)", no_font_specified = "¡No se ha especificado una carpeta de fuentes!", not_specified = "¡No se ha especificado una carpeta!", default = "Ubicación predeterminada", reset_to_default = "Vuelve a asignar la carpeta a su ubicación predeterminada.", -- original_path = "Carpeta actual con la instalación del Theme Hospital original", -- where is this used, I have left if for the time being? back = "Cerrar este menú y volver al menú de Opciones.", } font_location_window = { caption = "Seleccionar fuente (%1%)", } handyman_window = { all_parcels = "Todas las parcelas", parcel = "Parcela" } tooltip.handyman_window = { parcel_select = "Parcela donde el bedel acepta encargos, haz clic para cambiar el ajuste" } new_game_window = { caption = "Campaña", player_name = "Nombre", option_on = "Activado", option_off = "Desactivado", difficulty = "Dificultad", easy = "Novato (Fácil)", medium = "Médico (Normal)", hard = "Especialista (Difícil)", tutorial = "Tutorial", start = "Comenzar", cancel = "Cancelar", } tooltip.new_game_window = { player_name = "Introduce el nombre que usará el juego para dirigirse a ti.", difficulty = "Selecciona el nivel de dificultad con el que quieres jugar.", easy = "Si acabas de conocer los juegos de simulación, esta dificultad es para ti.", medium = "Esta es la dificultad intermedia, si no estás seguro de a dónde quieres ir.", hard = "Si ya estás acostumbrado a este tipo de juegos y quieres un buen desafío, aquí lo tendrás.", tutorial = "Selecciona esta casilla si necesitas ayuda para empezar a jugar.", start = "Empezar la partida con la configuración seleccionada.", cancel = "¡Perdón, yo no quería empezar una nueva partida!", } lua_console = { execute_code = "Ejecutar", close = "Cerrar", } tooltip.lua_console = { textbox = "Introduce aquí el código Lua que quieres ejecutar", execute_code = "Ejecutar el código Lua que has introducido", close = "Cerrar la consola", } errors = { dialog_missing_graphics = "Los archivos de datos de la demo no contienen esta ventana.", save_prefix = "Error al guardar la partida: ", load_prefix = "Error al cargar la partida: ", no_games_to_contine = "No hay partidas guardadas.", load_quick_save = "Error, no existe el guardado rápido y por tanto no se puede cargar, pero tranquilo, que acabamos de generar uno para ti.", map_file_missing = "¡No se ha podido encontrar el archivo de mapa %s de este nivel!", minimum_screen_size = "Introduce un tamaño de pantalla como mínimo de 640x480.", unavailable_screen_size = "El tamaño de pantalla que has seleccionado no está disponible en el modo de pantalla completa.", alien_dna = "NOTA: Los pacientes alienígenas no tienen animaciones para sentarse, abrir puertas, llamar a puertas, etc. Por lo tanto, al igual que en Theme Hospital, para hacer estas cosas aparentarán cambiar a una imagen normal y luego volverán a su estado. Los pacientes con ADN alienígena solo aparecerán si el archivo del nivel lo indica.", fractured_bones = "NOTA: La animación de las pacientes femeninas con Fracturas óseas no es perfecta.", could_not_load_campaign = "Error al cargar la campaña %s.", could_not_find_first_campaign_level = "No se ha encontrado el primer nivel de la campaña %s.", } warnings = { levelfile_variable_is_deprecated = "Aviso: El nivel %s contiene una definición de variable obsoleta en el archivo del nivel." .. "'%LevelFile' ha sido renombrado como '%MapFile'. Avisa al creador del mapa para que actualice el nivel.", } confirmation = { needs_restart = "Para cambiar este ajuste debes reiniciar CorsixTH. Se perderá todo el progreso que no hayas guardado. ¿Seguro que quieres continuar?", abort_edit_room = "Ahora mismo estás construyendo o editando una habitación. Si has colocado todos los objetos necesarios será terminada, de lo contrario se borrará. ¿Quieres continuar?", maximum_screen_size = "El tamaño de pantalla que has introducido es mayor que 3000x2000. Es posible utilizar una resolución más grande, pero necesitarás un ordenador potente para que la velocidad de fotogramas sea aceptable. ¿Seguro que quieres continuar?", music_warning = "Nota: Necesitas el archivo smpeg.dll o el equivalente para tu sistema operativo, de lo contrario no tendrás música en el juego. ¿Quieres continuar?", } information = { custom_game = "Bienvenido a CorsixTH. ¡Diviértete con este mapa personalizado!", no_custom_game_in_demo = "La versión demo no permite jugar a mapas personalizados.", cannot_restart = "Esta partida personalizada se guardó antes de que se implementara la característica de reiniciar.", very_old_save = "Desde que empezaste a jugar en este nivel, el juego ha recibido muchas actualizaciones. Para asegurarte de que todas las características funcionen como es debido, deberías pensar en volver a empezar.", level_lost = { "¡Qué pena! Has fracasado en este nivel. ¡Ya tendrás más suerte la próxima vez!", "La razón por la que has perdido es:", reputation = "Tu reputación ha caído por debajo de %d.", balance = "Tu cuenta bancaria ha llegado a tener menos de %d.", percentage_killed = "Has matado a más de un %d por ciento de los pacientes.", cheat = "¿Lo has elegido tú o te has equivocado de botón? No sabes ni hacer trampas como es debido... ¿a que no tiene gracia?", }, cheat_not_possible = "No puedes usar ese truco en este nivel. No sabes ni hacer trampas, ¿a que no tiene gracia?", } tooltip.information = { close = "Cerrar la ventana de información", } totd_window = { tips = { "Todo hospital necesita una mesa de recepción y una consulta para empezar a funcionar. A partir de ahí depende del tipo de pacientes que visite tu hospital. Eso sí, una farmacia siempre es una buena opción.", "Las máquinas como el inflador necesitan mantenimiento. Contrata a un par de bedeles para que reparen tus máquinas o podrías herir a tus pacientes y a tu personal.", "Tu personal se cansará pasado un tiempo. Procura construir una sala de personal para que puedan relajarse.", "Coloca varios radiadores para mantener calentitos a tu personal y empleados o se enfadarán. Usa el mapa de la ciudad para buscar las zonas que no tienen calefacción en tu hospital.", "El nivel de cualificación de un médico influye en la calidad y la velocidad de sus diagnósticos. Si asignas un médico cualificado a tu consulta no necesitarás tantas consultas de diagnosis.", "Los principiantes y los médicos pueden mejorar su cualificación si un especialista les enseña en la sala de formación. Si el especialista tiene una cualificación especial (cirujano, psiquiatra o investigador), también enseñará sus conocimientos a sus alumnos.", "¿Has probado a meter el número de emergencias (112) en el fax? ¡Asegúrate de tener el sonido activado!", "Puedes ajustar algunos parámetros como la resolución y el idioma del juego en la ventana de opciones, que se encuentra tanto en el menú principal como dentro del juego.", "¿Has seleccionado el castellano, pero sigues viendo textos en inglés en algún lugar? ¡Avísanos de qué líneas de texto están en inglés para que podamos traducirlas!", "¡El equipo de CorsixTH busca refuerzos! ¿Te interesa programar, traducir o crear gráficos para CorsixTH? Contáctanos en nuestro foro, lista de correo o canal IRC (corsix-th en freenode).", "Si encuentras un fallo, puedes enviarnos un informe en nuestro registro de fallos: th-issues.corsix.org", "Cada nivel tiene unos requisitos concretos que debes conseguir antes de poder avanzar al siguiente nivel. Mira en la ventana de estado para ver como llevas los objetivos del nivel.", "Si quieres editar o quitar una habitación ya existente, puedes hacerlo con el botón Editar habitación, en la barra de herramientas inferior.", "Cuando tengas muchos pacientes esperando, puedes averiguar quienes están esperando para una habitación en concreto pasando el cursor por encima de la habitación.", "Pulsa en la puerta de una habitación para ver su cola. Aquí puedes afinar ciertas cosas, como el orden la cola o mandar a un paciente hacia otra habitación.", "El personal que no esté contento pedirá aumentos de sueldo con frecuencia. Asegúrate de que tu personal trabaja en un entorno cómodo para evitar que esto ocurra.", "Los pacientes tendrán sed mientras esperan en tu hospital, ¡y más si subes la calefacción! Coloca máquinas de bebidas en lugares estratégicos para ganar un dinerillo extra.", "Puedes cancelar el progreso del diagnóstico de un paciente y adivinar la cura si ya has descubierto la enfermedad. Ten en cuenta que esto aumentará el riesgo de darle el tratamiento equivocado, lo que matará al paciente.", "Las emergencias pueden ser una buena forma de ganar un dinerillo extra, siempre y cuando tengas la capacidad suficiente para ocuparte de los pacientes de la emergencia a tiempo.", }, previous = "Siguiente consejo", next = "Consejo anterior", } tooltip.totd_window = { previous = "Mostrar el consejo anterior", next = "Mostrar el consejo siguiente", } debug_patient_window = { caption = "Paciente de depuración", } cheats_window = { caption = "Trucos", warning = "Advertencia: ¡No conseguirás bonificaciones al acabar este nivel si haces trampas!", cheated = { no = "Se han usado trucos: No", yes = "Se han usado trucos: Sí", }, cheats = { money = "Truco de dinero", all_research = "Truco de todo investigado", emergency = "Crear una emergencia", vip = "Crear un VIP", earthquake = "Crear terremoto", epidemic = "Generar un paciente contagioso", toggle_infected = "Mostrar/ocultar iconos de infección", create_patient = "Crear un paciente", end_month = "Fin de mes", end_year = "Fin del año", lose_level = "Perder el nivel", win_level = "Ganar el nivel", increase_prices = "Subir precios", decrease_prices = "Bajar precios", }, close = "Cerrar", } tooltip.cheats_window = { close = "Cerrar la ventana de trucos", cheats = { money = "Añade 10.000 dólares a tu cuenta bancaria.", all_research = "Completa todas las investigaciones.", emergency = "Crea una emergencia.", vip = "Crea un VIP.", earthquake = "Crea un terremoto.", epidemic = "Crea un paciente contagioso que podría provocar una epidemia.", toggle_infected = "Muestra u oculta los iconos de infección para la epidemia activa.", create_patient = "Crea un paciente en el borde del mapa.", end_month = "Avanza hasta el fin del mes actual.", end_year = "Avanza hasta el final del año actual.", lose_level = "Hace que pierdas el nivel actual.", win_level = "Hace que ganes el nivel actual.", increase_prices = "Aumenta los precios en un 50% (200% máximo).", decrease_prices = "Reduce los precios en un 50% (50% mínimo).", } } introduction_texts = { demo = "¡Bienvenido al hospital de demostración!" .. "Por desgracia, la demo sólo contiene este nivel. ¡Pero tiene más que suficiente para distraerte un buen rato!" .. "Te enfrentarás a varias enfermedades que deberás curar construyendo varias salas. De vez en cuando pueden aparecer emergencias. Necesitarás investigar varios tipos de consultas utilizando una consulta de investigación." .. "Tu objetivo es ganar 100.000 dólares, una reputación de 700, que tu hospital tenga un valor de 70.000 dólares y que hayas curado al menos al 75% de tus pacientes." .. "Procura que tu reputación no caiga por debajo de 300 y no mates a más del 40% de tus pacientes o perderás el nivel." .. "¡Suerte!", } calls_dispatcher = { -- Dispatcher description message. Visible in Calls Dispatcher dialog summary = "%d llamadas, %d asignadas", staff = "%s - %s", watering = "Regando @ %d,%d", repair = "Reparar %s", close = "Cerrar", } tooltip.calls_dispatcher = { task = "Lista de tareas: Pulsa en una tarea para abrir la ventana del personal asignado y desplázate hasta la posición de la tarea.", assigned = "Esta opción está activada si alguien ha sido asignado a la tarea correspondiente.", close = "Cerrar la ventana de llamadas de control.", } update_window = { caption = "¡Actualización disponible!", new_version = "Versión nueva:", current_version = "Versión actual:", download = "Ir a la página de descargas", ignore = "Saltar e ir al menú principal", } tooltip.update_window = { download = "Ir a la página de descargas para obtener la última versión de CorsixTH.", ignore = "Ignorar esta actualización por el momento. Volverás a ser notificado la próxima vez que ejecutes CorsixTH.", } map_editor_window = { pages = { inside = "Interior", outside = "Exterior", foliage = "Vegetación", hedgerow = "Setos", pond = "Estaque", road = "Camino", north_wall = "Muro norte", west_wall = "Muro oeste", helipad = "Helipuerto", delete_wall = "Borrar muros", parcel_0 = "Parcela 0", parcel_1 = "Parcela 1", parcel_2 = "Parcela 2", parcel_3 = "Parcela 3", parcel_4 = "Parcela 4", parcel_5 = "Parcela 5", parcel_6 = "Parcela 6", parcel_7 = "Parcela 7", parcel_8 = "Parcela 8", parcel_9 = "Parcela 9", camera_1 = "Cámara 1", camera_2 = "Cámara 2", camera_3 = "Cámara 3", camera_4 = "Cámara 4", heliport_1 = "Helipuerto 1", heliport_2 = "Helipuerto 2", heliport_3 = "Helipuerto 3", heliport_4 = "Helipuerto 4", paste = "Pegar zona", } } -------------------------------- UNUSED ----------------------------------- ------------------- (kept for backwards compatibility) ---------------------- options_window.change_resolution = "Cambiar resolución" tooltip.options_window.change_resolution = "Cambia la resolución de la ventana utilizando la dimensión indicada a la izquierda." CorsixTH-0.63/CorsixTH/Lua/languages/swedish.lua000066400000000000000000001057041347163623700215330ustar00rootroot00000000000000--[[ Copyright (c) 2010-2016 Manuel "Roujin" Wolf, Edvin "Lego3" Linge 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. --]] Language("Svenska", "Swedish", "sv", "swe") Inherit("english") Inherit("original_strings", 5) Encoding(utf8) ------------------------------- OVERRIDE ---------------------------------- object.reception_desk = "Reception" -- "Psyket" means something entirely different than "Psykiatrin" rooms_long.psychiatric = "Den psykiatriska avdelningen" rooms_short.psychiatric = "Psykiatri" tooltip.rooms.psychiatry = "I den psykiatriska avdelningen kureras galningar och man hjälper också till med diagnoser av andra patienter. Här behövs en läkare med psykiatrisk kompetens" adviser.staff_place_advice.only_psychiatrists = "Läkare utan psykiatrisk examen kan inte arbeta inom psykiatrin." adviser.room_requirements.psychiatry_need_psychiatrist = "Nu när du byggt en psykiatrisk avdelning måste du också anställa en psykiater." room_descriptions.psych = { "Den psykiatriska avdelningen//", "Patienter som får diagnosen psykisk sjukdom måste uppsöka den psykiatriska avdelningen för att få behandling. Psykiatriker kan också ställa diagnoser, ta reda på vilken typ av sjukdom patienterna har och, i det fall det är mentalt behandla dem på den pålitliga gamla britsen.//", "Här behövs en läkare utbildad i psykiatri. " } introduction_texts.level1 = "Välkommen till ditt första sjukhus!//Sätt igång genom att placera ut en reception och bygga en allmänpraktik, anställ en receptionist och en läkare. " .. "Vänta därefter på att jobben ska trilla in. En bra idé vore att bygga en psykmottagning och anställa en läkare med psykiatrisk kompetens. " .. "Ett apotek och en syster behövs också för att du ska kunna bota dina patienter. Se upp för svåra fall av pöshuvud - ett pumprum behövs för att greja dessa. " .. "Försök bota 10 personer och se till att ditt anseende inte sjunker under 200." tooltip.staff_list.next_person = "Visa nästa sida" tooltip.staff_list.prev_person = "Visa föregående sida" -- Improve tooltips in staff window to mention hidden features tooltip.staff_window.face = "Vederbörandes ansikte - klicka för att öppna personalhanteraren" tooltip.staff_window.center_view = "Vänsterklicka för att komma till personen, högerklicka för att gå igenom personalen en och en" confirmation.restart_level = "Är du säker på att du vill starta om nivån?" -- In English the squits becomes the the squits, see issue 1646. In Swedish it stays the same, but it -- still needs to be defined. adviser.research.drug_improved_1 = "Medicinen mot %s har förbättrats av din forskaravdelning." ------------------------------- NEW STRINGS ------------------------------- object.litter = "Skräp" tooltip.objects.litter = "Skräp: Lämnat åt sitt öde eftersom patienten inte kunde hitta någon papperskorg." tooltip.fax.close = "Stäng fönstret utan att ta bort meddelandet" tooltip.message.button = "Vänsterklicka för att öppna meddelandet" tooltip.message.button_dismiss = "Vänsterklicka för att öppna meddelandet, högerklicka för att ta bort det" tooltip.casebook.cure_requirement.hire_staff = "Du behöver anställa personal att hantera behandlingen" tooltip.casebook.cure_type.unknown = "Du vet ännu inte hur denna sjukdom botas" tooltip.research_policy.no_research = "Det pågår ingen forskning i den här kategorin just nu" tooltip.research_policy.research_progress = "Framsteg inför nästa upptäckt i denna kategori: %1%/%2%" handyman_window.all_parcels = "Alla tomter" handyman_window.parcel = "Tomt" tooltip.handyman_window.parcel_select = "Tomten där vaktmästaren accepterar uppdrag. Klicka för att ändra" tooltip.new_game_window.player_name = "Skriv in det namn du vill kallas i spelet" new_game_window.player_name = "Namn" menu.player_count = "ANTAL SPELARE" menu_options = { lock_windows = " LÅS FÖNSTER ", edge_scrolling = " KANTRULLNING ", adviser_disabled = " (%1%) MEDHJÄLPARE ", warmth_colors = " VÄRMEFÄRGER ", wage_increase = " LÖNFÖRFRÅGNINGAR ", twentyfour_hour_clock = " 24-TIMMARSKLOCKA " } menu_options_game_speed = { pause = " (%1%) PAUSA ", slowest = " (%1%) LÅNGSAMMAST ", slower = " (%1%) LÅNGSAMMARE ", normal = " (%1%) NORMAL ", max_speed = " (%1%) MAXHASTIGHET ", and_then_some_more = " (%1%) OCH SÅ LITE TILL ", } menu_options_warmth_colors = { choice_1 = " RÖD ", choice_2 = " BLÅ GRÖN RÖD ", choice_3 = " GUL ORANGE RÖD ", } menu_options_wage_increase = { grant = " BEVIJLA ", deny = " NEKA ", } -- Add F-keys to entries in charts menu (except briefing), also town_map was added. menu_charts = { bank_manager = " (%1%) BANKKAMRER ", statement = " (%1%) KONTOUTDRAG ", staff_listing = " (%1%) PERSONALLEDNING ", town_map = " (%1%) STADSKARTA ", casebook = " (%1%) MEDICINJOURNAL ", research = " (%1%) FORSKNING ", status = " (%1%) STATUS ", graphs = " (%1%) GRAFER ", policy = " (%1%) POLICY ", } menu_file.restart = " (%1%) STARTA OM " menu_debug = { jump_to_level = " HOPPA TILL NIVÅ ", connect_debugger = " (%1%) KOPPLA LUA DBGp SERVER ", transparent_walls = " (%1%) TRANSPARENTA VÄGGAR ", limit_camera = " BEGRÄNSA KAMERAN ", disable_salary_raise = " STÄNG AV LÖNEÖKNINGAR ", make_debug_fax = " SKAPA DEBUGFAX ", make_debug_patient = " SKAPA DEBUGPATIENT ", cheats = " (%1%) FUSK ", lua_console = " (%1%) LUATERMINAL ", debug_script = " (%1%) KÖR DEBUGSKRIPT ", calls_dispatcher = " ANROPSKLARERARE ", dump_strings = " (%1%) SKAPA TEXTFILER ", dump_gamelog = " (%1%) DUMPA SPELLOGG ", map_overlay = " KARTÖVERSIKT ", sprite_viewer = " GRAFIKVISARE ", } menu_debug_overlay = { none = " INGET ", flags = " FLAGGOR ", positions = " KOORDINATER ", heat = " TEMPERATUR ", byte_0_1 = " BYTE 0 & 1 ", byte_floor = " BYTE GOLV ", byte_n_wall = " BYTE N VÄGG ", byte_w_wall = " BYTE W VÄGG ", byte_5 = " BYTE 5 ", byte_6 = " BYTE 6 ", byte_7 = " BYTE 7 ", parcel = " TOMT ", } menu_player_count = { players_1 = " 1 SPELARE ", players_2 = " 2 SPELARE ", players_3 = " 3 SPELARE ", players_4 = " 4 SPELARE ", } adviser = { room_forbidden_non_reachable_parts = "Rummet kan inte placeras här eftersom delar av sjukhuset då blir oåtkomliga.", warnings = { no_desk = "Det kanske börjar bli dags att bygga en reception och anställa en receptionist?", no_desk_1 = "Om du vill att det ska komma patienter till sjukhuset så behövs en receptionist och en reception där hon kan jobba!", no_desk_2 = "Snyggt jobbat, det måste vara ett världsrekord: nästan ett år och inte en enda patient! Om du vill fortsätta som chef på det här sjukhuset så måste du anställa en receptionist och bygga en reception som hon kan jobba i!", no_desk_3 = "Helt otroligt, nästan ett år och du har fortfarande ingen bemannad reception! Tror du det kommer några patienter då? Sluta leka omkring och fixa till det här nu!", no_desk_4 = "En receptionist behöver ha en egen disk som hon kan hälsa patienterna välkomna vid", no_desk_5 = "Det var på tiden, nu borde det snart börja dyka upp patienter!", no_desk_6 = "Du har en receptionist, det kanske är dags att bygga en reception som hon kan arbeta vid?", no_desk_7 = "Nu har du en reception, vad sägs om att anlita en receptionist också? Det lär inte komma några patienter förrän du gjort det!", cannot_afford = "Du har inte tillräckligt med pengar på banken för att anställa den personen!", cannot_afford_2 = "du har inte tillräckligt med pengar på banken för att genomföra det köpet!", falling_1 = "Nämen! Det där inte kul, om du inte ser dig för var du klickar så kan någon skada sig!", falling_2 = "Sluta strula omkring, hur tror du det känns?", falling_3 = "Ajaj, det måste ha gjort ont. Ring en läkare!", falling_4 = "Det här är ett sjukhus, inte ett nöjesfält!", falling_5 = "Jag tror inte det här är rätt arena att knuffa omkull folk på, det är sjuka vet du!", falling_6 = "Det här är inte en bowlinghall, sjuka människor ska inte behandlas så!", research_screen_open_1 = "Du behöver bygga en forskningsavdelning innan du får tillgång till forskningsskärmen.", research_screen_open_2 = "På den här nivån finns det ingen möjlighet till forskning.", researcher_needs_desk_1 = "Varje forskare behöver ett skrivbord att jobba vid.", researcher_needs_desk_2 = "Din forskare är nöjd över att få en välbehövlig paus. Om du ville ha flera forskare aktiva samtidigt så behöver de få var sitt skrivbord.", researcher_needs_desk_3 = "En forskare behöver alltid ett skrivbord.", nurse_needs_desk_1 = "Varje sköterska behöver ett eget skrivbord.", nurse_needs_desk_2 = "Din sköterska är glad att få en paus. Du kanske ville ha flera personer att jobba på avdelningen? Då behöver de var sitt skrivbord.", low_prices = "Du tar för lite betalt för %s. Det lockar visserligen fler patienter, men du kommer inte att tjäna så mycket på var och en.", high_prices = "Avgiften på %s är hög. Du tjänar mycket kortsiktigt, men till slut kommer du att driva iväg folk.", fair_prices = "Avgiften på %s verkar rimlig och balanserad.", patient_not_paying = "En patient lämnade just sjukhuset utan att betala för %s eftersom det är alldeles för dyrt!", }, cheats = { th_cheat = "Ojoj, nån vill fuska sig till segern!", roujin_on_cheat = "Roujin's utmaning aktiverad! Lycka till...", roujin_off_cheat = "Roujin's utmaning avaktiverad.", }, } dynamic_info.patient.actions.no_gp_available = "Väntar på att du ska bygga en allmänpraktik" dynamic_info.staff.actions.heading_for = "På väg till %s" dynamic_info.staff.actions.fired = "Sparkad" dynamic_info.patient.actions.epidemic_vaccinated = "Jag smittar inte längre" progress_report.free_build = "FRITT BYGGANDE" fax = { choices = { return_to_main_menu = "Gå till huvudmenyn", accept_new_level = "Gå vidare till nästa nivå", decline_new_level = "Fortsätt spela ett tag till", }, emergency = { num_disease_singular = "Vi har 1 person som kräver omedelbar vård med %s.", free_build = "Om du lyckas ökar ditt anseende, men om du misslyckas kommer ditt anseende att få en rejäl känga." }, vip_visit_result = { remarks = { free_build = { "Det var ju ett trevligt sjukhus du har! Inte så svårt att få det så bra utan begränsande budget dock, eller hur?", "Jag är ingen ekonom, men jag tror att jag också hade kunnat driva det här sjukhuset, om du förstår vad jag menar...", "Ett mycket väld fungerande sjukhus må jag säga. Akta lågkonjunkturen bara! Just det... du behöver inte oroa dig över pengar nä.", } } } } letter = { dear_player = "Käre %s", custom_level_completed = "Bra gjort! Du klarade alla mål på den här specialnivån!", return_to_main_menu = "Vill du gå tillbaka till huvudmenyn eller fortsätta spela?", campaign_level_completed = "Bra jobbat! Du klarade nivån, men det är inte över än!\n Vill du ha jobbet som chef vid %s?", campaign_completed = "Otroligt! Du lyckades med alla nivåer. Nu är det bara att mysa och njuta av att fylla forum överallt på nätet om dina bedrifter. Lycka till!", campaign_level_missing = "Ledsen, men det verkar som att nästa nivå på den här kampanjen saknas. (Namn: %s)", } install = { title = "--------------------------------- CorsixTH Setup ---------------------------------", th_directory = "CorsixTH behöver en kopia av filerna från det ursprungliga spelet (eller dess demo) för att kunna köras. Använd väljaren nedan för att lokalisera mappen där Theme Hospital installerats.", ok = "OK", exit = "Avsluta", cancel = "Avbryt", } misc.not_yet_implemented = "(ej tillgänglig ännu)" misc.no_heliport = "Antingen har inga sjukdomar upptäckts ännu, eller så finns det ingen helikopterplatta på den här nivån." main_menu = { new_game = "Originalkampanjen", custom_campaign = "Nya kampanjer", custom_level = "Enskild nivå", continue = "Fortsätt spel", load_game = "Ladda spel", options = "Alternativ", map_edit = "Kartredigerare", savegame_version = "Sparningsversion: ", version = "Version: ", exit = "Avsluta", } tooltip.main_menu = { new_game = "Starta nivå ett i originalkampanjen från Theme Hospital", custom_campaign = "Spela en kampanj som är skapad av andra spelare", custom_level = "Bygg ditt sjukhus på en valfri nivå", load_game = "Ladda ett sparat spel", options = "Fixa till dina inställningar", map_edit = "Starta kartredigeraren för att skapa din egen karta", exit = "Nej! Du vill väl inte sluta redan?", quit = "Du håller på att avsluta CorsixTH. Är du säker på att du vill det?" } load_game_window = { caption = "Ladda spel", } tooltip.load_game_window = { load_game = "Ladda %s", load_game_number = "Ladda spel %d", load_autosave = "Ladda autosparningen", } custom_game_window = { caption = "Enskilda nivåer", free_build = "Bygg fritt", load_selected_level = "Starta", } tooltip.custom_game_window = { choose_game = "Välj en nivå för att läsa mer om den", free_build = "Bocka för den här rutan om du vill spela utan pengar och vinst- och förlustkriterier", load_selected_level = "Ladda och spela den valda nivån", } custom_campaign_window = { caption = "Nya kampanjer", start_selected_campaign = "Starta kampanj", } tooltip.custom_campaign_window = { choose_campaign = "Välj en kampanj för att läsa mer om den", start_selected_campaign = "Ladda den första nivån på den valda kampanjen", } save_game_window = { caption = "Spara spel", new_save_game = "Ny sparfil", } tooltip.save_game_window = { save_game = "Skriv över %s", new_save_game = "Skriv namnet på den nya filen", } save_map_window = { caption = "Spara karta (%1%)", new_map = "Ny karta", } tooltip.save_map_window = { map = "Skriv över kartan %s", new_map = "Skriv ett kartnamn", } menu_list_window = { name = "Namn", save_date = "Senast ändrad", back = "Tillbaka", } tooltip.menu_list_window = { name = "Klicka här för att sortera listan efter namn", save_date = "Klicka här för att sortera listan efter daturm då spelen sparades", back = "Stäng detta fönster", } options_window = { caption = "Alternativ", option_on = "På", option_off = "Av", fullscreen = "Helskärm", resolution = "Upplösning", custom_resolution = "Anpassad...", width = "Bredd", height = "Höjd", audio = "Globalt ljud", customise = "Anpassa", folder = "Mappar", language = "Spelspråk", apply = "Tillämpa", cancel = "Avbryt", back = "Tillbaka", } tooltip.options_window = { fullscreen = "Om spelet ska köras i fullskärmsläge eller fönsterläge", fullscreen_button = "Klicka för att gå mellan fönster och helskärm", resolution = "Upplösning spelet ska köras i", select_resolution = "Välj en ny upplösning", width = "Fyll i önskad skärmbredd", height = "Fyll i önskad skärmhöjd", apply = "Tillämpa den valda upplösningen", cancel = "Återvänd utan att ändra upplösning", audio_button = "Stäng av eller sätt på allt ljud i spelet", audio_toggle = "Slå av eller på", customise_button = "Fler inställningar som kan ändras för att anpassa din spelupplevelse", folder_button = "Mappinställningar", language = "Text i spelet kommer att visas på det här språket", select_language = "Väljs spelspråk", language_dropdown_item = "Ändra till %s som språk", back = "Stäng alternativmenyn", } customise_window = { caption = "Extra inställningar", option_on = "På", option_off = "Av", back = "Tillbaka", movies = "Global filmkontroll", intro = "Spela introfilmen", paused = "Bygg i pausläge", volume = "Tangent: volym ner", aliens = "Utomjordingar", fractured_bones = "Krossad patient", average_contents = "Genomsnittsinnehåll", } tooltip.customise_window = { movies = "Välj om filmer ska spelas överhuvudtaget", intro = "Skippa introfilmen när du startar spelet. Global filmkontroll måste vara påslagen om du spela introfilmen varje gång du laddar CorsixTH", paused = "I Theme Hospital fick spelaren bara använda verktygsfältet längst upp när spelet var pausat. Så är det i CorsixTH också såvida du inte aktiverar funktionen att bygga även när spelet är pausat här", volume = "Om du råkat ut för att tangenten som sänker volymen även öppnar medicinjournalen, slå på det här alternativet för att ändra snabbkommando till medicinjournalen till Shift + C", aliens = "Eftersom det inte finns ordentliga animeringar har vi gjort så att patienter med utomjordiskt DNA endast dyker upp som akutfall. Stäng av det här för att kunna få utomjordiskt DNA-fall även som vanliga besök", fractured_bones = "På grund av en dålig animering har vi stängt av kvinnliga patienter med frakturer (Krossad patient). Stäng av det här, så kommer det att dyka upp även kvinnor med den åkomman", average_contents = "Om du vill att spelet ska komma ihåg vilka extra föremål du normalt sett brukar handla till nya rum, slå på detta alternativ", back = "Stäng den här menyn och gå tillbaka till Alternativmenyn", } folders_window = { caption = "Mappinställningar", data_label = "TH Data", font_label = "Typsnitt", music_label = "MP3", savegames_label = "Sparningar", screenshots_label = "Skärmbilder", -- next four are the captions for the browser window, which are called from the folder setting menu new_th_location = "Här kan du välja en ny sökväg där Theme Hospital ligger. Så fort du väljer en ny mapp kommer spelet att startas om!", savegames_location = "Välj var sparade spel ska läggas.", music_location = "Välj en mapp med musik i för att spela den i spelet.", screenshots_location = "Välj vilken mapp du vill spara skärmbilder till.", back = "Tillbaka", } tooltip.folders_window = { browse = "Bläddra efter mappsökväg", data_location = "Mapp där originalspelet Theme Hospital finns. Krävs för att spela CorsixTH", font_location = "Sökväg till en typsnittsfil som kan visa Unicode-tecken som krävs för ditt språk. Om detta inte är specificerat kommer du inte att kunna välja sådana språk, till exempel ryska och kinesiska", savegames_location = "Som standard läggs sparade spel i en mapp som ligger bredvid konfigurationsfilen. Om det inte fungerar kan du välja en egen här", screenshots_location = "Skärmbilder sparas som standard i en mapp bredvid konfigurationsfilen. Här kan du välja en annan mapp istället", music_location = "Välj en sökväg där du har mp3-filer. Mappen måste redan finnas", browse_data = "Bläddra efter en ny sökväg till Theme Hospital ( nuvarande sökväg: %1% )", browse_font = "Bläddra efter en annan typsnittsfil ( nuvarande sökväg:: %1% )", browse_saves = "Bläddra efter en annan mapp att lägga sparade spel i ( nuvarande sökväg:: %1% ) ", browse_screenshots = "Bläddra efter en annan mapp för skärmbilder ( nuvarande sökväg:: %1% ) ", browse_music = "Bläddra efter en annan mapp med musik ( nuvarande sökväg:: %1% ) ", no_font_specified = "Ingen typsnittsfil vald än!", not_specified = "Ingen sökväg vald än!", default = "Standardsökväg", reset_to_default = "Återställ mappen till standardsökvägen", back = "Stäng den här dialogen och återgå till alternativmenyn", } font_location_window = { caption = "Välj typsnitt (%1%)", } new_game_window = { caption = "Kampanj", option_on = "På", option_off = "Av", difficulty = "Svårighetsgrad", easy = "Junior (Lätt)", medium = "Läkare (Medel)", hard = "Konsult (Svår)", tutorial = "Starthjälp", start = "Börja", cancel = "Avbryt", } tooltip.new_game_window = { easy = "Om du känner dig ny på denna typ av spel är detta läget för dig", medium = "Detta är den gyllene medelvägen om du är osäker på vad du ska välja", hard = "Känner du för en utmaning och är van vid den här typen av spel är det här rätt val", difficulty = "Välj vilken svårighetsgrad spelet ska ha", start = "Börja spela med dessa inställningar", tutorial = "Vill du ha lite hjälp på traven i början, tryck ner den här rutan", cancel = "Oj, det var ju egentligen inte meningen att starta ett nytt spel!", } lua_console = { execute_code = "Exekvera", close = "Stäng", } tooltip.lua_console = { textbox = "Skriv in Luakod att köra här", execute_code = "Kör koden du skrivit", close = "Stäng terminalen", } errors = { dialog_missing_graphics = "Tyvärr innehåller demon inte den här dialogrutan.", save_prefix = "Fel när spelet skulle sparas: ", load_prefix = "Fel när spelet skulle laddas: ", no_games_to_contine = "Det finns inga sparade spel.", load_quick_save = "Fel, kan inte ladda en snabbsparning eftersom det inte finns någon. Men oroa dig inte, nu har vi skapat en åt dig!", map_file_missing = "Kunde inte hitta kartfilen %s till den här nivån!", minimum_screen_size = "Skärmupplösningen måste vara åtminstone 640x480.", unavailable_screen_size = "Skärmupplösningen du valde finns inte i fullskärmsläge.", alien_dna = "NOTERA: Det finns inga animeringar för patienter med utomjordiskt DNA när de sitter ner, öppnar dörrar osv. Precis som i Theme Hospital gör de därför det i mänsklig skepnad. Dessa patienter anländer som vanligt endast om nivån du spelar definierat att sjukdomen ska finnas", fractured_bones = "NOTERA: Animeringen för kvinnliga Krossade patienter är inte perfekt", could_not_load_campaign = "Kunde inte ladda kampanjen %s", could_not_find_first_campaign_level = "Kunde inte hitta den första nivån på den här kampanjen: %s", } warnings = { levelfile_variable_is_deprecated = "Notera: Nivån '%s' innehåller en föråldrad variabeldefinition i nivåfilen." .. "'%LevelFile' har bytt namn till '%MapFile'. Meddela nivåskaparen att uppdatera nivån.", } confirmation = { needs_restart = "Att ändra denna inställning kräver en omstart av spelet. Osparad data kommer att gå förlorad. Är du säker på att du vill göra detta?", abort_edit_room = "Du håller på att bygga eller ändra ett rum. Om alla obligatoriska föremål är placerade kommer rummet att färdigställas som det är, annars tas det bort. Fortsätta?", maximum_screen_size = "Upplösningen du valt är större än 3000 x 2000. Större upplösningar är möjliga, men kräver bättre hårdvara. Är du säker på att du vill fortsätta?", music_warning = "Notera: När du väljer att använda mp3-filer som spelmusik behövs smpeg.dll eller motsvarande för ditt operativsystem, annars blir det ingen musik i spelet. Vill du fortsätta?", } information = { custom_game = "Välkommen till CorsixTH. Ha nu riktigt kul med den här specialnivån!", no_custom_game_in_demo = "Ledsen, men det går inte att spela enskilda nivåer med demofilerna.", cannot_restart = "Tyvärr sparades detta spel innan funktionen att starta om hade implementerats.", very_old_save = "Det har hänt en hel del med spelet sedan du startade den här nivån. För att vara säker på att allt fungerar som det är tänkt kan det vara bra att överväga att starta om nivån.", level_lost = { "Attans! Du förlorade. Bättre lycka nästa gång!", "Anledning till att du förlorade:", reputation = "Ditt anseende föll under %d.", balance = "Din bankbalans sjönk till under %d.", percentage_killed = "Du dödade mer än %d procent av dina patienter.", cheat = "Var det verkligen ditt val eller tryckte du bara på fel knapp? Så du kan inte ens fuska ordentligt, tråkigt för dig...", }, cheat_not_possible = "Det går inte att använda det fusket på den här nivån. Du misslyckas till och med att fuska, det kan inte vara roligt!", } tooltip.information = { close = "Stäng informationsrutan", } totd_window = { tips = { "Alla sjukhus behöver en reception och en allmänpraktik för att fungera. Sedan beror allt på vad det är för patienter som besöker sjukhuset. Ett hett tips är att börja med ett apotek.", "Maskiner som till exempel pumpen behöver underhåll då och då. Anställ en vaktmästare eller två för att reparera dem, annars riskeras personalens och patienternas hälsa.", "Efter ett tag kommer din personal att bli trött. Se till att göra ett personalrum så att de kan slappna av lite.", "För att inte dina anställda och alla patienter ska bli arga gäller det att ha tillräckligt med element utplacerade lite här och där. Använd stadskartan för att hitta ställen som behöver mer värme.", "En läkares kompetensnivå påverkar kvaliteten och hastigheten på hans diagnoser ganska mycket. Sätt en riktigt kompetent läkare i allmänpraktiken så behövs det inte så många andra diagnosrum.", "Juniorer och läkare kan höja sin kompetensnivå genom att gå i träning hos en konsult i utbildningsrummet. Om konsulten har någon färdighet (kirurg, psykiater eller forskare) kommer han också att lära ut detta till sina elever.", "Har du testat att slå numret till SOS Alarm på faxen? Se till att ljudet är påslaget...", "Det går att göra vissa inställningar som till exempel upplösning och språk i alternativmenyn som finns både i huvudmenyn och inuti spelet.", "Hittar du en massa text på engelska i spelet? Hjälp oss översätta färdigt till Svenska!", "Teamet bakom CorsixTH söker förstärkning! Vill du koda, översätta eller skapa grafik till spelet? Kontakta oss i forumet, på mejllistan eller i IRC-kanalen (corsix-th at freenode).", "Om du hittar en bugg, rapportera den gärna i vår bugghanterare på adressen th-issues.corsix.org.", "Varje nivå har vissa krav som ska uppfyllas innan du kan gå vidare till nästa. Kolla statusfönstret för att se hur nära målen du är.", "Om du vill ändra eller ta bort ett existerande rum kan du göra det med hjälp av ändra rum-knappen i panelen längst ner (saxen).", "Om du ur högen av patienter vill ta reda på vilka som köar till ett visst rum är det bara att föra muspekaren över rummet.", "Klicka på dörren till ett rum för att se kön till det. Sedan går det att genomföra finlir som att ändra ordning eller skicka en patient till ett annat likadant rum.", "Olycklig personal frågar efter löneökning ofta. Se till att de jobbar i en behaglig miljö så händer det inte.", "Patienter blir törstiga när de väntar på sin tur, ännu mer om du sätter upp värmen! Sätt ut läskautomater på strategiska platser för lite extra inkomst.", "Det går att avbryta diagnosprocessen för en patient i förtid och gissa behandling om sjukdomen är känd. Notera att detta ökar risken för felbehandling - och dödsfall.", "Akutfall kan vara ett smidigt sätt att få in lite extra stålar, såvida du har kapacitet att hantera alla patienter i tid vill säga.", }, previous = "Föregående tips", next = "Nästa tips", } tooltip.totd_window = { previous = "Visa föregående tips", next = "Visa nästa tips", } debug_patient_window = { caption = "Debug Patient", } cheats_window = { caption = "Fusk", warning = "Varning: Du kommer inte att få bonuspoäng på slutet av nivån om du fuskar!", cheated = { no = "Har fuskat: Nej", yes = "Har fuskat: Ja", }, cheats = { money = "Pengar", all_research = "All forskning", emergency = "Skapa akutfall", vip = "Skapa VIP", earthquake = "Skapa jordbävning", epidemic = "Skapa en smittande patient", toggle_infected = "Visa infekterad-ikonen", create_patient = "Skapa patient", end_month = "Månadsslut", end_year = "Hoppa till nyår", lose_level = "Förlora nivå", win_level = "Vinn nivå", increase_prices = "Öka priser", decrease_prices = "Minska priser", }, close = "Stäng", } tooltip.cheats_window = { close = "Stäng fuskfönstret", cheats = { money = "Ökar din balans med 10 000.", all_research = "Färdigställer all forskning.", emergency = "Skapar ett akutfall.", vip = "Skapar en Mycket Viktig Person (VIP)", earthquake = "Skapar en jordbävning med slumpad styrka", epidemic = "Skapar en person som smittar så att en epidemi kan starta", toggle_infected = "Växlar mellan att visa ikoner vid en upptäckt, aktiv epidemi", create_patient = "Skapar en patient vid kanten av kartan.", end_month = "Hoppar till slutet av månaden.", end_year = "Hoppar till slutet av året.", lose_level = "Förlora nuvarande nivå.", win_level = "Vinn nuvarande nivå.", increase_prices = "Öka alla priser med 50% (max. 200%)", decrease_prices = "Minska alla priser med 50% (min. 50%)", } } introduction_texts = { demo = "Välkommen till demosjukhuset!//" .. "Tyvärr innehåller demon bara denna nivå. Ändå finns det garanterat tillräckligt att göra ett tag framöver! " .. "Du kommer att råka ut för diverse sjukdomar som kräver olika rum för att botas. " .. "Ibland kan olyckor hända, så att det kommer akutfall till sjukhuset. Dessutom behöver du forska för att upptäcka fler rum. " .. "Målet är att tjäna $100,000, ha ett sjukhusvärde av $70,000 och 700 i anseende, samtidigt som du botar minst 75% av patienterna. " .. "Se till att ditt anseende inte sjunker under 300 och att du inte dödar mer än 40% av dina patienter, annars förlorar du.//" .. "Lycka till!", } calls_dispatcher = { -- Dispatcher description message. Visible in Calls Dispatcher dialog summary = "%d anrop; %d tilldelade", staff = "%s - %s", watering = "Vattnar @ %d,%d", repair = "Reparera %s", close = "Stäng", } tooltip.calls_dispatcher = { task = "Lista över uppgifter - klicka på en uppgift för att öppna tilldelad personals fönster och flytta vyn till det ställe där uppgiften finns.", assigned = "Denna ruta är markerad om någon har fått uppgiften tilldelad till sig.", close = "Stäng anropsklarerardialogen", } update_window = { caption = "Updatering tillgänglig!", new_version = "Ny version:", current_version = "Din version:", download = "Gå till nedladdningssidan", ignore = "Skippa och gå till huvudmenyn", } tooltip.update_window = { download = "gå till nedladdningssidan där du hittar den absolut senaste versionen av CorsixTH", ignore = "Skippa updateringen just nu. Du kommer att få en ny notis nästa gång du öppnar CorsixTH", } map_editor_window = { pages = { inside = "Inomhus", outside = "Utomhus", foliage = "Grönska", hedgerow = "Häck", pond = "Damm", road = "Väg", north_wall = "Nordlig vägg", west_wall = "Västlig vägg", helipad = "Helikopterplatta", delete_wall = "Ta bort väggar", parcel_0 = "Tomt 0", parcel_1 = "Tomt 1", parcel_2 = "Tomt 2", parcel_3 = "Tomt 3", parcel_4 = "Tomt 4", parcel_5 = "Tomt 5", parcel_6 = "Tomt 6", parcel_7 = "Tomt 7", parcel_8 = "Tomt 8", parcel_9 = "Tomt 9", camera_1 = "Kamera 1", camera_2 = "Kamera 2", camera_3 = "Kamera 3", camera_4 = "Kamera 4", heliport_1 = "Heliport 1", heliport_2 = "Heliport 2", heliport_3 = "Heliport 3", heliport_4 = "Heliport 4", paste = "Klistra in", } } date_format.daymonth = "%1% %2:months%" original_credits[301] = ":Operations" original_credits[302] = "," original_credits[303] = "Steve Fitton" original_credits[304] = " " original_credits[305] = " " original_credits[306] = " " original_credits[307] = ":Company Administration" original_credits[308] = "," original_credits[309] = "Audrey Adams" original_credits[310] = "Annette Dabb" original_credits[311] = "Emma Gibbs" original_credits[312] = "Lucia Gobbo" original_credits[313] = "Jo Goodwin" original_credits[314] = "Sian Jones" original_credits[315] = "Kathy McEntee" original_credits[316] = "Louise Ratcliffe" original_credits[317] = " " original_credits[318] = " " original_credits[319] = " " original_credits[320] = ":Company Management" original_credits[321] = "," original_credits[322] = "Les Edgar" original_credits[323] = "Peter Molyneux" original_credits[324] = "David Byrne" original_credits[325] = " " original_credits[326] = " " original_credits[327] = ":All at Bullfrog Productions" original_credits[328] = " " original_credits[329] = " " original_credits[330] = " " original_credits[331] = ":Special Thanks to" original_credits[332] = "," original_credits[333] = "Everyone at Frimley Park Hospital" original_credits[334] = " " original_credits[335] = ":Especially" original_credits[336] = "," original_credits[337] = "Beverley Cannell" original_credits[338] = "Doug Carlisle" original_credits[339] = " " original_credits[340] = " " original_credits[341] = " " original_credits[342] = ":Keep On Thinking" original_credits[343] = " " original_credits[344] = " " original_credits[345] = " " original_credits[346] = " " original_credits[347] = " " original_credits[348] = " " original_credits[349] = " " original_credits[350] = " " original_credits[351] = " " original_credits[352] = " " original_credits[353] = " " original_credits[354] = " " original_credits[355] = " " original_credits[356] = " " original_credits[357] = " " original_credits[358] = " " original_credits[359] = " " original_credits[360] = " " original_credits[361] = "." -------------------------------- UNUSED ----------------------------------- ------------------- (kept for backwards compatibility) ---------------------- options_window.change_resolution = "Ändra upplösning" tooltip.options_window.change_resolution = "Ändra upplösning till de dimensioner ifyllda till vänster" CorsixTH-0.63/CorsixTH/Lua/languages/traditional_chinese.lua000066400000000000000000004115331347163623700240750ustar00rootroot00000000000000--[[ Copyright (c) 2012 lwglwsss 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. --]] -- Note: This file contains UTF-8 text. Make sure your editor is set to UTF-8. Font("unicode") Language("繁體中文", "Chinese (traditional)", "zh(t)", "chi(t)", "zho(t)") Inherit("english") Encoding(utf8) ------------------------------------ --NEW STRINGS IN LANGUAGE "繁體中文": ------------------------------------ date_format = { daymonth = "%2%月 %1%日", } misc = { no_heliport = "Either no diseases have been discovered yet, or there is no heliport on this map.", not_yet_implemented = "(尚未實現)", } debug_patient_window = { caption = "Debug Patient", } totd_window = { previous = "上一個提示", tips = { [1] = "Every hospital needs a reception desk and a GP's office to get going. After that, it depends on what kind of patients are visiting your hospital. A pharmacy is always a good choice, though.", [2] = "Machines such as the Inflation need maintenance. Employ a handyman or two to repair your machines, or you'll risk your staff and patients getting hurt.", [3] = "After a while, your staff will get tired. Be sure to build a staff room, so they can relax.", [4] = "Place enough radiators to keep your staff and patients warm, or they will become unhappy. Use the town map to locate any spots in your hospital that need more heating.", [5] = "A doctor's skill level greatly influences the quality and speed of his diagnoses. Place a skilled doctor in your GP's office, and you won't need as many additional diagnosis rooms.", [6] = "Juniors and doctors can improve their skills by learning from a consultant in the training room. If the consultant has a special qualification (surgeon, psychiatrist or researcher), he will also pass on this knowledge to his pupil(s).", [7] = "Did you try to enter the European emergency number (112) into the fax machine? Make sure your sound is on!", [8] = "You can adjust some settings such as the resolution and language in the options window found both in the main menu and ingame.", [9] = "You selected a language other than English, but there's English text all over the place? Help us by translating missing texts into your language!", [10] = "The CorsixTH team is looking for reinforcements! Are you interested in coding, translating or creating graphics for CorsixTH? Contact us at our Forum, Mailing List or IRC Channel (corsix-th at freenode).", [11] = "If you find a bug, please report it at our bugtracker: th-issues.corsix.org", [12] = "Each level has certain requirements to fulfill before you can move on to the next one. Check the status window to see your progression towards the level goals.", [13] = "If you want to edit or remove an existing room, you can do so with the edit room button found in the bottom toolbar.", [14] = "In a horde of waiting patients, you can quickly find out which ones are waiting for a particular room by hovering over that room with your mouse cursor.", [15] = "Click on the door of a room to see its queue. You can do useful fine tuning here, such as reordering the queue or sending a patient to another room.", [16] = "Unhappy staff will ask for salary rises frequently. Make sure your staff is working in a comfortable environment to keep that from happening.", [17] = "Patients will get thirsty while waiting in your hospital, even more so if you turn up the heating! Place vending machines in strategic positions for some extra income.", [18] = "You can abort the diagnosis progress for a patient prematurely and guess the cure, if you already encountered the disease. Beware that this may increase the risk of a wrong cure, resulting in death for the patient.", [19] = "Emergencies can be a good source for some extra cash, provided that you have enough capacities to handle the emergency patients in time.", }, next = "下一個提示", } tooltip = { totd_window = { previous = "顯示上一個提示", next = "顯示下一個提示", }, message = { button = "Left click to open message", button_dismiss = "Left click to open message, right click to dismiss it", }, custom_game_window = { start_game_with_name = "%s", }, cheats_window = { close = "Close the cheats dialog", cheats = { end_month = "Jumps to the end of the month.", emergency = "Creates an emergency.", win_level = "Win the current level.", create_patient = "Creates a Patient at the map border.", money = "Adds 10.000 to your bank balance.", lose_level = "Lose the current level.", all_research = "Completes all research.", end_year = "Jumps to the end of the year.", }, }, casebook = { cure_requirement = { hire_staff = "您需要雇傭人員來治療該疾病", }, cure_type = { unknown = "您還不知道如何治療該疾病", }, }, main_menu = { exit = "退出", custom_level = "自訂遊戲", options = "選項", }, menu_list_window = { back = "返回", }, new_game_window = { hard = "遊戲難度:困難", cancel = "返回", tutorial = "遊戲上手教程", easy = "遊戲難度:簡單", medium = "遊戲難度:中等", }, save_game_window = { new_save_game = "", save_game = "%s", }, calls_dispatcher = { assigned = "This box is marked if someone is assigned to the corresponding task.", task = "List of tasks - click task to open assigned staff's window and scroll to location of task", close = "Close the calls dispatcher dialog", }, research_policy = { research_progress = "Progress towards the next discovery in this category: %1%/%2%", no_research = "No research is being carried out in this category at the moment", }, information = { close = "關閉", }, lua_console = { textbox = "Enter Lua code to run here", execute_code = "Run the code you have entered", close = "Close the console", }, load_game_window = { load_game = "%s", load_autosave = "Load autosave", load_game_number = "Load game %d", }, fax = { close = "關閉此視窗,但不刪除消息", }, objects = { litter = "Litter: Left on the floor by a patient because he did not find a bin to throw it in.", }, options_window = { fullscreen_button = "全螢幕", change_resolution = "更改解析度", height = "垂直像素", width = "水平像素", language = "轉換語言為%s", back = "返回", }, } custom_game_window = { caption = "自訂遊戲", } cheats_window = { cheats = { end_month = "End of Month", emergency = "Create Emergency", win_level = "Win Level", create_patient = "Create Patient", money = "Money Cheat", lose_level = "Lose Level", all_research = "All Research Cheat", end_year = "End of Year", }, close = "Close", caption = "Cheats", cheated = { no = "Cheats used: No", yes = "Cheats used: Yes", }, warning = "Warning: You will not get any bonus points at the end of the level if you cheat!", } errors = { unavailable_screen_size = "The screen size you requested is not available in fullscreen mode.", dialog_missing_graphics = "Sorry, the demo data files don't contain this dialog.", maximum_screen_size = "Please enter a screen size of at most 3000x2000.", load_prefix = "Error while loading game: ", save_prefix = "Error while saving game: ", map_file_missing = "Could not find the map file %s for this level!", minimum_screen_size = "Please enter a screen size of at least 640x480.", } main_menu = { exit = "退出", custom_level = "自訂遊戲", new_game = "開始遊戲", load_game = "裝載遊戲", options = "選項", } menu_debug = { lua_console = " (%1%) LUA CONSOLE ", disable_salary_raise = " DISABLE SALARY RAISE ", make_debug_fax = " MAKE DEBUG FAX ", make_debug_patient = " MAKE DEBUG PATIENT ", sprite_viewer = " SPRITE VIEWER ", dump_strings = " (%1%) DUMP STRINGS ", map_overlay = " MAP OVERLAY ", calls_dispatcher = " CALLS DISPATCHER ", cheats = " (%1%) CHEATS ", dump_gamelog = " (%1%) DUMP GAME LOG ", limit_camera = " LIMIT CAMERA ", transparent_walls = " (%1%) TRANSPARENT WALLS ", jump_to_level = " JUMP TO LEVEL ", } menu_options = { edge_scrolling = " 開啟滑鼠捲動", lock_windows = " 鎖定視窗", settings = " 選項", } menu_options_game_speed = { pause = " (%1%) 暫停", } lua_console = { execute_code = "Execute", close = "Close", } install = { title = "--------------------------------- CorsixTH 遊戲設定 ---------------------------------", th_directory = "運行游戲需要原版杏林也瘋狂。請指定原版杏林也瘋狂游戲安裝資料夾。", } load_game_window = { caption = "裝載遊戲", } adviser = { cheats = { th_cheat = "Congratulations, you have unlocked cheats!", hairyitis_cheat = "Hairyitis cheat activated!", roujin_on_cheat = "Roujin's challenge activated! Good luck...", crazy_on_cheat = "Oh no! All doctors have gone crazy!", bloaty_off_cheat = "Bloaty Head cheat deactivated.", bloaty_cheat = "Bloaty Head cheat activated!", crazy_off_cheat = "Phew... the doctors regained their sanity.", roujin_off_cheat = "Roujin's challenge deactivated.", hairyitis_off_cheat = "Hairyitis cheat deactivated.", }, room_forbidden_non_reachable_parts = "Placing the room in this location would result in parts of the hospital not being reachable.", } calls_dispatcher = { repair = "Repair %s", summary = "%d calls; %d assigned", close = "Close", watering = "Watering @ %d,%d", staff = "%s - %s", } information = { level_lost = { [1] = "您失敗了!遊戲結束。", [2] = "由於:", reputation = "聲望低於%d。", balance = "銀行帳戶資金低於%d。", percentage_killed = "殺死了%d的病人。", }, cannot_restart = "Unfortunately this custom game was saved before the restart feature was implemented.", custom_game = "Welcome to CorsixTH. Have fun with this custom map!", } new_game_window = { hard = "專家(難)", cancel = "返回", tutorial = "第一次遊戲", easy = "實習醫生(容易)", medium = "醫生(一般)", } options_window = { fullscreen = "全螢幕", height = "", width = "", change_resolution = "更改解析度", back = "返回", } menu_list_window = { back = "返回", } save_game_window = { caption = "保存遊戲", new_save_game = "", } fax = { choices = { decline_new_level = "繼續經營這個醫院", accept_new_level = "接手下一個醫院", return_to_main_menu = "返回到主選單", }, } menu_debug_overlay = { heat = " TEMPERATURE ", byte_0_1 = " BYTE 0 & 1 ", byte_6 = " BYTE 6 ", flags = " FLAGS ", byte_7 = " BYTE 7 ", byte_5 = " BYTE 5 ", byte_floor = " BYTE FLOOR ", positions = " POSITIONS ", byte_w_wall = " BYTE W WALL ", parcel = " PARCEL ", byte_n_wall = " BYTE N WALL ", none = " NONE ", } confirmation = { abort_edit_room = "You are currently building or editing a room. If all required objects are placed it will be finished, but otherwise it will be deleted. Continue?", needs_restart = "Changing this setting requires CorsixTH to restart. Any unsaved progress will be lost. Are you sure you want to do this?", } dynamic_info = { patient = { actions = { no_gp_available = "您需要建造一般診斷室", }, }, staff = { actions = { fired = "已解雇", heading_for = "前往%s", }, }, } introduction_texts = { demo = "Welcome to the demo hospital!//" .. "Unfortunately the demo version only contains this level. However, there is more than enough to do here to keep you busy for a while! " .. "You will encounter various diseases that require different rooms to cure. From time to time, emergencies may occur. And you will need to research additional rooms using a research room. " .. "Your goal is to earn $100,000, have a hospital value of $70,000 and a reputation of 700, while having cured at least 75% of your patients." .. "Make sure your reputation does not fall below 300 and that you don't kill off more than 40% of your patients, or you will lose.//" .. "Good luck!", } object = { litter = "Litter", } letter = { custom_level_completed = "Well done! You've completed all goals on this custom level!", dear_player = "Dear %s", return_to_main_menu = "Would you like to return to the main menu or continue playing?", } tooltip.custom_game_window.free_build = "Tick this box if you want to play without money or winning and losing conditions" tooltip.cheats_window.cheats.vip = "Creates a VIP." tooltip.menu_list_window.save_date = "Click here to sort the list by last modification date" tooltip.menu_list_window.name = "Click here to sort the list by name" tooltip.options_window.original_path = "The currently chosen directory of the original Theme Hospital installation" tooltip.options_window.browse = "Browse for another location of a Theme Hospital installation. %1%" custom_game_window.free_build = "Free Build" cheats_window.cheats.vip = "Create VIP" main_menu.version = "Version: " main_menu.savegame_version = "Savegame version: " progress_report.free_build = "FREE BUILD" menu_options.adviser_disabled = " (%1%) 顯示助手" install.exit = "Exit" adviser.warnings.falling_2 = "Stop messing about, how would you like it?" adviser.warnings.no_desk_2 = "Well done, that must be a world record: nearly a year and no patients! If you want to continue as Manager of this hospital, you will need to hire a receptionist and build a reception desk for her to work from!" adviser.warnings.falling_5 = "This is not the place for knocking people over, they're ill you know!" adviser.warnings.falling_4 = "This is an Hospital, not a Theme Park!" adviser.warnings.falling_6 = "This is not a bowling alley, sick people should not be treated like that!" adviser.warnings.falling_3 = "Ouch, that had to hurt, someone call a Doctor!" adviser.warnings.no_desk_3 = "That's just brilliant, nearly a year and you don't have a staffed reception! How do you expect to get any patients, now get it sorted out and stop messing around!" adviser.warnings.cannot_afford = "You don't have enough money in the bank to hire that person!" adviser.warnings.no_desk = "You should build a reception desk and hire a receptionist at some point!" adviser.warnings.no_desk_1 = "If you want patients to come to your hospital, you will need to hire a receptionist and build her a desk to work at!" adviser.warnings.falling_1 = "Hey! that is not funny, watch where you click that mouse; someone could get hurt!" information.very_old_save = "There have been a lot of updates to the game since you started this level. To be sure that all features work as intended please consider restarting it." options_window.cancel = "取消" options_window.browse = "瀏覽..." options_window.new_th_directory = "Here you can specify a new Theme Hospital installation directory. As soon as you choose the new directory the game will be restarted." menu_list_window.save_date = "修改日期" menu_list_window.name = "名稱" fax.vip_visit_result.remarks.free_build[1] = "It is a very nice hospital you have there! Not very hard to get it working without money limitations though, eh?" fax.vip_visit_result.remarks.free_build[2] = "I'm no economist, but I think I could run this hospital too if you know what I mean..." fax.vip_visit_result.remarks.free_build[3] = "A very well run hospital. Watch out for the recession though! Right... you didn't have to worry about that." fax.emergency.free_build = "If you are successful your reputation will increase but if you fail your reputation will be seriously dented." fax.emergency.num_disease_singular = "There is 1 person with %s and they require immediate attention." ------------------------------------ --OLD STRINGS IN LANGUAGE "繁體中文": ------------------------------------ misc = { hospital_open = "醫院開門", save_success = "遊戲存檔成功", save_failed = "錯誤:無法存檔", low_res = "低解析度", grade_adverb = { extremely = "極端的", mildly = "柔和的", moderately = "適當的", }, send_message = "向玩家%d發送信息", out_of_sync = "遊戲失去同步", balance = "難度選擇:", load_failed = "存檔遊戲沒有被讀取", mouse = "老鼠", done = "完成", force = "力量", pause = "暫停", send_message_all = "向所有玩家發送信息", } staff_list = { morale = "士氣", tiredness = "疲勞程度", skill = "技能", total_wages = "工資總額", } research = { allocated_amount = "已分配量", funds_allocation = "資金配置", categories = { improvements = "改良", drugs = "藥品研究", diagnosis = "診斷儀器", cure = "治療儀器", specialisation = "專項", }, } queue_window = { num_in_queue = "隊伍長度", num_entered = "造訪者人數", max_queue_size = "最大長度", num_expected = "預期", } staff_class = { doctor = "醫生", handyman = "清潔工人", receptionist = "接待員", nurse = "護士", surgeon = "外科醫生", } tooltip = { hire_staff_window = { prev_person = "查看前一個人", cancel = "取消", psychiatrist = "精神病醫生", salary = "月薪", next_person = "查看後一個人", nurses = "查看可雇用的護士", surgeon = "外科醫生", handymen = "查看可雇用的清潔工人", doctors = "查看可雇用的醫生", doctor_seniority = "醫生資歷(實習醫生,醫生,專家)", hire = "雇用", researcher = "科研人員", qualifications = "醫生的特殊技能", receptionists = "查看可雇用的接待員", staff_ability = "員工能力", }, handyman_window = { close = "取消請求", ability = "能力", face = "清潔工的面孔", prio_machines = "提高清潔工維修機器的優先級", prio_litter = "提高清潔工清除垃圾的優先級", happiness = "快樂程度", prio_plants = "提高清潔工給盆栽澆水的優先級", name = "清潔工的名字", tiredness = "疲勞程度", center_view = "切換到當前人物", salary = "工資", sack = "解雇", pick_up = "拾起", }, staff_list = { ability_2 = "員工的能力水準", next_person = "下一頁", detail = "細心程度", happiness = "顯示員工滿意程度", researcher_train = "已經接受了%d%%的研究技能培訓", handymen = "查看醫院中被雇用清潔工人名單", tiredness = "顯示員工疲勞程度", researcher = "合格研究人員", happiness_2 = "員工士氣", pay_rise = "提高員工工資10%", bonus = "付給該員工10%獎金", prev_person = "上一頁", nurses = "查看醫院中被雇用護士名單", psychiatrist = "合格精神病醫生", salary = "該員工當前工資", ability = "顯示員工能力水準", close = "退出並返回遊戲", sack = "解雇員工", surgeon = "合格外科醫生", tiredness_2 = "員工的疲勞程度", doctors = "查看醫院中被雇用醫生名單", doctor_seniority = "醫生資歷", view_staff = "查看員工工作情況", surgeon_train = "已經接受了%d%%的外科培訓", skills = "特殊技能", receptionists = "查看醫院中被雇用接待員名單", psychiatrist_train = "已經接受了%d%%的精神病治療培訓", }, research = { cure_inc = "提高科研百分比", close = "關閉研究畫面", specialisation_dec = "降低專門研究百分比", diagnosis_dec = "降低科研百分比", allocated_amount = "已分配預算", improvements_inc = "提高改良研究百分比", drugs_dec = "降低藥品研究百分比", drugs_inc = "提高藥品研究百分比", cure_dec = "降低療效研究百分比", specialisation_inc = "提高專門研究百分比", improvements_dec = "降低改良研究百分比", diagnosis_inc = "提高儀器研究百分比", }, machine_window = { repair = "呼叫清潔工維修機器", name = "名字", close = "關閉", times_used = "機器被使用次數", status = "機器狀況", replace = "改良機器", }, place_objects_window = { confirm = "確認", cancel = "取消", pick_up = "拾起物品", buy_sell = "買/賣物品", }, status = { percentage_cured = "您需要治療%d%%前來就診的病人。當前您已經治療了%d%%", thirst = "醫院中所有人的總體口渴程度", close = "關閉總覽畫面", population_chart = "圖表顯示每個醫院對當地居民的吸引程度", win_progress_own = "顯示當前進展情況", reputation = "您的聲望必須至少有%d。當前值為%d", population = "您至少需要總人口的%d%%來訪問您的醫院", warmth = "醫院中所有人的總體溫暖程度", percentage_killed = "任務要求最多只能殺死%d%%的就診病人。到目前為止,您已經殺死了%d%%的病人。", balance = "您的現金必須至少有$%d。當前值為$%d", value = "您的醫院價值必須至少有$%d。當前值為$%d", win_progress_other = "顯示當前%s方面的進展情況", num_cured = "您的目標是治癒%d個病人。現在您已經治癒%d個", happiness = "醫院中所有人的總體快樂程度", }, queue_window = { end_of_queue = "拖動一位病人到該按鈕處,將使其移動到隊尾", num_entered = "到目前為止該房間已處理病人數目", close = "關閉面板", num_in_queue = "排隊等候的病人數目", num_expected = "即將加入隊伍的病人數目", front_of_queue = "拖動一位病人到該按鈕處,將使其移動到隊首", dec_queue_size = "減少隊伍的最大長度", max_queue_size = "接待員允許的最大排隊人數", inc_queue_size = "增加隊伍的最大長度", patient = "拖動病人將改變其排隊位置。右擊某個病人可以選擇將其遣送回家或遣送到競爭對手的醫院。", patient_dropdown = { send_home = "讓病人離開醫院", hospital_2 = "將病人送到其它醫院", reception = "將病人送到接待員處", hospital_1 = "將病人送到其它醫院", hospital_3 = "將病人送到其它醫院", }, }, jukebox = { rewind = "向後", loop = "循環播放", stop = "停止播放", close = "關閉音樂盒", current_title = "音樂盒", play = "播放", fast_forward = "向前", }, graphs = { deaths = "切換死亡人數", close = "關閉圖表畫面", scale = "比例尺", money_out = "切換支出", visitors = "切換訪問人數", wages = "切換工資", balance = "切換現金", money_in = "切換收入", cures = "切換治癒人數", reputation = "切換醫院價值", }, toolbar = { reputation = "聲望", casebook = "治療手冊", edit = "編輯房間/物品", staff_list = "員工管理", policy = "制度", date = "日期", charts = "圖表", objects = "設置走廊", balance = "現金", research = "研究", hire = "雇用員工", status = "狀態", town_map = "城鎮地圖", rooms = "建造房屋", bank_button = "左擊進入銀行經理畫面,右擊進入銀行帳戶", }, pay_rise_window = { accept = "滿足要求", decline = "拒絕-將其解雇", }, town_map = { close = "退出城鎮地圖畫面", plants = "切換盆栽", fire_extinguishers = "切換滅火器", people = "切換人員", balance = "現金", heat_dec = "減少供熱", heating_bill = "供暖費", radiators = "切換暖氣", objects = "切換物品", heat_level = "供熱強度", heat_inc = "增加供熱", }, casebook = { sent_home = "轉走人數", cure_requirement = { hire_staff_old = "您需要雇用一名%s來治療該疾病", possible = "您有能力治療這種疾病", not_possible = "您還沒有能力治療該種疾病", ward_hire_nurse = "您需要一位護士在病房中照料病人", hire_surgeon = "您需要雇用第二位外科醫生來完成手術", research_machine = "您需要研究一些儀器來治療這種疾病", build_room = "您需要修建一個房間來治療這種疾病", build_ward = "您需要建造一個病房來治療該疾病", hire_surgeons = "您需要雇用兩名外科醫生完成手術", }, increase = "增加", up = "向上滾動", reputation = "治療或診斷聲望", research = "點擊這裡可以為治療使用專門研究預算", close = "關閉治療手冊", earned_money = "總收入", cure_type = { psychiatrist = "由精神病醫生完成治療工作", drug_percentage = "治療使用藥品-其療效為%d%%", drug = "治療時將使用藥品", machine = "該疾病需要儀器輔助治療", surgery = "該疾病需要手術", }, decrease = "減少", deaths = "死亡人數", cured = "治癒人數", down = "向下滾動", treatment_charge = "花費", }, policy = { diag_termination = "對於一個病人的診斷將一直持續到設定的治療結束百分比,或所有的診斷機器都已經嘗試一遍", close = "關閉制度畫面", staff_leave = "點擊這裡可以讓處於空閒狀態的員工幫助其他員工", diag_procedure = "如果醫生的診斷結果為,治癒機率小於設定的遣送回家百分比,則該病人將被自動遣送回家。如果治癒機率大於設定的嘗試治療百分比,則該病人將被自動送去進行治療", staff_rest = "員工休息時的最低疲勞程度", staff_stay = "點擊這裡可以使所有員工停留在設定的房間內", }, bank_manager = { graph = "顯示%s支付曲線", close = "關閉銀行經理畫面", hospital_value = "醫院當前價值", graph_return = "返回上個畫面", current_loan = "當前未償還貸款", borrow_5000 = "向銀行借款$5000", balance = "銀行現金", interest_payment = "每月利息支付", inflation_rate = "年通貨膨脹率", interest_rate = "年利率", repay_5000 = "向銀行償還$5000", show_graph = "顯示%s支付曲線", insurance_owed = "%s欠款的金額", }, main_menu = { network = "開始網路遊戲", quit = "退出", continue = "繼續遊戲", load_menu = { load_slot = "讀取進度", empty_slot = "空", }, new_game = "開始新遊戲", load_game = "讀入進度", }, patient_window = { graph = "通過點擊可以在健康情況和病歷之間切換", casebook = "查看有關疾病的詳細情況", close = "關閉", queue = "查看隊伍詳細資料", happiness = "快樂程度", warmth = "溫暖程度", center_view = "切換到當前人物", thirst = "口渴程度", send_home = "把病人趕出醫院", abort_diagnosis = "無需診斷直接去治療", }, watch = { emergency = "緊急情況:剩餘時間內儘快治癒所有急救病人。", hospital_opening = "建造計時器:它主要用來指示距離醫院開門的時間多少。直接點擊開門按鈕就可以立即開門迎接客人。", epidemic = "傳染病:剩餘時間內儘快阻止傳染病蔓延。當時間耗盡或一個被傳染病人離開醫院,則衛生巡查員將出現。通過按鈕可以切換預防接種模式開或者關。點擊病人就可以讓護士為其接種。", }, staff_window = { doctor_seniority = "資歷-是實習醫生,醫生還是專家", psychiatrist = "精神病", close = "關閉", ability = "能力", pick_up = "拾起", sack = "解雇", surgeon = "外科", happiness = "快樂程度", salary = "月薪", name = "員工名字", tiredness = "疲勞程度", center_view = "點擊滑鼠右鍵切換人物", skills = "特殊技術", researcher = "研究", face = "面孔-點擊進入管理", }, rooms = { ultrascan = "醫生使用超級掃瞄儀房間診斷病人", research_room = "擁有研究技能的醫生可以在研究部門開發新的藥品和機器。", fracture_clinic = "護士使用骨折診所治療骨折病人", gps_office = "病人在一般診斷室內接受初始診斷", inflation = "醫生使用充氣機房間治療頭部腫脹病人", staffroom = "醫生和護士在員工休息室內可以恢復疲勞", jelly_vat = "醫生使用膠桶診所治療失衡患者", scanner = "醫生使用掃描儀房間診斷病人", decontamination = "醫生使用淨化淋浴裝置可以治療放射病", pharmacy = "護士在藥房為病人配藥治療", cardiogram = "醫生使用心電圖室診斷病人", ward = "病房對於診斷和治療都是非常有用的。病人手術前要在病房中觀察一段時間。病房需要護士", training_room = "專家使用培訓室對其他醫生進行培訓", operating_theatre = "手術中心需要兩名具備外科技能的醫生", psychiatry = "精神病診斷治療室可以治療精神病患者同時也能幫助診斷其他病人,但是需要一位擁有精神病治療技能的醫生", hair_restoration = "醫生使用毛髮恢復房間治療禿頂病人", tongue_clinic = "醫生使用舌頭鬆弛診斷室治療舌頭鬆弛症病人", dna_fixer = "醫生使用DNA恢復裝置房間治療外星人DNA病人", general_diag = "醫生使用高級診斷室為患者進行基本診斷。花費很少但效率很高", toilets = "建造洗手間可以防止病人把醫院弄得一團糟!", electrolysis = "醫生使用電分解房間治療多毛症病人", x_ray = "醫生使用X光房間診斷病人", blood_machine = "醫生使用血液機器房間診斷病人", }, statement = { close = "關閉銀行帳戶畫面", }, buy_objects_window = { confirm = "購買物品", cancel = "取消", increase = "多買一個", total_value = "訂購物品總值", price = "物品價格", decrease = "少買一個", }, window_general = { confirm = "確定", cancel = "取消", }, objects = { chair = "椅子:供病人使用,以討論病情。", sofa = "沙發:擺放在員工休息室中,員工如果沒有更好的放鬆方式,則可以坐在上面恢復疲勞。", operating_table = "30 OB_OP_TABLE", bed2 = "未使用", bench = "長椅:為病人提供一個座位,使其可以比較舒適地等待。", scanner = "14 OB_SCANNER", couch = "18 OB_COUCH", blood_machine = "42 OB_BLOOD_MC", table1 = "桌子(已刪除):擺放大量雜誌,使等待的病人感到快樂。", video_game = "電視遊戲:讓您的員工在遊戲中徹底放鬆。", lamp = "燈:照明用。", op_sink2 = "34 OB_OP_SINK_2", door = "房門:人們出入房間時必需。", auto_autopsy = "驗屍機:對研究新的治療方法有很大幫助。", reception_desk = "服務台:需要一名接待員為病人服務。", hair_restorer = "25 OB_HAIR_RESTORER", projector = "37 OB_PROJECTOR", crash_trolley = "20 OB_CRASH", tv = "電視:使員工不會錯過喜愛的節目。", ultrascanner = "22 OB_ULTRASCAN", surgeon_screen = "35 OB_SURGEON_SCREEN", litter_bomb = "垃圾炸彈:來自對手醫院的破壞活動", inflator = "充氣機:治療頭部腫脹病患者。", table2 = "12 OB_BTABLE", desk = "辦公桌:醫生可以在上面放置電腦。", pool_table = "撞球桌:幫助員工放鬆。", x_ray_viewer = "29 OB_XRAY_VIEWER", radiation_shield = "28 OB_RAD_SHIELD", bed = "床:病情嚴重的病人需要臥床。", swing_door2 = "53 OB_DOUBLE_DOOR2", console = "15 OB_SCANNER_CONSOLE", op_sink1 = "33 OB_OP_SINK_1", bookcase = "書櫃:放置醫生的參考資料。", drinks_machine = "飲料販賣機:為病人止渴,也是收入來源之一。", comfortable_chair = "61 OB_COMFY_CHAIR", skeleton = "骨骼模型:主要用於培訓。", computer = "電腦:關鍵的研究部件。", bin = "垃圾桶:放置垃圾。", pharmacy_cabinet = "藥房:用來保存藥品", radiator = "暖氣:保持醫院內的溫度。", cast_remover = "24 OB_CAST_REMOVE", atom_analyser = "化學混合器:擺放在研究部門中,該機器可以加速全部研究進程。", plant = "盆栽:使病人快樂並淨化空氣。", jelly_moulder = "47 OB_JELLY_VAT", cardio = "13 OB_CARDIO", toilet = "洗手間:提供給病人使用。", electrolyser = "46 OB_ELECTRO", fire_extinguisher = "滅火器:降低治療儀器爆炸所產生的危險。", bed3 = "未使用", swing_door1 = "52 OB_DOUBLE_DOOR1", lecture_chair = "演講座位:接受培訓的醫生坐在上面,收聽無聊的演講。座位擺放得越多,則教室越大。", screen = "16 OB_SCREEN", toilet_sink = "洗手台:講衛生的病人可以在洗手台中洗淨髒手。如果沒有足夠的洗手台,病人將感到不高興。", shower = "54 OB_DECON_SHOWER", gates_of_hell = "48 OB_HELL", entrance_right = "59 OB_ENT_RDOOR", entrance_left = "58 OB_ENT_LDOOR", slicer = "26 OB_SLICER", dna_fixer = "23 OB_DNA_FIXER", x_ray = "27 OB_XRAY", cabinet = "文件櫃:包含了病人文件,備忘錄以及研究檔案。", }, build_room_window = { cost = "當前被選擇房間價格", room_classes = { treatment = "選擇處理類房間", diagnosis = "選擇診斷類房間", facilities = "選擇附屬類房間", clinic = "選擇治療類房間", }, close = "取消並返回遊戲", }, } menu_charts = { briefing = " 任務簡報", casebook = " (%1%) 治療手冊", graphs = " (%1%) 圖表", policy = " (%1%) 制度", bank_manager = " (%1%) 銀行經理", statement = " (%1%) 銀行帳戶", staff_listing = " (%1%) 員工列表", research = " (%1%) 研究", status = " (%1%) 狀態", } town_map = { number = "地區編號", not_for_sale = "非擁有的", chat = "城鎮細節", price = "地區售價", for_sale = "出售", owner = "地區所有", area = "地區面積", } vip_names = { [1] = "偉大的查普頓市長", [2] = "南丁格爾", [3] = "來自荷蘭的伯那德國王", [4] = "緬甸民主黨領袖:翁山蘇姬", [5] = "克朗伯先生", [6] = "比利先生", [7] = "克勞福議員", [8] = "羅尼", [9] = "一個超級聯賽球星", [10] = "拉裡普羅斯特", health_minister = "衛生署部長", } room_descriptions = { ultrascan = { [1] = "超級掃瞄儀//", [2] = "超級掃瞄儀是診斷類儀器中最重要的。它雖然花費驚人,但效果卓著,可以使醫院對病人的診斷達到完美。//", [3] = "超級掃瞄儀需要醫生。它也需要維護。", }, gp = { [1] = "一般診斷室//", [2] = "這是您的醫院中一個基本診斷房間。就診病人將到這裡來檢查病因。隨後再決定是做進一步的診斷還是立即治療。如果一間普通診斷室不夠用,則您可以再建造另一間。房間越大,則可以在裡面擺放更多的特殊物品,從而使醫生的威信越高。這對於其它房間也是一樣的。//", [3] = "一般診斷室需要一名醫生。", }, fracture_clinic = { [1] = "骨折診所//", [2] = "骨折患者將到這裡來接受治療。石膏剝離裝置將使用高能雷射將堅硬的石膏切開,而病人只需忍受很小的痛苦。//", [3] = "骨折診所需要一名護士。它也需要日常維護。", }, tv_room = { [1] = "電視房間沒有使用", }, inflation = { [1] = "充氣機診所//", [2] = "患有頭部腫脹症的病人需要在充氣機診所接受治療,病人膨脹的頭蓋骨將被去掉,並對腦袋重新充氣到正常大小。//", [3] = "充氣機診所需要醫生。它也需要清潔工人的維護。", }, jelly_vat = { [1] = "膠桶診所//", [2] = "對於患有失衡症的患者需要到膠桶診所接受治療,在這裡將被放入膠桶中。該治療方法的原理醫學界目前還無法完全理解。//", [3] = "膠桶診所需要醫生。它也需要清潔工維護機器。", }, scanner = { [1] = "掃描儀//", [2] = "通過掃描儀病人得到確診。隨後他們就可以到一般診斷室接受進一步的治療指示。//", [3] = "掃描儀需要醫生。它也同樣需要維護。", }, blood_machine = { [1] = "血液機器//", [2] = "血液機器也是一種診斷用儀器,通過它可以檢查病人的血液細胞,從而找出病人的病因。//", [3] = "血液機器需要醫生。它也需要維護。", }, pharmacy = { [1] = "藥房//", [2] = "被診斷且需要接受藥物治療的病人一定要到藥房去抓藥。當越來越多的藥品被研製出來。該房間也將變得越來越繁忙。這時就需要再建造一間藥房。//", [3] = "藥房需要一名護士。", }, cardiogram = { [1] = "心電圖儀//", [2] = "病人在這裡被診斷檢查,隨後再到一般診斷室接受治療提示。//", [3] = "心電圖儀需要醫生。當然它也需要維護。", }, ward = { [1] = "病房//", [2] = "病人在病房中停留一段時間,以便護士進行觀察。隨後再做手術。//", [3] = "病房需要一名護士。", }, psych = { [1] = "精神病診斷治療室//", [2] = "被診斷為精神有問題的病人必須到精神病診斷治療室中接受治療。精神病醫生可以對病人進行診斷,發現其病因,且如果確實是心理問題,將使用長沙發椅對其進行治療。//", [3] = "精神病診斷治療室需要一名具有精神病治療技能的醫生。", }, staff_room = { [1] = "員工休息室//", [2] = "您的員工感覺疲勞時,需要房間來放鬆緊張的神經,從而恢復疲勞。處於極度疲勞的員工效率很低,並不時要求加薪,甚至不辭而別。他們還會常常犯錯誤。建造一個員工休息室,並在裡面盡可能擺放多一點物品,這是十分值得的。請確認該房間可以同時使多名員工得到休息。", }, operating_theatre = { [1] = "手術中心//", [2] = "它可以提供非常重要的治療手段。手術中心必須要有足夠的尺寸,必須配置適當的儀器設備。它將是醫院中最重要的部門。//", [3] = "手術中心需要兩名擁有外科技能的醫生。", }, training = { [1] = "培訓室//", [2] = "您的實習醫生和醫生在該房間內可以得到特殊技能的培訓。擁有外科,研究或精神病技能的專家將把自己的經驗傳授給接受培訓的醫生。對於已擁有這些技能的醫生,他們的能力將大幅提高。//", [3] = "培訓室需要一名專家。", }, dna_fixer = { [1] = "DNA診所//", [2] = "這些有外星人DNA的病人必須在這裡恢復其原有的DNA。DNA修復裝置是最複雜的儀器,因此一定要在其房間內擺放一個滅火器,以防萬一。//", [3] = "這台DNA修復裝置需要清潔工不時維護。它也需要一名具有研究能力的醫生才能夠正常工作。", }, research = { [1] = "研究室//", [2] = "在研究室可以研製新的藥品和治療方法,並對各種儀器進行改進提高。這是醫院中的一個重要部門,並對提高醫院的治癒率產生絕對影響。//", [3] = "研究室需要一名擁有研究技能的醫生。", }, hair_restoration = { [1] = "毛髮恢復診所//", [2] = "對於身患禿頂的病人將被送到該毛髮恢復診所,使用其中的毛髮恢復裝置進行治療。需要一名醫生操作機器,且該機器將很快地使病人的腦袋長滿頭髮。//", [3] = "毛髮恢復診所需要醫生。它也需要維護。", }, general_diag = { [1] = "高級診斷室//", [2] = "需要進一步診斷的病人將被送到這裡。如果一般診斷室無法發現病人的病因,高級診斷室將有可能找出。診斷結束後,他們將返回一般診斷室分析結果。//", [3] = "高級診斷室需要醫生。", }, electrolysis = { [1] = "電分解房間//", [2] = "多毛症患者將到該房間接受電分解機器的治療,該機器將猛拉毛髮並使用一種混合物填充毛孔。//", [3] = "電分解房間需要醫生。它也需要清潔工進行維護。", }, slack_tongue = { [1] = "舌頭鬆弛治療診所//", [2] = "在普通診斷室中被診斷為舌頭鬆弛的病人將被送到該診所接受治療。醫生將使用一種高科技的儀器使舌頭伸直並切掉多餘部分,從而使病人恢復正常。//", [3] = "舌頭鬆弛診所需要醫生。它也需要日常維護。", }, toilets = { [1] = "洗手間//", [2] = "當病人感到需要上廁所時就需要洗手間這類設施。如果您希望洗手間多一些造訪者,可以在其中多擺放洗手台和馬桶請考慮在醫院的其它位置也建造一些附屬設施。", }, no_room = { [1] = "", }, x_ray = { [1] = "X光機//", [2] = "X光機可以使用特殊輻射為病人照內部透視照片。它對於醫生診斷病因有很大幫助。//", [3] = "X光機需要醫生。它也需要維護。", }, decontamination = { [1] = "淨化診所//", [2] = "對於被暴露在強放射性的病人需要快速送到淨化診所。該房間包含了一個淋浴器,可以將病人身上的放射能清除乾淨。//", [3] = "淨化淋浴器需要醫生。它也需要清潔工人維護。", }, } bank_manager = { current_loan = "當前貸款", balance = "現金", interest_payment = "應付利息", hospital_value = "醫院價值", interest_rate = "利率", insurance_owed = "保險公司欠款", statistics_page = { balance = "現金", details = "細節", date = "日期", current_balance = "當前現金", money_in = "收入", money_out = "支出", }, inflation_rate = "通貨膨脹率", } menu_display = { high_res = " 陰影 ", } original_credits = { [1] = "", [2] = "", [3] = "", [4] = "", [5] = "", [6] = "", [7] = "", [8] = "", [9] = "", [10] = "", [11] = "", [12] = ":設計製作", [13] = ":牛蛙製造", [14] = "", [15] = ":冥王星開發小組", [16] = ",", [17] = "Mark Webley", [18] = "Gary Carr", [19] = "Matt Chilton", [20] = "Matt Sullivan", [21] = "Jo Rider", [22] = "Rajan Tande", [23] = "Wayne Imlach", [24] = "Andy Bass", [25] = "Jon Rennie", [26] = "Adam Coglan", [27] = "Natalie White", [28] = "", [29] = "", [30] = "", [31] = ":編程", [32] = ",", [33] = "Mark Webley", [34] = "Matt Chilton", [35] = "Matt Sullivan", [36] = "Rajan Tande", [37] = "", [38] = "", [39] = "", [40] = ":美工", [41] = ",", [42] = "Gary Carr", [43] = "Jo Rider", [44] = "Andy Bass", [45] = "Adam Coglan", [46] = "", [47] = "", [48] = "", [49] = ":助理編程", [50] = ",", [51] = "Ben Deane", [52] = "Gary Morgan", [53] = "Jonty Barnes", [54] = "", [55] = "", [56] = "", [57] = ":助理美工", [58] = ",", [59] = "Eoin Rogan", [60] = "George Svarovsky", [61] = "Saurev Sarkar", [62] = "Jason Brown", [63] = "John Kershaw", [64] = "Dee Lee", [65] = "", [66] = "", [67] = "", [68] = ":遊戲介紹", [69] = ",", [70] = "Stuart Black", [71] = "", [72] = "", [73] = "", [74] = ":音樂音效", [75] = ",", [76] = "Russell Shaw", [77] = "Adrian Moore", [78] = "", [79] = "", [80] = "", [81] = ":助理音樂", [82] = ",", [83] = "Jeremy Longley", [84] = "Andy Wood", [85] = "", [86] = "", [87] = "", [88] = ":配音", [89] = ",", [90] = "Rebecca Green", [91] = "", [92] = "", [93] = "", [94] = ":任務設計", [95] = ",", [96] = "Wayne Imlach", [97] = "Natalie White", [98] = "Steven Jarrett", [99] = "Shin Kanaoya", [100] = "", [101] = "", [102] = "", [103] = ":劇本", [104] = ",", [105] = "James Leach", [106] = "Sean Masterson", [107] = "Neil Cook", [108] = "", [109] = "", [110] = "", [111] = ":R&D", [112] = "", [113] = ":圖形引擎", [114] = ",", [115] = "Andy Cakebread", [116] = "Richard Reed", [117] = "", [118] = "", [119] = "", [120] = ":R&D 支持", [121] = ",", [122] = "Glenn Corpes", [123] = "Martin Bell", [124] = "Ian Shaw", [125] = "Jan Svarovsky", [126] = "", [127] = "", [128] = "", [129] = ":函式庫和工具", [130] = "", [131] = "Dos 和Win 95 函式庫", [132] = ",", [133] = "Mark Huntley", [134] = "Alex Peters", [135] = "Rik Heywood", [136] = "", [137] = "", [138] = "", [139] = ":網路函式庫", [140] = ",", [141] = "Ian Shippen", [142] = "Mark Lamport", [143] = "", [144] = "", [145] = "", [146] = ":聲音函式庫", [147] = ",", [148] = "Russell Shaw", [149] = "Tony Cox", [150] = "", [151] = "", [152] = "", [153] = ":安裝程序", [154] = ",", [155] = "Andy Nuttall", [156] = "Tony Cox", [157] = "Andy Cakebread", [158] = "", [159] = "", [160] = "", [161] = ":支持", [162] = ",", [163] = "Peter Molyneux", [164] = "", [165] = "", [166] = "", [167] = ":測試經理", [168] = ",", [169] = "Andy Robson", [170] = "", [171] = "", [172] = "", [173] = ":測試主管", [174] = ",", [175] = "Wayne Imlach", [176] = "Jon Rennie", [177] = "", [178] = "", [179] = "", [180] = ":測試", [181] = ",", [182] = "Jeff Brutus", [183] = "Wayne Frost", [184] = "Steven Lawrie", [185] = "Tristan Paramor", [186] = "Nathan Smethurst", [187] = "", [188] = "Ryan Corkery", [189] = "Simon Doherty", [190] = "James Dormer", [191] = "Martin Gregory", [192] = "Ben Lawley", [193] = "Joel Lewis", [194] = "David Lowe", [195] = "Robert Monczak", [196] = "Dominic Mortoza", [197] = "Karl O'Keeffe", [198] = "Michael Singletary", [199] = "Andrew Skipper", [200] = "Stuart Stephen", [201] = "David Wallington", [202] = "", [203] = "And all our other Work Experience Play Testers", [204] = "", [205] = "", [206] = "", [207] = ":技術支持", [208] = ",", [209] = "Kevin Donkin", [210] = "Mike Burnham", [211] = "Simon Handby", [212] = "", [213] = "", [214] = "", [215] = ":市場", [216] = ",", [217] = "Pete Murphy", [218] = "Sean Ratcliffe", [219] = "", [220] = "", [221] = "", [222] = ":特別感謝", [223] = ",", [224] = "Tamara Burke", [225] = "Annabel Roose", [226] = "Chris Morgan", [227] = "Pete Larsen", [228] = "駱婷婷", [229] = "餘家愷", [230] = "", [231] = ":公關", [232] = ",", [233] = "Cathy Campos", [234] = "", [235] = "", [236] = "", [237] = ":文檔", [238] = ",", [239] = "Mark Casey", [240] = "Richard Johnston", [241] = "James Lenoel", [242] = "Jon Rennie", [243] = "", [244] = "", [245] = "", [246] = ":文檔及包裝盒設計", [247] = ",", [248] = "Caroline Arthur", [249] = "James Nolan", [250] = "餘家愷", [251] = "", [252] = "", [253] = ":中文化產品經理", [254] = ",", [255] = "Carol Aggett", [256] = "餘家愷", [257] = "", [258] = "", [259] = ":本地化工作", [260] = ",", [261] = "Picaper", [262] = "Sonia 'Sam' Yazmadjian", [263] = "駱婷婷", [264] = "Bettina Klos", [265] = "Alexa Kortsch", [266] = "Bianca Normann", [267] = "餘家愷", [268] = "C 。T 。O 。S 。p 。A 。Zola Predosa (BO)", [269] = "Gian Maria Battistini", [270] = "Maria Ziino", [271] = "Gabriele Vegetti", [272] = "", [273] = "Elena Ruiz de Velasco", [274] = "Julio Valladares", [275] = "Ricardo Mart*nez", [276] = "", [277] = "Kia Collin", [278] = "CBG Consult", [279] = "Ulf Thor", [280] = "", [281] = "", [282] = "", [283] = ":生產", [284] = ",", [285] = "Rachel Holman", [286] = "", [287] = "", [288] = "", [289] = ":製片", [290] = ",", [291] = "Mark Webley", [292] = "", [293] = "", [294] = "", [295] = ":聯合制片", [296] = ",", [297] = "Andy Nuttall", [298] = "", [299] = "", [300] = "", [301] = ":運作", [302] = ",", [303] = "Steve Fitton", [304] = "", [305] = "", [306] = "", [307] = ":行政", [308] = ",", [309] = "Audrey Adams", [310] = "Annette Dabb", [311] = "Emma Gibbs", [312] = "Lucia Gobbo", [313] = "Jo Goodwin", [314] = "Sian Jones", [315] = "Kathy McEntee", [316] = "Louise Ratcliffe", [317] = " ", [318] = " ", [319] = " ", [320] = ":公司管理", [321] = ",", [322] = "Les Edgar", [323] = "Peter Molyneux", [324] = "David Byrne", [325] = " ", [326] = " ", [327] = ":All at Bullfrog Productions", [328] = " ", [329] = " ", [330] = " ", [331] = ":特別感謝", [332] = ",", [333] = "弗萊利公園醫院中每個人", [334] = "", [335] = ": 特別是", [336] = ",", [337] = "Beverley Cannell", [338] = "Doug Carlisle", [339] = "", [340] = "", [341] = "", [342] = ":中文版製作", [343] = ",", [344] = "北京飛龍工作室", [345] = "", [346] = "", [347] = "", [348] = ":監製/項目主管", [349] = ",", [350] = "陳國忠/餘家愷", [351] = "", [352] = "", [353] = ":翻譯:駱婷婷 餘家愷", [354] = "", [355] = ":錄音師:藍信剛", [356] = "", [357] = "", [358] = ":配音:夏莉莉", [359] = "", [360] = "", [361] = "", [362] = ":中文版包裝/手冊設計", [363] = ",", [364] = "白季川/餘家愷", [365] = "", [366] = "", [367] = ":生產", [368] = ",", [369] = "餘家愷", [370] = "", [371] = "", [372] = "", [373] = ":測試", [374] = ",", [375] = "駱婷婷", [376] = "", [377] = "", [378] = ":特別感謝", [379] = ",", [380] = "Les Edgar", [381] = "Rajan Tande", [382] = "Steve Fitton", [383] = "Lennox Ong", [384] = "駱婷婷", [385] = "", [386] = "", [387] = "", [388] = "", [389] = "", [390] = "", [391] = "", [392] = "", [393] = "", [394] = "", [395] = "", [396] = "", [397] = ".", } pay_rise = { definite_quit = "不論您做什麼都無法留住我了。", regular = { [1] = "我真的太累了。如果您不希望我辭職的話,請讓我好好休息,並增加工資$%d。", [2] = "我真的太累了。我需要休息,以及增加工資$%d。立即答應,你這個暴君。", [3] = "好吧。我在這裡工作就像一隻狗一樣。給我獎金$%d我就還留在這個醫院裡。", [4] = "我很不快樂。我要求增加工資$%d,使我的工資達到$%d,否則我就不幹了。", [5] = "我的父母告訴我醫學專家的待遇是很高的。因此,請給我加薪$%d,否則我將辭職去做電腦遊戲。", [6] = "我已經受夠了。請調整我的工資到合理程度。我希望加薪$%d。", }, poached = "%s答應給我工資%d。如果您無法達到這個數目,那麼我就要跳槽了。", } menu_debug = { porter_pagers = " PORTER PAGERS ", object_cells = " OBJECT CELLS ", display_pager = " DISPLAY PAGER ", display_big_cells = " DISPLAY BIG CELLS ", mapwho_checking = " MAPWHO CHECKING ", keep_clear_cells = " KEEP CLEAR CELLS ", machine_pagers = " MACHINE PAGERS ", remove_walls = " REMOVE WALLS ", enter_nav_debug = " ENTER NAV DEBUG ", lose_game_anim = { [1] = " LOSE GAME 1 ANIM ", [2] = " LOSE GAME 2 ANIM ", [3] = " LOSE GAME 3 ANIM ", [4] = " LOSE GAME 4 ANIM ", [5] = " LOSE GAME 5 ANIM ", [6] = " LOSE GAME 6 ANIM ", [7] = " LOSE GAME 7 ANIM ", }, show_nav_cells = " SHOW NAV CELLS ", win_game_anim = " WIN GAME ANIM ", display_room_status = " DISPLAY ROOM STATUS ", remove_objects = " REMOVE OBJECTS ", nav_bits = " NAV BITS ", win_level_anim = " WIN LEVEL ANIM ", pixbuf_cells = " PIXBUF CELLS ", show_help_hotspot = " SHOW HELP HOTSPOTS ", entry_cells = " ENTRY CELLS ", plant_pagers = " PLANT PAGERS ", } progress_report = { quite_unhappy = "人們有點不高興。", header = "進展報告", very_unhappy = "人們感到非常不高興。", more_drinks_machines = "多擺放一些飲料販賣機。", too_cold = "太冷了。多擺放一些暖氣。", too_hot = "調節供熱系統。太熱了。", percentage_pop = "% 人口", win_criteria = "視窗標準", } menu_options = { game_speed = " 遊戲速度", sound_vol = " 音效音量", music_vol = " 音樂音量", announcements = " (%1%) 語音", sound = " (%1%) 音效", announcements_vol = " 語音音量", music = " (%1%) 音樂", autosave = " 自動儲存", jukebox = " (%1%) 音樂盒", } menu_options_game_speed = { normal = " (%1%) 正常", slower = " (%1%) 較慢", max_speed = " (%1%) 快速", slowest = " (%1%) 非常慢", and_then_some_more = " (%1%) 極快", } rooms_short = { ultrascan = "超級掃瞄儀", research_room = "研究部門", fracture_clinic = "骨折診所", gps_office = "一般診斷室", destroyed = "已毀壞", staffroom = "員工休息室", jelly_vat = "膠桶診所", scanner = "掃描儀", decontamination = "淨化設備", pharmacy = "藥房", cardiogram = "心電圖儀", reception = "服務台", training_room = "培訓室", corridor_objects = "走廊物品", operating_theatre = "手術中心", dna_fixer = "DNA修復裝置", ward = "病房", psychiatric = "精神病診療室", hair_restoration = "毛髮恢復機器", general_diag = "高級診斷室", inflation = "充氣機", tongue_clinic = "舌頭治療機", toilets = "洗手間", electrolysis = "電分解診所", x_ray = "X光儀器", blood_machine = "血液機器", } level_names = { [1] = "毒氣城", [2] = "昏睡城", [3] = "大柴斯特城", [4] = "福來明頓城", [5] = "新普頓城", [6] = "世界之窗", [7] = "綠池城", [8] = "曼葵城", [9] = "依斯特威爾", [10] = "愛格森海姆城", [11] = "蛙鳴城", [12] = "巴登堡", [13] = "查姆雷城", [14] = "小爪檳城", [15] = "葬禮城", } insurance_companies = { [1] = "天鵝絨有限公司", [2] = "諾福克洋蔥公司", [3] = "雙峰公司", [4] = "刀疤有限公司", [5] = "潛水艇有限公司", [6] = "誠實的泰瑞公司", [7] = "矮胖先生股份有限公司", [8] = "裡昂貓公司", [9] = "普裡邦有限公司", [10] = "快樂保險公司", [11] = "辛迪加保險公司", out_of_business = "無", } staff_descriptions = { good = { [1] = "手腳勤快並努力的員工。", [2] = "很有責任心。非常細心。", [3] = "掌握了很多技術。", [4] = "很友善並愛笑。", [5] = "富有活力。", [6] = "很有禮貌並和藹可親。", [7] = "富有才幹和能力。", [8] = "工作能力極強。", [9] = "意志堅強。", [10] = "微笑著為病人服務。", [11] = "迷人的,有禮貌的並愛幫助別人。", [12] = "專注於工作。", [13] = "本性善良,工作努力。", [14] = "忠實且待人友善。", [15] = "細心並能夠獨立處理緊急事件。", }, misc = { [1] = "打高爾夫球。", [2] = "潛水運動。", [3] = "冰雕。", [4] = "喝葡萄酒。", [5] = "拉力車賽。", [6] = "蹦跳。", [7] = "收集啤酒蓋子。", [8] = "喜歡跳水。", [9] = "喜歡衝浪運動。", [10] = "喜歡游泳。", [11] = "蒸餾威士忌酒。", [12] = "DIY專家。", [13] = "喜歡欣賞法國電影。", [14] = "玩地下城守護者遊戲。", [15] = "擁有HGV執照。", [16] = "摩托車比賽。", [17] = "彈奏古典提琴。", [18] = "訓練營救員。", [19] = "喜歡養狗。", [20] = "聽收音機。", [21] = "經常洗澡。", [22] = "工作指導。", [23] = "種植蔬菜。", [24] = "義務巡警。", [25] = "展覽。", [26] = "收集二次大戰武器。", [27] = "重新擺設家具。", [28] = "聽刺激音樂。", [29] = "殺蟲。", [30] = "喜劇演員。", [31] = "議會調查人員。", [32] = "園藝家。", [33] = "走私假手錶。", [34] = "唱歌。", [35] = "喜歡日間電視。", [36] = "喜歡魚。", [37] = "向觀光者介紹博物館。", }, bad = { [1] = "動作緩慢,且愛煩惱。", [2] = "懶惰。", [3] = "培訓很少且沒有精神。", [4] = "待人粗魯。", [5] = "態度惡劣。", [6] = "耳聾。且身上有一股捲心菜的味道。", [7] = "不用心工作。", [8] = "魯莽而且容易犯錯誤。", [9] = "容易犯錯誤。", [10] = "心理變態。", [11] = "粗心大意。", [12] = "懶散。", [13] = "愚蠢。", [14] = "狡猾且有破壞欲。", [15] = "傲慢自大。", }, } room_classes = { diagnosis = "診斷室", clinics = "診所", facilities = "附屬設施", treatment = "治療室", } place_objects_window = { pick_up_object = "點擊物品可以將其拾起,也可以選擇不同的選項", place_objects_in_corridor = "將物品放在走廊上", place_windows = "請設置一些窗戶,點擊滑鼠表示確定", confirm_or_buy_objects = "您可以確認該房間,或買入或移動其中的一些物品", drag_blueprint = "拉伸藍圖直到您滿意的尺寸", place_door = "設置房門", place_objects = "可以設置並移動這些物品直到滿意為止,隨後再確定", } newspaper = { [1] = { [1] = "醫生震驚四座", [2] = "這醫生扮演玩弄上帝", [3] = "科學狂人的震撼", [4] = "實驗室地板上擺放著什麼?", [5] = "查獲一項危險的研究", }, [2] = { [1] = "酗酒", [2] = "外科醫生酒醉", [3] = "挑剔的顧問", [4] = "外科醫生的酒量", [5] = "外科醫生狂飲失態", [6] = "外科醫生的靈魂", }, [3] = { [1] = "粗魯的醫生", [2] = "醫生臭名遠揚", [3] = "醫生完了", [4] = "貪得無厭的醫生", }, [4] = { [1] = "篡改數據", [2] = "器官買賣犯罪", [3] = "銀行危機", [4] = "調查基金數據", }, [5] = { [1] = "醫學工作者盜墓", [2] = "醫生盜墓", [3] = "醫生盜墓,人贓並獲", [4] = "醫生死期不遠了", [5] = "超級瀆職", [6] = "醫生盜墓", }, [6] = { [1] = "醫生?庸醫!", [2] = "庸醫露出馬腳了", [3] = "令人詛咒的診斷", [4] = "笨蛋專家", }, [7] = { [1] = "醫生真情放縱", [2] = "醫生自我“手術”", [3] = "醫生完了", [4] = "醫生大醜聞", [5] = "醫生搞得一團糟", }, } staff_title = { junior = "實習醫生", psychiatrist = "精神病醫生", consultant = "專家", surgeon = "外科醫生", doctor = "醫生", researcher = "研究員", nurse = "護士", receptionist = "接待員", general = "普通人", } graphs = { deaths = "死亡", money_in = "收入", money_out = "支出", visitors = "造訪者", wages = "工資", balance = "現金", time_spans = { [1] = "1 年", [2] = "12 年", [3] = "48 年", }, cures = "治癒", reputation = "聲望", } adviser = { tutorial = { hire_receptionist = "您也需要一位接待員來接待病人。", build_pharmacy = "恭喜!現在應建造一個藥房並雇用一位護士,使醫院正常運轉。", hire_doctor = "您需要一個醫生來診斷和治療病人。", place_receptionist = "移動接待員並將她放到任意位置。她將很聰明地自己走到服務台。", place_windows = "設置窗戶的方法與設置房門的方法相同。您可以不需要窗戶,但是當您的員工可以從窗戶向外張望時,他們將感到快樂。", confirm_room = "左鍵單擊閃動￿標就可以開業了,也可以通過點擊交叉按鈕返回上一步。", rotate_and_place_reception = "點擊滑鼠右鍵可以旋轉桌子,並用滑鼠左鍵將其放在醫院中合適位置。", build_reception = "你好。首先,您的醫院需要一個服務台,您可以從佈置走廊選單中選取。", doctor_in_invalid_position = "嘿!您不能將醫生放在那裡。", start_tutorial = "閱讀任務簡報,隨後點擊滑鼠左鍵就可以啟動教程。", receptionist_invalid_position = "您不能將接待員放在那裡。", room_too_small_and_invalid = "藍圖尺寸太小了且處於非法位置。", window_in_invalid_position = "該窗口處於非法位置。請嘗試藍圖牆壁上的其它位置。", choose_doctor = "在選擇醫生之前,應重點考慮其能力。", information_window = "協助視窗將告訴您剛剛建造的一般診斷室信息。", build_gps_office = "您必須建造一般診斷室才可以診斷病人。", select_doctors = "點擊閃動的￿標挑選可被雇用的醫生。", select_diagnosis_rooms = "點擊閃動的￿標將彈出診斷類房間列表。", select_receptionists = "使用滑鼠左鍵單擊閃動的￿標來查看當前可選擇的接待員。￿標下方的數字表示共有多少個接待員可供選擇。", order_one_reception = "使用滑鼠左鍵單擊閃動的光條,可以訂購一個服務台。", choose_receptionist = "判斷哪一個接待員擁有好的能力與合適的工資,再按左鍵單擊閃動的￿標來雇用她。", prev_receptionist = "左鍵單擊閃動的￿標將可以瀏覽到前一個可供選擇的接待員。", accept_purchase = "點擊閃動的￿標表示購買。", place_door = "沿藍圖牆壁移動滑鼠,尋找放置房門的合適位置。", click_and_drag_to_build = "建造一般診斷室時應先決定具體的尺寸。點擊並按住滑鼠左鍵可以設置房間尺寸。", room_in_invalid_position = "該藍圖是非法的,紅色區域表示藍圖與其它房間或牆壁重疊。", place_objects = "右擊可以旋轉房屋中的各種物品,再左擊表示確認。", room_too_small = "該房間的藍圖為紅色是因為其尺寸太小了。通過拖動使其尺寸增大。", click_gps_office = "點擊閃動￿標表示選擇一般診斷室。", reception_invalid_position = "如果服務台是灰色的,則表示當前位置是非法的。應嘗試移動或旋轉它。", next_receptionist = "這是接待員列表中的第一個。左鍵單擊閃動的￿標可以瀏覽下一個可供選用的接待員。", room_big_enough = "藍圖尺寸已經足夠大了。當您鬆開滑鼠按鍵表示確認。如果需要的話,以後還可以根據需要移動或改變其尺寸。", object_in_invalid_position = "該物品當前位置非法。請要麼將其放到其它位置,要麼對其進行旋轉。", door_in_invalid_position = "房門設置位置非法。請嘗試藍圖牆壁上的其它位置。", place_doctor = "將醫生放在醫院中的任意位置。他將直奔一般診斷室,為病人診斷。", }, epidemic = { hurry_up = "如果無法立即控制傳染病那麼您的醫院將出大亂子。加油!", serious_warning = "傳染病疫情越來越嚴重。您必須立即行動!", multiple_epidemies = "看來醫院裡同時有不只一種傳染病。這將是一場空前災難,加油!", }, staff_advice = { need_handyman_machines = "如果希望維護醫院內的各種醫療機器,則需要雇用清潔工人。", need_doctors = "您需要更多的醫生。請將最得力的醫生放在排隊等候人數最多的房間內。", need_handyman_plants = "您需要雇用一位清潔工人來為盆栽澆水。", need_handyman_litter = "醫院中出現了垃圾。請雇用一個清潔工人打掃垃圾。", need_nurses = "您需要雇用更多的護士。病房和藥房都需要護士。", too_many_doctors = "您雇用的醫生太多了。其中有一些人現在正閑。", too_many_nurses = "我認為您現在雇用了太多的護士。", }, earthquake = { damage = "地震損壞了醫院中%d台機器,並使%d個人受傷。", alert = "地震警報。在地震過程中,醫院中的機器將受損。如果它們沒有得到及時維護將徹底毀壞。", ended = "我認為這是一個大傢伙-按照芮氏標準為%d。", }, multiplayer = { objective_completed = "您已經完成任務了。恭喜!", everyone_failed = "每個人都沒有完成最終目標。因此每個人都要繼續努力!", players_failed = "下面的玩家沒有完成最終目標:", poaching = { in_progress = "我將讓您瞭解這個人是否願意為您工作。", not_interested = "哈哈!他們對為您工作不感興趣-他們希望找尋自我價值。", already_poached_by_someone = "別想!有人想要挖走這個人。", }, objective_failed = "任務失敗。", }, surgery_requirements = { need_surgeons_ward_op = "您需要雇用兩位外科醫生,並修建一個病房和手術中心,這樣才可以完成外科手術。", need_surgeon_ward = "為了完成外科手術,您還需要雇用一名外科醫生,以及修建一個病房。", }, vomit_wave = { started = "請趕快處理醫院中的嘔吐物,否則嘔吐現象會四處傳播。也許您需要多雇用幾個清潔工人。", ended = "嗨!嘔吐現象已被控制。今後一定要保持醫院的清潔。", }, level_progress = { halfway_lost = "您距離失敗還差一半。", dont_kill_more_patients = "您實際上無力支付太多的醫療事故賠款!", another_patient_killed = "哦,不!您已經殺死了一個病人。這已經是第%d個了。", halfway_won = "您距離勝利還差一半。", close_to_win_increase_value = "您距離勝利只有一步之遙了。再增加醫院價值%d。", financial_criteria_met = "您已經完成了本任務要求達到的財政目標。現在請保持現金在%d以上,使我們確信您的醫院運行良好。", nearly_won = "您已經距離勝利非常接近了。", hospital_value_enough = "保持醫院價值在%d以上,並解決好其它問題,就能勝利完成任務了。", another_patient_cured = "幹得好-治癒了一個病人。收入$%d。", three_quarters_lost = "您距離失敗還差四分之三。", reputation_good_enough = "好的,您的聲望已經達到任務要求了。保持在%d以上,並解決好其它方面的問題。", cured_enough_patients = "您已經治癒了足夠多的病人,但是您只有達到更高的標準才能勝利完成任務。", nearly_lost = "您距離失敗只有一步之遙了。", improve_reputation = "您需要提高聲望%d,這樣才能有機會完成任務。", three_quarters_won = "您距離勝利還差四分之三。", }, staff_place_advice = { receptionists_only_at_desk = "接待員只能在服務台工作。", only_psychiatrists = "只有具有精神病治療技能的醫生才可以在精神病診斷治療室中工作。", only_surgeons = "只有擁有外科技能的醫生才可以在手術中心工作。", only_nurses_in_room = "只有護士可以在%s中工作", only_doctors_in_room = "只有醫生可以在%s中工作", only_researchers = "只有擁有研究技能的醫生才可以在研究部門工作。", nurses_cannot_work_in_room = "護士無法在%s中工作", doctors_cannot_work_in_room = "醫生無法在%s中工作", }, research = { machine_improved = "%s的療效被您的研究部門增強了。", autopsy_discovered_rep_loss = "您的自動驗屍機已經研製成功。對公眾將產生副作用。", drug_fully_researched = "您已經研究%s到達100%%了。", new_machine_researched = "一個新的%s剛剛被成功研究出來。", drug_improved = "治療%s的藥品被您的研究部門改良了。", new_available = "一種新的%s可以使用了。", new_drug_researched = "治療%s的一種新藥被研究成功。", }, boiler_issue = { minimum_heat = "噢,終於找到您了。鍋爐壞了。也就是說醫院裡的人將感到有點冷。", maximum_heat = "鍋爐快失控了。暖氣的供暖能力已經達到極限了。醫院裡的人都快被熔化了!多設置一些飲料販賣機。", resolved = "好消息。鍋爐和暖氣現在工作正常。氣溫很快就可以恢復到正常水準。", }, competitors = { staff_poached = "您的一位員工被其它醫院挖走了。", hospital_opened = "競爭對手%s的醫院在本區域內已經開張了。", land_purchased = "%s已經購買了一些土地。", }, room_requirements = { research_room_need_researcher = "您需要為研究室雇用一個擁有研究技巧的醫生。", op_need_another_surgeon = "您至少還需要為手術中心雇用一名外科醫生。", op_need_ward = "您必須為外科手術前的患者建造病房。", reception_need_receptionist = "您必須為病人雇用一位接待員。", psychiatry_need_psychiatrist = "您需要雇用一位精神病醫生,現在您已經建成了一個精神病診斷治療室。", pharmacy_need_nurse = "您應該為藥房雇用一位護士。", ward_need_nurse = "您需要為病房雇用一名護士。", op_need_two_surgeons = "請為手術中心雇用兩名外科醫生完成手術。", training_room_need_consultant = "您應該為培訓室雇用一位專家,負責演講。", gps_office_need_doctor = "您需要為一般診斷室雇用一名醫生。", }, goals = { win = { money = "您還需要%d才能完成本關中的財政指標。", cure = "再治癒%d個病人您就可以滿足本關任務的要求了。", reputation = "提高聲望%d將達到勝利完成本任務的要求", value = "您需要增加醫院收入到$%d", }, lose = { kill = "再殺死%d個病人將導致本任務失敗!", }, }, warnings = { charges_too_low = "治療費用太低了。它將使更多的病人到醫院就診,但您無法從每個病人身上獲取太多的利潤。", charges_too_high = "治療費用太高了。短期內它將產生很好的效益,但最終會把病人嚇跑的。", staff_overworked = "您的員工已經勞累過度。他們的辦事效率正在下降,並將有可能發生醫療事故。", doctor_crazy_overwork = "喔,不!您的一位醫生已經由於勞累過度快要發狂了。如果能夠立即讓他休息,他將得到恢復。", doctors_tired = "您的醫生太累了。立即讓他們休息。", people_did_it_on_the_floor = "您的一些病人堅持不住了。趕快打掃乾淨。", queues_too_long = "隊伍太長了。", money_very_low_take_loan = "您的現金量太少了。您可以嘗試貸款。", patients_very_thirsty = "人們感到太口渴了。如果您不立即設置一些飲料販賣機,則將看到大多數人回家去喝可樂。", machinery_very_damaged = "緊急!立即派清潔工去修理機器!它們要爆炸了!", handymen_tired2 = "您的清潔工太疲倦了。立即讓他們休息。", desperate_need_for_watering = "您需要雇用一名清潔工照料醫院中的盆栽。", nurses_tired = "您的護士感到疲倦了。立即讓她們休息。", too_much_litter = "醫院中的廢棄物不斷增多。派幾個清潔工人就可以解決。", reception_bottleneck = "服務台已無法滿足需要。再雇用一名接待員。", place_plants4 = "在醫院中多擺放一些盆栽使所有病人感到快樂。", change_priorities_to_plants = "您必須改變清潔工的工作優先級,使他們更多地為盆栽澆水。", staff_too_hot = "您的工作人員感到太熱了。請調低供熱標準或拆除房間內的暖氣。", finanical_trouble2 = "多增加一些收入。如果再虧損$%d任務就會失敗。", plants_thirsty = "您需要對盆栽進行照料。它們正感到口渴。", litter_everywhere = "醫院中的廢棄物到處都是。多派幾個清潔工人就可以解決。", nurses_tired2 = "您的護士太疲倦了。立即讓她們休息。", plants_dying = "您的盆栽快幹死了。它們需要水。多為盆栽派些清潔工。病人可不願意看到枯死的盆栽。", reduce_staff_rest_threshold = "嘗試在醫院制度畫面中減少員工休息時的疲勞程度,這樣員工將經常休息。這只是一個主意。", more_toilets = "您需要更多的馬桶。人們都已急不可待了。", hospital_is_rubbish = "人們在到處宣揚您的醫院是垃圾。要知道您的醫院很快就會臭名遠揚。", pay_back_loan = "您已經掙到了很多錢。為什麼不考慮償還貸款?", financial_trouble3 = "您的現金狀況不太妙。想辦法增加一些收入。您距離失敗還差$%d。", bankruptcy_imminent = "嗨!您快破產了。小心啊!", build_toilet_now = "立即建造洗手間。人們已經忍無可忍了。別傻笑,這可是一個嚴重問題。", patient_stuck = "有人被卡住了,更好地規劃您的醫院。", no_patients_last_month = "上個月,沒有新的病人前來您的醫院。太可怕了!", more_benches = "是否考慮多擺放一些長椅。一些病情嚴重的病人現在正被迫站著等待治療。", many_epidemics = "看來醫院裡同時有不只一種傳染病。這將是一場空前災難,加油!", place_plants_to_keep_people = "人們正在離開。多擺放一些盆栽可以挽留他們。", patients_thirsty2 = "人們抱怨口渴。您應該在醫院中多設置一些飲料販賣機,或將已有的飲料販賣機移動到他們身邊。", money_low = "", staff_unhappy = "您的工作人員不是很快樂。可以嘗試給他們一些獎金,或為他們建造一個員工休息室。您也可以在醫院制度畫面中調整員工需要休息時的疲勞程度。", people_freezing = "無法相信,在這個擁有中央空調的時代,您的一些病人竟然快被凍僵了。趕快擺放一些暖氣並打開供暖開關使他們感到溫暖。", need_toilets = "病人需要洗手間。請在一些易找的地方建造洗手間。", nobody_cured_last_month = "上個月幾乎沒有治癒一個病人。", patients_very_cold = "病人們感到太冷了。請增加醫院的供熱,或在醫院中多擺放一些暖氣。", build_toilets = "立即建造一個洗手間,否則您將看到非常不雅的事情發生。想像一下醫院中將會出現的味道。", many_killed = "您已經殺死了%d個病人。您本來應該治癒他們的病。", place_plants2 = "人們正在離開。多擺放一些盆栽可以使他們多停留一會兒。", staff_tired = "您的員工感到太疲倦了。如果您再不讓他們到員工休息室休息一會兒,則某些人會由於長時間的緊張疲勞導致崩潰。", machines_falling_apart = "您的機器快爆炸了。請立即讓清潔工進行維修!", patients_unhappy = "病人不喜歡您的醫院。您必須為提高環境質量做一些事情。", place_plants3 = "人們的情緒很糟。多擺放一些盆栽使他們快樂。", staff_unhappy2 = "您的員工都不是很快樂。很快他們就會要求發獎金。", cash_low_consider_loan = "您的流動資金狀況十分不妙。是否考慮貸款?", queue_too_long_at_reception = "在服務台前排隊等待的病人太多了。請再建一個服務台並雇用一名接待員。", queue_too_long_send_doctor = "您的%s隊伍太長了。請確認房間中是否有醫生。", financial_trouble = "您正面臨著嚴重的財政危機。立即整理帳戶!如果您再虧損$%d,本關任務將失敗。", doctors_tired2 = "您的醫生太疲倦了。立即讓他們休息。", handymen_tired = "您的清潔工人太勞累了。立即讓他們休息。", patient_leaving = "一個病人離開了。原因?醫院管理不善,員工工作不力,再加上設施不全。", machinery_damaged2 = "您必須立即雇用一名清潔工去負責修理維護機器。", patients_leaving = "病人們正在離去。在醫院中多擺放一些盆栽,長椅,飲料販賣機等物品將有助於挽留他們。", epidemic_getting_serious = "傳染病疫情越來越嚴重。您必須立即行動!", machinery_damaged = "立即修理您的機器。它們無法支撐太久。", people_have_to_stand = "病人不得不站立等待。立即多擺放一些長椅。", receptionists_tired = "您的接待員太疲勞了。立即讓她們休息。", build_staffroom = "立即建造一個員工休息室。您的員工工作太辛苦了,而且將要精神崩潰了。快點!", machinery_slightly_damaged = "您的醫療儀器有輕微損傷。別忘了維護。", need_staffroom = "建造一個員工休息室使您的員工得以休息。", patients_getting_hot = "病人們感到太熱了。請降低醫院的供熱,或移走一些暖氣。", machinery_deteriorating = "您的機器由於過度使用已經出現老化現象。小心。", patients_too_hot = "病人們感到太熱了。要麼拆除一些暖氣,調低供熱標準,要麼為他們多設置一些飲料販賣機。", patients_thirsty = "人們感到口渴。也許您應該向他們提供飲料販賣機。", machine_severely_damaged = "%s已經快徹底毀壞了。", litter_catastrophy = "醫院中的廢棄物太多了。立即派一隊清潔工人解決這個問題。", staff_very_cold = "員工們感覺太冷了。請增加醫院的供熱,或在醫院中多擺放一些暖氣。", deal_with_epidemic_now = "如果無法立即控制傳染病那麼您的醫院將出大亂子。加油!", too_many_plants = "您已經佈置了足夠多的盆栽了。醫院都快變成叢林了。", patients_really_thirsty = "病人們感到口渴。多放置一些飲料販賣機,或將已有的飲料販賣機移動到最長的隊伍旁邊。", some_litter = "清潔工人可以在垃圾成堆之前清除所有垃圾。", patients_annoyed = "人們對醫院的管理感到極端憤怒。我不能責備他們,抓緊時間解決問題吧!", receptionists_tired2 = "您的接待員太疲倦了。立即讓她們休息。", }, placement_info = { door_can_place = "如果您願意的話可以在這裡設置房門。", window_can_place = "你可以在這裡設置窗戶,這樣很好。", door_cannot_place = "抱歉,您無法在這裡設置房門。", object_can_place = "您可以在這裡擺放物品。", reception_can_place = "您可以在這裡放置服務台。", staff_cannot_place = "您無法在這裡安置員工。對不起。", staff_can_place = "您可以在這裡安置員工。", object_cannot_place = "嗨,您無法在這裡擺放物品。", room_cannot_place = "您無法在這裡建房。", room_cannot_place_2 = "您無法在這裡建房。", window_cannot_place = "您實際上無法在這裡設置窗戶。", reception_cannot_place = "您無法在這裡放置服務台", }, praise = { many_benches = "病人擁有足夠的座位。太棒了。", many_plants = "太可愛了。您已經佈置了足夠的盆栽。病人將感到滿意。", plants_are_well = "太棒了。盆栽被照料得很好。", few_have_to_stand = "在您的醫院中幾乎每個人都有座位。所有的病人都感到快樂。", plenty_of_benches = "座椅已經足夠了。", plants_thriving = "太棒了。醫院中的盆栽生長得很茂盛。它們看起來令人感到驚奇。堅持住,您將有可能贏得一個大獎。", patients_cured = "已經治癒了%d個病人。", }, information = { larger_rooms = "大的房間將使員工感覺到自己的重要,並提高他們的表現。", extra_items = "房間中擺放物品將使員工感到舒服並提高他們的表現。", epidemic = "在您的醫院中發現了一種傳染病。您必須立即處理!", promotion_to_doctor = "您的一個實習醫生提升為醫生了。", emergency = "緊急情況!快!快!快!", patient_abducted = "您的一位病人被外星人誘拐了。", first_cure = "幹得好!您已經治癒了第一個病人。", promotion_to_consultant = "您的一名醫生已經提升為專家了。", handyman_adjust = "您可以通過調整清潔工人工作的優先級使其打掃得更乾淨。", promotion_to_specialist = "您的一個醫生被提升為%s。", initial_general_advice = { rats_have_arrived = "老鼠在您的醫院中到處亂跑。使用滑鼠打死它們。", autopsy_available = "自動驗屍機被研製出來了。藉著它,您可以處置惹麻煩或不歡迎的病人,還可以對他們進行研究。要注意-能否使用該機器還有很大的爭議。", first_patients_thirsty = "醫院中的人們感到口渴。為他們多擺放一些飲料販賣機。", research_now_available = "您已經建造了第一個研究房間。現在您可以進入研究畫面。", psychiatric_symbol = "擁有精神病技能的醫生後跟符號:|", decrease_heating = "醫院中的人們感到太熱了。在城鎮地圖畫面中,降低供熱量。", surgeon_symbol = "擁有外科手術技能的醫生後跟符號:{", first_emergency = "急救病人的頭頂有一個閃亮的藍色急救燈。在死亡之前或時間倒數結束之前治癒他們。", first_epidemic = "在醫院中爆發了傳染病請決定是掩蓋病情還是將其清除出去。", taking_your_staff = "有人想要挖走您的員工。您要抓緊與他們進行鬥爭。", place_radiators = "醫院中的人們感到寒冷-您可以多擺放一些暖氣。", epidemic_spreading = "您的醫院中發現傳染病。在病人離開醫院之前一定要治癒他們。", research_symbol = "擁有研究技能的醫生後跟符號:}", machine_needs_repair = "您有一台機器需要維修。確定機器位置-它可能正在冒煙-在機器上點擊一下,再點擊清潔工人按鈕。", increase_heating = "人們感到寒冷。打開城鎮地圖畫面中的供暖設施。", first_VIP = "您要接待來訪的第一位貴賓。一定要確保貴賓沒有看到任何不良事件,或其他不高興的病人。", }, patient_leaving_too_expensive = "一位病人沒有為%s付款就離開了。這損失太大了。", vip_arrived = "小心!%s正準備訪問您的醫院!保持醫院運轉正常,這樣才能使他感到愉快。", epidemic_health_inspector = "您的醫院中出現傳染病的消息已經到達了衛生署。衛生巡查員很快就要到達,快做準備。", first_death = "這是您第一次殺死病人。感覺如何?", pay_rise = "您的一個員工威脅要辭職。選擇是否同意其請求,或將其解雇。點擊屏幕左下方的￿標可以查看威脅要辭職的員工信息。", place_windows = "設置窗戶將使房間更加明亮,並振奮員工的精神。", fax_received = "在屏幕左下角剛剛彈出的￿標表示一些重要事件的相關信息,或某些需要您決定的事情。", }, build_advice = { placing_object_blocks_door = "設置該物品可以阻止其他人接近。", blueprint_would_block = "藍圖與其它房間重疊了。請嘗試重新設置藍圖尺寸,或移動藍圖位置。", door_not_reachable = "病人無法進入那扇門。仔細想一想。", blueprint_invalid = "藍圖位置不對。", }, } casebook = { sent_home = "轉走", deaths = "死亡", treatment_charge = "治療花費", reputation = "聲望", research = "集中研究", cure = "治療", cured = "治癒", earned_money = "收入", cure_desc = { hire_psychiatrists = "您需要雇用一些精神病醫生。", improve_cure = "提高療效。", hire_nurses = "您需要雇用一些護士。", build_ward = "您仍需要建造一個病房。", no_cure_known = "未治癒。", cure_known = "治癒。", build_room = "我建議您修建%s", hire_doctors = "您需要雇用一些醫生。", hire_surgeons = "您需要雇用一些外科醫生。", }, } diseases = { diag_ward = { name = "病房診斷", }, diag_ultrascan = { name = "超級掃瞄儀診斷", }, autopsy = { name = "驗屍", }, third_degree_sideburns = { cause = "病因-嚮往20世紀70年代。", cure = "治療-精神病醫生必須使用最新科技,使病人認識到這些奇裝異服都是垃圾。", name = "絡腮鬍子", symptoms = "症狀-長頭髮,全身閃閃發光。", }, discrete_itching = { cause = "病因-昆蟲叮咬。", cure = "治療-病人喝下膠狀糖漿阻止皮膚發癢。", name = "搔癢症", symptoms = "症狀-到處亂抓,引起全身發炎。", }, the_squits = { cause = "病因-吃了變質的比薩餅。", cure = "治療-服用粘性藥劑修補病人的內臟。", name = "嘔吐", symptoms = "症狀-噢。想必您也可以猜得到。", }, spare_ribs = { cause = "病因-坐在冰冷的石地板上。", cure = "治療-由兩名外科醫生執行手術。", name = "瘦骨", symptoms = "症狀-胸部感覺不適。", }, diag_blood_machine = { name = "血液機器診斷", }, king_complex = { cause = "病因-貓王的思想進入病人大腦並取而代之。", cure = "治療-由精神病醫生告訴病人其荒謬的舉止。", name = "貓王症侯群", symptoms = "症狀-穿著舉止怪異。", }, diag_x_ray = { name = "X光診斷", }, pregnancy = { cause = "病因-懷孕。", cure = "治療-在手術中心中將嬰兒取出,洗淨送到病人面前。", name = "產婦", symptoms = "症狀-不斷增大的啤酒肚。", }, fake_blood = { cause = "病因-病人常常開玩笑。", cure = "治療-只有精神病醫生才能使病人安靜下來。", name = "假血", symptoms = "症狀-流出紅色液體。", }, diag_psych = { name = "精神病診斷", }, invisibility = { cause = "病因-被有放射性的螞蟻叮咬。", cure = "治療-在藥房喝下彩色液體,將很快使病人恢復正常。", name = "隱身", symptoms = "症狀-病人本身感覺不到任何不適,並常常和家裡人開玩笑。", }, golf_stones = { cause = "病因-吸入了高爾夫球內部的有毒氣體。", cure = "治療-由兩名外科醫生執行手術。", name = "高爾夫症", symptoms = "症狀-神經錯亂且胡言亂語。", }, diag_general_diag = { name = "一般診斷", }, infectious_laughter = { cause = "病因-觀看古典喜劇。", cure = "治療-精神病醫生必須讓病人瞭解其當前嚴重的病情。", name = "狂笑症", symptoms = "症狀-不住狂笑。", }, general_practice = { name = "一般診斷", }, baldness = { cause = "病因-向公眾說謊話。", cure = "治療-使用儀器將頭髮縫合到病人的頭上。", name = "禿頂", symptoms = "症狀-腦門發亮,十分困窘。", }, heaped_piles = { cause = "病因-站立在水冷卻器旁邊。", cure = "治療-服用藥劑。", name = "痔瘡", symptoms = "症狀-病人感覺就像坐在大理石上。", }, unexpected_swelling = { cause = "病因-意外事件。", cure = "治療-由兩名外科醫生實行手術。", name = "腫脹", symptoms = "症狀-腫脹。", }, jellyitis = { cause = "病因-日常飲食含有過多的膠狀物並完成太多的練習。", cure = "治療-將病人浸入到膠桶中。", name = "失衡症", symptoms = "症狀-走路搖搖晃晃並不時摔倒。", }, hairyitis = { cause = "病因-在月光下停留過長時間。", cure = "治療-使用電分解機器去掉毛髮並填補遺留的毛孔。", name = "多毛症", symptoms = "症狀-嗅覺特別靈敏。", }, alien_dna = { cause = "病因-擁有了外星人的DNA。", cure = "治療-利用儀器快速清除病人體內的DNA。", name = "外星人DNA", symptoms = "症狀-逐漸蛻變成外星人並陰謀摧毀我們的城市。", }, bloaty_head = { cause = "病因-聞到了壞乳酪並喝了不乾淨的雨水。", cure = "治療-打破腫脹腦袋,並使用充氣機使腦袋恢復正常。", name = "頭部腫脹", symptoms = "症狀-非常不舒服。", }, gastric_ejections = { cause = "病因-吃了過辣的四川菜。", cure = "治療-服用特殊凝固劑從而阻止嘔吐。", name = "反胃症", symptoms = "症狀-半消化的食物被病人不時吐出。", }, uncommon_cold = { cause = "病因-吸進了空氣中的灰塵。", cure = "治療-服用藥房配製的特效藥。", name = "感冒", symptoms = "症狀-流鼻涕,打噴嚏。", }, corrugated_ankles = { cause = "病因-駕駛時間過長。", cure = "治療-服用少量毒草和香料製成的藥劑,從而打通關節。", name = "腳踝彎曲", symptoms = "症狀-腳踝感覺不舒服。", }, sleeping_illness = { cause = "病因-內分泌失調。", cure = "治療-由護士配置一劑威力強大的興奮劑給病人服用。", name = "嗜睡症", symptoms = "症狀-無論走到那裡都想睡覺。", }, sweaty_palms = { cause = "病因-害怕找工作時的面試。", cure = "治療-精神病醫生使病人走出心理誤區。", name = "手心出汗症", symptoms = "症狀-當與病人握手時,感覺就像攥著一塊吸滿了水的海綿。", }, serious_radiation = { cause = "病因-不小心錯誤吞吃了含有鈽元素的口香糖。", cure = "治療-病人必須被放置在淨化淋浴器內徹底清洗。", name = "放射病", symptoms = "症狀-病人感到非常非常的不舒服。", }, diag_cardiogram = { name = "心電圖儀診斷", }, diag_scanner = { name = "掃描儀診斷", }, gut_rot = { cause = "病因-喝了太多的威士忌酒。", cure = "治療-由護士配置藥劑,交給病人服下。", name = "內臟腐爛", symptoms = "症狀-不咳嗽,但胃壁也沒有了。", }, iron_lungs = { cause = "病因-城市中渾濁的空氣。", cure = "治療-兩名外科醫生在手術中心執行手術。", name = "鐵肺", symptoms = "症狀-渾身難受。", }, broken_wind = { cause = "病因-飯後使用健身房的腳踏車進行運動。", cure = "治療-服用藥房配製的特效藥。", name = "臭屁症", symptoms = "症狀-使身後的人感到極度的不舒服。", }, kidney_beans = { cause = "病因-飲料中加入了大量冰塊。", cure = "治療-由兩名外科醫生執行手術。", name = "腎豆", symptoms = "症狀-疼痛且經常去廁所。", }, transparency = { cause = "病因-舔了打開的容器的鉛箔上的酸乳酪。", cure = "治療-服用藥房配製的特殊清涼彩色沖劑就可以治癒疾病。", name = "透明症", symptoms = "症狀-肌肉變得透明,對光敏感。", }, broken_heart = { cause = "病因-一些人比病人富有,年輕,瘦。", cure = "治療-由兩名外科醫生打開病人的胸腔,輕輕地修補其心臟缺陷。", name = "破碎的心", symptoms = "症狀-痛哭流涕。", }, slack_tongue = { cause = "病因-過多地討論肥皂劇。", cure = "治療-將舌頭放入舌頭切片機中,將快速有效地得到治療。", name = "舌頭鬆弛症", symptoms = "症狀-舌頭增長到正常的5倍。", }, tv_personalities = { cause = "病因-日間電視節目。", cure = "治療-精神病醫生必須使病人有信心賣掉電視機,而購買收音機。", name = "電視病", symptoms = "症狀-產生錯覺,以為自己正在表演。", }, ruptured_nodules = { cause = "病因-在寒冷的季節中跳躍。", cure = "治療-兩名稱職的外科醫生必須使用穩定的雙手切除腫瘤。", name = "腫瘤", symptoms = "症狀-無法舒適地坐下。", }, fractured_bones = { cause = "病因-從高處摔到混凝土地面上。", cure = "治療-將已打好的石膏使用儀器去除。", name = "骨折", symptoms = "症狀-劇痛且無法使用四肢。", }, chronic_nosehair = { cause = "病因-經常對不如自己的人嗤之以鼻。", cure = "治療-口服令人厭惡的毛髮去除劑,該藥劑由護士在藥房配製。", name = "鼻毛過多症", symptoms = "症狀-鼻毛過長過多,快成鳥巢了。", }, } policy = { header = "醫院制度", diag_termination = "診斷結束", sliders = { guess = "嘗試治療", send_home = "遣送回家", stop = "停止治療", staff_room = "進入休息室", }, diag_procedure = "診斷程序", staff_rest = "員工休息", staff_leave_rooms = "員工離開房間", } competitor_names = { [1] = "神諭", [2] = "巨人", [3] = "黑爾", [4] = "馬笛維克", [5] = "冬青樹", [6] = "沉思", [7] = "禪", [8] = "里昂", [9] = "瑪文", [10] = "晶體", [11] = "母親", [12] = "潔尼", [13] = "CORSIX", [14] = "ROUJIN", [15] = "EDVIN", [16] = "薩姆", [17] = "查理", [18] = "亞瑟", [19] = "馬格尼斯", [20] = "賽爾", [21] = "約書亞", [22] = "丹尼爾", [23] = "奧利文", [24] = "尼克", } buy_objects_window = { price = "價格:", choose_items = "選擇物品", total = "總共:", } trophy_room = { wait_times = { award = { [1] = "恭喜。您的醫院的排隊等待時間非常短。這是給您的獎勵。", }, penalty = { [1] = "病人在您的醫院中排隊等待時間太長了。您應該好好地管理前來就診的病人。", }, }, happy_vips = { trophies = { [1] = "由於您的醫院在過去一年中給來訪的貴賓們留下了深深地好感,特此向您頒發諾貝爾獎。", [2] = "由於您的醫院使每位造訪貴賓都感到愉快,特此由名人機構頒發著名人士獎。您已經成為我們名人行列中的一員。", [3] = "由於您的醫院在過去一年中使每一位來訪貴賓都感到了員工的工作熱情,特此頒發貴賓滿意獎。", }, }, hosp_value = { penalty = { [1] = "您的醫院價值太低了。您的理財能力太爛了。記住一個好的醫院通常也是價值最高的醫院。", }, awards = { [1] = "由於您的醫院價值不菲,因此衛生署向您表示恭喜。", }, regional = { [1] = "您真是一個理財高手。您的醫院的價值比其它醫院的總和還要多。", }, }, rats_accuracy = { trophies = { [1] = "由於您擊打老鼠的命中率為%d%%,特此頒發極道梟雄射擊準確獎。", [2] = "由於您的醫院在過去一年中以難以置信的命中率%d%%擊斃老鼠,特此頒獎。", [3] = "由於您的醫院在過去一年中擊斃了%d%%的老鼠,特此頒發地城守護者除害獎。恭喜!", }, }, all_cured = { awards = { [1] = "由於您的醫院在過去一年中成功地治療了所有病人,特此頒發瑪麗治療獎。", }, trophies = { [1] = "由於您的醫院在過去一年中成功地治療了就診的每個病人,國際治療基金會特此向您頒發全部治癒獎。", [2] = "由於您的醫院在過去一年中治癒了大量患者,特此頒發疾病剋星獎。", }, }, best_value_hosp = { trophies = { [1] = "由於您的醫院在過去一年中贏得了最高的聲望,特此頒發白衣天使獎。這是您應得的。", }, penalty = { [1] = "周圍每個醫院都比您的醫院富有。您要加油啊。多購買一些昂貴的東西。", }, regional = { [1] = "恭喜您管理的醫院成為最有價值的醫院。幹得好。保持下去。", }, }, high_rep = { penalty = { [1] = "在過去一年中,您贏得了很低的聲望。以後一定要加油啊。", [2] = "您的聲望是本區域最低的。真丟人。加油。", }, awards = { [1] = "幹得好。在上一個年度,由於您獲得了很高的聲望,特此頒發一個小小的獎勵。", [2] = "太棒了! 由於您在過去一年中取得了很高的聲望,特此頒發獎勵。", }, regional = { [1] = "由於您的醫院在過去一年中贏得了最高的聲望,特此頒發牛蛙獎。這是您應得的。", [2] = "在這一年中,您的醫院的聲望超過了其它所有醫院的總和。真是一項偉大的成就。", }, }, consistant_rep = { trophies = { [1] = "由於您的醫院在過去一年中無懈可擊的營運以及最高的聲望,您被授予內閣大臣獎。幹得好。", [2] = "由於您的醫院在過去一年中贏得了最高的聲望,特此頒發白衣天使獎。這是您應得的。", }, }, curesvdeaths = { awards = { [1] = "恭喜您在過去一年中使醫院保持了很高的治癒率和很低的死亡率。", }, penalty = { [1] = "您的治癒率實在是太低了。您應該使治癒的病人多於死亡的病人。不要顛倒了。", }, }, cleanliness = { regional_good = { [1] = "您的醫院是最不清潔的醫院之一。一個不清潔的醫院不僅味道難聞,而且是十分危險的。請密切留意。", }, award = { [1] = "衛生巡查員注意到您的醫院非常乾淨。乾淨的醫院意味安全的醫院。堅持下去。", }, regional_bad = { [1] = "您的醫院是本區域中最不清潔的。其它醫院都使走廊保持整潔。您使醫學界蒙羞。", }, }, happy_patients = { awards = { [1] = "在過去一年中,您的醫院使所有訪問的病人都感到快樂,您將為此感到驕傲。", [2] = "訪問您的醫院的病人比其它醫院內的病人要快樂得多。", }, penalty = { [1] = "前去您的醫院就診的病人感到非常不滿。您必須改進提高才可以獲得衛生署的尊重。", [2] = "在您的醫院中接受治療的病人感到非常不高興。您應多為病人的福利著想。", }, }, emergencies = { regional_good = { [1] = "衛生署認識到您的醫院在處理緊急事件時比其它醫院都要好,特此頒發獎勵。", }, penalty = { [1] = "您處理緊急事件的能力實在太差了。前來就診的急救病人並沒有得到正確的治療。", }, regional_bad = { [1] = "您的醫院是本區域中處理緊急事件最差的。這都是您的過錯。", }, award = { [1] = "恭喜:由於您的努力和卓有成效的緊急事件處理能力,使您榮獲該特別大獎。幹得好。", [2] = "您處理緊急事件的能力非常突出。由於您最佳的處理能力,特此頒發獎勵。", }, }, gen_repairs = { awards = { [1] = "由於您的清潔工人使醫院內的儀器設備運行良好,特此頒發特別獎金。幹得好。假期愉快。", [2] = "您的清潔工人比其它醫院的都要好。這真是一件值得慶祝的事情。", [3] = "您的儀器維護得很好。這一切都離不開清潔工人的努力。幹得好。", }, penalty = { [1] = "您的清潔工人在維護機器方面表現不是很好。您應該讓他們更多地關心維護保養工作,或者再多雇用幾名清潔工人。", [2] = "維修工作一團糟。您的清潔工人無法很好的照料各種醫療儀器。", }, }, no_deaths = { trophies = { [1] = "由於您的醫院在過去一年中沒有發生任何病人死亡事件,特此頒發安全獎。", [2] = "由於您的醫院在過去一年中沒有發生病人死亡事件,特此由生命發展組織向您頒獎。", [3] = "由於您的醫院在過去一年中避免發生病人死亡事件,特此頒發挽留妙手回春獎。", }, penalty = { [1] = "在過去一年中,您的醫院的死亡人數始終很高。一定要多加注意。以後一定要確保病人的存活。", [2] = "您的醫院對於病人的健康簡直就是在冒險。您應該治癒大量的病人,而不是讓他們加速死亡。", }, awards = { [1] = "由於您的醫院在本年度保持了很低的死亡人數,特此頒發獎勵。太棒了。", [2] = "由於您的天才管理使醫院的死亡人數達到最低點。這真是令人高興的事情。", }, regional = { [1] = "您的醫院的死亡人數比其它醫院都低。請接受這個獎勵。", }, }, rats_killed = { trophies = { [1] = "由於您的醫院在過去一年中共擊斃了%d只老鼠,特此頒發除害獎。", [2] = "由於您高超的擊鼠技巧共擊斃老鼠%d只,特此頒發聯邦滅鼠獎。", [3] = "由於您的醫院在過去一年中共擊斃了%d只老鼠,特此頒發老鼠剋星獎。", }, }, happy_staff = { trophies = { [1] = "由於您的醫院在過去一年中使努力工作的員工保持快樂,特此頒發微笑獎。", [2] = "由於您的醫院在過去一年中沒有不快樂的員工,特此頒發阿達尼學院獎。", [3] = "由於您的醫院在過去一年中使努力工作的員工保持快樂,特此頒發笑星獎盃。快樂地笑吧!", }, awards = { [1] = "您的員工表示要向您頒獎。他們說雖然還有很多需要改進的地方,但您對待他們的態度使他們感到很快樂。", [2] = "您的員工感到能夠為您工作是一件非常快樂的事情,他們的笑容掛在臉上。您真是一個超級管理人才。", }, penalty = { [1] = "您的員工希望您知道他們非常不高興。好的員工就是最有價值的資產。使他們快樂,否則您將在一天之內失去全部。", }, regional_good = { [1] = "您的員工比其它醫院的員工都要快樂。快樂的員工意味。更高的利潤和更低的死亡率。衛生署感到非常高興。", }, regional_bad = { [1] = "您的員工在上一年度中非常不幸。您一定要加以留意。其它醫院的員工都比您的員工快樂。", }, }, healthy_plants = { awards = { [1] = "由於您的醫院在過去一年中是盆栽保持健康成長,特此頒發茁壯成長獎。", }, trophies = { [1] = "由於您的醫院在過去十二個月中使所有盆栽長勢良好,特此盆栽盆栽協會向您頒發綠色健康獎。", [2] = "由於您的醫院在過去一年中使所有盆栽長勢良好,特此頒發綠色名人獎。", }, }, sold_drinks = { trophies = { [1] = "由於您的醫院在過去一年中售出了大量的罐裝飲料,特此由全球牙醫聯合會向您頒獎。", [2] = "由於您的醫院在過去一年中賣出大量飲料,特此飲料零售組織向您頒發清涼飲料獎。", [3] = "由於您的醫院在過去一年中賣出大量飲料,特此由飲料公司向您頒發巧克力獎盃。", }, }, many_cured = { trophies = { [1] = "由於您的醫院在過去一年中成功地治療了幾乎所有病人,特此恭喜您榮獲瑪麗治療獎。", [2] = "由於您的醫院在過去一年中治癒了大量患者,國際治療基金會特此向您頒發懸壺濟世獎。", [3] = "由於您的醫院在過去一年中治癒了大量患者,特此頒發疾病剋星獎。", }, penalty = { [1] = "您的醫院無法使病人得到很好的治療。請關注並加以改進。", [2] = "您的醫院對病人的治療效果不如其它醫院。您使衛生署和您自己都名聲掃地。下不為例。", }, awards = { [1] = "恭喜您在過去一年中治癒了這麽多的病人。很多人都感覺不錯,感謝您的工作。", [2] = "由於您的醫院治癒了比其它醫院更多的病人,所以請接受這個獎勵。您的表現太棒了。", }, regional = { [1] = "由於您的醫院治癒的病人數目比其它醫院的總和還多,特此頒發獎勵。", }, }, pop_percentage = { awards = { [1] = "在過去一年中,您的醫院在城鎮人口中獲得了很高的份額。幹得好。", [2] = "恭喜。訪問您的醫院的居民人數超過了其它任何一個醫院。", [3] = "幹得好。訪問您的醫院的居民人數超過了其它醫院的總和。", }, penalty = { [1] = "在過去一年中,您的醫院在城鎮人口中獲得了很高的份額。幹得好。", [2] = "恭喜。訪問您的醫院的居民人數超過了其它任何一個醫院。", }, }, research = { regional_good = { [1] = "您的研究使您的醫院始終緊跟最新發展。這是您的科研人員應得的獎勵。", }, penalty = { [1] = "您研究開發新治療方案,儀器和藥品的速度太慢了。這將無法趕上時代的步伐。", }, regional_bad = { [1] = "本區域中的每個醫院在研究方面都強於您的醫院。這一點使衛生署感到震怒。", }, awards = { [1] = "您的研究使您的醫院始終緊跟最新發展。這是您的科研人員應得的獎勵。", [2] = "在過去一年中,您比其它醫院研究出更多的藥品和儀器設備。請接受衛生署頒發的這個獎勵。", }, }, reputation = "聲望", cash = "現金", } menu_options_volume = { [50] = " 50%", [100] = " 100%", [30] = " 30%", [60] = " 60%", [90] = " 90%", [10] = " 10%", [20] = " 20%", [40] = " 40%", [80] = " 80%", [70] = " 70%", } menu_file_load = { [1] = " 存檔一 ", [2] = " 存檔二 ", [3] = " 存檔三 ", [4] = " 存檔四 ", [5] = " 存檔五 ", [6] = " 存檔六 ", [7] = " 存檔七 ", [8] = " 存檔八 ", } menu_file = { quit = " (%1%) 退出", save = " (%1%) 儲存", load = " (%1%) 讀取", restart = " (%1%) 重新開始", } rooms_long = { ultrascan = "超級掃描儀房間", research_room = "研究部門", general = "一般", gps_office = "一般診斷室", inflation = "充氣房間", staffroom = "員工休息室", jelly_vat = "膠桶", scanner = "掃描儀房間", emergency = "緊急事件", decontamination = "淨化", corridors = "走廊", cardiogram = "心電圖儀房間", ward = "病房", training_room = "培訓室", psychiatric = "精神病診斷治療室", operating_theatre = "手術中心", dna_fixer = "DNA修復裝置", tongue_clinic = "舌頭鬆弛診治所", hair_restoration = "毛髮恢復裝置", general_diag = "高級診斷室", pharmacy = "藥房", fracture_clinic = "骨折診所", toilets = "洗手間", electrolysis = "電分解診所", x_ray = "X光房間", blood_machine = "血液機器房間", } fax = { epidemic_result = { fine_amount = "政府宣佈全國緊急狀態,並對您罰款%d。", close_text = "哈!", hospital_evacuated = "會議決定只能疏散您的醫院。", succeeded = { part_1_name = "衛生巡查員聽到了傳聞,您的醫院正在處理嚴重疾病%s。", part_2 = "然而他還沒有能夠找到證實傳聞的證據。", }, compensation_amount = "政府決定獎勵您%d作為補償謠言對您醫院聲譽所造成的損失。", failed = { part_1_name = "嘗試掩蓋病情,他們正面臨著傳染病%s爆發。", part_2 = "醫院中的員工已經制止了傳染病向醫院附近居民傳播。", }, rep_loss_fine_amount = "報紙將整版報道此事。您的聲望將大幅受損。另外,還要繳納罰款%d。", }, vip_visit_query = { choices = { invite = "向貴賓發出邀請。", refuse = "找藉口阻止貴賓訪問。", }, vip_name = "%s希望能夠訪問您的醫院!", }, vip_visit_result = { telegram = "電報!", remarks = { good = { [1] = "醫院經營得太棒了。感謝您能夠邀請我來訪問。", [2] = "嗯。醫院經營得還可以。", [3] = "我很欣賞您的醫院。", }, super = { [1] = "醫院太棒了。下次我生病一定要到那裡去就診。", [2] = "那就是我訪問的醫院。", [3] = "那是一個超級醫院。並且我想知道更多一點。", }, bad = { [1] = "我為什麼煩惱?這比看一場持續4個小時的歌劇好多了!", [2] = "我為我所看到的感到噁心。這也是醫院?胡說八道!", [3] = "我已經受夠了!", }, mediocre = { [1] = "喔,有點差勁。您應多做一些改進。", [2] = "喔,親愛的。這個地方可不怎麼樣。", [3] = "這是一個比較一般的醫院。但坦白地講,我希望能夠做得更好。", }, very_bad = { [1] = "真是一個垃圾。我要爭取關閉它。", [2] = "我從沒有見過這樣可怕的醫院。真是丟人!", [3] = "我被震驚了。這也能稱為醫院!給我一點酒。", }, }, rep_boost = "您的聲望在公眾中是很好的。", vip_remarked_name = "%s訪問醫院結束後發表評論:", cash_grant = "您將得到獎金%d。", rep_loss = "您的聲望因此受到損害。", close_text = "感謝您訪問醫院。", }, disease_discovered_patient_choice = { need_to_build = "您必須建造一個%s才能處理該疾病。", need_to_employ = "雇用一名%s就可以處理該情況。", what_to_do_question = "您打算怎樣處理這個病人?", guessed_percentage_name = "您的員工正在嘗試治療該病人。我們有%d%%的幾率治癒該病:%s", choices = { send_home = "送病人回家。", research = "將病人送到研究部門。", wait = "讓病人在醫院中等一會兒。", }, disease_name = "發現了新情況。該疾病為%s", need_to_build_and_employ = "如果您建造了一個%s並雇用了一名%s,您就能成功。", can_not_cure = "您無法治療該疾病。", }, emergency_result = { earned_money = "最大獎金額為$%d,您得到了$%d。", close_text = "點擊這裡退出。", saved_people = "您挽救了%d個病人,總共需要治癒%d個。", }, disease_discovered = { discovered_name = "您的員工發現了一種新的疾病。它是%s", need_to_employ = "雇用一名%s就可以處理這種危機。", need_to_build_and_employ = "如果您建造了一個%s並雇用了一名%s,您就能成功。", need_to_build = "您必須建造一個%s才能處理該疾病。", close_text = "新發現了一種疾病。", can_cure = "您可以處理這種疾病。", }, emergency = { locations = { [1] = "賽澈化學藥品工廠。", [2] = "斯尼得大學。", [3] = "派拉奎特園藝中心。", [4] = "危險物質研究機構。", [5] = "莫理斯舞蹈家協會。", [6] = "青蛙與公牛酒店。", [7] = "大戴維殯葬館。", [8] = "太子製革店。", [9] = "伯特二手石化產品商場。", }, num_disease = "%d個病人患有%s,他們需要緊急治療。", cure_possible_drug_name_efficiency = "您已經擁有了要求的設備和技能。您擁有他們所需要的藥品。藥品%s的療效為%d%%。", cure_not_possible_employ = "您將需要雇用一名%s", cure_not_possible = "現在您還不能治療這種疾病。", cure_possible = "由於您擁有準備和技能,所以您應該可以處理這個緊急事件。", choices = { accept = "好的。我已做好準備處理緊急事件。", refuse = "不。我拒絕處理這個緊急事件。", }, location = "在%s發生了事故", cure_not_possible_build = "您將需要建造一間%s", cure_not_possible_build_and_employ = "您將需要建造一間%s並雇用一名%s", bonus = "處理這個緊急事件的最大獎金額為%d。如果您失敗了,則您的聲望將大幅下降。", }, debug_fax = { text4 = "FACTORS : DOCS %d NURSES %d AREA %d ROOMS %d PRICING %d", text5 = "CONTRIBN : DOCS %d NURSES %d AREA %d ROOMS %d PRICING %d PERCENT", text3 = "FIGURES : DOCS %d NURSES %d AREA %d ROOMS %d PRICING %d", text9 = "DISASTERS %d ALLOWED (MTHS) %d (%d)REDUCTION %d", close_text = "嗨,哈,哈!", text1 = "BEST COUNT %d", text6 = "THE FOLLOWING FACTORS ARE ALSO APPLIED", text8 = "AMENITIES %d PEEPS HANDLED %d REDUCTION %d", text2 = "TOTAL PEOPLE IN HOSPITAL %d CHECKING AGAINST %d", text10 = "KILLS %d ALLOWED (MTHS) %d (%d) REDUCTION %d", text11 = "PEOPLE THIS MONTH %d", text7 = "REPUTATION: %d EXPECTED %d REDUCTION %d", }, epidemic = { cover_up_explanation_1 = "如果您想要掩蓋傳染病,您將必須在有限時間內,即衛生巡查員到來之前,治癒所有被傳染的病人。", cover_up_explanation_2 = "如果衛生巡查員到達,並發現了您正在試圖掩蓋傳染病,則他將對您採取嚴厲的懲罰。", choices = { cover_up = "在指定時間內且病人離開醫院之前,儘量治癒所有被感染的病人。", declare = "宣佈一種傳染病。支付罰款且名譽受損。", }, disease_name = "醫生發現了傳染病%s。", declare_explanation_fine = "如果您宣佈出現傳染病,則您將支付罰款%d,且名譽受損。所有病人將自動被接種疫苗。", }, diagnosis_failed = { choices = { send_home = "送病人回家。", take_chance = "嘗試治療病人。", wait = "讓病人多等待一會兒,您需要多建造一些診斷室。", }, situation = "我們已經對該病人嘗試了所有可供使用的機器,但是仍然沒有發現病因。", what_to_do_question = "我們將怎樣處置這個病人?", partial_diagnosis_percentage_name = "我們有%d%%的機率確定該病人所患疾病類型。", }, } drug_companies = { [1] = "良藥公司", [2] = "名醫公司", [3] = "小藥片公司", [4] = "普芬公司", [5] = "歐米尼公司", } humanoid_name_ends = { [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] = "林", } confirmation = { return_to_blueprint = "您是否確定返回藍圖模式?", restart_level = "您是否希望重新開始這個任務?", delete_room = "您是否希望拆除這個房間?", quit = "您已經選擇了退出。您是否確定真的要退出遊戲?", overwrite_save = "該位置已儲存遊戲進度。您是否確定要將其覆蓋?", sack_staff = "您是否確定要解雇該員工?", replace_machine = "您是否確定將%s更新,需花費$%d?", } months = { [1] = "1 月", [2] = "2 月", [3] = "3 月", [4] = "4 月", [5] = "5 月", [6] = "6 月", [7] = "7 月", [8] = "8 月", [9] = "9 月", [10] = "10 月", [11] = "11 月", [12] = "12 月", } dynamic_info = { patient = { emergency = "緊急情況:%s", guessed_diagnosis = "嘗試診斷:%s", diagnosis_progress = "診斷過程", actions = { sent_to_other_hospital = "指派到其它醫院", prices_too_high = "費用太高了-我要回家了", waiting_for_treatment_rooms = "等待為我建造一間治療室", dying = "快死了!", no_diagnoses_available = "無法診斷-我要回家了", epidemic_sent_home = "被巡查員趕回家", cured = "治癒!", waiting_for_diagnosis_rooms = "等待建造更多的診斷室", epidemic_contagious = "我有傳染病", awaiting_decision = "等待您的決定", sent_home = "遣送回家", fed_up = "受夠了,要離開", no_treatment_available = "無法治療-我要回家了", on_my_way_to = "在去%s的路上", queueing_for = "排隊等待%s", }, diagnosed = "診斷:%s", }, health_inspector = "衛生巡查員", vip = "來訪貴賓", object = { times_used = "使用次數%d", queue_size = "排隊人數%d", strength = "力量%d", queue_expected = "即將加入隊伍人數%d", }, staff = { ability = "能力", psychiatrist_abbrev = "精神分析", actions = { going_to_repair = "前往維修%s", waiting_for_patient = "等待病人", wandering = "正在到處走動", }, tiredness = "疲勞", }, } introduction_texts = { level17 = "最後的警告-隨時關注您的聲望-這是真正吸引病人前來就診的關鍵。 " .. "如果您沒有醫死太多的病人,且使就診病人保持快樂,則不必太擔心聲望! " .. "決定權就在您的手中。祝您好運。", level1 = "歡迎來到您的第一座醫院!// " .. "首先要擺放服務台,建造一般診斷室,並雇用一名接待員和一名醫生。 " .. "隨後就可以等待開張了。 " .. "建造精神病診斷治療室並雇用一名精神病醫生是一個好主意。 " .. "藥房和護士也是治療病人所必需的。 " .. "建造一個充氣機房間就可以治療頭部腫脹患者。 " .. "您需要治癒10個病人,並使聲望保持在200以上。", level9 = "當填滿了衛生署的銀行帳戶並為部長大人購買了一輛轎車後,您現在又要開始新的工作了。 " .. "在這裡您要面對很多問題。 " .. "只有擁有足夠經驗充分的員工和房間,您才能夠順利過關。 " .. "醫院價值需要達到$200,000,且銀行帳戶上要有$400,000。 " .. "如果無法達到上述要求,則無法勝利完成任務。", level2 = "在該區域內還有一些其它的疾病。//" .. "建造醫院從而可以治療更多的病人,並應該考慮建造研究部門。 " .. "記住保持內部的清潔,從而使聲望盡可能地高-您將遇到患有舌頭鬆弛症的病人,因此需要建造舌頭診治房間。 " .. "您也可以建造心電圖房間來幫助診斷疾病。 " .. "這些房間都需要經過研究才能夠被建造。現在你可以購買其它土地擴展醫院-使用城鎮地圖就可以購買土地。 " .. "目標是聲望300,銀行現金為10000,且治癒40個病人。", level7 = "在這裡您將受到衛生署的密切監察,因此要在賺錢的同時,努力提高自己的聲望。 " .. "我們無法處理太多的醫療事故-這對於醫院的運營是十分不利的。 " .. "確認所有員工都很快樂,並確認已經購買了所有需要的儀器裝備。 " .. "聲望需要達到600,且銀行裡需要有$200,000。", level5 = "醫院將非常繁忙,處理各種各樣的病人。 " .. "醫生都是剛剛畢業的實習醫生,因此需要建造一間培訓室對他們進行培訓,提高能力。 " .. "您只有3名專家可以幫助培訓這些員工,因此一定要讓專家快樂。 " .. "另外要注意的是,醫院的位置不是很好。 " .. "經常會發生地震。 " .. "地震將對醫院中的機器產生損壞,從而影響醫院的運營。 " .. "使您聲望達到400以上,現金達到$50,000。另外需要治癒200個病人。", level4 = "使所有的病人快樂,保持治療的高效率並儘量降低死亡人數。 " .. "聲望是十分重要的,因此儘量贏得更高的聲望。 " .. "不要太多擔心收入情況-當聲望提高了,收入也自然會提高。 " .. "您需要培訓您的醫生,拓寬他們的能力。 " .. "這樣他們就可以更好的為病人服務。 " .. "勝利條件是聲望達到500以上。", level14 = "這裡還有一個挑戰-一個充滿驚奇的醫院。 " .. "如果您能夠成功完成這個任務,則您將成為所有勝利者中的佼佼者。 " .. "不要認為完成這個任務就像吃蛋糕一樣,這將是您所遇到的最艱苦的工作。 " .. "祝您好運!", level15 = "好的,下面是管理醫院的一些技巧。// " .. "醫生需要各種幫助來診斷病人。您可以 " .. "建造另一個診斷類房間,例如高級診斷室。", level8 = "需要您來建造一座高效的醫院。 " .. "很多人都無事可做,因此需要適量的裁員以保持高效。 " .. "記住治癒病人是很重要的一件事情,但是您更要從中賺錢。 " .. "讓噁心嘔吐的病人靠近清潔工人。 " .. "需要賺取$300,000就可以過關。", level13 = "您的高超管理技能被特殊機密部門獲知。 " .. "他們將向您提高特別獎金,因為他們有一座被老鼠困擾的醫院需要有效管理。 " .. "您必須殺死盡可能多的老鼠,並讓清潔工人打掃乾淨。 " .. "接受這個任務?", level16 = "當對病人完成診斷後,需要建造處理和治療類房間完成對病人的治療工作。可以從 " .. "建造藥房開始。在藥房中需要一名護士分配各種藥品。", level6 = "使用您的所有知識來建造一個運行平穩的醫院,從而可以賺取利潤並處理任何問題。 " .. "您需要注意一點,醫院周圍的空氣對細菌繁殖,傳染病流行非常適宜。 " .. "如果您沒有保持醫院的清潔,則將面對傳染病的流行。 " .. "賺取$150,000,並使醫院價值超過$140,000。", level12 = "您現在遇到了最大的挑戰。 " .. "我們為您的成功感到由衷地高興,衛生署為您準備了一項頂級工作;他們需要有人建造另一個超級醫院,賺錢的同時獲取較高的聲望。 " .. "您可以購買任何需要的土地,治療各種疾病贏得各種獎勵。 " .. "動心了嗎? " .. "賺取$650,000,治癒750個病人,使聲望達到800就可以勝利過關。", level3 = "這次您將在一個富裕地區建造醫院。 " .. "衛生署希望您能夠在這裡賺取更多的利潤。 " .. "開始時您被要求獲取好的聲望,但是一旦醫院步入正軌,就可以集中精力賺取更多的錢。 " .. "有可能會發生緊急事件。 " .. "也就是說一次會有大量病人就診,且他們的病情都一樣。 " .. "在時間限制內如果能夠治癒他們,則不僅可以拿到獎金,聲望也會提高。 " .. "一些疾病如貓王症侯群等有可能發生,因此最好建造一間手術中心和附屬病房。 " .. "勝利條件是賺取$20,000。", level10 = "隨著您的經驗不斷增長,衛生署要求您集中精力提高藥品的治療效果。 " .. "有人對您頗有微辭,為此您必須使所有的藥物都非常有效。 " .. "另外,一定要降低醫療事故的發生次數,減少死亡人數。 " .. "作為提示,您需要為建造膠桶留一些空地。 " .. "使所有藥物的療效都達到80%%,聲望達到650且在銀行帳戶上有$500,000,這樣就可以勝利過關。", level11 = "現在您有機會建造一座終極醫院。 " .. "該地區享有極高的聲望,因此衛生署希望能夠看到最好的醫院建造在這裡。 " .. "我們希望您能夠賺取大量的金錢,獲得很高的聲望,並能夠成功地處理任何事件。 " .. "這是一項非常重要的工作。 " .. "這需要您的努力工作。 " .. "注意一點,該區域常常會看到不明飛行物。因此請讓您的員工做好準備迎接不速之客。 " .. "您的醫院價值需要達到$240,000,在銀行帳戶內需要$500,000,且聲望需要達到700。", level18 = "", } humanoid_name_starts = { [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] = "科", [28] = "維特", [29] = "比恩", [30] = "寶恩", [31] = "伯格", [32] = "懷特", [33] = "科爾", } transactions = { severance = "隔離花費", research = "研究花費", eoy_trophy_bonus = "年度物品獎勵", buy_object = "購買物品", cure_colon = "治療:", epidemy_coverup_fine = "隱瞞傳染病罰款", final_treat_colon = "最終治療:", jukebox = "收入:音樂盒", loan_interest = "貸款利率", overdraft = "透支利率", wages = "工資", loan_repayment = "貸款償還", personal_bonus = "支付個人獎金", drug_cost = "藥品花費", cure = "治癒", heating = "供暖費", treat_colon = "治療:", compensation = "政府賠償金", epidemy_fine = "傳染病罰款", buy_land = "購買土地", research_bonus = "研究獎金", general_bonus = "支付一般獎金", deposit = "治療收入", eoy_bonus_penalty = "年度獎金/罰款", cheat = "騙錢", drinks = "收入:飲料販賣機", vaccination = "接種疫苗", advance_colon = "進階:", vip_award = "貴賓現金獎勵", hire_staff = "雇用員工", bank_loan = "銀行貸款", machine_replacement = "更換機器花費", emergency_bonus = "支付緊急事件獎金", build_room = "建造房屋", insurance_colon = "保險費:", sell_object = "賣出物品", } object = { chair = "椅子", sofa = "沙發", operating_table = "手術臺", bed2 = "床", bench = "長椅", scanner = "掃描儀", couch = "長沙發椅", blood_machine = "血液機器", table1 = "桌子", video_game = "電視遊戲", lamp = "燈", op_sink2 = "洗手台", door = "房門", auto_autopsy = "自動驗屍儀", reception_desk = "服務台", hair_restorer = "毛髮恢復機", projector = "放映機", crash_trolley = "診斷儀器小推車", tv = "電視機", ultrascanner = "超級掃瞄儀", surgeon_screen = "外科屏風", litter_bomb = "垃圾炸彈", inflator = "充氣機", table2 = "桌子", desk = "辦公桌", pool_table = "撞球桌", x_ray_viewer = "X光透視儀", radiation_shield = "射線防護", bed = "床", swing_door2 = "轉門", console = "控制台", op_sink1 = "洗手台", bookcase = "書櫃", drinks_machine = "自動販賣機", comfortable_chair = "舒適座椅", skeleton = "骨骼模型", computer = "計算機", bin = "垃圾桶", pharmacy_cabinet = "醫藥櫃", radiator = "暖氣", cast_remover = "石膏剝離裝置", atom_analyser = "原子分析儀", plant = "盆栽", jelly_moulder = "膠桶", cardio = "心電圖儀", toilet = "廁所", electrolyser = "電分解機器", fire_extinguisher = "滅火器", bed3 = "床", swing_door1 = "轉門", lecture_chair = "演講座位", screen = "屏風", toilet_sink = "洗手台", shower = "淋浴", gates_of_hell = "地獄之門", entrance_right = "左入口", entrance_left = "右入口", slicer = "舌頭治療機", dna_fixer = "DNA修復裝置", x_ray = "X光機", cabinet = "文件櫃", } letter = { [1] = { [1] = "親愛的%s//", [2] = "太令人驚奇了!您已經成功地經營了這個醫院。衛生署的官員想要知道您是否有興趣接手一個大項目。我們認為有一個工作對您很適合。薪水將達到$%d。怎麼樣。//", [3] = "您是否對%s醫院的工作感興趣?", }, [2] = { [1] = "親愛的%s//", [2] = "太棒了!您的醫院經營得很好。我們又有了一些新的任務如果您喜歡新的挑戰,可以接受這項任務。您不要勉強,但這項工作確實很適合您。薪水是$%d//", [3] = "您希望接管%s醫院嗎?", }, [3] = { [1] = "親愛的%s//", [2] = "在您接管這座醫院期間,管理非常成功。因此,我們對您寄予厚望,並為您找到了一個新的工作。薪水將達到$%d,同時我們也希望您喜歡新的挑戰。//", [3] = "您希望接手%s醫院嗎?", }, [4] = { [1] = "親愛的%s//", [2] = "恭喜!部門官員對您的能力讚不絕口。您是衛生署的第一高手。我們覺得您一定喜歡更困難的工作。您的薪水將達到$%d,但決定權在您手中。//", [3] = "您是否願意在%s醫院工作?", }, [5] = { [1] = "親愛的%s//", [2] = "您好。我們尊重您不希望離開這個迷人的醫院,但是提醒您要仔細考慮。您的薪水將達到$%d,如果您願意到其它醫院工作並將其運行得很好。//", [3] = "您現在是否願意移動到%s醫院?", }, [6] = { [1] = "親愛的%s//", [2] = "恭喜。我們理解您在這個可愛的運行良好醫院中工作的快樂心情,但是我們認為您現在應該為未來考慮。您的薪水將達到$%d,如果您決定調任。這是很值得考慮的。//", [3] = "您是否願意接手%s醫院?", }, [7] = { [1] = "親愛的%s//", [2] = "您好!衛生署想要知道您經過重新考慮是否決定仍然留在當前的醫院中。我們很欣賞您現在那個可愛的醫院,但我們覺得您如果願意接受這個極富挑戰性的工作,也一定能幹得很好,並且您的薪水將達到$%d。//", [3] = "您是否願意接手%s醫院?", }, [8] = { [1] = "親愛的%s//", [2] = "您好。您否定了我們上一封信中提供的新醫院,以及薪水$%d。我們覺得不論怎樣,您必須重新考慮這個決定。我們已經為您準備了一個很好的工作。//", [3] = "您是否願意接手%s醫院?怎麼樣?", }, [9] = { [1] = "親愛的%s//", [2] = "您已經成功地證明了自己是醫學界有史以來最棒的管理者。這樣的成就一定要給予獎勵,因此我們決定任命您為所有醫院的至尊主席。這是一項光榮的工作,且薪水可以達到$%d。不論您走到那裡,都將受到人們的熱烈歡迎。//", [3] = "感謝您的努力工作。希望您好好享受未來的半退休生活。//", [4] = "", }, [10] = { [1] = "親愛的%s//", [2] = "恭喜您在我們指派的每個醫院中的成功管理。您的成功表現使您可以自由出入世界各大城市。您將獲得退休金$%d,再加上一輛轎車,我們希望您在旅途中能夠促進各個醫院管理水準的提高。//", [3] = "我們都為您感到驕傲。我們中間每個人都為您挽救生命感到由衷的感謝。//", [4] = "", }, [11] = { [1] = "親愛的%s//", [2] = "您的工作十分成功,我們從您身上獲得了靈感。謝謝您管理了這麼多個醫院,並使它們都運行得很出色。我們將給予您終身工資$%d,並提供政府敞蓬轎車使您可以從一個城市到另一個城市,發表演講告訴公眾您是怎樣在這麼短的時間內達到如此成就。//", [3] = "您是所有人的榜樣,毫無例外,世界上每個人都以您為榮。//", [4] = "", }, [12] = { [1] = "親愛的%s//", [2] = "您的成就使您成為最好的醫院管理者。衛生署將向您提供$%d作為獎勵,並召開慶祝會。整個世界都在為您沸騰,太棒了!//", [3] = "請接受我們的安排。如果您不再希望辛苦工作,我們將向您提供一輛轎車,且無論走到那裡,都有警察為您開路。//", [4] = "", }, } high_score = { categories = { deaths = "死亡人數", total_value = "總價值", money = "最富有", cures = "治癒人數", visitors = "造訪者最多", staff_number = "員工數目最多", cure_death_ratio = "醫治無效死亡率", patient_happiness = "顧客滿意", staff_happiness = "員工滿意", salary = "工資最高", clean = "最乾淨", }, player = "玩家", score = "分數", pos = "名次", best_scores = "榮譽堂", worst_scores = "恥辱堂", killed = "殺死病人數目", } menu_file_save = { [1] = " 存檔一 ", [2] = " 存檔二 ", [3] = " 存檔三 ", [4] = " 存檔四 ", [5] = " 存檔五 ", [6] = " 存檔六 ", [7] = " 存檔七 ", [8] = " 存檔八 ", } build_room_window = { pick_room_type = "選擇房間類型", pick_department = "選擇部門", cost = "花費:", } menu = { debug = " DEBUG", display = " 顯示", file = " 文件", options = " 選項", charts = " 圖表", } CorsixTH-0.63/CorsixTH/Lua/map.lua000066400000000000000000000632151347163623700166740ustar00rootroot00000000000000--[[ Copyright (c) 2009 Peter "Corsix" Cawley 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. --]] --! Lua extensions to the C++ THMap class class "Map" ---@type Map local Map = _G["Map"] local pathsep = package.config:sub(1, 1) local math_floor, tostring, table_concat = math.floor, tostring, table.concat local thMap = require("TH").map function Map:Map(app) self.width = false self.height = false self.th = thMap() self.app = app self.debug_text = false self.debug_flags = false self.debug_font = false self.debug_tick_timer = 1 self:setTemperatureDisplayMethod(app.config.warmth_colors_display_default) end local flag_cache = {} --! Get the value of the given flag from the tile at x, y in the map. --!param x (int) Horizontal position of the tile to query in the map. --!param x (int) Vertical position of the tile to query in the map. --!param flag (string) Name of the queried flag. --!return (?) value of the queried flag. function Map:getCellFlag(x, y, flag) return self.th:getCellFlags(math.floor(x), math.floor(y), flag_cache)[flag] end --! Get the ID of the room of the tile at x, y in the map. --!param x (int) Horizontal position of the tile to query in the map. --!param x (int) Vertical position of the tile to query in the map. --!return ID of the room at the queried tile. function Map:getRoomId(x, y) return self.th:getCellFlags(math.floor(x), math.floor(y)).roomId end function Map:setPlayerCount(count) self.th:setPlayerCount(count) end function Map:getPlayerCount(count) self.th:getPlayerCount(count) end --! Set the camera tile for the given player on the map --!param x (int) Horizontal position of tile to set camera on --!param y (int) Vertical position of the tile to set the camera on --!param player (int) Player number (1-4) function Map:setCameraTile(x, y, player) self.th:setCameraTile(x, y, player) end --! Set the heliport tile for the given player on the map --!param x (int) Horizontal position of tile to set heliport on --!param y (int) Vertical position of the tile to set the heliport on --!param player (int) Player number (1-4) function Map:setHeliportTile(x, y, player) self.th:setHeliportTile(x, y, player) end --! Set how to display the room temperature in the hospital map. --!param method (int) Way of displaying the temperature. See also THMapTemperatureDisplay enum. --! 1=red gradients, 2=blue/green/red colour shifts, 3=yellow/orange/red colour shifts function Map:setTemperatureDisplayMethod(method) if method ~= 1 and method ~= 2 and method ~= 3 then method = 1 end self.temperature_display_method = method self.app.config.warmth_colors_display_default = method self.th:setTemperatureDisplay(method) end --! Copy the temperature display method from the Lua data, if available, else use the default. function Map:registerTemperatureDisplayMethod() if not self.temperature_display_method then self:setTemperatureDisplayMethod(self.app.config.warmth_colors_display_default) end self.th:setTemperatureDisplay(self.temperature_display_method) end -- Convert between world co-ordinates and screen co-ordinates -- World co-ordinates are (at least for standard maps) in the range [1, 128) -- for both x and y, with the floor of the values giving the cell index. -- Screen co-ordinates are pixels relative to the map origin - NOT relative to -- the top-left corner of the screen (use UI:WorldToScreen and UI:ScreenToWorld -- for this). function Map:WorldToScreen(x, y) if x == nil then x = 0 end if y == nil then y = 0 end -- Adjust origin from (1, 1) to (0, 0) and then linear transform by matrix: -- 32 -32 -- 16 16 return 32 * (x - y), 16 * (x + y - 2) end function Map:ScreenToWorld(x, y) -- Transform by matrix: (inverse of the WorldToScreen matrix) -- 1/64 1/32 -- -1/64 1/32 -- And then adjust origin from (0, 0) to (1, 1) y = y / 32 + 1 x = x / 64 local tile_x, tile_y = y + x, y - x if self.width ~= nil and self.height ~= nil then if tile_x < 1 then tile_x = 1 end if tile_x > self.width then tile_x = self.width end if tile_y < 1 then tile_y = 1 end if tile_y > self.height then tile_y = self.height end end return tile_x, tile_y end local function bits(n) local vals = {} local m = 256 while m >= 1 do if n >= m then vals[#vals + 1] = m n = n - m end m = m / 2 end if vals[1] then return unpack(vals) else return 0 end end --[[! Loads the specified level. If a string is passed it looks for the file with the same name in the "Levels" and/or "Campaigns" folder of CorsixTH, if it is a number it tries to load that level from the original game. !param level (string or int) The name (or number) of the level to load. If this is a number the game assumes the original game levels are considered. !param level_name (string) The name of the actual map/area/hospital as written in the config file. !param map_file (string) The path to the map file as supplied by the config file. !param level_intro (string) If loading a custom level this message will be shown as soon as the level has been loaded. ]] function Map:load(level, difficulty, level_name, map_file, level_intro, map_editor) local objects if not difficulty then difficulty = "full" end -- Load CorsixTH base configuration for all levels. -- We want to load the file again each time. local function file (filename) local f = assert(loadfile(filename)) return f() end local path = debug.getinfo(1, "S").source:sub(2, -12) local result = file(path .. "Lua" .. pathsep .. "base_config.lua") local base_config = result local _ if type(level) == "number" then local errors, data -- Playing the original campaign. -- Add TH's base config if possible, otherwise our own config -- roughly corresponds to "full". errors, base_config = self:loadMapConfig(difficulty .. "00.SAM", base_config) -- If it couldn't be loaded the new difficulty level is full no matter what. if errors then difficulty = "full" end self.difficulty = difficulty self.level_number = level data, errors = self:getRawData(map_file) if data then _, objects = self.th:load(data) else return nil, errors end self.level_name = _S.level_names[level]:upper() -- Check if we're using the demo files. If we are, that special config should be loaded. if self.app.using_demo_files then -- Try to load our own configuration file for the demo. local p = debug.getinfo(1, "S").source:sub(2, -12) .. "Levels" .. pathsep .. "demo.level" errors, result = self:loadMapConfig(p, base_config, true) if errors then print("Warning: Could not find the demo configuration, try reinstalling the game") end self.level_config = result else local level_no = level if level_no < 10 then level_no = "0" .. level end -- Override with the specific configuration for this level _, result = self:loadMapConfig(difficulty .. level_no .. ".SAM", base_config) -- Finally load additional CorsixTH config per level local p = debug.getinfo(1, "S").source:sub(2, -12) .. "Levels" .. pathsep .. "original" .. level_no .. ".level" _, result = self:loadMapConfig(p, result, true) self.level_config = result end elseif map_editor then -- We're being fed data by the map editor. self.level_name = "MAP EDITOR" self.level_number = "MAP EDITOR" if level == "" then _, objects = self.th:loadBlank() else local data, errors = self:getRawData(level) if data then _, objects = self.th:load(data) else return nil, errors end end assert(base_config, "No base config has been loaded!") self.level_config = base_config else -- We're loading a custom level. self.level_name = level_name self.level_intro = level_intro self.level_number = level self.map_file = map_file local data, errors = self:getRawData(map_file) if data then _, objects = self.th:load(data) else return nil, errors end assert(base_config, "No base config has been loaded!") errors, result = self:loadMapConfig(self.app:getAbsolutePathToLevelFile(level), base_config, true) if errors then print(errors) end self.level_config = result end self.width, self.height = self.th:size() self.parcelTileCounts = {} for plot = 1, self.th:getPlotCount() do self.parcelTileCounts[plot] = self.th:getParcelTileCount(plot) if not map_editor then self:setPlotOwner(plot, plot <= self.th:getPlayerCount() and plot or 0) end end return objects end --[[! Sets the plot owner of the given plot number to the given new owner. Makes sure that any room adjacent to the new plot have walls in all directions after the purchase. !param plot_number (int) Number of the plot to change owner of. Plot 0 is the outside and should never change owner. !param new_owner (int) The player number that should own plot_number. 0 means no owner. ]] function Map:setPlotOwner(plot_number, new_owner) local split_tiles = self.th:setPlotOwner(plot_number, new_owner) for _, coordinates in ipairs(split_tiles) do local x = coordinates[1] local y = coordinates[2] local _, north_wall, west_wall = self.th:getCell(x, y) local cell_flags = self.th:getCellFlags(x, y) local north_cell_flags = self.th:getCellFlags(x, y - 1) local west_cell_flags = self.th:getCellFlags(x - 1, y) local wall_dirs = { south = { layer = north_wall, block_id = 2, room_cell_flags = cell_flags, adj_cell_flags = north_cell_flags, tile_cat = 'inside_tiles', wall_dir = 'north' }, north = { layer = north_wall, block_id = 2, room_cell_flags = north_cell_flags, adj_cell_flags = cell_flags, tile_cat = 'outside_tiles', wall_dir = 'north' }, east = { layer = west_wall, block_id = 3, room_cell_flags = cell_flags, adj_cell_flags = west_cell_flags, tile_cat = 'inside_tiles', wall_dir = 'west' }, west = { layer = west_wall, block_id = 3, room_cell_flags = west_cell_flags, adj_cell_flags = cell_flags, tile_cat = 'outside_tiles', wall_dir = 'west' }, } for _, dir in pairs(wall_dirs) do if dir.layer == 0 and dir.room_cell_flags.roomId ~= 0 and dir.room_cell_flags.parcelId ~= dir.adj_cell_flags.parcelId then local room = self.app.world.rooms[dir.room_cell_flags.roomId] local wall_type = self.app.walls[room.room_info.wall_type][dir.tile_cat][dir.wall_dir] self.th:setCell(x, y, dir.block_id, wall_type) end end end self.th:updatePathfinding() end --[[! Saves the map to a .map file !param filename (string) Name of the file to save the map in ]] function Map:save(filename) self.th:save(filename) end --[[! Loads map configurations from files. Returns nil as first result if no configuration could be loaded and config as second result no matter what. !param filename (string) The absolute path to the config file to load !param config (string) If a base config already exists and only some values should be overridden this is the base config !param custom If true The configuration file is searched for where filename points, otherwise it is assumed that we're looking in the theme_hospital_install path. ]] function Map:loadMapConfig(filename, config, custom) local function iterator() if custom then return io.lines(filename) else return self.app.fs:readContents("Levels", filename):gmatch"[^\r\n]+" end end if self.app.fs:readContents("Levels", filename) or io.open(filename) then for line in iterator() do if line:sub(1, 1) == "#" then local parts = {} local nkeys = 0 for part in line:gmatch"%.?[-?a-zA-Z0-9%[_%]]+" do if part:sub(1, 1) == "." and #parts == nkeys + 1 then nkeys = nkeys + 1 end parts[#parts + 1] = part end if nkeys == 0 then parts[3] = parts[2] parts[2] = ".Value" nkeys = 1 end for i = 2, nkeys + 1 do local key = parts[1] .. parts[i] local t, n for name in key:gmatch"[^.%[%]]+" do name = tonumber(name) or name if t then if not t[n] then t[n] = {} end t = t[n] else t = config end n = name end t[n] = tonumber(parts[nkeys + i]) or parts[nkeys + i] end end end return nil, config else return "Error: Could not find the configuration file, only 'Base Config' will be loaded for this level.", config end end local temp_debug_text local temp_debug_flags local temp_updateDebugOverlay local temp_thData -- Keep debug information in temporary local vars, do not save them function Map:prepareForSave() temp_debug_text = self.debug_text self.debug_text = false temp_debug_flags = self.debug_flags self.debug_flags = false temp_updateDebugOverlay = self.updateDebugOverlay self.updateDebugOverlay = nil temp_thData = self.thData self.thData = nil end -- Restore the temporarily stored debug information after saving function Map:afterSave() self.debug_text = temp_debug_text temp_debug_text = nil self.debug_flags = temp_debug_flags temp_debug_flags = nil self.updateDebugOverlay = temp_updateDebugOverlay temp_updateDebugOverlay = nil self.thData = temp_thData temp_thData = nil end function Map:clearDebugText() self.debug_text = false self.debug_flags = false self.updateDebugOverlay = nil end function Map:getRawData(map_file) if not self.thData then local data, errors if not map_file then data, errors = self.app:readDataFile("Levels", "Level.L".. self.level_number) else data, errors = self.app:readDataFile("Levels", map_file) end if data then self.thData = data else return nil, errors end end return self.thData end function Map:updateDebugOverlayFlags() for x = 1, self.width do for y = 1, self.height do local xy = (y - 1) * self.width + x - 1 self.th:getCellFlags(x, y, self.debug_flags[xy]) end end end function Map:updateDebugOverlayHeat() for x = 1, self.width do for y = 1, self.height do local xy = (y - 1) * self.width + x - 1 self.debug_text[xy] = ("%02.1f"):format(self.th:getCellTemperature(x, y) * 50) end end end function Map:updateDebugOverlayParcels() for x = 1, self.width do for y = 1, self.height do local xy = (y - 1) * self.width + x - 1 self.debug_text[xy] = self.th:getCellFlags(x, y).parcelId if self.debug_text[xy] == 0 then self.debug_text[xy] = '' end end end end function Map:updateDebugOverlayCamera() for x = 1, self.width do for y = 1, self.height do local xy = (y - 1) * self.width + x - 1 self.debug_text[xy] = '' end end for p = 1, self.th:getPlayerCount() do local x, y = self.th:getCameraTile(p) if x and y then local xy = (y - 1) * self.width + x - 1 self.debug_text[xy] = 'C'..p end end end function Map:updateDebugOverlayHeliport() for x = 1, self.width do for y = 1, self.height do local xy = (y - 1) * self.width + x - 1 self.debug_text[xy] = '' end end for p = 1, self.th:getPlayerCount() do local x, y = self.th:getHeliportTile(p) if x and y then local xy = (y - 1) * self.width + x - 1 self.debug_text[xy] = 'H'..p end end end function Map:loadDebugText(base_offset, xy_offset, first, last, bits_) self.debug_text = false self.debug_flags = false self.updateDebugOverlay = nil if base_offset == "flags" then self.debug_flags = {} for x = 1, self.width do for y = 1, self.height do local xy = (y - 1) * self.width + x - 1 self.debug_flags[xy] = {} end end self.updateDebugOverlay = self.updateDebugOverlayFlags self:updateDebugOverlay() elseif base_offset == "positions" then self.debug_text = {} for x = 1, self.width do for y = 1, self.height do local xy = (y - 1) * self.width + x - 1 self.debug_text[xy] = x .. "," .. y end end elseif base_offset == "heat" then self.debug_text = {} self.updateDebugOverlay = self.updateDebugOverlayHeat self:updateDebugOverlay() elseif base_offset == "parcel" then self.debug_text = {} self.updateDebugOverlay = self.updateDebugOverlayParcels self:updateDebugOverlay() elseif base_offset == "camera" then self.debug_text = {} self.updateDebugOverlay = self.updateDebugOverlayCamera self:updateDebugOverlay() elseif base_offset == "heliport" then self.debug_text = {} self.updateDebugOverlay = self.updateDebugOverlayHeliport self:updateDebugOverlay() else local thData = self:getRawData() for x = 1, self.width do for y = 1, self.height do local xy = (y - 1) * self.width + x - 1 local offset = base_offset + xy * xy_offset if bits_ then self:setDebugText(x, y, bits(thData:byte(offset + first, offset + last))) else self:setDebugText(x, y, thData:byte(offset + first, offset + last)) end end end end end function Map:onTick() if self.debug_tick_timer == 1 then if self.updateDebugOverlay then self:updateDebugOverlay() end self.debug_tick_timer = 10 else self.debug_tick_timer = self.debug_tick_timer - 1 end end --! Set the sprites to be used by the map. --!param blocks (object) Sprite sheet for the map. function Map:setBlocks(blocks) self.blocks = blocks self.th:setSheet(blocks) end function Map:setCellFlags(...) self.th:setCellFlags(...) end function Map:setDebugFont(font) self.debug_font = font self.cell_outline = TheApp.gfx:loadSpriteTable("Bitmap", "aux_ui", true) end function Map:setDebugText(x, y, msg, ...) if not self.debug_text then self.debug_text = {} end local text if ... then text = {msg, ...} for i, v in ipairs(text) do text[i] = tostring(v) end text = table_concat(text, ",") else text = msg ~= 0 and msg or nil end self.debug_text[(y - 1) * self.width + x - 1] = text end --! Draws the rectangle of the map given by (sx, sy, sw, sh) at position (dx, dy) on the canvas --!param canvas --!param sx Horizontal start position at the screen. --!param sy Vertical start position at the screen. --!param sw (int) Width of the screen. --!param sh (int) Height of the screen. --!param dx (jnt) Horizontal destination at the canvas. --!param dy (int) Vertical destination at the canvas. --]] function Map:draw(canvas, sx, sy, sw, sh, dx, dy) -- All the heavy work is done by C code: self.th:draw(canvas, sx, sy, sw, sh, dx, dy) -- Draw any debug overlays if self.debug_font and (self.debug_text or self.debug_flags) then local startX = 0 local startY = math_floor((sy - 32) / 16) if startY < 0 then startY = 0 elseif startY >= self.height then startX = startY - self.height + 1 startY = self.height - 1 if startX >= self.width then startX = self.width - 1 end end local baseX = startX local baseY = startY while true do local x = baseX local y = baseY local screenX = 32 * (x - y) - sx local screenY = 16 * (x + y) - sy if screenY >= sh + 70 then break elseif screenY > -32 then repeat if screenX < -32 then elseif screenX < sw + 32 then local xy = y * self.width + x local xpos = dx + screenX - 32 local ypos = dy + screenY if self.debug_flags then local flags = self.debug_flags[xy] if flags.passable then self.cell_outline:draw(canvas, 3, xpos, ypos) end if flags.hospital then self.cell_outline:draw(canvas, 8, xpos, ypos) end if flags.buildable then self.cell_outline:draw(canvas, 9, xpos, ypos) end if flags.travelNorth and self.debug_flags[xy - self.width].passable then self.cell_outline:draw(canvas, 4, xpos, ypos) end if flags.travelEast and self.debug_flags[xy + 1].passable then self.cell_outline:draw(canvas, 5, xpos, ypos) end if flags.travelSouth and self.debug_flags[xy + self.width].passable then self.cell_outline:draw(canvas, 6, xpos, ypos) end if flags.travelWest and self.debug_flags[xy - 1].passable then self.cell_outline:draw(canvas, 7, xpos, ypos) end if flags.thob ~= 0 then self.debug_font:draw(canvas, "T"..flags.thob, xpos, ypos, 64, 16) end if flags.roomId ~= 0 then self.debug_font:draw(canvas, "R"..flags.roomId, xpos, ypos + 16, 64, 16) end else local msg = self.debug_text[xy] if msg and msg ~= "" then self.cell_outline:draw(canvas, 2, xpos, ypos) self.debug_font:draw(canvas, msg, xpos, ypos, 64, 32) end end else break end x = x + 1 y = y - 1 screenX = screenX + 64 until y < 0 or x >= self.width end if baseY == self.height - 1 then baseX = baseX + 1 if baseX == self.width then break end else baseY = baseY + 1 end end end end --! Get the price of a parcel --!param parcel (int) Parcel number being queried. --!return Price of the queried parcel. function Map:getParcelPrice(parcel) local conf = self.level_config conf = conf and conf.gbv conf = conf and conf.LandCostPerTile return self:getParcelTileCount(parcel) * (conf or 25) end --! Get the number of tiles in a parcel. --!param parcel (int) Parcel number being queried. --!return Number of tiles in the queried parcel. function Map:getParcelTileCount(parcel) return self.parcelTileCounts[parcel] or 0 end function Map:afterLoad(old, new) if old < 6 then self.parcelTileCounts = {} for plot = 1,self.th:getPlotCount() do self.parcelTileCounts[plot] = self.th:getParcelTileCount(plot) end end if old < 18 then self.difficulty = "full" end if old < 44 then self.level_config.expertise[2].MaxDiagDiff = 700 self.level_config.expertise[3].MaxDiagDiff = 250 self.level_config.expertise[4].MaxDiagDiff = 250 self.level_config.expertise[5].MaxDiagDiff = 250 self.level_config.expertise[6].MaxDiagDiff = 250 self.level_config.expertise[7].MaxDiagDiff = 250 self.level_config.expertise[8].MaxDiagDiff = 350 self.level_config.expertise[9].MaxDiagDiff = 250 self.level_config.expertise[10].MaxDiagDiff = 250 self.level_config.expertise[11].MaxDiagDiff = 700 self.level_config.expertise[12].MaxDiagDiff = 1000 self.level_config.expertise[13].MaxDiagDiff = 700 self.level_config.expertise[14].MaxDiagDiff = 400 self.level_config.expertise[15].MaxDiagDiff = 350 self.level_config.expertise[16].MaxDiagDiff = 350 self.level_config.expertise[17].MaxDiagDiff = 1000 self.level_config.expertise[18].MaxDiagDiff = 350 self.level_config.expertise[19].MaxDiagDiff = 700 self.level_config.expertise[20].MaxDiagDiff = 700 self.level_config.expertise[21].MaxDiagDiff = 700 self.level_config.expertise[22].MaxDiagDiff = 350 self.level_config.expertise[23].MaxDiagDiff = 350 self.level_config.expertise[24].MaxDiagDiff = 700 self.level_config.expertise[25].MaxDiagDiff = 700 self.level_config.expertise[26].MaxDiagDiff = 700 self.level_config.expertise[27].MaxDiagDiff = 350 self.level_config.expertise[28].MaxDiagDiff = 700 self.level_config.expertise[29].MaxDiagDiff = 1000 self.level_config.expertise[30].MaxDiagDiff = 700 self.level_config.expertise[31].MaxDiagDiff = 1000 self.level_config.expertise[32].MaxDiagDiff = 700 self.level_config.expertise[33].MaxDiagDiff = 1000 self.level_config.expertise[34].MaxDiagDiff = 700 self.level_config.expertise[35].MaxDiagDiff = 700 end if old < 57 then local flags_to_set = {buildableNorth = true, buildableSouth = true, buildableWest = true, buildableEast = true} for x = 1, self.width do for y = 1, self.height do self:setCellFlags(x, y, flags_to_set) end end end if old < 120 then -- Issue #1105 update pathfinding (rebuild walls) potentially broken by side object placement self.th:updatePathfinding() end end CorsixTH-0.63/CorsixTH/Lua/movie_player.lua000066400000000000000000000177411347163623700206150ustar00rootroot00000000000000--[[ Copyright (c) 2012 Stephen Baker 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. --]] --! Layer which handles the Lua-facing side of loading and playing video. local TH = require("TH") local pathsep = package.config:sub(1, 1) class "MoviePlayer" ---@type MoviePlayer local MoviePlayer = _G["MoviePlayer"] --! Calculate the position and size for a movie --! --! Returns x and y position and width and height for the movie to be displayed --! based on the native size of the movie and the current screen dimensions local calculateSize = function(me) -- calculate target dimensions local x, y, w, h local screen_w, screen_h = me.app.config.width, me.app.config.height local native_w = me.moviePlayer:getNativeWidth() local native_h = me.moviePlayer:getNativeHeight() if native_w ~= 0 and native_h ~= 0 then local ar = native_w / native_h if math.abs((screen_w / screen_h) - ar) < 0.001 then x, y = 0, 0 w, h = screen_w, screen_h else if screen_w > screen_h / native_h * native_w then w = math.floor(screen_h / native_h * native_w) h = screen_h x = math.floor((screen_w - w) / 2) y = 0 else w = screen_w h = math.floor(screen_w / native_w * native_h) x = 0 y = math.floor((screen_h - h) / 2) end end else x, y = 0, 0 w, h = screen_w, screen_h end return x, y, w, h end local destroyMovie = function(me) me.moviePlayer:unload() if me.opengl_mode_index then me.app.modes[me.opengl_mode_index] = "opengl" end if me.channel >= 0 then me.audio:releaseChannel(me.channel) me.channel = -1 end if me.holding_bg_music then -- If possible we want to continue playing music where we were me.audio:pauseBackgroundTrack() else me.audio:playRandomBackgroundTrack() end me.playing = false if me.callback_on_destroy_movie then me.callback_on_destroy_movie() me.callback_on_destroy_movie = nil end end function MoviePlayer:MoviePlayer(app, audio, video) self.app = app self.audio = audio self.video = video self.playing = false self.holding_bg_music = false self.channel = -1 self.lose_movies = {} self.advance_movies = {} self.intro_movie = nil self.win_movie = nil self.can_skip = true self.wait_for_stop = false self.wait_for_over = false end function MoviePlayer:init() self.moviePlayer = TH.moviePlayer() self.moviePlayer:setRenderer(self.video) --find movies in Anims folder local movies = self.app.fs:listFiles("Anims") if movies then for _, movie in pairs(movies) do --lose level movies if movie:upper():match(pathsep .. "LOSE%d+%.[^" .. pathsep .. "]+$") then table.insert(self.lose_movies, movie) end --advance level movies local num = movie:upper():match(pathsep .. "AREA(%d+)V%.[^" .. pathsep .. "]+$") if num ~= nil and tonumber(num, 10) ~= nil then self.advance_movies[tonumber(num, 10)] = movie end --win game movie if movie:upper():match(pathsep .. "WINGAME%.[^" .. pathsep .. "]+$") then self.win_movie = movie end end end --find intro movies = self.app.fs:listFiles("Intro") if movies then for _, movie in pairs(movies) do if movie:upper():match(pathsep .. "INTRO%.SM4$") then self.intro_movie = movie end end end end function MoviePlayer:playIntro(callback_after_movie) self:playMovie(self.intro_movie, false, true, callback_after_movie) end function MoviePlayer:playWinMovie() self:playMovie(self.win_movie, true, true) end function MoviePlayer:playAdvanceMovie(level) local filename = self.advance_movies[level] if self.moviePlayer == nil or not self.moviePlayer:getEnabled() or not self.app.config.movies or filename == nil then return end if self.audio.background_music then self.holding_bg_music = self.audio:pauseBackgroundTrack() else end if level == 12 then self.audio:playSound("DICE122M.WAV") else self.audio:playSound("DICEYFIN.WAV") end self:playMovie(filename, true, false) end function MoviePlayer:playLoseMovie() if #self.lose_movies > 0 then local filename = self.lose_movies[math.random(#self.lose_movies)] self:playMovie(filename, true, true) end end function MoviePlayer:playMovie(filename, wait_for_stop, can_skip, callback) local success, warning if self.moviePlayer == nil or not self.moviePlayer:getEnabled() or not self.app.config.movies or filename == nil then if callback then callback() end return end success, warning = self.moviePlayer:load(filename) if warning ~= nil and warning ~= "" then local message = "MoviePlayer:playMovie - Warning: " .. warning if self.app.world then self.app.world:gameLog(message) elseif self.app.config.debug then print(message) end end if not success then -- Indicates failure to load movie if callback then callback() end return end -- Abort any loading of music self.audio.load_music = false if self.moviePlayer:hasAudioTrack() then self.channel = self.audio:reserveChannel() if self.audio.background_music then self.holding_bg_music = self.audio:pauseBackgroundTrack() end end self.video:startFrame() self.video:fillBlack() self.video:endFrame() self.can_skip = can_skip self.wait_for_stop = wait_for_stop self.wait_for_over = true self.callback_on_destroy_movie = callback self.opengl_mode_index = nil for i=1, #self.app.modes do if self.app.modes[i] == "opengl" then self.opengl_mode_index = i end end if self.opengl_mode_index then self.app.modes[self.opengl_mode_index] = "" end --TODO: Add text e.g. for newspaper headlines warning = self.moviePlayer:play(self.channel) if warning ~= nil and warning ~= "" then local message = "MoviePlayer:playMovie - Warning: " .. warning if self.app.world then self.app.world:gameLog(message) elseif self.app.config.debug then print(message) end end self.playing = true end --NB: Call after any changes to TH.surface function MoviePlayer:allocatePictureBuffer() if self.moviePlayer == nil then return end self.moviePlayer:allocatePictureBuffer() end --NB: Call before any changes to TH.surface function MoviePlayer:deallocatePictureBuffer() if self.moviePlayer == nil then return end self.moviePlayer:deallocatePictureBuffer() end function MoviePlayer:onMovieOver() if self.moviePlayer == nil then return end self.wait_for_over = false if not self.wait_for_stop then destroyMovie(self) end end function MoviePlayer:stop() if self.moviePlayer == nil then return end if self.can_skip then self.moviePlayer:stop() end self.wait_for_stop = false if not self.wait_for_over then destroyMovie(self) end end function MoviePlayer:refresh() if self.moviePlayer == nil then return end local x, y, w, h = calculateSize(self) self.moviePlayer:refresh(x, y, w, h) end function MoviePlayer:updateRenderer() if self.moviePlayer == nil then return end self.moviePlayer:setRenderer(self.video) end CorsixTH-0.63/CorsixTH/Lua/objects/000077500000000000000000000000001347163623700170365ustar00rootroot00000000000000CorsixTH-0.63/CorsixTH/Lua/objects/analyser.lua000066400000000000000000000042271347163623700213640ustar00rootroot00000000000000--[[ Copyright (c) 2009 Manuel König 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. --]] local object = {} object.id = "analyser" object.thob = 41 object.research_category = "cure" object.research_fallback = 45 object.name = _S.object.atom_analyser object.tooltip = _S.tooltip.objects.atom_analyser object.ticks = true object.class = "AtomAnalyser" object.build_preview_animation = 5092 object.show_in_town_map = true object.idle_animations = { north = 2134, south = 2134, } local function copy_north_to_south(t) t.south = t.north return t end object.usage_animations = copy_north_to_south { north = { in_use = { Doctor = {4878, object_visible = true} }, }, } object.orientations = { north = { footprint = { {-1, -1}, {0, -1}, {1, -1}, {-1, 0}, {0, 0, only_passable = true}, {1, 0} }, use_position = {0, 0}, }, east = { footprint = { {-1, -1}, {0, -1}, {-1, 0}, {0, 0, only_passable = true}, {-1, 1}, {0, 1} }, use_position = {0, 0}, }, } class "AtomAnalyser" (Object) ---@type AtomAnalyser local AtomAnalyser = _G["AtomAnalyser"] function AtomAnalyser:AtomAnalyser(...) self:Object(...) end function AtomAnalyser:getDrawingLayer() return 3 end return object CorsixTH-0.63/CorsixTH/Lua/objects/autopsy.lua000066400000000000000000000105371347163623700212530ustar00rootroot00000000000000--[[ Copyright (c) 2009 Manuel König 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. --]] local object = {} object.id = "autopsy" object.thob = 55 object.research_category = "cure" object.name = _S.object.auto_autopsy object.tooltip = _S.tooltip.objects.auto_autopsy object.ticks = true object.build_preview_animation = 5102 object.crashed_animation = 3304 object.show_in_town_map = true local function copy_north_to_south(t) t.south = t.north return t end object.idle_animations = copy_north_to_south { north = 2146, } object.usage_animations = copy_north_to_south { north = { in_use = { Handyman = 3566, }, }, } object.multi_usage_animations = {} local function anim_set(patient_type, invite_in, configure, taken_in, closing) local anims = { -- Machine door opens and bed comes out begin_use = 2154, secondary = { begin_use = Humanoid.getIdleAnimation(patient_type), }, -- Patient gets onto the bed begin_use_2 = invite_in, -- Doctor presses some buttons with patient on bed begin_use_3 = configure, -- Bed withdraws back into machine in_use = taken_in, -- Machine door closes finish_use = closing, -- Doctor stands by machine while it flashes finish_use_2 = 4010, } object.multi_usage_animations["Doctor - ".. patient_type] = { north = anims, south = anims, } end anim_set("Standard Male Patient" , 2166, 3334, 4548, 4552) anim_set("Standard Female Patient" , 3196, 3200, 3188, 3192) anim_set("Alien Male Patient" , 2166, 3334, 4548, 4552) anim_set("Alien Female Patient" , 3196, 3200, 3188, 3192) anim_set("Alternate Male Patient" , 4544, 3334, 4548, 4552) -- Incomplete anim_set("Chewbacca Patient" , 4118, 4126, 4130, 4134) anim_set("Elvis Patient" , 4086, 4090, 4094, 4098) anim_set("Slack Male Patient" , 4332, 4336, 4340, 4552) anim_set("Slack Female Patient" , 3196, 3200, 3188, 3192) -- Incomplete anim_set("Transparent Male Patient" , 4460, 4856, 4456, 4626) anim_set("Transparent Female Patient", 4860, 4804, 4796, 4800) anim_set("Invisible Patient" , 4212, 4224, 4216, 4220) object.orientations = { north = { use_position_secondary = {-2, 1}, use_position = {0, 1}, handyman_position = {0, 1}, footprint = { {-2, -1, complete_cell = true}, {-2, 0, complete_cell = true}, {-2, 1, only_passable = true}, {-1, -1, complete_cell = true}, {-1, 0, complete_cell = true}, {-1, 1, only_passable = true}, {0, -1, complete_cell = true}, {0, 0, complete_cell = true}, {0, 1, only_passable = true}, }, early_list = true, }, east = { render_attach_position = {-1, 0}, use_position_secondary = {1, -2}, use_position = {1, 0}, handyman_position = {1, 0}, footprint = { {-1, -2, complete_cell = true}, {-1, -1, complete_cell = true}, {-1, 0, complete_cell = true}, {0, -2, complete_cell = true}, {0, -1, complete_cell = true}, {0, 0, complete_cell = true}, {1, -2, only_passable = true}, {1, -1, only_passable = true}, {1, -0, only_passable = true}, }, }, } local anim_mgr = TheApp.animation_manager anim_mgr:setMarker(object.idle_animations.north, {0.0 , 0.0}) -- In (some versions of?) the original animations, 4086 has a builtin repeat, -- which looks very wrong, hence trim it to the length of a similar animation. anim_mgr:setAnimLength(4086, anim_mgr:getAnimLength(2166)) return object CorsixTH-0.63/CorsixTH/Lua/objects/bed.lua000066400000000000000000000072621347163623700203020ustar00rootroot00000000000000--[[ Copyright (c) 2009 Peter "Corsix" Cawley 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. --]] local object = {} object.id = "bed" object.thob = 8 object.research_category = "diagnosis" object.name = _S.object.bed object.tooltip = _S.tooltip.objects.bed object.ticks = false object.build_preview_animation = 910 object.show_in_town_map = true object.idle_animations = { north = 2644, east = 2646, } object.usage_animations = { north = { begin_use = { -- Patient lies down ["Standard Male Patient"] = 4686, ["Standard Female Patient"] = 4710, }, in_use = { -- Use "animation" ["Standard Male Patient"] = 4694, ["Standard Female Patient"] = 4718, }, finish_use = { -- Patient stands up again ["Standard Male Patient"] = 4702, ["Standard Female Patient"] = 4726, }, }, east = { begin_use = { -- Patient lies down ["Standard Male Patient"] = 4688, ["Standard Female Patient"] = 4712, }, in_use = { -- Use "animation" ["Standard Male Patient"] = 4696, ["Standard Female Patient"] = 4720, }, finish_use = { -- Patient stands up again ["Standard Male Patient"] = 4704, ["Standard Female Patient"] = 4728, }, }, } local anim_mgr = TheApp.animation_manager local kf1, kf2, kf3 = {1, -1}, {0.4, -1}, {-0.3, -1} anim_mgr:setMarker(object.usage_animations.north.begin_use, 0, kf1, 4, kf2, 12, kf2, 18, kf3) anim_mgr:setMarker(object.usage_animations.north.in_use, kf3) anim_mgr:setMarker(object.usage_animations.north.finish_use, 0, kf3, 6, kf3, 12, kf2, 14, kf1) -- TODO: The other direction object.orientations = { north = { footprint = { {1, -1, only_passable = true}, {-1, -1, complete_cell = true}, {0, -1, complete_cell = true}, {-1, 0, complete_cell = true}, {0, 0, complete_cell = true} }, use_position = {1, -1}, early_list = true, }, east = { footprint = { {0, 1, only_passable = true}, {-1, -1, complete_cell = true}, {0, -1, complete_cell = true}, {-1, 0, complete_cell = true}, {0, 0, complete_cell = true} }, use_position = {0, 1}, early_list = true, }, south = { footprint = { {1, 0, only_passable = true}, {-1, -1, complete_cell = true}, {0, -1, complete_cell = true}, {-1, 0, complete_cell = true}, {0, 0, complete_cell = true} }, use_position = {1, 0}, render_attach_position = {{-2,0},{-1,0},{0,0},{0,-1,}}, }, west = { footprint = { {-1, 1, only_passable = true}, {-1, -1, complete_cell = true}, {0, -1, complete_cell = true}, {-1, 0, complete_cell = true}, {0, 0, complete_cell = true} }, use_position = {-1, 1}, }, } return object CorsixTH-0.63/CorsixTH/Lua/objects/bench.lua000066400000000000000000000160651347163623700206300ustar00rootroot00000000000000--[[ Copyright (c) 2009 Peter "Corsix" Cawley 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. --]] local object = {} object.id = "bench" object.class = "Bench" object.thob = 4 object.name = _S.object.bench object.tooltip = _S.tooltip.objects.bench object.ticks = false object.corridor_object = 2 object.build_preview_animation = 902 object.dynamic_info = true object.idle_animations = { north = 112, east = 114, } object.walk_in_to_use = true object.usage_animations = { north = { begin_use = { ["Standard Male Patient" ] = 96, ["Standard Female Patient" ] = 232, ["Slack Female Patient" ] = 232, ["Transparent Male Patient" ] = 1080, ["Slack Male Patient" ] = 1500, ["Invisible Patient" ] = 1812, ["Alternate Male Patient" ] = 2732, ["Transparent Female Patient"] = 3028, ["Elvis Patient" ] = 3642, ["Chewbacca Patient" ] = 3744, ["Alien Male Patient" ] = 96, -- TEMP ["Alien Female Patient" ] = 232, -- TEMP }, in_use = { ["Standard Male Patient" ] = 146, ["Standard Female Patient" ] = 224, ["Slack Female Patient" ] = 224, ["Transparent Male Patient" ] = 1088, ["Slack Male Patient" ] = 1508, ["Invisible Patient" ] = 1820, ["Alternate Male Patient" ] = 2724, ["Transparent Female Patient"] = 3036, ["Chewbacca Patient" ] = 3760, ["Elvis Patient" ] = 4110, ["Alien Male Patient" ] = 146, -- TEMP ["Alien Female Patient" ] = 224, -- TEMP }, finish_use = { ["Standard Male Patient" ] = 216, ["Standard Female Patient" ] = 240, ["Slack Female Patient" ] = 240, ["Transparent Male Patient" ] = 1096, ["Slack Male Patient" ] = 1516, ["Invisible Patient" ] = 1828, ["Alternate Male Patient" ] = 2740, ["Transparent Female Patient"] = 3044, ["Chewbacca Patient" ] = 3752, ["Elvis Patient" ] = 4102, ["Alien Male Patient" ] = 216, -- TEMP ["Alien Female Patient" ] = 240, -- TEMP }, }, east = { begin_use = { ["Standard Male Patient" ] = 98, ["Standard Female Patient" ] = 234, ["Transparent Male Patient" ] = 1082, ["Slack Female Patient" ] = 234, ["Slack Male Patient" ] = 1502, ["Invisible Patient" ] = 1814, ["Alternate Male Patient" ] = 2734, ["Transparent Female Patient"] = 3030, ["Elvis Patient" ] = 3644, ["Chewbacca Patient" ] = 3746, ["Alien Male Patient" ] = 98, -- TEMP ["Alien Female Patient" ] = 234, -- TEMP }, in_use = { ["Standard Male Patient" ] = 148, ["Standard Female Patient" ] = 226, ["Slack Female Patient" ] = 226, ["Transparent Male Patient" ] = 1090, ["Slack Male Patient" ] = 1510, ["Invisible Patient" ] = 1822, ["Alternate Male Patient" ] = 2726, ["Transparent Female Patient"] = 3038, ["Chewbacca Patient" ] = 3762, ["Elvis Patient" ] = 4112, ["Alien Male Patient" ] = 148, -- TEMP ["Alien Female Patient" ] = 226, -- TEMP }, finish_use = { ["Standard Male Patient" ] = 218, ["Standard Female Patient" ] = 242, ["Slack Female Patient" ] = 242, ["Transparent Male Patient" ] = 1098, ["Slack Male Patient" ] = 1518, ["Invisible Patient" ] = 1830, ["Alternate Male Patient" ] = 2742, ["Transparent Female Patient"] = 3046, ["Chewbacca Patient" ] = 3754, ["Elvis Patient" ] = 4104, ["Alien Male Patient" ] = 218, -- TEMP ["Alien Female Patient" ] = 242, -- TEMP }, }, } object.orientations = { north = { render_attach_position = { {0, 0}, {-1, 0}, {0, -1} }, footprint = { {0, 0, complete_cell = true}, {0, -1, only_passable = true, invisible = true, shareable = true} }, use_position = "passable", }, east = { footprint = { {0, 0, complete_cell = true}, {1, 0, only_passable = true, invisible = true, shareable = true} }, use_position = "passable", }, south = { footprint = { {0, 0, complete_cell = true}, {0, 1, only_passable = true, invisible = true, shareable = true} }, use_position = "passable", }, west = { footprint = { {0, 0, complete_cell = true}, {-1, 0, only_passable = true, invisible = true, shareable = true} }, use_position = "passable", }, } class "Bench" (Object) ---@type Bench local Bench = _G["Bench"] function Bench:Bench(...) self:Object(...) end --Called when the patient sits up from a bench for whatever reason --Maybe related to Humanoid:removedObject(object) function Bench:removeUser(user) if user then local has_idle = false for _, action in pairs(user.action_queue) do if action.name == "idle" then has_idle = true end end -- patient must idle && action:isStanding() == true at this point if has_idle == true then user:notifyNewObject("bench") end end return Object.removeUser(self, user) end --Called when the player picks up a bench function Bench:onDestroy() -- make sure that action:isStanding() will be true, see issue 404 if self.user then for i, action in pairs(self.user.action_queue) do if action.name == "queue" then self.user.action_queue[i].current_bench_distance = nil end end end -- if patient is heading for the destroyed bench then do the same -- things as if they were sitting on it if self.reserved_for ~= nil then self.reserved_for:handleRemovedObject(self) self:removeUser(self.reserved_for) end Object.onDestroy(self) end --! This function is automatically called after loading a game and serves for compatibility. function Bench:afterLoad(old, new) if old < 119 then self.footprint = object.orientations[self.direction].footprint end Object.afterLoad(self, old, new) end return object CorsixTH-0.63/CorsixTH/Lua/objects/bin.lua000066400000000000000000000043761347163623700203230ustar00rootroot00000000000000--[[ Copyright (c) 2009 Peter "Corsix" Cawley 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. --]] local object = {} object.id = "bin" object.thob = 50 object.name = _S.object.bin object.tooltip = _S.tooltip.objects.bin object.ticks = false object.corridor_object = 6 object.class = "SideObject" object.build_preview_animation = 5096 object.idle_animations = { north = 1752, south = 1752, } object.orientations = { north = { footprint = { {0, 0, only_side = true} } }, east = { footprint = { {0, 0, only_side = true} } }, } class "SideObject" (Object) ---@type SideObject local SideObject = _G["SideObject"] function SideObject:SideObject(...) self:Object(...) end function SideObject:getDrawingLayer() if self.direction == "north" then return 1 elseif self.direction == "west" then return 2 else if self.direction == "east" then if self.object_type.thob == 50 then --[[ bins have two orientations north and east by they are displayed in the north and west part of the tile respectively which could lead to a graphical glitch in which a bin in the west part of the tile is displayed over a doctor in the middle of the tile ]] return 2 else return 8 end else --south return 9 end end end return object CorsixTH-0.63/CorsixTH/Lua/objects/bookcase.lua000066400000000000000000000035751347163623700213410ustar00rootroot00000000000000--[[ Copyright (c) 2009 Peter "Corsix" Cawley 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. --]] local object = {} object.id = "bookcase" object.thob = 56 object.name = _S.object.bookcase object.tooltip = _S.tooltip.objects.bookcase object.ticks = false object.build_preview_animation = 5104 object.show_in_town_map = true local function copy_north_to_south(t) t.south = t.north return t end object.idle_animations = copy_north_to_south { north = 2406, } object.usage_animations = copy_north_to_south { north = { in_use = {Doctor = 2414}, }, } object.orientations = { north = { footprint = { {0, 0, complete_cell = true}, {1, 0, only_passable = true} }, use_position = "passable", use_animate_from_use_position = true, }, east = { footprint = { {0, 0, complete_cell = true}, {0, 1, only_passable = true} }, use_position = "passable", use_animate_from_use_position = true, }, } return object CorsixTH-0.63/CorsixTH/Lua/objects/cabinet.lua000066400000000000000000000043471347163623700211560ustar00rootroot00000000000000--[[ Copyright (c) 2009 Peter "Corsix" Cawley 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. --]] local object = {} object.id = "cabinet" object.thob = 2 object.name = _S.object.cabinet object.tooltip = _S.tooltip.objects.cabinet object.ticks = false object.build_preview_animation = 5054 object.idle_animations = { north = 80, east = 82, } object.usage_animations = { north = { in_use = { Doctor = 88, }, }, east = { in_use = { Doctor = 90, }, }, } local anim_mgr = TheApp.animation_manager anim_mgr:setMarker(object.usage_animations.east.in_use, {-1, 0}) anim_mgr:setMarker(object.usage_animations.north.in_use, {-1, 0}) object.orientations = { north = { footprint = { {0, 0, complete_cell = true}, {0, 1, only_passable = true} }, use_position = "passable", use_animate_from_use_position = true, }, east = { footprint = { {0, 0, complete_cell = true}, {-1, 0, only_passable = true} }, use_position = "passable", }, south = { footprint = { {0, 0, complete_cell = true}, {0, -1, only_passable = true} }, use_position = "passable", }, west = { footprint = { {0, 0, complete_cell = true}, {1, 0, only_passable = true} }, use_position = "passable", use_animate_from_use_position = true, }, } return object CorsixTH-0.63/CorsixTH/Lua/objects/chair.lua000066400000000000000000000151631347163623700206350ustar00rootroot00000000000000--[[ Copyright (c) 2009 Peter "Corsix" Cawley 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. --]] local object = {} object.id = "chair" object.thob = 6 object.name = _S.object.chair object.tooltip = _S.tooltip.objects.chair object.ticks = false object.build_preview_animation = 5056 object.idle_animations = { north = 686, east = 688, } object.walk_in_to_use = true local function make_list(not_talking, nodding, talking) local list = {} for _ = 1, 16 do list[#list+1] = not_talking end if nodding then for _ = 1, 3 do list[#list+1] = nodding end end if talking then for _ = 1, 1 do list[#list+1] = talking end end return list end object.usage_animations = { north = { begin_use = { ["Standard Male Patient" ] = 678, ["Slack Male Patient" ] = 4580, ["Elvis Patient" ] = 1054, ["Standard Female Patient" ] = 2824, ["Slack Female Patient" ] = 2824, ["Chewbacca Patient" ] = 3792, ["Invisible Patient" ] = 4228, ["Transparent Male Patient" ] = 4360, ["Alternate Male Patient" ] = 4480, ["Transparent Female Patient"] = 4816, ["Alien Male Patient" ] = 678, -- TEMP ["Alien Female Patient" ] = 2824, -- TEMP }, in_use = { -- Note that patient mouth not visible in this orientation, so we only -- need one animation, and not the collection of animations. ["Standard Male Patient" ] = 702, ["Slack Male Patient" ] = 4588, ["Elvis Patient" ] = 1038, ["Standard Female Patient" ] = 2814, ["Slack Female Patient" ] = 2814, ["Chewbacca Patient" ] = 3784, ["Invisible Patient" ] = 4236, ["Transparent Male Patient" ] = 4344, ["Alternate Male Patient" ] = 4488, ["Transparent Female Patient"] = 4808, ["Alien Male Patient" ] = 702, -- TEMP ["Alien Female Patient" ] = 2814, -- TEMP }, finish_use = { ["Standard Male Patient" ] = 694, ["Slack Male Patient" ] = 4596, ["Standard Female Patient" ] = 2832, ["Slack Female Patient" ] = 2832, ["Chewbacca Patient" ] = 3776, ["Elvis Patient" ] = 4070, ["Invisible Patient" ] = 4244, ["Transparent Male Patient" ] = 4368, ["Alternate Male Patient" ] = 4504, ["Transparent Female Patient"] = 4824, ["Alien Male Patient" ] = 694, -- TEMP ["Alien Female Patient" ] = 2832, -- TEMP } }, east = { begin_use = { ["Standard Male Patient" ] = 680, ["Elvis Patient" ] = 1056, ["Slack Male Patient" ] = 1540, ["Standard Female Patient" ] = 2826, ["Slack Female Patient" ] = 2826, ["Chewbacca Patient" ] = 3794, ["Invisible Patient" ] = 4230, ["Transparent Male Patient" ] = 4362, ["Alternate Male Patient" ] = 4482, ["Transparent Female Patient"] = 4818, ["Alien Male Patient" ] = 680, -- TEMP ["Alien Female Patient" ] = 2826, -- TEMP }, in_use = { -- Not talking, head nodding, talking ["Standard Male Patient" ] = make_list( 704, 736, 744), ["Elvis Patient" ] = make_list(1040, nil, 4080), ["Slack Male Patient" ] = make_list(1544, nil, 4606), ["Standard Female Patient" ] = make_list(2818, 3002, 2994), ["Slack Female Patient" ] = make_list(2818, 3002, 2994), ["Chewbacca Patient" ] = make_list(3786, nil, 4144), ["Invisible Patient" ] = make_list(4238, nil, 4250), ["Transparent Male Patient" ] = make_list(4378, 4346, 4354), ["Alternate Male Patient" ] = make_list(4490, nil, 4498), -- NB: 4498 also seems to include big-head patients ["Transparent Female Patient"] = make_list(4810, 4842, 4834), ["Alien Male Patient" ] = make_list( 704, 736, 744), -- TEMP ["Alien Female Patient" ] = make_list(2818, 3002, 2994), -- TEMP }, finish_use = { ["Standard Male Patient" ] = 696, ["Slack Male Patient" ] = 1552, ["Standard Female Patient" ] = 2834, ["Slack Female Patient" ] = 2834, ["Chewbacca Patient" ] = 3778, ["Elvis Patient" ] = 4072, ["Invisible Patient" ] = 4246, ["Transparent Male Patient" ] = 4370, ["Alternate Male Patient" ] = 4506, ["Transparent Female Patient"] = 4826, ["Alien Male Patient" ] = 696, -- TEMP ["Alien Female Patient" ] = 2834, -- TEMP } }, } object.orientations = { north = { footprint = { {0, 0, complete_cell = true}, {0, -1, only_passable = true, invisible = true, shareable = true} }, use_position = "passable", }, east = { footprint = { {0, 0, complete_cell = true}, {1, 0, only_passable = true, invisible = true, shareable = true} }, use_position = "passable", }, south = { footprint = { {0, 0, complete_cell = true}, {0, 1, only_passable = true, invisible = true, shareable = true} }, use_position = "passable", }, west = { footprint = { {0, 0, complete_cell = true}, {-1, 0, only_passable = true, invisible = true, shareable = true} }, use_position = "passable", }, } class "Chair" (Object) ---@type Chair local Chair = _G["Chair"] function Chair:Chair(...) self:Object(...) end --! This function is automatically called after loading a game and serves for compatibility. function Chair:afterLoad(old, new) if old < 119 then self.footprint = object.orientations[self.direction].footprint end Object.afterLoad(self, old, new) end return object CorsixTH-0.63/CorsixTH/Lua/objects/comfortable_chair.lua000066400000000000000000000040061347163623700232040ustar00rootroot00000000000000--[[ Copyright (c) 2009 Peter "Corsix" Cawley 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. --]] local object = {} object.id = "comfortable_chair" object.thob = 61 object.name = _S.object.comfortable_chair object.tooltip = _S.tooltip.objects.comfortable_chair object.ticks = false object.build_preview_animation = 5110 object.show_in_town_map = true local function copy_north_to_south(t) t.south = t.north return t end object.idle_animations = copy_north_to_south { north = 2524, } object.usage_animations = copy_north_to_south { north = { begin_use = {Doctor = 2516}, begin_use_2 = {Doctor = 2512}, in_use = {Doctor = 2544}, finish_use = {Doctor = 2520}, }, } object.orientations = { north = { footprint = { {0, 0, complete_cell = true}, {0, 1, only_passable = true} }, use_position = "passable", use_animate_from_use_position = true, }, east = { footprint = { {0, 0, complete_cell = true}, {1, 0, only_passable = true} }, use_position = "passable", use_animate_from_use_position = true, }, } return object CorsixTH-0.63/CorsixTH/Lua/objects/computer.lua000066400000000000000000000037041347163623700214030ustar00rootroot00000000000000--[[ Copyright (c) 2009 Manuel König 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. --]] local object = {} object.id = "computer" object.thob = 40 object.research_category = "cure" object.research_fallback = 46 object.name = _S.object.computer object.tooltip = _S.tooltip.objects.computer object.ticks = false object.build_preview_animation = 5090 object.show_in_town_map = true local function copy_north_to_south(t) t.south = t.north return t end object.idle_animations = copy_north_to_south { north = 2094, } object.usage_animations = copy_north_to_south { north = { in_use = { Doctor = 2098, }, }, } object.orientations = { north = { use_position = "passable", use_animate_from_use_position = true, footprint = { {0, 0, complete_cell = true}, {0, 1, only_passable = true} }, }, east = { use_position = "passable", use_animate_from_use_position = true, footprint = { {0, 0, complete_cell = true}, {1, 0, only_passable = true} }, }, } return object CorsixTH-0.63/CorsixTH/Lua/objects/console.lua000066400000000000000000000044421347163623700212070ustar00rootroot00000000000000--[[ Copyright (c) 2009 Manuel König 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. --]] local object = {} object.id = "console" object.thob = 15 object.name = _S.object.console object.tooltip = _S.tooltip.objects.console object.ticks = true object.build_preview_animation = 922 object.show_in_town_map = true local function copy_north_to_south(t) t.south = t.north return t end object.idle_animations = copy_north_to_south { north = 794, } object.usage_animations = copy_north_to_south { north = { begin_use = {Doctor = 798}, -- Doctor sits down begin_use_2 = {Doctor = 806}, -- Pulls the handle in_use = {Doctor = { 810, -- Sits idle 814, -- Pushing buttons }}, finish_use = {Doctor = 802}, -- Doctor stands up }, } object.orientations = { north = { footprint = { {-1, -1, complete_cell = true}, {-1, 0, complete_cell = true}, {0, -1, complete_cell = true}, {0, 0, complete_cell = true, only_passable = true} }, render_attach_position = {0, -1}, use_position = "passable" }, east = { footprint = { {-1, -1, complete_cell = true}, {-1, 0, complete_cell = true}, {0, -1, complete_cell = true}, {0, 0, complete_cell = true, only_passable = true} }, render_attach_position = {-1, 0}, use_position = "passable" }, } return object CorsixTH-0.63/CorsixTH/Lua/objects/couch.lua000066400000000000000000000044101347163623700206410ustar00rootroot00000000000000--[[ Copyright (c) 2009 Peter "Corsix" Cawley 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. --]] local object = {} object.id = "couch" object.thob = 18 object.research_category = "diagnosis" object.name = _S.object.couch object.tooltip = _S.tooltip.objects.couch object.ticks = false object.build_preview_animation = 5064 local function copy_north_to_south(t) t.south = t.north return t end object.idle_animations = copy_north_to_south { north = 2540, } object.usage_animations = copy_north_to_south { north = { begin_use = { ["Elvis Patient" ] = 1014, ["Standard Male Patient" ] = 2528, ["Standard Female Patient"] = 3180, }, in_use = { ["Elvis Patient" ] = 942, ["Standard Male Patient" ] = 2536, ["Standard Female Patient"] = 3330, }, finish_use = { ["Elvis Patient" ] = 938, ["Standard Male Patient" ] = 2532, ["Standard Female Patient"] = 3326, }, }, } object.orientations = { north = { footprint = { {-1, -1, complete_cell = true}, {-1, 0, complete_cell = true}, {0, -1}, {0, 0, only_passable = true} }, render_attach_position = {-1, 0}, }, east = { footprint = { {-1, -1, complete_cell = true}, {-1, 0}, {0, -1, complete_cell = true}, {0, 0, only_passable = true} } }, } return object CorsixTH-0.63/CorsixTH/Lua/objects/crash_trolley.lua000066400000000000000000000072051347163623700224170ustar00rootroot00000000000000--[[ Copyright (c) 2009 Peter "Corsix" Cawley 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. --]] local object = {} object.id = "crash_trolley" object.thob = 20 object.research_category = "diagnosis" object.name = _S.object.crash_trolley object.tooltip = _S.tooltip.objects.crash_trolley object.ticks = false object.build_preview_animation = 916 object.show_in_town_map = true local function copy_north_to_south(t) t.south = t.north return t end object.idle_animations = copy_north_to_south { north = 3838 --1134, there's also a back view (1132), but animation is missing for that } object.multi_usage_animations = { ["Stripped Male Patient - Doctor"] = copy_north_to_south { north = { begin_use = {3740, 3736, 3818}, -- Also possibly 548, 556 and 560 for a more smooth animation? in_use = {540, 544, 552}, finish_use = {3802, 3806, 3826}, }, }, ["Stripped Female Patient - Doctor"] = copy_north_to_south { north = { begin_use = {3732, 3728, 3822}, -- 532 in_use = {524, 528, 536}, finish_use = {3810, 3814, 3830}, }, }, ["Stripped Male Patient 2 - Doctor"] = copy_north_to_south { north = { begin_use = {3740, 3736, 3818}, -- Also possibly 548, 556 and 560 for a more smooth animation? in_use = {540, 544, 552}, finish_use = {3802, 3806, 3826}, }, }, ["Stripped Female Patient 2 - Doctor"] = copy_north_to_south { north = { begin_use = {3732, 3728, 3822}, -- 532 in_use = {524, 528, 536}, finish_use = {3810, 3814, 3830}, }, }, ["Stripped Male Patient 3 - Doctor"] = copy_north_to_south { north = { begin_use = {3740, 3736, 3818}, -- Also possibly 548, 556 and 560 for a more smooth animation? in_use = {540, 544, 552}, finish_use = {3802, 3806, 3826}, }, }, ["Stripped Female Patient 3 - Doctor"] = copy_north_to_south { north = { begin_use = {3732, 3728, 3822}, -- 532 in_use = {524, 528, 536}, finish_use = {3810, 3814, 3830}, }, }, } object.orientations = { north = { render_attach_position = { {0, 0}, {-1, 1} }, footprint = { {-1, 0, complete_cell = true}, {-1, 1, only_passable = true}, {0, 0, only_passable = true}, {0, 1, only_passable = true} }, use_position = {-1, 1}, use_position_secondary = {0, 0}, list_bottom = true, }, east = { render_attach_position = { {0, 0}, {1, -1} }, footprint = { {0, -1, complete_cell = true}, {0, 0, only_passable = true}, {1, -1, only_passable = true}, {1, 0, only_passable = true} }, use_position = {1, -1}, use_position_secondary = {0, 0}, list_bottom = true, }, } return object CorsixTH-0.63/CorsixTH/Lua/objects/desk.lua000066400000000000000000000100401347163623700204620ustar00rootroot00000000000000--[[ Copyright (c) 2009 Peter "Corsix" Cawley 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. --]] local object = {} object.id = "desk" object.thob = 1 object.name = _S.object.desk object.tooltip = _S.tooltip.objects.desk object.ticks = false object.build_preview_animation = 900 object.show_in_town_map = true object.idle_animations = { north = 48, east = 50, } object.usage_animations = { north = { begin_use = { Doctor = 56, Nurse = 3240, }, in_use = { -- Note: 72 (normal usage) should happen a lot more often than 718 (head -- scratching), hence it appears in the list many times. Doctor = {72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 718}, Nurse = 3256, }, finish_use = { Doctor = 64, Nurse = 3248, }, }, east = { begin_use = { Doctor = 58, Nurse = 3242, }, in_use = { Doctor = 74, -- No analogue to 718 :( Nurse = 3258, }, finish_use = { Doctor = 66, Nurse = 3250, }, }, } local anim_mgr = TheApp.animation_manager local kf1, kf2, kf3 = {0, 0}, {-1, -0.3}, {-0.9, -0.1} anim_mgr:setMarker( 56, 0, kf1, 10, kf2, 13, kf3) anim_mgr:setMarker(3240, 0, kf1, 10, kf2, 13, kf3) anim_mgr:setMarker( 72, kf3) anim_mgr:setMarker( 718, kf3) anim_mgr:setMarker(3256, kf3) anim_mgr:setMarker( 64, 0, kf3, 3, kf2, 12, kf1) anim_mgr:setMarker(3248, 0, kf3, 3, kf2, 12, kf1) kf1, kf2, kf3 = {-1, 0}, {-1, -1.1}, {-0.8, -0.9} anim_mgr:setMarker( 58, 0, kf1, 9, kf2, 11, kf3) anim_mgr:setMarker(3242, 0, kf1, 9, kf2, 11, kf3) kf1 = {-0.7, -1} anim_mgr:setMarker( 74, kf1) anim_mgr:setMarker(3258, kf1) kf2, kf1 = {-0.8, -1}, {-1, -2} anim_mgr:setMarker( 66, 0, kf3, 3, kf2, 8, kf1) anim_mgr:setMarker(3250, 0, kf3, 3, kf2, 8, kf1) object.orientations = { north = { footprint = { {-2, -1, complete_cell = true}, {-1, -1, complete_cell = true}, {-1, 0, complete_cell = true}, {0, -1, need_north_side = true}, {0, 0, only_passable = true} }, render_attach_position = {0, -1}, use_position = "passable", }, east = { footprint = { {0, -2, need_east_side = true}, {-1, -1, complete_cell = true}, {0, -1, complete_cell = true}, {-1, 0, only_passable = true}, {0, 0, complete_cell = true}, {-1, -2, only_passable = true}}, render_attach_position = {0, -1}, use_position = {-1, 0}, finish_use_position = {-1, -2}, }, south = { footprint = { {0, -1, only_passable = true}, {-2, 0, need_south_side = true}, {-1, -1, complete_cell = true}, {-1, 0, complete_cell = true}, {0, 0, complete_cell = true}, {-2, -1, only_passable = true} }, render_attach_position = {-2, 0}, use_position = {0, -1}, finish_use_position = {-2, -1}, }, west = { footprint = { {-1, -2, complete_cell = true}, {0, 0, only_passable = true}, {-1, -1, complete_cell = true}, {0, -1, complete_cell = true}, {-1, 0, need_west_side = true} }, render_attach_position = {-1, 0}, use_position = "passable", }, } return object CorsixTH-0.63/CorsixTH/Lua/objects/door.lua000066400000000000000000000137371347163623700205170ustar00rootroot00000000000000--[[ Copyright (c) 2009 Peter "Corsix" Cawley 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. --]] local object = {} object.id = "door" object.thob = 3 object.name = _S.object.door object.tooltip = _S.tooltip.objects.door object.class = "Door" object.ticks = false object.idle_animations = { north = 104, west = 106, } corsixth.require("queue") class "Door" (Object) ---@type Door local Door = _G["Door"] function Door:Door(...) self:Object(...) self.queue = Queue() -- Priority should be given to humanoids already inside the door's room, as -- otherwise we could end up in a situation where a patient trying to leave -- a room is in the queue behind a patient trying to enter, and the entering -- one cannot enter until the leaving one has left, etc. self.queue:setPriorityForSameRoom(self) self.hover_cursor = TheApp.gfx:loadMainCursor("queue") -- self.user = "locked" -- prevents doors from being used (debug aid) end function Door:getRoom() return self.room end function Door:updateDynamicInfo() if self.room and self.queue then if not self.room:hasQueueDialog() then self:setDynamicInfo('text', { self.room.room_info.name }) else self:setDynamicInfo('text', { self.room.room_info.name, _S.dynamic_info.object.queue_size:format(self.queue:reportedSize()), _S.dynamic_info.object.queue_expected:format(self.queue:expectedSize()) }) end end end function Door:onClick(ui, button) local room = self:getRoom() if button == "left" and room:hasQueueDialog() and self.queue then local queue_window = UIQueue(ui, self.queue) ui:addWindow(queue_window) end end local door_flag_name = { north = {"doorNorth", "tallNorth"}, west = {"doorWest", "tallWest"}, } function Door:setTile(x, y) local map = self.world.map local flag_names = door_flag_name[self.direction] local todo_cleanup if self.tile_x then -- NB: unsetting buildable flag has to be done AFTER removing the object -- from its former tile in Object.setTile todo_cleanup = self:getWalkableTiles() map:setCellFlags(self.tile_x, self.tile_y, { [flag_names[1]] = false, [flag_names[2]] = false, }) for _, xy in ipairs(self:getWalkableTiles()) do map:setCellFlags(xy[1], xy[2], {doNotIdle = false}) end end Object.setTile(self, x, y) if todo_cleanup then -- passable tiles can "belong" to multiple objects, so we have to check that -- assumption: no object defines a passable tile further than 10 tiles away from its origin for _, xy in ipairs(todo_cleanup) do if not self.world:isTilePartOfNearbyObject(xy[1], xy[2], 10) then map:setCellFlags(xy[1], xy[2], {buildable = true}) end end end if x then map:setCellFlags(x, y, { [flag_names[1]] = true, [flag_names[2]] = true, }) for _, xy in ipairs(self:getWalkableTiles()) do map:setCellFlags(xy[1], xy[2], {buildable = false, doNotIdle = true}) end end map.th:updateShadows() return self end function Door:getWalkableTiles() local x, y = self.tile_x, self.tile_y if self.direction == "west" then x = x - 1 else y = y - 1 end return { {self.tile_x, self.tile_y}, {x, y} } end local flag_early_list = 1024 local flag_list_bottom = 2048 function Door:setAnimation(animation, flags) flags = (flags or 0) + flag_list_bottom if self.direction == "north" then flags = flags + flag_early_list end return Object.setAnimation(self, animation, flags) end function Door:closeDoor() if self.queue then self.queue:rerouteAllPatients(SeekRoomAction(self:getRoom().room_info.id)) self.queue = nil end self:clearDynamicInfo(nil) self.hover_cursor = nil end function Door:getDrawingLayer() return 0 end function Door:checkForDeadlock() -- In an ideal world, deadlocks should not occur, as they indicate errors in -- some logic elsewhere. From a practical point of view, we should check for -- deadlocks from time to time and attempt to fix them. if self.queue and self.reserved_for then -- If the door is reserved for someone, then that person should either be -- at the front of the queue, or not in any queues at all. for _, action in ipairs(self.reserved_for.action_queue) do if action.name == "queue" then if action.queue ~= self.queue or self.queue[1] ~= self.reserved_for then self.reserved_for = nil self:getRoom():tryAdvanceQueue() end break end end end end function Door:afterLoad(old, new) if old < 57 then local flags_to_set local map = self.world.map if self.direction == "west" then flags_to_set = {buildableNorth = false, buildableSouth = false} map:setCellFlags(self.tile_x, self.tile_y, flags_to_set) map:setCellFlags(self.tile_x - 1, self.tile_y, flags_to_set) else flags_to_set = {buildableEast = false, buildableWest = false} map:setCellFlags(self.tile_x, self.tile_y, flags_to_set) map:setCellFlags(self.tile_x, self.tile_y - 1, flags_to_set) end end end return object CorsixTH-0.63/CorsixTH/Lua/objects/doors/000077500000000000000000000000001347163623700201645ustar00rootroot00000000000000CorsixTH-0.63/CorsixTH/Lua/objects/doors/entrance_left_door.lua000066400000000000000000000025641347163623700245320ustar00rootroot00000000000000--[[ Copyright (c) 2009 Peter "Corsix" Cawley 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. --]] local object = {} object.id = "entrance_left_door" object.thob = 58 object.name = _S.object.entrance_left object.tooltip = _S.tooltip.objects.entrance_left object.class = "EntranceDoor" object.ticks = false object.idle_animations = { north = 316, west = 318, } object.supports_creation_for_map = true return object CorsixTH-0.63/CorsixTH/Lua/objects/doors/entrance_right_door.lua000066400000000000000000000130511347163623700247060ustar00rootroot00000000000000--[[ Copyright (c) 2009 Peter "Corsix" Cawley 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. --]] local object = {} object.id = "entrance_right_door" object.thob = 59 object.name = _S.object.entrance_right object.tooltip = _S.tooltip.objects.entrance_right object.class = "EntranceDoor" object.ticks = false object.idle_animations = { north = 308, west = 312, } object.supports_creation_for_map = true class "EntranceDoor" (Object) ---@type EntranceDoor local EntranceDoor = _G["EntranceDoor"] function EntranceDoor:EntranceDoor(world, object_type, x, y, direction, etc) self.is_master = object_type == object self:Object(world, object_type, x, y, direction, etc) self.occupant_count = 0 self.is_open = false -- We need to link the master to the slave but we don't know in which order they will be initialized if self.is_master then -- The master will check for an adjacent slave local slave_type = "entrance_left_door" self.slave = world:getObject(x - 1, y, slave_type) or world:getObject(x, y - 1, slave_type) or nil if self.slave then self.slave.master = self end else -- The slave will check for an adjacent master local master_type = "entrance_right_door" self.master = world:getObject(x + 1, y, master_type) or world:getObject(x, y + 1, master_type) or nil if self.master then self.master.slave = self end end local anim = self.object_type.idle_animations[self.direction] local anims = self.world.anims self.anim_frames = {anims:getFirstFrame(anim)} while true do local nxt = anims:getNextFrame(self.anim_frames[#self.anim_frames]) if nxt == self.anim_frames[1] then break end self.anim_frames[#self.anim_frames + 1] = nxt end self.frame_index = 1 end function EntranceDoor:onOccupantChange(count_delta) self.occupant_count = self.occupant_count + count_delta local is_open = self.occupant_count > 0 if is_open ~= self.is_open then self:playSound("eledoor2.wav") self.is_open = is_open self.ticks = true end if self.slave then self.slave:onOccupantChange(count_delta) end end local additional_walkable_tiles = { north = { {0, -1}, }, west = { {-1, 0}, }, } local additional_walkable_tiles_master = { north = { {0, -1}, {1, 0}, {1, -1}, }, west = { {-1, 0}, {0, 1}, {-1, 1}, }, } function EntranceDoor:setTile(x, y) local offsets = self.is_master and additional_walkable_tiles_master or additional_walkable_tiles offsets = offsets[self.direction] local flag_name = self.direction == "north" and "tallNorth" or "tallWest" if self.tile_x then if self.is_master then -- NB: only the tile of the door itself and the one additional tile from additional_walkable_tiles notify the door self.world:notifyObjectOfOccupants(self.tile_x, self.tile_y, nil) for _, offset in ipairs(additional_walkable_tiles[self.direction]) do self.world:notifyObjectOfOccupants(self.tile_x + offset[1], self.tile_y + offset[2], nil) end end self.world.map:setCellFlags(self.tile_x, self.tile_y, {[flag_name] = false, buildable = true, doNotIdle = false}) for _, offset in ipairs(offsets) do self.world.map:setCellFlags(self.tile_x + offset[1], self.tile_y + offset[2], {buildable = true, doNotIdle = false}) end end Object.setTile(self, x, y) if x then if self.is_master then self.world:notifyObjectOfOccupants(x, y, self) for _, offset in ipairs(additional_walkable_tiles[self.direction]) do self.world:notifyObjectOfOccupants(x + offset[1], y + offset[2], self) end end self.world.map:setCellFlags(x, y, {[flag_name] = true, buildable = false, doNotIdle = true}) for _, offset in ipairs(offsets) do self.world.map:setCellFlags(x + offset[1], y + offset[2], {buildable = false, doNotIdle = true}) end end self.world.map.th:updateShadows() end function EntranceDoor:getWalkableTiles() local result = {} local offsets = self.is_master and additional_walkable_tiles_master or additional_walkable_tiles result[1] = {self.tile_x, self.tile_y} for _, offset in ipairs(offsets[self.direction]) do result[#result + 1] = {self.tile_x + offset[1], self.tile_y + offset[2]} end return result end function EntranceDoor:tick() local target_index = self.is_open and #self.anim_frames or 1 if self.frame_index == target_index then self.ticks = false elseif self.frame_index < target_index then self.frame_index = self.frame_index + 1 elseif self.frame_index > target_index then self.frame_index = self.frame_index - 1 end self.th:setFrame(self.anim_frames[self.frame_index]) end return object CorsixTH-0.63/CorsixTH/Lua/objects/doors/swing_door_left.lua000066400000000000000000000025021347163623700240520ustar00rootroot00000000000000--[[ Copyright (c) 2009 Edvin "Lego3" Linge 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. --]] local object = {} object.id = "swing_door_left" object.thob = 52 object.name = _S.object.swing_door1 object.tooltip = _S.tooltip.objects.swing_door1 object.class = "SwingDoor" object.ticks = false object.idle_animations = { north = 1996, west = 1998, } return object CorsixTH-0.63/CorsixTH/Lua/objects/doors/swing_door_right.lua000066400000000000000000000121661347163623700242440ustar00rootroot00000000000000--[[ Copyright (c) 2009 Edvin "Lego3" Linge 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. --]] local object = {} object.id = "swing_door_right" object.thob = 53 object.name = _S.object.swing_door2 object.tooltip = _S.tooltip.objects.swing_door2 object.class = "SwingDoor" object.ticks = false object.idle_animations = { north = 2006, --west = 2050,--1998 } class "SwingDoor" (Door) ---@type SwingDoor local SwingDoor = _G["SwingDoor"] function SwingDoor:SwingDoor(world, object_type, x, y, direction, etc) self.is_master = object_type == object self:Door(world, object_type, x, y, direction, etc) if self.is_master then -- Wait one tick before finding the slave so that we're sure it has been created. local --[[persistable:swing_door_creation]] function callback() local slave_type = "swing_door_left" self.slave = world:getObject(x - 1, y, slave_type) or world:getObject(x, y - 1, slave_type) or nil self.slave:setAsSlave(self) self.ticks = false end self:setTimer(1, callback) self.ticks = true end self.old_anim = self.th:getAnimation() self.old_flags = self.th:getFlag() end --[[ Makes the door mimic its master when it comes to hover cursor and what happens when the player clicks on it. !param swing_door (Door) The master door to mimic. ]] function SwingDoor:setAsSlave(swing_door) self.master = swing_door end -- Depending on if this is a master or slave different onClick functions are called. function SwingDoor:onClick(ui, button) if self.is_master then Door.onClick(self, ui, button) elseif self.master then Door.onClick(self.master, ui, button) end end -- Depending on if this is a master or slave update the correct information. function SwingDoor:updateDynamicInfo() if self.is_master then Door.updateDynamicInfo(self) elseif self.master then Door.updateDynamicInfo(self.master) end end -- Depending on if this is a master or slave show the correct information. function SwingDoor:getDynamicInfo() return self.master and self.master.dynamic_info or self.dynamic_info end --[[ Tell the associated slave door to start swinging. !param direction (string) The direction in which to swing. Allowed values are "in" and "out". ]] function SwingDoor:swingSlave(direction) local flags = (self.direction == "east" or self.direction == "west") and 1 or 0 local anim = 2034 if direction == "in" then anim = 2032 end self:swing(anim, flags) end --[[ Makes the pair of swing doors start swinging in the correct fashion. !param direction (string) The direction in which to swing. Allowed values are "in" and "out". !param length (integer) How long the swing animation is for the entering/leaving entity. ]] function SwingDoor:swingDoors(direction, length) -- First tell the slave door to start swinging self.slave:swingSlave(direction) -- Then wait for a while before flapping back this door local --[[persistable:swing_door_waiting]] function callback() local flags = (self.direction == "east" or self.direction == "west") and 1 or 0 local anim = 2052 if direction == "in" then anim = 2048 end self:swing(anim, flags) end self:setTimer(length, callback) self.ticks = true end --[[ The actual swinging is done in this class. !param anim (integer) The animation to use. !param flags (integer) Flags, if any, associated with the animation. ]] function SwingDoor:swing(anim, flags) self:setAnimation(anim, flags) self.ticks = true local --[[persistable:swing_door_opening]] function callback() self:setAnimation(self.old_anim, self.old_flags) self.ticks = false if self.is_master then -- We're now ready to let another humanoid walk through self:removeUser() self:getRoom():tryAdvanceQueue() end end self:setTimer(self.world:getAnimLength(anim), callback) end function SwingDoor:getWalkableTiles() if not self.is_master then return {} end local x, y = self.tile_x, self.tile_y if self.direction == "west" then return { {x-1, y-1}, {x, y-1}, {x-1, y }, {x, y }, {x-1, y+1}, {x, y+1}, } else return { {x-1, y-1}, {x, y-1}, {x+1, y-1}, {x-1, y }, {x, y }, {x+1, y }, } end end return object CorsixTH-0.63/CorsixTH/Lua/objects/drinks_machine.lua000066400000000000000000000075541347163623700225320ustar00rootroot00000000000000--[[ Copyright (c) 2009 Peter "Corsix" Cawley 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. --]] local object = {} object.id = "drinks_machine" object.thob = 7 object.name = _S.object.drinks_machine object.tooltip = _S.tooltip.objects.drinks_machine object.ticks = false object.corridor_object = 3 object.build_preview_animation = 906 object.multiple_users_allowed = true object.dynamic_info = true object.idle_animations = { south = 170, west = 172, north = 174, east = 176, } object.usage_animations = { south = { in_use = { ["Standard Male Patient" ] = 190, ["Standard Female Patient" ] = 250, ["Slack Female Patient" ] = 250, ["Transparent Male Patient" ] = 1112, ["Slack Male Patient" ] = 1532, ["Invisible Patient" ] = 1804, ["Alternate Male Patient" ] = 2756, ["Transparent Female Patient"] = 3060, -- is 426 an initial try at this? ["Chewbacca Patient" ] = 3768, ["Elvis Patient" ] = 198, ["Alien Male Patient" ] = 190, ["Alien Female Patient" ] = 250, }, }, east = { in_use = { ["Standard Male Patient" ] = 196, ["Standard Female Patient" ] = 256, ["Slack Female Patient" ] = 256, ["Transparent Male Patient" ] = 1118, ["Slack Male Patient" ] = 1538, ["Invisible Patient" ] = 1810, ["Alternate Male Patient" ] = 2762, ["Transparent Female Patient"] = 3066, ["Chewbacca Patient" ] = 3774, ["Elvis Patient" ] = 204, ["Alien Male Patient" ] = 196, ["Alien Female Patient" ] = 256, }, }, west = { in_use = { ["Standard Male Patient" ] = 192, ["Standard Female Patient" ] = 252, ["Slack Female Patient" ] = 252, ["Transparent Male Patient" ] = 1114, ["Slack Male Patient" ] = 1534, ["Invisible Patient" ] = 1806, ["Alternate Male Patient" ] = 2758, ["Transparent Female Patient"] = 3062, ["Chewbacca Patient" ] = 3770, ["Elvis Patient" ] = 200, ["Alien Male Patient" ] = 192, ["Alien Female Patient" ] = 252, }, }, } object.orientations = { north = { footprint = { {0, 0, complete_cell = true}, {0, -1, only_passable = true} }, use_position = "passable", added_animation_offset_while_in_use = {-1, 0}, }, east = { footprint = { {0, 0, complete_cell = true}, {1, 0, only_passable = true} }, use_position = "passable", use_animate_from_use_position = true, }, south = { footprint = { {0, 0, complete_cell = true}, {0, 1, only_passable = true} }, use_position = "passable", use_animate_from_use_position = true, }, west = { footprint = { {0, 0, complete_cell = true}, {-1, 0, only_passable = true} }, use_position = "passable", }, } return object CorsixTH-0.63/CorsixTH/Lua/objects/fire_extinguisher.lua000066400000000000000000000032531347163623700232670ustar00rootroot00000000000000--[[ Copyright (c) 2009 Peter "Corsix" Cawley 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. --]] local object = {} object.id = "extinguisher" object.thob = 43 object.name = _S.object.fire_extinguisher object.tooltip = _S.tooltip.objects.fire_extinguisher object.ticks = false object.corridor_object = 4 object.class = "SideObject" object.build_preview_animation = 912 object.idle_animations = { north = 178, east = 468, south = 470, } object.orientations = { north = { footprint = { {0, 0, only_side = true} } }, east = { footprint = { {0, 0, only_side = true} } }, south = { footprint = { {0, 0, only_side = true} } }, west = { footprint = { {0, 0, only_side = true} } }, } return object CorsixTH-0.63/CorsixTH/Lua/objects/gates_to_hell.lua000066400000000000000000000042111347163623700223500ustar00rootroot00000000000000--[[ Copyright (c) 2013 Luís "Driver" Duarte 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. --]] local object = {} object.id = "gates_to_hell" object.name = "Gates to Hell" object.thob = 48 object.ticks = true object.walk_in_to_use = true object.idle_animations = { south = 1602, east = 1602 } object.usage_animations = { south = { in_use = { ["Standard Male Patient"] = 4560, }, }, east = { in_use = { ["Standard Male Patient"] = 4560, }, } } local anim_mgr = TheApp.animation_manager anim_mgr:setMarker(object.usage_animations.south.in_use, 0, {0,0}) anim_mgr:setMarker(object.usage_animations.east.in_use, 0, {0,0}) -- Orientation directions are relative to the patient's death location: object.orientations = { south = { use_position = {0, 0}, footprint = { {1, 0, only_passable = true}, {0, 0, complete_cell = true}, {-1, 0, only_passable = true} }, use_animate_from_use_position = false }, east = { use_position = {0, 0}, footprint = { {0, -1, only_passable = true}, {0, 0, complete_cell = true}, {0, 1, only_passable = true} }, use_animate_from_use_position = false } } return object CorsixTH-0.63/CorsixTH/Lua/objects/helicopter.lua000066400000000000000000000066651347163623700217140ustar00rootroot00000000000000--[[ Copyright (c) 2009 Edvin "Lego3" Linge 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. --]] local object = {} object.id = "helicopter" object.thob = 63 object.name = "helicopter" -- Not seen anywhere object.class = "Helicopter" object.ticks = true object.idle_animations = { north = 2456, } object.orientations = { north = { -- Helicopter is outside the hospital, so does not need a footprint footprint = {} }, } --! An `Object` which drops of emergency patients. class "Helicopter" (Object) ---@type Helicopter local Helicopter = _G["Helicopter"] function Helicopter:Helicopter(world, object_type, hospital, direction, etc) local x, y = hospital:getHeliportPosition() -- Helicoptor needs to land below tile to be positioned correctly y = y + 1 self:Object(world, object_type, x, y, direction, etc) self.th:makeInvisible() self:setPosition(0, -600) self.phase = -60 self.hospital = hospital -- TODO: Shadow: 3918 hospital.emergency_patients = {} end function Helicopter:tick() local phase = self.phase if phase == 0 then self.th:makeVisible() self:setSpeed(0, 10) elseif phase == 60 then self:setSpeed(0, 0) self.spawned_patients = 0 elseif phase == 80 then if self.spawned_patients < self.hospital.emergency.victims then self:spawnPatient() phase = 60 end elseif phase == 87 then self:setSpeed(0, -10) elseif phase == 147 then self.world:destroyEntity(self) end self.phase = phase + 1 Object.tick(self) end --! When the helicopter has landed this method is called each time a patient should spawn from it. function Helicopter:spawnPatient() local hospital = self.hospital self.spawned_patients = self.spawned_patients + 1 local patient = self.world:newEntity("Patient", 2) patient:setDisease(hospital.emergency.disease) patient.diagnosis_progress = 1 patient:setDiagnosed() patient:setMood("emergency", "activate") patient.is_emergency = self.spawned_patients hospital.emergency_patients[#hospital.emergency_patients + 1] = patient local x, y = hospital:getHeliportSpawnPosition() patient:setNextAction(SpawnAction("spawn", {x = x, y = y}):setOffset({y = 1})) patient:setHospital(hospital) -- TODO: If new combined diseases are added this will not work correctly anymore. patient.cure_rooms_visited = #patient.disease.treatment_rooms - 1 local no_of_rooms = #patient.disease.treatment_rooms patient:queueAction(SeekRoomAction(patient.disease.treatment_rooms[no_of_rooms])) end return object CorsixTH-0.63/CorsixTH/Lua/objects/lecture_chair.lua000066400000000000000000000044311347163623700223540ustar00rootroot00000000000000--[[ Copyright (c) 2010 Justin Pasher 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. --]] local object = {} object.id = "lecture_chair" object.thob = 36 object.name = _S.object.lecture_chair object.tooltip = _S.tooltip.objects.lecture_chair object.ticks = false object.build_preview_animation = 5084 object.show_in_town_map = true local function copy_north_to_south(t) t.south = t.north return t end object.idle_animations = { north = 2626, south = 2626, } object.usage_animations = copy_north_to_south { north = { begin_use = { Doctor = 2632 }, in_use = { Doctor = 2622 }, finish_use = { Doctor = 2636 }, }, } local anim_mgr = TheApp.animation_manager local kf1, kf2 = {0, 0}, {-1, -0.1} anim_mgr:setMarker(object.usage_animations.north.begin_use, 0, kf1, 10, kf2) anim_mgr:setMarker(object.usage_animations.north.in_use, kf2) anim_mgr:setMarker(object.usage_animations.north.finish_use, 0, kf2, 11, kf2, 18, kf1) object.orientations = { north = { footprint = { {0, 0, complete_cell = true}, {1, 0, only_passable = true} }, use_position = "passable", use_animate_from_use_position = true, early_list = true, }, east = { footprint = { {0, 0, complete_cell = true}, {0, 1, only_passable = true} }, use_position = "passable", use_animate_from_use_position = true, }, } return object CorsixTH-0.63/CorsixTH/Lua/objects/litter.lua000066400000000000000000000114011347163623700210410ustar00rootroot00000000000000--[[ Copyright (c) 2009 Edvin "Lego3" Linge 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. --]] local TH = require("TH") local object = {} object.id = "litter" object.thob = 62 -- previously unused object.name = _S.object.litter -- currently not shown anywhere object.tooltip = _S.tooltip.objects.litter -- currently not shown anywhere object.ticks = false object.class = "Litter" local litter_types = {} -- All types of "litter", i.e. small objects on the ground or walls. litter_types["pee"] = 2248 litter_types["dead_rat"] = 2242 litter_types["puke"] = 2060 litter_types["soda_can"] = 1894 litter_types["banana"] = 1896 litter_types["paper"] = 1898 litter_types["bottle"] = 1900 litter_types["soot_floor"] = 3416 litter_types["soot_wall"] = 3408 litter_types["soot_window"] = 3412 -- When randomising litter, only these should come up. litter_types[1] = 1894 litter_types[2] = 1896 litter_types[3] = 1898 litter_types[4] = 1900 class "Litter" (Entity) ---@type Litter local Litter = _G["Litter"] function Litter:Litter(world, object_type, x, y, direction, etc) local th = TH.animation() self:Entity(th) self.ticks = object_type.ticks self.object_type = object_type self.world = world self:setTile(x, y) end function Litter:setTile(x, y) Entity.setTile(self, x, y) if x then self.world:addObjectToTile(self, x, y) end end -- Litter is an Entity and not an Object so it does not inherit this method -- This is an (effective) hack, see issue 918 --cgj function Litter:getWalkableTiles() --emulate Object:getWalkableTiles() and return the tile (x,y) local tiles = {} tiles[0] = { self.tile_x, self.tile_y } return tiles end function Litter:setLitterType(anim_type, mirrorFlag) if anim_type then local anim = litter_types[anim_type] if anim then self:setAnimation(anim, mirrorFlag) else error("Unknown litter type") end if self:isCleanable() then local hospital = self.world:getHospital(self.tile_x, self.tile_y) hospital:addHandymanTask(self, "cleaning", 1, self.tile_x, self.tile_y) end end end --! Remove the litter from the world. function Litter:remove() assert(self:isCleanable()) if self.tile_x then self.world:removeObjectFromTile(self, self.tile_x, self.tile_y) local hospital = self.world:getHospital(self.tile_x, self.tile_y) local taskIndex = hospital:getIndexOfTask(self.tile_x, self.tile_y, "cleaning", self) hospital:removeHandymanTask(taskIndex, "cleaning") else print("Warning: Removing litter that has already been removed.") end self.world:destroyEntity(self) end function Litter:getDrawingLayer() return 0 end function Litter:vomitInducing() local anim = self.animation_idx if anim == litter_types["puke"] or anim == litter_types["pee"] or anim == litter_types["dead_rat"] then return true end return false end function Litter:isCleanable() return self:vomitInducing() or self:anyLitter() end function Litter:anyLitter() local anim = self.animation_idx if anim == litter_types["soda_can"] or anim == litter_types["banana"] or anim == litter_types["paper"] or anim == litter_types["bottle"] then return true end return false end function Litter:afterLoad(old, new) if old < 52 then if self.tile_x then self.world.hospitals[1]:addHandymanTask(self, "cleaning", 1, self.tile_x, self.tile_y) else -- This object was not properly removed from the world. self.world:destroyEntity(self) end end if old < 54 then if not self:isCleanable() then local hospital = self.world:getHospital(self.tile_x, self.tile_y) local taskIndex = hospital:getIndexOfTask(self.tile_x, self.tile_y, "cleaning", self) hospital:removeHandymanTask(taskIndex, "cleaning") end end if old < 121 then self.ticks = object.ticks end end return object CorsixTH-0.63/CorsixTH/Lua/objects/loo.lua000066400000000000000000000121711347163623700203340ustar00rootroot00000000000000--[[ Copyright (c) 2009 Peter "Corsix" Cawley 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. --]] local object = {} object.id = "loo" object.thob = 51 object.name = _S.object.toilet object.tooltip = _S.tooltip.objects.toilet object.ticks = false object.build_preview_animation = 5098 object.dynamic_info = true local function copy_north_to_south(t) t.south = t.north return t end object.idle_animations = copy_north_to_south { north = 1760, } object.usage_animations = copy_north_to_south { north = { begin_use = { ["Standard Male Patient" ] = 1712, ["Standard Female Patient" ] = 3132, ["Slack Female Patient" ] = 3132, ["Transparent Male Patient" ] = 4388, ["Slack Male Patient" ] = 4292, ["Invisible Patient" ] = 4256, ["Alternate Male Patient" ] = 4520, ["Transparent Female Patient"] = 4432, ["Chewbacca Patient" ] = 4158, ["Elvis Patient" ] = 950, ["Alien Male Patient" ] = 1712, ["Alien Female Patient" ] = 3132, }, begin_use_2 = { ["Standard Male Patient" ] = 1716, ["Standard Female Patient" ] = 3136, ["Slack Female Patient" ] = 3136, ["Transparent Male Patient" ] = 4392, ["Slack Male Patient" ] = 4296, ["Invisible Patient" ] = 4260, ["Alternate Male Patient" ] = 4524, ["Transparent Female Patient"] = 4436, ["Chewbacca Patient" ] = 4162, ["Elvis Patient" ] = 954, ["Alien Male Patient" ] = 1716, ["Alien Female Patient" ] = 3132, }, in_use = { ["Standard Male Patient" ] = {1728, 1732}, ["Standard Female Patient" ] = 3144, ["Slack Female Patient" ] = 3144, ["Transparent Male Patient" ] = 4400, ["Slack Male Patient" ] = 4308, -- 4304 is bugged for layer 0, 6 ["Invisible Patient" ] = 4272, ["Alternate Male Patient" ] = 4528, ["Transparent Female Patient"] = 4440, ["Chewbacca Patient" ] = 4170, ["Elvis Patient" ] = 962, ["Alien Male Patient" ] = {1728, 1732}, ["Alien Female Patient" ] = 3144, }, finish_use = { ["Standard Male Patient" ] = 1740, ["Standard Female Patient" ] = 3152, ["Slack Female Patient" ] = 3152, ["Transparent Male Patient" ] = 4404, ["Slack Male Patient" ] = 4316, ["Invisible Patient" ] = 4280, ["Alternate Male Patient" ] = 4536, ["Transparent Female Patient"] = 4444, ["Chewbacca Patient" ] = 4174, ["Elvis Patient" ] = 966, ["Alien Male Patient" ] = 1740, ["Alien Female Patient" ] = 3152, }, finish_use_2 = { ["Standard Male Patient" ] = 1744, ["Standard Female Patient" ] = 3156, ["Slack Female Patient" ] = 3156, ["Transparent Male Patient" ] = 4408, ["Slack Male Patient" ] = 4320, ["Invisible Patient" ] = 4284, ["Alternate Male Patient" ] = 4540, ["Transparent Female Patient"] = 4448, ["Chewbacca Patient" ] = 4740, ["Elvis Patient" ] = 1158, ["Alien Male Patient" ] = 1744, ["Alien Female Patient" ] = 3156, }, }, } local anim_mgr = TheApp.animation_manager local kf1, kf2 = {0, 0}, {-0.1, -0.9} anim_mgr:setMarker(object.usage_animations.north.begin_use, 1, kf1, 6, kf2) kf1 = {-0.1, -0.9} anim_mgr:setMarker(object.usage_animations.north.begin_use_2, kf1) anim_mgr:setMarker(object.usage_animations.north.in_use, kf1) anim_mgr:setMarker(object.usage_animations.north.finish_use, kf1) kf1, kf2 = {-0.1, -0.9}, {0, 0} anim_mgr:setMarker(object.usage_animations.north.finish_use_2, 0, kf1, 1, kf1, 6, kf2) object.orientations = { north = { footprint = { {0, 0, complete_cell = true}, {0, 1, only_passable = true} }, use_position = "passable", use_animate_from_use_position = true, }, east = { footprint = { {0, 0, complete_cell = true}, {1, 0, only_passable = true} }, use_position = "passable", use_animate_from_use_position = true, }, } return object CorsixTH-0.63/CorsixTH/Lua/objects/machines/000077500000000000000000000000001347163623700206255ustar00rootroot00000000000000CorsixTH-0.63/CorsixTH/Lua/objects/machines/blood_machine.lua000066400000000000000000000116401347163623700241150ustar00rootroot00000000000000--[[ Copyright (c) 2009 Manuel König 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. --]] local object = {} object.id = "blood_machine" object.thob = 42 object.research_fallback = 37 object.research_category = "diagnosis" object.name = _S.object.blood_machine object.tooltip = _S.tooltip.objects.blood_machine object.ticks = false object.build_preview_animation = 5094 object.default_strength = 12 object.crashed_animation = 3372 object.show_in_town_map = true local function copy_north_to_south(t) t.south = t.north return t end object.idle_animations = copy_north_to_south { north = 2228, } -- Note that for this particular machine the staff is the primary user, not the patient -- This was done in order to be able to let the patient be visible a while longer. object.multi_usage_animations = { ["Doctor - Standard Male Patient"] = copy_north_to_south { north = { begin_use = 2232, -- empty door opened begin_use_2 = 2236, -- empty chair goes out begin_use_3 = 2554, -- Patient invited onto machine begin_use_4 = 2220, -- The chair goes in begin_use_5 = 2224, -- door closes in_use = 2566, -- The machine does its work TODO: 2562, 2574 finish_use = 2252, -- The door is opened finish_use_2 = 2256, -- Patient comes out again finish_use_3 = 2558, -- Stands up finish_use_4 = 2204, -- empty chair in finish_use_5 = 2274, -- empty door closed }, }, ["Doctor - Standard Female Patient"] = copy_north_to_south { north = { begin_use = 2232, -- empty door opened begin_use_2 = 2236, -- empty chair goes out begin_use_3 = 4614, -- Patient invited onto machine 3224 begin_use_4 = 3232, -- The chair goes in begin_use_5 = 3236, -- door closes in_use = 2566, -- The machine does its work TODO: 2562, 2574 finish_use = 1172, -- The door is opened finish_use_2 = 4738, -- Patient comes out again, 4734 with shadow finish_use_3 = 4618, -- Stands up 3228 finish_use_4 = 2204, -- empty chair in finish_use_5 = 2274, -- empty door closed }, }, ["Doctor - Slack Male Patient"] = copy_north_to_south { -- Only for baldness north = { begin_use = 2232, -- empty door opened begin_use_2 = 2236, -- empty chair goes out begin_use_3 = 5146, -- Patient invited onto machine begin_use_4 = 5150, -- The chair goes in begin_use_5 = 2224, -- door closes in_use = 2566, -- The machine does its work TODO: 2562, 2574 finish_use = 2252, -- The door is opened finish_use_2 = 5154, -- Patient comes out again finish_use_3 = 622, -- Stands up finish_use_4 = 2204, -- empty chair in finish_use_5 = 2274, -- empty door closed }, }, } object.usage_animations = copy_north_to_south { north = {in_use = {["Handyman"] = {3498, 3484}}} } object.orientations = { north = { handyman_position = {0, -1}, use_position_secondary = {1, 0}, use_position = {0, -1}, footprint = { {-1, -1, only_passable = true, need_east_side = true, need_west_side = true}, {0, -1, only_passable = true, need_north_side = true}, {-2, 0, need_south_side = true, need_north_side = true}, {-1, 0}, {0, 0, complete_cell = true}, {1, 0, only_passable = true}, {-1, 1, need_east_side = true, need_west_side = true} } }, east = { handyman_position = {-1, 0}, use_position_secondary = {0, 1}, use_position = {-1, 0}, footprint = { {0, -2, need_east_side = true, need_west_side = true}, {-1, -1, only_passable = true, complete_cell = true}, {0, -1}, {1, -1, need_south_side = true, need_north_side = true}, {-1, 0, only_passable = true, need_west_side = true}, {0, 0, complete_cell = true}, {0, 1, only_passable = true} } }, } local anim_mgr = TheApp.animation_manager anim_mgr:setMarker(object.idle_animations.north, {-1.5, -0.8}) return object CorsixTH-0.63/CorsixTH/Lua/objects/machines/cardio.lua000066400000000000000000000102761347163623700225770ustar00rootroot00000000000000--[[ Copyright (c) 2009 Manuel König 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. --]] local object = {} object.id = "cardio" object.thob = 13 object.research_fallback = 38 object.research_category = "diagnosis" object.name = _S.object.cardio object.tooltip = _S.tooltip.objects.cardio object.ticks = false object.build_preview_animation = 918 object.default_strength = 12 object.crashed_animation = 3308 object.show_in_town_map = true local function copy_north_to_south(t) t.south = t.north return t end object.idle_animations = copy_north_to_south { north = 648, } object.usage_animations = copy_north_to_south { north = { in_use = { ["Handyman"] = 890 }, finish_use = { ["Handyman"] = 894 }, }, } object.multi_usage_animations = { ["Stripped Male Patient - Doctor"] = copy_north_to_south { north = { begin_use = 1018, in_use = 652, finish_use = 3282, secondary = { begin_use = 1030, in_use = 656, finish_use = 1030, }, }, }, ["Stripped Female Patient - Doctor"] = copy_north_to_south { north = { begin_use = 3008, in_use = 2840, finish_use = 4556, secondary = { begin_use = 1030, in_use = 656, finish_use = 1030, }, }, }, ["Stripped Male Patient 2 - Doctor"] = copy_north_to_south { north = { begin_use = 1018, in_use = 652, finish_use = 3282, secondary = { begin_use = 1030, in_use = 656, finish_use = 1030, }, }, }, ["Stripped Female Patient 2 - Doctor"] = copy_north_to_south { north = { begin_use = 3008, in_use = 2840, finish_use = 4556, secondary = { begin_use = 1030, in_use = 656, finish_use = 1030, }, }, }, ["Stripped Male Patient 3 - Doctor"] = copy_north_to_south { north = { begin_use = 1018, in_use = 652, finish_use = 3282, secondary = { begin_use = 1030, in_use = 656, finish_use = 1030, }, }, }, ["Stripped Female Patient 3 - Doctor"] = copy_north_to_south { north = { begin_use = 3008, in_use = 2840, finish_use = 4556, secondary = { begin_use = 1030, in_use = 656, finish_use = 1030, }, }, }, } object.orientations = { north = { footprint = { {-1, -1, complete_cell = true}, {-1, 0, complete_cell = true}, {1, -1, only_passable = true}, {0, -1, need_north_side = true}, {0, 0, only_passable = true} }, render_attach_position = {-1, 0}, use_position = {1, -1}, use_position_secondary = {0, 0}, added_handyman_animate_offset_while_in_use = {1, -1}, }, east = { footprint = { {-1, -1, complete_cell = true}, {-1, 0}, {0, -1, complete_cell = true}, {0, 0, only_passable = true}, {-1, 1, only_passable = true} }, render_attach_position = {0, -1}, use_position = {-1, 1}, use_position_secondary = {0, 0}, added_handyman_animate_offset_while_in_use = {-1, 1}, }, } local anim_mgr = TheApp.animation_manager anim_mgr:setMarker(object.idle_animations.north, {-0.9, -0.9}) return object CorsixTH-0.63/CorsixTH/Lua/objects/machines/cast_remover.lua000066400000000000000000000103161347163623700240220ustar00rootroot00000000000000--[[ Copyright (c) 2009 Peter "Corsix" Cawley 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. --]] local object = {} object.id = "cast_remover" object.thob = 24 object.research_category = "cure" object.research_fallback = 9 object.name = _S.object.cast_remover object.tooltip = _S.tooltip.objects.cast_remover object.ticks = false object.build_preview_animation = 5072 object.default_strength = 10 object.crashed_animation = 3388 object.show_in_town_map = true local function copy_north_to_south(t) t.south = t.north return t end object.idle_animations = copy_north_to_south { north = 2492, } object.walk_in_to_use = true -- This is only considered by use_object, not multi_use_object. object.usage_animations = copy_north_to_south { north = { in_use = {["Handyman"] = 3514}, }, } object.multi_usage_animations = { ["Alternate Male Patient - Nurse"] = copy_north_to_south { north = { begin_use = 2720, -- Patient invited onto machine begin_use_2 = 2696, -- Machine closes begin_use_3 = 2692, -- Nurse introduces the almighty black bucket in_use = 2688, -- The machine spits in the bucket finish_use = 3662, -- Nurse takes the bucket again (different tile than 3658!) finish_use_2 = 3658, -- The machine opens and the patient stands up }, }, ["Standard Female Patient - Nurse"] = copy_north_to_south { north = { begin_use = 4658, -- Patient invited onto machine begin_use_2 = 4666, -- Machine closes begin_use_3 = 4670, -- Nurse introduces the almighty black bucket in_use = 4674, -- The machine spits in the bucket finish_use = 5112, -- Nurse takes the bucket again finish_use_2 = 4682, -- The machine opens up and patient leaves }, }, } object.orientations = { north = { use_position = {0, 0}, handyman_position = {{0, -2}, {-1, -1}}, walk_in_tile = {0, -1}, use_position_secondary = {0, -1}, finish_use_position_secondary = {1, -1}, footprint = { {-1, -1, complete_cell = true}, {0, -1, only_passable = true}, {1, -1, only_passable = true}, {-1, 0, complete_cell = true}, {0, 0, only_passable = true, complete_cell = true}, {-1, 1, only_passable = true, need_west_side = true}, {-1, -2, only_passable = true, invisible = true, optional = true}, {-2, -1, only_passable = true, invisible = true, optional = true} }, list_bottom = true, render_attach_position = {-1, 1}, }, east = { use_position = {0, 0}, handyman_position = {{-1, -1}, {-2, 0}}, walk_in_tile = {-1, 0}, use_position_secondary = {-1, 0}, finish_use_position_secondary = {-1, 1}, footprint = { {-1, -1}, {0, -1, complete_cell = true}, {1, -1, only_passable = true, need_north_side = true}, {-1, 0, only_passable = true}, {0, 0, only_passable = true, complete_cell = true}, {-1, 1, only_passable = true}, {-2, -1, only_passable = true, invisible = true, optional = true}, {-1, -2, only_passable = true, invisible = true, optional = true} }, early_list = true, list_bottom = true, }, } local anim_mgr = TheApp.animation_manager anim_mgr:setMarker(object.idle_animations.north, {-1.6, -0.8}) return object CorsixTH-0.63/CorsixTH/Lua/objects/machines/dna_fixer.lua000066400000000000000000000064401347163623700232730ustar00rootroot00000000000000--[[ Copyright (c) 2011 Manuel "Roujin" Wolf 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. --]] local object = {} object.id = "dna_fixer" object.thob = 23 object.research_fallback = 8 object.research_category = "cure" object.name = _S.object.dna_fixer object.tooltip = _S.tooltip.objects.dna_fixer object.ticks = false object.build_preview_animation = 5070 object.default_strength = 7 object.crashed_animation = 3376 -- TODO correct? object.show_in_town_map = true local function copy_north_to_south(t) t.south = t.north return t end -- 2350 another idle? -- 3848, 3850, 3852 sparks during transformation? -- TODO: No repair animation?? object.idle_animations = copy_north_to_south { north = 3840, } object.usage_animations = copy_north_to_south { north = { -- NB: SOME (not all) of the animations are provided for east rather than north. There the mirror / mirror_morph flag is used. begin_use = { ["Standard Female Patient"] = 3614, ["Standard Male Patient" ] = 3614, }, in_use = { -- TODO fix the object being displayed in front of the other anim ["Standard Female Patient"] = {"morph", 3594, 1150, mirror_morph = true, object_visible = true, length = 10}, -- 3594 (normal) morph to 1150 (mirrored) ["Standard Male Patient" ] = {"morph", 3594, 3618, mirror_morph = true, object_visible = true, length = 10}, -- 3594 (normal) morph to 3618 (mirrored) }, finish_use = { -- Patient leaves machine, mirrored ["Standard Female Patient"] = {1154, mirror = true}, ["Standard Male Patient" ] = {3622, mirror = true}, }, }, } object.orientations = { north = { footprint = { {-2, -1, complete_cell = true}, {-1, -1, complete_cell = true}, {0, -1}, {-2, 0, complete_cell = true}, {-1, 0}, {0, 0, need_south_side = true}, {-1, 1, only_passable = true} }, use_position = "passable", early_list = true, }, east = { footprint = { {-1, -2, complete_cell = true}, {0, -2, complete_cell = true}, {-1, -1, complete_cell = true}, {0, -1, complete_cell = true}, {-1, 0}, {0, 0}, {1, -1, only_passable = true} }, use_position = "passable", }, } -- TODO --local anim_mgr = TheApp.animation_manager --anim_mgr:setMarker(object.idle_animations.north, {-1.3, -1.2}) return object CorsixTH-0.63/CorsixTH/Lua/objects/machines/electrolyser.lua000066400000000000000000000065661347163623700240610ustar00rootroot00000000000000--[[ Copyright (c) 2009 Edvin "Lego3" Linge 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. --]] local object = {} object.id = "electrolyser" object.thob = 46 object.research_category = "cure" object.research_fallback = 3 object.name = _S.object.electrolyser object.tooltip = _S.tooltip.objects.electrolyser object.ticks = false object.build_preview_animation = 930 object.default_strength = 10 object.crashed_animation = 3300 object.show_in_town_map = true local function copy_north_to_south(t) t.south = t.north return t end object.idle_animations = copy_north_to_south { north = 1262, } object.usage_animations = copy_north_to_south { north = { begin_use = { -- Patient invited onto machine ["Standard Female Patient"] = 1266, ["Standard Male Patient" ] = 1266, ["Handyman" ] = 3546, }, in_use = { -- Patient gets electrocuted ["Standard Female Patient"] = 1274, ["Standard Male Patient" ] = 1274, ["Handyman" ] = 3550, }, finish_use = { -- Patient sparks ["Standard Female Patient"] = 1278, ["Standard Male Patient" ] = 1278, ["Handyman" ] = 3554, }, finish_use_2 = { -- Hair falls off ["Standard Female Patient"] = 2940, ["Standard Male Patient" ] = 1286, }, finish_use_3 = { -- Patient leaves machine ["Standard Female Patient"] = 2944, ["Standard Male Patient" ] = 1294, }, }, } object.orientations = { north = { render_attach_position = {-1, -1}, footprint = { {-2, -2, need_west_side = true}, {-1, -2}, {0, -2, need_east_side = true}, {-2, -1, complete_cell = true}, {-1, -1}, {0, -1, complete_cell = true}, {-2, 0, complete_cell = true}, {-1, 0}, {0, 0, complete_cell = true}, {-1, 1, only_passable = true, need_south_side = true} }, use_position = "passable" }, east = { render_attach_position = {-1, -1}, footprint = { {-2, -2, need_north_side = true}, {-1, -2}, {0, -2, complete_cell = true}, {-2, -1}, {-1, -1}, {0, -1, complete_cell = true}, {-2, 0, need_south_side = true}, {-1, 0}, {0, 0, complete_cell = true}, {1, -1, only_passable = true, need_east_side = true} }, use_position = "passable" }, } local anim_mgr = TheApp.animation_manager anim_mgr:setMarker(object.idle_animations.north, {-1.3, -1.2}) return object CorsixTH-0.63/CorsixTH/Lua/objects/machines/hair_restorer.lua000066400000000000000000000054041347163623700242030ustar00rootroot00000000000000--[[ Copyright (c) 2010 Miika-Petteri Matikainen 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. --]] local object = {} object.id = "hair_restorer" object.thob = 25 object.research_category = "cure" object.research_fallback = 10 object.name = _S.object.hair_restorer object.tooltip = _S.tooltip.objects.hair_restorer object.ticks = false object.build_preview_animation = 5074 object.default_strength = 8 object.crashed_animation = 5116 object.show_in_town_map = true local function copy_north_to_south(t) t.south = t.north return t end object.idle_animations = copy_north_to_south { north = 2070, } object.usage_animations = copy_north_to_south { north = { begin_use = { -- Patient sits down ["Slack Male Patient"] = 2074 }, begin_use_2 = { -- Hair cap goes down ["Slack Male Patient"] = 2078 }, in_use = { -- Use animation ["Slack Male Patient"] = 2082, ["Handyman"] = 568 }, finish_use = { -- Hair cap goes up and patient stands up ["Slack Male Patient"] = 2086 }, }, } object.orientations = { north = { use_position = {0, 1}, handyman_position = {0, -1}, added_handyman_animate_offset_while_in_use = {0, 2}, finish_use_position = {0, 1}, footprint = { {0, -1, only_passable = true}, {0, 0, complete_cell = true}, {0, 1, only_passable = true} }, use_animate_from_use_position = true, }, east = { use_position = {1, 0}, handyman_position = {-1, 0}, added_handyman_animate_offset_while_in_use = {2, 0}, finish_use_position = {1, 0}, footprint = { {-1, 0, only_passable = true}, {0, 0, complete_cell = true}, {1, 0, only_passable = true} }, use_animate_from_use_position = true, }, } local anim_mgr = TheApp.animation_manager anim_mgr:setMarker(object.idle_animations.north, {-1.0, -1.1}) return object CorsixTH-0.63/CorsixTH/Lua/objects/machines/inflator.lua000066400000000000000000000065551347163623700231610ustar00rootroot00000000000000--[[ Copyright (c) 2009 Peter "Corsix" Cawley 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. --]] local object = {} object.id = "inflator" object.thob = 9 object.research_category = "cure" object.research_fallback = 2 object.name = _S.object.inflator object.tooltip = _S.tooltip.objects.inflator object.ticks = false object.build_preview_animation = 908 object.default_strength = 10 object.crashed_animation = 3362 object.show_in_town_map = true local function copy_north_to_south(t) t.south = t.north return t end object.idle_animations = copy_north_to_south { north = 572, } object.multi_usage_animations = { ["Standard Male Patient - Doctor"] = copy_north_to_south { north = { begin_use = 464, -- Patient invited onto machine begin_use_2 = 478, -- Doctor pops patient's head begin_use_3 = 482, -- Doctor moves to other side of machine in_use = 496, -- Doctor re-inflates head (do not loop) finish_use = 576, -- Patients walks off machine }, }, } object.usage_animations = copy_north_to_south { north = {in_use = {["Handyman"] = 3480}} } object.orientations = { north = { handyman_position = {1, -1}, use_position = {0, 1}, use_position_secondary = {-1, 1}, finish_use_position = {1, 0}, finish_use_position_secondary = {1, -1}, footprint = { {-1, -1}, {0, -1, need_north_side = true}, {1, -1, only_passable = true}, {-1, 0}, {0, 0}, {1, 0, only_passable = true}, {-1, 1, only_passable = true}, {0, 1, only_passable = true}, {1, 1, only_passable = true} }, }, east = { handyman_position = {-1, 1}, use_position = {1, 0}, use_position_secondary = {1, -1}, finish_use_position = {0, 1}, finish_use_position_secondary = {-1, 1}, footprint = { {-1, -1}, {0, -1}, {1, -1, only_passable = true}, {-1, 0, need_west_side = true}, {0, 0}, {1, 0, only_passable = true}, {-1, 1, only_passable = true}, {0, 1, only_passable = true}, {1, 1, only_passable = true} }, }, } local anim_mgr = TheApp.animation_manager local kf1, kf2 = {0, 1}, {0, 0} anim_mgr:setMarker(object.multi_usage_animations["Standard Male Patient - Doctor"].north.begin_use, 0, kf1, 5, kf2) kf1, kf2 = {0, 0}, {1, 0} anim_mgr:setMarker(object.multi_usage_animations["Standard Male Patient - Doctor"].north.finish_use, 1, kf1, 11, kf2) anim_mgr:setMarker(object.idle_animations.north, {-0.9, -1.0}) return object CorsixTH-0.63/CorsixTH/Lua/objects/machines/jelly_moulder.lua000066400000000000000000000112521347163623700241770ustar00rootroot00000000000000--[[ Copyright (c) 2010 Manuel "Roujin" Wolf 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. --]] local object = {} object.id = "jelly_moulder" object.thob = 47 object.research_category = "cure" object.research_fallback = 12 object.name = _S.object.jelly_moulder object.tooltip = _S.tooltip.objects.jelly_moulder object.ticks = false object.build_preview_animation = 928 object.default_strength = 7 object.crashed_animation = 3312 object.show_in_town_map = true local function copy_north_to_south(t) t.south = t.north return t end object.idle_animations = copy_north_to_south { north = 1302, } -- Animations in order: -- male female -- idle 1302 -- patient enters room .. -- doctor goes to button, presses 1382 -- door opens 1310 -- patient climbs stairs 1334 3958 -- patient stands on top 1338 3962 (repeatable) NYI -- gets sucked in 1342 3966 -- floor opens 1314 -- floor stays open 1318 (repeatable) NYI -- skeleton rises 1322 -- door closes 1326 -- door stays closed 1330 (repeatable) NYI -- patient on skeleton 1346 3970 -- patient stands inside 1350 3974 (repeatable) NYI -- door opens 1354 3978 -- patient steps out 1358 3982 -- door closes 1306 object.walk_in_to_use = true -- This is only considered by use_object, not multi_use_object. object.usage_animations = copy_north_to_south { north = { in_use = {["Handyman"] = 3502}, -- (3508: duplicate with error?) }, } -- Note that for this particular machine the staff is the primary user, not the patient -- This was done in order to be able to let the patient be visible a while longer. object.multi_usage_animations = { ["Doctor - Standard Male Patient"] = copy_north_to_south { north = { begin_use = 1382, begin_use_2 = 1310, begin_use_3 = 1334, begin_use_4 = 1342, begin_use_5 = 1314, in_use = 1322, finish_use = 1326, finish_use_2 = 1346, finish_use_3 = 1354, finish_use_4 = 1358, finish_use_5 = 1306, }, }, ["Doctor - Standard Female Patient"] = copy_north_to_south { north = { begin_use = 1382, begin_use_2 = 1310, begin_use_3 = 3958, begin_use_4 = 3966, begin_use_5 = 1314, in_use = 1322, finish_use = 1326, finish_use_2 = 3970, finish_use_3 = 3978, finish_use_4 = 3982, finish_use_5 = 1306, }, }, } object.orientations = { north = { handyman_position = {2, -1}, walk_in_tile = {1, -1}, use_position = {-1, 1}, use_position_secondary = {1, -1}, finish_use_position = {-1, 1}, finish_use_position_secondary = {1, 0}, finish_use_orientation_secondary = "east", footprint = { {-1, -1}, {0, -1}, {1, -1, only_passable = true}, {-1, 0}, {0, 0, complete_cell = true}, {1, 0, only_passable = true}, {-1, 1, only_passable = true, need_east_side = true}, }, render_attach_position = {0, -1}, }, east = { handyman_position = {-1, 2}, walk_in_tile = {-1, 1}, use_position = {1, -1}, use_position_secondary = {-1, 1}, finish_use_position = {1, -1}, finish_use_position_secondary = {0, 1}, finish_use_orientation_secondary = "south", footprint = { {-1, -1}, {0, -1}, {1, -1, only_passable = true, need_south_side = true}, {-1, 0}, {0, 0, complete_cell = true}, {-1, 1, only_passable = true}, {0, 1, only_passable = true}, }, render_attach_position = {-1, 0}, }, } return object CorsixTH-0.63/CorsixTH/Lua/objects/machines/operating_table.lua000066400000000000000000000077641347163623700245050ustar00rootroot00000000000000--[[ Copyright (c) 2010 Peter "Corsix" Cawley 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. --]] local object = {} object.id = "operating_table" object.slave_id = "operating_table_b" object.class = "OperatingTable" object.thob = 30 object.research_category = "cure" object.research_fallback = 19 -- Kidney beans object.name = _S.object.operating_table object.tooltip = _S.tooltip.objects.operating_table object.ticks = false object.build_preview_animation = 5080 object.default_strength = 8 object.crashed_animation = 3392 object.show_in_town_map = true local function copy_north_to_south(t) t.south = t.north return t end object.idle_animations = copy_north_to_south { north = 2314, } object.usage_animations = copy_north_to_south { north = { in_use = { Handyman = 660, }, }, } object.multi_usage_animations = { ["Surgeon - Gowned Male Patient"] = copy_north_to_south { north = { begin_use = 2318, begin_use_2 = 2322, in_use = 2348, finish_use = 2346, finish_use_2 = 2338, secondary = { begin_use = 416, finish_use_2 = 416, }, }, }, ["Surgeon - Gowned Female Patient"] = copy_north_to_south { north = { begin_use = 2318, begin_use_2 = 2932, in_use = 2938, finish_use = 2936, finish_use_2 = 2338, secondary = { begin_use = 2886, finish_use_2 = 2886, }, }, }, } local anim_mgr = TheApp.animation_manager -- Slight hack: there seems to be no animation for a patient just lying on the -- table, so we take a duplicate of the animation for the patient leaving the -- table, and force its length to be 1, hence causing just the first frame to -- be used. anim_mgr:setAnimLength(2348, 1) anim_mgr:setAnimLength(2938, 1) -- Mood icon positions anim_mgr:setMarker(object.idle_animations.north, {-1.59, -2.41}) object.orientations = { north = { use_position = {-1, -2}, use_position_secondary = {-2, -1}, footprint = { {-2, -1, only_passable = true}, {-1, -1, complete_cell = true}, {-1, -2, only_passable = true}, {0, -1, complete_cell = true}, {0, -2, complete_cell = true}, {1, 0, complete_cell = true}, {1, -2, complete_cell = true}, {1, -1, only_passable = true}, }, render_attach_position = {0, -1}, slave_position = {1, -1}, }, east = { use_position = {-2, -1}, use_position_secondary = {-1, -2}, footprint = { {-1, -2, only_passable = true}, {-1, -1, complete_cell = true}, {-2, -1, only_passable = true}, {-1, 0, complete_cell = true}, {-2, 0, complete_cell = true}, {0, 1, complete_cell = true}, {-2, 1, complete_cell = true}, {-1, 1, only_passable = true}, }, slave_position = {-1, 1}, render_attach_position = {-1, 0}, }, } class "OperatingTable" (Machine) ---@type OperatingTable local OperatingTable = _G["OperatingTable"] OperatingTable:slaveMixinClass() function OperatingTable:machineUsed(...) if self.master then -- Is slave. Do nothing. else return Machine.machineUsed(self, ...) end end return object CorsixTH-0.63/CorsixTH/Lua/objects/machines/operating_table_b.lua000066400000000000000000000035701347163623700247750ustar00rootroot00000000000000--[[ Copyright (c) 2010 Peter "Corsix" Cawley 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. --]] local object = {} object.id = "operating_table_b" object.class = "OperatingTable" object.thob = 12 object.name = _S.object.operating_table object.tooltip = _S.tooltip.objects.operating_table object.ticks = false object.crashed_animation = 0 object.show_in_town_map = true local function copy_north_to_south(t) t.south = t.north return t end object.idle_animations = copy_north_to_south { north = 2310, } object.usage_animations = copy_north_to_south { north = { begin_use = { Surgeon = 2306 }, begin_use_2 = { Surgeon = 2330 }, in_use = { Surgeon = {4890, 2326} }, finish_use = { Surgeon = 2334 }, finish_use_2 = { Surgeon = 2342 }, } } object.orientations = { north = { use_position = {0, 0}, footprint = {}, }, east = { use_position = {0, 0}, footprint = {}, }, } return object CorsixTH-0.63/CorsixTH/Lua/objects/machines/scanner.lua000066400000000000000000000205351347163623700227660ustar00rootroot00000000000000--[[ Copyright (c) 2009 Manuel König 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. --]] local object = {} object.id = "scanner" object.thob = 14 object.research_category = "diagnosis" object.research_fallback = 36 object.name = _S.object.scanner object.tooltip = _S.tooltip.objects.scanner object.ticks = false object.build_preview_animation = 920 object.default_strength = 12 object.crashed_animation = 3316 object.show_in_town_map = true local function copy_north_to_south(t) t.south = t.north return t end object.idle_animations = copy_north_to_south { north = 1398, } --[[This is incomplete as the scanner and console should be in sync with each other i.e. Dr sits down and pushes some buttons and the scanner scans, the he pushes the lever and it will tip back etc.]] object.usage_animations = copy_north_to_south { north = { begin_use = { -- goes down ["Transparent Male Patient"] = 874, ["Chewbacca Patient"] = 1176, ["Stripped Male Patient"] = 1402, ["Stripped Female Patient"] = 1442, ["Stripped Male Patient 2"] = 1406, ["Stripped Female Patient 2"] = 1446, ["Stripped Male Patient 3"] = 1402, ["Stripped Female Patient 3"] = 1442, ["Elvis Patient"] = 4914, ["Transparent Female Patient"] = 4926, ["Invisible Patient"] = 4942, ["Alternate Male Patient"] = 4958, ["Slack Male Patient"] = 4974, ["Slack Female Patient"] = 5158, }, begin_use_2 = { -- stays down ["Transparent Male Patient"] = 874, ["Chewbacca Patient"] = 1176, ["Stripped Male Patient"] = 1402, ["Stripped Female Patient"] = 1442, ["Stripped Male Patient 2"] = 1410, ["Stripped Female Patient 2"] = 1450, ["Stripped Male Patient 3"] = 1402, ["Stripped Female Patient 3"] = 1442, ["Elvis Patient"] = 4914, ["Transparent Female Patient"] = 4926, ["Invisible Patient"] = 4942, ["Alternate Male Patient"] = 4958, ["Slack Male Patient"] = 4974, ["Slack Female Patient"] = 5158, ["Handyman"] = 564, }, begin_use_3 = { -- goes up ["Transparent Male Patient"] = 878, ["Chewbacca Patient"] = 1180, ["Stripped Male Patient"] = 1406, ["Stripped Female Patient"] = 1446, ["Stripped Male Patient 2"] = 1414, ["Stripped Female Patient 2"] = 1454, ["Stripped Male Patient 3"] = 1418, ["Stripped Female Patient 3"] = 1458, ["Elvis Patient"] = 4916, ["Transparent Female Patient"] = 4930, ["Invisible Patient"] = 4946, ["Alternate Male Patient"] = 4962, ["Slack Male Patient"] = 4978, ["Slack Female Patient"] = 5162, }, begin_use_4 = { -- stays up ["Transparent Male Patient"] = 886, ["Chewbacca Patient"] = 1188, ["Stripped Male Patient"] = 1410, ["Stripped Female Patient"] = 1450, ["Stripped Male Patient 2"] = 1402, ["Stripped Female Patient 2"] = 1442, ["Stripped Male Patient 3"] = 1422, ["Stripped Female Patient 3"] = 1462, ["Elvis Patient"] = 4922, ["Transparent Female Patient"] = 4938, ["Invisible Patient"] = 4954, ["Alternate Male Patient"] = 4970, ["Slack Male Patient"] = 4986, ["Slack Female Patient"] = 5166, }, begin_use_5 = { -- goes down/go back ["Transparent Male Patient"] = 882, ["Chewbacca Patient"] = 1184, ["Stripped Male Patient"] = 1414, ["Stripped Female Patient"] = 1454, ["Stripped Male Patient 2"] = 1418, ["Stripped Female Patient 2"] = 1458, ["Stripped Male Patient 3"] = 1426, ["Stripped Female Patient 3"] = 1466, ["Elvis Patient"] = 4918, ["Transparent Female Patient"] = 4934, ["Invisible Patient"] = 4950, ["Alternate Male Patient"] = 4966, ["Slack Male Patient"] = 4982, ["Slack Female Patient"] = 5170, }, finish_use = { -- stays down/stay back ["Transparent Male Patient"] = 874, ["Chewbacca Patient"] = 1176, ["Stripped Male Patient"] = 1402, ["Stripped Female Patient"] = 1442, ["Stripped Male Patient 2"] = 1422, ["Stripped Female Patient 2"] = 1462, ["Stripped Male Patient 3"] = 1430, ["Stripped Female Patient 3"] = 1470, ["Elvis Patient"] = 4914, ["Transparent Female Patient"] = 4926, ["Invisible Patient"] = 4942, ["Alternate Male Patient"] = 4958, ["Slack Male Patient"] = 4974, ["Slack Female Patient"] = 5158, }, finish_use_2 = { -- goes up/forwards scan ["Transparent Male Patient"] = 878, ["Chewbacca Patient"] = 1180, ["Stripped Male Patient"] = 1406, ["Stripped Female Patient"] = 1446, ["Stripped Male Patient 2"] = 1426, ["Stripped Female Patient 2"] = 1466, ["Stripped Male Patient 3"] = 1434, ["Stripped Female Patient 3"] = 1474, ["Elvis Patient"] = 4916, ["Transparent Female Patient"] = 4930, ["Invisible Patient"] = 4946, ["Alternate Male Patient"] = 4962, ["Slack Male Patient"] = 4978, ["Slack Female Patient"] = 5162, }, finish_use_3 = { -- goes down/stay forwards ["Transparent Male Patient"] = 886, ["Chewbacca Patient"] = 1188, ["Stripped Male Patient"] = 1410, ["Stripped Female Patient"] = 1450, ["Stripped Male Patient 2"] = 1430, ["Stripped Female Patient 2"] = 1470, ["Stripped Male Patient 3"] = 1422, ["Stripped Female Patient 3"] = 1462, ["Elvis Patient"] = 4922, ["Transparent Female Patient"] = 4938, ["Invisible Patient"] = 4954, ["Alternate Male Patient"] = 4970, ["Slack Male Patient"] = 4986, ["Slack Female Patient"] = 5166, }, finish_use_4 = { -- stays down/reverse scan ["Transparent Male Patient"] = 882, ["Chewbacca Patient"] = 1184, ["Stripped Male Patient"] = 1414, ["Stripped Female Patient"] = 1454, ["Stripped Male Patient 2"] = 1434, ["Stripped Female Patient 2"] = 1474, ["Stripped Male Patient 3"] = 1422, ["Stripped Female Patient 3"] = 1462, ["Elvis Patient"] = 4918, ["Transparent Female Patient"] = 4934, ["Invisible Patient"] = 4950, ["Alternate Male Patient"] = 4966, ["Slack Male Patient"] = 4982, ["Slack Female Patient"] = 5170, }, finish_use_5 = { -- goes up/tips forward ["Transparent Male Patient"] = 874, ["Chewbacca Patient"] = 1176, ["Stripped Male Patient"] = 1402, ["Stripped Female Patient"] = 1442, ["Stripped Male Patient 2"] = 1438, ["Stripped Female Patient 2"] = 1478, ["Stripped Male Patient 3"] = 1438, ["Stripped Female Patient 3"] = 1478, ["Elvis Patient"] = 4914, ["Transparent Female Patient"] = 4926, ["Invisible Patient"] = 4942, ["Alternate Male Patient"] = 4958, ["Slack Male Patient"] = 4974, ["Slack Female Patient"] = 5158, }, }, } object.orientations = { north = { use_position = {0, 0}, footprint = { {-2, -1}, {-1, -1}, {0, -1}, {-2, 0}, {-1, 0, need_south_side = true}, {0, 0, complete_cell = true, only_passable = true} }, render_attach_position = {0, -1}, }, east = { use_position = {0, 0}, footprint = { {-1, -2} , {0, -2}, {-1, -1}, {0, -1, need_east_side = true}, {-1, 0}, {0, 0, complete_cell = true, only_passable = true} }, render_attach_position = {-1, 0}, }, } local anim_mgr = TheApp.animation_manager anim_mgr:setMarker(object.idle_animations.north, {-1.1, -1.1}) return object CorsixTH-0.63/CorsixTH/Lua/objects/machines/shower.lua000066400000000000000000000056371347163623700226520ustar00rootroot00000000000000--[[ Copyright (c) 2010 Manuel "Roujin" Wolf 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. --]] local object = {} object.id = "shower" object.thob = 54 object.research_category = "cure" object.research_fallback = 6 object.name = _S.object.shower object.tooltip = _S.tooltip.objects.shower object.ticks = false object.build_preview_animation = 5100 object.default_strength = 10 object.crashed_animation = 3380 object.show_in_town_map = true local function copy_north_to_south(t) t.south = t.north return t end object.idle_animations = copy_north_to_south { north = 2014, } object.usage_animations = copy_north_to_south { north = { begin_use = { ["Standard Male Patient"] = 2018, ["Standard Female Patient"] = 2852, ["Handyman"] = 3534, }, in_use = { ["Standard Male Patient"] = 2150, ["Standard Female Patient"] = 2856, ["Handyman"] = 3538, }, finish_use = { ["Standard Male Patient"] = 2026, ["Standard Female Patient"] = 2860, ["Handyman"] = 3542, }, }, } object.orientations = { north = { use_position = {-1, 1}, footprint = { {-2, -2, complete_cell = true}, {-1, -2, complete_cell = true}, {0, -2}, {-2, -1, complete_cell = true}, {-1, -1, complete_cell = true}, {0, -1, complete_cell = true}, {-2, 0, complete_cell = true}, {-1, 0, complete_cell = true}, {0, 0, complete_cell = true}, {-1, 1, only_passable = true}, }, render_attach_position = {-1, 0}, }, east = { use_position = {1, -1}, footprint = { {-2, -2, complete_cell = true}, {-1, -2, complete_cell = true}, {0, -2, complete_cell = true}, {-2, -1, complete_cell = true}, {-1, -1, complete_cell = true}, {0, -1, complete_cell = true}, {1, -1, only_passable = true}, {-2, 0}, {-1, 0, complete_cell = true}, {0, 0, complete_cell = true}, }, render_attach_position = {-1, 0}, }, } return object CorsixTH-0.63/CorsixTH/Lua/objects/machines/slicer.lua000066400000000000000000000054201347163623700226120ustar00rootroot00000000000000--[[ Copyright (c) 2009 Edvin "Lego3" Linge 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. --]] local object = {} object.id = "slicer" object.thob = 26 object.research_category = "cure" object.research_fallback = 7 object.name = _S.object.slicer object.tooltip = _S.tooltip.objects.slicer object.ticks = false object.build_preview_animation = 932 object.default_strength = 8 object.crashed_animation = 3400 object.show_in_town_map = true local function copy_north_to_south(t) t.south = t.north return t end object.idle_animations = copy_north_to_south { north = 1386, } object.usage_animations = copy_north_to_south { north = { in_use = {["Handyman"] = 3490}, }, } object.multi_usage_animations = { ["Slack Male Patient - Doctor"] = copy_north_to_south { north = { in_use = 1390, -- Patient gets the tongue drawn out }, }, ["Slack Female Patient - Doctor"] = copy_north_to_south { north = { in_use = 1394, -- Patient gets the tongue drawn out }, }, } object.orientations = { north = { footprint = { {-1, -1, only_passable = true}, {-1, 0}, {-1, 1}, {0, -1, only_passable = true}, {0, 0, only_passable = true, need_east_side = true}, {0, 1, only_passable = true}, }, use_position = {0, 0}, handyman_position = {1, -1}, use_position_secondary = {-1, -1}, list_bottom = true, }, east = { footprint = { {-1, -1, only_passable = true}, {0, -1}, {1, -1}, {-1, 0, only_passable = true}, {0, 0, only_passable = true, need_south_side = true}, {1, 0, only_passable = true}, }, use_position = {0, 0}, handyman_position = {-1, 1}, use_position_secondary = {-1, -1}, early_list = true, list_bottom = true, }, } local anim_mgr = TheApp.animation_manager anim_mgr:setMarker(object.idle_animations.north, {-1.2, -0.8}) return object CorsixTH-0.63/CorsixTH/Lua/objects/machines/ultrascanner.lua000066400000000000000000000072021347163623700240320ustar00rootroot00000000000000--[[ Copyright (c) 2009 Manuel König 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. --]] local object = {} object.id = "ultrascanner" object.thob = 22 object.research_category = "diagnosis" object.research_fallback = 40 object.name = _S.object.ultrascanner object.tooltip = _S.tooltip.objects.ultrascanner object.ticks = false object.build_preview_animation = 5068 object.default_strength = 12 object.crashed_animation = 3396 object.show_in_town_map = true local function copy_north_to_south(t) t.south = t.north return t end object.idle_animations = copy_north_to_south { north = 1556, --1556 or 3844? } object.usage_animations = copy_north_to_south { north = { in_use = { ["Handyman"] = 664, }, }, } object.multi_usage_animations = { ["Standard Male Patient - Doctor"] = copy_north_to_south { north = { begin_use = 1560, -- Patient climbs to the bed begin_use_2 = 1568, -- Doctor takes the instrument in_use = 1614, -- Doctor examines the patient finish_use = 1574, -- Doctor puts away the instrument finish_use_2 = 1610, -- Patient climbs out of the bed }, }, ["Standard Female Patient - Doctor"] = copy_north_to_south { north = { begin_use = 3084, -- Patient climbs to the bed begin_use_2 = 3092, -- Doctor takes the instrument in_use = 3096, -- Doctor examines the patient finish_use = 3100, -- Doctor puts away the instrument finish_use_2 = 1618, -- Patient climbs out of the bed }, }, } object.orientations = { north = { footprint = { {-1, -1, need_west_side = true}, {0, -1, complete_cell = true}, {1, -1, only_passable = true, complete_cell = true}, {-1, 0, only_passable =true, need_west_side = true}, {0, 0}, {1, 0, only_passable = true}, {-1, 1, only_passable = true, need_west_side = true}, {0, 1, only_passable = true} }, use_position = {-1, 0, need_west_side = true}, use_position_secondary = {1, -1}, handyman_position = {2, 0}, }, east = { render_attach_position = { {0, 0}, {1, 0}, {-1, 1} }, footprint = { {-1, -1, complete_cell = true}, {0, -1, only_passable = true, need_north_side = true}, {1, -1, only_passable = true, need_north_side = true}, {-1, 0, complete_cell = true}, {0, 0}, {1, 0, only_passable = true}, {-1, 1, only_passable = true, complete_cell = true}, {0, 1, only_passable = true} }, use_position = {0, -1}, use_position_secondary = {-1, 1}, handyman_position = {0, 2}, list_bottom = true, }, } local anim_mgr = TheApp.animation_manager anim_mgr:setMarker(object.idle_animations.north, {-0.9, -0.9}) return object CorsixTH-0.63/CorsixTH/Lua/objects/machines/x_ray.lua000066400000000000000000000064251347163623700224610ustar00rootroot00000000000000--[[ Copyright (c) 2009 Manuel König 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. --]] local object = {} object.id = "x_ray" object.thob = 27 object.research_category = "diagnosis" object.research_fallback = 39 object.name = _S.object.x_ray object.tooltip = _S.tooltip.objects.x_ray object.ticks = false object.build_preview_animation = 5076 object.default_strength = 12 object.crashed_animation = 3384 object.show_in_town_map = true local function copy_north_to_south(t) t.south = t.north return t end object.idle_animations = copy_north_to_south { north = 1988, } object.usage_animations = copy_north_to_south { north = { begin_use = { -- Patient walks into X-ray ["Standard Male Patient"] = 1964, ["Standard Female Patient"] = 2948, ["Slack Female Patient"] = 2948, ["Slack Male Patient"] = 5178, ["Elvis Patient"] = 5120, ["Chewbacca Patient"] = 5132, ["Invisible Patient"] = 614, ["Handyman"] = 3558, }, in_use = { -- Radiation ["Standard Male Patient"] = 1960, ["Standard Female Patient"] = 2952, ["Slack Female Patient"] = 2952, ["Slack Male Patient"] = 5174, ["Elvis Patient"] = 5128, ["Chewbacca Patient"] = 610, ["Invisible Patient"] = 5140, ["Handyman"] = 3562, }, finish_use = { -- Patient walks away ["Standard Male Patient"] = 1992, ["Standard Female Patient"] = 2956, ["Slack Female Patient"] = 2956, ["Slack Male Patient"] = 5182, ["Elvis Patient"] = 5124, ["Chewbacca Patient"] = 5136, -- or 5138? ["Invisible Patient"] = 618, ["Handyman"] = 3562, -- TODO: Another glitch in the original. This sprite is missing. }, }, } object.orientations = { north = { use_position = {1, -1}, render_attach_position = {-1, -1}, footprint = { {-2, -2}, {-1, -2}, {-2, -1}, {-1, -1}, {0, -1}, {1, -1, only_passable = true}, {-2, 0}, {-1, 0}, {0, 0} } }, east = { use_position = {-1, 1}, render_attach_position = {-1, -1}, footprint = { {-2, -2}, {-1, -2}, {0, -2}, {-2, -1}, {-1, -1}, {0, -1}, {-1, 0}, {0, 0}, {-1, 1, only_passable = true} } }, } local anim_mgr = TheApp.animation_manager anim_mgr:setMarker(object.idle_animations.north, {-2, -2}) return object CorsixTH-0.63/CorsixTH/Lua/objects/op_sink1.lua000066400000000000000000000043711347163623700212710ustar00rootroot00000000000000--[[ Copyright (c) 2010 Peter "Corsix" Cawley 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. --]] local object = {} object.id = "op_sink1" object.slave_id = "op_sink2" object.class = "OperatingSink" object.thob = 33 object.name = _S.object.op_sink1 object.tooltip = _S.tooltip.objects.op_sink1 object.ticks = false object.walk_in_to_use = true object.show_in_town_map = true object.locked_to_wall = { -- permittable wall -> orientation north = "east", west = "north", } local function copy_north_to_south(t) t.south = t.north return t end object.idle_animations = copy_north_to_south { north = 2354, } object.usage_animations = copy_north_to_south { north = { in_use = { Surgeon = 2362 } }, } object.orientations = { north = { footprint = { {0, 0, complete_cell = true}, {0, -1, complete_cell = true}, {1, 0, only_passable = true, invisible = true}, }, use_position = {1, 0}, slave_position = {0, -1}, }, east = { footprint = { {0, 0, complete_cell = true}, {-1, 0, complete_cell = true}, {0, 1, only_passable = true, invisible = true}, }, use_position = {0, 1}, slave_position = {-1, 0}, }, } class "OperatingSink" (Object) ---@type OperatingSink local OperatingSink = _G["OperatingSink"] OperatingSink:slaveMixinClass() return object CorsixTH-0.63/CorsixTH/Lua/objects/op_sink2.lua000066400000000000000000000030141347163623700212630ustar00rootroot00000000000000--[[ Copyright (c) 2010 Peter "Corsix" Cawley 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. --]] local object = {} object.id = "op_sink2" object.class = "OperatingSink" object.thob = 34 object.name = _S.object.op_sink2 object.tooltip = _S.tooltip.objects.op_sink2 object.ticks = false object.show_in_town_map = true local function copy_north_to_south(t) t.south = t.north return t end object.idle_animations = copy_north_to_south { north = 2358, } object.orientations = { north = { footprint = {}, }, east = { footprint = {}, }, } return object CorsixTH-0.63/CorsixTH/Lua/objects/pharmacy_cabinet.lua000066400000000000000000000062331347163623700230360ustar00rootroot00000000000000--[[ Copyright (c) 2009 Peter "Corsix" Cawley 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. --]] local object = {} object.id = "pharmacy_cabinet" object.thob = 39 object.research_category = "cure" object.research_fallback = 13 -- Sleeping illness object.name = _S.object.pharmacy_cabinet object.tooltip = _S.tooltip.objects.pharmacy_cabinet object.ticks = false object.build_preview_animation = 5088 object.show_in_town_map = true local function copy_north_to_south(t) t.south = t.north return t end object.idle_animations = copy_north_to_south { north = 1578, } local function anim_set(begin,finish,idle,in_use,idle2) return { begin_use = 1590, -- Nurse-only begin_use_2 = 1594, -- Nurse-only begin_use_3 = begin, in_use = 1666, -- Nurse-only finish_use = finish, finish_use_2 = 1598, -- Nurse-only secondary = { begin_use = idle, begin_use_2 = idle, in_use = in_use, finish_use_2 = idle2 or idle, }, } end object.multi_usage_animations = { ["Nurse - Standard Male Patient"] = copy_north_to_south { north = anim_set(1630, 1638, 26, 1662), }, ["Nurse - Standard Female Patient"] = copy_north_to_south { north = anim_set(3104, 3112, 10, 3108), }, ["Nurse - Invisible Patient"] = copy_north_to_south { north = anim_set(1704, 1638, 1842, {"morph", 1700, 1662, layers = "cured_layers"}, 26), }, ["Nurse - Transparent Male Patient"] = copy_north_to_south { north = anim_set(1686, 1638, 1074, {"morph", 1694, 1662}, 26), }, ["Nurse - Transparent Female Patient"] = copy_north_to_south { north = anim_set(3120, 3112, 3022, {"morph", 3124, 3108}, 10), }, } object.orientations = { north = { footprint = { {0, 0, complete_cell = true}, {0, 1, only_passable = true}, {0, 2, only_passable = true}, {-1, 1, only_passable = true} }, use_position = {0, 1}, use_position_secondary = {-1, 1}, use_animate_from_use_position = true, }, east = { footprint = { {0, 0, complete_cell = true}, {1, 0, only_passable = true}, {2, 0, only_passable = true}, {1, -1, only_passable = true} }, use_position = {1, 0}, use_position_secondary = {1, -1}, use_animate_from_use_position = true, }, } return object CorsixTH-0.63/CorsixTH/Lua/objects/plant.lua000066400000000000000000000244431347163623700206660ustar00rootroot00000000000000--[[ Copyright (c) 2009 Peter "Corsix" Cawley 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. --]] local object = {} object.id = "plant" object.thob = 45 object.name = _S.object.plant object.class = "Plant" object.tooltip = _S.tooltip.objects.plant object.ticks = false object.corridor_object = 7 object.build_preview_animation = 934 object.idle_animations = { north = 1950, south = 1950, east = 1950, west = 1950, } object.usage_animations = { north = { begin_use = { ["Handyman"] = {1972, object_visible = true} }, in_use = { ["Handyman"] = {1980, object_visible = true} }, }, east = { begin_use = { ["Handyman"] = {1974, object_visible = true} }, in_use = { ["Handyman"] = {1982, object_visible = true} }, }, } object.orientations = { north = { footprint = { {0, 0, complete_cell = true} }, use_position = {0, -1}, use_animate_from_use_position = true }, east = { footprint = { {0, 0, complete_cell = true} }, use_position = {-1, 0}, use_animate_from_use_position = true }, south = { footprint = { {0, 0, complete_cell = true} }, use_position = {0, -1}, use_animate_from_use_position = true }, west = { footprint = { {0, 0, complete_cell = true} }, use_position = {-1, 0}, use_animate_from_use_position = true }, } -- For litter: put broom back 356 -- take broom out: 1874 -- swoop: 1878 -- Frames for plant states are -- * healthy: 1950 -- * drooping1: 1951 -- * drooping2: 1952 -- * dying: 1953 -- * dead: 1954 local days_between_states = 75 -- days before we reannouncing our watering status if we were unreachable local days_unreachable = 10 --! An `Object` which needs watering now and then. class "Plant" (Object) ---@type Plant local Plant = _G["Plant"] function Plant:Plant(world, object_type, x, y, direction, etc) -- It doesn't matter which direction the plant is facing. It will be rotated so that an approaching -- handyman uses the correct usage animation when appropriate. self:Object(world, object_type, x, y, direction, etc) self.current_state = 0 self.base_frame = self.th:getFrame() self.days_left = days_between_states self.unreachable = false self.unreachable_counter = days_unreachable end --! Goes one step forward (or backward) in the states of the plant. --!param restoring (boolean) If true the plant improves its health instead of drooping. function Plant:setNextState(restoring) if restoring then if self.current_state > 0 then self.current_state = self.current_state - 1 end elseif self.current_state < 5 then self.current_state = self.current_state + 1 end self.th:setFrame(self.base_frame + self.current_state) end local plant_restoring; plant_restoring = permanent"plant_restoring"( function(plant) local phase = plant.phase plant:setNextState(true) if phase > 0 then plant.phase = phase - 1 plant:setTimer(math.floor(14 / plant.cycles), plant_restoring) else plant.ticks = false end end) --! Restores the plant to its initial state. (i.e. healthy) function Plant:restoreToFullHealth() self.ticks = true self.phase = self.current_state self.cycles = self.current_state self:setTimer((self.direction == "south" or self.direction == "east") and 35 or 20, plant_restoring) self.days_left = days_between_states local taskIndex = self.hospital:getIndexOfTask(self.tile_x, self.tile_y, "watering") if taskIndex ~= -1 then self.hospital:removeHandymanTask(taskIndex, "watering") end end --! Overridden since the plant animates slowly over time function Plant:tick() local timer = self.timer_time if timer then timer = timer - 1 if timer == 0 then self.timer_time = nil local timer_function = self.timer_function self.timer_function = nil timer_function(self) else self.timer_time = timer end end end --! Returns whether the plant is in need of watering right now. function Plant:needsWatering() if self.current_state == 0 then if self.days_left < 10 then return true end else return true end end --! When the plant needs water it periodically calls for a nearby handyman. function Plant:callForWatering() -- If self.ticks is true it means that a handyman is currently watering the plant. -- If there are no tiles to water from, just die. if not self.ticks then if not self.unreachable then local index = self.hospital:getIndexOfTask(self.tile_x, self.tile_y, "watering") if index == -1 then local call = self.world.dispatcher:callForWatering(self) self.hospital:addHandymanTask(self, "watering", self.current_state + 1, self.tile_x, self.tile_y, call) else self.hospital:modifyHandymanTaskPriority(index, self.current_state + 1, "watering") end end -- If very thirsty, make user aware of it. if self.current_state > 1 and not self.plant_announced then self.world.ui.adviser:say(_A.warnings.plants_thirsty) self.plant_announced = true end end end --! When a handyman is about to be summoned this function queues the complete set of actions necessary, -- including entering and leaving any room involved. It also queues a meander action at the end. -- Note that if there are more plants that need watering inside the room he will continue to water -- those too before leaving. --!param handyman (Staff) The handyman that is about to get the actions. function Plant:createHandymanActions(handyman) local this_room = self:getRoom() local handyman_room = handyman:getRoom() local ux, uy = self:getBestUsageTileXY(handyman.tile_x, handyman.tile_y) if not ux or not uy then -- The plant cannot be reached. self.unreachable = true self.unreachable_counter = days_unreachable local index = self.hospital:getIndexOfTask(self.tile_x, self.tile_y, "watering") if index ~= -1 then self.hospital:removeHandymanTask(index, "watering") end -- Release Handyman handyman:setCallCompleted() if handyman_room then handyman:setNextAction(handyman_room:createLeaveAction()) handyman:queueAction(MeanderAction()) else handyman:setNextAction(MeanderAction()) end return end self.reserved_for = handyman local walk_action = WalkAction(ux, uy):setIsEntering(this_room and true or false) if handyman_room and handyman_room ~= this_room then handyman:setNextAction(handyman_room:createLeaveAction()) handyman:queueAction(walk_action) else handyman:setNextAction(walk_action) end handyman:queueAction(UseObjectAction(self):enableWateringPlant()) CallsDispatcher.queueCallCheckpointAction(handyman) handyman:queueAction(AnswerCallAction()) end --! When a handyman should go to the plant he should approach it from the closest reachable tile. --!param from_x (integer) The x coordinate of tile to calculate from. --!param from_y (integer) The y coordinate of tile to calculate from. function Plant:getBestUsageTileXY(from_x, from_y) local access_points = {{dx = 0, dy = 1, direction = "north"}, {dx = 0, dy = -1, direction = "south"}, {dx = -1, dy = 0, direction = "east"}, {dx = 1, dy = 0, direction = "west"}} local shortest local best_point = nil local room_here = self:getRoom() for _, point in ipairs(access_points) do local dest_x, dest_y = self.tile_x + point.dx, self.tile_y + point.dy local room_there = self.world:getRoom(dest_x, dest_y) if room_here == room_there then local distance = self.world:getPathDistance(from_x, from_y, self.tile_x + point.dx, self.tile_y + point.dy) if distance and (not best_point or shortest > distance) then best_point = point shortest = distance end end end if best_point then self.direction = best_point.direction return self.tile_x + best_point.dx, self.tile_y + best_point.dy else self.direction = "north" return end end --! Counts down to eventually let the plant droop. function Plant:tickDay() if not self.picked_up then -- The plant will need water a little more often if it is hot where it is. local temp = self.world.map.th:getCellTemperature(self.tile_x, self.tile_y) self.days_left = self.days_left - (1 + temp) if self.days_left < 1 then self.days_left = days_between_states self:setNextState() elseif not self.reserved_for and self:needsWatering() and not self.unreachable then self:callForWatering() end if self.unreachable then self.unreachable_counter = self.unreachable_counter - 1 if self.unreachable_counter == 0 then self.unreachable = false end end end end --! The plant needs to retain its animation and reset its unreachable flag when being moved function Plant:onClick(ui, button) if button == "right" then self.unreachable = false self.picked_up = true self.current_frame = self.base_frame + self.current_state end Object.onClick(self, ui, button) end function Plant:isPleasing() if not self.ticks then return true else return false end end function Plant:onDestroy() local index = self.hospital:getIndexOfTask(self.tile_x, self.tile_y, "watering") if index ~= -1 then self.hospital:removeHandymanTask(index, "watering") end Object.onDestroy(self) end function Plant:afterLoad(old, new) if old < 52 then self.hospital = self.world:getLocalPlayerHospital() end Object.afterLoad(self, old, new) end return object CorsixTH-0.63/CorsixTH/Lua/objects/pool_table.lua000066400000000000000000000066431347163623700216720ustar00rootroot00000000000000--[[ Copyright (c) 2009 Peter "Corsix" Cawley 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. --]] local object = {} object.id = "pool_table" object.thob = 10 object.name = _S.object.pool_table object.tooltip = _S.tooltip.objects.pool_table object.ticks = false object.build_preview_animation = 5058 object.idle_animations = { north = 2130, south = 2130, } -- There are five animations, for each the doctor and the handyman. -- The nurses don't like pool, appearently. -- -- anim | doctor | handyman -- ----------------------------- -- aim | 1230 | 3924 -- shoot | 1234 | 3928 -- chalk | 1238 | 3932 -- take cue | 1244 | 3936 -- leave cue | 1248 | 3940 -- -- the playing procedure is: take cue, chalk, aim, shoot, leave cue object.usage_animations = { north = { begin_use = { Doctor = 1244, Handyman = 3936, }, begin_use_2 = { Doctor = 1238, Handyman = 3932, }, begin_use_3 = { Doctor = 1230, Handyman = 3924, }, in_use = { Doctor = 1234, Handyman = 3928, }, finish_use = { Doctor = 1248, Handyman = 3940, }, }, south = { -- duplicate of north begin_use = { Doctor = 1244, Handyman = 3936, }, begin_use_2 = { Doctor = 1238, Handyman = 3932, }, begin_use_3 = { Doctor = 1230, Handyman = 3924, }, in_use = { Doctor = 1234, Handyman = 3928, }, finish_use = { Doctor = 1248, Handyman = 3940, }, }, } object.orientations = { north = { footprint = { {-1, -2, only_passable = true}, {0, -2, need_north_side = true},{1, -2, only_passable = true}, {-1, -1, only_passable = true}, {0, -1}, {1, -1, only_passable = true}, {-1, 0, only_passable = true}, {0, 0, only_passable = true, complete_cell = true}, {1, 0, only_passable = true} }, render_attach_position = {-1, 0}, use_position = {0, 0}, }, east = { footprint = {{-2, -1, only_passable = true}, {-1, -1, only_passable = true}, {0, -1, only_passable = true}, {-2, 0, complete_cell = true}, {-1, 0}, {0, 0, only_passable = true, complete_cell = true}, {-2, 1, only_passable = true}, {-1, 1, only_passable = true}, {0, 1, only_passable = true} }, render_attach_position = {0, -1}, use_position = {0, 0}, }, } return object CorsixTH-0.63/CorsixTH/Lua/objects/projector.lua000066400000000000000000000047551347163623700215630ustar00rootroot00000000000000--[[ Copyright (c) 2010 Justin Pasher 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. --]] local object = {} object.id = "projector" object.thob = 37 object.name = _S.object.projector object.tooltip = _S.tooltip.objects.projector object.ticks = false object.build_preview_animation = 5086 object.show_in_town_map = true local function copy_north_to_south(t) t.south = t.north return t end object.idle_animations = { north = 2586, south = 2586, } object.usage_animations = copy_north_to_south { north = { begin_use = { Doctor = 2594 }, begin_use_2 = { Doctor = 2590 }, -- 2802 is probably better, but it's anchored differently begin_use_3 = { Doctor = 2598 }, in_use = { Doctor = 2602 }, finish_use = { Doctor = 2606 }, finish_use_2 = { Doctor = 2610 }, finish_use_3 = { Doctor = 2684 }, }, } local anim_mgr = TheApp.animation_manager local kf1, kf2 = {0, 0}, {-0.4, 0.5} anim_mgr:setMarker(object.usage_animations.north.begin_use_2, kf2) anim_mgr:setMarker(object.usage_animations.north.begin_use_3, kf2) anim_mgr:setMarker(object.usage_animations.north.in_use, kf2) anim_mgr:setMarker(object.usage_animations.north.finish_use, kf2) anim_mgr:setMarker(object.usage_animations.north.finish_use_2, 0, kf2, 11, kf2, 16, kf1) object.orientations = { north = { footprint = { {0, 0, only_passable = true}, {0, 1}, {-1, 0}, {-1, 1} }, use_position = "passable" }, east = { footprint = { {0, 0, only_passable = true}, {0, -1}, {1, 0}, {1, -1} }, use_position = "passable" }, } return object CorsixTH-0.63/CorsixTH/Lua/objects/radiation_shield.lua000066400000000000000000000050141347163623700230430ustar00rootroot00000000000000--[[ Copyright (c) 2010 Wendell Misiedjan Edited by: Wendell Misiedjan Based on: Manuel König files. 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. --]] local object = {} object.id = "radiation_shield" object.slave_id = "radiation_shield_b" object.class = "RadiationShield" object.thob = 28 object.name = _S.object.radiation_shield object.tooltip = _S.tooltip.objects.radiation_shield object.ticks = true object.build_preview_animation = 922 object.show_in_town_map = true local function copy_north_to_south(t) t.south = t.north return t end object.idle_animations = copy_north_to_south { north = 794, } object.usage_animations = copy_north_to_south { north = { begin_use = {Doctor = 798}, -- Doctor sits down begin_use_2 = {Doctor = 806}, -- Pulls the handle in_use = {Doctor = { 810, -- Sits idle 814, -- Pushing buttons }}, finish_use = {Doctor = 802}, -- Doctor stands up }, } object.orientations = { north = { render_attach_position = {0, -1}, footprint = { {-2, -1}, {-1, -1}, {0, -1}, {-2, 0}, {-1, 0}, {0, 0, only_passable = true}, {-2, 1}, {-1, 1}, {0, 1}}, use_position = {0, 0} }, east = { render_attach_position = {0, -1}, footprint = { {-1, -2}, {0, -2},{1, -2}, {-1, -1}, {0, -1},{1, -1}, {-1, 0}, {0, 0, only_passable = true},{1, 0} }, use_position = {0, 0} }, } class "RadiationShield" (Object) ---@type RadiationShield local RadiationShield = _G["RadiationShield"] RadiationShield:slaveMixinClass() return object CorsixTH-0.63/CorsixTH/Lua/objects/radiation_shield_b.lua000066400000000000000000000033001347163623700233400ustar00rootroot00000000000000--[[ Copyright (c) 2010 Wendell Misiedjan Edited with some help of Corsix. 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. --]] local object = {} object.id = "radiation_shield_b" object.class = "RadiationShield" object.thob = 28 object.name = _S.object.radiation_shield object.tooltip = _S.tooltip.objects.radiation_shield object.show_in_town_map = true object.ticks = false local function copy_east_to_west(t) t.west = t.east return t end object.idle_animations = copy_east_to_west { east = 1968, } object.orientations = { north = { render_attach_position = {0, 2}, use_position = {0, 0}, footprint = {}, }, east = { render_attach_position = {1, 1}, use_position = {0, 0}, footprint = {}, }, } return object CorsixTH-0.63/CorsixTH/Lua/objects/radiator.lua000066400000000000000000000032061347163623700213470ustar00rootroot00000000000000--[[ Copyright (c) 2009 Peter "Corsix" Cawley 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. --]] local object = {} object.id = "radiator" object.thob = 44 object.name = _S.object.radiator object.tooltip = _S.tooltip.objects.radiator object.ticks = false object.class = "SideObject" object.corridor_object = 5 object.build_preview_animation = 914 object.idle_animations = { north = 750, east = 752, } object.orientations = { north = { footprint = { {0, 0, only_side = true} } }, east = { footprint = { {0, 0, only_side = true} } }, south = { footprint = { {0, 0, only_side = true} } }, west = { footprint = { {0, 0, only_side = true} } }, } return object CorsixTH-0.63/CorsixTH/Lua/objects/rathole.lua000066400000000000000000000041061347163623700212000ustar00rootroot00000000000000--[[ Copyright (c) 2016 Albert "Alberth" Hofkamp 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. --]] local object = {} object.id = "rathole" object.thob = 64 object.name = _S.object.rathole object.class = "Rathole" object.tooltip = _S.tooltip.objects.rathole object.ticks = false object.idle_animations = { north = 1904, } object.orientations = { -- Empty footprint, so you can build any other object on top of it. north = { footprint = {} }, south = { footprint = {} }, west = { footprint = {} }, east = { footprint = {} }, } -- For ratholes: -- 1904: hole in north wall -- 1908: rat moving north -- 1910: rat moving north-east -- 1912: rat moving east -- 1914: rat moving south-east -- 1916: rat moving south -- 1918: rat moving south-west -- 1920: rat moving west -- 1922: rat moving north-west -- 1924: rat entering hole north wall -- 1926: rat entering hole west wall -- 1928: rat leaving hole north wall class "Rathole" (Object) ---@type Rathole local Rathole = _G["Rathole"] function Rathole:Rathole(world, oject_type, x, y, direction, etc) self:Object(world, oject_type, x, y, direction, etc) end return object CorsixTH-0.63/CorsixTH/Lua/objects/reception_desk.lua000066400000000000000000000201531347163623700225400ustar00rootroot00000000000000--[[ Copyright (c) 2009 Peter "Corsix" Cawley 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. --]] local object = {} object.id = "reception_desk" object.thob = 11 object.class = "ReceptionDesk" object.name = _S.object.reception_desk object.tooltip = _S.tooltip.objects.reception_desk object.ticks = true object.corridor_object = 1 object.build_preview_animation = 5060 object.idle_animations = { north = 2062, east = 2064, } object.orientations = { north = { footprint = { {0, 0}, {0, -1, only_passable = true}, {0, 1, only_passable = true}, {1, 0, need_north_side = true, need_south_side = true}, {-1, 0, need_north_side = true, need_south_side = true} }, use_position = {0, -1}, use_position_secondary = {0, 1}, }, east = { footprint = { {0, 0}, {0, -1, need_west_side = true, need_east_side = true}, {0, 1, need_west_side = true, need_east_side = true}, {1, 0, only_passable = true}, {-1, 0, only_passable = true} }, use_position = {1, 0}, use_position_secondary = {-1, 0}, }, south = { footprint = { {0, 0}, {0, -1, only_passable = true}, {0, 1, only_passable = true}, {1, 0, need_north_side = true, need_south_side = true}, {-1, 0, need_north_side = true, need_south_side = true} }, use_position = {0, 1}, use_position_secondary = {0, -1}, }, west = { footprint = { {0, 0}, {0, -1, need_west_side = true, need_east_side = true}, {0, 1, need_west_side = true, need_east_side = true}, {1, 0, only_passable = true}, {-1, 0, only_passable = true} }, use_position = {-1, 0}, use_position_secondary = {1, 0}, }, } corsixth.require("queue") class "ReceptionDesk" (Object) ---@type ReceptionDesk local ReceptionDesk = _G["ReceptionDesk"] function ReceptionDesk:ReceptionDesk(...) self:Object(...) self.queue = Queue() self.queue:setBenchThreshold(3) -- Keep 3 people standing in the queue even if there are benches self.queue:setMaxQueue(20) -- larger queues for reception desk self.hover_cursor = TheApp.gfx:loadMainCursor("queue") self.queue_advance_timer = 0 end function ReceptionDesk:onClick(ui, button) if button == "left" then local queue_window = UIQueue(ui, self.queue) ui:addWindow(queue_window) else return Object.onClick(self, ui, button) end end function ReceptionDesk:tick() local queue_front = self.queue:front() local reset_timer = true if self.receptionist and queue_front then if queue_front:getCurrentAction().name == "idle" then self.queue_advance_timer = self.queue_advance_timer + 1 reset_timer = false if self.queue_advance_timer >= 4 + Date.hoursPerDay() * (1.0 - self.receptionist.profile.skill) then reset_timer = true if queue_front.next_room_to_visit then queue_front:queueAction(SeekRoomAction(queue_front.next_room_to_visit.room_info.id)) else if class.is(queue_front, Inspector) then local inspector = queue_front if not inspector.going_home then local epidemic = self.world:getLocalPlayerHospital().epidemic if epidemic then -- The result of the epidemic may already by determined -- i.e if an infected patient has left the hospital if not epidemic.result_determined then epidemic:finishCoverUp() end epidemic:applyOutcome() inspector:goHome() end end -- VIP has his own list, don't add the gp office twice elseif queue_front.humanoid_class ~= "VIP" then if queue_front:agreesToPay("diag_gp") then queue_front:queueAction(SeekRoomAction("gp")) else queue_front:goHome("over_priced", "diag_gp") end else -- the VIP will realise that he is idle, and start going round rooms queue_front:queueAction(IdleAction()) queue_front.waiting = 1 end end self.queue:pop() self.queue.visitor_count = self.queue.visitor_count + 1 queue_front.has_passed_reception = true end end end if reset_timer then self.queue_advance_timer = 0 end return Object.tick(self) end --! Reception desk looks for a receptionist. --!return (boolean) Desk has a receptionist attached to it (may still be on her way to the desk). function ReceptionDesk:checkForNearbyStaff() if self.receptionist or self.reserved_for then -- Already got staff, or a staff member is on the way return true end local nearest_staff, nearest_d local world = self.world local use_x, use_y = self:getSecondaryUsageTile() for _, entity in ipairs(self.world.entities) do if entity.humanoid_class == "Receptionist" and not entity.associated_desk and not entity.fired then local distance = world.pathfinder:findDistance(entity.tile_x, entity.tile_y, use_x, use_y) if not nearest_d or distance < nearest_d then nearest_staff = entity nearest_d = distance end end end if not nearest_staff then return false end self:occupy(nearest_staff) return true end -- how many tiles further are we willing to walk for 1 person fewer in the queue local tile_factor = 10 function ReceptionDesk:getUsageScore() local score = self.queue:patientSize() * tile_factor -- Add constant penalty if queue is full if self.queue:isFull() then score = score + 1000 end return score end function ReceptionDesk:setTile(x, y) Object.setTile(self, x, y) if x and y then self:checkForNearbyStaff() end return self end function ReceptionDesk:onDestroy() self.being_destroyed = true -- temporary flag for receptionist (re-)routing logic local receptionist = self.receptionist or self.reserved_for if receptionist then receptionist:handleRemovedObject(self) self.receptionist = nil self.reserved_for = nil -- Find a new reception desk for the receptionist local world = receptionist.world world:findObjectNear(receptionist, "reception_desk", nil, function(x, y) local obj = world:getObject(x, y, "reception_desk") -- Make sure we are not selecting the same desk again if obj and obj ~= self then return obj:occupy(receptionist) end end) end self.queue:rerouteAllPatients(SeekReceptionAction()) self.being_destroyed = nil return Object.onDestroy(self) end --[[ Create orders for the specified receptionist to walk to and then staff the reception desk, if not already staffed or someone is on the way !param receptionist (Staff) the receptionist to occupy this desk !return true iff the receptionist was ordered to the desk ]] function ReceptionDesk:occupy(receptionist) if not self.receptionist and not self.reserved_for then self.reserved_for = receptionist receptionist.associated_desk = self local use_x, use_y = self:getSecondaryUsageTile() receptionist:setNextAction(WalkAction(use_x, use_y):setMustHappen(true)) receptionist:queueAction(StaffReceptionAction(self)) return true end end return object CorsixTH-0.63/CorsixTH/Lua/objects/screen.lua000066400000000000000000000030111347163623700210130ustar00rootroot00000000000000--[[ Copyright (c) 2009 Peter "Corsix" Cawley 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. --]] local object = {} object.id = "screen" object.thob = 16 object.name = _S.object.screen object.tooltip = _S.tooltip.objects.screen object.ticks = false object.build_preview_animation = 926 object.show_in_town_map = true object.idle_animations = { north = 1022, } object.orientations = { north = { footprint = { {-1, -1, only_passable = true}, {-1, 0}, {0, -1}, {0, 0} }, render_attach_position = {-1, 0}, use_position = "passable", }, } return object CorsixTH-0.63/CorsixTH/Lua/objects/sink.lua000066400000000000000000000045411347163623700205110ustar00rootroot00000000000000--[[ Copyright (c) 2009 Peter "Corsix" Cawley 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. --]] local object = {} object.id = "sink" object.thob = 32 object.name = _S.object.toilet_sink object.tooltip = _S.tooltip.objects.toilet_sink object.ticks = false object.build_preview_animation = 5082 local function copy_north_to_south(t) t.south = t.north return t end object.idle_animations = copy_north_to_south { north = 1748, } object.usage_animations = copy_north_to_south { north = { begin_use = { ["Standard Male Patient"] = 1776, ["Standard Female Patient"] = 3160, }, in_use = { ["Standard Male Patient"] = 1780, ["Standard Female Patient"] = 3164, }, finish_use = { ["Standard Male Patient"] = 1784, ["Standard Female Patient"] = 3168, }, }, } local anim_mgr = TheApp.animation_manager local kf1, kf2 = {0, 0}, {0, -0.7} anim_mgr:setMarker({1776, 3160}, 0, kf1, 4, kf2) anim_mgr:setMarker({1780, 3164}, kf2) anim_mgr:setMarker({1784, 3168}, 0, kf2, 34, kf2, 39, kf1) object.orientations = { north = { footprint = { {0, 0, complete_cell = true}, {0, 1, only_passable = true} }, use_position = "passable", use_animate_from_use_position = true, }, east = { footprint = { {0, 0, complete_cell = true}, {1, 0, only_passable = true} }, use_position = "passable", use_animate_from_use_position = true, }, } return object CorsixTH-0.63/CorsixTH/Lua/objects/skeleton.lua000066400000000000000000000035711347163623700213730ustar00rootroot00000000000000--[[ Copyright (c) 2009 Peter "Corsix" Cawley 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. --]] local object = {} object.id = "skeleton" object.thob = 60 object.name = _S.object.skeleton object.tooltip = _S.tooltip.objects.skeleton object.ticks = false object.build_preview_animation = 5108 object.show_in_town_map = true local function copy_north_to_south(t) t.south = t.north return t end object.idle_animations = { north = 2402, south = 2402, } object.usage_animations = copy_north_to_south { north = { in_use = { Doctor = 2614 }, }, } object.orientations = { north = { footprint = { {0, 0, complete_cell = true}, {1, 0, only_passable = true} }, use_position = "passable", use_animate_from_use_position = true }, east = { footprint = { {0, 0, complete_cell = true}, {0, 1, only_passable = true} }, use_position = "passable", use_animate_from_use_position = true }, } return object CorsixTH-0.63/CorsixTH/Lua/objects/sofa.lua000066400000000000000000000073661347163623700205050ustar00rootroot00000000000000--[[ Copyright (c) 2009 Peter "Corsix" Cawley 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. --]] local object = {} object.id = "sofa" object.thob = 19 object.name = _S.object.sofa object.tooltip = _S.tooltip.objects.sofa object.ticks = false object.build_preview_animation = 5066 object.show_in_town_map = true object.idle_animations = { north = 2122, east = 2124, } object.usage_animations = { north = { begin_use = { Doctor = 2178, Nurse = 3878, Handyman = 3570, }, begin_use_2 = { Doctor = 2186, Nurse = 3886, Handyman = 3578, }, in_use = { Doctor = 2208, Nurse = 4780, -- also 4786, duplicate? Handyman = 4772, }, finish_use = { Doctor = 2194, Nurse = 3894, Handyman = 3586, }, }, east = { begin_use = { Doctor = 2180, Nurse = 3880, Handyman = 3572, }, begin_use_2 = { Doctor = 2188, Nurse = 3888, Handyman = 3580, }, in_use = { Doctor = 2210, Nurse = 4782, -- also 4784, duplicate? Handyman = 4774, -- also 4776, duplicate? }, finish_use = { Doctor = 2196, Nurse = 3896, Handyman = 3588, }, }, } local anim_mgr = TheApp.animation_manager local kf1, kf2 = {-1, -1}, {-1, -0.6} anim_mgr:setMarker(object.usage_animations.north.begin_use, 0, kf1, 2, kf2) kf1 = {-0.6, 0.3} anim_mgr:setMarker(object.usage_animations.north.begin_use_2, 0, kf2, 2, kf1) anim_mgr:setMarker(object.usage_animations.north.in_use, kf1) kf2 = {-1, -0.6} local kf3 = {-1, -1} anim_mgr:setMarker(object.usage_animations.north.finish_use, 0, kf1, 2, kf2, 5, kf3) kf1, kf2 = {1, -1}, {0.6, -1} anim_mgr:setMarker(object.usage_animations.east.begin_use, 0, kf1, 2, kf2) kf1 = {0.3, -0.6} anim_mgr:setMarker(object.usage_animations.east.begin_use_2, 0, kf2, 3, kf1) anim_mgr:setMarker(object.usage_animations.east.in_use, kf1) kf2 = {0.6, -1} kf3 = {1, -1} anim_mgr:setMarker(object.usage_animations.east.finish_use, 0, kf1, 1, kf1, 3, kf2, 5, kf3) object.orientations = { north = { footprint = { {-1, 0, complete_cell = true}, {0, 0, complete_cell = true}, {-1, -1, only_passable = true} }, render_attach_position = {-1, 0}, use_position = "passable", }, east = { footprint = { {0, -1, complete_cell = true}, {0, 0, complete_cell = true}, {1, -1, only_passable = true} }, use_position = "passable", }, south = { render_attach_position = { {0, 0}, {-1, 1} }, footprint = { {-1, 0, complete_cell = true}, {0, 0, complete_cell = true}, {-1, 1, only_passable = true} }, use_position = "passable", }, west = { footprint = { {0, -1, complete_cell = true}, {0, 0, complete_cell = true}, {-1, -1, only_passable = true} }, use_position = "passable", }, } return object CorsixTH-0.63/CorsixTH/Lua/objects/surgeon_screen.lua000066400000000000000000000034361347163623700225700ustar00rootroot00000000000000--[[ Copyright (c) 2009 Peter "Corsix" Cawley 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. --]] local object = {} object.id = "surgeon_screen" object.class = "SurgeonScreen" object.thob = 35 object.name = _S.object.surgeon_screen object.tooltip = _S.tooltip.objects.surgeon_screen object.ticks = false object.build_preview_animation = 926 object.show_in_town_map = true object.idle_animations = { north = 2772, } object.orientations = { north = { footprint = { {-1, -1, only_passable = true}, {-1, 0}, {0, -1}, {0, 0} }, render_attach_position = {-1, 0}, use_position = "passable", }, } class "SurgeonScreen" (Object) ---@type SurgeonScreen local SurgeonScreen = _G["SurgeonScreen"] function SurgeonScreen:SurgeonScreen(...) self:Object(...) self.num_green_outfits = 2 self.num_white_outfits = 0 end return object CorsixTH-0.63/CorsixTH/Lua/objects/tv.lua000066400000000000000000000033101347163623700201670ustar00rootroot00000000000000--[[ Copyright (c) 2009 Peter "Corsix" Cawley 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. --]] local object = {} object.id = "tv" object.thob = 21 object.name = _S.object.tv object.tooltip = _S.tooltip.objects.tv object.ticks = false object.build_preview_animation = 5052 object.idle_animations = { north = 396, east = 398, } object.orientations = { north = { footprint = { {0, 0, complete_cell = true}, {0, -1, only_passable = true} } }, east = { footprint = { {0, 0, complete_cell = true}, {1, 0, only_passable = true} } }, south = { footprint = { {0, 0, complete_cell = true}, {0, 1, only_passable = true} } }, west = { footprint = { {0, 0, complete_cell = true}, {-1, 0, only_passable = true} } }, } return object CorsixTH-0.63/CorsixTH/Lua/objects/video_game.lua000066400000000000000000000042411347163623700216410ustar00rootroot00000000000000--[[ Copyright (c) 2009 Peter "Corsix" Cawley 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. --]] local object = {} object.id = "video_game" object.thob = 57 object.name = _S.object.video_game object.tooltip = _S.tooltip.objects.video_game object.ticks = false object.build_preview_animation = 5106 object.idle_animations = { north = 3696, south = 3696, } -- There are only animations for the doctor and the nurse. -- It seems the handyman doesn't play video games. -- -- For the Doctor, there's an additional animation standing still. -- Don't know how to use that one... object.usage_animations = { north = { in_use = { Doctor = 3700, -- also 3692, standing still in front of the game Nurse = 4764, }, }, south = { -- duplicate of north in_use = { Doctor = 3700, Nurse = 4764, }, }, } object.orientations = { north = { footprint = { {0, 0, complete_cell = true}, {0, 1, only_passable = true} }, use_position = "passable", use_animate_from_use_position = true, }, east = { footprint = { {0, 0, complete_cell = true}, {1, 0, only_passable = true} }, use_position = "passable", use_animate_from_use_position = true, }, } return object CorsixTH-0.63/CorsixTH/Lua/objects/x_ray_viewer.lua000066400000000000000000000034411347163623700222460ustar00rootroot00000000000000--[[ Copyright (c) 2010 Peter "Corsix" Cawley 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. --]] local object = {} object.id = "x_ray_viewer" object.thob = 29 object.name = _S.object.x_ray_viewer object.tooltip = _S.tooltip.objects.x_ray_viewer object.ticks = false object.build_preview_animation = 5078 object.show_in_town_map = true object.locked_to_wall = { -- permittable wall -> orientation north = "east", west = "north", } local function copy_north_to_south(t) t.south = t.north return t end object.idle_animations = copy_north_to_south { north = 2390, } object.orientations = { north = { footprint = { {0, 0, need_west_side = true }, }, list_bottom = true, }, east = { footprint = { {0, 0, need_north_side = true}, }, list_bottom = true, early_list = true, }, } return object CorsixTH-0.63/CorsixTH/Lua/persistance.lua000066400000000000000000000213751347163623700204400ustar00rootroot00000000000000--[[ Copyright (c) 2010 Peter "Corsix" Cawley 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. --]] local persist = require("persist") local saved_permanents = {} strict_declare_global "permanent" strict_declare_global "unpermanent" local th_getfenv local th_getupvalue if _G._VERSION == "Lua 5.2" or _G._VERSION == "Lua 5.3" then th_getfenv = function(f) local _, val = nil, nil if type(f) == "function" then _, val = debug.getupvalue(f, 1) elseif type(f) == "userdata" then val = debug.getuservalue(f) else print('Unhandled argument to th_getfenv') end return val end th_getupvalue = function(f, n) return debug.getupvalue(f, n + 1) end else th_getfenv = debug.getfenv th_getupvalue = debug.getupvalue end function permanent(name, ...) if select('#', ...) == 0 then return function (...) return permanent(name, ...) end end local value = ... assert(value ~= nil) assert(saved_permanents[name] == nil) saved_permanents[name] = value return value end function unpermanent(name) assert(saved_permanents[name] ~= nil) saved_permanents[name] = nil end local --[[persistable:persistance_global_fetch]] function global_fetch(...) local val = _G for _, k in ipairs({...}) do val = val[k] end return val end local function MakePermanentObjectsTable(inverted) local return_val = setmetatable({}, {}) local permanent = return_val if inverted then getmetatable(permanent).__newindex = function(t, k, v) rawset(t, v, k) end end -- Global functions for k, v in pairs(_G) do if type(v) == "function" then permanent[v] = k end end -- Lua class methods for name, class in pairs(_G) do repeat if type(class) ~= "table" then break -- continue end local class_mt = getmetatable(class) if not class_mt or class_mt.__class_name ~= name then break -- continue end permanent[class] = name .. ".1" permanent[class_mt] = name .. ".2" for k, v in pairs(class) do if type(v) == "function" then permanent[v] = name .. "." .. k end end for k, v in pairs(class._metatable) do if type(v) == "function" then permanent[v] = name .. "._metatable." .. k end end until true end -- C/class/library methods for name, lib in pairs(package.loaded) do if not name:find(".", 1, true) then permanent[lib] = name end if type(lib) == "table" then for k, v in pairs(lib) do local type_of_lib = type(v) if type_of_lib == "function" or type_of_lib == "table" or type_of_lib == "userdata" then permanent[v] = name .. "." .. k if name == "TH" and type_of_lib == "table" then -- C class metatables local callenv = th_getfenv(getmetatable(v).__call) permanent[callenv] = name .. "." .. k .. "." end end end else print("Warning: Expected table but got " .. type(lib) .. ". A library probably failed to load.") end end -- Bits of the app permanent[TheApp] = "TheApp" for _, key in ipairs({"config", "modes", "video", "strings", "audio", "gfx", "fs"}) do permanent[TheApp[key]] = inverted and "TheApp." .. key or {global_fetch, "TheApp", key} end for _, collection in ipairs({"walls", "objects", "rooms", "humanoid_actions", "diseases"}) do for k, v in pairs(TheApp[collection]) do if type(k) == "string" then permanent[v] = inverted and "TheApp." .. collection .. "." .. k or {global_fetch, "TheApp", collection, k} end end end -- If loading a game from the main menu, there will be no menu bar, so make one local menu_bar = TheApp.ui and TheApp.ui.menu_bar if not menu_bar then -- The menu bar wants a UI, but it is happy with just something naming an App menu_bar = UIMenuBar({app = TheApp}) end permanent[menu_bar] = "TheApp.ui.menu_bar" -- Graphics bits are persisted as instructions to reload them or re-use if already loaded if inverted then -- as the object was persisted as a table, we need to add some magic to -- the __index metamethod to interpret this table as a function call getmetatable(return_val).__index = function(_, k) if type(k) == "table" then return k[1](unpack(k, 2)) end end else -- load_info is a table containing a method and parameters to load obj for obj, load_info in pairs(TheApp.gfx.load_info) do permanent[obj] = load_info end end -- Things requested to be permanent by other bits of code for name, value in pairs(saved_permanents) do permanent[value] = name end return return_val end local function NameOf(obj) -- Debug aid local explored = {[_G] = true} local to_explore = {[_G] = "_G"} while true do local exploring, name = next(to_explore) if exploring == nil then break end to_explore[exploring] = nil if exploring == obj then return name end if type(exploring) == "table" then for key, val in pairs(exploring) do if not explored[val] then to_explore[val] = name .. "." ..tostring(key) explored[val] = true end end elseif type(exploring) == "function" then local i = 0 while true do i = i + 1 local dbg_name, val = debug.getupvalue(exploring, i) if not dbg_name then break end if val ~= nil and not explored[val] then to_explore[val] = name .. "." explored[val] = true end end end local mt = debug.getmetatable(exploring) if mt and not explored[mt] then to_explore[mt] = name .. "." explored[mt] = true end mt = th_getfenv(exploring) if mt and not explored[mt] then to_explore[mt] = name .. "." explored[mt] = true end end return "" end strict_declare_global "SaveGame" strict_declare_global "SaveGameFile" strict_declare_global "LoadGame" strict_declare_global "LoadGameFile" function SaveGame() local state = { ui = TheApp.ui, world = TheApp.world, map = TheApp.map, random = math.randomdump(), } state.map:prepareForSave() --local status, res = xpcall(function() local result, err, obj = persist.dump(state, MakePermanentObjectsTable(false)) state.map:afterSave() if not result then print(obj, NameOf(obj)) -- for debugging error(err) else return result end --end, persist.errcatch) end --! Save a game to disk. --!param filename (string) Path of the file to write. function SaveGameFile(filename) local data = SaveGame() local f = assert(io.open(filename, "wb")) f:write(data) f:close() end function LoadGame(data) --local status, res = xpcall(function() local objtable = MakePermanentObjectsTable(true) local state = assert(persist.load(data, objtable)) state.ui:resync(TheApp.ui) TheApp.ui = state.ui TheApp.world = state.world TheApp.map = state.map math.randomseed(state.random) local cursor = TheApp.ui.cursor TheApp.ui.cursor = nil TheApp.ui:setCursor(cursor) -- The menu bar is a permanent object, so its ui field needs updating to -- the depersisted ui value. TheApp.ui.menu_bar.ui = TheApp.ui TheApp.ui.menu_bar:onChangeLanguage() --end, persist.errcatch) TheApp.world.map:registerTemperatureDisplayMethod() -- TODO: sound effects on/off are saved too, but should be a global value? TheApp.audio:playSoundEffects(TheApp.config.play_sounds) TheApp:afterLoad() TheApp.world:resetAnimations() TheApp.ui:onChangeResolution() -- Possibly add the blueish tone if the game is currently paused. if not TheApp.world.user_actions_allowed then TheApp.video:setBlueFilterActive(true) end end function LoadGameFile(filename) local f = assert(io.open(filename, "rb")) local data = f:read("*a") f:close() LoadGame(data) end CorsixTH-0.63/CorsixTH/Lua/queue.lua000066400000000000000000000254431347163623700172440ustar00rootroot00000000000000--[[ Copyright (c) 2009 Peter "Corsix" Cawley 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. --]] --! Manages a list of `Humanoid`s which are waiting to use an `Object`. --! A queue stores a list of humanoids waiting to use an object. -- For a reception desk, this is as expected. -- For a room, the queue is for the door, not the room. Hence the queue stores -- the list of patients waiting to enter (the traditional queue for the room), -- the list of staff waiting to enter (because of the door being in use for -- example), the list of staff and patients waiting to leave (again due to door -- being in use). -- Queues are currently implemented as normal Lua arrays, but you should access -- a queue via its methods rather than directly. class "Queue" ---@type Queue local Queue = _G["Queue"] --! Constructor of a queue. function Queue:Queue() self.reported_size = 0 -- Number of real patients self.expected = {} -- Expected patients self.callbacks = {} self.expected_count = 0 -- Number of expected patients self.visitor_count = 0 self.max_size = 6 -- Maximum queue length (default value) self.bench_threshold = 0 end --! A humanoid is expected in a queue. --!param humanoid New patient that is expected. function Queue:expect(humanoid) if not self.expected[humanoid] and not class.is(humanoid, Vip) then self.expected[humanoid] = true self.expected_count = self.expected_count + 1 end end --! A humanoid is canceled as expected in a queue. --!param humanoid Patient that is not coming to this queue. function Queue:unexpect(humanoid) if self.expected[humanoid] then self.expected[humanoid] = nil self.expected_count = self.expected_count - 1 end end --! Lower the max queue length. --!param amount (int) Decrement length value of the queue. function Queue:decreaseMaxSize(amount) self.max_size = math.max(0, self.max_size - amount) end --! Increase max queue length. --!param amount (int) Increment length value of the queue. function Queue:increaseMaxSize(amount) self.max_size = math.min(30, self.max_size + amount) end function Queue:setBenchThreshold(standing_count) self.bench_threshold = standing_count end --! Set max queue length. --!param queue_count (int) New max queue length to set. function Queue:setMaxQueue(queue_count) self.max_size = queue_count end --! Total size of the queue, which are various people wanting in or out of the room. --! For a true patient queue count, use Queue:reportedSize. --!return (int) Number of various people in the queue. function Queue:size() -- Rememeber, the size includes people waiting to leave and staff waiting to enter -- For just the patients waiting to enter, use Queue:reportedSize() -- Most of the time, size() == reportedSize(), so it won't be immediately obvious -- if you're using the wrong method, but from time to time, staff or exiting -- patients will be in the queue, at which point the sizes will differ. return #self end --! Retrieve whether the queue is full. --!return (boolean) Whether the queue is full. function Queue:isFull() return #self >= self.max_size end --! Get the number of real patients in the queue. --!return (int) Number of real patients in the queue. function Queue:reportedSize() return self.reported_size end --! Get the number of expected patients. --!return (int) Number of expected patients (in the near future). function Queue:expectedSize() return self.expected_count end --! Check if the queue has an emergency patient. --!return (boolean) Whether an emergency patient was found in the queue. function Queue:hasEmergencyPatient() for _, humanoid in ipairs(self) do if humanoid.is_emergency then return true end end return false end --! Retrieve the total number of queued and expected patients. --return (int) Number of patients. function Queue:patientSize() return self.reported_size + self.expected_count end --! Get the 'index' real patient. --!param index (int) Index of the patient to retrieve (runs up to Queue:reportedSize). --!return Patient at the queried point in the queue. function Queue:reportedHumanoid(index) return self[#self - self.reported_size + index] end function Queue:setPriorityForSameRoom(entity) self.same_room_priority = entity end function Queue:push(humanoid, callbacks_on) local index = #self + 1 local increment_reported_size = true if self.same_room_priority then -- If humanoid in the priority room, then position them in the queue before -- humanoids not in the room (because if they are in the room and in the -- queue, then they are trying to leave the room). local room = self.same_room_priority:getRoom() if humanoid:getRoom() == room then while index > 1 do local before = self[index - 1] if before:getRoom() == room then break end index = index - 1 end increment_reported_size = false end end if class.is(humanoid, Staff) then -- Give staff priority over patients while index > 1 do local before = self[index - 1] if class.is(before, Staff) then break end index = index - 1 end increment_reported_size = false end -- Emergencies and any VIP's get put before all the other patients, but AFTER currently queued emergencies. if humanoid.is_emergency or class.is(humanoid, Vip) or class.is(humanoid, Inspector) then while index > 1 do local before = self[index - 1] if before.is_emergency then break end index = index - 1 end end if increment_reported_size then self.reported_size = self.reported_size + 1 end self.callbacks[humanoid] = callbacks_on table.insert(self, index, humanoid) for i = index + 1, #self do local queued_humanoid = self[i] local callbacks = self.callbacks[queued_humanoid] if callbacks then callbacks:onChangeQueuePosition(queued_humanoid) end end end --! Get the first person in the queue (queue is not changed). --! Note that first person may not be a patient, use Queue:reportedHumanoid to get patients --!return First person in the queue. function Queue:front() return self[1] end --! Get the last person in the queue (queue is not changed). --!return Last person in the queue. function Queue:back() return self[#self] end --! Pop first person from the queue. --! Note that first person may not be a patient, use Queue:reportedHumanoid to get patients --!return First person in the queue. function Queue:pop() if self.reported_size == #self then self.reported_size = self.reported_size - 1 end local oldfront = self[1] table.remove(self, 1) oldfront:setMood("queue", "deactivate") local callbacks = self.callbacks[oldfront] if callbacks then callbacks:onLeaveQueue(oldfront) end self.callbacks[oldfront] = nil for _, humanoid in ipairs(self) do callbacks = self.callbacks[humanoid] if callbacks then callbacks:onChangeQueuePosition(humanoid) end end return oldfront end --! Remove person from the queue by index number. --! Note that the person may not be a patient. --!param index (jnt) Index in the queue of the person to remove. --!return The removed person. function Queue:remove(index) if self[index] == nil then return end local value = self[index] if index > #self - self.reported_size then self.reported_size = self.reported_size - 1 end value:setMood("queue", "deactivate") table.remove(self, index) self.callbacks[value] = nil for i = #self, index, -1 do local humanoid = self[i] if humanoid.onAdvanceQueue then humanoid:onAdvanceQueue(self, i - 1) end end return value end --! Remove a person by value from the queue. --!param value Person to remove. --!return Whether the person could be found (and was removed). function Queue:removeValue(value) for i = 1, #self do if self[i] == value then self:remove(i) return true end end return false end --! Move the person at position 'index' to position 'new_index'. --! Persons between 'index' and 'new_index' move one place to 'index'. --!param index (int) Index number of the person to move. --!param new_index (int) Destination of the person being moved. function Queue:move(index, new_index) if self[index] == nil or self[new_index] == nil or index == new_index then return end local i if new_index < index then i = -1 else i = 1 end while new_index ~= index do local temp = self[index + i] self[index + i] = self[index] self[index] = temp index = index + i end end --! Move an entering patient in the queue at position 'index' to position 'new_index'. --! Persons between 'index' and 'new_index' move one place to 'index'. --! Values are relative to the reported humanoids in the queue --!param index (int) Index number of the person to move. --!param new_index (int) Destination of the person being moved. --!param new_index (string) 'front' or 'back' as relative markers function Queue:movePatient(index, new_index) local first_patient_index = self:size() - self:reportedSize() + 1 if type(new_index) == "string" then if new_index == 'front' then new_index = first_patient_index else new_index = self:size() end else new_index = first_patient_index + new_index end self:move(first_patient_index + index - 1, new_index) end --! Called when reception desk is destroyed, or when a room is destroyed from a crashed machine. function Queue:rerouteAllPatients(action) for _, humanoid in ipairs(self) do -- slight delay so the desk is really destroyed before rerouting humanoid:setNextAction(IdleAction():setCount(1)) -- Don't queue the same action table, but clone it for each patient. local clone = {} for k, v in pairs(action) do clone[k] = v end humanoid:queueAction(clone) end for humanoid in pairs(self.expected) do humanoid:setNextAction(IdleAction():setCount(1)) humanoid:queueAction(action) self:unexpect(humanoid) end end CorsixTH-0.63/CorsixTH/Lua/research_department.lua000066400000000000000000000645351347163623700221440ustar00rootroot00000000000000--[[ Copyright (c) 2011 Edvin "Lego3" Linge 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. --]] --[[ Notes about research speed. Original game times at 20 % in all categories with a medium doctor at level 3: Slicer discovered in about 120 days. (10000 points) Pump improved in about 60 days. (30000 points * 20 % as first improvement) Invisibility improved in about 90 days. (10000 points) Note that the original requires a nurse and a pharmacy before drugs get improved. On the other hand it appears that the research is stored for future use anyway. --]] --! Manages all things related to research for one hospital. class "ResearchDepartment" ---@type ResearchDepartment local ResearchDepartment = _G["ResearchDepartment"] function ResearchDepartment:ResearchDepartment(hospital) self.hospital = hospital self.world = hospital.world -- This list contains a lot of information. -- Progress of object discovery, object improvement, drug improvement -- dito costs and room build costs. self.research_progress = {} self:initResearch() end -- Initialize research for the level. function ResearchDepartment:initResearch() local hospital = self.hospital local cfg_objects = self.world.map.level_config.objects local cure, diagnosis, improve, drug -- Initialize object research for _, object in ipairs(TheApp.objects) do if cfg_objects[object.thob] and cfg_objects[object.thob].AvailableForLevel == 1 and object.research_category then self.research_progress[object] = { points = 0, start_strength = cfg_objects[object.thob].StartStrength, cost = not self.world.free_build_mode and cfg_objects[object.thob].StartCost or 0, discovered = cfg_objects[object.thob].StartAvail == 1, strength_imp = 0, cost_imp = 0, } if cfg_objects[object.thob].StartAvail == 0 then if object.research_category == "cure" then cure = object elseif object.research_category == "diagnosis" then diagnosis = object end end -- TODO: Do we want some kind of specific order here, e.g. -- the same as in the original? if object.default_strength and cfg_objects[object.thob].StartAvail == 1 then improve = object end end end -- Now add drug research for _, disease in pairs(hospital.disease_casebook) do if disease.drug then self.research_progress[disease] = { points = 0, effect_imp = 1, cost_imp = 1, } if disease.discovered then drug = disease end end end -- Add a dummy to specialisation. The difference is that while it still says -- 20 % in that area it doesn't cost anything to the player local drain = {dummy = true} self.research_progress[drain] = {points = 0} self.drain = drain local policy = { cure = {frac = cure and 20 or 0, current = cure}, diagnosis = {frac = diagnosis and 20 or 0, current = diagnosis}, drugs = {frac = 20, points = 0, current = drug and drug or drain}, improvements = {frac = improve and 20 or 0, points = 0, current = improve}, specialisation = {frac = 20, points = 0, current = drain}, } local sum = 0 for _, cat in pairs(policy) do sum = sum + cat.frac end if sum == 20 then -- No research to be done policy.specialisation.frac = 0 policy.global = 0 else -- If some category is already done, put the free points in another one. if sum < 100 then for _, tab in pairs(policy) do if tab.frac > 0 then tab.frac = tab.frac + 100 - sum sum = 100 break end end end policy.global = sum end self.research_policy = policy if not hospital.research_dep_built then hospital.research_dep_built = false end end function ResearchDepartment:checkAutomaticDiscovery(month) for object, progress in pairs(self.research_progress) do -- Only check objects if object.default_strength then local avail_at = self.world.map.level_config.objects[object.thob].WhenAvail if not progress.discovered and avail_at ~= 0 and month >= avail_at then self:discoverObject(object, true) end end end end --! Find a disease (if it exists) on which research can be concentrated and concentrate on it. function ResearchDepartment:setResearchConcentration() local casebook = self.hospital.disease_casebook if self.research_policy.specialisation.current ~= self.drain then return end for _, disease in pairs(casebook) do if disease.discovered and self.hospital:canConcentrateResearch(disease.disease.id) then self:concentrateResearch(disease.disease.id) return end end end --! Function that redistributes research points from a finished category to --! all the other categories. function ResearchDepartment:redistributeResearchPoints() local sum, all_finished = 0, true local policy = {"cure", "diagnosis", "drugs", "improvements", "specialisation"} for _, research_category in ipairs(policy) do sum = sum + self.research_policy[research_category].frac if self.research_policy[research_category].current and self.research_policy[research_category].current ~= self.drain then all_finished = false end end if not all_finished then if sum == 0 then local num_cat = 0 for _, categ in ipairs(policy) do if self.research_policy[categ].current then num_cat = num_cat + 1 end end for _, categ in ipairs(policy) do if self.research_policy[categ].current then self.research_policy[categ].frac = math.floor(self.research_policy.global / num_cat) end end sum = math.floor(self.research_policy.global / num_cat) * num_cat for _, categ in ipairs(policy) do if self.research_policy[categ].current then if sum == self.research_policy.global then break end self.research_policy[categ].frac = self.research_policy[categ].frac + 1 sum = sum + 1 end end else local new_sum, max_value, max_category = 0, 0, "" for _, categ in ipairs(policy) do local research_cat = self.research_policy[categ] if research_cat.frac > max_value then max_value = research_cat.frac max_category = categ end research_cat.frac = math.floor(self.research_policy.global * research_cat.frac / sum) new_sum = new_sum + research_cat.frac end --if there are still some points left redistribute them to the research category with the maximum points if new_sum < self.research_policy.global then local frac = self.research_policy[max_category].frac + self.research_policy.global - new_sum self.research_policy[max_category].frac = frac end end else self.research_policy.global = 0 self.research_policy.specialisation.current = nil end end --[[! Finds out what to research next in the given research area. !param category The research area. One of cure, diagnosis, drugs, improvements and specialisation --]] function ResearchDepartment:nextResearch(category) local current = self.research_policy[category].current -- First make sure that the current research target actually has been discovered. -- Otherwise don't do anything. if not (current.drug or self.research_progress[current].discovered) then return end local hospital = self.hospital self.research_policy[category].current = nil local found_one = false if category == "drugs" then local worst_effect = 100 for _, disease in pairs(hospital.disease_casebook) do if disease.cure_effectiveness < worst_effect then found_one = true if disease.discovered then self.research_policy[category].current = disease worst_effect = disease.cure_effectiveness end end end elseif category == "improvements" then -- Find the object which needs improvements the most. local max_strength = self.world.map.level_config.gbv.MaxObjectStrength local min_strength = max_strength for object, progress in pairs(self.research_progress) do if object.default_strength then -- Don't improve those that already have the max strength if progress.start_strength < max_strength then if progress.discovered and progress.start_strength < min_strength then self.research_policy[category].current = object min_strength = progress.start_strength else found_one = true end end end end else for object, progress in pairs(self.research_progress) do if object.research_category == category and not progress.discovered then self.research_policy[category].current = object end end end if found_one and not self.research_policy[category].current then -- There is a drug or machine which needs improving, but it -- has not been discovered yet. self.research_policy[category].current = self.drain self.research_progress[self.drain] = {points = 0} end if not self.research_policy[category].current then local cat = self.research_policy[category] -- Nothing more to research cat.current = nil cat.frac = 0 self:redistributeResearchPoints() if self.hospital == self.world.ui.hospital then self.world.ui.adviser:say(_A.research.drug_fully_researched :format(_S.research.categories[category])) end -- Notify any research window local window = self.world.ui:getWindow(UIResearch) if window then window:updateCategories() end end end --[[ Returns how many points are required to discover something about the given thing. It may be an object or a drug, being improved or researched. If this thing cannot be processed nil is returned. !param thing The thing to check, either a drug or an object. --]] function ResearchDepartment:getResearchRequired(thing) local required local level_config = self.world.map.level_config local expert = level_config.expertise if thing.thob then -- An object required = level_config.objects[thing.thob].RschReqd if not required then -- It didn't know, so use the fallback instead. if not thing.research_fallback then -- This object is not researchable! print(("Warning: %s has been defined as "):format(thing.id) .. "researchable, but no requirements to fulfil could be found.") else required = expert[thing.research_fallback].RschReqd end end -- Actually want to know how much to improve? local research_info = self.research_progress[thing] if research_info.discovered then local improve_percent = level_config.gbv.RschImproveCostPercent local increment = level_config.gbv.RschImproveIncrementPercent improve_percent = improve_percent + increment * research_info.cost_imp required = required * improve_percent / 100 end elseif thing.drug then -- A drug required = expert[thing.disease.expertise_id].RschReqd end return required end --[[ Add some more research points to research progress. If autopsy_room is specified points are not used. Instead research progresses according to the level config for autopsies. Otherwise they will be divided according to the research policy into the different research areas. !param points (integer) The total amount of points (before applying any level specific divisors to add to research. !param autopsy_room (string) If a specific room should get points following an autopsy, then this is the id of that room. ]] function ResearchDepartment:addResearchPoints(points, autopsy_room) local level_config = self.world.map.level_config ---------------------- An autopsy has been done --------------------------- if autopsy_room then -- Do something only if the room is among those not yet discovered. for room, _ in pairs(self.hospital.undiscovered_rooms) do if room.id == autopsy_room then -- Find an object within this room that needs research points. for object, _ in pairs(room.objects_needed) do local research = self.research_progress[TheApp.objects[object]] if research and not research.discovered then local required = self:getResearchRequired(TheApp.objects[object]) local advance = required * level_config.gbv.AutopsyRschPercent / 100 research.points = research.points + advance -- Maybe we now have enough to discover the object? if research.points > required then self:discoverObject(TheApp.objects[object]) end break end end end end else --------------------------- General research ------------------------------ -- Divide the points into the different areas. If global is not at 100 % -- the total amount is lowered, but then cost is also reduced. -- Fetch the level research divisor. local divisor = level_config.gbv.ResearchPointsDivisor or 5 points = math.ceil(points * self.research_policy.global / (100 * divisor)) -- Divide the points into the different categories and check if -- it is time to discover something local areas = self.research_policy for _, info in pairs(areas) do -- Don't touch the value "global". if type(info) == "table" then -- Some categories may be finished if info.current then -- Add new points to this category's current focus. local research_info = self.research_progress[info.current] local stored = research_info.points -- Add just a little randomness research_info.points = stored + math.n_random(1, 0.2) * points * info.frac / 100 local required = self:getResearchRequired(info.current) if required and required < research_info.points then research_info.points = 0 -- On the specialisation pass any of these categories are eligible. ---------------- Discovering objects ---------------------- if info.current.thob and not research_info.discovered then self:discoverObject(info.current) ----------------- Improving drugs ------------------------- elseif info.current.drug then self:improveDrug(info.current) --------------- Improving machines ------------------------ elseif info.current.thob then self:improveMachine(info.current) end end end end end end end --[[ Called when it is time to improve a drug's strength or cost. !param drug The drug to improve, table taken from world.available_diseases --]] function ResearchDepartment:improveDrug(drug) local research_info = self.research_progress[drug] local disease = self.hospital.disease_casebook[drug.disease.id] -- Improving effectiveness and cost should alternate if research_info.effect_imp > research_info.cost_imp then -- Time to improve cost disease.drug_cost = disease.drug_cost - 10 research_info.cost_imp = research_info.cost_imp + 1 if disease.cure_effectiveness == 100 then -- Did the researchers concentrate on this drug? if self.research_policy.specialisation.current == drug then self.research_policy.specialisation.current = self.drain self:setResearchConcentration() end end if self.research_policy.drugs.current == drug then self:nextResearch("drugs") end else -- Time to improve effectiveness local improve_rate = self.world.map.level_config.gbv.DrugImproveRate disease.cure_effectiveness = math.min(100, disease.cure_effectiveness + improve_rate) research_info.effect_imp = research_info.effect_imp + 1 end if self.hospital == self.world.ui.hospital then if drug.disease.id == "the_squits" then self.world.ui.adviser:say(_A.research.drug_improved_1 :format(drug.disease.name)) else self.world.ui.adviser:say(_A.research.drug_improved :format(drug.disease.name)) end end end --[[ Called when it is time to improve a machine's strength or cost. !param machine The machine to improve, table taken from TheApp.objects --]] function ResearchDepartment:improveMachine(machine) local research_info = self.research_progress[machine] -- Improving strength and cost should alternate if research_info.strength_imp > research_info.cost_imp then -- Time to improve cost -- TODO: This is now 12.5%, based on observations by -- Mark L. Maybe add a new config option for this? local decrease = math.round(research_info.cost*0.125/10)*10 research_info.cost = research_info.cost - decrease -- Now find rooms where this object is used and lower the build_cost for them. for _, room in ipairs(self.world.available_rooms) do for obj, no in pairs(room.objects_needed) do if TheApp.objects[obj] == machine then local progress = self.research_progress[room] progress.build_cost = progress.build_cost - decrease * no -- Each room only defines the same object once, so break -- from the inner loop. break end end end research_info.cost_imp = research_info.cost_imp + 1 local max = self.world.map.level_config.gbv.MaxObjectStrength if research_info.start_strength >= max then if self.research_policy.specialisation.current == machine then self.research_policy.specialisation.current = self.drain self:setResearchConcentration() end end -- No matter what, check if another machine needs improvements more urgently. if self.research_policy.improvements.current == machine then self:nextResearch("improvements") end else -- Time to improve strength local improve_rate = self.world.map.level_config.gbv.ResearchIncrement research_info.start_strength = research_info.start_strength + improve_rate research_info.strength_imp = research_info.strength_imp + 1 end -- Tell the player that something has been improved if self.hospital == self.world.ui.hospital then self.world.ui.adviser:say(_A.research.machine_improved :format(machine.name)) end end --[[ Called when it is time to discoer an object. This may currently only happen from research. !param object The object to discover, a table from TheApp.objects !param automatic If true the discovery was not made by the player's research department. --]] function ResearchDepartment:discoverObject(object, automatic) self.research_progress[object].discovered = true -- Go through all rooms to see if another one can be made available. for room, _ in pairs(self.hospital.undiscovered_rooms) do local discovery = true for needed, _ in pairs(room.objects_needed) do local obj = self.research_progress[TheApp.objects[needed]] if obj and not obj.discovered then discovery = false break end end if discovery then self.hospital.discovered_rooms[room] = true self.hospital.undiscovered_rooms[room] = nil if self.hospital == self.world.ui.hospital then if automatic then self.world.ui.adviser:say(_A.research.new_available:format(object.name)) else self.world.ui.adviser:say(_A.research.new_machine_researched:format(object.name)) end end -- It may now be possible to continue researching machine improvements local current_improvement_research = self.research_policy.improvements.current local max_strength = self.world.map.level_config.gbv.MaxObjectStrength local min_strength = max_strength -- If we're not researching any improvement right now, and the newest discovery was -- a machine that requires an improvement, switch the current policy. if (not current_improvement_research or current_improvement_research.dummy) then for research_object, progress in pairs(self.research_progress) do if research_object.default_strength then -- Don't improve those that already have the max strength if progress.start_strength < max_strength then if progress.discovered and progress.start_strength < min_strength then self.research_policy["improvements"].current = research_object min_strength = progress.start_strength end end end end end end end -- Now find out what to do next. self:nextResearch(object.research_category) end --[[ Called when it is time to discover a disease (i.e. after diagnosis in the GP) !param disease The disease to discover, a table from world.available_diseases --]] function ResearchDepartment:discoverDisease(disease) -- Generate a message about the discovery local message = { {text = _S.fax.disease_discovered.discovered_name:format(disease.name)}, {text = disease.cause, offset = 12}, {text = disease.symptoms, offset = 12}, {text = disease.cure, offset = 12}, choices = { {text = _S.fax.disease_discovered.close_text, choice = "close"}, }, } self.world.ui.bottom_panel:queueMessage("disease", message, nil, 25*24, 1) self.hospital.disease_casebook[disease.id].discovered = true local index = #self.hospital.discovered_diseases + 1 self.hospital.discovered_diseases[index] = disease.id -- If the drug casebook is open, update it. local window = self.world.ui:getWindow(UICasebook) if window then window:updateDiseaseList() end -- It may now be possible to continue researching drug improvements local casebook_disease = self.hospital.disease_casebook[disease.id] local current_drug_research = self.research_policy.drugs.current -- If we're not researching any drug right now, and the newest discovery was -- a disease that requires a drug, switch the current policy. if (not current_drug_research or current_drug_research.dummy) and casebook_disease.drug then self.research_policy.drugs.current = casebook_disease end self:setResearchConcentration() end --[[! It also costs to research. TODO: This is now just $3 per day and doctor (if at 100%), what should it be? --]] function ResearchDepartment:researchCost() local acc_cost = self.hospital.acc_research_cost local fraction = 0 for _, tab in pairs(self.research_policy) do -- Don't pay for categories where nothing is really researched at the moment. if type(tab) == "table" then if tab.current and not tab.current.dummy then fraction = fraction + tab.frac end end end -- Find out how many doctors are currently doing research local doctors = 0 for _, room in pairs(self.world.rooms) do if room.room_info.id == "research" then for _, _ in pairs(room.staff_member_set) do doctors = doctors + 1 end end end acc_cost = acc_cost + math.ceil(3 * doctors * fraction/100) self.hospital.acc_research_cost = acc_cost end --[[ Concentrates research on a given disease. Concentrating on a machine will improve it if it's been discovered and help researching it otherwise. Concentrating on a drug will improve the drug provided the pharmacy is discovered. Otherwise it will research the cabinet. TODO: Make it possible to concentrate on psychological diseases if the psychiatry hasn't been discovered. !param disease_id The id of the disease to focus on. --]] function ResearchDepartment:concentrateResearch(disease_id) local book_entry = self.hospital.disease_casebook[disease_id] -- First set flags so that the casebook shows the right thing. if book_entry.concentrate_research then -- Already concentrated, we actually just want to cancel that. book_entry.concentrate_research = nil -- Make specialisation a dummy again self.research_policy.specialisation.current = self.drain else for key, disease in pairs(self.hospital.disease_casebook) do -- Set flag on previously concentrated disease if disease.concentrate_research then self.hospital.disease_casebook[key].concentrate_research = nil end end -- Concentrate on the new one book_entry.concentrate_research = true -- Now, find the object related to the disease. -- TODO: This assumes it is the last room in the treatment_rooms list -- which is the one to concentrate on. local room if book_entry.disease.treatment_rooms then local index = #book_entry.disease.treatment_rooms room = book_entry.disease.treatment_rooms[index] else -- This is a pseudo-disease, it should represent a piece of diagnosis -- machinery that we can improve via research. assert(book_entry.disease.id:sub(1, 5) == "diag_", "Trying to " .. "concentrate research on disease without treatment rooms that " .. "isn't a diagnosis machine pseudodisease") room = book_entry.disease.id:sub(6) end local object -- TODO: Can these loops be improved upon? for obj, _ in pairs(self.world.available_rooms[room].objects_needed) do for research, _ in pairs(self.research_progress) do if research.id == obj and research.thob then object = research break end end end assert(object, "An object that was about to be improved or discovered".. "could not be found") if book_entry.drug and self.research_progress[object].discovered then -- A drug should be improved self.research_policy.specialisation.current = book_entry else -- No matter if it's a drug or some machine - -- we want to discover (including the cabinet) or improve it. self.research_policy.specialisation.current = object end end end function ResearchDepartment:afterLoad(old, new) if old < 106 then self.level_config = nil end end CorsixTH-0.63/CorsixTH/Lua/room.lua000066400000000000000000001053671347163623700171000ustar00rootroot00000000000000--[[ Copyright (c) 2009 Peter "Corsix" Cawley 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. --]] class "Room" ---@type Room local Room = _G["Room"] function Room:Room(x, y, w, h, id, room_info, world, hospital, door, door2) self.id = id self.world = world self.hospital = hospital self.room_info = room_info self:initRoom(x, y, w, h, door, door2) end function Room:initRoom(x, y, w, h, door, door2) self.x = x self.y = y self.width = w self.height = h self.maximum_patients = 1 -- A good default for most rooms door.room = self self.door = door -- If it's a swing door we have two doors self.door2 = door2 if not self:hasQueueDialog() then door:setDynamicInfo('text', { self.room_info.name }) else door:setDynamicInfo('text', { self.room_info.name, _S.dynamic_info.object.queue_size:format(0), _S.dynamic_info.object.queue_expected:format(0) }) end self.built = false self.crashed = false self.world.map.th:markRoom(x, y, w, h, self.room_info.floor_tile, self.id) self.humanoids = {--[[a set rather than a list]]} self.objects = {--[[a set rather than a list]]} -- the set of humanoids walking to this room self.humanoids_enroute = {--[[a set rather than a list]]} self.world:prepareRectangleTilesForBuild(self.x, self.y, self.width, self.height) end --! Get the tile next to the door. --!param inside (bool) If set, get the tile inside the room, else get the tile outside. --!return x,y (tile coordinates) of the tile next to the door. function Room:getEntranceXY(inside) local door = self.door local x, y = door.tile_x, door.tile_y if (inside and self.world:getRoom(x, y) ~= self) or (not inside and self.world:getRoom(x, y) == self) then if door.direction == "north" then y = y - 1 elseif door.direction == "west" then x = x - 1 end end return x, y end --! Construct an 'walk' action to the tile next to the door, just outside the room. --!return Action to move to the tile just outside the room. function Room:createLeaveAction() local x, y = self:getEntranceXY(false) return WalkAction(x, y):setIsLeaving(true):truncateOnHighPriority() end function Room:createEnterAction(humanoid_entering, callback) local x, y = self:getEntranceXY(true) if not callback then if class.is(humanoid_entering, Patient) then callback = --[[persistable:room_patient_enroute_cancel]] function() humanoid_entering:setNextAction(SeekRoomAction(self.room_info.id)) end elseif class.is(humanoid_entering, Vip) then callback = --[[persistable:room_vip_enroute_cancel]] function() humanoid_entering:setNextAction(IdleAction()) humanoid_entering.waiting = 1 end else callback = --[[persistable:room_humanoid_enroute_cancel]] function() humanoid_entering:setNextAction(MeanderAction()) end end end if self.is_active then self.humanoids_enroute[humanoid_entering] = {callback = callback} end return WalkAction(x, y):setIsEntering(true) end --! Get a patient in the room. --!return A patient (humanoid) if there is a patient, nil otherwise. function Room:getPatient() for humanoid in pairs(self.humanoids) do if class.is(humanoid, Patient) then return humanoid end end end --! Count the number of patients in the room. --!return Number of patients in the room. function Room:getPatientCount() local count = 0 for humanoid in pairs(self.humanoids) do if class.is(humanoid, Patient) then count = count + 1 end end return count end -- function that sets a given attribute to a given value for all staff members. -- Should be overriden for rooms that have more than one staff member. function Room:setStaffMembersAttribute(attribute, value) if self.staff_member then self.staff_member[attribute] = value end end function Room:dealtWithPatient(patient) patient = patient or self:getPatient() -- If the patient was sent home while in the room, don't -- do anything apart from removing any leading idle action. if not patient.hospital or patient.going_home then if patient:getCurrentAction().name == "idle" then patient:finishAction() end return end patient:setNextAction(self:createLeaveAction()) patient:addToTreatmentHistory(self.room_info) if self.staff_member then self:setStaffMembersAttribute("dealing_with_patient", false) end if patient.disease then if not patient.diagnosed then -- Patient not yet diagnosed, hence just been in a diagnosis room. -- Increment diagnosis_progress, and send patient back to GP. patient:completeDiagnosticStep(self) self.hospital:receiveMoneyForTreatment(patient) if patient:agreesToPay("diag_gp") then patient:queueAction(SeekRoomAction("gp")) else patient:goHome("over_priced", "diag_gp") end else -- Patient just been in a cure room, so either patient now cured, or needs -- to move onto next cure room. patient.cure_rooms_visited = patient.cure_rooms_visited + 1 local next_room = patient.disease.treatment_rooms[patient.cure_rooms_visited + 1] if next_room then -- Do not say that it is a treatment room here, since that check should already have been made. patient:queueAction(SeekRoomAction(next_room)) else -- Patient is "done" at the hospital patient:treatDisease() end end else patient:queueAction(MeanderAction():setCount(2)) patient:queueAction(IdleAction()) end if self.dealt_patient_callback then self.dealt_patient_callback(self.waiting_staff_member) end -- The staff member(s) might be needed somewhere else. self:findWorkForStaff() end --! Checks if the room still needs the staff in it and otherwise -- sends them away if they're needed somewhere else. function Room:findWorkForStaff() -- If the staff member is idle we can send him/her somewhere else for humanoid in pairs(self.humanoids) do -- Don't check handymen if class.is(humanoid, Staff) and humanoid.humanoid_class ~= "Handyman" and humanoid:isIdle() then self.world.dispatcher:answerCall(humanoid) end end end local profile_attributes = { Psychiatrist = "is_psychiatrist", Surgeon = "is_surgeon", Researcher = "is_researcher", } -- Given any type of staff criteria (required/maximum), subtract the staff in the room and return the result function Room:getMissingStaff(criteria) local result = {} for attribute, count in pairs(criteria) do for humanoid in pairs(self.humanoids) do if class.is(humanoid, Staff) and humanoid:fulfillsCriterion(attribute) and not humanoid:isLeaving() and not humanoid.fired then count = count - 1 end end if count <= 0 then count = nil end result[attribute] = count end return result end function Room:testStaffCriteria(criteria, extra_humanoid) -- criteria should be required_staff or maximum_staff table. -- if extra_humanoid is nil, then returns true if the humanoids in the room -- meet the given criteria, and false otherwise. -- if extra_humanoid is not nil, then returns true if the given humanoid -- would assist in satisfying the given criteria, and false if they would not. local missing = self:getMissingStaff(criteria) if extra_humanoid then local class = extra_humanoid.humanoid_class if class == "Surgeon" then class = "Doctor" end if missing[class] then return true end if class == "Doctor" then -- check for special proficiencies for attribute, profile_attribute in pairs(profile_attributes) do if extra_humanoid.profile and extra_humanoid.profile[profile_attribute] == 1.0 and missing[attribute] then return true end end end return false else return next(missing) == nil end end local no_staff = {} -- Constant denoting 'no staff at all' in a room. --! Get the type and number of maximum staff for the room. --!return (table) Type and number of maximum staff. function Room:getMaximumStaffCriteria() -- Some rooms have dynamic criteria (i.e. dependent upon the number of items -- in the room), so this method is provided for such rooms to override it. return self.room_info.maximum_staff or self.room_info.required_staff or no_staff end --! Get the type and number of required staff for the room. --!return (table) Type and number of required staff. function Room:getRequiredStaffCriteria() return self.room_info.required_staff or no_staff end function Room:onHumanoidEnter(humanoid) assert(not self.humanoids[humanoid], "Humanoid entering a room that they are already in") humanoid.in_room = self humanoid.last_room = self -- Remember where the staff was for them to come back after staffroom rest -- Do not set humanoids[humanoid] here, because it affect staffFitsInRoom test --entering humanoids are no longer enroute if self.humanoids_enroute[humanoid] then self.humanoids_enroute[humanoid] = nil -- humanoid is no longer walking to this room end -- If this humanoid for some strange reason happens to enter a non-active room, -- just leave. if not self.is_active then print('Warning: humanoid entering non-active room') self.humanoids[humanoid] = true if class.is(humanoid, Patient) then self:makeHumanoidLeave(humanoid) humanoid:queueAction(SeekRoomAction(self.room_info.id)) else humanoid:setNextAction(self:createLeaveAction()) humanoid:queueAction(MeanderAction()) end return end if humanoid.humanoid_class == "Handyman" then -- Handymen can always enter a room (to repair stuff, water plants, etc.) self.humanoids[humanoid] = true -- Check for machines which need repair or plants which need watering if -- the handyman didn't arrive as a part of a job if humanoid.on_call then assert(humanoid.on_call.object:getRoom() == self, "Handyman arrived is on call but not arriving to the designated room") else -- If the handyman was not assigned for the job (e.g. drop by manual pickup), do answer a call humanoid:setNextAction(AnswerCallAction()) end return end local msg = { (_A.warnings.researcher_needs_desk_1), (_A.warnings.researcher_needs_desk_2), (_A.warnings.researcher_needs_desk_3), } local msg_nurse = { (_A.warnings.nurse_needs_desk_1), (_A.warnings.nurse_needs_desk_2), } if class.is(humanoid, Staff) then -- If the room is already full of staff, or the staff member isn't relevant -- to the room, then make them leave. Otherwise, take control of them. if not self:staffFitsInRoom(humanoid) then if self:getStaffMember() and self:staffMeetsRoomRequirements(humanoid) then local staff_member = self:getStaffMember() self.humanoids[humanoid] = true if staff_member.profile.is_researcher and self.room_info.id == "research" then self.world.ui.adviser:say(msg[math.random(1, #msg)]) end if staff_member.humanoid_class == "Nurse" and self.room_info.id == "ward" then self.world.ui.adviser:say(msg_nurse[math.random(1, #msg_nurse)]) end if not staff_member.dealing_with_patient then staff_member:setNextAction(self:createLeaveAction()) staff_member:queueAction(MeanderAction()) self.staff_member = humanoid humanoid:setCallCompleted() self:commandEnteringStaff(humanoid) else if self.waiting_staff_member then self.waiting_staff_member.waiting_on_other_staff = nil self.waiting_staff_member:setNextAction(self:createLeaveAction()) self.waiting_staff_member:queueAction(MeanderAction()) end self:createDealtWithPatientCallback(humanoid) humanoid.waiting_on_other_staff = true humanoid:setNextAction(MeanderAction()) end else self.humanoids[humanoid] = true humanoid:setNextAction(self:createLeaveAction()) humanoid:queueAction(MeanderAction()) humanoid:adviseWrongPersonForThisRoom() end else self.humanoids[humanoid] = true humanoid:setCallCompleted() self:commandEnteringStaff(humanoid) end self:tryAdvanceQueue() return end self.humanoids[humanoid] = true self:tryAdvanceQueue() if class.is(humanoid, Patient) then -- An infect patient's disease may have changed so they might have -- been sent to an incorrect diagnosis room, they should leave and go -- back to the gp for redirection if (humanoid.infected) and not humanoid.diagnosed and not self:isDiagnosisRoomForPatient(humanoid) then humanoid:queueAction(self:createLeaveAction()) humanoid.needs_redirecting = true humanoid:queueAction(SeekRoomAction("gp")) return end -- Check if the staff requirements are still fulfilled (the staff might have left / been picked up meanwhile) if self:testStaffCriteria(self:getRequiredStaffCriteria()) then if self.staff_member then self:setStaffMembersAttribute("dealing_with_patient", true) end self:commandEnteringPatient(humanoid) else humanoid:setNextAction(self:createLeaveAction()) humanoid:queueAction(self:createEnterAction(humanoid)) end end end function Room:createDealtWithPatientCallback(humanoid) self.dealt_patient_callback = --[[persistable:room_dealt_with_patient_callback]] function (staff_humanoid) if not staff_humanoid.waiting_on_other_staff then return end local staff_member = self:getStaffMember() if staff_member then staff_member:setNextAction(self:createLeaveAction()) staff_member:queueAction(MeanderAction()) staff_member:setMood("staff_wait", "deactivate") staff_member:setDynamicInfoText("") end staff_humanoid:setCallCompleted() staff_humanoid.waiting_on_other_staff = nil self:commandEnteringStaff(staff_humanoid) self:setStaffMember(staff_humanoid) self.waiting_staff_member = nil self.dealt_patient_callback = nil end self.waiting_staff_member = humanoid end --! Get the current staff member. -- Can be overridden in rooms with multiple staff members to return the desired one. --!return (staff) The current staff member. function Room:getStaffMember() return self.staff_member end --! Set the current staff member. --!param staff (staff) Staff member to denote as current staff. function Room:setStaffMember(staff) self.staff_member = staff end --! Does the given staff member fit in the room? -- Returns false if the room is already full of staff or if the given member of staff cannot help out. -- Otherwise returns true. --!return (bool) True if the staff member can work in the room, else False. function Room:staffFitsInRoom(staff) local criteria = self:getMaximumStaffCriteria() if self:testStaffCriteria(criteria) or not self:testStaffCriteria(criteria, staff) then return false end return true end --! Returns true if the humanoid meets (one of) the required staff criteria of the room function Room:staffMeetsRoomRequirements(humanoid) local criteria = self:getRequiredStaffCriteria() for attribute, _ in pairs(criteria) do if humanoid:fulfillsCriterion(attribute) then return true end end return false end --! When a valid member of staff enters the room this function is called. -- Can be extended in derived classes. --!param humanoid The staff in question --!param already_initialized If true, this means that the staff has already got order -- what to do. function Room:commandEnteringStaff(humanoid, already_initialized) if not already_initialized then self.staff_member = humanoid humanoid:setNextAction(MeanderAction()) end self:tryToFindNearbyPatients() humanoid:setDynamicInfoText("") -- This variable is used to avoid multiple calls for staff (sound played only) self.sound_played = nil if self:testStaffCriteria(self:getRequiredStaffCriteria()) then self.world.dispatcher:dropFromQueue(self) end end function Room:commandEnteringPatient(humanoid) -- To be extended in derived classes self.door.queue.visitor_count = self.door.queue.visitor_count + 1 humanoid:updateDynamicInfo("") for room_humanoid in pairs(self.humanoids) do -- Staff is no longer waiting if class.is(room_humanoid, Staff) then if room_humanoid.humanoid_class ~= "Handyman" then room_humanoid:setMood("staff_wait", "deactivate") room_humanoid:setDynamicInfoText("") end end end end function Room:tryAdvanceQueue() if self.door.queue:size() > 0 and not self.door.user and not self.door.reserved_for then local front = self.door.queue:front() -- These two conditions differ by the waiting symbol if self:canHumanoidEnter(front) then self.door.queue:pop() self.door:updateDynamicInfo() -- Do nothing if it is the staff room or training room. if self:hasQueueDialog() then for room_humanoid in pairs(self.humanoids) do -- Staff is now waiting if class.is(room_humanoid, Staff) then if room_humanoid.humanoid_class ~= "Handyman" then room_humanoid:setMood("staff_wait", "activate") room_humanoid:setDynamicInfoText(_S.dynamic_info.staff.actions.waiting_for_patient) end end end end elseif self.humanoids[front] then self.door.queue:pop() self.door:updateDynamicInfo() end end end function Room:onHumanoidLeave(humanoid) if self.staff_member == humanoid then self.staff_member = nil end humanoid.in_room = nil if not self.humanoids[humanoid] then print("Warning: Humanoid leaving a room that they are not in") return end self.humanoids[humanoid] = nil local staff_leaving = false if class.is(humanoid, Patient) then -- Some staff member in the room might be waiting to get to the staffroom. for room_humanoid in pairs(self.humanoids) do -- A patient leaving allows doctors/nurses inside to go to staffroom, if needed -- In a rare case a handyman that just decided he wants to go to the staffroom -- could be in the room at the same time as a patient leaves. if class.is(room_humanoid, Staff) and room_humanoid.humanoid_class ~= "Handyman" then if room_humanoid.staffroom_needed then room_humanoid.staffroom_needed = nil room_humanoid:goToStaffRoom() staff_leaving = true end end end -- There might be other similar rooms with patients queueing if self.door.queue and self.door.queue:reportedSize() == 0 then self:tryToFindNearbyPatients() end end if not staff_leaving then self:tryAdvanceQueue() else -- Staff is leaving. If there is still a need for this room (people are in the queue) then call -- someone new. if self.active and self.door.queue:patientSize() > 0 then -- This call might not be effective, if the doctor last action is -- walking/must_happen but is_leaving not set (psych likes to walk around in the room) -- hence testStaffCriteria still pass. -- This is guarded by onHumanoidLeave(Staff) self.world.dispatcher:callForStaff(self) end end if class.is(humanoid, Staff) then if humanoid.waiting_on_other_staff then humanoid.waiting_on_other_staff = nil self.dealt_patient_callback = nil end -- Make patients leave the room if there are no longer enough staff if not self:testStaffCriteria(self:getRequiredStaffCriteria()) then local patient_needs_to_reenter = false for room_humanoid in pairs(self.humanoids) do if class.is(room_humanoid, Patient) and self:shouldHavePatientReenter(room_humanoid) then self:makeHumanoidLeave(room_humanoid) room_humanoid:queueAction(self:createEnterAction(room_humanoid)) patient_needs_to_reenter = true end end -- Call for staff if needed if self.is_active and (patient_needs_to_reenter or self.door.queue:patientSize() > 0) then self.world.dispatcher:callForStaff(self) end end -- Remove any unwanted moods the staff member might have humanoid:setMood("staff_wait", "deactivate") end -- The player might be waiting to edit this room if not self.is_active then local i = 0 for _ in pairs(self.humanoids) do i = i + 1 end if i == 0 then local ui = self.world.ui ui:addWindow(UIEditRoom(ui, self)) ui:setCursor(ui.default_cursor) end end end function Room:shouldHavePatientReenter(patient) return not patient:hasLeavingAction() end local tile_factor = 10 -- how many tiles further are we willing to walk for 1 person fewer in the queue local readiness_bonus = 50 -- how many tiles further are we willing to walk if the room has all the required staff --! Score function to decide how desirable a room is for a patient. --!return (int) The score, lower is better. function Room:getUsageScore() local queue = self.door.queue local score = queue:patientSize() + self:getPatientCount() - self.maximum_patients score = score * tile_factor if self:testStaffCriteria(self:getRequiredStaffCriteria()) then score = score - readiness_bonus end -- Add constant penalty if queue is full if queue:isFull() then score = score + 1000 end return score end function Room:canHumanoidEnter(humanoid) -- If the room is not active nobody can enter if not self.is_active then return false end -- By default, staff can always enter if class.is(humanoid, Staff) then return true end -- By default, patients can only enter if there are sufficient staff and not -- too many patients. if class.is(humanoid, Patient) and not self.needs_repair then return self:testStaffCriteria(self:getRequiredStaffCriteria()) and self:getPatientCount() < self.maximum_patients end -- By default, other classes of humanoids cannot enter return false end -- Function stub for rooms to implement. Called when the final confirm -- button has been pressed when building/editing a room. function Room:roomFinished() -- True once the room has been finished after initial construction, and then -- as long as the user doesn't edit it and go back beyond the first phase (place objects) self.built = true -- Only true when not editing the room at all. self.is_active = true -- Some rooms should not have the door cursor for the queue dialog if not self:hasQueueDialog() then self.door.hover_cursor = TheApp.gfx:loadMainCursor("default") end -- Show information about the room if not already shown. -- Also only show them if the player is playing the original campaign. if tonumber(self.world.map.level_number) and not self.world.room_information_dialogs_off then if not self.world.room_built[self.room_info.id] then self.world.ui:addWindow(UIInformation(self.world.ui, _S.room_descriptions[self.room_info.id])) self.world.room_built[self.room_info.id] = true end end self:tryToFindNearbyPatients() -- It may also happen that there are patients queueing for this room already (e.g after editing) if self.door.queue:patientSize() > 0 then self.world.dispatcher:callForStaff(self) end self:tryAdvanceQueue() end --! Try to move a patient from the old room to the new room. --!param old_room (Room) Room that currently has the patient in the queue. --!param new_room (Room) Room that wants the patient in the queue. --!param patient (Humanoid) Patient to move. --!return (boolean) Whether we are done with the old room (no more patients will come from it). local function tryMovePatient(old_room, new_room, patient) local world = new_room.world local px, py = patient.tile_x, patient.tile_y -- Don't reroute the patient if he just decided to go to the toilet if patient.going_to_toilet ~= "no" then return false end local new_x, new_y = new_room:getEntranceXY(true) local old_x, old_y = old_room:getEntranceXY(true) local new_distance = world:getPathDistance(px, py, new_x, new_y) if not new_distance then return true end -- Patient cannot reach us, quit trying local new_score = new_room:getUsageScore() + new_distance local old_score local old_distance = world:getPathDistance(px, py, old_x, old_y) if old_distance then old_score = old_room:getUsageScore() + old_distance else old_score = new_score + 1 -- Make condition below fail. end if new_score >= old_score then return true end -- Update the queues local old_queue = old_room.door.queue old_queue:removeValue(patient) patient.next_room_to_visit = new_room new_room.door.queue:expect(patient) new_room.door:updateDynamicInfo() -- Rewrite the action queue for i, action in ipairs(patient.action_queue) do if i ~= 1 then action.todo_interrupt = true end -- The patient will most likely have a queue action for the other -- room that must be cancelled. To prevent the after_use callback -- of the drinks machine to enqueue the patient in the other queue -- again, is_in_queue is set to false so the callback won't run if action.name == 'queue' then action.is_in_queue = false elseif action.name == "walk" and action.x == old_x and action.y == old_y then patient:queueAction(new_room:createEnterAction(patient), i) break end end local interrupted = patient:getCurrentAction() local on_interrupt = interrupted.on_interrupt if on_interrupt then interrupted.on_interrupt = nil on_interrupt(interrupted, patient, false) end return false end --! Try to find new patients for this room by 'stealing' them from other rooms nearby. function Room:tryToFindNearbyPatients() if not self.door.queue then return end for _, old_room in pairs(self.world.rooms) do if old_room.hospital == self.hospital and old_room ~= self and old_room.room_info == self.room_info and old_room.door.queue and old_room.door.queue:reportedSize() >= 2 then local old_queue = old_room.door.queue local pat_number = old_queue:reportedSize() while pat_number > 1 do local patient = old_queue:reportedHumanoid(pat_number) if tryMovePatient(old_room, self, patient) then break end -- tryMovePatient may have just removed patient 'pat_number', but it does -- not change the queue in front of it. 'pat_number - 1' thus still exists. pat_number = pat_number - 1 end end end end --! Explode the room. function Room:crashRoom() self.door:closeDoor() if self.door2 then self.door2.hover_cursor = nil end -- A patient might be about to use the door (staff are dealt with elsewhere): if self.door.reserved_for then local person = self.door.reserved_for if not person:isLeaving() then if class.is(person, Patient) then --Delay so that room is destroyed before the SeekRoom search. person:queueAction(IdleAction():setCount(1)) person:queueAction(SeekRoomAction(self.room_info.id)) end end person:finishAction() self.door.reserved_for = nil end local remove_humanoid = function(humanoid) humanoid:queueAction(IdleAction(), 1) humanoid.user_of = nil -- Make sure any emergency list is not messed up. -- Note that these humanoids might just have been kicked. (No hospital set) if humanoid.is_emergency then table.remove(self.world:getLocalPlayerHospital().emergency_patients, humanoid.is_emergency) end humanoid:die() humanoid:despawn() self.world:destroyEntity(humanoid) end -- Remove all humanoids in the room for humanoid, _ in pairs(self.humanoids) do remove_humanoid(humanoid) end self.humanoids = {} -- There might also be someone using the door, even if that person is just about to exit -- he/she is killed too. local walker = self.door.user if walker then self.door:removeUser(walker) remove_humanoid(walker) end -- Remove all objects in the room local fx, fy = self:getEntranceXY(true) for object, _ in pairs(self.world:findAllObjectsNear(fx, fy)) do -- Machines (i.e. objects with strength) are already done. if object.object_type.class == "Plant" then local index = self.hospital:getIndexOfTask(object.tile_x, object.tile_y, "watering") if index ~= -1 then self.hospital:removeHandymanTask(index, "watering") end object.unreachable = true end if object.object_type.id ~= "door" and not object.strength and object.object_type.class ~= "SwingDoor" then object.user = nil object.user_list = nil object.reserved_for = nil object.reserved_for_list = nil self.world:destroyEntity(object) end end local map = self.world.map.th -- TODO: Explosion, animations: 4612, 3280 -- Make every floor tile have soot on them for x = self.x, self.x + self.width - 1 do for y = self.y, self.y + self.height - 1 do local soot = self.world:newObject("litter", x, y) soot:setLitterType("soot_floor", 0) end end -- Make walls have soot on them too local ty = self.y local soot_type, soot, block for x = self.x, self.x + self.width - 1 do block = map:getCell(x, ty, 2) soot_type = "soot_wall" if self.world:getWallSetFromBlockId(block) == "window_tiles" then soot_type = "soot_window" end soot = self.world:newObject("litter", x, ty) soot:setLitterType(soot_type, 1) end local x = self.x for y = self.y, self.y + self.height - 1 do block = map:getCell(x, y, 3) soot_type = "soot_wall" if self.world:getWallSetFromBlockId(block) == "window_tiles" then soot_type = "soot_window" end soot = self.world:newObject("litter", x, y) soot:setLitterType(soot_type, 0) end self.hospital.num_explosions = self.hospital.num_explosions + 1 self.crashed = true self:deactivate() end -- Tells a humanoid in the room to leave it. This can be overridden for special -- handling, e.g. if the humanoid needs to change before leaving the room. function Room:makeHumanoidLeave(patient) local leave = self:createLeaveAction():setMustHappen(true) patient:setNextAction(leave) end function Room:makeHumanoidDressIfNecessaryAndThenLeave(humanoid) if not humanoid:isLeaving() then local leave = self:createLeaveAction():setMustHappen(true) if not string.find(humanoid.humanoid_class, "Stripped") then humanoid:setNextAction(leave) return end local screen, sx, sy = self.world:findObjectNear(humanoid, "screen") local use_screen = UseScreenAction(screen):setMustHappen(true):setIsLeaving(true) --Make old saved game action queues compatible with the changes made by the #293 fix commit: for actions_index, action in ipairs(humanoid.action_queue) do if action.name == "use screen" or (action.name == "walk" and action.x == sx and action.y == sy) then if not action.is_leaving then humanoid.humanoid_actions[actions_index].is_leaving = true end if action.name == "walk" and action.must_happen then action.must_happen = false end end end if humanoid:getCurrentAction().name == "use_screen" then --The humanoid must be using the screen to undress because this isn't a leaving action: humanoid:getCurrentAction().after_use = nil humanoid:setNextAction(use_screen) else humanoid:setNextAction(WalkAction(sx, sy):setMustHappen(true):disableTruncate():setIsLeaving(true)) humanoid:queueAction(use_screen) end humanoid:queueAction(leave) end end --! Deactivate the room from the world. function Room:deactivate() self.is_active = false -- So that no more patients go to it. self.world:notifyRoomRemoved(self) for _, callback in pairs(self.humanoids_enroute) do callback.callback() end -- Now empty the humanoids_enroute list since they are not enroute anymore. self.humanoids_enroute = {} self.hospital:removeRatholesAroundRoom(self) end function Room:tryToEdit() self:deactivate() local i = 0 -- Tell all humanoids that they should leave -- If someone is entering the room right now they are also counted. if self.door.user and self.door.user:getCurrentAction().is_entering then i = 1 end for humanoid, _ in pairs(self.humanoids) do if not humanoid:isLeaving() then if class.is(humanoid, Patient) then self:makeHumanoidLeave(humanoid) humanoid:queueAction(SeekRoomAction(self.room_info.id)) else humanoid:setNextAction(self:createLeaveAction()) humanoid:queueAction(MeanderAction()) end end i = i + 1 end -- If there were no people inside we're ready to edit the room if i == 0 then local ui = self.world.ui ui:addWindow(UIEditRoom(ui, self)) ui:setCursor(ui.default_cursor) end end function Room:hasQueueDialog() return not self.room_info.has_no_queue_dialog end --! Stub to be extended in subclasses, if needed. function Room:afterLoad(old, new) if old and old < 46 then self.humanoids_enroute = {--[[a set rather than a list]]} end end --[[ Is the room one of the diagnosis rooms for the patient? -- This used for epidemics when the disease and therefore the diagnosis -- rooms of a patient may change. -- @param patient (Patient) patient to verify if treatment room ]] -- @return result (boolean) true if is suitable diagnosis room, false otherwise function Room:isDiagnosisRoomForPatient(patient) if self.room_info.id ~= "gp" then for _, room_name in ipairs(patient.disease.diagnosis_rooms) do if self.room_info.id == room_name then return true end end return false else return true end end --! Get the average service quality of the staff members in the room. --!return (float) [0-1] Average staff service quality. function Room:getStaffServiceQuality() local quality = 0.5 if self.staff_member_set then -- For rooms with multiple staff member (like operating theatre) quality = 0 local count = 0 for member, _ in pairs(self.staff_member_set) do quality = quality + member:getServiceQuality() count = count + 1 end quality = quality / count elseif self.staff_member then -- For rooms with one staff member quality = self.staff_member:getServiceQuality() end return quality end CorsixTH-0.63/CorsixTH/Lua/rooms/000077500000000000000000000000001347163623700165445ustar00rootroot00000000000000CorsixTH-0.63/CorsixTH/Lua/rooms/blood_machine_room.lua000066400000000000000000000056071347163623700230760ustar00rootroot00000000000000--[[ Copyright (c) 2009 Manuel König 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. --]] local room = {} room.id = "blood_machine" room.level_config_id = 15 room.class = "BloodMachineRoom" room.name = _S.rooms_short.blood_machine room.long_name = _S.rooms_long.blood_machine room.tooltip = _S.tooltip.rooms.blood_machine room.objects_additional = { "extinguisher", "radiator", "plant", "bin" } room.objects_needed = { blood_machine = 1 } room.build_preview_animation = 5094 room.categories = { diagnosis = 6, } room.minimum_size = 4 room.wall_type = "yellow" room.floor_tile = 19 room.required_staff = { Doctor = 1, } room.maximum_staff = room.required_staff room.call_sound = "reqd006.wav" room.handyman_call_sound = "maint015.wav" class "BloodMachineRoom" (Room) ---@type BloodMachineRoom local BloodMachineRoom = _G["BloodMachineRoom"] function BloodMachineRoom:BloodMachineRoom(...) self:Room(...) end function BloodMachineRoom:commandEnteringPatient(patient) local staff = self.staff_member local machine, stf_x, stf_y = self.world:findObjectNear(patient, "blood_machine") local pat_x, pat_y = machine:getSecondaryUsageTile() staff:setNextAction(WalkAction(stf_x, stf_y)) patient:setNextAction(WalkAction(pat_x, pat_y)) patient:queueAction(IdleAction():setDirection(machine.direction == "north" and "west" or "north")) local length = math.random(2, 4) local loop_callback = --[[persistable:blood_machine_loop_callback]] function(action) if length <= 0 then action.prolonged_usage = false end length = length - 1 end local after_use = --[[persistable:blood_machine_after_use]] function() staff:setNextAction(MeanderAction()) self:dealtWithPatient(patient) end staff:queueAction(MultiUseObjectAction(machine, patient):setProlongedUsage(true) :setInvisiblePhaseSpan({-3, 3}):setLoopCallback(loop_callback):setAfterUse(after_use)) return Room.commandEnteringPatient(self, patient) end return room CorsixTH-0.63/CorsixTH/Lua/rooms/cardiogram.lua000066400000000000000000000103431347163623700213600ustar00rootroot00000000000000--[[ Copyright (c) 2009 Manuel König 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. --]] local room = {} room.id = "cardiogram" room.level_config_id = 12 room.class = "CardiogramRoom" room.name = _S.rooms_short.cardiogram room.long_name = _S.rooms_long.cardiogram room.tooltip = _S.tooltip.rooms.cardiogram room.objects_additional = { "extinguisher", "radiator", "plant", "bin" } room.objects_needed = { cardio = 1, screen = 1 } room.build_preview_animation = 918 room.categories = { diagnosis = 3, } room.minimum_size = 4 room.wall_type = "yellow" room.floor_tile = 19 room.required_staff = { Doctor = 1, } room.maximum_staff = room.required_staff room.call_sound = "reqd001.wav" room.handyman_call_sound = "maint010.wav" class "CardiogramRoom" (Room) ---@type CardiogramRoom local CardiogramRoom = _G["CardiogramRoom"] function CardiogramRoom:CardiogramRoom(...) self:Room(...) end function CardiogramRoom:commandEnteringPatient(patient) local screen, sx, sy = self.world:findObjectNear(patient, "screen") patient:walkTo(sx, sy) local screen_after_use = --[[persistable:cardiogram_screen_after_use1]] function() local staff = self.staff_member local cardio, cx, cy = self.world:findObjectNear(patient, "cardio") staff:walkTo(cardio:getSecondaryUsageTile()) local staff_idle = IdleAction() staff:queueAction(staff_idle) patient:walkTo(cx, cy) local timer = 6 local phase = -2 local cardio_loop_callback = --[[persistable:cardiogram_cardio_loop_callback]] function(action) if not action.on_interrupt then action.prolonged_usage = false patient.num_animation_ticks = 1 return end timer = timer - 1 if timer == 0 then phase = phase + 1 if phase == 3 then action.prolonged_usage = false else patient.num_animation_ticks = 3 - math.abs(phase) end timer = 6 else action.secondary_anim = 1030 end end local cardio_after_use = --[[persistable:cardiogram_cardio_after_use]] function() if #staff.action_queue == 1 then staff:setNextAction(MeanderAction()) else staff:finishAction(staff_idle) end end patient:queueAction(MultiUseObjectAction(cardio, staff):setMustHappen(false) :setProlongedUsage(true):setLoopCallback(cardio_loop_callback):setAfterUse(cardio_after_use)) patient:queueAction(WalkAction(sx, sy):setIsLeaving(true):setMustHappen(false):disableTruncate()) local leaving_after_use = --[[persistable:cardiogram_screen_after_use2]] function() if #patient.action_queue == 1 then self:dealtWithPatient(patient) end end patient:queueAction(UseScreenAction(screen):setIsLeaving(true):setMustHappen(true):setAfterUse(leaving_after_use)) end patient:queueAction(UseScreenAction(screen):setAfterUse(screen_after_use)) return Room.commandEnteringPatient(self, patient) end function CardiogramRoom:makeHumanoidLeave(humanoid) self:makeHumanoidDressIfNecessaryAndThenLeave(humanoid) end function CardiogramRoom:onHumanoidLeave(humanoid) if self.staff_member == humanoid then self.staff_member = nil end Room.onHumanoidLeave(self, humanoid) end function CardiogramRoom:shouldHavePatientReenter(patient) return not patient:isLeaving() end return room CorsixTH-0.63/CorsixTH/Lua/rooms/decontamination.lua000066400000000000000000000101001347163623700224130ustar00rootroot00000000000000--[[ Copyright (c) 2010 Manuel "Roujin" Wolf 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. --]] local room = {} room.id = "decontamination" room.level_config_id = 30 room.class = "DecontaminationRoom" room.name = _S.rooms_short.decontamination room.long_name = _S.rooms_long.decontamination room.tooltip = _S.tooltip.rooms.decontamination room.objects_additional = { "extinguisher", "radiator", "plant", "bin" } room.objects_needed = { shower = 1, console = 1 } room.build_preview_animation = 5100 room.categories = { clinics = 8, } room.minimum_size = 5 room.wall_type = "blue" room.floor_tile = 19 room.required_staff = { Doctor = 1, } room.maximum_staff = room.required_staff room.call_sound = "reqd024.wav" room.handyman_call_sound = "maint012.wav" class "DecontaminationRoom" (Room) ---@type DecontaminationRoom local DecontaminationRoom = _G["DecontaminationRoom"] function DecontaminationRoom:DecontaminationRoom(...) self:Room(...) end function DecontaminationRoom:commandEnteringStaff(staff) self.staff_member = staff staff:setNextAction(MeanderAction()) return Room.commandEnteringStaff(self, staff) end function DecontaminationRoom:commandEnteringPatient(patient) local staff = self.staff_member local shower, pat_x, pat_y = self.world:findObjectNear(patient, "shower") local console, stf_x, stf_y = self.world:findObjectNear(staff, "console") local --[[persistable:decontamination_shared_loop_callback]] function loop_callback() if staff:getCurrentAction().shower_ready and patient:getCurrentAction().shower_ready then staff:finishAction() patient:finishAction() end end staff:walkTo(stf_x, stf_y) local idle_action = IdleAction():setDirection(console.direction == "north" and "west" or "north") :setLoopCallback(loop_callback) idle_action.shower_ready = true staff:queueAction(idle_action) staff:queueAction(UseObjectAction(console)) patient:walkTo(pat_x, pat_y) idle_action = IdleAction():setDirection(shower.direction == "north" and "north" or "west") :setLoopCallback(loop_callback) idle_action.shower_ready = true patient:queueAction(idle_action) local prolonged = true local length = math.random() * 3 - staff.profile.skill if length < 1 then prolonged = false -- Really short usage else length = length - 1 end local shower_loop_callback = --[[persistable:shower_loop_callback]] function(action) length = length - 1 if length <= 0 then action.prolonged_usage = false end end local shower_after_use = --[[persistable:shower_after_use]] function() if not self.staff_member then return end self.staff_member:setNextAction(MeanderAction()) if not patient.going_home then self:dealtWithPatient(patient) end end patient:queueAction(UseObjectAction(shower):setProlongedUsage(prolonged) :setLoopCallback(shower_loop_callback):setAfterUse(shower_after_use)) return Room.commandEnteringPatient(self, patient) end function DecontaminationRoom:onHumanoidLeave(humanoid) if self.staff_member == humanoid then self.staff_member = nil end Room.onHumanoidLeave(self, humanoid) end return room CorsixTH-0.63/CorsixTH/Lua/rooms/dna_fixer.lua000066400000000000000000000065471347163623700212220ustar00rootroot00000000000000--[[ Copyright (c) 2011 Manuel "Roujin" Wolf 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. --]] local room = {} room.id = "dna_fixer" room.level_config_id = 23 room.class = "DNAFixerRoom" room.name = _S.rooms_short.dna_fixer room.long_name = _S.rooms_long.dna_fixer room.tooltip = _S.tooltip.rooms.dna_fixer room.objects_additional = { "extinguisher", "radiator", "plant", "bin" } room.objects_needed = { dna_fixer = 1, console = 1 } room.build_preview_animation = 5070 room.categories = { clinics = 6, } room.minimum_size = 5 room.wall_type = "blue" room.floor_tile = 17 room.swing_doors = true room.required_staff = { Researcher = 1, } room.maximum_staff = room.required_staff room.call_sound = "reqd015.wav" room.handyman_call_sound = "maint006.wav" class "DNAFixerRoom" (Room) ---@type DNAFixerRoom local DNAFixerRoom = _G["DNAFixerRoom"] function DNAFixerRoom:DNAFixerRoom(...) self:Room(...) end function DNAFixerRoom:commandEnteringPatient(patient) local staff = self.staff_member local dna_fixer, pat_x, pat_y = self.world:findObjectNear(patient, "dna_fixer") local console, stf_x, stf_y = self.world:findObjectNear(staff, "console") local --[[persistable:dna_fixer_shared_loop_callback]] function loop_callback() -- If the other humanoid has already started to idle we move on if staff:getCurrentAction().name == "idle" and patient:getCurrentAction().name == "idle" then -- We need to change to another type before starting, to be able -- to have different animations depending on gender. patient:setType(patient.change_into) local fixer_after_use = --[[persistable:dna_fixer_after_use]] function() self:dealtWithPatient(patient) staff:setNextAction(MeanderAction()) end patient:setNextAction(UseObjectAction(dna_fixer):setProlongedUsage(false) :setAfterUse(fixer_after_use)) staff:setNextAction(UseObjectAction(console)) end end -- As soon as one starts to idle the callback is called to see if the other one is already idling. patient:walkTo(pat_x, pat_y) patient:queueAction(IdleAction():setDirection(dna_fixer.direction == "north" and "north" or "west") :setLoopCallback(loop_callback)) staff:walkTo(stf_x, stf_y) staff:queueAction(IdleAction():setDirection(console.direction == "north" and "north" or "west") :setLoopCallback(loop_callback)) return Room.commandEnteringPatient(self, patient) end return room CorsixTH-0.63/CorsixTH/Lua/rooms/electrolysis.lua000066400000000000000000000107311347163623700217720ustar00rootroot00000000000000--[[ Copyright (c) 2009 Edvin "Lego3" Linge 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. --]] local room = {} room.id = "electrolysis" room.level_config_id = 23 room.class = "ElectrolysisRoom" room.name = _S.rooms_short.electrolysis room.long_name = _S.rooms_long.electrolysis room.tooltip = _S.tooltip.rooms.electrolysis room.objects_additional = { "extinguisher", "radiator", "plant", "bin" } room.objects_needed = { electrolyser = 1, console = 1 } room.build_preview_animation = 930 room.categories = { clinics = 5, } room.minimum_size = 5 room.wall_type = "blue" room.floor_tile = 17 room.required_staff = { Doctor = 1, } room.maximum_staff = room.required_staff room.call_sound = "reqd019.wav" room.handyman_call_sound = "maint008.wav" class "ElectrolysisRoom" (Room) ---@type ElectrolysisRoom local ElectrolysisRoom = _G["ElectrolysisRoom"] function ElectrolysisRoom:ElectrolysisRoom(...) self:Room(...) end function ElectrolysisRoom:commandEnteringPatient(patient) local staff = self.staff_member local electrolyser, pat_x, pat_y = self.world:findObjectNear(patient, "electrolyser") local console, stf_x, stf_y = self.world:findObjectNear(staff, "console") local --[[persistable:electrolysis_shared_loop_callback]] function loop_callback() -- If the other humanoid has already started to idle we move on if staff:getCurrentAction().name == "idle" and patient:getCurrentAction().name == "idle" then -- Skilled doctors require less electrocutions local num_electrocutions = math.random(1, 5) * (2 - staff.profile.skill) -- We need to change to another type before starting, to be able -- to have different animations depending on gender. if math.random(0, 1) == 1 then patient:setType("Standard Male Patient") -- Other attributes already set else patient:setType("Standard Female Patient") patient:setLayer(0, math.random(1, 4) * 2) patient:setLayer(1, math.random(0, 3) * 2) patient:setLayer(2, 0) end local loop_callback_electrolysis = --[[persistable:electrolysis_loop_callback]] function(action) num_electrocutions = num_electrocutions - 1 if num_electrocutions <= 0 then -- Tired doctors can continue electrocuting for a bit too long... -- Fatigue 0.00 - normal number of electrocutions -- Fatigue 0.45 - normal number of electrocutions -- Fatigue 0.80 - expect 1 extra electrocution -- Fatigue 1.00 - expect 9 extra electrocutions if math.random() <= 0.1 + 2 * (1 - staff.attributes["fatigue"]) then action.prolonged_usage = false end end end local after_electrolysis = --[[persistable:electrolysis_after_use]] function() self:dealtWithPatient(patient) staff:setNextAction(MeanderAction()) end patient:setNextAction(UseObjectAction(electrolyser):setLoopCallback(loop_callback_electrolysis) :setAfterUse(after_electrolysis)) staff:setNextAction(UseObjectAction(console)) end end -- As soon as one starts to idle the callback is called to see if the other one is already idling. patient:walkTo(pat_x, pat_y) patient:queueAction(IdleAction():setDirection(electrolyser.direction == "north" and "east" or "south") :setLoopCallback(loop_callback)) staff:walkTo(stf_x, stf_y) staff:queueAction(IdleAction():setDirection(console.direction == "north" and "east" or "south") :setLoopCallback(loop_callback)) return Room.commandEnteringPatient(self, patient) end return room CorsixTH-0.63/CorsixTH/Lua/rooms/fracture_clinic.lua000066400000000000000000000051561347163623700224120ustar00rootroot00000000000000--[[ Copyright (c) 2009 Peter "Corsix" Cawley 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. --]] local room = {} room.id = "fracture_clinic" room.level_config_id = 21 room.class = "FractureRoom" room.name = _S.rooms_short.fracture_clinic room.long_name = _S.rooms_long.fracture_clinic room.tooltip = _S.tooltip.rooms.fracture_clinic room.objects_additional = { "extinguisher", "radiator", "plant", "bin" } room.objects_needed = { cast_remover = 1 } room.build_preview_animation = 5072 room.categories = { clinics = 3, } room.minimum_size = 4 room.wall_type = "blue" room.floor_tile = 17 room.required_staff = { Nurse = 1, } room.maximum_staff = room.required_staff room.call_sound = "reqd004.wav" room.handyman_call_sound = "maint014.wav" class "FractureRoom" (Room) ---@type FractureRoom local FractureRoom = _G["FractureRoom"] function FractureRoom:FractureRoom(...) self:Room(...) end function FractureRoom:commandEnteringPatient(patient) local staff = self.staff_member local cast, pat_x, pat_y = self.world:findObjectNear(patient, "cast_remover") local stf_x, stf_y = cast:getSecondaryUsageTile() staff:walkTo(stf_x, stf_y) staff:queueAction(IdleAction():setDirection(cast.direction == "north" and "west" or "north")) patient:walkTo(pat_x, pat_y) local after_fracture = --[[persistable:fracture_clinic_after_use]] function() patient:setLayer(2, 0) -- Remove casts patient:setLayer(3, 0) patient:setLayer(4, 0) staff:setNextAction(MeanderAction()) self:dealtWithPatient(patient) end patient:queueAction(MultiUseObjectAction(cast, staff):setAfterUse(after_fracture)) return Room.commandEnteringPatient(self, patient) end return room CorsixTH-0.63/CorsixTH/Lua/rooms/general_diag.lua000066400000000000000000000072061347163623700216550ustar00rootroot00000000000000--[[ Copyright (c) 2009 Peter "Corsix" Cawley 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. --]] local room = {} room.id = "general_diag" room.level_config_id = 27 room.class = "GeneralDiagRoom" room.name = _S.rooms_short.general_diag room.long_name = _S.rooms_long.general_diag room.tooltip = _S.tooltip.rooms.general_diag room.objects_additional = { "extinguisher", "radiator", "plant", "bin" } room.objects_needed = { screen = 1, crash_trolley = 1 } room.build_preview_animation = 916 room.categories = { diagnosis = 2, } room.minimum_size = 5 room.wall_type = "green" room.floor_tile = 21 room.required_staff = { Doctor = 1, } room.maximum_staff = room.required_staff room.call_sound = "reqd021.wav" class "GeneralDiagRoom" (Room) ---@type GeneralDiagRoom local GeneralDiagRoom = _G["GeneralDiagRoom"] function GeneralDiagRoom:GeneralDiagRoom(...) self:Room(...) end function GeneralDiagRoom:commandEnteringPatient(patient) local screen, sx, sy = self.world:findObjectNear(patient, "screen") patient:walkTo(sx, sy) local after_use_screen1 = --[[persistable:general_diag_screen_after_use1]] function() local staff = self.staff_member local trolley, cx, cy = self.world:findObjectNear(patient, "crash_trolley") staff:walkTo(trolley:getSecondaryUsageTile()) local staff_idle = IdleAction() staff:queueAction(staff_idle) patient:walkTo(cx, cy, true) local after_use_trolley = --[[persistable:general_diag_trolley_after_use]] function() if #staff.action_queue == 1 then staff:setNextAction(MeanderAction()) else staff:finishAction(staff_idle) end end patient:queueAction(MultiUseObjectAction(trolley, staff):setMustHappen(false) :setProlongedUsage(false):setAfterUse(after_use_trolley)) patient:queueAction(WalkAction(sx, sy):setIsLeaving(true):setMustHappen(false):disableTruncate()) local after_use_screen2 = --[[persistable:general_diag_screen_after_use2]] function() if #patient.action_queue == 1 then self:dealtWithPatient(patient) end end patient:queueAction(UseScreenAction(screen):setIsLeaving(true):setMustHappen(true) :setAfterUse(after_use_screen2)) end patient:queueAction(UseScreenAction(screen):setAfterUse(after_use_screen1)) return Room.commandEnteringPatient(self, patient) end function GeneralDiagRoom:onHumanoidLeave(humanoid) if self.staff_member == humanoid then self.staff_member = nil end Room.onHumanoidLeave(self, humanoid) end function GeneralDiagRoom:makeHumanoidLeave(humanoid) self:makeHumanoidDressIfNecessaryAndThenLeave(humanoid) end function GeneralDiagRoom:shouldHavePatientReenter(patient) return not patient:isLeaving() end return room CorsixTH-0.63/CorsixTH/Lua/rooms/gp.lua000066400000000000000000000170211347163623700176560ustar00rootroot00000000000000--[[ Copyright (c) 2009 Peter "Corsix" Cawley 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. --]] local room = {} room.id = "gp" room.level_config_id = 7 room.class = "GPRoom" room.name = _S.rooms_short.gps_office room.long_name = _S.rooms_long.gps_office room.tooltip = _S.tooltip.rooms.gps_office room.objects_additional = { "extinguisher", "radiator", "plant", "bin" } room.objects_needed = { desk = 1, cabinet = 1, chair = 1 } room.build_preview_animation = 900 room.categories = { diagnosis = 1, } room.minimum_size = 4 room.wall_type = "white" room.floor_tile = 18 room.required_staff = { Doctor = 1, } room.maximum_staff = room.required_staff room.call_sound = "reqd008.wav" class "GPRoom" (Room) ---@type GPRoom local GPRoom = _G["GPRoom"] function GPRoom:GPRoom(...) self:Room(...) end function GPRoom:doStaffUseCycle(humanoid) local obj, ox, oy = self.world:findObjectNear(humanoid, "cabinet") humanoid:walkTo(ox, oy) humanoid:queueAction(UseObjectAction(obj)) obj, ox, oy = self.world:findObjectNear(humanoid, "desk") humanoid:queueAction(WalkAction(ox, oy)) -- A skilled doctor requires less time at the desk to diagnose the patient local inv_skill = 1 - humanoid.profile.skill local desk_use_time = math.random(math.floor(3 + 5 * inv_skill), math.ceil (8 + 10 * inv_skill)) local gp_loop_callback = --[[persistable:gp_loop_callback]] function() desk_use_time = desk_use_time - 1 if desk_use_time == 0 then -- Consultants who aren't tired might not need to stretch their legs -- to remain alert, so might just remain at the desk and deal with the -- next patient quicker. if humanoid.profile.is_consultant and math.random() >= humanoid.attributes.fatigue then desk_use_time = math.random(7, 14) else self:doStaffUseCycle(humanoid) end local patient = self:getPatient() if patient then if math.random() <= (0.7 + 0.3 * humanoid.profile.skill) or self.max_times <= 0 then if patient.user_of and not class.is(patient.user_of, Door) then self:dealtWithPatient(patient) end else self.max_times = self.max_times - 1 end end end end humanoid:queueAction(UseObjectAction(obj):setLoopCallback(gp_loop_callback)) end function GPRoom:commandEnteringStaff(humanoid) self.staff_member = humanoid self:doStaffUseCycle(humanoid) return Room.commandEnteringStaff(self, humanoid, true) end function GPRoom:commandEnteringPatient(humanoid) local obj, ox, oy = self.world:findObjectNear(humanoid, "chair") humanoid:walkTo(ox, oy) humanoid:queueAction(UseObjectAction(obj)) self.max_times = 3 return Room.commandEnteringPatient(self, humanoid) end function GPRoom:shouldHavePatientReenter(patient) return not patient.diagnosed and Room.shouldHavePatientReenter(self, patient) end function GPRoom:dealtWithPatient(patient) patient = patient or self:getPatient() -- If patients are slow to leave the chair, and staff are quick in their -- usage cycle, then dealtWithPatient() might get called twice for the -- same patient, in which case the second call must be ignored (otherwise -- if the first call resulted in the patient being diagnosed, the following -- logic would cause the patient to leave the room and stand indefinitely). if patient == self.just_dealt_with then return else self.just_dealt_with = patient end patient:setNextAction(self:createLeaveAction()) patient:addToTreatmentHistory(self.room_info) -- If the patient got sent to the wrong room and needs telling where -- to go next - this happens when a disease changes for an epidemic if patient.needs_redirecting then self:sendPatientToNextDiagnosisRoom(patient) patient.needs_redirecting = false elseif patient.disease and not patient.diagnosed then self.hospital:receiveMoneyForTreatment(patient) patient:completeDiagnosticStep(self) if patient.diagnosis_progress >= self.hospital.policies["stop_procedure"] then patient:setDiagnosed() if patient:agreesToPay(patient.disease.id) then patient:queueAction(SeekRoomAction(patient.disease.treatment_rooms[1]):enableTreatmentRoom()) else patient:goHome("over_priced", patient.disease.id) end self.staff_member:setMood("idea3", "activate") -- Show the light bulb over the doctor -- Check if this disease has just been discovered if not self.hospital.disease_casebook[patient.disease.id].discovered then self.hospital.research:discoverDisease(patient.disease) end else self:sendPatientToNextDiagnosisRoom(patient) end else patient:queueAction(MeanderAction():setCount(2)) patient:queueAction(IdleAction()) end if self.dealt_patient_callback then self.dealt_patient_callback(self.waiting_staff_member) end if self.staff_member then self:setStaffMembersAttribute("dealing_with_patient", false) end -- Maybe the staff member can go somewhere else self:findWorkForStaff() end function GPRoom:sendPatientToNextDiagnosisRoom(patient) if #patient.available_diagnosis_rooms == 0 then -- The very rare case where the patient has visited all his/her possible diagnosis rooms -- There's not much to do then... Send home patient:goHome("kicked") patient:updateDynamicInfo(_S.dynamic_info.patient.actions.no_diagnoses_available) else self.staff_member:setMood("reflexion", "activate") -- Show the uncertainty mood over the doctor local next_room_id = math.random(1, #patient.available_diagnosis_rooms) local next_room = patient.available_diagnosis_rooms[next_room_id] if patient:agreesToPay("diag_" .. next_room) then patient:queueAction(SeekRoomAction(next_room):setDiagnosisRoom(next_room_id)) else patient:goHome("over_priced", "diag_" .. next_room) end end end function GPRoom:onHumanoidLeave(humanoid) -- Reset moods when either the patient or the doctor leaves the room. if humanoid.humanoid_class ~= "Handyman" then for staff, _ in pairs(self.humanoids) do staff:setMood("idea3", "deactivate") staff:setMood("reflexion", "deactivate") end end if self.staff_member == humanoid then self.staff_member = nil end if self.just_dealt_with == humanoid then self.just_dealt_with = nil end Room.onHumanoidLeave(self, humanoid) end function GPRoom:roomFinished() if not self.hospital:hasStaffOfCategory("Doctor") and not self.world.ui.start_tutorial then self.world.ui.adviser:say(_A.room_requirements.gps_office_need_doctor) end return Room.roomFinished(self) end return room CorsixTH-0.63/CorsixTH/Lua/rooms/hair_restoration.lua000066400000000000000000000065461347163623700226360ustar00rootroot00000000000000--[[ Copyright (c) 2010 Miika-Petteri Matikainen 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. --]] local room = {} room.id = "hair_restoration" room.level_config_id = 19 room.class = "HairRestorationRoom" room.name = _S.rooms_short.hair_restoration room.long_name = _S.rooms_long.hair_restoration room.tooltip = _S.tooltip.rooms.hair_restoration room.objects_additional = { "extinguisher", "radiator", "plant", "bin" } room.objects_needed = { hair_restorer = 1, console = 1 } room.build_preview_animation = 5074 room.categories = { clinics = 4, } room.minimum_size = 4 room.wall_type = "blue" room.floor_tile = 17 room.required_staff = { Doctor = 1, } room.maximum_staff = room.required_staff room.call_sound = "reqd016.wav" room.handyman_call_sound = "maint007.wav" class "HairRestorationRoom" (Room) ---@type HairRestorationRoom local HairRestorationRoom = _G["HairRestorationRoom"] function HairRestorationRoom:HairRestorationRoom(...) self:Room(...) end function HairRestorationRoom:commandEnteringPatient(patient) local staff = self.staff_member local hair_restorer, pat_x, pat_y = self.world:findObjectNear(patient, "hair_restorer") local console, stf_x, stf_y = self.world:findObjectNear(staff, "console") local --[[persistable:hair_restoration_shared_loop_callback]] function loop_callback() if staff:getCurrentAction().name == "idle" and patient:getCurrentAction().name == "idle" then local loop_callback_restore = --[[persistable:hair_restoration_loop_callback]] function(action) action.prolonged_usage = false end local after_use_restore = --[[persistable:hair_restoration_after_use]] function() patient:setLayer(0, patient.layers[0] + 2) -- Change to normal hair staff:setNextAction(MeanderAction()) self:dealtWithPatient(patient) end patient:setNextAction(UseObjectAction(hair_restorer) :setLoopCallback(loop_callback_restore):setAfterUse(after_use_restore)) staff:setNextAction(UseObjectAction(console)) end end patient:walkTo(pat_x, pat_y) patient:queueAction(IdleAction():setDirection(hair_restorer.direction == "north" and "east" or "south") :setLoopCallback(loop_callback)) staff:walkTo(stf_x, stf_y) staff:queueAction(IdleAction():setDirection(console.direction == "north" and "east" or "south") :setLoopCallback(loop_callback)) return Room.commandEnteringPatient(self, patient) end return room CorsixTH-0.63/CorsixTH/Lua/rooms/inflation.lua000066400000000000000000000051711347163623700212360ustar00rootroot00000000000000--[[ Copyright (c) 2009 Peter "Corsix" Cawley 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. --]] local room = {} room.id = "inflation" room.level_config_id = 17 room.class = "InflationRoom" room.name = _S.rooms_short.inflation room.long_name = _S.rooms_long.inflation room.tooltip = _S.tooltip.rooms.inflation room.objects_additional = { "extinguisher", "radiator", "plant", "bin" } room.objects_needed = { inflator = 1 } room.build_preview_animation = 908 room.categories = { clinics = 1, } room.minimum_size = 4 room.wall_type = "blue" room.floor_tile = 17 room.required_staff = { Doctor = 1, } room.maximum_staff = room.required_staff room.call_sound = "reqd014.wav" room.handyman_call_sound = "maint013.wav" class "InflationRoom" (Room) ---@type InflationRoom local InflationRoom = _G["InflationRoom"] function InflationRoom:InflationRoom(...) self:Room(...) end function InflationRoom:commandEnteringPatient(patient) local staff = self.staff_member local inflator, pat_x, pat_y = self.world:findObjectNear(patient, "inflator") local stf_x, stf_y = inflator:getSecondaryUsageTile() staff:setNextAction(WalkAction(stf_x, stf_y)) staff:queueAction(IdleAction():setDirection(inflator.direction == "north" and "east" or "south")) patient:setNextAction(WalkAction(pat_x, pat_y)) local inflation_after_use = --[[persistable:inflation_after_use]] function() patient:setLayer(0, patient.layers[0] - 10) -- Change to normal head staff:setNextAction(MeanderAction()) self:dealtWithPatient(patient) end patient:queueAction(MultiUseObjectAction(inflator, staff):setAfterUse(inflation_after_use)) return Room.commandEnteringPatient(self, patient) end return room CorsixTH-0.63/CorsixTH/Lua/rooms/jelly_vat.lua000066400000000000000000000051231347163623700212410ustar00rootroot00000000000000--[[ Copyright (c) 2010 Manuel "Roujin" Wolf 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. --]] local room = {} room.id = "jelly_vat" room.level_config_id = 24 room.class = "JellyVatRoom" room.name = _S.rooms_short.jelly_vat room.long_name = _S.rooms_long.jelly_vat room.tooltip = _S.tooltip.rooms.jelly_vat room.objects_additional = { "extinguisher", "radiator", "plant", "bin" } room.objects_needed = { jelly_moulder = 1 } room.build_preview_animation = 928 room.categories = { clinics = 7, } room.minimum_size = 4 room.wall_type = "blue" room.floor_tile = 17 room.required_staff = { Doctor = 1, } room.maximum_staff = room.required_staff room.call_sound = "reqd020.wav" room.handyman_call_sound = "maint009.wav" class "JellyVatRoom" (Room) ---@type JellyVatRoom local JellyVatRoom = _G["JellyVatRoom"] function JellyVatRoom:JellyVatRoom(...) self:Room(...) end function JellyVatRoom:commandEnteringPatient(patient) local staff = self.staff_member local moulder, stf_x, stf_y = self.world:findObjectNear(patient, "jelly_moulder") local pat_x, pat_y = moulder:getSecondaryUsageTile() staff:setNextAction(WalkAction(stf_x, stf_y)) local jellyvat_after_use = --[[persistable:jelly_vat_after_use]] function() staff:setNextAction(MeanderAction()) self:dealtWithPatient(patient) end staff:queueAction(MultiUseObjectAction(moulder, patient):setInvisiblePhaseSpan({-3, 4}) :setAfterUse(jellyvat_after_use)) patient:setNextAction(WalkAction(pat_x, pat_y)) patient:queueAction(IdleAction():setDirection(moulder.direction == "north" and "west" or "north")) return Room.commandEnteringPatient(self, patient) end return room CorsixTH-0.63/CorsixTH/Lua/rooms/operating_theatre.lua000066400000000000000000000332611347163623700227600ustar00rootroot00000000000000--[[ Copyright (c) 2010 Peter "Corsix" Cawley 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. --]] local room = {} room.id = "operating_theatre" room.level_config_id = 10 room.class = "OperatingTheatreRoom" room.name = _S.rooms_short.operating_theatre room.long_name = _S.rooms_long.operating_theatre room.tooltip = _S.tooltip.rooms.operating_theatre room.objects_additional = { "extinguisher", "radiator", "plant", "bin" } room.objects_needed = { operating_table = 1, surgeon_screen = 1, op_sink1 = 1, x_ray_viewer = 1 } room.build_preview_animation = 5080 room.categories = { treatment = 3, } room.minimum_size = 6 room.wall_type = "white" room.floor_tile = 21 room.swing_doors = true room.required_staff = { Surgeon = 2, } room.call_sound = "reqd010.wav" -- TODO: There is also an unused sound -- "Another surgeon needed [...]", reqd011.wav -- room.handyman_call_sound = "maint007.wav" TODO: No sound for this room? class "OperatingTheatreRoom" (Room) ---@type OperatingTheatreRoom local OperatingTheatreRoom = _G["OperatingTheatreRoom"] function OperatingTheatreRoom:OperatingTheatreRoom(...) self:Room(...) self.staff_member_set = {} end function OperatingTheatreRoom:roomFinished() -- Find the X-ray viewer local fx, fy = self:getEntranceXY(true) local objects = self.world:findAllObjectsNear(fx, fy) for object in pairs(objects) do local id = object.object_type.id if id == "x_ray_viewer" then self[id] = object end end -- Tell the player what is missing, if anything. if not self.hospital:hasRoomOfType("ward") then self.world.ui.adviser:say(_A.room_requirements.op_need_ward) end if not self.hospital:hasStaffOfCategory("Surgeon") then self.world.ui.adviser:say(_A.room_requirements.op_need_two_surgeons) elseif self.hospital:hasStaffOfCategory("Surgeon") == 1 then self.world.ui.adviser:say(_A.room_requirements.op_need_another_surgeon) end return Room.roomFinished(self) end local function wait_for_object(humanoid, obj, must_happen) assert(type(must_happen) == "boolean", "must happen must be true or false") local loop_callback_wait = --[[persistable:operatring_theatre_wait]] function(action) if action.todo_interrupt or not obj.user then humanoid:finishAction(action) else humanoid:queueAction(IdleAction():setCount(5):setMustHappen(true), 0) end end return IdleAction():setMustHappen(must_happen):setLoopCallback(loop_callback_wait) end --! Returns true if an operation is ongoing function OperatingTheatreRoom:isOperating() for k, _ in pairs(self.staff_member_set) do if k:getCurrentAction().name == "multi_use_object" then return true end end return false end --! Builds the second operation action (i.e. with the surgeon whose we --! see the back). Called either when the operation starts or when the --! operation is resumed after interruption caused by the picking up of --! the second surgeon. --! Note: Must be part of OperatingTheatreRoom and not a local function --! because of the use in the persisted callback function operation_standby. --!param multi_use (action): the first operation action (built with via buildTableAction1()). --!param operation_table_b (OperatingTable): slave object representing the operation table. function OperatingTheatreRoom._buildTableAction2(multi_use, operation_table_b) local num_loops = math.random(2, 5) local loop_callback_use_object = --[[persistable:operatring_theatre_use_callback]] function(action) num_loops = num_loops - 1 if num_loops <= 0 then action.prolonged_usage = false end end local after_use_use_object = --[[persistable:operatring_theatre_after_use]] function() multi_use.prolonged_usage = false end return UseObjectAction(operation_table_b):setLoopCallback(loop_callback_use_object) :setAfterUse(after_use_use_object):setMustHappen(true):disableTruncate() end function OperatingTheatreRoom:commandEnteringStaff(staff) -- Put surgeon outfit on local screen, screen_x, screen_y = self.world:findObjectNear(staff, "surgeon_screen") staff:walkTo(screen_x, screen_y) staff:queueAction(wait_for_object(staff, screen, false)) staff:queueAction(UseScreenAction(screen)) -- Resume operation if already ongoing if self:isOperating() then local surgeon1 = next(self.staff_member_set) local ongoing_action = surgeon1:getCurrentAction() assert(ongoing_action.name == "multi_use_object") local table, table_x, table_y = self.world:findObjectNear(staff, "operating_table_b") self:queueWashHands(staff) staff:queueAction(WalkAction(table_x, table_y)) staff:queueAction(self._buildTableAction2(ongoing_action, table)) end self.staff_member_set[staff] = true -- Wait around for patients local loop_callback_more_patients = --[[persistable:operatring_theatre_after_surgeon_clothes_on]] function() self.staff_member_set[staff] = "ready" self:tryAdvanceQueue() end staff:queueAction(MeanderAction():setMustHappen(true):setLoopCallback(loop_callback_more_patients)) -- Ensure that surgeons turn back into doctors when they leave staff:queueAction(WalkAction(screen_x, screen_y):setMustHappen(true):setIsLeaving(true) :truncateOnHighPriority()) staff:queueAction(UseScreenAction(screen):setMustHappen(true):setIsLeaving(true)) return Room.commandEnteringStaff(self, staff, true) end function OperatingTheatreRoom:setStaffMembersAttribute(attribute, value) for staff_member, _ in pairs(self.staff_member_set) do staff_member[attribute] = value end end -- Returns the current staff member. if there are currently two surgeons it returns -- the one with higher tiredness. function OperatingTheatreRoom:getStaffMember() local staff for staff_member, _ in pairs(self.staff_member_set) do if staff and not staff_member.fired and not staff_member:hasLeavingAction() then if staff.attributes["fatigue"] < staff_member.attributes["fatigue"] then staff = staff_member end else if not staff_member.fired and not staff_member:hasLeavingAction() then staff = staff_member end end end return staff end --! Builds the first operation action (i.e. with the surgeon whose we see the front). --!param surgeon1 (Staff): the surgeon who does this operation action. He must --! be the same as the surgeon who gets the action on his queue. --!param patient (Patient): the patient to be operated. --!param operation_table (OperatingTable): master object representing --! the operation table. function OperatingTheatreRoom:buildTableAction1(surgeon1, patient, operation_table) local loop_callback_multi_use = --[[persistable:operatring_theatre_multi_use_callback]] function(_) -- dirty hack to make the truncated animation work surgeon1.animation_idx = nil end local after_use_table = --[[persistable:operatring_theatre_table_after_use]] function() self:dealtWithPatient(patient) -- Tell the patient that it's time to leave, but only if the first action -- is really an idle action. if patient:getCurrentAction().name == "idle" then patient:finishAction() end end return MultiUseObjectAction(operation_table, patient):setProlongedUsage(true) :setLoopCallback(loop_callback_multi_use):setAfterUse(after_use_table) :setMustHappen(true):disableTruncate() end --! Sends the surgeon to the nearest operation sink ("op_sink1") --! and makes him wash his hands --!param at_front (boolean): If true, add the actions at the front the action queue. --! Add the actions at the end of the queue otherwise. --! Default value is true. function OperatingTheatreRoom:queueWashHands(surgeon, at_front) local sink, sink_x, sink_y = self.world:findObjectNear(surgeon, "op_sink1") local walk = WalkAction(sink_x, sink_y):setMustHappen(true):disableTruncate() local wait = wait_for_object(surgeon, sink, true) local wash = UseObjectAction(sink):setMustHappen(true) for pos, action in pairs({walk, wait, wash}) do if (at_front) then surgeon:queueAction(action, pos) else surgeon:queueAction(action) end end end --! Turn on/off x-ray viewer - if it's been found --!param turn_on (boolean): true to switch on and false to switch off function OperatingTheatreRoom:setXRayOn(turn_on) if self.x_ray_viewer then self.x_ray_viewer:setLayer(11, (turn_on and 2 or 0)) end end function OperatingTheatreRoom:commandEnteringPatient(patient) -- Turn on x-ray viewer self:setXRayOn(true) -- Identify the staff local surgeon1 = next(self.staff_member_set) local surgeon2 = next(self.staff_member_set, surgeon1) assert(surgeon1 and surgeon2, "Not enough staff in operating theatre") -- Patient changes into surgical gown local screen, sx, sy = self.world:findObjectNear(patient, "surgeon_screen") patient:walkTo(sx, sy) patient:queueAction(UseScreenAction(screen)) -- Meanwhile, surgeons wash their hands -- TODO: They sometimes overlap each other when doing that. Can we avoid that? self:queueWashHands(surgeon1, true) self:queueWashHands(surgeon2, true) local num_ready = {0} ----- BEGIN Save game compatibility ----- -- These function are merely for save game compatibility. -- And they does not participate in the current game logic. -- Do not move or edit local --[[persistable:operatring_theatre_wait_for_ready]] function wait_for_ready(action) action.on_interrupt = nil if not action.done_ready then num_ready[1] = num_ready[1] + 1 action.done_ready = true end if num_ready[1] == 3 then surgeon1:finishAction() surgeon2:finishAction() end end local after_use = --[[persistable:operatring_theatre_after_multi_use]] function() self:dealtWithPatient(patient) patient:finishAction() end ----- END Save game compatibility ----- local --[[persistable:operatring_theatre_operation_standby]] function operation_standby(action, humanoid) action.on_interrupt = nil if not action.done_ready then num_ready[1] = num_ready[1] + 1 action.done_ready = true end if self.staff_member_set[humanoid] and self.staff_member_set[humanoid] == "abort" then humanoid:finishAction() elseif num_ready[1] == 3 then -- Only if everyone (2 Surgeons and Patient) ready, we schedule the operation action local obj, _, _ = self.world:findObjectNear(surgeon1, "operating_table") local table_action1 = self:buildTableAction1(surgeon1, patient, obj) surgeon1:queueAction(table_action1, 1) obj, _, _ = self.world:findObjectNear(surgeon2, "operating_table_b") surgeon2:queueAction(self._buildTableAction2(table_action1, obj), 1) -- Kick off surgeon1:finishAction() surgeon2:finishAction() end end ---- Everyone standby...and sync start the operation -- -- first surgeon walk over to the operating table local obj, ox, oy = self.world:findObjectNear(surgeon1, "operating_table") surgeon1:queueAction(WalkAction(ox, oy):setMustHappen(true):disableTruncate(), 4) surgeon1:queueAction(IdleAction():setLoopCallback(operation_standby):setMustHappen(true), 5) -- Patient walk to the side of the operating table ox, oy = obj:getSecondaryUsageTile() patient:queueAction(WalkAction(ox, oy):setMustHappen(true):disableTruncate()) patient:queueAction(IdleAction():setLoopCallback(operation_standby):setMustHappen(true)) -- Patient changes out of the gown afterwards patient:queueAction(WalkAction(sx, sy):setMustHappen(true):disableTruncate()) patient:queueAction(UseScreenAction(screen):setMustHappen(true)) -- Meanwhile, second surgeon walks over to other side of operating table local _ _, ox, oy = self.world:findObjectNear(surgeon1, "operating_table_b") surgeon2:queueAction(WalkAction(ox, oy):setMustHappen(true):disableTruncate(), 4) surgeon2:queueAction(IdleAction():setLoopCallback(operation_standby):setMustHappen(true), 5) return Room.commandEnteringPatient(self, patient) end function OperatingTheatreRoom:onHumanoidLeave(humanoid) self.staff_member_set[humanoid] = nil if class.is(humanoid, Patient) then -- Turn off x-ray viewer -- (FIXME: would be better when patient dress back?) self:setXRayOn(false) local surgeon1 = next(self.staff_member_set) local surgeon2 = next(self.staff_member_set, surgeon1) if surgeon1 then self.staff_member_set[surgeon1] = "abort" end if surgeon2 then self.staff_member_set[surgeon2] = "abort" end end return Room.onHumanoidLeave(self, humanoid) end function OperatingTheatreRoom:canHumanoidEnter(humanoid) local can = Room.canHumanoidEnter(self, humanoid) if can and class.is(humanoid, Patient) then -- Patients can only enter once all doctors are in surgeon clothes for staff, is_ready in pairs(self.staff_member_set) do if staff.humanoid_class == "Doctor" or is_ready ~= "ready" then return false end end end return can end return room CorsixTH-0.63/CorsixTH/Lua/rooms/pharmacy.lua000066400000000000000000000072551347163623700210640ustar00rootroot00000000000000--[[ Copyright (c) 2009 Peter "Corsix" Cawley 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. --]] local room = {} room.id = "pharmacy" room.level_config_id = 11 room.class = "PharmacyRoom" room.name = _S.rooms_short.pharmacy room.long_name = _S.rooms_long.pharmacy room.tooltip = _S.tooltip.rooms.pharmacy room.objects_additional = { "extinguisher", "radiator", "plant", "bin" } room.objects_needed = { pharmacy_cabinet = 1 } room.build_preview_animation = 5088 room.categories = { treatment = 4, } room.minimum_size = 4 room.wall_type = "white" room.floor_tile = 19 room.required_staff = { Nurse = 1, } room.maximum_staff = room.required_staff room.call_sound = "reqd012.wav" class "PharmacyRoom" (Room) ---@type PharmacyRoom local PharmacyRoom = _G["PharmacyRoom"] function PharmacyRoom:PharmacyRoom(...) self:Room(...) end function PharmacyRoom:roomFinished() if not self.hospital:hasStaffOfCategory("Nurse") then self.world.ui.adviser:say(_A.room_requirements.pharmacy_need_nurse) end return Room.roomFinished(self) end function PharmacyRoom:commandEnteringPatient(patient) local staff = self.staff_member local cabinet, stf_x, stf_y = self.world:findObjectNear(patient, "pharmacy_cabinet") local pat_x, pat_y local orientation = cabinet.object_type.orientations[cabinet.direction] pat_x = stf_x - orientation.use_position[1] + orientation.use_position_secondary[1] pat_y = stf_y - orientation.use_position[2] + orientation.use_position_secondary[2] local layer3 local patient_class = patient.humanoid_class if patient_class == "Standard Female Patient" or patient_class == "Transparent Female Patient" then -- Female patients cannot use flask colour 2, as in their idle animation, -- layer 3 item 2 is a bandage. layer3 = math.random(0, 1) * 4 else layer3 = math.random(0, 2) * 2 end patient:setNextAction(WalkAction(pat_x, pat_y)) patient:queueAction(IdleAction():setDirection(cabinet.direction == "north" and "east" or "south")) staff:setNextAction(WalkAction(stf_x, stf_y)) local after_use_pharmacy = --[[persistable:pharmacy_after_use]] function() --if we haven't tried to edit the room while she's animating, meander if #staff.action_queue == 1 then staff:setNextAction(MeanderAction()) end if patient_class == "Invisible Patient" or patient_class == "Transparent Male Patient" then patient:setType "Standard Male Patient" elseif patient_class == "Transparent Female Patient" then patient:setType "Standard Female Patient" end self:dealtWithPatient(patient) end staff:queueAction(MultiUseObjectAction(cabinet, patient):setAfterUse(after_use_pharmacy) :setLayer3(layer3)) return Room.commandEnteringPatient(self, patient) end return room CorsixTH-0.63/CorsixTH/Lua/rooms/psych.lua000066400000000000000000000114511347163623700203770ustar00rootroot00000000000000--[[ Copyright (c) 2009 Peter "Corsix" Cawley 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. --]] local room = {} room.id = "psych" room.level_config_id = 8 room.class = "PsychRoom" room.name = _S.rooms_short.psychiatric room.long_name = _S.rooms_long.psychiatric room.tooltip = _S.tooltip.rooms.psychiatry room.objects_additional = { "extinguisher", "radiator", "plant", "bin", "bookcase", "skeleton" } room.objects_needed = { screen = 1, couch = 1, comfortable_chair = 1 } room.build_preview_animation = 924 room.categories = { treatment = 1, diagnosis = 8, } room.minimum_size = 5 room.wall_type = "white" room.floor_tile = 18 room.required_staff = { Psychiatrist = 1, } room.maximum_staff = room.required_staff room.call_sound = "reqd003.wav" class "PsychRoom" (Room) ---@type PsychRoom local PsychRoom = _G["PsychRoom"] function PsychRoom:PsychRoom(...) self:Room(...) end function PsychRoom:roomFinished() if not self.hospital:hasStaffOfCategory("Psychiatrist") then self.world.ui.adviser :say(_A.room_requirements.psychiatry_need_psychiatrist) end return Room.roomFinished(self) end function PsychRoom:commandEnteringStaff(staff) self.staff_member = staff local obj, ox, oy = self.world:findFreeObjectNearToUse(staff, "bookcase", "near") if not obj then staff:setNextAction(MeanderAction()) else staff:walkTo(ox, oy) staff:queueAction(UseObjectAction(obj)) local num_meanders = math.random(2, 8) local loop_callback_meanders = --[[persistable:psych_meander_loop_callback]] function(action) num_meanders = num_meanders - 1 if num_meanders == 0 then self:commandEnteringStaff(staff) end end staff:queueAction(MeanderAction():setLoopCallback(loop_callback_meanders)) end return Room.commandEnteringStaff(self, staff, true) end function PsychRoom:commandEnteringPatient(patient) local staff = self.staff_member local obj, ox, oy = self.world:findObjectNear(patient, "couch") patient:walkTo(ox, oy) patient:queueAction(UseObjectAction(obj)) local duration = math.random(16, 72) local bookcase, bx, by local --[[persistable:psych_loop_callback]] function loop_callback() if bookcase == nil then bookcase, bx, by = self.world:findObjectNear(staff, "bookcase") end if patient and patient.user_of and patient.user_of.object_type.id == "couch" then duration = duration - 1 end if duration == 0 then if patient.diagnosed and patient.disease.id == "king_complex" then -- Diagnosed patients (Elvis) need to change clothes local after_use_screen = --[[persistable:psych_screen_after_use]] function() if self:getStaffMember() then self:getStaffMember():setNextAction(MeanderAction()) end self:dealtWithPatient(patient) end obj, ox, oy = self.world:findObjectNear(patient, "screen") patient:walkTo(ox, oy) patient:queueAction(UseScreenAction(obj):setAfterUse(after_use_screen)) else if self:getStaffMember() then self:getStaffMember():setNextAction(MeanderAction()) end self:dealtWithPatient(patient) end return else if patient:getRoom() ~= self and self:getStaffMember() then self:getStaffMember():setNextAction(MeanderAction()) return end end if bookcase and (duration % 10) == 0 and math.random(1, 2) == 1 then staff:walkTo(bx, by) staff:queueAction(UseObjectAction(bookcase)) staff:queueAction(WalkAction(ox, oy)) staff:queueAction(UseObjectAction(obj):setLoopCallback(loop_callback)) duration = math.max(8, duration - 72) end end obj, ox, oy = self.world:findObjectNear(staff, "comfortable_chair") staff:walkTo(ox, oy) staff:queueAction(UseObjectAction(obj):setLoopCallback(loop_callback)) return Room.commandEnteringPatient(self, patient) end return room CorsixTH-0.63/CorsixTH/Lua/rooms/research.lua000066400000000000000000000166131347163623700210520ustar00rootroot00000000000000--[[ Copyright (c) 2009 Manuel König 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. --]] local room = {} room.id = "research" room.level_config_id = 28 room.class = "ResearchRoom" room.name = _S.rooms_short.research_room room.long_name = _S.rooms_long.research_room room.tooltip = _S.tooltip.rooms.research_room room.objects_additional = { "extinguisher", "radiator", "plant", "bin", "computer", "desk", "cabinet", "analyser" } room.objects_needed = { desk = 1, cabinet = 1, autopsy = 1 } room.build_preview_animation = 5102 room.categories = { facilities = 2, } room.minimum_size = 5 room.wall_type = "green" room.floor_tile = 21 room.required_staff = { Researcher = 1, } room.call_sound = "reqd023.wav" class "ResearchRoom" (Room) ---@type ResearchRoom local ResearchRoom = _G["ResearchRoom"] function ResearchRoom:ResearchRoom(...) self:Room(...) self.staff_member_set = {} end local staff_usage_objects = { desk = true, cabinet = true, computer = true, analyser = true, -- Not autopsy: it should be free for when a patient arrives } function ResearchRoom:doStaffUseCycle(staff, previous_object) local obj, ox, oy = self.world:findFreeObjectNearToUse(staff, staff_usage_objects, "near", previous_object) if obj then obj.reserved_for = staff staff:walkTo(ox, oy) if obj.object_type.id == "desk" then local desk_use_time = math.random(7, 14) local loop_callback_desk = --[[persistable:research_desk_loop_callback]] function(action) desk_use_time = desk_use_time - 1 if action.todo_interrupt or desk_use_time == 0 then action.prolonged_usage = false end end local after_use_desk = --[[persistable:research_desk_after_use]] function() -- TODO: Should interactions give points? self.hospital.research:addResearchPoints(100) end staff:queueAction(UseObjectAction(obj):setLoopCallback(loop_callback_desk) :setAfterUse(after_use_desk)) else local after_use_obj = --[[persistable:research_obj_after_use]] function() if obj.object_type.id == "computer" then self.hospital.research:addResearchPoints(500) elseif obj.object_type.id == "analyser" then self.hospital.research:addResearchPoints(800) -- TODO: Balance value, find it in level config? end end staff:queueAction(UseObjectAction(obj):setAfterUse(after_use_obj)) end end local num_meanders = math.random(2, 4) local loop_callback_meander = --[[persistable:research_meander_loop_callback]] function(action) num_meanders = num_meanders - 1 if num_meanders == 0 then self:doStaffUseCycle(staff) end end staff:queueAction(MeanderAction():setLoopCallback(loop_callback_meander)) end function ResearchRoom:roomFinished() local fx, fy = self:getEntranceXY(true) local objects = self.world:findAllObjectsNear(fx, fy) local number = 0 for object, _ in pairs(objects) do -- The number of desks in the room determines how many researchers -- can work there at once. if object.object_type.id == "desk" then number = number + 1 end end self.maximum_staff = { Researcher = number, } -- Is this the first research department built? if not self.hospital.research_dep_built and not TheApp.using_demo_files then self.hospital.research_dep_built = true self.world.ui.adviser:say(_A.information.initial_general_advice .research_now_available) end -- Also check if it would be good to hire a researcher. if not self.hospital:hasStaffOfCategory("Researcher") then self.world.ui.adviser:say(_A.room_requirements.research_room_need_researcher) end return Room.roomFinished(self) end function ResearchRoom:getMaximumStaffCriteria() return self.maximum_staff end function ResearchRoom:commandEnteringStaff(staff) self.staff_member_set[staff] = true self:doStaffUseCycle(staff) return Room.commandEnteringStaff(self, staff, true) end function ResearchRoom:commandEnteringPatient(patient) local staff = self:getStaffMember() local autopsy, stf_x, stf_y = self.world:findObjectNear(patient, "autopsy") local pat_x, pat_y = autopsy:getSecondaryUsageTile() patient:walkTo(pat_x, pat_y) patient:queueAction(IdleAction():setDirection("east")) staff:walkTo(stf_x, stf_y) local after_use_autopsy = --[[persistable:autopsy_after_use]] function() self:commandEnteringStaff(staff) -- Patient dies :( self:onHumanoidLeave(patient) -- Some research is done. :) Might trigger a loss of reputation though. local hosp = self.hospital local patient_room = patient.disease.treatment_rooms[#patient.disease.treatment_rooms] hosp.research:addResearchPoints("dummy", patient_room) -- average morale of all staff affects chances local avg_happiness = hosp:getAverageStaffAttribute("happiness", nil) local autopsy_discovered -- low morale - more likely to discover if avg_happiness < 0.25 then autopsy_discovered = math.random(1,3) ~= 1 else autopsy_discovered = math.random(1,3) == 1 end if autopsy_discovered then hosp:changeReputation("autopsy_discovered") hosp.world.ui.adviser:say(_A.research.autopsy_discovered_rep_loss) end if patient.hospital then hosp:removePatient(patient) end patient.world:destroyEntity(patient) end staff:queueAction(MultiUseObjectAction(autopsy, patient):setAfterUse(after_use_autopsy)) return Room.commandEnteringPatient(self, patient) end -- Returns the staff member with the minimum amount of skill. function ResearchRoom:getStaffMember() local staff for staff_member, _ in pairs(self.staff_member_set) do if staff and not staff_member.fired and not staff_member:hasLeavingAction() then if staff.profile.skill > staff_member.profile.skill then staff = staff_member end else if not staff_member.fired and not staff_member:hasLeavingAction() then staff = staff_member end end end return staff end function ResearchRoom:setStaffMember(staff) self.staff_member_set[staff] = true end function ResearchRoom:setStaffMembersAttribute(attribute, value) for staff_member, _ in pairs(self.staff_member_set) do staff_member[attribute] = value end end function ResearchRoom:onHumanoidLeave(humanoid) self.staff_member_set[humanoid] = nil Room.onHumanoidLeave(self, humanoid) end function ResearchRoom:afterLoad(old, new) if old < 56 then self.hospital.research_dep_built = true end end return room CorsixTH-0.63/CorsixTH/Lua/rooms/scanner_room.lua000066400000000000000000000125641347163623700217440ustar00rootroot00000000000000--[[ Copyright (c) 2009 Manuel König 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. --]] local room = {} room.id = "scanner" room.level_config_id = 13 room.class = "ScannerRoom" room.name = _S.rooms_short.scanner room.long_name = _S.rooms_long.scanner room.tooltip = _S.tooltip.rooms.scanner room.objects_additional = { "extinguisher", "radiator", "plant", "bin" } room.objects_needed = { scanner = 1, console = 1, screen = 1 } room.build_preview_animation = 920 room.categories = { diagnosis = 4, } room.minimum_size = 5 room.wall_type = "yellow" room.floor_tile = 19 room.required_staff = { Doctor = 1, } room.maximum_staff = room.required_staff room.call_sound = "reqd002.wav" -- Handyman is called to "diagnosis machine", all other diagnosis rooms have -- their own, more specific handyman call though --room.handyman_call_sound = "maint011.wav" class "ScannerRoom" (Room) ---@type ScannerRoom local ScannerRoom = _G["ScannerRoom"] function ScannerRoom:ScannerRoom(...) self:Room(...) end function ScannerRoom:commandEnteringPatient(patient) local staff = self.staff_member local console, stf_x, stf_y = self.world:findObjectNear(staff, "console") local scanner, pat_x, pat_y = self.world:findObjectNear(patient, "scanner") local screen, sx, sy = self.world:findObjectNear(patient, "screen") local do_change = (patient.humanoid_class == "Standard Male Patient") or (patient.humanoid_class == "Standard Female Patient") local --[[persistable:scanner_shared_loop_callback]] function loop_callback() if staff:getCurrentAction().scanner_ready and patient:getCurrentAction().scanner_ready then staff:finishAction() patient:finishAction() end end staff:walkTo(stf_x, stf_y) local idle_action = IdleAction():setDirection(console.direction == "north" and "west" or "north") :setLoopCallback(loop_callback) idle_action.scanner_ready = true staff:queueAction(idle_action) staff:queueAction(UseObjectAction(console)) if do_change then patient:walkTo(sx, sy) patient:queueAction(UseScreenAction(screen)) patient:queueAction(WalkAction(pat_x, pat_y)) else patient:walkTo(pat_x, pat_y) end idle_action = IdleAction():setDirection(scanner.direction == "north" and "east" or "south") :setLoopCallback(loop_callback) idle_action.scanner_ready = true patient:queueAction(idle_action) local length = math.random(10, 20) * (2 - staff.profile.skill) local loop_callback_scan = --[[persistable:scanner_loop_callback]] function(action) if length <= 0 then action.prolonged_usage = false end length = length - 1 end local after_use_scan = --[[persistable:scanner_after_use]] function() if not self.staff_member or patient.going_home then -- If we aborted somehow, don't do anything here. -- The patient already has orders to change back if necessary and leave. -- makeHumanoidLeave() will make this function nil when it aborts the scanner's use. return end self.staff_member:setNextAction(MeanderAction()) self:dealtWithPatient(patient) end patient:queueAction(UseObjectAction(scanner):setLoopCallback(loop_callback_scan) :setAfterUse(after_use_scan)) return Room.commandEnteringPatient(self, patient) end function ScannerRoom:onHumanoidLeave(humanoid) if self.staff_member == humanoid then self.staff_member = nil end Room.onHumanoidLeave(self, humanoid) end function ScannerRoom:makeHumanoidLeave(humanoid) if humanoid:getCurrentAction().name == "use_object" and humanoid:getCurrentAction().object == self.world:findObjectNear(humanoid, "scanner") then humanoid:getCurrentAction().after_use = nil end self:makeHumanoidDressIfNecessaryAndThenLeave(humanoid) end function ScannerRoom:dealtWithPatient(patient) if string.find(patient.humanoid_class, "Stripped") then local screen, sx, sy = self.world:findObjectNear(patient, "screen") patient:setNextAction(WalkAction(sx, sy):setMustHappen(true):setIsLeaving(true) :disableTruncate()) local after_use_patient = --[[persistable:scanner_exit]] function() Room.dealtWithPatient(self, patient) end patient:queueAction(UseScreenAction(screen):setMustHappen(true):setIsLeaving(true) :setAfterUse(after_use_patient)) patient:queueAction(self:createLeaveAction()) else Room.dealtWithPatient(self, patient) end end function ScannerRoom:shouldHavePatientReenter(patient) return not patient:isLeaving() end return room CorsixTH-0.63/CorsixTH/Lua/rooms/slack_tongue.lua000066400000000000000000000054461347163623700217360ustar00rootroot00000000000000--[[ Copyright (c) 2009 Edvin "Lego3" Linge 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. --]] local room = {} room.id = "slack_tongue" room.level_config_id = 20 room.class = "SlackTongueRoom" room.name = _S.rooms_short.tongue_clinic room.long_name = _S.rooms_long.tongue_clinic room.tooltip = _S.tooltip.rooms.tongue_clinic room.objects_additional = { "extinguisher", "radiator", "plant", "bin" } room.objects_needed = { slicer = 1 } room.build_preview_animation = 932 room.categories = { clinics = 2, } room.minimum_size = 4 room.wall_type = "blue" room.floor_tile = 17 room.required_staff = { Doctor = 1, } room.maximum_staff = room.required_staff room.call_sound = "reqd005.wav" room.handyman_call_sound = "maint004.wav" class "SlackTongueRoom" (Room) ---@type SlackTongueRoom local SlackTongueRoom = _G["SlackTongueRoom"] function SlackTongueRoom:SlackTongueRoom(...) self:Room(...) end function SlackTongueRoom:commandEnteringPatient(patient) local staff = self.staff_member local slicer, pat_x, pat_y = self.world:findObjectNear(patient, "slicer") local stf_x, stf_y = slicer:getSecondaryUsageTile() staff:setNextAction(WalkAction(stf_x, stf_y)) staff:queueAction(IdleAction():setDirection(slicer.direction == "north" and "east" or "south")) patient:setNextAction(WalkAction(pat_x, pat_y)) local after_use_slack_tongue = --[[persistable:slack_tongue_after_use]] function() if patient.humanoid_class == "Slack Male Patient" then patient:setType "Standard Male Patient" -- Change to normal head else patient:setLayer(0, patient.layers[0] - 8) -- Change to normal head end staff:setNextAction(MeanderAction()) self:dealtWithPatient(patient) end patient:queueAction(MultiUseObjectAction(slicer, staff):setAfterUse(after_use_slack_tongue)) return Room.commandEnteringPatient(self, patient) end return room CorsixTH-0.63/CorsixTH/Lua/rooms/staff_room.lua000066400000000000000000000047321347163623700214140ustar00rootroot00000000000000--[[ Copyright (c) 2009 Peter "Corsix" Cawley 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. --]] local room = {} room.id = "staff_room" room.level_config_id = 25 room.class = "StaffRoom" room.name = _S.rooms_short.staffroom room.long_name = _S.rooms_long.staffroom room.tooltip = _S.tooltip.rooms.staffroom room.objects_additional = { "extinguisher", "radiator", "plant", "sofa", "pool_table", "tv", "video_game" } room.objects_needed = { sofa = 1 } room.build_preview_animation = 5066 room.categories = { facilities = 1, } room.minimum_size = 4 room.wall_type = "green" room.floor_tile = 17 room.has_no_queue_dialog = true class "StaffRoom" (Room) ---@type StaffRoom local StaffRoom = _G["StaffRoom"] function StaffRoom:StaffRoom(...) self:Room(...) end function StaffRoom:onHumanoidEnter(humanoid) self.humanoids[humanoid] = true self:tryAdvanceQueue() humanoid:setDynamicInfoText("") if class.is(humanoid, Staff) then -- Receptionists cannot enter, so we do not have to worry about them -- If it is a handyman and he is here to do a job, let him pass if not humanoid.on_call then humanoid:setNextAction(UseStaffRoomAction()) self.door.queue.visitor_count = self.door.queue.visitor_count + 1 end else -- Other humanoids shouldn't be entering, so don't worry about them end end function StaffRoom:testStaffCriteria(criteria, extra_humanoid) -- The staff room always accept more tired staff members. if extra_humanoid then return true else return false end end return room CorsixTH-0.63/CorsixTH/Lua/rooms/toilets.lua000066400000000000000000000151771347163623700207450ustar00rootroot00000000000000--[[ Copyright (c) 2009 Peter "Corsix" Cawley 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. --]] local room = {} room.id = "toilets" room.level_config_id = 29 room.class = "ToiletRoom" room.name = _S.rooms_short.toilets room.long_name = _S.rooms_long.toilets room.tooltip = _S.tooltip.rooms.toilets room.objects_additional = { "extinguisher", "radiator", "plant", "bin", "loo", "sink" } room.objects_needed = { loo = 1, sink = 1 } room.build_preview_animation = 5098 room.categories = { facilities = 3, } room.minimum_size = 4 room.wall_type = "green" room.floor_tile = 21 class "ToiletRoom" (Room) ---@type ToiletRoom local ToiletRoom = _G["ToiletRoom"] function ToiletRoom:ToiletRoom(...) self:Room(...) self.door.queue:setBenchThreshold(3) end function ToiletRoom:roomFinished() local fx, fy = self:getEntranceXY(true) local objects = self.world:findAllObjectsNear(fx, fy) local number = 0 for object, _ in pairs(objects) do if object.object_type.id == "loo" then number = number + 1 end end self.maximum_patients = number Room.roomFinished(self) end function ToiletRoom:dealtWithPatient(patient) -- Continue going to the room before going to the toilets. patient:setNextAction(self:createLeaveAction()) if patient.next_room_to_visit then patient:queueAction(SeekRoomAction(patient.next_room_to_visit.room_info.id)) else patient:queueAction(SeekReceptionAction()) end end function ToiletRoom:onHumanoidEnter(humanoid) if class.is(humanoid, Patient) then local loo, lx, ly = self.world:findFreeObjectNearToUse(humanoid, "loo") if loo and lx and ly then humanoid:walkTo(lx, ly) loo.reserved_for = humanoid local use_time = math.random(0, 2) -- One class only have a 1 tick long usage animation if humanoid.humanoid_class == "Transparent Female Patient" then use_time = math.random(15, 40) end local loop_callback_toilets = --[[persistable:toilets_loop_callback]] function() use_time = use_time - 1 if use_time <= 0 then humanoid:setMood("poo", "deactivate") humanoid:changeAttribute("toilet_need", -(0.85 + math.random() * 0.15)) humanoid.going_to_toilet = "no" -- There are only animations for standard patients to use the sinks. if humanoid.humanoid_class == "Standard Female Patient" or humanoid.humanoid_class == "Standard Male Patient" then local --[[persistable:toilets_find_sink]] function after_use() local sink, sx, sy = self.world:findFreeObjectNearToUse(humanoid, "sink") if sink then humanoid:walkTo(sx, sy) local after_use_sink = --[[persistable:toilets_after_use_sink]] function() self:dealtWithPatient(humanoid) end humanoid:queueAction(UseObjectAction(sink):setProlongedUsage(false) :setAfterUse(after_use_sink)) sink.reserved_for = humanoid -- Make sure that the mood waiting is no longer active. humanoid:setMood("patient_wait", "deactivate") else -- if there is a queue to wash hands there is a chance we might not bother -- but the patient won't be happy about this. if math.random(1, 4) > 2 then -- Wait for a while before trying again. humanoid:setNextAction(IdleAction():setCount(5):setAfterUse(after_use) :setDirection(loo.direction == "north" and "south" or "east")) else self:dealtWithPatient(humanoid) humanoid:changeAttribute("happiness", -0.08) humanoid:setMood("patient_wait", "deactivate") end -- For now, activate the wait icon to show the player that the patient hasn't -- got stuck. TODO: Make a custom mood? Let many people use the sinks? humanoid:setMood("patient_wait", "activate") end end after_use() else self:dealtWithPatient(humanoid) end end end humanoid:queueAction(UseObjectAction(loo):setLoopCallback(loop_callback_toilets)) else --[[ If no loo is found, perhaps the patient followed another one in and they were heading for the same one. Now there is no free loo, so wait for a bit and then leave the room to wait outside. No need for a warning as this is what happens in busy toilets]] humanoid:setNextAction(MeanderAction():setCount(1)) humanoid:queueAction(self:createLeaveAction()) humanoid:queueAction(self:createEnterAction(humanoid)) end end return Room.onHumanoidEnter(self, humanoid) end -- Override the standard way to count the number of patients to take into account -- that some of them may not be using the loo, allowing others to enter the room earlier than normal; -- but not if there is only one loo in the room, then it becomes a private toilet with only one person at a time. function ToiletRoom:getPatientCount() local number_users = 0 local not_using_loo = 0 for humanoid in pairs(self.humanoids) do if class.is(humanoid, Patient) then number_users = number_users + 1 if humanoid:getCurrentAction().name == "use_object" and humanoid:getCurrentAction().object.object_type.id ~= "loo" then not_using_loo = not_using_loo + 1 end end end if self.maximum_patients == 1 then return number_users else return number_users - not_using_loo end end function ToiletRoom:afterLoad(old, new) if old < 110 then room.free_loos = nil end Room.afterLoad(self, old, new) end return room CorsixTH-0.63/CorsixTH/Lua/rooms/training.lua000066400000000000000000000216521347163623700210700ustar00rootroot00000000000000--[[ Copyright (c) 2010 Justin Pasher 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. --]] local room = {} room.id = "training" room.level_config_id = 22 room.class = "TrainingRoom" room.long_name = _S.rooms_long.training_room room.name = _S.rooms_short.training_room room.tooltip = _S.tooltip.rooms.training_room room.objects_additional = { "extinguisher", "radiator", "plant", "bin", "lecture_chair", "bookcase", "skeleton" } room.objects_needed = { lecture_chair = 1, projector = 1 } room.build_preview_animation = 5086 room.categories = { facilities = 4, } room.minimum_size = 4 room.wall_type = "green" room.floor_tile = 17 room.has_no_queue_dialog = true class "TrainingRoom" (Room) ---@type TrainingRoom local TrainingRoom = _G["TrainingRoom"] function TrainingRoom:TrainingRoom(...) self:Room(...) end function TrainingRoom:roomFinished() -- Training rate and max occupancy based on objects in the room local fx, fy = self:getEntranceXY(true) local objects = self.world:findAllObjectsNear(fx, fy) local chairs = 0 local skeletons = 0 local bookcases = 0 for object, _ in pairs(objects) do if object.object_type.id == "lecture_chair" then chairs = chairs + 1 elseif object.object_type.id == "skeleton" then skeletons = skeletons + 1 elseif object.object_type.id == "bookcase" then bookcases = bookcases + 1 end end -- Total staff occupancy: number of lecture chairs plus projector self.maximum_staff = { Doctor = chairs + 1 } -- factor is divided by ten so the result from new algroithm will be similar to the old algorithm self.training_factor = self:calculateTrainingFactor(skeletons, bookcases) / 10.0 -- Also tell the player if he/she doesn't have a consultant yet. if not self.hospital:hasStaffOfCategory("Consultant") then local text = _A.room_requirements.training_room_need_consultant self.world.ui.adviser:say(text) end Room.roomFinished(self) end function TrainingRoom:calculateTrainingFactor(skeletons, bookcases) -- TODO: tweak/change this function, used in Staff:trainSkill(...) -- Object values and training rate set in level config local level_config = self.world.map.level_config local proj_val = 10 local book_val = 15 local skel_val = 20 local training_rate = 40 if level_config and level_config.gbv.TrainingRate then book_val = level_config.gbv.TrainingValue[1] skel_val = level_config.gbv.TrainingValue[2] training_rate = level_config.gbv.TrainingRate end -- Training factor is just everything added together return proj_val + skeletons*skel_val + bookcases*book_val + training_rate end function TrainingRoom:getStaffCount() local count = 0 for humanoid in pairs(self.humanoids) do if class.is(humanoid, Staff) then count = count + 1 end end return count end function TrainingRoom:testStaffCriteria(criteria, extra_humanoid) if extra_humanoid and extra_humanoid.profile and extra_humanoid.profile.is_consultant and self.staff_member then -- Training room can only have on consultant return false end return Room.testStaffCriteria(self, criteria, extra_humanoid) end function TrainingRoom:getTrainingFactor() return self.training_factor end function TrainingRoom:getMaximumStaffCriteria() return self.maximum_staff end function TrainingRoom:doStaffUseCycle(humanoid) local projector, ox, oy = self.world:findObjectNear(humanoid, "projector") humanoid:queueAction(WalkAction(ox, oy)) local projector_use_time = math.random(6,20) local loop_callback_training = --[[persistable:training_loop_callback]] function() projector_use_time = projector_use_time - 1 if projector_use_time == 0 then local skeleton, sox, soy = self.world:findFreeObjectNearToUse(humanoid, "skeleton", "near") local bookcase, box, boy = self.world:findFreeObjectNearToUse(humanoid, "bookcase", "near") if math.random(0, 1) == 0 and bookcase then skeleton = nil end -- choose one if skeleton then humanoid:walkTo(sox, soy) for _ = 1, math.random(3, 10) do humanoid:queueAction(UseObjectAction(skeleton)) end elseif bookcase then humanoid:walkTo(box, boy) for _ = 1, math.random(3, 10) do humanoid:queueAction(UseObjectAction(bookcase)) end end -- go back to the projector self:doStaffUseCycle(humanoid) elseif projector_use_time < 0 then -- reset variable to avoid potential overflow (over a VERY long -- period of time) projector_use_time = 0 end end humanoid:queueAction(UseObjectAction(projector):setLoopCallback(loop_callback_training)) end function TrainingRoom:onHumanoidEnter(humanoid) if humanoid.humanoid_class ~= "Doctor" then -- use default behavior for staff other than doctors return Room.onHumanoidEnter(self, humanoid) end assert(not self.humanoids[humanoid], "Humanoid entering a room that they are already in") humanoid.in_room = self humanoid.last_room = self -- Remember where the staff was for them to come back after staffroom rest --entering humanoids are no longer enroute if self.humanoids_enroute[humanoid] then self.humanoids_enroute[humanoid] = nil -- humanoid is no longer walking to this room end humanoid:setCallCompleted() self:commandEnteringStaff(humanoid) self.humanoids[humanoid] = true self:tryAdvanceQueue() end function TrainingRoom:commandEnteringStaff(humanoid) local obj, ox, oy local profile = humanoid.profile if profile.humanoid_class == "Doctor" then -- Consultants try to use the projector and/or skeleton if profile.is_consultant then obj, ox, oy = self.world:findFreeObjectNearToUse(humanoid, "projector") if self.staff_member then if self.waiting_staff_member then local staff = self.waiting_staff_member staff.waiting_on_other_staff = nil staff:setNextAction(self:createLeaveAction()) staff:queueAction(MeanderAction()) end humanoid.waiting_on_other_staff = true humanoid:setNextAction(MeanderAction()) self.waiting_staff_member = humanoid self.staff_member:setNextAction(self:createLeaveAction()) self.staff_member:queueAction(MeanderAction()) else if obj then obj.reserved_for = humanoid humanoid:walkTo(ox, oy) self:doStaffUseCycle(humanoid) self:setStaffMember(humanoid) else humanoid:setNextAction(self:createLeaveAction()) humanoid:queueAction(MeanderAction()) end end else obj, ox, oy = self.world:findFreeObjectNearToUse(humanoid, "lecture_chair") if obj then obj.reserved_for = humanoid humanoid:walkTo(ox, oy) humanoid:queueAction(UseObjectAction(obj)) humanoid:queueAction(MeanderAction()) else humanoid:setNextAction(self:createLeaveAction()) humanoid:queueAction(MeanderAction()) humanoid.last_room = nil end end elseif humanoid.humanoid_class ~= "Handyman" then self.world.ui.adviser:say(_A.staff_place_advice.only_doctors_in_room :format(_S.rooms_long.training_room)) humanoid:setNextAction(self:createLeaveAction()) humanoid:queueAction(MeanderAction()) return end return Room.commandEnteringStaff(self, humanoid, true) end function TrainingRoom:onHumanoidLeave(humanoid) if humanoid.humanoid_class == "Doctor" then -- unreserve whatever it was they we using local fx, fy = self:getEntranceXY(true) local objects = self.world:findAllObjectsNear(fx,fy) for object, _ in pairs(objects) do if object.reserved_for == humanoid then object:removeReservedUser() end end if humanoid.profile.is_consultant and humanoid == self.staff_member then local staff = self.waiting_staff_member self:setStaffMember(nil) if staff then staff.waiting_on_other_staff = nil self.waiting_staff_member = nil self:commandEnteringStaff(staff) end end end Room.onHumanoidLeave(self, humanoid) end return room CorsixTH-0.63/CorsixTH/Lua/rooms/ultrascan.lua000066400000000000000000000050561347163623700212510ustar00rootroot00000000000000--[[ Copyright (c) 2009 Manuel König 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. --]] local room = {} room.id = "ultrascan" room.level_config_id = 14 room.class = "UltrascanRoom" room.name = _S.rooms_short.ultrascan room.long_name = _S.rooms_long.ultrascan room.tooltip = _S.tooltip.rooms.ultrascan room.objects_additional = { "extinguisher", "radiator", "plant", "bin" } room.objects_needed = { ultrascanner = 1 } room.build_preview_animation = 5068 room.categories = { diagnosis = 5, } room.minimum_size = 4 room.wall_type = "yellow" room.floor_tile = 19 room.required_staff = { Doctor = 1, } room.maximum_staff = room.required_staff room.call_sound = "reqd007.wav" room.handyman_call_sound = "maint016.wav" class "UltrascanRoom" (Room) ---@type UltrascanRoom local UltrascanRoom = _G["UltrascanRoom"] function UltrascanRoom:UltrascanRoom(...) self:Room(...) end function UltrascanRoom:commandEnteringPatient(patient) local staff = self.staff_member local ultrascan, pat_x, pat_y = self.world:findObjectNear(patient, "ultrascanner") local stf_x, stf_y = ultrascan:getSecondaryUsageTile() staff:setNextAction(WalkAction(stf_x, stf_y)) staff:queueAction(IdleAction():setDirection(ultrascan.direction == "north" and "west" or "north")) patient:setNextAction(WalkAction(pat_x, pat_y)) local after_use_scan = --[[persistable:ultrascan_after_use]] function() staff:setNextAction(MeanderAction()) self:dealtWithPatient(patient) end patient:queueAction(MultiUseObjectAction(ultrascan, staff):setAfterUse(after_use_scan)) return Room.commandEnteringPatient(self, patient) end return room CorsixTH-0.63/CorsixTH/Lua/rooms/ward.lua000066400000000000000000000203331347163623700202050ustar00rootroot00000000000000--[[ Copyright (c) 2009 Peter "Corsix" Cawley 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. --]] local room = {} room.id = "ward" room.level_config_id = 9 room.class = "WardRoom" room.name = _S.rooms_short.ward room.tooltip = _S.tooltip.rooms.ward room.long_name = _S.rooms_long.ward room.objects_additional = { "extinguisher", "radiator", "plant", "desk", "bin", "bed" } room.objects_needed = { desk = 1, bed = 1 } room.build_preview_animation = 910 room.categories = { treatment = 2, diagnosis = 9, } room.minimum_size = 6 room.wall_type = "white" room.floor_tile = 21 room.swing_doors = true room.required_staff = { Nurse = 1, } room.call_sound = "reqd009.wav" class "WardRoom" (Room) ---@type WardRoom local WardRoom = _G["WardRoom"] function WardRoom:WardRoom(...) self:Room(...) self.staff_member_set = {} end function WardRoom:roomFinished() local fx, fy = self:getEntranceXY(true) local objects = self.world:findAllObjectsNear(fx, fy) local beds = 0 local desks = 0 for object, _ in pairs(objects) do if object.object_type.id == "bed" then beds = beds + 1 end if object.object_type.id == "desk" then desks = desks + 1 end end self.maximum_staff = { Nurse = desks, } self.maximum_patients = beds if not self.hospital:hasStaffOfCategory("Nurse") then self.world.ui.adviser :say(_A.room_requirements.ward_need_nurse) end Room.roomFinished(self) end function WardRoom:getMaximumStaffCriteria() return self.maximum_staff end function WardRoom:commandEnteringStaff(humanoid) self.staff_member_set[humanoid] = true self:doStaffUseCycle(humanoid) return Room.commandEnteringStaff(self, humanoid, true) end function WardRoom:doStaffUseCycle(humanoid) local meander_time = math.random(4, 10) humanoid:setNextAction(MeanderAction():setCount(meander_time)) local obj, ox, oy = self.world:findFreeObjectNearToUse(humanoid, "desk") if obj then obj.reserved_for = humanoid humanoid:walkTo(ox, oy) if obj.object_type.id == "desk" then local desk_use_time = math.random(7, 14) local desk_loop = --[[persistable:ward_desk_loop_callback]] function() desk_use_time = desk_use_time - 1 if desk_use_time == 0 then self:doStaffUseCycle(humanoid) end end humanoid:queueAction(UseObjectAction(obj):setLoopCallback(desk_loop)) end end local num_meanders = math.random(2, 4) local meanders_loop = --[[persistable:ward_meander_loop_callback]] function(action) num_meanders = num_meanders - 1 if num_meanders == 0 then self:doStaffUseCycle(humanoid) end end humanoid:queueAction(MeanderAction():setLoopCallback(meanders_loop)) end -- TODO the nurse should not leave the ward if there are beds in use, therefore prevent her from being picked up -- and have a system that stops patients entering the ward if she is in need of taking a break or being called elsewhere. function WardRoom:commandEnteringPatient(patient) local staff = next(self.staff_member_set) or self.staff_member local bed, pat_x, pat_y = self.world:findFreeObjectNearToUse(patient, "bed") self:setStaffMembersAttribute("dealing_with_patient", nil) if not bed then patient:setNextAction(self:createLeaveAction()) patient:queueAction(self:createEnterAction(patient)) print("Warning: A patient was called into the ward even though there are no free beds.") else bed.reserved_for = patient self:countWorkingNurses() local length = (math.random(200, 800) * (1.5 - staff.profile.skill)) / self.nursecount -- reduce time in ward if there is more than one nurse on duty local --[[persistable:ward_loop_callback]] function loop_callback(action) -- TODO Perhaps it should take longer if there are more used beds! if length <= 0 then action.prolonged_usage = false end length = length - 1 end local after_use = --[[persistable:ward_after_use]] function() self:dealtWithPatient(patient) end patient:walkTo(pat_x, pat_y) patient:queueAction(UseObjectAction(bed):setProlongedUsage(true):setLoopCallback(loop_callback) :setAfterUse(after_use)) end return Room.commandEnteringPatient(self, patient) end -- Returns the staff member with the minimum amount of skill. Perhaps we should consider tiredness too function WardRoom:getStaffMember() local staff for staff_member, _ in pairs(self.staff_member_set) do if staff and not staff_member.fired and not staff_member:hasLeavingAction() then if staff.profile.skill > staff_member.profile.skill then staff = staff_member end else if not staff_member.fired and not staff_member:hasLeavingAction() then staff = staff_member end end end return staff end function WardRoom:setStaffMember(staff) self.staff_member_set[staff] = true end function WardRoom:countWorkingNurses() local staff = next(self.staff_member_set) self.nursecount = 0 for staff_member, _ in pairs(self.staff_member_set) do if staff then staff = staff_member self.nursecount = self.nursecount + 1 end end end function WardRoom:setStaffMembersAttribute(attribute, value) for staff_member, _ in pairs(self.staff_member_set) do staff_member[attribute] = value end end function WardRoom:onHumanoidLeave(humanoid) self.staff_member_set[humanoid] = nil Room.onHumanoidLeave(self, humanoid) end function WardRoom:afterLoad(old, new) if old < 11 then -- Make sure all three tiles outside of the door are unbuildable. local door = self.door local x = door.tile_x local y = door.tile_y local dir = door.direction local map = self.world.map.th local flags = {} local function checkLocation(xpos, ypos) if self.world:getRoom(xpos, ypos) or not map:getCellFlags(xpos, ypos, flags).passable then local message = "Warning: An update has resolved a problem concerning " .. "swing doors, but not all tiles adjacent to them could be fixed." self.world.ui:addWindow(UIInformation(self.world.ui, {message})) return false end return true end if dir == "west" then -- In west or east wall if self.world:getRoom(x, y) == self then -- In west wall if checkLocation(x - 1, y + 1) then map:setCellFlags(x - 1, y + 1, {buildable = false}) end else -- East wall if checkLocation(x, y + 1) then map:setCellFlags(x, y + 1, {buildable = false}) end end else -- if dir == "north", North or south wall if self.world:getRoom(x, y) == self then -- In north wall if checkLocation(x + 1, y - 1) then map:setCellFlags(x + 1, y - 1, {buildable = false}) end else -- South wall if checkLocation(x + 1, y) then map:setCellFlags(x + 1, y, {buildable = false}) end end end end if old < 74 then -- add some new variables self.staff_member_set = {} self.nursecount = 0 -- reset any wards that already exist self:roomFinished() -- if there is already a nurse in the ward -- make her leave so she gets counted properly local nurse = self.staff_member if nurse then nurse:setNextAction(self:createLeaveAction()) nurse:queueAction(MeanderAction()) end end Room.afterLoad(self, old, new) end return room CorsixTH-0.63/CorsixTH/Lua/rooms/x_ray_room.lua000066400000000000000000000063251347163623700214330ustar00rootroot00000000000000--[[ Copyright (c) 2009 Manuel König 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. --]] local room = {} room.id = "x_ray" room.level_config_id = 16 room.class = "XRayRoom" room.name = _S.rooms_short.x_ray room.long_name = _S.rooms_long.x_ray room.tooltip = _S.tooltip.rooms.x_ray room.objects_additional = { "extinguisher", "radiator", "plant", "bin" } room.objects_needed = { x_ray = 1, radiation_shield = 1 } room.build_preview_animation = 5076 room.categories = { diagnosis = 7, } room.minimum_size = 6 room.wall_type = "yellow" room.floor_tile = 19 room.required_staff = { Doctor = 1, } room.maximum_staff = room.required_staff room.call_sound = "reqd013.wav" room.handyman_call_sound = "maint005.wav" class "XRayRoom" (Room) ---@type XRayRoom local XRayRoom = _G["XRayRoom"] function XRayRoom:XRayRoom(...) self:Room(...) end function XRayRoom:commandEnteringPatient(patient) local staff = self.staff_member local x_ray, pat_x, pat_y = self.world:findObjectNear(patient, "x_ray") local console, stf_x, stf_y = self.world:findObjectNear(staff, "radiation_shield") local --[[persistable:x_ray_shared_loop_callback]] function loop_callback() if staff:getCurrentAction().name == "idle" and patient:getCurrentAction().name == "idle" then local length = math.random(2, 4) * (2 - staff.profile.skill) local loop_callback_xray = --[[persistable:x_ray_loop_callback]] function(action) if length <= 0 then action.prolonged_usage = false end length = length - 1 end local after_use_xray = --[[persistable:x_ray_after_use]] function() staff:setNextAction(MeanderAction()) self:dealtWithPatient(patient) end patient:setNextAction(UseObjectAction(x_ray):setLoopCallback(loop_callback_xray) :setAfterUse(after_use_xray)) staff:setNextAction(UseObjectAction(console)) end end patient:walkTo(pat_x, pat_y) patient:queueAction(IdleAction():setDirection(x_ray.direction == "north" and "east" or "south") :setLoopCallback(loop_callback)) staff:walkTo(stf_x, stf_y) staff:queueAction(IdleAction():setDirection(console.direction == "north" and "east" or "south") :setLoopCallback(loop_callback)) return Room.commandEnteringPatient(self, patient) end return room CorsixTH-0.63/CorsixTH/Lua/run_debugger.lua000066400000000000000000000024221347163623700205600ustar00rootroot00000000000000--- -- This script is responsible for starting a DBGp client for CorsixTH's -- Lua scripts and then connecting this to a running DBGp server. -- -- It does this in the function it returns. --- local function run() print("NOTE: While CorsixTH is connected to an IDE's debugger server,") print("text will be printed in its output console instead of here.") if not pcall(require, "socket") then print("Can't connect debugger: LuaSocket is not available.") return "Can't connect debugger: LuaSocket is not available." end local config = select(2, corsixth.require("config_finder")) local connect = dofile("debugger") local successful, error_message = pcall(connect, config.DBGp_client_idehost, config.DBGp_client_ideport, config.DBGp_client_idekey, config.DBGp_client_transport, config.DBGp_client_platform, config.DBGp_client_workingdir) if not successful then print("\nCan't connect DBGp client:\n" .. error_message .. "\n") return "Failed to connect debugger, error printed in console." end end return run CorsixTH-0.63/CorsixTH/Lua/sprite_viewer.lua000066400000000000000000000112221347163623700207750ustar00rootroot00000000000000--[[ Copyright (c) 2009 Peter "Corsix" Cawley 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. --]] -- This is a poor replacement for the sprite viewing facility of AnimView, but -- when you don't have a copy of AnimView, or the means to compile it, then a -- crude sprite viewer is better than no sprite viewer. local gfx = TheApp.gfx gfx.cache.tabled = {} local font = gfx:loadFont("QData", "Font00V") local need_draw = true local sprite_table_paths = {} local sprite_table_index local sprite_table local is_complex = false local wdown = false local sdown = false local y_off local old_event_handlers for _, dir in ipairs({"Data", "QData", "DataM", "QDataM"}) do for item in pairs(TheApp.fs:listFiles(dir) or {}) do if item:match"%.TAB$" then sprite_table_paths[#sprite_table_paths + 1] = {dir, item:sub(1, -5)} end end end table.sort(sprite_table_paths, function(lhs, rhs) return lhs[1] < rhs[1] or (lhs[1] == rhs[1] and lhs[2] < rhs[2]) end) local function LoadTable(n, complex) sprite_table_index = n is_complex = complex local path = sprite_table_paths[n] local pal if TheApp.fs:readContents(path[1], path[2] .. ".PAL") then pal = gfx:loadPalette(path[1], path[2] .. ".PAL") end sprite_table = gfx:loadSpriteTable(path[1], path[2], complex, pal) need_draw = true y_off = 0 end LoadTable(1, false) local function DoKey(self, rawchar, modifiers, is_repeat) local key = rawchar:lower() if key == "c" then gfx.cache.tabled = {} LoadTable(sprite_table_index, not is_complex) elseif key == "a" then if sprite_table_index > 1 then LoadTable(sprite_table_index - 1, is_complex) end elseif key == "d" then if sprite_table_index < #sprite_table_paths then LoadTable(sprite_table_index + 1, is_complex) end elseif key == "w" then wdown = true need_draw = true elseif key == "s" then sdown = true need_draw = true elseif key == "q" then TheApp.eventHandlers = old_event_handlers need_draw = false end return need_draw end local function DoKeyUp(self, rawchar) local key = rawchar:lower() if key == "w" then wdown = false end if key == "s" then sdown = false end end local function Render(canvas) local encoding = is_complex and " (Complex)" or " (Simple)" local msg = table.concat(sprite_table_paths[sprite_table_index], package.config:sub(1, 1)) .. encoding local _, fonth = font:sizeOf(msg) local sep = 2 local y = y_off font:draw(canvas, "CorsixTH Debug Sprite Viewer - W/A/S/D to navigate, C to change mode, Q to quit", 0, y) y = y + fonth + sep font:draw(canvas, msg, 0, y) y = y + fonth + sep local x = 0 local sw, sh = TheApp.config.width, TheApp.config.height local tallest = 0 for i = 0, #sprite_table - 1 do local w, h = sprite_table:size(i) local lbl = "#" .. i .. " (" .. w .. "x" .. h .. ")" local lw = font:sizeOf(lbl) if lw > w then w = lw end h = h + fonth + sep if x + w > sw then x = 0 y = y + tallest if y > sh then break end end if h > tallest then tallest = h end font:draw(canvas, lbl, x, y) sprite_table:draw(canvas, i, x, y + fonth) x = x + w + sep end end local function DoFrame(app) local canvas = app.video canvas:startFrame() if need_draw then need_draw = app.config.track_fps canvas:fillBlack() Render(canvas) end canvas:endFrame() end local function DoTimer(app) if wdown then y_off = y_off + 32 need_draw = true end if sdown then y_off = y_off - 32 need_draw = true end return need_draw end old_event_handlers = TheApp.eventHandlers TheApp.eventHandlers = { frame = DoFrame, keydown = DoKey, keyup = DoKeyUp, timer = DoTimer, } CorsixTH-0.63/CorsixTH/Lua/staff_profile.lua000066400000000000000000000177361347163623700207510ustar00rootroot00000000000000--[[ Copyright (c) 2009 Peter "Corsix" Cawley 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. --]] class "StaffProfile" ---@type StaffProfile local StaffProfile = _G["StaffProfile"] function StaffProfile:StaffProfile(world, humanoid_class, local_string) self.world = world self.humanoid_class = humanoid_class self.name = "U. N. Initialised" self.wage = 0 self.skill = 0 -- [0.0, 1.0] self.layer5 = 2 self.attention_to_detail = math.random() self.profession = local_string end function StaffProfile:setDoctorAbilities(psychiatrist, surgeon, researcher, junior, consultant) self.is_psychiatrist = psychiatrist self.is_surgeon = surgeon self.is_researcher = researcher self.is_junior = junior self.is_consultant = consultant end function StaffProfile:initDoctor(psychiatrist, surgeon, researcher, junior, consultant, skill) self:setDoctorAbilities(psychiatrist, surgeon, researcher, junior, consultant) self:init(skill) end function StaffProfile:init(skill) self:setSkill(skill) self.wage = self:getFairWage() self:randomiseOrganical() end function StaffProfile:setSkill(skill) self.skill = skill self:parseSkillLevel() end local name_parts = {_S.humanoid_name_starts, _S.humanoid_name_ends} local function shuffle(t) local r = {} local i = {} for k in ipairs(t) do r[k] = math.random() i[k] = k end table.sort(i, function(x, y) return r[x] < r[y] end) for k in ipairs(t) do r[k] = t[i[k]] end return r end local function our_concat(t) -- The standard table.concat function doesn't like our userdata strings :( local result = "" for _, s in ipairs(t) do result = result .. s end return result end function StaffProfile:randomise(month) local level_config = self.world.map.level_config -- decide general skill for all staff self.skill = math.random() --self.skill_level_modifier = math.random(-50, 50) / 1000 -- [-0.05, +0.05] if self.humanoid_class == "Doctor" then -- find the correct config line (based on month) for generation of the doctor local i = 0 while i < #level_config.staff_levels and level_config.staff_levels[i+1].Month <= month do i = i+1 end -- list of level_config values and the corresponding staff modifiers, plus the value set for "no" local mods = { {"ShrkRate", "is_psychiatrist", 0}, {"SurgRate", "is_surgeon", 0}, {"RschRate", "is_researcher", 0}, {"JrRate", "is_junior", nil}, {"ConsRate", "is_consultant", nil}, } -- The following assumes ascending month order of the staff_levels table. -- TODO don't assume this but sort when loading map config for _, m in ipairs(mods) do local rate local ind = i while not rate do assert(ind >= 0, "Staff modifier " .. m[1] .. " not existent (should at least be given by base_config).") rate = level_config.staff_levels[ind][m[1]] ind = ind - 1 end -- 0 means none. Other values x mean "one in x"; thus 1 means "one in one" aka "all" rate = (rate == 0) and 0 or 1 / rate self[m[2]] = math.random() < rate and 1.0 or m[3] end -- is_consultant is forced to nil if is_junior is already 1 self.is_consultant = not self.is_junior and self.is_consultant or nil local jr_limit = level_config.gbv.DoctorThreshold / 1000 local cons_limit = level_config.gbv.ConsultantThreshold / 1000 -- put the doctor in the right skill level box if self.is_junior then self.skill = jr_limit * self.skill elseif self.is_consultant then self.skill = cons_limit + ((1 - cons_limit) * self.skill) else self.skill = jr_limit + ((cons_limit - jr_limit) * self.skill) end end self.wage = self:getFairWage() self:parseSkillLevel() self:randomiseOrganical() end function StaffProfile:randomiseOrganical() -- TODO: Randomise a letter from the current language's alphabet. self.name = "" -- string.char(string.byte"A" + math.random(0, 25)) .. ". " for _, part_table in ipairs(name_parts) do self.name = self.name .. part_table.__random end local desc_table1, desc_table2 if self.skill < 0.55 then desc_table1 = _S.staff_descriptions.bad desc_table2 = _S.staff_descriptions.misc else desc_table1 = _S.staff_descriptions.good desc_table2 = _S.staff_descriptions.misc end local descs = {desc_table1.__random, desc_table2.__random} while #our_concat(descs) > 96 do descs[#descs] = nil end self.desc = our_concat(shuffle(descs)) if self.humanoid_class == "Doctor" then self.is_black = math.random(0, 1) == 0 if self.is_black then self.hair_index = math.random(5, 9) self.face_index = math.random(5, 9) self.chin_index = math.random(5, 9) self.layer5 = 4 else self.hair_index = math.random(0, 4) self.face_index = math.random(0, 4) self.chin_index = math.random(0, 4) self.layer5 = 2 end elseif self.humanoid_class == "Nurse" then self.hair_index = math.random(10, 12) self.face_index = math.random(10, 12) self.chin_index = math.random(10, 12) elseif self.humanoid_class == "Receptionist" then self.hair_index = math.random(13, 14) self.face_index = math.random(13, 14) self.chin_index = math.random(13, 14) elseif self.humanoid_class == "Handyman" then self.hair_index = math.random(15, 17) self.face_index = math.random(15, 17) self.chin_index = math.random(15, 17) end end function StaffProfile:drawFace(canvas, x, y, parts_bitmap) parts_bitmap:draw(canvas, x, y , 0, self.hair_index * 29, 65, 29) parts_bitmap:draw(canvas, x, y + 29, 0, 522 + self.face_index * 24, 65, 24) parts_bitmap:draw(canvas, x, y + 53, 0, 954 + self.chin_index * 22, 65, 22) end -- Update junior and consultant status function StaffProfile:parseSkillLevel() local level_config = self.world.map.level_config local junior_skill = level_config.gbv.DoctorThreshold / 1000 self.is_junior = self.skill <= junior_skill and 1 or nil local consultant_skill = level_config.gbv.ConsultantThreshold / 1000 self.is_consultant = self.skill >= consultant_skill and 1 or nil end local conf_id = { Nurse = 0, Doctor = 1, Handyman = 2, Receptionist = 3, } local ability_conf_id = { is_junior = 3, is_doctor = 4, is_surgeon = 5, is_psychiatrist = 6, is_consultant = 7, is_researcher = 8, } function StaffProfile:getFairWage() if self.world.free_build_mode then return 0 end local level_config = self.world.map.level_config local wage = level_config.staff[conf_id[self.humanoid_class]].MinSalary wage = wage + self.skill * 1000 / level_config.gbv.SalaryAbilityDivisor if self.humanoid_class == "Doctor" then for name, id in pairs(ability_conf_id) do if self[name] == 1 then wage = wage + level_config.gbv.SalaryAdd[id] end end if not self.is_junior and not self.is_consultant then wage = wage + level_config.gbv.SalaryAdd[ability_conf_id.is_doctor] end end return math.max(math.floor(wage), level_config.staff[conf_id[self.humanoid_class]].MinSalary) end CorsixTH-0.63/CorsixTH/Lua/strict.lua000066400000000000000000000055021347163623700174220ustar00rootroot00000000000000--[[ Copyright (c) 2009 Peter "Corsix" Cawley 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. --]] -- Force local variables to be used for everything (except for explicity -- declared variables and any code running in derestriced mode). This helps to -- catch typos in variable names, and promotes usage of locals over globals -- (which improves speed). local rawset, error, tostring = rawset, error, tostring local strict_mt = {} local allowed_globals = setmetatable({}, {__mode = "k"}) local function newindex(t, k, v) if allowed_globals[k] then rawset(t, k, v) else error("assign to undeclared variable \'" .. tostring(k) .. "\'", 2) end end local function index(t, k) if allowed_globals[k] then return nil else error("use of undeclared variable \'" .. tostring(k) .. "\'", 2) end end local function restrict(ni, i, ...) strict_mt.__newindex = ni strict_mt.__index = i return ... end restrict(newindex, index) --!! Wrap a function so that it is freely able to set global variables --[[ Some existing functions (for example, `require`) should be allowed to read and write global variables without having to worry about declaring them with `strict_declare_global`. !param fn The function which should be able to freely set globals !return A new function which acts just as `fn` and is free to set globals !example require = destrict(require) ]] function destrict(fn) return function(...) local ni, i = strict_mt.__newindex, strict_mt.__index strict_mt.__newindex, strict_mt.__index = nil, nil return restrict(ni, i, fn(...)) end end --!! Declare a global variable so that it can later be used --[[!param name The name of the global to declare !example strict_declare_global "some_var" some_var = 42 ]] function strict_declare_global(name) allowed_globals[name] = true end setmetatable(_G, strict_mt) CorsixTH-0.63/CorsixTH/Lua/string_extensions.lua000066400000000000000000000133121347163623700216750ustar00rootroot00000000000000--[[ Copyright (c) 2011 Manuel "Roujin" Wolf 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. --]] local TH = require("TH") local lpeg = require("lpeg") local _unwrap = TH.stringProxy._unwrap function TH.stringProxy.gsub(str, patt, repl) local str_was_proxy, patt_was_proxy, repl_was_proxy str, str_was_proxy = _unwrap(str) patt, patt_was_proxy = _unwrap(patt) local result local t = type(repl) if t == "table" then result = str:gsub(patt, function(cap) local res, was_proxy = _unwrap(repl[cap]) if was_proxy then repl_was_proxy = true end return res end) elseif t == "function" then result = str:gsub(patt, function(...) local res, was_proxy = _unwrap(repl(...)) if was_proxy then repl_was_proxy = true end return res end) else repl, repl_was_proxy = _unwrap(repl) result = str:gsub(patt, repl) end if str_was_proxy or patt_was_proxy or repl_was_proxy then result = TH.stringProxy(result, TH.stringProxy.gsub, str, patt, repl) end return result end local format_pattern = lpeg.Cs( ( ( -- %% to % lpeg.P"%%" / "%%" + -- Old-style (%s) and (%d) lpeg.C("%" * lpeg.S"sd" * lpeg.Carg(1)) / function(key, args) local idx = args.idx + 1 args.idx = idx local arg, proxy_found = _unwrap(args[idx]) local t = type(arg) if (key == "%d" and t == "number") or -- NB: Numbers are allowed for %s as well to allow concatenation with number. -- TODO the third check should really be class.is(arg, TH.stringProxy), but -- it doesn't currently work due to TH.stringProxy overriding __index (key == "%s" and (t == "string" or t == "number" or t == "userdata")) then if proxy_found then args.proxy_found = true end return arg end return key end + -- New-style %([1-9])% and %([1-9]):([a-zA-Z0-9_.]-)% lpeg.C("%" * lpeg.C(lpeg.R"19") * (":" * lpeg.C(lpeg.R("az","AZ","09","__","..")^1) + lpeg.Cc(nil)) * "%" * lpeg.Carg(1)) / function(str, key, tab, args) local val, proxy_found = _unwrap(args[tonumber(key)]) if val == nil then return str end -- abort if tab then local string_table = _S for part in tab:gmatch"[^.]+" do string_table = string_table[part] if not string_table then return str end -- abort end if not string_table[val] then return str end -- abort val = _unwrap(string_table[val]) proxy_found = true end if proxy_found then args.proxy_found = true end return val end ) + 1 ) ^ 0 ) --! Custom format function for our proxy strings. --! Keywords for replacing are: %s, %d, %%, %[num]% and %[num]:[tab]% --! NB: %s and %d are only replaced if none of the new keywords (%[num]% and %[num]:[tab]%) are present. --! NB: Always escape percent sign (i.e. use %% instead of %) in strings with formatting keywords! Failure --! to do so can cause unwanted behavior. --! --! Keywords: --! %s, %d : replaced with the n-th parameter, if the type matches (%s = string, %d = number). --! %% : replaced by single percent sign "%". Needed for escaping. --! %[num]% : ([num] between 1-9) replaced by [num]-th parameter. --! %[num]:[tab]% : replaced by string obtained by indexing string table _S.[tab] with [num]-th parameter. --!param str (string, stringProxy) the string that contains keywords to be replaced --!param ... (string, stringProxy, number) parameters to be inserted in the string (or used for lookup) --!return formatted stringProxy, if any of the result's components was a stringProxy, else formatted string function TH.stringProxy.format(str, ...) local args = {idx = 0, ...} local str_was_proxy str, str_was_proxy = _unwrap(str) local result = format_pattern:match(str, 1, args) if str_was_proxy or args.proxy_found then result = TH.stringProxy(result, TH.stringProxy.format, str, ...) end return result end --! Wrapper for the lua string.find function. Make sure to call mystring:find(...) instead of string.find(mystring, ...). function TH.stringProxy.find(str, ...) str = _unwrap(str) return str:find(...) end --! Wrapper for the lua string.sub function. Make sure to call mystring:sub(...) instead of string.sub(mystring, ...). function TH.stringProxy.sub(str, ...) local str_was_proxy str, str_was_proxy = _unwrap(str) local result = str:sub(...) if str_was_proxy then result = TH.stringProxy(result, TH.stringProxy.sub, str, ...) end return result end for _, method_name in ipairs({"gsub", "format", "find", "sub"}) do permanent("TH.stringProxy." .. method_name, TH.stringProxy[method_name]) end CorsixTH-0.63/CorsixTH/Lua/strings.lua000066400000000000000000000531301347163623700176030ustar00rootroot00000000000000--[[ Copyright (c) 2010 Peter "Corsix" Cawley 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. --]] local lfs = require("lfs") local TH = require("TH") --! Layer which handles the loading of localised text. class "Strings" ---@type Strings local Strings = _G["Strings"] function Strings:Strings(app) self.app = app end local utf8conv local cp437conv local function id(...) return ... end function Strings:init() -- Load (but do not execute) everything from the language directory -- Note that files are loaded with loadfile_envcall self.language_chunks = {} local ourpath = debug.getinfo(1, "S").source:sub(2, -12) local pathsep = package.config:sub(1,1) local path = ourpath .. "languages" .. pathsep for file in lfs.dir(path) do if file:match"%.lua$" then local result, err = loadfile_envcall(path .. file) if not result then print("Error loading languages" .. pathsep .. file .. ":\n" .. tostring(err)) else self.language_chunks[result] = "languages" .. pathsep .. file end end end -- Build the language table from Language() calls -- Every file in the languages folder should have a call to Language() near -- the start of the file which gives the names for the language. These names -- are used to link the user's choice of language to a file, and to link the -- names given to Inherit() to a file. The first name is used as the official -- name for this language, the others may be abbreviations or such. self.languages = {} self.languages_english = {} self.language_to_chunk = {} self.chunk_to_font = {} self.chunk_to_names = {} for chunk, filename in pairs(self.language_chunks) do -- To allow the file to set global variables without causing an error, it -- is given an infinite table as an environment. Reading a non-existant -- key from an infinite table returns another infinite table, rather than -- the default value of nil. local infinite_table_mt infinite_table_mt = { __index = function(_, _) return setmetatable({}, infinite_table_mt) end } -- To abort evaluation of the chunk after Language() is called, a unique -- marker is used as an error message. The other alternative would be to -- do complex co-routine calls. A freshly made empty table is a suitable -- unique marker. local good_error_marker = {} local env = setmetatable({ utf8 = id, cp437 = cp437conv, pairs = pairs, Language = function(...) local names = {...} -- Use the first name for display purposes (case-dependent!). if names[1] ~= "original_strings" then self.languages[#self.languages + 1] = names[1] -- Also save the second name for internal purposes. self.languages_english[#self.languages_english + 1] = names[2] end -- Associate every passed name with this file, case-independently for _, name in pairs(names) do self.language_to_chunk[name:lower()] = chunk end self.chunk_to_names[chunk] = names error(good_error_marker) end, Font = function(...) self.chunk_to_font[chunk] = ... end, -- Set Inherit and SetSpeechFile to do nothing Inherit = function() end, SetSpeechFile = function() end, Encoding = function() end, -- Set LoadStrings to return an infinite table LoadStrings = infinite_table_mt.__index, }, infinite_table_mt) -- Actually run the language file local status, err = pcall(chunk, env) if not status and err ~= good_error_marker and TheApp.good_install_folder then print("Error evaluating " .. filename .. ":\n" .. tostring(err)) end end table.sort(self.languages) end -- String tables are shadowed so that all access to a string table goes -- through a metamethod (which is desirable to catch invalid reads, provide -- "__random", and prevent writes). This means that every string table is in -- fact empty, and has it's keys and values stored in a separate table, called -- the shadow table. The shadows table is used to associate a shadow table -- with a string table. local shadows = setmetatable({}, {__mode = "k"}) -- Metatable which is used for all tables returned by Strings:load() -- The end effect is to raise errors on accesses to non-existant strings -- (unless no_restriction is set to true), to add a special string called -- "__random" to each table (which always resolves to a random string from -- the table), and to prevent editing or adding to a string table. local strings_metatable = function(no_restriction) return { __index = function(t, key) t = shadows[t] local val = t[key] if val ~= nil then return val end if key ~= "__random" then if no_restriction then return nil end error("Non-existant string: " .. tostring(key), 2) end local candidates = {} for _, v in pairs(t) do candidates[#candidates + 1] = v end return candidates[math.random(1, #candidates)] end, __newindex = function(_, _, _) error("String tables are read-only", 2) end, __pairs = function(t) return pairs(shadows[t]) end, __ipairs = function(t) return ipairs(shadows[t]) end, } end -- no_restriction disables errors on access to non-existant strings (for debug purposes) -- no_inheritance disables inheritance except original_strings (for debug purposes) function Strings:load(language, no_restriction, no_inheritance) assert(language ~= "original_strings", "Original strings can not be loaded directly. Please select a proper language.") -- env is the table of globals to execute to the language file in, and hence -- it also stores the resulting strings. local env = {} shadows[env] = {} -- speech_file holds the result of any call to SetSpeechFile() local speech_file local default_encoding = id local encoding = default_encoding local language_called = false local functions; functions = { -- Convert UTF-8 to the file's default encoding utf8 = function(s) if encoding == cp437conv then return utf8conv(s) else return s end end, -- Convert CP437 to the file's default encoding cp437 = function(s) if encoding == cp437conv then return s else return cp437conv(s) end end, ipairs = ipairs, pairs = pairs, -- Calling the Langauage() function should have no effect any more Language = function() language_called = true end, Font = function() if language_called then error("Font declaration must occur before Language declaration") end end, -- Inherit() should evaluate the named language in the current environment -- NB: Inheritance of any but original_strings disabled when no_inheritance set Inherit = function(lang, ...) if no_inheritance and lang ~= "original_strings" then return end local old_encoding = encoding encoding = default_encoding local old_language_called = language_called language_called = false self:_loadPrivate(lang, env, ...) encoding = old_encoding language_called = old_language_called end, -- Encoding() should set the default encoding for the remainder of the file Encoding = function(new_encoding) if new_encoding == functions.utf8 then encoding = id elseif new_encoding == functions.cp437 then encoding = cp437conv else error("Invalid encoding; expected utf8 or cp437") end end, -- LoadStrings() should return the original game string table LoadStrings = function(filename) return assert(TH.LoadStrings(self.app:readDataFile(filename)), "Cannot load original string file '" .. filename .. "'") end, -- SetSpeechFile() should remember the named file to return to our caller SetSpeechFile = function(...) speech_file = ... end, _G = env, type = type, } -- The metatable on the environment is set so that the above functions look -- like top-level level globals, so that the environment behaves like an -- infinite table, and so that assignments are merged into the string table. local metatable metatable = { __index = function(t, k) -- Make the functions look like top-level globals local shadow = shadows[t] local value = ((t == env) and functions[k]) or shadow[k] if value == nil then value = setmetatable({}, metatable) shadow[k] = value shadows[value] = {} end return value end, __newindex = function(t, k, v) local ty = type(v) if ty ~= "table" then -- non-table values cannot be merged if ty == "string" then -- convert from file's default encoding to UTF-8 v = encoding(v) end shadows[t][k] = v else -- v should be merged into t[k] -- Perform t[k][k2] = v2 for each (k2, v2) in v to recursively merge t = t[k] for k2, v2 in pairs(v) do t[k2] = v2 end end end, } metatable.__pairs = strings_metatable(no_restriction).__pairs -- Evaluate the language file setmetatable(env, metatable) self:_loadPrivate(language, env) -- Change the metamethods on every string table to match strings_metatable for k, v in pairs(strings_metatable(no_restriction)) do metatable[k] = v end return env, speech_file end --! Get the Font() declaration of a language, if there was one. function Strings:getFont(language) local chunk = self.language_to_chunk[language:lower()] return chunk and self.chunk_to_font[chunk] end function Strings:getLanguageNames(language) local chunk = self.language_to_chunk[language:lower()] return chunk and self.chunk_to_names[chunk] end function Strings:_loadPrivate(language, env, ...) local chunk = self.language_to_chunk[language:lower()] if not chunk then -- If selected language could not be found, try to revert to English print(serialize(self.language_to_chunk, {detect_cycles=true, pretty=true})) print("Language '" .. language .. "' could not be found. Reverting to English.") chunk = self.language_to_chunk["english"] if not chunk then -- If english could not be found, raise an error error("Language 'English' could not be found. Please verify your installation.") end end local status, err = pcall(chunk, env, ...) if not status and self.app.good_install_folder then print("Error evaluating " .. self.language_chunks[chunk] .. ":\n" .. tostring(err)) end end function Strings:setupAdviserMessage(messages) local prioTable prioTable = { _priority = 5, -- Default priority tutorial = { _priority = 11}, epidemic = { _priority = 6 }, --staff_advice --earthquake --multiplayer --surgery_requirements --vomit_wave --level_progress --staff_place_advice --room_forbidden_non_reachable_parts --research --boiler_issue --room_requirements --goals warnings = { _priority = 10 }, --placement_info praise = { _priority = 1 }, --information --build_advice --cheats } local formatFunc formatFunc = function(format_self, arg) -- After 'format', it is not useful to have indexing magic anymore. return { text = format_self.text:format(arg), priority = format_self.priority } end local indexFunc indexFunc = function(index_self, field) -- Since prioTable is a partial table, index_self.table may disappear, prevent infinite recursion. if field == "table" then return nil end local val = {} val.text = index_self.text[field] val.format = formatFunc val.table = index_self.table val.priority = index_self.priority if val.table ~= nil then val.table = val.table[field] if val.table ~= nil and val.table._priority ~= nil then val.priority = val.table._priority end end setmetatable(val, {__index = indexFunc}) return val end -- Initial value local adviserMessage = { text = messages, table = prioTable, priority = prioTable._priority, format = formatFunc } setmetatable(adviserMessage, {__index = indexFunc}) return adviserMessage end -- Primitive system to map UTF-8 characters onto Code Page 437. -- Provided so that language scripts can encode text in a modern and well -- supported manner, and have the text automatically transcoded into the -- encoding which the Theme Hospital fonts use. local codepoints_to_cp437 = { -- Below 0x80 need no translation [0xC7] = 0x80, -- majuscule c-cedilla [0xFC] = 0x81, -- minuscule u-umlaut [0xE9] = 0x82, -- minuscule e-acute [0xE2] = 0x83, -- minuscule a-circumflex [0xE4] = 0x84, -- minuscule a-umlaut [0xE0] = 0x85, -- minuscule a-grave [0xE5] = 0x86, -- minuscule a-ring [0xE7] = 0x87, -- minuscule c-cedilla [0xEA] = 0x88, -- minuscule e-circumflex [0xEB] = 0x89, -- minuscule e-umlaut [0xE8] = 0x8A, -- minuscule e-grave [0xEF] = 0x8B, -- minuscule i-umlaut [0xEE] = 0x8C, -- minuscule i-circumflex [0xEC] = 0x8D, -- minuscule i-grave [0xC4] = 0x8E, -- majuscule a-umlaut [0xC5] = 0x8F, -- majuscule a-ring [0xC9] = 0x90, -- majuscule e-acute [0xE6] = 0x91, -- minuscule ae [0xC6] = 0x91, -- majuscule ae (not in TH fonts - mapped to minuscule ae) [0xF4] = 0x93, -- minuscule o-circumflex [0xF6] = 0x94, -- minuscule o-umlaut [0xF2] = 0x95, -- minuscule o-grave [0xFB] = 0x96, -- minuscule u-circumflex [0xF9] = 0x97, -- minuscule u-grave [0xFF] = 0x98, -- minuscule y-umlaut [0xD6] = 0x99, -- majuscule o-umlaut [0xDC] = 0x9A, -- majuscule u-umlaut -- 0x9B through 0x9F are currency symbols and not present in TH fonts [0xE1] = 0xA0, -- minuscule a-acute [0xED] = 0xA1, -- minuscule i-acute [0xF3] = 0xA2, -- minuscule o-acute [0xFA] = 0xA3, -- minuscule u-acute [0xF1] = 0xA4, -- minuscule n-tilde [0xD1] = 0xA5, -- majuscule n-tilde -- 0xA6 and 0xA7 are ordinal indicators and not present in TH fonts [0xBF] = 0xA8, -- inverted question mark -- 0xA9 through 0xAC are not present in TH fonts [0xA1] = 0xAD, -- inverted exclaimation mark -- 0xAE through 0xE0 are not present in TH fonts [0xDF] = 0xE1, -- eszett / sharp-S / lowercase-beta -- 0xE2 through 0xFF are not present in TH fonts } local cp437_to_codepoints = { [0x91] = 0xE6, -- minuscule ae [0x9B] = 0xA2, -- cent sign [0x9C] = 0xA3, -- pound sign [0x9D] = 0xA5, -- yen sign [0x9E] = 0x20A7, -- peseta sign [0x9F] = 0x192, -- florin sign [0xA6] = 0xAA, -- a ordinal indicator [0xA7] = 0xBA, -- o ordinal indicator [0xA9] = 0x2310, -- negation [0xAA] = 0xAC, -- negation [0xAB] = 0xBD, -- 1/2 [0xAC] = 0xBC, -- 1/4 [0xAE] = 0xAB, -- << guillemets [0xAF] = 0xBB, -- >> guillemets -- 0xB0 through 0xDF omitted [0xE0] = 0x3B1, -- alpha [0xE2] = 0x393, -- gamma [0xE3] = 0x3C0, -- pi [0xE4] = 0x3A3, -- majuscule sigma [0xE5] = 0x3C3, -- minuscule sigma [0xE6] = 0x3BC, -- minuscule mu [0xE7] = 0x3C4, -- tau [0xE8] = 0x3A6, -- majuscule phi [0xE9] = 0x398, -- theta [0xEA] = 0x3A9, -- omega [0xEB] = 0x3B4, -- delta [0xEC] = 0x221E, -- infinity [0xED] = 0x3C6, -- minuscule phi [0xEE] = 0x3B5, -- epsilon [0xEF] = 0x2229, -- set intersection [0xF0] = 0x2261, -- modular congruence / triple equals [0xF1] = 0xB1, -- plus / minus [0xF2] = 0x2265, -- >= [0xF3] = 0x2264, -- <= [0xF4] = 0x2320, -- upper integral sign [0xF5] = 0x2321, -- lower integral sign [0xF6] = 0xF7, -- obelus [0xF7] = 0x2248, -- approximate equality [0xF8] = 0xB0, -- degree symbol [0xF9] = 0x2219, -- bullet [0xFA] = 0xB7, -- interpunct [0xFB] = 0x221A, -- square root [0xFC] = 0x207F, -- exponentiation [0xFD] = 0xB2, -- superscript 2 [0xFE] = 0x25A0, -- filled square [0xFF] = 0xA0, -- non-breaking space } local function utf8encode(codepoint) if codepoint <= 0x7F then return string.char(codepoint) elseif codepoint <= 0x7FF then local sextet = codepoint % 64 codepoint = math.floor((codepoint - sextet) / 64) return string.char(0xC0 + codepoint, 0x80 + sextet) elseif codepoint <= 0xFFFF then local sextet2 = codepoint % 64 codepoint = math.floor((codepoint - sextet2) / 64) local sextet1 = codepoint % 64 codepoint = math.floor((codepoint - sextet2) / 64) return string.char(0xE0 + codepoint, 0x80 + sextet1, 0x80 + sextet2) else local sextet3 = codepoint % 64 codepoint = math.floor((codepoint - sextet3) / 64) local sextet2 = codepoint % 64 codepoint = math.floor((codepoint - sextet2) / 64) local sextet1 = codepoint % 64 codepoint = math.floor((codepoint - sextet2) / 64) return string.char(0xF0 + codepoint, 0x80 + sextet1, 0x80 + sextet2, 0x80 + sextet3) end end local cp437_to_utf8_pattern = {"["} local cp437_to_utf8_replacement = {} for codepoint, cp437 in pairs(codepoints_to_cp437) do if not cp437_to_codepoints[cp437] then cp437_to_utf8_pattern[#cp437_to_utf8_pattern + 1] = string.char(cp437) cp437_to_utf8_replacement[string.char(cp437)] = utf8encode(codepoint) end end for cp437, codepoint in pairs(cp437_to_codepoints) do cp437_to_utf8_pattern[#cp437_to_utf8_pattern + 1] = string.char(cp437) cp437_to_utf8_replacement[string.char(cp437)] = utf8encode(codepoint) end cp437_to_utf8_pattern[#cp437_to_utf8_pattern + 1] = "]" cp437_to_utf8_pattern = table.concat(cp437_to_utf8_pattern) cp437conv = function(s) return (s:gsub(cp437_to_utf8_pattern, cp437_to_utf8_replacement)) end -- Table which maps a single character and a single unicode combining -- diacritical mark to a single unicode codepoint local circumflex = 0x302 local cedilla = 0x327 local umlaut = 0x308 local acute = 0x301 local grave = 0x300 local ring = 0x30A local tilde = 0x303 local combine_diacritical_marks = { a = { [grave] = 0xE0, [acute] = 0xE1, [circumflex] = 0xE2, [umlaut] = 0xE4, [ring] = 0xE5, }, e = { [grave] = 0xE8, [acute] = 0xE9, [circumflex] = 0xEA, [umlaut] = 0xEB, }, i = { [grave] = 0xEC, [acute] = 0xED, [circumflex] = 0xEE, [umlaut] = 0xEF, }, o = { [grave] = 0xF2, [acute] = 0xF3, }, u = { [grave] = 0xF9, [acute] = 0xFA, [circumflex] = 0xFB, [umlaut] = 0xFC, }, c = { [cedilla] = 0xE7, }, n = { [tilde] = 0xF1, }, y = { [umlaut] = 0xFF, }, A = { [umlaut] = 0xC4, [ring] = 0xC5, }, E = { [acute] = 0xC9, }, O = { [umlaut] = 0xD6, }, U = { [umlaut] = 0xDC, }, C = { [cedilla] = 0xC7, }, N = { [tilde] = 0xD1, }, } local function utf8char(c) -- Test for presence of a normal character prior to the utf-8 character local prechar if c:byte() < 128 then prechar = c:sub(1, 1) c = c:sub(2, -1) end -- Extract the codepoint of the utf-8 character local codepoint = 0 local multiplier = 1 for i = #c, 2, -1 do codepoint = codepoint + (c:byte(i) - 128) * multiplier multiplier = multiplier * 2^6 end codepoint = codepoint + (c:byte(1) % 2^(7 - #c)) * multiplier -- If the utf-8 character is a combining diacritical mark, merge it with the -- preceding normal character if prechar and (0x300 <= codepoint and codepoint < 0x370) then if combine_diacritical_marks[prechar] then if combine_diacritical_marks[prechar][codepoint] then codepoint = combine_diacritical_marks[prechar][codepoint] prechar = nil else return prechar end else return prechar end end -- Convert to Code Page 437 return (prechar or "") .. string.char(codepoints_to_cp437[codepoint] or 0x3F) end utf8conv = function(s) -- Pull out each individual utf-8 character and pass it through utf8char -- [\1-\127] picks up a preceding ASCII character to combine diacritics -- [\192-\253] picks up the first byte of a utf-8 character (technically -- only 194 through 244 should be used) -- [\128-\191] picks up the remaining bytes of a utf-8 character return (s:gsub("[\1-\127]?[\192-\253][\128-\191]*", utf8char)) end -- Fix string.upper and string.lower to work with CP437 rather than current locale local lower_to_upper, upper_to_lower = {}, {} local function case(lower, upper) lower = cp437conv(string.char(lower)) upper = cp437conv(string.char(upper)) lower_to_upper[lower] = upper lower_to_upper[upper] = upper upper_to_lower[lower] = lower upper_to_lower[upper] = lower end case(0x87, 0x80) -- c-cedilla case(0x81, 0x9A) -- u-umlaut case(0x82, 0x90) -- e-acute case(0x84, 0x8E) -- a-umlaut case(0x86, 0x8F) -- a-ring case(0x94, 0x99) -- o-umlaut case(0xA4, 0xA5) -- n-tilde local case_pattern = "\195[\128-\191]" -- Unicode range [0xC0, 0xFF] as UTF-8 local orig_upper = string.upper function string.upper(s) return orig_upper(s:gsub(case_pattern, lower_to_upper)) end local orig_lower = string.lower function string.lower(s) return orig_lower(s:gsub(case_pattern, upper_to_lower)) end CorsixTH-0.63/CorsixTH/Lua/ui.lua000066400000000000000000001074361347163623700165400ustar00rootroot00000000000000--[[ Copyright (c) 2009 Peter "Corsix" Cawley 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. --]] corsixth.require("window") --! Top-level container for all other user-interface components. class "UI" (Window) ---@type UI local UI = _G["UI"] local TH = require("TH") local SDL = require("sdl") local WM = SDL.wm local lfs = require("lfs") local function invert(t) local r = {} for k, v in pairs(t) do if type(v) == "table" then for _, val in ipairs(v) do r[val] = k end else r[v] = k end end return r end function UI:initKeyAndButtonCodes() local key_remaps = {} local button_remaps = {} local key_to_button_remaps = {} local key_norms = setmetatable({ [" "] = "space", esc = "escape", }, {__index = function(t, k) k = tostring(k):lower() return rawget(t, k) or k end}) --[===[ do local ourpath = debug.getinfo(1, "S").source:sub(2, -7) local result, err = loadfile_envcall(ourpath .. "key_mapping.txt") if not result then print("Cannot load key mapping:" .. err) else local env = { key_remaps = function(t) for k, v in pairs(t) do key_remaps[key_norms[k]] = key_norms[v] end end, button_remaps = function(t) for k, v in pairs(t) do k = key_norms[k] if k == "left" or k == "middle" or k == "right" then button_remaps[k] = key_norms[v] else key_to_button_remaps[k] = key_norms[v] end end end, } setmetatable(env, {__index = function(_, k) return k end}) result(env) end end ]===] local keypad = { ["Keypad 0"] = "insert", ["Keypad 1"] = "end", ["Keypad 2"] = "down", ["Keypad 3"] = "pagedown", ["Keypad 4"] = "left", ["Keypad 6"] = "right", ["Keypad 7"] = "home", ["Keypad 8"] = "up", ["Keypad 9"] = "pageup", ["Keypad ."] = "delete", } -- Apply keypad remapping for k, v in pairs(keypad) do key_remaps[key_norms[k]] = key_norms[v] end self.key_remaps = key_remaps self.key_to_button_remaps = key_to_button_remaps self.button_codes = { left = 1, middle = 2, right = 3, } -- Apply button remaps directly to codes, as mouse button codes are reliable -- (keyboard key codes are not). local original_button_codes = {} for input, behave_as in pairs(button_remaps) do local code = original_button_codes[input] or self.button_codes[input] or {} if not original_button_codes[input] then original_button_codes[input] = code self.button_codes[input] = nil end if not original_button_codes[behave_as] then original_button_codes[behave_as] = self.button_codes[behave_as] end self.button_codes[behave_as] = code end self.button_codes = invert(self.button_codes) end local LOADED_DIALOGS = false function UI:UI(app, minimal) self:Window() self:initKeyAndButtonCodes() self.app = app self.screen_offset_x = 0 self.screen_offset_y = 0 self.cursor = nil self.cursor_entity = nil self.debug_cursor_entity = nil -- through trial and error, this palette seems to give the desired result (white background, black text) -- NB: Need a palette present in both the full game and in the demo data if minimal then self.tooltip_font = app.gfx:loadBuiltinFont() else local palette = app.gfx:loadPalette("QData", "PREF01V.PAL") palette:setEntry(255, 0xFF, 0x00, 0xFF) -- Make index 255 transparent self.tooltip_font = app.gfx:loadFont("QData", "Font00V", false, palette) end self.tooltip = nil self.tooltip_counter = 0 self.background = false -- tick_scroll_amount will either hold a table containing x and y values, at -- at least one of which being non-zero. If both x and y are zero, then the -- value false should be used instead, so that tests to see if there is any -- scrolling to be done are quick and simple. self.tick_scroll_amount = false self.tick_scroll_amount_mouse = false self.tick_scroll_mult = 1 self.modal_windows = { -- [class_name] -> window, } -- Windows can tell UI to pass specific codes forward to them. See addKeyHandler and removeKeyHandler self.key_handlers = {} -- For use in onKeyUp when assigning hotkeys in the "Assign Hotkeys" window. self.temp_button_down = false -- self.key_noted = false self.mouse_released = false self.down_count = 0 if not minimal then self.default_cursor = app.gfx:loadMainCursor("default") self.down_cursor = app.gfx:loadMainCursor("clicked") self.grab_cursor = app.gfx:loadMainCursor("grab") self.edit_room_cursor = app.gfx:loadMainCursor("edit_room") self.waiting_cursor = app.gfx:loadMainCursor("sleep") end self.editing_allowed = true if not LOADED_DIALOGS then app:loadLuaFolder("dialogs", true) app:loadLuaFolder("dialogs/fullscreen", true) app:loadLuaFolder("dialogs/resizables", true) app:loadLuaFolder("dialogs/resizables/menu_list_dialogs", true) app:loadLuaFolder("dialogs/resizables/file_browsers", true) LOADED_DIALOGS = true end self:setCursor(self.default_cursor) -- to avoid a bug which causes open fullscreen windows to display incorrectly, load -- the sprite sheet associated with all fullscreen windows so they are correctly cached. -- Darrell: Only do this if we have a valid data directory otherwise we won't be able to -- display the directory browser to even find the data directory. -- Edvin: Also, the demo does not contain any of the dialogs. if self.app.good_install_folder and not self.app.using_demo_files then local gfx = self.app.gfx local palette -- load drug casebook sprite table palette = gfx:loadPalette("QData", "DrugN01V.pal") palette:setEntry(255, 0xFF, 0x00, 0xFF) -- Make index 255 transparent gfx:loadSpriteTable("QData", "DrugN02V", true, palette) -- load fax sprite table palette = gfx:loadPalette("QData", "Fax01V.pal") palette:setEntry(255, 0xFF, 0x00, 0xFF) -- Make index 255 transparent gfx:loadSpriteTable("QData", "Fax02V", true, palette) -- load town map sprite table palette = gfx:loadPalette("QData", "Town01V.pal") palette:setEntry(255, 0xFF, 0x00, 0xFF) -- Make index 255 transparent gfx:loadSpriteTable("QData", "Town02V", true, palette) -- load hospital policy sprite table palette = gfx:loadPalette("QData", "Pol01V.pal") palette:setEntry(255, 0xFF, 0x00, 0xFF) -- Make index 255 transparent gfx:loadSpriteTable("QData", "Pol02V", true, palette) -- load bank manager sprite table palette = gfx:loadPalette("QData", "Bank01V.pal") palette:setEntry(255, 0xFF, 0x00, 0xFF) -- Make index 255 transparent gfx:loadSpriteTable("QData", "Bank02V", true, palette) -- load research screen sprite table palette = gfx:loadPalette("QData", "Res01V.pal") palette:setEntry(255, 0xFF, 0x00, 0xFF) -- Make index 255 transparent gfx:loadSpriteTable("QData", "Res02V", true, palette) -- load progress report sprite table palette = gfx:loadPalette("QData", "Rep01V.pal") palette:setEntry(255, 0xFF, 0x00, 0xFF) -- Make index 255 transparent gfx:loadSpriteTable("QData", "Rep02V", true, palette) -- load annual report sprite table palette = gfx:loadPalette("QData", "Award02V.pal") palette:setEntry(255, 0xFF, 0x00, 0xFF) -- Make index 255 transparent gfx:loadSpriteTable("QData", "Award03V", true, palette) end self:setupGlobalKeyHandlers() end function UI:runDebugScript() print("Executing Debug Script...") local path_sep = package.config:sub(1, 1) local lua_dir = debug.getinfo(1, "S").source:sub(2, -8) _ = TheApp.ui and TheApp.ui.debug_cursor_entity local script = assert(loadfile(lua_dir .. path_sep .. "debug_script.lua")) script() end function UI:setupGlobalKeyHandlers() -- Add some global keyhandlers self:addKeyHandler("global_cancel", self, self.closeWindow) self:addKeyHandler("global_cancel_alt", self, self.closeWindow) self:addKeyHandler("global_stop_movie", self, self.stopMovie) self:addKeyHandler("global_screenshot", self, self.makeScreenshot) self:addKeyHandler("global_fullscreen_toggle", self, self.toggleFullscreen) self:addKeyHandler("global_exitApp", self, self.exitApplication) self:addKeyHandler("global_resetApp", self, self.resetApp) self:addKeyHandler("global_releaseMouse", self, self.releaseMouse) self:addOrRemoveDebugModeKeyHandlers() end function UI:connectDebugger() local error_message = TheApp:connectDebugger() if error_message then self:addWindow(UIInformation(self, {error_message})) end end -- Used for everything except music and announcements function UI:playSound(name, played_callback, played_callback_delay) if self.app.config.play_sounds then self.app.audio:playSound(name, nil, false, played_callback, played_callback_delay) end end -- Used for announcements only function UI:playAnnouncement(name, priority, played_callback, played_callback_delay) if self.app.config.play_announcements then self.app.audio:playSound(name, nil, true, played_callback, played_callback_delay) end end function UI:setDefaultCursor(cursor) if cursor == nil then cursor = "default" end if type(cursor) == "string" then cursor = self.app.gfx:loadMainCursor(cursor) end if self.cursor == self.default_cursor then self:setCursor(cursor) end self.default_cursor = cursor end function UI:setCursor(cursor) if cursor ~= self.cursor then self.cursor = cursor if cursor.use then -- Cursor is a true C cursor, perhaps even a hardware cursor. -- Make the real cursor visible, and use this as it. self.simulated_cursor = nil WM.showCursor(true) cursor:use(self.app.video) else -- Cursor is a Lua simulated cursor. -- Make the real cursor invisible, and simulate it with this. WM.showCursor(self.mouse_released) self.simulated_cursor = cursor end end end function UI:drawTooltip(canvas) if not self.tooltip or not self.tooltip_counter or self.tooltip_counter > 0 then return end local x, y = self.tooltip.x, self.tooltip.y if not self.tooltip.x then -- default to cursor position for (lower left corner of) tooltip x, y = self:getCursorPosition() end if self.tooltip_font then self.tooltip_font:drawTooltip(canvas, self.tooltip.text, x, y) end end function UI:draw(canvas) local app = self.app if self.background then local bg_w, bg_h = self.background_width, self.background_height local screen_w, screen_h = app.config.width, app.config.height local factor = math.max(screen_w / bg_w, screen_h / bg_h) if canvas:scale(factor, "bitmap") or canvas:scale(factor) then self.background:draw(canvas, math.floor((screen_w - bg_w * factor) / 2), math.floor((screen_h - bg_h * factor) / 2)) canvas:scale(1) else canvas:fillBlack() self.background:draw(canvas, math.floor((screen_w - bg_w) / 2), math.floor((screen_h - bg_h) / 2)) end end Window.draw(self, canvas, 0, 0) self:drawTooltip(canvas) if self.simulated_cursor then self.simulated_cursor.draw(canvas, self.cursor_x, self.cursor_y) end end --! Register a key handler / hotkey for a window. --!param keys (string or table) The keyboard key which should trigger the callback (for -- example, "left" or "z" or "F9"), or a list with modifier(s) and the key (e.g. {"ctrl", "s"}). --!param window (Window) The UI window which should receive the callback. --!param callback (function) The method to be called on `window` when `key` is -- pressed. --!param ... Additional arguments to `callback`. function UI:addKeyHandler(keys, window, callback, ...) -- It is nessecary to clone the key table into another temporary table, as if we don't the original table that we take it from will lose -- the last key of that table permenently in the next line of code after this one, until the program is restarted. -- I.E. if the "ingame_quitLevel" hotkey from the "hotkeys_values" table in "config_finder.lua" is a table that looks like this: -- {"shift", "q"} -- We would lose the "q" element until we restarted the game and the "hotkey.txt" was read from again, causing the "ingame_quitLevel" -- table to be reset back to {"shift, "q"} local temp_keys = {} -- Check to see if "keys" key exist in the hotkeys table. if self.app.hotkeys[keys] ~= nil then if type(self.app.hotkeys[keys]) == "table" then temp_keys = shallow_clone(self.app.hotkeys[keys]) elseif type(self.app.hotkeys[keys]) == "string" then temp_keys = shallow_clone({self.app.hotkeys[keys]}) end else if type(keys) == "string" then print(string.format("\"%s\" does not exist in the hotkeys configuration file.", keys)) else print("Useage of addKeyHandler() requires the first argument to be a string of a key that can be found in the hotkeys configuration file.") end end if temp_keys ~= nil then local has_enterOrPlus local temp_keys_copy = {} if type(temp_keys) == "table" then temp_keys_copy = shallow_clone(temp_keys) elseif type(temp_keys) == "string" then temp_keys_copy = {temp_keys} end for _, v in pairs(temp_keys_copy) do if v == "enter" then has_enterOrPlus = true elseif v == "return" then has_enterOrPlus = true elseif v == "+" then has_enterOrPlus = true elseif v == "=" then has_enterOrPlus = true else has_enterOrPlus = false end end local key = table.remove(temp_keys, #temp_keys):lower() local modifiers = list_to_set(temp_keys) -- SET of modifiers if not self.key_handlers[key] then -- No handlers for this key? Create a new table. self.key_handlers[key] = {} end table.insert(self.key_handlers[key], { modifiers = modifiers, window = window, callback = callback, ... }) -- If the handler added has enter, return, plus, or minus in it... if has_enterOrPlus then for k, _ in pairs(temp_keys_copy) do if temp_keys_copy[k] == "enter" then temp_keys_copy[k] = "return" elseif temp_keys_copy[k] == "return" then temp_keys_copy[k] = "enter" elseif temp_keys_copy[k] == "+" then temp_keys_copy[k] = "=" elseif temp_keys_copy[k] == "=" then temp_keys_copy[k] = "+" end end local key_02 = table.remove(temp_keys_copy, #temp_keys_copy):lower() local modifiers_02 = list_to_set(temp_keys_copy) -- SET of modifiers if not self.key_handlers[key_02] then -- No handlers for this key? Create a new table. self.key_handlers[key_02] = {} end -- Then make the same handler, but with the complementary button. -- i.e. If it asks for "enter", it will also add "return". table.insert(self.key_handlers[key_02], { modifiers = modifiers_02, window = window, callback = callback, ... }) end else print("addKeyHandler() failed.") end end --! Unregister a key handler previously registered by `addKeyHandler`. --!param keys (string or table) The key or list of modifiers+key of a key / window -- pair previously passed to `addKeyHandler`. --!param window (Window) The window of a key / window pair previously passed -- to `addKeyHandler`. function UI:removeKeyHandler(keys, window) local temp_keys = nil -- Check to see if "keys" key exist in the hotkeys table. if self.app.hotkeys[keys] ~= nil then if type(self.app.hotkeys[keys]) == "table" then temp_keys = shallow_clone(self.app.hotkeys[keys]) elseif type(self.app.hotkeys[keys]) == "string" then temp_keys = shallow_clone({self.app.hotkeys[keys]}) end else if type(keys) == "string" then print(string.format("\"%s\" does not exist in the \"ui.key_handlers\" table.", keys)) else print("Useage of removeKeyHandler() requires the first argument to be a string of a key that can be found in the \"ui.key_handlers\" table.") end end if temp_keys ~= nil then local has_enterOrPlus local temp_keys_copy = {} if type(temp_keys) == "table" then temp_keys_copy = shallow_clone(temp_keys) elseif type(temp_keys) == "string" then temp_keys_copy = shallow_clone({temp_keys}) end for _, v in pairs(temp_keys_copy) do if v == "enter" then has_enterOrPlus = true elseif v == "return" then has_enterOrPlus = true elseif v == "+" then has_enterOrPlus = true elseif v == "=" then has_enterOrPlus = true else has_enterOrPlus = false end end local key = table.remove(temp_keys, #temp_keys):lower() local modifiers = list_to_set(temp_keys) -- SET of modifiers if self.key_handlers[key] then for index, info in ipairs(self.key_handlers[key]) do if info.window == window and compare_tables(info.modifiers, modifiers) then table.remove(self.key_handlers[key], index) end end -- If last key handler was removed, delete the (now empty) list. if #self.key_handlers[key] == 0 then self.key_handlers[key] = nil end end -- If the handler added has enter, return, plus, or minus in it... if has_enterOrPlus then for k, _ in pairs(temp_keys_copy) do if temp_keys_copy[k] == "enter" then temp_keys_copy[k] = "return" elseif temp_keys_copy[k] == "return" then temp_keys_copy[k] = "enter" elseif temp_keys_copy[k] == "+" then temp_keys_copy[k] = "=" elseif temp_keys_copy[k] == "=" then temp_keys_copy[k] = "+" end end local key_02 = table.remove(temp_keys_copy, #temp_keys_copy):lower() local modifiers_02 = list_to_set(temp_keys_copy) -- SET of modifiers if self.key_handlers[key_02] then for index, info in ipairs(self.key_handlers[key_02]) do if info.window == window and compare_tables(info.modifiers, modifiers_02) then table.remove(self.key_handlers[key_02], index) end end -- If last key handler was removed, delete the (now empty) list. if #self.key_handlers[key_02] == 0 then self.key_handlers[key_02] = nil end end end end end --! Set the menu background image --! --! The menu size closest to, but no larger than the height of the currently --! set game window is selected. If no image fits that criteria the smallest --! available image is used. function UI:setMenuBackground() local screen_h = self.app.config.height local bg_size_idx = 1 -- Available mainmenu*.bmp sizes local menu_bg_sizes = { {640, 480}, {1280, 720}, {1920, 1080}, } for i, bg_size in ipairs(menu_bg_sizes) do if screen_h >= bg_size[2] then bg_size_idx = i else break end end local bg_size = menu_bg_sizes[bg_size_idx] self.background_width = bg_size[1] self.background_height = bg_size[2] self.background = self.app.gfx:loadRaw("mainmenu" .. bg_size[2], bg_size[1], bg_size[2], "Bitmap") end function UI:onChangeResolution() -- If we are in the main menu (== no world), reselect the background if not self.app.world then self:setMenuBackground() end -- Inform windows of resolution change if not self.windows then return end for _, window in ipairs(self.windows) do window:onChangeResolution() end end function UI:registerTextBox(box) self.textboxes[#self.textboxes + 1] = box end function UI:unregisterTextBox(box) for num, b in ipairs(self.textboxes) do if b == box then table.remove(self.textboxes, num) break end end end function UI:registerHotkeyBox(box) self.hotkeyboxes[#self.hotkeyboxes + 1] = box end function UI:unregisterHotkeyBox(box) for num, b in ipairs(self.hotkeyboxes) do if b == box then table.remove(self.hotkeyboxes, num) break end end end function UI:changeResolution(width, height) self.app:prepareVideoUpdate() local error_message = self.app.video:update(width, height, unpack(self.app.modes)) self.app:finishVideoUpdate() if error_message then print("Warning: Could not change resolution to " .. width .. "x" .. height .. ".") print("The error was: ") print(error_message) return false end self.app.config.width = width self.app.config.height = height -- Redraw cursor local cursor = self.cursor self.cursor = nil self:setCursor(cursor) -- Save new setting in config self.app:saveConfig() self:onChangeResolution() return true end function UI:toggleCaptureMouse() self.app.capturemouse = not self.app.capturemouse self.app.video:setCaptureMouse(self.app.capturemouse) end function UI:setMouseReleased(released) if released == self.mouse_released then return end self.mouse_released = released -- If we are using a software cursor, show the hardware cursor on release -- and hide it again on capture. if self.cursor and not self.cursor.use then WM.showCursor(released) end self.app.video:setCaptureMouse(self.app.capturemouse and not self.app.mouse_released) end function UI:releaseMouse() self:setMouseReleased(true) end function UI:toggleFullscreen() local modes = self.app.modes local function toggleMode(index) self.app.fullscreen = not self.app.fullscreen if self.app.fullscreen then modes[index] = "fullscreen" else modes[index] = "" end end -- Search in modes table if it contains a fullscreen value and keep the index -- If not found, we will add an index at end of table local index = #modes + 1 for i=1, #modes do if modes[i] == "fullscreen" then index = i break end end -- Toggle Fullscreen mode toggleMode(index) local success = true self.app:prepareVideoUpdate() local error_message = self.app.video:update(self.app.config.width, self.app.config.height, unpack(modes)) self.app:finishVideoUpdate() if error_message then success = false local mode_string = modes[index] or "windowed" print("Warning: Could not toggle to " .. mode_string .. " mode with resolution of " .. self.app.config.width .. "x" .. self.app.config.height .. ".") -- Revert fullscreen mode modifications toggleMode(index) end -- Redraw cursor local cursor = self.cursor self.cursor = nil self:setCursor(cursor) if success then -- Save new setting in config self.app.config.fullscreen = self.app.fullscreen self.app:saveConfig() end return success end --! Called when the user presses a key on the keyboard --!param rawchar (string) The name of the key the user pressed. --!param is_repeat (boolean) True if this is a key repeat event function UI:onKeyDown(rawchar, modifiers, is_repeat) local handled = false -- Apply key-remapping and normalisation rawchar = string.sub(rawchar,1,6) == "Keypad" and modifiers["numlockactive"] and string.sub(rawchar,8) or rawchar local key = rawchar:lower() do local mapped_button = self.key_to_button_remaps[key] if mapped_button then self:onMouseDown(mapped_button, self.cursor_x, self.cursor_y) return true end key = self.key_remaps[key] or key end -- Remove numlock modifier modifiers["numlockactive"] = nil -- If there is one, the current textbox gets the key. -- It will not process any text at this point though. for _, box in ipairs(self.textboxes) do if box.enabled and box.active and not handled then handled = box:keyInput(key, rawchar) end end -- If there is a hotkey box for _, hotkeybox in ipairs(self.hotkeyboxes) do if hotkeybox.enabled and hotkeybox.active and not handled then handled = hotkeybox:keyInput(key, rawchar, modifiers) end end -- Otherwise, if there is a key handler bound to the given key, then it gets -- the key. if not handled then local keyHandlers = self.key_handlers[key] if keyHandlers then -- Iterate over key handlers and call each one whose modifier(s) are pressed -- NB: Only if the exact correct modifiers are pressed will the shortcut get processed. for _, handler in ipairs(keyHandlers) do if compare_tables(handler.modifiers, modifiers) then handler.callback(handler.window, unpack(handler)) handled = true end end end end self.buttons_down[key] = true self.modifiers_down = modifiers self.key_press_handled = handled return handled end --! Called when the user releases a key on the keyboard --!param rawchar (string) The name of the key the user pressed. function UI:onKeyUp(rawchar) rawchar = SDL.getKeyModifiers().numlockactive and string.sub(rawchar,1,6) == "Keypad" and string.sub(rawchar,8) or rawchar local key = rawchar:lower() self.buttons_down[key] = nil -- Go through all the hotkeyboxes. for _, hotkeybox in ipairs(self.hotkeyboxes) do -- If one is enabled and active... if hotkeybox.enabled and hotkeybox.active then -- If the key lifted is escape... if(key == "escape") then hotkeybox:abort() hotkeybox.noted_keys = {} else -- Check if the current key lifted has already been noted. self.key_noted = false for _, v in pairs(hotkeybox.noted_keys) do if v == key then self.key_noted = true end end -- If the current key hasn't been noted... if self.key_noted == false then hotkeybox.noted_keys[#hotkeybox.noted_keys + 1] = key end -- Says if there is still a button being pressed. self.temp_button_down = false -- Go through and check if there are still any buttons pressed. If so... for _, _ in pairs(self.buttons_down) do -- Then toggle the corresponding bool. self.temp_button_down = true end --If there ISN'T still a button down when a button was released... if self.temp_button_down == false then -- Activate the confirm function on the hotkey box. hotkeybox:confirm() hotkeybox.noted_keys = {} end end end end end function UI:onEditingText(text, start, length) -- Does nothing at the moment. We are handling text input ourselves. end --! Called in-between onKeyDown and onKeyUp. The argument 'text' is a --! string containing the input localized according to the keyboard layout --! the user uses. function UI:onTextInput(text) -- It's time for any active textbox to get input. for _, box in ipairs(self.textboxes) do if box.enabled and box.active then box:textInput(text) end end -- Finally it might happen that a hotkey was not recognized because of -- differing local keyboard layout. Give it another shot. if not self.key_press_handled then local keyHandlers = self.key_handlers[text] if keyHandlers then -- Iterate over key handlers and call each one whose modifier(s) are pressed -- NB: Only if the exact correct modifiers are pressed will the shortcut get processed. for _, handler in ipairs(keyHandlers) do if compare_tables(handler.modifiers, self.modifiers_down) then handler.callback(handler.window, unpack(handler)) end end end end end function UI:onMouseDown(code, x, y) self:setMouseReleased(false) local repaint = false local button = self.button_codes[code] or code if self.app.moviePlayer.playing then if button == "left" then self.app.moviePlayer:stop() end return true end if self.cursor_entity == nil and self.down_count == 0 and self.cursor == self.default_cursor then self:setCursor(self.down_cursor) repaint = true end self.down_count = self.down_count + 1 if x >= 3 and y >= 3 and x < self.app.config.width - 3 and y < self.app.config.height - 3 then self.buttons_down["mouse_"..button] = true end self:updateTooltip() return Window.onMouseDown(self, button, x, y) or repaint end function UI:onMouseUp(code, x, y) local repaint = false local button = self.button_codes[code] or code self.down_count = self.down_count - 1 if self.down_count <= 0 then if self.cursor_entity == nil and self.cursor == self.down_cursor then self:setCursor(self.default_cursor) repaint = true end self.down_count = 0 end self.buttons_down["mouse_"..button] = nil if Window.onMouseUp(self, button, x, y) then repaint = true else if self:ableToClickEntity(self.cursor_entity) then self.cursor_entity:onClick(self, button) repaint = true end end self:updateTooltip() return repaint end function UI:onMouseWheel(x, y) Window.onMouseWheel(self, x, y) end --[[ Determines if a cursor entity can be clicked @param entity (Entity,nil) cursor entity clicked on if any @return true if can be clicked on, false otherwise (boolean) ]] function UI:ableToClickEntity(entity) if self.cursor_entity and self.cursor_entity.onClick then local hospital = entity.hospital local epidemic = hospital and hospital.epidemic return self.app.world.user_actions_allowed and not epidemic or (epidemic and not epidemic.vaccination_mode_active) else return false end end function UI:getScreenOffset() return self.screen_offset_x, self.screen_offset_y end local tooltip_ticks = 30 -- Amount of ticks until a tooltip is displayed function UI:updateTooltip() if self.buttons_down.mouse_left then -- Disable tooltips altogether while left button is pressed. self.tooltip = nil self.tooltip_counter = nil return elseif self.tooltip_counter == nil then self.tooltip_counter = tooltip_ticks end local tooltip = self:getTooltipAt(self.cursor_x, self.cursor_y) if tooltip then -- NB: Do not set counter if tooltip changes here. This allows quick tooltip reading of adjacent buttons. self.tooltip = tooltip else -- Not hovering over any button with tooltip -> reset self.tooltip = nil self.tooltip_counter = tooltip_ticks end end local UpdateCursorPosition = TH.cursor.setPosition --! Called when the mouse enters or leaves the game window. function UI:onWindowActive(gain) end --! Window has been resized by the user --!param width (integer) New window width --!param height (integer) New window height function UI:onWindowResize(width, height) if not self.app.config.fullscreen then self:changeResolution(width, height) end end function UI:onMouseMove(x, y, dx, dy) if self.mouse_released then return false end local repaint = UpdateCursorPosition(self.app.video, x, y) self.cursor_x = x self.cursor_y = y if self.drag_mouse_move then self.drag_mouse_move(x, y) return true end if Window.onMouseMove(self, x, y, dx, dy) then repaint = true end self:updateTooltip() return repaint end --! Process SDL_MULTIGESTURE events. --! --!return (boolean) event processed indicator function UI:onMultiGesture() return false end function UI:onTick() Window.onTick(self) local repaint = false if self.tooltip_counter and self.tooltip_counter > 0 then self.tooltip_counter = self.tooltip_counter - 1 repaint = (self.tooltip_counter == 0) end -- If a tooltip is currently shown, update each tick (may be dynamic) if self.tooltip then self:updateTooltip() end return repaint end function UI:addWindow(window) if window.closed then return end if window.modal_class then -- NB: while instead of if in case of another window being created during the close function while self.modal_windows[window.modal_class] do self.modal_windows[window.modal_class]:close() end self.modal_windows[window.modal_class] = window end if window.modal_class == "main" or window.modal_class == "fullscreen" then self.editing_allowed = false -- do not allow editing rooms if main windows (build, furnish, hire) are open end Window.addWindow(self, window) end function UI:removeWindow(window) if Window.removeWindow(self, window) then local class = window.modal_class if class and self.modal_windows[class] == window then self.modal_windows[class] = nil end if window.modal_class == "main" or window.modal_class == "fullscreen" then self.editing_allowed = true -- allow editing rooms again when main window is closed end return true else return false end end function UI:getCursorPosition(window) -- Given no argument, returns the cursor position in screen space -- Otherwise, returns the cursor position in the space of the given window local x, y = self.cursor_x, self.cursor_y while window ~= nil and window ~= self do x = x - window.x y = y - window.y window = window.parent end return x, y end function UI:addOrRemoveDebugModeKeyHandlers() self:removeKeyHandler("global_connectDebugger", self) self:removeKeyHandler("global_showLuaConsole", self) self:removeKeyHandler("global_runDebugScript", self) if self.app.config.debug then self:addKeyHandler("global_connectDebugger", self, self.connectDebugger) self:addKeyHandler("global_showLuaConsole", self, self.showLuaConsole) self:addKeyHandler("global_runDebugScript", self, self.runDebugScript) end end function UI:afterLoad(old, new) -- Get rid of old key handlers from save file. self.key_handlers = {} if old < 5 then self.editing_allowed = true end self:setupGlobalKeyHandlers() Window.afterLoad(self, old, new) end -- Stub to allow the function to be called in e.g. the information -- dialog without having to worry about a GameUI being present function UI:tutorialStep(...) end function UI:makeScreenshot() -- Find an index for screenshot which is not already used local i = 0 local filename repeat filename = TheApp.screenshot_dir .. ("screenshot%i.bmp"):format(i) i = i + 1 until lfs.attributes(filename, "size") == nil print("Taking screenshot: " .. filename) local res, err = self.app.video:takeScreenshot(filename) -- Take screenshot if not res then print("Screenshot failed: " .. err) else self.app.audio:playSound("SNAPSHOT.WAV") end end --! Closes one window (the topmost / active window, if possible) --!return true iff a window was closed function UI:closeWindow() if not self.windows then return false end -- Close the topmost window first local first = self.windows[1] if first.on_top and first.esc_closes then first:close() return true end for i = #self.windows, 1, -1 do local window = self.windows[i] if window.esc_closes then window:close() return true end end end --! Shows the Lua console function UI:showLuaConsole() self:addWindow(UILuaConsole(self)) end --! Triggers reset of the application (reloads .lua files) function UI:resetApp() debug.getregistry()._RESTART = true TheApp.running = false end -- Added this function as quit does not exit the application, it only exits the game to the menu screen function UI:exitApplication() self.app:abandon() end --! Triggers quitting the application function UI:quit() self.app:exit() end --! Tries to stop a video, if one is currently playing function UI:stopMovie() if self.app.moviePlayer.playing then self.app.moviePlayer:stop() end end -- Stub for compatibility with savegames r1896-1921 function UI:stopVideo() end CorsixTH-0.63/CorsixTH/Lua/utility.lua000066400000000000000000000273641347163623700176270ustar00rootroot00000000000000--[[ Copyright (c) 2009 Peter "Corsix" Cawley 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. --]] --[[ Iterator factory for iterating over the deep children of a table. For example: for fn in values(_G, "*.remove") do fn() end Will call os.remove() and table.remove() There can be multiple wildcards (asterisks). --]] function values(root_table, wildcard) local wildcard_parts = {} for part in wildcard:gmatch("[^.]+") do wildcard_parts[#wildcard_parts + 1] = part end local keys = {} local function f() local value = root_table local nkey = 1 for _, part in ipairs(wildcard_parts) do if part == "*" then local key = keys[nkey] if nkey >= #keys then key = next(value, key) keys[nkey] = key if key == nil then if nkey == 1 then return nil else return f() end end end value = value[key] nkey = nkey + 1 else if type(value) ~= "table" then local mt = getmetatable(value) if not mt or not mt.__index then return f() end end value = value[part] if value == nil then return f() end end end return value end return f end -- Can return the length of any table, where as #table_name is only suitable for use with arrays of one contiguous part without nil values. function table_length(table) local count = 0 for _,_ in pairs(table) do count = count + 1 end return count end -- Variation on loadfile() which allows for the loaded file to have global -- references resolved in supplied tables. On failure, returns nil and an -- error. On success, returns the file as a function just like loadfile() does -- with the difference that the first argument to this function should be a -- table in which globals are looked up and written to. -- Note: Unlike normal loadfile, this version also accepts files which start -- with the UTF-8 byte order marker function loadfile_envcall(filename) -- Read file contents local f, err = io.open(filename) if not f then return nil, err end local result = f:read(4) if result == "\239\187\191#" then -- UTF-8 BOM plus Unix Shebang result = f:read("*a"):gsub("^[^\r\n]*", "", 1) elseif result:sub(1, 3) == "\239\187\191" then -- UTF-8 BOM result = result:sub(4,4) .. f:read("*a") elseif result:sub(1, 1) == "#" then -- Unix Shebang result = (result .. f:read("*a")):gsub("^[^\r\n]*", "", 1) else -- Normal result = result .. f:read("*a") end f:close() return loadstring_envcall(result, "@" .. filename) end if _G._VERSION == "Lua 5.2" or _G._VERSION == "Lua 5.3" then function loadstring_envcall(contents, chunkname) -- Lua 5.2+ lacks setfenv() -- load() still only allows a chunk to have an environment set once, so -- we give it an empty environment and use __[new]index metamethods on it -- to allow the same effect as changing the actual environment. local env_mt = {} local result, err = load(contents, chunkname, "bt", setmetatable({}, env_mt)) if result then return function(env, ...) env_mt.__index = env env_mt.__newindex = env return result(...) end else return result, err end end else function loadstring_envcall(contents, chunkname) -- Lua 5.1 has setfenv(), which allows environments to be set at runtime local result, err = loadstring(contents, chunkname) if result then return function(env, ...) setfenv(result, env) return result(...) end else return result, err end end end -- Make pairs() and ipairs() respect metamethods (they already do in Lua 5.2) do local metamethod_called = false pairs(setmetatable({}, {__pairs = function() metamethod_called = true end})) if not metamethod_called then local next = next local getmetatable = getmetatable pairs = function(t) local mt = getmetatable(t) if mt then local __pairs = mt.__pairs if __pairs then return __pairs(t) end end return next, t end end metamethod_called = false ipairs(setmetatable({}, {__ipairs = function() metamethod_called = true end})) if not metamethod_called then local ipairs_orig = ipairs ipairs = function(t) local mt = getmetatable(t) if mt then local __ipairs = mt.__ipairs if __ipairs then return __ipairs(t) end end return ipairs_orig(t) end end end -- Helper functions for flags -- NB: flag must be a SINGLE flag, i.e. a power of two: 1, 2, 4, 8, ... -- Check if flag is set in flags function flag_isset(flags, flag) flags = flags % (2*flag) return flags >= flag end -- Set flag in flags and return new flags (unchanged if flag was already set). function flag_set(flags, flag) if not flag_isset(flags, flag) then flags = flags + flag end return flags end -- Clear flag in flags and return new flags (unchanged if flag was already cleared). function flag_clear(flags, flag) if flag_isset(flags, flag) then flags = flags - flag end return flags end -- Toggle flag in flags, i.e. set if currently cleared, clear if currently set. function flag_toggle(flags, flag) return flag_isset(flags, flag) and flag_clear(flags, flag) or flag_set(flags, flag) end -- Various constants DrawFlags = {} DrawFlags.FlipHorizontal = 2^0 DrawFlags.FlipVertical = 2^1 DrawFlags.Alpha50 = 2^2 DrawFlags.Alpha75 = 2^3 DrawFlags.AltPalette = 2^4 DrawFlags.EarlyList = 2^10 DrawFlags.ListBottom = 2^11 DrawFlags.BoundBoxHitTest = 2^12 DrawFlags.Crop = 2^13 -- Compare values of two simple (non-nested) tables function compare_tables(t1, t2) local count1 = 0 for k, v in pairs(t1) do count1 = count1 + 1 if t2[k] ~= v then return false end end local count2 = 0 for _, _ in pairs(t2) do count2 = count2 + 1 end if count1 ~= count2 then return false end return true end -- Convert a list to a set function list_to_set(list) local set = {} for _, v in ipairs(list) do set[v] = true end return set end --! Find the smallest bucket with its upper value less or equal to a given number, --! and return the value of the bucket, or its index. --!param number (number) Value to accept by the bucket. --!param buckets (list) Available buckets, pairs of {upper=x, value=y} tables, -- in increasing x value, where nil is taken as infinite. The y value is -- returned for the first bucket in the list where number <= x. If y is nil, -- the index of the bucket in the list is returned. --!return (number) Value or index of the matching bucket. function rangeMapLookup(number, buckets) for index, bucket in ipairs(buckets) do if not bucket.upper or bucket.upper >= number then return bucket.value or index end end assert(false) -- Should never get here. end -- this is a pseudo bitwise OR operation -- assumes value2 is always a power of 2 (limits carry errors in the addition) -- mimics the logic of hasBit with the addition if bit not set --!param value1 (int) value to check set bit of --!param value2 (int) power of 2 value - bit enumeration --!return (int) value1 and value2 'bitwise' or. function bitOr(value1, value2) return value1 % (value2 + value2) >= value2 and value1 or value1 + value2 end --! Check bit is set --!param value (int) value to check set bit of --!param bit (int) 0-base index of bit to check --!return (boolean) true if bit is set. function hasBit(value, bit) local p = 2 ^ bit return value % (p + p) >= p end --! Convert an array table to a string. --! Joins each elements by the provided seperator. As a convenience feature --! if the input is not an array it will be converted to a string and --! returned. --!param array (table) array to join. --!param seperator (string) seperator between elements. --!return (string) The joined string. function array_join(array, seperator) seperator = seperator or "," if type(array) ~= "table" then return tostring(array) end if array[1] == nil then return "" end local result = tostring(array[1]) local i = 2 while array[i] ~= nil do result = result .. seperator result = result .. tostring(array[i]) i = i + 1 end return result end local function serialize_string(val) local level = 0 while string.find(val, ']' .. string.rep('=', level) .. ']') do level = level + 1 end return '[' .. string.rep('=', level) .. '[' .. val .. ']' .. string.rep('=', level) .. ']' end -- Helper function to print the contents of a table. Child tables are printed recursively. -- Call without specifying depth, only obj and (if wished) max_depth. local function serialize_table(obj, options, depth, pt_reflist) -- Used to prevent infinite loops pt_reflist = pt_reflist or {} options = options or {} depth = depth or 1 if options.max_depth and depth > options.max_depth then return "{...}" end for _, ref in ipairs(pt_reflist) do if ref == obj then if options.detect_cycles then return "" elseif not options.max_depth then assert("Infinite loop detected. Specify detect_cycles or max_depth when serializing tables that may contain cycles") end end end pt_reflist[#pt_reflist + 1] = obj local first = true local indent = string.rep(" ", depth * 2) local result = "{" local max_array_index = 0 for i, v in ipairs(obj) do max_array_index = i if not first then result = result .. "," end first = false if options.pretty then result = result .. "\n" .. indent end result = result .. serialize(v, options, depth + 1, pt_reflist) end for k, v in pairs(obj) do if not(type(k) == "number" and k >= 1 and k <= max_array_index) then if not first then result = result .. ',' end first = false if options.pretty then result = result .. '\n' .. indent end result = result .. "[ " result = result .. serialize(k, options, depth + 1, pt_reflist) result = result .. " ]=" result = result .. serialize(v, options, depth + 1, pt_reflist) end end indent = string.rep(" ", (depth - 1) * 2) if options.pretty then result = result .. '\n' .. indent end result = result .. "}" return result end function serialize(val, options, depth, pt_reflist) if type(val) == "string" then return serialize_string(val) elseif type(val) == "table" then return serialize_table(val, options, depth, pt_reflist) else return tostring(val) end end -- Clones a table, but only the first level. function shallow_clone(tbl) if type(tbl) ~= "table" then return tbl end local meta = getmetatable(tbl) local target = {} for k, v in pairs(tbl) do target[k] = v end setmetatable(target, meta) return target end CorsixTH-0.63/CorsixTH/Lua/walls/000077500000000000000000000000001347163623700165275ustar00rootroot00000000000000CorsixTH-0.63/CorsixTH/Lua/walls/blue.lua000066400000000000000000000027321347163623700201650ustar00rootroot00000000000000--[[ Copyright (c) 2009 Peter "Corsix" Cawley 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. --]] local wall = {} wall.id = "blue" wall.inside_tiles = { north = 86, west = 87, } wall.outside_tiles = { north = 94, west = 95, } wall.window_tiles = { north = 136, west = 137, } wall.swing_inside_tiles = { north_left = 102, west_left = 103, north_right = 138, west_right = 139, } wall.swing_outside_tiles = { north_left = 110, west_left = 111, north_right = 152, west_right = 153, } return wall CorsixTH-0.63/CorsixTH/Lua/walls/external.lua000066400000000000000000000030061347163623700210530ustar00rootroot00000000000000--[[ Copyright (c) 2009 Peter "Corsix" Cawley 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. --]] local wall = {} wall.id = "external" wall.inside_tiles = { north = 122, north_window_1 = 124, north_window_2 = 126, north_expansion = 144, west = 123, west_window_1 = 127, west_window_2 = 125, west_expansion = 145, } wall.outside_tiles = { north = 114, north_window_1 = 116, north_window_2 = 118, north_expansion = 142, west = 115, west_window_1 = 119, west_window_2 = 117, west_expansion = 143, } wall.window_tiles = { } return wall CorsixTH-0.63/CorsixTH/Lua/walls/green.lua000066400000000000000000000027331347163623700203370ustar00rootroot00000000000000--[[ Copyright (c) 2009 Peter "Corsix" Cawley 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. --]] local wall = {} wall.id = "green" wall.inside_tiles = { north = 88, west = 89, } wall.outside_tiles = { north = 96, west = 97, } wall.window_tiles = { north = 140, west = 141, } wall.swing_inside_tiles = { north_left = 104, west_left = 105, north_right = 146, west_right = 147, } wall.swing_outside_tiles = { north_left = 112, west_left = 113, north_right = 154, west_right = 155, } return wall CorsixTH-0.63/CorsixTH/Lua/walls/white.lua000066400000000000000000000027311347163623700203550ustar00rootroot00000000000000--[[ Copyright (c) 2009 Peter "Corsix" Cawley 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. --]] local wall = {} wall.id = "white" wall.inside_tiles = { north = 82, west = 83, } wall.outside_tiles = { north = 90, west = 91, } wall.window_tiles = { north = 128, west = 129, } wall.swing_inside_tiles = { north_left = 98, west_left = 99, north_right = 130, west_right = 131, } wall.swing_outside_tiles = { north_left = 106, west_left = 107, north_right = 148, west_right = 149, } return wall CorsixTH-0.63/CorsixTH/Lua/walls/yellow.lua000066400000000000000000000027341347163623700205530ustar00rootroot00000000000000--[[ Copyright (c) 2009 Peter "Corsix" Cawley 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. --]] local wall = {} wall.id = "yellow" wall.inside_tiles = { north = 84, west = 85, } wall.outside_tiles = { north = 92, west = 93, } wall.window_tiles = { north = 132, west = 133, } wall.swing_inside_tiles = { north_left = 100, west_left = 101, north_right = 134, west_right = 135, } wall.swing_outside_tiles = { north_left = 108, west_left = 109, north_right = 150, west_right = 151, } return wall CorsixTH-0.63/CorsixTH/Lua/window.lua000066400000000000000000002001371347163623700174220ustar00rootroot00000000000000--[[ Copyright (c) 2009 Peter "Corsix" Cawley 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. --]] corsixth.require("persistance") --! Base class for user-interface dialogs. class "Window" ---@type Window local Window = _G["Window"] -- NB: pressed mouse buttons are denoted with a "mouse_" prefix in buttons_down, -- i.e. mouse_left, mouse_middle, mouse_right Window.buttons_down = permanent"Window.buttons_down" {} function Window:Window() self.x = 0 self.y = 0 self.cursor_x = 0 self.cursor_y = 0 self.panels = { } self.buttons = { } self.tooltip_regions = { } self.scrollbars = { } self.textboxes = { -- list of textboxes in that window. NB: (Game)UI also uses this. } -- Take care not to handle things twice as UI is subclass of window! self.hotkeyboxes = { } self.key_handlers = {--[[a set]]} self.windows = false -- => {} when first window added self.active_button = false self.blinking_button = false self.blink_counter = 0 self.panel_sprites = false self.visible = true self.draggable = true end -- Sets the window's onscreen position. Each of x and y can be: -- Integers >= 0 - Absolute pixel positions of top/left edge of window relative -- to top/left edge of screen -- Integers < 0 - Absolute pixel positions of right/bottom edge of window -- relative to right/bottom edge of screen. Use -0.1 to mean -0. -- Reals in [0, 1) - function Window:setPosition(x, y) -- Save values to recalculate x and y on screen resolution change self.x_original = x self.y_original = y -- Convert x and y to absolute pixel positions with regard to top/left local w, h = TheApp.config.width, TheApp.config.height if x < 0 then x = math.ceil(w - self.width + x) elseif x < 1 then x = math.floor((w - self.width) * x + 0.5) end if y < 0 then y = math.ceil(h - self.height + y) elseif y < 1 then y = math.floor((h - self.height) * y + 0.5) end self.x = x self.y = y end -- Sets the window's default onscreen position and onscreen position. -- The given x and y are interpreted as for setPosition(x, y), and are the -- default position for the window. If the user has previously repositioned a -- window of the same type, then setDefaultPosition() will set the window to -- that previous position, otherwise it sets it to the default position. function Window:setDefaultPosition(x, y) if self.ui then local config = self.ui.app.runtime_config.window_position if config then config = config[self:getSavedWindowPositionName()] if config then return self:setPosition(config.x, config.y) end end end return self:setPosition(x, y) end -- Called after the resolution of the game window changes function Window:onChangeResolution() if self.x_original and self.y_original then self:setPosition(self.x_original, self.y_original) end end -- Called before the window is closed function Window:close() if self.dragging then self.dragging = false self.ui.drag_mouse_move = nil end if self.parent then self.parent:removeWindow(self) end for key in pairs(self.key_handlers) do self.ui:removeKeyHandler(key, self) end for _, box in pairs(self.textboxes) do self.ui:unregisterTextBox(box) end for _, box in pairs(self.hotkeyboxes) do self.ui:unregisterHotkeyBox(box) end self.closed = true end function Window:addKeyHandler(key, handler, ...) self.ui:addKeyHandler(key, self, handler, ...) self.key_handlers[key] = true end --!param keys (string or table) The key or a list containing the key & its modifiers, -- previously passed to Window:addKeyHandler(keys). function Window:removeKeyHandler(keys) self.ui:removeKeyHandler(keys, self) end --! The basic component which makes up most `Window`s. --! The visual parts of most ingame dialogs are sprites from a sprite sheet. -- A `Panel` is an instance of a particular sprite, consisting of a sprite -- index and a position. It is advantageous to construct dialogs out of panels -- (using `Window:addPanel`) as the common operations on panels (like drawing -- them and hit-testing against them) are implemented in the `Window` class, -- thus reducing the amount of work that each individual dialog has to do. class "Panel" ---@type Panel local Panel = _G["Panel"] -- !dummy function Panel:Panel() self.window = nil self.x = nil self.y = nil self.w = nil self.h = nil self.colour = nil self.custom_draw = nil self.visible = nil end local panel_mt = permanent("Window.", getmetatable(Panel())) function Panel:makeButton(...) return self.window:makeButtonOnPanel(self, ...) end function Panel:makeToggleButton(...) return self.window:makeButtonOnPanel(self, ...):makeToggle() end function Panel:makeRepeatButton(...) return self.window:makeButtonOnPanel(self, ...):makeRepeat() end function Panel:makeScrollbar(...) return self.window:makeScrollbarOnPanel(self, ...) end function Panel:makeTextbox(...) return self.window:makeTextboxOnPanel(self, ...) end function Panel:makeHotkeyBox(...) return self.window:makeHotkeyBoxOnPanel(self, ...) end local function sanitize(colour) if colour > 255 then colour = 255 elseif colour < 0 then colour = 0 end return colour end --[[ Set the colour of a panel ! Note: This works only with ColourPanel and BevelPanel, not normal (sprite) panels. !param col (table) Colour given as a table with three fields red, green and blue, each an integer value in [0, 255]. ]] function Panel:setColour(col) self.colour = self.colour and TheApp.video:mapRGB(col.red, col.green, col.blue) self.highlight_colour = self.highlight_colour and TheApp.video:mapRGB( sanitize(col.red + 40), sanitize(col.green + 40), sanitize(col.blue + 40)) self.shadow_colour = self.shadow_colour and TheApp.video:mapRGB( sanitize(col.red - 40), sanitize(col.green - 40), sanitize(col.blue - 40)) self.disabled_colour = self.disabled_colour and TheApp.video:mapRGB( sanitize(math.floor((col.red + 100) / 2)), sanitize(math.floor((col.green + 100) / 2)), sanitize(math.floor((col.blue + 100) / 2))) return self end -- Specify a tooltip to be displayed when hovering this panel. -- x and y are optional position of bottom left of the tooltip. -- If not specified, will default to mouse position. function Panel:setTooltip(tooltip, x, y) self.tooltip = { text = tooltip, tooltip_x = x, tooltip_y = y, } return self end function Panel:setDynamicTooltip(callback, x, y) self.tooltip = { callback = callback, tooltip_x = x, tooltip_y = y, } return self end --! Specify a label to be drawn on top of the panel. -- Note: This works only with ColourPanel and BevelPanel, not normal (sprite) panels. --!param label (string) The text to be drawn on top of the label. --!param font (font) [optional] The font to use. Default is Font01V in QData. --!param align (string) [optional] Alignment for non-multiline labels (multiline is always left) --! can be either of "left", "center", "right" function Panel:setLabel(label, font, align) self.label = label or "" self.label_font = font or self.label_font or TheApp.gfx:loadFont("QData", "Font01V") self.align = align or self.align return self end --! Specifies whether auto clip (clipping text at the end so it fits) is enabled for this panel --!param mode (boolean) true to activate, false to deactivate. function Panel:setAutoClip(mode) self.auto_clip = mode return self end --! Checks if a given line drawn with the panel's label font would be longer than the given limit --! and if so, shortens it enough to fit including "..." at the end --!param line (string) the line to modify --!param limit (int) the maximum length in pixels the line should have --!return the possibly modified line function Panel:clipLine(line, limit) local _, last_x = self.label_font:draw(nil, line, 0, 0) if last_x > limit then limit = limit - self.label_font:sizeOf("..._") while last_x > limit do line = line:sub(1, -2) _, last_x = self.label_font:draw(nil, line, 0, 0) end line = line .. "..." end return line end --! Draw function for the label on a panel --!param canvas The canvas to draw on (can be nil for test) --!param x x position to start drawing on --!param y y position to start drawing on --!param limit (nil or {int, int}) limit after which line and with character on that line to stop drawing --!return y and x end positions after drawing function Panel:drawLabel(canvas, x, y, limit) local text = self.label local multi_line = type(text) == "table" local wrapped = not self.auto_clip local center_y = false if not multi_line then text = {text} wrapped = false center_y = true end local next_y = y + self.y + 1 local last_x = x + self.x + 2 for i, line in ipairs(text) do local old_y = next_y if limit and limit[1] == i then line = line:sub(1, limit[2]) end if self.auto_clip then line = self:clipLine(line, self.w - 4) end if wrapped then next_y, last_x = self.label_font:drawWrapped(canvas, line, x + self.x + 2, old_y, self.w - 4, self.align) else next_y, last_x = self.label_font:draw(canvas, line, x + self.x + 2, old_y, self.w - 4, center_y and self.h or 0, self.align) end if not line:find("%S") then -- Special handling for empty lines or lines with only space next_y = self.label_font:draw(nil, "A", x + self.x + 2, old_y, self.w - 4, center_y and self.h or 0, self.align) end if limit and limit[1] == i then break end end return next_y, last_x end --! Set the position of a panel. --!param x (int) New horizontal position of the panel. --!param y (int) New vertical position of the panel. function Panel:setPosition(x, y) self.x = x self.y = y end --! Set the size of a panel. --!param width (int) New width of the panel. --!param height (int) New height of the panel. function Panel:setSize(width, height) self.w = width self.h = height end --! Set the visibility of the panel. --!param visibility (bool) New visibility of the panel. function Panel:setVisible(visibility) self.visible = visibility end --[[ Add a `Panel` to the window. ! Panels form the basic building blocks of most windows. A panel is a small bitmap coupled with a position, and by combining several panels, a window can be made. By using panels to construct windows, all of the common tasks like drawing and hit-testing are provided for you by the base class methods, thus reducing the amount of code required elsewhere. !param sprite_index (integer) Index into the window's sprite table of the bitmap to be displayed. !param x (integer) The X pixel position to display the bitmap at. !param y (integer) The Y pixel position to display the bitmap at. !param w (integer, nil) If the panel is totally opaque, and the width of the panel (in pixels) is known, it should be specified here to speed up hit-tests. !param h (integer, nil) If the panel is totally opaque, and the height of the panel (in pixels) is known, it should be specified here to speed up hit-tests. ]] function Window:addPanel(sprite_index, x, y, w, h) local panel = setmetatable({ window = self, x = x, y = y, w = w, h = h, sprite_index = sprite_index, visible = true, }, panel_mt) self.panels[#self.panels + 1] = panel return panel end function Window:removeAllPanels() self.panels = {} self.buttons = {} -- Buttons cannot live without a panel end local --[[persistable: window_panel_colour_draw]] function panel_colour_draw(panel, canvas, x, y) canvas:drawRect(panel.colour, x + panel.x, y + panel.y, panel.w, panel.h) if panel.label then panel:drawLabel(canvas, x, y) end end --[[ Add a solid-colour `Panel` to the window. ! A solid-colour panel is like a normal panel, expect it displays a solid colour rather than a bitmap. !param x (integer) The X pixel position to start the panel at. !param y (integer) The Y pixel position to start the panel at. !param w (integer) The width of the panel, in pixels. !param h (integer) The height of the panel, in pixels. !param r (integer) Value in [0, 255] giving the red component of the colour. !param g (integer) Value in [0, 255] giving the green component of the colour. !param b (integer) Value in [0, 255] giving the blue component of the colour. ]] function Window:addColourPanel(x, y, w, h, r, g, b) local panel = setmetatable({ window = self, x = x, y = y, w = w, h = h, colour = TheApp.video:mapRGB(r, g, b), custom_draw = panel_colour_draw, visible = true, }, panel_mt) self.panels[#self.panels + 1] = panel return panel end local --[[persistable: window_panel_bevel_draw]] function panel_bevel_draw(panel, canvas, x, y) if panel.lowered then canvas:drawRect(panel.highlight_colour, x + panel.x, y + panel.y, panel.w, panel.h) canvas:drawRect(panel.shadow_colour, x + panel.x, y + panel.y, panel.w - 1, panel.h - 1) canvas:drawRect(panel.colour, x + panel.x + 1, y + panel.y + 1, panel.w - 2, panel.h - 2) else canvas:drawRect(panel.shadow_colour, x + panel.x + 1, y + panel.y + 1, panel.w - 1, panel.h - 1) canvas:drawRect(panel.highlight_colour, x + panel.x, y + panel.y, panel.w - 1, panel.h - 1) canvas:drawRect(panel.colour, x + panel.x + 1, y + panel.y + 1, panel.w - 2, panel.h - 2) end if panel.label then panel:drawLabel(canvas, x, y) end end --[[ Add a beveled `Panel` to the window. ! A bevel panel is similar to a solid colour panel, except that it features a highlight and a shadow that makes it appear either lowered or raised. !param x (integer) The X pixel position to start the panel at. !param y (integer) The Y pixel position to start the panel at. !param w (integer) The width of the panel, in pixels. !param h (integer) The height of the panel, in pixels. !param colour (colour in form .red, .green and .blue) The colour for the panel. !param highlight_colour (colour in form .red, .green and .blue or nil) [optional] The colour for the highlight. !param shadow_colour (colour in form .red, .green and .blue or nil) [optional] The colour for the shadow. !param disabled_colour (colour in form .red, .green and .blue or nil) [optional] The colour for the disabled panel. ]] function Window:addBevelPanel(x, y, w, h, colour, highlight_colour, shadow_colour, disabled_colour) highlight_colour = highlight_colour or { red = sanitize(colour.red + 40), green = sanitize(colour.green + 40), blue = sanitize(colour.blue + 40), } shadow_colour = shadow_colour or { red = sanitize(colour.red - 40), green = sanitize(colour.green - 40), blue = sanitize(colour.blue - 40), } disabled_colour = disabled_colour or { red = sanitize(math.floor((colour.red + 100) / 2)), green = sanitize(math.floor((colour.green + 100) / 2)), blue = sanitize(math.floor((colour.blue + 100) / 2)), } local panel = setmetatable({ window = self, x = x, y = y, w = w, h = h, colour = TheApp.video:mapRGB(colour.red, colour.green, colour.blue), highlight_colour = TheApp.video:mapRGB(highlight_colour.red, highlight_colour.green, highlight_colour.blue), shadow_colour = TheApp.video:mapRGB(shadow_colour.red, shadow_colour.green, shadow_colour.blue), disabled_colour = TheApp.video:mapRGB(disabled_colour.red, disabled_colour.green, disabled_colour.blue), custom_draw = panel_bevel_draw, visible = true, lowered = false, }, panel_mt) self.panels[#self.panels + 1] = panel return panel end function Window:addWindow(window) if window.closed then return end if not self.windows then self.windows = {} end window.parent = self if window.on_top then -- As self.windows array is ordered from top to bottom and drawn by the end, a "On Top" window has be added at start table.insert(self.windows, 1, window) else -- Normal windows, are added in the first position after on_top windows local pos = false for i = 1, #self.windows do if not self.windows[i].on_top then pos = i break end end pos = pos or #self.windows + 1 table.insert(self.windows, pos, window) end end function Window:removeWindow(window) if self.windows then for n = 1, #self.windows do if self.windows[n] == window then if #self.windows == 1 then self.windows = false else table.remove(self.windows, n) end return true end end end return false end -- Searches (direct) child windows for window of the given class, and returns -- one (or nil if there weren't any at all). -- !param window_class (class) The class of window to search for. function Window:getWindow(window_class) if self.windows then for _, window in ipairs(self.windows) do if class.is(window, window_class) then return window end end end end -- Searches (direct) child windows for window of the given class, and returns -- a (potentially empty) list of matching windows. -- !param window_class (class) The class of window to search for. function Window:getWindows(window_class) local matching_windows = {} if self.windows then for _, window in ipairs(self.windows) do if class.is(window, window_class) then matching_windows[#matching_windows+1] = window end end end return matching_windows end --! A region of a `Panel` which causes some action when clicked. class "Button" ---@type Button local Button = _G["Button"] --!dummy function Button:Button() self.ui = nil self.is_toggle = nil self.is_repeat = nil self.x = nil self.y = nil self.r = nil self.b = nil self.panel_for_sprite = nil self.sprite_index_normal = nil self.sprite_index_disabled = nil self.sprite_index_active = nil self.panel_lowered_normal = nil self.panel_lowered_active = nil self.on_click = nil self.on_click_self = nil self.on_rightclick = nil self.enabled = nil end local button_mt = permanent("Window.", getmetatable(Button())) function Button:setDisabledSprite(index) self.sprite_index_disabled = index return self end --! Enable or disable a button. --!param enable (boolean) Whether to enable (true) or disable (false) the button. function Button:enable(enable) if enable and not self.enabled then self.enabled = true self.panel_for_sprite.sprite_index = self.sprite_index_normal if self.panel_for_sprite.colour_backup then self.panel_for_sprite.colour = self.panel_for_sprite.colour_backup end end if not enable and self.enabled then self.enabled = false self.panel_for_sprite.sprite_index = self.sprite_index_disabled if self.panel_for_sprite.disabled_colour then self.panel_for_sprite.colour_backup = self.panel_for_sprite.colour self.panel_for_sprite.colour = self.panel_for_sprite.disabled_colour end end return self end function Button:makeToggle() self.is_toggle = true self.is_repeat = false self.toggled = false return self end function Button:makeRepeat() self.is_repeat = true self.is_toggle = false self.toggled = false return self end --! Flip the toggle state of the button (on -> off, or off -> on). function Button:toggle() self.sprite_index_normal, self.sprite_index_active = self.sprite_index_active, self.sprite_index_normal self.panel_lowered_active, self.panel_lowered_normal = self.panel_lowered_normal, self.panel_lowered_active self.panel_for_sprite.sprite_index = self.sprite_index_normal self.panel_for_sprite.lowered = self.panel_lowered_normal self.toggled = not self.toggled return self.toggled end --! Set the toggle state of the button to the provided state. --!param state (boolean) Desired state of the toggle button. function Button:setToggleState(state) if self.toggled ~= state then self:toggle() end return self end function Button:preservePanel() local window = self.panel_for_sprite.window self.panel_for_sprite = window:addPanel(0, self.x, self.y) self.sprite_index_normal = 0 return self end function Button:setSound(name) self.sound = name return self end local --[[persistable:window_drag_round]] function round(value, amount) return amount * math.floor(value / amount + 0.5) end -- Specify a tooltip to be displayed when hovering this button. -- x and y are optional position of bottom left of the tooltip. -- If not specified, will default to top center of button. function Button:setTooltip(tooltip, x, y) self.tooltip = { text = tooltip, tooltip_x = x or round((self.x + self.r) / 2, 1), tooltip_y = y or self.y, } return self end function Button:setDynamicTooltip(callback, x, y) self.tooltip = { callback = callback, tooltip_x = x or round((self.x + self.r) / 2, 1), tooltip_y = y or self.y, } return self end --! Called whenever a click on the button should be handled. This depends on the type of button. --! Normally this is called when a MouseUp occurs over the button (if the MouseDown occurred over --! this or another button). However for repeat buttons, it is called once on MouseDown and, after --! a short delay, repeatedly. --!param mouse_button (string) either "left" or "right" function Button:handleClick(mouse_button) local arg = nil if self.is_toggle then arg = self:toggle() end if self.sound then self.ui:playSound(self.sound) end local callback = mouse_button == "left" and self.on_click or self.on_rightclick if callback then callback(self.on_click_self, arg, self) else if mouse_button == "left" then print("Warning: No handler for button click") self.on_click = --[[persistable:button_on_click_handler_stub]] function() end end end end --! Set the position of a button. --!param x (int) New horizontal position of the button. --!param y (int) New vertical position of the button. function Button:setPosition(x, y) self.panel_for_sprite:setPosition(x, y) self.r = self.r - self.x + x self.b = self.b - self.y + y self.x = x self.y = y if self.tooltip then self.tooltip.tooltip_x = math.round((self.x + self.r) / 2, 1) self.tooltip.tooltip_y = self.y end end --! Set the size of a button. --!param width (int) New width of the button. --!param height (int) New height of the button. function Button:setSize(width, height) self.panel_for_sprite:setSize(width, height) self.r = self.x + width self.b = self.y + height if self.tooltip then self.tooltip.tooltip_x = math.round((self.x + self.r) / 2, 1) self.tooltip.tooltip_y = self.y end end --! Set the visibility of the button. --!param visibility (bool) New visibility of the button. function Button:setVisible(visibility) self.panel_for_sprite:setVisible(visibility) end --! Convenience function to allow setLabel to be called on a button, not only its panel. --! see Panel:setLabel function Button:setLabel(label, font, align) self.panel_for_sprite:setLabel(label, font, align) return self end --[[ Convert a static panel into a clickable button. !param panel (Panel) The panel to convert into a button. !param x (integer) The X co-ordinate of the clickable rectangle on the panel. !param y (integer) The Y co-ordinate of the clickable rectangle on the panel. !param w (integer) The width of the clickable rectangle on the panel. !param h (integer) The height of the clickable rectangle on the panel. !param sprite (integer) An index into the window's sprite sheet. The panel will display this sprite when the button is being pressed. !param on_click (function) The function to be run when the user left-clicks the button. Takes three arguments: `on_click_self`, the toggle state (nil for normal buttons, true/false for toggle buttons), the button itself. !param on_click_self (function, nil) The first value to pass to `on_click`. If nil or not given, then the window is passed as the first argument. !param on_rightclick (function, nil) The function to be called when the user right-clicks the button. ]] function Window:makeButtonOnPanel(panel, x, y, w, h, sprite, on_click, on_click_self, on_rightclick) x = x + panel.x y = y + panel.y local button = setmetatable({ ui = self.ui, is_toggle = false, is_repeat = false, x = x, y = y, r = x + w, b = y + h, panel_for_sprite = panel, sprite_index_normal = panel.sprite_index, sprite_index_disabled = panel.sprite_index, sprite_index_active = sprite, on_click = on_click, on_click_self = on_click_self or self, on_rightclick = on_rightclick, enabled = true, panel_lowered_normal = false, panel_lowered_active = true, }, button_mt) if self.ui and on_click == self.close then button.sound = "no4.wav" elseif self.default_button_sound then button.sound = self.default_button_sound end self.buttons[#self.buttons + 1] = button return button end --! A window element used to scroll in lists class "Scrollbar" ---@type Scrollbar local Scrollbar = _G["Scrollbar"] --!dummy function Scrollbar:Scrollbar() self.base = nil self.slider = nil self.min_value = nil self.max_value = nil self.value = nil self.page_size = nil self.direction = nil self.visible = nil end function Scrollbar:setRange(min_value, max_value, page_size, value) page_size = math.min(page_size, max_value - min_value + 1) -- page size must be number of elements at most value = math.min(value or min_value, math.max(min_value, max_value - page_size + 1)) self.min_value = min_value self.max_value = max_value self.page_size = page_size self.value = value local slider = self.slider slider.w = slider.max_w slider.h = slider.max_h slider.max_x = slider.min_x + slider.max_w - slider.w slider.max_y = slider.min_y + slider.max_h - slider.h if self.direction == "y" then slider.h = math.ceil((page_size / (max_value - min_value + 1)) * slider.max_h) slider.max_y = slider.min_y + slider.max_h - slider.h slider.y = math.floor((value - min_value) / (max_value - min_value - page_size + 2) * (slider.max_y - slider.min_y) + slider.min_y) else slider.w = math.ceil((page_size / (max_value - min_value + 1)) * slider.max_w) slider.max_x = slider.min_x + slider.max_w - slider.w slider.x = math.floor((value - min_value) / (max_value - min_value - page_size + 2) * (slider.max_x - slider.min_x) + slider.min_x) end return self end --! Get the pixel position of the slider in the axis which the slider can move function Scrollbar:getXorY() return self.slider[self.direction] end --! Set the pixel position of the slider in the axis which the slider can move function Scrollbar:setXorY(xy) local dir = self.direction local min, max if dir == "x" then min = self.slider.min_x max = self.slider.max_x else min = self.slider.min_y max = self.slider.max_y end if xy < min then xy = min end if xy > max then xy = max end self.slider[dir] = xy local old_value = self.value self.value = math.floor(((xy - min) / (max - min + 1)) * (self.max_value - self.min_value - self.page_size + 2)) + 1 if old_value ~= self.value then self.callback() end end local scrollbar_mt = permanent("Window.", getmetatable(Scrollbar())) --[[ Convert a static panel into a scrollbar. ! Scrollbars consist of a base panel (the panel given as a parameter) and an additional slider panel (automatically created BevelPanel). !param panel (panel) The panel that will serve as the scrollbar base. !param slider_colour (colour in form .red, .green and .blue) The colour for the slider. !param callback (function) Function that is called whenever the slider position changes. !param min_value (integer) The minimum value the scrollbar can represent. !param max_value (integer) The maximum value the scrollbar can represent. !param page_size (integer) The amount of objects represented on one page. !param value (integer, nil) The current value, or min_value if not specified. ]] function Window:makeScrollbarOnPanel(panel, slider_colour, callback, min_value, max_value, page_size, value) local slider = self:addBevelPanel(panel.x + 1, panel.y + 1, panel.w - 2, panel.h - 2, slider_colour) local scrollbar = setmetatable({ base = panel, slider = slider, direction = "y", callback = callback, visible = true, enabled = true, }, scrollbar_mt) slider.min_x = slider.x slider.min_y = slider.y slider.max_w = slider.w slider.max_h = slider.h scrollbar:setRange(min_value, max_value, page_size, value) self.scrollbars[#self.scrollbars + 1] = scrollbar return scrollbar end --! A window element used to enter text class "Textbox" ---@type Textbox local Textbox = _G["Textbox"] --!dummy function Textbox:Textbox() self.panel = nil self.confirm_callback = nil self.abort_callback = nil self.button = nil self.text = nil self.allowed_input = nil self.char_limit = nil self.visible = nil self.enabled = nil self.active = nil self.cursor_counter = nil self.cursor_state = nil self.cursor_pos = nil end local textbox_mt = permanent("Window.", getmetatable(Textbox())) function Textbox:onTick() if self.active then self.cursor_counter = self.cursor_counter + 1 if self.cursor_counter >= 40 then self.cursor_state = true self.cursor_counter = self.cursor_counter - 40 elseif self.cursor_counter >= 20 then self.cursor_state = false end end end function Textbox:drawCursor(canvas, x, y) if self.cursor_state then local col = TheApp.video:mapRGB(255, 255, 255) local cursor_y, cursor_x = self.panel:drawLabel(nil, x, y, self.cursor_pos) local w, _ = self.panel.label_font:sizeOf("0") if self.panel.align == nil or self.panel.align == "center" then local _, text_x = self.panel:drawLabel(nil, x, y, {self.cursor_pos[1], #self.text}) cursor_x = text_x - (text_x - cursor_x) * 2 end cursor_y = cursor_y - 3 -- Add x separation, but only if there was actually some text in this line. if self.text[self.cursor_pos[1]] ~= "" then cursor_x = cursor_x + 1 -- TODO font:getSeparation? end canvas:drawRect(col, cursor_x, cursor_y, w, 1) end end --! Set the box to not active and run confirm callback, if any function Textbox:confirm() self:setActive(false) if self.confirm_callback then self.confirm_callback() end end --! Set the box to not active and run abort callback, if any function Textbox:abort() self:setActive(false) if self.abort_callback then self.abort_callback() end end --! Set the textbox active status to true or false, taking care of any -- additional things that need to be done: deactivate any other textboxes, -- handle blinking cursor, keyboard repeat on/off, set button state accordingly --!param active (boolean) whether to activate (true) or deactivate (false) the box function Textbox:setActive(active) local ui = self.panel.window.ui if active then -- Unselect any other textbox for _, textbox in ipairs(ui.textboxes) do if textbox ~= self and textbox.active then textbox:abort() end end self.cursor_counter = 0 self.cursor_state = true self.cursor_pos[1] = type(self.text) == "table" and #self.text or 1 self.cursor_pos[2] = type(self.text) == "table" and string.len(self.text[#self.text]) or string.len(self.text) -- Update text self.panel:setLabel(self.text) else self.cursor_state = false end self.active = active -- Update button if necessary if self.button.toggled ~= active then self.button:toggle() end end function Textbox:clicked() local active = self.button.toggled if active then self:setActive(true) else if self.text == "" then self:abort() else self:confirm() end end end --! Handles special characters such as Enter. Normal text input is processed in the textInput function. --! Note though that this function still returns true if it appears to be a characters being entered. function Textbox:keyInput(char, rawchar) if not self.active then return false end local ui = self.panel.window.ui local line = type(self.text) == "table" and self.text[self.cursor_pos[1]] or self.text local pat = "%a%d_" -- which characters form "words" for ctrl+[left/right/backspace/delete] local new_line local handled = false if not self.char_limit or string.len(line) < self.char_limit then -- Upper- and lowercase letters if self.allowed_input.alpha then if #char == 1 and string.match(char, '%a') then handled = true end end -- Numbers if not handled and self.allowed_input.numbers then if #char == 1 and string.match(char, '%d') then handled = true end end -- Space, hyphen and plus sign if not handled and self.allowed_input.misc then if char == "space" or char == "-" or char == "+" then handled = true end end end -- Backspace (delete last char, or last word if ctrl is pressed) if not handled and char == "backspace" then if self.cursor_pos[2] == 0 then if type(self.text) == "table" and self.cursor_pos[1] > 1 then table.remove(self.text, self.cursor_pos[1]) self.cursor_pos[1] = self.cursor_pos[1] - 1 self.cursor_pos[2] = string.len(self.text[self.cursor_pos[1]]) new_line = self.text[self.cursor_pos[1]] .. line end else local pos = self.cursor_pos[2] - 1 if ui.app.key_modifiers.ctrl then pos = string.find(string.sub(line, 1, self.cursor_pos[2]), "[^" .. pat .. "][" .. pat .. "]+[^" .. pat .. "]*$") or 0 end new_line = line:sub(1, pos) .. line:sub(self.cursor_pos[2] + 1, -1) self.cursor_pos[2] = pos end handled = true end -- Delete (delete next char, or next word if ctrl is pressed) if not handled and char == "delete" then if self.cursor_pos[2] == string.len(line) then if type(self.text) == "table" and self.cursor_pos[1] < #self.text then new_line = line .. self.text[self.cursor_pos[1] + 1] table.remove(self.text, self.cursor_pos[1] + 1) end else local pos = self.cursor_pos[2] + 2 if ui.app.key_modifiers.ctrl then pos = (string.find(line, "[^" .. pat .. "][" .. pat .. "]", self.cursor_pos[2] + 1) or string.len(line)) + 1 end new_line = line:sub(1, self.cursor_pos[2]) .. line:sub(pos, -1) end handled = true end -- Enter (newline or confirm) if not handled and (char == "return" or char == "enter") then if type(self.text) == "table" then local remainder = line:sub(self.cursor_pos[2] + 1, -1) self.text[self.cursor_pos[1]] = line:sub(1, self.cursor_pos[2]) table.insert(self.text, self.cursor_pos[1] + 1, remainder) self.cursor_pos[1] = self.cursor_pos[1] + 1 self.cursor_pos[2] = 0 handled = true else self:confirm() return true end end -- Escape (abort) if not handled and char == "escape" then self:abort() return true end -- Arrow keys if not handled then if char == "up" then -- up if type(self.text) ~= "table" or self.cursor_pos[1] == 1 then -- to beginning of line self.cursor_pos[2] = 0 else -- one line up self.cursor_pos[1] = self.cursor_pos[1] - 1 self.cursor_pos[2] = math.min(self.cursor_pos[2], string.len(self.text[self.cursor_pos[1]])) end handled = true elseif char == "down" then -- down if type(self.text) ~= "table" or self.cursor_pos[1] == #self.text then -- to end of line self.cursor_pos[2] = string.len(line) else -- one line down self.cursor_pos[1] = self.cursor_pos[1] + 1 self.cursor_pos[2] = math.min(self.cursor_pos[2], string.len(self.text[self.cursor_pos[1]])) end handled = true elseif char == "right" then -- right if self.cursor_pos[2] == string.len(line) then -- next line if type(self.text) == "table" and self.cursor_pos[1] < #self.text then self.cursor_pos[1] = self.cursor_pos[1] + 1 self.cursor_pos[2] = 0 end else if ui.app.key_modifiers.ctrl then -- to the right until next word or end of line self.cursor_pos[2] = string.find(line, "[^" .. pat .. "][" .. pat .. "]", self.cursor_pos[2] + 1) or string.len(line) else -- one to the right self.cursor_pos[2] = self.cursor_pos[2] + 1 end end handled = true elseif char == "left" then -- left if self.cursor_pos[2] == 0 then -- previous line if type(self.text) == "table" and self.cursor_pos[1] > 1 then self.cursor_pos[1] = self.cursor_pos[1] - 1 self.cursor_pos[2] = string.len(self.text[self.cursor_pos[1]]) end else if ui.app.key_modifiers.ctrl then -- to the left until beginning of word or beginning of line self.cursor_pos[2] = string.find(string.sub(line, 1, self.cursor_pos[2]), "[^" .. pat .. "][" .. pat .. "]+[^" .. pat .. "]*$") or 0 else -- one to the left self.cursor_pos[2] = self.cursor_pos[2] - 1 end end handled = true end end -- Tab (reserved) if not handled and char == "tab" then handled = true end -- Home (beginning of line) if not handled and char == "home" then self.cursor_pos[2] = 0 handled = true end -- End (end of line) if not handled and char == "end" then self.cursor_pos[2] = string.len(line) handled = true end if not self.char_limit or string.len(self.text) < self.char_limit then -- Experimental "all" category if not handled and self.allowed_input.all and not (char == "shift" or char == "ctrl" or char == "alt") then -- F-Keys handled = true end end if new_line then if type(self.text) == "table" then self.text[self.cursor_pos[1]] = new_line else self.text = new_line end -- update label self.panel:setLabel(self.text) end -- make cursor visible self.cursor_counter = 0 self.cursor_state = true return handled end --! Handles actual text input. function Textbox:textInput(text) if not self.active then return false end local line = type(self.text) == "table" and self.text[self.cursor_pos[1]] or self.text local new_line = line:sub(1, self.cursor_pos[2]) .. text .. line:sub(self.cursor_pos[2] + 1, -1) self.cursor_pos[2] = self.cursor_pos[2] + #text if type(self.text) == "table" then self.text[self.cursor_pos[1]] = new_line else self.text = new_line end -- update label self.panel:setLabel(self.text) end --[[ Limit input handled by textbox to specific classes of characters !param types (string or table) One of, or an table of any number of input types ! valid input types are: ! "alpha": Letters (lower and uppercase) ! "numbers": 0-9 ! "misc": other characters, currently space and hyphen ! "all": experimental category that allows, theoretically, all input ]] function Textbox:allowedInput(types) if type(types) ~= "table" then types = {types} end self.allowed_input = {} for _, t in ipairs(types) do self.allowed_input[t] = true end return self end --[[ Limit input to a maximum of [limit] characters. !param limit (integer or nil) Number of characters until the textbox will stop accepting input, or nil to deactivate limit. ]] function Textbox:characterLimit(limit) self.char_limit = limit return self end --[[ Set the text of the textbox to a given string or list of strings. ! Use empty string to make textbox a single line textbox (default). ! Use table with empty string {""} to make it a multiline textbox. !param text (string or table) The string or list of strings the textbox should contain. ]] function Textbox:setText(text) self.text = text self.panel:setLabel(self.text) return self end function Textbox:setPosition(x, y) self.button:setPosition(x, y) end function Textbox:setSize(width, height) self.button:setSize(width, height) end --[[ Convert a static panel into a textbox. ! Textboxes consist of the panel given as a parameter, which is made into a ToggleButton automatically, and handle keyboard input while active. !param panel (panel) The panel that will serve as the textbox base. !param confirm_callback (function) The function to call when text is confirmed. !param abort_callback (function) The function to call when entering is aborted. ]] function Window:makeTextboxOnPanel(panel, confirm_callback, abort_callback) local textbox = setmetatable({ panel = panel, confirm_callback = confirm_callback, abort_callback = abort_callback, button = nil, -- placeholder text = "", allowed_input = { alpha = true, numbers = true, misc = true, }, char_limit = nil, visible = true, enabled = true, active = false, cursor_counter = 0, cursor_state = false, cursor_pos = {1, 1}, }, textbox_mt) local button = panel:makeToggleButton(0, 0, panel.w, panel.h, nil, textbox.clicked, textbox) textbox.button = button self.textboxes[#self.textboxes + 1] = textbox self.ui:registerTextBox(textbox) return textbox end --! A window element used to accept hotkey configurations. class "HotkeyBox" ---@type HotkeyBox local HotkeyBox = _G["HotkeyBox"] --!dummy function HotkeyBox:HotkeyBox() self.panel = nil self.confirm_callback = nil self.abort_callback = nil self.button = nil self.text = nil self.allowed_input = nil self.char_limit = nil self.visible = nil self.enabled = nil self.active = nil self.noted_keys = {} end local hotkeybox_mt = permanent("Window.", getmetatable(HotkeyBox())) --! Set the box to not active and run confirm callback, if any function HotkeyBox:confirm() self:setActive(false) if self.confirm_callback then self.confirm_callback() end self.noted_keys = {} end --! Set the box to not active and run abort callback, if any function HotkeyBox:abort() self:setActive(false) if self.abort_callback then self.abort_callback() end self.noted_keys = {} end --! Set the hotkeybox active status to true or false, taking care of any -- additional things that need to be done: deactivate any other hotkeyboxes, -- handle blinking cursor, keyboard repeat on/off, set button state accordingly --!param active (boolean) whether to activate (true) or deactivate (false) the box function HotkeyBox:setActive(active) local ui = self.panel.window.ui if active then -- Unselect any other hotkeybox for _, hotkeybox in ipairs(ui.hotkeyboxes) do if hotkeybox ~= self and hotkeybox.active then hotkeybox:abort() end end -- Update text self.panel:setLabel(self.text) end self.active = active -- Update button if necessary if self.button.toggled ~= active then self.button:toggle() end end function HotkeyBox:clicked() local active = self.button.toggled if active then self:setActive(true) else if self.text == "" then self:abort() else self:confirm() end end end function HotkeyBox:keyInput(char, rawchar, modifiers) if not self.active then return false end -- Just return true so any key's we press aren't passed to anything else. return true end --[[ Limit input handled by textbox to specific classes of characters !param types (string or table) One of, or an table of any number of input types ! valid input types are: ! "alpha": Letters (lower and uppercase) ! "numbers": 0-9 ! "misc": other characters, currently space and hyphen ! "all": experimental category that allows, theoretically, all input ]] function HotkeyBox:allowedInput(types) if type(types) ~= "table" then types = {types} end self.allowed_input = {} for _, t in ipairs(types) do self.allowed_input[t] = true end return self end --[[ Set the text of the textbox to a given string or list of strings. ! Use empty string to make textbox a single line textbox (default). ! Use table with empty string {""} to make it a multiline textbox. !param text (string or table) The string or list of strings the textbox should contain. ]] function HotkeyBox:setText(text) self.text = text self.panel:setLabel(self.text) return self end function HotkeyBox:setPosition(x, y) self.button:setPosition(x, y) end function HotkeyBox:setSize(width, height) self.button:setSize(width, height) end --================================ --================================ --================================ --[[ Convert a static panel into a hotkeybox. ! hotkeyboxes consist of the panel given as a parameter, which is made into a ToggleButton automatically, and handle keyboard input while active. !param panel (panel) The panel that will serve as the hotkeybox base. !param confirm_callback (function) The function to call when text is confirmed. !param abort_callback (function) The function to call when entering is aborted. ]] function Window:makeHotkeyBoxOnPanel(panel, confirm_callback, abort_callback) local hotkeybox = setmetatable({ panel = panel, confirm_callback = confirm_callback, abort_callback = abort_callback, button = nil, -- placeholder text = "", allowed_input = { alpha = true, numbers = true, misc = true, }, char_limit = nil, visible = true, enabled = true, active = false, noted_keys = {}, }, hotkeybox_mt) local button = panel:makeToggleButton(0, 0, panel.w, panel.h, nil, hotkeybox.clicked, hotkeybox) hotkeybox.button = button self.hotkeyboxes[#self.hotkeyboxes + 1] = hotkeybox self.ui:registerHotkeyBox(hotkeybox) return hotkeybox end function Window:draw(canvas, x, y) x, y = x + self.x, y + self.y if self.panels[1] then local panel_sprites = self.panel_sprites local panel_sprites_draw = panel_sprites and panel_sprites.draw for _, panel in ipairs(self.panels) do if panel.visible then if panel.custom_draw then panel:custom_draw(canvas, x, y) else panel_sprites_draw(panel_sprites, canvas, panel.sprite_index, x + panel.x, y + panel.y) end end end end if not class.is(self, UI) then -- prevent UI (sub)class from handling the textboxes too for _, box in ipairs(self.textboxes) do box:drawCursor(canvas, x, y) end end if not class.is(self, UI) then -- prevent UI (sub)class from handling the hotkeyboxes too for _, _ in ipairs(self.hotkeyboxes) do -- Empty right now. Don't know if I need it. -- LEIGET end end if self.windows then local windows = self.windows for i = #windows, 1, -1 do if windows[i].visible then windows[i]:draw(canvas, x, y) end end end end function Window:onChangeLanguage() if self.windows then for _, window in ipairs(self.windows) do window:onChangeLanguage() end end end function Window:onCursorWorldPositionChange(x, y) local repaint = false if self.windows then for _, window in ipairs(self.windows) do if window:onCursorWorldPositionChange(x - window.x, y - window.y) then repaint = true end end end return repaint end function Window:hitTestPanel(x, y, panel) local xpos, ypos = x - panel.x, y - panel.y if panel.visible and xpos >= 0 and ypos >= 0 then if panel.w and panel.h then if xpos <= panel.w and ypos <= panel.h then return true end else if self.panel_sprites:hitTest(panel.sprite_index, xpos, ypos) then return true end end end return false end --[[ Used to test if the window has a (non-transparent) pixel at the given position. !param x (integer) The X co-ordinate of the pixel to test, relative to the top-left corner of the window. !param y (integer) The Y co-ordinate of the pixel to test, relative to the top-left corner of the window. ]] function Window:hitTest(x, y) if x < 0 or y < 0 or (self.width and x >= self.width) or (self.height and y >= self.height) then -- return false end if self.panels[1] then for _, panel in ipairs(self.panels) do if self:hitTestPanel(x, y, panel) then return true end end end if self.windows then for _, child in ipairs(self.windows) do if child:hitTest(x - child.x, y - child.y) then return true end end end return false end function Window:onMouseDown(button, x, y) local repaint = false if self.windows then for _, window in ipairs(self.windows) do if window:onMouseDown(button, x - window.x, y - window.y) then repaint = true break end end end if not repaint and (button == "left" or button == "right") then for _, btn in ipairs(self.buttons) do if btn.enabled and btn.x <= x and x < btn.r and btn.y <= y and y < btn.b and (button == "left" or btn.on_rightclick ~= nil) then btn.panel_for_sprite.sprite_index = btn.sprite_index_active self.active_button = btn btn.active = true btn.panel_for_sprite.lowered = btn.panel_lowered_active if btn.is_repeat then -- execute callback once, then wait some ticks before repeatedly executing btn:handleClick(button) end self.btn_repeat_delay = 10 repaint = true break end end for _, bar in ipairs(self.scrollbars) do if bar.enabled and self:hitTestPanel(x, y, bar.slider) then self.active_scrollbar = bar bar.active = true bar.down_x = x - bar.slider.x bar.down_y = y - bar.slider.y repaint = true break end end end if self:hitTest(x, y) then if button == "left" and not repaint then self:beginDrag(x, y) end repaint = true end if repaint then self:bringToTop() end return repaint end --[[ Get the name of the saved window position group. ! When the user drags a window, the new position of the window is saved, and then when any windows in the same group are opened in the future, the position of the new window is set to the saved position. By default, each window class is its own group, but by overriding this method, that can be changed. ]] function Window:getSavedWindowPositionName() return class.type(self) end function Window:onMouseUp(button, x, y) local repaint = false if self.dragging then self.ui.drag_mouse_move = nil self.dragging = false local config = self.ui.app.runtime_config if not config.window_position then config.window_position = {} end config = config.window_position local name = self:getSavedWindowPositionName() if not config[name] then config[name] = {} end config = config[name] config.x = self.x_original config.y = self.y_original return false end if self.windows then for _, window in ipairs(self.windows) do if window:onMouseUp(button, x - window.x, y - window.y) then repaint = true break -- Click has been handled. No need to look any further. end end end if button == "left" or button == "right" then local btn = self.active_button if btn then btn.panel_for_sprite.sprite_index = btn.sprite_index_normal btn.active = false btn.panel_for_sprite.lowered = btn.panel_lowered_normal self.active_button = false self.btn_repeat_delay = nil if btn.enabled and not btn.is_repeat and btn.x <= x and x < btn.r and btn.y <= y and y < btn.b then btn:handleClick(button) end repaint = true end local bar = self.active_scrollbar if bar then self.active_scrollbar = nil bar.active = false bar.down_x = nil bar.down_y = nil end end return repaint end function Window:onMouseWheel(x, y) local repaint = false if self.windows then for _, window in ipairs(self.windows) do if window:onMouseWheel(x, y) then repaint = true break -- Scroll has been handled. No need to look any further. end end end return repaint end local --[[persistable:window_drag_position_representation]] function getNicestPositionRepresentation(pos, size, dim_size) if size == dim_size then return 0.5 end local left_rel = pos local right_rel = pos + size - dim_size local rel = pos / (dim_size - size) if 0.15 < rel and rel < 0.85 then return rel end if left_rel <= 0 then return 0 end if right_rel >= 0 then return -0.1 end if left_rel <= -right_rel then return left_rel else return right_rel end end --[[ Initiate dragging of the window. !param x The X position of the cursor in window co-ordinatees. !param y The Y position of the cursor in window co-ordinatees. ]] function Window:beginDrag(x, y) if not self.width or not self.height or not self.ui or self.ui.app.runtime_config.lock_windows or not self.draggable then -- Need width, height and UI to do a drag return false end self.dragging = true self.ui.drag_mouse_move = --[[persistable:window_drag_mouse_move]] function (sx, sy) -- sx and sy are cursor screen co-ords. Convert to window's new abs co-ords sx = sx - x sy = sy - y -- Calculate best positioning local w, h = TheApp.config.width, TheApp.config.height if TheApp.key_modifiers.ctrl then local px = round(sx / (w - self.width), 0.1) local py = round(sy / (h - self.height), 0.1) if px >= 1 then px = -0.1 elseif px < 0 then px = 0 end if py >= 1 then py = -0.1 elseif py < 0 then py = 0 end self:setPosition(px, py) else local px = getNicestPositionRepresentation(sx, self.width , w) local py = getNicestPositionRepresentation(sy, self.height, h) self:setPosition(px, py) end end return true end --[[ Called when the user moves the mouse. !param x (integer) The new X co-ordinate of the cursor, relative to the top-left corner of the window. !param y (integer) The new Y co-ordinate of the cursor, relative to the top-left corner of the window. !param dx (integer) The number of pixels which the cursor moved horizontally. !param dy (integer) The number of pixels which the cursor moved vertically. ]] function Window:onMouseMove(x, y, dx, dy) local repaint = false self.cursor_x = x self.cursor_y = y if self.windows then for _, window in ipairs(self.windows) do if window:onMouseMove(x - window.x, y - window.y, dx, dy) then repaint = true end end end if self.active_button then local btn = self.active_button local index = btn.sprite_index_blink or btn.sprite_index_normal if btn.x <= x and x < btn.r and btn.y <= y and y < btn.b then index = btn.sprite_index_active self.active_button.active = true btn.panel_for_sprite.lowered = btn.panel_lowered_active else self.active_button.active = false btn.panel_for_sprite.lowered = btn.panel_lowered_normal for _, button in ipairs(self.buttons) do if button.enabled and button.x <= x and x < button.r and button.y <= y and y < button.b then button.panel_for_sprite.sprite_index = button.sprite_index_active button.active = true button.panel_for_sprite.lowered = button.panel_lowered_active self.active_button = button repaint = true break end end end if btn.panel_for_sprite.sprite_index ~= index then btn.panel_for_sprite.sprite_index = index repaint = true end end if self.active_scrollbar then local bar = self.active_scrollbar if bar.direction == "x" then bar:setXorY(x - bar.down_x) elseif bar.direction == "y" then bar:setXorY(y - bar.down_y) end end return repaint end -- Called regularly at a rate independent of the game speed. function Window:onTick() if self.active_button then local btn = self.active_button local mouse_btn = self.buttons_down.mouse_left and "left" or self.buttons_down.mouse_right and "right" or nil if mouse_btn then if self.btn_repeat_delay > 0 then self.btn_repeat_delay = self.btn_repeat_delay - 1 else if btn.active and btn.is_repeat then self.btn_repeat_delay = 2 btn:handleClick(mouse_btn) end end end end if self.blinking_button then self.blink_counter = self.blink_counter + 1 if self.blink_counter == 20 then self.blink_counter = 0 local btn = self.buttons[self.blinking_button] btn.sprite_index_blink = btn.sprite_index_blink == btn.sprite_index_active and btn.sprite_index_normal or btn.sprite_index_active if btn.enabled and not btn.active then btn.panel_for_sprite.sprite_index = btn.sprite_index_blink end end end if not class.is(self, UI) then -- prevent UI (sub)class from handling the textboxes too for _, box in ipairs(self.textboxes) do box:onTick() end end if self.windows then for _, window in ipairs(self.windows) do window:onTick() end end end -- Called regularly at the same rate that entities are ticked. function Window:onWorldTick() if self.windows then for _, window in ipairs(self.windows) do window:onWorldTick() end end end -- Bring the window to the top of its parent function Window:bringToTop() if self.parent then self.parent:sendToTop(self) end end -- Tell the window to bring the specified sub-window to its top function Window:sendToTop(window) local window_index if self.windows then for i = 1, #self.windows do -- Search specified window in windows list if self.windows[i] == window then window_index = i -- Keep window index break end end end if window_index ~= nil then local insert_pos if window.on_top then insert_pos = 1 else -- First position after any on_top windows for i = 1, #self.windows do if not self.windows[i].on_top then insert_pos = i break end end insert_pos = insert_pos or #self.windows + 1 end table.remove(self.windows, window_index) -- Remove the window from the list table.insert(self.windows, insert_pos, window) -- And reinsert it at the before computed position end end -- Tell the window to bring the specified sub-window to its bottom function Window:sendToBottom(window) if self.windows then for i = 1, #self.windows do -- Search specified window in windows list if self.windows[i] == window then table.remove(self.windows, i) -- Remove the window from the list table.insert(self.windows, #self.windows + 1, window) -- And reinsert it at the end break end end end end function Window:startButtonBlinking(button_index) self.blinking_button = button_index self.blink_counter = 0 local btn = self.buttons[button_index] btn.sprite_index_blink = btn.sprite_index_normal end function Window:stopButtonBlinking() -- Does any button actually blink? if self.blinking_button then local btn = self.buttons[self.blinking_button] btn.panel_for_sprite.sprite_index = btn.sprite_index_normal btn.sprite_index_blink = nil self.blinking_button = false self.blink_counter = 0 end end --! Create a static (non-changeable) tooltip to be displayed in a certain region. --! tooltip_x and tooltip_y are optional; if not specified, it will default to top center of region. --!param text (string) The string to display. --!param x (integer) The X co-ordinate relative to the top-left corner. --!param y (integer) The Y co-ordinate relative to the top-left corner. --!param r (integer) The right (X + width) co-ordinate relative to the top-left corner. --!param b (integer) The bottom (Y + height) co-ordinate relative to the top-left corner. --!param tooltip_x (integer) [optional] The X co-ordinate to display the tooltip at. --!param tooltip_y (integer) [optional] The Y co-ordinate to display the tooltip at. function Window:makeTooltip(text, x, y, r, b, tooltip_x, tooltip_y) local region = { text = text, x = x, y = y, r = r, b = b, tooltip_x = tooltip_x or round((x + r) / 2, 1), -- optional tooltip_y = tooltip_y or y, -- optional } self.tooltip_regions[#self.tooltip_regions + 1] = region return region end --! Create a dynamic tooltip to be displayed in a certain region. --! tooltip_x and tooltip_y are optional; if not specified, it will default to top center of region. --!param callback (function) A function that returns the string to display or nil for no tooltip. --!param x (integer) The X co-ordinate relative to the top-left corner. --!param y (integer) The Y co-ordinate relative to the top-left corner. --!param r (integer) The right (X + width) co-ordinate relative to the top-left corner. --!param b (integer) The bottom (Y + height) co-ordinate relative to the top-left corner. --!param tooltip_x (integer) [optional] The X co-ordinate to display the tooltip at. --!param tooltip_y (integer) [optional] The Y co-ordinate to display the tooltip at. function Window:makeDynamicTooltip(callback, x, y, r, b, tooltip_x, tooltip_y) local region = { callback = callback, x = x, y = y, r = r, b = b, tooltip_x = tooltip_x or round((x + r) / 2, 1), -- optional tooltip_y = tooltip_y or y, -- optional } self.tooltip_regions[#self.tooltip_regions + 1] = region return region end -- An 'element' can either be a panel, a button, or a tooltip region. function Window:getTooltipForElement(elem, x, y) local text if elem.callback then text = elem.callback(x, y) else text = elem.text end local xpos, ypos = elem.tooltip_x, elem.tooltip_y if xpos then xpos = xpos + self.x end -- NB: can be nil, then it means position at mouse cursor if ypos then ypos = ypos + self.y end if text then return { text = text, x = xpos, y = ypos } end end --! Query the window for tooltip text to display for a particular position. --! Tooltips are either associated with buttons, panels, or a region. -- (see Button:setTooltip, Panel:setTooltip, Window:make[Dynamic]Tooltip) --! Button tooltips take precedence over region tooltips, which again take precedence over panels. -- Returns tooltip in form of { text = .. , x = .. , y = .. } or nil for no tooltip. --!param x (integer) The X co-ordinate relative to the top-left corner. --!param y (integer) The Y co-ordinate relative to the top-left corner. function Window:getTooltipAt(x, y) if x < 0 or y < 0 or (self.width and x >= self.width) or (self.height and y >= self.height) then return end if self.windows then for _, window in ipairs(self.windows) do if window:hitTest(x - window.x, y - window.y) then return window:getTooltipAt(x - window.x, y - window.y) end end end for _, btn in ipairs(self.buttons) do if btn.visible ~= false and btn.tooltip and btn.x <= x and x < btn.r and btn.y <= y and y < btn.b then return self:getTooltipForElement(btn.tooltip, x, y) end end if not self.tooltip_regions then self.tooltip_regions = {} end -- TEMPORARY for compatibility of pre-r649 savegames. Remove when compatibility is broken anyway. for _, region in ipairs(self.tooltip_regions) do if region.enabled ~= false and region.x <= x and x < region.r and region.y <= y and y < region.b then return self:getTooltipForElement(region, x, y) end end for _, pnl in ipairs(self.panels) do if pnl.tooltip and self:hitTestPanel(x, y, pnl) then return self:getTooltipForElement(pnl.tooltip, x, y) end end end --! Stub to be extended in subclasses, if needed. function Window:afterLoad(old, new) if old < 2 then -- Scrollbars were added self.scrollbars = {} end if old < 3 then -- Textboxes were added self.textboxes = {} end if old < 22 then self.draggable = true end if old < 32 then -- ui added to buttons for _, btn in ipairs(self.buttons) do btn.ui = self.ui end end if old < 132 then -- Hotkey boxes were added. self.hotkeyboxes = {} end if self.windows then for _, w in pairs(self.windows) do w:afterLoad(old, new) end end end CorsixTH-0.63/CorsixTH/Lua/world.lua000066400000000000000000002773371347163623700172620ustar00rootroot00000000000000--[[ Copyright (c) 2009 Peter "Corsix" Cawley 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. --]] local TH = require"TH" local ipairs, _G, table_remove = ipairs, _G, table.remove corsixth.require("entities.humanoids.patient") corsixth.require("entities.humanoids.staff.doctor") corsixth.require("entities.humanoids.staff.nurse") corsixth.require("entities.humanoids.staff.handyman") corsixth.require("entities.humanoids.staff.receptionist") corsixth.require("entities.humanoids.vip") corsixth.require("entities.humanoids.grim_reaper") corsixth.require("entities.humanoids.inspector") corsixth.require("staff_profile") corsixth.require("hospital") corsixth.require("epidemic") corsixth.require("calls_dispatcher") corsixth.require("research_department") corsixth.require("entity_map") corsixth.require("date") corsixth.require("announcer") local AnnouncementPriority = _G["AnnouncementPriority"] --! Manages entities, rooms, and the date. class "World" ---@type World local World = _G["World"] local local_criteria_variable = { {name = "reputation", icon = 10, formats = 2}, {name = "balance", icon = 11, formats = 2}, {name = "percentage_cured", icon = 12, formats = 2}, {name = "num_cured" , icon = 13, formats = 2}, {name = "percentage_killed",icon = 14, formats = 2}, {name = "value", icon = 15, formats = 2}, {name = "population", icon = 11, formats = 1}, } -- time between each damage caused by an earthquake local earthquake_damage_time = 16 -- hours local earthquake_warning_period = 600 -- hours between warning and real thing local earthquake_warning_length = 25 -- length of early warning quake function World:World(app) self.app = app self.map = app.map self.wall_types = app.walls self.object_types = app.objects self.anims = app.anims self.animation_manager = app.animation_manager self.pathfinder = TH.pathfinder() self.pathfinder:setMap(app.map.th) self.entities = {} -- List of entities in the world. self.dispatcher = CallsDispatcher(self) self.objects = {} self.object_counts = { extinguisher = 0, radiator = 0, plant = 0, reception_desk = 0, bench = 0, general = 0, } self.objects_notify_occupants = {} self.rooms = {} -- List that can have gaps when a room is deleted, so use pairs to iterate. self.entity_map = EntityMap(self.map) -- All information relating to the next or current earthquake, nil if -- there is no scheduled earthquake. -- Contains the following fields: -- active (boolean) Whether we are currently running the warning or damage timers (after start_day of start_month is passed). -- start_month (integer) The month the earthquake warning is triggered. -- start_day (integer) The day of the month the earthquake warning is triggered. -- size (integer) The amount of damage the earthquake causes (1-9). -- remaining_damage (integer) The amount of damage this earthquake has yet to inflict. -- damage_timer (integer) The number of hours until the earthquake next inflicts damage if active. -- warning_timer (integer) The number of hours left until the real damaging earthquake begins. self.next_earthquake = { active = false } -- Time self.hours_per_tick = 1 self.tick_rate = 3 self.tick_timer = 0 self.game_date = Date() self.room_information_dialogs_off = app.config.debug -- This is false when the game is paused. self.user_actions_allowed = true -- In Free Build mode? if tonumber(self.map.level_number) then self.free_build_mode = false else self.free_build_mode = app.config.free_build_mode self.debug_disable_salary_raise = self.free_build_mode end self.debug_disable_salary_raise = false self.idle_cache = {} -- List of which goal criterion means what, and what number the corresponding icon has. self.level_criteria = local_criteria_variable self.room_remove_callbacks = {--[[a set rather than a list]]} self.room_built = {} -- List of room types that have been built self.hospitals = {} self.floating_dollars = {} self.game_log = {} -- saves list of useful debugging information self.savegame_version = app.savegame_version -- Also preserve this throughout future updates. self.original_savegame_version = app.savegame_version -- Initialize available rooms. local avail_rooms = self:getAvailableRooms() self.available_rooms = {} -- Both a list and a set, use ipairs to iterate through the available rooms. for _, avail_room in ipairs(avail_rooms) do local room = avail_room.room self.available_rooms[#self.available_rooms + 1] = room self.available_rooms[room.id] = room end -- Initialize available diseases and winning conditions. self:initLevel(app, avail_rooms) self.hospitals[1] = Hospital(self, avail_rooms, app.config.player_name) -- Player's hospital self:initCompetitors(avail_rooms) for _, hospital in ipairs(self.hospitals) do hospital.research:setResearchConcentration() end -- TODO: Add (working) AI and/or multiplayer hospitals -- TODO: Needs to be changed for multiplayer support self.hospitals[1]:initStaff() self.wall_id_by_block_id = {} for _, wall_type in ipairs(self.wall_types) do for _, set in ipairs({"inside_tiles", "outside_tiles", "window_tiles"}) do for _, id in pairs(wall_type[set]) do self.wall_id_by_block_id[id] = wall_type.id end end end self.wall_set_by_block_id = {} for _, wall_type in ipairs(self.wall_types) do for _, set in ipairs({"inside_tiles", "outside_tiles", "window_tiles"}) do for _, id in pairs(wall_type[set]) do self.wall_set_by_block_id[id] = set end end end self.wall_dir_by_block_id = {} for _, wall_type in ipairs(self.wall_types) do for _, set in ipairs({"inside_tiles", "outside_tiles", "window_tiles"}) do for name, id in pairs(wall_type[set]) do self.wall_dir_by_block_id[id] = name end end end self.object_id_by_thob = {} for _, object_type in ipairs(self.object_types) do self.object_id_by_thob[object_type.thob] = object_type.id end self:makeAvailableStaff(0) self:calculateSpawnTiles() -- Next Events dates self:nextEmergency() self.next_vip_date = self:_generateNextVipDate() -- earthquakes -- current_map_earthquakes is a counter that tracks which number of earthquake -- we are currently on in maps which have information for earthquakes in them self.current_map_earthquake = 0 self:nextEarthquake() -- Set initial spawn rate in people per month. -- Assumes that the first entry is always the first month. self.spawn_rate = self.map.level_config.popn[0].Change self.monthly_spawn_increase = self.spawn_rate self.spawn_hours = {} self.spawn_dates = {} self:updateSpawnDates() self.cheat_announcements = { "cheat001.wav", "cheat002.wav", "cheat003.wav", } self:gameLog("Created game with savegame version " .. self.savegame_version .. ".") end --! Register key shortcuts for controlling the world (game speed, etc.) function World:setUI(ui) self.ui = ui self.ui:addKeyHandler("ingame_pause", self, self.pauseOrUnpause, "Pause") self.ui:addKeyHandler("ingame_gamespeed_slowest", self, self.setSpeed, "Slowest") self.ui:addKeyHandler("ingame_gamespeed_slower", self, self.setSpeed, "Slower") self.ui:addKeyHandler("ingame_gamespeed_normal", self, self.setSpeed, "Normal") self.ui:addKeyHandler("ingame_gamespeed_max", self, self.setSpeed, "Max speed") self.ui:addKeyHandler("ingame_gamespeed_thensome", self, self.setSpeed, "And then some more") self.ui:addKeyHandler("ingame_zoom_in", self, self.adjustZoom, 1) self.ui:addKeyHandler("ingame_zoom_in_more", self, self.adjustZoom, 5) self.ui:addKeyHandler("ingame_zoom_out", self, self.adjustZoom, -1) self.ui:addKeyHandler("ingame_zoom_out_more", self, self.adjustZoom, -5) end function World:adjustZoom(delta) local scr_w = self.ui.app.config.width local factor = self.ui.app.config.zoom_speed local virtual_width = scr_w / (self.ui.zoom_factor or 1) -- The modifier is a normal distribution to make it more difficult to zoom at the extremes local modifier = math.exp(-((self.ui.zoom_factor - 1) ^ 2) / 2) / math.sqrt(2 * math.pi) if modifier < 0.05 or modifier > 1 then modifier = 0.05 end virtual_width = virtual_width - delta * factor * modifier if virtual_width < 200 then return false end return self.ui:setZoom(scr_w / virtual_width) end --! Initialize the game level (available diseases, winning conditions). --!param app Game application. --!param avail_rooms (list) Available rooms in the level. function World:initLevel(app, avail_rooms) local existing_rooms = {} for _, avail_room in ipairs(avail_rooms) do existing_rooms[avail_room.room.id] = true end -- Determine available diseases self.available_diseases = {} local level_config = self.map.level_config local visual = level_config.visuals local non_visual = level_config.non_visuals for _, disease in ipairs(app.diseases) do if not disease.pseudo then local vis_id = disease.visuals_id local nonvis_id = disease.non_visuals_id local vis = 1 if visual and (visual[vis_id] or non_visual[nonvis_id]) then vis = vis_id and visual[vis_id].Value or non_visual[nonvis_id].Value end if vis ~= 0 then for _, room_id in ipairs(disease.treatment_rooms) do if existing_rooms[room_id] == nil then print("Warning: Removing disease \"" .. disease.id .. "\" due to missing treatment room \"" .. room_id .. "\".") vis = 0 -- Missing treatment room, disease cannot be treated. Remove it. break end end end -- TODO: Where the value is greater that 0 should determine the frequency of the patients if vis ~= 0 then self.available_diseases[#self.available_diseases + 1] = disease self.available_diseases[disease.id] = disease end end end if #self.available_diseases == 0 and not self.map.level_number == "MAP EDITOR" then -- No diseases are needed if we're actually in the map editor! print("Warning: This level does not contain any diseases") end self:determineWinningConditions() end function World:toggleInformation() self.room_information_dialogs_off = not self.room_information_dialogs_off end --! Load goals to win and lose from the map, and store them in 'self.goals'. --! Also set 'self.winning_goal_count'. function World:determineWinningConditions() local winning_goal_count = 0 -- No conditions if in free build mode! if self.free_build_mode then self.goals = {} self.winning_goal_count = winning_goal_count return end -- Determine winning and losing conditions local world_goals = {} -- There might be no winning criteria (i.e. the demo), then -- we don't have to worry about the progress report dialog -- since it doesn't exist anyway. local win = self.map.level_config.win_criteria if win then for _, values in pairs(win) do if values.Criteria ~= 0 then winning_goal_count = winning_goal_count + 1 local crit_name = self.level_criteria[values.Criteria].name world_goals[crit_name] = { name = crit_name, win_value = values.Value, boundary = values.Bound, criterion = values.Criteria, max_min_win = values.MaxMin, group = values.Group, number = winning_goal_count, } world_goals[#world_goals + 1] = world_goals[crit_name] end end end -- Likewise there might be no losing criteria (i.e. the demo) local lose = self.map.level_config.lose_criteria if lose then for _, values in pairs(lose) do if values.Criteria ~= 0 then local crit_name = self.level_criteria[values.Criteria].name if not world_goals[crit_name] then world_goals[crit_name] = {number = #world_goals + 1, name = crit_name} world_goals[#world_goals + 1] = world_goals[crit_name] end world_goals[crit_name].lose_value = values.Value world_goals[crit_name].boundary = values.Bound world_goals[crit_name].criterion = values.Criteria world_goals[crit_name].max_min_lose = values.MaxMin world_goals[crit_name].group = values.Group world_goals[world_goals[crit_name].number].lose_value = values.Value world_goals[world_goals[crit_name].number].boundary = values.Bound world_goals[world_goals[crit_name].number].criterion = values.Criteria world_goals[world_goals[crit_name].number].max_min_lose = values.MaxMin world_goals[world_goals[crit_name].number].group = values.Group end end end -- Order the criteria (some icons in the progress report shouldn't be next to each other) table.sort(world_goals, function(a,b) return a.criterion < b.criterion end) self.goals = world_goals self.winning_goal_count = winning_goal_count end --! Find the rooms available at the level. --!return (list) Available rooms, with discovery state at start, and build_cost. function World:getAvailableRooms() local avail_rooms = {} local cfg_objects = self.map.level_config.objects local cfg_rooms = self.map.level_config.rooms for _, room in ipairs(TheApp.rooms) do -- Add build cost based on level files for all rooms. -- For now, sum it up so that the result is the same as before. -- TODO: Change the whole build process so that this value is -- the room cost only? (without objects) local build_cost = cfg_rooms[room.level_config_id].Cost local available = true local is_discovered = true -- Make sure that all objects needed for this room are available for name, no in pairs(room.objects_needed) do local spec = cfg_objects[TheApp.objects[name].thob] if spec.AvailableForLevel == 0 then -- It won't be possible to build this room at all on the level. available = false elseif spec.StartAvail == 0 then -- Ok, it will be available at some point just not from the beginning. is_discovered = false end -- Add cost for this object. build_cost = build_cost + cfg_objects[TheApp.objects[name].thob].StartCost * no end if available then avail_rooms[#avail_rooms + 1] = {room = room, is_discovered = is_discovered, build_cost = build_cost} end end return avail_rooms end --! Initialize competing hospitals --!param avail_rooms (list) Available rooms in the level. function World:initCompetitors(avail_rooms) -- Add computer players -- TODO: Right now they're only names local level_config = self.map.level_config for key, value in pairs(level_config.computer) do if value.Playing == 1 then self.hospitals[#self.hospitals + 1] = AIHospital(tonumber(key) + 1, self, avail_rooms) end end end --! Initializes variables carried from previous levels function World:initFromPreviousLevel(carry) for object, tab in pairs(carry) do if object == "world" then for key, value in pairs(tab) do self[key] = value end elseif object == "hospital" then for key, value in pairs(tab) do self.hospitals[1][key] = value end end end end --! Get the hospital controlled by the (single) player. --!return (Hospital) The hospital controlled by the (single) player. function World:getLocalPlayerHospital() -- NB: UI code can get the hospital to use via ui.hospital -- TODO: Make this work in multiplayer? return self.hospitals[1] end --! Identify the tiles on the map suitable for spawning `Humanoid`s from. function World:calculateSpawnTiles() self.spawn_points = {} local w, h = self.map.width, self.map.height local directions = { {direction = "north", origin = {1, 1}, step = { 1, 0}}, {direction = "east" , origin = {w, 1}, step = { 0, 1}}, {direction = "south", origin = {w, h}, step = {-1, 0}}, {direction = "west" , origin = {1, h}, step = { 0, -1}}, } for _, edge in ipairs(directions) do -- Find all possible spawn points on the edge local xs = {} local ys = {} local x, y = edge.origin[1], edge.origin[2] repeat if self.pathfinder:isReachableFromHospital(x, y) then xs[#xs + 1] = x ys[#ys + 1] = y end x = x + edge.step[1] y = y + edge.step[2] until x < 1 or x > w or y < 1 or y > h -- Choose at most 8 points for the edge local num = math.min(8, #xs) for i = 1, num do local index = math.floor((i - 0.5) / num * #xs + 1) self.spawn_points[#self.spawn_points + 1] = {x = xs[index], y = ys[index], direction = edge.direction} end end end --! Function to determine whether a given disease is available for new patients. --!param self (World) World object. --!param disease (disease) Disease to test. --!param hospital (Hospital) Hospital that needs a new patient. --!return (boolean) Whether the disease is usable for new spawned patients. local function isDiseaseUsableForNewPatient(self, disease, hospital) if disease.only_emergency then return false end if not disease.visuals_id then return true end -- level files can delay visuals to a given month -- and / or until a given number of patients have arrived local level_config = self.map.level_config local hold_visual_months = level_config.gbv.HoldVisualMonths local hold_visual_peep_count = level_config.gbv.HoldVisualPeepCount -- if the month is greater than either of these values then visuals will not appear in the game if (hold_visual_months and hold_visual_months > self.game_date:monthOfGame()) or (hold_visual_peep_count and hold_visual_peep_count > hospital.num_visitors) then return false end -- The value against #visuals_available determines from which month a disease can appear. -- 0 means it can show up anytime. return level_config.visuals_available[disease.visuals_id].Value < self.game_date:monthOfGame() end --! Spawn a patient from a spawn point for the given hospital. --!param hospital (Hospital) Hospital that the new patient should visit. --!return (Patient entity) The spawned patient, or 'nil' if no patient spawned. function World:spawnPatient(hospital) if not hospital then hospital = self:getLocalPlayerHospital() end -- The level might not contain any diseases if #self.available_diseases < 1 then self.ui:addWindow(UIInformation(self.ui, {"There are no diseases on this level! Please add some to your level."})) return end if #self.spawn_points == 0 then self.ui:addWindow(UIInformation(self.ui, {"Could not spawn patient because no spawn points are available. Please place walkable tiles on the edge of your level."})) return end if not hospital:hasStaffedDesk() then return nil end -- Construct disease, take a random guess first, as a quick clear-sky attempt. local disease = self.available_diseases[math.random(1, #self.available_diseases)] if not isDiseaseUsableForNewPatient(self, disease, hospital) then -- Lucky shot failed, do a proper calculation. local usable_diseases = {} for _, d in ipairs(self.available_diseases) do if isDiseaseUsableForNewPatient(self, d, hospital) then usable_diseases[#usable_diseases + 1] = d end end if #usable_diseases == 0 then return nil end disease = usable_diseases[math.random(1, #usable_diseases)] end -- Construct patient. local spawn_point = self.spawn_points[math.random(1, #self.spawn_points)] local patient = self:newEntity("Patient", 2) patient:setDisease(disease) patient:setNextAction(SpawnAction("spawn", spawn_point)) patient:setHospital(hospital) return patient end --A VIP is invited (or he invited himself) to the player hospital. --!param name Name of the VIP function World:spawnVIP(name) local hospital = self:getLocalPlayerHospital() local vip = self:newEntity("Vip", 2) vip:setType("VIP") vip.name = name vip.enter_deaths = hospital.num_deaths vip.enter_visitors = hospital.num_visitors vip.enter_cures = hospital.num_cured vip.enter_explosions = hospital.num_explosions local spawn_point = self.spawn_points[math.random(1, #self.spawn_points)] vip:setNextAction(SpawnAction("spawn", spawn_point)) vip:setHospital(hospital) vip:updateDynamicInfo() hospital.announce_vip = hospital.announce_vip + 1 vip:queueAction(SeekReceptionAction()) end --! Perform actions to simulate an active earthquake. function World:tickEarthquake() if self:isCurrentSpeed("Pause") then return end -- check if this is the day that the earthquake is supposed to stop if self.next_earthquake.remaining_damage == 0 then self.next_earthquake.active = false self.ui:endShakeScreen() -- if the earthquake measured more than 7 on the richter scale, tell the user about it if self.next_earthquake.size > 7 then self.ui.adviser:say(_A.earthquake.ended:format(math.floor(self.next_earthquake.size))) end -- set up the next earthquake date self:nextEarthquake() else local announcements = { "quake001.wav", "quake002.wav", "quake003.wav", "quake004.wav", } -- start of warning quake if self.next_earthquake.warning_timer == earthquake_warning_period then self.ui:beginShakeScreen(0.2) self.ui:playAnnouncement(announcements[math.random(1, #announcements)], AnnouncementPriority.Critical) end -- end of warning quake if self.next_earthquake.warning_timer >= earthquake_warning_period - earthquake_warning_length and self.next_earthquake.warning_timer - self.hours_per_tick < earthquake_warning_period - earthquake_warning_length then self.ui:endShakeScreen() end if self.next_earthquake.warning_timer > 0 then self.next_earthquake.warning_timer = self.next_earthquake.warning_timer - self.hours_per_tick -- nothing more to do during inactive warning period if self.next_earthquake.warning_timer < earthquake_warning_period - earthquake_warning_length then return end -- start of real earthquake if self.next_earthquake.warning_timer <= 0 then self.ui:playAnnouncement(announcements[math.random(1, #announcements)], AnnouncementPriority.Critical) end end -- All earthquakes start and end small (small earthquakes never become -- larger), so when there has been less than 2 damage applied or only -- 2 damage remaining to be applied, move the screen with less -- intensity than otherwise. if self.next_earthquake.remaining_damage <= 2 or self.next_earthquake.size - self.next_earthquake.remaining_damage <= 2 then self.ui:beginShakeScreen(0.5) else self.ui:beginShakeScreen(1) end -- Play the earthquake sound. It has different names depending on language used though. if TheApp.audio:soundExists("quake2.wav") then self.ui:playSound("quake2.wav") else self.ui:playSound("quake.wav") end -- do not continue to damage phase while in a warning quake if self.next_earthquake.warning_timer > 0 then return end self.next_earthquake.damage_timer = self.next_earthquake.damage_timer - self.hours_per_tick if self.next_earthquake.damage_timer <= 0 then for _, room in pairs(self.rooms) do for object, _ in pairs(room.objects) do if object.strength then object:machineUsed(room) end end end self.next_earthquake.remaining_damage = self.next_earthquake.remaining_damage - 1 self.next_earthquake.damage_timer = self.next_earthquake.damage_timer + earthquake_damage_time end local hospital = self:getLocalPlayerHospital() -- loop through the patients and allow the possibility for them to fall over for _, patient in ipairs(hospital.patients) do if not patient.in_room and patient.falling_anim then -- make the patients fall -- jpirie: this is currently disabled. Calling this function -- really screws up the action queue, sometimes the patients -- end up with nil action queues, and sometimes the resumed -- actions throw exceptions. Also, patients in the hospital -- who have not yet found reception throw exceptions after -- they visit reception. Some debugging needed here to get -- this working. -- patient:falling() end end end end function World:debugDisableSalaryRaise(mode) self.debug_disable_salary_raise = mode end local staff_to_make = { {class = "Doctor", name = "doctor", conf = "Doctors" }, {class = "Nurse", name = "nurse", conf = "Nurses" }, {class = "Handyman", name = "handyman", conf = "Handymen" }, {class = "Receptionist", name = "receptionist", conf = "Receptionists"}, } function World:makeAvailableStaff(month) local conf_entry = 0 local cfg_staff_levels = self.map.level_config.staff_levels while cfg_staff_levels[conf_entry + 1] and cfg_staff_levels[conf_entry + 1].Month <= month do conf_entry = conf_entry + 1 end self.available_staff = {} for _, info in ipairs(staff_to_make) do local num local ind = conf_entry while not num do assert(ind >= 0, "Staff amount " .. info.conf .. " not existent (should at least be given by base_config).") num = cfg_staff_levels[ind][info.conf] ind = ind - 1 end local group = {} for i = 1, num do group[i] = StaffProfile(self, info.class, _S.staff_class[info.name]) group[i]:randomise(month) end self.available_staff[info.class] = group end end --[[ Register a callback for when `Humanoid`s enter or leave a given tile. ! Note that only one callback may be registered to each tile. !param x (integer) The 1-based X co-ordinate of the tile to monitor. !param y (integer) The 1-based Y co-ordinate of the tile to monitor. !param object (Object) Something with an `onOccupantChange` method, which will be called whenever a `Humanoid` enters or leaves the given tile. The method will receive one argument (after `self`), which will be `1` for an enter event and `-1` for a leave event. ]] function World:notifyObjectOfOccupants(x, y, object) local idx = (y - 1) * self.map.width + x self.objects_notify_occupants[idx] = object or nil end function World:getObjectToNotifyOfOccupants(x, y) local idx = (y - 1) * self.map.width + x return self.objects_notify_occupants[idx] end local flag_cache = {} function World:createMapObjects(objects) self.delayed_map_objects = {} local map = self.map.th for _, object in ipairs(objects) do repeat local x, y, thob, flags = unpack(object) local object_id = self.object_id_by_thob[thob] if not object_id then print("Warning: Map contained object with unrecognised THOB (" .. thob .. ") at " .. x .. "," .. y) break -- continue end local object_type = self.object_types[object_id] if not object_type or not object_type.supports_creation_for_map then print("Warning: Unable to create map object " .. object_id .. " at " .. x .. "," .. y) break -- continue end -- Delay making objects which are on plots which haven't been purchased yet local parcel = map:getCellFlags(x, y, flag_cache).parcelId if parcel ~= 0 and map:getPlotOwner(parcel) == 0 then self.delayed_map_objects[{object_id, x, y, flags, "map object"}] = parcel else self:newObject(object_id, x, y, flags, "map object") end until true end end --! Change owner of a plot. --!param parcel (int) Plot to change. --!param owner (int) New owner (may be 0). function World:setPlotOwner(parcel, owner) self.map:setPlotOwner(parcel, owner) if owner ~= 0 and self.delayed_map_objects then for info, p in pairs(self.delayed_map_objects) do if p == parcel then self:newObject(unpack(info)) self.delayed_map_objects[info] = nil end end end self.map.th:updateShadows() end function World:getAnimLength(anim) return self.animation_manager:getAnimLength(anim) end -- Register a function to be called whenever a room has been deactivated (crashed or edited). --!param callback (function) A function taking one argument: a `Room`. function World:registerRoomRemoveCallback(callback) self.room_remove_callbacks[callback] = true end -- Unregister a function from being called whenever a room has been deactivated (crashed or edited). --!param callback (function) A function previously passed to -- `registerRoomRemoveCallback`. function World:unregisterRoomRemoveCallback(callback) self.room_remove_callbacks[callback] = nil end function World:newRoom(x, y, w, h, room_info, ...) local id = #self.rooms + 1 -- Note: Room IDs will be unique, but they may not form continuous values -- from 1, as IDs of deleted rooms may not be re-issued for a while local class = room_info.class and _G[room_info.class] or Room local hospital = self:getHospital(x, y) local room = class(x, y, w, h, id, room_info, self, hospital, ...) self.rooms[id] = room self:clearCaches() return room end --! Called when a room has been completely built and is ready to use. --!param room (Room) The new room. function World:markRoomAsBuilt(room) room:roomFinished() local diag_disease = self.hospitals[1].disease_casebook["diag_" .. room.room_info.id] if diag_disease and not diag_disease.discovered then self.hospitals[1].disease_casebook["diag_" .. room.room_info.id].discovered = true end for _, entity in ipairs(self.entities) do if entity.notifyNewRoom then entity:notifyNewRoom(room) end end end --! Called when a room has been deactivated (crashed or edited) function World:notifyRoomRemoved(room) self.dispatcher:dropFromQueue(room) for callback in pairs(self.room_remove_callbacks) do callback(room) end end --! Clear all internal caches which are dependant upon map state / object position function World:clearCaches() self.idle_cache = {} end function World:getWallIdFromBlockId(block_id) -- Remove the transparency flag if present. if self.ui.transparent_walls then block_id = block_id - 1024 end return self.wall_id_by_block_id[block_id] end function World:getWallSetFromBlockId(block_id) -- Remove the transparency flag if present. if self.ui.transparent_walls then block_id = block_id - 1024 end return self.wall_set_by_block_id[block_id] end function World:getWallDirFromBlockId(block_id) -- Remove the transparency flag if present. if self.ui.transparent_walls then block_id = block_id - 1024 end return self.wall_dir_by_block_id[block_id] end local month_length = { 31, -- Jan 28, -- Feb (29 in leap years, but TH doesn't have leap years) 31, -- Mar 30, -- Apr 31, -- May 30, -- Jun 31, -- Jul 31, -- Aug 30, -- Sep 31, -- Oct 30, -- Nov 31, -- Dec } function World:getDate() return self.game_date:monthOfYear(), self.game_date:dayOfMonth() end -- Game speeds. The second value is the number of world clicks that pass for each -- in-game tick and the first is the number of hours to progress when this -- happens. local tick_rates = { ["Pause"] = {0, 1}, ["Slowest"] = {1, 9}, ["Slower"] = {1, 5}, ["Normal"] = {1, 3}, ["Max speed"] = {1, 1}, ["And then some more"] = {3, 1}, ["Speed Up"] = {4, 1}, } function World:speedUp() self:setSpeed("Speed Up") end function World:previousSpeed() if self:isCurrentSpeed("Speed Up") then self:setSpeed(self.prev_speed) end end -- Return if the selected speed the same as the current speed. function World:isCurrentSpeed(speed) local numerator, denominator = unpack(tick_rates[speed]) return self.hours_per_tick == numerator and self.tick_rate == denominator end -- Return the name of the current speed, relating to a key in tick_rates. function World:getCurrentSpeed() for name, rate in pairs(tick_rates) do if rate[1] == self.hours_per_tick and rate[2] == self.tick_rate then return name end end end -- Set the (approximate) number of seconds per tick. --!param speed (string) One of: "Pause", "Slowest", "Slower", "Normal", -- "Max speed", or "And then some more". function World:setSpeed(speed) if self:isCurrentSpeed(speed) then return end if speed == "Pause" then -- stop screen shaking if there was an earthquake in progress if self.next_earthquake.active then self.ui:endShakeScreen() end -- By default actions are not allowed when the game is paused. self.user_actions_allowed = TheApp.config.allow_user_actions_while_paused elseif self:getCurrentSpeed() == "Pause" then self.user_actions_allowed = true end local currentSpeed = self:getCurrentSpeed() if currentSpeed ~= "Pause" and currentSpeed ~= "Speed Up" then self.prev_speed = self:getCurrentSpeed() end local was_paused = currentSpeed == "Pause" local numerator, denominator = unpack(tick_rates[speed]) self.hours_per_tick = numerator self.tick_rate = denominator if was_paused then TheApp.audio:onEndPause() end -- Set the blue filter according to whether the user can build or not. TheApp.video:setBlueFilterActive(not self.user_actions_allowed) return false end function World:isPaused() return self:isCurrentSpeed("Pause") end --! Dedicated function to allow unpausing by pressing 'p' again function World:pauseOrUnpause() if not self:isCurrentSpeed("Pause") then self:setSpeed("Pause") elseif self.prev_speed then self:setSpeed(self.prev_speed) end end -- Outside (air) temperatures based on climate data for Oxford, taken from -- Wikipedia. For scaling, 0 degrees C becomes 0 and 50 degrees C becomes 1 local outside_temperatures = { 4.1 / 50, -- January 4.4 / 50, -- February 6.3 / 50, -- March 8.65 / 50, -- April 11.95 / 50, -- May 15 / 50, -- June 16.95 / 50, -- July 16.55 / 50, -- August 14.15 / 50, -- September 10.5 / 50, -- October 6.8 / 50, -- November 4.75 / 50, -- December } --! World ticks are translated to game ticks (or hours) depending on the -- current speed of the game. There are 50 hours in a TH day. function World:onTick() if self.map.level_number == "MAP EDITOR" then return end if self.tick_timer == 0 then if self.autosave_next_tick then self.autosave_next_tick = nil local pathsep = package.config:sub(1, 1) local dir = TheApp.savegame_dir if not dir:sub(-1, -1) == pathsep then dir = dir .. pathsep end if not lfs.attributes(dir .. "Autosaves", "modification") then lfs.mkdir(dir .. "Autosaves") end local status, err = pcall(TheApp.save, TheApp, dir .. "Autosaves" .. pathsep .. "Autosave" .. self.game_date:monthOfYear() .. ".sav") if not status then print("Error while autosaving game: " .. err) end end if self.game_date == Date() and not self.ui.start_tutorial then self.ui:addWindow(UIWatch(self.ui, "initial_opening")) self.ui:showBriefing() end self.tick_timer = self.tick_rate -- if an earthquake is supposed to be going on, call the earthquake function if self.next_earthquake.active then self:tickEarthquake() end local new_game_date = self.game_date:plusHours(self.hours_per_tick) -- End of day/month/year if self.game_date:dayOfMonth() ~= new_game_date:dayOfMonth() then for _, hospital in ipairs(self.hospitals) do hospital:onEndDay() end self:onEndDay() if self.game_date:isLastDayOfMonth() then for _, hospital in ipairs(self.hospitals) do hospital:onEndMonth() end -- Let the hospitals do what they need to do at end of month first. if self:onEndMonth() then -- Bail out as the game has already been ended. return end if self.game_date:isLastDayOfYear() then -- It is crucial that the annual report gets to initialize before onEndYear is called. -- Yearly statistics are reset there. self.ui:addWindow(UIAnnualReport(self.ui, self)) self:onEndYear() end end end self.game_date = new_game_date for i = 1, self.hours_per_tick do for _, hospital in ipairs(self.hospitals) do hospital:tick() end -- A patient might arrive to the player hospital. -- TODO: Multiplayer support. local spawn_count = self.spawn_hours[self.game_date:hourOfDay() + i - 1] if spawn_count and self.hospitals[1].opened then for _ = 1, spawn_count do self:spawnPatient() end end for _, entity in ipairs(self.entities) do if entity.ticks then self.current_tick_entity = entity entity:tick() end end self.current_tick_entity = nil self.map:onTick() self.map.th:updateTemperatures(outside_temperatures[self.game_date:monthOfYear()], 0.25 + self.hospitals[1].radiator_heat * 0.3) if self.ui then self.ui:onWorldTick() end self.dispatcher:onTick() end end if self.hours_per_tick > 0 and self.floating_dollars then for obj in pairs(self.floating_dollars) do obj:tick() if obj:isDead() then obj:setTile(nil) self.floating_dollars[obj] = nil end end end self.tick_timer = self.tick_timer - 1 end function World:setEndMonth() local first_day_of_next_month = Date(self.game_date:year(), self.game_date:monthOfYear() + 1) self.game_date = first_day_of_next_month:plusHours(-1) end function World:setEndYear() local first_day_of_next_year = Date(self.game_date:year() + 1) self.game_date = first_day_of_next_year:plusHours(-1) end -- Called immediately prior to the ingame day changing. function World:onEndDay() for _, entity in ipairs(self.entities) do if entity.ticks and class.is(entity, Humanoid) then self.current_tick_entity = entity entity:tickDay() elseif class.is(entity, Plant) then entity:tickDay() end end self.current_tick_entity = nil --check if it's time for a VIP visit if self.game_date:isSameDay(self.next_vip_date) then if #self.rooms > 0 and self.ui.hospital:hasStaffedDesk() then self.hospitals[1]:createVip() else self.next_vip_date = self:_generateNextVipDate() end end -- check if it's time for an earthquake, and the user is at least on level 5 if self.game_date:monthOfGame() == self.next_earthquake.start_month and self.game_date:dayOfMonth() == self.next_earthquake.start_day then -- warn the user that an earthquake is on the way self.next_earthquake.active = true end -- Maybe it's time for an emergency? if self.game_date:monthOfGame() == self.next_emergency_month and self.game_date:dayOfMonth() == self.next_emergency_day then -- Postpone it if anything clock related is already underway. if self.ui:getWindow(UIWatch) then self.next_emergency_month = self.next_emergency_month + 1 local month_of_year = 1 + ((self.next_emergency_month - 1) % 12) self.next_emergency_day = math.random(1, Date(1, month_of_year):lastDayOfMonth()) else -- Do it only for the player hospital for now. TODO: Multiplayer local control = self.map.level_config.emergency_control if control[0].Mean or control[0].Random then -- The level uses random emergencies, so just create one. self.hospitals[1]:createEmergency() else control = control[self.next_emergency_no] -- Find out which disease the emergency patients have. local disease for _, dis in ipairs(self.available_diseases) do if dis.expertise_id == control.Illness then disease = dis break end end if not disease then -- Unknown disease! Create a random one instead. self.hospitals[1]:createEmergency() else local emergency = { disease = disease, victims = math.random(control.Min, control.Max), bonus = control.Bonus, percentage = control.PercWin/100, killed_emergency_patients = 0, cured_emergency_patients = 0, } self.hospitals[1]:createEmergency(emergency) end end end end -- Any patients tomorrow? self.spawn_hours = {} local day = self.game_date:dayOfMonth() if self.spawn_dates[day] then for _ = 1, self.spawn_dates[day] do local hour = math.random(1, Date.hoursPerDay()) self.spawn_hours[hour] = self.spawn_hours[hour] and self.spawn_hours[hour] + 1 or 1 end end -- TODO: Do other regular things? Such as checking if any room needs -- staff at the moment and making plants need water. end function World:checkIfGameWon() for i, _ in ipairs(self.hospitals) do local res = self:checkWinningConditions(i) if res.state == "win" then self:winGame(i) end end end -- Called immediately prior to the ingame month changing. -- returns true if the game was killed due to the player losing function World:onEndMonth() -- Check if a player has won the level if the year hasn't ended, if it has the -- annual report window will perform this check when it has been closed. -- TODO.... this is a step closer to the way TH would check. -- What is missing is that if offer is declined then the next check should be -- either 6 months later or at the end of month 12 and then every 6 months if self.game_date:monthOfYear() % 3 == 0 and self.game_date:monthOfYear() < 12 then self:checkIfGameWon() end local local_hospital = self:getLocalPlayerHospital() local_hospital.population = 0.25 if self.game_date:monthOfGame() >= self.map.level_config.gbv.AllocDelay then local_hospital.population = local_hospital.population * self:getReputationImpact(local_hospital) end -- Also possibly change world spawn rate according to the level configuration. local index = 0 local popn = self.map.level_config.popn while popn[index] do if popn[index].Month == self.game_date:monthOfGame() then self.monthly_spawn_increase = popn[index].Change break end index = index + 1 end -- Now set the new spawn rate self.spawn_rate = self.spawn_rate + self.monthly_spawn_increase self:updateSpawnDates() self:makeAvailableStaff(self.game_date:monthOfGame()) self.autosave_next_tick = true for _, entity in ipairs(self.entities) do if entity.checkForDeadlock then self.current_tick_entity = entity entity:checkForDeadlock() end end self.current_tick_entity = nil end -- Called when a month ends. Decides on which dates patients arrive -- during the coming month. function World:updateSpawnDates() -- Set dates when people arrive local no_of_spawns = math.n_random(self.spawn_rate, 2) -- Use ceil so that at least one patient arrives (unless population = 0) no_of_spawns = math.ceil(no_of_spawns*self:getLocalPlayerHospital().population) self.spawn_dates = {} for _ = 1, no_of_spawns do -- We are interested in the next month, pick days from it at random. local day = math.random(1, self.game_date:lastDayOfMonth()) self.spawn_dates[day] = self.spawn_dates[day] and self.spawn_dates[day] + 1 or 1 end end --! Computes the impact of hospital reputation on the spawn rate. --! The relation between reputation and its impact is linear. --! Returns a percentage (as a float): --! 1% if reputation < 253 --! 60% if reputation == 400 --! 100% if reputation == 500 --! 140% if reputation == 600 --! 180% if reputation == 700 --! 300% if reputation == 1000 --!param hospital (hospital): the hospital used to compute the --! reputation impact function World:getReputationImpact(hospital) local result = 1 + ((hospital.reputation - 500) / 250) -- The result must be positive if result <= 0 then return 0.01 else return result end end -- Called when it is time to determine what the -- next emergency should look like. function World:nextEmergency() local control = self.map.level_config.emergency_control -- Does this level use random emergencies? if control and (control[0].Random or control[0].Mean) then -- Support standard values for mean and variance local mean = control[0].Mean or 180 local variance = control[0].Variance or 30 -- How many days until next emergency? local days = math.round(math.n_random(mean, variance)) local emergency_date = self.game_date:plusDays(days) -- Make it the same format as for "controlled" emergencies self.next_emergency_month = emergency_date:monthOfGame() self.next_emergency_day = emergency_date:dayOfMonth() else if not self.next_emergency_no then self.next_emergency_no = 0 else repeat self.next_emergency_no = self.next_emergency_no + 1 -- Level three is missing [5]. if not control[self.next_emergency_no] and control[self.next_emergency_no + 1] then self.next_emergency_no = self.next_emergency_no + 1 end until not control[self.next_emergency_no] or control[self.next_emergency_no].EndMonth >= self.game_date:monthOfGame() end local emergency = control[self.next_emergency_no] -- No more emergencies? if not emergency or emergency.EndMonth == 0 then self.next_emergency_month = 0 else -- Generate the next month and day the emergency should occur at. -- Make sure it doesn't happen in the past. local start = math.max(emergency.StartMonth, self.game_date:monthOfGame()) local next_month = math.random(start, emergency.EndMonth) self.next_emergency_month = next_month local day_start = 1 if start == emergency.EndMonth then day_start = self.game_date:dayOfMonth() end local day_end = Date(1, next_month):lastDayOfMonth() self.next_emergency_day = math.random(day_start, day_end) end end end -- Called when it is time to have another VIP function World:nextVip() self.next_vip_date = self:_generateNextVipDate() end -- PRIVATE method to generate the next VIP date function World:_generateNextVipDate() -- Support standard values for mean and variance local mean = 180 local variance = 30 -- How many days until next vip? local days = math.round(math.n_random(mean, variance)) return self.game_date:plusDays(days) end -- Called when it is time to have another earthquake function World:nextEarthquake() self.next_earthquake = {} self.next_earthquake.active = false local level_config = self.map.level_config -- check carefully that no value that we are going to use is going to be nil if level_config.quake_control and level_config.quake_control[self.current_map_earthquake] and level_config.quake_control[self.current_map_earthquake].Severity ~= 0 then -- this map has rules to follow when making earthquakes, let's follow them local control = level_config.quake_control[self.current_map_earthquake] self.next_earthquake.start_month = math.random(control.StartMonth, control.EndMonth) -- Month length of the start of the earthquake. From start to finish -- earthquakes do not persist for >= a month so we can wrap all days -- after the start around the month length unambiguously. local eqml = month_length[(self.next_earthquake.start_month % 12) + 1] self.next_earthquake.start_day = math.random(1, eqml) self.next_earthquake.size = control.Severity self.next_earthquake.remaining_damage = self.next_earthquake.size self.next_earthquake.damage_timer = earthquake_damage_time self.next_earthquake.warning_timer = earthquake_warning_period self.current_map_earthquake = self.current_map_earthquake + 1 end end --! Checks if all goals have been achieved or if the player has lost. --! Returns a table that always contains a state string ("win", "lose" or "nothing"). --! If the state is "lose", the table also contains a reason string, --! which corresponds to the criterion name the player lost to --! (reputation, balance, percentage_killed) and a number limit which --! corresponds to the limit the player passed. --!param player_no The index of the player to check in the world's list of hospitals function World:checkWinningConditions(player_no) -- If there are no goals at all, do nothing. if #self.goals == 0 then return {state = "nothing"} end -- Default is to win. -- As soon as a goal that doesn't support this is found it is changed. local result = {state = "win"} local hospital = self.hospitals[player_no] -- Go through the goals for _, goal in ipairs(self.goals) do local current_value = hospital[goal.name] -- If max_min is 1 the value must be > than the goal condition. -- If 0 it must be < than the goal condition. if goal.lose_value then local max_min = goal.max_min_lose == 1 and 1 or -1 -- Is this a minimum/maximum that has been passed? -- This is actually not entirely correct. A lose condition -- for balance at -1000 will make you lose if you have exactly -- -1000 too, but how often does that happen? Probably not more often -- than having exactly e.g. 200 in reputation, -- which is handled correctly. if (current_value - goal.lose_value) * max_min > 0 then result.state = "lose" result.reason = goal.name result.limit = goal.lose_value break end end if goal.win_value then local max_min = goal.max_min_win == 1 and 1 or -1 -- Special case for balance, subtract any loans! if goal.name == "balance" then current_value = current_value - hospital.loan end -- Is this goal not fulfilled yet? if (current_value - goal.win_value) * max_min <= 0 then result.state = "nothing" end end end return result end --! Process that the given player number won the game. --!param player_no (integer) Number of the player who just won. function World:winGame(player_no) if player_no == 1 then -- Player won. TODO: Needs to be changed for multiplayer local text = {} local choice_text, choice local bonus_rate = math.random(4,9) local with_bonus = self.ui.hospital.cheated and 0 or (self.ui.hospital.player_salary * bonus_rate) / 100 self.ui.hospital.salary_offer = math.floor(self.ui.hospital.player_salary + with_bonus) if type(self.map.level_number) == "number" or self.campaign_info then text, choice_text, choice = self:getCampaignWinningText(player_no) else local level_info = TheApp:readLevelFile(self.map.level_number) text[1] = _S.letter.dear_player:format(self.hospitals[player_no].name) text[2] = level_info.end_praise and level_info.end_praise or _S.letter.custom_level_completed text[3] = _S.letter.return_to_main_menu choice_text = _S.fax.choices.return_to_main_menu choice = "return_to_main_menu" end local message = { {text = text[1]}, {text = text[2]}, {text = text[3]}, choices = { {text = choice_text, choice = choice}, {text = _S.fax.choices.decline_new_level, choice = "stay_on_level"}, }, } local --[[persistable:world_win_game_message_close_callback]] function callback () local world = self.ui.app.world if world then world.hospitals[player_no].game_won = false if world:isCurrentSpeed("Pause") then world:setSpeed(world.prev_speed) end end end self.hospitals[player_no].game_won = true if self:isCurrentSpeed("Speed Up") then self:previousSpeed() end self:setSpeed("Pause") self.ui.app.video:setBlueFilterActive(false) self.ui.bottom_panel:queueMessage("information", message, nil, 0, 2, callback) self.ui.bottom_panel:openLastMessage() end end --! Finds what text the winning fax should contain, and which choices the player has. --!param player_no (integer) Which player that will see the message. --!return (string, string, string) Text to show in the fax, text that accompanies --! the "continue"-choice the player has, and whether it is the "return_to_main_menu" --! choice or the "accept_new_level" choice. function World:getCampaignWinningText(player_no) local text = {} local choice_text, choice local repeated_offer = false -- TODO whether player was asked previously to advance and declined local has_next = false if type(self.map.level_number) == "number" then local no = tonumber(self.map.level_number) has_next = no < 12 and not TheApp.using_demo_files -- Standard letters 1-4: normal -- Standard letters 5-8: repeated offer -- Standard letters 9-12: last level local letter_idx = math.random(1, 4) + (not has_next and 8 or repeated_offer and 4 or 0) for key, value in ipairs(_S.letter[letter_idx]) do text[key] = value end text[1] = text[1]:format(self.hospitals[player_no].name) text[2] = text[2]:format(self.hospitals[player_no].salary_offer) text[3] = text[3]:format(_S.level_names[self.map.level_number + 1]) else local campaign_info = self.campaign_info local next_level_name if campaign_info then for i, level in ipairs(campaign_info.levels) do if self.map.level_number == level then has_next = i < #campaign_info.levels if has_next then local next_level_info = TheApp:readLevelFile(campaign_info.levels[i + 1]) if not next_level_info then return {_S.letter.campaign_level_missing:format(campaign_info.levels[i + 1]), "", ""}, _S.fax.choices.return_to_main_menu, "return_to_main_menu" end next_level_name = next_level_info.name end break end end end local level_info = TheApp:readLevelFile(self.map.level_number) text[1] = _S.letter.dear_player:format(self.hospitals[player_no].name) if has_next then text[2] = level_info.end_praise and level_info.end_praise:format(next_level_name) or _S.letter.campaign_level_completed:format(next_level_name) text[3] = "" else text[2] = campaign_info.winning_text and campaign_info.winning_text or _S.letter.campaign_completed text[3] = "" end end if has_next then choice_text = _S.fax.choices.accept_new_level choice = "accept_new_level" else choice_text = _S.fax.choices.return_to_main_menu choice = "return_to_main_menu" end return text, choice_text, choice end --! Cause the player with the player number player_no to lose. --!param player_no (number) The number of the player which should lose. --!param reason (string) [optional] The name of the criterion the player lost to. --!param limit (number) [optional] The number the player went over/under which caused him to lose. function World:loseGame(player_no, reason, limit) if player_no == 1 then -- TODO: Multiplayer self.ui.app.moviePlayer:playLoseMovie() local message = {_S.information.level_lost[1]} if reason then message[2] = _S.information.level_lost[2] message[3] = _S.information.level_lost[reason]:format(limit) else message[2] = _S.information.level_lost["cheat"] end self.ui.app:loadMainMenu(message) end end -- Called immediately prior to the ingame year changing. function World:onEndYear() for _, hospital in ipairs(self.hospitals) do hospital:onEndYear() end -- This is done here instead of in onEndMonth so that the player gets -- the chance to receive money or reputation from trophies and awards first. for i, _ in ipairs(self.hospitals) do local res = self:checkWinningConditions(i) if res.state == "lose" then self:loseGame(i, res.reason, res.limit) if i == 1 then return true end end end end -- Calculate the distance of the shortest path (along passable tiles) between -- the two given map tiles. This operation is commutative (swapping (x1, y1) -- with (x2, y2) has no effect on the result) if both tiles are passable. --!param x1 (integer) X-cordinate of first tile's Lua tile co-ordinates. --!param y1 (integer) Y-cordinate of first tile's Lua tile co-ordinates. --!param x2 (integer) X-cordinate of second tile's Lua tile co-ordinates. --!param y2 (integer) Y-cordinate of second tile's Lua tile co-ordinates. --!return (integer, boolean) The distance of the shortest path, or false if -- there is no path. function World:getPathDistance(x1, y1, x2, y2) return self.pathfinder:findDistance(x1, y1, x2, y2) end function World:getPath(x, y, dest_x, dest_y) return self.pathfinder:findPath(x, y, dest_x, dest_y) end function World:getIdleTile(x, y, idx) local cache_idx = (y - 1) * self.map.width + x local cache = self.idle_cache[cache_idx] if not cache then cache = { x = {}, y = {}, } self.idle_cache[cache_idx] = cache end if not cache.x[idx] then local ix, iy = self.pathfinder:findIdleTile(x, y, idx) if not ix then return ix, iy end cache.x[idx] = ix cache.y[idx] = iy end return cache.x[idx], cache.y[idx] end --[[ This function checks if a tile has no entity on it and (optionally) if it is not in a room. !param x (integer) the queried tile's x coordinate. !param y (integer) the queried tile's y coordinate. !param not_in_room (boolean) If set, also check the tile is not in a room. !return (boolean) whether all checks hold. --]] function World:isTileEmpty(x, y, not_in_room) if #self.entity_map:getHumanoidsAtCoordinate(x, y) ~= 0 or #self.entity_map:getObjectsAtCoordinate(x, y) ~= 0 then return false end if not_in_room then return self:getRoom(x, y) == nil end return true end function World:getFreeBench(x, y, distance) local bench, rx, ry, bench_distance local object_type = self.object_types.bench x, y, distance = math.floor(x), math.floor(y), math.ceil(distance) self.pathfinder:findObject(x, y, object_type.thob, distance, function(xpos, ypos, d, dist) local b = self:getObject(xpos, ypos, "bench") if b and not b.user and not b.reserved_for then local orientation = object_type.orientations[b.direction] if orientation.pathfind_allowed_dirs[d] then rx = xpos + orientation.use_position[1] ry = ypos + orientation.use_position[2] bench = b bench_distance = dist return true end end end) return bench, rx, ry, bench_distance end --! Checks whether the given tile is part of a nearby object (walkable tiles -- count as part of the object) --!param x X position of the given tile. --!param y Y position of the given tile. --!param distance The number of tiles away from the tile to search. --!return (boolean) Whether the tile is part of a nearby object. function World:isTilePartOfNearbyObject(x, y, distance) for o in pairs(self:findAllObjectsNear(x, y, distance)) do for _, xy in ipairs(o:getWalkableTiles()) do if xy[1] == x and xy[2] == y then return true end end end return false end -- Returns a set of all objects near the given position but if supplied only of the given object type. --!param x The x-coordinate at which to originate the search --!param y The y-coordinate --!param distance The number of tiles away from the origin to search --!param object_type_name The name of the objects that are being searched for function World:findAllObjectsNear(x, y, distance, object_type_name) if not distance then -- Note that regardless of distance, only the room which the humanoid is in -- is searched (or the corridor if the humanoid is not in a room). distance = 2^30 end local objects = {} local thob = 0 if object_type_name then local obj_type = self.object_types[object_type_name] if not obj_type then error("Invalid object type name: " .. object_type_name) end thob = obj_type.thob end local callback = function(xpos, ypos, d) local obj = self:getObject(xpos, ypos, object_type_name) if obj then objects[obj] = true end end self.pathfinder:findObject(x, y, thob, distance, callback) return objects end --[[ Find all objects of the given type near the humanoid. Note that regardless of distance, only the room which the humanoid is in is searched (or the corridor if the humanoid is not in a room). When no callback is specified then the first object found is returned, along with its usage tile position. This may return an object already being used - if you want to find an object not in use (in order to use it), then call findFreeObjectNearToUse instead. !param humanoid The humanoid to search around !param object_type_name The objects to search for !param distance Maximum L1 distance to search from humanoid. If nil then everywhere in range will be searched. !param callback Function to call for each result. If it returns true then the search will be ended. --]] function World:findObjectNear(humanoid, object_type_name, distance, callback) if not distance then distance = 2^30 end local obj, ox, oy if not callback then -- The default callback returns the first object found callback = function(x, y, d) obj = self:getObject(x, y, object_type_name) local orientation = obj.object_type.orientations if orientation then orientation = orientation[obj.direction] if not orientation.pathfind_allowed_dirs[d] then return end x = x + orientation.use_position[1] y = y + orientation.use_position[2] end ox = x oy = y return true end end local thob = 0 if type(object_type_name) == "table" then local original_callback = callback callback = function(x, y, ...) local cb_obj = self:getObject(x, y, object_type_name) if cb_obj then return original_callback(x, y, ...) end end elseif object_type_name ~= nil then local obj_type = self.object_types[object_type_name] if not obj_type then error("Invalid object type name: " .. object_type_name) end thob = obj_type.thob end self.pathfinder:findObject(humanoid.tile_x, humanoid.tile_y, thob, distance, callback) -- These return values are only relevant for the default callback - are nil -- for custom callbacks return obj, ox, oy end function World:findFreeObjectNearToUse(humanoid, object_type_name, which, current_object) -- If which == nil or false, then the nearest object is taken. -- If which == "far", then the furthest object is taken. -- If which == "near", then the nearest object is taken with 50% probability, the second nearest with 25%, and so on -- Other values for which may be added in the future. -- Specify current_object if you want to exclude the currently used object from the search local object, ox, oy self:findObjectNear(humanoid, object_type_name, nil, function(x, y, d) local obj = self:getObject(x, y, object_type_name) if obj.user or (obj.reserved_for and obj.reserved_for ~= humanoid) or (current_object and obj == current_object) then return end local orientation = obj.object_type.orientations if orientation then orientation = orientation[obj.direction] if not orientation.pathfind_allowed_dirs[d] then return end x = x + orientation.use_position[1] y = y + orientation.use_position[2] end object = obj ox = x oy = y if which == "far" then -- just take the last found object, so don't ever abort elseif which == "near" then -- abort at each item with 50% probability local chance = math.random(1, 2) if chance == 1 then return true end else -- default: return at the first found item return true end end) return object, ox, oy end function World:findRoomNear(humanoid, room_type_id, distance, mode) -- If mode == "nearest" (or nil), the nearest room is taken -- If mode == "advanced", prefer a near room, but also few patients and fulfilled staff criteria local room local score if not mode then mode = "nearest" -- default mode end if not distance then distance = 2^30 end for _, r in pairs(self.rooms) do repeat if r.built and (not room_type_id or r.room_info.id == room_type_id) and r.is_active then local x, y = r:getEntranceXY(false) local d = self:getPathDistance(humanoid.tile_x, humanoid.tile_y, x, y) if not d or d > distance then break -- continue end local this_score = d if mode == "advanced" then this_score = this_score + r:getUsageScore() end if not score or this_score < score then score = this_score room = r end end until true end return room end --! Setup an animated floating money amount above a patient. --!param patient Patient to float above. --!param amount Amount of money to display. function World:newFloatingDollarSign(patient, amount) if not self.floating_dollars then self.floating_dollars = {} end if self.free_build_mode then return end local spritelist = TH.spriteList() spritelist:setPosition(-17, -60) spritelist:setSpeed(0, -1):setLifetime(100) spritelist:setSheet(TheApp.gfx:loadSpriteTable("Data", "Money01V")) spritelist:append(1, 0, 0) local len = #("%i"):format(amount) local xbase = math.floor(10.5 + (20 - 5 * len) / 2) for i = 1, len do local digit = amount % 10 amount = (amount - digit) / 10 spritelist:append(2 + digit, xbase + 5 * (len - i), 5) end spritelist:setTile(self.map.th, patient.tile_x, patient.tile_y) self.floating_dollars[spritelist] = true end function World:newEntity(class, animation) local th = TH.animation() th:setAnimation(self.anims, animation) local entity = _G[class](th) self.entities[#self.entities + 1] = entity entity.world = self return entity end function World:destroyEntity(entity) for i, e in ipairs(self.entities) do if e == entity then table.remove(self.entities, i) break end end entity:onDestroy() end function World:newObjectType(new_object) self.object_types[new_object.id] = new_object end --! Creates a new object by finding the object_type from the "id" variable and -- calls its class constructor. --!param id (string) The unique id of the object to be created. --!return The created object. function World:newObject(id, ...) local object_type = self.object_types[id] local entity if object_type.class then entity = _G[object_type.class](self, object_type, ...) elseif object_type.default_strength then entity = Machine(self, object_type, ...) -- Tell the player if there is no handyman to take care of the new machinery. if not self.hospitals[1]:hasStaffOfCategory("Handyman") then self.ui.adviser:say(_A.staff_advice.need_handyman_machines) end else entity = Object(self, object_type, ...) end self:objectPlaced(entity, id) return entity end function World:canNonSideObjectBeSpawnedAt(x, y, objects_id, orientation, spawn_rooms_id, player_id) local object = self.object_types[objects_id] local objects_footprint = object.orientations[orientation].footprint for _, tile in ipairs(objects_footprint) do local tiles_world_x = x + tile[1] local tiles_world_y = y + tile[2] if not self:isOnMap(tiles_world_x, tiles_world_y) then return false end if not self:willObjectsFootprintTileBeWithinItsAllowedRoomIfLocatedAt(x, y, object, spawn_rooms_id).within_room then return false end if not self:isFootprintTileBuildableOrPassable(x, y, tile, objects_footprint, "buildable", player_id) then return false end end return not self:wouldNonSideObjectBreakPathfindingIfSpawnedAt(x, y, object, orientation, spawn_rooms_id) end --! Test whether the given coordinate is on the map. --!param x (int) X position of the coordinate to test. --!param y (int) Y position of the coordinate to test. --!return (boolean) Whether the provided position is on the map. function World:isOnMap(x, y) return x >= 1 and x <= self.map.width and y >= 1 and y <= self.map.height end --- -- @param allowed_rooms_id_parameter Should be nil when the object is allowed to be placed in any room. -- @return {within_room, roomId} --- function World:willObjectsFootprintTileBeWithinItsAllowedRoomIfLocatedAt(x, y, object, allowed_rooms_id_parameter) local xy_rooms_id = self.map.th:getCellFlags(x, y, {}).roomId if allowed_rooms_id_parameter then return {within_room = allowed_rooms_id_parameter == xy_rooms_id, roomId = allowed_rooms_id_parameter} elseif xy_rooms_id == 0 then return {within_room = object.corridor_object ~= nil, roomId = xy_rooms_id} else for _, additional_objects_name in pairs(self.rooms[xy_rooms_id].room_info.objects_additional) do if TheApp.objects[additional_objects_name].thob == object.thob then return {within_room = true, roomId = xy_rooms_id} end end for needed_objects_name, _ in pairs(self.rooms[xy_rooms_id].room_info.objects_needed) do if TheApp.objects[needed_objects_name].thob == object.thob then return {within_room = true, roomId = xy_rooms_id} end end return {within_room = false, roomId = xy_rooms_id} end end --- -- A footprint tile will either need to be buildable or passable so this function -- checks if its buildable/passable using the tile's appropriate flag and then returns this -- flag's boolean value or false if the tile isn't valid. --- function World:isFootprintTileBuildableOrPassable(x, y, tile, footprint, requirement_flag, player_id) local function isTileValid(xpos, ypos, complete_cell, flags, flag_name, need_side) if complete_cell or need_side then return flags[flag_name] end for _, fp_tile in ipairs(footprint) do if fp_tile[1] == xpos and fp_tile[2] == ypos then return flags[flag_name] end end return true end local direction_parameters = { north = { x = 0, y = -1, buildable_flag = "buildableNorth", passable_flag = "travelNorth", needed_side = "need_north_side"}, east = { x = 1, y = 0, buildable_flag = "buildableEast", passable_flag = "travelEast", needed_side = "need_east_side"}, south = { x = 0, y = 1, buildable_flag = "buildableSouth", passable_flag = "travelSouth", needed_side = "need_south_side"}, west = { x = -1, y = 0, buildable_flag = "buildableWest", passable_flag = "travelWest", needed_side = "need_west_side"} } local flags = {} local requirement_met = self.map.th:getCellFlags(x, y, flags)[requirement_flag] and (player_id == 0 or player_id == flags.owner) if requirement_met then -- For each direction check that the tile is valid: for _, direction in pairs(direction_parameters) do local x1, y1 = tile[1] + direction["x"], tile[2] + direction["y"] if not isTileValid(x1, y1, tile.complete_cell, flags, direction["buildable_flag"], tile[direction["needed_side"]]) then return false end end return true else return false end end --- -- Check that pathfinding still works, i.e. that placing the object -- wouldn't disconnect one part of the hospital from another. To do -- this, we provisionally mark the footprint as unpassable (as it will -- become when the object is placed), and then check that the cells -- surrounding the footprint have not had their connectedness changed. --- function World:wouldNonSideObjectBreakPathfindingIfSpawnedAt(x, y, object, objects_orientation, spawn_rooms_id) local objects_footprint = object.orientations[objects_orientation].footprint local map = self.map.th local function setFootprintTilesPassable(passable) for _, tile in ipairs(objects_footprint) do if not tile.only_passable then map:setCellFlags(x + tile[1], y + tile[2], {passable = passable}) end end end local function isIsolated(xpos, ypos) setFootprintTilesPassable(false) local result = not self.pathfinder:isReachableFromHospital(xpos, ypos) setFootprintTilesPassable(true) return result end local all_good = true --1. Find out which footprint tiles are passable now before this function makes some unpassable --during its test: local tiles_passable_flags = {} for _, tile in ipairs(objects_footprint) do table.insert(tiles_passable_flags, map:getCellFlags(x + tile[1], y + tile[2], {}).passable) end --2. Find out which tiles adjacent to the footprint would become isolated: setFootprintTilesPassable(false) local prev_x, prev_y for _, tile in ipairs(object.orientations[objects_orientation].adjacent_to_solid_footprint) do local xpos = x + tile[1] local ypos = y + tile[2] local flags = {} if map:getCellFlags(xpos, ypos, flags).roomId == spawn_rooms_id and flags.passable then if prev_x then if not self.pathfinder:findDistance(xpos, ypos, prev_x, prev_y) then -- There is no route between the two map nodes. In most cases, -- this means that connectedness has changed, though there is -- one rare situation where the above test is insufficient. If -- (xpos, ypos) is a passable but isolated node outside the hospital -- and (prev_x, prev_y) is in the corridor, then the two will -- not be connected now, but critically, neither were they -- connected before. if not isIsolated(xpos, ypos) then if not isIsolated(prev_x, prev_y) then all_good = false break end else xpos = prev_x ypos = prev_y end end end prev_x = xpos prev_y = ypos end end -- 3. For each footprint tile passable flag set to false by step 2 undo this change: for tiles_index, tile in ipairs(objects_footprint) do map:setCellFlags(x + tile[1], y + tile[2], {passable = tiles_passable_flags[tiles_index]}) end return not all_good end --! Notifies the world that an object has been placed, notifying -- interested entities in the vicinity of the new arrival. --!param entity (Entity) The entity that was just placed. --!param id (string) That entity's id. function World:objectPlaced(entity, id) -- If id is not supplied, we can use the entities internal id if it exists -- This is so the bench check below works -- see place_object.lua:UIPlaceObjects:placeObject for call w/o id --cgj if not id and entity.object_type.id then id = entity.object_type.id end self.entities[#self.entities + 1] = entity -- If it is a bench we're placing, notify queueing patients in the vicinity if id == "bench" and entity.tile_x and entity.tile_y then local notify_distance = 6 local w, h = self.map.th:size() for tx = math.max(1, entity.tile_x - notify_distance), math.min(w, entity.tile_x + notify_distance) do for ty = math.max(1, entity.tile_y - notify_distance), math.min(h, entity.tile_y + notify_distance) do for _, patient in ipairs(self.entity_map:getHumanoidsAtCoordinate(tx, ty)) do if class.is(patient, Patient) then patient:notifyNewObject(id) end end end end end if id == "reception_desk" then if not self.ui.start_tutorial and not self.hospitals[1]:hasStaffOfCategory("Receptionist") then -- TODO: Will not work correctly for multiplayer self.ui.adviser:say(_A.room_requirements.reception_need_receptionist) elseif self.hospitals[1]:hasStaffOfCategory("Receptionist") and self.object_counts["reception_desk"] == 1 and not self.hospitals[1].receptionist_msg and self.game_date:monthOfGame() > 3 then self.ui.adviser:say(_A.warnings.no_desk_5) self.hospitals[1].receptionist_msg = true end end -- If it is a plant it might be advisable to hire a handyman if id == "plant" and not self.hospitals[1]:hasStaffOfCategory("Handyman") then self.ui.adviser:say(_A.staff_advice.need_handyman_plants) end if id == "gates_to_hell" then entity:playEntitySounds("LAVA00*.WAV", {0,1350,1150,950,750,350}, {0,1450,1250,1050,850,450}, 40) entity:setTimer(entity.world:getAnimLength(2550), --[[persistable:lava_hole_spawn_animation_end]] function(anim_entity) anim_entity:setAnimation(1602) end) entity:setAnimation(2550) end end --! Notify the world of an object being removed from a tile --! See also `World:addObjectToTile` --!param object (Object) The object being removed. --!param x (integer) The X-coordinate of the tile which the object was on --!param y (integer) The Y-coordinate of the tile which the object was on function World:removeObjectFromTile(object, x, y) local index = (y - 1) * self.map.width + x local objects = self.objects[index] local thob = object.object_type.thob if objects then for k, v in ipairs(objects) do if v == object then table_remove(objects, k) self.map.th:removeObjectType(x, y, thob) local count_cat = object.object_type.count_category if count_cat then self.object_counts[count_cat] = self.object_counts[count_cat] - 1 end return true end end end return false end --! Notify the world of a new object being placed somewhere in the world --! See also `World:removeObjectFromTile` --!param object (Object) The object being placed --!param x (integer) The X-coordinate of the tile being placed upon --!param y (integer) The Y-coordinate of the tile being placed upon function World:addObjectToTile(object, x, y) local index = (y - 1) * self.map.width + x local objects = self.objects[index] if objects then self.map.th:setCellFlags(x, y, {thob = object.object_type.thob}) objects[#objects + 1] = object else objects = {object} self.objects[index] = objects self.map.th:setCellFlags(x, y, {thob = object.object_type.thob}) end local count_cat = object.object_type.count_category if count_cat then self.object_counts[count_cat] = self.object_counts[count_cat] + 1 end return true end --! Retrieve all objects from a given position. --!param x (int) X position of the object to retrieve. --!param y (int) Y position of the object to retrieve. function World:getObjects(x, y) local index = (y - 1) * self.map.width + x return self.objects[index] end --! Retrieve one object from a given position. --!param x (int) X position of the object to retrieve. --!param y (int) Y position of the object to retrieve. --!param id Id to search, nil gets first object, string gets first object with --! that id, set of strings gets first object that matches an entry in the set. --!return (Object or nil) The found object, or nil if the object is not found. function World:getObject(x, y, id) local objects = self:getObjects(x, y) if objects then if not id then return objects[1] elseif type(id) == "table" then for _, obj in ipairs(objects) do if id[obj.object_type.id] then return obj end end else for _, obj in ipairs(objects) do if obj.object_type.id == id then return obj end end end end return -- nil end --! Remove all cleanable litter from a given tile. --!param x (int) X position of the tile to clean. --!param y (int) Y position of the tile to clean. function World:removeAllLitter(x, y) local litters = {} local objects = self:getObjects(x, y) if not objects then return end for _, obj in ipairs(objects) do if obj.object_type.id == "litter" and obj:isCleanable() then litters[#litters + 1] = obj end end for _, litter in ipairs(litters) do litter:remove() end end --! Prepare all tiles of the footprint for build of an object. --!param object_footprint Footprint of the object being build. --!param x (int) X position of the object --!param y (int) Y position of the object function World:prepareFootprintTilesForBuild(object_footprint, x, y) local hospital = self:getLocalPlayerHospital() for _, tile in ipairs(object_footprint) do if tile.complete_cell or not (tile.passable or tile.only_passable) then self:removeAllLitter(x + tile[1], y + tile[2]) hospital:removeRatholeXY(x + tile[1], y + tile[2]) end end end --! Prepare all tiles in the given rectangle for building a room. --!param x (int) Start x position of the area. --!param y (int) Start y position of the area. --!param w (int) Number of tiles in x direction. --!param h (int) Number of tiles in y direction. function World:prepareRectangleTilesForBuild(x, y, w, h) local hospital = self:getLocalPlayerHospital() x = x - 1 y = y - 1 for dx = 1, w do for dy = 1, h do self:removeAllLitter(x + dx, y + dy) if dx == 1 or dx == w or dy == 1 or dy == h then hospital:removeRatholeXY(x + dx, y + dy) end end end end --! Get the room at a given tile location. --!param x (int) X position of the queried tile. --!param y (int) Y position of the queried tile. --!return (Room) Room of the tile, or 'nil'. function World:getRoom(x, y) return self.rooms[self.map:getRoomId(x, y)] end --! Get the hospital at a given tile location. --!param x (int) X position of the queried tile. --!param y (int) Y position of the queried tile. --!return (Hospital) Hospital at the given location or 'nil'. function World:getHospital(x, y) local th = self.map.th local flags = th:getCellFlags(x, y) if not flags.hospital then return nil end return self.hospitals[flags.owner] end --! Returns localized name of the room, internal required staff name -- and localized name of staff required. function World:getRoomNameAndRequiredStaffName(room_id) local room_name, required_staff, staff_name for _, room in ipairs(TheApp.rooms) do if room.id == room_id then room_name = room.long_name required_staff = room.required_staff end end for key, _ in pairs(required_staff) do staff_name = key end required_staff = staff_name -- This is the "programmatic" name of the staff. if staff_name == "Nurse" then staff_name = _S.staff_title.nurse elseif staff_name == "Psychiatrist" then staff_name = _S.staff_title.psychiatrist elseif staff_name == "Researcher" then staff_name = _S.staff_title.researcher elseif staff_name == "Surgeon" then staff_name = _S.staff_title.surgeon elseif staff_name == "Doctor" then staff_name = _S.staff_title.doctor end return room_name, required_staff, staff_name end --! Append a message to the game log. --!param message (string) The message to add. function World:gameLog(message) self.game_log[#self.game_log + 1] = message -- If in debug mode also show it in the command prompt if TheApp.config.debug then print(message) end end --! Dump the contents of the game log into a file. -- This is automatically done on each error. function World:dumpGameLog() local config_path = TheApp.command_line["config-file"] or "" local pathsep = package.config:sub(1, 1) config_path = config_path:match("^(.-)[^" .. pathsep .. "]*$") local gamelog_path = config_path .. "gamelog.txt" local fi, err = io.open(gamelog_path, "w") if fi then for _, str in ipairs(self.game_log) do fi:write(str .. "\n") end fi:close() else print("Warning: Cannot dump game log: " .. tostring(err)) end end --! Because the save file only saves one thob per tile if they are more that information -- will be lost. To solve this after a load we need to set again all the thobs on each tile. function World:resetAnimations() -- Erase entities from the map if they want. for _, entity in ipairs(self.entities) do entity:eraseObject() end -- Add them again. for _, entity in ipairs(self.entities) do entity:resetAnimation() end end --! Let the world react to and old save game. First it gets the chance to -- do things for itself, and then it calls corresponding functions for -- the hospitals, entities and rooms in that order. --!param old The old version of the save game. --!param new The current version of the save game format. function World:afterLoad(old, new) if not self.original_savegame_version then self.original_savegame_version = old end -- If the original save game version is considerably lower than the current, warn the player. if new - 20 > self.original_savegame_version then self.ui:addWindow(UIInformation(self.ui, {_S.information.very_old_save})) end self:setUI(self.ui) -- insert global compatibility code here if old < 4 then self.room_built = {} end if old < 6 then -- Calculate hospital value -- Initial value local value = self.map.parcelTileCounts[self.hospitals[1]:getPlayerIndex()] * 25 + 20000 -- Add room values for _, room in pairs(self.rooms) do local valueChange = room.room_info.build_cost -- Subtract values of objects in rooms to avoid calculating those object values twice for obj, num in pairs(room.room_info.objects_needed) do valueChange = valueChange - num * TheApp.objects[obj].build_cost end value = value + valueChange end -- Add up all object values for _, object in ipairs(self.entities) do if class.is(object, Object) and object.object_type.build_cost then value = value + object.object_type.build_cost end end self.hospitals[1].value = value end if old < 7 then self.level_criteria = local_criteria_variable self:determineWinningConditions() end if old < 10 then self.object_counts = { extinguisher = 0, radiator = 0, plant = 0, general = 0, } for _, obj_list in pairs(self.objects) do for _, obj in ipairs(obj_list) do local count_cat = obj.object_type.count_category if count_cat then self.object_counts[count_cat] = self.object_counts[count_cat] + 1 end end end end if old < 43 then self.object_counts.reception_desk = 0 for _, obj_list in pairs(self.objects) do for _, obj in ipairs(obj_list) do local count_cat = obj.object_type.count_category if count_cat and count_cat == "reception_desk" then self.object_counts[count_cat] = self.object_counts[count_cat] + 1 end end end end if old < 47 then self.object_counts.bench = 0 for _, obj_list in pairs(self.objects) do for _, obj in ipairs(obj_list) do local count_cat = obj.object_type.count_category if count_cat and count_cat == "bench" then self.object_counts[count_cat] = self.object_counts[count_cat] + 1 end end end end if old < 12 then self.animation_manager = TheApp.animation_manager self.anim_length_cache = nil end if old < 17 then -- Added another object local pathsep = package.config:sub(1, 1) local _, shield = pcall(corsixth.require, "objects" .. pathsep .. "radiation_shield") local _, shield_b = pcall(corsixth.require, "objects" .. pathsep .. "radiation_shield_b") shield.slave_type = shield_b shield.slave_type.master_type = shield Object.processTypeDefinition(shield) Object.processTypeDefinition(shield_b) self.object_id_by_thob[shield.thob] = shield.id self.object_id_by_thob[shield_b.thob] = shield_b.id self.object_types[shield.id] = shield self.object_types[shield_b.id] = shield_b self.ui.app.objects[shield.id] = shield self.ui.app.objects[shield_b.id] = shield_b self.ui.app.objects[#self.ui.app.objects + 1] = shield self.ui.app.objects[#self.ui.app.objects + 1] = shield_b end if old < 27 then -- Add callsDispatcher self.dispatcher = CallsDispatcher(self) end if old < 30 then self:nextEmergency() end if old < 31 then self.hours_per_day = 50 self:setSpeed("Normal") end if old < 36 then self:determineWinningConditions() end if old < 37 then -- Spawn rate is taken from level files now. -- Make sure that all config values are present. if not self.map.level_config.popn then self.map.level_config.popn = { [0] = {Change = 3, Month = 0}, [1] = {Change = 1, Month = 1}, } end if not self.map.level_config.gbv.AllocDelay then self.map.level_config.gbv.AllocDelay = 3 end local index = 0 local popn = self.map.level_config.popn self.spawn_rate = popn[index].Change self.monthly_spawn_increase = self.spawn_rate -- Bring the spawn rate "up to speed". for month = 1, self.month + (self.year-1)*12 do -- Check if the next entry should be used. while popn[index + 1] and month >= popn[index + 1].Month do index = index + 1 end self.monthly_spawn_increase = popn[index].Change self.spawn_rate = self.spawn_rate + self.monthly_spawn_increase end self.spawn_hours = {} self.spawn_dates = {} self:updateSpawnDates() end if old < 45 then self:nextVip() end if old < 52 then -- Litter was not properly removed from the world. for i = #self.entities, 1, -1 do if class.is(self.entities[i], Litter) then if not self.entities[i].tile_x then self:destroyEntity(self.entities[i]) end end end end if old < 53 then self.current_map_earthquake = 0 -- It may happen that the current game has gone on for a while if self.map.level_config.quake_control then while true do if self.map.level_config.quake_control[self.current_map_earthquake] and self.map.level_config.quake_control[self.current_map_earthquake] ~= 0 then -- Check to see if the start month has passed local control = self.map.level_config.quake_control[self.current_map_earthquake] if control.StartMonth <= self.month + 12 * (self.year - 1) then -- Then check the next one self.current_map_earthquake = self.current_map_earthquake + 1 else -- We found an earthquake coming in the future! break end else -- No more earthquakes in the config file. break end end end -- Now set up the next earthquake. self:nextEarthquake() end if old < 57 then self.user_actions_allowed = true end if old < 61 then -- room remove callbacks added self.room_remove_callbacks = {} end if old < 64 then -- added reference to world for staff profiles for _, group in pairs(self.available_staff) do for _, profile in ipairs(group) do profile.world = self end end end if old < 66 then -- Unreserve objects which are not actually reserved for real in the staff room. -- This is a special case where reserved_for could be set just as a staff member was leaving for _, room in pairs(self.rooms) do if room.room_info.id == "staff_room" then -- Find all objects in the room local fx, fy = room:getEntranceXY(true) for obj, _ in pairs(self:findAllObjectsNear(fx, fy)) do if obj.reserved_for then local found = false for _, action in ipairs(obj.reserved_for.action_queue) do if action.name == "use_object" then if action.object == obj then found = true break end end end if not found then self:gameLog("Unreserved an object: " .. obj.object_type.id .. " at " .. obj.tile_x .. ":" .. obj.tile_y) obj.reserved_for = nil end end end end end end if old < 103 then -- If a room has patients who no longer exist in its -- humanoids_enroute table because of #133 remove them: for _, room in pairs(self.rooms) do for patient, _ in pairs(room.humanoids_enroute) do if patient.tile_x == nil then room.humanoids_enroute[patient] = nil end end end end if old < 124 then self.game_date = Date(self.year, self.month, self.day, self.hour) -- self.next_vip_month is number of months since the game start self.next_vip_date = Date(1, self.next_vip_month, self.next_vip_day) end -- Now let things inside the world react. for _, cat in pairs({self.hospitals, self.entities, self.rooms}) do for _, obj in pairs(cat) do obj:afterLoad(old, new) end end if old < 80 then self:determineWinningConditions() end if old >= 87 then self:playLoadedEntitySounds() end if old < 88 then --Populate the entity map self.entity_map = EntityMap(self.map) for _, e in ipairs(self.entities) do local x, y = e.tile_x, e.tile_y if x and y then self.entity_map:addEntity(x,y,e) end end end if old < 108 then self.room_build_callbacks = nil end if old < 113 then -- Make cleanable littered tiles buildable. for x = 1, self.map.width do for y = 1, self.map.height do local litter = self:getObject(x, y, "litter") if litter and litter:isCleanable() then self.map:setCellFlags(x, y, {buildable=true}) end end end end if old < 115 then self.next_earthquake = { start_month = self.next_earthquake_month, start_day = self.next_earthquake_day, size = self.earthquake_size, active = self.earthquake_active or false } self.next_earthquake_month = nil self.next_earthquake_day = nil self.earthquake_stop_day = nil self.earthquake_size = nil self.earthquake_active = nil self.randomX = nil self.randomY = nil self.currentX = nil self.currentY = nil if self.next_earthquake.active then local rd = 0 for _, room in pairs(self.rooms) do for object, _ in pairs(room.objects) do if object.quake_points then rd = math.max(rd, object.quake_points) object.quake_points = nil end end end self.next_earthquake.remaining_damage = rd self.next_earthquake.damage_timer = earthquake_damage_time self.next_earthquake.warning_timer = 0 else self.next_earthquake.remaining_damage = self.next_earthquake.size self.next_earthquake.damage_timer = earthquake_damage_time self.next_earthquake.warning_timer = earthquake_warning_period end end if old < 120 then -- Issue #1105 updates to fix any broken saves with travel flags for side objects self:resetSideObjects() end self.savegame_version = new end function World:playLoadedEntitySounds() for _, entity in pairs(self.entities) do entity:playAfterLoadSound() end end --[[ There is a problem with room editing in that it resets all the partial passable flags (travelNorth, travelSouth etc.) in the corridor, a workaround is calling this function after the room was edited so that all edge only objects, that set partial passable flags set those flags again]] function World:resetSideObjects() for _, objects in pairs(self.objects) do for _, obj in ipairs(objects) do if obj.object_type.class == "SideObject" then obj:setTile(obj.tile_x, obj.tile_y) end end end end --[[ When placing doors and objects the passable tiles need to be checked for overlapping passable tiles. This presents problems with objects like Bench where the passable tile is not for exclusive use of the Bench (another object can share that same tile) the footprint.shareable differentiates shareable passable tiles, and exclusive use passable tiles (the norm for most objects)]] --!param x (int) x map tile position --!param y (int) y map tile position --!param distance (int) searchable distance for nearby objects --!return (boolean) indicating if exclusively passable or not function World:isTileExclusivelyPassable(x, y, distance) for o in pairs(self:findAllObjectsNear(x, y, distance)) do if o and o.footprint then for _, footprint in pairs(o.footprint) do if footprint[1] + o.tile_x == x and footprint[2] + o.tile_y == y and footprint.only_passable and not footprint.shareable then return false end end else -- doors don't have a footprint but objects can't be built blocking them either for _, footprint in pairs(o:getWalkableTiles()) do if o.object_type and o.object_type.thob ~= 62 and footprint[1] == x and footprint[2] == y then return false end end end end return true end function World:date() return self.game_date:clone() end CorsixTH-0.63/CorsixTH/Luatest/000077500000000000000000000000001347163623700163055ustar00rootroot00000000000000CorsixTH-0.63/CorsixTH/Luatest/.busted000066400000000000000000000000721347163623700175730ustar00rootroot00000000000000return { default = { lpath = "../Lua/?.lua", }, } CorsixTH-0.63/CorsixTH/Luatest/README.txt000066400000000000000000000015501347163623700200040ustar00rootroot00000000000000UNIT TESTING In order to run the unit test suite you need a unit test framework called Busted. The easiest way to get it is through Luarocks. All information can be found at http://olivinelabs.com/busted/ The framework uses its own syntax, which is also described at the above location. RUNNING UNIT TESTS When you have Busted on your system, run the following command from the CorsixTH/Luatest folder to run all tests: (Windows) busted --lpath=../Lua/\?.lua (Linux) busted --lpath=../Lua/?.lua CREATING UNIT TESTS If you have added functionality to an existing file you will need to extend the unit test suite for that file. It is found in the Luatest/spec folder using the same hierarchy as in the normal Lua folder. All test files are called _spec.lua. If you have created a new lua file, then you also create a new *_spec.lua test file. CorsixTH-0.63/CorsixTH/Luatest/TH.lua000066400000000000000000000041721347163623700173270ustar00rootroot00000000000000--[[ Copyright (c) 2014 Edvin "Lego3" Linge 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. --]] -- A stub implementation of the TH C++ object, to be able to run -- unit tests without any backend. TheApp = { gfx = { loadMainCursor = function() end, loadSpriteTable = function() end, loadFont = function() return { draw = function() end, drawWrapped = function() end, } end, }, runtime_config = {}, config = { width = 600, height = 800, }, world = { speed = "Normal", isCurrentSpeed = function(self, s) return s == self.speed end, gameLog = function() end, }, } local sub_S = setmetatable({key = ''}, { __index = function(t, k) t.key = t.key .. '.' .. k return t end, __tostring = function(t) return t.key end, }) _G['_S'] = setmetatable({key = ''}, { __index = function(_, k) sub_S.key = '_S.' .. k return sub_S end, __tostring = function(_) return '_S' end, }) return { animation = function() return { setHitTestResult = function() end, setAnimation = function() end, setDrawingLayer = function() end, setTile = function() end, } end } CorsixTH-0.63/CorsixTH/Luatest/class_test_base.lua000066400000000000000000000032151347163623700221470ustar00rootroot00000000000000--[[ Copyright (c) 2014 Edvin "Lego3" Linge 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. --]] -- Use this file to easily get started creating unit tests for CorsixTH -- classes. require("busted") require("non_strict") require("class") local say = require("say") local assert = require("luassert") function permanent() return function() return {} end end function values() return function() return nil end end function assertion_matches(_, arguments) return string.match(arguments[1], arguments[2]) ~= nil end say:set("assertion.matches", "Expected substring fail.\n: %s\n:%s") assert:register("assertion", "matches", assertion_matches, "assertion.matches") CorsixTH-0.63/CorsixTH/Luatest/corsixth.lua000066400000000000000000000023011347163623700206470ustar00rootroot00000000000000--[[ Copyright (c) 2017 Stephen "TheCycoONE" Baker 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. --]] -- A stub implementation of the corsixth object to bypass the persistence -- C++ code. _G['corsixth'] = {} corsixth.require = require; CorsixTH-0.63/CorsixTH/Luatest/non_strict.lua000066400000000000000000000050201347163623700211670ustar00rootroot00000000000000--[[ Copyright (c) 2014 Edvin "Lego3" Linge 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. --]] -- When running unittests we cannot restrict global variables as is usually -- done, since the busted library relies on being able to do so. -- We still need to mimic the possibility to call the functions available -- in strict.lua though. local strict_mt = {} local allowed_globals = setmetatable({}, {__mode = "k"}) local function newindex(t, k, v) rawset(t, k, v) end local function index(t, k) return nil end local function restrict(ni, i, ...) strict_mt.__newindex = ni strict_mt.__index = i return ... end restrict(newindex, index) --!! Wrap a function so that it is freely able to set global variables --[[ Some existing functions (for example, `require`) should be allowed to read and write global variables without having to worry about declaring them with `strict_declare_global`. !param fn The function which should be able to freely set globals !return A new function which acts just as `fn` and is free to set globals !example require = destrict(require) ]] function destrict(fn) return function(...) local ni, i = strict_mt.__newindex, strict_mt.__index strict_mt.__newindex, strict_mt.__index = nil, nil return restrict(ni, i, fn(...)) end end --!! Declare a global variable so that it can later be used --[[!param name The name of the global to declare !example strict_declare_global "some_var" some_var = 42 ]] function strict_declare_global(name) allowed_globals[name] = true end setmetatable(_G, strict_mt) CorsixTH-0.63/CorsixTH/Luatest/persist.lua000066400000000000000000000000001347163623700204670ustar00rootroot00000000000000CorsixTH-0.63/CorsixTH/Luatest/spec/000077500000000000000000000000001347163623700172375ustar00rootroot00000000000000CorsixTH-0.63/CorsixTH/Luatest/spec/announcer_spec.lua000066400000000000000000000102401347163623700227410ustar00rootroot00000000000000require("class_test_base") require("announcer") local Announcer = _G["Announcer"] local AnnouncementPriority = _G["AnnouncementPriority"] local function create_date_mock_type() local date_mock = {} local date_mock_mt = { __index = date_mock } function date_mock.new(value) local self = { value = value or 0 } setmetatable(self, date_mock_mt) return self end function date_mock:clone() return date_mock.new(self.value) end function date_mock:plusHours(hours) return date_mock.new(self.value + hours) end function date_mock_mt.__lt(left, right) return left.value < right.value end return date_mock.new end local create_date_mock = create_date_mock_type() local function create_app_mock() local world_mock = { game_date = create_date_mock(), isCurrentSpeed = function() return true end, getLocalPlayerHospital = function() return { hasStaffedDesk = function() return true end } end } local config_mock = { play_announcements = true } local played_sounds = {} local audio_mock = { __played_sounds__ = played_sounds, playSound = function(_, name, where, is_announcement, played_callback, played_callback_delay) table.insert(played_sounds, { name = name, where = where, is_announcement = is_announcement, played_callback = played_callback, played_callback_delay = played_callback_delay }) end, __mark_sounds_played__ = function() for k,v in pairs(played_sounds) do v.played_callback() played_sounds[k] = nil -- clear end end } local app = { world = world_mock, config = config_mock, audio = audio_mock } return app end describe("Announcer", function() it("nothing is played with an empty queue", function() local app_mock = create_app_mock() local announcer = Announcer(app_mock) announcer:onTick() assert.equal(0, #app_mock.audio.__played_sounds__) end) it("an announcement is played", function() local app_mock = create_app_mock() local announcer = Announcer(app_mock) announcer:playAnnouncement("sound.wav") announcer:onTick() assert.equal(1, #app_mock.audio.__played_sounds__) assert.equal("sound.wav", app_mock.audio.__played_sounds__[1].name) end) it("announcements shouldn't play when disabled", function() local app_mock = create_app_mock() local announcer = Announcer(app_mock) app_mock.config.play_announcements = false announcer:playAnnouncement("normal.wav") announcer:onTick() assert.equal(0, #app_mock.audio.__played_sounds__) end) it("announcements are played priority-wise", function() local app_mock = create_app_mock() local announcer = Announcer(app_mock) announcer:playAnnouncement("low.wav", AnnouncementPriority.Low) announcer:playAnnouncement("critical.wav", AnnouncementPriority.Critical) announcer:playAnnouncement("normal.wav", AnnouncementPriority.Normal) announcer:playAnnouncement("high.wav", AnnouncementPriority.High) announcer:onTick() assert.equal(1, #app_mock.audio.__played_sounds__) assert.equal("critical.wav", app_mock.audio.__played_sounds__[1].name) app_mock.audio.__mark_sounds_played__() announcer:onTick() assert.equal(1, #app_mock.audio.__played_sounds__) assert.equal("high.wav", app_mock.audio.__played_sounds__[1].name) app_mock.audio.__mark_sounds_played__() announcer:onTick() assert.equal(1, #app_mock.audio.__played_sounds__) assert.equal("normal.wav", app_mock.audio.__played_sounds__[1].name) app_mock.audio.__mark_sounds_played__() announcer:onTick() assert.equal(1, #app_mock.audio.__played_sounds__) assert.equal("low.wav", app_mock.audio.__played_sounds__[1].name) app_mock.audio.__mark_sounds_played__() end) it("announcements shouldn't play when not relevant anymore", function() local app_mock = create_app_mock() local announcer = Announcer(app_mock) announcer:playAnnouncement("normal.wav") app_mock.world.game_date = app_mock.world.game_date:plusHours(1000) announcer:onTick() assert.equal(0, #app_mock.audio.__played_sounds__) end) end) CorsixTH-0.63/CorsixTH/Luatest/spec/class_spec.lua000066400000000000000000000052561347163623700220710ustar00rootroot00000000000000--[[ Copyright (c) 2014 Edvin "Lego3" Linge 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. --]] require("class_test_base") class "ParentClass" function ParentClass:ParentClass(name) self.class_name = name end class "ChildClass" (ParentClass) function ChildClass:ChildClass(name) self:ParentClass(name) end describe("A class in CorsixTH ", function() local child_class, parent_class setup(function() child_class = ChildClass("TheChild") parent_class = ParentClass("TheParent") end) it("should be instansiatable", function() assert.are.equal("TheChild", child_class.class_name) assert.are.equal("TheParent", parent_class.class_name) end) it("should be the same for many instances of the same type, including inheritance", function() assert.truthy(class.is(child_class, ChildClass)) assert.falsy(class.is(parent_class, ChildClass)) assert.truthy(class.is(child_class, ParentClass)) assert.truthy(class.is(parent_class, ParentClass)) end) it("should have a name", function() assert.are.equal("ChildClass", class.name(ChildClass)) assert.are.equal("ParentClass", class.name(ParentClass)) assert.are.equal(nil, class.name(NoRealClass)) end) it("should know if it has a superclass", function() assert.are.equal(ParentClass, class.superclass(ChildClass)) assert.are.equal(nil, class.superclass(ParentClass)) assert.has_error(class.superclass, NoRealClass) end) it("should have a type", function() assert.are.equal("ChildClass", class.type(child_class)) assert.are.equal("ParentClass", class.type(parent_class)) end) it("should make the metatable available", function() assert.are.equal(getmetatable(parent_class), parent_class._metatable) end) end) CorsixTH-0.63/CorsixTH/Luatest/spec/date_spec.lua000066400000000000000000000137021347163623700216740ustar00rootroot00000000000000--[[ Copyright (c) 2018 Pavel "sofo" Schoffer 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. --]] require("class_test_base") require("date") describe("Date", function() it("can return correct month last day", function() assert.are.equal(Date(1, 1):lastDayOfMonth(), 31) assert.are.equal(Date(1, 2):lastDayOfMonth(), 28) assert.are.equal(Date(1, 6):lastDayOfMonth(), 30) assert.are.equal(Date(1, 12):lastDayOfMonth(), 31) end) it("default works", function() local date = Date(5, 12, 22, 5) assert.are.equal(date:hourOfDay(), 5) assert.are.equal(date:dayOfMonth(), 22) assert.are.equal(date:monthOfYear(), 12) assert.are.equal(date:year(), 5) date = Date(5, 12, 22) assert.are.equal(date:hourOfDay(), 0) assert.are.equal(date:dayOfMonth(), 22) assert.are.equal(date:monthOfYear(), 12) assert.are.equal(date:year(), 5) date = Date(4, 12) assert.are.equal(date:dayOfMonth(), 1) assert.are.equal(date:monthOfYear(), 12) assert.are.equal(date:year(), 4) date = Date(24) assert.are.equal(date:dayOfMonth(), 1) assert.are.equal(date:monthOfYear(), 1) assert.are.equal(date:year(), 24) date = Date() assert.are.equal(date:dayOfMonth(), 1) assert.are.equal(date:monthOfYear(), 1) assert.are.equal(date:year(), 1) end) it("cannot be wrong date", function() local date = Date(1, 14) assert.are.equal(date:monthOfYear(), 2) date = Date(1, 24) assert.are.equal(date:monthOfYear(), 12) end) it("can handle hour adjustmentse", function() local date = Date(1, 1, 5, 50) assert.are.equal(6, date:dayOfMonth()) assert.are.equal(0, date:hourOfDay()) date = Date(1, 1, 1, 55) assert.are.equal(2, date:dayOfMonth()) assert.are.equal(5, date:hourOfDay()) end) it("can add and read months", function() local date = Date():plusMonths(1) assert.are.equal(date:monthOfYear(), 2) date = Date(20, 12):plusMonths(1) assert.are.equal(date:monthOfYear(), 1) end) it("can handle complex adjustments", function() local date = Date(2,2,31,55) assert.are.equal("2-03-04T05", date:tostring()) date = Date(1,12,31,55) assert.are.equal("2-01-01T05", date:tostring()) -- 31 - January, 28 - February, 7 - March date = Date(1,1,66) assert.are.equal("1-03-07T00", date:tostring()) end) it("can print date", function() local date = Date(2,12,1,6) assert.are.equal("2-12-01T06", date:tostring()) end) it("can add days", function() local date = Date(2,12,30) -- 1 - December, 29 - January date = date:plusDays(30) assert.are.equal("3-01-29T00", date:tostring()) date = Date(1,3,15) -- 16 - March, 30 - April, 31 - June, 13 - July date = date:plusDays(90) assert.are.equal("1-06-13T00", date:tostring()) end) it("can add years", function() local date = Date(3, 2, 1, 6) local expected_date = Date(8, 2, 1, 6) local adjusted_date = date:plusYears(5) assert.True(expected_date == adjusted_date) end) it("can add hours", function() local date = Date(1,1,1,5) local adjusted_date = date:plusHours(50) assert.are.equals(2, adjusted_date:dayOfMonth()) assert.are.equals(5, adjusted_date:hourOfDay()) end) it("can add negative hours", function() local date = Date(3,1,1,0) local expected_date = Date(2,12,31,49) local adjusted_date = date:plusHours(-1) assert.True(expected_date == adjusted_date) end) it("can add negative days", function() local date = Date(3,1,1) local adjusted_date = date:plusDays(-40) local expected_date = Date(2,11,22) assert.True(expected_date == adjusted_date) end) it("can tell the last days", function() local date = Date(1,12,3) assert.False(date:isLastDayOfMonth()) assert.False(date:isLastDayOfYear()) date = Date(1,1,31) assert.True(date:isLastDayOfMonth()) assert.False(date:isLastDayOfYear()) date = Date(1,12,31) assert.True(date:isLastDayOfMonth()) assert.True(date:isLastDayOfYear()) end) it("get total elapsed month", function() local date = Date(8,11,1) assert.are.equals(95, date:monthOfGame()) end) it("can get compared", function() local date1 = Date(3,2,1) local other_date1 = Date(3,2,1) local date2 = Date(1,2,3) local date_with_different_hour = Date(3,2,1,40) assert.True(date1 == other_date1) assert.False(date1 == date2) assert.True(date1 > date2) assert.False(date1 < date2) assert.True(date1 >= other_date1) assert.False(date_with_different_hour == date1) assert.True(date_with_different_hour > date1) end) it("can clone itself", function() local origin_date = Date(12,3,2,6) local clone_date = origin_date:clone() assert.True(origin_date == clone_date) end) it("can provide hours per day", function() assert.equals(50, Date.hoursPerDay()) end) it("can chack if two days are the same", function() assert.True(Date(1,2,3,5):isSameDay(Date(1,2,3,9))) assert.False(Date(1,2,3):isSameDay(Date(1,4,3))) end) end) CorsixTH-0.63/CorsixTH/Luatest/spec/dialogs/000077500000000000000000000000001347163623700206615ustar00rootroot00000000000000CorsixTH-0.63/CorsixTH/Luatest/spec/dialogs/bottom_pannel_spec.lua000066400000000000000000000052461347163623700252460ustar00rootroot00000000000000--[[ Copyright (c) 2018 Stephen E. Baker 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. --]] describe("Bottom Panel:", function() local bottom_panel; local mock_canvas; local font; setup(function() require("corsixth") require("class_test_base") require("TH") require("window") require("dialogs/bottom_panel") end) before_each(function() TheApp.world.gameLog = function() end font = { draw = function() end, drawWrapped = function() end, } TheApp.gfx.loadFont = function() return font end local mock_ui = {} mock_ui.app = _G['TheApp'] mock_ui.addKeyHandler = function() end mock_canvas = {} bottom_panel = UIBottomPanel(mock_ui) mock(font, 'draw') mock(font, 'drawWrapped') mock(TheApp.world, 'gameLog') end) it("Set nil dynamic info", function() bottom_panel:setDynamicInfo(nil) bottom_panel:drawDynamicInfo(mock_canvas, 0, 0) assert.stub(TheApp.world.gameLog).was_not.called_with(TheApp.world, "Dynamic info is missing text!") end) it("Set dynamic info without text", function() local dynamic_info = {} bottom_panel:setDynamicInfo(dynamic_info) bottom_panel:drawDynamicInfo(mock_canvas, 0, 0) assert.stub(TheApp.world.gameLog).was.called_with(TheApp.world, "Dynamic info is missing text!") end) it("Set dynamic info with text", function() local dynamic_info = { text = { "test text" } } bottom_panel:setDynamicInfo(dynamic_info) bottom_panel:drawDynamicInfo(mock_canvas, 0, 0) assert.stub(TheApp.world.gameLog).was_not.called_with(TheApp.world, "Dynamic info is missing text!") assert.stub(font.drawWrapped).was.called_with(font, mock_canvas, "test text", 20, 10, 240) end) end) CorsixTH-0.63/CorsixTH/Luatest/spec/entities/000077500000000000000000000000001347163623700210635ustar00rootroot00000000000000CorsixTH-0.63/CorsixTH/Luatest/spec/entities/humanoid_spec.lua000066400000000000000000000050571347163623700244130ustar00rootroot00000000000000--[[ Copyright (c) 2018 Pavel "sofo" Schoffer 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. --]] require("class_test_base") require("entity") require("entities.humanoid") describe("Humanoid:", function() local function getHumanoid() local animation = {setHitTestResult = function() end} return Humanoid(animation) end it("Gets the current action", function() local humanoid = getHumanoid() local action1 = {name = "fake1"} local action2 = {name = "fake2"} humanoid:queueAction(action1) humanoid:queueAction(action2) local recievedAction = humanoid:getCurrentAction() assert.equal(action1, recievedAction) end) it("Throws error if no action is queued", function() local humanoid = getHumanoid() local state, error = pcall(humanoid.getCurrentAction, humanoid) assert.False(state) local expected_message = "Action queue was empty. This should never happen." assert.matches(error, expected_message) assert.matches(error, "humanoid %-") end) it("Can represent itself as a string", function() local humanoid = getHumanoid() humanoid.humanoid_class = "class" local result = humanoid:tostring() assert.matches(result, "humanoid[ -]*class.*class") assert.matches(result, "Warmth.*Happiness.*Fatigue") assert.matches(result, "Actions: %[%]") end) it("Can add actions to a representation", function() local humanoid = getHumanoid() humanoid.action_queue = {{name = "A1", room_type = "room"}, {name = "A2"}} local result = humanoid:tostring() assert.matches(result, "Actions.*%[A1 %- room, A2%]") end) end) CorsixTH-0.63/CorsixTH/Luatest/spec/entities/humanoids/000077500000000000000000000000001347163623700230525ustar00rootroot00000000000000CorsixTH-0.63/CorsixTH/Luatest/spec/entities/humanoids/staff/000077500000000000000000000000001347163623700241555ustar00rootroot00000000000000CorsixTH-0.63/CorsixTH/Luatest/spec/entities/humanoids/staff/doctor_spec.lua000066400000000000000000000033441347163623700271700ustar00rootroot00000000000000--[[ Copyright (c) 2018 Pavel "sofo" Schoffer 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. --]] require("class_test_base") require("corsixth") require("entity") require("entities.humanoid") require("entities.humanoids.staff.doctor") describe("Doctor:", function() local function getDoctor() local animation = {setHitTestResult = function() end} return Doctor(animation) end it("Can represent doctor as a string", function() local doctor = getDoctor() doctor.humanoid_class = "Doctor" local name = "WHITMAN" doctor.profile = {skill = 0.5, is_psychiatrist = 0.5, name = name} local result = doctor:tostring() assert.matches(result, "humanoid.*" .. name .. ".*class.*Doctor") assert.matches(result, "Skills.*0%.5.*Psych.*0%.5") end) end) CorsixTH-0.63/CorsixTH/Luatest/spec/entities/machine_spec.lua000066400000000000000000000052741347163623700242140ustar00rootroot00000000000000--[[ Copyright (c) 2014 Pavel "sofo" Schoffer 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. --]] require("class_test_base") require("entity") require("entities/object") require("entities/machine") describe("object.lua: ", function() local stub_world = {map = {}} local tile_x, tile_y, direction = 10, 10, "west" local function createMachineWithFakeInput() stub(stub_world, "getLocalPlayerHospital") stub(stub_world, "addObjectToTile") stub(stub_world, "clearCaches") local offset = {0, 0} local orientation = { render_attach_position = offset, use_position = {0, 0} } local fake_object_type = { ticks = false, idle_animations = {west = true}, orientations = {west = orientation} } return Machine(stub_world, fake_object_type, tile_x, tile_y, direction) end it("can update dynamic Info", function() local machine = createMachineWithFakeInput() machine:updateDynamicInfo() assert.are.equal(1, machine.times_used) assert.are.equal(1, machine.total_usage) end) it("can transfer state", function() local machine1 = createMachineWithFakeInput() machine1:updateDynamicInfo() local machine2 = createMachineWithFakeInput() machine2:setState(machine1:getState()) assert.are.equal(machine1.times_used, machine2.times_used) assert.are.equal(machine1.total_usage, machine2.total_usage) end) it("setting null state doesn't clear values", function() local machine = createMachineWithFakeInput() machine:updateDynamicInfo() assert.are.equal(1, machine.times_used) assert.are.equal(1, machine.total_usage) machine:setState(nil) assert.are.equal(1, machine.times_used) assert.are.equal(1, machine.total_usage) end) end) CorsixTH-0.63/CorsixTH/Luatest/spec/entities/object_spec.lua000066400000000000000000000041721347163623700240520ustar00rootroot00000000000000--[[ Copyright (c) 2014 Edvin "Lego3" Linge 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. --]] require("class_test_base") require("entity") require("entities.object") describe("object.lua: ", function() local stub_world = {map = {}} local fake_object_type = {ticks = false, idle_animations = {west = true}} local tile_x, tile_y, direction = 10, 10, "west" local function createObjectWithFakeInput() stub(stub_world, "getLocalPlayerHospital") stub(stub_world, "addObjectToTile") stub(stub_world, "clearCaches") return Object(stub_world, fake_object_type, tile_x, tile_y, direction) end it("can create Object objects", function() local object = createObjectWithFakeInput() assert.are.equal(fake_object_type, object.object_type) assert.are.equal(stub_world.map, object.world.map) end) it("can transfer state", function() local object1 = createObjectWithFakeInput() object1.times_used = object1.times_used + 7 local object2 = createObjectWithFakeInput() assert.are_not.equal(object1.times_used, object2.times_used) object2:setState(object1:getState()) assert.are.equal(object1.times_used, object2.times_used) end) end) CorsixTH-0.63/CorsixTH/Luatest/spec/utility_spec.lua000066400000000000000000000061471347163623700224670ustar00rootroot00000000000000require("utility") describe("serialize", function() it("serializes a basic string", function() local res = serialize('hello') assert.equal('[[hello]]', res) end) it("serializes a string that includes ]]", function() local res = serialize('he]]o') assert.equal('[=[he]]o]=]', res) end) it("serializes an array of primatives", function() local res = serialize({'hello', 'happy', 'people', 'everywhere', 42, false}) assert.equal('{[[hello]],[[happy]],[[people]],[[everywhere]],42,false}', res) end) it("serializes a pretty array", function() local res = serialize({'hello', 'happy', 'people', 'everywhere', 42, false}, {pretty = true}) assert.equal([=[{ [[hello]], [[happy]], [[people]], [[everywhere]], 42, false }]=], res) end) it("serializes a simple key value table", function() local test_tbl = {foo='bar', [true]='candy', bar=42} local res = serialize(test_tbl) local res_tbl = loadstring_envcall("return " .. res)({}) assert.same(test_tbl, res_tbl) end) it("serializes a nested table", function() local test_tbl = {foo='bar', bar={hello='world'}} local res = serialize(test_tbl) local res_tbl = loadstring("return " .. res)() assert.same(test_tbl, res_tbl) end) it("serializes a table with nested keys", function() local test_tbl = {[{hello='world'}] = true, [1] = 'tree'} local res = serialize(test_tbl) local res_tbl = loadstring("return " .. res)() local found_tbl = false for k, _ in pairs(res_tbl) do if type(k) == 'table' then assert.same({hello='world'}, k) found_tbl = true break end end if not found_tbl then assert("table key not found") end assert.equals(test_tbl[1], res_tbl[1]) end) it("respects max_depth if set", function() local test_tbl = {[{hello='world'}] = true, [1] = 'tree'} local res = serialize(test_tbl, {max_depth=1}) assert.has.match('{...}', res, nil, true) res = serialize(test_tbl, {max_depth=2}) assert.has_no.match('{...}', res, nil, true) end) it("detects cycles", function() local test_tbl = {[{hello='world'}] = true, [1] = 'tree'} test_tbl[2] = test_tbl local res = serialize(test_tbl, {detect_cycles=true}) assert.has.match('', res, nil, true) end) it("doesn't report cycles with only max_depth", function() local test_tbl = {[{hello='world'}] = true, [1] = 'tree'} test_tbl[2] = test_tbl local res = serialize(test_tbl, {max_depth=4}) assert.has_no.match('', res, nil, true) assert.has.match('{...}', res, nil, true) end) end) describe("array_join", function() it("joins a basic array of numbers to a comma seperated string", function() local res = array_join({5,3,1,0}) assert.equals("5,3,1,0", res) end) it("joins a string array with custom seperator", function() local res = array_join({"a"," long"," hard","able"}," very") assert.equals("a very long very hard veryable", res) end) it("converts a non-table to a string", function() local res = array_join(1) assert.equals("1", res) end) end) CorsixTH-0.63/CorsixTH/Original_Logo.svg000066400000000000000000002117341347163623700201410ustar00rootroot00000000000000 image/svg+xml CorsixTH-0.63/CorsixTH/Original_Logo_Text.svg000066400000000000000000001671041347163623700211460ustar00rootroot00000000000000 image/svg+xml CorsixTH-0.63/CorsixTH/SDLMain/000077500000000000000000000000001347163623700161135ustar00rootroot00000000000000CorsixTH-0.63/CorsixTH/SDLMain/CMakeLists.txt000066400000000000000000000002541347163623700206540ustar00rootroot00000000000000if(APPLE) find_package(SDL2 REQUIRED) set(CMAKE_OSX_ARCHITECTURES "x86_64") include_directories(${SDL_INCLUDE_DIR}) add_library (SDL2main STATIC SDLMain.m) endif() CorsixTH-0.63/CorsixTH/SDLMain/SDLMain.h000066400000000000000000000005661347163623700175220ustar00rootroot00000000000000/* SDLMain.m - main entry point for our Cocoa-ized SDL app Initial Version: Darrell Walisser Non-NIB-Code & other changes: Max Horn Feel free to customize this file to suit your needs */ #ifndef _SDLMain_h_ #define _SDLMain_h_ #import @interface SDLMain : NSObject @end #endif /* _SDLMain_h_ */ CorsixTH-0.63/CorsixTH/SDLMain/SDLMain.m000066400000000000000000000260001347163623700175160ustar00rootroot00000000000000/* SDLMain.m - main entry point for our Cocoa-ized SDL app Initial Version: Darrell Walisser Non-NIB-Code & other changes: Max Horn Feel free to customize this file to suit your needs */ #include "SDL.h" #include "SDLMain.h" #include /* for MAXPATHLEN */ #include /* For some reaon, Apple removed setAppleMenu from the headers in 10.4, but the method still is there and works. To avoid warnings, we declare it ourselves here. */ @interface NSApplication(SDL_Missing_Methods) - (void)setAppleMenu:(NSMenu *)menu; @end /* Use this flag to determine whether we use SDLMain.nib or not */ #define SDL_USE_NIB_FILE 0 /* Use this flag to determine whether we use CPS (docking) or not */ #define SDL_USE_CPS 1 #ifdef SDL_USE_CPS /* Portions of CPS.h */ typedef struct CPSProcessSerNum { UInt32 lo; UInt32 hi; } CPSProcessSerNum; extern OSErr CPSGetCurrentProcess( CPSProcessSerNum *psn); extern OSErr CPSEnableForegroundOperation( CPSProcessSerNum *psn, UInt32 _arg2, UInt32 _arg3, UInt32 _arg4, UInt32 _arg5); extern OSErr CPSSetFrontProcess( CPSProcessSerNum *psn); #endif /* SDL_USE_CPS */ static int gArgc; static char **gArgv; static BOOL gFinderLaunch; static BOOL gCalledAppMainline = FALSE; static NSString *getApplicationName(void) { const NSDictionary *dict; NSString *appName = 0; /* Determine the application name */ dict = (const NSDictionary *)CFBundleGetInfoDictionary(CFBundleGetMainBundle()); if (dict) appName = [dict objectForKey: @"CFBundleName"]; if (![appName length]) appName = [[NSProcessInfo processInfo] processName]; return appName; } #if SDL_USE_NIB_FILE /* A helper category for NSString */ @interface NSString (ReplaceSubString) - (NSString *)stringByReplacingRange:(NSRange)aRange with:(NSString *)aString; @end #endif @interface SDLApplication : NSApplication @end @implementation SDLApplication /* Invoked from the Quit menu item */ - (void)terminate:(id)sender { /* Post a SDL_QUIT event */ SDL_Event event; event.type = SDL_QUIT; SDL_PushEvent(&event); } @end /* The main class of the application, the application's delegate */ @implementation SDLMain /* Set the working directory to the .app's parent directory */ - (void) setupWorkingDirectory:(BOOL)shouldChdir { if (shouldChdir) { char parentdir[MAXPATHLEN]; CFURLRef url = CFBundleCopyBundleURL(CFBundleGetMainBundle()); CFURLRef url2 = CFURLCreateCopyDeletingLastPathComponent(0, url); if (CFURLGetFileSystemRepresentation(url2, 1, (UInt8 *)parentdir, MAXPATHLEN)) { chdir(parentdir); /* chdir to the binary app's parent */ } CFRelease(url); CFRelease(url2); } } #if SDL_USE_NIB_FILE /* Fix menu to contain the real app name instead of "SDL App" */ - (void)fixMenu:(NSMenu *)aMenu withAppName:(NSString *)appName { NSRange aRange; NSEnumerator *enumerator; NSMenuItem *menuItem; aRange = [[aMenu title] rangeOfString:@"SDL App"]; if (aRange.length != 0) [aMenu setTitle: [[aMenu title] stringByReplacingRange:aRange with:appName]]; enumerator = [[aMenu itemArray] objectEnumerator]; while ((menuItem = [enumerator nextObject])) { aRange = [[menuItem title] rangeOfString:@"SDL App"]; if (aRange.length != 0) [menuItem setTitle: [[menuItem title] stringByReplacingRange:aRange with:appName]]; if ([menuItem hasSubmenu]) [self fixMenu:[menuItem submenu] withAppName:appName]; } [ aMenu sizeToFit ]; } #else static void setApplicationMenu(void) { /* warning: this code is very odd */ NSMenu *appleMenu; NSMenuItem *menuItem; NSString *title; NSString *appName; appName = getApplicationName(); appleMenu = [[NSMenu alloc] initWithTitle:@""]; /* Add menu items */ title = [@"About " stringByAppendingString:appName]; [appleMenu addItemWithTitle:title action:@selector(orderFrontStandardAboutPanel:) keyEquivalent:@""]; [appleMenu addItem:[NSMenuItem separatorItem]]; title = [@"Hide " stringByAppendingString:appName]; [appleMenu addItemWithTitle:title action:@selector(hide:) keyEquivalent:@"h"]; menuItem = (NSMenuItem *)[appleMenu addItemWithTitle:@"Hide Others" action:@selector(hideOtherApplications:) keyEquivalent:@"h"]; [menuItem setKeyEquivalentModifierMask:(NSAlternateKeyMask|NSCommandKeyMask)]; [appleMenu addItemWithTitle:@"Show All" action:@selector(unhideAllApplications:) keyEquivalent:@""]; [appleMenu addItem:[NSMenuItem separatorItem]]; title = [@"Quit " stringByAppendingString:appName]; [appleMenu addItemWithTitle:title action:@selector(terminate:) keyEquivalent:@"q"]; /* Put menu into the menubar */ menuItem = [[NSMenuItem alloc] initWithTitle:@"" action:nil keyEquivalent:@""]; [menuItem setSubmenu:appleMenu]; [[NSApp mainMenu] addItem:menuItem]; /* Tell the application object that this is now the application menu */ [NSApp setAppleMenu:appleMenu]; /* Finally give up our references to the objects */ [appleMenu release]; [menuItem release]; } /* Create a window menu */ static void setupWindowMenu(void) { NSMenu *windowMenu; NSMenuItem *windowMenuItem; NSMenuItem *menuItem; windowMenu = [[NSMenu alloc] initWithTitle:@"Window"]; /* "Minimize" item */ menuItem = [[NSMenuItem alloc] initWithTitle:@"Minimize" action:@selector(performMiniaturize:) keyEquivalent:@"m"]; [windowMenu addItem:menuItem]; [menuItem release]; /* Put menu into the menubar */ windowMenuItem = [[NSMenuItem alloc] initWithTitle:@"Window" action:nil keyEquivalent:@""]; [windowMenuItem setSubmenu:windowMenu]; [[NSApp mainMenu] addItem:windowMenuItem]; /* Tell the application object that this is now the window menu */ [NSApp setWindowsMenu:windowMenu]; /* Finally give up our references to the objects */ [windowMenu release]; [windowMenuItem release]; } /* Replacement for NSApplicationMain */ static void CustomApplicationMain (int argc, char **argv) { NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; SDLMain *sdlMain; /* Ensure the application object is initialised */ [SDLApplication sharedApplication]; #ifdef SDL_USE_CPS { CPSProcessSerNum PSN; /* Tell the dock about us */ if (!CPSGetCurrentProcess(&PSN)) if (!CPSEnableForegroundOperation(&PSN,0x03,0x3C,0x2C,0x1103)) if (!CPSSetFrontProcess(&PSN)) [SDLApplication sharedApplication]; } #endif /* SDL_USE_CPS */ /* Set up the menubar */ [NSApp setMainMenu:[[NSMenu alloc] init]]; setApplicationMenu(); setupWindowMenu(); /* Create SDLMain and make it the app delegate */ sdlMain = [[SDLMain alloc] init]; [NSApp setDelegate:sdlMain]; /* Start the main event loop */ [NSApp run]; [sdlMain release]; [pool release]; } #endif /* * Catch document open requests...this lets us notice files when the app * was launched by double-clicking a document, or when a document was * dragged/dropped on the app's icon. You need to have a * CFBundleDocumentsType section in your Info.plist to get this message, * apparently. * * Files are added to gArgv, so to the app, they'll look like command line * arguments. Previously, apps launched from the finder had nothing but * an argv[0]. * * This message may be received multiple times to open several docs on launch. * * This message is ignored once the app's mainline has been called. */ - (BOOL)application:(NSApplication *)theApplication openFile:(NSString *)filename { const char *temparg; size_t arglen; char *arg; char **newargv; if (!gFinderLaunch) /* MacOS is passing command line args. */ return FALSE; if (gCalledAppMainline) /* app has started, ignore this document. */ return FALSE; temparg = [filename UTF8String]; arglen = SDL_strlen(temparg) + 1; arg = (char *) SDL_malloc(arglen); if (arg == NULL) return FALSE; newargv = (char **) realloc(gArgv, sizeof (char *) * (gArgc + 2)); if (newargv == NULL) { SDL_free(arg); return FALSE; } gArgv = newargv; SDL_strlcpy(arg, temparg, arglen); gArgv[gArgc++] = arg; gArgv[gArgc] = NULL; return TRUE; } /* Called when the internal event loop has just started running */ - (void) applicationDidFinishLaunching: (NSNotification *) note { int status; /* Set the working directory to the .app's parent directory */ [self setupWorkingDirectory:gFinderLaunch]; #if SDL_USE_NIB_FILE /* Set the main menu to contain the real app name instead of "SDL App" */ [self fixMenu:[NSApp mainMenu] withAppName:getApplicationName()]; #endif /* Hand off to main application code */ gCalledAppMainline = TRUE; status = SDL_main (gArgc, gArgv); /* We're done, thank you for playing */ exit(status); } @end @implementation NSString (ReplaceSubString) - (NSString *)stringByReplacingRange:(NSRange)aRange with:(NSString *)aString { unsigned int bufferSize; unsigned int selfLen = [self length]; unsigned int aStringLen = [aString length]; unichar *buffer; NSRange localRange; NSString *result; bufferSize = selfLen + aStringLen - aRange.length; buffer = (unichar *)NSAllocateMemoryPages(bufferSize*sizeof(unichar)); /* Get first part into buffer */ localRange.location = 0; localRange.length = aRange.location; [self getCharacters:buffer range:localRange]; /* Get middle part into buffer */ localRange.location = 0; localRange.length = aStringLen; [aString getCharacters:(buffer+aRange.location) range:localRange]; /* Get last part into buffer */ localRange.location = aRange.location + aRange.length; localRange.length = selfLen - localRange.location; [self getCharacters:(buffer+aRange.location+aStringLen) range:localRange]; /* Build output string */ result = [NSString stringWithCharacters:buffer length:bufferSize]; NSDeallocateMemoryPages(buffer, bufferSize); return result; } @end #ifdef main # undef main #endif /* Main entry point to executable - should *not* be SDL_main! */ int main (int argc, char **argv) { /* Copy the arguments into a global variable */ /* This is passed if we are launched by double-clicking */ if ( argc >= 2 && strncmp (argv[1], "-psn", 4) == 0 ) { gArgv = (char **) SDL_malloc(sizeof (char *) * 2); gArgv[0] = argv[0]; gArgv[1] = NULL; gArgc = 1; gFinderLaunch = YES; } else { int i; gArgc = argc; gArgv = (char **) SDL_malloc(sizeof (char *) * (argc+1)); for (i = 0; i <= argc; i++) gArgv[i] = argv[i]; gFinderLaunch = NO; } #if SDL_USE_NIB_FILE [SDLApplication poseAsClass:[NSApplication class]]; NSApplicationMain (argc, argv); #else CustomApplicationMain (argc, argv); #endif return 0; } CorsixTH-0.63/CorsixTH/Src/000077500000000000000000000000001347163623700154135ustar00rootroot00000000000000CorsixTH-0.63/CorsixTH/Src/bootstrap.cpp000066400000000000000000000434311347163623700201410ustar00rootroot00000000000000/* Copyright (c) 2010 Peter "Corsix" Cawley 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. */ #include "lua.hpp" #include "th_lua.h" #include "config.h" #include #include /* Often, an error occurs during the CorsixTH startup process. Examples of such errors include: 1) Unable to find CorsixTH.lua 2) Incorrect theme_hospital_install setting 3) Lua syntax error in modified file When such errors occur, we want to report them to the user. The simple way of doing this is printing the error details to stdout. Unfortunately, Windows users tend to disregard stdout, and OS X users never see it unless launching CorsixTH from a terminal. Hence the approach taken is to print the error details to our game window. Doing so is not trivial though, as we cannot rely on having any external Lua scripts or external graphical resources. Thus the font data and Lua script are hardcoded into this file (the font itself is a homemade bitmap font, as we cannot rely on TH fonts being present). */ static const int first_bootstrap_code_line_number = __LINE__ + 2; static const char* bootstrap_code[] = { "local lines, dat, tab, pal, err = {}, ...", "local function t(s) return s:gsub('\\t', ' ') end", "for s in tostring(err):gmatch'[^\\r\\n]+' do lines[#lines+1] = t(s) end", "local TH, SDL, rnc = require'TH', require'sdl', require'rnc'.decompress", "if not SDL.init('video') then error'Unable to initialise video' end", "local w, h = 640, 480", "local function dernc(x) return x:match'^RNC' and assert(rnc(x)) or x end", "local video = TheApp and TheApp.video or TH.surface(w, h)", "video:setCaption('CorsixTH - Error during startup')", "local palette, sheet, font = TH.palette(), TH.sheet(), TH.bitmap_font()", "if not palette:load(dernc(pal)) then error'Unable to load palette' end", "sheet:setPalette(palette)", "if not sheet:load(dernc(tab), dernc(dat), true, video) then error'Unable to load sheet' end", "font:setSheet(sheet):setSeparation(1, 0)", "local bx, by, bw, bh = 20, 0, 100, 16", // Print message and draw button: "local function draw()", " video:startFrame()", " video:fillBlack()", " local y = 20", " for _, s in ipairs(lines) do", " y = font:drawWrapped(video, s, 20, y, w - 40)", " end", " by = y + 20", " video:drawRect(video:mapRGB(151, 23, 23), bx, by, bw, bh)", " video:drawRect(video:mapRGB(171, 53, 53), bx + 1, by + 1, bw - 2, bh - 2)", " font:draw(video, 'Exit', bx, by + 1, bw, bh)", " video:endFrame()", "end", "SDL.wm.showCursor(true)", "draw()", "local running = true", // Minimal event handler: "repeat", " local e, where = SDL.mainloop(coroutine.create(function()", " while running do", " local e, _, x, y = coroutine.yield(true)", " if e == 'frame' then draw()", " elseif e == 'buttonup' then", " x, y = x - bx, y - by", " running = x < 0 or bw <= x or y < 0 or bh <= y", " end", " end", " end))", " if running then print(e) end", "until where ~= 'callback'", nullptr }; /* Start autogenerated content */ /* Data from bootstrap_font.tab inserted by mkbootstrap.lua: */ static const std::vector bootstrap_font_tab = { 0x52, 0x4E, 0x43, 0x01, 0x00, 0x00, 0x05, 0x46, 0x00, 0x00, 0x01, 0xE1, 0xFB, 0xF2, 0x66, 0x51, 0xBE, 0xEF, 0x0C, 0x09, 0x59, 0x60, 0x10, 0x34, 0x43, 0x54, 0xA6, 0x46, 0xA2, 0x08, 0x00, 0xA0, 0xC4, 0x01, 0xF6, 0x3D, 0x00, 0x00, 0xAF, 0xAE, 0x05, 0x01, 0x03, 0x01, 0x0C, 0x0B, 0xAE, 0x9E, 0x03, 0x0C, 0x16, 0x08, 0x0C, 0x47, 0x63, 0xEA, 0x0C, 0x74, 0x07, 0x0C, 0x9A, 0xEA, 0xEA, 0x06, 0x0C, 0xC8, 0x02, 0x0C, 0xD1, 0x1D, 0x92, 0xEE, 0x4B, 0x43, 0x09, 0x01, 0x3B, 0xD5, 0x34, 0x4F, 0xAA, 0xF4, 0xCC, 0xA4, 0x56, 0x60, 0xDA, 0x66, 0x54, 0x1D, 0x66, 0xA3, 0x3E, 0x7C, 0x04, 0x0C, 0x9B, 0xD3, 0x4C, 0xB5, 0xD5, 0x52, 0x93, 0xF2, 0x13, 0x24, 0x12, 0x02, 0x31, 0x52, 0x49, 0x92, 0x71, 0x97, 0x54, 0x7B, 0xB9, 0x8C, 0x6A, 0xC3, 0xB3, 0x51, 0xCD, 0xB5, 0x4E, 0xE5, 0x4E, 0x33, 0xF6, 0x1D, 0xAD, 0x0F, 0x34, 0xAA, 0x29, 0xDB, 0x8C, 0x4E, 0xAA, 0xBB, 0x12, 0x9A, 0x91, 0x49, 0x4A, 0xB1, 0xD7, 0x48, 0x2E, 0xF5, 0x10, 0x04, 0x01, 0x49, 0x34, 0x58, 0x92, 0x54, 0x76, 0x97, 0xE9, 0x91, 0xB9, 0x12, 0x4E, 0xDB, 0x03, 0x05, 0x50, 0x6D, 0x2B, 0x36, 0xAA, 0x50, 0xDC, 0xA8, 0x6E, 0x2E, 0x3D, 0x9C, 0x33, 0xA5, 0xBD, 0x25, 0xC9, 0xDD, 0xF8, 0x09, 0x92, 0x1F, 0x06, 0x45, 0x6D, 0xAA, 0x69, 0x66, 0x92, 0x97, 0xB7, 0x54, 0xB7, 0xDB, 0x1F, 0x39, 0xF8, 0x12, 0x07, 0x41, 0x95, 0x2F, 0x1B, 0x49, 0x41, 0x4B, 0x75, 0xDD, 0x99, 0x49, 0x55, 0x70, 0x75, 0xBF, 0x92, 0x24, 0xA7, 0xC4, 0x49, 0x92, 0xD9, 0xF5, 0x6B, 0x82, 0x14, 0x08, 0x38, 0xEA, 0x65, 0x8C, 0x6A, 0x43, 0x9B, 0x51, 0x5D, 0xE5, 0x46, 0x7F, 0xB5, 0xC7, 0xA4, 0x95, 0x91, 0xAE, 0xD0, 0x4C, 0xC6, 0xE2, 0x33, 0xC9, 0xFF, 0x09, 0x92, 0x1F, 0x09, 0x34, 0x47, 0x24, 0xA9, 0x65, 0x7D, 0x9A, 0x46, 0x99, 0x92, 0x72, 0xB6, 0xD4, 0x9A, 0xB9, 0xF4, 0x10, 0x0A, 0x19, 0x54, 0x32, 0x1B, 0xCF, 0x3E, 0x4C, 0xAA, 0x5E, 0x97, 0x31, 0x6D, 0xAA, 0xF4, 0x48, 0x39, 0x87, 0xB0, 0x49, 0x09, 0xCF, 0xE9, 0xFB, 0x99, 0x90, 0x46, 0x2C, 0x92, 0x54, 0x4B, 0x6D, 0xE9, 0x91, 0x8A, 0x24, 0x49, 0xA6, 0xC0, 0xD9, 0x75, 0xC5, 0x91, 0xBD, 0xF0, 0x9C, 0x75, 0x45, 0xA8, 0x19, 0xFA, 0x46, 0x3A, 0x52, 0x75, 0x5A, 0x8C, 0x2A, 0x75, 0x3B, 0xAA, 0x95, 0xBD, 0x27, 0xBF, 0x27, 0x39, 0xE3, 0x04, 0x0D, 0x41, 0xD5, 0x24, 0x31, 0x92, 0x42, 0x5E, 0xA4, 0x6A, 0x85, 0x9A, 0xB4, 0xAA, 0x12, 0x9A, 0xD0, 0xF3, 0x39, 0x41, 0x15, 0x0E, 0x37, 0x92, 0x24, 0x5F, 0x84, 0xA5, 0xD5, 0xDE, 0x33, 0x93, 0xB6, 0xD9, 0xAA, 0x6F, 0xE4, 0x2E, 0xF6, 0x14, 0x0F, 0x61, 0x92, 0x52, 0xA4, 0xCA, 0x6C, 0xCD, 0x4C, 0x86, 0x94, 0x92, 0xEA, 0xA5, 0x7F, 0x39, 0xD9, 0x72, 0xAF, 0x11, 0x10, 0x04, 0xAA, 0x1C, 0xED, 0x47, 0x3D, 0xF6, 0x97, 0x3D, 0xF4, 0x7D, 0x0A, 0x5E, 0xAF, 0x44, 0x80, 0xAA, 0x57, 0x35, 0xAA, 0xA1, 0xF7, 0x34, 0xBA, 0x92, 0xA4, 0xD6, 0xF7, 0x7A, 0xF7, 0x5B, 0x1A, 0x18, 0x11, 0x35, 0xAA, 0xC4, 0x48, 0xAA, 0x4C, 0x6E, 0xD6, 0x91, 0x93, 0x12, 0x52, 0xBA, 0xE0, 0x35, 0x8D, 0xFF, 0x5C, 0x1F, 0x27, 0x12, 0x54, 0xE9, 0x44, 0x51, 0xA5, 0x67, 0x47, 0x92, 0x7F, 0x99, 0x64, 0x37, 0xBA, 0x38, 0x49, 0xE2, 0xA8, 0xCF, 0xF2, 0x75, 0x53, 0x0D, 0x13, 0xFA, 0x24, 0x1E, 0x51, 0xB9, 0xC9, 0x29, 0x40, 0x52, 0x7D, 0x0F }; /* Data from bootstrap_font.dat inserted by mkbootstrap.lua: */ static const std::vector bootstrap_font_dat = { 0x52, 0x4E, 0x43, 0x01, 0x00, 0x00, 0x13, 0x68, 0x00, 0x00, 0x05, 0xEC, 0xD3, 0x6C, 0x7E, 0xAB, 0xBE, 0xEF, 0x94, 0x90, 0x81, 0x61, 0x50, 0x34, 0x44, 0x33, 0x33, 0x53, 0x66, 0x64, 0x64, 0x26, 0x20, 0x60, 0x47, 0x1E, 0x01, 0xFF, 0x84, 0x41, 0x01, 0x02, 0xFF, 0x01, 0x84, 0x09, 0xFF, 0xFF, 0x14, 0x2F, 0x06, 0xCD, 0x9B, 0xCC, 0x8C, 0x89, 0x04, 0x1B, 0x42, 0x06, 0x65, 0x64, 0x71, 0x3B, 0x44, 0x01, 0x06, 0x78, 0xE0, 0xE9, 0xD9, 0x9A, 0x2B, 0x36, 0x72, 0xB0, 0x43, 0x84, 0x59, 0x1B, 0x4D, 0x0A, 0xB6, 0x75, 0x87, 0x91, 0x32, 0xAB, 0x86, 0x02, 0xCC, 0xDE, 0x84, 0x07, 0x82, 0x31, 0x85, 0xCC, 0x45, 0x90, 0x4A, 0x84, 0xE7, 0xC4, 0x9C, 0x42, 0xFC, 0x29, 0x66, 0x0C, 0xA4, 0x94, 0x9D, 0xD9, 0x38, 0x75, 0x35, 0x42, 0x98, 0x07, 0x6D, 0x70, 0x91, 0x1B, 0x03, 0x8E, 0x54, 0x40, 0x9B, 0xED, 0x89, 0x19, 0x44, 0x87, 0x02, 0x9D, 0x8B, 0x5C, 0x3A, 0x15, 0x19, 0xF8, 0xB7, 0xAC, 0x43, 0x01, 0x15, 0x93, 0x0B, 0x5D, 0x03, 0x83, 0x40, 0x1A, 0x56, 0xA5, 0x1D, 0x03, 0xF2, 0x93, 0xA2, 0x50, 0x03, 0xB6, 0x11, 0x1C, 0xF2, 0x8E, 0x8E, 0x60, 0x87, 0x42, 0x89, 0x93, 0x40, 0x93, 0x64, 0xA2, 0x81, 0x04, 0x29, 0x23, 0x11, 0x4F, 0x36, 0xA0, 0xBA, 0x8E, 0xA2, 0xA4, 0x1A, 0x08, 0x75, 0x65, 0x6E, 0x9C, 0xAC, 0x14, 0xC3, 0x18, 0x67, 0x33, 0x16, 0x4E, 0x10, 0x31, 0x8C, 0x11, 0x9B, 0x17, 0x7C, 0xCC, 0x44, 0x57, 0x8F, 0xF7, 0x74, 0x0E, 0x3F, 0x71, 0x80, 0x64, 0x08, 0x39, 0x90, 0xBC, 0x28, 0x87, 0x3A, 0x15, 0x8B, 0x70, 0x30, 0x9D, 0x04, 0x14, 0x0B, 0x89, 0x1C, 0x95, 0x21, 0x8F, 0x50, 0xB5, 0x2D, 0xD9, 0x85, 0x1B, 0x80, 0x72, 0xEC, 0x0A, 0xCE, 0x6B, 0xA8, 0xDB, 0x86, 0x05, 0x35, 0x93, 0x84, 0x12, 0x8B, 0xE6, 0xEC, 0x84, 0xBF, 0x79, 0x5F, 0xDA, 0xA4, 0xC8, 0x97, 0xF8, 0x84, 0x42, 0x9B, 0x19, 0xB4, 0x96, 0xCB, 0xD4, 0x85, 0x21, 0x84, 0x08, 0xB3, 0x5B, 0x1F, 0x88, 0x60, 0xCE, 0x85, 0x0F, 0x56, 0x92, 0x92, 0xA4, 0x05, 0xA6, 0x43, 0x46, 0x9E, 0x94, 0x08, 0x8B, 0x58, 0x17, 0x3B, 0x87, 0xC9, 0xAA, 0x86, 0x48, 0x83, 0x23, 0x12, 0x83, 0x52, 0x90, 0x89, 0x38, 0x4A, 0x50, 0x89, 0x52, 0x32, 0x98, 0x45, 0xB9, 0x84, 0x48, 0x6D, 0x98, 0x17, 0x9E, 0xA2, 0x37, 0x66, 0xC2, 0xA2, 0xB4, 0x5A, 0x2C, 0x54, 0xE5, 0xC5, 0x15, 0x74, 0x44, 0x67, 0x06, 0x50, 0x6E, 0xE1, 0x06, 0x2F, 0x2D, 0xC8, 0x99, 0x0D, 0xB6, 0x4D, 0x79, 0x24, 0x0E, 0x07, 0x1D, 0xE8, 0x91, 0x94, 0x0F, 0xDE, 0x62, 0x3F, 0x60, 0x0F, 0x27, 0x63, 0xE5, 0x40, 0x78, 0x85, 0xB8, 0x15, 0x09, 0xCA, 0x22, 0x2B, 0x19, 0x09, 0x53, 0xF9, 0x84, 0x69, 0x6D, 0x32, 0x6B, 0xAE, 0x45, 0xCA, 0x90, 0xE6, 0x12, 0x6A, 0xB4, 0xA2, 0xD8, 0x4C, 0xFA, 0xA1, 0x5D, 0xEF, 0xC2, 0xE4, 0x02, 0x00, 0xF9, 0x5B, 0x05, 0x13, 0x6B, 0xC2, 0xB9, 0xAA, 0x17, 0xD8, 0xBA, 0xB1, 0xF9, 0xA0, 0x05, 0x4C, 0x2F, 0x9A, 0x61, 0xBA, 0x52, 0x94, 0x63, 0xB9, 0x16, 0x9D, 0xA3, 0x65, 0x84, 0x3D, 0x4A, 0x64, 0x9C, 0x96, 0x20, 0xF6, 0x30, 0x85, 0x68, 0x5A, 0x50, 0x95, 0xE5, 0x30, 0xFD, 0x90, 0x1C, 0xE2, 0xE6, 0x43, 0x0B, 0x6A, 0x9F, 0x23, 0x12, 0x27, 0xC2, 0x81, 0x9D, 0x55, 0x85, 0xC7, 0x01, 0xA5, 0x58, 0x01, 0xC7, 0xD3, 0xF3, 0xFD, 0x87, 0x0B, 0x58, 0x7C, 0x52, 0xCA, 0x6C, 0x47, 0xF1, 0x39, 0x19, 0x8A, 0x9A, 0xF7, 0x21, 0x0A, 0x67, 0x06, 0xBE, 0xD3, 0x88, 0xCF, 0x47, 0x34, 0x94, 0x09, 0x04, 0x40, 0x64, 0x09, 0xE6, 0x4F, 0xEA, 0xA5, 0x55, 0x4E, 0xA5, 0x95, 0xE5, 0x50, 0x0D, 0x06, 0x46, 0x61, 0x85, 0x23, 0x08, 0xAB, 0xF9, 0x48, 0x09, 0x33, 0x44, 0x50, 0x07, 0x21, 0x3C, 0xA8, 0x61, 0x9D, 0x34, 0x84, 0x22, 0x5C, 0x44, 0xFD, 0xA0, 0x6D, 0xE2, 0x6E, 0x56, 0x3A, 0xA3, 0x19, 0x62, 0x4A, 0x82, 0x0C, 0x98, 0x25, 0xCF, 0x24, 0xC8, 0x35, 0x35, 0x1A, 0x12, 0x59, 0x5D, 0x98, 0xD6, 0x2E, 0x76, 0x7F, 0x2B, 0xF4, 0x30, 0x24, 0xAF, 0x4C, 0x5C, 0x28, 0x2E, 0x28, 0xAA, 0x24, 0xE5, 0x17, 0xFF, 0x55, 0x42, 0xC9, 0x54, 0x1B, 0x75, 0xDD, 0xBE, 0x47, 0x9B, 0x11, 0x22, 0x0E, 0xCC, 0xAA, 0x88, 0x88, 0x66, 0x64, 0xCA, 0xD0, 0x88, 0x08, 0x41, 0x06, 0xF0, 0x17, 0x45, 0x82, 0x07, 0xAE, 0x80, 0x9F, 0xB2, 0x23, 0x23, 0xAB, 0x8C, 0xE9, 0xFA, 0xC3, 0x53, 0xD0, 0x06, 0x88, 0x67, 0x59, 0xB3, 0x92, 0xD2, 0xE9, 0xA8, 0x82, 0x0A, 0xA7, 0xC9, 0x44, 0x8E, 0x47, 0x15, 0x82, 0x37, 0x80, 0x9B, 0x88, 0xF9, 0x08, 0x27, 0xDC, 0x05, 0xC2, 0xD3, 0x94, 0x59, 0x55, 0x41, 0x7F, 0x91, 0xFF, 0xDB, 0x16, 0x8C, 0x0C, 0x27, 0x76, 0x6E, 0x26, 0x81, 0xAA, 0xA1, 0x8F, 0xC1, 0x20, 0x63, 0x0B, 0xC3, 0x89, 0x49, 0x31, 0x42, 0x93, 0x8C, 0x69, 0x07, 0x7B, 0x3F, 0x9E, 0x0E, 0x45, 0x56, 0x85, 0x91, 0xE9, 0x78, 0xCC, 0xF9, 0x08, 0xA4, 0xD5, 0x92, 0x70, 0x89, 0x16, 0xC3, 0x0C, 0x92, 0x18, 0xA7, 0x59, 0xF2, 0x08, 0xCD, 0xE0, 0xF2, 0xA8, 0x97, 0x4C, 0xF3, 0x83, 0xA7, 0x1C, 0x68, 0x54, 0x17, 0x03, 0x8A, 0x20, 0x57, 0x50, 0x58, 0x31, 0x11, 0x72, 0x87, 0x71, 0x25, 0x2E, 0xE7, 0xE4, 0x79, 0x90, 0x10, 0x50, 0x1D, 0x54, 0x88, 0xE1, 0xB7, 0x8F, 0x18, 0x02, 0x77, 0xA8, 0x0C, 0x64, 0x11, 0x8C, 0xC9, 0x21, 0xE6, 0x07, 0xCB, 0x5E, 0x8F, 0xB2, 0x25, 0x0B, 0x7B, 0x0A, 0x25, 0x8B, 0x95, 0xD0, 0x82, 0xF4, 0xE2, 0x34, 0x20, 0xEA, 0x5F, 0x36, 0x8C, 0xA1, 0x94, 0x50, 0xFD, 0x69, 0x1B, 0xCB, 0xB0, 0x8B, 0x4F, 0xBF, 0xB5, 0xC7, 0x0B, 0xC2, 0xC5, 0x17, 0xEE, 0x8C, 0x91, 0xFB, 0xD3, 0x0D, 0xD1, 0xE1, 0x98, 0x3A, 0xC9, 0x4D, 0x08, 0xF4, 0xB8, 0x59, 0x11, 0x78, 0x48, 0x20, 0x8B, 0x25, 0x08, 0xBF, 0xF2, 0x89, 0x59, 0xDB, 0x31, 0xD6, 0x17, 0x9E, 0xCA, 0x74, 0x20, 0x8E, 0x0E, 0xD5, 0x07, 0x3B, 0x5D, 0x51, 0x8E, 0x86, 0x71, 0xCE, 0xE6, 0x2C, 0x54, 0xB2, 0xC6, 0x8B, 0x02, 0x7D, 0x7F, 0xC2, 0x61, 0xC2, 0x0B, 0xF0, 0x85, 0x84, 0xCC, 0x98, 0x11, 0x4A, 0x8D, 0x66, 0x03, 0xF8, 0x54, 0x57, 0xB0, 0xF0, 0x45, 0x8C, 0xFF, 0xD3, 0x61, 0xA8, 0x82, 0x09, 0xFF, 0x00, 0xCA, 0x0B, 0x8C, 0x9B, 0x75, 0x24, 0x09, 0x07, 0x00, 0xF9, 0xAC, 0xC1, 0xBB, 0xB7, 0x9E, 0xE8, 0x41, 0xE4, 0x2B, 0xCE, 0xAB, 0x2D, 0x9D, 0xEA, 0xFD, 0x41, 0x00, 0x42, 0x8F, 0xC9, 0xF4, 0x87, 0x54, 0x61, 0x2D, 0x42, 0x51, 0x3F, 0x52, 0x29, 0xCB, 0x87, 0x0F, 0x1F, 0xE4, 0x11, 0x33, 0x8E, 0xE5, 0xCD, 0x86, 0x6F, 0x96, 0x30, 0x40, 0x06, 0xF5, 0x7F, 0x42, 0xB2, 0x61, 0x93, 0x55, 0x87, 0xFE, 0x86, 0xE3, 0x67, 0x49, 0xA2, 0xC3, 0x1F, 0x6F, 0xEF, 0x76, 0x4E, 0xE5, 0x12, 0x89, 0x3E, 0x10, 0xFF, 0x90, 0x99, 0xBF, 0x40, 0x45, 0xAA, 0xFC, 0x10, 0xDC, 0xC1, 0xF1, 0x44, 0x13, 0x50, 0x58, 0x29, 0x61, 0x28, 0x95, 0x70, 0x05, 0x7E, 0x21, 0x8D, 0xE3, 0x83, 0xB2, 0x8F, 0xB2, 0xA2, 0x10, 0xE0, 0x93, 0xAC, 0xFD, 0x88, 0x38, 0x38, 0xC4, 0x46, 0x23, 0x4A, 0x41, 0xF8, 0x0F, 0xA8, 0x12, 0xD5, 0x88, 0x7F, 0x92, 0xA2, 0x21, 0xBE, 0xF1, 0x0A, 0x11, 0x92, 0x11, 0x99, 0xAB, 0xEA, 0xC3, 0x85, 0x22, 0x1B, 0xA2, 0xDF, 0xE9, 0x7E, 0x18, 0x95, 0xB6, 0x48, 0xD1, 0x9F, 0x50, 0xCF, 0x11, 0xBE, 0xF9, 0xB9, 0x1E, 0xC7, 0x9B, 0x00, 0xE3, 0x62, 0xAA, 0x98, 0x0E, 0x01, 0x87, 0xC0, 0x27, 0x59, 0x53, 0x83, 0x47, 0xBA, 0x96, 0xEA, 0xFF, 0x88, 0x68, 0xEA, 0x08, 0xD3, 0x58, 0xCE, 0x0F, 0x05, 0x8A, 0xDA, 0x27, 0x6E, 0x15, 0x18, 0xF2, 0xAF, 0x38, 0xEA, 0x54, 0xA0, 0x89, 0x74, 0xA1, 0x4B, 0x16, 0x9A, 0x14, 0x4D, 0x06, 0x85, 0x1D, 0xEC, 0xEF, 0x52, 0x54, 0x93, 0x2C, 0x09, 0xA3, 0xE9, 0xC6, 0x1C, 0x75, 0xAD, 0xD8, 0x14, 0x2E, 0x31, 0x58, 0x15, 0xCF, 0xB8, 0x44, 0x04, 0xAC, 0x1C, 0xF0, 0x22, 0xA9, 0x3B, 0x99, 0xD9, 0x44, 0x9D, 0x8E, 0xF8, 0x05, 0xE1, 0x04, 0x7B, 0x0B, 0x32, 0x13, 0x85, 0x22, 0xDE, 0x87, 0xAC, 0x27, 0xAB, 0x2A, 0x66, 0x75, 0xA1, 0x9B, 0xC0, 0x51, 0xE1, 0x59, 0x43, 0x5B, 0xC2, 0x37, 0xDF, 0x00, 0xD5, 0x98, 0x53, 0xE3, 0x95, 0xD0, 0xD2, 0x88, 0xF6, 0x8F, 0xFD, 0x28, 0x5D, 0xFE, 0x50, 0x34, 0xF4, 0x85, 0xEA, 0xA1, 0xC9, 0x0F, 0xA6, 0x72, 0xA8, 0x57, 0xF8, 0xEA, 0x50, 0x96, 0xC8, 0x84, 0x1E, 0xF8, 0x1F, 0x2C, 0xEB, 0xA9, 0xA3, 0x64, 0xE1, 0xAC, 0xE4, 0x2B, 0x50, 0xA4, 0x66, 0x54, 0x87, 0x63, 0xA2, 0x87, 0x00, 0x04, 0x29, 0x2F, 0x1E, 0x89, 0x51, 0xC1, 0xC0, 0xD0, 0xA4, 0xC7, 0x14, 0x52, 0xBA, 0x58, 0xF1, 0xC4, 0x41, 0x40, 0x57, 0xD5, 0xF2, 0xA6, 0x80, 0xEC, 0xB0, 0x30, 0xB1, 0x71, 0xDB, 0x45, 0xA4, 0x86, 0xAC, 0xA7, 0x98, 0xD4, 0xB3, 0x26, 0x42, 0xF1, 0x24, 0x31, 0x0C, 0x54, 0x4F, 0x68, 0x03, 0xB3, 0x0E, 0xD8, 0xB7, 0xE5, 0x8D, 0x1C, 0x8B, 0xD5, 0x08, 0x2D, 0x9E, 0xD0, 0x9C, 0x06, 0x62, 0xA1, 0xD5, 0x41, 0x3B, 0xA0, 0x5C, 0x7E, 0x92, 0x75, 0x84, 0x57, 0x38, 0x41, 0xA0, 0x25, 0xB3, 0xA6, 0xA3, 0x89, 0x33, 0xC2, 0xD1, 0x60, 0x72, 0x57, 0xB1, 0xC2, 0xC0, 0x2A, 0x79, 0xB0, 0xC2, 0x6C, 0x13, 0x01, 0x51, 0x21, 0xCB, 0x13, 0xA3, 0x32, 0x3E, 0x16, 0x49, 0xEF, 0x6C, 0xF1, 0x30, 0x90, 0x05, 0x5D, 0x85, 0x27, 0x1B, 0xAA, 0xC0, 0x74, 0x7A, 0x5C, 0x37, 0x01, 0x27, 0x05, 0xEA, 0x3C, 0x4A, 0x4B, 0x9F, 0x0D, 0xC8, 0x18, 0xA2, 0xD4, 0x20, 0x59, 0xCB, 0x19, 0x7D, 0x9C, 0x5F, 0x6C, 0x04, 0xCA, 0x28, 0x6E, 0x6B, 0xAC, 0x7B, 0x0C, 0xCE, 0xE5, 0x9E, 0x49, 0x84, 0x18, 0xDD, 0x1D, 0xAA, 0x39, 0x29, 0x9F, 0x30, 0xFA, 0x22, 0x67, 0x7C, 0x93, 0x92, 0x09, 0x13, 0x52, 0x2F, 0x1E, 0x4E, 0x6E, 0x61, 0x05, 0x18, 0x85, 0x07, 0xA9, 0x33, 0x1E, 0x68, 0xBD, 0x95, 0x31, 0x20, 0x8B, 0x2A, 0xA6, 0x70, 0x96, 0xC4, 0x5E, 0x3D, 0x95, 0x50, 0x79, 0x67, 0x46, 0xCA, 0x50, 0x20, 0xDF, 0x10, 0x2F, 0x08, 0xA0, 0x03, 0xBD, 0x2D, 0x50, 0xEE, 0x55, 0x2C, 0xEC, 0xC9, 0x5F, 0xB9, 0x11, 0x44, 0xEF, 0x4A, 0x21, 0x74, 0x74, 0x75, 0xF3, 0x86, 0xA2, 0x8A, 0x88, 0xA3, 0x77, 0x21, 0xC6, 0xC3, 0x21, 0x27, 0x8A, 0x42, 0x2C, 0x16, 0x3A, 0x88, 0x8A, 0x7F, 0x73, 0xEA, 0xD8, 0x79, 0x46, 0x1C, 0x67, 0x9B, 0x79, 0x61, 0x95, 0xF3, 0x44, 0x63, 0x65, 0x12, 0x8C, 0xA5, 0xBB, 0x88, 0x12, 0x67, 0x9F, 0x90, 0x5D, 0x95, 0x66, 0xA1, 0x9C, 0x57, 0x2A, 0x09, 0x34, 0x07, 0x7B, 0xD6, 0x02, 0xAC, 0x9A, 0x43, 0x10, 0xB5, 0x0A, 0xA0, 0x17, 0x1C, 0xA6, 0x00, 0x9B }; /* Data from bootstrap_font.pal inserted by mkbootstrap.lua: */ static const std::vector bootstrap_font_pal = { 0x52, 0x4E, 0x43, 0x01, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x1D, 0xB7, 0xFF, 0x76, 0x79, 0xBE, 0xEF, 0x90, 0x10, 0x90, 0x05, 0x01, 0x02, 0x00, 0x00, 0x20, 0x2B, 0x04, 0x00, 0x00, 0x00, 0x40, 0x08, 0x00, 0xB6, 0x00, 0x00, 0x00, 0x3F, 0x3F, 0x3F, 0x62, 0x79, 0xBE, 0x27, 0x3F }; /* End autogenerated content */ // Lua reader function for loading bootstrap_code static const char* read_bootstrap_line(lua_State *L, void *data, size_t *size) { int& iLine = *reinterpret_cast(data); ++iLine; if(iLine < 0 || (iLine & 1)) { *size = 1; return "\n"; } else { const char *s = bootstrap_code[iLine / 2]; if(s == nullptr) { *size = 0; return nullptr; } else { *size = std::strlen(s); return s; } } } static inline void push(lua_State *L, std::vector data) { lua_pushlstring(L, reinterpret_cast(data.data()), data.size()); } int bootstrap_lua_resources(lua_State *L) { push(L, bootstrap_font_dat); push(L, bootstrap_font_tab); push(L, bootstrap_font_pal); return 3; } int bootstrap_lua_error_report(lua_State *L) { int iLine = -first_bootstrap_code_line_number; if(luaT_load(L, read_bootstrap_line, &iLine, "@bootstrap.cpp", "t") == 0) { bootstrap_lua_resources(L); lua_pushvalue(L, 1); lua_call(L, 4, 0); return 0; } else return lua_error(L); } CorsixTH-0.63/CorsixTH/Src/bootstrap.h000066400000000000000000000026311347163623700176030ustar00rootroot00000000000000/* Copyright (c) 2010 Peter "Corsix" Cawley 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. */ #ifndef CORSIX_TH_BOOTSTRAP_H_ #define CORSIX_TH_BOOTSTRAP_H_ #include "lua.hpp" //! Push onto the stack the bootstrap font data file, table file and palette. int bootstrap_lua_resources(lua_State *L); //! Provide an onscreen report of the error message on the top of the stack. int bootstrap_lua_error_report(lua_State *L); #endif // CORSIX_TH_BOOTSTRAP_H_ CorsixTH-0.63/CorsixTH/Src/config.h.in000066400000000000000000000060461347163623700174440ustar00rootroot00000000000000/* Copyright (c) 2009 Peter "Corsix" Cawley 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. */ #ifndef CORSIX_TH_CONFIG_H_ #define CORSIX_TH_CONFIG_H_ #cmakedefine CORSIX_TH_INTERPRETER_PATH "@CORSIX_TH_INTERPRETER_PATH@" /** Windows Platform SDK usage **/ // When compiling on Windows, the platform SDK should be used. However, when // using the SDL rendering engine, the platform SDK is not used for anything // critical, and so its use can be avoided if necessary. #ifdef _WIN32 #define CORSIX_TH_USE_WIN32_SDK #endif /** Audio options **/ // SDL_mixer is used for ingame audio. If this library is not present on your // system, then you can comment out the next line and the game will not have // any music. #cmakedefine CORSIX_TH_USE_SDL_MIXER /** Movie options **/ // FFMPEG or LibAV are used for in game movies. // If this library is not present on your system, then you can comment out the // next line and the game will not have movies. #cmakedefine CORSIX_TH_USE_FFMPEG #ifndef CORSIX_TH_USE_FFMPEG #cmakedefine CORSIX_TH_USE_LIBAV #endif /** Font options **/ // FreeType2 can be used for font support beyond the CP437 bitmap fonts which // come with Theme Hospital. It must be used if translations like Russian or // Chinese are desired. #cmakedefine CORSIX_TH_USE_FREETYPE2 #ifdef _MSC_VER #define CORSIX_TH_USE_PACK_PRAGMAS 1 #define CORSIX_TH_PACKED_FLAGS #else #define CORSIX_TH_USE_PACK_PRAGMAS 0 #define CORSIX_TH_PACKED_FLAGS __attribute__((__packed__)) #endif /** Standard includes **/ #ifndef __STDC_CONSTANT_MACROS # define __STDC_CONSTANT_MACROS #endif #include #include /** Environment detection **/ #if UINTPTR_MAX == UINT64_MAX #define CORSIX_TH_64BIT #endif // We bring in the most common stddef and stdint types to avoid typing using std::size_t; using std::uint8_t; using std::uint16_t; using std::uint32_t; using std::uint64_t; using std::int8_t; using std::int16_t; using std::int32_t; using std::int64_t; /** Visual Leak Detector **/ // In Visual Studio, Visual Leak Detector can be used to find memory leaks. #cmakedefine CORSIX_TH_USE_VLD #endif // CORSIX_TH_CONFIG_H_ CorsixTH-0.63/CorsixTH/Src/cp437_table.h000066400000000000000000000022511347163623700175730ustar00rootroot00000000000000static const uint16_t cp437_to_unicode_table[0x80] = { /* 0x00 through 0x7F need no translation */ 0x00C7, 0x00FC, 0x00E9, 0x00E2, 0x00E4, 0x00E0, 0x00E5, 0x00E7, 0x00EA, 0x00EB, 0x00E8, 0x00EF, 0x00EE, 0x00EC, 0x00C4, 0x00C5, 0x00C9, 0x00E6, 0x003F, 0x00F4, 0x00F6, 0x00F2, 0x00FB, 0x00F9, 0x00FF, 0x00D6, 0x00DC, 0x00A2, 0x00A3, 0x00A5, 0x20A7, 0x0192, 0x00E1, 0x00ED, 0x00F3, 0x00FA, 0x00F1, 0x00D1, 0x00AA, 0x00BA, 0x00BF, 0x2310, 0x00AC, 0x00BD, 0x00BC, 0x00A1, 0x00AB, 0x00BB, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x03B1, 0x00DF, 0x0393, 0x03C0, 0x03A3, 0x03C3, 0x03BC, 0x03C4, 0x03A6, 0x0398, 0x03A9, 0x03B4, 0x221E, 0x03C6, 0x03B5, 0x2229, 0x2261, 0x00B1, 0x2265, 0x2264, 0x2320, 0x2321, 0x00F7, 0x2248, 0x00B0, 0x2219, 0x00B7, 0x221A, 0x207F, 0x00B2, 0x25A0, 0x00A0 }; CorsixTH-0.63/CorsixTH/Src/cp936_table.h000066400000000000000000006530061347163623700176110ustar00rootroot00000000000000// Generated from the following document: // http://www.unicode.org/Public/MAPPINGS/VENDORS/MICSFT/WINDOWS/CP936.TXT // Maps double-byte characters where: // 1st byte is between 0x81 and 0xFE (subtract 0x81 for table lookup) // 2nd byte is between 0x40 and 0xFE (subtract 0x40 for table lookup) // Unspecified codes are mapped to 0x003F static const uint16_t cp936_to_unicode_table[126][191] = { { 0x4E02, 0x4E04, 0x4E05, 0x4E06, 0x4E0F, 0x4E12, 0x4E17, 0x4E1F, 0x4E20, 0x4E21, 0x4E23, 0x4E26, 0x4E29, 0x4E2E, 0x4E2F, 0x4E31, 0x4E33, 0x4E35, 0x4E37, 0x4E3C, 0x4E40, 0x4E41, 0x4E42, 0x4E44, 0x4E46, 0x4E4A, 0x4E51, 0x4E55, 0x4E57, 0x4E5A, 0x4E5B, 0x4E62, 0x4E63, 0x4E64, 0x4E65, 0x4E67, 0x4E68, 0x4E6A, 0x4E6B, 0x4E6C, 0x4E6D, 0x4E6E, 0x4E6F, 0x4E72, 0x4E74, 0x4E75, 0x4E76, 0x4E77, 0x4E78, 0x4E79, 0x4E7A, 0x4E7B, 0x4E7C, 0x4E7D, 0x4E7F, 0x4E80, 0x4E81, 0x4E82, 0x4E83, 0x4E84, 0x4E85, 0x4E87, 0x4E8A, 0x003F, 0x4E90, 0x4E96, 0x4E97, 0x4E99, 0x4E9C, 0x4E9D, 0x4E9E, 0x4EA3, 0x4EAA, 0x4EAF, 0x4EB0, 0x4EB1, 0x4EB4, 0x4EB6, 0x4EB7, 0x4EB8, 0x4EB9, 0x4EBC, 0x4EBD, 0x4EBE, 0x4EC8, 0x4ECC, 0x4ECF, 0x4ED0, 0x4ED2, 0x4EDA, 0x4EDB, 0x4EDC, 0x4EE0, 0x4EE2, 0x4EE6, 0x4EE7, 0x4EE9, 0x4EED, 0x4EEE, 0x4EEF, 0x4EF1, 0x4EF4, 0x4EF8, 0x4EF9, 0x4EFA, 0x4EFC, 0x4EFE, 0x4F00, 0x4F02, 0x4F03, 0x4F04, 0x4F05, 0x4F06, 0x4F07, 0x4F08, 0x4F0B, 0x4F0C, 0x4F12, 0x4F13, 0x4F14, 0x4F15, 0x4F16, 0x4F1C, 0x4F1D, 0x4F21, 0x4F23, 0x4F28, 0x4F29, 0x4F2C, 0x4F2D, 0x4F2E, 0x4F31, 0x4F33, 0x4F35, 0x4F37, 0x4F39, 0x4F3B, 0x4F3E, 0x4F3F, 0x4F40, 0x4F41, 0x4F42, 0x4F44, 0x4F45, 0x4F47, 0x4F48, 0x4F49, 0x4F4A, 0x4F4B, 0x4F4C, 0x4F52, 0x4F54, 0x4F56, 0x4F61, 0x4F62, 0x4F66, 0x4F68, 0x4F6A, 0x4F6B, 0x4F6D, 0x4F6E, 0x4F71, 0x4F72, 0x4F75, 0x4F77, 0x4F78, 0x4F79, 0x4F7A, 0x4F7D, 0x4F80, 0x4F81, 0x4F82, 0x4F85, 0x4F86, 0x4F87, 0x4F8A, 0x4F8C, 0x4F8E, 0x4F90, 0x4F92, 0x4F93, 0x4F95, 0x4F96, 0x4F98, 0x4F99, 0x4F9A, 0x4F9C, 0x4F9E, 0x4F9F, 0x4FA1, 0x4FA2 }, { 0x4FA4, 0x4FAB, 0x4FAD, 0x4FB0, 0x4FB1, 0x4FB2, 0x4FB3, 0x4FB4, 0x4FB6, 0x4FB7, 0x4FB8, 0x4FB9, 0x4FBA, 0x4FBB, 0x4FBC, 0x4FBD, 0x4FBE, 0x4FC0, 0x4FC1, 0x4FC2, 0x4FC6, 0x4FC7, 0x4FC8, 0x4FC9, 0x4FCB, 0x4FCC, 0x4FCD, 0x4FD2, 0x4FD3, 0x4FD4, 0x4FD5, 0x4FD6, 0x4FD9, 0x4FDB, 0x4FE0, 0x4FE2, 0x4FE4, 0x4FE5, 0x4FE7, 0x4FEB, 0x4FEC, 0x4FF0, 0x4FF2, 0x4FF4, 0x4FF5, 0x4FF6, 0x4FF7, 0x4FF9, 0x4FFB, 0x4FFC, 0x4FFD, 0x4FFF, 0x5000, 0x5001, 0x5002, 0x5003, 0x5004, 0x5005, 0x5006, 0x5007, 0x5008, 0x5009, 0x500A, 0x003F, 0x500B, 0x500E, 0x5010, 0x5011, 0x5013, 0x5015, 0x5016, 0x5017, 0x501B, 0x501D, 0x501E, 0x5020, 0x5022, 0x5023, 0x5024, 0x5027, 0x502B, 0x502F, 0x5030, 0x5031, 0x5032, 0x5033, 0x5034, 0x5035, 0x5036, 0x5037, 0x5038, 0x5039, 0x503B, 0x503D, 0x503F, 0x5040, 0x5041, 0x5042, 0x5044, 0x5045, 0x5046, 0x5049, 0x504A, 0x504B, 0x504D, 0x5050, 0x5051, 0x5052, 0x5053, 0x5054, 0x5056, 0x5057, 0x5058, 0x5059, 0x505B, 0x505D, 0x505E, 0x505F, 0x5060, 0x5061, 0x5062, 0x5063, 0x5064, 0x5066, 0x5067, 0x5068, 0x5069, 0x506A, 0x506B, 0x506D, 0x506E, 0x506F, 0x5070, 0x5071, 0x5072, 0x5073, 0x5074, 0x5075, 0x5078, 0x5079, 0x507A, 0x507C, 0x507D, 0x5081, 0x5082, 0x5083, 0x5084, 0x5086, 0x5087, 0x5089, 0x508A, 0x508B, 0x508C, 0x508E, 0x508F, 0x5090, 0x5091, 0x5092, 0x5093, 0x5094, 0x5095, 0x5096, 0x5097, 0x5098, 0x5099, 0x509A, 0x509B, 0x509C, 0x509D, 0x509E, 0x509F, 0x50A0, 0x50A1, 0x50A2, 0x50A4, 0x50A6, 0x50AA, 0x50AB, 0x50AD, 0x50AE, 0x50AF, 0x50B0, 0x50B1, 0x50B3, 0x50B4, 0x50B5, 0x50B6, 0x50B7, 0x50B8, 0x50B9, 0x50BC }, { 0x50BD, 0x50BE, 0x50BF, 0x50C0, 0x50C1, 0x50C2, 0x50C3, 0x50C4, 0x50C5, 0x50C6, 0x50C7, 0x50C8, 0x50C9, 0x50CA, 0x50CB, 0x50CC, 0x50CD, 0x50CE, 0x50D0, 0x50D1, 0x50D2, 0x50D3, 0x50D4, 0x50D5, 0x50D7, 0x50D8, 0x50D9, 0x50DB, 0x50DC, 0x50DD, 0x50DE, 0x50DF, 0x50E0, 0x50E1, 0x50E2, 0x50E3, 0x50E4, 0x50E5, 0x50E8, 0x50E9, 0x50EA, 0x50EB, 0x50EF, 0x50F0, 0x50F1, 0x50F2, 0x50F4, 0x50F6, 0x50F7, 0x50F8, 0x50F9, 0x50FA, 0x50FC, 0x50FD, 0x50FE, 0x50FF, 0x5100, 0x5101, 0x5102, 0x5103, 0x5104, 0x5105, 0x5108, 0x003F, 0x5109, 0x510A, 0x510C, 0x510D, 0x510E, 0x510F, 0x5110, 0x5111, 0x5113, 0x5114, 0x5115, 0x5116, 0x5117, 0x5118, 0x5119, 0x511A, 0x511B, 0x511C, 0x511D, 0x511E, 0x511F, 0x5120, 0x5122, 0x5123, 0x5124, 0x5125, 0x5126, 0x5127, 0x5128, 0x5129, 0x512A, 0x512B, 0x512C, 0x512D, 0x512E, 0x512F, 0x5130, 0x5131, 0x5132, 0x5133, 0x5134, 0x5135, 0x5136, 0x5137, 0x5138, 0x5139, 0x513A, 0x513B, 0x513C, 0x513D, 0x513E, 0x5142, 0x5147, 0x514A, 0x514C, 0x514E, 0x514F, 0x5150, 0x5152, 0x5153, 0x5157, 0x5158, 0x5159, 0x515B, 0x515D, 0x515E, 0x515F, 0x5160, 0x5161, 0x5163, 0x5164, 0x5166, 0x5167, 0x5169, 0x516A, 0x516F, 0x5172, 0x517A, 0x517E, 0x517F, 0x5183, 0x5184, 0x5186, 0x5187, 0x518A, 0x518B, 0x518E, 0x518F, 0x5190, 0x5191, 0x5193, 0x5194, 0x5198, 0x519A, 0x519D, 0x519E, 0x519F, 0x51A1, 0x51A3, 0x51A6, 0x51A7, 0x51A8, 0x51A9, 0x51AA, 0x51AD, 0x51AE, 0x51B4, 0x51B8, 0x51B9, 0x51BA, 0x51BE, 0x51BF, 0x51C1, 0x51C2, 0x51C3, 0x51C5, 0x51C8, 0x51CA, 0x51CD, 0x51CE, 0x51D0, 0x51D2, 0x51D3, 0x51D4, 0x51D5, 0x51D6, 0x51D7 }, { 0x51D8, 0x51D9, 0x51DA, 0x51DC, 0x51DE, 0x51DF, 0x51E2, 0x51E3, 0x51E5, 0x51E6, 0x51E7, 0x51E8, 0x51E9, 0x51EA, 0x51EC, 0x51EE, 0x51F1, 0x51F2, 0x51F4, 0x51F7, 0x51FE, 0x5204, 0x5205, 0x5209, 0x520B, 0x520C, 0x520F, 0x5210, 0x5213, 0x5214, 0x5215, 0x521C, 0x521E, 0x521F, 0x5221, 0x5222, 0x5223, 0x5225, 0x5226, 0x5227, 0x522A, 0x522C, 0x522F, 0x5231, 0x5232, 0x5234, 0x5235, 0x523C, 0x523E, 0x5244, 0x5245, 0x5246, 0x5247, 0x5248, 0x5249, 0x524B, 0x524E, 0x524F, 0x5252, 0x5253, 0x5255, 0x5257, 0x5258, 0x003F, 0x5259, 0x525A, 0x525B, 0x525D, 0x525F, 0x5260, 0x5262, 0x5263, 0x5264, 0x5266, 0x5268, 0x526B, 0x526C, 0x526D, 0x526E, 0x5270, 0x5271, 0x5273, 0x5274, 0x5275, 0x5276, 0x5277, 0x5278, 0x5279, 0x527A, 0x527B, 0x527C, 0x527E, 0x5280, 0x5283, 0x5284, 0x5285, 0x5286, 0x5287, 0x5289, 0x528A, 0x528B, 0x528C, 0x528D, 0x528E, 0x528F, 0x5291, 0x5292, 0x5294, 0x5295, 0x5296, 0x5297, 0x5298, 0x5299, 0x529A, 0x529C, 0x52A4, 0x52A5, 0x52A6, 0x52A7, 0x52AE, 0x52AF, 0x52B0, 0x52B4, 0x52B5, 0x52B6, 0x52B7, 0x52B8, 0x52B9, 0x52BA, 0x52BB, 0x52BC, 0x52BD, 0x52C0, 0x52C1, 0x52C2, 0x52C4, 0x52C5, 0x52C6, 0x52C8, 0x52CA, 0x52CC, 0x52CD, 0x52CE, 0x52CF, 0x52D1, 0x52D3, 0x52D4, 0x52D5, 0x52D7, 0x52D9, 0x52DA, 0x52DB, 0x52DC, 0x52DD, 0x52DE, 0x52E0, 0x52E1, 0x52E2, 0x52E3, 0x52E5, 0x52E6, 0x52E7, 0x52E8, 0x52E9, 0x52EA, 0x52EB, 0x52EC, 0x52ED, 0x52EE, 0x52EF, 0x52F1, 0x52F2, 0x52F3, 0x52F4, 0x52F5, 0x52F6, 0x52F7, 0x52F8, 0x52FB, 0x52FC, 0x52FD, 0x5301, 0x5302, 0x5303, 0x5304, 0x5307, 0x5309, 0x530A, 0x530B, 0x530C, 0x530E }, { 0x5311, 0x5312, 0x5313, 0x5314, 0x5318, 0x531B, 0x531C, 0x531E, 0x531F, 0x5322, 0x5324, 0x5325, 0x5327, 0x5328, 0x5329, 0x532B, 0x532C, 0x532D, 0x532F, 0x5330, 0x5331, 0x5332, 0x5333, 0x5334, 0x5335, 0x5336, 0x5337, 0x5338, 0x533C, 0x533D, 0x5340, 0x5342, 0x5344, 0x5346, 0x534B, 0x534C, 0x534D, 0x5350, 0x5354, 0x5358, 0x5359, 0x535B, 0x535D, 0x5365, 0x5368, 0x536A, 0x536C, 0x536D, 0x5372, 0x5376, 0x5379, 0x537B, 0x537C, 0x537D, 0x537E, 0x5380, 0x5381, 0x5383, 0x5387, 0x5388, 0x538A, 0x538E, 0x538F, 0x003F, 0x5390, 0x5391, 0x5392, 0x5393, 0x5394, 0x5396, 0x5397, 0x5399, 0x539B, 0x539C, 0x539E, 0x53A0, 0x53A1, 0x53A4, 0x53A7, 0x53AA, 0x53AB, 0x53AC, 0x53AD, 0x53AF, 0x53B0, 0x53B1, 0x53B2, 0x53B3, 0x53B4, 0x53B5, 0x53B7, 0x53B8, 0x53B9, 0x53BA, 0x53BC, 0x53BD, 0x53BE, 0x53C0, 0x53C3, 0x53C4, 0x53C5, 0x53C6, 0x53C7, 0x53CE, 0x53CF, 0x53D0, 0x53D2, 0x53D3, 0x53D5, 0x53DA, 0x53DC, 0x53DD, 0x53DE, 0x53E1, 0x53E2, 0x53E7, 0x53F4, 0x53FA, 0x53FE, 0x53FF, 0x5400, 0x5402, 0x5405, 0x5407, 0x540B, 0x5414, 0x5418, 0x5419, 0x541A, 0x541C, 0x5422, 0x5424, 0x5425, 0x542A, 0x5430, 0x5433, 0x5436, 0x5437, 0x543A, 0x543D, 0x543F, 0x5441, 0x5442, 0x5444, 0x5445, 0x5447, 0x5449, 0x544C, 0x544D, 0x544E, 0x544F, 0x5451, 0x545A, 0x545D, 0x545E, 0x545F, 0x5460, 0x5461, 0x5463, 0x5465, 0x5467, 0x5469, 0x546A, 0x546B, 0x546C, 0x546D, 0x546E, 0x546F, 0x5470, 0x5474, 0x5479, 0x547A, 0x547E, 0x547F, 0x5481, 0x5483, 0x5485, 0x5487, 0x5488, 0x5489, 0x548A, 0x548D, 0x5491, 0x5493, 0x5497, 0x5498, 0x549C, 0x549E, 0x549F, 0x54A0, 0x54A1 }, { 0x54A2, 0x54A5, 0x54AE, 0x54B0, 0x54B2, 0x54B5, 0x54B6, 0x54B7, 0x54B9, 0x54BA, 0x54BC, 0x54BE, 0x54C3, 0x54C5, 0x54CA, 0x54CB, 0x54D6, 0x54D8, 0x54DB, 0x54E0, 0x54E1, 0x54E2, 0x54E3, 0x54E4, 0x54EB, 0x54EC, 0x54EF, 0x54F0, 0x54F1, 0x54F4, 0x54F5, 0x54F6, 0x54F7, 0x54F8, 0x54F9, 0x54FB, 0x54FE, 0x5500, 0x5502, 0x5503, 0x5504, 0x5505, 0x5508, 0x550A, 0x550B, 0x550C, 0x550D, 0x550E, 0x5512, 0x5513, 0x5515, 0x5516, 0x5517, 0x5518, 0x5519, 0x551A, 0x551C, 0x551D, 0x551E, 0x551F, 0x5521, 0x5525, 0x5526, 0x003F, 0x5528, 0x5529, 0x552B, 0x552D, 0x5532, 0x5534, 0x5535, 0x5536, 0x5538, 0x5539, 0x553A, 0x553B, 0x553D, 0x5540, 0x5542, 0x5545, 0x5547, 0x5548, 0x554B, 0x554C, 0x554D, 0x554E, 0x554F, 0x5551, 0x5552, 0x5553, 0x5554, 0x5557, 0x5558, 0x5559, 0x555A, 0x555B, 0x555D, 0x555E, 0x555F, 0x5560, 0x5562, 0x5563, 0x5568, 0x5569, 0x556B, 0x556F, 0x5570, 0x5571, 0x5572, 0x5573, 0x5574, 0x5579, 0x557A, 0x557D, 0x557F, 0x5585, 0x5586, 0x558C, 0x558D, 0x558E, 0x5590, 0x5592, 0x5593, 0x5595, 0x5596, 0x5597, 0x559A, 0x559B, 0x559E, 0x55A0, 0x55A1, 0x55A2, 0x55A3, 0x55A4, 0x55A5, 0x55A6, 0x55A8, 0x55A9, 0x55AA, 0x55AB, 0x55AC, 0x55AD, 0x55AE, 0x55AF, 0x55B0, 0x55B2, 0x55B4, 0x55B6, 0x55B8, 0x55BA, 0x55BC, 0x55BF, 0x55C0, 0x55C1, 0x55C2, 0x55C3, 0x55C6, 0x55C7, 0x55C8, 0x55CA, 0x55CB, 0x55CE, 0x55CF, 0x55D0, 0x55D5, 0x55D7, 0x55D8, 0x55D9, 0x55DA, 0x55DB, 0x55DE, 0x55E0, 0x55E2, 0x55E7, 0x55E9, 0x55ED, 0x55EE, 0x55F0, 0x55F1, 0x55F4, 0x55F6, 0x55F8, 0x55F9, 0x55FA, 0x55FB, 0x55FC, 0x55FF, 0x5602, 0x5603, 0x5604, 0x5605 }, { 0x5606, 0x5607, 0x560A, 0x560B, 0x560D, 0x5610, 0x5611, 0x5612, 0x5613, 0x5614, 0x5615, 0x5616, 0x5617, 0x5619, 0x561A, 0x561C, 0x561D, 0x5620, 0x5621, 0x5622, 0x5625, 0x5626, 0x5628, 0x5629, 0x562A, 0x562B, 0x562E, 0x562F, 0x5630, 0x5633, 0x5635, 0x5637, 0x5638, 0x563A, 0x563C, 0x563D, 0x563E, 0x5640, 0x5641, 0x5642, 0x5643, 0x5644, 0x5645, 0x5646, 0x5647, 0x5648, 0x5649, 0x564A, 0x564B, 0x564F, 0x5650, 0x5651, 0x5652, 0x5653, 0x5655, 0x5656, 0x565A, 0x565B, 0x565D, 0x565E, 0x565F, 0x5660, 0x5661, 0x003F, 0x5663, 0x5665, 0x5666, 0x5667, 0x566D, 0x566E, 0x566F, 0x5670, 0x5672, 0x5673, 0x5674, 0x5675, 0x5677, 0x5678, 0x5679, 0x567A, 0x567D, 0x567E, 0x567F, 0x5680, 0x5681, 0x5682, 0x5683, 0x5684, 0x5687, 0x5688, 0x5689, 0x568A, 0x568B, 0x568C, 0x568D, 0x5690, 0x5691, 0x5692, 0x5694, 0x5695, 0x5696, 0x5697, 0x5698, 0x5699, 0x569A, 0x569B, 0x569C, 0x569D, 0x569E, 0x569F, 0x56A0, 0x56A1, 0x56A2, 0x56A4, 0x56A5, 0x56A6, 0x56A7, 0x56A8, 0x56A9, 0x56AA, 0x56AB, 0x56AC, 0x56AD, 0x56AE, 0x56B0, 0x56B1, 0x56B2, 0x56B3, 0x56B4, 0x56B5, 0x56B6, 0x56B8, 0x56B9, 0x56BA, 0x56BB, 0x56BD, 0x56BE, 0x56BF, 0x56C0, 0x56C1, 0x56C2, 0x56C3, 0x56C4, 0x56C5, 0x56C6, 0x56C7, 0x56C8, 0x56C9, 0x56CB, 0x56CC, 0x56CD, 0x56CE, 0x56CF, 0x56D0, 0x56D1, 0x56D2, 0x56D3, 0x56D5, 0x56D6, 0x56D8, 0x56D9, 0x56DC, 0x56E3, 0x56E5, 0x56E6, 0x56E7, 0x56E8, 0x56E9, 0x56EA, 0x56EC, 0x56EE, 0x56EF, 0x56F2, 0x56F3, 0x56F6, 0x56F7, 0x56F8, 0x56FB, 0x56FC, 0x5700, 0x5701, 0x5702, 0x5705, 0x5707, 0x570B, 0x570C, 0x570D, 0x570E, 0x570F, 0x5710, 0x5711 }, { 0x5712, 0x5713, 0x5714, 0x5715, 0x5716, 0x5717, 0x5718, 0x5719, 0x571A, 0x571B, 0x571D, 0x571E, 0x5720, 0x5721, 0x5722, 0x5724, 0x5725, 0x5726, 0x5727, 0x572B, 0x5731, 0x5732, 0x5734, 0x5735, 0x5736, 0x5737, 0x5738, 0x573C, 0x573D, 0x573F, 0x5741, 0x5743, 0x5744, 0x5745, 0x5746, 0x5748, 0x5749, 0x574B, 0x5752, 0x5753, 0x5754, 0x5755, 0x5756, 0x5758, 0x5759, 0x5762, 0x5763, 0x5765, 0x5767, 0x576C, 0x576E, 0x5770, 0x5771, 0x5772, 0x5774, 0x5775, 0x5778, 0x5779, 0x577A, 0x577D, 0x577E, 0x577F, 0x5780, 0x003F, 0x5781, 0x5787, 0x5788, 0x5789, 0x578A, 0x578D, 0x578E, 0x578F, 0x5790, 0x5791, 0x5794, 0x5795, 0x5796, 0x5797, 0x5798, 0x5799, 0x579A, 0x579C, 0x579D, 0x579E, 0x579F, 0x57A5, 0x57A8, 0x57AA, 0x57AC, 0x57AF, 0x57B0, 0x57B1, 0x57B3, 0x57B5, 0x57B6, 0x57B7, 0x57B9, 0x57BA, 0x57BB, 0x57BC, 0x57BD, 0x57BE, 0x57BF, 0x57C0, 0x57C1, 0x57C4, 0x57C5, 0x57C6, 0x57C7, 0x57C8, 0x57C9, 0x57CA, 0x57CC, 0x57CD, 0x57D0, 0x57D1, 0x57D3, 0x57D6, 0x57D7, 0x57DB, 0x57DC, 0x57DE, 0x57E1, 0x57E2, 0x57E3, 0x57E5, 0x57E6, 0x57E7, 0x57E8, 0x57E9, 0x57EA, 0x57EB, 0x57EC, 0x57EE, 0x57F0, 0x57F1, 0x57F2, 0x57F3, 0x57F5, 0x57F6, 0x57F7, 0x57FB, 0x57FC, 0x57FE, 0x57FF, 0x5801, 0x5803, 0x5804, 0x5805, 0x5808, 0x5809, 0x580A, 0x580C, 0x580E, 0x580F, 0x5810, 0x5812, 0x5813, 0x5814, 0x5816, 0x5817, 0x5818, 0x581A, 0x581B, 0x581C, 0x581D, 0x581F, 0x5822, 0x5823, 0x5825, 0x5826, 0x5827, 0x5828, 0x5829, 0x582B, 0x582C, 0x582D, 0x582E, 0x582F, 0x5831, 0x5832, 0x5833, 0x5834, 0x5836, 0x5837, 0x5838, 0x5839, 0x583A, 0x583B, 0x583C, 0x583D }, { 0x583E, 0x583F, 0x5840, 0x5841, 0x5842, 0x5843, 0x5845, 0x5846, 0x5847, 0x5848, 0x5849, 0x584A, 0x584B, 0x584E, 0x584F, 0x5850, 0x5852, 0x5853, 0x5855, 0x5856, 0x5857, 0x5859, 0x585A, 0x585B, 0x585C, 0x585D, 0x585F, 0x5860, 0x5861, 0x5862, 0x5863, 0x5864, 0x5866, 0x5867, 0x5868, 0x5869, 0x586A, 0x586D, 0x586E, 0x586F, 0x5870, 0x5871, 0x5872, 0x5873, 0x5874, 0x5875, 0x5876, 0x5877, 0x5878, 0x5879, 0x587A, 0x587B, 0x587C, 0x587D, 0x587F, 0x5882, 0x5884, 0x5886, 0x5887, 0x5888, 0x588A, 0x588B, 0x588C, 0x003F, 0x588D, 0x588E, 0x588F, 0x5890, 0x5891, 0x5894, 0x5895, 0x5896, 0x5897, 0x5898, 0x589B, 0x589C, 0x589D, 0x58A0, 0x58A1, 0x58A2, 0x58A3, 0x58A4, 0x58A5, 0x58A6, 0x58A7, 0x58AA, 0x58AB, 0x58AC, 0x58AD, 0x58AE, 0x58AF, 0x58B0, 0x58B1, 0x58B2, 0x58B3, 0x58B4, 0x58B5, 0x58B6, 0x58B7, 0x58B8, 0x58B9, 0x58BA, 0x58BB, 0x58BD, 0x58BE, 0x58BF, 0x58C0, 0x58C2, 0x58C3, 0x58C4, 0x58C6, 0x58C7, 0x58C8, 0x58C9, 0x58CA, 0x58CB, 0x58CC, 0x58CD, 0x58CE, 0x58CF, 0x58D0, 0x58D2, 0x58D3, 0x58D4, 0x58D6, 0x58D7, 0x58D8, 0x58D9, 0x58DA, 0x58DB, 0x58DC, 0x58DD, 0x58DE, 0x58DF, 0x58E0, 0x58E1, 0x58E2, 0x58E3, 0x58E5, 0x58E6, 0x58E7, 0x58E8, 0x58E9, 0x58EA, 0x58ED, 0x58EF, 0x58F1, 0x58F2, 0x58F4, 0x58F5, 0x58F7, 0x58F8, 0x58FA, 0x58FB, 0x58FC, 0x58FD, 0x58FE, 0x58FF, 0x5900, 0x5901, 0x5903, 0x5905, 0x5906, 0x5908, 0x5909, 0x590A, 0x590B, 0x590C, 0x590E, 0x5910, 0x5911, 0x5912, 0x5913, 0x5917, 0x5918, 0x591B, 0x591D, 0x591E, 0x5920, 0x5921, 0x5922, 0x5923, 0x5926, 0x5928, 0x592C, 0x5930, 0x5932, 0x5933, 0x5935, 0x5936, 0x593B }, { 0x593D, 0x593E, 0x593F, 0x5940, 0x5943, 0x5945, 0x5946, 0x594A, 0x594C, 0x594D, 0x5950, 0x5952, 0x5953, 0x5959, 0x595B, 0x595C, 0x595D, 0x595E, 0x595F, 0x5961, 0x5963, 0x5964, 0x5966, 0x5967, 0x5968, 0x5969, 0x596A, 0x596B, 0x596C, 0x596D, 0x596E, 0x596F, 0x5970, 0x5971, 0x5972, 0x5975, 0x5977, 0x597A, 0x597B, 0x597C, 0x597E, 0x597F, 0x5980, 0x5985, 0x5989, 0x598B, 0x598C, 0x598E, 0x598F, 0x5990, 0x5991, 0x5994, 0x5995, 0x5998, 0x599A, 0x599B, 0x599C, 0x599D, 0x599F, 0x59A0, 0x59A1, 0x59A2, 0x59A6, 0x003F, 0x59A7, 0x59AC, 0x59AD, 0x59B0, 0x59B1, 0x59B3, 0x59B4, 0x59B5, 0x59B6, 0x59B7, 0x59B8, 0x59BA, 0x59BC, 0x59BD, 0x59BF, 0x59C0, 0x59C1, 0x59C2, 0x59C3, 0x59C4, 0x59C5, 0x59C7, 0x59C8, 0x59C9, 0x59CC, 0x59CD, 0x59CE, 0x59CF, 0x59D5, 0x59D6, 0x59D9, 0x59DB, 0x59DE, 0x59DF, 0x59E0, 0x59E1, 0x59E2, 0x59E4, 0x59E6, 0x59E7, 0x59E9, 0x59EA, 0x59EB, 0x59ED, 0x59EE, 0x59EF, 0x59F0, 0x59F1, 0x59F2, 0x59F3, 0x59F4, 0x59F5, 0x59F6, 0x59F7, 0x59F8, 0x59FA, 0x59FC, 0x59FD, 0x59FE, 0x5A00, 0x5A02, 0x5A0A, 0x5A0B, 0x5A0D, 0x5A0E, 0x5A0F, 0x5A10, 0x5A12, 0x5A14, 0x5A15, 0x5A16, 0x5A17, 0x5A19, 0x5A1A, 0x5A1B, 0x5A1D, 0x5A1E, 0x5A21, 0x5A22, 0x5A24, 0x5A26, 0x5A27, 0x5A28, 0x5A2A, 0x5A2B, 0x5A2C, 0x5A2D, 0x5A2E, 0x5A2F, 0x5A30, 0x5A33, 0x5A35, 0x5A37, 0x5A38, 0x5A39, 0x5A3A, 0x5A3B, 0x5A3D, 0x5A3E, 0x5A3F, 0x5A41, 0x5A42, 0x5A43, 0x5A44, 0x5A45, 0x5A47, 0x5A48, 0x5A4B, 0x5A4C, 0x5A4D, 0x5A4E, 0x5A4F, 0x5A50, 0x5A51, 0x5A52, 0x5A53, 0x5A54, 0x5A56, 0x5A57, 0x5A58, 0x5A59, 0x5A5B, 0x5A5C, 0x5A5D, 0x5A5E, 0x5A5F, 0x5A60 }, { 0x5A61, 0x5A63, 0x5A64, 0x5A65, 0x5A66, 0x5A68, 0x5A69, 0x5A6B, 0x5A6C, 0x5A6D, 0x5A6E, 0x5A6F, 0x5A70, 0x5A71, 0x5A72, 0x5A73, 0x5A78, 0x5A79, 0x5A7B, 0x5A7C, 0x5A7D, 0x5A7E, 0x5A80, 0x5A81, 0x5A82, 0x5A83, 0x5A84, 0x5A85, 0x5A86, 0x5A87, 0x5A88, 0x5A89, 0x5A8A, 0x5A8B, 0x5A8C, 0x5A8D, 0x5A8E, 0x5A8F, 0x5A90, 0x5A91, 0x5A93, 0x5A94, 0x5A95, 0x5A96, 0x5A97, 0x5A98, 0x5A99, 0x5A9C, 0x5A9D, 0x5A9E, 0x5A9F, 0x5AA0, 0x5AA1, 0x5AA2, 0x5AA3, 0x5AA4, 0x5AA5, 0x5AA6, 0x5AA7, 0x5AA8, 0x5AA9, 0x5AAB, 0x5AAC, 0x003F, 0x5AAD, 0x5AAE, 0x5AAF, 0x5AB0, 0x5AB1, 0x5AB4, 0x5AB6, 0x5AB7, 0x5AB9, 0x5ABA, 0x5ABB, 0x5ABC, 0x5ABD, 0x5ABF, 0x5AC0, 0x5AC3, 0x5AC4, 0x5AC5, 0x5AC6, 0x5AC7, 0x5AC8, 0x5ACA, 0x5ACB, 0x5ACD, 0x5ACE, 0x5ACF, 0x5AD0, 0x5AD1, 0x5AD3, 0x5AD5, 0x5AD7, 0x5AD9, 0x5ADA, 0x5ADB, 0x5ADD, 0x5ADE, 0x5ADF, 0x5AE2, 0x5AE4, 0x5AE5, 0x5AE7, 0x5AE8, 0x5AEA, 0x5AEC, 0x5AED, 0x5AEE, 0x5AEF, 0x5AF0, 0x5AF2, 0x5AF3, 0x5AF4, 0x5AF5, 0x5AF6, 0x5AF7, 0x5AF8, 0x5AF9, 0x5AFA, 0x5AFB, 0x5AFC, 0x5AFD, 0x5AFE, 0x5AFF, 0x5B00, 0x5B01, 0x5B02, 0x5B03, 0x5B04, 0x5B05, 0x5B06, 0x5B07, 0x5B08, 0x5B0A, 0x5B0B, 0x5B0C, 0x5B0D, 0x5B0E, 0x5B0F, 0x5B10, 0x5B11, 0x5B12, 0x5B13, 0x5B14, 0x5B15, 0x5B18, 0x5B19, 0x5B1A, 0x5B1B, 0x5B1C, 0x5B1D, 0x5B1E, 0x5B1F, 0x5B20, 0x5B21, 0x5B22, 0x5B23, 0x5B24, 0x5B25, 0x5B26, 0x5B27, 0x5B28, 0x5B29, 0x5B2A, 0x5B2B, 0x5B2C, 0x5B2D, 0x5B2E, 0x5B2F, 0x5B30, 0x5B31, 0x5B33, 0x5B35, 0x5B36, 0x5B38, 0x5B39, 0x5B3A, 0x5B3B, 0x5B3C, 0x5B3D, 0x5B3E, 0x5B3F, 0x5B41, 0x5B42, 0x5B43, 0x5B44, 0x5B45, 0x5B46, 0x5B47 }, { 0x5B48, 0x5B49, 0x5B4A, 0x5B4B, 0x5B4C, 0x5B4D, 0x5B4E, 0x5B4F, 0x5B52, 0x5B56, 0x5B5E, 0x5B60, 0x5B61, 0x5B67, 0x5B68, 0x5B6B, 0x5B6D, 0x5B6E, 0x5B6F, 0x5B72, 0x5B74, 0x5B76, 0x5B77, 0x5B78, 0x5B79, 0x5B7B, 0x5B7C, 0x5B7E, 0x5B7F, 0x5B82, 0x5B86, 0x5B8A, 0x5B8D, 0x5B8E, 0x5B90, 0x5B91, 0x5B92, 0x5B94, 0x5B96, 0x5B9F, 0x5BA7, 0x5BA8, 0x5BA9, 0x5BAC, 0x5BAD, 0x5BAE, 0x5BAF, 0x5BB1, 0x5BB2, 0x5BB7, 0x5BBA, 0x5BBB, 0x5BBC, 0x5BC0, 0x5BC1, 0x5BC3, 0x5BC8, 0x5BC9, 0x5BCA, 0x5BCB, 0x5BCD, 0x5BCE, 0x5BCF, 0x003F, 0x5BD1, 0x5BD4, 0x5BD5, 0x5BD6, 0x5BD7, 0x5BD8, 0x5BD9, 0x5BDA, 0x5BDB, 0x5BDC, 0x5BE0, 0x5BE2, 0x5BE3, 0x5BE6, 0x5BE7, 0x5BE9, 0x5BEA, 0x5BEB, 0x5BEC, 0x5BED, 0x5BEF, 0x5BF1, 0x5BF2, 0x5BF3, 0x5BF4, 0x5BF5, 0x5BF6, 0x5BF7, 0x5BFD, 0x5BFE, 0x5C00, 0x5C02, 0x5C03, 0x5C05, 0x5C07, 0x5C08, 0x5C0B, 0x5C0C, 0x5C0D, 0x5C0E, 0x5C10, 0x5C12, 0x5C13, 0x5C17, 0x5C19, 0x5C1B, 0x5C1E, 0x5C1F, 0x5C20, 0x5C21, 0x5C23, 0x5C26, 0x5C28, 0x5C29, 0x5C2A, 0x5C2B, 0x5C2D, 0x5C2E, 0x5C2F, 0x5C30, 0x5C32, 0x5C33, 0x5C35, 0x5C36, 0x5C37, 0x5C43, 0x5C44, 0x5C46, 0x5C47, 0x5C4C, 0x5C4D, 0x5C52, 0x5C53, 0x5C54, 0x5C56, 0x5C57, 0x5C58, 0x5C5A, 0x5C5B, 0x5C5C, 0x5C5D, 0x5C5F, 0x5C62, 0x5C64, 0x5C67, 0x5C68, 0x5C69, 0x5C6A, 0x5C6B, 0x5C6C, 0x5C6D, 0x5C70, 0x5C72, 0x5C73, 0x5C74, 0x5C75, 0x5C76, 0x5C77, 0x5C78, 0x5C7B, 0x5C7C, 0x5C7D, 0x5C7E, 0x5C80, 0x5C83, 0x5C84, 0x5C85, 0x5C86, 0x5C87, 0x5C89, 0x5C8A, 0x5C8B, 0x5C8E, 0x5C8F, 0x5C92, 0x5C93, 0x5C95, 0x5C9D, 0x5C9E, 0x5C9F, 0x5CA0, 0x5CA1, 0x5CA4, 0x5CA5, 0x5CA6, 0x5CA7, 0x5CA8 }, { 0x5CAA, 0x5CAE, 0x5CAF, 0x5CB0, 0x5CB2, 0x5CB4, 0x5CB6, 0x5CB9, 0x5CBA, 0x5CBB, 0x5CBC, 0x5CBE, 0x5CC0, 0x5CC2, 0x5CC3, 0x5CC5, 0x5CC6, 0x5CC7, 0x5CC8, 0x5CC9, 0x5CCA, 0x5CCC, 0x5CCD, 0x5CCE, 0x5CCF, 0x5CD0, 0x5CD1, 0x5CD3, 0x5CD4, 0x5CD5, 0x5CD6, 0x5CD7, 0x5CD8, 0x5CDA, 0x5CDB, 0x5CDC, 0x5CDD, 0x5CDE, 0x5CDF, 0x5CE0, 0x5CE2, 0x5CE3, 0x5CE7, 0x5CE9, 0x5CEB, 0x5CEC, 0x5CEE, 0x5CEF, 0x5CF1, 0x5CF2, 0x5CF3, 0x5CF4, 0x5CF5, 0x5CF6, 0x5CF7, 0x5CF8, 0x5CF9, 0x5CFA, 0x5CFC, 0x5CFD, 0x5CFE, 0x5CFF, 0x5D00, 0x003F, 0x5D01, 0x5D04, 0x5D05, 0x5D08, 0x5D09, 0x5D0A, 0x5D0B, 0x5D0C, 0x5D0D, 0x5D0F, 0x5D10, 0x5D11, 0x5D12, 0x5D13, 0x5D15, 0x5D17, 0x5D18, 0x5D19, 0x5D1A, 0x5D1C, 0x5D1D, 0x5D1F, 0x5D20, 0x5D21, 0x5D22, 0x5D23, 0x5D25, 0x5D28, 0x5D2A, 0x5D2B, 0x5D2C, 0x5D2F, 0x5D30, 0x5D31, 0x5D32, 0x5D33, 0x5D35, 0x5D36, 0x5D37, 0x5D38, 0x5D39, 0x5D3A, 0x5D3B, 0x5D3C, 0x5D3F, 0x5D40, 0x5D41, 0x5D42, 0x5D43, 0x5D44, 0x5D45, 0x5D46, 0x5D48, 0x5D49, 0x5D4D, 0x5D4E, 0x5D4F, 0x5D50, 0x5D51, 0x5D52, 0x5D53, 0x5D54, 0x5D55, 0x5D56, 0x5D57, 0x5D59, 0x5D5A, 0x5D5C, 0x5D5E, 0x5D5F, 0x5D60, 0x5D61, 0x5D62, 0x5D63, 0x5D64, 0x5D65, 0x5D66, 0x5D67, 0x5D68, 0x5D6A, 0x5D6D, 0x5D6E, 0x5D70, 0x5D71, 0x5D72, 0x5D73, 0x5D75, 0x5D76, 0x5D77, 0x5D78, 0x5D79, 0x5D7A, 0x5D7B, 0x5D7C, 0x5D7D, 0x5D7E, 0x5D7F, 0x5D80, 0x5D81, 0x5D83, 0x5D84, 0x5D85, 0x5D86, 0x5D87, 0x5D88, 0x5D89, 0x5D8A, 0x5D8B, 0x5D8C, 0x5D8D, 0x5D8E, 0x5D8F, 0x5D90, 0x5D91, 0x5D92, 0x5D93, 0x5D94, 0x5D95, 0x5D96, 0x5D97, 0x5D98, 0x5D9A, 0x5D9B, 0x5D9C, 0x5D9E, 0x5D9F, 0x5DA0 }, { 0x5DA1, 0x5DA2, 0x5DA3, 0x5DA4, 0x5DA5, 0x5DA6, 0x5DA7, 0x5DA8, 0x5DA9, 0x5DAA, 0x5DAB, 0x5DAC, 0x5DAD, 0x5DAE, 0x5DAF, 0x5DB0, 0x5DB1, 0x5DB2, 0x5DB3, 0x5DB4, 0x5DB5, 0x5DB6, 0x5DB8, 0x5DB9, 0x5DBA, 0x5DBB, 0x5DBC, 0x5DBD, 0x5DBE, 0x5DBF, 0x5DC0, 0x5DC1, 0x5DC2, 0x5DC3, 0x5DC4, 0x5DC6, 0x5DC7, 0x5DC8, 0x5DC9, 0x5DCA, 0x5DCB, 0x5DCC, 0x5DCE, 0x5DCF, 0x5DD0, 0x5DD1, 0x5DD2, 0x5DD3, 0x5DD4, 0x5DD5, 0x5DD6, 0x5DD7, 0x5DD8, 0x5DD9, 0x5DDA, 0x5DDC, 0x5DDF, 0x5DE0, 0x5DE3, 0x5DE4, 0x5DEA, 0x5DEC, 0x5DED, 0x003F, 0x5DF0, 0x5DF5, 0x5DF6, 0x5DF8, 0x5DF9, 0x5DFA, 0x5DFB, 0x5DFC, 0x5DFF, 0x5E00, 0x5E04, 0x5E07, 0x5E09, 0x5E0A, 0x5E0B, 0x5E0D, 0x5E0E, 0x5E12, 0x5E13, 0x5E17, 0x5E1E, 0x5E1F, 0x5E20, 0x5E21, 0x5E22, 0x5E23, 0x5E24, 0x5E25, 0x5E28, 0x5E29, 0x5E2A, 0x5E2B, 0x5E2C, 0x5E2F, 0x5E30, 0x5E32, 0x5E33, 0x5E34, 0x5E35, 0x5E36, 0x5E39, 0x5E3A, 0x5E3E, 0x5E3F, 0x5E40, 0x5E41, 0x5E43, 0x5E46, 0x5E47, 0x5E48, 0x5E49, 0x5E4A, 0x5E4B, 0x5E4D, 0x5E4E, 0x5E4F, 0x5E50, 0x5E51, 0x5E52, 0x5E53, 0x5E56, 0x5E57, 0x5E58, 0x5E59, 0x5E5A, 0x5E5C, 0x5E5D, 0x5E5F, 0x5E60, 0x5E63, 0x5E64, 0x5E65, 0x5E66, 0x5E67, 0x5E68, 0x5E69, 0x5E6A, 0x5E6B, 0x5E6C, 0x5E6D, 0x5E6E, 0x5E6F, 0x5E70, 0x5E71, 0x5E75, 0x5E77, 0x5E79, 0x5E7E, 0x5E81, 0x5E82, 0x5E83, 0x5E85, 0x5E88, 0x5E89, 0x5E8C, 0x5E8D, 0x5E8E, 0x5E92, 0x5E98, 0x5E9B, 0x5E9D, 0x5EA1, 0x5EA2, 0x5EA3, 0x5EA4, 0x5EA8, 0x5EA9, 0x5EAA, 0x5EAB, 0x5EAC, 0x5EAE, 0x5EAF, 0x5EB0, 0x5EB1, 0x5EB2, 0x5EB4, 0x5EBA, 0x5EBB, 0x5EBC, 0x5EBD, 0x5EBF, 0x5EC0, 0x5EC1, 0x5EC2, 0x5EC3, 0x5EC4, 0x5EC5 }, { 0x5EC6, 0x5EC7, 0x5EC8, 0x5ECB, 0x5ECC, 0x5ECD, 0x5ECE, 0x5ECF, 0x5ED0, 0x5ED4, 0x5ED5, 0x5ED7, 0x5ED8, 0x5ED9, 0x5EDA, 0x5EDC, 0x5EDD, 0x5EDE, 0x5EDF, 0x5EE0, 0x5EE1, 0x5EE2, 0x5EE3, 0x5EE4, 0x5EE5, 0x5EE6, 0x5EE7, 0x5EE9, 0x5EEB, 0x5EEC, 0x5EED, 0x5EEE, 0x5EEF, 0x5EF0, 0x5EF1, 0x5EF2, 0x5EF3, 0x5EF5, 0x5EF8, 0x5EF9, 0x5EFB, 0x5EFC, 0x5EFD, 0x5F05, 0x5F06, 0x5F07, 0x5F09, 0x5F0C, 0x5F0D, 0x5F0E, 0x5F10, 0x5F12, 0x5F14, 0x5F16, 0x5F19, 0x5F1A, 0x5F1C, 0x5F1D, 0x5F1E, 0x5F21, 0x5F22, 0x5F23, 0x5F24, 0x003F, 0x5F28, 0x5F2B, 0x5F2C, 0x5F2E, 0x5F30, 0x5F32, 0x5F33, 0x5F34, 0x5F35, 0x5F36, 0x5F37, 0x5F38, 0x5F3B, 0x5F3D, 0x5F3E, 0x5F3F, 0x5F41, 0x5F42, 0x5F43, 0x5F44, 0x5F45, 0x5F46, 0x5F47, 0x5F48, 0x5F49, 0x5F4A, 0x5F4B, 0x5F4C, 0x5F4D, 0x5F4E, 0x5F4F, 0x5F51, 0x5F54, 0x5F59, 0x5F5A, 0x5F5B, 0x5F5C, 0x5F5E, 0x5F5F, 0x5F60, 0x5F63, 0x5F65, 0x5F67, 0x5F68, 0x5F6B, 0x5F6E, 0x5F6F, 0x5F72, 0x5F74, 0x5F75, 0x5F76, 0x5F78, 0x5F7A, 0x5F7D, 0x5F7E, 0x5F7F, 0x5F83, 0x5F86, 0x5F8D, 0x5F8E, 0x5F8F, 0x5F91, 0x5F93, 0x5F94, 0x5F96, 0x5F9A, 0x5F9B, 0x5F9D, 0x5F9E, 0x5F9F, 0x5FA0, 0x5FA2, 0x5FA3, 0x5FA4, 0x5FA5, 0x5FA6, 0x5FA7, 0x5FA9, 0x5FAB, 0x5FAC, 0x5FAF, 0x5FB0, 0x5FB1, 0x5FB2, 0x5FB3, 0x5FB4, 0x5FB6, 0x5FB8, 0x5FB9, 0x5FBA, 0x5FBB, 0x5FBE, 0x5FBF, 0x5FC0, 0x5FC1, 0x5FC2, 0x5FC7, 0x5FC8, 0x5FCA, 0x5FCB, 0x5FCE, 0x5FD3, 0x5FD4, 0x5FD5, 0x5FDA, 0x5FDB, 0x5FDC, 0x5FDE, 0x5FDF, 0x5FE2, 0x5FE3, 0x5FE5, 0x5FE6, 0x5FE8, 0x5FE9, 0x5FEC, 0x5FEF, 0x5FF0, 0x5FF2, 0x5FF3, 0x5FF4, 0x5FF6, 0x5FF7, 0x5FF9, 0x5FFA, 0x5FFC, 0x6007 }, { 0x6008, 0x6009, 0x600B, 0x600C, 0x6010, 0x6011, 0x6013, 0x6017, 0x6018, 0x601A, 0x601E, 0x601F, 0x6022, 0x6023, 0x6024, 0x602C, 0x602D, 0x602E, 0x6030, 0x6031, 0x6032, 0x6033, 0x6034, 0x6036, 0x6037, 0x6038, 0x6039, 0x603A, 0x603D, 0x603E, 0x6040, 0x6044, 0x6045, 0x6046, 0x6047, 0x6048, 0x6049, 0x604A, 0x604C, 0x604E, 0x604F, 0x6051, 0x6053, 0x6054, 0x6056, 0x6057, 0x6058, 0x605B, 0x605C, 0x605E, 0x605F, 0x6060, 0x6061, 0x6065, 0x6066, 0x606E, 0x6071, 0x6072, 0x6074, 0x6075, 0x6077, 0x607E, 0x6080, 0x003F, 0x6081, 0x6082, 0x6085, 0x6086, 0x6087, 0x6088, 0x608A, 0x608B, 0x608E, 0x608F, 0x6090, 0x6091, 0x6093, 0x6095, 0x6097, 0x6098, 0x6099, 0x609C, 0x609E, 0x60A1, 0x60A2, 0x60A4, 0x60A5, 0x60A7, 0x60A9, 0x60AA, 0x60AE, 0x60B0, 0x60B3, 0x60B5, 0x60B6, 0x60B7, 0x60B9, 0x60BA, 0x60BD, 0x60BE, 0x60BF, 0x60C0, 0x60C1, 0x60C2, 0x60C3, 0x60C4, 0x60C7, 0x60C8, 0x60C9, 0x60CC, 0x60CD, 0x60CE, 0x60CF, 0x60D0, 0x60D2, 0x60D3, 0x60D4, 0x60D6, 0x60D7, 0x60D9, 0x60DB, 0x60DE, 0x60E1, 0x60E2, 0x60E3, 0x60E4, 0x60E5, 0x60EA, 0x60F1, 0x60F2, 0x60F5, 0x60F7, 0x60F8, 0x60FB, 0x60FC, 0x60FD, 0x60FE, 0x60FF, 0x6102, 0x6103, 0x6104, 0x6105, 0x6107, 0x610A, 0x610B, 0x610C, 0x6110, 0x6111, 0x6112, 0x6113, 0x6114, 0x6116, 0x6117, 0x6118, 0x6119, 0x611B, 0x611C, 0x611D, 0x611E, 0x6121, 0x6122, 0x6125, 0x6128, 0x6129, 0x612A, 0x612C, 0x612D, 0x612E, 0x612F, 0x6130, 0x6131, 0x6132, 0x6133, 0x6134, 0x6135, 0x6136, 0x6137, 0x6138, 0x6139, 0x613A, 0x613B, 0x613C, 0x613D, 0x613E, 0x6140, 0x6141, 0x6142, 0x6143, 0x6144, 0x6145, 0x6146 }, { 0x6147, 0x6149, 0x614B, 0x614D, 0x614F, 0x6150, 0x6152, 0x6153, 0x6154, 0x6156, 0x6157, 0x6158, 0x6159, 0x615A, 0x615B, 0x615C, 0x615E, 0x615F, 0x6160, 0x6161, 0x6163, 0x6164, 0x6165, 0x6166, 0x6169, 0x616A, 0x616B, 0x616C, 0x616D, 0x616E, 0x616F, 0x6171, 0x6172, 0x6173, 0x6174, 0x6176, 0x6178, 0x6179, 0x617A, 0x617B, 0x617C, 0x617D, 0x617E, 0x617F, 0x6180, 0x6181, 0x6182, 0x6183, 0x6184, 0x6185, 0x6186, 0x6187, 0x6188, 0x6189, 0x618A, 0x618C, 0x618D, 0x618F, 0x6190, 0x6191, 0x6192, 0x6193, 0x6195, 0x003F, 0x6196, 0x6197, 0x6198, 0x6199, 0x619A, 0x619B, 0x619C, 0x619E, 0x619F, 0x61A0, 0x61A1, 0x61A2, 0x61A3, 0x61A4, 0x61A5, 0x61A6, 0x61AA, 0x61AB, 0x61AD, 0x61AE, 0x61AF, 0x61B0, 0x61B1, 0x61B2, 0x61B3, 0x61B4, 0x61B5, 0x61B6, 0x61B8, 0x61B9, 0x61BA, 0x61BB, 0x61BC, 0x61BD, 0x61BF, 0x61C0, 0x61C1, 0x61C3, 0x61C4, 0x61C5, 0x61C6, 0x61C7, 0x61C9, 0x61CC, 0x61CD, 0x61CE, 0x61CF, 0x61D0, 0x61D3, 0x61D5, 0x61D6, 0x61D7, 0x61D8, 0x61D9, 0x61DA, 0x61DB, 0x61DC, 0x61DD, 0x61DE, 0x61DF, 0x61E0, 0x61E1, 0x61E2, 0x61E3, 0x61E4, 0x61E5, 0x61E7, 0x61E8, 0x61E9, 0x61EA, 0x61EB, 0x61EC, 0x61ED, 0x61EE, 0x61EF, 0x61F0, 0x61F1, 0x61F2, 0x61F3, 0x61F4, 0x61F6, 0x61F7, 0x61F8, 0x61F9, 0x61FA, 0x61FB, 0x61FC, 0x61FD, 0x61FE, 0x6200, 0x6201, 0x6202, 0x6203, 0x6204, 0x6205, 0x6207, 0x6209, 0x6213, 0x6214, 0x6219, 0x621C, 0x621D, 0x621E, 0x6220, 0x6223, 0x6226, 0x6227, 0x6228, 0x6229, 0x622B, 0x622D, 0x622F, 0x6230, 0x6231, 0x6232, 0x6235, 0x6236, 0x6238, 0x6239, 0x623A, 0x623B, 0x623C, 0x6242, 0x6244, 0x6245, 0x6246, 0x624A }, { 0x624F, 0x6250, 0x6255, 0x6256, 0x6257, 0x6259, 0x625A, 0x625C, 0x625D, 0x625E, 0x625F, 0x6260, 0x6261, 0x6262, 0x6264, 0x6265, 0x6268, 0x6271, 0x6272, 0x6274, 0x6275, 0x6277, 0x6278, 0x627A, 0x627B, 0x627D, 0x6281, 0x6282, 0x6283, 0x6285, 0x6286, 0x6287, 0x6288, 0x628B, 0x628C, 0x628D, 0x628E, 0x628F, 0x6290, 0x6294, 0x6299, 0x629C, 0x629D, 0x629E, 0x62A3, 0x62A6, 0x62A7, 0x62A9, 0x62AA, 0x62AD, 0x62AE, 0x62AF, 0x62B0, 0x62B2, 0x62B3, 0x62B4, 0x62B6, 0x62B7, 0x62B8, 0x62BA, 0x62BE, 0x62C0, 0x62C1, 0x003F, 0x62C3, 0x62CB, 0x62CF, 0x62D1, 0x62D5, 0x62DD, 0x62DE, 0x62E0, 0x62E1, 0x62E4, 0x62EA, 0x62EB, 0x62F0, 0x62F2, 0x62F5, 0x62F8, 0x62F9, 0x62FA, 0x62FB, 0x6300, 0x6303, 0x6304, 0x6305, 0x6306, 0x630A, 0x630B, 0x630C, 0x630D, 0x630F, 0x6310, 0x6312, 0x6313, 0x6314, 0x6315, 0x6317, 0x6318, 0x6319, 0x631C, 0x6326, 0x6327, 0x6329, 0x632C, 0x632D, 0x632E, 0x6330, 0x6331, 0x6333, 0x6334, 0x6335, 0x6336, 0x6337, 0x6338, 0x633B, 0x633C, 0x633E, 0x633F, 0x6340, 0x6341, 0x6344, 0x6347, 0x6348, 0x634A, 0x6351, 0x6352, 0x6353, 0x6354, 0x6356, 0x6357, 0x6358, 0x6359, 0x635A, 0x635B, 0x635C, 0x635D, 0x6360, 0x6364, 0x6365, 0x6366, 0x6368, 0x636A, 0x636B, 0x636C, 0x636F, 0x6370, 0x6372, 0x6373, 0x6374, 0x6375, 0x6378, 0x6379, 0x637C, 0x637D, 0x637E, 0x637F, 0x6381, 0x6383, 0x6384, 0x6385, 0x6386, 0x638B, 0x638D, 0x6391, 0x6393, 0x6394, 0x6395, 0x6397, 0x6399, 0x639A, 0x639B, 0x639C, 0x639D, 0x639E, 0x639F, 0x63A1, 0x63A4, 0x63A6, 0x63AB, 0x63AF, 0x63B1, 0x63B2, 0x63B5, 0x63B6, 0x63B9, 0x63BB, 0x63BD, 0x63BF, 0x63C0 }, { 0x63C1, 0x63C2, 0x63C3, 0x63C5, 0x63C7, 0x63C8, 0x63CA, 0x63CB, 0x63CC, 0x63D1, 0x63D3, 0x63D4, 0x63D5, 0x63D7, 0x63D8, 0x63D9, 0x63DA, 0x63DB, 0x63DC, 0x63DD, 0x63DF, 0x63E2, 0x63E4, 0x63E5, 0x63E6, 0x63E7, 0x63E8, 0x63EB, 0x63EC, 0x63EE, 0x63EF, 0x63F0, 0x63F1, 0x63F3, 0x63F5, 0x63F7, 0x63F9, 0x63FA, 0x63FB, 0x63FC, 0x63FE, 0x6403, 0x6404, 0x6406, 0x6407, 0x6408, 0x6409, 0x640A, 0x640D, 0x640E, 0x6411, 0x6412, 0x6415, 0x6416, 0x6417, 0x6418, 0x6419, 0x641A, 0x641D, 0x641F, 0x6422, 0x6423, 0x6424, 0x003F, 0x6425, 0x6427, 0x6428, 0x6429, 0x642B, 0x642E, 0x642F, 0x6430, 0x6431, 0x6432, 0x6433, 0x6435, 0x6436, 0x6437, 0x6438, 0x6439, 0x643B, 0x643C, 0x643E, 0x6440, 0x6442, 0x6443, 0x6449, 0x644B, 0x644C, 0x644D, 0x644E, 0x644F, 0x6450, 0x6451, 0x6453, 0x6455, 0x6456, 0x6457, 0x6459, 0x645A, 0x645B, 0x645C, 0x645D, 0x645F, 0x6460, 0x6461, 0x6462, 0x6463, 0x6464, 0x6465, 0x6466, 0x6468, 0x646A, 0x646B, 0x646C, 0x646E, 0x646F, 0x6470, 0x6471, 0x6472, 0x6473, 0x6474, 0x6475, 0x6476, 0x6477, 0x647B, 0x647C, 0x647D, 0x647E, 0x647F, 0x6480, 0x6481, 0x6483, 0x6486, 0x6488, 0x6489, 0x648A, 0x648B, 0x648C, 0x648D, 0x648E, 0x648F, 0x6490, 0x6493, 0x6494, 0x6497, 0x6498, 0x649A, 0x649B, 0x649C, 0x649D, 0x649F, 0x64A0, 0x64A1, 0x64A2, 0x64A3, 0x64A5, 0x64A6, 0x64A7, 0x64A8, 0x64AA, 0x64AB, 0x64AF, 0x64B1, 0x64B2, 0x64B3, 0x64B4, 0x64B6, 0x64B9, 0x64BB, 0x64BD, 0x64BE, 0x64BF, 0x64C1, 0x64C3, 0x64C4, 0x64C6, 0x64C7, 0x64C8, 0x64C9, 0x64CA, 0x64CB, 0x64CC, 0x64CF, 0x64D1, 0x64D3, 0x64D4, 0x64D5, 0x64D6, 0x64D9, 0x64DA }, { 0x64DB, 0x64DC, 0x64DD, 0x64DF, 0x64E0, 0x64E1, 0x64E3, 0x64E5, 0x64E7, 0x64E8, 0x64E9, 0x64EA, 0x64EB, 0x64EC, 0x64ED, 0x64EE, 0x64EF, 0x64F0, 0x64F1, 0x64F2, 0x64F3, 0x64F4, 0x64F5, 0x64F6, 0x64F7, 0x64F8, 0x64F9, 0x64FA, 0x64FB, 0x64FC, 0x64FD, 0x64FE, 0x64FF, 0x6501, 0x6502, 0x6503, 0x6504, 0x6505, 0x6506, 0x6507, 0x6508, 0x650A, 0x650B, 0x650C, 0x650D, 0x650E, 0x650F, 0x6510, 0x6511, 0x6513, 0x6514, 0x6515, 0x6516, 0x6517, 0x6519, 0x651A, 0x651B, 0x651C, 0x651D, 0x651E, 0x651F, 0x6520, 0x6521, 0x003F, 0x6522, 0x6523, 0x6524, 0x6526, 0x6527, 0x6528, 0x6529, 0x652A, 0x652C, 0x652D, 0x6530, 0x6531, 0x6532, 0x6533, 0x6537, 0x653A, 0x653C, 0x653D, 0x6540, 0x6541, 0x6542, 0x6543, 0x6544, 0x6546, 0x6547, 0x654A, 0x654B, 0x654D, 0x654E, 0x6550, 0x6552, 0x6553, 0x6554, 0x6557, 0x6558, 0x655A, 0x655C, 0x655F, 0x6560, 0x6561, 0x6564, 0x6565, 0x6567, 0x6568, 0x6569, 0x656A, 0x656D, 0x656E, 0x656F, 0x6571, 0x6573, 0x6575, 0x6576, 0x6578, 0x6579, 0x657A, 0x657B, 0x657C, 0x657D, 0x657E, 0x657F, 0x6580, 0x6581, 0x6582, 0x6583, 0x6584, 0x6585, 0x6586, 0x6588, 0x6589, 0x658A, 0x658D, 0x658E, 0x658F, 0x6592, 0x6594, 0x6595, 0x6596, 0x6598, 0x659A, 0x659D, 0x659E, 0x65A0, 0x65A2, 0x65A3, 0x65A6, 0x65A8, 0x65AA, 0x65AC, 0x65AE, 0x65B1, 0x65B2, 0x65B3, 0x65B4, 0x65B5, 0x65B6, 0x65B7, 0x65B8, 0x65BA, 0x65BB, 0x65BE, 0x65BF, 0x65C0, 0x65C2, 0x65C7, 0x65C8, 0x65C9, 0x65CA, 0x65CD, 0x65D0, 0x65D1, 0x65D3, 0x65D4, 0x65D5, 0x65D8, 0x65D9, 0x65DA, 0x65DB, 0x65DC, 0x65DD, 0x65DE, 0x65DF, 0x65E1, 0x65E3, 0x65E4, 0x65EA, 0x65EB }, { 0x65F2, 0x65F3, 0x65F4, 0x65F5, 0x65F8, 0x65F9, 0x65FB, 0x65FC, 0x65FD, 0x65FE, 0x65FF, 0x6601, 0x6604, 0x6605, 0x6607, 0x6608, 0x6609, 0x660B, 0x660D, 0x6610, 0x6611, 0x6612, 0x6616, 0x6617, 0x6618, 0x661A, 0x661B, 0x661C, 0x661E, 0x6621, 0x6622, 0x6623, 0x6624, 0x6626, 0x6629, 0x662A, 0x662B, 0x662C, 0x662E, 0x6630, 0x6632, 0x6633, 0x6637, 0x6638, 0x6639, 0x663A, 0x663B, 0x663D, 0x663F, 0x6640, 0x6642, 0x6644, 0x6645, 0x6646, 0x6647, 0x6648, 0x6649, 0x664A, 0x664D, 0x664E, 0x6650, 0x6651, 0x6658, 0x003F, 0x6659, 0x665B, 0x665C, 0x665D, 0x665E, 0x6660, 0x6662, 0x6663, 0x6665, 0x6667, 0x6669, 0x666A, 0x666B, 0x666C, 0x666D, 0x6671, 0x6672, 0x6673, 0x6675, 0x6678, 0x6679, 0x667B, 0x667C, 0x667D, 0x667F, 0x6680, 0x6681, 0x6683, 0x6685, 0x6686, 0x6688, 0x6689, 0x668A, 0x668B, 0x668D, 0x668E, 0x668F, 0x6690, 0x6692, 0x6693, 0x6694, 0x6695, 0x6698, 0x6699, 0x669A, 0x669B, 0x669C, 0x669E, 0x669F, 0x66A0, 0x66A1, 0x66A2, 0x66A3, 0x66A4, 0x66A5, 0x66A6, 0x66A9, 0x66AA, 0x66AB, 0x66AC, 0x66AD, 0x66AF, 0x66B0, 0x66B1, 0x66B2, 0x66B3, 0x66B5, 0x66B6, 0x66B7, 0x66B8, 0x66BA, 0x66BB, 0x66BC, 0x66BD, 0x66BF, 0x66C0, 0x66C1, 0x66C2, 0x66C3, 0x66C4, 0x66C5, 0x66C6, 0x66C7, 0x66C8, 0x66C9, 0x66CA, 0x66CB, 0x66CC, 0x66CD, 0x66CE, 0x66CF, 0x66D0, 0x66D1, 0x66D2, 0x66D3, 0x66D4, 0x66D5, 0x66D6, 0x66D7, 0x66D8, 0x66DA, 0x66DE, 0x66DF, 0x66E0, 0x66E1, 0x66E2, 0x66E3, 0x66E4, 0x66E5, 0x66E7, 0x66E8, 0x66EA, 0x66EB, 0x66EC, 0x66ED, 0x66EE, 0x66EF, 0x66F1, 0x66F5, 0x66F6, 0x66F8, 0x66FA, 0x66FB, 0x66FD, 0x6701, 0x6702, 0x6703 }, { 0x6704, 0x6705, 0x6706, 0x6707, 0x670C, 0x670E, 0x670F, 0x6711, 0x6712, 0x6713, 0x6716, 0x6718, 0x6719, 0x671A, 0x671C, 0x671E, 0x6720, 0x6721, 0x6722, 0x6723, 0x6724, 0x6725, 0x6727, 0x6729, 0x672E, 0x6730, 0x6732, 0x6733, 0x6736, 0x6737, 0x6738, 0x6739, 0x673B, 0x673C, 0x673E, 0x673F, 0x6741, 0x6744, 0x6745, 0x6747, 0x674A, 0x674B, 0x674D, 0x6752, 0x6754, 0x6755, 0x6757, 0x6758, 0x6759, 0x675A, 0x675B, 0x675D, 0x6762, 0x6763, 0x6764, 0x6766, 0x6767, 0x676B, 0x676C, 0x676E, 0x6771, 0x6774, 0x6776, 0x003F, 0x6778, 0x6779, 0x677A, 0x677B, 0x677D, 0x6780, 0x6782, 0x6783, 0x6785, 0x6786, 0x6788, 0x678A, 0x678C, 0x678D, 0x678E, 0x678F, 0x6791, 0x6792, 0x6793, 0x6794, 0x6796, 0x6799, 0x679B, 0x679F, 0x67A0, 0x67A1, 0x67A4, 0x67A6, 0x67A9, 0x67AC, 0x67AE, 0x67B1, 0x67B2, 0x67B4, 0x67B9, 0x67BA, 0x67BB, 0x67BC, 0x67BD, 0x67BE, 0x67BF, 0x67C0, 0x67C2, 0x67C5, 0x67C6, 0x67C7, 0x67C8, 0x67C9, 0x67CA, 0x67CB, 0x67CC, 0x67CD, 0x67CE, 0x67D5, 0x67D6, 0x67D7, 0x67DB, 0x67DF, 0x67E1, 0x67E3, 0x67E4, 0x67E6, 0x67E7, 0x67E8, 0x67EA, 0x67EB, 0x67ED, 0x67EE, 0x67F2, 0x67F5, 0x67F6, 0x67F7, 0x67F8, 0x67F9, 0x67FA, 0x67FB, 0x67FC, 0x67FE, 0x6801, 0x6802, 0x6803, 0x6804, 0x6806, 0x680D, 0x6810, 0x6812, 0x6814, 0x6815, 0x6818, 0x6819, 0x681A, 0x681B, 0x681C, 0x681E, 0x681F, 0x6820, 0x6822, 0x6823, 0x6824, 0x6825, 0x6826, 0x6827, 0x6828, 0x682B, 0x682C, 0x682D, 0x682E, 0x682F, 0x6830, 0x6831, 0x6834, 0x6835, 0x6836, 0x683A, 0x683B, 0x683F, 0x6847, 0x684B, 0x684D, 0x684F, 0x6852, 0x6856, 0x6857, 0x6858, 0x6859, 0x685A, 0x685B }, { 0x685C, 0x685D, 0x685E, 0x685F, 0x686A, 0x686C, 0x686D, 0x686E, 0x686F, 0x6870, 0x6871, 0x6872, 0x6873, 0x6875, 0x6878, 0x6879, 0x687A, 0x687B, 0x687C, 0x687D, 0x687E, 0x687F, 0x6880, 0x6882, 0x6884, 0x6887, 0x6888, 0x6889, 0x688A, 0x688B, 0x688C, 0x688D, 0x688E, 0x6890, 0x6891, 0x6892, 0x6894, 0x6895, 0x6896, 0x6898, 0x6899, 0x689A, 0x689B, 0x689C, 0x689D, 0x689E, 0x689F, 0x68A0, 0x68A1, 0x68A3, 0x68A4, 0x68A5, 0x68A9, 0x68AA, 0x68AB, 0x68AC, 0x68AE, 0x68B1, 0x68B2, 0x68B4, 0x68B6, 0x68B7, 0x68B8, 0x003F, 0x68B9, 0x68BA, 0x68BB, 0x68BC, 0x68BD, 0x68BE, 0x68BF, 0x68C1, 0x68C3, 0x68C4, 0x68C5, 0x68C6, 0x68C7, 0x68C8, 0x68CA, 0x68CC, 0x68CE, 0x68CF, 0x68D0, 0x68D1, 0x68D3, 0x68D4, 0x68D6, 0x68D7, 0x68D9, 0x68DB, 0x68DC, 0x68DD, 0x68DE, 0x68DF, 0x68E1, 0x68E2, 0x68E4, 0x68E5, 0x68E6, 0x68E7, 0x68E8, 0x68E9, 0x68EA, 0x68EB, 0x68EC, 0x68ED, 0x68EF, 0x68F2, 0x68F3, 0x68F4, 0x68F6, 0x68F7, 0x68F8, 0x68FB, 0x68FD, 0x68FE, 0x68FF, 0x6900, 0x6902, 0x6903, 0x6904, 0x6906, 0x6907, 0x6908, 0x6909, 0x690A, 0x690C, 0x690F, 0x6911, 0x6913, 0x6914, 0x6915, 0x6916, 0x6917, 0x6918, 0x6919, 0x691A, 0x691B, 0x691C, 0x691D, 0x691E, 0x6921, 0x6922, 0x6923, 0x6925, 0x6926, 0x6927, 0x6928, 0x6929, 0x692A, 0x692B, 0x692C, 0x692E, 0x692F, 0x6931, 0x6932, 0x6933, 0x6935, 0x6936, 0x6937, 0x6938, 0x693A, 0x693B, 0x693C, 0x693E, 0x6940, 0x6941, 0x6943, 0x6944, 0x6945, 0x6946, 0x6947, 0x6948, 0x6949, 0x694A, 0x694B, 0x694C, 0x694D, 0x694E, 0x694F, 0x6950, 0x6951, 0x6952, 0x6953, 0x6955, 0x6956, 0x6958, 0x6959, 0x695B, 0x695C, 0x695F }, { 0x6961, 0x6962, 0x6964, 0x6965, 0x6967, 0x6968, 0x6969, 0x696A, 0x696C, 0x696D, 0x696F, 0x6970, 0x6972, 0x6973, 0x6974, 0x6975, 0x6976, 0x697A, 0x697B, 0x697D, 0x697E, 0x697F, 0x6981, 0x6983, 0x6985, 0x698A, 0x698B, 0x698C, 0x698E, 0x698F, 0x6990, 0x6991, 0x6992, 0x6993, 0x6996, 0x6997, 0x6999, 0x699A, 0x699D, 0x699E, 0x699F, 0x69A0, 0x69A1, 0x69A2, 0x69A3, 0x69A4, 0x69A5, 0x69A6, 0x69A9, 0x69AA, 0x69AC, 0x69AE, 0x69AF, 0x69B0, 0x69B2, 0x69B3, 0x69B5, 0x69B6, 0x69B8, 0x69B9, 0x69BA, 0x69BC, 0x69BD, 0x003F, 0x69BE, 0x69BF, 0x69C0, 0x69C2, 0x69C3, 0x69C4, 0x69C5, 0x69C6, 0x69C7, 0x69C8, 0x69C9, 0x69CB, 0x69CD, 0x69CF, 0x69D1, 0x69D2, 0x69D3, 0x69D5, 0x69D6, 0x69D7, 0x69D8, 0x69D9, 0x69DA, 0x69DC, 0x69DD, 0x69DE, 0x69E1, 0x69E2, 0x69E3, 0x69E4, 0x69E5, 0x69E6, 0x69E7, 0x69E8, 0x69E9, 0x69EA, 0x69EB, 0x69EC, 0x69EE, 0x69EF, 0x69F0, 0x69F1, 0x69F3, 0x69F4, 0x69F5, 0x69F6, 0x69F7, 0x69F8, 0x69F9, 0x69FA, 0x69FB, 0x69FC, 0x69FE, 0x6A00, 0x6A01, 0x6A02, 0x6A03, 0x6A04, 0x6A05, 0x6A06, 0x6A07, 0x6A08, 0x6A09, 0x6A0B, 0x6A0C, 0x6A0D, 0x6A0E, 0x6A0F, 0x6A10, 0x6A11, 0x6A12, 0x6A13, 0x6A14, 0x6A15, 0x6A16, 0x6A19, 0x6A1A, 0x6A1B, 0x6A1C, 0x6A1D, 0x6A1E, 0x6A20, 0x6A22, 0x6A23, 0x6A24, 0x6A25, 0x6A26, 0x6A27, 0x6A29, 0x6A2B, 0x6A2C, 0x6A2D, 0x6A2E, 0x6A30, 0x6A32, 0x6A33, 0x6A34, 0x6A36, 0x6A37, 0x6A38, 0x6A39, 0x6A3A, 0x6A3B, 0x6A3C, 0x6A3F, 0x6A40, 0x6A41, 0x6A42, 0x6A43, 0x6A45, 0x6A46, 0x6A48, 0x6A49, 0x6A4A, 0x6A4B, 0x6A4C, 0x6A4D, 0x6A4E, 0x6A4F, 0x6A51, 0x6A52, 0x6A53, 0x6A54, 0x6A55, 0x6A56, 0x6A57, 0x6A5A }, { 0x6A5C, 0x6A5D, 0x6A5E, 0x6A5F, 0x6A60, 0x6A62, 0x6A63, 0x6A64, 0x6A66, 0x6A67, 0x6A68, 0x6A69, 0x6A6A, 0x6A6B, 0x6A6C, 0x6A6D, 0x6A6E, 0x6A6F, 0x6A70, 0x6A72, 0x6A73, 0x6A74, 0x6A75, 0x6A76, 0x6A77, 0x6A78, 0x6A7A, 0x6A7B, 0x6A7D, 0x6A7E, 0x6A7F, 0x6A81, 0x6A82, 0x6A83, 0x6A85, 0x6A86, 0x6A87, 0x6A88, 0x6A89, 0x6A8A, 0x6A8B, 0x6A8C, 0x6A8D, 0x6A8F, 0x6A92, 0x6A93, 0x6A94, 0x6A95, 0x6A96, 0x6A98, 0x6A99, 0x6A9A, 0x6A9B, 0x6A9C, 0x6A9D, 0x6A9E, 0x6A9F, 0x6AA1, 0x6AA2, 0x6AA3, 0x6AA4, 0x6AA5, 0x6AA6, 0x003F, 0x6AA7, 0x6AA8, 0x6AAA, 0x6AAD, 0x6AAE, 0x6AAF, 0x6AB0, 0x6AB1, 0x6AB2, 0x6AB3, 0x6AB4, 0x6AB5, 0x6AB6, 0x6AB7, 0x6AB8, 0x6AB9, 0x6ABA, 0x6ABB, 0x6ABC, 0x6ABD, 0x6ABE, 0x6ABF, 0x6AC0, 0x6AC1, 0x6AC2, 0x6AC3, 0x6AC4, 0x6AC5, 0x6AC6, 0x6AC7, 0x6AC8, 0x6AC9, 0x6ACA, 0x6ACB, 0x6ACC, 0x6ACD, 0x6ACE, 0x6ACF, 0x6AD0, 0x6AD1, 0x6AD2, 0x6AD3, 0x6AD4, 0x6AD5, 0x6AD6, 0x6AD7, 0x6AD8, 0x6AD9, 0x6ADA, 0x6ADB, 0x6ADC, 0x6ADD, 0x6ADE, 0x6ADF, 0x6AE0, 0x6AE1, 0x6AE2, 0x6AE3, 0x6AE4, 0x6AE5, 0x6AE6, 0x6AE7, 0x6AE8, 0x6AE9, 0x6AEA, 0x6AEB, 0x6AEC, 0x6AED, 0x6AEE, 0x6AEF, 0x6AF0, 0x6AF1, 0x6AF2, 0x6AF3, 0x6AF4, 0x6AF5, 0x6AF6, 0x6AF7, 0x6AF8, 0x6AF9, 0x6AFA, 0x6AFB, 0x6AFC, 0x6AFD, 0x6AFE, 0x6AFF, 0x6B00, 0x6B01, 0x6B02, 0x6B03, 0x6B04, 0x6B05, 0x6B06, 0x6B07, 0x6B08, 0x6B09, 0x6B0A, 0x6B0B, 0x6B0C, 0x6B0D, 0x6B0E, 0x6B0F, 0x6B10, 0x6B11, 0x6B12, 0x6B13, 0x6B14, 0x6B15, 0x6B16, 0x6B17, 0x6B18, 0x6B19, 0x6B1A, 0x6B1B, 0x6B1C, 0x6B1D, 0x6B1E, 0x6B1F, 0x6B25, 0x6B26, 0x6B28, 0x6B29, 0x6B2A, 0x6B2B, 0x6B2C, 0x6B2D, 0x6B2E }, { 0x6B2F, 0x6B30, 0x6B31, 0x6B33, 0x6B34, 0x6B35, 0x6B36, 0x6B38, 0x6B3B, 0x6B3C, 0x6B3D, 0x6B3F, 0x6B40, 0x6B41, 0x6B42, 0x6B44, 0x6B45, 0x6B48, 0x6B4A, 0x6B4B, 0x6B4D, 0x6B4E, 0x6B4F, 0x6B50, 0x6B51, 0x6B52, 0x6B53, 0x6B54, 0x6B55, 0x6B56, 0x6B57, 0x6B58, 0x6B5A, 0x6B5B, 0x6B5C, 0x6B5D, 0x6B5E, 0x6B5F, 0x6B60, 0x6B61, 0x6B68, 0x6B69, 0x6B6B, 0x6B6C, 0x6B6D, 0x6B6E, 0x6B6F, 0x6B70, 0x6B71, 0x6B72, 0x6B73, 0x6B74, 0x6B75, 0x6B76, 0x6B77, 0x6B78, 0x6B7A, 0x6B7D, 0x6B7E, 0x6B7F, 0x6B80, 0x6B85, 0x6B88, 0x003F, 0x6B8C, 0x6B8E, 0x6B8F, 0x6B90, 0x6B91, 0x6B94, 0x6B95, 0x6B97, 0x6B98, 0x6B99, 0x6B9C, 0x6B9D, 0x6B9E, 0x6B9F, 0x6BA0, 0x6BA2, 0x6BA3, 0x6BA4, 0x6BA5, 0x6BA6, 0x6BA7, 0x6BA8, 0x6BA9, 0x6BAB, 0x6BAC, 0x6BAD, 0x6BAE, 0x6BAF, 0x6BB0, 0x6BB1, 0x6BB2, 0x6BB6, 0x6BB8, 0x6BB9, 0x6BBA, 0x6BBB, 0x6BBC, 0x6BBD, 0x6BBE, 0x6BC0, 0x6BC3, 0x6BC4, 0x6BC6, 0x6BC7, 0x6BC8, 0x6BC9, 0x6BCA, 0x6BCC, 0x6BCE, 0x6BD0, 0x6BD1, 0x6BD8, 0x6BDA, 0x6BDC, 0x6BDD, 0x6BDE, 0x6BDF, 0x6BE0, 0x6BE2, 0x6BE3, 0x6BE4, 0x6BE5, 0x6BE6, 0x6BE7, 0x6BE8, 0x6BE9, 0x6BEC, 0x6BED, 0x6BEE, 0x6BF0, 0x6BF1, 0x6BF2, 0x6BF4, 0x6BF6, 0x6BF7, 0x6BF8, 0x6BFA, 0x6BFB, 0x6BFC, 0x6BFE, 0x6BFF, 0x6C00, 0x6C01, 0x6C02, 0x6C03, 0x6C04, 0x6C08, 0x6C09, 0x6C0A, 0x6C0B, 0x6C0C, 0x6C0E, 0x6C12, 0x6C17, 0x6C1C, 0x6C1D, 0x6C1E, 0x6C20, 0x6C23, 0x6C25, 0x6C2B, 0x6C2C, 0x6C2D, 0x6C31, 0x6C33, 0x6C36, 0x6C37, 0x6C39, 0x6C3A, 0x6C3B, 0x6C3C, 0x6C3E, 0x6C3F, 0x6C43, 0x6C44, 0x6C45, 0x6C48, 0x6C4B, 0x6C4C, 0x6C4D, 0x6C4E, 0x6C4F, 0x6C51, 0x6C52, 0x6C53, 0x6C56, 0x6C58 }, { 0x6C59, 0x6C5A, 0x6C62, 0x6C63, 0x6C65, 0x6C66, 0x6C67, 0x6C6B, 0x6C6C, 0x6C6D, 0x6C6E, 0x6C6F, 0x6C71, 0x6C73, 0x6C75, 0x6C77, 0x6C78, 0x6C7A, 0x6C7B, 0x6C7C, 0x6C7F, 0x6C80, 0x6C84, 0x6C87, 0x6C8A, 0x6C8B, 0x6C8D, 0x6C8E, 0x6C91, 0x6C92, 0x6C95, 0x6C96, 0x6C97, 0x6C98, 0x6C9A, 0x6C9C, 0x6C9D, 0x6C9E, 0x6CA0, 0x6CA2, 0x6CA8, 0x6CAC, 0x6CAF, 0x6CB0, 0x6CB4, 0x6CB5, 0x6CB6, 0x6CB7, 0x6CBA, 0x6CC0, 0x6CC1, 0x6CC2, 0x6CC3, 0x6CC6, 0x6CC7, 0x6CC8, 0x6CCB, 0x6CCD, 0x6CCE, 0x6CCF, 0x6CD1, 0x6CD2, 0x6CD8, 0x003F, 0x6CD9, 0x6CDA, 0x6CDC, 0x6CDD, 0x6CDF, 0x6CE4, 0x6CE6, 0x6CE7, 0x6CE9, 0x6CEC, 0x6CED, 0x6CF2, 0x6CF4, 0x6CF9, 0x6CFF, 0x6D00, 0x6D02, 0x6D03, 0x6D05, 0x6D06, 0x6D08, 0x6D09, 0x6D0A, 0x6D0D, 0x6D0F, 0x6D10, 0x6D11, 0x6D13, 0x6D14, 0x6D15, 0x6D16, 0x6D18, 0x6D1C, 0x6D1D, 0x6D1F, 0x6D20, 0x6D21, 0x6D22, 0x6D23, 0x6D24, 0x6D26, 0x6D28, 0x6D29, 0x6D2C, 0x6D2D, 0x6D2F, 0x6D30, 0x6D34, 0x6D36, 0x6D37, 0x6D38, 0x6D3A, 0x6D3F, 0x6D40, 0x6D42, 0x6D44, 0x6D49, 0x6D4C, 0x6D50, 0x6D55, 0x6D56, 0x6D57, 0x6D58, 0x6D5B, 0x6D5D, 0x6D5F, 0x6D61, 0x6D62, 0x6D64, 0x6D65, 0x6D67, 0x6D68, 0x6D6B, 0x6D6C, 0x6D6D, 0x6D70, 0x6D71, 0x6D72, 0x6D73, 0x6D75, 0x6D76, 0x6D79, 0x6D7A, 0x6D7B, 0x6D7D, 0x6D7E, 0x6D7F, 0x6D80, 0x6D81, 0x6D83, 0x6D84, 0x6D86, 0x6D87, 0x6D8A, 0x6D8B, 0x6D8D, 0x6D8F, 0x6D90, 0x6D92, 0x6D96, 0x6D97, 0x6D98, 0x6D99, 0x6D9A, 0x6D9C, 0x6DA2, 0x6DA5, 0x6DAC, 0x6DAD, 0x6DB0, 0x6DB1, 0x6DB3, 0x6DB4, 0x6DB6, 0x6DB7, 0x6DB9, 0x6DBA, 0x6DBB, 0x6DBC, 0x6DBD, 0x6DBE, 0x6DC1, 0x6DC2, 0x6DC3, 0x6DC8, 0x6DC9, 0x6DCA }, { 0x6DCD, 0x6DCE, 0x6DCF, 0x6DD0, 0x6DD2, 0x6DD3, 0x6DD4, 0x6DD5, 0x6DD7, 0x6DDA, 0x6DDB, 0x6DDC, 0x6DDF, 0x6DE2, 0x6DE3, 0x6DE5, 0x6DE7, 0x6DE8, 0x6DE9, 0x6DEA, 0x6DED, 0x6DEF, 0x6DF0, 0x6DF2, 0x6DF4, 0x6DF5, 0x6DF6, 0x6DF8, 0x6DFA, 0x6DFD, 0x6DFE, 0x6DFF, 0x6E00, 0x6E01, 0x6E02, 0x6E03, 0x6E04, 0x6E06, 0x6E07, 0x6E08, 0x6E09, 0x6E0B, 0x6E0F, 0x6E12, 0x6E13, 0x6E15, 0x6E18, 0x6E19, 0x6E1B, 0x6E1C, 0x6E1E, 0x6E1F, 0x6E22, 0x6E26, 0x6E27, 0x6E28, 0x6E2A, 0x6E2C, 0x6E2E, 0x6E30, 0x6E31, 0x6E33, 0x6E35, 0x003F, 0x6E36, 0x6E37, 0x6E39, 0x6E3B, 0x6E3C, 0x6E3D, 0x6E3E, 0x6E3F, 0x6E40, 0x6E41, 0x6E42, 0x6E45, 0x6E46, 0x6E47, 0x6E48, 0x6E49, 0x6E4A, 0x6E4B, 0x6E4C, 0x6E4F, 0x6E50, 0x6E51, 0x6E52, 0x6E55, 0x6E57, 0x6E59, 0x6E5A, 0x6E5C, 0x6E5D, 0x6E5E, 0x6E60, 0x6E61, 0x6E62, 0x6E63, 0x6E64, 0x6E65, 0x6E66, 0x6E67, 0x6E68, 0x6E69, 0x6E6A, 0x6E6C, 0x6E6D, 0x6E6F, 0x6E70, 0x6E71, 0x6E72, 0x6E73, 0x6E74, 0x6E75, 0x6E76, 0x6E77, 0x6E78, 0x6E79, 0x6E7A, 0x6E7B, 0x6E7C, 0x6E7D, 0x6E80, 0x6E81, 0x6E82, 0x6E84, 0x6E87, 0x6E88, 0x6E8A, 0x6E8B, 0x6E8C, 0x6E8D, 0x6E8E, 0x6E91, 0x6E92, 0x6E93, 0x6E94, 0x6E95, 0x6E96, 0x6E97, 0x6E99, 0x6E9A, 0x6E9B, 0x6E9D, 0x6E9E, 0x6EA0, 0x6EA1, 0x6EA3, 0x6EA4, 0x6EA6, 0x6EA8, 0x6EA9, 0x6EAB, 0x6EAC, 0x6EAD, 0x6EAE, 0x6EB0, 0x6EB3, 0x6EB5, 0x6EB8, 0x6EB9, 0x6EBC, 0x6EBE, 0x6EBF, 0x6EC0, 0x6EC3, 0x6EC4, 0x6EC5, 0x6EC6, 0x6EC8, 0x6EC9, 0x6ECA, 0x6ECC, 0x6ECD, 0x6ECE, 0x6ED0, 0x6ED2, 0x6ED6, 0x6ED8, 0x6ED9, 0x6EDB, 0x6EDC, 0x6EDD, 0x6EE3, 0x6EE7, 0x6EEA, 0x6EEB, 0x6EEC, 0x6EED, 0x6EEE, 0x6EEF }, { 0x6EF0, 0x6EF1, 0x6EF2, 0x6EF3, 0x6EF5, 0x6EF6, 0x6EF7, 0x6EF8, 0x6EFA, 0x6EFB, 0x6EFC, 0x6EFD, 0x6EFE, 0x6EFF, 0x6F00, 0x6F01, 0x6F03, 0x6F04, 0x6F05, 0x6F07, 0x6F08, 0x6F0A, 0x6F0B, 0x6F0C, 0x6F0D, 0x6F0E, 0x6F10, 0x6F11, 0x6F12, 0x6F16, 0x6F17, 0x6F18, 0x6F19, 0x6F1A, 0x6F1B, 0x6F1C, 0x6F1D, 0x6F1E, 0x6F1F, 0x6F21, 0x6F22, 0x6F23, 0x6F25, 0x6F26, 0x6F27, 0x6F28, 0x6F2C, 0x6F2E, 0x6F30, 0x6F32, 0x6F34, 0x6F35, 0x6F37, 0x6F38, 0x6F39, 0x6F3A, 0x6F3B, 0x6F3C, 0x6F3D, 0x6F3F, 0x6F40, 0x6F41, 0x6F42, 0x003F, 0x6F43, 0x6F44, 0x6F45, 0x6F48, 0x6F49, 0x6F4A, 0x6F4C, 0x6F4E, 0x6F4F, 0x6F50, 0x6F51, 0x6F52, 0x6F53, 0x6F54, 0x6F55, 0x6F56, 0x6F57, 0x6F59, 0x6F5A, 0x6F5B, 0x6F5D, 0x6F5F, 0x6F60, 0x6F61, 0x6F63, 0x6F64, 0x6F65, 0x6F67, 0x6F68, 0x6F69, 0x6F6A, 0x6F6B, 0x6F6C, 0x6F6F, 0x6F70, 0x6F71, 0x6F73, 0x6F75, 0x6F76, 0x6F77, 0x6F79, 0x6F7B, 0x6F7D, 0x6F7E, 0x6F7F, 0x6F80, 0x6F81, 0x6F82, 0x6F83, 0x6F85, 0x6F86, 0x6F87, 0x6F8A, 0x6F8B, 0x6F8F, 0x6F90, 0x6F91, 0x6F92, 0x6F93, 0x6F94, 0x6F95, 0x6F96, 0x6F97, 0x6F98, 0x6F99, 0x6F9A, 0x6F9B, 0x6F9D, 0x6F9E, 0x6F9F, 0x6FA0, 0x6FA2, 0x6FA3, 0x6FA4, 0x6FA5, 0x6FA6, 0x6FA8, 0x6FA9, 0x6FAA, 0x6FAB, 0x6FAC, 0x6FAD, 0x6FAE, 0x6FAF, 0x6FB0, 0x6FB1, 0x6FB2, 0x6FB4, 0x6FB5, 0x6FB7, 0x6FB8, 0x6FBA, 0x6FBB, 0x6FBC, 0x6FBD, 0x6FBE, 0x6FBF, 0x6FC1, 0x6FC3, 0x6FC4, 0x6FC5, 0x6FC6, 0x6FC7, 0x6FC8, 0x6FCA, 0x6FCB, 0x6FCC, 0x6FCD, 0x6FCE, 0x6FCF, 0x6FD0, 0x6FD3, 0x6FD4, 0x6FD5, 0x6FD6, 0x6FD7, 0x6FD8, 0x6FD9, 0x6FDA, 0x6FDB, 0x6FDC, 0x6FDD, 0x6FDF, 0x6FE2, 0x6FE3, 0x6FE4, 0x6FE5 }, { 0x6FE6, 0x6FE7, 0x6FE8, 0x6FE9, 0x6FEA, 0x6FEB, 0x6FEC, 0x6FED, 0x6FF0, 0x6FF1, 0x6FF2, 0x6FF3, 0x6FF4, 0x6FF5, 0x6FF6, 0x6FF7, 0x6FF8, 0x6FF9, 0x6FFA, 0x6FFB, 0x6FFC, 0x6FFD, 0x6FFE, 0x6FFF, 0x7000, 0x7001, 0x7002, 0x7003, 0x7004, 0x7005, 0x7006, 0x7007, 0x7008, 0x7009, 0x700A, 0x700B, 0x700C, 0x700D, 0x700E, 0x700F, 0x7010, 0x7012, 0x7013, 0x7014, 0x7015, 0x7016, 0x7017, 0x7018, 0x7019, 0x701C, 0x701D, 0x701E, 0x701F, 0x7020, 0x7021, 0x7022, 0x7024, 0x7025, 0x7026, 0x7027, 0x7028, 0x7029, 0x702A, 0x003F, 0x702B, 0x702C, 0x702D, 0x702E, 0x702F, 0x7030, 0x7031, 0x7032, 0x7033, 0x7034, 0x7036, 0x7037, 0x7038, 0x703A, 0x703B, 0x703C, 0x703D, 0x703E, 0x703F, 0x7040, 0x7041, 0x7042, 0x7043, 0x7044, 0x7045, 0x7046, 0x7047, 0x7048, 0x7049, 0x704A, 0x704B, 0x704D, 0x704E, 0x7050, 0x7051, 0x7052, 0x7053, 0x7054, 0x7055, 0x7056, 0x7057, 0x7058, 0x7059, 0x705A, 0x705B, 0x705C, 0x705D, 0x705F, 0x7060, 0x7061, 0x7062, 0x7063, 0x7064, 0x7065, 0x7066, 0x7067, 0x7068, 0x7069, 0x706A, 0x706E, 0x7071, 0x7072, 0x7073, 0x7074, 0x7077, 0x7079, 0x707A, 0x707B, 0x707D, 0x7081, 0x7082, 0x7083, 0x7084, 0x7086, 0x7087, 0x7088, 0x708B, 0x708C, 0x708D, 0x708F, 0x7090, 0x7091, 0x7093, 0x7097, 0x7098, 0x709A, 0x709B, 0x709E, 0x709F, 0x70A0, 0x70A1, 0x70A2, 0x70A3, 0x70A4, 0x70A5, 0x70A6, 0x70A7, 0x70A8, 0x70A9, 0x70AA, 0x70B0, 0x70B2, 0x70B4, 0x70B5, 0x70B6, 0x70BA, 0x70BE, 0x70BF, 0x70C4, 0x70C5, 0x70C6, 0x70C7, 0x70C9, 0x70CB, 0x70CC, 0x70CD, 0x70CE, 0x70CF, 0x70D0, 0x70D1, 0x70D2, 0x70D3, 0x70D4, 0x70D5, 0x70D6, 0x70D7, 0x70DA }, { 0x70DC, 0x70DD, 0x70DE, 0x70E0, 0x70E1, 0x70E2, 0x70E3, 0x70E5, 0x70EA, 0x70EE, 0x70F0, 0x70F1, 0x70F2, 0x70F3, 0x70F4, 0x70F5, 0x70F6, 0x70F8, 0x70FA, 0x70FB, 0x70FC, 0x70FE, 0x70FF, 0x7100, 0x7101, 0x7102, 0x7103, 0x7104, 0x7105, 0x7106, 0x7107, 0x7108, 0x710B, 0x710C, 0x710D, 0x710E, 0x710F, 0x7111, 0x7112, 0x7114, 0x7117, 0x711B, 0x711C, 0x711D, 0x711E, 0x711F, 0x7120, 0x7121, 0x7122, 0x7123, 0x7124, 0x7125, 0x7127, 0x7128, 0x7129, 0x712A, 0x712B, 0x712C, 0x712D, 0x712E, 0x7132, 0x7133, 0x7134, 0x003F, 0x7135, 0x7137, 0x7138, 0x7139, 0x713A, 0x713B, 0x713C, 0x713D, 0x713E, 0x713F, 0x7140, 0x7141, 0x7142, 0x7143, 0x7144, 0x7146, 0x7147, 0x7148, 0x7149, 0x714B, 0x714D, 0x714F, 0x7150, 0x7151, 0x7152, 0x7153, 0x7154, 0x7155, 0x7156, 0x7157, 0x7158, 0x7159, 0x715A, 0x715B, 0x715D, 0x715F, 0x7160, 0x7161, 0x7162, 0x7163, 0x7165, 0x7169, 0x716A, 0x716B, 0x716C, 0x716D, 0x716F, 0x7170, 0x7171, 0x7174, 0x7175, 0x7176, 0x7177, 0x7179, 0x717B, 0x717C, 0x717E, 0x717F, 0x7180, 0x7181, 0x7182, 0x7183, 0x7185, 0x7186, 0x7187, 0x7188, 0x7189, 0x718B, 0x718C, 0x718D, 0x718E, 0x7190, 0x7191, 0x7192, 0x7193, 0x7195, 0x7196, 0x7197, 0x719A, 0x719B, 0x719C, 0x719D, 0x719E, 0x71A1, 0x71A2, 0x71A3, 0x71A4, 0x71A5, 0x71A6, 0x71A7, 0x71A9, 0x71AA, 0x71AB, 0x71AD, 0x71AE, 0x71AF, 0x71B0, 0x71B1, 0x71B2, 0x71B4, 0x71B6, 0x71B7, 0x71B8, 0x71BA, 0x71BB, 0x71BC, 0x71BD, 0x71BE, 0x71BF, 0x71C0, 0x71C1, 0x71C2, 0x71C4, 0x71C5, 0x71C6, 0x71C7, 0x71C8, 0x71C9, 0x71CA, 0x71CB, 0x71CC, 0x71CD, 0x71CF, 0x71D0, 0x71D1, 0x71D2, 0x71D3 }, { 0x71D6, 0x71D7, 0x71D8, 0x71D9, 0x71DA, 0x71DB, 0x71DC, 0x71DD, 0x71DE, 0x71DF, 0x71E1, 0x71E2, 0x71E3, 0x71E4, 0x71E6, 0x71E8, 0x71E9, 0x71EA, 0x71EB, 0x71EC, 0x71ED, 0x71EF, 0x71F0, 0x71F1, 0x71F2, 0x71F3, 0x71F4, 0x71F5, 0x71F6, 0x71F7, 0x71F8, 0x71FA, 0x71FB, 0x71FC, 0x71FD, 0x71FE, 0x71FF, 0x7200, 0x7201, 0x7202, 0x7203, 0x7204, 0x7205, 0x7207, 0x7208, 0x7209, 0x720A, 0x720B, 0x720C, 0x720D, 0x720E, 0x720F, 0x7210, 0x7211, 0x7212, 0x7213, 0x7214, 0x7215, 0x7216, 0x7217, 0x7218, 0x7219, 0x721A, 0x003F, 0x721B, 0x721C, 0x721E, 0x721F, 0x7220, 0x7221, 0x7222, 0x7223, 0x7224, 0x7225, 0x7226, 0x7227, 0x7229, 0x722B, 0x722D, 0x722E, 0x722F, 0x7232, 0x7233, 0x7234, 0x723A, 0x723C, 0x723E, 0x7240, 0x7241, 0x7242, 0x7243, 0x7244, 0x7245, 0x7246, 0x7249, 0x724A, 0x724B, 0x724E, 0x724F, 0x7250, 0x7251, 0x7253, 0x7254, 0x7255, 0x7257, 0x7258, 0x725A, 0x725C, 0x725E, 0x7260, 0x7263, 0x7264, 0x7265, 0x7268, 0x726A, 0x726B, 0x726C, 0x726D, 0x7270, 0x7271, 0x7273, 0x7274, 0x7276, 0x7277, 0x7278, 0x727B, 0x727C, 0x727D, 0x7282, 0x7283, 0x7285, 0x7286, 0x7287, 0x7288, 0x7289, 0x728C, 0x728E, 0x7290, 0x7291, 0x7293, 0x7294, 0x7295, 0x7296, 0x7297, 0x7298, 0x7299, 0x729A, 0x729B, 0x729C, 0x729D, 0x729E, 0x72A0, 0x72A1, 0x72A2, 0x72A3, 0x72A4, 0x72A5, 0x72A6, 0x72A7, 0x72A8, 0x72A9, 0x72AA, 0x72AB, 0x72AE, 0x72B1, 0x72B2, 0x72B3, 0x72B5, 0x72BA, 0x72BB, 0x72BC, 0x72BD, 0x72BE, 0x72BF, 0x72C0, 0x72C5, 0x72C6, 0x72C7, 0x72C9, 0x72CA, 0x72CB, 0x72CC, 0x72CF, 0x72D1, 0x72D3, 0x72D4, 0x72D5, 0x72D6, 0x72D8, 0x72DA, 0x72DB }, { 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x3000, 0x3001, 0x3002, 0x00B7, 0x02C9, 0x02C7, 0x00A8, 0x3003, 0x3005, 0x2014, 0xFF5E, 0x2016, 0x2026, 0x2018, 0x2019, 0x201C, 0x201D, 0x3014, 0x3015, 0x3008, 0x3009, 0x300A, 0x300B, 0x300C, 0x300D, 0x300E, 0x300F, 0x3016, 0x3017, 0x3010, 0x3011, 0x00B1, 0x00D7, 0x00F7, 0x2236, 0x2227, 0x2228, 0x2211, 0x220F, 0x222A, 0x2229, 0x2208, 0x2237, 0x221A, 0x22A5, 0x2225, 0x2220, 0x2312, 0x2299, 0x222B, 0x222E, 0x2261, 0x224C, 0x2248, 0x223D, 0x221D, 0x2260, 0x226E, 0x226F, 0x2264, 0x2265, 0x221E, 0x2235, 0x2234, 0x2642, 0x2640, 0x00B0, 0x2032, 0x2033, 0x2103, 0xFF04, 0x00A4, 0xFFE0, 0xFFE1, 0x2030, 0x00A7, 0x2116, 0x2606, 0x2605, 0x25CB, 0x25CF, 0x25CE, 0x25C7, 0x25C6, 0x25A1, 0x25A0, 0x25B3, 0x25B2, 0x203B, 0x2192, 0x2190, 0x2191, 0x2193, 0x3013 }, { 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x2170, 0x2171, 0x2172, 0x2173, 0x2174, 0x2175, 0x2176, 0x2177, 0x2178, 0x2179, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x2488, 0x2489, 0x248A, 0x248B, 0x248C, 0x248D, 0x248E, 0x248F, 0x2490, 0x2491, 0x2492, 0x2493, 0x2494, 0x2495, 0x2496, 0x2497, 0x2498, 0x2499, 0x249A, 0x249B, 0x2474, 0x2475, 0x2476, 0x2477, 0x2478, 0x2479, 0x247A, 0x247B, 0x247C, 0x247D, 0x247E, 0x247F, 0x2480, 0x2481, 0x2482, 0x2483, 0x2484, 0x2485, 0x2486, 0x2487, 0x2460, 0x2461, 0x2462, 0x2463, 0x2464, 0x2465, 0x2466, 0x2467, 0x2468, 0x2469, 0x003F, 0x003F, 0x3220, 0x3221, 0x3222, 0x3223, 0x3224, 0x3225, 0x3226, 0x3227, 0x3228, 0x3229, 0x003F, 0x003F, 0x2160, 0x2161, 0x2162, 0x2163, 0x2164, 0x2165, 0x2166, 0x2167, 0x2168, 0x2169, 0x216A, 0x216B, 0x003F, 0x003F }, { 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0xFF01, 0xFF02, 0xFF03, 0xFFE5, 0xFF05, 0xFF06, 0xFF07, 0xFF08, 0xFF09, 0xFF0A, 0xFF0B, 0xFF0C, 0xFF0D, 0xFF0E, 0xFF0F, 0xFF10, 0xFF11, 0xFF12, 0xFF13, 0xFF14, 0xFF15, 0xFF16, 0xFF17, 0xFF18, 0xFF19, 0xFF1A, 0xFF1B, 0xFF1C, 0xFF1D, 0xFF1E, 0xFF1F, 0xFF20, 0xFF21, 0xFF22, 0xFF23, 0xFF24, 0xFF25, 0xFF26, 0xFF27, 0xFF28, 0xFF29, 0xFF2A, 0xFF2B, 0xFF2C, 0xFF2D, 0xFF2E, 0xFF2F, 0xFF30, 0xFF31, 0xFF32, 0xFF33, 0xFF34, 0xFF35, 0xFF36, 0xFF37, 0xFF38, 0xFF39, 0xFF3A, 0xFF3B, 0xFF3C, 0xFF3D, 0xFF3E, 0xFF3F, 0xFF40, 0xFF41, 0xFF42, 0xFF43, 0xFF44, 0xFF45, 0xFF46, 0xFF47, 0xFF48, 0xFF49, 0xFF4A, 0xFF4B, 0xFF4C, 0xFF4D, 0xFF4E, 0xFF4F, 0xFF50, 0xFF51, 0xFF52, 0xFF53, 0xFF54, 0xFF55, 0xFF56, 0xFF57, 0xFF58, 0xFF59, 0xFF5A, 0xFF5B, 0xFF5C, 0xFF5D, 0xFFE3 }, { 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x3041, 0x3042, 0x3043, 0x3044, 0x3045, 0x3046, 0x3047, 0x3048, 0x3049, 0x304A, 0x304B, 0x304C, 0x304D, 0x304E, 0x304F, 0x3050, 0x3051, 0x3052, 0x3053, 0x3054, 0x3055, 0x3056, 0x3057, 0x3058, 0x3059, 0x305A, 0x305B, 0x305C, 0x305D, 0x305E, 0x305F, 0x3060, 0x3061, 0x3062, 0x3063, 0x3064, 0x3065, 0x3066, 0x3067, 0x3068, 0x3069, 0x306A, 0x306B, 0x306C, 0x306D, 0x306E, 0x306F, 0x3070, 0x3071, 0x3072, 0x3073, 0x3074, 0x3075, 0x3076, 0x3077, 0x3078, 0x3079, 0x307A, 0x307B, 0x307C, 0x307D, 0x307E, 0x307F, 0x3080, 0x3081, 0x3082, 0x3083, 0x3084, 0x3085, 0x3086, 0x3087, 0x3088, 0x3089, 0x308A, 0x308B, 0x308C, 0x308D, 0x308E, 0x308F, 0x3090, 0x3091, 0x3092, 0x3093, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F }, { 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x30A1, 0x30A2, 0x30A3, 0x30A4, 0x30A5, 0x30A6, 0x30A7, 0x30A8, 0x30A9, 0x30AA, 0x30AB, 0x30AC, 0x30AD, 0x30AE, 0x30AF, 0x30B0, 0x30B1, 0x30B2, 0x30B3, 0x30B4, 0x30B5, 0x30B6, 0x30B7, 0x30B8, 0x30B9, 0x30BA, 0x30BB, 0x30BC, 0x30BD, 0x30BE, 0x30BF, 0x30C0, 0x30C1, 0x30C2, 0x30C3, 0x30C4, 0x30C5, 0x30C6, 0x30C7, 0x30C8, 0x30C9, 0x30CA, 0x30CB, 0x30CC, 0x30CD, 0x30CE, 0x30CF, 0x30D0, 0x30D1, 0x30D2, 0x30D3, 0x30D4, 0x30D5, 0x30D6, 0x30D7, 0x30D8, 0x30D9, 0x30DA, 0x30DB, 0x30DC, 0x30DD, 0x30DE, 0x30DF, 0x30E0, 0x30E1, 0x30E2, 0x30E3, 0x30E4, 0x30E5, 0x30E6, 0x30E7, 0x30E8, 0x30E9, 0x30EA, 0x30EB, 0x30EC, 0x30ED, 0x30EE, 0x30EF, 0x30F0, 0x30F1, 0x30F2, 0x30F3, 0x30F4, 0x30F5, 0x30F6, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F }, { 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x0391, 0x0392, 0x0393, 0x0394, 0x0395, 0x0396, 0x0397, 0x0398, 0x0399, 0x039A, 0x039B, 0x039C, 0x039D, 0x039E, 0x039F, 0x03A0, 0x03A1, 0x03A3, 0x03A4, 0x03A5, 0x03A6, 0x03A7, 0x03A8, 0x03A9, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x03B1, 0x03B2, 0x03B3, 0x03B4, 0x03B5, 0x03B6, 0x03B7, 0x03B8, 0x03B9, 0x03BA, 0x03BB, 0x03BC, 0x03BD, 0x03BE, 0x03BF, 0x03C0, 0x03C1, 0x03C3, 0x03C4, 0x03C5, 0x03C6, 0x03C7, 0x03C8, 0x03C9, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0xFE35, 0xFE36, 0xFE39, 0xFE3A, 0xFE3F, 0xFE40, 0xFE3D, 0xFE3E, 0xFE41, 0xFE42, 0xFE43, 0xFE44, 0x003F, 0x003F, 0xFE3B, 0xFE3C, 0xFE37, 0xFE38, 0xFE31, 0x003F, 0xFE33, 0xFE34, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F }, { 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x0410, 0x0411, 0x0412, 0x0413, 0x0414, 0x0415, 0x0401, 0x0416, 0x0417, 0x0418, 0x0419, 0x041A, 0x041B, 0x041C, 0x041D, 0x041E, 0x041F, 0x0420, 0x0421, 0x0422, 0x0423, 0x0424, 0x0425, 0x0426, 0x0427, 0x0428, 0x0429, 0x042A, 0x042B, 0x042C, 0x042D, 0x042E, 0x042F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x0430, 0x0431, 0x0432, 0x0433, 0x0434, 0x0435, 0x0451, 0x0436, 0x0437, 0x0438, 0x0439, 0x043A, 0x043B, 0x043C, 0x043D, 0x043E, 0x043F, 0x0440, 0x0441, 0x0442, 0x0443, 0x0444, 0x0445, 0x0446, 0x0447, 0x0448, 0x0449, 0x044A, 0x044B, 0x044C, 0x044D, 0x044E, 0x044F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F }, { 0x02CA, 0x02CB, 0x02D9, 0x2013, 0x2015, 0x2025, 0x2035, 0x2105, 0x2109, 0x2196, 0x2197, 0x2198, 0x2199, 0x2215, 0x221F, 0x2223, 0x2252, 0x2266, 0x2267, 0x22BF, 0x2550, 0x2551, 0x2552, 0x2553, 0x2554, 0x2555, 0x2556, 0x2557, 0x2558, 0x2559, 0x255A, 0x255B, 0x255C, 0x255D, 0x255E, 0x255F, 0x2560, 0x2561, 0x2562, 0x2563, 0x2564, 0x2565, 0x2566, 0x2567, 0x2568, 0x2569, 0x256A, 0x256B, 0x256C, 0x256D, 0x256E, 0x256F, 0x2570, 0x2571, 0x2572, 0x2573, 0x2581, 0x2582, 0x2583, 0x2584, 0x2585, 0x2586, 0x2587, 0x003F, 0x2588, 0x2589, 0x258A, 0x258B, 0x258C, 0x258D, 0x258E, 0x258F, 0x2593, 0x2594, 0x2595, 0x25BC, 0x25BD, 0x25E2, 0x25E3, 0x25E4, 0x25E5, 0x2609, 0x2295, 0x3012, 0x301D, 0x301E, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x0101, 0x00E1, 0x01CE, 0x00E0, 0x0113, 0x00E9, 0x011B, 0x00E8, 0x012B, 0x00ED, 0x01D0, 0x00EC, 0x014D, 0x00F3, 0x01D2, 0x00F2, 0x016B, 0x00FA, 0x01D4, 0x00F9, 0x01D6, 0x01D8, 0x01DA, 0x01DC, 0x00FC, 0x00EA, 0x0251, 0x003F, 0x0144, 0x0148, 0x003F, 0x0261, 0x003F, 0x003F, 0x003F, 0x003F, 0x3105, 0x3106, 0x3107, 0x3108, 0x3109, 0x310A, 0x310B, 0x310C, 0x310D, 0x310E, 0x310F, 0x3110, 0x3111, 0x3112, 0x3113, 0x3114, 0x3115, 0x3116, 0x3117, 0x3118, 0x3119, 0x311A, 0x311B, 0x311C, 0x311D, 0x311E, 0x311F, 0x3120, 0x3121, 0x3122, 0x3123, 0x3124, 0x3125, 0x3126, 0x3127, 0x3128, 0x3129, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F }, { 0x3021, 0x3022, 0x3023, 0x3024, 0x3025, 0x3026, 0x3027, 0x3028, 0x3029, 0x32A3, 0x338E, 0x338F, 0x339C, 0x339D, 0x339E, 0x33A1, 0x33C4, 0x33CE, 0x33D1, 0x33D2, 0x33D5, 0xFE30, 0xFFE2, 0xFFE4, 0x003F, 0x2121, 0x3231, 0x003F, 0x2010, 0x003F, 0x003F, 0x003F, 0x30FC, 0x309B, 0x309C, 0x30FD, 0x30FE, 0x3006, 0x309D, 0x309E, 0xFE49, 0xFE4A, 0xFE4B, 0xFE4C, 0xFE4D, 0xFE4E, 0xFE4F, 0xFE50, 0xFE51, 0xFE52, 0xFE54, 0xFE55, 0xFE56, 0xFE57, 0xFE59, 0xFE5A, 0xFE5B, 0xFE5C, 0xFE5D, 0xFE5E, 0xFE5F, 0xFE60, 0xFE61, 0x003F, 0xFE62, 0xFE63, 0xFE64, 0xFE65, 0xFE66, 0xFE68, 0xFE69, 0xFE6A, 0xFE6B, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x3007, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x2500, 0x2501, 0x2502, 0x2503, 0x2504, 0x2505, 0x2506, 0x2507, 0x2508, 0x2509, 0x250A, 0x250B, 0x250C, 0x250D, 0x250E, 0x250F, 0x2510, 0x2511, 0x2512, 0x2513, 0x2514, 0x2515, 0x2516, 0x2517, 0x2518, 0x2519, 0x251A, 0x251B, 0x251C, 0x251D, 0x251E, 0x251F, 0x2520, 0x2521, 0x2522, 0x2523, 0x2524, 0x2525, 0x2526, 0x2527, 0x2528, 0x2529, 0x252A, 0x252B, 0x252C, 0x252D, 0x252E, 0x252F, 0x2530, 0x2531, 0x2532, 0x2533, 0x2534, 0x2535, 0x2536, 0x2537, 0x2538, 0x2539, 0x253A, 0x253B, 0x253C, 0x253D, 0x253E, 0x253F, 0x2540, 0x2541, 0x2542, 0x2543, 0x2544, 0x2545, 0x2546, 0x2547, 0x2548, 0x2549, 0x254A, 0x254B, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F }, { 0x72DC, 0x72DD, 0x72DF, 0x72E2, 0x72E3, 0x72E4, 0x72E5, 0x72E6, 0x72E7, 0x72EA, 0x72EB, 0x72F5, 0x72F6, 0x72F9, 0x72FD, 0x72FE, 0x72FF, 0x7300, 0x7302, 0x7304, 0x7305, 0x7306, 0x7307, 0x7308, 0x7309, 0x730B, 0x730C, 0x730D, 0x730F, 0x7310, 0x7311, 0x7312, 0x7314, 0x7318, 0x7319, 0x731A, 0x731F, 0x7320, 0x7323, 0x7324, 0x7326, 0x7327, 0x7328, 0x732D, 0x732F, 0x7330, 0x7332, 0x7333, 0x7335, 0x7336, 0x733A, 0x733B, 0x733C, 0x733D, 0x7340, 0x7341, 0x7342, 0x7343, 0x7344, 0x7345, 0x7346, 0x7347, 0x7348, 0x003F, 0x7349, 0x734A, 0x734B, 0x734C, 0x734E, 0x734F, 0x7351, 0x7353, 0x7354, 0x7355, 0x7356, 0x7358, 0x7359, 0x735A, 0x735B, 0x735C, 0x735D, 0x735E, 0x735F, 0x7361, 0x7362, 0x7363, 0x7364, 0x7365, 0x7366, 0x7367, 0x7368, 0x7369, 0x736A, 0x736B, 0x736E, 0x7370, 0x7371, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F }, { 0x7372, 0x7373, 0x7374, 0x7375, 0x7376, 0x7377, 0x7378, 0x7379, 0x737A, 0x737B, 0x737C, 0x737D, 0x737F, 0x7380, 0x7381, 0x7382, 0x7383, 0x7385, 0x7386, 0x7388, 0x738A, 0x738C, 0x738D, 0x738F, 0x7390, 0x7392, 0x7393, 0x7394, 0x7395, 0x7397, 0x7398, 0x7399, 0x739A, 0x739C, 0x739D, 0x739E, 0x73A0, 0x73A1, 0x73A3, 0x73A4, 0x73A5, 0x73A6, 0x73A7, 0x73A8, 0x73AA, 0x73AC, 0x73AD, 0x73B1, 0x73B4, 0x73B5, 0x73B6, 0x73B8, 0x73B9, 0x73BC, 0x73BD, 0x73BE, 0x73BF, 0x73C1, 0x73C3, 0x73C4, 0x73C5, 0x73C6, 0x73C7, 0x003F, 0x73CB, 0x73CC, 0x73CE, 0x73D2, 0x73D3, 0x73D4, 0x73D5, 0x73D6, 0x73D7, 0x73D8, 0x73DA, 0x73DB, 0x73DC, 0x73DD, 0x73DF, 0x73E1, 0x73E2, 0x73E3, 0x73E4, 0x73E6, 0x73E8, 0x73EA, 0x73EB, 0x73EC, 0x73EE, 0x73EF, 0x73F0, 0x73F1, 0x73F3, 0x73F4, 0x73F5, 0x73F6, 0x73F7, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F }, { 0x73F8, 0x73F9, 0x73FA, 0x73FB, 0x73FC, 0x73FD, 0x73FE, 0x73FF, 0x7400, 0x7401, 0x7402, 0x7404, 0x7407, 0x7408, 0x740B, 0x740C, 0x740D, 0x740E, 0x7411, 0x7412, 0x7413, 0x7414, 0x7415, 0x7416, 0x7417, 0x7418, 0x7419, 0x741C, 0x741D, 0x741E, 0x741F, 0x7420, 0x7421, 0x7423, 0x7424, 0x7427, 0x7429, 0x742B, 0x742D, 0x742F, 0x7431, 0x7432, 0x7437, 0x7438, 0x7439, 0x743A, 0x743B, 0x743D, 0x743E, 0x743F, 0x7440, 0x7442, 0x7443, 0x7444, 0x7445, 0x7446, 0x7447, 0x7448, 0x7449, 0x744A, 0x744B, 0x744C, 0x744D, 0x003F, 0x744E, 0x744F, 0x7450, 0x7451, 0x7452, 0x7453, 0x7454, 0x7456, 0x7458, 0x745D, 0x7460, 0x7461, 0x7462, 0x7463, 0x7464, 0x7465, 0x7466, 0x7467, 0x7468, 0x7469, 0x746A, 0x746B, 0x746C, 0x746E, 0x746F, 0x7471, 0x7472, 0x7473, 0x7474, 0x7475, 0x7478, 0x7479, 0x747A, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F }, { 0x747B, 0x747C, 0x747D, 0x747F, 0x7482, 0x7484, 0x7485, 0x7486, 0x7488, 0x7489, 0x748A, 0x748C, 0x748D, 0x748F, 0x7491, 0x7492, 0x7493, 0x7494, 0x7495, 0x7496, 0x7497, 0x7498, 0x7499, 0x749A, 0x749B, 0x749D, 0x749F, 0x74A0, 0x74A1, 0x74A2, 0x74A3, 0x74A4, 0x74A5, 0x74A6, 0x74AA, 0x74AB, 0x74AC, 0x74AD, 0x74AE, 0x74AF, 0x74B0, 0x74B1, 0x74B2, 0x74B3, 0x74B4, 0x74B5, 0x74B6, 0x74B7, 0x74B8, 0x74B9, 0x74BB, 0x74BC, 0x74BD, 0x74BE, 0x74BF, 0x74C0, 0x74C1, 0x74C2, 0x74C3, 0x74C4, 0x74C5, 0x74C6, 0x74C7, 0x003F, 0x74C8, 0x74C9, 0x74CA, 0x74CB, 0x74CC, 0x74CD, 0x74CE, 0x74CF, 0x74D0, 0x74D1, 0x74D3, 0x74D4, 0x74D5, 0x74D6, 0x74D7, 0x74D8, 0x74D9, 0x74DA, 0x74DB, 0x74DD, 0x74DF, 0x74E1, 0x74E5, 0x74E7, 0x74E8, 0x74E9, 0x74EA, 0x74EB, 0x74EC, 0x74ED, 0x74F0, 0x74F1, 0x74F2, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F }, { 0x74F3, 0x74F5, 0x74F8, 0x74F9, 0x74FA, 0x74FB, 0x74FC, 0x74FD, 0x74FE, 0x7500, 0x7501, 0x7502, 0x7503, 0x7505, 0x7506, 0x7507, 0x7508, 0x7509, 0x750A, 0x750B, 0x750C, 0x750E, 0x7510, 0x7512, 0x7514, 0x7515, 0x7516, 0x7517, 0x751B, 0x751D, 0x751E, 0x7520, 0x7521, 0x7522, 0x7523, 0x7524, 0x7526, 0x7527, 0x752A, 0x752E, 0x7534, 0x7536, 0x7539, 0x753C, 0x753D, 0x753F, 0x7541, 0x7542, 0x7543, 0x7544, 0x7546, 0x7547, 0x7549, 0x754A, 0x754D, 0x7550, 0x7551, 0x7552, 0x7553, 0x7555, 0x7556, 0x7557, 0x7558, 0x003F, 0x755D, 0x755E, 0x755F, 0x7560, 0x7561, 0x7562, 0x7563, 0x7564, 0x7567, 0x7568, 0x7569, 0x756B, 0x756C, 0x756D, 0x756E, 0x756F, 0x7570, 0x7571, 0x7573, 0x7575, 0x7576, 0x7577, 0x757A, 0x757B, 0x757C, 0x757D, 0x757E, 0x7580, 0x7581, 0x7582, 0x7584, 0x7585, 0x7587, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F }, { 0x7588, 0x7589, 0x758A, 0x758C, 0x758D, 0x758E, 0x7590, 0x7593, 0x7595, 0x7598, 0x759B, 0x759C, 0x759E, 0x75A2, 0x75A6, 0x75A7, 0x75A8, 0x75A9, 0x75AA, 0x75AD, 0x75B6, 0x75B7, 0x75BA, 0x75BB, 0x75BF, 0x75C0, 0x75C1, 0x75C6, 0x75CB, 0x75CC, 0x75CE, 0x75CF, 0x75D0, 0x75D1, 0x75D3, 0x75D7, 0x75D9, 0x75DA, 0x75DC, 0x75DD, 0x75DF, 0x75E0, 0x75E1, 0x75E5, 0x75E9, 0x75EC, 0x75ED, 0x75EE, 0x75EF, 0x75F2, 0x75F3, 0x75F5, 0x75F6, 0x75F7, 0x75F8, 0x75FA, 0x75FB, 0x75FD, 0x75FE, 0x7602, 0x7604, 0x7606, 0x7607, 0x003F, 0x7608, 0x7609, 0x760B, 0x760D, 0x760E, 0x760F, 0x7611, 0x7612, 0x7613, 0x7614, 0x7616, 0x761A, 0x761C, 0x761D, 0x761E, 0x7621, 0x7623, 0x7627, 0x7628, 0x762C, 0x762E, 0x762F, 0x7631, 0x7632, 0x7636, 0x7637, 0x7639, 0x763A, 0x763B, 0x763D, 0x7641, 0x7642, 0x7644, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F }, { 0x7645, 0x7646, 0x7647, 0x7648, 0x7649, 0x764A, 0x764B, 0x764E, 0x764F, 0x7650, 0x7651, 0x7652, 0x7653, 0x7655, 0x7657, 0x7658, 0x7659, 0x765A, 0x765B, 0x765D, 0x765F, 0x7660, 0x7661, 0x7662, 0x7664, 0x7665, 0x7666, 0x7667, 0x7668, 0x7669, 0x766A, 0x766C, 0x766D, 0x766E, 0x7670, 0x7671, 0x7672, 0x7673, 0x7674, 0x7675, 0x7676, 0x7677, 0x7679, 0x767A, 0x767C, 0x767F, 0x7680, 0x7681, 0x7683, 0x7685, 0x7689, 0x768A, 0x768C, 0x768D, 0x768F, 0x7690, 0x7692, 0x7694, 0x7695, 0x7697, 0x7698, 0x769A, 0x769B, 0x003F, 0x769C, 0x769D, 0x769E, 0x769F, 0x76A0, 0x76A1, 0x76A2, 0x76A3, 0x76A5, 0x76A6, 0x76A7, 0x76A8, 0x76A9, 0x76AA, 0x76AB, 0x76AC, 0x76AD, 0x76AF, 0x76B0, 0x76B3, 0x76B5, 0x76B6, 0x76B7, 0x76B8, 0x76B9, 0x76BA, 0x76BB, 0x76BC, 0x76BD, 0x76BE, 0x76C0, 0x76C1, 0x76C3, 0x554A, 0x963F, 0x57C3, 0x6328, 0x54CE, 0x5509, 0x54C0, 0x7691, 0x764C, 0x853C, 0x77EE, 0x827E, 0x788D, 0x7231, 0x9698, 0x978D, 0x6C28, 0x5B89, 0x4FFA, 0x6309, 0x6697, 0x5CB8, 0x80FA, 0x6848, 0x80AE, 0x6602, 0x76CE, 0x51F9, 0x6556, 0x71AC, 0x7FF1, 0x8884, 0x50B2, 0x5965, 0x61CA, 0x6FB3, 0x82AD, 0x634C, 0x6252, 0x53ED, 0x5427, 0x7B06, 0x516B, 0x75A4, 0x5DF4, 0x62D4, 0x8DCB, 0x9776, 0x628A, 0x8019, 0x575D, 0x9738, 0x7F62, 0x7238, 0x767D, 0x67CF, 0x767E, 0x6446, 0x4F70, 0x8D25, 0x62DC, 0x7A17, 0x6591, 0x73ED, 0x642C, 0x6273, 0x822C, 0x9881, 0x677F, 0x7248, 0x626E, 0x62CC, 0x4F34, 0x74E3, 0x534A, 0x529E, 0x7ECA, 0x90A6, 0x5E2E, 0x6886, 0x699C, 0x8180, 0x7ED1, 0x68D2, 0x78C5, 0x868C, 0x9551, 0x508D, 0x8C24, 0x82DE, 0x80DE, 0x5305, 0x8912, 0x5265 }, { 0x76C4, 0x76C7, 0x76C9, 0x76CB, 0x76CC, 0x76D3, 0x76D5, 0x76D9, 0x76DA, 0x76DC, 0x76DD, 0x76DE, 0x76E0, 0x76E1, 0x76E2, 0x76E3, 0x76E4, 0x76E6, 0x76E7, 0x76E8, 0x76E9, 0x76EA, 0x76EB, 0x76EC, 0x76ED, 0x76F0, 0x76F3, 0x76F5, 0x76F6, 0x76F7, 0x76FA, 0x76FB, 0x76FD, 0x76FF, 0x7700, 0x7702, 0x7703, 0x7705, 0x7706, 0x770A, 0x770C, 0x770E, 0x770F, 0x7710, 0x7711, 0x7712, 0x7713, 0x7714, 0x7715, 0x7716, 0x7717, 0x7718, 0x771B, 0x771C, 0x771D, 0x771E, 0x7721, 0x7723, 0x7724, 0x7725, 0x7727, 0x772A, 0x772B, 0x003F, 0x772C, 0x772E, 0x7730, 0x7731, 0x7732, 0x7733, 0x7734, 0x7739, 0x773B, 0x773D, 0x773E, 0x773F, 0x7742, 0x7744, 0x7745, 0x7746, 0x7748, 0x7749, 0x774A, 0x774B, 0x774C, 0x774D, 0x774E, 0x774F, 0x7752, 0x7753, 0x7754, 0x7755, 0x7756, 0x7757, 0x7758, 0x7759, 0x775C, 0x8584, 0x96F9, 0x4FDD, 0x5821, 0x9971, 0x5B9D, 0x62B1, 0x62A5, 0x66B4, 0x8C79, 0x9C8D, 0x7206, 0x676F, 0x7891, 0x60B2, 0x5351, 0x5317, 0x8F88, 0x80CC, 0x8D1D, 0x94A1, 0x500D, 0x72C8, 0x5907, 0x60EB, 0x7119, 0x88AB, 0x5954, 0x82EF, 0x672C, 0x7B28, 0x5D29, 0x7EF7, 0x752D, 0x6CF5, 0x8E66, 0x8FF8, 0x903C, 0x9F3B, 0x6BD4, 0x9119, 0x7B14, 0x5F7C, 0x78A7, 0x84D6, 0x853D, 0x6BD5, 0x6BD9, 0x6BD6, 0x5E01, 0x5E87, 0x75F9, 0x95ED, 0x655D, 0x5F0A, 0x5FC5, 0x8F9F, 0x58C1, 0x81C2, 0x907F, 0x965B, 0x97AD, 0x8FB9, 0x7F16, 0x8D2C, 0x6241, 0x4FBF, 0x53D8, 0x535E, 0x8FA8, 0x8FA9, 0x8FAB, 0x904D, 0x6807, 0x5F6A, 0x8198, 0x8868, 0x9CD6, 0x618B, 0x522B, 0x762A, 0x5F6C, 0x658C, 0x6FD2, 0x6EE8, 0x5BBE, 0x6448, 0x5175, 0x51B0, 0x67C4, 0x4E19, 0x79C9, 0x997C, 0x70B3 }, { 0x775D, 0x775E, 0x775F, 0x7760, 0x7764, 0x7767, 0x7769, 0x776A, 0x776D, 0x776E, 0x776F, 0x7770, 0x7771, 0x7772, 0x7773, 0x7774, 0x7775, 0x7776, 0x7777, 0x7778, 0x777A, 0x777B, 0x777C, 0x7781, 0x7782, 0x7783, 0x7786, 0x7787, 0x7788, 0x7789, 0x778A, 0x778B, 0x778F, 0x7790, 0x7793, 0x7794, 0x7795, 0x7796, 0x7797, 0x7798, 0x7799, 0x779A, 0x779B, 0x779C, 0x779D, 0x779E, 0x77A1, 0x77A3, 0x77A4, 0x77A6, 0x77A8, 0x77AB, 0x77AD, 0x77AE, 0x77AF, 0x77B1, 0x77B2, 0x77B4, 0x77B6, 0x77B7, 0x77B8, 0x77B9, 0x77BA, 0x003F, 0x77BC, 0x77BE, 0x77C0, 0x77C1, 0x77C2, 0x77C3, 0x77C4, 0x77C5, 0x77C6, 0x77C7, 0x77C8, 0x77C9, 0x77CA, 0x77CB, 0x77CC, 0x77CE, 0x77CF, 0x77D0, 0x77D1, 0x77D2, 0x77D3, 0x77D4, 0x77D5, 0x77D6, 0x77D8, 0x77D9, 0x77DA, 0x77DD, 0x77DE, 0x77DF, 0x77E0, 0x77E1, 0x77E4, 0x75C5, 0x5E76, 0x73BB, 0x83E0, 0x64AD, 0x62E8, 0x94B5, 0x6CE2, 0x535A, 0x52C3, 0x640F, 0x94C2, 0x7B94, 0x4F2F, 0x5E1B, 0x8236, 0x8116, 0x818A, 0x6E24, 0x6CCA, 0x9A73, 0x6355, 0x535C, 0x54FA, 0x8865, 0x57E0, 0x4E0D, 0x5E03, 0x6B65, 0x7C3F, 0x90E8, 0x6016, 0x64E6, 0x731C, 0x88C1, 0x6750, 0x624D, 0x8D22, 0x776C, 0x8E29, 0x91C7, 0x5F69, 0x83DC, 0x8521, 0x9910, 0x53C2, 0x8695, 0x6B8B, 0x60ED, 0x60E8, 0x707F, 0x82CD, 0x8231, 0x4ED3, 0x6CA7, 0x85CF, 0x64CD, 0x7CD9, 0x69FD, 0x66F9, 0x8349, 0x5395, 0x7B56, 0x4FA7, 0x518C, 0x6D4B, 0x5C42, 0x8E6D, 0x63D2, 0x53C9, 0x832C, 0x8336, 0x67E5, 0x78B4, 0x643D, 0x5BDF, 0x5C94, 0x5DEE, 0x8BE7, 0x62C6, 0x67F4, 0x8C7A, 0x6400, 0x63BA, 0x8749, 0x998B, 0x8C17, 0x7F20, 0x94F2, 0x4EA7, 0x9610, 0x98A4, 0x660C, 0x7316 }, { 0x77E6, 0x77E8, 0x77EA, 0x77EF, 0x77F0, 0x77F1, 0x77F2, 0x77F4, 0x77F5, 0x77F7, 0x77F9, 0x77FA, 0x77FB, 0x77FC, 0x7803, 0x7804, 0x7805, 0x7806, 0x7807, 0x7808, 0x780A, 0x780B, 0x780E, 0x780F, 0x7810, 0x7813, 0x7815, 0x7819, 0x781B, 0x781E, 0x7820, 0x7821, 0x7822, 0x7824, 0x7828, 0x782A, 0x782B, 0x782E, 0x782F, 0x7831, 0x7832, 0x7833, 0x7835, 0x7836, 0x783D, 0x783F, 0x7841, 0x7842, 0x7843, 0x7844, 0x7846, 0x7848, 0x7849, 0x784A, 0x784B, 0x784D, 0x784F, 0x7851, 0x7853, 0x7854, 0x7858, 0x7859, 0x785A, 0x003F, 0x785B, 0x785C, 0x785E, 0x785F, 0x7860, 0x7861, 0x7862, 0x7863, 0x7864, 0x7865, 0x7866, 0x7867, 0x7868, 0x7869, 0x786F, 0x7870, 0x7871, 0x7872, 0x7873, 0x7874, 0x7875, 0x7876, 0x7878, 0x7879, 0x787A, 0x787B, 0x787D, 0x787E, 0x787F, 0x7880, 0x7881, 0x7882, 0x7883, 0x573A, 0x5C1D, 0x5E38, 0x957F, 0x507F, 0x80A0, 0x5382, 0x655E, 0x7545, 0x5531, 0x5021, 0x8D85, 0x6284, 0x949E, 0x671D, 0x5632, 0x6F6E, 0x5DE2, 0x5435, 0x7092, 0x8F66, 0x626F, 0x64A4, 0x63A3, 0x5F7B, 0x6F88, 0x90F4, 0x81E3, 0x8FB0, 0x5C18, 0x6668, 0x5FF1, 0x6C89, 0x9648, 0x8D81, 0x886C, 0x6491, 0x79F0, 0x57CE, 0x6A59, 0x6210, 0x5448, 0x4E58, 0x7A0B, 0x60E9, 0x6F84, 0x8BDA, 0x627F, 0x901E, 0x9A8B, 0x79E4, 0x5403, 0x75F4, 0x6301, 0x5319, 0x6C60, 0x8FDF, 0x5F1B, 0x9A70, 0x803B, 0x9F7F, 0x4F88, 0x5C3A, 0x8D64, 0x7FC5, 0x65A5, 0x70BD, 0x5145, 0x51B2, 0x866B, 0x5D07, 0x5BA0, 0x62BD, 0x916C, 0x7574, 0x8E0C, 0x7A20, 0x6101, 0x7B79, 0x4EC7, 0x7EF8, 0x7785, 0x4E11, 0x81ED, 0x521D, 0x51FA, 0x6A71, 0x53A8, 0x8E87, 0x9504, 0x96CF, 0x6EC1, 0x9664, 0x695A }, { 0x7884, 0x7885, 0x7886, 0x7888, 0x788A, 0x788B, 0x788F, 0x7890, 0x7892, 0x7894, 0x7895, 0x7896, 0x7899, 0x789D, 0x789E, 0x78A0, 0x78A2, 0x78A4, 0x78A6, 0x78A8, 0x78A9, 0x78AA, 0x78AB, 0x78AC, 0x78AD, 0x78AE, 0x78AF, 0x78B5, 0x78B6, 0x78B7, 0x78B8, 0x78BA, 0x78BB, 0x78BC, 0x78BD, 0x78BF, 0x78C0, 0x78C2, 0x78C3, 0x78C4, 0x78C6, 0x78C7, 0x78C8, 0x78CC, 0x78CD, 0x78CE, 0x78CF, 0x78D1, 0x78D2, 0x78D3, 0x78D6, 0x78D7, 0x78D8, 0x78DA, 0x78DB, 0x78DC, 0x78DD, 0x78DE, 0x78DF, 0x78E0, 0x78E1, 0x78E2, 0x78E3, 0x003F, 0x78E4, 0x78E5, 0x78E6, 0x78E7, 0x78E9, 0x78EA, 0x78EB, 0x78ED, 0x78EE, 0x78EF, 0x78F0, 0x78F1, 0x78F3, 0x78F5, 0x78F6, 0x78F8, 0x78F9, 0x78FB, 0x78FC, 0x78FD, 0x78FE, 0x78FF, 0x7900, 0x7902, 0x7903, 0x7904, 0x7906, 0x7907, 0x7908, 0x7909, 0x790A, 0x790B, 0x790C, 0x7840, 0x50A8, 0x77D7, 0x6410, 0x89E6, 0x5904, 0x63E3, 0x5DDD, 0x7A7F, 0x693D, 0x4F20, 0x8239, 0x5598, 0x4E32, 0x75AE, 0x7A97, 0x5E62, 0x5E8A, 0x95EF, 0x521B, 0x5439, 0x708A, 0x6376, 0x9524, 0x5782, 0x6625, 0x693F, 0x9187, 0x5507, 0x6DF3, 0x7EAF, 0x8822, 0x6233, 0x7EF0, 0x75B5, 0x8328, 0x78C1, 0x96CC, 0x8F9E, 0x6148, 0x74F7, 0x8BCD, 0x6B64, 0x523A, 0x8D50, 0x6B21, 0x806A, 0x8471, 0x56F1, 0x5306, 0x4ECE, 0x4E1B, 0x51D1, 0x7C97, 0x918B, 0x7C07, 0x4FC3, 0x8E7F, 0x7BE1, 0x7A9C, 0x6467, 0x5D14, 0x50AC, 0x8106, 0x7601, 0x7CB9, 0x6DEC, 0x7FE0, 0x6751, 0x5B58, 0x5BF8, 0x78CB, 0x64AE, 0x6413, 0x63AA, 0x632B, 0x9519, 0x642D, 0x8FBE, 0x7B54, 0x7629, 0x6253, 0x5927, 0x5446, 0x6B79, 0x50A3, 0x6234, 0x5E26, 0x6B86, 0x4EE3, 0x8D37, 0x888B, 0x5F85, 0x902E }, { 0x790D, 0x790E, 0x790F, 0x7910, 0x7911, 0x7912, 0x7914, 0x7915, 0x7916, 0x7917, 0x7918, 0x7919, 0x791A, 0x791B, 0x791C, 0x791D, 0x791F, 0x7920, 0x7921, 0x7922, 0x7923, 0x7925, 0x7926, 0x7927, 0x7928, 0x7929, 0x792A, 0x792B, 0x792C, 0x792D, 0x792E, 0x792F, 0x7930, 0x7931, 0x7932, 0x7933, 0x7935, 0x7936, 0x7937, 0x7938, 0x7939, 0x793D, 0x793F, 0x7942, 0x7943, 0x7944, 0x7945, 0x7947, 0x794A, 0x794B, 0x794C, 0x794D, 0x794E, 0x794F, 0x7950, 0x7951, 0x7952, 0x7954, 0x7955, 0x7958, 0x7959, 0x7961, 0x7963, 0x003F, 0x7964, 0x7966, 0x7969, 0x796A, 0x796B, 0x796C, 0x796E, 0x7970, 0x7971, 0x7972, 0x7973, 0x7974, 0x7975, 0x7976, 0x7979, 0x797B, 0x797C, 0x797D, 0x797E, 0x797F, 0x7982, 0x7983, 0x7986, 0x7987, 0x7988, 0x7989, 0x798B, 0x798C, 0x798D, 0x798E, 0x7990, 0x7991, 0x7992, 0x6020, 0x803D, 0x62C5, 0x4E39, 0x5355, 0x90F8, 0x63B8, 0x80C6, 0x65E6, 0x6C2E, 0x4F46, 0x60EE, 0x6DE1, 0x8BDE, 0x5F39, 0x86CB, 0x5F53, 0x6321, 0x515A, 0x8361, 0x6863, 0x5200, 0x6363, 0x8E48, 0x5012, 0x5C9B, 0x7977, 0x5BFC, 0x5230, 0x7A3B, 0x60BC, 0x9053, 0x76D7, 0x5FB7, 0x5F97, 0x7684, 0x8E6C, 0x706F, 0x767B, 0x7B49, 0x77AA, 0x51F3, 0x9093, 0x5824, 0x4F4E, 0x6EF4, 0x8FEA, 0x654C, 0x7B1B, 0x72C4, 0x6DA4, 0x7FDF, 0x5AE1, 0x62B5, 0x5E95, 0x5730, 0x8482, 0x7B2C, 0x5E1D, 0x5F1F, 0x9012, 0x7F14, 0x98A0, 0x6382, 0x6EC7, 0x7898, 0x70B9, 0x5178, 0x975B, 0x57AB, 0x7535, 0x4F43, 0x7538, 0x5E97, 0x60E6, 0x5960, 0x6DC0, 0x6BBF, 0x7889, 0x53FC, 0x96D5, 0x51CB, 0x5201, 0x6389, 0x540A, 0x9493, 0x8C03, 0x8DCC, 0x7239, 0x789F, 0x8776, 0x8FED, 0x8C0D, 0x53E0 }, { 0x7993, 0x7994, 0x7995, 0x7996, 0x7997, 0x7998, 0x7999, 0x799B, 0x799C, 0x799D, 0x799E, 0x799F, 0x79A0, 0x79A1, 0x79A2, 0x79A3, 0x79A4, 0x79A5, 0x79A6, 0x79A8, 0x79A9, 0x79AA, 0x79AB, 0x79AC, 0x79AD, 0x79AE, 0x79AF, 0x79B0, 0x79B1, 0x79B2, 0x79B4, 0x79B5, 0x79B6, 0x79B7, 0x79B8, 0x79BC, 0x79BF, 0x79C2, 0x79C4, 0x79C5, 0x79C7, 0x79C8, 0x79CA, 0x79CC, 0x79CE, 0x79CF, 0x79D0, 0x79D3, 0x79D4, 0x79D6, 0x79D7, 0x79D9, 0x79DA, 0x79DB, 0x79DC, 0x79DD, 0x79DE, 0x79E0, 0x79E1, 0x79E2, 0x79E5, 0x79E8, 0x79EA, 0x003F, 0x79EC, 0x79EE, 0x79F1, 0x79F2, 0x79F3, 0x79F4, 0x79F5, 0x79F6, 0x79F7, 0x79F9, 0x79FA, 0x79FC, 0x79FE, 0x79FF, 0x7A01, 0x7A04, 0x7A05, 0x7A07, 0x7A08, 0x7A09, 0x7A0A, 0x7A0C, 0x7A0F, 0x7A10, 0x7A11, 0x7A12, 0x7A13, 0x7A15, 0x7A16, 0x7A18, 0x7A19, 0x7A1B, 0x7A1C, 0x4E01, 0x76EF, 0x53EE, 0x9489, 0x9876, 0x9F0E, 0x952D, 0x5B9A, 0x8BA2, 0x4E22, 0x4E1C, 0x51AC, 0x8463, 0x61C2, 0x52A8, 0x680B, 0x4F97, 0x606B, 0x51BB, 0x6D1E, 0x515C, 0x6296, 0x6597, 0x9661, 0x8C46, 0x9017, 0x75D8, 0x90FD, 0x7763, 0x6BD2, 0x728A, 0x72EC, 0x8BFB, 0x5835, 0x7779, 0x8D4C, 0x675C, 0x9540, 0x809A, 0x5EA6, 0x6E21, 0x5992, 0x7AEF, 0x77ED, 0x953B, 0x6BB5, 0x65AD, 0x7F0E, 0x5806, 0x5151, 0x961F, 0x5BF9, 0x58A9, 0x5428, 0x8E72, 0x6566, 0x987F, 0x56E4, 0x949D, 0x76FE, 0x9041, 0x6387, 0x54C6, 0x591A, 0x593A, 0x579B, 0x8EB2, 0x6735, 0x8DFA, 0x8235, 0x5241, 0x60F0, 0x5815, 0x86FE, 0x5CE8, 0x9E45, 0x4FC4, 0x989D, 0x8BB9, 0x5A25, 0x6076, 0x5384, 0x627C, 0x904F, 0x9102, 0x997F, 0x6069, 0x800C, 0x513F, 0x8033, 0x5C14, 0x9975, 0x6D31, 0x4E8C }, { 0x7A1D, 0x7A1F, 0x7A21, 0x7A22, 0x7A24, 0x7A25, 0x7A26, 0x7A27, 0x7A28, 0x7A29, 0x7A2A, 0x7A2B, 0x7A2C, 0x7A2D, 0x7A2E, 0x7A2F, 0x7A30, 0x7A31, 0x7A32, 0x7A34, 0x7A35, 0x7A36, 0x7A38, 0x7A3A, 0x7A3E, 0x7A40, 0x7A41, 0x7A42, 0x7A43, 0x7A44, 0x7A45, 0x7A47, 0x7A48, 0x7A49, 0x7A4A, 0x7A4B, 0x7A4C, 0x7A4D, 0x7A4E, 0x7A4F, 0x7A50, 0x7A52, 0x7A53, 0x7A54, 0x7A55, 0x7A56, 0x7A58, 0x7A59, 0x7A5A, 0x7A5B, 0x7A5C, 0x7A5D, 0x7A5E, 0x7A5F, 0x7A60, 0x7A61, 0x7A62, 0x7A63, 0x7A64, 0x7A65, 0x7A66, 0x7A67, 0x7A68, 0x003F, 0x7A69, 0x7A6A, 0x7A6B, 0x7A6C, 0x7A6D, 0x7A6E, 0x7A6F, 0x7A71, 0x7A72, 0x7A73, 0x7A75, 0x7A7B, 0x7A7C, 0x7A7D, 0x7A7E, 0x7A82, 0x7A85, 0x7A87, 0x7A89, 0x7A8A, 0x7A8B, 0x7A8C, 0x7A8E, 0x7A8F, 0x7A90, 0x7A93, 0x7A94, 0x7A99, 0x7A9A, 0x7A9B, 0x7A9E, 0x7AA1, 0x7AA2, 0x8D30, 0x53D1, 0x7F5A, 0x7B4F, 0x4F10, 0x4E4F, 0x9600, 0x6CD5, 0x73D0, 0x85E9, 0x5E06, 0x756A, 0x7FFB, 0x6A0A, 0x77FE, 0x9492, 0x7E41, 0x51E1, 0x70E6, 0x53CD, 0x8FD4, 0x8303, 0x8D29, 0x72AF, 0x996D, 0x6CDB, 0x574A, 0x82B3, 0x65B9, 0x80AA, 0x623F, 0x9632, 0x59A8, 0x4EFF, 0x8BBF, 0x7EBA, 0x653E, 0x83F2, 0x975E, 0x5561, 0x98DE, 0x80A5, 0x532A, 0x8BFD, 0x5420, 0x80BA, 0x5E9F, 0x6CB8, 0x8D39, 0x82AC, 0x915A, 0x5429, 0x6C1B, 0x5206, 0x7EB7, 0x575F, 0x711A, 0x6C7E, 0x7C89, 0x594B, 0x4EFD, 0x5FFF, 0x6124, 0x7CAA, 0x4E30, 0x5C01, 0x67AB, 0x8702, 0x5CF0, 0x950B, 0x98CE, 0x75AF, 0x70FD, 0x9022, 0x51AF, 0x7F1D, 0x8BBD, 0x5949, 0x51E4, 0x4F5B, 0x5426, 0x592B, 0x6577, 0x80A4, 0x5B75, 0x6276, 0x62C2, 0x8F90, 0x5E45, 0x6C1F, 0x7B26, 0x4F0F, 0x4FD8, 0x670D }, { 0x7AA3, 0x7AA4, 0x7AA7, 0x7AA9, 0x7AAA, 0x7AAB, 0x7AAE, 0x7AAF, 0x7AB0, 0x7AB1, 0x7AB2, 0x7AB4, 0x7AB5, 0x7AB6, 0x7AB7, 0x7AB8, 0x7AB9, 0x7ABA, 0x7ABB, 0x7ABC, 0x7ABD, 0x7ABE, 0x7AC0, 0x7AC1, 0x7AC2, 0x7AC3, 0x7AC4, 0x7AC5, 0x7AC6, 0x7AC7, 0x7AC8, 0x7AC9, 0x7ACA, 0x7ACC, 0x7ACD, 0x7ACE, 0x7ACF, 0x7AD0, 0x7AD1, 0x7AD2, 0x7AD3, 0x7AD4, 0x7AD5, 0x7AD7, 0x7AD8, 0x7ADA, 0x7ADB, 0x7ADC, 0x7ADD, 0x7AE1, 0x7AE2, 0x7AE4, 0x7AE7, 0x7AE8, 0x7AE9, 0x7AEA, 0x7AEB, 0x7AEC, 0x7AEE, 0x7AF0, 0x7AF1, 0x7AF2, 0x7AF3, 0x003F, 0x7AF4, 0x7AF5, 0x7AF6, 0x7AF7, 0x7AF8, 0x7AFB, 0x7AFC, 0x7AFE, 0x7B00, 0x7B01, 0x7B02, 0x7B05, 0x7B07, 0x7B09, 0x7B0C, 0x7B0D, 0x7B0E, 0x7B10, 0x7B12, 0x7B13, 0x7B16, 0x7B17, 0x7B18, 0x7B1A, 0x7B1C, 0x7B1D, 0x7B1F, 0x7B21, 0x7B22, 0x7B23, 0x7B27, 0x7B29, 0x7B2D, 0x6D6E, 0x6DAA, 0x798F, 0x88B1, 0x5F17, 0x752B, 0x629A, 0x8F85, 0x4FEF, 0x91DC, 0x65A7, 0x812F, 0x8151, 0x5E9C, 0x8150, 0x8D74, 0x526F, 0x8986, 0x8D4B, 0x590D, 0x5085, 0x4ED8, 0x961C, 0x7236, 0x8179, 0x8D1F, 0x5BCC, 0x8BA3, 0x9644, 0x5987, 0x7F1A, 0x5490, 0x5676, 0x560E, 0x8BE5, 0x6539, 0x6982, 0x9499, 0x76D6, 0x6E89, 0x5E72, 0x7518, 0x6746, 0x67D1, 0x7AFF, 0x809D, 0x8D76, 0x611F, 0x79C6, 0x6562, 0x8D63, 0x5188, 0x521A, 0x94A2, 0x7F38, 0x809B, 0x7EB2, 0x5C97, 0x6E2F, 0x6760, 0x7BD9, 0x768B, 0x9AD8, 0x818F, 0x7F94, 0x7CD5, 0x641E, 0x9550, 0x7A3F, 0x544A, 0x54E5, 0x6B4C, 0x6401, 0x6208, 0x9E3D, 0x80F3, 0x7599, 0x5272, 0x9769, 0x845B, 0x683C, 0x86E4, 0x9601, 0x9694, 0x94EC, 0x4E2A, 0x5404, 0x7ED9, 0x6839, 0x8DDF, 0x8015, 0x66F4, 0x5E9A, 0x7FB9 }, { 0x7B2F, 0x7B30, 0x7B32, 0x7B34, 0x7B35, 0x7B36, 0x7B37, 0x7B39, 0x7B3B, 0x7B3D, 0x7B3F, 0x7B40, 0x7B41, 0x7B42, 0x7B43, 0x7B44, 0x7B46, 0x7B48, 0x7B4A, 0x7B4D, 0x7B4E, 0x7B53, 0x7B55, 0x7B57, 0x7B59, 0x7B5C, 0x7B5E, 0x7B5F, 0x7B61, 0x7B63, 0x7B64, 0x7B65, 0x7B66, 0x7B67, 0x7B68, 0x7B69, 0x7B6A, 0x7B6B, 0x7B6C, 0x7B6D, 0x7B6F, 0x7B70, 0x7B73, 0x7B74, 0x7B76, 0x7B78, 0x7B7A, 0x7B7C, 0x7B7D, 0x7B7F, 0x7B81, 0x7B82, 0x7B83, 0x7B84, 0x7B86, 0x7B87, 0x7B88, 0x7B89, 0x7B8A, 0x7B8B, 0x7B8C, 0x7B8E, 0x7B8F, 0x003F, 0x7B91, 0x7B92, 0x7B93, 0x7B96, 0x7B98, 0x7B99, 0x7B9A, 0x7B9B, 0x7B9E, 0x7B9F, 0x7BA0, 0x7BA3, 0x7BA4, 0x7BA5, 0x7BAE, 0x7BAF, 0x7BB0, 0x7BB2, 0x7BB3, 0x7BB5, 0x7BB6, 0x7BB7, 0x7BB9, 0x7BBA, 0x7BBB, 0x7BBC, 0x7BBD, 0x7BBE, 0x7BBF, 0x7BC0, 0x7BC2, 0x7BC3, 0x7BC4, 0x57C2, 0x803F, 0x6897, 0x5DE5, 0x653B, 0x529F, 0x606D, 0x9F9A, 0x4F9B, 0x8EAC, 0x516C, 0x5BAB, 0x5F13, 0x5DE9, 0x6C5E, 0x62F1, 0x8D21, 0x5171, 0x94A9, 0x52FE, 0x6C9F, 0x82DF, 0x72D7, 0x57A2, 0x6784, 0x8D2D, 0x591F, 0x8F9C, 0x83C7, 0x5495, 0x7B8D, 0x4F30, 0x6CBD, 0x5B64, 0x59D1, 0x9F13, 0x53E4, 0x86CA, 0x9AA8, 0x8C37, 0x80A1, 0x6545, 0x987E, 0x56FA, 0x96C7, 0x522E, 0x74DC, 0x5250, 0x5BE1, 0x6302, 0x8902, 0x4E56, 0x62D0, 0x602A, 0x68FA, 0x5173, 0x5B98, 0x51A0, 0x89C2, 0x7BA1, 0x9986, 0x7F50, 0x60EF, 0x704C, 0x8D2F, 0x5149, 0x5E7F, 0x901B, 0x7470, 0x89C4, 0x572D, 0x7845, 0x5F52, 0x9F9F, 0x95FA, 0x8F68, 0x9B3C, 0x8BE1, 0x7678, 0x6842, 0x67DC, 0x8DEA, 0x8D35, 0x523D, 0x8F8A, 0x6EDA, 0x68CD, 0x9505, 0x90ED, 0x56FD, 0x679C, 0x88F9, 0x8FC7, 0x54C8 }, { 0x7BC5, 0x7BC8, 0x7BC9, 0x7BCA, 0x7BCB, 0x7BCD, 0x7BCE, 0x7BCF, 0x7BD0, 0x7BD2, 0x7BD4, 0x7BD5, 0x7BD6, 0x7BD7, 0x7BD8, 0x7BDB, 0x7BDC, 0x7BDE, 0x7BDF, 0x7BE0, 0x7BE2, 0x7BE3, 0x7BE4, 0x7BE7, 0x7BE8, 0x7BE9, 0x7BEB, 0x7BEC, 0x7BED, 0x7BEF, 0x7BF0, 0x7BF2, 0x7BF3, 0x7BF4, 0x7BF5, 0x7BF6, 0x7BF8, 0x7BF9, 0x7BFA, 0x7BFB, 0x7BFD, 0x7BFF, 0x7C00, 0x7C01, 0x7C02, 0x7C03, 0x7C04, 0x7C05, 0x7C06, 0x7C08, 0x7C09, 0x7C0A, 0x7C0D, 0x7C0E, 0x7C10, 0x7C11, 0x7C12, 0x7C13, 0x7C14, 0x7C15, 0x7C17, 0x7C18, 0x7C19, 0x003F, 0x7C1A, 0x7C1B, 0x7C1C, 0x7C1D, 0x7C1E, 0x7C20, 0x7C21, 0x7C22, 0x7C23, 0x7C24, 0x7C25, 0x7C28, 0x7C29, 0x7C2B, 0x7C2C, 0x7C2D, 0x7C2E, 0x7C2F, 0x7C30, 0x7C31, 0x7C32, 0x7C33, 0x7C34, 0x7C35, 0x7C36, 0x7C37, 0x7C39, 0x7C3A, 0x7C3B, 0x7C3C, 0x7C3D, 0x7C3E, 0x7C42, 0x9AB8, 0x5B69, 0x6D77, 0x6C26, 0x4EA5, 0x5BB3, 0x9A87, 0x9163, 0x61A8, 0x90AF, 0x97E9, 0x542B, 0x6DB5, 0x5BD2, 0x51FD, 0x558A, 0x7F55, 0x7FF0, 0x64BC, 0x634D, 0x65F1, 0x61BE, 0x608D, 0x710A, 0x6C57, 0x6C49, 0x592F, 0x676D, 0x822A, 0x58D5, 0x568E, 0x8C6A, 0x6BEB, 0x90DD, 0x597D, 0x8017, 0x53F7, 0x6D69, 0x5475, 0x559D, 0x8377, 0x83CF, 0x6838, 0x79BE, 0x548C, 0x4F55, 0x5408, 0x76D2, 0x8C89, 0x9602, 0x6CB3, 0x6DB8, 0x8D6B, 0x8910, 0x9E64, 0x8D3A, 0x563F, 0x9ED1, 0x75D5, 0x5F88, 0x72E0, 0x6068, 0x54FC, 0x4EA8, 0x6A2A, 0x8861, 0x6052, 0x8F70, 0x54C4, 0x70D8, 0x8679, 0x9E3F, 0x6D2A, 0x5B8F, 0x5F18, 0x7EA2, 0x5589, 0x4FAF, 0x7334, 0x543C, 0x539A, 0x5019, 0x540E, 0x547C, 0x4E4E, 0x5FFD, 0x745A, 0x58F6, 0x846B, 0x80E1, 0x8774, 0x72D0, 0x7CCA, 0x6E56 }, { 0x7C43, 0x7C44, 0x7C45, 0x7C46, 0x7C47, 0x7C48, 0x7C49, 0x7C4A, 0x7C4B, 0x7C4C, 0x7C4E, 0x7C4F, 0x7C50, 0x7C51, 0x7C52, 0x7C53, 0x7C54, 0x7C55, 0x7C56, 0x7C57, 0x7C58, 0x7C59, 0x7C5A, 0x7C5B, 0x7C5C, 0x7C5D, 0x7C5E, 0x7C5F, 0x7C60, 0x7C61, 0x7C62, 0x7C63, 0x7C64, 0x7C65, 0x7C66, 0x7C67, 0x7C68, 0x7C69, 0x7C6A, 0x7C6B, 0x7C6C, 0x7C6D, 0x7C6E, 0x7C6F, 0x7C70, 0x7C71, 0x7C72, 0x7C75, 0x7C76, 0x7C77, 0x7C78, 0x7C79, 0x7C7A, 0x7C7E, 0x7C7F, 0x7C80, 0x7C81, 0x7C82, 0x7C83, 0x7C84, 0x7C85, 0x7C86, 0x7C87, 0x003F, 0x7C88, 0x7C8A, 0x7C8B, 0x7C8C, 0x7C8D, 0x7C8E, 0x7C8F, 0x7C90, 0x7C93, 0x7C94, 0x7C96, 0x7C99, 0x7C9A, 0x7C9B, 0x7CA0, 0x7CA1, 0x7CA3, 0x7CA6, 0x7CA7, 0x7CA8, 0x7CA9, 0x7CAB, 0x7CAC, 0x7CAD, 0x7CAF, 0x7CB0, 0x7CB4, 0x7CB5, 0x7CB6, 0x7CB7, 0x7CB8, 0x7CBA, 0x7CBB, 0x5F27, 0x864E, 0x552C, 0x62A4, 0x4E92, 0x6CAA, 0x6237, 0x82B1, 0x54D7, 0x534E, 0x733E, 0x6ED1, 0x753B, 0x5212, 0x5316, 0x8BDD, 0x69D0, 0x5F8A, 0x6000, 0x6DEE, 0x574F, 0x6B22, 0x73AF, 0x6853, 0x8FD8, 0x7F13, 0x6362, 0x60A3, 0x5524, 0x75EA, 0x8C62, 0x7115, 0x6DA3, 0x5BA6, 0x5E7B, 0x8352, 0x614C, 0x9EC4, 0x78FA, 0x8757, 0x7C27, 0x7687, 0x51F0, 0x60F6, 0x714C, 0x6643, 0x5E4C, 0x604D, 0x8C0E, 0x7070, 0x6325, 0x8F89, 0x5FBD, 0x6062, 0x86D4, 0x56DE, 0x6BC1, 0x6094, 0x6167, 0x5349, 0x60E0, 0x6666, 0x8D3F, 0x79FD, 0x4F1A, 0x70E9, 0x6C47, 0x8BB3, 0x8BF2, 0x7ED8, 0x8364, 0x660F, 0x5A5A, 0x9B42, 0x6D51, 0x6DF7, 0x8C41, 0x6D3B, 0x4F19, 0x706B, 0x83B7, 0x6216, 0x60D1, 0x970D, 0x8D27, 0x7978, 0x51FB, 0x573E, 0x57FA, 0x673A, 0x7578, 0x7A3D, 0x79EF, 0x7B95 }, { 0x7CBF, 0x7CC0, 0x7CC2, 0x7CC3, 0x7CC4, 0x7CC6, 0x7CC9, 0x7CCB, 0x7CCE, 0x7CCF, 0x7CD0, 0x7CD1, 0x7CD2, 0x7CD3, 0x7CD4, 0x7CD8, 0x7CDA, 0x7CDB, 0x7CDD, 0x7CDE, 0x7CE1, 0x7CE2, 0x7CE3, 0x7CE4, 0x7CE5, 0x7CE6, 0x7CE7, 0x7CE9, 0x7CEA, 0x7CEB, 0x7CEC, 0x7CED, 0x7CEE, 0x7CF0, 0x7CF1, 0x7CF2, 0x7CF3, 0x7CF4, 0x7CF5, 0x7CF6, 0x7CF7, 0x7CF9, 0x7CFA, 0x7CFC, 0x7CFD, 0x7CFE, 0x7CFF, 0x7D00, 0x7D01, 0x7D02, 0x7D03, 0x7D04, 0x7D05, 0x7D06, 0x7D07, 0x7D08, 0x7D09, 0x7D0B, 0x7D0C, 0x7D0D, 0x7D0E, 0x7D0F, 0x7D10, 0x003F, 0x7D11, 0x7D12, 0x7D13, 0x7D14, 0x7D15, 0x7D16, 0x7D17, 0x7D18, 0x7D19, 0x7D1A, 0x7D1B, 0x7D1C, 0x7D1D, 0x7D1E, 0x7D1F, 0x7D21, 0x7D23, 0x7D24, 0x7D25, 0x7D26, 0x7D28, 0x7D29, 0x7D2A, 0x7D2C, 0x7D2D, 0x7D2E, 0x7D30, 0x7D31, 0x7D32, 0x7D33, 0x7D34, 0x7D35, 0x7D36, 0x808C, 0x9965, 0x8FF9, 0x6FC0, 0x8BA5, 0x9E21, 0x59EC, 0x7EE9, 0x7F09, 0x5409, 0x6781, 0x68D8, 0x8F91, 0x7C4D, 0x96C6, 0x53CA, 0x6025, 0x75BE, 0x6C72, 0x5373, 0x5AC9, 0x7EA7, 0x6324, 0x51E0, 0x810A, 0x5DF1, 0x84DF, 0x6280, 0x5180, 0x5B63, 0x4F0E, 0x796D, 0x5242, 0x60B8, 0x6D4E, 0x5BC4, 0x5BC2, 0x8BA1, 0x8BB0, 0x65E2, 0x5FCC, 0x9645, 0x5993, 0x7EE7, 0x7EAA, 0x5609, 0x67B7, 0x5939, 0x4F73, 0x5BB6, 0x52A0, 0x835A, 0x988A, 0x8D3E, 0x7532, 0x94BE, 0x5047, 0x7A3C, 0x4EF7, 0x67B6, 0x9A7E, 0x5AC1, 0x6B7C, 0x76D1, 0x575A, 0x5C16, 0x7B3A, 0x95F4, 0x714E, 0x517C, 0x80A9, 0x8270, 0x5978, 0x7F04, 0x8327, 0x68C0, 0x67EC, 0x78B1, 0x7877, 0x62E3, 0x6361, 0x7B80, 0x4FED, 0x526A, 0x51CF, 0x8350, 0x69DB, 0x9274, 0x8DF5, 0x8D31, 0x89C1, 0x952E, 0x7BAD, 0x4EF6 }, { 0x7D37, 0x7D38, 0x7D39, 0x7D3A, 0x7D3B, 0x7D3C, 0x7D3D, 0x7D3E, 0x7D3F, 0x7D40, 0x7D41, 0x7D42, 0x7D43, 0x7D44, 0x7D45, 0x7D46, 0x7D47, 0x7D48, 0x7D49, 0x7D4A, 0x7D4B, 0x7D4C, 0x7D4D, 0x7D4E, 0x7D4F, 0x7D50, 0x7D51, 0x7D52, 0x7D53, 0x7D54, 0x7D55, 0x7D56, 0x7D57, 0x7D58, 0x7D59, 0x7D5A, 0x7D5B, 0x7D5C, 0x7D5D, 0x7D5E, 0x7D5F, 0x7D60, 0x7D61, 0x7D62, 0x7D63, 0x7D64, 0x7D65, 0x7D66, 0x7D67, 0x7D68, 0x7D69, 0x7D6A, 0x7D6B, 0x7D6C, 0x7D6D, 0x7D6F, 0x7D70, 0x7D71, 0x7D72, 0x7D73, 0x7D74, 0x7D75, 0x7D76, 0x003F, 0x7D78, 0x7D79, 0x7D7A, 0x7D7B, 0x7D7C, 0x7D7D, 0x7D7E, 0x7D7F, 0x7D80, 0x7D81, 0x7D82, 0x7D83, 0x7D84, 0x7D85, 0x7D86, 0x7D87, 0x7D88, 0x7D89, 0x7D8A, 0x7D8B, 0x7D8C, 0x7D8D, 0x7D8E, 0x7D8F, 0x7D90, 0x7D91, 0x7D92, 0x7D93, 0x7D94, 0x7D95, 0x7D96, 0x7D97, 0x7D98, 0x5065, 0x8230, 0x5251, 0x996F, 0x6E10, 0x6E85, 0x6DA7, 0x5EFA, 0x50F5, 0x59DC, 0x5C06, 0x6D46, 0x6C5F, 0x7586, 0x848B, 0x6868, 0x5956, 0x8BB2, 0x5320, 0x9171, 0x964D, 0x8549, 0x6912, 0x7901, 0x7126, 0x80F6, 0x4EA4, 0x90CA, 0x6D47, 0x9A84, 0x5A07, 0x56BC, 0x6405, 0x94F0, 0x77EB, 0x4FA5, 0x811A, 0x72E1, 0x89D2, 0x997A, 0x7F34, 0x7EDE, 0x527F, 0x6559, 0x9175, 0x8F7F, 0x8F83, 0x53EB, 0x7A96, 0x63ED, 0x63A5, 0x7686, 0x79F8, 0x8857, 0x9636, 0x622A, 0x52AB, 0x8282, 0x6854, 0x6770, 0x6377, 0x776B, 0x7AED, 0x6D01, 0x7ED3, 0x89E3, 0x59D0, 0x6212, 0x85C9, 0x82A5, 0x754C, 0x501F, 0x4ECB, 0x75A5, 0x8BEB, 0x5C4A, 0x5DFE, 0x7B4B, 0x65A4, 0x91D1, 0x4ECA, 0x6D25, 0x895F, 0x7D27, 0x9526, 0x4EC5, 0x8C28, 0x8FDB, 0x9773, 0x664B, 0x7981, 0x8FD1, 0x70EC, 0x6D78 }, { 0x7D99, 0x7D9A, 0x7D9B, 0x7D9C, 0x7D9D, 0x7D9E, 0x7D9F, 0x7DA0, 0x7DA1, 0x7DA2, 0x7DA3, 0x7DA4, 0x7DA5, 0x7DA7, 0x7DA8, 0x7DA9, 0x7DAA, 0x7DAB, 0x7DAC, 0x7DAD, 0x7DAF, 0x7DB0, 0x7DB1, 0x7DB2, 0x7DB3, 0x7DB4, 0x7DB5, 0x7DB6, 0x7DB7, 0x7DB8, 0x7DB9, 0x7DBA, 0x7DBB, 0x7DBC, 0x7DBD, 0x7DBE, 0x7DBF, 0x7DC0, 0x7DC1, 0x7DC2, 0x7DC3, 0x7DC4, 0x7DC5, 0x7DC6, 0x7DC7, 0x7DC8, 0x7DC9, 0x7DCA, 0x7DCB, 0x7DCC, 0x7DCD, 0x7DCE, 0x7DCF, 0x7DD0, 0x7DD1, 0x7DD2, 0x7DD3, 0x7DD4, 0x7DD5, 0x7DD6, 0x7DD7, 0x7DD8, 0x7DD9, 0x003F, 0x7DDA, 0x7DDB, 0x7DDC, 0x7DDD, 0x7DDE, 0x7DDF, 0x7DE0, 0x7DE1, 0x7DE2, 0x7DE3, 0x7DE4, 0x7DE5, 0x7DE6, 0x7DE7, 0x7DE8, 0x7DE9, 0x7DEA, 0x7DEB, 0x7DEC, 0x7DED, 0x7DEE, 0x7DEF, 0x7DF0, 0x7DF1, 0x7DF2, 0x7DF3, 0x7DF4, 0x7DF5, 0x7DF6, 0x7DF7, 0x7DF8, 0x7DF9, 0x7DFA, 0x5C3D, 0x52B2, 0x8346, 0x5162, 0x830E, 0x775B, 0x6676, 0x9CB8, 0x4EAC, 0x60CA, 0x7CBE, 0x7CB3, 0x7ECF, 0x4E95, 0x8B66, 0x666F, 0x9888, 0x9759, 0x5883, 0x656C, 0x955C, 0x5F84, 0x75C9, 0x9756, 0x7ADF, 0x7ADE, 0x51C0, 0x70AF, 0x7A98, 0x63EA, 0x7A76, 0x7EA0, 0x7396, 0x97ED, 0x4E45, 0x7078, 0x4E5D, 0x9152, 0x53A9, 0x6551, 0x65E7, 0x81FC, 0x8205, 0x548E, 0x5C31, 0x759A, 0x97A0, 0x62D8, 0x72D9, 0x75BD, 0x5C45, 0x9A79, 0x83CA, 0x5C40, 0x5480, 0x77E9, 0x4E3E, 0x6CAE, 0x805A, 0x62D2, 0x636E, 0x5DE8, 0x5177, 0x8DDD, 0x8E1E, 0x952F, 0x4FF1, 0x53E5, 0x60E7, 0x70AC, 0x5267, 0x6350, 0x9E43, 0x5A1F, 0x5026, 0x7737, 0x5377, 0x7EE2, 0x6485, 0x652B, 0x6289, 0x6398, 0x5014, 0x7235, 0x89C9, 0x51B3, 0x8BC0, 0x7EDD, 0x5747, 0x83CC, 0x94A7, 0x519B, 0x541B, 0x5CFB }, { 0x7DFB, 0x7DFC, 0x7DFD, 0x7DFE, 0x7DFF, 0x7E00, 0x7E01, 0x7E02, 0x7E03, 0x7E04, 0x7E05, 0x7E06, 0x7E07, 0x7E08, 0x7E09, 0x7E0A, 0x7E0B, 0x7E0C, 0x7E0D, 0x7E0E, 0x7E0F, 0x7E10, 0x7E11, 0x7E12, 0x7E13, 0x7E14, 0x7E15, 0x7E16, 0x7E17, 0x7E18, 0x7E19, 0x7E1A, 0x7E1B, 0x7E1C, 0x7E1D, 0x7E1E, 0x7E1F, 0x7E20, 0x7E21, 0x7E22, 0x7E23, 0x7E24, 0x7E25, 0x7E26, 0x7E27, 0x7E28, 0x7E29, 0x7E2A, 0x7E2B, 0x7E2C, 0x7E2D, 0x7E2E, 0x7E2F, 0x7E30, 0x7E31, 0x7E32, 0x7E33, 0x7E34, 0x7E35, 0x7E36, 0x7E37, 0x7E38, 0x7E39, 0x003F, 0x7E3A, 0x7E3C, 0x7E3D, 0x7E3E, 0x7E3F, 0x7E40, 0x7E42, 0x7E43, 0x7E44, 0x7E45, 0x7E46, 0x7E48, 0x7E49, 0x7E4A, 0x7E4B, 0x7E4C, 0x7E4D, 0x7E4E, 0x7E4F, 0x7E50, 0x7E51, 0x7E52, 0x7E53, 0x7E54, 0x7E55, 0x7E56, 0x7E57, 0x7E58, 0x7E59, 0x7E5A, 0x7E5B, 0x7E5C, 0x7E5D, 0x4FCA, 0x7AE3, 0x6D5A, 0x90E1, 0x9A8F, 0x5580, 0x5496, 0x5361, 0x54AF, 0x5F00, 0x63E9, 0x6977, 0x51EF, 0x6168, 0x520A, 0x582A, 0x52D8, 0x574E, 0x780D, 0x770B, 0x5EB7, 0x6177, 0x7CE0, 0x625B, 0x6297, 0x4EA2, 0x7095, 0x8003, 0x62F7, 0x70E4, 0x9760, 0x5777, 0x82DB, 0x67EF, 0x68F5, 0x78D5, 0x9897, 0x79D1, 0x58F3, 0x54B3, 0x53EF, 0x6E34, 0x514B, 0x523B, 0x5BA2, 0x8BFE, 0x80AF, 0x5543, 0x57A6, 0x6073, 0x5751, 0x542D, 0x7A7A, 0x6050, 0x5B54, 0x63A7, 0x62A0, 0x53E3, 0x6263, 0x5BC7, 0x67AF, 0x54ED, 0x7A9F, 0x82E6, 0x9177, 0x5E93, 0x88E4, 0x5938, 0x57AE, 0x630E, 0x8DE8, 0x80EF, 0x5757, 0x7B77, 0x4FA9, 0x5FEB, 0x5BBD, 0x6B3E, 0x5321, 0x7B50, 0x72C2, 0x6846, 0x77FF, 0x7736, 0x65F7, 0x51B5, 0x4E8F, 0x76D4, 0x5CBF, 0x7AA5, 0x8475, 0x594E, 0x9B41, 0x5080 }, { 0x7E5E, 0x7E5F, 0x7E60, 0x7E61, 0x7E62, 0x7E63, 0x7E64, 0x7E65, 0x7E66, 0x7E67, 0x7E68, 0x7E69, 0x7E6A, 0x7E6B, 0x7E6C, 0x7E6D, 0x7E6E, 0x7E6F, 0x7E70, 0x7E71, 0x7E72, 0x7E73, 0x7E74, 0x7E75, 0x7E76, 0x7E77, 0x7E78, 0x7E79, 0x7E7A, 0x7E7B, 0x7E7C, 0x7E7D, 0x7E7E, 0x7E7F, 0x7E80, 0x7E81, 0x7E83, 0x7E84, 0x7E85, 0x7E86, 0x7E87, 0x7E88, 0x7E89, 0x7E8A, 0x7E8B, 0x7E8C, 0x7E8D, 0x7E8E, 0x7E8F, 0x7E90, 0x7E91, 0x7E92, 0x7E93, 0x7E94, 0x7E95, 0x7E96, 0x7E97, 0x7E98, 0x7E99, 0x7E9A, 0x7E9C, 0x7E9D, 0x7E9E, 0x003F, 0x7EAE, 0x7EB4, 0x7EBB, 0x7EBC, 0x7ED6, 0x7EE4, 0x7EEC, 0x7EF9, 0x7F0A, 0x7F10, 0x7F1E, 0x7F37, 0x7F39, 0x7F3B, 0x7F3C, 0x7F3D, 0x7F3E, 0x7F3F, 0x7F40, 0x7F41, 0x7F43, 0x7F46, 0x7F47, 0x7F48, 0x7F49, 0x7F4A, 0x7F4B, 0x7F4C, 0x7F4D, 0x7F4E, 0x7F4F, 0x7F52, 0x7F53, 0x9988, 0x6127, 0x6E83, 0x5764, 0x6606, 0x6346, 0x56F0, 0x62EC, 0x6269, 0x5ED3, 0x9614, 0x5783, 0x62C9, 0x5587, 0x8721, 0x814A, 0x8FA3, 0x5566, 0x83B1, 0x6765, 0x8D56, 0x84DD, 0x5A6A, 0x680F, 0x62E6, 0x7BEE, 0x9611, 0x5170, 0x6F9C, 0x8C30, 0x63FD, 0x89C8, 0x61D2, 0x7F06, 0x70C2, 0x6EE5, 0x7405, 0x6994, 0x72FC, 0x5ECA, 0x90CE, 0x6717, 0x6D6A, 0x635E, 0x52B3, 0x7262, 0x8001, 0x4F6C, 0x59E5, 0x916A, 0x70D9, 0x6D9D, 0x52D2, 0x4E50, 0x96F7, 0x956D, 0x857E, 0x78CA, 0x7D2F, 0x5121, 0x5792, 0x64C2, 0x808B, 0x7C7B, 0x6CEA, 0x68F1, 0x695E, 0x51B7, 0x5398, 0x68A8, 0x7281, 0x9ECE, 0x7BF1, 0x72F8, 0x79BB, 0x6F13, 0x7406, 0x674E, 0x91CC, 0x9CA4, 0x793C, 0x8389, 0x8354, 0x540F, 0x6817, 0x4E3D, 0x5389, 0x52B1, 0x783E, 0x5386, 0x5229, 0x5088, 0x4F8B, 0x4FD0 }, { 0x7F56, 0x7F59, 0x7F5B, 0x7F5C, 0x7F5D, 0x7F5E, 0x7F60, 0x7F63, 0x7F64, 0x7F65, 0x7F66, 0x7F67, 0x7F6B, 0x7F6C, 0x7F6D, 0x7F6F, 0x7F70, 0x7F73, 0x7F75, 0x7F76, 0x7F77, 0x7F78, 0x7F7A, 0x7F7B, 0x7F7C, 0x7F7D, 0x7F7F, 0x7F80, 0x7F82, 0x7F83, 0x7F84, 0x7F85, 0x7F86, 0x7F87, 0x7F88, 0x7F89, 0x7F8B, 0x7F8D, 0x7F8F, 0x7F90, 0x7F91, 0x7F92, 0x7F93, 0x7F95, 0x7F96, 0x7F97, 0x7F98, 0x7F99, 0x7F9B, 0x7F9C, 0x7FA0, 0x7FA2, 0x7FA3, 0x7FA5, 0x7FA6, 0x7FA8, 0x7FA9, 0x7FAA, 0x7FAB, 0x7FAC, 0x7FAD, 0x7FAE, 0x7FB1, 0x003F, 0x7FB3, 0x7FB4, 0x7FB5, 0x7FB6, 0x7FB7, 0x7FBA, 0x7FBB, 0x7FBE, 0x7FC0, 0x7FC2, 0x7FC3, 0x7FC4, 0x7FC6, 0x7FC7, 0x7FC8, 0x7FC9, 0x7FCB, 0x7FCD, 0x7FCF, 0x7FD0, 0x7FD1, 0x7FD2, 0x7FD3, 0x7FD6, 0x7FD7, 0x7FD9, 0x7FDA, 0x7FDB, 0x7FDC, 0x7FDD, 0x7FDE, 0x7FE2, 0x7FE3, 0x75E2, 0x7ACB, 0x7C92, 0x6CA5, 0x96B6, 0x529B, 0x7483, 0x54E9, 0x4FE9, 0x8054, 0x83B2, 0x8FDE, 0x9570, 0x5EC9, 0x601C, 0x6D9F, 0x5E18, 0x655B, 0x8138, 0x94FE, 0x604B, 0x70BC, 0x7EC3, 0x7CAE, 0x51C9, 0x6881, 0x7CB1, 0x826F, 0x4E24, 0x8F86, 0x91CF, 0x667E, 0x4EAE, 0x8C05, 0x64A9, 0x804A, 0x50DA, 0x7597, 0x71CE, 0x5BE5, 0x8FBD, 0x6F66, 0x4E86, 0x6482, 0x9563, 0x5ED6, 0x6599, 0x5217, 0x88C2, 0x70C8, 0x52A3, 0x730E, 0x7433, 0x6797, 0x78F7, 0x9716, 0x4E34, 0x90BB, 0x9CDE, 0x6DCB, 0x51DB, 0x8D41, 0x541D, 0x62CE, 0x73B2, 0x83F1, 0x96F6, 0x9F84, 0x94C3, 0x4F36, 0x7F9A, 0x51CC, 0x7075, 0x9675, 0x5CAD, 0x9886, 0x53E6, 0x4EE4, 0x6E9C, 0x7409, 0x69B4, 0x786B, 0x998F, 0x7559, 0x5218, 0x7624, 0x6D41, 0x67F3, 0x516D, 0x9F99, 0x804B, 0x5499, 0x7B3C, 0x7ABF }, { 0x7FE4, 0x7FE7, 0x7FE8, 0x7FEA, 0x7FEB, 0x7FEC, 0x7FED, 0x7FEF, 0x7FF2, 0x7FF4, 0x7FF5, 0x7FF6, 0x7FF7, 0x7FF8, 0x7FF9, 0x7FFA, 0x7FFD, 0x7FFE, 0x7FFF, 0x8002, 0x8007, 0x8008, 0x8009, 0x800A, 0x800E, 0x800F, 0x8011, 0x8013, 0x801A, 0x801B, 0x801D, 0x801E, 0x801F, 0x8021, 0x8023, 0x8024, 0x802B, 0x802C, 0x802D, 0x802E, 0x802F, 0x8030, 0x8032, 0x8034, 0x8039, 0x803A, 0x803C, 0x803E, 0x8040, 0x8041, 0x8044, 0x8045, 0x8047, 0x8048, 0x8049, 0x804E, 0x804F, 0x8050, 0x8051, 0x8053, 0x8055, 0x8056, 0x8057, 0x003F, 0x8059, 0x805B, 0x805C, 0x805D, 0x805E, 0x805F, 0x8060, 0x8061, 0x8062, 0x8063, 0x8064, 0x8065, 0x8066, 0x8067, 0x8068, 0x806B, 0x806C, 0x806D, 0x806E, 0x806F, 0x8070, 0x8072, 0x8073, 0x8074, 0x8075, 0x8076, 0x8077, 0x8078, 0x8079, 0x807A, 0x807B, 0x807C, 0x807D, 0x9686, 0x5784, 0x62E2, 0x9647, 0x697C, 0x5A04, 0x6402, 0x7BD3, 0x6F0F, 0x964B, 0x82A6, 0x5362, 0x9885, 0x5E90, 0x7089, 0x63B3, 0x5364, 0x864F, 0x9C81, 0x9E93, 0x788C, 0x9732, 0x8DEF, 0x8D42, 0x9E7F, 0x6F5E, 0x7984, 0x5F55, 0x9646, 0x622E, 0x9A74, 0x5415, 0x94DD, 0x4FA3, 0x65C5, 0x5C65, 0x5C61, 0x7F15, 0x8651, 0x6C2F, 0x5F8B, 0x7387, 0x6EE4, 0x7EFF, 0x5CE6, 0x631B, 0x5B6A, 0x6EE6, 0x5375, 0x4E71, 0x63A0, 0x7565, 0x62A1, 0x8F6E, 0x4F26, 0x4ED1, 0x6CA6, 0x7EB6, 0x8BBA, 0x841D, 0x87BA, 0x7F57, 0x903B, 0x9523, 0x7BA9, 0x9AA1, 0x88F8, 0x843D, 0x6D1B, 0x9A86, 0x7EDC, 0x5988, 0x9EBB, 0x739B, 0x7801, 0x8682, 0x9A6C, 0x9A82, 0x561B, 0x5417, 0x57CB, 0x4E70, 0x9EA6, 0x5356, 0x8FC8, 0x8109, 0x7792, 0x9992, 0x86EE, 0x6EE1, 0x8513, 0x66FC, 0x6162, 0x6F2B }, { 0x807E, 0x8081, 0x8082, 0x8085, 0x8088, 0x808A, 0x808D, 0x808E, 0x808F, 0x8090, 0x8091, 0x8092, 0x8094, 0x8095, 0x8097, 0x8099, 0x809E, 0x80A3, 0x80A6, 0x80A7, 0x80A8, 0x80AC, 0x80B0, 0x80B3, 0x80B5, 0x80B6, 0x80B8, 0x80B9, 0x80BB, 0x80C5, 0x80C7, 0x80C8, 0x80C9, 0x80CA, 0x80CB, 0x80CF, 0x80D0, 0x80D1, 0x80D2, 0x80D3, 0x80D4, 0x80D5, 0x80D8, 0x80DF, 0x80E0, 0x80E2, 0x80E3, 0x80E6, 0x80EE, 0x80F5, 0x80F7, 0x80F9, 0x80FB, 0x80FE, 0x80FF, 0x8100, 0x8101, 0x8103, 0x8104, 0x8105, 0x8107, 0x8108, 0x810B, 0x003F, 0x810C, 0x8115, 0x8117, 0x8119, 0x811B, 0x811C, 0x811D, 0x811F, 0x8120, 0x8121, 0x8122, 0x8123, 0x8124, 0x8125, 0x8126, 0x8127, 0x8128, 0x8129, 0x812A, 0x812B, 0x812D, 0x812E, 0x8130, 0x8133, 0x8134, 0x8135, 0x8137, 0x8139, 0x813A, 0x813B, 0x813C, 0x813D, 0x813F, 0x8C29, 0x8292, 0x832B, 0x76F2, 0x6C13, 0x5FD9, 0x83BD, 0x732B, 0x8305, 0x951A, 0x6BDB, 0x77DB, 0x94C6, 0x536F, 0x8302, 0x5192, 0x5E3D, 0x8C8C, 0x8D38, 0x4E48, 0x73AB, 0x679A, 0x6885, 0x9176, 0x9709, 0x7164, 0x6CA1, 0x7709, 0x5A92, 0x9541, 0x6BCF, 0x7F8E, 0x6627, 0x5BD0, 0x59B9, 0x5A9A, 0x95E8, 0x95F7, 0x4EEC, 0x840C, 0x8499, 0x6AAC, 0x76DF, 0x9530, 0x731B, 0x68A6, 0x5B5F, 0x772F, 0x919A, 0x9761, 0x7CDC, 0x8FF7, 0x8C1C, 0x5F25, 0x7C73, 0x79D8, 0x89C5, 0x6CCC, 0x871C, 0x5BC6, 0x5E42, 0x68C9, 0x7720, 0x7EF5, 0x5195, 0x514D, 0x52C9, 0x5A29, 0x7F05, 0x9762, 0x82D7, 0x63CF, 0x7784, 0x85D0, 0x79D2, 0x6E3A, 0x5E99, 0x5999, 0x8511, 0x706D, 0x6C11, 0x62BF, 0x76BF, 0x654F, 0x60AF, 0x95FD, 0x660E, 0x879F, 0x9E23, 0x94ED, 0x540D, 0x547D, 0x8C2C, 0x6478 }, { 0x8140, 0x8141, 0x8142, 0x8143, 0x8144, 0x8145, 0x8147, 0x8149, 0x814D, 0x814E, 0x814F, 0x8152, 0x8156, 0x8157, 0x8158, 0x815B, 0x815C, 0x815D, 0x815E, 0x815F, 0x8161, 0x8162, 0x8163, 0x8164, 0x8166, 0x8168, 0x816A, 0x816B, 0x816C, 0x816F, 0x8172, 0x8173, 0x8175, 0x8176, 0x8177, 0x8178, 0x8181, 0x8183, 0x8184, 0x8185, 0x8186, 0x8187, 0x8189, 0x818B, 0x818C, 0x818D, 0x818E, 0x8190, 0x8192, 0x8193, 0x8194, 0x8195, 0x8196, 0x8197, 0x8199, 0x819A, 0x819E, 0x819F, 0x81A0, 0x81A1, 0x81A2, 0x81A4, 0x81A5, 0x003F, 0x81A7, 0x81A9, 0x81AB, 0x81AC, 0x81AD, 0x81AE, 0x81AF, 0x81B0, 0x81B1, 0x81B2, 0x81B4, 0x81B5, 0x81B6, 0x81B7, 0x81B8, 0x81B9, 0x81BC, 0x81BD, 0x81BE, 0x81BF, 0x81C4, 0x81C5, 0x81C7, 0x81C8, 0x81C9, 0x81CB, 0x81CD, 0x81CE, 0x81CF, 0x81D0, 0x81D1, 0x81D2, 0x81D3, 0x6479, 0x8611, 0x6A21, 0x819C, 0x78E8, 0x6469, 0x9B54, 0x62B9, 0x672B, 0x83AB, 0x58A8, 0x9ED8, 0x6CAB, 0x6F20, 0x5BDE, 0x964C, 0x8C0B, 0x725F, 0x67D0, 0x62C7, 0x7261, 0x4EA9, 0x59C6, 0x6BCD, 0x5893, 0x66AE, 0x5E55, 0x52DF, 0x6155, 0x6728, 0x76EE, 0x7766, 0x7267, 0x7A46, 0x62FF, 0x54EA, 0x5450, 0x94A0, 0x90A3, 0x5A1C, 0x7EB3, 0x6C16, 0x4E43, 0x5976, 0x8010, 0x5948, 0x5357, 0x7537, 0x96BE, 0x56CA, 0x6320, 0x8111, 0x607C, 0x95F9, 0x6DD6, 0x5462, 0x9981, 0x5185, 0x5AE9, 0x80FD, 0x59AE, 0x9713, 0x502A, 0x6CE5, 0x5C3C, 0x62DF, 0x4F60, 0x533F, 0x817B, 0x9006, 0x6EBA, 0x852B, 0x62C8, 0x5E74, 0x78BE, 0x64B5, 0x637B, 0x5FF5, 0x5A18, 0x917F, 0x9E1F, 0x5C3F, 0x634F, 0x8042, 0x5B7D, 0x556E, 0x954A, 0x954D, 0x6D85, 0x60A8, 0x67E0, 0x72DE, 0x51DD, 0x5B81 }, { 0x81D4, 0x81D5, 0x81D6, 0x81D7, 0x81D8, 0x81D9, 0x81DA, 0x81DB, 0x81DC, 0x81DD, 0x81DE, 0x81DF, 0x81E0, 0x81E1, 0x81E2, 0x81E4, 0x81E5, 0x81E6, 0x81E8, 0x81E9, 0x81EB, 0x81EE, 0x81EF, 0x81F0, 0x81F1, 0x81F2, 0x81F5, 0x81F6, 0x81F7, 0x81F8, 0x81F9, 0x81FA, 0x81FD, 0x81FF, 0x8203, 0x8207, 0x8208, 0x8209, 0x820A, 0x820B, 0x820E, 0x820F, 0x8211, 0x8213, 0x8215, 0x8216, 0x8217, 0x8218, 0x8219, 0x821A, 0x821D, 0x8220, 0x8224, 0x8225, 0x8226, 0x8227, 0x8229, 0x822E, 0x8232, 0x823A, 0x823C, 0x823D, 0x823F, 0x003F, 0x8240, 0x8241, 0x8242, 0x8243, 0x8245, 0x8246, 0x8248, 0x824A, 0x824C, 0x824D, 0x824E, 0x8250, 0x8251, 0x8252, 0x8253, 0x8254, 0x8255, 0x8256, 0x8257, 0x8259, 0x825B, 0x825C, 0x825D, 0x825E, 0x8260, 0x8261, 0x8262, 0x8263, 0x8264, 0x8265, 0x8266, 0x8267, 0x8269, 0x62E7, 0x6CDE, 0x725B, 0x626D, 0x94AE, 0x7EBD, 0x8113, 0x6D53, 0x519C, 0x5F04, 0x5974, 0x52AA, 0x6012, 0x5973, 0x6696, 0x8650, 0x759F, 0x632A, 0x61E6, 0x7CEF, 0x8BFA, 0x54E6, 0x6B27, 0x9E25, 0x6BB4, 0x85D5, 0x5455, 0x5076, 0x6CA4, 0x556A, 0x8DB4, 0x722C, 0x5E15, 0x6015, 0x7436, 0x62CD, 0x6392, 0x724C, 0x5F98, 0x6E43, 0x6D3E, 0x6500, 0x6F58, 0x76D8, 0x78D0, 0x76FC, 0x7554, 0x5224, 0x53DB, 0x4E53, 0x5E9E, 0x65C1, 0x802A, 0x80D6, 0x629B, 0x5486, 0x5228, 0x70AE, 0x888D, 0x8DD1, 0x6CE1, 0x5478, 0x80DA, 0x57F9, 0x88F4, 0x8D54, 0x966A, 0x914D, 0x4F69, 0x6C9B, 0x55B7, 0x76C6, 0x7830, 0x62A8, 0x70F9, 0x6F8E, 0x5F6D, 0x84EC, 0x68DA, 0x787C, 0x7BF7, 0x81A8, 0x670B, 0x9E4F, 0x6367, 0x78B0, 0x576F, 0x7812, 0x9739, 0x6279, 0x62AB, 0x5288, 0x7435, 0x6BD7 }, { 0x826A, 0x826B, 0x826C, 0x826D, 0x8271, 0x8275, 0x8276, 0x8277, 0x8278, 0x827B, 0x827C, 0x8280, 0x8281, 0x8283, 0x8285, 0x8286, 0x8287, 0x8289, 0x828C, 0x8290, 0x8293, 0x8294, 0x8295, 0x8296, 0x829A, 0x829B, 0x829E, 0x82A0, 0x82A2, 0x82A3, 0x82A7, 0x82B2, 0x82B5, 0x82B6, 0x82BA, 0x82BB, 0x82BC, 0x82BF, 0x82C0, 0x82C2, 0x82C3, 0x82C5, 0x82C6, 0x82C9, 0x82D0, 0x82D6, 0x82D9, 0x82DA, 0x82DD, 0x82E2, 0x82E7, 0x82E8, 0x82E9, 0x82EA, 0x82EC, 0x82ED, 0x82EE, 0x82F0, 0x82F2, 0x82F3, 0x82F5, 0x82F6, 0x82F8, 0x003F, 0x82FA, 0x82FC, 0x82FD, 0x82FE, 0x82FF, 0x8300, 0x830A, 0x830B, 0x830D, 0x8310, 0x8312, 0x8313, 0x8316, 0x8318, 0x8319, 0x831D, 0x831E, 0x831F, 0x8320, 0x8321, 0x8322, 0x8323, 0x8324, 0x8325, 0x8326, 0x8329, 0x832A, 0x832E, 0x8330, 0x8332, 0x8337, 0x833B, 0x833D, 0x5564, 0x813E, 0x75B2, 0x76AE, 0x5339, 0x75DE, 0x50FB, 0x5C41, 0x8B6C, 0x7BC7, 0x504F, 0x7247, 0x9A97, 0x98D8, 0x6F02, 0x74E2, 0x7968, 0x6487, 0x77A5, 0x62FC, 0x9891, 0x8D2B, 0x54C1, 0x8058, 0x4E52, 0x576A, 0x82F9, 0x840D, 0x5E73, 0x51ED, 0x74F6, 0x8BC4, 0x5C4F, 0x5761, 0x6CFC, 0x9887, 0x5A46, 0x7834, 0x9B44, 0x8FEB, 0x7C95, 0x5256, 0x6251, 0x94FA, 0x4EC6, 0x8386, 0x8461, 0x83E9, 0x84B2, 0x57D4, 0x6734, 0x5703, 0x666E, 0x6D66, 0x8C31, 0x66DD, 0x7011, 0x671F, 0x6B3A, 0x6816, 0x621A, 0x59BB, 0x4E03, 0x51C4, 0x6F06, 0x67D2, 0x6C8F, 0x5176, 0x68CB, 0x5947, 0x6B67, 0x7566, 0x5D0E, 0x8110, 0x9F50, 0x65D7, 0x7948, 0x7941, 0x9A91, 0x8D77, 0x5C82, 0x4E5E, 0x4F01, 0x542F, 0x5951, 0x780C, 0x5668, 0x6C14, 0x8FC4, 0x5F03, 0x6C7D, 0x6CE3, 0x8BAB, 0x6390 }, { 0x833E, 0x833F, 0x8341, 0x8342, 0x8344, 0x8345, 0x8348, 0x834A, 0x834B, 0x834C, 0x834D, 0x834E, 0x8353, 0x8355, 0x8356, 0x8357, 0x8358, 0x8359, 0x835D, 0x8362, 0x8370, 0x8371, 0x8372, 0x8373, 0x8374, 0x8375, 0x8376, 0x8379, 0x837A, 0x837E, 0x837F, 0x8380, 0x8381, 0x8382, 0x8383, 0x8384, 0x8387, 0x8388, 0x838A, 0x838B, 0x838C, 0x838D, 0x838F, 0x8390, 0x8391, 0x8394, 0x8395, 0x8396, 0x8397, 0x8399, 0x839A, 0x839D, 0x839F, 0x83A1, 0x83A2, 0x83A3, 0x83A4, 0x83A5, 0x83A6, 0x83A7, 0x83AC, 0x83AD, 0x83AE, 0x003F, 0x83AF, 0x83B5, 0x83BB, 0x83BE, 0x83BF, 0x83C2, 0x83C3, 0x83C4, 0x83C6, 0x83C8, 0x83C9, 0x83CB, 0x83CD, 0x83CE, 0x83D0, 0x83D1, 0x83D2, 0x83D3, 0x83D5, 0x83D7, 0x83D9, 0x83DA, 0x83DB, 0x83DE, 0x83E2, 0x83E3, 0x83E4, 0x83E6, 0x83E7, 0x83E8, 0x83EB, 0x83EC, 0x83ED, 0x6070, 0x6D3D, 0x7275, 0x6266, 0x948E, 0x94C5, 0x5343, 0x8FC1, 0x7B7E, 0x4EDF, 0x8C26, 0x4E7E, 0x9ED4, 0x94B1, 0x94B3, 0x524D, 0x6F5C, 0x9063, 0x6D45, 0x8C34, 0x5811, 0x5D4C, 0x6B20, 0x6B49, 0x67AA, 0x545B, 0x8154, 0x7F8C, 0x5899, 0x8537, 0x5F3A, 0x62A2, 0x6A47, 0x9539, 0x6572, 0x6084, 0x6865, 0x77A7, 0x4E54, 0x4FA8, 0x5DE7, 0x9798, 0x64AC, 0x7FD8, 0x5CED, 0x4FCF, 0x7A8D, 0x5207, 0x8304, 0x4E14, 0x602F, 0x7A83, 0x94A6, 0x4FB5, 0x4EB2, 0x79E6, 0x7434, 0x52E4, 0x82B9, 0x64D2, 0x79BD, 0x5BDD, 0x6C81, 0x9752, 0x8F7B, 0x6C22, 0x503E, 0x537F, 0x6E05, 0x64CE, 0x6674, 0x6C30, 0x60C5, 0x9877, 0x8BF7, 0x5E86, 0x743C, 0x7A77, 0x79CB, 0x4E18, 0x90B1, 0x7403, 0x6C42, 0x56DA, 0x914B, 0x6CC5, 0x8D8B, 0x533A, 0x86C6, 0x66F2, 0x8EAF, 0x5C48, 0x9A71, 0x6E20 }, { 0x83EE, 0x83EF, 0x83F3, 0x83F4, 0x83F5, 0x83F6, 0x83F7, 0x83FA, 0x83FB, 0x83FC, 0x83FE, 0x83FF, 0x8400, 0x8402, 0x8405, 0x8407, 0x8408, 0x8409, 0x840A, 0x8410, 0x8412, 0x8413, 0x8414, 0x8415, 0x8416, 0x8417, 0x8419, 0x841A, 0x841B, 0x841E, 0x841F, 0x8420, 0x8421, 0x8422, 0x8423, 0x8429, 0x842A, 0x842B, 0x842C, 0x842D, 0x842E, 0x842F, 0x8430, 0x8432, 0x8433, 0x8434, 0x8435, 0x8436, 0x8437, 0x8439, 0x843A, 0x843B, 0x843E, 0x843F, 0x8440, 0x8441, 0x8442, 0x8443, 0x8444, 0x8445, 0x8447, 0x8448, 0x8449, 0x003F, 0x844A, 0x844B, 0x844C, 0x844D, 0x844E, 0x844F, 0x8450, 0x8452, 0x8453, 0x8454, 0x8455, 0x8456, 0x8458, 0x845D, 0x845E, 0x845F, 0x8460, 0x8462, 0x8464, 0x8465, 0x8466, 0x8467, 0x8468, 0x846A, 0x846E, 0x846F, 0x8470, 0x8472, 0x8474, 0x8477, 0x8479, 0x847B, 0x847C, 0x53D6, 0x5A36, 0x9F8B, 0x8DA3, 0x53BB, 0x5708, 0x98A7, 0x6743, 0x919B, 0x6CC9, 0x5168, 0x75CA, 0x62F3, 0x72AC, 0x5238, 0x529D, 0x7F3A, 0x7094, 0x7638, 0x5374, 0x9E4A, 0x69B7, 0x786E, 0x96C0, 0x88D9, 0x7FA4, 0x7136, 0x71C3, 0x5189, 0x67D3, 0x74E4, 0x58E4, 0x6518, 0x56B7, 0x8BA9, 0x9976, 0x6270, 0x7ED5, 0x60F9, 0x70ED, 0x58EC, 0x4EC1, 0x4EBA, 0x5FCD, 0x97E7, 0x4EFB, 0x8BA4, 0x5203, 0x598A, 0x7EAB, 0x6254, 0x4ECD, 0x65E5, 0x620E, 0x8338, 0x84C9, 0x8363, 0x878D, 0x7194, 0x6EB6, 0x5BB9, 0x7ED2, 0x5197, 0x63C9, 0x67D4, 0x8089, 0x8339, 0x8815, 0x5112, 0x5B7A, 0x5982, 0x8FB1, 0x4E73, 0x6C5D, 0x5165, 0x8925, 0x8F6F, 0x962E, 0x854A, 0x745E, 0x9510, 0x95F0, 0x6DA6, 0x82E5, 0x5F31, 0x6492, 0x6D12, 0x8428, 0x816E, 0x9CC3, 0x585E, 0x8D5B, 0x4E09, 0x53C1 }, { 0x847D, 0x847E, 0x847F, 0x8480, 0x8481, 0x8483, 0x8484, 0x8485, 0x8486, 0x848A, 0x848D, 0x848F, 0x8490, 0x8491, 0x8492, 0x8493, 0x8494, 0x8495, 0x8496, 0x8498, 0x849A, 0x849B, 0x849D, 0x849E, 0x849F, 0x84A0, 0x84A2, 0x84A3, 0x84A4, 0x84A5, 0x84A6, 0x84A7, 0x84A8, 0x84A9, 0x84AA, 0x84AB, 0x84AC, 0x84AD, 0x84AE, 0x84B0, 0x84B1, 0x84B3, 0x84B5, 0x84B6, 0x84B7, 0x84BB, 0x84BC, 0x84BE, 0x84C0, 0x84C2, 0x84C3, 0x84C5, 0x84C6, 0x84C7, 0x84C8, 0x84CB, 0x84CC, 0x84CE, 0x84CF, 0x84D2, 0x84D4, 0x84D5, 0x84D7, 0x003F, 0x84D8, 0x84D9, 0x84DA, 0x84DB, 0x84DC, 0x84DE, 0x84E1, 0x84E2, 0x84E4, 0x84E7, 0x84E8, 0x84E9, 0x84EA, 0x84EB, 0x84ED, 0x84EE, 0x84EF, 0x84F1, 0x84F2, 0x84F3, 0x84F4, 0x84F5, 0x84F6, 0x84F7, 0x84F8, 0x84F9, 0x84FA, 0x84FB, 0x84FD, 0x84FE, 0x8500, 0x8501, 0x8502, 0x4F1E, 0x6563, 0x6851, 0x55D3, 0x4E27, 0x6414, 0x9A9A, 0x626B, 0x5AC2, 0x745F, 0x8272, 0x6DA9, 0x68EE, 0x50E7, 0x838E, 0x7802, 0x6740, 0x5239, 0x6C99, 0x7EB1, 0x50BB, 0x5565, 0x715E, 0x7B5B, 0x6652, 0x73CA, 0x82EB, 0x6749, 0x5C71, 0x5220, 0x717D, 0x886B, 0x95EA, 0x9655, 0x64C5, 0x8D61, 0x81B3, 0x5584, 0x6C55, 0x6247, 0x7F2E, 0x5892, 0x4F24, 0x5546, 0x8D4F, 0x664C, 0x4E0A, 0x5C1A, 0x88F3, 0x68A2, 0x634E, 0x7A0D, 0x70E7, 0x828D, 0x52FA, 0x97F6, 0x5C11, 0x54E8, 0x90B5, 0x7ECD, 0x5962, 0x8D4A, 0x86C7, 0x820C, 0x820D, 0x8D66, 0x6444, 0x5C04, 0x6151, 0x6D89, 0x793E, 0x8BBE, 0x7837, 0x7533, 0x547B, 0x4F38, 0x8EAB, 0x6DF1, 0x5A20, 0x7EC5, 0x795E, 0x6C88, 0x5BA1, 0x5A76, 0x751A, 0x80BE, 0x614E, 0x6E17, 0x58F0, 0x751F, 0x7525, 0x7272, 0x5347, 0x7EF3 }, { 0x8503, 0x8504, 0x8505, 0x8506, 0x8507, 0x8508, 0x8509, 0x850A, 0x850B, 0x850D, 0x850E, 0x850F, 0x8510, 0x8512, 0x8514, 0x8515, 0x8516, 0x8518, 0x8519, 0x851B, 0x851C, 0x851D, 0x851E, 0x8520, 0x8522, 0x8523, 0x8524, 0x8525, 0x8526, 0x8527, 0x8528, 0x8529, 0x852A, 0x852D, 0x852E, 0x852F, 0x8530, 0x8531, 0x8532, 0x8533, 0x8534, 0x8535, 0x8536, 0x853E, 0x853F, 0x8540, 0x8541, 0x8542, 0x8544, 0x8545, 0x8546, 0x8547, 0x854B, 0x854C, 0x854D, 0x854E, 0x854F, 0x8550, 0x8551, 0x8552, 0x8553, 0x8554, 0x8555, 0x003F, 0x8557, 0x8558, 0x855A, 0x855B, 0x855C, 0x855D, 0x855F, 0x8560, 0x8561, 0x8562, 0x8563, 0x8565, 0x8566, 0x8567, 0x8569, 0x856A, 0x856B, 0x856C, 0x856D, 0x856E, 0x856F, 0x8570, 0x8571, 0x8573, 0x8575, 0x8576, 0x8577, 0x8578, 0x857C, 0x857D, 0x857F, 0x8580, 0x8581, 0x7701, 0x76DB, 0x5269, 0x80DC, 0x5723, 0x5E08, 0x5931, 0x72EE, 0x65BD, 0x6E7F, 0x8BD7, 0x5C38, 0x8671, 0x5341, 0x77F3, 0x62FE, 0x65F6, 0x4EC0, 0x98DF, 0x8680, 0x5B9E, 0x8BC6, 0x53F2, 0x77E2, 0x4F7F, 0x5C4E, 0x9A76, 0x59CB, 0x5F0F, 0x793A, 0x58EB, 0x4E16, 0x67FF, 0x4E8B, 0x62ED, 0x8A93, 0x901D, 0x52BF, 0x662F, 0x55DC, 0x566C, 0x9002, 0x4ED5, 0x4F8D, 0x91CA, 0x9970, 0x6C0F, 0x5E02, 0x6043, 0x5BA4, 0x89C6, 0x8BD5, 0x6536, 0x624B, 0x9996, 0x5B88, 0x5BFF, 0x6388, 0x552E, 0x53D7, 0x7626, 0x517D, 0x852C, 0x67A2, 0x68B3, 0x6B8A, 0x6292, 0x8F93, 0x53D4, 0x8212, 0x6DD1, 0x758F, 0x4E66, 0x8D4E, 0x5B70, 0x719F, 0x85AF, 0x6691, 0x66D9, 0x7F72, 0x8700, 0x9ECD, 0x9F20, 0x5C5E, 0x672F, 0x8FF0, 0x6811, 0x675F, 0x620D, 0x7AD6, 0x5885, 0x5EB6, 0x6570, 0x6F31 }, { 0x8582, 0x8583, 0x8586, 0x8588, 0x8589, 0x858A, 0x858B, 0x858C, 0x858D, 0x858E, 0x8590, 0x8591, 0x8592, 0x8593, 0x8594, 0x8595, 0x8596, 0x8597, 0x8598, 0x8599, 0x859A, 0x859D, 0x859E, 0x859F, 0x85A0, 0x85A1, 0x85A2, 0x85A3, 0x85A5, 0x85A6, 0x85A7, 0x85A9, 0x85AB, 0x85AC, 0x85AD, 0x85B1, 0x85B2, 0x85B3, 0x85B4, 0x85B5, 0x85B6, 0x85B8, 0x85BA, 0x85BB, 0x85BC, 0x85BD, 0x85BE, 0x85BF, 0x85C0, 0x85C2, 0x85C3, 0x85C4, 0x85C5, 0x85C6, 0x85C7, 0x85C8, 0x85CA, 0x85CB, 0x85CC, 0x85CD, 0x85CE, 0x85D1, 0x85D2, 0x003F, 0x85D4, 0x85D6, 0x85D7, 0x85D8, 0x85D9, 0x85DA, 0x85DB, 0x85DD, 0x85DE, 0x85DF, 0x85E0, 0x85E1, 0x85E2, 0x85E3, 0x85E5, 0x85E6, 0x85E7, 0x85E8, 0x85EA, 0x85EB, 0x85EC, 0x85ED, 0x85EE, 0x85EF, 0x85F0, 0x85F1, 0x85F2, 0x85F3, 0x85F4, 0x85F5, 0x85F6, 0x85F7, 0x85F8, 0x6055, 0x5237, 0x800D, 0x6454, 0x8870, 0x7529, 0x5E05, 0x6813, 0x62F4, 0x971C, 0x53CC, 0x723D, 0x8C01, 0x6C34, 0x7761, 0x7A0E, 0x542E, 0x77AC, 0x987A, 0x821C, 0x8BF4, 0x7855, 0x6714, 0x70C1, 0x65AF, 0x6495, 0x5636, 0x601D, 0x79C1, 0x53F8, 0x4E1D, 0x6B7B, 0x8086, 0x5BFA, 0x55E3, 0x56DB, 0x4F3A, 0x4F3C, 0x9972, 0x5DF3, 0x677E, 0x8038, 0x6002, 0x9882, 0x9001, 0x5B8B, 0x8BBC, 0x8BF5, 0x641C, 0x8258, 0x64DE, 0x55FD, 0x82CF, 0x9165, 0x4FD7, 0x7D20, 0x901F, 0x7C9F, 0x50F3, 0x5851, 0x6EAF, 0x5BBF, 0x8BC9, 0x8083, 0x9178, 0x849C, 0x7B97, 0x867D, 0x968B, 0x968F, 0x7EE5, 0x9AD3, 0x788E, 0x5C81, 0x7A57, 0x9042, 0x96A7, 0x795F, 0x5B59, 0x635F, 0x7B0B, 0x84D1, 0x68AD, 0x5506, 0x7F29, 0x7410, 0x7D22, 0x9501, 0x6240, 0x584C, 0x4ED6, 0x5B83, 0x5979, 0x5854 }, { 0x85F9, 0x85FA, 0x85FC, 0x85FD, 0x85FE, 0x8600, 0x8601, 0x8602, 0x8603, 0x8604, 0x8606, 0x8607, 0x8608, 0x8609, 0x860A, 0x860B, 0x860C, 0x860D, 0x860E, 0x860F, 0x8610, 0x8612, 0x8613, 0x8614, 0x8615, 0x8617, 0x8618, 0x8619, 0x861A, 0x861B, 0x861C, 0x861D, 0x861E, 0x861F, 0x8620, 0x8621, 0x8622, 0x8623, 0x8624, 0x8625, 0x8626, 0x8628, 0x862A, 0x862B, 0x862C, 0x862D, 0x862E, 0x862F, 0x8630, 0x8631, 0x8632, 0x8633, 0x8634, 0x8635, 0x8636, 0x8637, 0x8639, 0x863A, 0x863B, 0x863D, 0x863E, 0x863F, 0x8640, 0x003F, 0x8641, 0x8642, 0x8643, 0x8644, 0x8645, 0x8646, 0x8647, 0x8648, 0x8649, 0x864A, 0x864B, 0x864C, 0x8652, 0x8653, 0x8655, 0x8656, 0x8657, 0x8658, 0x8659, 0x865B, 0x865C, 0x865D, 0x865F, 0x8660, 0x8661, 0x8663, 0x8664, 0x8665, 0x8666, 0x8667, 0x8668, 0x8669, 0x866A, 0x736D, 0x631E, 0x8E4B, 0x8E0F, 0x80CE, 0x82D4, 0x62AC, 0x53F0, 0x6CF0, 0x915E, 0x592A, 0x6001, 0x6C70, 0x574D, 0x644A, 0x8D2A, 0x762B, 0x6EE9, 0x575B, 0x6A80, 0x75F0, 0x6F6D, 0x8C2D, 0x8C08, 0x5766, 0x6BEF, 0x8892, 0x78B3, 0x63A2, 0x53F9, 0x70AD, 0x6C64, 0x5858, 0x642A, 0x5802, 0x68E0, 0x819B, 0x5510, 0x7CD6, 0x5018, 0x8EBA, 0x6DCC, 0x8D9F, 0x70EB, 0x638F, 0x6D9B, 0x6ED4, 0x7EE6, 0x8404, 0x6843, 0x9003, 0x6DD8, 0x9676, 0x8BA8, 0x5957, 0x7279, 0x85E4, 0x817E, 0x75BC, 0x8A8A, 0x68AF, 0x5254, 0x8E22, 0x9511, 0x63D0, 0x9898, 0x8E44, 0x557C, 0x4F53, 0x66FF, 0x568F, 0x60D5, 0x6D95, 0x5243, 0x5C49, 0x5929, 0x6DFB, 0x586B, 0x7530, 0x751C, 0x606C, 0x8214, 0x8146, 0x6311, 0x6761, 0x8FE2, 0x773A, 0x8DF3, 0x8D34, 0x94C1, 0x5E16, 0x5385, 0x542C, 0x70C3 }, { 0x866D, 0x866F, 0x8670, 0x8672, 0x8673, 0x8674, 0x8675, 0x8676, 0x8677, 0x8678, 0x8683, 0x8684, 0x8685, 0x8686, 0x8687, 0x8688, 0x8689, 0x868E, 0x868F, 0x8690, 0x8691, 0x8692, 0x8694, 0x8696, 0x8697, 0x8698, 0x8699, 0x869A, 0x869B, 0x869E, 0x869F, 0x86A0, 0x86A1, 0x86A2, 0x86A5, 0x86A6, 0x86AB, 0x86AD, 0x86AE, 0x86B2, 0x86B3, 0x86B7, 0x86B8, 0x86B9, 0x86BB, 0x86BC, 0x86BD, 0x86BE, 0x86BF, 0x86C1, 0x86C2, 0x86C3, 0x86C5, 0x86C8, 0x86CC, 0x86CD, 0x86D2, 0x86D3, 0x86D5, 0x86D6, 0x86D7, 0x86DA, 0x86DC, 0x003F, 0x86DD, 0x86E0, 0x86E1, 0x86E2, 0x86E3, 0x86E5, 0x86E6, 0x86E7, 0x86E8, 0x86EA, 0x86EB, 0x86EC, 0x86EF, 0x86F5, 0x86F6, 0x86F7, 0x86FA, 0x86FB, 0x86FC, 0x86FD, 0x86FF, 0x8701, 0x8704, 0x8705, 0x8706, 0x870B, 0x870C, 0x870E, 0x870F, 0x8710, 0x8711, 0x8714, 0x8716, 0x6C40, 0x5EF7, 0x505C, 0x4EAD, 0x5EAD, 0x633A, 0x8247, 0x901A, 0x6850, 0x916E, 0x77B3, 0x540C, 0x94DC, 0x5F64, 0x7AE5, 0x6876, 0x6345, 0x7B52, 0x7EDF, 0x75DB, 0x5077, 0x6295, 0x5934, 0x900F, 0x51F8, 0x79C3, 0x7A81, 0x56FE, 0x5F92, 0x9014, 0x6D82, 0x5C60, 0x571F, 0x5410, 0x5154, 0x6E4D, 0x56E2, 0x63A8, 0x9893, 0x817F, 0x8715, 0x892A, 0x9000, 0x541E, 0x5C6F, 0x81C0, 0x62D6, 0x6258, 0x8131, 0x9E35, 0x9640, 0x9A6E, 0x9A7C, 0x692D, 0x59A5, 0x62D3, 0x553E, 0x6316, 0x54C7, 0x86D9, 0x6D3C, 0x5A03, 0x74E6, 0x889C, 0x6B6A, 0x5916, 0x8C4C, 0x5F2F, 0x6E7E, 0x73A9, 0x987D, 0x4E38, 0x70F7, 0x5B8C, 0x7897, 0x633D, 0x665A, 0x7696, 0x60CB, 0x5B9B, 0x5A49, 0x4E07, 0x8155, 0x6C6A, 0x738B, 0x4EA1, 0x6789, 0x7F51, 0x5F80, 0x65FA, 0x671B, 0x5FD8, 0x5984, 0x5A01 }, { 0x8719, 0x871B, 0x871D, 0x871F, 0x8720, 0x8724, 0x8726, 0x8727, 0x8728, 0x872A, 0x872B, 0x872C, 0x872D, 0x872F, 0x8730, 0x8732, 0x8733, 0x8735, 0x8736, 0x8738, 0x8739, 0x873A, 0x873C, 0x873D, 0x8740, 0x8741, 0x8742, 0x8743, 0x8744, 0x8745, 0x8746, 0x874A, 0x874B, 0x874D, 0x874F, 0x8750, 0x8751, 0x8752, 0x8754, 0x8755, 0x8756, 0x8758, 0x875A, 0x875B, 0x875C, 0x875D, 0x875E, 0x875F, 0x8761, 0x8762, 0x8766, 0x8767, 0x8768, 0x8769, 0x876A, 0x876B, 0x876C, 0x876D, 0x876F, 0x8771, 0x8772, 0x8773, 0x8775, 0x003F, 0x8777, 0x8778, 0x8779, 0x877A, 0x877F, 0x8780, 0x8781, 0x8784, 0x8786, 0x8787, 0x8789, 0x878A, 0x878C, 0x878E, 0x878F, 0x8790, 0x8791, 0x8792, 0x8794, 0x8795, 0x8796, 0x8798, 0x8799, 0x879A, 0x879B, 0x879C, 0x879D, 0x879E, 0x87A0, 0x87A1, 0x87A2, 0x87A3, 0x87A4, 0x5DCD, 0x5FAE, 0x5371, 0x97E6, 0x8FDD, 0x6845, 0x56F4, 0x552F, 0x60DF, 0x4E3A, 0x6F4D, 0x7EF4, 0x82C7, 0x840E, 0x59D4, 0x4F1F, 0x4F2A, 0x5C3E, 0x7EAC, 0x672A, 0x851A, 0x5473, 0x754F, 0x80C3, 0x5582, 0x9B4F, 0x4F4D, 0x6E2D, 0x8C13, 0x5C09, 0x6170, 0x536B, 0x761F, 0x6E29, 0x868A, 0x6587, 0x95FB, 0x7EB9, 0x543B, 0x7A33, 0x7D0A, 0x95EE, 0x55E1, 0x7FC1, 0x74EE, 0x631D, 0x8717, 0x6DA1, 0x7A9D, 0x6211, 0x65A1, 0x5367, 0x63E1, 0x6C83, 0x5DEB, 0x545C, 0x94A8, 0x4E4C, 0x6C61, 0x8BEC, 0x5C4B, 0x65E0, 0x829C, 0x68A7, 0x543E, 0x5434, 0x6BCB, 0x6B66, 0x4E94, 0x6342, 0x5348, 0x821E, 0x4F0D, 0x4FAE, 0x575E, 0x620A, 0x96FE, 0x6664, 0x7269, 0x52FF, 0x52A1, 0x609F, 0x8BEF, 0x6614, 0x7199, 0x6790, 0x897F, 0x7852, 0x77FD, 0x6670, 0x563B, 0x5438, 0x9521, 0x727A }, { 0x87A5, 0x87A6, 0x87A7, 0x87A9, 0x87AA, 0x87AE, 0x87B0, 0x87B1, 0x87B2, 0x87B4, 0x87B6, 0x87B7, 0x87B8, 0x87B9, 0x87BB, 0x87BC, 0x87BE, 0x87BF, 0x87C1, 0x87C2, 0x87C3, 0x87C4, 0x87C5, 0x87C7, 0x87C8, 0x87C9, 0x87CC, 0x87CD, 0x87CE, 0x87CF, 0x87D0, 0x87D4, 0x87D5, 0x87D6, 0x87D7, 0x87D8, 0x87D9, 0x87DA, 0x87DC, 0x87DD, 0x87DE, 0x87DF, 0x87E1, 0x87E2, 0x87E3, 0x87E4, 0x87E6, 0x87E7, 0x87E8, 0x87E9, 0x87EB, 0x87EC, 0x87ED, 0x87EF, 0x87F0, 0x87F1, 0x87F2, 0x87F3, 0x87F4, 0x87F5, 0x87F6, 0x87F7, 0x87F8, 0x003F, 0x87FA, 0x87FB, 0x87FC, 0x87FD, 0x87FF, 0x8800, 0x8801, 0x8802, 0x8804, 0x8805, 0x8806, 0x8807, 0x8808, 0x8809, 0x880B, 0x880C, 0x880D, 0x880E, 0x880F, 0x8810, 0x8811, 0x8812, 0x8814, 0x8817, 0x8818, 0x8819, 0x881A, 0x881C, 0x881D, 0x881E, 0x881F, 0x8820, 0x8823, 0x7A00, 0x606F, 0x5E0C, 0x6089, 0x819D, 0x5915, 0x60DC, 0x7184, 0x70EF, 0x6EAA, 0x6C50, 0x7280, 0x6A84, 0x88AD, 0x5E2D, 0x4E60, 0x5AB3, 0x559C, 0x94E3, 0x6D17, 0x7CFB, 0x9699, 0x620F, 0x7EC6, 0x778E, 0x867E, 0x5323, 0x971E, 0x8F96, 0x6687, 0x5CE1, 0x4FA0, 0x72ED, 0x4E0B, 0x53A6, 0x590F, 0x5413, 0x6380, 0x9528, 0x5148, 0x4ED9, 0x9C9C, 0x7EA4, 0x54B8, 0x8D24, 0x8854, 0x8237, 0x95F2, 0x6D8E, 0x5F26, 0x5ACC, 0x663E, 0x9669, 0x73B0, 0x732E, 0x53BF, 0x817A, 0x9985, 0x7FA1, 0x5BAA, 0x9677, 0x9650, 0x7EBF, 0x76F8, 0x53A2, 0x9576, 0x9999, 0x7BB1, 0x8944, 0x6E58, 0x4E61, 0x7FD4, 0x7965, 0x8BE6, 0x60F3, 0x54CD, 0x4EAB, 0x9879, 0x5DF7, 0x6A61, 0x50CF, 0x5411, 0x8C61, 0x8427, 0x785D, 0x9704, 0x524A, 0x54EE, 0x56A3, 0x9500, 0x6D88, 0x5BB5, 0x6DC6, 0x6653 }, { 0x8824, 0x8825, 0x8826, 0x8827, 0x8828, 0x8829, 0x882A, 0x882B, 0x882C, 0x882D, 0x882E, 0x882F, 0x8830, 0x8831, 0x8833, 0x8834, 0x8835, 0x8836, 0x8837, 0x8838, 0x883A, 0x883B, 0x883D, 0x883E, 0x883F, 0x8841, 0x8842, 0x8843, 0x8846, 0x8847, 0x8848, 0x8849, 0x884A, 0x884B, 0x884E, 0x884F, 0x8850, 0x8851, 0x8852, 0x8853, 0x8855, 0x8856, 0x8858, 0x885A, 0x885B, 0x885C, 0x885D, 0x885E, 0x885F, 0x8860, 0x8866, 0x8867, 0x886A, 0x886D, 0x886F, 0x8871, 0x8873, 0x8874, 0x8875, 0x8876, 0x8878, 0x8879, 0x887A, 0x003F, 0x887B, 0x887C, 0x8880, 0x8883, 0x8886, 0x8887, 0x8889, 0x888A, 0x888C, 0x888E, 0x888F, 0x8890, 0x8891, 0x8893, 0x8894, 0x8895, 0x8897, 0x8898, 0x8899, 0x889A, 0x889B, 0x889D, 0x889E, 0x889F, 0x88A0, 0x88A1, 0x88A3, 0x88A5, 0x88A6, 0x88A7, 0x88A8, 0x88A9, 0x88AA, 0x5C0F, 0x5B5D, 0x6821, 0x8096, 0x5578, 0x7B11, 0x6548, 0x6954, 0x4E9B, 0x6B47, 0x874E, 0x978B, 0x534F, 0x631F, 0x643A, 0x90AA, 0x659C, 0x80C1, 0x8C10, 0x5199, 0x68B0, 0x5378, 0x87F9, 0x61C8, 0x6CC4, 0x6CFB, 0x8C22, 0x5C51, 0x85AA, 0x82AF, 0x950C, 0x6B23, 0x8F9B, 0x65B0, 0x5FFB, 0x5FC3, 0x4FE1, 0x8845, 0x661F, 0x8165, 0x7329, 0x60FA, 0x5174, 0x5211, 0x578B, 0x5F62, 0x90A2, 0x884C, 0x9192, 0x5E78, 0x674F, 0x6027, 0x59D3, 0x5144, 0x51F6, 0x80F8, 0x5308, 0x6C79, 0x96C4, 0x718A, 0x4F11, 0x4FEE, 0x7F9E, 0x673D, 0x55C5, 0x9508, 0x79C0, 0x8896, 0x7EE3, 0x589F, 0x620C, 0x9700, 0x865A, 0x5618, 0x987B, 0x5F90, 0x8BB8, 0x84C4, 0x9157, 0x53D9, 0x65ED, 0x5E8F, 0x755C, 0x6064, 0x7D6E, 0x5A7F, 0x7EEA, 0x7EED, 0x8F69, 0x55A7, 0x5BA3, 0x60AC, 0x65CB, 0x7384 }, { 0x88AC, 0x88AE, 0x88AF, 0x88B0, 0x88B2, 0x88B3, 0x88B4, 0x88B5, 0x88B6, 0x88B8, 0x88B9, 0x88BA, 0x88BB, 0x88BD, 0x88BE, 0x88BF, 0x88C0, 0x88C3, 0x88C4, 0x88C7, 0x88C8, 0x88CA, 0x88CB, 0x88CC, 0x88CD, 0x88CF, 0x88D0, 0x88D1, 0x88D3, 0x88D6, 0x88D7, 0x88DA, 0x88DB, 0x88DC, 0x88DD, 0x88DE, 0x88E0, 0x88E1, 0x88E6, 0x88E7, 0x88E9, 0x88EA, 0x88EB, 0x88EC, 0x88ED, 0x88EE, 0x88EF, 0x88F2, 0x88F5, 0x88F6, 0x88F7, 0x88FA, 0x88FB, 0x88FD, 0x88FF, 0x8900, 0x8901, 0x8903, 0x8904, 0x8905, 0x8906, 0x8907, 0x8908, 0x003F, 0x8909, 0x890B, 0x890C, 0x890D, 0x890E, 0x890F, 0x8911, 0x8914, 0x8915, 0x8916, 0x8917, 0x8918, 0x891C, 0x891D, 0x891E, 0x891F, 0x8920, 0x8922, 0x8923, 0x8924, 0x8926, 0x8927, 0x8928, 0x8929, 0x892C, 0x892D, 0x892E, 0x892F, 0x8931, 0x8932, 0x8933, 0x8935, 0x8937, 0x9009, 0x7663, 0x7729, 0x7EDA, 0x9774, 0x859B, 0x5B66, 0x7A74, 0x96EA, 0x8840, 0x52CB, 0x718F, 0x5FAA, 0x65EC, 0x8BE2, 0x5BFB, 0x9A6F, 0x5DE1, 0x6B89, 0x6C5B, 0x8BAD, 0x8BAF, 0x900A, 0x8FC5, 0x538B, 0x62BC, 0x9E26, 0x9E2D, 0x5440, 0x4E2B, 0x82BD, 0x7259, 0x869C, 0x5D16, 0x8859, 0x6DAF, 0x96C5, 0x54D1, 0x4E9A, 0x8BB6, 0x7109, 0x54BD, 0x9609, 0x70DF, 0x6DF9, 0x76D0, 0x4E25, 0x7814, 0x8712, 0x5CA9, 0x5EF6, 0x8A00, 0x989C, 0x960E, 0x708E, 0x6CBF, 0x5944, 0x63A9, 0x773C, 0x884D, 0x6F14, 0x8273, 0x5830, 0x71D5, 0x538C, 0x781A, 0x96C1, 0x5501, 0x5F66, 0x7130, 0x5BB4, 0x8C1A, 0x9A8C, 0x6B83, 0x592E, 0x9E2F, 0x79E7, 0x6768, 0x626C, 0x4F6F, 0x75A1, 0x7F8A, 0x6D0B, 0x9633, 0x6C27, 0x4EF0, 0x75D2, 0x517B, 0x6837, 0x6F3E, 0x9080, 0x8170, 0x5996, 0x7476 }, { 0x8938, 0x8939, 0x893A, 0x893B, 0x893C, 0x893D, 0x893E, 0x893F, 0x8940, 0x8942, 0x8943, 0x8945, 0x8946, 0x8947, 0x8948, 0x8949, 0x894A, 0x894B, 0x894C, 0x894D, 0x894E, 0x894F, 0x8950, 0x8951, 0x8952, 0x8953, 0x8954, 0x8955, 0x8956, 0x8957, 0x8958, 0x8959, 0x895A, 0x895B, 0x895C, 0x895D, 0x8960, 0x8961, 0x8962, 0x8963, 0x8964, 0x8965, 0x8967, 0x8968, 0x8969, 0x896A, 0x896B, 0x896C, 0x896D, 0x896E, 0x896F, 0x8970, 0x8971, 0x8972, 0x8973, 0x8974, 0x8975, 0x8976, 0x8977, 0x8978, 0x8979, 0x897A, 0x897C, 0x003F, 0x897D, 0x897E, 0x8980, 0x8982, 0x8984, 0x8985, 0x8987, 0x8988, 0x8989, 0x898A, 0x898B, 0x898C, 0x898D, 0x898E, 0x898F, 0x8990, 0x8991, 0x8992, 0x8993, 0x8994, 0x8995, 0x8996, 0x8997, 0x8998, 0x8999, 0x899A, 0x899B, 0x899C, 0x899D, 0x899E, 0x899F, 0x89A0, 0x89A1, 0x6447, 0x5C27, 0x9065, 0x7A91, 0x8C23, 0x59DA, 0x54AC, 0x8200, 0x836F, 0x8981, 0x8000, 0x6930, 0x564E, 0x8036, 0x7237, 0x91CE, 0x51B6, 0x4E5F, 0x9875, 0x6396, 0x4E1A, 0x53F6, 0x66F3, 0x814B, 0x591C, 0x6DB2, 0x4E00, 0x58F9, 0x533B, 0x63D6, 0x94F1, 0x4F9D, 0x4F0A, 0x8863, 0x9890, 0x5937, 0x9057, 0x79FB, 0x4EEA, 0x80F0, 0x7591, 0x6C82, 0x5B9C, 0x59E8, 0x5F5D, 0x6905, 0x8681, 0x501A, 0x5DF2, 0x4E59, 0x77E3, 0x4EE5, 0x827A, 0x6291, 0x6613, 0x9091, 0x5C79, 0x4EBF, 0x5F79, 0x81C6, 0x9038, 0x8084, 0x75AB, 0x4EA6, 0x88D4, 0x610F, 0x6BC5, 0x5FC6, 0x4E49, 0x76CA, 0x6EA2, 0x8BE3, 0x8BAE, 0x8C0A, 0x8BD1, 0x5F02, 0x7FFC, 0x7FCC, 0x7ECE, 0x8335, 0x836B, 0x56E0, 0x6BB7, 0x97F3, 0x9634, 0x59FB, 0x541F, 0x94F6, 0x6DEB, 0x5BC5, 0x996E, 0x5C39, 0x5F15, 0x9690 }, { 0x89A2, 0x89A3, 0x89A4, 0x89A5, 0x89A6, 0x89A7, 0x89A8, 0x89A9, 0x89AA, 0x89AB, 0x89AC, 0x89AD, 0x89AE, 0x89AF, 0x89B0, 0x89B1, 0x89B2, 0x89B3, 0x89B4, 0x89B5, 0x89B6, 0x89B7, 0x89B8, 0x89B9, 0x89BA, 0x89BB, 0x89BC, 0x89BD, 0x89BE, 0x89BF, 0x89C0, 0x89C3, 0x89CD, 0x89D3, 0x89D4, 0x89D5, 0x89D7, 0x89D8, 0x89D9, 0x89DB, 0x89DD, 0x89DF, 0x89E0, 0x89E1, 0x89E2, 0x89E4, 0x89E7, 0x89E8, 0x89E9, 0x89EA, 0x89EC, 0x89ED, 0x89EE, 0x89F0, 0x89F1, 0x89F2, 0x89F4, 0x89F5, 0x89F6, 0x89F7, 0x89F8, 0x89F9, 0x89FA, 0x003F, 0x89FB, 0x89FC, 0x89FD, 0x89FE, 0x89FF, 0x8A01, 0x8A02, 0x8A03, 0x8A04, 0x8A05, 0x8A06, 0x8A08, 0x8A09, 0x8A0A, 0x8A0B, 0x8A0C, 0x8A0D, 0x8A0E, 0x8A0F, 0x8A10, 0x8A11, 0x8A12, 0x8A13, 0x8A14, 0x8A15, 0x8A16, 0x8A17, 0x8A18, 0x8A19, 0x8A1A, 0x8A1B, 0x8A1C, 0x8A1D, 0x5370, 0x82F1, 0x6A31, 0x5A74, 0x9E70, 0x5E94, 0x7F28, 0x83B9, 0x8424, 0x8425, 0x8367, 0x8747, 0x8FCE, 0x8D62, 0x76C8, 0x5F71, 0x9896, 0x786C, 0x6620, 0x54DF, 0x62E5, 0x4F63, 0x81C3, 0x75C8, 0x5EB8, 0x96CD, 0x8E0A, 0x86F9, 0x548F, 0x6CF3, 0x6D8C, 0x6C38, 0x607F, 0x52C7, 0x7528, 0x5E7D, 0x4F18, 0x60A0, 0x5FE7, 0x5C24, 0x7531, 0x90AE, 0x94C0, 0x72B9, 0x6CB9, 0x6E38, 0x9149, 0x6709, 0x53CB, 0x53F3, 0x4F51, 0x91C9, 0x8BF1, 0x53C8, 0x5E7C, 0x8FC2, 0x6DE4, 0x4E8E, 0x76C2, 0x6986, 0x865E, 0x611A, 0x8206, 0x4F59, 0x4FDE, 0x903E, 0x9C7C, 0x6109, 0x6E1D, 0x6E14, 0x9685, 0x4E88, 0x5A31, 0x96E8, 0x4E0E, 0x5C7F, 0x79B9, 0x5B87, 0x8BED, 0x7FBD, 0x7389, 0x57DF, 0x828B, 0x90C1, 0x5401, 0x9047, 0x55BB, 0x5CEA, 0x5FA1, 0x6108, 0x6B32, 0x72F1, 0x80B2, 0x8A89 }, { 0x8A1E, 0x8A1F, 0x8A20, 0x8A21, 0x8A22, 0x8A23, 0x8A24, 0x8A25, 0x8A26, 0x8A27, 0x8A28, 0x8A29, 0x8A2A, 0x8A2B, 0x8A2C, 0x8A2D, 0x8A2E, 0x8A2F, 0x8A30, 0x8A31, 0x8A32, 0x8A33, 0x8A34, 0x8A35, 0x8A36, 0x8A37, 0x8A38, 0x8A39, 0x8A3A, 0x8A3B, 0x8A3C, 0x8A3D, 0x8A3F, 0x8A40, 0x8A41, 0x8A42, 0x8A43, 0x8A44, 0x8A45, 0x8A46, 0x8A47, 0x8A49, 0x8A4A, 0x8A4B, 0x8A4C, 0x8A4D, 0x8A4E, 0x8A4F, 0x8A50, 0x8A51, 0x8A52, 0x8A53, 0x8A54, 0x8A55, 0x8A56, 0x8A57, 0x8A58, 0x8A59, 0x8A5A, 0x8A5B, 0x8A5C, 0x8A5D, 0x8A5E, 0x003F, 0x8A5F, 0x8A60, 0x8A61, 0x8A62, 0x8A63, 0x8A64, 0x8A65, 0x8A66, 0x8A67, 0x8A68, 0x8A69, 0x8A6A, 0x8A6B, 0x8A6C, 0x8A6D, 0x8A6E, 0x8A6F, 0x8A70, 0x8A71, 0x8A72, 0x8A73, 0x8A74, 0x8A75, 0x8A76, 0x8A77, 0x8A78, 0x8A7A, 0x8A7B, 0x8A7C, 0x8A7D, 0x8A7E, 0x8A7F, 0x8A80, 0x6D74, 0x5BD3, 0x88D5, 0x9884, 0x8C6B, 0x9A6D, 0x9E33, 0x6E0A, 0x51A4, 0x5143, 0x57A3, 0x8881, 0x539F, 0x63F4, 0x8F95, 0x56ED, 0x5458, 0x5706, 0x733F, 0x6E90, 0x7F18, 0x8FDC, 0x82D1, 0x613F, 0x6028, 0x9662, 0x66F0, 0x7EA6, 0x8D8A, 0x8DC3, 0x94A5, 0x5CB3, 0x7CA4, 0x6708, 0x60A6, 0x9605, 0x8018, 0x4E91, 0x90E7, 0x5300, 0x9668, 0x5141, 0x8FD0, 0x8574, 0x915D, 0x6655, 0x97F5, 0x5B55, 0x531D, 0x7838, 0x6742, 0x683D, 0x54C9, 0x707E, 0x5BB0, 0x8F7D, 0x518D, 0x5728, 0x54B1, 0x6512, 0x6682, 0x8D5E, 0x8D43, 0x810F, 0x846C, 0x906D, 0x7CDF, 0x51FF, 0x85FB, 0x67A3, 0x65E9, 0x6FA1, 0x86A4, 0x8E81, 0x566A, 0x9020, 0x7682, 0x7076, 0x71E5, 0x8D23, 0x62E9, 0x5219, 0x6CFD, 0x8D3C, 0x600E, 0x589E, 0x618E, 0x66FE, 0x8D60, 0x624E, 0x55B3, 0x6E23, 0x672D, 0x8F67 }, { 0x8A81, 0x8A82, 0x8A83, 0x8A84, 0x8A85, 0x8A86, 0x8A87, 0x8A88, 0x8A8B, 0x8A8C, 0x8A8D, 0x8A8E, 0x8A8F, 0x8A90, 0x8A91, 0x8A92, 0x8A94, 0x8A95, 0x8A96, 0x8A97, 0x8A98, 0x8A99, 0x8A9A, 0x8A9B, 0x8A9C, 0x8A9D, 0x8A9E, 0x8A9F, 0x8AA0, 0x8AA1, 0x8AA2, 0x8AA3, 0x8AA4, 0x8AA5, 0x8AA6, 0x8AA7, 0x8AA8, 0x8AA9, 0x8AAA, 0x8AAB, 0x8AAC, 0x8AAD, 0x8AAE, 0x8AAF, 0x8AB0, 0x8AB1, 0x8AB2, 0x8AB3, 0x8AB4, 0x8AB5, 0x8AB6, 0x8AB7, 0x8AB8, 0x8AB9, 0x8ABA, 0x8ABB, 0x8ABC, 0x8ABD, 0x8ABE, 0x8ABF, 0x8AC0, 0x8AC1, 0x8AC2, 0x003F, 0x8AC3, 0x8AC4, 0x8AC5, 0x8AC6, 0x8AC7, 0x8AC8, 0x8AC9, 0x8ACA, 0x8ACB, 0x8ACC, 0x8ACD, 0x8ACE, 0x8ACF, 0x8AD0, 0x8AD1, 0x8AD2, 0x8AD3, 0x8AD4, 0x8AD5, 0x8AD6, 0x8AD7, 0x8AD8, 0x8AD9, 0x8ADA, 0x8ADB, 0x8ADC, 0x8ADD, 0x8ADE, 0x8ADF, 0x8AE0, 0x8AE1, 0x8AE2, 0x8AE3, 0x94E1, 0x95F8, 0x7728, 0x6805, 0x69A8, 0x548B, 0x4E4D, 0x70B8, 0x8BC8, 0x6458, 0x658B, 0x5B85, 0x7A84, 0x503A, 0x5BE8, 0x77BB, 0x6BE1, 0x8A79, 0x7C98, 0x6CBE, 0x76CF, 0x65A9, 0x8F97, 0x5D2D, 0x5C55, 0x8638, 0x6808, 0x5360, 0x6218, 0x7AD9, 0x6E5B, 0x7EFD, 0x6A1F, 0x7AE0, 0x5F70, 0x6F33, 0x5F20, 0x638C, 0x6DA8, 0x6756, 0x4E08, 0x5E10, 0x8D26, 0x4ED7, 0x80C0, 0x7634, 0x969C, 0x62DB, 0x662D, 0x627E, 0x6CBC, 0x8D75, 0x7167, 0x7F69, 0x5146, 0x8087, 0x53EC, 0x906E, 0x6298, 0x54F2, 0x86F0, 0x8F99, 0x8005, 0x9517, 0x8517, 0x8FD9, 0x6D59, 0x73CD, 0x659F, 0x771F, 0x7504, 0x7827, 0x81FB, 0x8D1E, 0x9488, 0x4FA6, 0x6795, 0x75B9, 0x8BCA, 0x9707, 0x632F, 0x9547, 0x9635, 0x84B8, 0x6323, 0x7741, 0x5F81, 0x72F0, 0x4E89, 0x6014, 0x6574, 0x62EF, 0x6B63, 0x653F }, { 0x8AE4, 0x8AE5, 0x8AE6, 0x8AE7, 0x8AE8, 0x8AE9, 0x8AEA, 0x8AEB, 0x8AEC, 0x8AED, 0x8AEE, 0x8AEF, 0x8AF0, 0x8AF1, 0x8AF2, 0x8AF3, 0x8AF4, 0x8AF5, 0x8AF6, 0x8AF7, 0x8AF8, 0x8AF9, 0x8AFA, 0x8AFB, 0x8AFC, 0x8AFD, 0x8AFE, 0x8AFF, 0x8B00, 0x8B01, 0x8B02, 0x8B03, 0x8B04, 0x8B05, 0x8B06, 0x8B08, 0x8B09, 0x8B0A, 0x8B0B, 0x8B0C, 0x8B0D, 0x8B0E, 0x8B0F, 0x8B10, 0x8B11, 0x8B12, 0x8B13, 0x8B14, 0x8B15, 0x8B16, 0x8B17, 0x8B18, 0x8B19, 0x8B1A, 0x8B1B, 0x8B1C, 0x8B1D, 0x8B1E, 0x8B1F, 0x8B20, 0x8B21, 0x8B22, 0x8B23, 0x003F, 0x8B24, 0x8B25, 0x8B27, 0x8B28, 0x8B29, 0x8B2A, 0x8B2B, 0x8B2C, 0x8B2D, 0x8B2E, 0x8B2F, 0x8B30, 0x8B31, 0x8B32, 0x8B33, 0x8B34, 0x8B35, 0x8B36, 0x8B37, 0x8B38, 0x8B39, 0x8B3A, 0x8B3B, 0x8B3C, 0x8B3D, 0x8B3E, 0x8B3F, 0x8B40, 0x8B41, 0x8B42, 0x8B43, 0x8B44, 0x8B45, 0x5E27, 0x75C7, 0x90D1, 0x8BC1, 0x829D, 0x679D, 0x652F, 0x5431, 0x8718, 0x77E5, 0x80A2, 0x8102, 0x6C41, 0x4E4B, 0x7EC7, 0x804C, 0x76F4, 0x690D, 0x6B96, 0x6267, 0x503C, 0x4F84, 0x5740, 0x6307, 0x6B62, 0x8DBE, 0x53EA, 0x65E8, 0x7EB8, 0x5FD7, 0x631A, 0x63B7, 0x81F3, 0x81F4, 0x7F6E, 0x5E1C, 0x5CD9, 0x5236, 0x667A, 0x79E9, 0x7A1A, 0x8D28, 0x7099, 0x75D4, 0x6EDE, 0x6CBB, 0x7A92, 0x4E2D, 0x76C5, 0x5FE0, 0x949F, 0x8877, 0x7EC8, 0x79CD, 0x80BF, 0x91CD, 0x4EF2, 0x4F17, 0x821F, 0x5468, 0x5DDE, 0x6D32, 0x8BCC, 0x7CA5, 0x8F74, 0x8098, 0x5E1A, 0x5492, 0x76B1, 0x5B99, 0x663C, 0x9AA4, 0x73E0, 0x682A, 0x86DB, 0x6731, 0x732A, 0x8BF8, 0x8BDB, 0x9010, 0x7AF9, 0x70DB, 0x716E, 0x62C4, 0x77A9, 0x5631, 0x4E3B, 0x8457, 0x67F1, 0x52A9, 0x86C0, 0x8D2E, 0x94F8, 0x7B51 }, { 0x8B46, 0x8B47, 0x8B48, 0x8B49, 0x8B4A, 0x8B4B, 0x8B4C, 0x8B4D, 0x8B4E, 0x8B4F, 0x8B50, 0x8B51, 0x8B52, 0x8B53, 0x8B54, 0x8B55, 0x8B56, 0x8B57, 0x8B58, 0x8B59, 0x8B5A, 0x8B5B, 0x8B5C, 0x8B5D, 0x8B5E, 0x8B5F, 0x8B60, 0x8B61, 0x8B62, 0x8B63, 0x8B64, 0x8B65, 0x8B67, 0x8B68, 0x8B69, 0x8B6A, 0x8B6B, 0x8B6D, 0x8B6E, 0x8B6F, 0x8B70, 0x8B71, 0x8B72, 0x8B73, 0x8B74, 0x8B75, 0x8B76, 0x8B77, 0x8B78, 0x8B79, 0x8B7A, 0x8B7B, 0x8B7C, 0x8B7D, 0x8B7E, 0x8B7F, 0x8B80, 0x8B81, 0x8B82, 0x8B83, 0x8B84, 0x8B85, 0x8B86, 0x003F, 0x8B87, 0x8B88, 0x8B89, 0x8B8A, 0x8B8B, 0x8B8C, 0x8B8D, 0x8B8E, 0x8B8F, 0x8B90, 0x8B91, 0x8B92, 0x8B93, 0x8B94, 0x8B95, 0x8B96, 0x8B97, 0x8B98, 0x8B99, 0x8B9A, 0x8B9B, 0x8B9C, 0x8B9D, 0x8B9E, 0x8B9F, 0x8BAC, 0x8BB1, 0x8BBB, 0x8BC7, 0x8BD0, 0x8BEA, 0x8C09, 0x8C1E, 0x4F4F, 0x6CE8, 0x795D, 0x9A7B, 0x6293, 0x722A, 0x62FD, 0x4E13, 0x7816, 0x8F6C, 0x64B0, 0x8D5A, 0x7BC6, 0x6869, 0x5E84, 0x88C5, 0x5986, 0x649E, 0x58EE, 0x72B6, 0x690E, 0x9525, 0x8FFD, 0x8D58, 0x5760, 0x7F00, 0x8C06, 0x51C6, 0x6349, 0x62D9, 0x5353, 0x684C, 0x7422, 0x8301, 0x914C, 0x5544, 0x7740, 0x707C, 0x6D4A, 0x5179, 0x54A8, 0x8D44, 0x59FF, 0x6ECB, 0x6DC4, 0x5B5C, 0x7D2B, 0x4ED4, 0x7C7D, 0x6ED3, 0x5B50, 0x81EA, 0x6E0D, 0x5B57, 0x9B03, 0x68D5, 0x8E2A, 0x5B97, 0x7EFC, 0x603B, 0x7EB5, 0x90B9, 0x8D70, 0x594F, 0x63CD, 0x79DF, 0x8DB3, 0x5352, 0x65CF, 0x7956, 0x8BC5, 0x963B, 0x7EC4, 0x94BB, 0x7E82, 0x5634, 0x9189, 0x6700, 0x7F6A, 0x5C0A, 0x9075, 0x6628, 0x5DE6, 0x4F50, 0x67DE, 0x505A, 0x4F5C, 0x5750, 0x5EA7, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F }, { 0x8C38, 0x8C39, 0x8C3A, 0x8C3B, 0x8C3C, 0x8C3D, 0x8C3E, 0x8C3F, 0x8C40, 0x8C42, 0x8C43, 0x8C44, 0x8C45, 0x8C48, 0x8C4A, 0x8C4B, 0x8C4D, 0x8C4E, 0x8C4F, 0x8C50, 0x8C51, 0x8C52, 0x8C53, 0x8C54, 0x8C56, 0x8C57, 0x8C58, 0x8C59, 0x8C5B, 0x8C5C, 0x8C5D, 0x8C5E, 0x8C5F, 0x8C60, 0x8C63, 0x8C64, 0x8C65, 0x8C66, 0x8C67, 0x8C68, 0x8C69, 0x8C6C, 0x8C6D, 0x8C6E, 0x8C6F, 0x8C70, 0x8C71, 0x8C72, 0x8C74, 0x8C75, 0x8C76, 0x8C77, 0x8C7B, 0x8C7C, 0x8C7D, 0x8C7E, 0x8C7F, 0x8C80, 0x8C81, 0x8C83, 0x8C84, 0x8C86, 0x8C87, 0x003F, 0x8C88, 0x8C8B, 0x8C8D, 0x8C8E, 0x8C8F, 0x8C90, 0x8C91, 0x8C92, 0x8C93, 0x8C95, 0x8C96, 0x8C97, 0x8C99, 0x8C9A, 0x8C9B, 0x8C9C, 0x8C9D, 0x8C9E, 0x8C9F, 0x8CA0, 0x8CA1, 0x8CA2, 0x8CA3, 0x8CA4, 0x8CA5, 0x8CA6, 0x8CA7, 0x8CA8, 0x8CA9, 0x8CAA, 0x8CAB, 0x8CAC, 0x8CAD, 0x4E8D, 0x4E0C, 0x5140, 0x4E10, 0x5EFF, 0x5345, 0x4E15, 0x4E98, 0x4E1E, 0x9B32, 0x5B6C, 0x5669, 0x4E28, 0x79BA, 0x4E3F, 0x5315, 0x4E47, 0x592D, 0x723B, 0x536E, 0x6C10, 0x56DF, 0x80E4, 0x9997, 0x6BD3, 0x777E, 0x9F17, 0x4E36, 0x4E9F, 0x9F10, 0x4E5C, 0x4E69, 0x4E93, 0x8288, 0x5B5B, 0x556C, 0x560F, 0x4EC4, 0x538D, 0x539D, 0x53A3, 0x53A5, 0x53AE, 0x9765, 0x8D5D, 0x531A, 0x53F5, 0x5326, 0x532E, 0x533E, 0x8D5C, 0x5366, 0x5363, 0x5202, 0x5208, 0x520E, 0x522D, 0x5233, 0x523F, 0x5240, 0x524C, 0x525E, 0x5261, 0x525C, 0x84AF, 0x527D, 0x5282, 0x5281, 0x5290, 0x5293, 0x5182, 0x7F54, 0x4EBB, 0x4EC3, 0x4EC9, 0x4EC2, 0x4EE8, 0x4EE1, 0x4EEB, 0x4EDE, 0x4F1B, 0x4EF3, 0x4F22, 0x4F64, 0x4EF5, 0x4F25, 0x4F27, 0x4F09, 0x4F2B, 0x4F5E, 0x4F67, 0x6538, 0x4F5A, 0x4F5D }, { 0x8CAE, 0x8CAF, 0x8CB0, 0x8CB1, 0x8CB2, 0x8CB3, 0x8CB4, 0x8CB5, 0x8CB6, 0x8CB7, 0x8CB8, 0x8CB9, 0x8CBA, 0x8CBB, 0x8CBC, 0x8CBD, 0x8CBE, 0x8CBF, 0x8CC0, 0x8CC1, 0x8CC2, 0x8CC3, 0x8CC4, 0x8CC5, 0x8CC6, 0x8CC7, 0x8CC8, 0x8CC9, 0x8CCA, 0x8CCB, 0x8CCC, 0x8CCD, 0x8CCE, 0x8CCF, 0x8CD0, 0x8CD1, 0x8CD2, 0x8CD3, 0x8CD4, 0x8CD5, 0x8CD6, 0x8CD7, 0x8CD8, 0x8CD9, 0x8CDA, 0x8CDB, 0x8CDC, 0x8CDD, 0x8CDE, 0x8CDF, 0x8CE0, 0x8CE1, 0x8CE2, 0x8CE3, 0x8CE4, 0x8CE5, 0x8CE6, 0x8CE7, 0x8CE8, 0x8CE9, 0x8CEA, 0x8CEB, 0x8CEC, 0x003F, 0x8CED, 0x8CEE, 0x8CEF, 0x8CF0, 0x8CF1, 0x8CF2, 0x8CF3, 0x8CF4, 0x8CF5, 0x8CF6, 0x8CF7, 0x8CF8, 0x8CF9, 0x8CFA, 0x8CFB, 0x8CFC, 0x8CFD, 0x8CFE, 0x8CFF, 0x8D00, 0x8D01, 0x8D02, 0x8D03, 0x8D04, 0x8D05, 0x8D06, 0x8D07, 0x8D08, 0x8D09, 0x8D0A, 0x8D0B, 0x8D0C, 0x8D0D, 0x4F5F, 0x4F57, 0x4F32, 0x4F3D, 0x4F76, 0x4F74, 0x4F91, 0x4F89, 0x4F83, 0x4F8F, 0x4F7E, 0x4F7B, 0x4FAA, 0x4F7C, 0x4FAC, 0x4F94, 0x4FE6, 0x4FE8, 0x4FEA, 0x4FC5, 0x4FDA, 0x4FE3, 0x4FDC, 0x4FD1, 0x4FDF, 0x4FF8, 0x5029, 0x504C, 0x4FF3, 0x502C, 0x500F, 0x502E, 0x502D, 0x4FFE, 0x501C, 0x500C, 0x5025, 0x5028, 0x507E, 0x5043, 0x5055, 0x5048, 0x504E, 0x506C, 0x507B, 0x50A5, 0x50A7, 0x50A9, 0x50BA, 0x50D6, 0x5106, 0x50ED, 0x50EC, 0x50E6, 0x50EE, 0x5107, 0x510B, 0x4EDD, 0x6C3D, 0x4F58, 0x4F65, 0x4FCE, 0x9FA0, 0x6C46, 0x7C74, 0x516E, 0x5DFD, 0x9EC9, 0x9998, 0x5181, 0x5914, 0x52F9, 0x530D, 0x8A07, 0x5310, 0x51EB, 0x5919, 0x5155, 0x4EA0, 0x5156, 0x4EB3, 0x886E, 0x88A4, 0x4EB5, 0x8114, 0x88D2, 0x7980, 0x5B34, 0x8803, 0x7FB8, 0x51AB, 0x51B1, 0x51BD, 0x51BC }, { 0x8D0E, 0x8D0F, 0x8D10, 0x8D11, 0x8D12, 0x8D13, 0x8D14, 0x8D15, 0x8D16, 0x8D17, 0x8D18, 0x8D19, 0x8D1A, 0x8D1B, 0x8D1C, 0x8D20, 0x8D51, 0x8D52, 0x8D57, 0x8D5F, 0x8D65, 0x8D68, 0x8D69, 0x8D6A, 0x8D6C, 0x8D6E, 0x8D6F, 0x8D71, 0x8D72, 0x8D78, 0x8D79, 0x8D7A, 0x8D7B, 0x8D7C, 0x8D7D, 0x8D7E, 0x8D7F, 0x8D80, 0x8D82, 0x8D83, 0x8D86, 0x8D87, 0x8D88, 0x8D89, 0x8D8C, 0x8D8D, 0x8D8E, 0x8D8F, 0x8D90, 0x8D92, 0x8D93, 0x8D95, 0x8D96, 0x8D97, 0x8D98, 0x8D99, 0x8D9A, 0x8D9B, 0x8D9C, 0x8D9D, 0x8D9E, 0x8DA0, 0x8DA1, 0x003F, 0x8DA2, 0x8DA4, 0x8DA5, 0x8DA6, 0x8DA7, 0x8DA8, 0x8DA9, 0x8DAA, 0x8DAB, 0x8DAC, 0x8DAD, 0x8DAE, 0x8DAF, 0x8DB0, 0x8DB2, 0x8DB6, 0x8DB7, 0x8DB9, 0x8DBB, 0x8DBD, 0x8DC0, 0x8DC1, 0x8DC2, 0x8DC5, 0x8DC7, 0x8DC8, 0x8DC9, 0x8DCA, 0x8DCD, 0x8DD0, 0x8DD2, 0x8DD3, 0x8DD4, 0x51C7, 0x5196, 0x51A2, 0x51A5, 0x8BA0, 0x8BA6, 0x8BA7, 0x8BAA, 0x8BB4, 0x8BB5, 0x8BB7, 0x8BC2, 0x8BC3, 0x8BCB, 0x8BCF, 0x8BCE, 0x8BD2, 0x8BD3, 0x8BD4, 0x8BD6, 0x8BD8, 0x8BD9, 0x8BDC, 0x8BDF, 0x8BE0, 0x8BE4, 0x8BE8, 0x8BE9, 0x8BEE, 0x8BF0, 0x8BF3, 0x8BF6, 0x8BF9, 0x8BFC, 0x8BFF, 0x8C00, 0x8C02, 0x8C04, 0x8C07, 0x8C0C, 0x8C0F, 0x8C11, 0x8C12, 0x8C14, 0x8C15, 0x8C16, 0x8C19, 0x8C1B, 0x8C18, 0x8C1D, 0x8C1F, 0x8C20, 0x8C21, 0x8C25, 0x8C27, 0x8C2A, 0x8C2B, 0x8C2E, 0x8C2F, 0x8C32, 0x8C33, 0x8C35, 0x8C36, 0x5369, 0x537A, 0x961D, 0x9622, 0x9621, 0x9631, 0x962A, 0x963D, 0x963C, 0x9642, 0x9649, 0x9654, 0x965F, 0x9667, 0x966C, 0x9672, 0x9674, 0x9688, 0x968D, 0x9697, 0x96B0, 0x9097, 0x909B, 0x909D, 0x9099, 0x90AC, 0x90A1, 0x90B4, 0x90B3, 0x90B6, 0x90BA }, { 0x8DD5, 0x8DD8, 0x8DD9, 0x8DDC, 0x8DE0, 0x8DE1, 0x8DE2, 0x8DE5, 0x8DE6, 0x8DE7, 0x8DE9, 0x8DED, 0x8DEE, 0x8DF0, 0x8DF1, 0x8DF2, 0x8DF4, 0x8DF6, 0x8DFC, 0x8DFE, 0x8DFF, 0x8E00, 0x8E01, 0x8E02, 0x8E03, 0x8E04, 0x8E06, 0x8E07, 0x8E08, 0x8E0B, 0x8E0D, 0x8E0E, 0x8E10, 0x8E11, 0x8E12, 0x8E13, 0x8E15, 0x8E16, 0x8E17, 0x8E18, 0x8E19, 0x8E1A, 0x8E1B, 0x8E1C, 0x8E20, 0x8E21, 0x8E24, 0x8E25, 0x8E26, 0x8E27, 0x8E28, 0x8E2B, 0x8E2D, 0x8E30, 0x8E32, 0x8E33, 0x8E34, 0x8E36, 0x8E37, 0x8E38, 0x8E3B, 0x8E3C, 0x8E3E, 0x003F, 0x8E3F, 0x8E43, 0x8E45, 0x8E46, 0x8E4C, 0x8E4D, 0x8E4E, 0x8E4F, 0x8E50, 0x8E53, 0x8E54, 0x8E55, 0x8E56, 0x8E57, 0x8E58, 0x8E5A, 0x8E5B, 0x8E5C, 0x8E5D, 0x8E5E, 0x8E5F, 0x8E60, 0x8E61, 0x8E62, 0x8E63, 0x8E64, 0x8E65, 0x8E67, 0x8E68, 0x8E6A, 0x8E6B, 0x8E6E, 0x8E71, 0x90B8, 0x90B0, 0x90CF, 0x90C5, 0x90BE, 0x90D0, 0x90C4, 0x90C7, 0x90D3, 0x90E6, 0x90E2, 0x90DC, 0x90D7, 0x90DB, 0x90EB, 0x90EF, 0x90FE, 0x9104, 0x9122, 0x911E, 0x9123, 0x9131, 0x912F, 0x9139, 0x9143, 0x9146, 0x520D, 0x5942, 0x52A2, 0x52AC, 0x52AD, 0x52BE, 0x54FF, 0x52D0, 0x52D6, 0x52F0, 0x53DF, 0x71EE, 0x77CD, 0x5EF4, 0x51F5, 0x51FC, 0x9B2F, 0x53B6, 0x5F01, 0x755A, 0x5DEF, 0x574C, 0x57A9, 0x57A1, 0x587E, 0x58BC, 0x58C5, 0x58D1, 0x5729, 0x572C, 0x572A, 0x5733, 0x5739, 0x572E, 0x572F, 0x575C, 0x573B, 0x5742, 0x5769, 0x5785, 0x576B, 0x5786, 0x577C, 0x577B, 0x5768, 0x576D, 0x5776, 0x5773, 0x57AD, 0x57A4, 0x578C, 0x57B2, 0x57CF, 0x57A7, 0x57B4, 0x5793, 0x57A0, 0x57D5, 0x57D8, 0x57DA, 0x57D9, 0x57D2, 0x57B8, 0x57F4, 0x57EF, 0x57F8, 0x57E4, 0x57DD }, { 0x8E73, 0x8E75, 0x8E77, 0x8E78, 0x8E79, 0x8E7A, 0x8E7B, 0x8E7D, 0x8E7E, 0x8E80, 0x8E82, 0x8E83, 0x8E84, 0x8E86, 0x8E88, 0x8E89, 0x8E8A, 0x8E8B, 0x8E8C, 0x8E8D, 0x8E8E, 0x8E91, 0x8E92, 0x8E93, 0x8E95, 0x8E96, 0x8E97, 0x8E98, 0x8E99, 0x8E9A, 0x8E9B, 0x8E9D, 0x8E9F, 0x8EA0, 0x8EA1, 0x8EA2, 0x8EA3, 0x8EA4, 0x8EA5, 0x8EA6, 0x8EA7, 0x8EA8, 0x8EA9, 0x8EAA, 0x8EAD, 0x8EAE, 0x8EB0, 0x8EB1, 0x8EB3, 0x8EB4, 0x8EB5, 0x8EB6, 0x8EB7, 0x8EB8, 0x8EB9, 0x8EBB, 0x8EBC, 0x8EBD, 0x8EBE, 0x8EBF, 0x8EC0, 0x8EC1, 0x8EC2, 0x003F, 0x8EC3, 0x8EC4, 0x8EC5, 0x8EC6, 0x8EC7, 0x8EC8, 0x8EC9, 0x8ECA, 0x8ECB, 0x8ECC, 0x8ECD, 0x8ECF, 0x8ED0, 0x8ED1, 0x8ED2, 0x8ED3, 0x8ED4, 0x8ED5, 0x8ED6, 0x8ED7, 0x8ED8, 0x8ED9, 0x8EDA, 0x8EDB, 0x8EDC, 0x8EDD, 0x8EDE, 0x8EDF, 0x8EE0, 0x8EE1, 0x8EE2, 0x8EE3, 0x8EE4, 0x580B, 0x580D, 0x57FD, 0x57ED, 0x5800, 0x581E, 0x5819, 0x5844, 0x5820, 0x5865, 0x586C, 0x5881, 0x5889, 0x589A, 0x5880, 0x99A8, 0x9F19, 0x61FF, 0x8279, 0x827D, 0x827F, 0x828F, 0x828A, 0x82A8, 0x8284, 0x828E, 0x8291, 0x8297, 0x8299, 0x82AB, 0x82B8, 0x82BE, 0x82B0, 0x82C8, 0x82CA, 0x82E3, 0x8298, 0x82B7, 0x82AE, 0x82CB, 0x82CC, 0x82C1, 0x82A9, 0x82B4, 0x82A1, 0x82AA, 0x829F, 0x82C4, 0x82CE, 0x82A4, 0x82E1, 0x8309, 0x82F7, 0x82E4, 0x830F, 0x8307, 0x82DC, 0x82F4, 0x82D2, 0x82D8, 0x830C, 0x82FB, 0x82D3, 0x8311, 0x831A, 0x8306, 0x8314, 0x8315, 0x82E0, 0x82D5, 0x831C, 0x8351, 0x835B, 0x835C, 0x8308, 0x8392, 0x833C, 0x8334, 0x8331, 0x839B, 0x835E, 0x832F, 0x834F, 0x8347, 0x8343, 0x835F, 0x8340, 0x8317, 0x8360, 0x832D, 0x833A, 0x8333, 0x8366, 0x8365 }, { 0x8EE5, 0x8EE6, 0x8EE7, 0x8EE8, 0x8EE9, 0x8EEA, 0x8EEB, 0x8EEC, 0x8EED, 0x8EEE, 0x8EEF, 0x8EF0, 0x8EF1, 0x8EF2, 0x8EF3, 0x8EF4, 0x8EF5, 0x8EF6, 0x8EF7, 0x8EF8, 0x8EF9, 0x8EFA, 0x8EFB, 0x8EFC, 0x8EFD, 0x8EFE, 0x8EFF, 0x8F00, 0x8F01, 0x8F02, 0x8F03, 0x8F04, 0x8F05, 0x8F06, 0x8F07, 0x8F08, 0x8F09, 0x8F0A, 0x8F0B, 0x8F0C, 0x8F0D, 0x8F0E, 0x8F0F, 0x8F10, 0x8F11, 0x8F12, 0x8F13, 0x8F14, 0x8F15, 0x8F16, 0x8F17, 0x8F18, 0x8F19, 0x8F1A, 0x8F1B, 0x8F1C, 0x8F1D, 0x8F1E, 0x8F1F, 0x8F20, 0x8F21, 0x8F22, 0x8F23, 0x003F, 0x8F24, 0x8F25, 0x8F26, 0x8F27, 0x8F28, 0x8F29, 0x8F2A, 0x8F2B, 0x8F2C, 0x8F2D, 0x8F2E, 0x8F2F, 0x8F30, 0x8F31, 0x8F32, 0x8F33, 0x8F34, 0x8F35, 0x8F36, 0x8F37, 0x8F38, 0x8F39, 0x8F3A, 0x8F3B, 0x8F3C, 0x8F3D, 0x8F3E, 0x8F3F, 0x8F40, 0x8F41, 0x8F42, 0x8F43, 0x8F44, 0x8368, 0x831B, 0x8369, 0x836C, 0x836A, 0x836D, 0x836E, 0x83B0, 0x8378, 0x83B3, 0x83B4, 0x83A0, 0x83AA, 0x8393, 0x839C, 0x8385, 0x837C, 0x83B6, 0x83A9, 0x837D, 0x83B8, 0x837B, 0x8398, 0x839E, 0x83A8, 0x83BA, 0x83BC, 0x83C1, 0x8401, 0x83E5, 0x83D8, 0x5807, 0x8418, 0x840B, 0x83DD, 0x83FD, 0x83D6, 0x841C, 0x8438, 0x8411, 0x8406, 0x83D4, 0x83DF, 0x840F, 0x8403, 0x83F8, 0x83F9, 0x83EA, 0x83C5, 0x83C0, 0x8426, 0x83F0, 0x83E1, 0x845C, 0x8451, 0x845A, 0x8459, 0x8473, 0x8487, 0x8488, 0x847A, 0x8489, 0x8478, 0x843C, 0x8446, 0x8469, 0x8476, 0x848C, 0x848E, 0x8431, 0x846D, 0x84C1, 0x84CD, 0x84D0, 0x84E6, 0x84BD, 0x84D3, 0x84CA, 0x84BF, 0x84BA, 0x84E0, 0x84A1, 0x84B9, 0x84B4, 0x8497, 0x84E5, 0x84E3, 0x850C, 0x750D, 0x8538, 0x84F0, 0x8539, 0x851F, 0x853A }, { 0x8F45, 0x8F46, 0x8F47, 0x8F48, 0x8F49, 0x8F4A, 0x8F4B, 0x8F4C, 0x8F4D, 0x8F4E, 0x8F4F, 0x8F50, 0x8F51, 0x8F52, 0x8F53, 0x8F54, 0x8F55, 0x8F56, 0x8F57, 0x8F58, 0x8F59, 0x8F5A, 0x8F5B, 0x8F5C, 0x8F5D, 0x8F5E, 0x8F5F, 0x8F60, 0x8F61, 0x8F62, 0x8F63, 0x8F64, 0x8F65, 0x8F6A, 0x8F80, 0x8F8C, 0x8F92, 0x8F9D, 0x8FA0, 0x8FA1, 0x8FA2, 0x8FA4, 0x8FA5, 0x8FA6, 0x8FA7, 0x8FAA, 0x8FAC, 0x8FAD, 0x8FAE, 0x8FAF, 0x8FB2, 0x8FB3, 0x8FB4, 0x8FB5, 0x8FB7, 0x8FB8, 0x8FBA, 0x8FBB, 0x8FBC, 0x8FBF, 0x8FC0, 0x8FC3, 0x8FC6, 0x003F, 0x8FC9, 0x8FCA, 0x8FCB, 0x8FCC, 0x8FCD, 0x8FCF, 0x8FD2, 0x8FD6, 0x8FD7, 0x8FDA, 0x8FE0, 0x8FE1, 0x8FE3, 0x8FE7, 0x8FEC, 0x8FEF, 0x8FF1, 0x8FF2, 0x8FF4, 0x8FF5, 0x8FF6, 0x8FFA, 0x8FFB, 0x8FFC, 0x8FFE, 0x8FFF, 0x9007, 0x9008, 0x900C, 0x900E, 0x9013, 0x9015, 0x9018, 0x8556, 0x853B, 0x84FF, 0x84FC, 0x8559, 0x8548, 0x8568, 0x8564, 0x855E, 0x857A, 0x77A2, 0x8543, 0x8572, 0x857B, 0x85A4, 0x85A8, 0x8587, 0x858F, 0x8579, 0x85AE, 0x859C, 0x8585, 0x85B9, 0x85B7, 0x85B0, 0x85D3, 0x85C1, 0x85DC, 0x85FF, 0x8627, 0x8605, 0x8629, 0x8616, 0x863C, 0x5EFE, 0x5F08, 0x593C, 0x5941, 0x8037, 0x5955, 0x595A, 0x5958, 0x530F, 0x5C22, 0x5C25, 0x5C2C, 0x5C34, 0x624C, 0x626A, 0x629F, 0x62BB, 0x62CA, 0x62DA, 0x62D7, 0x62EE, 0x6322, 0x62F6, 0x6339, 0x634B, 0x6343, 0x63AD, 0x63F6, 0x6371, 0x637A, 0x638E, 0x63B4, 0x636D, 0x63AC, 0x638A, 0x6369, 0x63AE, 0x63BC, 0x63F2, 0x63F8, 0x63E0, 0x63FF, 0x63C4, 0x63DE, 0x63CE, 0x6452, 0x63C6, 0x63BE, 0x6445, 0x6441, 0x640B, 0x641B, 0x6420, 0x640C, 0x6426, 0x6421, 0x645E, 0x6484, 0x646D, 0x6496 }, { 0x9019, 0x901C, 0x9023, 0x9024, 0x9025, 0x9027, 0x9028, 0x9029, 0x902A, 0x902B, 0x902C, 0x9030, 0x9031, 0x9032, 0x9033, 0x9034, 0x9037, 0x9039, 0x903A, 0x903D, 0x903F, 0x9040, 0x9043, 0x9045, 0x9046, 0x9048, 0x9049, 0x904A, 0x904B, 0x904C, 0x904E, 0x9054, 0x9055, 0x9056, 0x9059, 0x905A, 0x905C, 0x905D, 0x905E, 0x905F, 0x9060, 0x9061, 0x9064, 0x9066, 0x9067, 0x9069, 0x906A, 0x906B, 0x906C, 0x906F, 0x9070, 0x9071, 0x9072, 0x9073, 0x9076, 0x9077, 0x9078, 0x9079, 0x907A, 0x907B, 0x907C, 0x907E, 0x9081, 0x003F, 0x9084, 0x9085, 0x9086, 0x9087, 0x9089, 0x908A, 0x908C, 0x908D, 0x908E, 0x908F, 0x9090, 0x9092, 0x9094, 0x9096, 0x9098, 0x909A, 0x909C, 0x909E, 0x909F, 0x90A0, 0x90A4, 0x90A5, 0x90A7, 0x90A8, 0x90A9, 0x90AB, 0x90AD, 0x90B2, 0x90B7, 0x90BC, 0x90BD, 0x90BF, 0x90C0, 0x647A, 0x64B7, 0x64B8, 0x6499, 0x64BA, 0x64C0, 0x64D0, 0x64D7, 0x64E4, 0x64E2, 0x6509, 0x6525, 0x652E, 0x5F0B, 0x5FD2, 0x7519, 0x5F11, 0x535F, 0x53F1, 0x53FD, 0x53E9, 0x53E8, 0x53FB, 0x5412, 0x5416, 0x5406, 0x544B, 0x5452, 0x5453, 0x5454, 0x5456, 0x5443, 0x5421, 0x5457, 0x5459, 0x5423, 0x5432, 0x5482, 0x5494, 0x5477, 0x5471, 0x5464, 0x549A, 0x549B, 0x5484, 0x5476, 0x5466, 0x549D, 0x54D0, 0x54AD, 0x54C2, 0x54B4, 0x54D2, 0x54A7, 0x54A6, 0x54D3, 0x54D4, 0x5472, 0x54A3, 0x54D5, 0x54BB, 0x54BF, 0x54CC, 0x54D9, 0x54DA, 0x54DC, 0x54A9, 0x54AA, 0x54A4, 0x54DD, 0x54CF, 0x54DE, 0x551B, 0x54E7, 0x5520, 0x54FD, 0x5514, 0x54F3, 0x5522, 0x5523, 0x550F, 0x5511, 0x5527, 0x552A, 0x5567, 0x558F, 0x55B5, 0x5549, 0x556D, 0x5541, 0x5555, 0x553F, 0x5550, 0x553C }, { 0x90C2, 0x90C3, 0x90C6, 0x90C8, 0x90C9, 0x90CB, 0x90CC, 0x90CD, 0x90D2, 0x90D4, 0x90D5, 0x90D6, 0x90D8, 0x90D9, 0x90DA, 0x90DE, 0x90DF, 0x90E0, 0x90E3, 0x90E4, 0x90E5, 0x90E9, 0x90EA, 0x90EC, 0x90EE, 0x90F0, 0x90F1, 0x90F2, 0x90F3, 0x90F5, 0x90F6, 0x90F7, 0x90F9, 0x90FA, 0x90FB, 0x90FC, 0x90FF, 0x9100, 0x9101, 0x9103, 0x9105, 0x9106, 0x9107, 0x9108, 0x9109, 0x910A, 0x910B, 0x910C, 0x910D, 0x910E, 0x910F, 0x9110, 0x9111, 0x9112, 0x9113, 0x9114, 0x9115, 0x9116, 0x9117, 0x9118, 0x911A, 0x911B, 0x911C, 0x003F, 0x911D, 0x911F, 0x9120, 0x9121, 0x9124, 0x9125, 0x9126, 0x9127, 0x9128, 0x9129, 0x912A, 0x912B, 0x912C, 0x912D, 0x912E, 0x9130, 0x9132, 0x9133, 0x9134, 0x9135, 0x9136, 0x9137, 0x9138, 0x913A, 0x913B, 0x913C, 0x913D, 0x913E, 0x913F, 0x9140, 0x9141, 0x9142, 0x9144, 0x5537, 0x5556, 0x5575, 0x5576, 0x5577, 0x5533, 0x5530, 0x555C, 0x558B, 0x55D2, 0x5583, 0x55B1, 0x55B9, 0x5588, 0x5581, 0x559F, 0x557E, 0x55D6, 0x5591, 0x557B, 0x55DF, 0x55BD, 0x55BE, 0x5594, 0x5599, 0x55EA, 0x55F7, 0x55C9, 0x561F, 0x55D1, 0x55EB, 0x55EC, 0x55D4, 0x55E6, 0x55DD, 0x55C4, 0x55EF, 0x55E5, 0x55F2, 0x55F3, 0x55CC, 0x55CD, 0x55E8, 0x55F5, 0x55E4, 0x8F94, 0x561E, 0x5608, 0x560C, 0x5601, 0x5624, 0x5623, 0x55FE, 0x5600, 0x5627, 0x562D, 0x5658, 0x5639, 0x5657, 0x562C, 0x564D, 0x5662, 0x5659, 0x565C, 0x564C, 0x5654, 0x5686, 0x5664, 0x5671, 0x566B, 0x567B, 0x567C, 0x5685, 0x5693, 0x56AF, 0x56D4, 0x56D7, 0x56DD, 0x56E1, 0x56F5, 0x56EB, 0x56F9, 0x56FF, 0x5704, 0x570A, 0x5709, 0x571C, 0x5E0F, 0x5E19, 0x5E14, 0x5E11, 0x5E31, 0x5E3B, 0x5E3C }, { 0x9145, 0x9147, 0x9148, 0x9151, 0x9153, 0x9154, 0x9155, 0x9156, 0x9158, 0x9159, 0x915B, 0x915C, 0x915F, 0x9160, 0x9166, 0x9167, 0x9168, 0x916B, 0x916D, 0x9173, 0x917A, 0x917B, 0x917C, 0x9180, 0x9181, 0x9182, 0x9183, 0x9184, 0x9186, 0x9188, 0x918A, 0x918E, 0x918F, 0x9193, 0x9194, 0x9195, 0x9196, 0x9197, 0x9198, 0x9199, 0x919C, 0x919D, 0x919E, 0x919F, 0x91A0, 0x91A1, 0x91A4, 0x91A5, 0x91A6, 0x91A7, 0x91A8, 0x91A9, 0x91AB, 0x91AC, 0x91B0, 0x91B1, 0x91B2, 0x91B3, 0x91B6, 0x91B7, 0x91B8, 0x91B9, 0x91BB, 0x003F, 0x91BC, 0x91BD, 0x91BE, 0x91BF, 0x91C0, 0x91C1, 0x91C2, 0x91C3, 0x91C4, 0x91C5, 0x91C6, 0x91C8, 0x91CB, 0x91D0, 0x91D2, 0x91D3, 0x91D4, 0x91D5, 0x91D6, 0x91D7, 0x91D8, 0x91D9, 0x91DA, 0x91DB, 0x91DD, 0x91DE, 0x91DF, 0x91E0, 0x91E1, 0x91E2, 0x91E3, 0x91E4, 0x91E5, 0x5E37, 0x5E44, 0x5E54, 0x5E5B, 0x5E5E, 0x5E61, 0x5C8C, 0x5C7A, 0x5C8D, 0x5C90, 0x5C96, 0x5C88, 0x5C98, 0x5C99, 0x5C91, 0x5C9A, 0x5C9C, 0x5CB5, 0x5CA2, 0x5CBD, 0x5CAC, 0x5CAB, 0x5CB1, 0x5CA3, 0x5CC1, 0x5CB7, 0x5CC4, 0x5CD2, 0x5CE4, 0x5CCB, 0x5CE5, 0x5D02, 0x5D03, 0x5D27, 0x5D26, 0x5D2E, 0x5D24, 0x5D1E, 0x5D06, 0x5D1B, 0x5D58, 0x5D3E, 0x5D34, 0x5D3D, 0x5D6C, 0x5D5B, 0x5D6F, 0x5D5D, 0x5D6B, 0x5D4B, 0x5D4A, 0x5D69, 0x5D74, 0x5D82, 0x5D99, 0x5D9D, 0x8C73, 0x5DB7, 0x5DC5, 0x5F73, 0x5F77, 0x5F82, 0x5F87, 0x5F89, 0x5F8C, 0x5F95, 0x5F99, 0x5F9C, 0x5FA8, 0x5FAD, 0x5FB5, 0x5FBC, 0x8862, 0x5F61, 0x72AD, 0x72B0, 0x72B4, 0x72B7, 0x72B8, 0x72C3, 0x72C1, 0x72CE, 0x72CD, 0x72D2, 0x72E8, 0x72EF, 0x72E9, 0x72F2, 0x72F4, 0x72F7, 0x7301, 0x72F3, 0x7303, 0x72FA }, { 0x91E6, 0x91E7, 0x91E8, 0x91E9, 0x91EA, 0x91EB, 0x91EC, 0x91ED, 0x91EE, 0x91EF, 0x91F0, 0x91F1, 0x91F2, 0x91F3, 0x91F4, 0x91F5, 0x91F6, 0x91F7, 0x91F8, 0x91F9, 0x91FA, 0x91FB, 0x91FC, 0x91FD, 0x91FE, 0x91FF, 0x9200, 0x9201, 0x9202, 0x9203, 0x9204, 0x9205, 0x9206, 0x9207, 0x9208, 0x9209, 0x920A, 0x920B, 0x920C, 0x920D, 0x920E, 0x920F, 0x9210, 0x9211, 0x9212, 0x9213, 0x9214, 0x9215, 0x9216, 0x9217, 0x9218, 0x9219, 0x921A, 0x921B, 0x921C, 0x921D, 0x921E, 0x921F, 0x9220, 0x9221, 0x9222, 0x9223, 0x9224, 0x003F, 0x9225, 0x9226, 0x9227, 0x9228, 0x9229, 0x922A, 0x922B, 0x922C, 0x922D, 0x922E, 0x922F, 0x9230, 0x9231, 0x9232, 0x9233, 0x9234, 0x9235, 0x9236, 0x9237, 0x9238, 0x9239, 0x923A, 0x923B, 0x923C, 0x923D, 0x923E, 0x923F, 0x9240, 0x9241, 0x9242, 0x9243, 0x9244, 0x9245, 0x72FB, 0x7317, 0x7313, 0x7321, 0x730A, 0x731E, 0x731D, 0x7315, 0x7322, 0x7339, 0x7325, 0x732C, 0x7338, 0x7331, 0x7350, 0x734D, 0x7357, 0x7360, 0x736C, 0x736F, 0x737E, 0x821B, 0x5925, 0x98E7, 0x5924, 0x5902, 0x9963, 0x9967, 0x9968, 0x9969, 0x996A, 0x996B, 0x996C, 0x9974, 0x9977, 0x997D, 0x9980, 0x9984, 0x9987, 0x998A, 0x998D, 0x9990, 0x9991, 0x9993, 0x9994, 0x9995, 0x5E80, 0x5E91, 0x5E8B, 0x5E96, 0x5EA5, 0x5EA0, 0x5EB9, 0x5EB5, 0x5EBE, 0x5EB3, 0x8D53, 0x5ED2, 0x5ED1, 0x5EDB, 0x5EE8, 0x5EEA, 0x81BA, 0x5FC4, 0x5FC9, 0x5FD6, 0x5FCF, 0x6003, 0x5FEE, 0x6004, 0x5FE1, 0x5FE4, 0x5FFE, 0x6005, 0x6006, 0x5FEA, 0x5FED, 0x5FF8, 0x6019, 0x6035, 0x6026, 0x601B, 0x600F, 0x600D, 0x6029, 0x602B, 0x600A, 0x603F, 0x6021, 0x6078, 0x6079, 0x607B, 0x607A, 0x6042 }, { 0x9246, 0x9247, 0x9248, 0x9249, 0x924A, 0x924B, 0x924C, 0x924D, 0x924E, 0x924F, 0x9250, 0x9251, 0x9252, 0x9253, 0x9254, 0x9255, 0x9256, 0x9257, 0x9258, 0x9259, 0x925A, 0x925B, 0x925C, 0x925D, 0x925E, 0x925F, 0x9260, 0x9261, 0x9262, 0x9263, 0x9264, 0x9265, 0x9266, 0x9267, 0x9268, 0x9269, 0x926A, 0x926B, 0x926C, 0x926D, 0x926E, 0x926F, 0x9270, 0x9271, 0x9272, 0x9273, 0x9275, 0x9276, 0x9277, 0x9278, 0x9279, 0x927A, 0x927B, 0x927C, 0x927D, 0x927E, 0x927F, 0x9280, 0x9281, 0x9282, 0x9283, 0x9284, 0x9285, 0x003F, 0x9286, 0x9287, 0x9288, 0x9289, 0x928A, 0x928B, 0x928C, 0x928D, 0x928F, 0x9290, 0x9291, 0x9292, 0x9293, 0x9294, 0x9295, 0x9296, 0x9297, 0x9298, 0x9299, 0x929A, 0x929B, 0x929C, 0x929D, 0x929E, 0x929F, 0x92A0, 0x92A1, 0x92A2, 0x92A3, 0x92A4, 0x92A5, 0x92A6, 0x92A7, 0x606A, 0x607D, 0x6096, 0x609A, 0x60AD, 0x609D, 0x6083, 0x6092, 0x608C, 0x609B, 0x60EC, 0x60BB, 0x60B1, 0x60DD, 0x60D8, 0x60C6, 0x60DA, 0x60B4, 0x6120, 0x6126, 0x6115, 0x6123, 0x60F4, 0x6100, 0x610E, 0x612B, 0x614A, 0x6175, 0x61AC, 0x6194, 0x61A7, 0x61B7, 0x61D4, 0x61F5, 0x5FDD, 0x96B3, 0x95E9, 0x95EB, 0x95F1, 0x95F3, 0x95F5, 0x95F6, 0x95FC, 0x95FE, 0x9603, 0x9604, 0x9606, 0x9608, 0x960A, 0x960B, 0x960C, 0x960D, 0x960F, 0x9612, 0x9615, 0x9616, 0x9617, 0x9619, 0x961A, 0x4E2C, 0x723F, 0x6215, 0x6C35, 0x6C54, 0x6C5C, 0x6C4A, 0x6CA3, 0x6C85, 0x6C90, 0x6C94, 0x6C8C, 0x6C68, 0x6C69, 0x6C74, 0x6C76, 0x6C86, 0x6CA9, 0x6CD0, 0x6CD4, 0x6CAD, 0x6CF7, 0x6CF8, 0x6CF1, 0x6CD7, 0x6CB2, 0x6CE0, 0x6CD6, 0x6CFA, 0x6CEB, 0x6CEE, 0x6CB1, 0x6CD3, 0x6CEF, 0x6CFE }, { 0x92A8, 0x92A9, 0x92AA, 0x92AB, 0x92AC, 0x92AD, 0x92AF, 0x92B0, 0x92B1, 0x92B2, 0x92B3, 0x92B4, 0x92B5, 0x92B6, 0x92B7, 0x92B8, 0x92B9, 0x92BA, 0x92BB, 0x92BC, 0x92BD, 0x92BE, 0x92BF, 0x92C0, 0x92C1, 0x92C2, 0x92C3, 0x92C4, 0x92C5, 0x92C6, 0x92C7, 0x92C9, 0x92CA, 0x92CB, 0x92CC, 0x92CD, 0x92CE, 0x92CF, 0x92D0, 0x92D1, 0x92D2, 0x92D3, 0x92D4, 0x92D5, 0x92D6, 0x92D7, 0x92D8, 0x92D9, 0x92DA, 0x92DB, 0x92DC, 0x92DD, 0x92DE, 0x92DF, 0x92E0, 0x92E1, 0x92E2, 0x92E3, 0x92E4, 0x92E5, 0x92E6, 0x92E7, 0x92E8, 0x003F, 0x92E9, 0x92EA, 0x92EB, 0x92EC, 0x92ED, 0x92EE, 0x92EF, 0x92F0, 0x92F1, 0x92F2, 0x92F3, 0x92F4, 0x92F5, 0x92F6, 0x92F7, 0x92F8, 0x92F9, 0x92FA, 0x92FB, 0x92FC, 0x92FD, 0x92FE, 0x92FF, 0x9300, 0x9301, 0x9302, 0x9303, 0x9304, 0x9305, 0x9306, 0x9307, 0x9308, 0x9309, 0x6D39, 0x6D27, 0x6D0C, 0x6D43, 0x6D48, 0x6D07, 0x6D04, 0x6D19, 0x6D0E, 0x6D2B, 0x6D4D, 0x6D2E, 0x6D35, 0x6D1A, 0x6D4F, 0x6D52, 0x6D54, 0x6D33, 0x6D91, 0x6D6F, 0x6D9E, 0x6DA0, 0x6D5E, 0x6D93, 0x6D94, 0x6D5C, 0x6D60, 0x6D7C, 0x6D63, 0x6E1A, 0x6DC7, 0x6DC5, 0x6DDE, 0x6E0E, 0x6DBF, 0x6DE0, 0x6E11, 0x6DE6, 0x6DDD, 0x6DD9, 0x6E16, 0x6DAB, 0x6E0C, 0x6DAE, 0x6E2B, 0x6E6E, 0x6E4E, 0x6E6B, 0x6EB2, 0x6E5F, 0x6E86, 0x6E53, 0x6E54, 0x6E32, 0x6E25, 0x6E44, 0x6EDF, 0x6EB1, 0x6E98, 0x6EE0, 0x6F2D, 0x6EE2, 0x6EA5, 0x6EA7, 0x6EBD, 0x6EBB, 0x6EB7, 0x6ED7, 0x6EB4, 0x6ECF, 0x6E8F, 0x6EC2, 0x6E9F, 0x6F62, 0x6F46, 0x6F47, 0x6F24, 0x6F15, 0x6EF9, 0x6F2F, 0x6F36, 0x6F4B, 0x6F74, 0x6F2A, 0x6F09, 0x6F29, 0x6F89, 0x6F8D, 0x6F8C, 0x6F78, 0x6F72, 0x6F7C, 0x6F7A, 0x6FD1 }, { 0x930A, 0x930B, 0x930C, 0x930D, 0x930E, 0x930F, 0x9310, 0x9311, 0x9312, 0x9313, 0x9314, 0x9315, 0x9316, 0x9317, 0x9318, 0x9319, 0x931A, 0x931B, 0x931C, 0x931D, 0x931E, 0x931F, 0x9320, 0x9321, 0x9322, 0x9323, 0x9324, 0x9325, 0x9326, 0x9327, 0x9328, 0x9329, 0x932A, 0x932B, 0x932C, 0x932D, 0x932E, 0x932F, 0x9330, 0x9331, 0x9332, 0x9333, 0x9334, 0x9335, 0x9336, 0x9337, 0x9338, 0x9339, 0x933A, 0x933B, 0x933C, 0x933D, 0x933F, 0x9340, 0x9341, 0x9342, 0x9343, 0x9344, 0x9345, 0x9346, 0x9347, 0x9348, 0x9349, 0x003F, 0x934A, 0x934B, 0x934C, 0x934D, 0x934E, 0x934F, 0x9350, 0x9351, 0x9352, 0x9353, 0x9354, 0x9355, 0x9356, 0x9357, 0x9358, 0x9359, 0x935A, 0x935B, 0x935C, 0x935D, 0x935E, 0x935F, 0x9360, 0x9361, 0x9362, 0x9363, 0x9364, 0x9365, 0x9366, 0x9367, 0x9368, 0x9369, 0x936B, 0x6FC9, 0x6FA7, 0x6FB9, 0x6FB6, 0x6FC2, 0x6FE1, 0x6FEE, 0x6FDE, 0x6FE0, 0x6FEF, 0x701A, 0x7023, 0x701B, 0x7039, 0x7035, 0x704F, 0x705E, 0x5B80, 0x5B84, 0x5B95, 0x5B93, 0x5BA5, 0x5BB8, 0x752F, 0x9A9E, 0x6434, 0x5BE4, 0x5BEE, 0x8930, 0x5BF0, 0x8E47, 0x8B07, 0x8FB6, 0x8FD3, 0x8FD5, 0x8FE5, 0x8FEE, 0x8FE4, 0x8FE9, 0x8FE6, 0x8FF3, 0x8FE8, 0x9005, 0x9004, 0x900B, 0x9026, 0x9011, 0x900D, 0x9016, 0x9021, 0x9035, 0x9036, 0x902D, 0x902F, 0x9044, 0x9051, 0x9052, 0x9050, 0x9068, 0x9058, 0x9062, 0x905B, 0x66B9, 0x9074, 0x907D, 0x9082, 0x9088, 0x9083, 0x908B, 0x5F50, 0x5F57, 0x5F56, 0x5F58, 0x5C3B, 0x54AB, 0x5C50, 0x5C59, 0x5B71, 0x5C63, 0x5C66, 0x7FBC, 0x5F2A, 0x5F29, 0x5F2D, 0x8274, 0x5F3C, 0x9B3B, 0x5C6E, 0x5981, 0x5983, 0x598D, 0x59A9, 0x59AA, 0x59A3 }, { 0x936C, 0x936D, 0x936E, 0x936F, 0x9370, 0x9371, 0x9372, 0x9373, 0x9374, 0x9375, 0x9376, 0x9377, 0x9378, 0x9379, 0x937A, 0x937B, 0x937C, 0x937D, 0x937E, 0x937F, 0x9380, 0x9381, 0x9382, 0x9383, 0x9384, 0x9385, 0x9386, 0x9387, 0x9388, 0x9389, 0x938A, 0x938B, 0x938C, 0x938D, 0x938E, 0x9390, 0x9391, 0x9392, 0x9393, 0x9394, 0x9395, 0x9396, 0x9397, 0x9398, 0x9399, 0x939A, 0x939B, 0x939C, 0x939D, 0x939E, 0x939F, 0x93A0, 0x93A1, 0x93A2, 0x93A3, 0x93A4, 0x93A5, 0x93A6, 0x93A7, 0x93A8, 0x93A9, 0x93AA, 0x93AB, 0x003F, 0x93AC, 0x93AD, 0x93AE, 0x93AF, 0x93B0, 0x93B1, 0x93B2, 0x93B3, 0x93B4, 0x93B5, 0x93B6, 0x93B7, 0x93B8, 0x93B9, 0x93BA, 0x93BB, 0x93BC, 0x93BD, 0x93BE, 0x93BF, 0x93C0, 0x93C1, 0x93C2, 0x93C3, 0x93C4, 0x93C5, 0x93C6, 0x93C7, 0x93C8, 0x93C9, 0x93CB, 0x93CC, 0x93CD, 0x5997, 0x59CA, 0x59AB, 0x599E, 0x59A4, 0x59D2, 0x59B2, 0x59AF, 0x59D7, 0x59BE, 0x5A05, 0x5A06, 0x59DD, 0x5A08, 0x59E3, 0x59D8, 0x59F9, 0x5A0C, 0x5A09, 0x5A32, 0x5A34, 0x5A11, 0x5A23, 0x5A13, 0x5A40, 0x5A67, 0x5A4A, 0x5A55, 0x5A3C, 0x5A62, 0x5A75, 0x80EC, 0x5AAA, 0x5A9B, 0x5A77, 0x5A7A, 0x5ABE, 0x5AEB, 0x5AB2, 0x5AD2, 0x5AD4, 0x5AB8, 0x5AE0, 0x5AE3, 0x5AF1, 0x5AD6, 0x5AE6, 0x5AD8, 0x5ADC, 0x5B09, 0x5B17, 0x5B16, 0x5B32, 0x5B37, 0x5B40, 0x5C15, 0x5C1C, 0x5B5A, 0x5B65, 0x5B73, 0x5B51, 0x5B53, 0x5B62, 0x9A75, 0x9A77, 0x9A78, 0x9A7A, 0x9A7F, 0x9A7D, 0x9A80, 0x9A81, 0x9A85, 0x9A88, 0x9A8A, 0x9A90, 0x9A92, 0x9A93, 0x9A96, 0x9A98, 0x9A9B, 0x9A9C, 0x9A9D, 0x9A9F, 0x9AA0, 0x9AA2, 0x9AA3, 0x9AA5, 0x9AA7, 0x7E9F, 0x7EA1, 0x7EA3, 0x7EA5, 0x7EA8, 0x7EA9 }, { 0x93CE, 0x93CF, 0x93D0, 0x93D1, 0x93D2, 0x93D3, 0x93D4, 0x93D5, 0x93D7, 0x93D8, 0x93D9, 0x93DA, 0x93DB, 0x93DC, 0x93DD, 0x93DE, 0x93DF, 0x93E0, 0x93E1, 0x93E2, 0x93E3, 0x93E4, 0x93E5, 0x93E6, 0x93E7, 0x93E8, 0x93E9, 0x93EA, 0x93EB, 0x93EC, 0x93ED, 0x93EE, 0x93EF, 0x93F0, 0x93F1, 0x93F2, 0x93F3, 0x93F4, 0x93F5, 0x93F6, 0x93F7, 0x93F8, 0x93F9, 0x93FA, 0x93FB, 0x93FC, 0x93FD, 0x93FE, 0x93FF, 0x9400, 0x9401, 0x9402, 0x9403, 0x9404, 0x9405, 0x9406, 0x9407, 0x9408, 0x9409, 0x940A, 0x940B, 0x940C, 0x940D, 0x003F, 0x940E, 0x940F, 0x9410, 0x9411, 0x9412, 0x9413, 0x9414, 0x9415, 0x9416, 0x9417, 0x9418, 0x9419, 0x941A, 0x941B, 0x941C, 0x941D, 0x941E, 0x941F, 0x9420, 0x9421, 0x9422, 0x9423, 0x9424, 0x9425, 0x9426, 0x9427, 0x9428, 0x9429, 0x942A, 0x942B, 0x942C, 0x942D, 0x942E, 0x7EAD, 0x7EB0, 0x7EBE, 0x7EC0, 0x7EC1, 0x7EC2, 0x7EC9, 0x7ECB, 0x7ECC, 0x7ED0, 0x7ED4, 0x7ED7, 0x7EDB, 0x7EE0, 0x7EE1, 0x7EE8, 0x7EEB, 0x7EEE, 0x7EEF, 0x7EF1, 0x7EF2, 0x7F0D, 0x7EF6, 0x7EFA, 0x7EFB, 0x7EFE, 0x7F01, 0x7F02, 0x7F03, 0x7F07, 0x7F08, 0x7F0B, 0x7F0C, 0x7F0F, 0x7F11, 0x7F12, 0x7F17, 0x7F19, 0x7F1C, 0x7F1B, 0x7F1F, 0x7F21, 0x7F22, 0x7F23, 0x7F24, 0x7F25, 0x7F26, 0x7F27, 0x7F2A, 0x7F2B, 0x7F2C, 0x7F2D, 0x7F2F, 0x7F30, 0x7F31, 0x7F32, 0x7F33, 0x7F35, 0x5E7A, 0x757F, 0x5DDB, 0x753E, 0x9095, 0x738E, 0x7391, 0x73AE, 0x73A2, 0x739F, 0x73CF, 0x73C2, 0x73D1, 0x73B7, 0x73B3, 0x73C0, 0x73C9, 0x73C8, 0x73E5, 0x73D9, 0x987C, 0x740A, 0x73E9, 0x73E7, 0x73DE, 0x73BA, 0x73F2, 0x740F, 0x742A, 0x745B, 0x7426, 0x7425, 0x7428, 0x7430, 0x742E, 0x742C }, { 0x942F, 0x9430, 0x9431, 0x9432, 0x9433, 0x9434, 0x9435, 0x9436, 0x9437, 0x9438, 0x9439, 0x943A, 0x943B, 0x943C, 0x943D, 0x943F, 0x9440, 0x9441, 0x9442, 0x9443, 0x9444, 0x9445, 0x9446, 0x9447, 0x9448, 0x9449, 0x944A, 0x944B, 0x944C, 0x944D, 0x944E, 0x944F, 0x9450, 0x9451, 0x9452, 0x9453, 0x9454, 0x9455, 0x9456, 0x9457, 0x9458, 0x9459, 0x945A, 0x945B, 0x945C, 0x945D, 0x945E, 0x945F, 0x9460, 0x9461, 0x9462, 0x9463, 0x9464, 0x9465, 0x9466, 0x9467, 0x9468, 0x9469, 0x946A, 0x946C, 0x946D, 0x946E, 0x946F, 0x003F, 0x9470, 0x9471, 0x9472, 0x9473, 0x9474, 0x9475, 0x9476, 0x9477, 0x9478, 0x9479, 0x947A, 0x947B, 0x947C, 0x947D, 0x947E, 0x947F, 0x9480, 0x9481, 0x9482, 0x9483, 0x9484, 0x9491, 0x9496, 0x9498, 0x94C7, 0x94CF, 0x94D3, 0x94D4, 0x94DA, 0x94E6, 0x94FB, 0x951C, 0x9520, 0x741B, 0x741A, 0x7441, 0x745C, 0x7457, 0x7455, 0x7459, 0x7477, 0x746D, 0x747E, 0x749C, 0x748E, 0x7480, 0x7481, 0x7487, 0x748B, 0x749E, 0x74A8, 0x74A9, 0x7490, 0x74A7, 0x74D2, 0x74BA, 0x97EA, 0x97EB, 0x97EC, 0x674C, 0x6753, 0x675E, 0x6748, 0x6769, 0x67A5, 0x6787, 0x676A, 0x6773, 0x6798, 0x67A7, 0x6775, 0x67A8, 0x679E, 0x67AD, 0x678B, 0x6777, 0x677C, 0x67F0, 0x6809, 0x67D8, 0x680A, 0x67E9, 0x67B0, 0x680C, 0x67D9, 0x67B5, 0x67DA, 0x67B3, 0x67DD, 0x6800, 0x67C3, 0x67B8, 0x67E2, 0x680E, 0x67C1, 0x67FD, 0x6832, 0x6833, 0x6860, 0x6861, 0x684E, 0x6862, 0x6844, 0x6864, 0x6883, 0x681D, 0x6855, 0x6866, 0x6841, 0x6867, 0x6840, 0x683E, 0x684A, 0x6849, 0x6829, 0x68B5, 0x688F, 0x6874, 0x6877, 0x6893, 0x686B, 0x68C2, 0x696E, 0x68FC, 0x691F, 0x6920, 0x68F9 }, { 0x9527, 0x9533, 0x953D, 0x9543, 0x9548, 0x954B, 0x9555, 0x955A, 0x9560, 0x956E, 0x9574, 0x9575, 0x9577, 0x9578, 0x9579, 0x957A, 0x957B, 0x957C, 0x957D, 0x957E, 0x9580, 0x9581, 0x9582, 0x9583, 0x9584, 0x9585, 0x9586, 0x9587, 0x9588, 0x9589, 0x958A, 0x958B, 0x958C, 0x958D, 0x958E, 0x958F, 0x9590, 0x9591, 0x9592, 0x9593, 0x9594, 0x9595, 0x9596, 0x9597, 0x9598, 0x9599, 0x959A, 0x959B, 0x959C, 0x959D, 0x959E, 0x959F, 0x95A0, 0x95A1, 0x95A2, 0x95A3, 0x95A4, 0x95A5, 0x95A6, 0x95A7, 0x95A8, 0x95A9, 0x95AA, 0x003F, 0x95AB, 0x95AC, 0x95AD, 0x95AE, 0x95AF, 0x95B0, 0x95B1, 0x95B2, 0x95B3, 0x95B4, 0x95B5, 0x95B6, 0x95B7, 0x95B8, 0x95B9, 0x95BA, 0x95BB, 0x95BC, 0x95BD, 0x95BE, 0x95BF, 0x95C0, 0x95C1, 0x95C2, 0x95C3, 0x95C4, 0x95C5, 0x95C6, 0x95C7, 0x95C8, 0x95C9, 0x95CA, 0x95CB, 0x6924, 0x68F0, 0x690B, 0x6901, 0x6957, 0x68E3, 0x6910, 0x6971, 0x6939, 0x6960, 0x6942, 0x695D, 0x6984, 0x696B, 0x6980, 0x6998, 0x6978, 0x6934, 0x69CC, 0x6987, 0x6988, 0x69CE, 0x6989, 0x6966, 0x6963, 0x6979, 0x699B, 0x69A7, 0x69BB, 0x69AB, 0x69AD, 0x69D4, 0x69B1, 0x69C1, 0x69CA, 0x69DF, 0x6995, 0x69E0, 0x698D, 0x69FF, 0x6A2F, 0x69ED, 0x6A17, 0x6A18, 0x6A65, 0x69F2, 0x6A44, 0x6A3E, 0x6AA0, 0x6A50, 0x6A5B, 0x6A35, 0x6A8E, 0x6A79, 0x6A3D, 0x6A28, 0x6A58, 0x6A7C, 0x6A91, 0x6A90, 0x6AA9, 0x6A97, 0x6AAB, 0x7337, 0x7352, 0x6B81, 0x6B82, 0x6B87, 0x6B84, 0x6B92, 0x6B93, 0x6B8D, 0x6B9A, 0x6B9B, 0x6BA1, 0x6BAA, 0x8F6B, 0x8F6D, 0x8F71, 0x8F72, 0x8F73, 0x8F75, 0x8F76, 0x8F78, 0x8F77, 0x8F79, 0x8F7A, 0x8F7C, 0x8F7E, 0x8F81, 0x8F82, 0x8F84, 0x8F87, 0x8F8B }, { 0x95CC, 0x95CD, 0x95CE, 0x95CF, 0x95D0, 0x95D1, 0x95D2, 0x95D3, 0x95D4, 0x95D5, 0x95D6, 0x95D7, 0x95D8, 0x95D9, 0x95DA, 0x95DB, 0x95DC, 0x95DD, 0x95DE, 0x95DF, 0x95E0, 0x95E1, 0x95E2, 0x95E3, 0x95E4, 0x95E5, 0x95E6, 0x95E7, 0x95EC, 0x95FF, 0x9607, 0x9613, 0x9618, 0x961B, 0x961E, 0x9620, 0x9623, 0x9624, 0x9625, 0x9626, 0x9627, 0x9628, 0x9629, 0x962B, 0x962C, 0x962D, 0x962F, 0x9630, 0x9637, 0x9638, 0x9639, 0x963A, 0x963E, 0x9641, 0x9643, 0x964A, 0x964E, 0x964F, 0x9651, 0x9652, 0x9653, 0x9656, 0x9657, 0x003F, 0x9658, 0x9659, 0x965A, 0x965C, 0x965D, 0x965E, 0x9660, 0x9663, 0x9665, 0x9666, 0x966B, 0x966D, 0x966E, 0x966F, 0x9670, 0x9671, 0x9673, 0x9678, 0x9679, 0x967A, 0x967B, 0x967C, 0x967D, 0x967E, 0x967F, 0x9680, 0x9681, 0x9682, 0x9683, 0x9684, 0x9687, 0x9689, 0x968A, 0x8F8D, 0x8F8E, 0x8F8F, 0x8F98, 0x8F9A, 0x8ECE, 0x620B, 0x6217, 0x621B, 0x621F, 0x6222, 0x6221, 0x6225, 0x6224, 0x622C, 0x81E7, 0x74EF, 0x74F4, 0x74FF, 0x750F, 0x7511, 0x7513, 0x6534, 0x65EE, 0x65EF, 0x65F0, 0x660A, 0x6619, 0x6772, 0x6603, 0x6615, 0x6600, 0x7085, 0x66F7, 0x661D, 0x6634, 0x6631, 0x6636, 0x6635, 0x8006, 0x665F, 0x6654, 0x6641, 0x664F, 0x6656, 0x6661, 0x6657, 0x6677, 0x6684, 0x668C, 0x66A7, 0x669D, 0x66BE, 0x66DB, 0x66DC, 0x66E6, 0x66E9, 0x8D32, 0x8D33, 0x8D36, 0x8D3B, 0x8D3D, 0x8D40, 0x8D45, 0x8D46, 0x8D48, 0x8D49, 0x8D47, 0x8D4D, 0x8D55, 0x8D59, 0x89C7, 0x89CA, 0x89CB, 0x89CC, 0x89CE, 0x89CF, 0x89D0, 0x89D1, 0x726E, 0x729F, 0x725D, 0x7266, 0x726F, 0x727E, 0x727F, 0x7284, 0x728B, 0x728D, 0x728F, 0x7292, 0x6308, 0x6332, 0x63B0 }, { 0x968C, 0x968E, 0x9691, 0x9692, 0x9693, 0x9695, 0x9696, 0x969A, 0x969B, 0x969D, 0x969E, 0x969F, 0x96A0, 0x96A1, 0x96A2, 0x96A3, 0x96A4, 0x96A5, 0x96A6, 0x96A8, 0x96A9, 0x96AA, 0x96AB, 0x96AC, 0x96AD, 0x96AE, 0x96AF, 0x96B1, 0x96B2, 0x96B4, 0x96B5, 0x96B7, 0x96B8, 0x96BA, 0x96BB, 0x96BF, 0x96C2, 0x96C3, 0x96C8, 0x96CA, 0x96CB, 0x96D0, 0x96D1, 0x96D3, 0x96D4, 0x96D6, 0x96D7, 0x96D8, 0x96D9, 0x96DA, 0x96DB, 0x96DC, 0x96DD, 0x96DE, 0x96DF, 0x96E1, 0x96E2, 0x96E3, 0x96E4, 0x96E5, 0x96E6, 0x96E7, 0x96EB, 0x003F, 0x96EC, 0x96ED, 0x96EE, 0x96F0, 0x96F1, 0x96F2, 0x96F4, 0x96F5, 0x96F8, 0x96FA, 0x96FB, 0x96FC, 0x96FD, 0x96FF, 0x9702, 0x9703, 0x9705, 0x970A, 0x970B, 0x970C, 0x9710, 0x9711, 0x9712, 0x9714, 0x9715, 0x9717, 0x9718, 0x9719, 0x971A, 0x971B, 0x971D, 0x971F, 0x9720, 0x643F, 0x64D8, 0x8004, 0x6BEA, 0x6BF3, 0x6BFD, 0x6BF5, 0x6BF9, 0x6C05, 0x6C07, 0x6C06, 0x6C0D, 0x6C15, 0x6C18, 0x6C19, 0x6C1A, 0x6C21, 0x6C29, 0x6C24, 0x6C2A, 0x6C32, 0x6535, 0x6555, 0x656B, 0x724D, 0x7252, 0x7256, 0x7230, 0x8662, 0x5216, 0x809F, 0x809C, 0x8093, 0x80BC, 0x670A, 0x80BD, 0x80B1, 0x80AB, 0x80AD, 0x80B4, 0x80B7, 0x80E7, 0x80E8, 0x80E9, 0x80EA, 0x80DB, 0x80C2, 0x80C4, 0x80D9, 0x80CD, 0x80D7, 0x6710, 0x80DD, 0x80EB, 0x80F1, 0x80F4, 0x80ED, 0x810D, 0x810E, 0x80F2, 0x80FC, 0x6715, 0x8112, 0x8C5A, 0x8136, 0x811E, 0x812C, 0x8118, 0x8132, 0x8148, 0x814C, 0x8153, 0x8174, 0x8159, 0x815A, 0x8171, 0x8160, 0x8169, 0x817C, 0x817D, 0x816D, 0x8167, 0x584D, 0x5AB5, 0x8188, 0x8182, 0x8191, 0x6ED5, 0x81A3, 0x81AA, 0x81CC, 0x6726, 0x81CA, 0x81BB }, { 0x9721, 0x9722, 0x9723, 0x9724, 0x9725, 0x9726, 0x9727, 0x9728, 0x9729, 0x972B, 0x972C, 0x972E, 0x972F, 0x9731, 0x9733, 0x9734, 0x9735, 0x9736, 0x9737, 0x973A, 0x973B, 0x973C, 0x973D, 0x973F, 0x9740, 0x9741, 0x9742, 0x9743, 0x9744, 0x9745, 0x9746, 0x9747, 0x9748, 0x9749, 0x974A, 0x974B, 0x974C, 0x974D, 0x974E, 0x974F, 0x9750, 0x9751, 0x9754, 0x9755, 0x9757, 0x9758, 0x975A, 0x975C, 0x975D, 0x975F, 0x9763, 0x9764, 0x9766, 0x9767, 0x9768, 0x976A, 0x976B, 0x976C, 0x976D, 0x976E, 0x976F, 0x9770, 0x9771, 0x003F, 0x9772, 0x9775, 0x9777, 0x9778, 0x9779, 0x977A, 0x977B, 0x977D, 0x977E, 0x977F, 0x9780, 0x9781, 0x9782, 0x9783, 0x9784, 0x9786, 0x9787, 0x9788, 0x9789, 0x978A, 0x978C, 0x978E, 0x978F, 0x9790, 0x9793, 0x9795, 0x9796, 0x9797, 0x9799, 0x979A, 0x979B, 0x979C, 0x979D, 0x81C1, 0x81A6, 0x6B24, 0x6B37, 0x6B39, 0x6B43, 0x6B46, 0x6B59, 0x98D1, 0x98D2, 0x98D3, 0x98D5, 0x98D9, 0x98DA, 0x6BB3, 0x5F40, 0x6BC2, 0x89F3, 0x6590, 0x9F51, 0x6593, 0x65BC, 0x65C6, 0x65C4, 0x65C3, 0x65CC, 0x65CE, 0x65D2, 0x65D6, 0x7080, 0x709C, 0x7096, 0x709D, 0x70BB, 0x70C0, 0x70B7, 0x70AB, 0x70B1, 0x70E8, 0x70CA, 0x7110, 0x7113, 0x7116, 0x712F, 0x7131, 0x7173, 0x715C, 0x7168, 0x7145, 0x7172, 0x714A, 0x7178, 0x717A, 0x7198, 0x71B3, 0x71B5, 0x71A8, 0x71A0, 0x71E0, 0x71D4, 0x71E7, 0x71F9, 0x721D, 0x7228, 0x706C, 0x7118, 0x7166, 0x71B9, 0x623E, 0x623D, 0x6243, 0x6248, 0x6249, 0x793B, 0x7940, 0x7946, 0x7949, 0x795B, 0x795C, 0x7953, 0x795A, 0x7962, 0x7957, 0x7960, 0x796F, 0x7967, 0x797A, 0x7985, 0x798A, 0x799A, 0x79A7, 0x79B3, 0x5FD1, 0x5FD0 }, { 0x979E, 0x979F, 0x97A1, 0x97A2, 0x97A4, 0x97A5, 0x97A6, 0x97A7, 0x97A8, 0x97A9, 0x97AA, 0x97AC, 0x97AE, 0x97B0, 0x97B1, 0x97B3, 0x97B5, 0x97B6, 0x97B7, 0x97B8, 0x97B9, 0x97BA, 0x97BB, 0x97BC, 0x97BD, 0x97BE, 0x97BF, 0x97C0, 0x97C1, 0x97C2, 0x97C3, 0x97C4, 0x97C5, 0x97C6, 0x97C7, 0x97C8, 0x97C9, 0x97CA, 0x97CB, 0x97CC, 0x97CD, 0x97CE, 0x97CF, 0x97D0, 0x97D1, 0x97D2, 0x97D3, 0x97D4, 0x97D5, 0x97D6, 0x97D7, 0x97D8, 0x97D9, 0x97DA, 0x97DB, 0x97DC, 0x97DD, 0x97DE, 0x97DF, 0x97E0, 0x97E1, 0x97E2, 0x97E3, 0x003F, 0x97E4, 0x97E5, 0x97E8, 0x97EE, 0x97EF, 0x97F0, 0x97F1, 0x97F2, 0x97F4, 0x97F7, 0x97F8, 0x97F9, 0x97FA, 0x97FB, 0x97FC, 0x97FD, 0x97FE, 0x97FF, 0x9800, 0x9801, 0x9802, 0x9803, 0x9804, 0x9805, 0x9806, 0x9807, 0x9808, 0x9809, 0x980A, 0x980B, 0x980C, 0x980D, 0x980E, 0x603C, 0x605D, 0x605A, 0x6067, 0x6041, 0x6059, 0x6063, 0x60AB, 0x6106, 0x610D, 0x615D, 0x61A9, 0x619D, 0x61CB, 0x61D1, 0x6206, 0x8080, 0x807F, 0x6C93, 0x6CF6, 0x6DFC, 0x77F6, 0x77F8, 0x7800, 0x7809, 0x7817, 0x7818, 0x7811, 0x65AB, 0x782D, 0x781C, 0x781D, 0x7839, 0x783A, 0x783B, 0x781F, 0x783C, 0x7825, 0x782C, 0x7823, 0x7829, 0x784E, 0x786D, 0x7856, 0x7857, 0x7826, 0x7850, 0x7847, 0x784C, 0x786A, 0x789B, 0x7893, 0x789A, 0x7887, 0x789C, 0x78A1, 0x78A3, 0x78B2, 0x78B9, 0x78A5, 0x78D4, 0x78D9, 0x78C9, 0x78EC, 0x78F2, 0x7905, 0x78F4, 0x7913, 0x7924, 0x791E, 0x7934, 0x9F9B, 0x9EF9, 0x9EFB, 0x9EFC, 0x76F1, 0x7704, 0x770D, 0x76F9, 0x7707, 0x7708, 0x771A, 0x7722, 0x7719, 0x772D, 0x7726, 0x7735, 0x7738, 0x7750, 0x7751, 0x7747, 0x7743, 0x775A, 0x7768 }, { 0x980F, 0x9810, 0x9811, 0x9812, 0x9813, 0x9814, 0x9815, 0x9816, 0x9817, 0x9818, 0x9819, 0x981A, 0x981B, 0x981C, 0x981D, 0x981E, 0x981F, 0x9820, 0x9821, 0x9822, 0x9823, 0x9824, 0x9825, 0x9826, 0x9827, 0x9828, 0x9829, 0x982A, 0x982B, 0x982C, 0x982D, 0x982E, 0x982F, 0x9830, 0x9831, 0x9832, 0x9833, 0x9834, 0x9835, 0x9836, 0x9837, 0x9838, 0x9839, 0x983A, 0x983B, 0x983C, 0x983D, 0x983E, 0x983F, 0x9840, 0x9841, 0x9842, 0x9843, 0x9844, 0x9845, 0x9846, 0x9847, 0x9848, 0x9849, 0x984A, 0x984B, 0x984C, 0x984D, 0x003F, 0x984E, 0x984F, 0x9850, 0x9851, 0x9852, 0x9853, 0x9854, 0x9855, 0x9856, 0x9857, 0x9858, 0x9859, 0x985A, 0x985B, 0x985C, 0x985D, 0x985E, 0x985F, 0x9860, 0x9861, 0x9862, 0x9863, 0x9864, 0x9865, 0x9866, 0x9867, 0x9868, 0x9869, 0x986A, 0x986B, 0x986C, 0x986D, 0x986E, 0x7762, 0x7765, 0x777F, 0x778D, 0x777D, 0x7780, 0x778C, 0x7791, 0x779F, 0x77A0, 0x77B0, 0x77B5, 0x77BD, 0x753A, 0x7540, 0x754E, 0x754B, 0x7548, 0x755B, 0x7572, 0x7579, 0x7583, 0x7F58, 0x7F61, 0x7F5F, 0x8A48, 0x7F68, 0x7F74, 0x7F71, 0x7F79, 0x7F81, 0x7F7E, 0x76CD, 0x76E5, 0x8832, 0x9485, 0x9486, 0x9487, 0x948B, 0x948A, 0x948C, 0x948D, 0x948F, 0x9490, 0x9494, 0x9497, 0x9495, 0x949A, 0x949B, 0x949C, 0x94A3, 0x94A4, 0x94AB, 0x94AA, 0x94AD, 0x94AC, 0x94AF, 0x94B0, 0x94B2, 0x94B4, 0x94B6, 0x94B7, 0x94B8, 0x94B9, 0x94BA, 0x94BC, 0x94BD, 0x94BF, 0x94C4, 0x94C8, 0x94C9, 0x94CA, 0x94CB, 0x94CC, 0x94CD, 0x94CE, 0x94D0, 0x94D1, 0x94D2, 0x94D5, 0x94D6, 0x94D7, 0x94D9, 0x94D8, 0x94DB, 0x94DE, 0x94DF, 0x94E0, 0x94E2, 0x94E4, 0x94E5, 0x94E7, 0x94E8, 0x94EA }, { 0x986F, 0x9870, 0x9871, 0x9872, 0x9873, 0x9874, 0x988B, 0x988E, 0x9892, 0x9895, 0x9899, 0x98A3, 0x98A8, 0x98A9, 0x98AA, 0x98AB, 0x98AC, 0x98AD, 0x98AE, 0x98AF, 0x98B0, 0x98B1, 0x98B2, 0x98B3, 0x98B4, 0x98B5, 0x98B6, 0x98B7, 0x98B8, 0x98B9, 0x98BA, 0x98BB, 0x98BC, 0x98BD, 0x98BE, 0x98BF, 0x98C0, 0x98C1, 0x98C2, 0x98C3, 0x98C4, 0x98C5, 0x98C6, 0x98C7, 0x98C8, 0x98C9, 0x98CA, 0x98CB, 0x98CC, 0x98CD, 0x98CF, 0x98D0, 0x98D4, 0x98D6, 0x98D7, 0x98DB, 0x98DC, 0x98DD, 0x98E0, 0x98E1, 0x98E2, 0x98E3, 0x98E4, 0x003F, 0x98E5, 0x98E6, 0x98E9, 0x98EA, 0x98EB, 0x98EC, 0x98ED, 0x98EE, 0x98EF, 0x98F0, 0x98F1, 0x98F2, 0x98F3, 0x98F4, 0x98F5, 0x98F6, 0x98F7, 0x98F8, 0x98F9, 0x98FA, 0x98FB, 0x98FC, 0x98FD, 0x98FE, 0x98FF, 0x9900, 0x9901, 0x9902, 0x9903, 0x9904, 0x9905, 0x9906, 0x9907, 0x94E9, 0x94EB, 0x94EE, 0x94EF, 0x94F3, 0x94F4, 0x94F5, 0x94F7, 0x94F9, 0x94FC, 0x94FD, 0x94FF, 0x9503, 0x9502, 0x9506, 0x9507, 0x9509, 0x950A, 0x950D, 0x950E, 0x950F, 0x9512, 0x9513, 0x9514, 0x9515, 0x9516, 0x9518, 0x951B, 0x951D, 0x951E, 0x951F, 0x9522, 0x952A, 0x952B, 0x9529, 0x952C, 0x9531, 0x9532, 0x9534, 0x9536, 0x9537, 0x9538, 0x953C, 0x953E, 0x953F, 0x9542, 0x9535, 0x9544, 0x9545, 0x9546, 0x9549, 0x954C, 0x954E, 0x954F, 0x9552, 0x9553, 0x9554, 0x9556, 0x9557, 0x9558, 0x9559, 0x955B, 0x955E, 0x955F, 0x955D, 0x9561, 0x9562, 0x9564, 0x9565, 0x9566, 0x9567, 0x9568, 0x9569, 0x956A, 0x956B, 0x956C, 0x956F, 0x9571, 0x9572, 0x9573, 0x953A, 0x77E7, 0x77EC, 0x96C9, 0x79D5, 0x79ED, 0x79E3, 0x79EB, 0x7A06, 0x5D47, 0x7A03, 0x7A02, 0x7A1E, 0x7A14 }, { 0x9908, 0x9909, 0x990A, 0x990B, 0x990C, 0x990E, 0x990F, 0x9911, 0x9912, 0x9913, 0x9914, 0x9915, 0x9916, 0x9917, 0x9918, 0x9919, 0x991A, 0x991B, 0x991C, 0x991D, 0x991E, 0x991F, 0x9920, 0x9921, 0x9922, 0x9923, 0x9924, 0x9925, 0x9926, 0x9927, 0x9928, 0x9929, 0x992A, 0x992B, 0x992C, 0x992D, 0x992F, 0x9930, 0x9931, 0x9932, 0x9933, 0x9934, 0x9935, 0x9936, 0x9937, 0x9938, 0x9939, 0x993A, 0x993B, 0x993C, 0x993D, 0x993E, 0x993F, 0x9940, 0x9941, 0x9942, 0x9943, 0x9944, 0x9945, 0x9946, 0x9947, 0x9948, 0x9949, 0x003F, 0x994A, 0x994B, 0x994C, 0x994D, 0x994E, 0x994F, 0x9950, 0x9951, 0x9952, 0x9953, 0x9956, 0x9957, 0x9958, 0x9959, 0x995A, 0x995B, 0x995C, 0x995D, 0x995E, 0x995F, 0x9960, 0x9961, 0x9962, 0x9964, 0x9966, 0x9973, 0x9978, 0x9979, 0x997B, 0x997E, 0x9982, 0x9983, 0x9989, 0x7A39, 0x7A37, 0x7A51, 0x9ECF, 0x99A5, 0x7A70, 0x7688, 0x768E, 0x7693, 0x7699, 0x76A4, 0x74DE, 0x74E0, 0x752C, 0x9E20, 0x9E22, 0x9E28, 0x9E29, 0x9E2A, 0x9E2B, 0x9E2C, 0x9E32, 0x9E31, 0x9E36, 0x9E38, 0x9E37, 0x9E39, 0x9E3A, 0x9E3E, 0x9E41, 0x9E42, 0x9E44, 0x9E46, 0x9E47, 0x9E48, 0x9E49, 0x9E4B, 0x9E4C, 0x9E4E, 0x9E51, 0x9E55, 0x9E57, 0x9E5A, 0x9E5B, 0x9E5C, 0x9E5E, 0x9E63, 0x9E66, 0x9E67, 0x9E68, 0x9E69, 0x9E6A, 0x9E6B, 0x9E6C, 0x9E71, 0x9E6D, 0x9E73, 0x7592, 0x7594, 0x7596, 0x75A0, 0x759D, 0x75AC, 0x75A3, 0x75B3, 0x75B4, 0x75B8, 0x75C4, 0x75B1, 0x75B0, 0x75C3, 0x75C2, 0x75D6, 0x75CD, 0x75E3, 0x75E8, 0x75E6, 0x75E4, 0x75EB, 0x75E7, 0x7603, 0x75F1, 0x75FC, 0x75FF, 0x7610, 0x7600, 0x7605, 0x760C, 0x7617, 0x760A, 0x7625, 0x7618, 0x7615, 0x7619 }, { 0x998C, 0x998E, 0x999A, 0x999B, 0x999C, 0x999D, 0x999E, 0x999F, 0x99A0, 0x99A1, 0x99A2, 0x99A3, 0x99A4, 0x99A6, 0x99A7, 0x99A9, 0x99AA, 0x99AB, 0x99AC, 0x99AD, 0x99AE, 0x99AF, 0x99B0, 0x99B1, 0x99B2, 0x99B3, 0x99B4, 0x99B5, 0x99B6, 0x99B7, 0x99B8, 0x99B9, 0x99BA, 0x99BB, 0x99BC, 0x99BD, 0x99BE, 0x99BF, 0x99C0, 0x99C1, 0x99C2, 0x99C3, 0x99C4, 0x99C5, 0x99C6, 0x99C7, 0x99C8, 0x99C9, 0x99CA, 0x99CB, 0x99CC, 0x99CD, 0x99CE, 0x99CF, 0x99D0, 0x99D1, 0x99D2, 0x99D3, 0x99D4, 0x99D5, 0x99D6, 0x99D7, 0x99D8, 0x003F, 0x99D9, 0x99DA, 0x99DB, 0x99DC, 0x99DD, 0x99DE, 0x99DF, 0x99E0, 0x99E1, 0x99E2, 0x99E3, 0x99E4, 0x99E5, 0x99E6, 0x99E7, 0x99E8, 0x99E9, 0x99EA, 0x99EB, 0x99EC, 0x99ED, 0x99EE, 0x99EF, 0x99F0, 0x99F1, 0x99F2, 0x99F3, 0x99F4, 0x99F5, 0x99F6, 0x99F7, 0x99F8, 0x99F9, 0x761B, 0x763C, 0x7622, 0x7620, 0x7640, 0x762D, 0x7630, 0x763F, 0x7635, 0x7643, 0x763E, 0x7633, 0x764D, 0x765E, 0x7654, 0x765C, 0x7656, 0x766B, 0x766F, 0x7FCA, 0x7AE6, 0x7A78, 0x7A79, 0x7A80, 0x7A86, 0x7A88, 0x7A95, 0x7AA6, 0x7AA0, 0x7AAC, 0x7AA8, 0x7AAD, 0x7AB3, 0x8864, 0x8869, 0x8872, 0x887D, 0x887F, 0x8882, 0x88A2, 0x88C6, 0x88B7, 0x88BC, 0x88C9, 0x88E2, 0x88CE, 0x88E3, 0x88E5, 0x88F1, 0x891A, 0x88FC, 0x88E8, 0x88FE, 0x88F0, 0x8921, 0x8919, 0x8913, 0x891B, 0x890A, 0x8934, 0x892B, 0x8936, 0x8941, 0x8966, 0x897B, 0x758B, 0x80E5, 0x76B2, 0x76B4, 0x77DC, 0x8012, 0x8014, 0x8016, 0x801C, 0x8020, 0x8022, 0x8025, 0x8026, 0x8027, 0x8029, 0x8028, 0x8031, 0x800B, 0x8035, 0x8043, 0x8046, 0x804D, 0x8052, 0x8069, 0x8071, 0x8983, 0x9878, 0x9880, 0x9883 }, { 0x99FA, 0x99FB, 0x99FC, 0x99FD, 0x99FE, 0x99FF, 0x9A00, 0x9A01, 0x9A02, 0x9A03, 0x9A04, 0x9A05, 0x9A06, 0x9A07, 0x9A08, 0x9A09, 0x9A0A, 0x9A0B, 0x9A0C, 0x9A0D, 0x9A0E, 0x9A0F, 0x9A10, 0x9A11, 0x9A12, 0x9A13, 0x9A14, 0x9A15, 0x9A16, 0x9A17, 0x9A18, 0x9A19, 0x9A1A, 0x9A1B, 0x9A1C, 0x9A1D, 0x9A1E, 0x9A1F, 0x9A20, 0x9A21, 0x9A22, 0x9A23, 0x9A24, 0x9A25, 0x9A26, 0x9A27, 0x9A28, 0x9A29, 0x9A2A, 0x9A2B, 0x9A2C, 0x9A2D, 0x9A2E, 0x9A2F, 0x9A30, 0x9A31, 0x9A32, 0x9A33, 0x9A34, 0x9A35, 0x9A36, 0x9A37, 0x9A38, 0x003F, 0x9A39, 0x9A3A, 0x9A3B, 0x9A3C, 0x9A3D, 0x9A3E, 0x9A3F, 0x9A40, 0x9A41, 0x9A42, 0x9A43, 0x9A44, 0x9A45, 0x9A46, 0x9A47, 0x9A48, 0x9A49, 0x9A4A, 0x9A4B, 0x9A4C, 0x9A4D, 0x9A4E, 0x9A4F, 0x9A50, 0x9A51, 0x9A52, 0x9A53, 0x9A54, 0x9A55, 0x9A56, 0x9A57, 0x9A58, 0x9A59, 0x9889, 0x988C, 0x988D, 0x988F, 0x9894, 0x989A, 0x989B, 0x989E, 0x989F, 0x98A1, 0x98A2, 0x98A5, 0x98A6, 0x864D, 0x8654, 0x866C, 0x866E, 0x867F, 0x867A, 0x867C, 0x867B, 0x86A8, 0x868D, 0x868B, 0x86AC, 0x869D, 0x86A7, 0x86A3, 0x86AA, 0x8693, 0x86A9, 0x86B6, 0x86C4, 0x86B5, 0x86CE, 0x86B0, 0x86BA, 0x86B1, 0x86AF, 0x86C9, 0x86CF, 0x86B4, 0x86E9, 0x86F1, 0x86F2, 0x86ED, 0x86F3, 0x86D0, 0x8713, 0x86DE, 0x86F4, 0x86DF, 0x86D8, 0x86D1, 0x8703, 0x8707, 0x86F8, 0x8708, 0x870A, 0x870D, 0x8709, 0x8723, 0x873B, 0x871E, 0x8725, 0x872E, 0x871A, 0x873E, 0x8748, 0x8734, 0x8731, 0x8729, 0x8737, 0x873F, 0x8782, 0x8722, 0x877D, 0x877E, 0x877B, 0x8760, 0x8770, 0x874C, 0x876E, 0x878B, 0x8753, 0x8763, 0x877C, 0x8764, 0x8759, 0x8765, 0x8793, 0x87AF, 0x87A8, 0x87D2 }, { 0x9A5A, 0x9A5B, 0x9A5C, 0x9A5D, 0x9A5E, 0x9A5F, 0x9A60, 0x9A61, 0x9A62, 0x9A63, 0x9A64, 0x9A65, 0x9A66, 0x9A67, 0x9A68, 0x9A69, 0x9A6A, 0x9A6B, 0x9A72, 0x9A83, 0x9A89, 0x9A8D, 0x9A8E, 0x9A94, 0x9A95, 0x9A99, 0x9AA6, 0x9AA9, 0x9AAA, 0x9AAB, 0x9AAC, 0x9AAD, 0x9AAE, 0x9AAF, 0x9AB2, 0x9AB3, 0x9AB4, 0x9AB5, 0x9AB9, 0x9ABB, 0x9ABD, 0x9ABE, 0x9ABF, 0x9AC3, 0x9AC4, 0x9AC6, 0x9AC7, 0x9AC8, 0x9AC9, 0x9ACA, 0x9ACD, 0x9ACE, 0x9ACF, 0x9AD0, 0x9AD2, 0x9AD4, 0x9AD5, 0x9AD6, 0x9AD7, 0x9AD9, 0x9ADA, 0x9ADB, 0x9ADC, 0x003F, 0x9ADD, 0x9ADE, 0x9AE0, 0x9AE2, 0x9AE3, 0x9AE4, 0x9AE5, 0x9AE7, 0x9AE8, 0x9AE9, 0x9AEA, 0x9AEC, 0x9AEE, 0x9AF0, 0x9AF1, 0x9AF2, 0x9AF3, 0x9AF4, 0x9AF5, 0x9AF6, 0x9AF7, 0x9AF8, 0x9AFA, 0x9AFC, 0x9AFD, 0x9AFE, 0x9AFF, 0x9B00, 0x9B01, 0x9B02, 0x9B04, 0x9B05, 0x9B06, 0x87C6, 0x8788, 0x8785, 0x87AD, 0x8797, 0x8783, 0x87AB, 0x87E5, 0x87AC, 0x87B5, 0x87B3, 0x87CB, 0x87D3, 0x87BD, 0x87D1, 0x87C0, 0x87CA, 0x87DB, 0x87EA, 0x87E0, 0x87EE, 0x8816, 0x8813, 0x87FE, 0x880A, 0x881B, 0x8821, 0x8839, 0x883C, 0x7F36, 0x7F42, 0x7F44, 0x7F45, 0x8210, 0x7AFA, 0x7AFD, 0x7B08, 0x7B03, 0x7B04, 0x7B15, 0x7B0A, 0x7B2B, 0x7B0F, 0x7B47, 0x7B38, 0x7B2A, 0x7B19, 0x7B2E, 0x7B31, 0x7B20, 0x7B25, 0x7B24, 0x7B33, 0x7B3E, 0x7B1E, 0x7B58, 0x7B5A, 0x7B45, 0x7B75, 0x7B4C, 0x7B5D, 0x7B60, 0x7B6E, 0x7B7B, 0x7B62, 0x7B72, 0x7B71, 0x7B90, 0x7BA6, 0x7BA7, 0x7BB8, 0x7BAC, 0x7B9D, 0x7BA8, 0x7B85, 0x7BAA, 0x7B9C, 0x7BA2, 0x7BAB, 0x7BB4, 0x7BD1, 0x7BC1, 0x7BCC, 0x7BDD, 0x7BDA, 0x7BE5, 0x7BE6, 0x7BEA, 0x7C0C, 0x7BFE, 0x7BFC, 0x7C0F, 0x7C16, 0x7C0B }, { 0x9B07, 0x9B09, 0x9B0A, 0x9B0B, 0x9B0C, 0x9B0D, 0x9B0E, 0x9B10, 0x9B11, 0x9B12, 0x9B14, 0x9B15, 0x9B16, 0x9B17, 0x9B18, 0x9B19, 0x9B1A, 0x9B1B, 0x9B1C, 0x9B1D, 0x9B1E, 0x9B20, 0x9B21, 0x9B22, 0x9B24, 0x9B25, 0x9B26, 0x9B27, 0x9B28, 0x9B29, 0x9B2A, 0x9B2B, 0x9B2C, 0x9B2D, 0x9B2E, 0x9B30, 0x9B31, 0x9B33, 0x9B34, 0x9B35, 0x9B36, 0x9B37, 0x9B38, 0x9B39, 0x9B3A, 0x9B3D, 0x9B3E, 0x9B3F, 0x9B40, 0x9B46, 0x9B4A, 0x9B4B, 0x9B4C, 0x9B4E, 0x9B50, 0x9B52, 0x9B53, 0x9B55, 0x9B56, 0x9B57, 0x9B58, 0x9B59, 0x9B5A, 0x003F, 0x9B5B, 0x9B5C, 0x9B5D, 0x9B5E, 0x9B5F, 0x9B60, 0x9B61, 0x9B62, 0x9B63, 0x9B64, 0x9B65, 0x9B66, 0x9B67, 0x9B68, 0x9B69, 0x9B6A, 0x9B6B, 0x9B6C, 0x9B6D, 0x9B6E, 0x9B6F, 0x9B70, 0x9B71, 0x9B72, 0x9B73, 0x9B74, 0x9B75, 0x9B76, 0x9B77, 0x9B78, 0x9B79, 0x9B7A, 0x9B7B, 0x7C1F, 0x7C2A, 0x7C26, 0x7C38, 0x7C41, 0x7C40, 0x81FE, 0x8201, 0x8202, 0x8204, 0x81EC, 0x8844, 0x8221, 0x8222, 0x8223, 0x822D, 0x822F, 0x8228, 0x822B, 0x8238, 0x823B, 0x8233, 0x8234, 0x823E, 0x8244, 0x8249, 0x824B, 0x824F, 0x825A, 0x825F, 0x8268, 0x887E, 0x8885, 0x8888, 0x88D8, 0x88DF, 0x895E, 0x7F9D, 0x7F9F, 0x7FA7, 0x7FAF, 0x7FB0, 0x7FB2, 0x7C7C, 0x6549, 0x7C91, 0x7C9D, 0x7C9C, 0x7C9E, 0x7CA2, 0x7CB2, 0x7CBC, 0x7CBD, 0x7CC1, 0x7CC7, 0x7CCC, 0x7CCD, 0x7CC8, 0x7CC5, 0x7CD7, 0x7CE8, 0x826E, 0x66A8, 0x7FBF, 0x7FCE, 0x7FD5, 0x7FE5, 0x7FE1, 0x7FE6, 0x7FE9, 0x7FEE, 0x7FF3, 0x7CF8, 0x7D77, 0x7DA6, 0x7DAE, 0x7E47, 0x7E9B, 0x9EB8, 0x9EB4, 0x8D73, 0x8D84, 0x8D94, 0x8D91, 0x8DB1, 0x8D67, 0x8D6D, 0x8C47, 0x8C49, 0x914A, 0x9150, 0x914E, 0x914F, 0x9164 }, { 0x9B7C, 0x9B7D, 0x9B7E, 0x9B7F, 0x9B80, 0x9B81, 0x9B82, 0x9B83, 0x9B84, 0x9B85, 0x9B86, 0x9B87, 0x9B88, 0x9B89, 0x9B8A, 0x9B8B, 0x9B8C, 0x9B8D, 0x9B8E, 0x9B8F, 0x9B90, 0x9B91, 0x9B92, 0x9B93, 0x9B94, 0x9B95, 0x9B96, 0x9B97, 0x9B98, 0x9B99, 0x9B9A, 0x9B9B, 0x9B9C, 0x9B9D, 0x9B9E, 0x9B9F, 0x9BA0, 0x9BA1, 0x9BA2, 0x9BA3, 0x9BA4, 0x9BA5, 0x9BA6, 0x9BA7, 0x9BA8, 0x9BA9, 0x9BAA, 0x9BAB, 0x9BAC, 0x9BAD, 0x9BAE, 0x9BAF, 0x9BB0, 0x9BB1, 0x9BB2, 0x9BB3, 0x9BB4, 0x9BB5, 0x9BB6, 0x9BB7, 0x9BB8, 0x9BB9, 0x9BBA, 0x003F, 0x9BBB, 0x9BBC, 0x9BBD, 0x9BBE, 0x9BBF, 0x9BC0, 0x9BC1, 0x9BC2, 0x9BC3, 0x9BC4, 0x9BC5, 0x9BC6, 0x9BC7, 0x9BC8, 0x9BC9, 0x9BCA, 0x9BCB, 0x9BCC, 0x9BCD, 0x9BCE, 0x9BCF, 0x9BD0, 0x9BD1, 0x9BD2, 0x9BD3, 0x9BD4, 0x9BD5, 0x9BD6, 0x9BD7, 0x9BD8, 0x9BD9, 0x9BDA, 0x9BDB, 0x9162, 0x9161, 0x9170, 0x9169, 0x916F, 0x917D, 0x917E, 0x9172, 0x9174, 0x9179, 0x918C, 0x9185, 0x9190, 0x918D, 0x9191, 0x91A2, 0x91A3, 0x91AA, 0x91AD, 0x91AE, 0x91AF, 0x91B5, 0x91B4, 0x91BA, 0x8C55, 0x9E7E, 0x8DB8, 0x8DEB, 0x8E05, 0x8E59, 0x8E69, 0x8DB5, 0x8DBF, 0x8DBC, 0x8DBA, 0x8DC4, 0x8DD6, 0x8DD7, 0x8DDA, 0x8DDE, 0x8DCE, 0x8DCF, 0x8DDB, 0x8DC6, 0x8DEC, 0x8DF7, 0x8DF8, 0x8DE3, 0x8DF9, 0x8DFB, 0x8DE4, 0x8E09, 0x8DFD, 0x8E14, 0x8E1D, 0x8E1F, 0x8E2C, 0x8E2E, 0x8E23, 0x8E2F, 0x8E3A, 0x8E40, 0x8E39, 0x8E35, 0x8E3D, 0x8E31, 0x8E49, 0x8E41, 0x8E42, 0x8E51, 0x8E52, 0x8E4A, 0x8E70, 0x8E76, 0x8E7C, 0x8E6F, 0x8E74, 0x8E85, 0x8E8F, 0x8E94, 0x8E90, 0x8E9C, 0x8E9E, 0x8C78, 0x8C82, 0x8C8A, 0x8C85, 0x8C98, 0x8C94, 0x659B, 0x89D6, 0x89DE, 0x89DA, 0x89DC }, { 0x9BDC, 0x9BDD, 0x9BDE, 0x9BDF, 0x9BE0, 0x9BE1, 0x9BE2, 0x9BE3, 0x9BE4, 0x9BE5, 0x9BE6, 0x9BE7, 0x9BE8, 0x9BE9, 0x9BEA, 0x9BEB, 0x9BEC, 0x9BED, 0x9BEE, 0x9BEF, 0x9BF0, 0x9BF1, 0x9BF2, 0x9BF3, 0x9BF4, 0x9BF5, 0x9BF6, 0x9BF7, 0x9BF8, 0x9BF9, 0x9BFA, 0x9BFB, 0x9BFC, 0x9BFD, 0x9BFE, 0x9BFF, 0x9C00, 0x9C01, 0x9C02, 0x9C03, 0x9C04, 0x9C05, 0x9C06, 0x9C07, 0x9C08, 0x9C09, 0x9C0A, 0x9C0B, 0x9C0C, 0x9C0D, 0x9C0E, 0x9C0F, 0x9C10, 0x9C11, 0x9C12, 0x9C13, 0x9C14, 0x9C15, 0x9C16, 0x9C17, 0x9C18, 0x9C19, 0x9C1A, 0x003F, 0x9C1B, 0x9C1C, 0x9C1D, 0x9C1E, 0x9C1F, 0x9C20, 0x9C21, 0x9C22, 0x9C23, 0x9C24, 0x9C25, 0x9C26, 0x9C27, 0x9C28, 0x9C29, 0x9C2A, 0x9C2B, 0x9C2C, 0x9C2D, 0x9C2E, 0x9C2F, 0x9C30, 0x9C31, 0x9C32, 0x9C33, 0x9C34, 0x9C35, 0x9C36, 0x9C37, 0x9C38, 0x9C39, 0x9C3A, 0x9C3B, 0x89E5, 0x89EB, 0x89EF, 0x8A3E, 0x8B26, 0x9753, 0x96E9, 0x96F3, 0x96EF, 0x9706, 0x9701, 0x9708, 0x970F, 0x970E, 0x972A, 0x972D, 0x9730, 0x973E, 0x9F80, 0x9F83, 0x9F85, 0x9F86, 0x9F87, 0x9F88, 0x9F89, 0x9F8A, 0x9F8C, 0x9EFE, 0x9F0B, 0x9F0D, 0x96B9, 0x96BC, 0x96BD, 0x96CE, 0x96D2, 0x77BF, 0x96E0, 0x928E, 0x92AE, 0x92C8, 0x933E, 0x936A, 0x93CA, 0x938F, 0x943E, 0x946B, 0x9C7F, 0x9C82, 0x9C85, 0x9C86, 0x9C87, 0x9C88, 0x7A23, 0x9C8B, 0x9C8E, 0x9C90, 0x9C91, 0x9C92, 0x9C94, 0x9C95, 0x9C9A, 0x9C9B, 0x9C9E, 0x9C9F, 0x9CA0, 0x9CA1, 0x9CA2, 0x9CA3, 0x9CA5, 0x9CA6, 0x9CA7, 0x9CA8, 0x9CA9, 0x9CAB, 0x9CAD, 0x9CAE, 0x9CB0, 0x9CB1, 0x9CB2, 0x9CB3, 0x9CB4, 0x9CB5, 0x9CB6, 0x9CB7, 0x9CBA, 0x9CBB, 0x9CBC, 0x9CBD, 0x9CC4, 0x9CC5, 0x9CC6, 0x9CC7, 0x9CCA, 0x9CCB }, { 0x9C3C, 0x9C3D, 0x9C3E, 0x9C3F, 0x9C40, 0x9C41, 0x9C42, 0x9C43, 0x9C44, 0x9C45, 0x9C46, 0x9C47, 0x9C48, 0x9C49, 0x9C4A, 0x9C4B, 0x9C4C, 0x9C4D, 0x9C4E, 0x9C4F, 0x9C50, 0x9C51, 0x9C52, 0x9C53, 0x9C54, 0x9C55, 0x9C56, 0x9C57, 0x9C58, 0x9C59, 0x9C5A, 0x9C5B, 0x9C5C, 0x9C5D, 0x9C5E, 0x9C5F, 0x9C60, 0x9C61, 0x9C62, 0x9C63, 0x9C64, 0x9C65, 0x9C66, 0x9C67, 0x9C68, 0x9C69, 0x9C6A, 0x9C6B, 0x9C6C, 0x9C6D, 0x9C6E, 0x9C6F, 0x9C70, 0x9C71, 0x9C72, 0x9C73, 0x9C74, 0x9C75, 0x9C76, 0x9C77, 0x9C78, 0x9C79, 0x9C7A, 0x003F, 0x9C7B, 0x9C7D, 0x9C7E, 0x9C80, 0x9C83, 0x9C84, 0x9C89, 0x9C8A, 0x9C8C, 0x9C8F, 0x9C93, 0x9C96, 0x9C97, 0x9C98, 0x9C99, 0x9C9D, 0x9CAA, 0x9CAC, 0x9CAF, 0x9CB9, 0x9CBE, 0x9CBF, 0x9CC0, 0x9CC1, 0x9CC2, 0x9CC8, 0x9CC9, 0x9CD1, 0x9CD2, 0x9CDA, 0x9CDB, 0x9CE0, 0x9CE1, 0x9CCC, 0x9CCD, 0x9CCE, 0x9CCF, 0x9CD0, 0x9CD3, 0x9CD4, 0x9CD5, 0x9CD7, 0x9CD8, 0x9CD9, 0x9CDC, 0x9CDD, 0x9CDF, 0x9CE2, 0x977C, 0x9785, 0x9791, 0x9792, 0x9794, 0x97AF, 0x97AB, 0x97A3, 0x97B2, 0x97B4, 0x9AB1, 0x9AB0, 0x9AB7, 0x9E58, 0x9AB6, 0x9ABA, 0x9ABC, 0x9AC1, 0x9AC0, 0x9AC5, 0x9AC2, 0x9ACB, 0x9ACC, 0x9AD1, 0x9B45, 0x9B43, 0x9B47, 0x9B49, 0x9B48, 0x9B4D, 0x9B51, 0x98E8, 0x990D, 0x992E, 0x9955, 0x9954, 0x9ADF, 0x9AE1, 0x9AE6, 0x9AEF, 0x9AEB, 0x9AFB, 0x9AED, 0x9AF9, 0x9B08, 0x9B0F, 0x9B13, 0x9B1F, 0x9B23, 0x9EBD, 0x9EBE, 0x7E3B, 0x9E82, 0x9E87, 0x9E88, 0x9E8B, 0x9E92, 0x93D6, 0x9E9D, 0x9E9F, 0x9EDB, 0x9EDC, 0x9EDD, 0x9EE0, 0x9EDF, 0x9EE2, 0x9EE9, 0x9EE7, 0x9EE5, 0x9EEA, 0x9EEF, 0x9F22, 0x9F2C, 0x9F2F, 0x9F39, 0x9F37, 0x9F3D, 0x9F3E, 0x9F44 }, { 0x9CE3, 0x9CE4, 0x9CE5, 0x9CE6, 0x9CE7, 0x9CE8, 0x9CE9, 0x9CEA, 0x9CEB, 0x9CEC, 0x9CED, 0x9CEE, 0x9CEF, 0x9CF0, 0x9CF1, 0x9CF2, 0x9CF3, 0x9CF4, 0x9CF5, 0x9CF6, 0x9CF7, 0x9CF8, 0x9CF9, 0x9CFA, 0x9CFB, 0x9CFC, 0x9CFD, 0x9CFE, 0x9CFF, 0x9D00, 0x9D01, 0x9D02, 0x9D03, 0x9D04, 0x9D05, 0x9D06, 0x9D07, 0x9D08, 0x9D09, 0x9D0A, 0x9D0B, 0x9D0C, 0x9D0D, 0x9D0E, 0x9D0F, 0x9D10, 0x9D11, 0x9D12, 0x9D13, 0x9D14, 0x9D15, 0x9D16, 0x9D17, 0x9D18, 0x9D19, 0x9D1A, 0x9D1B, 0x9D1C, 0x9D1D, 0x9D1E, 0x9D1F, 0x9D20, 0x9D21, 0x003F, 0x9D22, 0x9D23, 0x9D24, 0x9D25, 0x9D26, 0x9D27, 0x9D28, 0x9D29, 0x9D2A, 0x9D2B, 0x9D2C, 0x9D2D, 0x9D2E, 0x9D2F, 0x9D30, 0x9D31, 0x9D32, 0x9D33, 0x9D34, 0x9D35, 0x9D36, 0x9D37, 0x9D38, 0x9D39, 0x9D3A, 0x9D3B, 0x9D3C, 0x9D3D, 0x9D3E, 0x9D3F, 0x9D40, 0x9D41, 0x9D42, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F }, { 0x9D43, 0x9D44, 0x9D45, 0x9D46, 0x9D47, 0x9D48, 0x9D49, 0x9D4A, 0x9D4B, 0x9D4C, 0x9D4D, 0x9D4E, 0x9D4F, 0x9D50, 0x9D51, 0x9D52, 0x9D53, 0x9D54, 0x9D55, 0x9D56, 0x9D57, 0x9D58, 0x9D59, 0x9D5A, 0x9D5B, 0x9D5C, 0x9D5D, 0x9D5E, 0x9D5F, 0x9D60, 0x9D61, 0x9D62, 0x9D63, 0x9D64, 0x9D65, 0x9D66, 0x9D67, 0x9D68, 0x9D69, 0x9D6A, 0x9D6B, 0x9D6C, 0x9D6D, 0x9D6E, 0x9D6F, 0x9D70, 0x9D71, 0x9D72, 0x9D73, 0x9D74, 0x9D75, 0x9D76, 0x9D77, 0x9D78, 0x9D79, 0x9D7A, 0x9D7B, 0x9D7C, 0x9D7D, 0x9D7E, 0x9D7F, 0x9D80, 0x9D81, 0x003F, 0x9D82, 0x9D83, 0x9D84, 0x9D85, 0x9D86, 0x9D87, 0x9D88, 0x9D89, 0x9D8A, 0x9D8B, 0x9D8C, 0x9D8D, 0x9D8E, 0x9D8F, 0x9D90, 0x9D91, 0x9D92, 0x9D93, 0x9D94, 0x9D95, 0x9D96, 0x9D97, 0x9D98, 0x9D99, 0x9D9A, 0x9D9B, 0x9D9C, 0x9D9D, 0x9D9E, 0x9D9F, 0x9DA0, 0x9DA1, 0x9DA2, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F }, { 0x9DA3, 0x9DA4, 0x9DA5, 0x9DA6, 0x9DA7, 0x9DA8, 0x9DA9, 0x9DAA, 0x9DAB, 0x9DAC, 0x9DAD, 0x9DAE, 0x9DAF, 0x9DB0, 0x9DB1, 0x9DB2, 0x9DB3, 0x9DB4, 0x9DB5, 0x9DB6, 0x9DB7, 0x9DB8, 0x9DB9, 0x9DBA, 0x9DBB, 0x9DBC, 0x9DBD, 0x9DBE, 0x9DBF, 0x9DC0, 0x9DC1, 0x9DC2, 0x9DC3, 0x9DC4, 0x9DC5, 0x9DC6, 0x9DC7, 0x9DC8, 0x9DC9, 0x9DCA, 0x9DCB, 0x9DCC, 0x9DCD, 0x9DCE, 0x9DCF, 0x9DD0, 0x9DD1, 0x9DD2, 0x9DD3, 0x9DD4, 0x9DD5, 0x9DD6, 0x9DD7, 0x9DD8, 0x9DD9, 0x9DDA, 0x9DDB, 0x9DDC, 0x9DDD, 0x9DDE, 0x9DDF, 0x9DE0, 0x9DE1, 0x003F, 0x9DE2, 0x9DE3, 0x9DE4, 0x9DE5, 0x9DE6, 0x9DE7, 0x9DE8, 0x9DE9, 0x9DEA, 0x9DEB, 0x9DEC, 0x9DED, 0x9DEE, 0x9DEF, 0x9DF0, 0x9DF1, 0x9DF2, 0x9DF3, 0x9DF4, 0x9DF5, 0x9DF6, 0x9DF7, 0x9DF8, 0x9DF9, 0x9DFA, 0x9DFB, 0x9DFC, 0x9DFD, 0x9DFE, 0x9DFF, 0x9E00, 0x9E01, 0x9E02, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F }, { 0x9E03, 0x9E04, 0x9E05, 0x9E06, 0x9E07, 0x9E08, 0x9E09, 0x9E0A, 0x9E0B, 0x9E0C, 0x9E0D, 0x9E0E, 0x9E0F, 0x9E10, 0x9E11, 0x9E12, 0x9E13, 0x9E14, 0x9E15, 0x9E16, 0x9E17, 0x9E18, 0x9E19, 0x9E1A, 0x9E1B, 0x9E1C, 0x9E1D, 0x9E1E, 0x9E24, 0x9E27, 0x9E2E, 0x9E30, 0x9E34, 0x9E3B, 0x9E3C, 0x9E40, 0x9E4D, 0x9E50, 0x9E52, 0x9E53, 0x9E54, 0x9E56, 0x9E59, 0x9E5D, 0x9E5F, 0x9E60, 0x9E61, 0x9E62, 0x9E65, 0x9E6E, 0x9E6F, 0x9E72, 0x9E74, 0x9E75, 0x9E76, 0x9E77, 0x9E78, 0x9E79, 0x9E7A, 0x9E7B, 0x9E7C, 0x9E7D, 0x9E80, 0x003F, 0x9E81, 0x9E83, 0x9E84, 0x9E85, 0x9E86, 0x9E89, 0x9E8A, 0x9E8C, 0x9E8D, 0x9E8E, 0x9E8F, 0x9E90, 0x9E91, 0x9E94, 0x9E95, 0x9E96, 0x9E97, 0x9E98, 0x9E99, 0x9E9A, 0x9E9B, 0x9E9C, 0x9E9E, 0x9EA0, 0x9EA1, 0x9EA2, 0x9EA3, 0x9EA4, 0x9EA5, 0x9EA7, 0x9EA8, 0x9EA9, 0x9EAA, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F }, { 0x9EAB, 0x9EAC, 0x9EAD, 0x9EAE, 0x9EAF, 0x9EB0, 0x9EB1, 0x9EB2, 0x9EB3, 0x9EB5, 0x9EB6, 0x9EB7, 0x9EB9, 0x9EBA, 0x9EBC, 0x9EBF, 0x9EC0, 0x9EC1, 0x9EC2, 0x9EC3, 0x9EC5, 0x9EC6, 0x9EC7, 0x9EC8, 0x9ECA, 0x9ECB, 0x9ECC, 0x9ED0, 0x9ED2, 0x9ED3, 0x9ED5, 0x9ED6, 0x9ED7, 0x9ED9, 0x9EDA, 0x9EDE, 0x9EE1, 0x9EE3, 0x9EE4, 0x9EE6, 0x9EE8, 0x9EEB, 0x9EEC, 0x9EED, 0x9EEE, 0x9EF0, 0x9EF1, 0x9EF2, 0x9EF3, 0x9EF4, 0x9EF5, 0x9EF6, 0x9EF7, 0x9EF8, 0x9EFA, 0x9EFD, 0x9EFF, 0x9F00, 0x9F01, 0x9F02, 0x9F03, 0x9F04, 0x9F05, 0x003F, 0x9F06, 0x9F07, 0x9F08, 0x9F09, 0x9F0A, 0x9F0C, 0x9F0F, 0x9F11, 0x9F12, 0x9F14, 0x9F15, 0x9F16, 0x9F18, 0x9F1A, 0x9F1B, 0x9F1C, 0x9F1D, 0x9F1E, 0x9F1F, 0x9F21, 0x9F23, 0x9F24, 0x9F25, 0x9F26, 0x9F27, 0x9F28, 0x9F29, 0x9F2A, 0x9F2B, 0x9F2D, 0x9F2E, 0x9F30, 0x9F31, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F }, { 0x9F32, 0x9F33, 0x9F34, 0x9F35, 0x9F36, 0x9F38, 0x9F3A, 0x9F3C, 0x9F3F, 0x9F40, 0x9F41, 0x9F42, 0x9F43, 0x9F45, 0x9F46, 0x9F47, 0x9F48, 0x9F49, 0x9F4A, 0x9F4B, 0x9F4C, 0x9F4D, 0x9F4E, 0x9F4F, 0x9F52, 0x9F53, 0x9F54, 0x9F55, 0x9F56, 0x9F57, 0x9F58, 0x9F59, 0x9F5A, 0x9F5B, 0x9F5C, 0x9F5D, 0x9F5E, 0x9F5F, 0x9F60, 0x9F61, 0x9F62, 0x9F63, 0x9F64, 0x9F65, 0x9F66, 0x9F67, 0x9F68, 0x9F69, 0x9F6A, 0x9F6B, 0x9F6C, 0x9F6D, 0x9F6E, 0x9F6F, 0x9F70, 0x9F71, 0x9F72, 0x9F73, 0x9F74, 0x9F75, 0x9F76, 0x9F77, 0x9F78, 0x003F, 0x9F79, 0x9F7A, 0x9F7B, 0x9F7C, 0x9F7D, 0x9F7E, 0x9F81, 0x9F82, 0x9F8D, 0x9F8E, 0x9F8F, 0x9F90, 0x9F91, 0x9F92, 0x9F93, 0x9F94, 0x9F95, 0x9F96, 0x9F97, 0x9F98, 0x9F9C, 0x9F9D, 0x9F9E, 0x9FA1, 0x9FA2, 0x9FA3, 0x9FA4, 0x9FA5, 0xF92C, 0xF979, 0xF995, 0xF9E7, 0xF9F1, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F }, { 0xFA0C, 0xFA0D, 0xFA0E, 0xFA0F, 0xFA11, 0xFA13, 0xFA14, 0xFA18, 0xFA1F, 0xFA20, 0xFA21, 0xFA23, 0xFA24, 0xFA27, 0xFA28, 0xFA29, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F } }; CorsixTH-0.63/CorsixTH/Src/iso_fs.cpp000066400000000000000000000410101347163623700173750ustar00rootroot00000000000000/* Copyright (c) 2010 Peter "Corsix" Cawley 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. */ #include "iso_fs.h" #include #include #include #include #include iso_filesystem::iso_filesystem() { raw_file = nullptr; error = nullptr; files = nullptr; file_count = 0; file_table_size = 0; path_seperator = '\\'; } iso_filesystem::~iso_filesystem() { clear(); } void iso_filesystem::clear() { delete[] error; error = nullptr; if(files) { for(size_t i = 0; i < file_count; ++i) delete[] files[i].path; delete[] files; files = nullptr; file_count = 0; file_table_size = 0; } } void iso_filesystem::set_path_separator(char cSeparator) { path_seperator = cSeparator; } enum iso_volume_descriptor_type : uint8_t { vdt_privary_volume = 0x01, // Other type numbers are either reserved for future use, or are not // interesting to us. vdt_terminator = 0xFF, }; enum iso_dir_ent_flag : uint8_t { def_hidden = 0x01, def_directory = 0x02, def_multi_extent = 0x80, }; template static inline T read_native_int(const uint8_t *p) { // ISO 9660 commonly encodes multi-byte integers as little endian followed // by big endian. Note that the first byte of iEndianness will be a zero on // little endian systems, and a one on big endian. static const uint16_t iEndianness = 0x0100; return reinterpret_cast(p)[*reinterpret_cast(&iEndianness)]; } bool iso_filesystem::initialise(FILE* fRawFile) { raw_file = fRawFile; clear(); // Until we know better, assume that sectors are 2048 bytes. sector_size = 2048; // The first 16 sectors are reserved for bootable media. // Volume descriptor records follow this, with one record per sector. for(uint32_t iSector = 16; seek_to_sector(iSector); ++iSector) { uint8_t aBuffer[190]; if(!read_data(sizeof(aBuffer), aBuffer)) break; // CD001 is a standard identifier, \x01 is a version number if(std::memcmp(aBuffer + 1, "CD001\x01", 6) == 0) { if(aBuffer[0] == vdt_privary_volume) { sector_size = read_native_int(aBuffer + 128); find_hosp_directory(aBuffer + 156, 34, 0); if(file_count == 0) { set_error("Could not find Theme Hospital data directory."); return false; } else { return true; } } else if(aBuffer[0] == vdt_terminator) break; } } set_error("Could not find primary volume descriptor."); return false; } int iso_filesystem::filename_compare(const void* lhs, const void* rhs) { return std::strcmp( reinterpret_cast(lhs)->path, reinterpret_cast(rhs)->path); } char iso_filesystem::normalise(char c) { if(c == '_') // underscore to hyphen return '-'; else if('a' <= c && c <= 'z') // ASCII lowercase to ASCII uppercase return static_cast(c - 'a' + 'A'); else return c; } void iso_filesystem::trim_identifier_version(const uint8_t* sIdent, uint8_t& iLength) { for(uint8_t i = 0; i < iLength; ++i) { if(sIdent[i] == ';') { iLength = i; return; } } } int iso_filesystem::find_hosp_directory(const uint8_t *pDirEnt, int iDirEntsSize, int iLevel) { // Sanity check // Apart from at the root level, directory record arrays must take up whole // sectors, whose sizes are powers of two and at least 2048. // The formal limit on directory depth is 8, so hitting 16 is insane. if((iLevel != 0 && (iDirEntsSize & 0x7FF)) || iLevel > 16) return 0; uint8_t *pBuffer = nullptr; uint32_t iBufferSize = 0; for(; iDirEntsSize > 0; iDirEntsSize -= *pDirEnt, pDirEnt += *pDirEnt) { // There is zero padding so that no record spans multiple sectors. if(*pDirEnt == 0) { --iDirEntsSize, ++pDirEnt; continue; } uint32_t iDataSector = read_native_int(pDirEnt + 2); uint32_t iDataLength = read_native_int(pDirEnt + 10); uint8_t iFlags = pDirEnt[25]; uint8_t iIdentLength = pDirEnt[32]; trim_identifier_version(pDirEnt + 33, iIdentLength); if(iFlags & def_directory) { // The names "\x00" and "\x01" are used for the current directory // the parent directory respectively. We only want to visit these // when at the root level. if(iLevel == 0 || iIdentLength != 1 || pDirEnt[33] > 1) { if(iDataLength > iBufferSize) { delete[] pBuffer; iBufferSize = iDataLength; pBuffer = new uint8_t[iBufferSize]; } if(seek_to_sector(iDataSector) && read_data(iDataLength, pBuffer)) { int iFoundLevel = find_hosp_directory(pBuffer, iDataLength, iLevel + 1); if(iFoundLevel != 0) { if(iFoundLevel == 2) build_file_lookup_table(iDataSector, iDataLength, ""); delete[] pBuffer; return iFoundLevel + 1; } } } } else { // Look for VBLK-0.TAB to serve as indication that we've found the // Theme Hospital data. if(iIdentLength == 10) { const char sName[10] = {'V','B','L','K','-','0','.','T','A','B'}; int i = 0; for(; i < 10; ++i) { if(normalise(pDirEnt[33 + i]) != sName[i]) break; } if(i == 10) { return 1; } } } } delete[] pBuffer; return 0; } void iso_filesystem::build_file_lookup_table(uint32_t iSector, int iDirEntsSize, const char* sPrefix) { // Sanity check // Apart from at the root level, directory record arrays must take up whole // sectors, whose sizes are powers of two and at least 2048. // Path lengths shouldn't exceed 256 either (or at least not for the files // which we're interested in). size_t iLen = std::strlen(sPrefix); if((iLen != 0 && (iDirEntsSize & 0x7FF)) || (iLen > 256)) return; uint8_t *pBuffer = new uint8_t[iDirEntsSize]; if(!seek_to_sector(iSector) || !read_data(iDirEntsSize, pBuffer)) { delete[] pBuffer; return; } uint8_t *pDirEnt = pBuffer; for(; iDirEntsSize > 0; iDirEntsSize -= *pDirEnt, pDirEnt += *pDirEnt) { // There is zero padding so that no record spans multiple sectors. if(*pDirEnt == 0) { --iDirEntsSize, ++pDirEnt; continue; } uint32_t iDataSector = read_native_int(pDirEnt + 2); uint32_t iDataLength = read_native_int(pDirEnt + 10); uint8_t iFlags = pDirEnt[25]; uint8_t iIdentLength = pDirEnt[32]; trim_identifier_version(pDirEnt + 33, iIdentLength); // Build new path char *sPath = new char[iLen + iIdentLength + 2]; std::memcpy(sPath, sPrefix, iLen); #ifdef _MSC_VER #pragma warning(disable: 4996) #endif std::transform(pDirEnt + 33, pDirEnt + 33 + iIdentLength, sPath + iLen, normalise); #ifdef _MSC_VER #pragma warning(default: 4996) #endif sPath[iLen + iIdentLength] = 0; if(iFlags & def_directory) { // None of the directories which we're interested in have length 1. // This also avoids the dummy "current" and "parent" directories. if(iIdentLength > 1) { sPath[iLen + iIdentLength] = path_seperator; sPath[iLen + iIdentLength + 1] = 0; build_file_lookup_table(iDataSector, iDataLength, sPath); } } else { file_metadata *file = allocate_file_record(); file->path = sPath; file->sector = iDataSector; file->size = iDataLength; sPath = nullptr; } delete[] sPath; } delete[] pBuffer; if(iLen == 0) { // The lookup table will be ordered by the underlying ordering of the // disk, which isn't quite the ordering we want. qsort(files, file_count, sizeof(file_metadata), filename_compare); } } iso_filesystem::file_metadata* iso_filesystem::allocate_file_record() { if(file_count == file_table_size) { size_t iNewTableSize = file_table_size * 2 + 1; file_metadata* pNewFiles = new file_metadata[iNewTableSize]; std::memcpy(pNewFiles, files, sizeof(file_metadata) * file_count); delete[] files; files = pNewFiles; file_table_size = iNewTableSize; } return files + file_count++; } void iso_filesystem::visit_directory_files(const char* sPath, void (*fnCallback)(void*, const char*), void* pCallbackData) const { size_t iLen = std::strlen(sPath) + 1; std::vector sNormedPath(iLen); for(size_t i = 0; i < iLen; ++i) sNormedPath[i] = normalise(sPath[i]); // Inefficient (better would be to binary search for first and last files // which begin with sPath), but who cares - this isn't called often for(size_t i = 0; i < file_count; ++i) { const char *sName = files[i].path; if(std::strlen(sName) >= iLen && std::memcmp(sNormedPath.data(), sName, iLen - 1) == 0) { sName += iLen - 1; if(*sName == path_seperator) ++sName; if(std::strchr(sName, path_seperator) == nullptr) fnCallback(pCallbackData, sName); } } } iso_filesystem::file_handle iso_filesystem::find_file(const char* sPath) const { size_t iLen = std::strlen(sPath) + 1; std::vector sNormedPath(iLen); for(size_t i = 0; i < iLen; ++i) sNormedPath[i] = normalise(sPath[i]); // Standard binary search over sorted list of files int iLower = 0, iUpper = static_cast(file_count); while(iLower != iUpper) { int iMid = (iLower + iUpper) / 2; int iComp = std::strcmp(sNormedPath.data(), files[iMid].path); if(iComp == 0) return iMid + 1; else if(iComp < 0) iUpper = iMid; else iLower = iMid + 1; } return 0; } uint32_t iso_filesystem::get_file_size(file_handle iFile) const { if(iFile <= 0 || static_cast(iFile) > file_count) return 0; else return files[iFile - 1].size; } bool iso_filesystem::get_file_data(file_handle iFile, uint8_t *pBuffer) { if(iFile <= 0 || static_cast(iFile) > file_count) { set_error("Invalid file handle."); return false; } else { return seek_to_sector(files[iFile - 1].sector) && read_data(files[iFile - 1].size, pBuffer); } } const char* iso_filesystem::get_error() const { return error; } bool iso_filesystem::seek_to_sector(uint32_t iSector) { if(!raw_file) { set_error("No raw file."); return false; } if(std::fseek(raw_file, sector_size * static_cast(iSector), SEEK_SET) == 0) return true; else { set_error("Unable to seek to sector %i.", static_cast(iSector)); return false; } } bool iso_filesystem::read_data(uint32_t iByteCount, uint8_t *pBuffer) { if(!raw_file) { set_error("No raw file."); return false; } if(std::fread(pBuffer, 1, iByteCount, raw_file) == iByteCount) return true; else { set_error("Unable to read %i bytes.", static_cast(iByteCount)); return false; } } void iso_filesystem::set_error(const char* sFormat, ...) { if(error == nullptr) { // None of the errors which we generate will be longer than 1024. error = new char[1024]; } va_list a; va_start(a, sFormat); #ifdef _MSC_VER #pragma warning(disable: 4996) #endif std::vsprintf(error, sFormat, a); #ifdef _MSC_VER #pragma warning(default: 4996) #endif va_end(a); } static int l_isofs_new(lua_State *L) { luaT_stdnew(L, luaT_environindex, true); return 1; } static int l_isofs_set_path_separator(lua_State *L) { iso_filesystem *pSelf = luaT_testuserdata(L); pSelf->set_path_separator(luaL_checkstring(L, 2)[0]); lua_settop(L, 1); return 1; } static int l_isofs_set_root(lua_State *L) { iso_filesystem *pSelf = luaT_testuserdata(L); FILE *fIso = *luaT_testuserdata(L, 2); if(pSelf->initialise(fIso)) { lua_pushvalue(L, 2); luaT_setenvfield(L, 1, "file"); lua_settop(L, 1); return 1; } else { lua_pushnil(L); lua_pushstring(L, pSelf->get_error()); return 2; } } static int l_isofs_read_contents(lua_State *L) { iso_filesystem *pSelf = luaT_testuserdata(L); const char* sFilename = luaL_checkstring(L, 2); iso_filesystem::file_handle iFile = pSelf->find_file(sFilename); if(!iso_filesystem::isHandleGood(iFile)) { lua_pushnil(L); lua_pushfstring(L, "Could not find \'%s\' in .iso image", sFilename); return 2; } void* pBuffer = lua_newuserdata(L, pSelf->get_file_size(iFile)); if(!pSelf->get_file_data(iFile, reinterpret_cast(pBuffer))) { lua_pushnil(L); lua_pushstring(L, pSelf->get_error()); return 2; } lua_pushlstring(L, reinterpret_cast(pBuffer), pSelf->get_file_size(iFile)); return 1; } static void l_isofs_list_files_callback(void *p, const char* s) { lua_State *L = reinterpret_cast(p); lua_pushstring(L, s); lua_pushboolean(L, 1); lua_settable(L, 3); } static int l_isofs_list_files(lua_State *L) { iso_filesystem *pSelf = luaT_testuserdata(L); const char* sPath = luaL_checkstring(L, 2); lua_settop(L, 2); lua_newtable(L); pSelf->visit_directory_files(sPath, l_isofs_list_files_callback, L); return 1; } int luaopen_iso_fs(lua_State *L) { lua_settop(L, 1); if(!lua_tostring(L, 1)) { lua_pushliteral(L, "ISO_FS"); lua_replace(L, 1); } // Metatable lua_createtable(L, 0, 2); lua_pushvalue(L, -1); lua_replace(L, luaT_environindex); luaT_pushcclosure(L, luaT_stdgc, 0); lua_setfield(L, -2, "__gc"); // Methods table luaT_pushcclosuretable(L, l_isofs_new, 0); lua_pushvalue(L, -1); lua_setfield(L, -3, "__index"); lua_pushcfunction(L, l_isofs_set_path_separator); lua_setfield(L, -2, "setPathSeparator"); lua_getfield(L, LUA_REGISTRYINDEX, LUA_FILEHANDLE); luaT_pushcclosure(L, l_isofs_set_root, 1); lua_setfield(L, -2, "setRoot"); lua_pushcfunction(L, l_isofs_read_contents); lua_setfield(L, -2, "readContents"); lua_pushcfunction(L, l_isofs_list_files); lua_setfield(L, -2, "listFiles"); lua_pushvalue(L, 1); lua_pushvalue(L, 2); #ifndef LUA_GLOBALSINDEX lua_pushglobaltable(L); lua_insert(L, -3); lua_settable(L, -3); lua_pop(L, 1); #else lua_settable(L, LUA_GLOBALSINDEX); #endif return 1; } CorsixTH-0.63/CorsixTH/Src/iso_fs.h000066400000000000000000000135471347163623700170600ustar00rootroot00000000000000/* Copyright (c) 2010 Peter "Corsix" Cawley 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. */ #include "config.h" #include "th_lua.h" #include //! Layer for reading Theme Hospital files out of an .iso disk image /*! An instance of this class can read files which contain an ISO 9660 file system (as described at http://alumnus.caltech.edu/~pje/iso9660.html and http://www.ecma-international.org/publications/files/ECMA-ST/Ecma-119.pdf) which are typically called iso disk images. Once given a disk image, it searches for the Theme Hospital data files, and can then be used to read these data files. */ class iso_filesystem { public: iso_filesystem(); ~iso_filesystem(); //! Set the character to be used between components in file paths void set_path_separator(char cSeparator); //! Load an .iso disk image and search for Theme Hospital data files /*! \param fRawFile A file handle of an .iso disk image. This handle must remain valid for as long as the IsoFilesystem instance exists, and is not automatically closed by the IsoFilesystem instance. \return true on success, false on failure - call getError() for reason */ bool initialise(FILE* fRawFile); //! Get the reason for the most recent failure /*! Can be called after initialise() or getFileData() return false. */ const char* get_error() const; using file_handle = int; //! Find a file in the loaded .iso disk image /*! If (and only if) the given file could not be found, then isHandleGood() will return false on the returned handle. */ file_handle find_file(const char* sPath) const; //! Iterate all files of the .iso disk image within a given directory /*! \param sPath The directory to iterate \param fnCallback The function to be called for each file. The first parameter to this function is pCallbackData. The second is the name of a file which is in sPath. \param pCallbackData Opaque value to be called to fnCallback. */ void visit_directory_files(const char* sPath, void (*fnCallback)(void*, const char*), void* pCallbackData) const; //! Test if a file handle from findFile() is good or is invalid static inline bool isHandleGood(file_handle x) {return x != 0;} //! Get the size (in bytes) of a file in the loaded .iso disk image /*! \param iFile A file handle returned by findFile() */ uint32_t get_file_size(file_handle iFile) const; //! Get the contents of a file in the loaded .iso disk image /*! \param iFile A file handle returned by findFile() \param pBuffer The buffer to place the resulting data in \return true on success, false on failure - call getError() for reason */ bool get_file_data(file_handle iFile, uint8_t *pBuffer); private: struct file_metadata { char *path; uint32_t sector; uint32_t size; }; FILE* raw_file; char* error; file_metadata* files; size_t file_count; size_t file_table_size; long sector_size; char path_seperator; //! Free any memory in use void clear(); //! Set the last error, printf-style void set_error(const char* sFormat, ...); //! Seek to a logical sector of the disk image bool seek_to_sector(uint32_t iSector); //! Read data from the disk image bool read_data(uint32_t iByteCount, uint8_t *pBuffer); //! Scan the given array of directory entries for a Theme Hospital file /*! \param pDirEnt Pointer to a padded array of ISO 9660 directory entries. \param iDirEntsSize The number of bytes in the directory entry array. \param iLevel The recursion level (used to prevent infinite loops upon maliciously-formed .iso disk images). \return 0 if no Theme Hospital files were found. 1 if the given array contains a Theme Hospital data file. 2 if the given array is the top-level Theme Hospital data directory. Other values otherwise. */ int find_hosp_directory(const uint8_t *pDirEnt, int iDirEntsSize, int iLevel); //! Build the list of Theme Hospital data files /*! \param iSector The ordinal of a logical sector containing a padded arrary of ISO 9660 directory entries. \param iDirEntsSize The number of bytes in the directory entry array. \param sPrefix The path name to prepend to filenames in the directory. */ void build_file_lookup_table(uint32_t iSector, int iDirEntsSize, const char* sPrefix); //! Return the next free entry in files file_metadata* allocate_file_record(); static char normalise(char c); static int filename_compare(const void* lhs, const void* rhs); static void trim_identifier_version(const uint8_t* sIdent, uint8_t& iLength); }; int luaopen_iso_fs(lua_State *L); CorsixTH-0.63/CorsixTH/Src/lua.hpp000066400000000000000000000042471347163623700167140ustar00rootroot00000000000000/* Copyright (c) 2009 Peter "Corsix" Cawley 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. */ #ifndef CORSIX_TH_LUA_HPP_ #define CORSIX_TH_LUA_HPP_ extern "C" { #include #include #include } #if LUA_VERSION_NUM >= 502 // Quick preprocessor fixes to improve compatibility with Lua 5.2 // These definitions will already have been made if Lua 5.2 was compiled // with LUA_COMPAT_ALL defined, but we have no control over this. #ifndef lua_objlen inline size_t lua_objlen(lua_State *L, int idx) { return lua_rawlen(L, idx); } #endif #ifndef lua_equal inline int lua_equal(lua_State *L, int idx1, int idx2) { return lua_compare(L, idx1, idx2, LUA_OPEQ); } #endif #ifndef lua_lessthan inline int lua_lessthan(lua_State *L, int idx1, int idx2) { return lua_compare(L, idx1, idx2, LUA_OPLT); } #endif // Use our own replacements for lua_[sg]etfenv #ifndef lua_setfenv int luaT_setfenv52(lua_State*, int); inline int lua_setfenv(lua_State *L, int n) { return luaT_setfenv52(L, n); } #endif #ifndef lua_getfenv void luaT_getfenv52(lua_State*, int); inline void lua_getfenv(lua_State *L, int n) { luaT_getfenv52(L, n); } #endif #endif // LUA_VERSION_NUM >= 502 #endif // CORSIX_TH_LUA_HPP_ CorsixTH-0.63/CorsixTH/Src/lua_rnc.cpp000066400000000000000000000042551347163623700175500ustar00rootroot00000000000000#include "lua_rnc.h" #include "../../common/rnc.h" #include "th_lua.h" //! Provides lua function to decompress RNC data /*! @param L Lua state where the function is called from. In lua a call to this function has one parameter which is the RNC compressed data. The return value is the decompressed data. */ static int l_decompress(lua_State *L) { size_t inlen; const uint8_t* in = reinterpret_cast(luaL_checklstring(L, 1, &inlen)); // Verify that the data contains an RNC signature, and that the input // size matches the size specified in the data header. if(inlen < rnc_header_size || inlen != rnc_input_size(in)) { lua_pushnil(L); lua_pushliteral(L, "Input is not RNC compressed data"); return 2; } uint32_t outlen = rnc_output_size(in); // Allocate scratch area as Lua userdata so that if something horrible // happens, it'll be cleaned up by Lua's GC. Remember that most Lua API // calls can throw errors, so they all have to be wrapped with code to // detect errors and free the buffer if said buffer was not managed by Lua. void* outbuf = lua_newuserdata(L, outlen); lua_pushnil(L); switch(rnc_unpack(in, (uint8_t*)outbuf)) { case rnc_status::ok: lua_pushlstring(L, (const char*)outbuf, outlen); return 1; case rnc_status::file_is_not_rnc: lua_pushliteral(L, "Input is not RNC compressed data"); break; case rnc_status::huf_decode_error: lua_pushliteral(L, "Invalid Huffman coding"); break; case rnc_status::file_size_mismatch: lua_pushliteral(L, "Size mismatch"); break; case rnc_status::packed_crc_error: lua_pushliteral(L, "Incorrect packed CRC"); break; case rnc_status::unpacked_crc_error: lua_pushliteral(L, "Incorrect unpacked CRC"); break; default: lua_pushliteral(L, "Unknown error decompressing RNC data"); break; } return 2; } static const std::vector rnclib = { {"decompress", l_decompress}, {nullptr, nullptr} }; int luaopen_rnc(lua_State *L) { luaT_register(L, "rnc", rnclib); return 1; } CorsixTH-0.63/CorsixTH/Src/lua_rnc.h000066400000000000000000000001611347163623700172050ustar00rootroot00000000000000#ifndef CORSIX_TH_LUA_RNC #define CORSIX_TH_LUA_RNC #include "th_lua.h" int luaopen_rnc(lua_State *L); #endif CorsixTH-0.63/CorsixTH/Src/lua_sdl.h000066400000000000000000000036701347163623700172150ustar00rootroot00000000000000/* Copyright (c) 2009 Peter "Corsix" Cawley 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. */ #ifndef CORSIX_TH_LUA_SDL_H_ #define CORSIX_TH_LUA_SDL_H_ #include "lua.hpp" #include // SDL event codes used for delivering custom events to l_mainloop in // sdl_core.cpp // SDL_USEREVENT_TICK - informs script of a timer tick #define SDL_USEREVENT_TICK (SDL_USEREVENT + 0) // SDL_USEREVENT_MUSIC_OVER - informs script of SDL_Mixer music finishing #define SDL_USEREVENT_MUSIC_OVER (SDL_USEREVENT + 1) // SDL_USEREVENT_MUSIC_LOADED - informs script that async music is loaded #define SDL_USEREVENT_MUSIC_LOADED (SDL_USEREVENT + 2) // SDL USEREVENT_MOVIE_OVER - informs script of THMovie movie finishing #define SDL_USEREVENT_MOVIE_OVER (SDL_USEREVENT + 3) // SDL_USEREVENT_SOUND_OVER - informs script of a played sound finishing. #define SDL_USEREVENT_SOUND_OVER (SDL_USEREVENT + 4) int luaopen_sdl(lua_State *L); int l_load_music_async_callback(lua_State *L); #endif // CORSIX_TH_LUA_SDL_H_ CorsixTH-0.63/CorsixTH/Src/main.cpp000066400000000000000000000110311347163623700170370ustar00rootroot00000000000000/* Copyright (c) 2009 Peter "Corsix" Cawley 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. */ #include "config.h" #include "lua.hpp" extern "C" { int luaopen_random(lua_State *L); } #include "th_lua.h" #include "lua_rnc.h" #include "lua_sdl.h" #include "persist_lua.h" #include "iso_fs.h" #include #include // Config file checking #ifndef CORSIX_TH_USE_PACK_PRAGMAS #error "config.h is out of date - please rerun CMake" #endif // End of config file checking int lua_main_no_eval(lua_State *L) { // assert(_VERSION == LUA_VERSION) size_t iLength; lua_getglobal(L, "_VERSION"); const char* sVersion = lua_tolstring(L, -1, &iLength); if(iLength != std::strlen(LUA_VERSION) || std::strcmp(sVersion, LUA_VERSION) != 0) { lua_pushliteral(L, "Linked against a version of Lua different to the " "one used when compiling.\nPlease recompile CorsixTH against the " "same Lua version it is linked against."); return lua_error(L); } lua_pop(L, 1); // math.random* = Mersenne twister variant luaT_cpcall(L, luaopen_random, nullptr); // Fill in package.preload table so that calls to require("X") from Lua // will call the appropriate luaopen_X function in C. #define PRELOAD(name, fn) \ luaT_execute(L, "package.preload." name " = ...", fn) PRELOAD("rnc", luaopen_rnc); PRELOAD("TH", luaopen_th); PRELOAD("ISO_FS", luaopen_iso_fs); PRELOAD("persist", luaopen_persist); PRELOAD("sdl", luaopen_sdl); #undef PRELOAD // require "debug" (Harmless in Lua 5.1, useful in 5.2 for compatbility) luaT_execute(L, "require \"debug\""); // Check for --interpreter and run that instead of CorsixTH.lua bool bGotScriptFile = false; int iNArgs = lua_gettop(L); for(int i = 1; i <= iNArgs; ++i) { if(lua_type(L, i) == LUA_TSTRING) { size_t iLen; const char* sCmd = lua_tolstring(L, i, &iLen); if(iLen > 14 && std::memcmp(sCmd, "--interpreter=", 14) == 0) { lua_getglobal(L, "assert"); lua_getglobal(L, "loadfile"); lua_pushlstring(L, sCmd + 14, iLen - 14); bGotScriptFile = true; break; } } } if(!bGotScriptFile) { lua_getglobal(L, "assert"); lua_getglobal(L, "loadfile"); lua_pushstring(L, CORSIX_TH_INTERPRETER_PATH); bGotScriptFile = true; } lua_call(L, 1, 2); lua_call(L, 2, 1); lua_insert(L, 1); return lua_gettop(L); } int lua_main(lua_State *L) { lua_call(L, lua_main_no_eval(L) - 1, LUA_MULTRET); return lua_gettop(L); } int lua_stacktrace(lua_State *L) { // err = tostring(err) lua_settop(L, 1); lua_getglobal(L, "tostring"); lua_insert(L, 1); lua_call(L, 1, 1); // err = .. err lua_pushliteral(L, "An error has occurred in CorsixTH:\n"); lua_insert(L, 1); lua_concat(L, 2); // return debug.traceback(err, 2) lua_getglobal(L, "debug"); lua_getfield(L, -1, "traceback"); lua_pushvalue(L, 1); lua_pushinteger(L, 2); lua_call(L, 2, 1); return 1; } int lua_panic(lua_State *L) { std::fprintf(stderr, "A Lua error has occurred in CorsixTH outside of protected " "mode!!\n"); std::fflush(stderr); if(lua_type(L, -1) == LUA_TSTRING) std::fprintf(stderr, "%s\n", lua_tostring(L, -1)); else std::fprintf(stderr, "%p\n", lua_topointer(L, -1)); std::fflush(stderr); // A stack trace would be nice, but they cannot be done in a panic. return 0; } CorsixTH-0.63/CorsixTH/Src/main.h000066400000000000000000000045211347163623700165120ustar00rootroot00000000000000/* Copyright (c) 2010 Peter "Corsix" Cawley 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. */ #ifndef CORSIX_TH_MAIN_H_ #define CORSIX_TH_MAIN_H_ #include "lua.hpp" #ifdef CORSIX_TH_USE_VLD #include #endif //! Lua mode entry point /*! Performs the Lua initialisation tasks which have to be done in C, and then transfers control to CorsixTH.lua as soon as possible (so that as little as possible behaviour is hardcoded into C rather than Lua). */ int lua_main(lua_State *L); //! Alternative lua mode entry point /*! Behaves like CorsixTH_lua_main, except that it doesn't transfer control over to Lua scripts - it just prepares everything for them and loads them. */ int lua_main_no_eval(lua_State *L); //! Process a caught error before returning it to the caller /*! Processing of the error message is done here so that a stack trace can be added before the stack is unwound, and so that if an error occurs while processing the error, the caller receives LUA_ERRERR rather than panicking while processing it itself. */ int lua_stacktrace(lua_State *L); //! Process an uncaught Lua error before aborting /*! Lua errors shouldn't occur outside of protected mode, and there isn't much which can be done when they do, but at least the user should be informed, and the error message printed. */ int lua_panic(lua_State *L); #endif // CORSIX_TH_MAIN_H_ CorsixTH-0.63/CorsixTH/Src/persist_lua.cpp000066400000000000000000001400011347163623700204450ustar00rootroot00000000000000/* Copyright (c) 2010 Peter "Corsix" Cawley 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. */ #include "persist_lua.h" #include #include #include #include #include #include #include #ifdef _MSC_VER #pragma warning(disable: 4996) // Disable "std::strcpy unsafe" warnings under MSVC #endif enum persist_type { // LUA_TNIL = 0, // LUA_TBOOLEAN, // Used for false // LUA_TLIGHTUSERDATA, // Not currently persisted // LUA_TNUMBER, // LUA_TSTRING, // LUA_TTABLE, // Used for tables without metatables // LUA_TFUNCTION, // Used for Lua closures // LUA_TUSERDATA, // LUA_TTHREAD, // Not currently persisted PERSIST_TPERMANENT = LUA_TTHREAD + 1, PERSIST_TTRUE, PERSIST_TTABLE_WITH_META, PERSIST_TINTEGER, PERSIST_TPROTOTYPE, PERSIST_TRESERVED1, // Not currently used PERSIST_TRESERVED2, // Not currently used PERSIST_TCOUNT, // must equal 16 (for compatibility) }; static int l_writer_mt_index(lua_State *L); template static int l_crude_gc(lua_State *L) { // This __gc metamethod does not verify that the given value is the correct // type of userdata, or that the value is userdata at all. reinterpret_cast(lua_touserdata(L, 1))->~T(); return 0; }; //! Structure for loading multiple strings as a Lua chunk, avoiding concatenation /*! luaL_loadbuffer() is a good way to load a string as a Lua chunk. If there are several strings which need to be concatenated before being loaded, then it can be more efficient to use this structure, which can load them without concatenating them. Sample usage is: load_multi_buffer ls; ls.s[0] = lua_tolstring(L, -2, &ls.i[0]); ls.s[1] = lua_tolstring(L, -1, &ls.i[1]); lua_load(L, LoadMultiBuffer_t::load_fn, &ls, "chunk name"); */ class load_multi_buffer { public: const char *s[3]; size_t i[3]; int n; load_multi_buffer() { s[0] = s[1] = s[2] = nullptr; i[0] = i[1] = i[2] = 0; n = 0; } static const char* load_fn(lua_State *L, void *ud, size_t *size) { load_multi_buffer *pThis = reinterpret_cast(ud); for( ; pThis->n < 3; ++pThis->n) { if(pThis->i[pThis->n] != 0) { *size = pThis->i[pThis->n]; return pThis->s[pThis->n++]; } } *size = 0; return nullptr; } }; //! Basic implementation of persistance interface /*! self - Instance of lua_persist_basic_writer allocated as a Lua userdata self metatable: __gc - ~lua_persist_basic_writer (via l_crude_gc) ":" - [1] - pre-populated prototype persistance names ":" - "" err - an object which could not be persisted self environment: - [1] - permanents table self environment metatable: __index - writeObjectRaw (via l_writer_mt_index) upvalue 1 - permanents table upvalue 2 - self */ class lua_persist_basic_writer : public lua_persist_writer { public: lua_persist_basic_writer(lua_State *L) : L(L), data() { } ~lua_persist_basic_writer() { } lua_State* get_stack() override { return L; } void init() { lua_createtable(L, 1, 8); // Environment lua_pushvalue(L, 2); // Permanent objects lua_rawseti(L, -2, 1); lua_createtable(L, 1, 0); // Environment metatable lua_pushvalue(L, 2); // Permanent objects lua_pushvalue(L, 1); // self luaT_pushcclosure(L, l_writer_mt_index, 2); lua_setfield(L, -2, "__index"); lua_setmetatable(L, -2); lua_setfenv(L, 1); lua_createtable(L, 1, 4); // Metatable luaT_pushcclosure(L, l_crude_gc, 0); lua_setfield(L, -2, "__gc"); lua_pushvalue(L, luaT_upvalueindex(1)); // Prototype persistance names lua_rawseti(L, -2, 1); lua_setmetatable(L, 1); next_index = 1; data_size = 0; had_error = false; } int finish() { if(get_error() != nullptr) { lua_pushnil(L); lua_pushstring(L, get_error()); lua_getmetatable(L, 1); lua_getfield(L, -1, "err"); lua_replace(L, -2); return 3; } else { lua_pushlstring(L, data.c_str(), data.length()); return 1; } } void fast_write_stack_object(int iIndex) override { if(lua_type(L, iIndex) != LUA_TUSERDATA) { write_stack_object(iIndex); return; } // Convert index from relative to absolute if(iIndex < 0 && iIndex > LUA_REGISTRYINDEX) iIndex = lua_gettop(L) + 1 + iIndex; // Check for no cycle lua_getfenv(L, 1); lua_pushvalue(L, iIndex); lua_rawget(L, -2); lua_rawgeti(L, -2, 1); lua_pushvalue(L, iIndex); lua_gettable(L, -2); lua_replace(L, -2); if(!lua_isnil(L, -1) || !lua_isnil(L, -2)) { lua_pop(L, 3); write_stack_object(iIndex); return; } lua_pop(L, 2); // Save the index to the cache lua_pushvalue(L, iIndex); lua_pushnumber(L, (lua_Number)(next_index++)); lua_settable(L, -3); if(!check_that_userdata_can_be_depersisted(iIndex)) return; // Write type, metatable, and then environment uint8_t iType = LUA_TUSERDATA; write_byte_stream(&iType, 1); write_stack_object(-1); lua_getfenv(L, iIndex); write_stack_object(-1); lua_pop(L, 1); // Write the raw data if(lua_type(L, -1) == LUA_TTABLE) { lua_getfield(L, -1, "__persist"); if(lua_isnil(L, -1)) lua_pop(L, 1); else { lua_pushvalue(L, iIndex); lua_checkstack(L, 20); lua_CFunction fn = lua_tocfunction(L, -2); fn(L); lua_pop(L, 2); } } write_uint((uint64_t)0x42); // sync marker lua_pop(L, 1); } void write_stack_object(int iIndex) override { // Convert index from relative to absolute if(iIndex < 0 && iIndex > LUA_REGISTRYINDEX) iIndex = lua_gettop(L) + 1 + iIndex; // Basic types always have their value written int iType = lua_type(L, iIndex); if(iType == LUA_TNIL || iType == LUA_TNONE) { uint8_t iByte = LUA_TNIL; write_byte_stream(&iByte, 1); } else if(iType == LUA_TBOOLEAN) { uint8_t iByte; if(lua_toboolean(L, iIndex)) iByte = PERSIST_TTRUE; else iByte = LUA_TBOOLEAN; write_byte_stream(&iByte, 1); } else if(iType == LUA_TNUMBER) { double fValue = lua_tonumber(L, iIndex); if(floor(fValue) == fValue && 0.0 <= fValue && fValue <= 16383.0) { // Small integers are written as just a few bytes // NB: 16383 = 2^14-1, which is the maximum value which // can fit into two bytes of VUInt. uint8_t iByte = PERSIST_TINTEGER; write_byte_stream(&iByte, 1); uint16_t iValue = (uint16_t)fValue; write_uint(iValue); } else { // Other numbers are written as an 8 byte double uint8_t iByte = LUA_TNUMBER; write_byte_stream(&iByte, 1); write_byte_stream(reinterpret_cast(&fValue), sizeof(double)); } } else { // Complex values are cached, and are only written once (if this weren't // done, then cycles in the object graph would break things). lua_getfenv(L, 1); lua_pushvalue(L, iIndex); lua_gettable(L, -2); // Might (indirectly) call writeObjectRaw uint64_t iValue = (uint64_t)lua_tonumber(L, -1); lua_pop(L, 2); if(iValue != 0) { // If the value has not previously been written, then writeObjectRaw // would have been called, and the appropriate data written, and 0 // would be returned. Otherwise, the index would be returned, which // we offset by the number of types, and then write. write_uint(iValue + PERSIST_TCOUNT - 1); } } } int write_object_raw() { uint8_t iType; // Save the index to the cache lua_pushvalue(L, 2); lua_pushnumber(L, (lua_Number)(next_index++)); lua_settable(L, 1); // Lookup the object in the permanents table lua_pushvalue(L, 2); lua_gettable(L, luaT_upvalueindex(1)); if(lua_type(L, -1) != LUA_TNIL) { // Object is in the permanents table. uint8_t iType = PERSIST_TPERMANENT; write_byte_stream(&iType, 1); // Replace self's environment with self (for call to writeStackObject) lua_pushvalue(L, luaT_upvalueindex(2)); lua_replace(L, 1); // Write the key corresponding to the permanent object write_stack_object(-1); } else { // Object is not in the permanents table. lua_pop(L, 1); switch(lua_type(L, 2)) { // LUA_TNIL handled in writeStackObject // LUA_TBOOLEAN handled in writeStackObject // LUA_TNUMBER handled in writeStackObject case LUA_TSTRING: { iType = LUA_TSTRING; write_byte_stream(&iType, 1); // Strings are simple: length and then bytes (not null terminated) size_t iLength; const char *sString = lua_tolstring(L, 2, &iLength); write_uint(iLength); write_byte_stream(reinterpret_cast(sString), iLength); break; } case LUA_TTABLE: { // Replace self's environment with self (for calls to writeStackObject) lua_pushvalue(L, luaT_upvalueindex(2)); lua_replace(L, 1); // Save env and insert prior to table lua_getfenv(L, 1); lua_insert(L, 2); int iTable = 3; table_reentry: // Handle the metatable if(lua_getmetatable(L, iTable)) { iType = PERSIST_TTABLE_WITH_META; write_byte_stream(&iType, 1); write_stack_object(-1); lua_pop(L, 1); } else { iType = LUA_TTABLE; write_byte_stream(&iType, 1); } // Write the children as key, value pairs lua_pushnil(L); while(lua_next(L, iTable)) { write_stack_object(-2); // The naive thing to do now would be writeStackObject(-1) // but this can easily lead to Lua's C call stack limit // being hit. To reduce the likelihood of this happening, // we check to see if about to write another table. if(lua_type(L, -1) == LUA_TTABLE) { lua_pushvalue(L, -1); lua_rawget(L, 2); lua_pushvalue(L, -2); lua_gettable(L, luaT_upvalueindex(1)); if(lua_isnil(L, -1) && lua_isnil(L, -2)) { lua_pop(L, 2); lua_checkstack(L, 10); iTable += 2; lua_pushvalue(L, iTable); lua_pushnumber(L, (lua_Number)(next_index++)); lua_settable(L, 2); goto table_reentry; table_resume: iTable -= 2; } else { lua_pop(L, 2); write_stack_object(-1); } } else write_stack_object(-1); lua_pop(L, 1); } // Write a nil to mark the end of the children (as nil is the // only value which cannot be used as a key in a table). iType = LUA_TNIL; write_byte_stream(&iType, 1); if(iTable != 3) goto table_resume; break; } case LUA_TFUNCTION: if(lua_iscfunction(L, 2)) { set_error_object(2); set_error("Cannot persist C functions"); } else { iType = LUA_TFUNCTION; write_byte_stream(&iType, 1); // Replace self's environment with self (for calls to writeStackObject) lua_pushvalue(L, luaT_upvalueindex(2)); lua_replace(L, 1); // Write the prototype (the part of a function which is common across // multiple closures - see LClosure / Proto in Lua's lobject.h). lua_Debug proto_info; lua_pushvalue(L, 2); lua_getinfo(L, ">Su", &proto_info); write_prototype(&proto_info, 2); // Write the values of the upvalues // If available, also write the upvalue IDs (so that in // the future, we could hypothetically rejoin shared // upvalues). An ID is just an opaque sequence of bytes. write_uint(proto_info.nups); #if LUA_VERSION_NUM >= 502 write_uint(sizeof(void*)); #else write_uint(0); #endif for(int i = 1; i <= proto_info.nups; ++i) { lua_getupvalue(L, 2, i); write_stack_object(-1); #if LUA_VERSION_NUM >= 502 void *pUpvalueID = lua_upvalueid(L, 2, i); write_byte_stream((uint8_t*)&pUpvalueID, sizeof(void*)); #endif } // Write the environment table lua_getfenv(L, 2); write_stack_object(-1); lua_pop(L, 1); } break; case LUA_TUSERDATA: if(!check_that_userdata_can_be_depersisted(2)) break; // Replace self's environment with self (for calls to writeStackObject) lua_pushvalue(L, luaT_upvalueindex(2)); lua_replace(L, 1); // Write type, metatable, and then environment iType = LUA_TUSERDATA; write_byte_stream(&iType, 1); write_stack_object(-1); lua_getfenv(L, 2); write_stack_object(-1); lua_pop(L, 1); // Write the raw data if(lua_type(L, -1) == LUA_TTABLE) { lua_getfield(L, -1, "__persist"); if(lua_isnil(L, -1)) lua_pop(L, 1); else { lua_pushvalue(L, 2); lua_pushvalue(L, luaT_upvalueindex(2)); lua_call(L, 2, 0); } } write_uint((uint64_t)0x42); // sync marker break; default: set_error(lua_pushfstring(L, "Cannot persist %s values", luaL_typename(L, 2))); break; } } lua_pushnumber(L, 0); return 1; } bool check_that_userdata_can_be_depersisted(int iIndex) { if(lua_getmetatable(L, iIndex)) { lua_getfield(L, -1, "__depersist_size"); if(lua_isnumber(L, -1)) { if(static_cast(lua_tointeger(L, -1)) != static_cast(lua_objlen(L, iIndex))) { set_error(lua_pushfstring(L, "__depersist_size is " "incorrect (%d vs. %d)", (int)lua_objlen(L, iIndex), (int)lua_tointeger(L, -1))); return false; } if(lua_objlen(L, iIndex) != 0) { lua_getfield(L, -2, "__persist"); lua_getfield(L, -3, "__depersist"); if(lua_isnil(L, -1) || lua_isnil(L, -2)) { set_error("Can only persist non-empty userdata" " if they have __persist and __depersist " "metamethods"); return false; } lua_pop(L, 2); } } else { if(lua_objlen(L, iIndex) != 0) { set_error("Can only persist non-empty userdata if " "they have a __depersist_size metafield"); return false; } } lua_pop(L, 1); } else { if(lua_objlen(L, iIndex) != 0) { set_error("Can only persist userdata without a metatable" " if their size is zero"); return false; } lua_pushnil(L); } return true; } void write_prototype(lua_Debug *pProtoInfo, int iInstanceIndex) { // Sanity checks if(pProtoInfo->source[0] != '@') { // @ denotes that the source was a file // (http://www.lua.org/manual/5.1/manual.html#lua_Debug) set_error("Can only persist Lua functions defined in source files"); return; } if(std::strcmp(pProtoInfo->what, "Lua") != 0) { // what == "C" should have been caught by writeObjectRaw(). // what == "tail" should be impossible. // Hence "Lua" and "main" should be the only values seen. // NB: Chunks are not functions defined *in* source files, because // chunks *are* source files. set_error(lua_pushfstring(L, "Cannot persist entire Lua chunks (%s)", pProtoInfo->source + 1)); lua_pop(L, 1); return; } // Attempt cached lookup (prototypes are not publicly visible Lua objects, // and hence cannot be cached in the normal way of self's environment). lua_getmetatable(L, 1); lua_pushfstring(L, "%s:%d", pProtoInfo->source + 1, pProtoInfo->linedefined); lua_pushvalue(L, -1); lua_rawget(L, -3); if(!lua_isnil(L, -1)) { uint64_t iValue = (uint64_t)lua_tonumber(L, -1); lua_pop(L, 3); write_uint(iValue + PERSIST_TCOUNT - 1); return; } lua_pop(L, 1); lua_pushvalue(L, -1); lua_pushnumber(L, (lua_Number)next_index++); lua_rawset(L, -4); uint8_t iType = PERSIST_TPROTOTYPE; write_byte_stream(&iType, 1); // Write upvalue names write_uint(pProtoInfo->nups); for(int i = 1; i <= pProtoInfo->nups; ++i) { lua_pushstring(L, lua_getupvalue(L, iInstanceIndex, i)); write_stack_object(-1); lua_pop(L, 2); } // Write the function's persist name lua_rawgeti(L, -2, 1); lua_replace(L, -3); lua_rawget(L, -2); if(lua_isnil(L, -1)) { set_error(lua_pushfstring(L, "Lua functions must be given a unique " "persistable name in order to be persisted (attempt to persist" " %s:%d)", pProtoInfo->source + 1, pProtoInfo->linedefined)); lua_pop(L, 2); return; } write_stack_object(-1); lua_pop(L, 2); } void write_byte_stream(const uint8_t *pBytes, size_t iCount) override { if(had_error) { // If an error occurred, then silently fail to write any // data. return; } data.append(reinterpret_cast(pBytes), iCount); } void set_error(const char *sError) override { // If multiple errors occur, only record the first. if (had_error) { return; } had_error = true; // Use the written data buffer to store the error message data.assign(sError); } void set_error_object(int iStackObject) { if(had_error) return; lua_pushvalue(L, iStackObject); lua_getmetatable(L, luaT_upvalueindex(2)); lua_insert(L, -2); lua_setfield(L, -2, "err"); lua_pop(L, 1); } const char* get_error() { if(had_error) return data.c_str(); else return nullptr; } private: lua_State *L; uint64_t next_index; std::string data; size_t data_size; bool had_error; }; static int l_writer_mt_index(lua_State *L) { return reinterpret_cast( lua_touserdata(L, luaT_upvalueindex(2)))->write_object_raw(); } //! Basic implementation of depersistance interface /*! self - Instance of lua_persist_basic_reader allocated as a Lua userdata self environment: [-3] - self [-2] - pre-populated prototype persistance code "" - "" [-1] - pre-populated prototype persistance filenames "" - "" [ 0] - permanents table - self metatable: __gc - ~lua_persist_basic_reader (via l_crude_gc) - */ class lua_persist_basic_reader : public lua_persist_reader { public: lua_persist_basic_reader(lua_State *L) : L(L), string_buffer() { } ~lua_persist_basic_reader() { } lua_State* get_stack() override { return L; } void set_error(const char *sError) override { had_error = true; string_buffer.assign(sError); } void init(const uint8_t *pData, size_t iLength) { data = pData; data_buffer_size = iLength; next_index = 1; had_error = false; lua_createtable(L, 32, 0); // Environment lua_pushvalue(L, 2); lua_rawseti(L, -2, 0); lua_pushvalue(L, luaT_upvalueindex(1)); lua_rawseti(L, -2, -1); lua_pushvalue(L, luaT_upvalueindex(2)); lua_rawseti(L, -2, -2); lua_pushvalue(L, 1); lua_rawseti(L, -2, -3); lua_setfenv(L, 1); lua_createtable(L, 0, 1); // Metatable luaT_pushcclosure(L, l_crude_gc, 0); lua_setfield(L, -2, "__gc"); lua_setmetatable(L, 1); } bool read_stack_object() override { uint64_t iIndex; if(!read_uint(iIndex)) { set_error("Expected stack object"); return false; } if(lua_type(L, 1) != LUA_TTABLE) { // Ensure that index #1 is self environment lua_getfenv(L, 1); lua_replace(L, 1); } if(iIndex >= PERSIST_TCOUNT) { iIndex += 1 - PERSIST_TCOUNT; if(iIndex < (uint64_t)INT_MAX) lua_rawgeti(L, 1, (int)iIndex); else { lua_pushnumber(L, (lua_Number)iIndex); lua_rawget(L, 1); } if(lua_isnil(L, -1)) { set_error("Cycle while depersisting permanent object key or userdata metatable"); return false; } } else { uint8_t iType = (uint8_t)iIndex; switch(iType) { case LUA_TNIL: lua_pushnil(L); break; case PERSIST_TPERMANENT: { uint64_t iOldIndex = next_index; ++next_index; // Temporary marker lua_rawgeti(L, 1, 0); // Permanents table if(!read_stack_object()) return false; lua_gettable(L, -2); lua_replace(L, -2); // Replace marker with actual object uint64_t iNewIndex = next_index; next_index = iOldIndex; save_stack_object(); next_index = iNewIndex; break; } case LUA_TBOOLEAN: lua_pushboolean(L, 0); break; case PERSIST_TTRUE: lua_pushboolean(L, 1); break; case LUA_TSTRING: { size_t iLength; if(!read_uint(iLength)) return false; if(!read_byte_stream(string_buffer, iLength)) return false; lua_pushlstring(L, string_buffer.c_str(), string_buffer.length()); save_stack_object(); break; } case LUA_TTABLE: lua_newtable(L); save_stack_object(); if(!lua_checkstack(L, 8)) return false; if(!read_table_contents()) return false; break; case PERSIST_TTABLE_WITH_META: lua_newtable(L); save_stack_object(); if(!lua_checkstack(L, 8)) return false; if(!read_stack_object()) return false; lua_setmetatable(L, -2); if(!read_table_contents()) return false; break; case LUA_TNUMBER: { double fValue; if(!read_byte_stream(reinterpret_cast(&fValue), sizeof(double))) return false; lua_pushnumber(L, fValue); break; } case LUA_TFUNCTION: { if(!lua_checkstack(L, 8)) return false; uint64_t iOldIndex = next_index; ++next_index; // Temporary marker if(!read_stack_object()) return false; lua_call(L, 0, 2); // Replace marker with closure uint64_t iNewIndex = next_index; next_index = iOldIndex; save_stack_object(); next_index = iNewIndex; // Set upvalues lua_insert(L, -2); int iNups, i; if(!read_uint(iNups)) return false; size_t iIDSize; if(!read_uint(iIDSize)) return false; for(i = 0; i < iNups; ++i) { if(!read_stack_object()) return false; // For now, just skip over the upvalue IDs. In the future, // the ID may be used to rejoin shared upvalues. if(!read_byte_stream(nullptr, iIDSize)) return false; } lua_call(L, iNups, 0); // Read environment if(!read_stack_object()) return false; lua_setfenv(L, -2); break; } case PERSIST_TPROTOTYPE: { if(!lua_checkstack(L, 8)) return false; uint64_t iOldIndex = next_index; ++next_index; // Temporary marker int iNups; if(!read_uint(iNups)) return false; if(iNups == 0) lua_pushliteral(L, "return function() end,"); else { lua_pushliteral(L, "local "); lua_checkstack(L, (iNups + 1) * 2); for(int i = 0; i < iNups; ++i) { if(i != 0) lua_pushliteral(L, ","); if(!read_stack_object()) return false; if(lua_type(L, -1) != LUA_TSTRING) { set_error("Upvalue name not a string"); return false; } } lua_concat(L, iNups * 2 - 1); lua_pushliteral(L, ";return function(...)"); lua_pushvalue(L, -2); lua_pushliteral(L, "=...end,"); lua_concat(L, 5); } // Fetch name and then lookup filename and code if(!read_stack_object()) return false; lua_pushliteral(L, "@"); lua_rawgeti(L, 1, -1); lua_pushvalue(L, -3); lua_gettable(L, -2); lua_replace(L, -2); if(lua_isnil(L, -1)) { set_error(lua_pushfstring(L, "Unable to depersist prototype" " \'%s\'", lua_tostring(L, -3))); return false; } lua_concat(L, 2); // Prepend the @ to the filename lua_rawgeti(L, 1, -2); lua_pushvalue(L, -3); lua_gettable(L, -2); lua_replace(L, -2); lua_remove(L, -3); // Construct the closure factory load_multi_buffer ls; ls.s[0] = lua_tolstring(L, -3, &ls.i[0]); ls.s[1] = lua_tolstring(L, -1, &ls.i[1]); if(luaT_load(L, load_multi_buffer::load_fn, &ls, lua_tostring(L, -2), "bt") != 0) { // Should never happen lua_error(L); return false; } lua_replace(L, -4); lua_pop(L, 2); // Replace marker with closure factory uint64_t iNewIndex = next_index; next_index = iOldIndex; save_stack_object(); next_index = iNewIndex; break; } case LUA_TUSERDATA: { bool bHasSetMetatable = false; uint64_t iOldIndex = next_index; ++next_index; // Temporary marker // Read metatable if(!read_stack_object()) return false; lua_getfield(L, -1, "__depersist_size"); if(!lua_isnumber(L, -1)) { set_error("Userdata missing __depersist_size metafield"); return false; } lua_newuserdata(L, (size_t)lua_tonumber(L, -1)); lua_replace(L, -2); // Replace marker with userdata uint64_t iNewIndex = next_index; next_index = iOldIndex; save_stack_object(); next_index = iNewIndex; // Perform immediate initialisation lua_getfield(L, -2, "__pre_depersist"); if(lua_isnil(L, -1)) lua_pop(L, 1); else { // Set metatable now, as pre-depersister may expect it // NB: Setting metatable if there isn't a pre-depersister // is not a good idea, as if there is an error while the // environment table is being de-persisted, then the __gc // handler of the userdata will eventually be called with // the userdata's contents still being uninitialised. lua_pushvalue(L, -3); lua_setmetatable(L, -3); bHasSetMetatable = true; lua_pushvalue(L, -2); lua_call(L, 1, 0); } // Read environment if(!read_stack_object()) return false; lua_setfenv(L, -2); // Set metatable and read the raw data if(!bHasSetMetatable) { lua_pushvalue(L, -2); lua_setmetatable(L, -2); } lua_getfield(L, -2, "__depersist"); if(lua_isnil(L, -1)) lua_pop(L, 1); else { lua_pushvalue(L, -2); lua_rawgeti(L, 1, -3); lua_call(L, 2, 1); if(lua_toboolean(L, -1) != 0) { lua_pop(L, 1); lua_rawgeti(L, 1, -3); lua_getmetatable(L, -1); lua_replace(L, -2); lua_pushvalue(L, -2); lua_rawseti(L, -2, (int)lua_objlen(L, -2) + 1); } lua_pop(L, 1); } lua_replace(L, -2); uint64_t iSyncMarker; if(!read_uint(iSyncMarker)) return false; if(iSyncMarker != 0x42) { set_error("sync fail"); return false; } break; } case PERSIST_TINTEGER: { uint16_t iValue; if(!read_uint(iValue)) return false; lua_pushinteger(L, iValue); break; } default: lua_pushliteral(L, "Unable to depersist values of type \'"); if(iType <= LUA_TTHREAD) lua_pushstring(L, lua_typename(L, iType)); else { switch(iType) { case PERSIST_TPERMANENT: lua_pushliteral(L, "permanent"); break; case PERSIST_TTRUE: lua_pushliteral(L, "boolean-true"); break; case PERSIST_TTABLE_WITH_META: lua_pushliteral(L, "table-with-metatable"); break; case PERSIST_TINTEGER: lua_pushliteral(L, "integer"); break; case PERSIST_TPROTOTYPE: lua_pushliteral(L, "prototype"); break; case PERSIST_TRESERVED1: lua_pushliteral(L, "reserved1"); break; case PERSIST_TRESERVED2: lua_pushliteral(L, "reserved2"); break; } } lua_pushliteral(L, "\'"); lua_concat(L, 3); set_error(lua_tostring(L, -1)); lua_pop(L, 1); return false; } } return true; } void save_stack_object() { if(next_index < (uint64_t)INT_MAX) { lua_pushvalue(L, -1); lua_rawseti(L, 1, (int)next_index); } else { lua_pushnumber(L, (lua_Number)next_index); lua_pushvalue(L, -2); lua_rawset(L, 1); } ++next_index; } bool read_table_contents() { while(true) { if(!read_stack_object()) return false; if(lua_type(L, -1) == LUA_TNIL) { lua_pop(L, 1); return true; } if(!read_stack_object()) return false; // NB: lua_rawset used rather than lua_settable to avoid invoking // any metamethods, as they may not have been designed to be called // during depersistance. lua_rawset(L, -3); } } bool finish() { // Ensure that all data has been read if(data_buffer_size != 0) { set_error(lua_pushfstring(L, "%d bytes of data remain unpersisted", (int)data_buffer_size)); return false; } // Ensure that index #1 is self environment if(lua_type(L, 1) != LUA_TTABLE) { lua_getfenv(L, 1); lua_replace(L, 1); } // Ensure that index #1 is self metatable lua_rawgeti(L, 1, -3); lua_getmetatable(L, -1); lua_replace(L, 1); lua_pop(L, 1); // Call all the __depersist functions which need a 2nd call int iNumCalls = (int)lua_objlen(L, 1); for(int i = 1; i <= iNumCalls; ++i) { lua_rawgeti(L, 1, i); luaL_getmetafield(L, -1, "__depersist"); lua_insert(L, -2); lua_call(L, 1, 0); } return true; } bool read_byte_stream(uint8_t *pBytes, size_t iCount) override { if(iCount > data_buffer_size) { set_error(lua_pushfstring(L, "End of input reached while attempting to read %d byte%s", (int)iCount, iCount == 1 ? "" : "s")); lua_pop(L, 1); return false; } if(pBytes != nullptr) std::memcpy(pBytes, data, iCount); data += iCount; data_buffer_size -= iCount; return true; } bool read_byte_stream(std::string& bytes, size_t iCount) { if(iCount > data_buffer_size) { set_error(lua_pushfstring(L, "End of input reached while attempting to read %d byte%s", (int)iCount, iCount == 1 ? "" : "s")); lua_pop(L, 1); return false; } bytes.assign(reinterpret_cast(data), iCount); data += iCount; data_buffer_size -= iCount; return true; } const uint8_t* get_pointer() {return data;} uint64_t get_object_count() {return next_index;} const char* get_error() { if(had_error) return string_buffer.c_str(); else return nullptr; } private: lua_State *L; uint64_t next_index; const uint8_t* data; size_t data_buffer_size; std::string string_buffer; bool had_error; }; static int l_dump_toplevel(lua_State *L) { luaL_checktype(L, 2, LUA_TTABLE); lua_settop(L, 2); lua_pushvalue(L, 1); lua_persist_basic_writer *pWriter = new (lua_newuserdata(L, sizeof(lua_persist_basic_writer))) lua_persist_basic_writer(L); lua_replace(L, 1); pWriter->init(); pWriter->write_stack_object(3); return pWriter->finish(); } static int l_load_toplevel(lua_State *L) { size_t iDataLength; const uint8_t *pData = luaT_checkfile(L, 1, &iDataLength); luaL_checktype(L, 2, LUA_TTABLE); lua_settop(L, 2); lua_pushvalue(L, 1); lua_persist_basic_reader *pReader = new (lua_newuserdata(L, sizeof(lua_persist_basic_reader))) lua_persist_basic_reader(L); lua_replace(L, 1); pReader->init(pData, iDataLength); if(!pReader->read_stack_object() || !pReader->finish()) { int iNumObjects = (int)pReader->get_object_count(); int iNumBytes = (int)(pReader->get_pointer() - pData); lua_pushnil(L); lua_pushfstring(L, "%s after %d objects (%d bytes)", pReader->get_error() ? pReader->get_error() : "Error while depersisting", iNumObjects, iNumBytes); return 2; } else { return 1; } } static int calculate_line_number(const char *sStart, const char *sPosition) { int iLine = 1; for(; sStart != sPosition; ++sStart) { switch(sStart[0]) { case '\0': return -1; // error return value case '\n': ++iLine; if(sStart[1] == '\r') ++sStart; break; case '\r': ++iLine; if(sStart[1] == '\n') ++sStart; break; } } return iLine; } static const char* find_function_end(lua_State *L, const char* sStart) { const char* sEnd = sStart; while(sEnd) { sEnd = std::strstr(sEnd, "end"); if(sEnd) { sEnd += 3; load_multi_buffer ls; ls.s[0] = "return function"; ls.i[0] = sizeof("return function") - 1; ls.s[1] = sStart; ls.i[1] = sEnd - sStart; if(luaT_load(L, load_multi_buffer::load_fn, &ls, "", "bt") == 0) { lua_pop(L, 1); return sEnd; } lua_pop(L, 1); } } return nullptr; } static int l_persist_dofile(lua_State *L) { const char *sFilename = luaL_checkstring(L, 1); lua_settop(L, 1); // Read entire file into memory FILE *fFile = std::fopen(sFilename, "r"); if(fFile == nullptr) { const char *sError =std::strerror(errno); return luaL_error(L, "cannot open %s: %s", sFilename, sError); } size_t iBufferSize = lua_objlen(L, luaT_upvalueindex(1)); size_t iBufferUsed = 0; while(!std::feof(fFile)) { iBufferUsed += std::fread(reinterpret_cast(lua_touserdata(L, luaT_upvalueindex(1))) + iBufferUsed, 1, iBufferSize - iBufferUsed, fFile); if(iBufferUsed == iBufferSize) { iBufferSize *= 2; std::memcpy(lua_newuserdata(L, iBufferSize), lua_touserdata(L, luaT_upvalueindex(1)), iBufferUsed); lua_replace(L, luaT_upvalueindex(1)); } else break; } int iStatus = std::ferror(fFile); std::fclose(fFile); if(iStatus) { const char *sError =std::strerror(errno); return luaL_error(L, "cannot read %s: %s", sFilename, sError); } // Check file char *sFile = reinterpret_cast(lua_touserdata(L, luaT_upvalueindex(1))); sFile[iBufferUsed] = 0; if(sFile[0] == '#') { do { ++sFile; --iBufferUsed; } while(sFile[0] != 0 && sFile[0] != '\r' && sFile[0] != '\n'); } if(sFile[0] == LUA_SIGNATURE[0]) { return luaL_error(L, "cannot load %s: compiled files not permitted", sFilename); } // Load and do file lua_pushliteral(L, "@"); lua_pushvalue(L, 1); lua_concat(L, 2); if(luaL_loadbuffer(L, sFile, iBufferUsed, lua_tostring(L, -1)) != 0) return lua_error(L); lua_remove(L, -2); int iBufferCopyIndex = lua_gettop(L); std::memcpy(lua_newuserdata(L, iBufferUsed + 1), sFile, iBufferUsed + 1); lua_insert(L, -2); lua_call(L, 0, LUA_MULTRET); sFile = reinterpret_cast(lua_touserdata(L, luaT_upvalueindex(1))); std::memcpy(sFile, lua_touserdata(L, iBufferCopyIndex), iBufferUsed + 1); lua_remove(L, iBufferCopyIndex); // Extract persistable functions const char *sPosition = sFile; while(true) { sPosition = std::strstr(sPosition, "--[[persistable:"); if(!sPosition) break; sPosition += 16; const char *sNameEnd = std::strstr(sPosition, "]]"); if(sNameEnd) { int iLineNumber = calculate_line_number(sFile, sNameEnd); const char *sFunctionArgs = std::strchr(sNameEnd + 2, '('); const char *sFunctionEnd = find_function_end(L, sFunctionArgs); if((sNameEnd - sPosition) == 1 && *sPosition == ':') { // --[[persistable::]] means take the existing name of the function sPosition = std::strstr(sNameEnd, "function") + 8; sPosition += std::strspn(sPosition, " \t"); sNameEnd = sFunctionArgs; while(sNameEnd[-1] == ' ') --sNameEnd; } if(iLineNumber != -1 && sFunctionArgs && sFunctionEnd) { // Save : => lua_pushfstring(L, "%s:%d", sFilename, iLineNumber); lua_pushvalue(L, -1); lua_gettable(L, luaT_upvalueindex(2)); if(lua_isnil(L, -1)) { lua_pop(L, 1); lua_pushlstring(L, sPosition, sNameEnd - sPosition); lua_settable(L, luaT_upvalueindex(2)); } else { return luaL_error(L, "Multiple persistable functions defin" "ed on the same line (%s:%d)", sFilename, iLineNumber); } // Save => lua_pushlstring(L, sPosition, sNameEnd - sPosition); lua_pushvalue(L, -1); lua_gettable(L, luaT_upvalueindex(3)); if(lua_isnil(L, -1)) { lua_pop(L, 1); lua_pushvalue(L, 1); lua_settable(L, luaT_upvalueindex(3)); } else { return luaL_error(L, "Persistable function name \'%s\' is" " not unique (defined in both %s and %s)", lua_tostring(L, -2), lua_tostring(L, -1), sFilename); } // Save => lua_pushlstring(L, sPosition, sNameEnd - sPosition); lua_pushliteral(L, "\n"); lua_getfield(L, -1, "rep"); lua_insert(L, -2); lua_pushinteger(L, iLineNumber - 1); lua_call(L, 2, 1); lua_pushliteral(L, "function"); lua_pushlstring(L, sFunctionArgs, sFunctionEnd - sFunctionArgs); lua_concat(L, 3); lua_settable(L, luaT_upvalueindex(4)); } } } // Finish return lua_gettop(L) - 1; } static int l_errcatch(lua_State *L) { // Dummy function for debugging - place a breakpoint on the following // return statement to inspect the full C call stack when a Lua error // occurs (assuming that l_errcatch is used as the error catch handler). return 1; } static const std::vector persist_lib = { // Due to the various required upvalues, functions are registered // manually, but we still need a dummy to pass to luaL_register. {"errcatch", l_errcatch}, {nullptr, nullptr} }; int luaopen_persist(lua_State *L) { luaT_register(L, "persist", persist_lib); lua_newuserdata(L, 512); // buffer for dofile lua_newtable(L); lua_newtable(L); lua_newtable(L); lua_pushvalue(L, -3); luaT_pushcclosure(L, l_dump_toplevel, 1); lua_setfield(L, -6, "dump"); lua_pushvalue(L, -2); lua_pushvalue(L, -2); luaT_pushcclosure(L, l_load_toplevel, 2); lua_setfield(L, -6, "load"); luaT_pushcclosure(L, l_persist_dofile, 4); lua_setfield(L, -2, "dofile"); return 1; } CorsixTH-0.63/CorsixTH/Src/persist_lua.h000066400000000000000000000123261347163623700201220ustar00rootroot00000000000000/* Copyright (c) 2010 Peter "Corsix" Cawley 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. */ #ifndef CORSIX_TH_PERSIST_LUA_H_ #define CORSIX_TH_PERSIST_LUA_H_ #include "config.h" #include "th_lua.h" #include #include template struct lua_persist_int {}; template <> struct lua_persist_int {typedef unsigned int T;}; //! Interface used for persisting Lua objects /*! When userdata are persisted, they get an instance of this interface for writing binary data and other Lua objects. */ class lua_persist_writer { public: virtual ~lua_persist_writer() = default; virtual lua_State* get_stack() = 0; virtual void write_stack_object(int iIndex) = 0; virtual void write_byte_stream(const uint8_t *pBytes, size_t iCount) = 0; virtual void set_error(const char *sError) = 0; // write_stack_object for userdata without growing the Lua call stack // The given index should be a userdata whose __persist metamethod supports // fast persistance (being called with extra arguments and the wrong // environment / upvalues). virtual void fast_write_stack_object(int iIndex) = 0; // Writes an unsigned integer as a variable number of bytes // Endian independant and underlying type size independant template void write_uint(T tValue) { T tTemp(tValue); int iNumBytes; for(iNumBytes = 1; tTemp >= (T)0x80; tTemp /= (T)0x80) ++iNumBytes; if(iNumBytes == 1) { uint8_t iByte = (uint8_t)tValue; write_byte_stream(&iByte, 1); } else { std::vector bytes(iNumBytes); bytes[iNumBytes - 1] = 0x7F & (uint8_t)(tValue); for(int i = 1; i < iNumBytes; ++i) { tValue /= (T)0x80; bytes[iNumBytes - 1 - i] = 0x80 | (0x7F & (uint8_t)tValue); } write_byte_stream(bytes.data(), iNumBytes); } } template void write_int(T tValue) { typename lua_persist_int::T tValueToWrite; if(tValue >= 0) { tValueToWrite = (typename lua_persist_int::T)tValue; tValueToWrite <<= 1; } else { tValueToWrite = (typename lua_persist_int::T)(-(tValue + 1)); tValueToWrite <<= 1; tValueToWrite |= 1; } write_uint(tValueToWrite); } template void write_float(T fValue) { write_byte_stream(reinterpret_cast(&fValue), sizeof(T)); } }; //! Interface used for depersisting Lua objects /*! When userdata are depersisted, they get an instance of this interface for reading binary data and other Lua objects. */ class lua_persist_reader { public: virtual ~lua_persist_reader() = default; virtual lua_State* get_stack() = 0; virtual bool read_stack_object() = 0; virtual bool read_byte_stream(uint8_t *pBytes, size_t iCount) = 0; virtual void set_error(const char *sError) = 0; // Reads an integer previously written by lua_persist_writer::write_uint() template bool read_uint(T& tValue) { T tTemp(0); uint8_t iByte; while(true) { if(!read_byte_stream(&iByte, 1)) return false; if(iByte & 0x80) { tTemp = static_cast(tTemp | (iByte & 0x7F)); tTemp = static_cast(tTemp << 7); } else { tTemp = static_cast(tTemp | iByte); break; } } tValue = tTemp; return true; } template bool read_int(T& tValue) { typename lua_persist_int::T tWrittenValue; if(!read_uint(tWrittenValue)) return false; if(tWrittenValue & 1) tValue = (-(T)(tWrittenValue >> 1)) - 1; else tValue = static_cast(tWrittenValue >> 1); return true; } template bool read_float(T& fValue) { if(!read_byte_stream(reinterpret_cast(&fValue), sizeof(T))) return false; return true; } }; int luaopen_persist(lua_State *L); #endif // CORSIX_TH_PERSIST_LUA_H_ CorsixTH-0.63/CorsixTH/Src/random.c000066400000000000000000000152371347163623700170470ustar00rootroot00000000000000/* A C-program for MT19937, with initialization improved 2002/1/26. Coded by Takuji Nishimura and Makoto Matsumoto. Lua interface by Peter Cawley. Copyright (C) 1997 - 2002, Makoto Matsumoto and Takuji Nishimura, All rights reserved. Copyright (C) 2005, Mutsuo Saito, All rights reserved. Copyright (C) 2009, Peter Cawley, All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. 3. The names of its contributors may not be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. Any feedback is very welcome. http://www.math.sci.hiroshima-u.ac.jp/~m-mat/MT/emt.html email: m-mat @ math.sci.hiroshima-u.ac.jp (remove space) */ #include #include #ifdef _MSC_VER typedef unsigned __int16 uint16_t; typedef unsigned __int32 uint32_t; #else #include #endif /* _MSC_VER */ /* Period parameters */ #define N 624 #define M 397 #define MATRIX_A 0x9908b0dfUL /* constant vector a */ #define UPPER_MASK 0x80000000UL /* most significant w-r bits */ #define LOWER_MASK 0x7fffffffUL /* least significant r bits */ uint32_t mt[N]; /* the array for the state vector */ uint16_t mti=N+1; /* mti==N+1 means mt[N] is not initialized */ /* initializes mt[N] with a seed */ static void init_genrand(uint32_t s) { mt[0]= s; for (mti=1; mti> 30)) + mti); /* See Knuth TAOCP Vol2. 3rd Ed. P.106 for multiplier. */ /* In the previous versions, MSBs of the seed affect */ /* only MSBs of the array mt[]. */ } } /* generates a random number on [0,0xffffffff]-interval */ static uint32_t genrand_int32(void) { uint32_t y; static uint32_t mag01[2]={0x0UL, MATRIX_A}; /* mag01[x] = x * MATRIX_A for x=0,1 */ if (mti >= N) { /* generate N words at one time */ int kk; if (mti == N+1) /* if init_genrand() has not been called, */ init_genrand(5489UL); /* a default initial seed is used */ for (kk=0;kk> 1) ^ mag01[y & 0x1UL]; } for (;kk> 1) ^ mag01[y & 0x1UL]; } y = (mt[N-1]&UPPER_MASK)|(mt[0]&LOWER_MASK); mt[N-1] = mt[M-1] ^ (y >> 1) ^ mag01[y & 0x1UL]; mti = 0; } y = mt[mti++]; /* Tempering */ y ^= (y >> 11); y ^= (y << 7) & 0x9d2c5680UL; y ^= (y << 15) & 0xefc60000UL; y ^= (y >> 18); return y; } /* generates a random number on [0,1) with 53-bit resolution*/ static double genrand_res53(void) { uint32_t a=genrand_int32()>>5, b=genrand_int32()>>6; return(a*67108864.0+b)*(1.0/9007199254740992.0); } /* These real versions are due to Isaku Wada, 2002/01/09 added */ /** @function math.random @arguments [[range_start, ] range_end] @return number If called with no arguments, returns a random number in the range [0, 1). If called with one argument, returns a random integer in the range [1, range_end]. If called with two or more arguments, returns a random integer in the range [range_start, range_end]. */ static int l_random(lua_State *L) { lua_Integer min; uint32_t max; switch(lua_gettop(L)) { default: case 2: min = luaL_checkinteger(L, 1); max = (uint32_t)(luaL_checkinteger(L, 2) - min + 1); luaL_argcheck(L, max > 0, 2, "interval is empty"); lua_pushinteger(L, min + (lua_Integer)(genrand_int32() % max)); break; case 1: max = (uint32_t)luaL_checkinteger(L, 1); luaL_argcheck(L, 1 <= max, 1, "interval is empty"); lua_pushinteger(L, 1 + (lua_Integer)(genrand_int32() % max)); break; case 0: lua_pushnumber(L, (lua_Number)genrand_res53()); break; } return 1; } /** @function math.randomdump @arguments @return string Returns a string which can later be passed to math.randomseed() to restore the random number generator to its current state. */ static int l_randomdump(lua_State *L) { lua_pushlstring(L, (const char*)mt, N * 4); lua_pushlstring(L, (const char*)&mti, 2); lua_concat(L, 2); return 1; } /** @function math.randomseed @arguments number @arguments string @return Seeds the random number generator using the given seed number, or restores the random number generator state from a string previously generated from math.randomdump(). */ static int l_randomseed(lua_State *L) { if(lua_type(L, 1) == LUA_TSTRING) { int i; size_t len; const char *data = lua_tolstring(L, 1, &len); if(len != N * 4 + 2) luaL_argerror(L, 1, "Seed string wrong length"); for(i = 0; i < N; ++i) mt[i] = ((uint32_t*)data)[i]; mti = *(uint16_t*)(data + len - 2); } else { init_genrand((uint32_t)luaL_checkinteger(L, 1)); } return 0; } int luaopen_random(lua_State *L) { lua_getglobal(L, "math"); lua_pushliteral(L, "random"); lua_pushcfunction(L, l_random); lua_settable(L, -3); lua_pushliteral(L, "randomseed"); lua_pushcfunction(L, l_randomseed); lua_settable(L, -3); lua_pushliteral(L, "randomdump"); lua_pushcfunction(L, l_randomdump); lua_settable(L, -3); return 0; } CorsixTH-0.63/CorsixTH/Src/run_length_encoder.cpp000066400000000000000000000227251347163623700217730ustar00rootroot00000000000000/* Copyright (c) 2010 Peter "Corsix" Cawley 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. */ #include "run_length_encoder.h" #include "persist_lua.h" #include #include integer_run_length_encoder::integer_run_length_encoder() { buffer = nullptr; output = nullptr; clean(); } integer_run_length_encoder::~integer_run_length_encoder() { clean(); } void integer_run_length_encoder::clean() { delete[] buffer; delete[] output; buffer = nullptr; output = nullptr; record_size = 0; buffer_capacity = 0; buffer_size = 0; buffer_offset = 0; output_capacity = 0; output_size = 0; object_size = 0; object_copies = 0; } bool integer_run_length_encoder::initialise(size_t iRecordSize) { clean(); record_size = iRecordSize; // Buffer must hold at least 7 + 2 * 8 records, as the maximum object size // is 8 records, 2 of which are needed to detect a repeat, and 7 for the // offset at which the objects are found. buffer_capacity = iRecordSize * 8 * 4; buffer_size = 0; buffer_offset = 0; buffer = new (std::nothrow) uint32_t[buffer_capacity]; if(!buffer) return false; output_capacity = iRecordSize * 32; output_size = 0; output = new (std::nothrow) uint32_t[output_capacity]; if(!output) return false; object_size = 0; object_copies = 0; return true; } void integer_run_length_encoder::write(uint32_t iValue) { buffer[(buffer_offset + buffer_size) % buffer_capacity] = iValue; if(++buffer_size == buffer_capacity) flush(false); } void integer_run_length_encoder::finish() { if(buffer_size != 0) flush(true); } void integer_run_length_encoder::flush(bool bAll) { do { if(object_size == 0) { // Decide on the size of the next object // Want the object size which gives most object repeats, then for // two sizes with the same repeat count, the smaller size. size_t iBestRepeats = 0; size_t iBestSize = 0; size_t iBestOffset = 0; for(size_t iNumRecords = 1; iNumRecords <= 8; ++iNumRecords) { for(size_t iOffset = 0; iOffset < iNumRecords; ++iOffset) { size_t iNumRepeats = 0; size_t iObjSize = iNumRecords * record_size; while(iObjSize * (iOffset + iNumRepeats + 1) <= buffer_size && are_ranges_equal(0, iNumRepeats, iOffset, iObjSize)) { ++iNumRepeats; } if(iNumRepeats > iBestRepeats ||(iNumRepeats == iBestRepeats && iObjSize < iBestSize)) { iBestRepeats = iNumRepeats; iBestSize = iObjSize; iBestOffset = iOffset; } } } if(iBestRepeats == 1) { // No repeats were found, so the best we can do is output // a large non-repeating blob. move_object_to_output(std::min(buffer_size, 8 * record_size), 1); } else { if(iBestOffset != 0) move_object_to_output(iBestOffset * record_size, 1); // Mark the object as the current one, and remove all but the // last instance of it from the buffer. On the next flush, the // new data might continue the same object, hence why the // object isn't output just yet. object_size = iBestSize; object_copies = iBestRepeats - 1; buffer_offset = (buffer_offset + object_size * object_copies) % buffer_capacity; buffer_size -= object_size * object_copies; } } else { // Try to match more of the current object while(object_size * 2 <= buffer_size && are_ranges_equal(0, 1, 0, object_size)) { ++object_copies; buffer_offset = (buffer_offset + object_size) % buffer_capacity; buffer_size -= object_size; } // Write data if(object_size * 2 <= buffer_size || bAll) { move_object_to_output(object_size, object_copies + 1); object_size = 0; object_copies = 0; } } } while(bAll && buffer_size != 0); } bool integer_run_length_encoder::are_ranges_equal(size_t iObjIdx1, size_t iObjIdx2, size_t iOffset, size_t iObjSize) const { iObjIdx1 = buffer_offset + iOffset * record_size + iObjIdx1 * iObjSize; iObjIdx2 = buffer_offset + iOffset * record_size + iObjIdx2 * iObjSize; for(size_t i = 0; i < iObjSize; ++i) { if(buffer[(iObjIdx1 + i) % buffer_capacity] != buffer[(iObjIdx2 + i) % buffer_capacity]) { return false; } } return true; } bool integer_run_length_encoder::move_object_to_output(size_t iObjSize, size_t iObjCount) { // Grow the output array if needed if(output_capacity - output_size <= iObjSize) { size_t iNewSize = (output_capacity + iObjSize) * 2; uint32_t *pNewOutput = new (std::nothrow) uint32_t[iNewSize]; if(!pNewOutput) return false; #ifdef _MSC_VER #pragma warning(disable: 4996) #endif std::copy(output, output + output_size, pNewOutput); #ifdef _MSC_VER #pragma warning(default: 4996) #endif delete[] output; output = pNewOutput; output_capacity = iNewSize; } size_t iHeader = (iObjSize / record_size - 1) + 8 * (iObjCount - 1); output[output_size++] = static_cast(iHeader); // Move the object from the buffer to the output for(size_t i = 0; i < iObjSize; ++i) { output[output_size++] = buffer[buffer_offset]; buffer_offset = (buffer_offset + 1) % buffer_capacity; } buffer_size -= iObjSize; return true; } uint32_t* integer_run_length_encoder::get_output(size_t *pCount) const { if(pCount) *pCount = output_size; return output; } void integer_run_length_encoder::pump_output(lua_persist_writer *pWriter) const { pWriter->write_uint(output_size); for(size_t i = 0; i < output_size; ++i) { pWriter->write_uint(output[i]); } } integer_run_length_decoder::integer_run_length_decoder() { buffer = nullptr; clean(); } integer_run_length_decoder::~integer_run_length_decoder() { clean(); } void integer_run_length_decoder::clean() { delete[] buffer; buffer = nullptr; reader = nullptr; input = nullptr; input_end = nullptr; reads_remaining = 0; object_copies = 0; record_size = 0; object_index = 0; object_size = 0; } bool integer_run_length_decoder::initialise(size_t iRecordSize, lua_persist_reader *pReader) { clean(); buffer = new (std::nothrow) uint32_t[9 * iRecordSize]; if(!buffer) return false; reader = pReader; record_size = iRecordSize; return pReader->read_uint(reads_remaining); } bool integer_run_length_decoder::initialise(size_t iRecordSize, const uint32_t *pInput, size_t iCount) { clean(); buffer = new (std::nothrow) uint32_t[9 * iRecordSize]; if(!buffer) return false; input = pInput; input_end = pInput + iCount; record_size = iRecordSize; return true; } uint32_t integer_run_length_decoder::read() { if(object_copies == 0) { uint32_t iHeader = 0; if(reader) { reader->read_uint(iHeader); --reads_remaining; } else iHeader = *(input++); object_size = record_size * (1 + (iHeader & 7)); object_copies = (iHeader / 8) + 1; if(reader) { for(size_t i = 0; i < object_size; ++i) { reader->read_uint(buffer[i]); --reads_remaining; } } else { for(size_t i = 0; i < object_size; ++i) buffer[i] = *(input++); } } uint32_t iValue = buffer[object_index]; if(++object_index == object_size) { object_index = 0; --object_copies; } return iValue; } bool integer_run_length_decoder::is_finished() const { if(reader) return reads_remaining == 0 && object_copies == 0; else return input == input_end && object_copies == 0; } CorsixTH-0.63/CorsixTH/Src/run_length_encoder.h000066400000000000000000000110311347163623700214240ustar00rootroot00000000000000/* Copyright (c) 2010 Peter "Corsix" Cawley 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. */ #ifndef CORSIX_TH_RLE_H_ #define CORSIX_TH_RLE_H_ #include "config.h" class lua_persist_reader; class lua_persist_writer; //! Encoder for reducing the amount of space to store a sequence of integers /*! Designed primarily for reducing the amount of space taken up by persisting a THMap, this encoder transforms a sequence of integer records into a sequence of pairs, each pair having an integer object, and a repeat count. Terminology: * Integer - An unsigned integer (up to) 32 bits wide. * Record - One or more integers (for example, when encoding map nodes, each record would be 6 integers if a map node had 6 fields). * Object - One or more records. Each object has an associated repeat count. */ class integer_run_length_encoder { public: integer_run_length_encoder(); ~integer_run_length_encoder(); //! (Re-)initialise the encoder /*! Prepares the encoder for accepting a sequence of records. \param iRecordSize The number of integers in a record. */ bool initialise(size_t iRecordSize); //! Supply the next integer in the input sequence to the encoder void write(uint32_t iValue); //! Inform the encoder that the input sequence has finished /*! finish() must be called prior to getOutput() or pumpOutput(). write() must not be called after finish() has been called. */ void finish(); uint32_t* get_output(size_t *pCount) const; void pump_output(lua_persist_writer *pWriter) const; private: void clean(); //! Reduce the amount of data in the buffer /*! \param bAll If true, will reduce buffer_size to zero. If false, will reduce buffer_size by some amount. */ void flush(bool bAll); bool are_ranges_equal(size_t iObjIdx1, size_t iObjIdx2, size_t iOffset, size_t iObjSize) const; bool move_object_to_output(size_t iObjSize, size_t iObjCount); //! A circular fixed-size buffer holding the most recent input uint32_t* buffer; //! A variable-length array holding the output sequence uint32_t* output; //! The number of integers in a record size_t record_size; //! The maximum number of integers stored in the buffer size_t buffer_capacity; //! The current number of integers stored in the buffer size_t buffer_size; //! The index into buffer of the 1st integer size_t buffer_offset; //! The maximum number of integers storable in the output (before the //! output array has to be resized). size_t output_capacity; //! The current number of integers stored in the output size_t output_size; //! The number of integers in the current object (multiple of record size) size_t object_size; //! The number of copies of the current object already seen and removed //! from the buffer. size_t object_copies; }; class integer_run_length_decoder { public: integer_run_length_decoder(); ~integer_run_length_decoder(); bool initialise(size_t iRecordSize, lua_persist_reader *pReader); bool initialise(size_t iRecordSize, const uint32_t *pInput, size_t iCount); uint32_t read(); bool is_finished() const; private: void clean(); uint32_t* buffer; lua_persist_reader* reader; const uint32_t* input; union { const uint32_t* input_end; size_t reads_remaining; }; size_t object_copies; size_t record_size; size_t object_index; size_t object_size; }; #endif // CORSIX_TH_RLE_H_ CorsixTH-0.63/CorsixTH/Src/sdl_audio.cpp000066400000000000000000000205321347163623700200640ustar00rootroot00000000000000/* Copyright (c) 2009 Peter "Corsix" Cawley 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. */ #include "config.h" #include "lua_sdl.h" #ifdef CORSIX_TH_USE_SDL_MIXER #include "th_lua.h" #include "xmi2mid.h" #include #ifdef _MSC_VER #pragma comment(lib, "SDL2_mixer") #endif #include class music { public: Mix_Music* pMusic; music() { pMusic = nullptr; } ~music() { if(pMusic) { Mix_FreeMusic(pMusic); pMusic = nullptr; } } }; static void audio_music_over_callback() { SDL_Event e; e.type = SDL_USEREVENT_MUSIC_OVER; SDL_PushEvent(&e); } static int l_init(lua_State *L) { if(Mix_OpenAudio(static_cast(luaL_optinteger(L, 1, MIX_DEFAULT_FREQUENCY)), MIX_DEFAULT_FORMAT, static_cast(luaL_optinteger(L, 2, MIX_DEFAULT_CHANNELS)), static_cast(luaL_optinteger(L, 3, 2048)) /* chunk size */) != 0) { lua_pushboolean(L, 0); lua_pushstring(L, Mix_GetError()); return 2; } else { lua_pushboolean(L, 1); Mix_HookMusicFinished(audio_music_over_callback); return 1; } } struct load_music_async_data { lua_State* L; Mix_Music* music; SDL_RWops* rwop; char* err; SDL_Thread* thread; }; int l_load_music_async_callback(lua_State *L) { load_music_async_data *async = (load_music_async_data*)lua_touserdata(L, 1); // Frees resources allocated to the thread SDL_WaitThread(async->thread, nullptr); // Replace light UD with full UD lua_pushvalue(L, 1); lua_gettable(L, LUA_REGISTRYINDEX); lua_insert(L, 1); lua_pushnil(L); lua_settable(L, LUA_REGISTRYINDEX); // Get CB function lua_pushvalue(L, 1); lua_gettable(L, LUA_REGISTRYINDEX); lua_rawgeti(L, -1, 1); // Push CB arguments int nargs = 1; if(async->music == nullptr) { lua_pushnil(L); if(async->err) { if(*async->err) { lua_pushstring(L, async->err); nargs = 2; } free(async->err); } } else { lua_rawgeti(L, 2, 2); music* pLMusic = (music*)lua_touserdata(L, -1); pLMusic->pMusic = async->music; async->music = nullptr; } // Finish cleanup lua_pushvalue(L, 1); lua_pushnil(L); lua_settable(L, LUA_REGISTRYINDEX); // Callback lua_call(L, nargs, 0); return 0; } static int load_music_async_thread(void* arg) { load_music_async_data *async = (load_music_async_data*)arg; async->music = Mix_LoadMUS_RW(async->rwop, 1); async->rwop = nullptr; if(async->music == nullptr) { size_t iLen = std::strlen(Mix_GetError()) + 1; async->err = (char*)malloc(iLen); std::memcpy(async->err, Mix_GetError(), iLen); } SDL_Event e; e.type = SDL_USEREVENT_MUSIC_LOADED; e.user.data1 = arg; SDL_PushEvent(&e); return 0; } static int l_load_music_async(lua_State *L) { size_t iLength; const uint8_t *pData = luaT_checkfile(L, 1, &iLength); luaL_checktype(L, 2, LUA_TFUNCTION); SDL_RWops* rwop = SDL_RWFromConstMem(pData, (int)iLength); lua_settop(L, 2); load_music_async_data *async = luaT_new(L, load_music_async_data); lua_pushlightuserdata(L, async); lua_pushvalue(L, -2); lua_settable(L, LUA_REGISTRYINDEX); async->L = L; async->music = nullptr; async->rwop = rwop; async->err = nullptr; lua_createtable(L, 2, 0); lua_pushvalue(L, 2); lua_rawseti(L, -2, 1); luaT_stdnew(L, luaT_environindex, true); lua_pushvalue(L, 1); luaT_setenvfield(L, -2, "data"); lua_rawseti(L, -2, 2); lua_settable(L, LUA_REGISTRYINDEX); /* In registry: [light userdata async] -> [full userdata async] [full userdata async] -> { [1] = callback_function, [2] = empty music_t userdata, } New thread will load music, and inform the main loop, which will then call the callback and remove the new entries from the registry. */ async->thread = SDL_CreateThread(load_music_async_thread, "music_thread", async); return 0; } static int l_load_music(lua_State *L) { size_t iLength; const uint8_t *pData = luaT_checkfile(L, 1, &iLength); SDL_RWops* rwop = SDL_RWFromConstMem(pData, (int)iLength); Mix_Music* pMusic = Mix_LoadMUS_RW(rwop, 1); if(pMusic == nullptr) { lua_pushnil(L); lua_pushstring(L, Mix_GetError()); return 2; } music* pLMusic = luaT_stdnew(L, luaT_environindex, true); pLMusic->pMusic = pMusic; lua_pushvalue(L, 1); luaT_setenvfield(L, -2, "data"); return 1; } static int l_music_volume(lua_State *L) { lua_Number fValue = luaL_checknumber(L, 1); fValue = fValue * (lua_Number)MIX_MAX_VOLUME; int iVolume = (int)(fValue + 0.5); if(iVolume < 0) iVolume = 0; else if(iVolume > MIX_MAX_VOLUME) iVolume = MIX_MAX_VOLUME; Mix_VolumeMusic(iVolume); return 0; } static int l_play_music(lua_State *L) { music* pLMusic = luaT_testuserdata(L, -1); if(Mix_PlayMusic(pLMusic->pMusic, static_cast(luaL_optinteger(L, 2, 1))) != 0) { lua_pushnil(L); lua_pushstring(L, Mix_GetError()); return 2; } lua_pushboolean(L, 1); return 1; } static int l_pause_music(lua_State *L) { Mix_PauseMusic(); lua_pushboolean(L, Mix_PausedMusic() != 0 ? 1 : 0); return 1; } static int l_resume_music(lua_State *L) { Mix_ResumeMusic(); lua_pushboolean(L, Mix_PausedMusic() == 0 ? 1 : 0); return 1; } static int l_stop_music(lua_State *L) { Mix_HaltMusic(); return 0; } static int l_transcode_xmi(lua_State *L) { size_t iLength, iMidLength; const uint8_t *pData = luaT_checkfile(L, 1, &iLength); uint8_t *pMidData = transcode_xmi_to_midi(pData, iLength, &iMidLength); if(pMidData == nullptr) { lua_pushnil(L); lua_pushliteral(L, "Unable to transcode XMI to MIDI"); return 2; } lua_pushlstring(L, (const char*)pMidData, iMidLength); delete[] pMidData; return 1; } static const struct luaL_Reg sdl_audiolib[] = { {"init", l_init}, {"transcodeXmiToMid", l_transcode_xmi}, {nullptr, nullptr} }; static const struct luaL_Reg sdl_musiclib[] = { {"loadMusic", l_load_music}, {"loadMusicAsync", l_load_music_async}, {"playMusic", l_play_music}, {"stopMusic", l_stop_music}, {"pauseMusic", l_pause_music}, {"resumeMusic", l_resume_music}, {"setMusicVolume", l_music_volume}, {nullptr, nullptr} }; int luaopen_sdl_audio(lua_State *L) { lua_newtable(L); luaT_setfuncs(L, sdl_audiolib); lua_pushboolean(L, 1); lua_setfield(L, -2, "loaded"); lua_createtable(L, 0, 2); lua_pushvalue(L, -1); lua_replace(L, luaT_environindex); lua_pushvalue(L, luaT_environindex); luaT_pushcclosure(L, luaT_stdgc, 1); lua_setfield(L, -2, "__gc"); lua_pushvalue(L, 1); lua_setfield(L, -2, "__index"); lua_pop(L, 1); luaT_setfuncs(L, sdl_musiclib); return 1; } #else // CORSIX_TH_USE_SDL_MIXER int luaopen_sdl_audio(lua_State *L) { lua_newtable(L); lua_pushboolean(L, 0); lua_setfield(L, -2, "loaded"); return 1; } int l_load_music_async_callback(lua_State *L) { return 0; } #endif // CORSIX_TH_USE_SDL_MIXER CorsixTH-0.63/CorsixTH/Src/sdl_core.cpp000066400000000000000000000304751347163623700177220ustar00rootroot00000000000000/* Copyright (c) 2009 Peter "Corsix" Cawley 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. */ #include "config.h" #include "lua_sdl.h" #include "th_lua.h" #include #include #include static int l_init(lua_State *L) { Uint32 flags = 0; int i; int argc = lua_gettop(L); for(i = 1; i <= argc; ++i) { const char* s = luaL_checkstring(L, i); if(std::strcmp(s, "video") == 0) flags |= SDL_INIT_VIDEO; else if(std::strcmp(s, "audio") == 0) flags |= SDL_INIT_AUDIO; else if(std::strcmp(s, "timer") == 0) flags |= SDL_INIT_TIMER; else if(std::strcmp(s, "*") == 0) flags |= SDL_INIT_EVERYTHING; else luaL_argerror(L, i, "Expected SDL part name"); } if(SDL_Init(flags) != 0) { std::fprintf(stderr, "SDL_Init failed: %s\n", SDL_GetError()); lua_pushboolean(L, 0); return 1; } lua_pushboolean(L, 1); return 1; } static Uint32 timer_frame_callback(Uint32 interval, void *param) { SDL_Event e; e.type = SDL_USEREVENT_TICK; SDL_PushEvent(&e); return interval; } struct fps_ctrl { bool limit_fps; bool track_fps; int q_front; int q_back; int frame_count; Uint32 frame_time[4096]; void init() { limit_fps = true; track_fps = true; q_front = 0; q_back = 0; frame_count = 0; } void count_frame() { Uint32 now = SDL_GetTicks(); frame_time[q_front] = now; q_front = (q_front + 1) % static_cast((sizeof(frame_time) / sizeof(*frame_time))); if(q_front == q_back) q_back = (q_back + 1) % static_cast((sizeof(frame_time) / sizeof(*frame_time))); else ++frame_count; if(now < 1000) now = 0; else now -= 1000; while(frame_time[q_back] < now) { --frame_count; q_back = (q_back + 1) % static_cast((sizeof(frame_time) / sizeof(*frame_time))); } } }; static void l_push_modifiers_table(lua_State *L, Uint16 mod) { lua_newtable(L); if ((mod & KMOD_SHIFT) != 0) { luaT_pushtablebool(L, "shift", true); } if ((mod & KMOD_ALT) != 0) { luaT_pushtablebool(L, "alt", true); } if ((mod & KMOD_CTRL) != 0) { luaT_pushtablebool(L, "ctrl", true); } if ((mod & KMOD_GUI) != 0) { luaT_pushtablebool(L, "gui", true); } if ((mod & KMOD_NUM) != 0) { luaT_pushtablebool(L, "numlockactive", true); } } static int l_get_key_modifiers(lua_State *L) { l_push_modifiers_table(L, SDL_GetModState()); return 1; } static int l_mainloop(lua_State *L) { luaL_checktype(L, 1, LUA_TTHREAD); lua_State *dispatcher = lua_tothread(L, 1); fps_ctrl *fps_control = (fps_ctrl*)lua_touserdata(L, luaT_upvalueindex(1)); SDL_TimerID timer = SDL_AddTimer(30, timer_frame_callback, nullptr); SDL_Event e; while(SDL_WaitEvent(&e) != 0) { bool do_frame = false; bool do_timer = false; do { int nargs; switch(e.type) { case SDL_QUIT: goto leave_loop; case SDL_KEYDOWN: lua_pushliteral(dispatcher, "keydown"); lua_pushstring(dispatcher, SDL_GetKeyName(e.key.keysym.sym)); l_push_modifiers_table(dispatcher, e.key.keysym.mod); lua_pushboolean(dispatcher, e.key.repeat != 0); nargs = 4; break; case SDL_KEYUP: lua_pushliteral(dispatcher, "keyup"); lua_pushstring(dispatcher, SDL_GetKeyName(e.key.keysym.sym)); nargs = 2; break; case SDL_TEXTINPUT: lua_pushliteral(dispatcher, "textinput"); lua_pushstring(dispatcher, e.text.text); nargs = 2; break; case SDL_TEXTEDITING: lua_pushliteral(dispatcher, "textediting"); lua_pushstring(dispatcher, e.edit.text); lua_pushinteger(dispatcher, e.edit.start); lua_pushinteger(dispatcher, e.edit.length); nargs = 4; break; case SDL_MOUSEBUTTONDOWN: lua_pushliteral(dispatcher, "buttondown"); lua_pushinteger(dispatcher, e.button.button); lua_pushinteger(dispatcher, e.button.x); lua_pushinteger(dispatcher, e.button.y); nargs = 4; break; case SDL_MOUSEBUTTONUP: lua_pushliteral(dispatcher, "buttonup"); lua_pushinteger(dispatcher, e.button.button); lua_pushinteger(dispatcher, e.button.x); lua_pushinteger(dispatcher, e.button.y); nargs = 4; break; case SDL_MOUSEWHEEL: lua_pushliteral(dispatcher, "mousewheel"); lua_pushinteger(dispatcher, e.wheel.x); lua_pushinteger(dispatcher, e.wheel.y); nargs = 3; break; case SDL_MOUSEMOTION: lua_pushliteral(dispatcher, "motion"); lua_pushinteger(dispatcher, e.motion.x); lua_pushinteger(dispatcher, e.motion.y); lua_pushinteger(dispatcher, e.motion.xrel); lua_pushinteger(dispatcher, e.motion.yrel); nargs = 5; break; case SDL_MULTIGESTURE: lua_pushliteral(dispatcher, "multigesture"); lua_pushinteger(dispatcher, e.mgesture.numFingers); lua_pushnumber(dispatcher, e.mgesture.dTheta); lua_pushnumber(dispatcher, e.mgesture.dDist); lua_pushnumber(dispatcher, e.mgesture.x); lua_pushnumber(dispatcher, e.mgesture.y); nargs = 6; break; case SDL_WINDOWEVENT: switch (e.window.event) { case SDL_WINDOWEVENT_FOCUS_GAINED: lua_pushliteral(dispatcher, "active"); lua_pushinteger(dispatcher, 1); nargs = 2; break; case SDL_WINDOWEVENT_FOCUS_LOST: lua_pushliteral(dispatcher, "active"); lua_pushinteger(dispatcher, 0); nargs = 2; break; case SDL_WINDOWEVENT_SIZE_CHANGED: lua_pushliteral(dispatcher, "window_resize"); lua_pushinteger(dispatcher, e.window.data1); lua_pushinteger(dispatcher, e.window.data2); nargs = 3; break; default: nargs = 0; break; } break; case SDL_USEREVENT_MUSIC_OVER: lua_pushliteral(dispatcher, "music_over"); nargs = 1; break; case SDL_USEREVENT_MUSIC_LOADED: if(luaT_cpcall(L, (lua_CFunction)l_load_music_async_callback, e.user.data1)) { SDL_RemoveTimer(timer); lua_pushliteral(L, "callback"); return 2; } nargs = 0; break; case SDL_USEREVENT_TICK: do_timer = true; nargs = 0; break; case SDL_USEREVENT_MOVIE_OVER: lua_pushliteral(dispatcher, "movie_over"); nargs = 1; break; case SDL_USEREVENT_SOUND_OVER: lua_pushliteral(dispatcher, "sound_over"); lua_pushinteger(dispatcher, *(static_cast(e.user.data1))); nargs = 2; break; default: nargs = 0; break; } if(nargs != 0) { if(luaT_resume(dispatcher, dispatcher, nargs) != LUA_YIELD) { goto leave_loop; } do_frame = do_frame || (lua_toboolean(dispatcher, 1) != 0); lua_settop(dispatcher, 0); } } while(SDL_PollEvent(&e) != 0); if(do_timer) { lua_pushliteral(dispatcher, "timer"); if(luaT_resume(dispatcher, dispatcher, 1) != LUA_YIELD) { break; } do_frame = do_frame || (lua_toboolean(dispatcher, 1) != 0); lua_settop(dispatcher, 0); } if(do_frame || !fps_control->limit_fps) { do { if(fps_control->track_fps) { fps_control->count_frame(); } lua_pushliteral(dispatcher, "frame"); if(luaT_resume(dispatcher, dispatcher, 1) != LUA_YIELD) { goto leave_loop; } lua_settop(dispatcher, 0); } while(fps_control->limit_fps == false && SDL_PollEvent(nullptr) == 0); } // No events pending - a good time to do a bit of garbage collection lua_gc(L, LUA_GCSTEP, 2); } leave_loop: SDL_RemoveTimer(timer); int n = lua_gettop(dispatcher); if(lua_status(dispatcher) >= LUA_ERRRUN) { n = 1; } lua_checkstack(L, n); lua_xmove(dispatcher, L, n); return n; } static int l_track_fps(lua_State *L) { fps_ctrl *ctrl = (fps_ctrl*)lua_touserdata(L, luaT_upvalueindex(1)); ctrl->track_fps = lua_isnone(L, 1) ? true : (lua_toboolean(L, 1) != 0); return 0; } static int l_limit_fps(lua_State *L) { fps_ctrl *ctrl = (fps_ctrl*)lua_touserdata(L, luaT_upvalueindex(1)); ctrl->limit_fps = lua_isnone(L, 1) ? true : (lua_toboolean(L, 1) != 0); return 0; } static int l_get_fps(lua_State *L) { fps_ctrl *ctrl = (fps_ctrl*)lua_touserdata(L, luaT_upvalueindex(1)); if(ctrl->track_fps) { lua_pushinteger(L, ctrl->frame_count); } else { lua_pushnil(L); } return 1; } static int l_get_ticks(lua_State *L) { lua_pushinteger(L, (lua_Integer)SDL_GetTicks()); return 1; } static const std::vector sdllib = { {"init", l_init}, {"getTicks", l_get_ticks}, {"getKeyModifiers", l_get_key_modifiers}, {nullptr, nullptr} }; static const std::vector sdllib_with_upvalue = { {"mainloop", l_mainloop}, {"getFPS", l_get_fps}, {"trackFPS", l_track_fps}, {"limitFPS", l_limit_fps}, {nullptr, nullptr} }; inline void load_extra(lua_State *L, const char *name, lua_CFunction fn) { luaT_pushcfunction(L, fn); lua_call(L, 0, 1); lua_setfield(L, -2, name); } int luaopen_sdl_audio(lua_State *L); int luaopen_sdl_wm(lua_State *L); int luaopen_sdl(lua_State *L) { fps_ctrl* ctrl = (fps_ctrl*)lua_newuserdata(L, sizeof(fps_ctrl)); ctrl->init(); luaT_register(L, "sdl", sdllib); for (auto reg = sdllib_with_upvalue.begin(); reg->name; ++reg) { lua_pushvalue(L, -2); luaT_pushcclosure(L, reg->func, 1); lua_setfield(L, -2, reg->name); } load_extra(L, "audio", luaopen_sdl_audio); load_extra(L, "wm", luaopen_sdl_wm); return 1; } CorsixTH-0.63/CorsixTH/Src/sdl_wm.cpp000066400000000000000000000046371347163623700174160ustar00rootroot00000000000000/* Copyright (c) 2009 Peter "Corsix" Cawley 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. */ #include "config.h" #include "th_lua.h" #include "lua_sdl.h" #ifdef CORSIX_TH_USE_WIN32_SDK #include #include #include "../resource.h" #endif static int l_set_icon_win32(lua_State *L) { // Hack to set the window icon from the EXE resource under Windows. // Does nothing (and returns false) on other platforms. lua_pushboolean(L, 0); #if 0 // XXX: Doesn't work any more, since window is inside renderer. Move to renderer. SDL_SysWMinfo oWindowInfo; oWindowInfo.version.major = SDL_MAJOR_VERSION; oWindowInfo.version.minor = SDL_MINOR_VERSION; oWindowInfo.version.patch = SDL_PATCHLEVEL; if(SDL_GetWindowWMInfo(window,&oWindowInfo) == 1) { HWND hWindow = oWindowInfo.info.win.window; HICON hIcon = LoadIcon((HINSTANCE)GetModuleHandle(nullptr), (LPCTSTR)IDI_CORSIXTH); SetClassLongPtr(hWindow, GCLP_HICON, (LONG_PTR)hIcon); SetClassLongPtr(hWindow, GCLP_HICONSM, (LONG_PTR)hIcon); lua_pushboolean(L, 1); } #endif return 1; } static int l_show_cursor(lua_State *L) { SDL_ShowCursor(lua_toboolean(L, 1)); return 0; } static const struct luaL_Reg sdl_wmlib[] = { {"setIconWin32", l_set_icon_win32}, {"showCursor", l_show_cursor}, {nullptr, nullptr} }; int luaopen_sdl_wm(lua_State *L) { lua_newtable(L); luaT_setfuncs(L, sdl_wmlib); return 1; } CorsixTH-0.63/CorsixTH/Src/th.cpp000066400000000000000000000146401347163623700165370ustar00rootroot00000000000000/* Copyright (c) 2009 Peter "Corsix" Cawley 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. */ #include "config.h" #include "th.h" #include #include link_list::link_list() { drawing_layer = 0; prev = nullptr; next = nullptr; } link_list::~link_list() { remove_from_list(); } void link_list::remove_from_list() { if(prev != nullptr) { prev->next = next; } if(next != nullptr) { next->prev = prev; next = nullptr; } prev = nullptr; } #include "cp437_table.h" #include "cp936_table.h" static void utf8encode(uint8_t*& sOut, uint32_t iCodepoint) { if(iCodepoint <= 0x7F) { *sOut = static_cast(iCodepoint); ++sOut; } else if(iCodepoint <= 0x7FF) { uint8_t cSextet = iCodepoint & 0x3F; iCodepoint >>= 6; sOut[0] = static_cast(0xC0 + iCodepoint); sOut[1] = static_cast(0x80 + cSextet); sOut += 2; } else if(iCodepoint <= 0xFFFF) { uint8_t cSextet2 = iCodepoint & 0x3F; iCodepoint >>= 6; uint8_t cSextet1 = iCodepoint & 0x3F; iCodepoint >>= 6; sOut[0] = static_cast(0xE0 + iCodepoint); sOut[1] = static_cast(0x80 + cSextet1); sOut[2] = static_cast(0x80 + cSextet2); sOut += 3; } else { uint8_t cSextet3 = iCodepoint & 0x3F; iCodepoint >>= 6; uint8_t cSextet2 = iCodepoint & 0x3F; iCodepoint >>= 6; uint8_t cSextet1 = iCodepoint & 0x3F; iCodepoint >>= 6; sOut[0] = static_cast(0xF0 + iCodepoint); sOut[1] = static_cast(0x80 + cSextet1); sOut[2] = static_cast(0x80 + cSextet2); sOut[3] = static_cast(0x80 + cSextet3); sOut += 4; } } static void CopyStringCP437(const uint8_t*& sIn, uint8_t*& sOut) { uint8_t cChar; do { cChar = *sIn; ++sIn; if(cChar < 0x80) { *sOut = cChar; ++sOut; } else { utf8encode(sOut, cp437_to_unicode_table[cChar - 0x80]); } } while(cChar != 0); } static void CopyStringCP936(const uint8_t*& sIn, uint8_t*& sOut) { uint8_t cChar1, cChar2; do { cChar1 = *sIn; ++sIn; if(cChar1 < 0x81 || cChar1 == 0xFF) { *sOut = cChar1; ++sOut; } else { cChar2 = *sIn; ++sIn; if(0x40 <= cChar2 && cChar2 <= 0xFE) { utf8encode(sOut, cp936_to_unicode_table[cChar1-0x81][cChar2-0x40]); // The Theme Hospital string tables seem to like following a // multibyte character with a superfluous space. cChar2 = *sIn; if(cChar2 == ' ') ++sIn; } else { *sOut = cChar1; ++sOut; *sOut = cChar2; ++sOut; } } } while(cChar1 != 0); } th_string_list::th_string_list(const uint8_t* data, size_t length) { if(length < 2) throw std::invalid_argument("length must be 2 or larger"); size_t iSectionCount = *reinterpret_cast(data); size_t iHeaderLength = (iSectionCount + 1) * 2; if(length < iHeaderLength) throw std::invalid_argument("iDataLength must be larger than the header"); size_t iStringDataLength = length - iHeaderLength; const uint8_t *sStringData = data + iHeaderLength; const uint8_t *sDataEnd = sStringData + iStringDataLength; // Determine whether the encoding is CP437 or GB2312 (CP936). // The range of bytes 0xB0 through 0xDF are box drawing characters in CP437 // which shouldn't occur much (if ever) in TH strings, whereas they are // commonly used in GB2312 encoding. We use 10% as a threshold. size_t iBCDCount = 0; for(size_t i = 0; i < iStringDataLength; ++i) { if(0xB0 <= sStringData[i] && sStringData[i] <= 0xDF) ++iBCDCount; } void (*fnCopyString)(const uint8_t*&, uint8_t*&); if(iBCDCount * 10 >= iStringDataLength) fnCopyString = CopyStringCP936; else fnCopyString = CopyStringCP437; // String buffer sized to accept the largest possible reencoding of the // characters interpreted as CP936 or CP437 (2 bytes per character). string_buffer.resize(iStringDataLength * 2 + 2); uint8_t *sDataOut = string_buffer.data(); sections.resize(iSectionCount); for(size_t i = 0; i < iSectionCount; ++i) { size_t section_size = reinterpret_cast(data)[i + 1]; sections[i].reserve(section_size); for(size_t j = 0; j < section_size; ++j) { sections[i].push_back(reinterpret_cast(sDataOut)); if(sStringData != sDataEnd) { fnCopyString(sStringData, sDataOut); } } } // Terminate final string with nil character *sDataOut = 0; } th_string_list::~th_string_list() {} size_t th_string_list::get_section_count() { return sections.size(); } size_t th_string_list::get_section_size(size_t section) { return section < sections.size() ? sections[section].size() : 0; } const char* th_string_list::get_string(size_t section, size_t index) { if(index < get_section_size(section)) { return sections[section][index]; } return nullptr; } CorsixTH-0.63/CorsixTH/Src/th.h000066400000000000000000000064611347163623700162060ustar00rootroot00000000000000/* Copyright (c) 2009 Peter "Corsix" Cawley 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. */ #ifndef CORSIX_TH_TH_H_ #define CORSIX_TH_TH_H_ #include "config.h" #include //! Generic linked list class (for inheriting from) class link_list { public: link_list() ; ~link_list(); link_list* prev; link_list* next; void remove_from_list(); // TODO: drawing layer doesn't belong in a generic link list. int get_drawing_layer() {return drawing_layer;} void set_drawing_layer(int layer) {drawing_layer = layer;} private: int drawing_layer; }; //! \brief Theme Hospital localised string list //! //! Presents Theme Hospital strings by section and index. class th_string_list { public: //! Construct an instance of string_list from the given data //! from a Theme Hosptial string file. The format of the data is //! described at: //! https://github.com/alexandergitter/theme-hospital-spec/blob/master/format-specification.md#strings //! //! \param data A pointer to the raw data //! \param length The size of the data th_string_list(const uint8_t* data, size_t length); // Delete default constructors and assignment operators. They // can be implemented properly later if they are needed but // for now they are unneeded so it is safer to remove them. th_string_list() = delete; th_string_list(const th_string_list &) = delete; th_string_list(th_string_list &&) = delete; th_string_list& operator= (const th_string_list &) = delete; th_string_list&& operator= (th_string_list &&) = delete; ~th_string_list(); //! Get the number of sections in the string list size_t get_section_count(); //! Get the number of strings in a section of the string list size_t get_section_size(size_t section); //! Get a string from the string list /*! @param section Section index in range [0, getSectionCount() - 1] @param index String index in range [0, getSectionSize(iSection) - 1] @return nullptr if the index is invalid, otherwise a UTF-8 encoded string. */ const char* get_string(size_t section, size_t index); private: //! Section information std::vector> sections; //! Memory block containing all the actual strings utf-8 encoded std::vector string_buffer; }; #endif // CORSIX_TH_TH_H_ CorsixTH-0.63/CorsixTH/Src/th_gfx.cpp000066400000000000000000001610231347163623700174010ustar00rootroot00000000000000/* Copyright (c) 2009 Peter "Corsix" Cawley 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. */ #include "config.h" #include "th_gfx.h" #include "persist_lua.h" #include "th_map.h" #include "th_sound.h" #include #include #include #include #include /** Data retrieval class, simulating sequential access to the data, keeping track of available length. */ class memory_reader { public: memory_reader(const uint8_t *pData, size_t iLength) { data = pData; remaining_bytes = iLength; } const uint8_t *data; ///< Pointer to the remaining data. size_t remaining_bytes; ///< Remaining number of bytes. //! Can \a iSize bytes be read from the file? /*! @param iSize Number of bytes that are queried. @return Whether the requested number of bytes is still available. */ bool are_bytes_available(size_t iSize) { return iSize <= remaining_bytes; } //! Is EOF reached? /*! @return Whether EOF has been reached. */ bool is_at_end_of_file() { return remaining_bytes == 0; } //! Get an 8 bit value from the file. /*! @return Read 8 bit value. @pre There should be at least a byte available for reading. */ uint8_t read_uint8() { assert(remaining_bytes > 0); uint8_t iVal = *data; data++; remaining_bytes--; return iVal; } //! Get a 16 bit value from the file. /*! @return Read 16 bit value. @pre There should be at least 2 bytes available for reading. */ uint16_t read_uint16() { uint16_t iVal = read_uint8(); uint16_t iVal2 = read_uint8(); return static_cast(iVal | (iVal2 << 8)); } //! Get a signed 16 bit value from the file. /*! @return The read signed 16 bit value. @pre There should be at least 2 bytes available for reading. */ int read_int16() { int val = read_uint16(); if (val < 0x7FFF) return val; int ret = -1; return (ret & ~0xFFFF) | val; } //! Get a 32 bit value from the file. /*! @return Read 32 bit value. @pre There should be at least 4 bytes available for reading. */ uint32_t read_uint32() { uint32_t iVal = read_uint16(); uint32_t iVal2 = read_uint16(); return iVal | (iVal2 << 16); } //! Load string from the memory_reader. /*! @param [out] pStr String to load. @return Whether the string could be loaded. */ bool read_string(std::string *pStr) { char buff[256]; if (is_at_end_of_file()) return false; size_t iLength = read_uint8(); if (!are_bytes_available(iLength)) return false; size_t idx; for (idx = 0; idx < iLength; idx++) buff[idx] = read_uint8(); buff[idx] = '\0'; *pStr = std::string(buff); return true; } }; animation_manager::animation_manager() { first_frames.clear(); frames.clear(); element_list.clear(); elements.clear(); custom_sheets.clear(); sheet = nullptr; animation_count = 0; frame_count = 0; element_list_count = 0; element_count = 0; } animation_manager::~animation_manager() { for (size_t i = 0; i < custom_sheets.size(); i++) delete custom_sheets[i]; } void animation_manager::set_sprite_sheet(sprite_sheet* pSpriteSheet) { sheet = pSpriteSheet; } bool animation_manager::load_from_th_file( const uint8_t* pStartData, size_t iStartDataLength, const uint8_t* pFrameData, size_t iFrameDataLength, const uint8_t* pListData, size_t iListDataLength, const uint8_t* pElementData, size_t iElementDataLength) { size_t iAnimationCount = iStartDataLength / sizeof(th_animation_properties); size_t iFrameCount = iFrameDataLength / sizeof(th_frame_properties); size_t iListCount = iListDataLength / 2; size_t iElementCount = iElementDataLength / sizeof(th_element_properties); if(iAnimationCount == 0 || iFrameCount == 0 || iListCount == 0 || iElementCount == 0) return false; // Start offset of the file data into the vectors. size_t iAnimationStart = animation_count; size_t iFrameStart = frame_count; size_t iListStart = element_list_count; size_t iElementStart = element_count; // Original data file must start at offset 0 due to the hard-coded animation numbers in the Lua code. if (iAnimationStart > 0 || iFrameStart > 0 || iListStart > 0 || iElementStart > 0) return false; if (iElementStart + iElementCount >= 0xFFFF) // Overflow of list elements. return false; // Create new space for the data. first_frames.reserve(iAnimationStart + iAnimationCount); frames.reserve(iFrameStart + iFrameCount); element_list.reserve(iListStart + iListCount + 1); elements.reserve(iElementStart + iElementCount); // Read animations. for(size_t i = 0; i < iAnimationCount; ++i) { size_t iFirstFrame = reinterpret_cast(pStartData)[i].first_frame; if(iFirstFrame > iFrameCount) iFirstFrame = 0; iFirstFrame += iFrameStart; first_frames.push_back(iFirstFrame); } // Read frames. for(size_t i = 0; i < iFrameCount; ++i) { const th_frame_properties* pFrame = reinterpret_cast(pFrameData) + i; frame oFrame; oFrame.list_index = iListStart + (pFrame->list_index < iListCount ? pFrame->list_index : 0); oFrame.next_frame = iFrameStart + (pFrame->next < iFrameCount ? pFrame->next : 0); oFrame.sound = pFrame->sound; oFrame.flags = pFrame->flags; // Bounding box fields initialised later oFrame.marker_x = 0; oFrame.marker_y = 0; oFrame.secondary_marker_x = 0; oFrame.secondary_marker_y = 0; frames.push_back(oFrame); } // Read element list. for(size_t i = 0; i < iListCount; ++i) { uint16_t iElmNumber = *(reinterpret_cast(pListData) + i); if (iElmNumber >= iElementCount) { iElmNumber = 0xFFFF; } else { iElmNumber = static_cast(iElmNumber + iElementStart); } element_list.push_back(iElmNumber); } element_list.push_back(0xFFFF); // Read elements. size_t iSpriteCount = sheet->get_sprite_count(); for(size_t i = 0; i < iElementCount; ++i) { const th_element_properties* pTHElement = reinterpret_cast(pElementData) + i; element oElement; oElement.sprite = pTHElement->table_position / 6; oElement.flags = pTHElement->flags & 0xF; oElement.x = static_cast(pTHElement->offx) - 141; oElement.y = static_cast(pTHElement->offy) - 186; oElement.layer = static_cast(pTHElement->flags >> 4); // High nibble, layer of the element. if(oElement.layer > 12) oElement.layer = 6; // Nothing lives on layer 6 oElement.layer_id = pTHElement->layerid; if (oElement.sprite < iSpriteCount) { oElement.element_sprite_sheet = sheet; } else { oElement.element_sprite_sheet = nullptr; } elements.push_back(oElement); } // Compute bounding box of the animations using the sprite sheet. for(size_t i = 0; i < iFrameCount; ++i) { set_bounding_box(frames[iFrameStart + i]); } animation_count += iAnimationCount; frame_count += iFrameCount; element_list_count += iListCount + 1; element_count += iElementCount; assert(first_frames.size() == animation_count); assert(frames.size() == frame_count); assert(element_list.size() == element_list_count); assert(elements.size() == element_count); return true; } //! Update \a iLeft with the smallest of both values. /*! @param [inout] iLeft Left value to check and update. @param iRight Second value to check. */ static void set_left_to_min(int& iLeft, int iRight) { if(iRight < iLeft) iLeft = iRight; } //! Update \a iLeft with the biggest of both values. /*! @param [inout] iLeft Left value to check and update. @param iRight Second value to check. */ static void set_left_to_max(int& iLeft, int iRight) { if(iRight > iLeft) iLeft = iRight; } void animation_manager::set_bounding_box(frame &oFrame) { oFrame.bounding_left = INT_MAX; oFrame.bounding_right = INT_MIN; oFrame.bounding_top = INT_MAX; oFrame.bounding_bottom = INT_MIN; size_t iListIndex = oFrame.list_index; for(; ; ++iListIndex) { uint16_t iElement = element_list[iListIndex]; if(iElement >= elements.size()) break; element& oElement = elements[iElement]; if(oElement.element_sprite_sheet == nullptr) continue; unsigned int iWidth, iHeight; oElement.element_sprite_sheet->get_sprite_size_unchecked(oElement.sprite, &iWidth, &iHeight); set_left_to_min(oFrame.bounding_left , oElement.x); set_left_to_min(oFrame.bounding_top , oElement.y); set_left_to_max(oFrame.bounding_right , oElement.x - 1 + (int)iWidth); set_left_to_max(oFrame.bounding_bottom, oElement.y - 1 + (int)iHeight); } } void animation_manager::set_canvas(render_target *pCanvas) { canvas = pCanvas; } //! Load the header. /*! @param [inout] input Data to read. @return Number of consumed bytes, a negative number indicates an error. */ static int load_header(memory_reader &input) { static const uint8_t aHdr[] = {'C', 'T', 'H', 'G', 1, 2}; if (!input.are_bytes_available(6)) return false; for (int i = 0; i < 6; i++) { if (input.read_uint8() != aHdr[i]) return false; } return true; } size_t animation_manager::load_elements(memory_reader &input, sprite_sheet *pSpriteSheet, size_t iNumElements, size_t &iLoadedElements, size_t iElementStart, size_t iElementCount) { size_t iFirst = iLoadedElements + iElementStart; size_t iSpriteCount = pSpriteSheet->get_sprite_count(); while (iNumElements > 0) { if (iLoadedElements >= iElementCount || !input.are_bytes_available(12)) return SIZE_MAX; size_t iSprite = input.read_uint32(); int iX = input.read_int16(); int iY = input.read_int16(); uint8_t iLayerClass = input.read_uint8(); uint8_t iLayerId = input.read_uint8(); uint32_t iFlags = input.read_uint16(); if (iLayerClass > 12) iLayerClass = 6; // Nothing lives on layer 6 element oElement; oElement.sprite = iSprite; oElement.flags = iFlags; oElement.x = iX; oElement.y = iY; oElement.layer = iLayerClass; oElement.layer_id = iLayerId; if (oElement.sprite >= iSpriteCount) oElement.element_sprite_sheet = nullptr; else oElement.element_sprite_sheet = pSpriteSheet; elements.push_back(oElement); iLoadedElements++; iNumElements--; } return iFirst; } size_t animation_manager::make_list_elements(size_t iFirstElement, size_t iNumElements, size_t &iLoadedListElements, size_t iListStart, size_t iListCount) { size_t iFirst = iLoadedListElements + iListStart; // Verify there is enough room for all list elements + 0xFFFF if (iLoadedListElements + iNumElements + 1 > iListCount) return SIZE_MAX; assert(iFirstElement + iNumElements < 0xFFFF); // Overflow for list elements. while (iNumElements > 0) { element_list.push_back(static_cast(iFirstElement)); iLoadedListElements++; iFirstElement++; iNumElements--; } // Add 0xFFFF. element_list.push_back(0xFFFF); iLoadedListElements++; return iFirst; } //! Shift the first frame if all frames are available. /*! @param iFirst First frame number, or 0xFFFFFFFFu if no animation. @param iLength Number of frames in the animation. @param iStart Start of the frames for this file. @param iLoaded Number of loaded frames. @return The shifted first frame, or 0xFFFFFFFFu. */ static uint32_t shift_first(uint32_t iFirst, size_t iLength, size_t iStart, size_t iLoaded) { if (iFirst == 0xFFFFFFFFu || iFirst + iLength > iLoaded) return 0xFFFFFFFFu; return iFirst + static_cast(iStart); } void animation_manager::fix_next_frame(uint32_t iFirst, size_t iLength) { if (iFirst == 0xFFFFFFFFu) return; frame &oFirst = frames[iFirst]; oFirst.flags |= 0x1; // Start of animation flag. frame &oLast = frames[iFirst + iLength - 1]; oLast.next_frame = iFirst; // Loop last frame back to the first. } bool animation_manager::load_custom_animations(const uint8_t* pData, size_t iDataLength) { memory_reader input(pData, iDataLength); if (!load_header(input)) return false; if (!input.are_bytes_available(5*4)) return false; size_t iAnimationCount = input.read_uint32(); size_t iFrameCount = input.read_uint32(); size_t iElementCount = input.read_uint32(); size_t iSpriteCount = input.read_uint32(); input.read_uint32(); // Total number of bytes sprite data is not used. // Every element is referenced once, and one 0xFFFF for every frame. size_t iListCount = iElementCount + iFrameCount; size_t iFrameStart = frame_count; size_t iListStart = element_list_count; size_t iElementStart = element_count; if (iAnimationCount == 0 || iFrameCount == 0 || iElementCount == 0 || iSpriteCount == 0) return false; if (iElementStart + iElementCount >= 0xFFFF) // Overflow of list elements. return false; // Create new space for the elements. first_frames.reserve(first_frames.size() + iAnimationCount * 4); // Be optimistic in reservation. frames.reserve(iFrameStart + iFrameCount); element_list.reserve(iListStart + iListCount); elements.reserve(iElementStart + iElementCount); // Construct a sprite sheet for the sprites to be loaded. sprite_sheet *pSheet = new sprite_sheet; pSheet->set_sprite_count(iSpriteCount, canvas); custom_sheets.push_back(pSheet); size_t iLoadedFrames = 0; size_t iLoadedListElements = 0; size_t iLoadedElements = 0; size_t iLoadedSprites = 0; // Read the blocks of the file, until hitting EOF. for (;;) { if (input.is_at_end_of_file()) break; // Read identification bytes at the start of each block, and dispatch loading. if (!input.are_bytes_available(2)) return false; int first = input.read_uint8(); int second = input.read_uint8(); // Recognized a grouped animation block, load it. if (first == 'C' && second == 'A') { animation_key oKey; if (!input.are_bytes_available(2+4)) return false; oKey.tile_size = input.read_uint16(); size_t iNumFrames = input.read_uint32(); if (iNumFrames == 0) return false; if (!input.read_string(&oKey.name)) return false; if (!input.are_bytes_available(4*4)) return false; uint32_t iNorthFirst = input.read_uint32(); uint32_t iEastFirst = input.read_uint32(); uint32_t iSouthFirst = input.read_uint32(); uint32_t iWestFirst = input.read_uint32(); iNorthFirst = shift_first(iNorthFirst, iNumFrames, iFrameStart, iLoadedFrames); iEastFirst = shift_first(iEastFirst, iNumFrames, iFrameStart, iLoadedFrames); iSouthFirst = shift_first(iSouthFirst, iNumFrames, iFrameStart, iLoadedFrames); iWestFirst = shift_first(iWestFirst, iNumFrames, iFrameStart, iLoadedFrames); animation_start_frames oFrames; oFrames.north = -1; oFrames.east = -1; oFrames.south = -1; oFrames.west = -1; if (iNorthFirst != 0xFFFFFFFFu) { fix_next_frame(iNorthFirst, iNumFrames); oFrames.north = static_cast(first_frames.size()); first_frames.push_back(iNorthFirst); } if (iEastFirst != 0xFFFFFFFFu) { fix_next_frame(iEastFirst, iNumFrames); oFrames.east = static_cast(first_frames.size()); first_frames.push_back(iEastFirst); } if (iSouthFirst != 0xFFFFFFFFu) { fix_next_frame(iSouthFirst, iNumFrames); oFrames.south = static_cast(first_frames.size()); first_frames.push_back(iSouthFirst); } if (iWestFirst != 0xFFFFFFFFu) { fix_next_frame(iWestFirst, iNumFrames); oFrames.west = static_cast(first_frames.size()); first_frames.push_back(iWestFirst); } named_animation_pair p(oKey, oFrames); named_animations.insert(p); continue; } // Recognized a frame block, load it. else if (first == 'F' && second == 'R') { if (iLoadedFrames >= iFrameCount) return false; if (!input.are_bytes_available(2+2)) return false; int iSound = input.read_uint16(); size_t iNumElements = input.read_uint16(); size_t iElm = load_elements(input, pSheet, iNumElements, iLoadedElements, iElementStart, iElementCount); if (iElm == SIZE_MAX) return false; size_t iListElm = make_list_elements(iElm, iNumElements, iLoadedListElements, iListStart, iListCount); if (iListElm == SIZE_MAX) return false; frame oFrame; oFrame.list_index = iListElm; oFrame.next_frame = iFrameStart + iLoadedFrames + 1; // Point to next frame (changed later). oFrame.sound = iSound; oFrame.flags = 0; // Set later. oFrame.marker_x = 0; oFrame.marker_y = 0; oFrame.secondary_marker_x = 0; oFrame.secondary_marker_y = 0; set_bounding_box(oFrame); frames.push_back(oFrame); iLoadedFrames++; continue; } // Recognized a Sprite block, load it. else if (first == 'S' && second == 'P') { if (iLoadedSprites >= iSpriteCount) return false; if (!input.are_bytes_available(2+2+4)) return false; int iWidth = input.read_uint16(); int iHeight = input.read_uint16(); uint32_t iSize = input.read_uint32(); if (iSize > INT_MAX) // Check it is safe to use as 'int' return false; // Load data. uint8_t *pData = new (std::nothrow) uint8_t[iSize]; if (pData == nullptr) { return false; } if (!input.are_bytes_available(iSize)) { delete[] pData; return false; } for (uint32_t i = 0; i < iSize; i++) pData[i] = input.read_uint8(); if (!pSheet->set_sprite_data(iLoadedSprites, pData, true, iSize, iWidth, iHeight)) return false; iLoadedSprites++; continue; } // Unrecognized block, fail. else { return false; } } assert(iLoadedFrames == iFrameCount); assert(iLoadedListElements == iListCount); assert(iLoadedElements == iElementCount); assert(iLoadedSprites == iSpriteCount); // Fix the next pointer of the last frame in case it points to non-existing frames. frame &oFrame = frames[iFrameStart + iFrameCount - 1]; if (iFrameCount > 0 && oFrame.next_frame >= iFrameStart + iFrameCount) oFrame.next_frame = iFrameStart; // Useless, but maybe less crashy. animation_count = first_frames.size(); frame_count += iFrameCount; element_list_count += iListCount; element_count += iElementCount; assert(frames.size() == frame_count); assert(element_list.size() == element_list_count); assert(elements.size() == element_count); return true; } const animation_start_frames &animation_manager::get_named_animations(const std::string &sName, int iTilesize) const { static const animation_start_frames oNoneAnimations = {-1, -1, -1, -1}; animation_key oKey; oKey.name = sName; oKey.tile_size = iTilesize; named_animations_map::const_iterator iter = named_animations.find(oKey); if (iter == named_animations.end()) return oNoneAnimations; return (*iter).second; } size_t animation_manager::get_animation_count() const { return animation_count; } size_t animation_manager::get_frame_count() const { return frame_count; } size_t animation_manager::get_first_frame(size_t iAnimation) const { if(iAnimation < animation_count) return first_frames[iAnimation]; else return 0; } size_t animation_manager::get_next_frame(size_t iFrame) const { if(iFrame < frame_count) return frames[iFrame].next_frame; else return iFrame; } void animation_manager::set_animation_alt_palette_map(size_t iAnimation, const uint8_t* pMap, uint32_t iAlt32) { if(iAnimation >= animation_count) return; size_t iFrame = first_frames[iAnimation]; size_t iFirstFrame = iFrame; do { size_t iListIndex = frames[iFrame].list_index; for(; ; ++iListIndex) { uint16_t iElement = element_list[iListIndex]; if(iElement >= element_count) break; element& oElement = elements[iElement]; if (oElement.element_sprite_sheet != nullptr) oElement.element_sprite_sheet->set_sprite_alt_palette_map(oElement.sprite, pMap, iAlt32); } iFrame = frames[iFrame].next_frame; } while(iFrame != iFirstFrame); } bool animation_manager::set_frame_marker(size_t iFrame, int iX, int iY) { if(iFrame >= frame_count) return false; frames[iFrame].marker_x = iX; frames[iFrame].marker_y = iY; return true; } bool animation_manager::set_frame_secondary_marker(size_t iFrame, int iX, int iY) { if(iFrame >= frame_count) return false; frames[iFrame].secondary_marker_x = iX; frames[iFrame].secondary_marker_y = iY; return true; } bool animation_manager::get_frame_marker(size_t iFrame, int* pX, int* pY) { if(iFrame >= frame_count) return false; *pX = frames[iFrame].marker_x; *pY = frames[iFrame].marker_y; return true; } bool animation_manager::get_frame_secondary_marker(size_t iFrame, int* pX, int* pY) { if(iFrame >= frame_count) return false; *pX = frames[iFrame].secondary_marker_x; *pY = frames[iFrame].secondary_marker_y; return true; } bool animation_manager::hit_test(size_t iFrame, const ::layers& oLayers, int iX, int iY, uint32_t iFlags, int iTestX, int iTestY) const { if(iFrame >= frame_count) return false; const frame& oFrame = frames[iFrame]; iTestX -= iX; iTestY -= iY; if(iFlags & thdf_flip_horizontal) iTestX = -iTestX; if(iTestX < oFrame.bounding_left || iTestX > oFrame.bounding_right) return false; if(iFlags & thdf_flip_vertical) { if(-iTestY < oFrame.bounding_top || -iTestY > oFrame.bounding_bottom) return false; } else { if(iTestY < oFrame.bounding_top || iTestY > oFrame.bounding_bottom) return false; } if(iFlags & thdf_bound_box_hit_test) return true; size_t iListIndex = oFrame.list_index; for(; ; ++iListIndex) { uint16_t iElement = element_list[iListIndex]; if(iElement >= element_count) break; const element &oElement = elements[iElement]; if((oElement.layer_id != 0 && oLayers.layer_contents[oElement.layer] != oElement.layer_id) || oElement.element_sprite_sheet == nullptr) { continue; } if(iFlags & thdf_flip_horizontal) { unsigned int iWidth, iHeight; oElement.element_sprite_sheet->get_sprite_size_unchecked(oElement.sprite, &iWidth, &iHeight); if(oElement.element_sprite_sheet->hit_test_sprite(oElement.sprite, oElement.x + iWidth - iTestX, iTestY - oElement.y, oElement.flags ^ thdf_flip_horizontal)) { return true; } } else { if(oElement.element_sprite_sheet->hit_test_sprite(oElement.sprite, iTestX - oElement.x, iTestY - oElement.y, oElement.flags)) { return true; } } } return false; } void animation_manager::draw_frame(render_target* pCanvas, size_t iFrame, const ::layers& oLayers, int iX, int iY, uint32_t iFlags) const { if(iFrame >= frame_count) return; uint32_t iPassOnFlags = iFlags & thdf_alt_palette; size_t iListIndex = frames[iFrame].list_index; for(; ; ++iListIndex) { uint16_t iElement = element_list[iListIndex]; if(iElement >= element_count) break; const element &oElement = elements[iElement]; if (oElement.element_sprite_sheet == nullptr) continue; if(oElement.layer_id != 0 && oLayers.layer_contents[oElement.layer] != oElement.layer_id) { // Some animations involving doctors (i.e. #72, #74, maybe others) // only provide versions for heads W1 and B1, not W2 and B2. The // quickest way to fix this is this dirty hack here, which draws // the W1 layer as well as W2 if W2 is being used, and similarly // for B1 / B2. A better fix would be to go into each animation // which needs it, and duplicate the W1 / B1 layers to W2 / B2. if(oElement.layer == 5 && oLayers.layer_contents[5] - 4 == oElement.layer_id) /* don't skip */; else continue; } if(iFlags & thdf_flip_horizontal) { unsigned int iWidth, iHeight; oElement.element_sprite_sheet->get_sprite_size_unchecked(oElement.sprite, &iWidth, &iHeight); oElement.element_sprite_sheet->draw_sprite(pCanvas, oElement.sprite, iX - oElement.x - iWidth, iY + oElement.y, iPassOnFlags | (oElement.flags ^ thdf_flip_horizontal)); } else { oElement.element_sprite_sheet->draw_sprite(pCanvas, oElement.sprite, iX + oElement.x, iY + oElement.y, iPassOnFlags | oElement.flags); } } } size_t animation_manager::get_frame_sound(size_t iFrame) { if(iFrame < frame_count) return frames[iFrame].sound; else return 0; } void animation_manager::get_frame_extent(size_t iFrame, const ::layers& oLayers, int* pMinX, int* pMaxX, int* pMinY, int* pMaxY, uint32_t iFlags) const { int iMinX = INT_MAX; int iMaxX = INT_MIN; int iMinY = INT_MAX; int iMaxY = INT_MIN; if(iFrame < frame_count) { size_t iListIndex = frames[iFrame].list_index; for(; ; ++iListIndex) { uint16_t iElement = element_list[iListIndex]; if(iElement >= element_count) break; const element &oElement = elements[iElement]; if((oElement.layer_id != 0 && oLayers.layer_contents[oElement.layer] != oElement.layer_id) || oElement.element_sprite_sheet == nullptr) { continue; } int iX = oElement.x; int iY = oElement.y; unsigned int iWidth_, iHeight_; oElement.element_sprite_sheet->get_sprite_size_unchecked(oElement.sprite, &iWidth_, &iHeight_); int iWidth = static_cast(iWidth_); int iHeight = static_cast(iHeight_); if(iFlags & thdf_flip_horizontal) iX = -(iX + iWidth); if(iX < iMinX) iMinX = iX; if(iY < iMinY) iMinY = iY; if(iX + iWidth + 1 > iMaxX) iMaxX = iX + iWidth + 1; if(iY + iHeight + 1 > iMaxY) iMaxY = iY + iHeight + 1; } } if(pMinX) *pMinX = iMinX; if(pMaxX) *pMaxX = iMaxX; if(pMinY) *pMinY = iMinY; if(pMaxY) *pMaxY = iMaxY; } chunk_renderer::chunk_renderer(int width, int height, uint8_t *buffer) { data = buffer ? buffer : new uint8_t[width * height]; ptr = data; end = data + width * height; x = 0; y = 0; this->width = width; this->height = height; skip_eol = false; } chunk_renderer::~chunk_renderer() { delete[] data; } uint8_t* chunk_renderer::take_data() { uint8_t *buffer = data; data = 0; return buffer; } void chunk_renderer::chunk_fill_to_end_of_line(uint8_t value) { if(x != 0 || !skip_eol) { chunk_fill(width - x, value); } skip_eol = false; } void chunk_renderer::chunk_finish(uint8_t value) { chunk_fill(static_cast(end - ptr), value); } void chunk_renderer::chunk_fill(int npixels, uint8_t value) { fix_n_pixels(npixels); if(npixels > 0) { std::memset(ptr, value, npixels); increment_position(npixels); } } void chunk_renderer::chunk_copy(int npixels, const uint8_t* in_data) { fix_n_pixels(npixels); if(npixels > 0) { std::memcpy(ptr, in_data, npixels); increment_position(npixels); } } void chunk_renderer::fix_n_pixels(int& npixels) const { if(ptr + npixels > end) { npixels = static_cast(end - ptr); } } void chunk_renderer::increment_position(int npixels) { ptr += npixels; x += npixels; y += x / width; x = x % width; skip_eol = true; } void chunk_renderer::decode_chunks(const uint8_t* data, int datalen, bool complex) { if(complex) { while(!is_done() && datalen > 0) { uint8_t b = *data; --datalen; ++data; if(b == 0) { chunk_fill_to_end_of_line(0xFF); } else if(b < 0x40) { int amt = b; if(datalen < amt) amt = datalen; chunk_copy(amt, data); data += amt; datalen -= amt; } else if((b & 0xC0) == 0x80) { chunk_fill(b - 0x80, 0xFF); } else { int amt; uint8_t colour = 0; if(b == 0xFF) { if(datalen < 2) { break; } amt = (int)data[0]; colour = data[1]; data += 2; datalen -= 2; } else { amt = b - 60 - (b & 0x80) / 2; if(datalen > 0) { colour = *data; ++data; --datalen; } } chunk_fill(amt, colour); } } } else { while(!is_done() && datalen > 0) { uint8_t b = *data; --datalen; ++data; if(b == 0) { chunk_fill_to_end_of_line(0xFF); } else if(b < 0x80) { int amt = b; if(datalen < amt) amt = datalen; chunk_copy(amt, data); data += amt; datalen -= amt; } else { chunk_fill(0x100 - b, 0xFF); } } } chunk_finish(0xFF); } #define ARE_FLAGS_SET(val, flags) (((val) & (flags)) == (flags)) void animation::draw(render_target* pCanvas, int iDestX, int iDestY) { if(ARE_FLAGS_SET(flags, thdf_alpha_50 | thdf_alpha_75)) return; iDestX += x_relative_to_tile; iDestY += y_relative_to_tile; if(sound_to_play) { sound_player *pSounds = sound_player::get_singleton(); if(pSounds) pSounds->play_at(sound_to_play, iDestX, iDestY); sound_to_play = 0; } if(manager) { if(flags & thdf_crop) { clip_rect rcOld, rcNew; pCanvas->get_clip_rect(&rcOld); rcNew.y = rcOld.y; rcNew.h = rcOld.h; rcNew.x = iDestX + (crop_column - 1) * 32; rcNew.w = 64; clip_rect_intersection(rcNew, rcOld); pCanvas->set_clip_rect(&rcNew); manager->draw_frame(pCanvas, frame_index, layers, iDestX, iDestY, flags); pCanvas->set_clip_rect(&rcOld); } else manager->draw_frame(pCanvas, frame_index, layers, iDestX, iDestY, flags); } } void animation::draw_child(render_target* pCanvas, int iDestX, int iDestY) { if(ARE_FLAGS_SET(flags, thdf_alpha_50 | thdf_alpha_75)) return; if(ARE_FLAGS_SET(parent->flags, thdf_alpha_50 | thdf_alpha_75)) return; int iX = 0, iY = 0; parent->get_marker(&iX, &iY); iX += x_relative_to_tile + iDestX; iY += y_relative_to_tile + iDestY; if(sound_to_play) { sound_player *pSounds = sound_player::get_singleton(); if(pSounds) pSounds->play_at(sound_to_play, iX, iY); sound_to_play = 0; } if(manager) manager->draw_frame(pCanvas, frame_index, layers, iX, iY, flags); } bool animation::hit_test_child(int iDestX, int iDestY, int iTestX, int iTestY) { // TODO return false; } static void CalculateMorphRect(const clip_rect& rcOriginal, clip_rect& rcMorph, int iYLow, int iYHigh) { rcMorph = rcOriginal; if(rcMorph.y < iYLow) { rcMorph.h += rcMorph.y - iYLow; rcMorph.y = iYLow; } if(rcMorph.y + rcMorph.h >= iYHigh) { rcMorph.h = iYHigh - rcMorph.y - 1; } } void animation::draw_morph(render_target* pCanvas, int iDestX, int iDestY) { if(ARE_FLAGS_SET(flags, thdf_alpha_50 | thdf_alpha_75)) return; if(!manager) return; iDestX += x_relative_to_tile; iDestY += y_relative_to_tile; if(sound_to_play) { sound_player *pSounds = sound_player::get_singleton(); if(pSounds) pSounds->play_at(sound_to_play, iDestX, iDestY); sound_to_play = 0; } clip_rect oClipRect; pCanvas->get_clip_rect(&oClipRect); clip_rect oMorphRect; CalculateMorphRect(oClipRect, oMorphRect, iDestY + morph_target->x_relative_to_tile, iDestY + morph_target->y_relative_to_tile + 1); pCanvas->set_clip_rect(&oMorphRect); manager->draw_frame(pCanvas, frame_index, layers, iDestX, iDestY, flags); CalculateMorphRect(oClipRect, oMorphRect, iDestY + morph_target->y_relative_to_tile, iDestY + morph_target->speed.dx); pCanvas->set_clip_rect(&oMorphRect); manager->draw_frame(pCanvas, morph_target->frame_index, morph_target->layers, iDestX, iDestY, morph_target->flags); pCanvas->set_clip_rect(&oClipRect); } bool animation::hit_test(int iDestX, int iDestY, int iTestX, int iTestY) { if(ARE_FLAGS_SET(flags, thdf_alpha_50 | thdf_alpha_75)) return false; if(manager == nullptr) return false; return manager->hit_test(frame_index, layers, x_relative_to_tile + iDestX, y_relative_to_tile + iDestY, flags, iTestX, iTestY); } bool animation::hit_test_morph(int iDestX, int iDestY, int iTestX, int iTestY) { if(ARE_FLAGS_SET(flags, thdf_alpha_50 | thdf_alpha_75)) return false; if(manager == nullptr) return false; return manager->hit_test(frame_index, layers, x_relative_to_tile + iDestX, y_relative_to_tile + iDestY, flags, iTestX, iTestY) || morph_target->hit_test( iDestX, iDestY, iTestX, iTestY); } #undef ARE_FLAGS_SET static bool THAnimation_hit_test_child(drawable* pSelf, int iDestX, int iDestY, int iTestX, int iTestY) { return reinterpret_cast(pSelf)->hit_test_child(iDestX, iDestY, iTestX, iTestY); } static void THAnimation_draw_child(drawable* pSelf, render_target* pCanvas, int iDestX, int iDestY) { reinterpret_cast(pSelf)->draw_child(pCanvas, iDestX, iDestY); } static bool THAnimation_hit_test_morph(drawable* pSelf, int iDestX, int iDestY, int iTestX, int iTestY) { return reinterpret_cast(pSelf)->hit_test_morph(iDestX, iDestY, iTestX, iTestY); } static void THAnimation_draw_morph(drawable* pSelf, render_target* pCanvas, int iDestX, int iDestY) { reinterpret_cast(pSelf)->draw_morph(pCanvas, iDestX, iDestY); } static bool THAnimation_hit_test(drawable* pSelf, int iDestX, int iDestY, int iTestX, int iTestY) { return reinterpret_cast(pSelf)->hit_test(iDestX, iDestY, iTestX, iTestY); } static void THAnimation_draw(drawable* pSelf, render_target* pCanvas, int iDestX, int iDestY) { reinterpret_cast(pSelf)->draw(pCanvas, iDestX, iDestY); } static bool THAnimation_is_multiple_frame_animation(drawable* pSelf) { animation *pAnimation = reinterpret_cast(pSelf); if(pAnimation) { size_t firstFrame = pAnimation->get_animation_manager()->get_first_frame(pAnimation->get_animation()); size_t nextFrame = pAnimation->get_animation_manager()->get_next_frame(firstFrame); return nextFrame != firstFrame; } else return false; } animation_base::animation_base() { x_relative_to_tile = 0; y_relative_to_tile = 0; for(int i = 0; i < 13; ++i) layers.layer_contents[i] = 0; flags = 0; } animation::animation(): manager(nullptr), morph_target(nullptr), animation_index(0), frame_index(0), speed({0,0}), sound_to_play(0), crop_column(0) { draw_fn = THAnimation_draw; hit_test_fn = THAnimation_hit_test; is_multiple_frame_animation_fn = THAnimation_is_multiple_frame_animation; } void animation::persist(lua_persist_writer *pWriter) const { lua_State *L = pWriter->get_stack(); // Write the next chained thing lua_rawgeti(L, luaT_environindex, 2); lua_pushlightuserdata(L, next); lua_rawget(L, -2); pWriter->fast_write_stack_object(-1); lua_pop(L, 2); // Write the drawable fields pWriter->write_uint(flags); #define IS_USING_FUNCTION_SET(d, ht) draw_fn == (THAnimation_ ## d) \ && hit_test_fn == (THAnimation_ ## ht) if(IS_USING_FUNCTION_SET(draw, hit_test)) pWriter->write_uint(1); else if(IS_USING_FUNCTION_SET(draw_child, hit_test_child)) pWriter->write_uint(2); else if(IS_USING_FUNCTION_SET(draw_morph, hit_test_morph)) { // NB: Prior version of code used the number 3 here, and forgot // to persist the morph target. pWriter->write_uint(4); lua_rawgeti(L, luaT_environindex, 2); lua_pushlightuserdata(L, morph_target); lua_rawget(L, -2); pWriter->write_stack_object(-1); lua_pop(L, 2); } else pWriter->write_uint(0); #undef IS_USING_FUNCTION_SET // Write the simple fields pWriter->write_uint(animation_index); pWriter->write_uint(frame_index); pWriter->write_int(x_relative_to_tile); pWriter->write_int(y_relative_to_tile); pWriter->write_int((int)sound_to_play); // Not a uint, for compatibility pWriter->write_int(0); // For compatibility if(flags & thdf_crop) pWriter->write_int(crop_column); // Write the unioned fields if(draw_fn != THAnimation_draw_child) { pWriter->write_int(speed.dx); pWriter->write_int(speed.dy); } else { lua_rawgeti(L, luaT_environindex, 2); lua_pushlightuserdata(L, parent); lua_rawget(L, -2); pWriter->write_stack_object(-1); lua_pop(L, 2); } // Write the layers int iNumLayers = 13; for( ; iNumLayers >= 1; --iNumLayers) { if(layers.layer_contents[iNumLayers - 1] != 0) break; } pWriter->write_uint(iNumLayers); pWriter->write_byte_stream(layers.layer_contents, iNumLayers); } void animation::depersist(lua_persist_reader *pReader) { lua_State *L = pReader->get_stack(); do { // Read the chain if(!pReader->read_stack_object()) break; next = reinterpret_cast(lua_touserdata(L, -1)); if(next) next->prev = this; lua_pop(L, 1); // Read drawable fields if(!pReader->read_uint(flags)) break; int iFunctionSet; if(!pReader->read_uint(iFunctionSet)) break; switch(iFunctionSet) { case 3: // 3 should be the morph set, but the actual morph target is // missing, so settle for a graphical bug rather than a segfault // by reverting to the normal function set. case 1: draw_fn = THAnimation_draw; hit_test_fn = THAnimation_hit_test; break; case 2: draw_fn = THAnimation_draw_child; hit_test_fn = THAnimation_hit_test_child; break; case 4: draw_fn = THAnimation_draw_morph; hit_test_fn = THAnimation_hit_test_morph; pReader->read_stack_object(); morph_target = reinterpret_cast(lua_touserdata(L, -1)); lua_pop(L, 1); break; default: pReader->set_error(lua_pushfstring(L, "Unknown animation function set #%i", iFunctionSet)); return; } // Read the simple fields if(!pReader->read_uint(animation_index)) break; if(!pReader->read_uint(frame_index)) break; if(!pReader->read_int(x_relative_to_tile)) break; if(!pReader->read_int(y_relative_to_tile)) break; int iDummy; if(!pReader->read_int(iDummy)) break; if(iDummy >= 0) sound_to_play = (unsigned int)iDummy; if(!pReader->read_int(iDummy)) break; if(flags & thdf_crop) { if(!pReader->read_int(crop_column)) break; } else crop_column = 0; // Read the unioned fields if(draw_fn != THAnimation_draw_child) { if(!pReader->read_int(speed.dx)) break; if(!pReader->read_int(speed.dy)) break; } else { if(!pReader->read_stack_object()) break; parent = (animation*)lua_touserdata(L, -1); lua_pop(L, 1); } // Read the layers std::memset(layers.layer_contents, 0, sizeof(layers.layer_contents)); int iNumLayers; if(!pReader->read_uint(iNumLayers)) break; if(iNumLayers > 13) { if(!pReader->read_byte_stream(layers.layer_contents, 13)) break; if(!pReader->read_byte_stream(nullptr, iNumLayers - 13)) break; } else { if(!pReader->read_byte_stream(layers.layer_contents, iNumLayers)) break; } // Fix the m_pAnimator field luaT_getenvfield(L, 2, "animator"); manager = (animation_manager*)lua_touserdata(L, -1); lua_pop(L, 1); return; } while(false); pReader->set_error("Cannot depersist animation instance"); } void animation::tick() { frame_index = manager->get_next_frame(frame_index); if(draw_fn != THAnimation_draw_child) { x_relative_to_tile += speed.dx; y_relative_to_tile += speed.dy; } if(morph_target) { morph_target->y_relative_to_tile += morph_target->speed.dy; if(morph_target->y_relative_to_tile < morph_target->x_relative_to_tile) morph_target->y_relative_to_tile = morph_target->x_relative_to_tile; } //Female flying to heaven sound fix: if(frame_index == 6987) sound_to_play = 123; else sound_to_play = manager->get_frame_sound(frame_index); } void animation_base::remove_from_tile() { link_list::remove_from_list(); } void animation_base::attach_to_tile(map_tile *pMapNode, int layer) { remove_from_tile(); link_list *pList; if(flags & thdf_early_list) pList = &pMapNode->oEarlyEntities; else pList = pMapNode; this->set_drawing_layer(layer); #define GetFlags(x) (reinterpret_cast(x)->m_iFlags) while(pList->next && pList->next->get_drawing_layer() < layer) { pList = pList->next; } #undef GetFlags prev = pList; if(pList->next != nullptr) { pList->next->prev = this; this->next = pList->next; } else { next = nullptr; } pList->next = this; } void animation::set_parent(animation *pParent) { remove_from_tile(); if(pParent == nullptr) { draw_fn = THAnimation_draw; hit_test_fn = THAnimation_hit_test; speed = { 0, 0 }; } else { draw_fn = THAnimation_draw_child; hit_test_fn = THAnimation_hit_test_child; parent = pParent; next = parent->next; if(next) next->prev = this; prev = parent; parent->next = this; } } void animation::set_animation(animation_manager* pManager, size_t iAnimation) { manager = pManager; animation_index = iAnimation; frame_index = pManager->get_first_frame(iAnimation); if(morph_target) { morph_target = nullptr; draw_fn = THAnimation_draw; hit_test_fn = THAnimation_hit_test; } } bool animation::get_marker(int* pX, int* pY) { if(!manager || !manager->get_frame_marker(frame_index, pX, pY)) return false; if(flags & thdf_flip_horizontal) *pX = -*pX; *pX += x_relative_to_tile; *pY += y_relative_to_tile + 16; return true; } bool animation::get_secondary_marker(int* pX, int* pY) { if(!manager || !manager->get_frame_secondary_marker(frame_index, pX, pY)) return false; if(flags & thdf_flip_horizontal) *pX = -*pX; *pX += x_relative_to_tile; *pY += y_relative_to_tile + 16; return true; } static int GetAnimationDurationAndExtent(animation_manager *pManager, size_t iFrame, const ::layers& oLayers, int* pMinY, int* pMaxY, uint32_t iFlags) { int iMinY = INT_MAX; int iMaxY = INT_MIN; int iDuration = 0; size_t iCurFrame = iFrame; do { int iFrameMinY; int iFrameMaxY; pManager->get_frame_extent(iCurFrame, oLayers, nullptr, nullptr, &iFrameMinY, &iFrameMaxY, iFlags); if(iFrameMinY < iMinY) iMinY = iFrameMinY; if(iFrameMaxY > iMaxY) iMaxY = iFrameMaxY; iCurFrame = pManager->get_next_frame(iCurFrame); ++iDuration; } while(iCurFrame != iFrame); if(pMinY) *pMinY = iMinY; if(pMaxY) *pMaxY = iMaxY; return iDuration; } void animation::set_morph_target(animation *pMorphTarget, unsigned int iDurationFactor) { morph_target = pMorphTarget; draw_fn = THAnimation_draw_morph; hit_test_fn = THAnimation_hit_test_morph; /* Morphing is the process by which two animations are combined to give a single animation of one animation turning into another. At the moment, morphing is done by having a y value, above which the original animation is rendered, and below which the new animation is rendered, and having the y value move upward a bit each frame. One example of where this is used is when transparent or invisible patients are cured at the pharmacy cabinet. The process of morphing requires four state variables, which are stored in the morph target animation: * The y value top limit - morph_target->x * The y value threshold - morph_target->y * The y value bottom limit - morph_target->speed.dx * The y value increment per frame - morph_target->speed.dy This obviously means that the morph target should not be ticked or rendered as it's position and speed contain other values. */ int iOrigMinY, iOrigMaxY; int iMorphMinY, iMorphMaxY; #define GADEA GetAnimationDurationAndExtent int iOriginalDuration = GADEA(manager, frame_index, layers, &iOrigMinY, &iOrigMaxY, flags); int iMorphDuration = GADEA(morph_target->manager, morph_target->frame_index, morph_target->layers, &iMorphMinY, &iMorphMaxY, morph_target->flags); if(iMorphDuration > iOriginalDuration) iMorphDuration = iOriginalDuration; #undef GADEA iMorphDuration *= iDurationFactor; if(iOrigMinY < iMorphMinY) morph_target->x_relative_to_tile = iOrigMinY; else morph_target->x_relative_to_tile = iMorphMinY; if(iOrigMaxY > iMorphMaxY) morph_target->speed.dx = iOrigMaxY; else morph_target->speed.dx = iMorphMaxY; int iDist = morph_target->x_relative_to_tile - morph_target->speed.dx; morph_target->speed.dy = (iDist - iMorphDuration + 1) / iMorphDuration; morph_target->y_relative_to_tile = morph_target->speed.dx; } void animation::set_frame(size_t iFrame) { frame_index = iFrame; } void animation_base::set_layer(int iLayer, int iId) { if(0 <= iLayer && iLayer <= 12) { layers.layer_contents[iLayer] = static_cast(iId); } } static bool THSpriteRenderList_hit_test(drawable* pSelf, int iDestX, int iDestY, int iTestX, int iTestY) { return reinterpret_cast(pSelf)-> hit_test(iDestX, iDestY, iTestX, iTestY); } static void THSpriteRenderList_draw(drawable* pSelf, render_target* pCanvas, int iDestX, int iDestY) { reinterpret_cast(pSelf)-> draw(pCanvas, iDestX, iDestY); } static bool THSpriteRenderList_is_multiple_frame_animation(drawable* pSelf) { return false; } sprite_render_list::sprite_render_list() { draw_fn = THSpriteRenderList_draw; hit_test_fn = THSpriteRenderList_hit_test; is_multiple_frame_animation_fn = THSpriteRenderList_is_multiple_frame_animation; buffer_size = 0; sprite_count = 0; sheet = nullptr; sprites = nullptr; dx_per_tick = 0; dy_per_tick = 0; lifetime = -1; } sprite_render_list::~sprite_render_list() { delete[] sprites; } void sprite_render_list::tick() { x_relative_to_tile += dx_per_tick; y_relative_to_tile += dy_per_tick; if(lifetime > 0) --lifetime; } void sprite_render_list::draw(render_target* pCanvas, int iDestX, int iDestY) { if(!sheet) return; iDestX += x_relative_to_tile; iDestY += y_relative_to_tile; for(sprite *pSprite = sprites, *pLast = sprites + sprite_count; pSprite != pLast; ++pSprite) { sheet->draw_sprite(pCanvas, pSprite->index, iDestX + pSprite->x, iDestY + pSprite->y, flags); } } bool sprite_render_list::hit_test(int iDestX, int iDestY, int iTestX, int iTestY) { // TODO return false; } void sprite_render_list::set_lifetime(int iLifetime) { if(iLifetime < 0) iLifetime = -1; lifetime = iLifetime; } void sprite_render_list::append_sprite(size_t iSprite, int iX, int iY) { if(buffer_size == sprite_count) { int iNewSize = buffer_size * 2; if(iNewSize == 0) iNewSize = 4; sprite* pNewSprites = new sprite[iNewSize]; #ifdef _MSC_VER #pragma warning(disable: 4996) #endif std::copy(sprites, sprites + sprite_count, pNewSprites); #ifdef _MSC_VER #pragma warning(default: 4996) #endif delete[] sprites; sprites = pNewSprites; buffer_size = iNewSize; } sprites[sprite_count].index = iSprite; sprites[sprite_count].x = iX; sprites[sprite_count].y = iY; ++sprite_count; } void sprite_render_list::persist(lua_persist_writer *pWriter) const { lua_State *L = pWriter->get_stack(); pWriter->write_uint(sprite_count); pWriter->write_uint(flags); pWriter->write_int(x_relative_to_tile); pWriter->write_int(y_relative_to_tile); pWriter->write_int(dx_per_tick); pWriter->write_int(dy_per_tick); pWriter->write_int(lifetime); for(sprite *pSprite = sprites, *pLast = sprites + sprite_count; pSprite != pLast; ++pSprite) { pWriter->write_uint(pSprite->index); pWriter->write_int(pSprite->x); pWriter->write_int(pSprite->y); } // Write the layers int iNumLayers = 13; for( ; iNumLayers >= 1; --iNumLayers) { if(layers.layer_contents[iNumLayers - 1] != 0) break; } pWriter->write_uint(iNumLayers); pWriter->write_byte_stream(layers.layer_contents, iNumLayers); // Write the next chained thing lua_rawgeti(L, luaT_environindex, 2); lua_pushlightuserdata(L, next); lua_rawget(L, -2); pWriter->fast_write_stack_object(-1); lua_pop(L, 2); } void sprite_render_list::depersist(lua_persist_reader *pReader) { lua_State *L = pReader->get_stack(); if(!pReader->read_uint(sprite_count)) return; buffer_size = sprite_count; delete[] sprites; sprites = new sprite[buffer_size]; if(!pReader->read_uint(flags)) return; if(!pReader->read_int(x_relative_to_tile)) return; if(!pReader->read_int(y_relative_to_tile)) return; if(!pReader->read_int(dx_per_tick)) return; if(!pReader->read_int(dy_per_tick)) return; if(!pReader->read_int(lifetime)) return; for(sprite *pSprite = sprites, *pLast = sprites + sprite_count; pSprite != pLast; ++pSprite) { if(!pReader->read_uint(pSprite->index)) return; if(!pReader->read_int(pSprite->x)) return; if(!pReader->read_int(pSprite->y)) return; } // Read the layers std::memset(layers.layer_contents, 0, sizeof(layers.layer_contents)); int iNumLayers; if(!pReader->read_uint(iNumLayers)) return; if(iNumLayers > 13) { if(!pReader->read_byte_stream(layers.layer_contents, 13)) return; if(!pReader->read_byte_stream(nullptr, iNumLayers - 13)) return; } else { if(!pReader->read_byte_stream(layers.layer_contents, iNumLayers)) return; } // Read the chain if(!pReader->read_stack_object()) return; next = reinterpret_cast(lua_touserdata(L, -1)); if(next) next->prev = this; lua_pop(L, 1); // Fix the sheet field luaT_getenvfield(L, 2, "sheet"); sheet = (sprite_sheet*)lua_touserdata(L, -1); lua_pop(L, 1); } CorsixTH-0.63/CorsixTH/Src/th_gfx.h000066400000000000000000000560111347163623700170460ustar00rootroot00000000000000/* Copyright (c) 2009 Peter "Corsix" Cawley 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. */ #ifndef CORSIX_TH_TH_GFX_H_ #define CORSIX_TH_TH_GFX_H_ #include "th.h" class lua_persist_reader; class lua_persist_writer; enum class scaled_items { none, sprite_sheets, bitmaps, all }; #include "th_gfx_sdl.h" #include "th_gfx_font.h" #include #include #include void clip_rect_intersection(clip_rect& rcClip, const clip_rect& rcIntersect); //! Bitflags for drawing operations enum draw_flags : uint32_t { /** Sprite drawing flags **/ /* Where possible, designed to be the same values used by TH data files */ //! Draw with the left becoming the right and vice versa thdf_flip_horizontal = 1 << 0, //! Draw with the top becoming the bottom and vice versa thdf_flip_vertical = 1 << 1, //! Draw with 50% transparency thdf_alpha_50 = 1 << 2, //! Draw with 75% transparency thdf_alpha_75 = 1 << 3, //! Draw using a remapped palette thdf_alt_palette = 1 << 4, /** How to draw alternative palette in 32bpp. */ /* A 3 bit field (bits 5,6,7), currently 2 bits used. */ //! Lowest bit of the field. thdf_alt32_start = 5, //! Mask for the 32bpp alternative drawing values. thdf_alt32_mask = 0x7 << thdf_alt32_start, //! Draw the sprite with the normal palette (fallback option). thdf_alt32_plain = 0 << thdf_alt32_start, //! Draw the sprite in grey scale. thdf_alt32_grey_scale = 1 << thdf_alt32_start, //! Draw the sprite with red and blue colours swapped. thdf_alt32_blue_red_swap = 2 << thdf_alt32_start, /** Object attached to tile flags **/ /* (should be set prior to attaching to a tile) */ //! Attach to the early sprite list (right-to-left pass) thdf_early_list = 1 << 10, //! Keep this sprite at the bottom of the attached list thdf_list_bottom = 1 << 11, //! Hit-test using bounding-box precision rather than pixel-perfect thdf_bound_box_hit_test = 1 << 12, //! Apply a cropping operation prior to drawing thdf_crop = 1 << 13, }; /** Helper structure with parameters to create a #THRenderTarget. */ struct render_target_creation_params { int width; ///< Expected width of the render target. int height; ///< Expected height of the render target. int bpp; ///< Expected colour depth of the render target. bool fullscreen; ///< Run full-screen. bool present_immediate; ///< Whether to present immediately to the user (else wait for Vsync). }; /*! Base class for a linked list of drawable objects. Note that "object" is used as a generic term, not in specific reference to game objects (though they are the most common thing in drawing lists). */ // TODO: Replace this struct with something cleaner struct drawable : public link_list { //! Draw the object at a specific point on a render target /*! Can also "draw" the object to the speakers, i.e. play sounds. */ void (*draw_fn)(drawable* pSelf, render_target* pCanvas, int iDestX, int iDestY); //! Perform a hit test against the object /*! Should return true if when the object is drawn at (iDestX, iDestY) on a canvas, the point (iTestX, iTestY) is within / on the object. */ bool (*hit_test_fn)(drawable* pSelf, int iDestX, int iDestY, int iTestX, int iTestY); //! Drawing flags (zero or more list flags from #draw_flags). uint32_t flags; /** Returns true if instance is a multiple frame animation. Should be overloaded in derived class. */ bool (*is_multiple_frame_animation_fn)(drawable *pSelf); }; /*! Utility class for decoding Theme Hospital "chunked" graphics files. Generally used internally by sprite_sheet. */ class chunk_renderer { public: //! Initialise a renderer for a specific size result /*! @param width Pixel width of the resulting image @param height Pixel height of the resulting image @param buffer If nullptr, then a new buffer is created to render the image onto. Otherwise, should be an array at least width*height in size. Ownership of this pointer is assumed by the class - call takeData() to take ownership back again. */ chunk_renderer(int width, int height, uint8_t *buffer = nullptr); ~chunk_renderer(); // TODO: Should be function, not method of chunk_renderer //! Convert a stream of chunks into a raw bitmap /*! @param pData Stream data. @param iDataLen Length of \a pData. @param bComplex true if pData is a stream of "complex" chunks, false if pData is a stream of "simple" chunks. Passing the wrong value will usually result in a very visible wrong result. Use getData() or takeData() to obtain the resulting bitmap. */ void decode_chunks(const uint8_t* pData, int iDataLen, bool bComplex); //! Get the result buffer, and take ownership of it /*! This transfers ownership of the buffer to the caller. After calling, the class will not have any buffer, and thus cannot be used for anything. */ uint8_t* take_data(); //! Get the result buffer inline const uint8_t* get_data() const {return data;} //! Perform a "copy" chunk (normally called by decodeChunks) void chunk_copy(int npixels, const uint8_t* in_data); //! Perform a "fill" chunk (normally called by decodeChunks) void chunk_fill(int npixels, uint8_t value); //! Perform a "fill to end of line" chunk (normally called by decodeChunks) void chunk_fill_to_end_of_line(uint8_t value); //! Perform a "fill to end of file" chunk (normally called by decodeChunks) void chunk_finish(uint8_t value); private: inline bool is_done() {return ptr == end;} inline void fix_n_pixels(int& npixels) const; inline void increment_position(int npixels); uint8_t *data, *ptr, *end; int x, y, width, height; bool skip_eol; }; //! Layer information (see animation_manager::draw_frame) struct layers { uint8_t layer_contents[13]; }; class memory_reader; /** Key value for finding an animation. */ struct animation_key { std::string name; ///< Name of the animations. int tile_size; ///< Size of a tile. }; //! Less-than operator for map-sorting. /*! @param oK First key value. @param oL Second key value. @return Whether \a oK should be before \a oL. */ inline bool operator<(const animation_key &oK, const animation_key &oL) { if (oK.tile_size != oL.tile_size) return oK.tile_size < oL.tile_size; return oK.name < oL.name; } /** * Start frames of an animation, in each view direction. * A negative number indicates there is no animation in that direction. */ struct animation_start_frames { long north; ///< Animation start frame for the 'north' view. long east; ///< Animation start frame for the 'east' view. long south; ///< Animation start frame for the 'south' view. long west; ///< Animation start frame for the 'west' view. }; /** Map holding the custom animations. */ typedef std::map named_animations_map; /** Insertion data structure. */ typedef std::pair named_animation_pair; //! Theme Hospital sprite animation manager /*! An animation manager takes a sprite sheet and four animation information files, and uses them to draw animation frames and provide information about the animations. */ class animation_manager { public: animation_manager(); ~animation_manager(); void set_sprite_sheet(sprite_sheet* pSpriteSheet); //! Load original animations. /*! set_sprite_sheet() must be called before calling this. @param pStartData Animation first frame indices (e.g. VSTART-1.ANI) @param iStartDataLength Length of \a pStartData. @param pFrameData Frame details (e.g. VFRA-1.ANI) @param iFrameDataLength Length of \a pFrameData @param pListData Element indices list (e.g. VLIST-1.ANI) @param iListDataLength Length of \a pListData @param pElementData Element details (e.g. VELE-1.ANI) @param iElementDataLength Length of \a pElementData @return Loading was successful. */ bool load_from_th_file(const uint8_t* pStartData, size_t iStartDataLength, const uint8_t* pFrameData, size_t iFrameDataLength, const uint8_t* pListData, size_t iListDataLength, const uint8_t* pElementData, size_t iElementDataLength); //! Set the video target. /*! @param pCanvas Video surface to use. */ void set_canvas(render_target *pCanvas); //! Load free animations. /*! @param pData Start of the loaded data. @param iDataLength Length of the loaded data. @return Loading was successful. */ bool load_custom_animations(const uint8_t* pData, size_t iDataLength); //! Get the total numer of animations size_t get_animation_count() const; //! Get the total number of animation frames size_t get_frame_count() const; //! Get the index of the first frame of an animation size_t get_first_frame(size_t iAnimation) const; //! Get the index of the frame after a given frame /*! To draw an animation frame by frame, call get_first_frame() to get the index of the first frame, and then keep on calling get_next_frame() using the most recent return value from get_next_frame() or get_first_frame(). */ size_t get_next_frame(size_t iFrame) const; //! Set the palette remap data for an animation /*! This sets the palette remap data for every single sprite used by the given animation. If the animation (or any of its sprites) are drawn using the thdf_alt_palette flag, then palette indices will be mapped to new palette indices by the 256 byte array pMap. This is typically used to draw things in different colours or in greyscale. */ void set_animation_alt_palette_map(size_t iAnimation, const uint8_t* pMap, uint32_t iAlt32); //! Draw an animation frame /*! @param pCanvas The render target to draw onto. @param iFrame The frame index to draw (should be in range [0, getFrameCount() - 1]) @param oLayers Information to decide what to draw on each layer. An animation is comprised of up to thirteen layers, numbered 0 through 12. Some animations will have different options for what to render on each layer. For example, patient animations generally have the different options on layer 1 as different clothes, so if layer 1 is set to the value 0, they may have their default clothes, and if set to the value 2 or 4 or 6, they may have other clothes. Play with the AnimView tool for a better understanding of layers, though note that while it can draw more than one option on each layer, this class can only draw a single option for each layer. @param iX The screen position to use as the animation X origin. @param iY The screen position to use as the animation Y origin. @param iFlags Zero or more THDrawFlags flags. */ void draw_frame(render_target* pCanvas, size_t iFrame, const ::layers& oLayers, int iX, int iY, uint32_t iFlags) const; void get_frame_extent(size_t iFrame, const ::layers& oLayers, int* pMinX, int* pMaxX, int* pMinY, int* pMaxY, uint32_t iFlags) const; size_t get_frame_sound(size_t iFrame); bool hit_test(size_t iFrame, const ::layers& oLayers, int iX, int iY, uint32_t iFlags, int iTestX, int iTestY) const; bool set_frame_marker(size_t iFrame, int iX, int iY); bool set_frame_secondary_marker(size_t iFrame, int iX, int iY); bool get_frame_marker(size_t iFrame, int* pX, int* pY); bool get_frame_secondary_marker(size_t iFrame, int* pX, int* pY); //! Retrieve a custom animation by name and tile size. /*! @param sName Name of the animation. @param iTilesize Tile size of the animation. @return A set starting frames for the queried animation. */ const animation_start_frames &get_named_animations(const std::string &sName, int iTilesize) const; private: #if CORSIX_TH_USE_PACK_PRAGMAS #pragma pack(push) #pragma pack(1) #endif // Animation information structure reinterpreted from Theme Hospital data. struct th_animation_properties { uint16_t first_frame; // It could be that frame is a uint32_t rather than a uint16_t, which // would resolve the following unknown (which seems to always be zero). uint16_t unknown; } CORSIX_TH_PACKED_FLAGS; // Frame information structure reinterpreted from Theme Hospital data. struct th_frame_properties { uint32_t list_index; // These fields have something to do with width and height, but it's // not clear quite exactly how. uint8_t width; uint8_t height; // If non-zero, index into sound.dat filetable. uint8_t sound; // Combination of zero or more fame_flags values uint8_t flags; uint16_t next; } CORSIX_TH_PACKED_FLAGS; // Structure reinterpreted from Theme Hospital data. struct th_element_properties { uint16_t table_position; uint8_t offx; uint8_t offy; // High nibble: The layer which the element belongs to [0, 12] // Low nibble: Zero or more draw_flags uint8_t flags; // The layer option / layer id uint8_t layerid; } CORSIX_TH_PACKED_FLAGS; #if CORSIX_TH_USE_PACK_PRAGMAS #pragma pack(pop) #endif struct frame { size_t list_index; ///< First entry in #element_list (pointing to an element) for this frame. size_t next_frame; ///< Number of the next frame. unsigned int sound; ///< Sound to play, if non-zero. unsigned int flags; ///< Flags of the frame. Bit 0=start of animation. // Bounding rectangle is with all layers / options enabled - used as a // quick test prior to a full pixel perfect test. int bounding_left; ///< Left edge of the bounding rectangle of this frame. int bounding_right; ///< Right edge of the bounding rectangle of this frame. int bounding_top; ///< Top edge of the bounding rectangle of this frame. int bounding_bottom; ///< Bottom edge of the bounding rectangle of this frame. // Markers are used to know where humanoids are on an frame. The // positions are pixels offsets from the centre of the frame's base // tile to the centre of the humanoid's feet. int marker_x; ///< X position of the first center of a humanoids feet. int marker_y; ///< Y position of the first center of a humanoids feet. int secondary_marker_x; ///< X position of the second center of a humanoids feet. int secondary_marker_y; ///< Y position of the second center of a humanoids feet. }; struct element { size_t sprite; ///< Sprite number of the sprite sheet to display. uint32_t flags; ///< Flags of the sprite. ///< bit 0=flip vertically, bit 1=flip horizontally, ///< bit 2=draw 50% alpha, bit 3=draw 75% alpha. int x; ///< X offset of the sprite. int y; ///< Y offset of the sprite. uint8_t layer; ///< Layer class (0..12). uint8_t layer_id; ///< Value of the layer class to match. sprite_sheet *element_sprite_sheet; ///< Sprite sheet to use for this element. }; std::vector first_frames; ///< First frame number of an animation. std::vector frames; ///< The loaded frames. std::vector element_list; ///< List of elements for a frame. std::vector elements; ///< Sprite Elements. std::vector custom_sheets; ///< Sprite sheets with custom graphics. named_animations_map named_animations; ///< Collected named animations. sprite_sheet* sheet; ///< Sprite sheet to use. render_target *canvas; ///< Video surface to use. size_t animation_count; ///< Number of animations. size_t frame_count; ///< Number of frames. size_t element_list_count; ///< Number of list elements. size_t element_count; ///< Number of sprite elements. //! Compute the bounding box of the frame. /*! @param oFrame Frame to inspect/set. */ void set_bounding_box(frame &oFrame); //! Load sprite elements from the input. /*! @param [inout] input Data to read. @param pSpriteSheet Sprite sheet to use. @param iNumElements Number of elements to read. @param [inout] iLoadedElements Number of loaded elements so far. @param iElementStart Offset of the first element. @param iElementCount Number of elements to load. @return Index of the first loaded element in #elements. Negative value means failure. */ size_t load_elements(memory_reader &input, sprite_sheet *pSpriteSheet, size_t iNumElements, size_t &iLoadedElements, size_t iElementStart, size_t iElementCount); //! Construct a list element for every element, and a 0xFFFF at the end. /*! @param iFirstElement Index of the first element in #elements. @param iNumElements Number of elements to add. @param [inout] iLoadedListElements Number of created list elements so far. @param iListStart Offset of the first created list element. @param iListCount Expected number of list elements to create. @return Index of the list elements, or a negative value to indicate failure. */ size_t make_list_elements(size_t iFirstElement, size_t iNumElements, size_t &iLoadedListElements, size_t iListStart, size_t iListCount); //! Fix the flags of the first frame, and set the next frame of the last frame back to the first frame. /*! @param iFirst First frame of the animation, or 0xFFFFFFFFu. @param iLength Number of frames in the animation. */ void fix_next_frame(uint32_t iFirst, size_t iLength); }; struct map_tile; class animation_base : public drawable { public: animation_base(); void remove_from_tile(); void attach_to_tile(map_tile *pMapNode, int layer); uint32_t get_flags() const {return flags;} int get_x() const {return x_relative_to_tile;} int get_y() const {return y_relative_to_tile;} void set_flags(uint32_t iFlags) {flags = iFlags;} void set_position(int iX, int iY) {x_relative_to_tile = iX, y_relative_to_tile = iY;} void set_layer(int iLayer, int iId); void set_layers_from(const animation_base *pSrc) {layers = pSrc->layers;} // bool isMultipleFrameAnimation() { return false;} protected: //! X position on tile (not tile x-index) int x_relative_to_tile; //! Y position on tile (not tile y-index) int y_relative_to_tile; ::layers layers; }; class animation : public animation_base { public: animation(); void set_parent(animation *pParent); void tick(); void draw(render_target* pCanvas, int iDestX, int iDestY); bool hit_test(int iDestX, int iDestY, int iTestX, int iTestY); void draw_morph(render_target* pCanvas, int iDestX, int iDestY); bool hit_test_morph(int iDestX, int iDestY, int iTestX, int iTestY); void draw_child(render_target* pCanvas, int iDestX, int iDestY); bool hit_test_child(int iDestX, int iDestY, int iTestX, int iTestY); link_list* get_previous() {return prev;} size_t get_animation() const {return animation_index;} bool get_marker(int* pX, int* pY); bool get_secondary_marker(int* pX, int* pY); size_t get_frame() const {return frame_index;} int get_crop_column() const {return crop_column;} void set_animation(animation_manager* pManager, size_t iAnimation); void set_morph_target(animation *pMorphTarget, unsigned int iDurationFactor = 1); void set_frame(size_t iFrame); void set_speed(int iX, int iY) {speed.dx = iX, speed.dy = iY;} void set_crop_column(int iColumn) {crop_column = iColumn;} void persist(lua_persist_writer *pWriter) const; void depersist(lua_persist_reader *pReader); animation_manager* get_animation_manager(){ return manager;} private: animation_manager *manager; animation* morph_target; size_t animation_index; ///< Animation number. size_t frame_index; ///< Frame number. union { struct { //! Amount to change x per tick int dx; //! Amount to change y per tick int dy; } speed; //! Some animations are tied to the marker of another animation and //! hence have a parent rather than a speed. animation* parent; }; size_t sound_to_play; int crop_column; }; class sprite_render_list : public animation_base { public: sprite_render_list(); ~sprite_render_list(); void tick(); void draw(render_target* pCanvas, int iDestX, int iDestY); bool hit_test(int iDestX, int iDestY, int iTestX, int iTestY); void set_sheet(sprite_sheet* pSheet) {sheet = pSheet;} void set_speed(int iX, int iY) {dx_per_tick = iX, dy_per_tick = iY;} void set_lifetime(int iLifetime); void append_sprite(size_t iSprite, int iX, int iY); bool is_dead() const {return lifetime == 0;} void persist(lua_persist_writer *pWriter) const; void depersist(lua_persist_reader *pReader); private: struct sprite { size_t index; int x; int y; }; sprite_sheet* sheet; sprite* sprites; int sprite_count; int buffer_size; //! Amount to change x per tick int dx_per_tick; //! Amount to change y per tick int dy_per_tick; //! Number of ticks until reports as dead (-1 = never dies) int lifetime; }; #endif // CORSIX_TH_TH_GFX_H_ CorsixTH-0.63/CorsixTH/Src/th_gfx_font.cpp000066400000000000000000000772051347163623700204370ustar00rootroot00000000000000/* Copyright (c) 2010 Peter "Corsix" Cawley 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. */ #include "config.h" #include "th_gfx_font.h" #ifdef CORSIX_TH_USE_FREETYPE2 #include FT_GLYPH_H #include #include #endif #include #include #include static unsigned int next_utf8_codepoint(const char*& sString) { unsigned int iCode = *reinterpret_cast(sString++); unsigned int iContinuation; if(iCode & 0x80) { if((iCode & 0x40) == 0) { // Invalid encoding: character should not start with a continuation // byte. Hence return the Unicode replacement character. return 0xFFFD; } else { #define CONTINUATION_CHAR \ iContinuation = *reinterpret_cast(sString); \ if((iContinuation & 0xC0) != 0x80) \ /* Invalid encoding: not enough continuation characters. */ \ return 0xFFFD; \ iCode = (iCode << 6) | (iContinuation & 0x3F); \ ++sString iCode &= 0x3F; if(iCode & 0x20) { iCode &= 0x1F; if(iCode & 0x10) { iCode &= 0x0F; if(iCode & 0x08) { // Invalid encoding: too-long byte sequence. Hence // return the Unicode replacement character. return 0xFFFD; } CONTINUATION_CHAR; } CONTINUATION_CHAR; } CONTINUATION_CHAR; } #undef CONTINUATION_CHAR } return iCode; } #ifdef CORSIX_TH_USE_FREETYPE2 // Since these functions are only used when we use freetype2, this silences // warnings about defined and not used. static unsigned int decode_utf8(const char* sString) { return next_utf8_codepoint(sString); } static const char* previous_utf8_codepoint(const char* sString) { do { --sString; } while(((*sString) & 0xC0) == 0x80); return sString; } #endif bitmap_font::bitmap_font() { sheet = nullptr; letter_spacing = 0; line_spacing = 0; } void bitmap_font::set_sprite_sheet(sprite_sheet* pSpriteSheet) { sheet = pSpriteSheet; } void bitmap_font::set_separation(int iCharSep, int iLineSep) { letter_spacing = iCharSep; line_spacing = iLineSep; } static const uint16_t unicode_to_cp437_table[0x60] = { 0xFF, 0xAD, 0x9B, 0x9C, 0x3F, 0x9D, 0x3F, 0x3F, 0x3F, 0x3F, 0xA6, 0xAE, 0xAA, 0x3F, 0x3F, 0x3F, 0xF8, 0xF1, 0xFD, 0x3F, 0x3F, 0x3F, 0x3F, 0xFA, 0x3F, 0x3F, 0xA7, 0xAF, 0xAC, 0xAB, 0x3F, 0xA8, 0x3F, 0x3F, 0x3F, 0x3F, 0x8E, 0x8F, 0x3F, 0x80, 0x3F, 0x90, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xA5, 0x3F, 0x3F, 0x3F, 0x3F, 0x99, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x9A, 0x3F, 0x3F, 0xE1, 0x85, 0xA0, 0x83, 0x3F, 0x84, 0x86, 0x91, 0x87, 0x8A, 0x82, 0x88, 0x89, 0x8D, 0xA1, 0x8C, 0x8B, 0x3F, 0xA4, 0x95, 0xA2, 0x93, 0x3F, 0x94, 0xF6, 0x3F, 0x97, 0xA3, 0x96, 0x81, 0x3F, 0x3F, 0x98 }; static unsigned int unicode_to_codepage_437(unsigned int iCodePoint) { if(iCodePoint < 0x80) return iCodePoint; if(iCodePoint < 0xA0) return '?'; if(iCodePoint < 0x100) return unicode_to_cp437_table[iCodePoint - 0xA0]; switch(iCodePoint) { case 0x0192: return 0x9F; case 0x0393: return 0xE2; case 0x0398: return 0xE9; case 0x03A3: return 0xE4; case 0x03A6: return 0xE8; case 0x03A9: return 0xEA; case 0x03B1: return 0xE0; case 0x03B4: return 0xEB; case 0x03B5: return 0xEE; case 0x03BC: return 0xE6; case 0x03C0: return 0xE3; case 0x03C3: return 0xE5; case 0x03C4: return 0xE7; case 0x03C6: return 0xED; case 0x207F: return 0xFC; case 0x20A7: return 0x9E; case 0x2219: return 0xF9; case 0x221A: return 0xFB; case 0x221E: return 0xEC; case 0x2229: return 0xEF; case 0x2248: return 0xF7; case 0x2261: return 0xF0; case 0x2264: return 0xF3; case 0x2265: return 0xF2; case 0x2310: return 0xA9; case 0x2320: return 0xF4; case 0x2321: return 0xF5; case 0x25A0: return 0xFE; } return 0x3F; } text_layout bitmap_font::get_text_dimensions(const char* sMessage, size_t iMessageLength, int iMaxWidth) const { return draw_text_wrapped(nullptr, sMessage, iMessageLength, 0, 0, iMaxWidth, INT_MAX, 0); } void bitmap_font::draw_text(render_target* pCanvas, const char* sMessage, size_t iMessageLength, int iX, int iY) const { pCanvas->start_nonoverlapping_draws(); if(iMessageLength != 0 && sheet != nullptr) { const unsigned int iFirstASCII = 31; unsigned int iLastASCII = static_cast(sheet->get_sprite_count()) + iFirstASCII; const char* sMessageEnd = sMessage + iMessageLength; while(sMessage != sMessageEnd) { unsigned int iChar = unicode_to_codepage_437(next_utf8_codepoint(sMessage)); if(iFirstASCII <= iChar && iChar <= iLastASCII) { iChar -= iFirstASCII; unsigned int iWidth, iHeight; sheet->draw_sprite(pCanvas, iChar, iX, iY, 0); sheet->get_sprite_size_unchecked(iChar, &iWidth, &iHeight); iX += iWidth + letter_spacing; } } } pCanvas->finish_nonoverlapping_draws(); } text_layout bitmap_font::draw_text_wrapped(render_target* pCanvas, const char* sMessage, size_t iMessageLength, int iX, int iY, int iWidth, int iMaxRows, int iSkipRows, text_alignment eAlign) const { text_layout oDrawArea = {}; int iSkippedRows = 0; if(iMessageLength != 0 && sheet != nullptr) { const unsigned int iFirstASCII = 31; unsigned int iLastASCII = static_cast(sheet->get_sprite_count()) + iFirstASCII; const char* sMessageEnd = sMessage + iMessageLength; while(sMessage != sMessageEnd && oDrawArea.row_count < iMaxRows) { const char* sBreakPosition = sMessageEnd; const char* sLastGoodBreakPosition = sBreakPosition; int iMsgWidth = -letter_spacing; int iMsgBreakWidth = iMsgWidth; unsigned int iTallest = 0; const char* s; bool foundNewLine = false; unsigned int iNextChar = 0; for(s = sMessage; s != sMessageEnd; ) { const char* sOld = s; unsigned int iChar = unicode_to_codepage_437(next_utf8_codepoint(s)); iNextChar = unicode_to_codepage_437(static_cast(*s)); if((iChar == '\n' && iNextChar == '\n') || (iChar == '/' && iNextChar == '/')) { foundNewLine = true; iMsgBreakWidth = iMsgWidth; sBreakPosition = sOld; break; } unsigned int iCharWidth = 0, iCharHeight = 0; if(iFirstASCII <= iChar && iChar <= iLastASCII) { sheet->get_sprite_size_unchecked(iChar - iFirstASCII, &iCharWidth, &iCharHeight); } iMsgWidth += letter_spacing + iCharWidth; if(iChar == ' ') { sLastGoodBreakPosition = sOld; iMsgBreakWidth = iMsgWidth - iCharWidth; } if(iMsgWidth > iWidth) { sBreakPosition = sLastGoodBreakPosition; break; } if(iCharHeight > iTallest) iTallest = iCharHeight; } if(s == sMessageEnd) iMsgBreakWidth = iMsgWidth; if(iMsgBreakWidth > oDrawArea.width) oDrawArea.width = iMsgBreakWidth; if(iSkippedRows >= iSkipRows) { if(pCanvas) { int iXOffset = 0; if(iMsgBreakWidth < iWidth) iXOffset = (iWidth - iMsgBreakWidth) * static_cast(eAlign) / 2; draw_text(pCanvas, sMessage, sBreakPosition - sMessage, iX + iXOffset, iY); } iY += static_cast(iTallest) + line_spacing; oDrawArea.end_x = iMsgWidth; oDrawArea.row_count++; if (foundNewLine) { iY += static_cast(iTallest) + line_spacing; oDrawArea.row_count++; } } else { iSkippedRows++; if(foundNewLine) { if(iSkippedRows == iSkipRows) { iY += static_cast(iTallest) + line_spacing; oDrawArea.row_count++; } iSkippedRows++; } } sMessage = sBreakPosition; if(sMessage != sMessageEnd) { next_utf8_codepoint(sMessage); if(foundNewLine) { next_utf8_codepoint(sMessage); } } foundNewLine = 0; } } oDrawArea.end_x = iX + oDrawArea.end_x; oDrawArea.end_y = iY; return oDrawArea; } #ifdef CORSIX_TH_USE_FREETYPE2 FT_Library freetype_font::freetype_library = nullptr; int freetype_font::freetype_init_count = 0; freetype_font::freetype_font() { font_face = nullptr; is_done_freetype_init = false; for(cached_text* pEntry = cache; pEntry != cache + (1 << cache_size_log2); ++pEntry) { pEntry->message = nullptr; pEntry->message_length = 0; pEntry->message_buffer_length = 0; pEntry->alignment = text_alignment::left; pEntry->width = 0; pEntry->height = 0; pEntry->widest_line_width = 0; pEntry->last_x = 0; pEntry->data = nullptr; pEntry->is_valid = false; pEntry->texture = nullptr; } } freetype_font::~freetype_font() { for( cached_text* pEntry = cache; pEntry != cache + (1 << cache_size_log2); ++pEntry) { delete[] pEntry->message; delete[] pEntry->data; free_texture(pEntry); } if(font_face != nullptr) FT_Done_Face(font_face); if(is_done_freetype_init) { if(--freetype_init_count == 0) { FT_Done_FreeType(freetype_library); freetype_library = nullptr; } } } const char* freetype_font::get_copyright_notice() { return "Portions of this software are copyright \xC2\xA9 2010 " \ "The FreeType Project (www.freetype.org). All rights reserved."; } FT_Error freetype_font::initialise() { if(is_done_freetype_init) return FT_Err_Ok; if(freetype_init_count == 0) { int iError = FT_Init_FreeType(&freetype_library); if(iError != FT_Err_Ok) return iError; } ++freetype_init_count; is_done_freetype_init = true; return FT_Err_Ok; } void freetype_font::clear_cache() { for(cached_text* pEntry = cache; pEntry != cache + (1 << cache_size_log2); ++pEntry) { pEntry->is_valid = false; free_texture(pEntry); } } FT_Error freetype_font::set_face(const uint8_t* pData, size_t iLength) { int iError; if(freetype_library == nullptr) { iError = initialise(); if(iError != FT_Err_Ok) return iError; } if(font_face) { iError = FT_Done_Face(font_face); if(iError != FT_Err_Ok) return iError; font_face = nullptr; } iError = FT_New_Memory_Face(freetype_library, pData, static_cast(iLength), 0, &font_face); return iError; } FT_Error freetype_font::match_bitmap_font(sprite_sheet* pBitmapFontSpriteSheet) { if(pBitmapFontSpriteSheet == nullptr) return FT_Err_Invalid_Argument; // Try to take the size and colour of a standard character (em is generally // the standard font character, but for fonts which only have numbers, zero // seems like the next best choice). for(const char* sCharToTry = "M0"; *sCharToTry; ++sCharToTry) { unsigned int iWidth, iHeight; unsigned int iSprite = *sCharToTry - 31; if(pBitmapFontSpriteSheet->get_sprite_size(iSprite, &iWidth, &iHeight) && pBitmapFontSpriteSheet->get_sprite_average_colour(iSprite, &colour) && iWidth > 1 && iHeight > 1) { return set_ideal_character_size(iWidth, iHeight); } } // Take the average size of all characters, and the colour of one of them. unsigned int iWidthSum = 0, iHeightSum = 0, iAverageNum = 0; for(unsigned int i = 0; i < pBitmapFontSpriteSheet->get_sprite_count(); ++i) { unsigned int iWidth, iHeight; pBitmapFontSpriteSheet->get_sprite_size_unchecked(i, &iWidth, &iHeight); if(iWidth <= 1 || iHeight <= 1) continue; if(!pBitmapFontSpriteSheet->get_sprite_average_colour(i, &colour)) continue; iWidthSum += iWidth; iHeightSum += iHeight; ++iAverageNum; } if(iAverageNum == 0) return FT_Err_Divide_By_Zero; return set_ideal_character_size((iWidthSum + iAverageNum / 2) / iAverageNum, (iHeightSum + iAverageNum / 2) / iAverageNum); } FT_Error freetype_font::set_ideal_character_size(int iWidth, int iHeight) { if(font_face == nullptr) return FT_Err_Invalid_Face_Handle; if(is_monochrome() || iHeight <= 14 || iWidth <= 9) { // Look for a bitmap strike of a similar size int iBestBitmapScore = 50; FT_Int iBestBitmapIndex = -1; for(FT_Int i = 0; i < font_face->num_fixed_sizes; ++i) { if(font_face->available_sizes[i].height > iHeight) continue; int iDeltaH = iHeight - font_face->available_sizes[i].height; int iDeltaW = font_face->available_sizes[i].width - iWidth; int iScore = iDeltaH * iDeltaH * 3 + iDeltaW * iDeltaW; if(iScore < iBestBitmapScore) { iBestBitmapScore = iScore; iBestBitmapIndex = i; } } // Select the bitmap strike, if there was one if(iBestBitmapIndex != -1) return FT_Select_Size(font_face, iBestBitmapIndex); } // Go with the original size request if there was no bitmap strike, unless // the size was very small, in which case scale things up, as vector fonts // look rather poor at small sizes. if(iHeight < 14) { iWidth = iWidth * 14 / iHeight; iHeight = 14; } if(iWidth < 9) { iHeight = iHeight * 9 / iWidth; iWidth = 9; } return FT_Set_Pixel_Sizes(font_face, iWidth, iHeight); } text_layout freetype_font::get_text_dimensions(const char* sMessage, size_t iMessageLength, int iMaxWidth) const { return draw_text_wrapped(nullptr, sMessage, iMessageLength, 0, 0, iMaxWidth, INT_MAX, 0); } void freetype_font::draw_text(render_target* pCanvas, const char* sMessage, size_t iMessageLength, int iX, int iY) const { draw_text_wrapped(pCanvas, sMessage, iMessageLength, iX, iY, INT_MAX); } struct codepoint_glyph { FT_Glyph_Metrics metrics; FT_Glyph glyph; FT_UInt index; }; // Determine if the character code is a suitable Chinese/Japanese/Korean // character for a line break. bool isCjkBreakCharacter(int charcode) { return (charcode == 0x3000 || // Ideographic space charcode == 0x3002 || // Ideographic full stop charcode == 0xff0c || // Fullwidth comma charcode == 0xff0d || // Fullwidth hyphen-minus charcode == 0xff1b || // Fullwidth semicolon charcode == 0xff1f); //Fullwidth question mark } text_layout freetype_font::draw_text_wrapped(render_target* pCanvas, const char* sMessage, size_t iMessageLength, int iX, int iY, int iWidth, int iMaxRows, int iSkipRows, text_alignment eAlign) const { text_layout oDrawArea = {}; int iNumRows = 0; int iHandledRows = 0; // Calculate an index into the cache to use for this piece of text. size_t iHash = iMessageLength + (static_cast(iMaxRows) << (cache_size_log2 / 8)) + (static_cast(iSkipRows) << (cache_size_log2 / 4)) + (static_cast(iWidth) << (cache_size_log2 / 2)) + (static_cast(eAlign) << cache_size_log2); for(size_t i = 0; i < iMessageLength; ++i) iHash ^= (iHash << 5) + (iHash >> 2) + static_cast(sMessage[i]); iHash &= (1 << cache_size_log2) - 1; cached_text* pEntry = cache + iHash; if(pEntry->message_length != iMessageLength || pEntry->width > iWidth || (iWidth != INT_MAX && pEntry->width < iWidth) || pEntry->alignment != eAlign || !pEntry->is_valid || std::memcmp(pEntry->message, sMessage, iMessageLength) != 0) { // Cache entry does not match the message being drawn, so discard the // cache entry. free_texture(pEntry); delete[] pEntry->data; pEntry->data = nullptr; pEntry->is_valid = false; // Set the entry metadata to that of the new message. if(iMessageLength > pEntry->message_buffer_length) { delete[] pEntry->message; pEntry->message = new char[iMessageLength]; pEntry->message_buffer_length = iMessageLength; } std::memcpy(pEntry->message, sMessage, iMessageLength); pEntry->message_length = iMessageLength; pEntry->width = iWidth; pEntry->alignment = eAlign; // Split the message into lines, and determine the position within the // line for each character. std::vector > vLines; std::vector vCharPositions(iMessageLength); std::map mapGlyphs; vLines.reserve(2); FT_Vector ftvPen = {0, 0}; FT_Bool bUseKerning = FT_HAS_KERNING(font_face); FT_UInt iPreviousGlyphIndex = 0; const char* sMessageStart = sMessage; const char* sMessageEnd = sMessage + iMessageLength; const char* sLineStart = sMessageStart; const char* sLineBreakPosition = sLineStart; while(sMessage != sMessageEnd) { const char* sOldMessage = sMessage; unsigned int iCode = next_utf8_codepoint(sMessage); unsigned int iNextCode = *reinterpret_cast(sMessage); bool bIsNewLine = (iCode == '\n' && iNextCode == '\n') || (iCode == '/' && iNextCode == '/'); // Just replace single line breaks with space. if(!bIsNewLine && iCode == '\n') { iCode = ' '; } codepoint_glyph& oGlyph = mapGlyphs[iCode]; if(oGlyph.glyph == nullptr) { oGlyph.index = FT_Get_Char_Index(font_face, iCode); /* FT_Error iError = */ FT_Load_Glyph(font_face, oGlyph.index, FT_LOAD_DEFAULT); // TODO: iError != FT_Err_Ok /* iError = */ FT_Get_Glyph(font_face->glyph, &oGlyph.glyph); // TODO: iError != FT_Err_Ok oGlyph.metrics = font_face->glyph->metrics; } // Apply kerning if(bUseKerning && iPreviousGlyphIndex && oGlyph.index) { FT_Vector ftvKerning; FT_Get_Kerning(font_face, iPreviousGlyphIndex, oGlyph.index, FT_KERNING_DEFAULT, &ftvKerning); ftvPen.x += ftvKerning.x; ftvPen.y += ftvKerning.y; } // Make an automatic line break if one is needed. if((ftvPen.x + oGlyph.metrics.horiBearingX + oGlyph.metrics.width + 63) / 64 >= iWidth || bIsNewLine) { if(bIsNewLine) { sLineBreakPosition = sOldMessage; } ftvPen.x = ftvPen.y = 0; iPreviousGlyphIndex = 0; if(sLineStart != sLineBreakPosition) { // Only really save if we have skipped enough lines if(iHandledRows >= iSkipRows) { vLines.push_back(std::make_pair(sLineStart, sLineBreakPosition)); } if(bIsNewLine) { if(iHandledRows + 1 >= iSkipRows) { vLines.push_back(std::make_pair(sLineBreakPosition, sLineBreakPosition)); } next_utf8_codepoint(sLineBreakPosition); iHandledRows++; } sMessage = sLineBreakPosition; next_utf8_codepoint(sMessage); sLineStart = sMessage; } else { if(iHandledRows >= iSkipRows) { vLines.push_back(std::make_pair(sLineStart, sOldMessage)); } if(bIsNewLine) { next_utf8_codepoint(sMessage); sLineStart = sLineBreakPosition = sMessage; } else { sMessage = sLineStart = sLineBreakPosition = sOldMessage; } } iHandledRows++; continue; } // Determine if a line can be broken at the current position. if (iCode == ' ') { sLineBreakPosition = sOldMessage; } else if (isCjkBreakCharacter(iCode)) { // break after this codepoint (cjk codepoints are 3 bytes in utf-8) sLineBreakPosition = sOldMessage + 3; } // Save (unless we are skipping lines) and advance the pen. if(iHandledRows >= iSkipRows) { vCharPositions[sOldMessage - sMessageStart] = ftvPen; } iPreviousGlyphIndex = oGlyph.index; ftvPen.x += oGlyph.metrics.horiAdvance; } if(sLineStart != sMessageEnd) vLines.push_back(std::make_pair(sLineStart, sMessageEnd)); sMessage = sMessageStart; // Finalise the position of each character (alignment might change X, // and baseline / lines will change Y), and calculate overall height // and widest line. FT_Pos iPriorLinesHeight = 0; FT_Pos iLineWidth = 0, iAlignDelta = 0, iWidestLine = 0; const FT_Pos iLineSpacing = 2 << 6; codepoint_glyph& oGlyph = mapGlyphs['l']; FT_Pos iBearingY = oGlyph.metrics.horiBearingY; FT_Pos iNormalLineHeight = oGlyph.metrics.height - iBearingY; iBearingY = ((iBearingY + 63) >> 6) << 6; // Pixel-align iNormalLineHeight += iBearingY; iNormalLineHeight += iLineSpacing; iNormalLineHeight = ((iNormalLineHeight + 63) >> 6) << 6; // Pixel-align for(std::vector >::const_iterator itr = vLines.begin(), itrEnd = vLines.end(); itr != itrEnd && iNumRows < iMaxRows; ++itr) { // Calculate the X change resulting from alignment. const char* sLastChar = previous_utf8_codepoint(itr->second); codepoint_glyph& oLastGlyph = mapGlyphs[decode_utf8(sLastChar)]; iLineWidth = vCharPositions[sLastChar - sMessage].x + oLastGlyph.metrics.horiBearingX + oLastGlyph.metrics.width; if((iLineWidth >> 6) < iWidth) { iAlignDelta = ((iWidth * 64 - iLineWidth) * static_cast(eAlign)) / 2; } if(iLineWidth > iWidestLine) iWidestLine = iLineWidth; // Calculate the line height and baseline position. FT_Pos iLineHeight = 0; FT_Pos iBaselinePos = 0; for(const char* s = itr->first; s < itr->second; ) { codepoint_glyph& oGlyph = mapGlyphs[next_utf8_codepoint(s)]; FT_Pos iBearingY = oGlyph.metrics.horiBearingY; FT_Pos iCoBearingY = oGlyph.metrics.height - iBearingY; if(iBearingY > iBaselinePos) iBaselinePos = iBearingY; if(iCoBearingY > iLineHeight) iLineHeight = iCoBearingY; } iBaselinePos = ((iBaselinePos + 63) >> 6) << 6; // Pixel-align iLineHeight += iBaselinePos; iLineHeight += iLineSpacing; iLineHeight = ((iLineHeight + 63) >> 6) << 6; // Pixel-align iNormalLineHeight = std::max(iNormalLineHeight, iLineHeight); // Apply the character position changes. for(const char* s = itr->first; s < itr->second; next_utf8_codepoint(s)) { FT_Vector& ftvPos = vCharPositions[s - sMessage]; ftvPos.x += iAlignDelta; ftvPos.y += iBaselinePos + iPriorLinesHeight; } // Empty lines is a special case if(itr->first == itr->second) { iPriorLinesHeight += iNormalLineHeight; } else { iPriorLinesHeight += iLineHeight; } iNumRows++; } if(iPriorLinesHeight > 0) iPriorLinesHeight -= iLineSpacing; pEntry->height = static_cast(1 + (iPriorLinesHeight >> 6)); pEntry->widest_line_width = static_cast(1 + (iWidestLine >> 6)); pEntry->row_count = iNumRows; if(iWidth == INT_MAX) pEntry->width = pEntry->widest_line_width; pEntry->last_x = 1 + (static_cast(iLineWidth + iAlignDelta) >> 6); // Get a bitmap for each glyph. bool bIsMonochrome = is_monochrome(); FT_Render_Mode eRenderMode = bIsMonochrome ? FT_RENDER_MODE_MONO : FT_RENDER_MODE_NORMAL; for(std::map::iterator itr = mapGlyphs.begin(), itrEnd = mapGlyphs.end(); itr != itrEnd; ++itr) { FT_Glyph_To_Bitmap(&itr->second.glyph, eRenderMode, nullptr, 1); } // Prepare a canvas for rendering. pEntry->data = new uint8_t[pEntry->width * pEntry->height]; std::memset(pEntry->data, 0, pEntry->width * pEntry->height); int iDrawnLines = 0; // Render each character to the canvas. for(std::vector >::const_iterator itr = vLines.begin(), itrEnd = vLines.end(); itr != itrEnd && iDrawnLines < iMaxRows + iSkipRows; ++itr) { iDrawnLines++; for(const char* s = itr->first; s < itr->second; ) { FT_Vector& ftvPos = vCharPositions[s - sMessage]; unsigned int iCode = next_utf8_codepoint(s); if(iCode == '\n') { iCode = ' '; } FT_BitmapGlyph pGlyph = reinterpret_cast( mapGlyphs[iCode].glyph); FT_Pos x = pGlyph->left + (ftvPos.x >> 6); FT_Pos y = (ftvPos.y >> 6) - pGlyph->top; // We may have asked for grayscale but been given monochrome, // hence use the bitmap's pixel_mode rather than bIsMonochrome. switch(pGlyph->bitmap.pixel_mode) { case FT_PIXEL_MODE_GRAY: render_gray(pEntry, &pGlyph->bitmap, x, y); break; case FT_PIXEL_MODE_MONO: render_mono(pEntry, &pGlyph->bitmap, x, y); break; } } } // Free all glyphs. for(std::map::const_iterator itr = mapGlyphs.begin(), itrEnd = mapGlyphs.end(); itr != itrEnd; ++itr) { FT_Done_Glyph(itr->second.glyph); } pEntry->is_valid = true; } if (pCanvas != nullptr) { if (pEntry->texture == nullptr) make_texture(pCanvas, pEntry); draw_texture(pCanvas, pEntry, iX, iY); } oDrawArea.width = pEntry->widest_line_width; oDrawArea.end_x = iX + pEntry->last_x; oDrawArea.end_y = iY + pEntry->height; oDrawArea.row_count = pEntry->row_count; return oDrawArea; } // In theory, the renderers should only be invoked with coordinates which end // up within the canvas being rendered to. In practice, this might not happen, // at which point the following line can be removed. // #define TRUST_RENDER_COORDS void freetype_font::render_mono(cached_text *pCacheEntry, FT_Bitmap* pBitmap, FT_Pos x, FT_Pos y) const { uint8_t* pOutRow = pCacheEntry->data + y * pCacheEntry->width + x; uint8_t* pInRow = pBitmap->buffer; for(int iY = 0; iY < pBitmap->rows; ++iY, pOutRow += pCacheEntry->width, pInRow += pBitmap->pitch) { #ifndef TRUST_RENDER_COORDS if(y + iY < 0) continue; if(y + iY >= pCacheEntry->height) break; #endif uint8_t *pIn = pInRow, *pOut = pOutRow; uint8_t iMask = 0x80; for(int iX = 0; iX < pBitmap->width; ++iX, ++pOut) { #ifndef TRUST_RENDER_COORDS if(x + iX < 0) continue; if(x + iX >= pCacheEntry->width) break; #endif if(*pIn & iMask) *pOut = 0xFF; iMask = static_cast(iMask / 2); if(iMask == 0) { iMask = 0x80; ++pIn; } } } } void freetype_font::render_gray(cached_text *pCacheEntry, FT_Bitmap* pBitmap, FT_Pos x, FT_Pos y) const { uint8_t* pOutRow = pCacheEntry->data + y * pCacheEntry->width + x; uint8_t* pInRow = pBitmap->buffer; for(int iY = 0; iY < pBitmap->rows; ++iY, pOutRow += pCacheEntry->width, pInRow += pBitmap->pitch) { #ifndef TRUST_RENDER_COORDS if(y + iY < 0) continue; if(y + iY >= pCacheEntry->height) break; #endif uint8_t *pIn = pInRow, *pOut = pOutRow; for(int iX = 0; iX < pBitmap->width; ++iX, ++pIn, ++pOut) { #ifndef TRUST_RENDER_COORDS if(x + iX < 0) continue; if(x + iX >= pCacheEntry->width) break; #endif unsigned int iIn = *pIn; unsigned int iOut = *pOut; uint8_t cMerged = static_cast(iIn + iOut - (iIn * iOut) / 255); *pOut = cMerged; } } } #endif // CORSIX_TH_USE_FREETYPE2 CorsixTH-0.63/CorsixTH/Src/th_gfx_font.h000066400000000000000000000306401347163623700200740ustar00rootroot00000000000000/* Copyright (c) 2010 Peter "Corsix" Cawley 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. */ #ifndef CORSIX_TH_TH_GFX_FONT_H_ #define CORSIX_TH_TH_GFX_FONT_H_ #include "th_gfx.h" #ifdef CORSIX_TH_USE_FREETYPE2 #include #include FT_FREETYPE_H #endif enum class text_alignment { left = 0, center = 1, right = 2, }; /** Structure for the bounds of a text string that is rendered to the screen. */ struct text_layout { //! Number of rows the rendered text spans int row_count; //! Left X-coordinate for the start of the text int start_x; //! Right X-coordinate for the right part of the last letter rendered int end_x; //! Top Y-coordinate for the start of the text int start_y; //! Bottom Y-coordinate for the end of the text int end_y; //! Width of the widest line in the text int width; }; class font { public: virtual ~font() = default; //! Get the size of drawn text. /*! If iMaxWidth is specified the text will wrap, so that the height can span multiple rows. Otherwise gets the size of a single line of text. @param sMessage A UTF-8 encoded string containing a single line of text to measure the width and height of. @param iMessageLength The length, in bytes (not characters), of the string at sMessage. @param iMaxWidth The maximum length, in pixels, that the text may occupy. Default is INT_MAX. */ virtual text_layout get_text_dimensions(const char* sMessage, size_t iMessageLength, int iMaxWidth = INT_MAX) const = 0; //! Draw a single line of text /*! @param pCanvas The render target to draw onto. @param sMessage A UTF-8 encoded string containing a single line of text to draw. @param iMessageLength The length, in bytes (not characters), of the string at sMessage. @param iX The X coordinate of the top-left corner of the bounding rectangle for the drawn text. @param iY The Y coordinate of the top-left corner of the bounding rectangle for the drawn text. */ virtual void draw_text(render_target* pCanvas, const char* sMessage, size_t iMessageLength, int iX, int iY) const = 0; //! Draw a single line of text, splitting it at word boundaries /*! This function still only draws a single line of text (i.e. any line breaks like \r and \n in sMessage are ignored), but inserts line breaks between words so that no single line is wider than iWidth pixels. If iMaxRows is specified it will simply cut after that many rows. @param pCanvas The canvas on which to draw. Can be nullptr, in which case nothing is drawn, but other calculations are still made. @param sMessage The line of text to draw, encoded in CP437. @param iMessageLength The length (in bytes) of sMessage. @param iX The X position to start drawing on the canvas. @param iY The Y position to start drawing on the canvas. @param iWidth The maximum width of each line of text. @param iMaxRows The maximum number of rows to draw. Default is INT_MAX. @param iSkipRows Start rendering text after skipping this many rows. @param eAlign How to align each line of text if the width of the line of text is smaller than iWidth. */ virtual text_layout draw_text_wrapped(render_target* pCanvas, const char* sMessage, size_t iMessageLength, int iX, int iY, int iWidth, int iMaxRows = INT_MAX, int iSkipRows = 0, text_alignment eAlign = text_alignment::left) const = 0; }; class bitmap_font final : public font { public: bitmap_font(); //! Set the character glyph sprite sheet /*! The sprite sheet should have the space character (ASCII 0x20) at sprite index 1, and other ASCII characters following on in simple order (i.e. '!' (ASCII 0x21) at index 2, 'A' (ASCII 0x41) at index 34, etc.) */ void set_sprite_sheet(sprite_sheet* pSpriteSheet); sprite_sheet* get_sprite_sheet() {return sheet;} //! Set the separation between characters and between lines /*! Generally, the sprite sheet glyphs will already include separation, and thus no extra separation is required (set iCharSep and iLineSep to 0). */ void set_separation(int iCharSep, int iLineSep); text_layout get_text_dimensions(const char* sMessage, size_t iMessageLength, int iMaxWidth = INT_MAX) const override; void draw_text(render_target* pCanvas, const char* sMessage, size_t iMessageLength, int iX, int iY) const override; text_layout draw_text_wrapped(render_target* pCanvas, const char* sMessage, size_t iMessageLength, int iX, int iY, int iWidth, int iMaxRows = INT_MAX, int iSkipRows = 0, text_alignment eAlign = text_alignment::left) const override; private: sprite_sheet* sheet; int letter_spacing; int line_spacing; }; #ifdef CORSIX_TH_USE_FREETYPE2 //! Adaptor around the FreeType2 library to a THFont. /*! Due to the relatively high cost of rendering a message with FreeType, this class implements internal caching of messages, so rendering a message once will be quite expensive, but subsequently rendering the same message again will be quite cheap (provided that it hasn't fallen out of the cache). Unlike THBitmapFont which sits entirely on top of existing interfaces, some of the internal methods of this class are implemented by each individual rendering engine (said methods are roughly for the equivalent of the THRawBitmap class, but with an alpha channel, and a single colour rather than a palette). */ class freetype_font final : public font { public: freetype_font(); ~freetype_font(); //! Get the copyright notice which should be displayed for FreeType2. /*! To comply with the FreeType2 license, the string returned by this function needs to be displayed at some point. @return A null-terminated UTF-8 encoded string. */ static const char* get_copyright_notice(); //! Initialise the FreeType2 library. /*! This will be called automatically by setFace() as required. */ FT_Error initialise(); //! Remove all cached strings, as our graphics context has changed void clear_cache(); //! Set the font face to be used. /*! @param pData Pointer to the start of a font file loaded into memory. This block of memory must remain valid for at least the lifetime of the THFreeTypeFont objcect. @param iLength The size, in bytes, of the font file at pData. */ FT_Error set_face(const uint8_t* pData, size_t iLength); //! Set the font size and colour to match that of a bitmap font. /*! Note that the matching is done on a best-effort basis, and will likely not be perfect. This must be called after setFace(). @param pBitmapFontSpriteSheet The sprite sheet of the bitmap font. */ FT_Error match_bitmap_font(sprite_sheet* pBitmapFontSpriteSheet); //! Set the ideal character size using pixel values. /*! Note that the given size might be changed a small amount if doing so would result in a much nicer rendered font. This must be called after setFace(). */ FT_Error set_ideal_character_size(int iWidth, int iHeight); text_layout get_text_dimensions(const char* sMessage, size_t iMessageLength, int iMaxWidth = INT_MAX) const override; void draw_text(render_target* pCanvas, const char* sMessage, size_t iMessageLength, int iX, int iY) const override; text_layout draw_text_wrapped(render_target* pCanvas, const char* sMessage, size_t iMessageLength, int iX, int iY, int iWidth, int iMaxRows = INT_MAX, int iSkipRows = 0, text_alignment eAlign = text_alignment::left) const override; private: struct cached_text { //! The text being converted to pixels char* message; //! Raw pixel data in row major 8-bit greyscale uint8_t* data; //! Generated texture ready to be rendered SDL_Texture* texture; //! The length of sMessage size_t message_length; //! The size of the buffer allocated to store sMessage size_t message_buffer_length; //! Width of the image to draw int width; //! Height of the image to draw int height; //! The width of the longest line of text in in the textbox in pixels int widest_line_width; //! X Coordinate trailing the last character in canvas coordinates int last_x; //! Number of rows required int row_count; //! Alignment of the message in the box text_alignment alignment; //! True when the data reflects the message given the size constraints bool is_valid; }; //! Render a FreeType2 monochrome bitmap to a cache canvas. void render_mono(cached_text *pCacheEntry, FT_Bitmap* pBitmap, FT_Pos x, FT_Pos y) const; //! Render a FreeType2 grayscale bitmap to a cache canvas. void render_gray(cached_text *pCacheEntry, FT_Bitmap* pBitmap, FT_Pos x, FT_Pos y) const; static FT_Library freetype_library; static int freetype_init_count; static const int cache_size_log2 = 7; FT_Face font_face; argb_colour colour; bool is_done_freetype_init; mutable cached_text cache[1 << cache_size_log2]; // The following five methods are implemented by the rendering engine. //! Query if 1-bit monochrome or 8-bit grayscale rendering should be used. /*! @return true if 1-bit monochrome rendering should be used, false if 8-bit grayscale rendering should be used (though in the latter case, 1-bit rendering might still get used). */ bool is_monochrome() const; //! Convert a cache canvas containing rendered text into a texture. /*! @param pEventualCanvas A pointer to the rendertarget we'll be using to draw this. @param pCacheEntry A cache entry whose pData field points to a pixmap of size iWidth by iHeight. This method will convert said pixmap to an object which can be used by the rendering engine, and store the result in the pTexture or iTexture field. */ void make_texture(render_target *pEventualCanvas, cached_text* pCacheEntry) const; //! Free a previously-made texture of a cache entry. /*! This call should free all the resources previously allocated by a call to _makeTexture() and set the texture field to indicate no texture. @param pCacheEntry A cache entry previously passed to _makeTexture(). */ void free_texture(cached_text* pCacheEntry) const; //! Render a previously-made texture of a cache entry. /*! @param pCanvas The canvas on which to draw. @param pCacheEntry A cache entry containing the texture to draw, which will have been stored in the pTexture or iTexture field by a prior call to _makeTexture(). @param iX The X position at which to draw the texture on the canvas. @param iY The Y position at which to draw the texture on the canvas. */ void draw_texture(render_target* pCanvas, cached_text* pCacheEntry, int iX, int iY) const; }; #endif // CORSIX_TH_USE_FREETYPE2 #endif // CORSIX_TH_TH_GFX_FONT_H_ CorsixTH-0.63/CorsixTH/Src/th_gfx_sdl.cpp000066400000000000000000001334561347163623700202540ustar00rootroot00000000000000/* Copyright (c) 2009-2013 Peter "Corsix" Cawley and Edvin "Lego3" Linge 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. */ #include "config.h" #include "th_gfx.h" #ifdef CORSIX_TH_USE_FREETYPE2 #include "th_gfx_font.h" #endif #include "th_map.h" #include #include #include #include #include #include full_colour_renderer::full_colour_renderer(int iWidth, int iHeight) : width(iWidth), height(iHeight) { x = 0; y = 0; } //! Convert a colour to an equivalent grey scale level. /*! @param iOpacity Opacity of the pixel. @param iR Red colour intensity. @param iG Green colour intensity. @param iB Blue colour intensity. @return 32bpp colour pixel in grey scale. */ static inline uint32_t makeGreyScale(uint8_t iOpacity, uint8_t iR, uint8_t iG, uint8_t iB) { // http://en.wikipedia.org/wiki/Grayscale#Converting_color_to_grayscale // 0.2126*R + 0.7152*G + 0.0722*B // 0.2126 * 65536 = 13932.9536 -> 1393 // 0.7152 * 65536 = 46871.3472 // 0.0722 * 65536 = 4731.6992 -> 4732 // 13933 + 46871 + 4732 = 65536 = 2**16 uint8_t iGrey = static_cast((13933 * iR + 46871 * iG + 4732 * iB) >> 16); return palette::pack_argb(iOpacity, iGrey, iGrey, iGrey); } //! Convert a colour by swapping red and blue channel. /*! @param iOpacity Opacity of the pixel. @param iR Red colour intensity. @param iG Green colour intensity. @param iB Blue colour intensity. @return 32bpp colour pixel with red and blue swapped. */ static inline uint32_t makeSwapRedBlue(uint8_t iOpacity, uint8_t iR, uint8_t iG, uint8_t iB) { // http://en.wikipedia.org/wiki/Grayscale#Converting_color_to_grayscale // The Y factor for red is 0.2126, and for blue 0.0722. This means red is about 3 times stronger than blue. // Simple swapping channels will thus distort the balance. This code compensates for that by computing // red = blue * 0.0722 / 0.2126 = blue * 1083 / 3189 // blue = red * 0.2126 / 0.0722 = red * 1063 / 361 (clipped at max blue, 255) uint8_t iNewRed = static_cast(iB * 1083 / 3189); int iNewBlue = iR * 1063 / 361; if (iNewBlue > 255) iNewBlue = 255; return palette::pack_argb(iOpacity, iNewRed, iG, static_cast(iNewBlue)); } void full_colour_renderer::decode_image(const uint8_t* pImg, const palette *pPalette, uint32_t iSpriteFlags) { if (width <= 0) { throw std::logic_error("width cannot be <= 0 when decoding an image"); } if (height <= 0) { throw std::logic_error("height cannot be <= 0 when decoding an image"); } iSpriteFlags &= thdf_alt32_mask; const uint32_t* pColours = pPalette->get_argb_data(); for (;;) { uint8_t iType = *pImg++; size_t iLength = iType & 63; switch (iType >> 6) { case 0: // Fixed fully opaque 32bpp pixels while (iLength > 0) { uint32_t iColour; if (iSpriteFlags == thdf_alt32_blue_red_swap) iColour = makeSwapRedBlue(0xFF, pImg[0], pImg[1], pImg[2]); else if (iSpriteFlags == thdf_alt32_grey_scale) iColour = makeGreyScale(0xFF, pImg[0], pImg[1], pImg[2]); else iColour = palette::pack_argb(0xFF, pImg[0], pImg[1], pImg[2]); push_pixel(iColour); pImg += 3; iLength--; } break; case 1: // Fixed partially transparent 32bpp pixels { uint8_t iOpacity = *pImg++; while (iLength > 0) { uint32_t iColour; if (iSpriteFlags == thdf_alt32_blue_red_swap) iColour = makeSwapRedBlue(0xFF, pImg[0], pImg[1], pImg[2]); else if (iSpriteFlags == thdf_alt32_grey_scale) iColour = makeGreyScale(iOpacity, pImg[0], pImg[1], pImg[2]); else iColour = palette::pack_argb(iOpacity, pImg[0], pImg[1], pImg[2]); push_pixel(iColour); pImg += 3; iLength--; } break; } case 2: // Fixed fully transparent pixels { static const uint32_t iTransparent = palette::pack_argb(0, 0, 0, 0); while (iLength > 0) { push_pixel(iTransparent); iLength--; } break; } case 3: // Recolour layer { uint8_t iTable = *pImg++; pImg++; // Skip reading the opacity for now. if (iTable == 0xFF) { // Legacy sprite data. Use the palette to recolour the layer. // Note that the iOpacity is ignored here. while (iLength > 0) { push_pixel(pColours[*pImg++]); iLength--; } } else { // TODO: Add proper recolour layers, where RGB comes from // table 'iTable' at index *pImg (iLength times), and // opacity comes from the byte after the iTable byte. // // For now just draw black pixels, so it won't go unnoticed. while (iLength > 0) { uint32_t iColour = palette::pack_argb(0xFF, 0, 0, 0); push_pixel(iColour); iLength--; } } break; } } if (y >= height) break; } if (y != height || x != 0) { throw std::logic_error("Image data does not match given dimensions"); } } full_colour_storing::full_colour_storing(uint32_t *pDest, int iWidth, int iHeight) : full_colour_renderer(iWidth, iHeight) { destination = pDest; } void full_colour_storing::store_argb(uint32_t pixel) { *destination++ = pixel; } wx_storing::wx_storing(uint8_t* pRGBData, uint8_t* pAData, int iWidth, int iHeight) : full_colour_renderer(iWidth, iHeight) { rgb_data = pRGBData; alpha_data = pAData; } void wx_storing::store_argb(uint32_t pixel) { rgb_data[0] = palette::get_red(pixel); rgb_data[1] = palette::get_green(pixel); rgb_data[2] = palette::get_blue(pixel); rgb_data += 3; *alpha_data++ = palette::get_alpha(pixel); } render_target::render_target() { window = nullptr; renderer = nullptr; pixel_format = nullptr; game_cursor = nullptr; zoom_texture = nullptr; scale_bitmaps = false; blue_filter_active = false; apply_opengl_clip_fix = false; width = -1; height = -1; } render_target::~render_target() { destroy(); } bool render_target::create(const render_target_creation_params* pParams) { if (renderer != nullptr) return false; SDL_SetHint(SDL_HINT_RENDER_SCALE_QUALITY, "linear"); pixel_format = SDL_AllocFormat(SDL_PIXELFORMAT_ABGR8888); window = SDL_CreateWindow("CorsixTH", SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, pParams->width, pParams->height, SDL_WINDOW_OPENGL|SDL_WINDOW_RESIZABLE); if (!window) { return false; } Uint32 iRendererFlags = (pParams->present_immediate ? 0 : SDL_RENDERER_PRESENTVSYNC); renderer = SDL_CreateRenderer(window, -1, iRendererFlags); SDL_RendererInfo info; SDL_GetRendererInfo(renderer, &info); supports_target_textures = (info.flags & SDL_RENDERER_TARGETTEXTURE) != 0; SDL_version sdlVersion; SDL_GetVersion(&sdlVersion); apply_opengl_clip_fix = std::strncmp(info.name, "opengl", 6) == 0 && sdlVersion.major == 2 && sdlVersion.minor == 0 && sdlVersion.patch < 4; return update(pParams); } bool render_target::update(const render_target_creation_params* pParams) { if (window == nullptr) { return false; } bool bUpdateSize = (width != pParams->width) || (height != pParams->height); width = pParams->width; height = pParams->height; bool bIsFullscreen = ((SDL_GetWindowFlags(window) & SDL_WINDOW_FULLSCREEN_DESKTOP) == SDL_WINDOW_FULLSCREEN_DESKTOP); if (bIsFullscreen != pParams->fullscreen) { SDL_SetWindowFullscreen(window, (pParams->fullscreen ? SDL_WINDOW_FULLSCREEN_DESKTOP : 0)); } if (bUpdateSize || bIsFullscreen != pParams->fullscreen) { SDL_SetWindowSize(window, width, height); } if (bUpdateSize) { SDL_RenderSetLogicalSize(renderer, width, height); } return true; } void render_target::destroy() { if (pixel_format) { SDL_FreeFormat(pixel_format); pixel_format = nullptr; } if (zoom_texture) { SDL_DestroyTexture(zoom_texture); zoom_texture = nullptr; } if (renderer) { SDL_DestroyRenderer(renderer); renderer = nullptr; } if (window) { SDL_DestroyWindow(window); window = nullptr; } } bool render_target::set_scale_factor(double fScale, scaled_items eWhatToScale) { flush_zoom_buffer(); scale_bitmaps = false; if(fScale <= 0.000) { return false; } else if(eWhatToScale == scaled_items::all && supports_target_textures) { //Draw everything from now until the next scale to zoom_texture //with the appropriate virtual size, which will be copied scaled to //fit the window. int virtWidth = static_cast(width / fScale); int virtHeight = static_cast(height / fScale); zoom_texture = SDL_CreateTexture(renderer, SDL_PIXELFORMAT_ABGR8888, SDL_TEXTUREACCESS_TARGET, virtWidth, virtHeight ); SDL_RenderSetLogicalSize(renderer, virtWidth, virtHeight); if(SDL_SetRenderTarget(renderer, zoom_texture) != 0) { std::cout << "Warning: Could not render to zoom texture - " << SDL_GetError() << std::endl; SDL_RenderSetLogicalSize(renderer, width, height); SDL_DestroyTexture(zoom_texture); zoom_texture = nullptr; return false; } // Clear the new texture to transparent/black. SDL_SetRenderDrawColor(renderer, 0, 0, 0, SDL_ALPHA_TRANSPARENT); SDL_RenderClear(renderer); return true; } else if(0.999 <= fScale && fScale <= 1.001) { return true; } else if(eWhatToScale == scaled_items::bitmaps) { scale_bitmaps = true; bitmap_scale_factor = fScale; return true; } else { return false; } } void render_target::set_caption(const char* sCaption) { SDL_SetWindowTitle(window, sCaption); } const char *render_target::get_renderer_details() const { SDL_RendererInfo info = {}; SDL_GetRendererInfo(renderer, &info); return info.name; } const char* render_target::get_last_error() { return SDL_GetError(); } bool render_target::start_frame() { fill_black(); return true; } bool render_target::end_frame() { flush_zoom_buffer(); // End the frame by adding the cursor and possibly a filter. if(game_cursor) { game_cursor->draw(this, cursor_x, cursor_y); } if(blue_filter_active) { SDL_SetRenderDrawBlendMode(renderer, SDL_BLENDMODE_BLEND); SDL_SetRenderDrawColor(renderer, 51, 51, 255, 128); // r=0.2, g=0.2, b=1, a=0.5 . SDL_RenderFillRect(renderer, nullptr); } SDL_RenderPresent(renderer); return true; } bool render_target::fill_black() { SDL_SetRenderDrawColor(renderer, 0, 0, 0, SDL_ALPHA_OPAQUE); SDL_RenderClear(renderer); return true; } void render_target::set_blue_filter_active(bool bActivate) { blue_filter_active = bActivate; } // Actiate and Deactivate SDL function to capture mouse to window void render_target::set_window_grab(bool bActivate) { SDL_SetWindowGrab(window, bActivate ? SDL_TRUE : SDL_FALSE); } uint32_t render_target::map_colour(uint8_t iR, uint8_t iG, uint8_t iB) { return palette::pack_argb(0xFF, iR, iG, iB); } bool render_target::fill_rect(uint32_t iColour, int iX, int iY, int iW, int iH) { SDL_Rect rcDest = { iX, iY, iW, iH }; Uint8 r, g, b, a; SDL_GetRGBA(iColour, pixel_format, &r, &g, &b, &a); SDL_SetRenderDrawBlendMode(renderer, SDL_BLENDMODE_BLEND); SDL_SetRenderDrawColor(renderer, r, g, b, a); SDL_RenderFillRect(renderer, &rcDest); return true; } void render_target::get_clip_rect(clip_rect* pRect) const { SDL_RenderGetClipRect(renderer, reinterpret_cast(pRect)); // SDL returns empty rect when clipping is disabled -> return full rect for CTH if (SDL_RectEmpty(pRect)) { pRect->x = pRect->y = 0; pRect->w = width; pRect->h = height; } if(apply_opengl_clip_fix) { int renderWidth, renderHeight; SDL_RenderGetLogicalSize(renderer, &renderWidth, &renderHeight); pRect->y = renderHeight - pRect->y - pRect->h; } } void render_target::set_clip_rect(const clip_rect* pRect) { // Full clip rect for CTH means clipping disabled if (pRect == nullptr || (pRect->w == width && pRect->h == height)) { SDL_RenderSetClipRect(renderer, nullptr); return; } SDL_Rect SDLRect = { pRect->x, pRect->y, pRect->w, pRect->h }; // For some reason, SDL treats an empty rect (h or w <= 0) as if you turned // off clipping, so we replace it with a rect that's outside our viewport. const SDL_Rect rcBogus = { -2, -2, 1, 1 }; if (SDL_RectEmpty(&SDLRect)) { SDLRect = rcBogus; } if(apply_opengl_clip_fix) { int renderWidth, renderHeight; SDL_RenderGetLogicalSize(renderer, &renderWidth, &renderHeight); SDLRect.y = renderHeight - SDLRect.y - SDLRect.h; } SDL_RenderSetClipRect(renderer, &SDLRect); } int render_target::get_width() const { int w; SDL_RenderGetLogicalSize(renderer, &w, nullptr); return w; } int render_target::get_height() const { int h; SDL_RenderGetLogicalSize(renderer, nullptr, &h); return h; } void render_target::start_nonoverlapping_draws() { // SDL has no optimisations for drawing lots of non-overlapping sprites } void render_target::finish_nonoverlapping_draws() { // SDL has no optimisations for drawing lots of non-overlapping sprites } void render_target::set_cursor(cursor* pCursor) { game_cursor = pCursor; } void render_target::set_cursor_position(int iX, int iY) { cursor_x = iX; cursor_y = iY; } bool render_target::take_screenshot(const char* sFile) { int width = 0, height = 0; if (SDL_GetRendererOutputSize(renderer, &width, &height) == -1) return false; // Create a window-sized surface, RGB format (0 Rmask means RGB.) SDL_Surface* pRgbSurface = SDL_CreateRGBSurface(0, width, height, 24, 0, 0, 0, 0); if (pRgbSurface == nullptr) return false; int readStatus = -1; if (SDL_LockSurface(pRgbSurface) != -1) { // Ask the renderer to (slowly) fill the surface with renderer // output data. readStatus = SDL_RenderReadPixels(renderer, nullptr, pRgbSurface->format->format, pRgbSurface->pixels, pRgbSurface->pitch); SDL_UnlockSurface(pRgbSurface); if (readStatus != -1) SDL_SaveBMP(pRgbSurface, sFile); } SDL_FreeSurface(pRgbSurface); return (readStatus != -1); } bool render_target::should_scale_bitmaps(double* pFactor) { if(!scale_bitmaps) return false; if(pFactor) *pFactor = bitmap_scale_factor; return true; } void render_target::flush_zoom_buffer() { if(zoom_texture == nullptr) { return; } SDL_SetRenderTarget(renderer, nullptr); SDL_RenderSetLogicalSize(renderer, width, height); SDL_SetTextureBlendMode(zoom_texture, SDL_BLENDMODE_BLEND); SDL_RenderCopy(renderer, zoom_texture, nullptr, nullptr); SDL_DestroyTexture(zoom_texture); zoom_texture = nullptr; } //! Convert legacy 8bpp sprite data to recoloured 32bpp data, using special recolour table 0xFF. /*! @param pPixelData Legacy 8bpp pixels. @param iPixelDataLength Number of pixels in the \a pPixelData. @return Converted 32bpp pixel data, if succeeded else nullptr is returned. Caller should free the returned memory. */ static uint8_t *convertLegacySprite(const uint8_t* pPixelData, size_t iPixelDataLength) { // Recolour blocks are 63 pixels long. // XXX To reduce the size of the 32bpp data, transparent pixels can be stored more compactly. size_t iNumFilled = iPixelDataLength / 63; size_t iRemaining = iPixelDataLength - iNumFilled * 63; size_t iNewSize = iNumFilled * (3 + 63) + ((iRemaining > 0) ? 3 + iRemaining : 0); uint8_t *pData = new uint8_t[iNewSize]; uint8_t *pDest = pData; while (iPixelDataLength > 0) { size_t iLength = (iPixelDataLength >= 63) ? 63 : iPixelDataLength; *pDest++ = static_cast(iLength + 0xC0); // Recolour layer type of block. *pDest++ = 0xFF; // Use special table 0xFF (which uses the palette as table). *pDest++ = 0xFF; // Non-transparent. std::memcpy(pDest, pPixelData, iLength); pDest += iLength; pPixelData += iLength; iPixelDataLength -= iLength; } return pData; } SDL_Texture* render_target::create_palettized_texture( int iWidth, int iHeight, const uint8_t* pPixels, const palette* pPalette, uint32_t iSpriteFlags) const { uint32_t *pARGBPixels = new uint32_t[iWidth * iHeight]; full_colour_storing oRenderer(pARGBPixels, iWidth, iHeight); oRenderer.decode_image(pPixels, pPalette, iSpriteFlags); SDL_Texture *pTexture = create_texture(iWidth, iHeight, pARGBPixels); delete [] pARGBPixels; return pTexture; } SDL_Texture* render_target::create_texture(int iWidth, int iHeight, const uint32_t* pPixels) const { SDL_Texture *pTexture = SDL_CreateTexture(renderer, pixel_format->format, SDL_TEXTUREACCESS_STATIC, iWidth, iHeight); if (pTexture == nullptr) { throw std::runtime_error(SDL_GetError()); } int err = 0; err = SDL_UpdateTexture(pTexture, nullptr, pPixels, static_cast(sizeof(*pPixels) * iWidth)); if (err < 0) { throw std::runtime_error(SDL_GetError()); } err = SDL_SetTextureBlendMode(pTexture, SDL_BLENDMODE_BLEND); if (err < 0) { throw std::runtime_error(SDL_GetError()); } err = SDL_SetTextureColorMod(pTexture, 0xFF, 0xFF, 0xFF); if (err < 0) { throw std::runtime_error(SDL_GetError()); } err = SDL_SetTextureAlphaMod(pTexture, 0xFF); if (err < 0) { throw std::runtime_error(SDL_GetError()); } return pTexture; } void render_target::draw(SDL_Texture *pTexture, const SDL_Rect *prcSrcRect, const SDL_Rect *prcDstRect, int iFlags) { SDL_SetTextureAlphaMod(pTexture, 0xFF); if (iFlags & thdf_alpha_50) { SDL_SetTextureAlphaMod(pTexture, 0x80); } else if (iFlags & thdf_alpha_75) { SDL_SetTextureAlphaMod(pTexture, 0x40); } int iSDLFlip = SDL_FLIP_NONE; if(iFlags & thdf_flip_horizontal) iSDLFlip |= SDL_FLIP_HORIZONTAL; if (iFlags & thdf_flip_vertical) iSDLFlip |= SDL_FLIP_VERTICAL; if (iSDLFlip != 0) { SDL_RenderCopyEx(renderer, pTexture, prcSrcRect, prcDstRect, 0, nullptr, (SDL_RendererFlip)iSDLFlip); } else { SDL_RenderCopy(renderer, pTexture, prcSrcRect, prcDstRect); } } void render_target::draw_line(line *pLine, int iX, int iY) { SDL_SetRenderDrawColor(renderer, pLine->red, pLine->green, pLine->blue, pLine->alpha); double lastX, lastY; lastX = pLine->first_operation->x; lastY = pLine->first_operation->y; line::line_operation* op = (line::line_operation*)(pLine->first_operation->next); while (op) { if (op->type == line::line_operation_type::line) { SDL_RenderDrawLine(renderer, static_cast(lastX + iX), static_cast(lastY + iY), static_cast(op->x + iX), static_cast(op->y + iY)); } lastX = op->x; lastY = op->y; op = (line::line_operation*)(op->next); } } palette::palette() { colour_count = 0; } static const uint8_t gs_iTHColourLUT[0x40] = { // Maps 0-63 to 0-255 0x00, 0x04, 0x08, 0x0C, 0x10, 0x14, 0x18, 0x1C, 0x20, 0x24, 0x28, 0x2D, 0x31, 0x35, 0x39, 0x3D, 0x41, 0x45, 0x49, 0x4D, 0x51, 0x55, 0x59, 0x5D, 0x61, 0x65, 0x69, 0x6D, 0x71, 0x75, 0x79, 0x7D, 0x82, 0x86, 0x8A, 0x8E, 0x92, 0x96, 0x9A, 0x9E, 0xA2, 0xA6, 0xAA, 0xAE, 0xB2, 0xB6, 0xBA, 0xBE, 0xC2, 0xC6, 0xCA, 0xCE, 0xD2, 0xD7, 0xDB, 0xDF, 0xE3, 0xE7, 0xEB, 0xEF, 0xF3, 0xF7, 0xFB, 0xFF, }; bool palette::load_from_th_file(const uint8_t* pData, size_t iDataLength) { if(iDataLength != 256 * 3) return false; colour_count = static_cast(iDataLength / 3); for(int i = 0; i < colour_count; ++i, pData += 3) { uint8_t iR = gs_iTHColourLUT[pData[0] & 0x3F]; uint8_t iG = gs_iTHColourLUT[pData[1] & 0x3F]; uint8_t iB = gs_iTHColourLUT[pData[2] & 0x3F]; uint32_t iColour = pack_argb(0xFF, iR, iG, iB); // Remap magenta to transparent if(iColour == pack_argb(0xFF, 0xFF, 0x00, 0xFF)) iColour = pack_argb(0x00, 0x00, 0x00, 0x00); colour_index_to_argb_map[i] = iColour; } return true; } bool palette::set_entry(int iEntry, uint8_t iR, uint8_t iG, uint8_t iB) { if(iEntry < 0 || iEntry >= colour_count) return false; uint32_t iColour = pack_argb(0xFF, iR, iG, iB); // Remap magenta to transparent if(iColour == pack_argb(0xFF, 0xFF, 0x00, 0xFF)) iColour = pack_argb(0x00, 0x00, 0x00, 0x00); colour_index_to_argb_map[iEntry] = iColour; return true; } int palette::get_colour_count() const { return colour_count; } const uint32_t* palette::get_argb_data() const { return colour_index_to_argb_map; } raw_bitmap::raw_bitmap() { texture = nullptr; bitmap_palette = nullptr; target = nullptr; width = 0; height = 0; } raw_bitmap::~raw_bitmap() { if (texture) { SDL_DestroyTexture(texture); } } void raw_bitmap::set_palette(const palette* pPalette) { bitmap_palette = pPalette; } void raw_bitmap::load_from_th_file(const uint8_t* pPixelData, size_t iPixelDataLength, int iWidth, render_target *pEventualCanvas) { if (pEventualCanvas == nullptr) { throw std::invalid_argument("pEventualCanvas cannot be null"); } uint8_t* converted_sprite = convertLegacySprite(pPixelData, iPixelDataLength); int iHeight = static_cast(iPixelDataLength) / iWidth; texture = pEventualCanvas->create_palettized_texture(iWidth, iHeight, converted_sprite, bitmap_palette, thdf_alt32_plain); delete[] converted_sprite; width = iWidth; height = iHeight; target = pEventualCanvas; } /** * Test whether the loaded full colour sprite loads correctly. * @param pData Data of the sprite. * @param iDataLength Length of the sprite data. * @param iWidth Width of the sprite. * @param iHeight Height of the sprite. * @return Whether the sprite loads correctly (at the end of the sprite, all data is used). */ static bool testSprite(const uint8_t* pData, size_t iDataLength, int iWidth, int iHeight) { if (iWidth <= 0 || iHeight <= 0) return true; size_t iCount = iWidth * iHeight; while (iCount > 0) { if (iDataLength < 1) return false; iDataLength--; uint8_t iType = *pData++; size_t iLength = iType & 63; switch (iType >> 6) { case 0: // Fixed fully opaque 32bpp pixels if (iCount < iLength || iDataLength < iLength * 3) return false; iCount -= iLength; iDataLength -= iLength * 3; pData += iLength * 3; break; case 1: // Fixed partially transparent 32bpp pixels if (iDataLength < 1) return false; iDataLength--; pData++; // Opacity byte. if (iCount < iLength || iDataLength < iLength * 3) return false; iCount -= iLength; iDataLength -= iLength * 3; pData += iLength * 3; break; case 2: // Fixed fully transparent pixels if (iCount < iLength) return false; iCount -= iLength; break; case 3: // Recolour layer if (iDataLength < 2) return false; iDataLength -= 2; pData += 2; // Table number, opacity byte. if (iCount < iLength || iDataLength < iLength) return false; iCount -= iLength; iDataLength -= iLength; pData += iLength; break; } } return iDataLength == 0; } void raw_bitmap::draw(render_target* pCanvas, int iX, int iY) { draw(pCanvas, iX, iY, 0, 0, width, height); } void raw_bitmap::draw(render_target* pCanvas, int iX, int iY, int iSrcX, int iSrcY, int iWidth, int iHeight) { double fScaleFactor; if (texture == nullptr) return; if(!pCanvas->should_scale_bitmaps(&fScaleFactor)) { fScaleFactor = 1; } const SDL_Rect rcSrc = { iSrcX, iSrcY, iWidth, iHeight }; const SDL_Rect rcDest = { iX, iY, static_cast(iWidth * fScaleFactor), static_cast(iHeight * fScaleFactor) }; pCanvas->draw(texture, &rcSrc, &rcDest, 0); } sprite_sheet::sprite_sheet() { sprites = nullptr; palette = nullptr; target = nullptr; sprite_count = 0; } sprite_sheet::~sprite_sheet() { _freeSprites(); } void sprite_sheet::_freeSingleSprite(size_t iNumber) { if (iNumber >= sprite_count) return; if (sprites[iNumber].texture != nullptr) { SDL_DestroyTexture(sprites[iNumber].texture); sprites[iNumber].texture = nullptr; } if (sprites[iNumber].alt_texture != nullptr) { SDL_DestroyTexture(sprites[iNumber].alt_texture); sprites[iNumber].alt_texture = nullptr; } if(sprites[iNumber].data != nullptr) { delete[] sprites[iNumber].data; sprites[iNumber].data = nullptr; } } void sprite_sheet::_freeSprites() { for(size_t i = 0; i < sprite_count; ++i) _freeSingleSprite(i); delete[] sprites; sprites = nullptr; sprite_count = 0; } void sprite_sheet::set_palette(const ::palette* pPalette) { palette = pPalette; } bool sprite_sheet::set_sprite_count(size_t iCount, render_target* pCanvas) { _freeSprites(); if(pCanvas == nullptr) return false; target = pCanvas; sprite_count = iCount; sprites = new (std::nothrow) sprite[sprite_count]; if(sprites == nullptr) { sprite_count = 0; return false; } for (size_t i = 0; i < sprite_count; i++) { sprite &spr = sprites[i]; spr.texture = nullptr; spr.alt_texture = nullptr; spr.data = nullptr; spr.alt_palette_map = nullptr; spr.sprite_flags = thdf_alt32_plain; spr.width = 0; spr.height = 0; } return true; } bool sprite_sheet::load_from_th_file(const uint8_t* pTableData, size_t iTableDataLength, const uint8_t* pChunkData, size_t iChunkDataLength, bool bComplexChunks, render_target* pCanvas) { _freeSprites(); if(pCanvas == nullptr) return false; size_t iCount = iTableDataLength / sizeof(th_sprite_properties); if (!set_sprite_count(iCount, pCanvas)) return false; for(size_t i = 0; i < sprite_count; ++i) { sprite *pSprite = sprites + i; const th_sprite_properties *pTHSprite = reinterpret_cast(pTableData) + i; pSprite->texture = nullptr; pSprite->alt_texture = nullptr; pSprite->data = nullptr; pSprite->alt_palette_map = nullptr; pSprite->width = pTHSprite->width; pSprite->height = pTHSprite->height; if(pSprite->width == 0 || pSprite->height == 0) continue; { uint8_t *pData = new uint8_t[pSprite->width * pSprite->height]; chunk_renderer oRenderer(pSprite->width, pSprite->height, pData); int iDataLen = static_cast(iChunkDataLength) - static_cast(pTHSprite->position); if(iDataLen < 0) iDataLen = 0; oRenderer.decode_chunks(pChunkData + pTHSprite->position, iDataLen, bComplexChunks); pData = oRenderer.take_data(); pSprite->data = convertLegacySprite(pData, pSprite->width * pSprite->height); delete[] pData; } } return true; } bool sprite_sheet::set_sprite_data(size_t iSprite, const uint8_t *pData, bool bTakeData, size_t iDataLength, int iWidth, int iHeight) { if (iSprite >= sprite_count) return false; if (!testSprite(pData, iDataLength, iWidth, iHeight)) { std::printf("Sprite number %zu has a bad encoding, skipping", iSprite); return false; } _freeSingleSprite(iSprite); sprite *pSprite = sprites + iSprite; if (bTakeData) { pSprite->data = pData; } else { uint8_t *pNewData = new (std::nothrow) uint8_t[iDataLength]; if (pNewData == nullptr) return false; std::memcpy(pNewData, pData, iDataLength); pSprite->data = pNewData; } pSprite->width = iWidth; pSprite->height = iHeight; return true; } void sprite_sheet::set_sprite_alt_palette_map(size_t iSprite, const uint8_t* pMap, uint32_t iAlt32) { if(iSprite >= sprite_count) return; sprite *pSprite = sprites + iSprite; if(pSprite->alt_palette_map != pMap) { pSprite->alt_palette_map = pMap; pSprite->sprite_flags = iAlt32; if(pSprite->alt_texture) { SDL_DestroyTexture(pSprite->alt_texture); pSprite->alt_texture = nullptr; } } } size_t sprite_sheet::get_sprite_count() const { return sprite_count; } bool sprite_sheet::get_sprite_size(size_t iSprite, unsigned int* pWidth, unsigned int* pHeight) const { if(iSprite >= sprite_count) return false; if(pWidth != nullptr) *pWidth = sprites[iSprite].width; if(pHeight != nullptr) *pHeight = sprites[iSprite].height; return true; } void sprite_sheet::get_sprite_size_unchecked(size_t iSprite, unsigned int* pWidth, unsigned int* pHeight) const { *pWidth = sprites[iSprite].width; *pHeight = sprites[iSprite].height; } bool sprite_sheet::get_sprite_average_colour(size_t iSprite, argb_colour* pColour) const { if(iSprite >= sprite_count) return false; const sprite *pSprite = sprites + iSprite; int iCountTotal = 0; int iUsageCounts[256] = {0}; for(long i = 0; i < pSprite->width * pSprite->height; ++i) { uint8_t cPalIndex = pSprite->data[i]; uint32_t iColour = palette->get_argb_data()[cPalIndex]; if((iColour >> 24) == 0) continue; // Grant higher score to pixels with high or low intensity (helps avoid grey fonts) int iR = palette::get_red(iColour); int iG = palette::get_green(iColour); int iB = palette::get_blue(iColour); uint8_t cIntensity = static_cast((iR + iG + iB) / 3); int iScore = 1 + std::max(0, 3 - ((255 - cIntensity) / 32)) + std::max(0, 3 - (cIntensity / 32)); iUsageCounts[cPalIndex] += iScore; iCountTotal += iScore; } if(iCountTotal == 0) return false; int iHighestCountIndex = 0; for(int i = 0; i < 256; ++i) { if(iUsageCounts[i] > iUsageCounts[iHighestCountIndex]) iHighestCountIndex = i; } *pColour = palette->get_argb_data()[iHighestCountIndex]; return true; } void sprite_sheet::draw_sprite(render_target* pCanvas, size_t iSprite, int iX, int iY, uint32_t iFlags) { if(iSprite >= sprite_count || pCanvas == nullptr || pCanvas != target) return; sprite &sprite = sprites[iSprite]; // Find or create the texture SDL_Texture *pTexture = sprite.texture; if(!pTexture) { if(sprite.data == nullptr) return; uint32_t iSprFlags = (sprite.sprite_flags & ~thdf_alt32_mask) | thdf_alt32_plain; pTexture = target->create_palettized_texture(sprite.width, sprite.height, sprite.data, palette, iSprFlags); sprite.texture = pTexture; } if(iFlags & thdf_alt_palette) { pTexture = sprite.alt_texture; if(!pTexture) { pTexture = _makeAltBitmap(&sprite); if(!pTexture) return; } } SDL_Rect rcSrc = { 0, 0, sprite.width, sprite.height }; SDL_Rect rcDest = { iX, iY, sprite.width, sprite.height }; pCanvas->draw(pTexture, &rcSrc, &rcDest, iFlags); } void sprite_sheet::wx_draw_sprite(size_t iSprite, uint8_t* pRGBData, uint8_t* pAData) { if(iSprite >= sprite_count || pRGBData == nullptr || pAData == nullptr) return; sprite *pSprite = sprites + iSprite; wx_storing oRenderer(pRGBData, pAData, pSprite->width, pSprite->height); oRenderer.decode_image(pSprite->data, palette, pSprite->sprite_flags); } SDL_Texture* sprite_sheet::_makeAltBitmap(sprite *pSprite) { const uint32_t *pPalette = palette->get_argb_data(); if (!pSprite->alt_palette_map) // Use normal palette. { uint32_t iSprFlags = (pSprite->sprite_flags & ~thdf_alt32_mask) | thdf_alt32_plain; pSprite->alt_texture = target->create_palettized_texture(pSprite->width, pSprite->height, pSprite->data, palette, iSprFlags); } else if (!pPalette) // Draw alternative palette, but no palette set (ie 32bpp image). { pSprite->alt_texture = target->create_palettized_texture(pSprite->width, pSprite->height, pSprite->data, palette, pSprite->sprite_flags); } else // Paletted image, build recolour palette. { ::palette oPalette; for (int iColour = 0; iColour < 255; iColour++) { oPalette.set_argb(iColour, pPalette[pSprite->alt_palette_map[iColour]]); } oPalette.set_argb(255, pPalette[255]); // Colour 0xFF doesn't get remapped. pSprite->alt_texture = target->create_palettized_texture(pSprite->width, pSprite->height, pSprite->data, &oPalette, pSprite->sprite_flags); } return pSprite->alt_texture; } /** * Get the colour data of pixel \a iPixelNumber (\a iWidth * y + x) * @param pImg 32bpp image data. * @param iWidth Width of the image. * @param iHeight Height of the image. * @param pPalette Palette of the image, or \c nullptr. * @param iPixelNumber Number of the pixel to retrieve. */ static uint32_t get32BppPixel(const uint8_t* pImg, int iWidth, int iHeight, const ::palette *pPalette, size_t iPixelNumber) { if (iWidth <= 0 || iHeight <= 0 || iPixelNumber < 0 || iPixelNumber >= static_cast(iWidth) * iHeight) { return palette::pack_argb(0, 0, 0,0); } for (;;) { uint8_t iType = *pImg++; size_t iLength = iType & 63; switch (iType >> 6) { case 0: // Fixed fully opaque 32bpp pixels if (iPixelNumber >= iLength) { pImg += 3 * iLength; iPixelNumber -= iLength; break; } while (iLength > 0) { if (iPixelNumber == 0) return palette::pack_argb(0xFF, pImg[0], pImg[1], pImg[2]); iPixelNumber--; pImg += 3; iLength--; } break; case 1: // Fixed partially transparent 32bpp pixels { uint8_t iOpacity = *pImg++; if (iPixelNumber >= iLength) { pImg += 3 * iLength; iPixelNumber -= iLength; break; } while (iLength > 0) { if (iPixelNumber == 0) return palette::pack_argb(iOpacity, pImg[0], pImg[1], pImg[2]); iPixelNumber--; pImg += 3; iLength--; } break; } case 2: // Fixed fully transparent pixels { if (iPixelNumber >= iLength) { iPixelNumber -= iLength; break; } return palette::pack_argb(0, 0, 0, 0); } case 3: // Recolour layer { uint8_t iTable = *pImg++; pImg++; // Skip reading the opacity for now. if (iPixelNumber >= iLength) { pImg += iLength; iPixelNumber -= iLength; break; } if (iTable == 0xFF && pPalette != nullptr) { // Legacy sprite data. Use the palette to recolour the layer. // Note that the iOpacity is ignored here. const uint32_t* pColours = pPalette->get_argb_data(); return pColours[pImg[iPixelNumber]]; } else { // TODO: Add proper recolour layers, where RGB comes from // table 'iTable' at index *pImg (iLength times), and // opacity comes from the byte after the iTable byte. // // For now just draw black pixels, so it won't go unnoticed. return palette::pack_argb(0xFF, 0, 0, 0); } } } } } bool sprite_sheet::hit_test_sprite(size_t iSprite, int iX, int iY, uint32_t iFlags) const { if(iX < 0 || iY < 0 || iSprite >= sprite_count) return false; sprite &sprite = sprites[iSprite]; int iWidth = sprite.width; int iHeight = sprite.height; if(iX >= iWidth || iY >= iHeight) return false; if(iFlags & thdf_flip_horizontal) iX = iWidth - iX - 1; if(iFlags & thdf_flip_vertical) iY = iHeight - iY - 1; uint32_t iCol = get32BppPixel(sprite.data, iWidth, iHeight, palette, iY * iWidth + iX); return palette::get_alpha(iCol) != 0; } cursor::cursor() { bitmap = nullptr; hotspot_x = 0; hotspot_y = 0; hidden_cursor = nullptr; } cursor::~cursor() { SDL_FreeSurface(bitmap); SDL_FreeCursor(hidden_cursor); } bool cursor::create_from_sprite(sprite_sheet* pSheet, size_t iSprite, int iHotspotX, int iHotspotY) { #if 0 SDL_FreeSurface(m_pBitmap); m_pBitmap = nullptr; if(pSheet == nullptr || iSprite >= pSheet->getSpriteCount()) return false; SDL_Surface *pSprite = pSheet->_getSpriteBitmap(iSprite, 0); if(pSprite == nullptr || (m_pBitmap = SDL_DisplayFormat(pSprite)) == nullptr) return false; m_iHotspotX = iHotspotX; m_iHotspotY = iHotspotY; return true; #else return false; #endif } void cursor::use(render_target* pTarget) { #if 0 //SDL_ShowCursor(0) is buggy in fullscreen until 1.3 (they say) // use transparent cursor for same effect uint8_t uData = 0; m_pCursorHidden = SDL_CreateCursor(&uData, &uData, 8, 1, 0, 0); SDL_SetCursor(m_pCursorHidden); pTarget->setCursor(this); #endif } bool cursor::set_position(render_target* pTarget, int iX, int iY) { #if 0 pTarget->setCursorPosition(iX, iY); return true; #else return false; #endif } void cursor::draw(render_target* pCanvas, int iX, int iY) { #if 0 SDL_Rect rcDest; rcDest.x = (Sint16)(iX - m_iHotspotX); rcDest.y = (Sint16)(iY - m_iHotspotY); SDL_BlitSurface(m_pBitmap, nullptr, pCanvas->getRawSurface(), &rcDest); #endif } line::line() { initialize(); } line::~line() { line_operation* op = first_operation; while (op) { line_operation* next = (line_operation*)(op->next); delete(op); op = next; } } void line::initialize() { width = 1; red = 0; green = 0; blue = 0; alpha = 255; // We start at 0,0 first_operation = new line_operation(line_operation_type::move, 0, 0); current_operation = first_operation; } void line::move_to(double fX, double fY) { line_operation* previous = current_operation; current_operation = new line_operation(line_operation_type::move, fX, fY); previous->next = current_operation; } void line::line_to(double fX, double fY) { line_operation* previous = current_operation; current_operation = new line_operation(line_operation_type::line, fX, fY); previous->next = current_operation; } void line::set_width(double pLineWidth) { width = pLineWidth; } void line::set_colour(uint8_t iR, uint8_t iG, uint8_t iB, uint8_t iA) { red = iR; green = iG; blue = iB; alpha = iA; } void line::draw(render_target* pCanvas, int iX, int iY) { pCanvas->draw_line(this, iX, iY); } void line::persist(lua_persist_writer *pWriter) const { pWriter->write_uint((uint32_t)red); pWriter->write_uint((uint32_t)green); pWriter->write_uint((uint32_t)blue); pWriter->write_uint((uint32_t)alpha); pWriter->write_float(width); line_operation* op = (line_operation*)(first_operation->next); uint32_t numOps = 0; for (; op; numOps++) { op = (line_operation*)(op->next); } pWriter->write_uint(numOps); op = (line_operation*)(first_operation->next); while (op) { pWriter->write_uint((uint32_t)op->type); pWriter->write_float(op->x); pWriter->write_float(op->y); op = (line_operation*)(op->next); } } void line::depersist(lua_persist_reader *pReader) { initialize(); pReader->read_uint(red); pReader->read_uint(green); pReader->read_uint(blue); pReader->read_uint(alpha); pReader->read_float(width); uint32_t numOps = 0; pReader->read_uint(numOps); for (uint32_t i = 0; i < numOps; i++) { line_operation_type type; double fX, fY; pReader->read_uint((uint32_t&)type); pReader->read_float(fX); pReader->read_float(fY); if (type == line_operation_type::move) { move_to(fX, fY); } else if (type == line_operation_type::line) { line_to(fX, fY); } } } #ifdef CORSIX_TH_USE_FREETYPE2 bool freetype_font::is_monochrome() const { return true; } void freetype_font::free_texture(cached_text* pCacheEntry) const { if(pCacheEntry->texture != nullptr) { SDL_DestroyTexture(pCacheEntry->texture); pCacheEntry->texture = nullptr; } } void freetype_font::make_texture(render_target *pEventualCanvas, cached_text* pCacheEntry) const { uint32_t* pPixels = new uint32_t[pCacheEntry->width * pCacheEntry->height]; std::memset(pPixels, 0, pCacheEntry->width * pCacheEntry->height * sizeof(uint32_t)); uint8_t* pInRow = pCacheEntry->data; uint32_t* pOutRow = pPixels; uint32_t iColBase = colour & 0xFFFFFF; for(int iY = 0; iY < pCacheEntry->height; ++iY, pOutRow += pCacheEntry->width, pInRow += pCacheEntry->width) { for(int iX = 0; iX < pCacheEntry->width; ++iX) { pOutRow[iX] = (static_cast(pInRow[iX]) << 24) | iColBase; } } pCacheEntry->texture = pEventualCanvas->create_texture(pCacheEntry->width, pCacheEntry->height, pPixels); delete[] pPixels; } void freetype_font::draw_texture(render_target* pCanvas, cached_text* pCacheEntry, int iX, int iY) const { if(pCacheEntry->texture == nullptr) return; SDL_Rect rcDest = { iX, iY, pCacheEntry->width, pCacheEntry->height }; pCanvas->draw(pCacheEntry->texture, nullptr, &rcDest, 0); } #endif // CORSIX_TH_USE_FREETYPE2 CorsixTH-0.63/CorsixTH/Src/th_gfx_sdl.h000066400000000000000000000512051347163623700177100ustar00rootroot00000000000000/* Copyright (c) 2009-2013 Peter "Corsix" Cawley and Edvin "Lego3" Linge 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. */ #ifndef CORSIX_TH_TH_GFX_SDL_H_ #define CORSIX_TH_TH_GFX_SDL_H_ #include "config.h" #include #include "persist_lua.h" #include class cursor; struct clip_rect : public SDL_Rect { typedef Sint16 x_y_type; typedef Uint16 w_h_type; }; struct render_target_creation_params; /*! Utility class for decoding 32bpp images. */ class full_colour_renderer { public: //! Initialize the renderer for a specific render. /*! @param iWidth Pixel width of the resulting image @param iHeight Pixel height of the resulting image */ full_colour_renderer(int iWidth, int iHeight); virtual ~full_colour_renderer() = default; //! Decode a 32bpp image, and push it to the storage backend. /*! @param pImg Encoded 32bpp image. @param pPalette Palette of a legacy sprite. @param iSpriteFlags Flags how to render the sprite. @return Decoding was successful. */ void decode_image(const uint8_t* pImg, const ::palette *pPalette, uint32_t iSpriteFlags); private: //! Store a decoded pixel. Use x and y if necessary. /*! @param pixel Pixel to store. */ virtual void store_argb(uint32_t pixel) = 0; const int width; const int height; int x; int y; //! Push a pixel to the storage. /*! @param iValue Pixel value to store. */ inline void push_pixel(uint32_t iValue) { if (y < height) { store_argb(iValue); x++; if (x >= width) { x = 0; y++; } } else { throw std::logic_error("Attempt to push_pixel past the end of the image"); } } }; class full_colour_storing : public full_colour_renderer { public: full_colour_storing(uint32_t *pDest, int iWidth, int iHeight); private: void store_argb(uint32_t pixel) override; //! Pointer to the storage (not owned by this class). uint32_t *destination; }; class wx_storing : public full_colour_renderer { public: wx_storing(uint8_t* pRGBData, uint8_t* pAData, int iWidth, int iHeight); private: void store_argb(uint32_t pixel) override; //! Pointer to the RGB storage (not owned by this class). uint8_t *rgb_data; //! Pointer to the Alpha channel storage (not owned by this class). uint8_t *alpha_data; }; class render_target { public: // External API render_target(); ~render_target(); //! Initialise the render target bool create(const render_target_creation_params* pParams); //! Update the parameters for the render target bool update(const render_target_creation_params* pParams); //! Shut down the render target void destroy(); //! Get the reason for the last operation failing const char* get_last_error(); //! Begin rendering a new frame bool start_frame(); //! Finish rendering the current frame and present it bool end_frame(); //! Paint the entire render target black bool fill_black(); //! Sets a blue filter on the current surface. // Used to add the blue effect when the game is paused. void set_blue_filter_active(bool bActivate); //! Encode an RGB triplet for fillRect() uint32_t map_colour(uint8_t iR, uint8_t iG, uint8_t iB); //! Fill a rectangle of the render target with a solid colour bool fill_rect(uint32_t iColour, int iX, int iY, int iW, int iH); //! Get the current clip rectangle void get_clip_rect(clip_rect* pRect) const; //! Get the width of the render target (in pixels) int get_width() const; //! Get the height of the render target (in pixels) int get_height() const; //! Set the new clip rectangle void set_clip_rect(const clip_rect* pRect); //! Enable optimisations for non-overlapping draws void start_nonoverlapping_draws(); //! Disable optimisations for non-overlapping draws void finish_nonoverlapping_draws(); //! Set the cursor to be used void set_cursor(cursor* pCursor); //! Update the cursor position (if the cursor is being simulated) void set_cursor_position(int iX, int iY); //! Take a screenshot and save it as a bitmap bool take_screenshot(const char* sFile); //! Set the amount by which future draw operations are scaled. /*! @param fScale New scale to use. @param eWhatToScale Th kind of items to scale. @return Whether the scale could be set. */ bool set_scale_factor(double fScale, scaled_items eWhatToScale); //! Set the window caption void set_caption(const char* sCaption); //! Toggle mouse capture on the window. void set_window_grab(bool bActivate); //! Get any user-displayable information to describe the renderer path used const char *get_renderer_details() const; // If you add any extra methods here which are called from outside the // rendering engine, then be sure to at least add dummy implementations // to the other rendering engines. public: // Internal (this rendering engine only) API SDL_Renderer *get_renderer() const { return renderer; } //! Should bitmaps be scaled? /*! @param [out] pFactor If the function returns \c true, the factor to use for scaling (can be \c nullptr if not interested in the value). @return Whether bitmaps should be scaled. */ bool should_scale_bitmaps(double* pFactor); SDL_Texture* create_palettized_texture(int iWidth, int iHeight, const uint8_t* pPixels, const ::palette* pPalette, uint32_t iSpriteFlags) const; SDL_Texture* create_texture(int iWidth, int iHeight, const uint32_t* pPixels) const; void draw(SDL_Texture *pTexture, const SDL_Rect *prcSrcRect, const SDL_Rect *prcDstRect, int iFlags); void draw_line(line *pLine, int iX, int iY); private: SDL_Window *window; SDL_Renderer *renderer; SDL_Texture *zoom_texture; SDL_PixelFormat *pixel_format; bool blue_filter_active; cursor* game_cursor; double bitmap_scale_factor; ///< Bitmap scale factor. int width; int height; int cursor_x; int cursor_y; bool scale_bitmaps; ///< Whether bitmaps should be scaled. bool supports_target_textures; // In SDL2 < 2.0.4 there is an issue with the y coordinates used for // ClipRects in opengl and opengles. // see: https://bugzilla.libsdl.org/show_bug.cgi?id=2700 bool apply_opengl_clip_fix; void flush_zoom_buffer(); }; //! 32bpp ARGB colour. See #palette::pack_argb typedef uint32_t argb_colour; //! 8bpp palette class. class palette { public: // External API palette(); //! Load palette from the supplied data. /*! Note that the data uses palette entries of 6 bit colours. @param pData Data loaded from the file. @param iDataLength Size of the data. @return Whether loading of the palette succeeded. */ bool load_from_th_file(const uint8_t* pData, size_t iDataLength); //! Set an entry of the palette. /*! The RGB colour (255, 0, 255) is used as the transparent colour. @param iEntry Entry number to change. @param iR Amount of red in the new entry. @param iG Amount of green in the new entry. @param iB Amount of blue in the new entry. @return Setting the entry succeeded. */ bool set_entry(int iEntry, uint8_t iR, uint8_t iG, uint8_t iB); public: // Internal (this rendering engine only) API //! Convert A, R, G, B values to a 32bpp colour. /*! @param iA Amount of opacity (0-255). @param iR Amount of red (0-255). @param iG Amount of green (0-255). @param iB Amount of blue (0-255). @return 32bpp value representing the provided colour values. */ inline static argb_colour pack_argb(uint8_t iA, uint8_t iR, uint8_t iG, uint8_t iB) { return (static_cast(iR) << 0) | (static_cast(iG) << 8) | (static_cast(iB) << 16) | (static_cast(iA) << 24) ; } //! Get the red component of a colour. /*! @param iColour Colour to examine. @return The red component intensity of the colour. */ inline static uint8_t get_red(argb_colour iColour) { return static_cast((iColour >> 0) & 0xFF); } //! Get the green component of a colour. /*! @param iColour Colour to examine. @return The green component intensity of the colour. */ inline static uint8_t get_green(argb_colour iColour) { return static_cast((iColour >> 8) & 0xFF); } //! Get the blue component of a colour. /*! @param iColour Colour to examine. @return The blue component intensity of the colour. */ inline static uint8_t get_blue(argb_colour iColour) { return static_cast((iColour >> 16) & 0xFF); } //! Get the opacity component of a colour. /*! @param iColour Colour to examine. @return The opacity of the colour. */ inline static uint8_t get_alpha(argb_colour iColour) { return static_cast((iColour >> 24) & 0xFF); } //! Get the number of colours in the palette. /*! @return The number of colours in the palette. */ int get_colour_count() const; //! Get the internal palette data for fast (read-only) access. /*! @return Table with all 256 colours of the palette. */ const argb_colour* get_argb_data() const; //! Set an entry of the palette. /*! @param iEntry Entry to modify. @param iVal Palette value to set. */ inline void set_argb(int iEntry, uint32_t iVal) { colour_index_to_argb_map[iEntry] = iVal; } private: //! 32bpp palette colours associated with the 8bpp colour index. uint32_t colour_index_to_argb_map[256]; //! Number of colours in the palette. int colour_count; }; //! Stored image. class raw_bitmap { public: raw_bitmap(); ~raw_bitmap(); //! Set the palette of the image. /*! @param pPalette Palette to set for this image. */ void set_palette(const ::palette* pPalette); //! Load the image from the supplied pixel data. /*! Loader uses the palette supplied before. @param pPixelData Image data loaded from a TH file. @param iPixelDataLength Size of the loaded image data. @param iWidth Width of the image. @param pEventualCanvas Canvas to render the image to (eventually). @return Loading was a success. */ void load_from_th_file(const uint8_t* pPixelData, size_t iPixelDataLength, int iWidth, render_target *pEventualCanvas); //! Draw the image at a given position at the given canvas. /*! @param pCanvas Canvas to draw at. @param iX Destination x position. @param iY Destination y position. */ void draw(render_target* pCanvas, int iX, int iY); //! Draw part of the image at a given position at the given canvas. /*! @param pCanvas Canvas to draw at. @param iX Destination x position. @param iY Destination y position. @param iSrcX X position of the part to display. @param iSrcY Y position of the part to display. @param iWidth Width of the part to display. @param iHeight Height of the part to display. */ void draw(render_target* pCanvas, int iX, int iY, int iSrcX, int iSrcY, int iWidth, int iHeight); private: //! Image stored in SDL format for quick rendering. SDL_Texture *texture; //! Palette of the image. const ::palette* bitmap_palette; //! Target canvas. render_target* target; //! Width of the stored image. int width; //! Height of the stored image. int height; }; //! Sheet of sprites. class sprite_sheet { public: // External API sprite_sheet(); ~sprite_sheet(); //! Set the palette to use for the sprites in the sheet. /*! @param pPalette Palette to use for the sprites at the sheet. */ void set_palette(const ::palette* pPalette); //! Load the sprites from the supplied data (using the palette supplied earlier). /*! @param pTableData Start of table data with TH sprite information (see th_sprite_properties). @param iTableDataLength Length of the table data. @param pChunkData Start of image data (chunks). @param iChunkDataLength Length of the chunk data. @param bComplexChunks Whether the supplied chunks are 'complex'. @param pEventualCanvas Canvas to draw at. @return Loading succeeded. */ bool load_from_th_file(const uint8_t* pTableData, size_t iTableDataLength, const uint8_t* pChunkData, size_t iChunkDataLength, bool bComplexChunks, render_target* pEventualCanvas); //! Set the data of a sprite. /*! @param iSprite Number of the sprite to set. @param pData Data of the sprite. @param bTakeData Whether the data block may be taken (must be new[] then). @param iDataLength Length of the data. @param iWidth Width of the sprite. @param iHeight Height of the sprite. @return Setting the sprite succeeded. */ bool set_sprite_data(size_t iSprite, const uint8_t *pData, bool bTakeData, size_t iDataLength, int iWidth, int iHeight); //! Supply a new mapped palette to a sprite. /*! @param iSprite Sprite getting the mapped palette. @param pMap The palette map to apply. @param iAlt32 What to do for a 32bpp sprite (#THDF_Alt32_Mask bits). */ void set_sprite_alt_palette_map(size_t iSprite, const uint8_t* pMap, uint32_t iAlt32); //! Get the number of sprites at the sheet. /*! @return The number of sprites available at the sheet. */ size_t get_sprite_count() const; //! Set the number of sprites in the sheet. /*! @param iCount The desired number of sprites. @param pCanvas Canvas to draw at. @return Whether the number of sprites could be allocated. */ bool set_sprite_count(size_t iCount, render_target* pCanvas); //! Get size of a sprite. /*! @param iSprite Sprite to get info from. @param pWidth [out] If not nullptr, the sprite width is stored in the destination. @param pHeight [out] If not nullptr, the sprite height is stored in the destination. @return Size could be provided for the sprite. */ bool get_sprite_size(size_t iSprite, unsigned int* pWidth, unsigned int* pHeight) const; //! Get size of a sprite, assuming all input is correctly supplied. /*! @param iSprite Sprite to get info from. @param pWidth [out] The sprite width is stored in the destination. @param pHeight [out] The sprite height is stored in the destination. */ void get_sprite_size_unchecked(size_t iSprite, unsigned int* pWidth, unsigned int* pHeight) const; //! Get the best colour to represent the sprite. /*! @param iSprite Sprite number to analyze. @param pColour [out] Resulting colour. @return Best colour could be established. */ bool get_sprite_average_colour(size_t iSprite, argb_colour* pColour) const; //! Draw a sprite onto the canvas. /*! @param pCanvas Canvas to draw on. @param iSprite Sprite to draw. @param iX X position to draw the sprite. @param iY Y position to draw the sprite. @param iFlags Flags to apply for drawing. */ void draw_sprite(render_target* pCanvas, size_t iSprite, int iX, int iY, uint32_t iFlags); //! Test whether a sprite was hit. /*! @param iSprite Sprite being tested. @param iX X position of the point to test relative to the origin of the sprite. @param iY Y position of the point to test relative to the origin of the sprite. @param iFlags Draw flags to apply to the sprite before testing. @return Whether the sprite covers the give point. */ bool hit_test_sprite(size_t iSprite, int iX, int iY, uint32_t iFlags) const; public: // Internal (this rendering engine only) API //! Draw a sprite into wxImage data arrays (for the Map Editor) /*! @param iSprite Sprite number to draw. @param pRGBData Output RGB data array. @param pAData Output Alpha channel array. */ void wx_draw_sprite(size_t iSprite, uint8_t* pRGBData, uint8_t* pAData); private: friend class cursor; #if CORSIX_TH_USE_PACK_PRAGMAS #pragma pack(push) #pragma pack(1) #endif //! Sprite structure in the table file. struct th_sprite_properties { //! Position of the sprite in the chunk data file. uint32_t position; //! Width of the sprite. uint8_t width; //! Height of the sprite. uint8_t height; } CORSIX_TH_PACKED_FLAGS; #if CORSIX_TH_USE_PACK_PRAGMAS #pragma pack(pop) #endif //! Sprites of the sheet. struct sprite { //! SDL structure containing the sprite with original palette. SDL_Texture *texture; //! SDL structure containing the sprite with alternative palette. SDL_Texture *alt_texture; //! Data of the sprite. const uint8_t *data; //! Alternative palette (if available). const uint8_t *alt_palette_map; //! Flags how to render the sprite, contains #THDF_Alt32_Mask bits. uint32_t sprite_flags; //! Width of the sprite. int width; //! Height of the sprite. int height; } *sprites; //! Original palette. const ::palette* palette; //! Target to render to. render_target* target; //! Number of sprites in the sprite sheet. size_t sprite_count; //! Free memory of a single sprite. /*! @param iNumber Number of the sprite to clear. */ void _freeSingleSprite(size_t iNumber); //! Free the memory used by the sprites. Also releases the SDL bitmaps. void _freeSprites(); //! Construct an alternative version (with its alternative palette map) of the sprite. /*! @param pSprite Sprite to change. @return SDL texture containing the sprite. */ SDL_Texture *_makeAltBitmap(sprite *pSprite); }; class cursor { public: cursor(); ~cursor(); bool create_from_sprite(sprite_sheet* pSheet, size_t iSprite, int iHotspotX = 0, int iHotspotY = 0); void use(render_target* pTarget); static bool set_position(render_target* pTarget, int iX, int iY); void draw(render_target* pCanvas, int iX, int iY); private: SDL_Surface* bitmap; SDL_Cursor* hidden_cursor; int hotspot_x; int hotspot_y; }; class line { public: line(); ~line(); void move_to(double fX, double fY); void line_to(double fX, double fY); void set_width(double lineWidth); void draw(render_target* pCanvas, int iX, int iY); void set_colour(uint8_t iR, uint8_t iG, uint8_t iB, uint8_t iA = 255); void persist(lua_persist_writer *pWriter) const; void depersist(lua_persist_reader *pReader); private: friend class render_target; void initialize(); enum class line_operation_type { move, line }; class line_operation : public link_list { public: line_operation_type type; double x, y; line_operation(line_operation_type type, double x, double y) : type(type), x(x), y(y) { next = nullptr; } }; line_operation* first_operation; line_operation* current_operation; double width; uint8_t red, green, blue, alpha; }; #endif // CORSIX_TH_TH_GFX_SDL_H_ CorsixTH-0.63/CorsixTH/Src/th_lua.cpp000066400000000000000000000276251347163623700174070ustar00rootroot00000000000000/* Copyright (c) 2009 Peter "Corsix" Cawley 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. */ #include "th.h" #include "th_lua_internal.h" #include "bootstrap.h" #include #include #include void lua_register_anims(const lua_register_state *pState); void lua_register_gfx(const lua_register_state *pState); void lua_register_map(const lua_register_state *pState); void lua_register_sound(const lua_register_state *pState); void lua_register_movie(const lua_register_state *pState); void lua_register_strings(const lua_register_state *pState); void lua_register_ui(const lua_register_state *pState); void lua_register_lfs_ext(const lua_register_state *pState); //! Set a field on the environment table of an object void luaT_setenvfield(lua_State *L, int index, const char *k) { lua_getfenv(L, index); lua_pushstring(L, k); lua_pushvalue(L, -3); lua_settable(L, -3); lua_pop(L, 2); } //! Get a field from the environment table of an object void luaT_getenvfield(lua_State *L, int index, const char *k) { lua_getfenv(L, index); lua_getfield(L, -1, k); lua_replace(L, -2); } #if LUA_VERSION_NUM >= 502 void luaT_getfenv52(lua_State *L, int iIndex) { int iType = lua_type(L, iIndex); switch(iType) { case LUA_TUSERDATA: lua_getuservalue(L, iIndex); break; case LUA_TFUNCTION: if(lua_iscfunction(L, iIndex)) { // Our convention: upvalue at #1 is environment if(lua_getupvalue(L, iIndex, 1) == nullptr) lua_pushglobaltable(L); } else { // Language convention: upvalue called _ENV is environment const char* sUpName = nullptr; for(int i = 1; (sUpName = lua_getupvalue(L, iIndex, i)) ; ++i) { if(std::strcmp(sUpName, "_ENV") == 0) return; else lua_pop(L, 1); } lua_pushglobaltable(L); } break; default: luaL_error(L, "Unable to get environment of a %s in 5.2", lua_typename(L, iType)); break; } } int luaT_setfenv52(lua_State *L, int iIndex) { int iType = lua_type(L, iIndex); switch(iType) { case LUA_TUSERDATA: lua_setuservalue(L, iIndex); return 1; case LUA_TFUNCTION: if(lua_iscfunction(L, iIndex)) { // Our convention: upvalue at #1 is environment if(lua_setupvalue(L, iIndex, 1) == nullptr) { lua_pop(L, 1); return 0; } return 1; } else { // Language convention: upvalue called _ENV is environment, which // might be shared with other functions. const char* sUpName = nullptr; for(int i = 1; (sUpName = lua_getupvalue(L, iIndex, i)) ; ++i) { lua_pop(L, 1); // lua_getupvalue puts the value on the stack, but we just want to replace it if(std::strcmp(sUpName, "_ENV") == 0) { luaL_loadstring(L, "local upv = ... return function() return upv end"); lua_insert(L, -2); lua_call(L, 1, 1); lua_upvaluejoin(L, iIndex, i, -1, 1); lua_pop(L, 1); return 1; } } lua_pop(L, 1); return 0; } default: return 0; } } #endif //! Push a C closure as a callable table void luaT_pushcclosuretable(lua_State *L, lua_CFunction fn, int n) { luaT_pushcclosure(L, fn, n); // .. fn (lua_touserdata(L, idx)); iLength = lua_objlen(L, idx); } else { pData = reinterpret_cast(luaL_checklstring(L, idx, &iLength)); } if(pDataLen != 0) *pDataLen = iLength; return pData; } static int l_load_strings(lua_State *L) { size_t iDataLength; const uint8_t* pData = luaT_checkfile(L, 1, &iDataLength); try { th_string_list oStrings(pData, iDataLength); lua_settop(L, 0); lua_createtable(L, static_cast(oStrings.get_section_count()), 0); for(size_t iSec = 0; iSec < oStrings.get_section_count(); ++iSec) { size_t iCount = oStrings.get_section_size(iSec); lua_createtable(L, static_cast(iCount), 0); for(size_t iStr = 0; iStr < iCount; ++iStr) { lua_pushstring(L, oStrings.get_string(iSec, iStr)); lua_rawseti(L, 2, static_cast(iStr + 1)); } lua_rawseti(L, 1, static_cast(iSec + 1)); } } catch(std::invalid_argument) { lua_pushboolean(L, 0); } return 1; } static int get_api_version() { #include "../Lua/api_version.lua" } static int l_get_compile_options(lua_State *L) { lua_settop(L, 0); lua_newtable(L); #ifdef CORSIX_TH_64BIT lua_pushboolean(L, 1); #else lua_pushboolean(L, 0); #endif lua_setfield(L, -2, "arch_64"); lua_pushliteral(L, "SDL"); lua_setfield(L, -2, "renderer"); #ifdef CORSIX_TH_USE_SDL_MIXER lua_pushboolean(L, 1); #else lua_pushboolean(L, 0); #endif lua_setfield(L, -2, "audio"); lua_getfield(L, LUA_REGISTRYINDEX, "_LOADED"); lua_getfield(L, -1, "jit"); if(lua_type(L, -1) == LUA_TNIL) { lua_replace(L, -2); } else { lua_getfield(L, -1, "version"); lua_replace(L, -3); lua_pop(L, 1); } lua_setfield(L, -2, "jit"); lua_pushinteger(L, get_api_version()); lua_setfield(L, -2, "api_version"); return 1; } void luaT_setclosure(const lua_register_state *pState, lua_CFunction fn, size_t iUps) { luaT_pushcclosure(pState->L, fn, iUps); } int luaopen_th(lua_State *L) { lua_settop(L, 0); lua_checkstack(L, 16 + static_cast(lua_metatable::count)); lua_register_state oState; const lua_register_state *pState = &oState; oState.L = L; for(int i = 0; i < static_cast(lua_metatable::count); ++i) { lua_createtable(L, 0, 5); oState.metatables[i] = lua_gettop(L); } lua_createtable(L, 0, lua_gettop(L)); oState.main_table = lua_gettop(L); oState.top = lua_gettop(L); // Misc. functions lua_settop(L, oState.top); luaT_setfunction(l_load_strings, "LoadStrings"); luaT_setfunction(l_get_compile_options, "GetCompileOptions"); luaT_setfunction(bootstrap_lua_resources, "GetBuiltinFont"); // Classes lua_register_map(pState); lua_register_gfx(pState); lua_register_anims(pState); lua_register_sound(pState); lua_register_movie(pState); lua_register_strings(pState); lua_register_ui(pState); lua_register_lfs_ext(pState); lua_settop(L, oState.main_table); return 1; } void luaT_execute_loadstring(lua_State *L, const char* sLuaString) { static const int iRegistryCacheIndex = 7; lua_rawgeti(L, LUA_REGISTRYINDEX, iRegistryCacheIndex); if(lua_isnil(L, -1)) { // Cache not yet created - create it. lua_pop(L, 1); lua_getglobal(L, "setmetatable"); if(lua_isnil(L, -1)) { // Base library not yet loaded - fallback to simple // uncached loadstring lua_pop(L, 1); if(luaL_loadstring(L, sLuaString)) lua_error(L); } lua_pop(L, 1); #if LUA_VERSION_NUM >= 502 luaL_loadstring(L, "local assert, load = assert, load\n" "return setmetatable({}, {__mode = [[v]], \n" "__index = function(t, k)\n" "local v = assert(load(k))\n" "t[k] = v\n" "return v\n" "end})"); #else luaL_loadstring(L, "local assert, loadstring = assert, loadstring\n" "return setmetatable({}, {__mode = [[v]], \n" "__index = function(t, k)\n" "local v = assert(loadstring(k))\n" "t[k] = v\n" "return v\n" "end})"); #endif lua_call(L, 0, 1); lua_pushvalue(L, -1); lua_rawseti(L, LUA_REGISTRYINDEX, iRegistryCacheIndex); } lua_getfield(L, -1, sLuaString); lua_replace(L, -2); } void luaT_execute(lua_State *L, const char* sLuaString) { luaT_execute_loadstring(L, sLuaString); lua_call(L, 0, LUA_MULTRET); } void luaT_push(lua_State *L, lua_CFunction f) { luaT_pushcfunction(L, f); } void luaT_push(lua_State *L, int i) { lua_pushinteger(L, (lua_Integer)i); } void luaT_push(lua_State *L, const char* s) { lua_pushstring(L, s); } void luaT_pushtablebool(lua_State *L, const char *k, bool v) { lua_pushstring(L, k); lua_pushboolean(L, v); lua_settable(L, -3); } void luaT_printstack(lua_State* L) { int i; int top = lua_gettop(L); std::printf("total items in stack %d\n", top); for (i = 1; i <= top; i++) { /* repeat for each level */ int t = lua_type(L, i); switch (t) { case LUA_TSTRING: /* strings */ std::printf("string: '%s'\n", lua_tostring(L, i)); break; case LUA_TBOOLEAN: /* booleans */ std::printf("boolean %s\n", lua_toboolean(L, i) ? "true" : "false"); break; case LUA_TNUMBER: /* numbers */ std::printf("number: %g\n", lua_tonumber(L, i)); break; default: /* other values */ std::printf("%s\n", lua_typename(L, t)); break; } std::printf(" "); /* put a separator */ } std::printf("\n"); /* end the listing */ } void luaT_printrawtable(lua_State* L, int idx) { int i; int len = static_cast(lua_objlen(L, idx)); std::printf("total items in table %d\n", len); for (i = 1; i <= len; i++) { lua_rawgeti(L, idx, i); int t = lua_type(L, -1); switch (t) { case LUA_TSTRING: /* strings */ std::printf("string: '%s'\n", lua_tostring(L, -1)); break; case LUA_TBOOLEAN: /* booleans */ std::printf("boolean %s\n", lua_toboolean(L, -1) ? "true" : "false"); break; case LUA_TNUMBER: /* numbers */ std::printf("number: %g\n", lua_tonumber(L, -1)); break; default: /* other values */ std::printf("%s\n", lua_typename(L, t)); break; } std::printf(" "); /* put a separator */ lua_pop(L, 1); } std::printf("\n"); /* end the listing */ } CorsixTH-0.63/CorsixTH/Src/th_lua.h000066400000000000000000000254061347163623700170470ustar00rootroot00000000000000/* Copyright (c) 2009 Peter "Corsix" Cawley 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. */ #ifndef CORSIX_TH_TH_LUA_H_ #define CORSIX_TH_TH_LUA_H_ #include "config.h" #include "lua.hpp" #include #include int luaopen_th(lua_State *L); // Compatibility layer for removal of environments in 5.2 #if LUA_VERSION_NUM >= 502 const int luaT_environindex = lua_upvalueindex(1); #else const int luaT_environindex = LUA_ENVIRONINDEX; #endif inline int luaT_upvalueindex(int i) { #if LUA_VERSION_NUM >= 502 return lua_upvalueindex(i + 1); #else return lua_upvalueindex(i); #endif } inline void luaT_register(lua_State *L, const char *n, const std::vector &l) { #if LUA_VERSION_NUM >= 502 lua_createtable(L, 0, static_cast(l.size())); lua_pushvalue(L, luaT_environindex); luaL_setfuncs(L, l.data(), 1); lua_pushvalue(L, -1); lua_setglobal(L, n); #else luaL_register(L, n, l.data()); #endif } inline void luaT_setfuncs(lua_State *L, const luaL_Reg *R) { #if LUA_VERSION_NUM >= 502 lua_pushvalue(L, luaT_environindex); luaL_setfuncs(L, R, 1); #else luaL_register(L, nullptr, R); #endif } inline void luaT_pushcclosure(lua_State* L, lua_CFunction f, int nups) { #if LUA_VERSION_NUM >= 502 ++nups; lua_pushvalue(L, luaT_environindex); lua_insert(L, -nups); lua_pushcclosure(L, f, nups); #else lua_pushcclosure(L, f, nups); #endif } inline void luaT_pushcfunction(lua_State *L, lua_CFunction f) { luaT_pushcclosure(L, f, 0); } inline int luaT_cpcall(lua_State *L, lua_CFunction f, void *u) { #if LUA_VERSION_NUM >= 502 lua_checkstack(L, 2); lua_pushcfunction(L, f); lua_pushlightuserdata(L, u); return lua_pcall(L, 1, 0, 0); #else return lua_cpcall(L, f, u); #endif } // Compatibility for missing mode argument on lua_load in 5.1 inline int luaT_load(lua_State *L, lua_Reader r, void *d, const char *s, const char *m) { #if LUA_VERSION_NUM >= 502 return lua_load(L, r, d, s, m); #else return lua_load(L, r, d, s); #endif } // Compatibility for missing from argument on lua_resume in 5.1 inline int luaT_resume(lua_State *L, lua_State *f, int n) { #if LUA_VERSION_NUM >= 502 return lua_resume(L, f, n); #else return lua_resume(L, n); #endif } //! Version of operator new which allocates into a Lua userdata /*! If a specific constructor of T is required, then call like: T* variable = luaT_new(L, T)(constructor arguments); If the default constructor is wanted, it can be called like: T* variable = luaT_new(L, T); See also luaT_stdnew() which allocates, and also sets up the environment table and metatable for the userdata. */ #define luaT_new(L, T) new ((T*)lua_newuserdata(L, sizeof(T))) T //! Check that a Lua argument is a binary data blob /*! If the given argument is a string or (full) userdata, then returns a pointer to the start of it, and the length of it. Otherwise, throws a Lua error. */ const uint8_t* luaT_checkfile(lua_State *L, int idx, size_t* pDataLen); //! Check that a Lua argument is a string or a proxied string const char* luaT_checkstring(lua_State *L, int idx, size_t* pLength); //! Push a C closure as a callable table void luaT_pushcclosuretable(lua_State *L, lua_CFunction fn, int n); //! Set a field on the environment table of a value /*! Performs: env(stack[index])[k] = top; pop() */ void luaT_setenvfield(lua_State *L, int index, const char *k); //! Get a field from the environment table of a value /*! Performs: push(env(stack[index])[k]) */ void luaT_getenvfield(lua_State *L, int index, const char *k); template inline T* luaT_stdnew(lua_State *L, int mt_idx = luaT_environindex, bool env = false) { T* p = luaT_new(L, T); lua_pushvalue(L, mt_idx); lua_setmetatable(L, -2); if(env) { lua_newtable(L); lua_setfenv(L, -2); } return p; } template struct luaT_classinfo {}; class render_target; template <> struct luaT_classinfo { static inline const char* name() {return "Surface";} }; class level_map; template <> struct luaT_classinfo { static inline const char* name() {return "Map";} }; class sprite_sheet; template <> struct luaT_classinfo { static inline const char* name() {return "SpriteSheet";} }; class animation; template <> struct luaT_classinfo { static inline const char* name() {return "Animation";} }; class animation_manager; template <> struct luaT_classinfo { static inline const char* name() {return "Animator";} }; class palette; template <> struct luaT_classinfo { static inline const char* name() {return "Palette";} }; class raw_bitmap; template <> struct luaT_classinfo { static inline const char* name() {return "RawBitmap";} }; class font; template <> struct luaT_classinfo { static inline const char* name() {return "Font";} }; class bitmap_font; template <> struct luaT_classinfo { static inline const char* name() {return "BitmapFont";} }; #ifdef CORSIX_TH_USE_FREETYPE2 class freetype_font; template <> struct luaT_classinfo { static inline const char* name() {return "FreeTypeFont";} }; #endif struct layers; template <> struct luaT_classinfo { static inline const char* name() {return "Layers";} }; class pathfinder; template <> struct luaT_classinfo { static inline const char* name() {return "Pathfinder";} }; class cursor; template <> struct luaT_classinfo { static inline const char* name() {return "Cursor";} }; class line; template <> struct luaT_classinfo { static inline const char* name() {return "Line";} }; class music; template <> struct luaT_classinfo { static inline const char* name() {return "Music";} }; class sound_archive; template <> struct luaT_classinfo { static inline const char* name() {return "SoundArchive";} }; class sound_player; template <> struct luaT_classinfo { static inline const char* name() {return "SoundEffects";} }; class movie_player; template <> struct luaT_classinfo { static inline const char* name() {return "Movie";} }; class abstract_window; template <> struct luaT_classinfo { static inline const char* name() {return "WindowBase";} }; class sprite_render_list; template <> struct luaT_classinfo { static inline const char* name() {return "SpriteRenderList";} }; class string_proxy; template <> struct luaT_classinfo { static inline const char* name() {return "StringProxy";} }; class lfs_ext; template <> struct luaT_classinfo { static inline const char* name() {return "LfsExt";} }; class iso_filesystem; template <> struct luaT_classinfo { static inline const char* name() {return "ISO Filesystem";} }; template <> struct luaT_classinfo { static inline const char* name() {return "file";} }; template static T* luaT_testuserdata(lua_State *L, int idx, int mt_idx, bool required = true) { // Turn mt_idx into an absolute index, as the stack size changes. if(mt_idx > LUA_REGISTRYINDEX && mt_idx < 0) mt_idx = lua_gettop(L) + mt_idx + 1; void *ud = lua_touserdata(L, idx); if(ud != nullptr && lua_getmetatable(L, idx) != 0) { while(true) { if(lua_equal(L, mt_idx, -1) != 0) { lua_pop(L, 1); return (T*)ud; } // Go up one inheritance level, if there is one. if(lua_type(L, -1) != LUA_TTABLE) break; lua_rawgeti(L, -1, 1); lua_replace(L, -2); } lua_pop(L, 1); } if (required) { const char *msg = lua_pushfstring(L, "%s expected, got %s", luaT_classinfo::name(), luaL_typename(L, idx)); luaL_argerror(L, idx, msg); } return nullptr; } template static T* luaT_testuserdata(lua_State *L, int idx = 1) { int iMetaIndex = luaT_environindex; if(idx > 1) iMetaIndex = luaT_upvalueindex(idx - 1); return luaT_testuserdata(L, idx, iMetaIndex); } template static int luaT_stdgc(lua_State *L) { T* p = luaT_testuserdata(L, 1, mt, false); if(p != nullptr) { p->~T(); } return 0; } void luaT_execute(lua_State *L, const char* sLuaString); void luaT_execute_loadstring(lua_State *L, const char* sLuaString); void luaT_push(lua_State *L, lua_CFunction f); void luaT_push(lua_State *L, int i); void luaT_push(lua_State *L, const char* s); template static void luaT_execute(lua_State *L, const char* sLuaString, T arg) { luaT_execute_loadstring(L, sLuaString); luaT_push(L, arg); lua_call(L, 1, LUA_MULTRET); } template static void luaT_execute(lua_State *L, const char* sLuaString, T1 arg1, T2 arg2) { luaT_execute_loadstring(L, sLuaString); luaT_push(L, arg1); luaT_push(L, arg2); lua_call(L, 2, LUA_MULTRET); } template static void luaT_execute(lua_State *L, const char* sLuaString, T1 arg1, T2 arg2, T3 arg3) { luaT_execute_loadstring(L, sLuaString); luaT_push(L, arg1); luaT_push(L, arg2); luaT_push(L, arg3); lua_call(L, 3, LUA_MULTRET); } template static void luaT_execute(lua_State *L, const char* sLuaString, T1 arg1, T2 arg2, T3 arg3, T4 arg4) { luaT_execute_loadstring(L, sLuaString); luaT_push(L, arg1); luaT_push(L, arg2); luaT_push(L, arg3); luaT_push(L, arg4); lua_call(L, 4, LUA_MULTRET); } void luaT_pushtablebool(lua_State *L, const char *k, bool v); void luaT_printstack(lua_State *L); void luaT_printrawtable(lua_State *L, int idx); #endif // CORSIX_TH_TH_LUA_H_ CorsixTH-0.63/CorsixTH/Src/th_lua_anims.cpp000066400000000000000000000604651347163623700205750ustar00rootroot00000000000000/* Copyright (c) 2010 Peter "Corsix" Cawley 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. */ #include "th_lua_internal.h" #include "th_gfx.h" #include "th_map.h" /* this variable is used to determine the layer of the animation, it should be rewriten at some point so that the it is passed as an argument in the function l_anim_set_tile */ static int last_layer = 2; static int l_anims_new(lua_State *L) { luaT_stdnew(L, luaT_environindex, true); return 1; } static int l_anims_set_spritesheet(lua_State *L) { animation_manager* pAnims = luaT_testuserdata(L); sprite_sheet* pSheet = luaT_testuserdata(L, 2); lua_settop(L, 2); pAnims->set_sprite_sheet(pSheet); luaT_setenvfield(L, 1, "sprites"); return 1; } //! Set the video target for the sprites. /*! setCanvas() */ static int l_anims_set_canvas(lua_State *L) { animation_manager* pAnims = luaT_testuserdata(L); render_target* pCanvas = luaT_testuserdata(L, 2); lua_settop(L, 2); pAnims->set_canvas(pCanvas); luaT_setenvfield(L, 1, "target"); return 1; } static int l_anims_load(lua_State *L) { animation_manager* pAnims = luaT_testuserdata(L); size_t iStartDataLength, iFrameDataLength, iListDataLength, iElementDataLength; const uint8_t* pStartData = luaT_checkfile(L, 2, &iStartDataLength); const uint8_t* pFrameData = luaT_checkfile(L, 3, &iFrameDataLength); const uint8_t* pListData = luaT_checkfile(L, 4, &iListDataLength); const uint8_t* pElementData = luaT_checkfile(L, 5, &iElementDataLength); if(pAnims->load_from_th_file(pStartData, iStartDataLength, pFrameData, iFrameDataLength, pListData, iListDataLength, pElementData, iElementDataLength)) { lua_pushboolean(L, 1); } else { lua_pushboolean(L, 0); } return 1; } //! Load custom animations. /*! loadCustom() -> true/false */ static int l_anims_loadcustom(lua_State *L) { animation_manager* pAnims = luaT_testuserdata(L); size_t iDataLength; const uint8_t* pData = luaT_checkfile(L, 2, &iDataLength); if (pAnims->load_custom_animations(pData, iDataLength)) { lua_pushboolean(L, 1); } else { lua_pushboolean(L, 0); } return 1; } //! Lua interface for getting a set of animations by name and tile size (one for //! each view direction, 'nil' if no animation is available for a direction). /*! getAnimations(, ) -> (, , , ) */ static int l_anims_getanims(lua_State *L) { animation_manager* pAnims = luaT_testuserdata(L); int iTileSize = static_cast(luaL_checkinteger(L, 2)); const char *pName = luaL_checkstring(L, 3); const animation_start_frames &oFrames = pAnims->get_named_animations(pName, iTileSize); if (oFrames.north < 0) { lua_pushnil(L); } else { lua_pushnumber(L, static_cast(oFrames.north)); } if (oFrames.east < 0) { lua_pushnil(L); } else { lua_pushnumber(L, static_cast(oFrames.east)); } if (oFrames.south < 0) { lua_pushnil(L); } else { lua_pushnumber(L, static_cast(oFrames.south)); } if (oFrames.west < 0) { lua_pushnil(L); } else { lua_pushnumber(L, static_cast(oFrames.west)); } return 4; } static int l_anims_getfirst(lua_State *L) { animation_manager* pAnims = luaT_testuserdata(L); int iAnim = static_cast(luaL_checkinteger(L, 2)); lua_pushinteger(L, pAnims->get_first_frame(iAnim)); return 1; } static int l_anims_getnext(lua_State *L) { animation_manager* pAnims = luaT_testuserdata(L); int iFrame = static_cast(luaL_checkinteger(L, 2)); lua_pushinteger(L, pAnims->get_next_frame(iFrame)); return 1; } static int l_anims_set_alt_pal(lua_State *L) { animation_manager* pAnims = luaT_testuserdata(L); size_t iAnimation = luaL_checkinteger(L, 2); size_t iPalLen; const uint8_t *pPal = luaT_checkfile(L, 3, &iPalLen); if(iPalLen != 256) { return luaL_argerror(L, 3, "GhostPalette string is not a valid palette"); } uint32_t iAlt32 = static_cast(luaL_checkinteger(L, 4)); pAnims->set_animation_alt_palette_map(iAnimation, pPal, iAlt32); lua_getfenv(L, 1); lua_insert(L, 2); lua_settop(L, 4); lua_settable(L, 2); lua_settop(L, 1); return 1; } static int l_anims_set_marker(lua_State *L) { animation_manager* pAnims = luaT_testuserdata(L); lua_pushboolean(L, pAnims->set_frame_marker(luaL_checkinteger(L, 2), static_cast(luaL_checkinteger(L, 3)), static_cast(luaL_checkinteger(L, 4))) ? 1 : 0); return 1; } static int l_anims_set_secondary_marker(lua_State *L) { animation_manager* pAnims = luaT_testuserdata(L); lua_pushboolean(L, pAnims->set_frame_secondary_marker(luaL_checkinteger(L, 2), static_cast(luaL_checkinteger(L, 3)), static_cast(luaL_checkinteger(L, 4))) ? 1 : 0); return 1; } static int l_anims_draw(lua_State *L) { animation_manager* pAnims = luaT_testuserdata(L); render_target* pCanvas = luaT_testuserdata(L, 2); size_t iFrame = luaL_checkinteger(L, 3); layers* pLayers = luaT_testuserdata(L, 4, luaT_upvalueindex(2)); int iX = static_cast(luaL_checkinteger(L, 5)); int iY = static_cast(luaL_checkinteger(L, 6)); int iFlags = static_cast(luaL_optinteger(L, 7, 0)); pAnims->draw_frame(pCanvas, iFrame, *pLayers, iX, iY, iFlags); lua_settop(L, 1); return 1; } template static int l_anim_new(lua_State *L) { T* pAnimation = luaT_stdnew(L, luaT_environindex, true); lua_rawgeti(L, luaT_environindex, 2); lua_pushlightuserdata(L, pAnimation); lua_pushvalue(L, -3); lua_rawset(L, -3); lua_pop(L, 1); return 1; } template static int l_anim_persist(lua_State *L) { T* pAnimation; if(lua_gettop(L) == 2) { pAnimation = luaT_testuserdata(L, 1, luaT_environindex, false); lua_insert(L, 1); } else { // Fast __persist call pAnimation = (T*)lua_touserdata(L, -1); } lua_persist_writer* pWriter = (lua_persist_writer*)lua_touserdata(L, 1); pAnimation->persist(pWriter); lua_rawgeti(L, luaT_environindex, 1); lua_pushlightuserdata(L, pAnimation); lua_gettable(L, -2); pWriter->write_stack_object(-1); lua_pop(L, 2); return 0; } template static int l_anim_pre_depersist(lua_State *L) { // Note that anims and the map have nice reference cycles between them // and hence we cannot be sure which is depersisted first. To ensure that // things work nicely, we initialise all the fields of a THAnimation as // soon as possible, thus preventing issues like an anim -> map -> anim // reference chain whereby l_anim_depersist is called after l_map_depersist // (as anim references map in its environment table) causing the prev // field to be set during map depersistence, then cleared to nullptr by the // constructor during l_anim_depersist. T* pAnimation = luaT_testuserdata(L); new (pAnimation) T; // Call constructor return 0; } template static int l_anim_depersist(lua_State *L) { T* pAnimation = luaT_testuserdata(L); lua_settop(L, 2); lua_insert(L, 1); lua_persist_reader* pReader = (lua_persist_reader*)lua_touserdata(L, 1); lua_rawgeti(L, luaT_environindex, 2); lua_pushlightuserdata(L, pAnimation); lua_pushvalue(L, 2); lua_settable(L, -3); lua_pop(L, 1); pAnimation->depersist(pReader); lua_rawgeti(L, luaT_environindex, 1); lua_pushlightuserdata(L, pAnimation); if(!pReader->read_stack_object()) return 0; lua_settable(L, -3); lua_pop(L, 1); return 0; } static int l_anim_set_hitresult(lua_State *L) { luaL_checktype(L, 1, LUA_TUSERDATA); lua_settop(L, 2); lua_rawgeti(L, luaT_environindex, 1); lua_pushlightuserdata(L, lua_touserdata(L, 1)); lua_pushvalue(L, 2); lua_settable(L, 3); lua_settop(L, 1); return 1; } static int l_anim_set_frame(lua_State *L) { animation* pAnimation = luaT_testuserdata(L); pAnimation->set_frame(luaL_checkinteger(L, 2)); lua_settop(L, 1); return 1; } static int l_anim_get_frame(lua_State *L) { animation* pAnimation = luaT_testuserdata(L); lua_pushinteger(L, pAnimation->get_frame()); return 1; } static int l_anim_set_crop(lua_State *L) { animation* pAnimation = luaT_testuserdata(L); pAnimation->set_crop_column(static_cast(luaL_checkinteger(L, 2))); lua_settop(L, 1); return 1; } static int l_anim_get_crop(lua_State *L) { animation* pAnimation = luaT_testuserdata(L); lua_pushinteger(L, pAnimation->get_crop_column()); return 1; } static int l_anim_set_anim(lua_State *L) { animation* pAnimation = luaT_testuserdata(L); animation_manager* pManager = luaT_testuserdata(L, 2); size_t iAnim = luaL_checkinteger(L, 3); if(iAnim < 0 || iAnim >= pManager->get_animation_count()) luaL_argerror(L, 3, "Animation index out of bounds"); if(lua_isnoneornil(L, 4)) pAnimation->set_flags(0); else pAnimation->set_flags(static_cast(luaL_checkinteger(L, 4))); pAnimation->set_animation(pManager, iAnim); lua_settop(L, 2); luaT_setenvfield(L, 1, "animator"); lua_pushnil(L); luaT_setenvfield(L, 1, "morph_target"); return 1; } static int l_anim_set_morph(lua_State *L) { animation* pAnimation = luaT_testuserdata(L); animation* pMorphTarget = luaT_testuserdata(L, 2, luaT_environindex); unsigned int iDurationFactor = 1; if(!lua_isnoneornil(L, 3) && luaL_checkinteger(L, 3) > 0) iDurationFactor = static_cast(luaL_checkinteger(L, 3)); pAnimation->set_morph_target(pMorphTarget, iDurationFactor); lua_settop(L, 2); luaT_setenvfield(L, 1, "morph_target"); return 1; } static int l_anim_set_drawable_layer(lua_State *L) { last_layer = static_cast(luaL_checkinteger(L, 2)); return 1; } static int l_anim_get_anim(lua_State *L) { animation* pAnimation = luaT_testuserdata(L); lua_pushinteger(L, pAnimation->get_animation()); return 1; } template static int l_anim_set_tile(lua_State *L) { T* pAnimation = luaT_testuserdata(L); if(lua_isnoneornil(L, 2)) { pAnimation->remove_from_tile(); lua_pushnil(L); luaT_setenvfield(L, 1, "map"); lua_settop(L, 1); } else { level_map* pMap = luaT_testuserdata(L, 2); map_tile* pNode = pMap->get_tile(static_cast(luaL_checkinteger(L, 3) - 1), static_cast(luaL_checkinteger(L, 4) - 1)); if(pNode) pAnimation->attach_to_tile(pNode, last_layer); else { luaL_argerror(L, 3, lua_pushfstring(L, "Map index out of bounds (" LUA_NUMBER_FMT "," LUA_NUMBER_FMT ")", lua_tonumber(L, 3), lua_tonumber(L, 4))); } lua_settop(L, 2); luaT_setenvfield(L, 1, "map"); } return 1; } static int l_anim_get_tile(lua_State *L) { animation* pAnimation = luaT_testuserdata(L); lua_settop(L, 1); lua_getfenv(L, 1); lua_getfield(L, 2, "map"); lua_replace(L, 2); if(lua_isnil(L, 2)) { return 0; } level_map* pMap = (level_map*)lua_touserdata(L, 2); const link_list* pListNode = pAnimation->get_previous(); while(pListNode->prev) { pListNode = pListNode->prev; } // Casting pListNode to a map_tile* is slightly dubious, but it should // work. If on the normal list, then pListNode will be a map_tile*, and // all is fine. However, if on the early list, pListNode will be pointing // to a member of a map_tile, so we're relying on pointer arithmetic // being a subtract and integer divide by sizeof(map_tile) to yield the // correct map_tile. const map_tile *pRootNode = pMap->get_tile_unchecked(0, 0); uintptr_t iDiff = reinterpret_cast(pListNode) - reinterpret_cast(pRootNode); int iIndex = (int)(iDiff / sizeof(map_tile)); int iY = iIndex / pMap->get_width(); int iX = iIndex - (iY * pMap->get_width()); lua_pushinteger(L, iX + 1); lua_pushinteger(L, iY + 1); return 3; // map, x, y } static int l_anim_set_parent(lua_State *L) { animation* pAnimation = luaT_testuserdata(L); animation* pParent = luaT_testuserdata(L, 2, luaT_environindex, false); pAnimation->set_parent(pParent); lua_settop(L, 1); return 1; } template static int l_anim_set_flag(lua_State *L) { T* pAnimation = luaT_testuserdata(L); pAnimation->set_flags(static_cast(luaL_checkinteger(L, 2))); lua_settop(L, 1); return 1; } template static int l_anim_set_flag_partial(lua_State *L) { T* pAnimation = luaT_testuserdata(L); uint32_t iFlags = static_cast(luaL_checkinteger(L, 2)); if(lua_isnone(L, 3) || lua_toboolean(L, 3)) { pAnimation->set_flags(pAnimation->get_flags() | iFlags); } else { pAnimation->set_flags(pAnimation->get_flags() & ~iFlags); } lua_settop(L, 1); return 1; } template static int l_anim_make_visible(lua_State *L) { T* pAnimation = luaT_testuserdata(L); pAnimation->set_flags(pAnimation->get_flags() & ~static_cast(thdf_alpha_50 | thdf_alpha_75)); lua_settop(L, 1); return 1; } template static int l_anim_make_invisible(lua_State *L) { T* pAnimation = luaT_testuserdata(L); pAnimation->set_flags(pAnimation->get_flags() | static_cast(thdf_alpha_50 | thdf_alpha_75)); lua_settop(L, 1); return 1; } template static int l_anim_get_flag(lua_State *L) { T* pAnimation = luaT_testuserdata(L); lua_pushinteger(L, pAnimation->get_flags()); return 1; } template static int l_anim_set_position(lua_State *L) { T* pAnimation = luaT_testuserdata(L); pAnimation->set_position(static_cast(luaL_checkinteger(L, 2)), static_cast(luaL_checkinteger(L, 3))); lua_settop(L, 1); return 1; } static int l_anim_get_position(lua_State *L) { animation* pAnimation = luaT_testuserdata(L); lua_pushinteger(L, pAnimation->get_x()); lua_pushinteger(L, pAnimation->get_y()); return 2; } template static int l_anim_set_speed(lua_State *L) { T* pAnimation = luaT_testuserdata(L); pAnimation->set_speed(static_cast(luaL_optinteger(L, 2, 0)), static_cast(luaL_optinteger(L, 3, 0))); lua_settop(L, 1); return 1; } template static int l_anim_set_layer(lua_State *L) { T* pAnimation = luaT_testuserdata(L); pAnimation->set_layer(static_cast(luaL_checkinteger(L, 2)), static_cast(luaL_optinteger(L, 3, 0))); lua_settop(L, 1); return 1; } static int l_anim_set_layers_from(lua_State *L) { animation* pAnimation = luaT_testuserdata(L); const animation* pAnimationSrc = luaT_testuserdata(L, 2, luaT_environindex); pAnimation->set_layers_from(pAnimationSrc); lua_settop(L, 1); return 1; } static int l_anim_set_tag(lua_State *L) { luaT_testuserdata(L); lua_settop(L, 2); luaT_setenvfield(L, 1, "tag"); return 1; } static int l_anim_get_tag(lua_State *L) { luaT_testuserdata(L); lua_settop(L, 1); lua_getfenv(L, 1); lua_getfield(L, 2, "tag"); return 1; } static int l_anim_get_marker(lua_State *L) { animation* pAnimation = luaT_testuserdata(L); int iX = 0; int iY = 0; pAnimation->get_marker(&iX, &iY); lua_pushinteger(L, iX); lua_pushinteger(L, iY); return 2; } static int l_anim_get_secondary_marker(lua_State *L) { animation* pAnimation = luaT_testuserdata(L); int iX = 0; int iY = 0; pAnimation->get_secondary_marker(&iX, &iY); lua_pushinteger(L, iX); lua_pushinteger(L, iY); return 2; } template static int l_anim_tick(lua_State *L) { T* pAnimation = luaT_testuserdata(L); pAnimation->tick(); lua_settop(L, 1); return 1; } template static int l_anim_draw(lua_State *L) { T* pAnimation = luaT_testuserdata(L); render_target* pCanvas = luaT_testuserdata(L, 2); pAnimation->draw(pCanvas, static_cast(luaL_checkinteger(L, 3)), static_cast(luaL_checkinteger(L, 4))); lua_settop(L, 1); return 1; } static int l_srl_set_sheet(lua_State *L) { sprite_render_list *pSrl = luaT_testuserdata(L); sprite_sheet *pSheet = luaT_testuserdata(L, 2); pSrl->set_sheet(pSheet); lua_settop(L, 2); luaT_setenvfield(L, 1, "sheet"); return 1; } static int l_srl_append(lua_State *L) { sprite_render_list *pSrl = luaT_testuserdata(L); pSrl->append_sprite(luaL_checkinteger(L, 2), static_cast(luaL_checkinteger(L, 3)), static_cast(luaL_checkinteger(L, 4))); lua_settop(L, 1); return 1; } static int l_srl_set_lifetime(lua_State *L) { sprite_render_list *pSrl = luaT_testuserdata(L); pSrl->set_lifetime(static_cast(luaL_checkinteger(L, 2))); lua_settop(L, 1); return 1; } static int l_srl_is_dead(lua_State *L) { sprite_render_list *pSrl = luaT_testuserdata(L); lua_pushboolean(L, pSrl->is_dead() ? 1 : 0); return 1; } void lua_register_anims(const lua_register_state *pState) { // Anims luaT_class(animation_manager, l_anims_new, "anims", lua_metatable::anims); luaT_setfunction(l_anims_load, "load"); luaT_setfunction(l_anims_loadcustom, "loadCustom"); luaT_setfunction(l_anims_set_spritesheet, "setSheet", lua_metatable::sheet); luaT_setfunction(l_anims_set_canvas, "setCanvas", lua_metatable::surface); luaT_setfunction(l_anims_getanims, "getAnimations"); luaT_setfunction(l_anims_getfirst, "getFirstFrame"); luaT_setfunction(l_anims_getnext, "getNextFrame"); luaT_setfunction(l_anims_set_alt_pal, "setAnimationGhostPalette"); luaT_setfunction(l_anims_set_marker, "setFrameMarker"); luaT_setfunction(l_anims_set_secondary_marker, "setFrameSecondaryMarker"); luaT_setfunction(l_anims_draw, "draw", lua_metatable::surface, lua_metatable::layers); luaT_setconstant("Alt32_GreyScale", thdf_alt32_grey_scale); luaT_setconstant("Alt32_BlueRedSwap", thdf_alt32_blue_red_swap); luaT_endclass(); // Weak table at AnimMetatable[1] for light UD -> object lookup // For hitTest / setHitTestResult lua_newtable(pState->L); lua_createtable(pState->L, 0, 1); lua_pushliteral(pState->L, "v"); lua_setfield(pState->L, -2, "__mode"); lua_setmetatable(pState->L, -2); lua_rawseti(pState->L, pState->metatables[static_cast(lua_metatable::anim)], 1); // Weak table at AnimMetatable[2] for light UD -> full UD lookup // For persisting Map lua_newtable(pState->L); lua_createtable(pState->L, 0, 1); lua_pushliteral(pState->L, "v"); lua_setfield(pState->L, -2, "__mode"); lua_setmetatable(pState->L, -2); lua_rawseti(pState->L, pState->metatables[static_cast(lua_metatable::anim)], 2); // Anim luaT_class(animation, l_anim_new, "animation", lua_metatable::anim); luaT_setmetamethod(l_anim_persist, "persist"); luaT_setmetamethod(l_anim_pre_depersist, "pre_depersist"); luaT_setmetamethod(l_anim_depersist, "depersist"); luaT_setfunction(l_anim_set_anim, "setAnimation", lua_metatable::anims); luaT_setfunction(l_anim_set_crop, "setCrop"); luaT_setfunction(l_anim_get_crop, "getCrop"); luaT_setfunction(l_anim_set_morph, "setMorph"); luaT_setfunction(l_anim_set_frame, "setFrame"); luaT_setfunction(l_anim_get_frame, "getFrame"); luaT_setfunction(l_anim_get_anim, "getAnimation"); luaT_setfunction(l_anim_set_tile, "setTile", lua_metatable::map); luaT_setfunction(l_anim_get_tile, "getTile"); luaT_setfunction(l_anim_set_parent, "setParent"); luaT_setfunction(l_anim_set_flag, "setFlag"); luaT_setfunction(l_anim_set_flag_partial, "setPartialFlag"); luaT_setfunction(l_anim_get_flag, "getFlag"); luaT_setfunction(l_anim_make_visible, "makeVisible"); luaT_setfunction(l_anim_make_invisible, "makeInvisible"); luaT_setfunction(l_anim_set_tag, "setTag"); luaT_setfunction(l_anim_get_tag, "getTag"); luaT_setfunction(l_anim_set_position, "setPosition"); luaT_setfunction(l_anim_get_position, "getPosition"); luaT_setfunction(l_anim_set_speed, "setSpeed"); luaT_setfunction(l_anim_set_layer, "setLayer"); luaT_setfunction(l_anim_set_layers_from, "setLayersFrom"); luaT_setfunction(l_anim_set_hitresult, "setHitTestResult"); luaT_setfunction(l_anim_get_marker, "getMarker"); luaT_setfunction(l_anim_get_secondary_marker, "getSecondaryMarker"); luaT_setfunction(l_anim_tick, "tick"); luaT_setfunction(l_anim_draw, "draw", lua_metatable::surface); luaT_setfunction(l_anim_set_drawable_layer, "setDrawingLayer"); luaT_endclass(); // Duplicate AnimMetatable[1,2] to SpriteListMetatable[1,2] lua_rawgeti(pState->L, pState->metatables[static_cast(lua_metatable::anim)], 1); lua_rawseti(pState->L, pState->metatables[static_cast(lua_metatable::sprite_list)], 1); lua_rawgeti(pState->L, pState->metatables[static_cast(lua_metatable::anim)], 2); lua_rawseti(pState->L, pState->metatables[static_cast(lua_metatable::sprite_list)], 2); // SpriteList luaT_class(sprite_render_list, l_anim_new, "spriteList", lua_metatable::sprite_list); luaT_setmetamethod(l_anim_persist, "persist"); luaT_setmetamethod(l_anim_pre_depersist, "pre_depersist"); luaT_setmetamethod(l_anim_depersist, "depersist"); luaT_setfunction(l_srl_set_sheet, "setSheet", lua_metatable::sheet); luaT_setfunction(l_srl_append, "append"); luaT_setfunction(l_srl_set_lifetime, "setLifetime"); luaT_setfunction(l_srl_is_dead, "isDead"); luaT_setfunction(l_anim_set_tile, "setTile", lua_metatable::map); luaT_setfunction(l_anim_set_flag, "setFlag"); luaT_setfunction(l_anim_set_flag_partial, "setPartialFlag"); luaT_setfunction(l_anim_get_flag, "getFlag"); luaT_setfunction(l_anim_make_visible, "makeVisible"); luaT_setfunction(l_anim_make_invisible, "makeInvisible"); luaT_setfunction(l_anim_set_position, "setPosition"); luaT_setfunction(l_anim_set_speed, "setSpeed"); luaT_setfunction(l_anim_set_layer, "setLayer"); luaT_setfunction(l_anim_tick, "tick"); luaT_setfunction(l_anim_draw, "draw", lua_metatable::surface); luaT_endclass(); } CorsixTH-0.63/CorsixTH/Src/th_lua_gfx.cpp000066400000000000000000000741251347163623700202500ustar00rootroot00000000000000/* Copyright (c) 2010-2013 Peter "Corsix" Cawley and Edvin "Lego3" Linge 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. */ #include "th_lua_internal.h" #include "th_gfx.h" #include #include #include static int l_palette_new(lua_State *L) { luaT_stdnew(L); return 1; } static int l_palette_load(lua_State *L) { palette* pPalette = luaT_testuserdata(L); size_t iDataLen; const uint8_t* pData = luaT_checkfile(L, 2, &iDataLen); if(pPalette->load_from_th_file(pData, iDataLen)) lua_pushboolean(L, 1); else lua_pushboolean(L, 0); return 1; } static int l_palette_set_entry(lua_State *L) { palette* pPalette = luaT_testuserdata(L); lua_pushboolean(L, pPalette->set_entry(static_cast(luaL_checkinteger(L, 2)), static_cast(luaL_checkinteger(L, 3)), static_cast(luaL_checkinteger(L, 4)), static_cast(luaL_checkinteger(L, 5))) ? 1 : 0); return 1; } static int l_rawbitmap_new(lua_State *L) { luaT_stdnew(L, luaT_environindex, true); return 1; } static int l_rawbitmap_set_pal(lua_State *L) { raw_bitmap* pBitmap = luaT_testuserdata(L); palette* pPalette = luaT_testuserdata(L, 2); lua_settop(L, 2); pBitmap->set_palette(pPalette); luaT_setenvfield(L, 1, "palette"); return 1; } static int l_rawbitmap_load(lua_State *L) { raw_bitmap* pBitmap = luaT_testuserdata(L); size_t iDataLen; const uint8_t* pData = luaT_checkfile(L, 2, &iDataLen); int iWidth = static_cast(luaL_checkinteger(L, 3)); render_target* pSurface = luaT_testuserdata(L, 4, luaT_upvalueindex(1), false); try { pBitmap->load_from_th_file(pData, iDataLen, iWidth, pSurface); } catch (const std::exception& ex) { lua_pushstring(L, ex.what()); lua_error(L); return 1; } lua_pushboolean(L, 1); return 1; } static int l_rawbitmap_draw(lua_State *L) { raw_bitmap* pBitmap = luaT_testuserdata(L); render_target* pCanvas = luaT_testuserdata(L, 2); if(lua_gettop(L) >= 8) { pBitmap->draw(pCanvas, static_cast(luaL_checkinteger(L, 3)), static_cast(luaL_checkinteger(L, 4)), static_cast(luaL_checkinteger(L, 5)), static_cast(luaL_checkinteger(L, 6)), static_cast(luaL_checkinteger(L, 7)), static_cast(luaL_checkinteger(L, 8))); } else pBitmap->draw(pCanvas, static_cast(luaL_optinteger(L, 3, 0)), static_cast(luaL_optinteger(L, 4, 0))); lua_settop(L, 1); return 1; } static int l_spritesheet_new(lua_State *L) { luaT_stdnew(L, luaT_environindex, true); return 1; } static int l_spritesheet_set_pal(lua_State *L) { sprite_sheet* pSheet = luaT_testuserdata(L); palette* pPalette = luaT_testuserdata(L, 2); lua_settop(L, 2); pSheet->set_palette(pPalette); luaT_setenvfield(L, 1, "palette"); return 1; } static int l_spritesheet_load(lua_State *L) { sprite_sheet* pSheet = luaT_testuserdata(L); size_t iDataLenTable, iDataLenChunk; const uint8_t* pDataTable = luaT_checkfile(L, 2, &iDataLenTable); const uint8_t* pDataChunk = luaT_checkfile(L, 3, &iDataLenChunk); bool bComplex = lua_toboolean(L, 4) != 0; render_target* pSurface = luaT_testuserdata(L, 5, luaT_upvalueindex(1), false); if(pSheet->load_from_th_file(pDataTable, iDataLenTable, pDataChunk, iDataLenChunk, bComplex, pSurface)) lua_pushboolean(L, 1); else lua_pushboolean(L, 0); return 1; } static int l_spritesheet_count(lua_State *L) { sprite_sheet* pSheet = luaT_testuserdata(L); lua_pushinteger(L, pSheet->get_sprite_count()); return 1; } static int l_spritesheet_size(lua_State *L) { sprite_sheet* pSheet = luaT_testuserdata(L); size_t iSprite = luaL_checkinteger(L, 2); // No array adjustment if(iSprite < 0 || iSprite >= pSheet->get_sprite_count()) return luaL_argerror(L, 2, "Sprite index out of bounds"); unsigned int iWidth, iHeight; pSheet->get_sprite_size_unchecked(iSprite, &iWidth, &iHeight); lua_pushinteger(L, iWidth); lua_pushinteger(L, iHeight); return 2; } static int l_spritesheet_draw(lua_State *L) { sprite_sheet* pSheet = luaT_testuserdata(L); render_target* pCanvas = luaT_testuserdata(L, 2); int iSprite = static_cast(luaL_checkinteger(L, 3)); // No array adjustment pSheet->draw_sprite(pCanvas, iSprite, static_cast(luaL_optinteger(L, 4, 0)), static_cast(luaL_optinteger(L, 5, 0)), static_cast(luaL_optinteger(L, 6, 0))); lua_settop(L, 1); return 1; } static int l_spritesheet_hittest(lua_State *L) { sprite_sheet* pSheet = luaT_testuserdata(L); size_t iSprite = luaL_checkinteger(L, 2); int iX = static_cast(luaL_checkinteger(L, 3)); int iY = static_cast(luaL_checkinteger(L, 4)); uint32_t iFlags = static_cast(luaL_optinteger(L, 5, 0)); return pSheet->hit_test_sprite(iSprite, iX, iY, iFlags); } static int l_spritesheet_isvisible(lua_State *L) { sprite_sheet* pSheet = luaT_testuserdata(L); size_t iSprite = luaL_checkinteger(L, 2); argb_colour oDummy; lua_pushboolean(L, pSheet->get_sprite_average_colour(iSprite, &oDummy) ? 1:0); return 1; } static int l_font_new(lua_State *L) { return luaL_error(L, "Cannot instantiate an interface"); } static int l_bitmap_font_new(lua_State *L) { luaT_stdnew(L, luaT_environindex, true); return 1; } static int l_bitmap_font_set_spritesheet(lua_State *L) { bitmap_font* pFont = luaT_testuserdata(L); sprite_sheet* pSheet = luaT_testuserdata(L, 2); lua_settop(L, 2); pFont->set_sprite_sheet(pSheet); luaT_setenvfield(L, 1, "sprites"); return 1; } static int l_bitmap_font_get_spritesheet(lua_State *L) { luaT_testuserdata(L); luaT_getenvfield(L, 1, "sprites"); return 1; } static int l_bitmap_font_set_sep(lua_State *L) { bitmap_font* pFont = luaT_testuserdata(L); pFont->set_separation(static_cast(luaL_checkinteger(L, 2)), static_cast(luaL_optinteger(L, 3, 0))); lua_settop(L, 1); return 1; } #ifdef CORSIX_TH_USE_FREETYPE2 static void l_freetype_throw_error_code(lua_State *L, FT_Error e) { if(e != FT_Err_Ok) { switch(e) { #undef __FTERRORS_H__ #define FT_ERRORDEF(e, v, s) case e: lua_pushliteral(L, s); break; #define FT_ERROR_START_LIST #define FT_ERROR_END_LIST #include FT_ERRORS_H default: lua_pushliteral(L, "Unrecognised FreeType2 error"); break; }; lua_error(L); } } static int l_freetype_font_new(lua_State *L) { freetype_font *pFont = luaT_stdnew(L, luaT_environindex, true); l_freetype_throw_error_code(L, pFont->initialise()); return 1; } static int l_freetype_font_set_spritesheet(lua_State *L) { freetype_font* pFont = luaT_testuserdata(L); sprite_sheet* pSheet = luaT_testuserdata(L, 2); lua_settop(L, 2); l_freetype_throw_error_code(L, pFont->match_bitmap_font(pSheet)); lua_settop(L, 1); return 1; } static int l_freetype_font_get_copyright(lua_State *L) { lua_pushstring(L, freetype_font::get_copyright_notice()); return 1; } static int l_freetype_font_set_face(lua_State *L) { freetype_font* pFont = luaT_testuserdata(L); size_t iLength; const uint8_t* pData = luaT_checkfile(L, 2, &iLength); lua_settop(L, 2); l_freetype_throw_error_code(L, pFont->set_face(pData, iLength)); luaT_setenvfield(L, 1, "face"); return 1; } static int l_freetype_font_clear_cache(lua_State *L) { freetype_font* pFont = luaT_testuserdata(L); pFont->clear_cache(); return 0; } #endif static int l_font_get_size(lua_State *L) { font* pFont = luaT_testuserdata(L); size_t iMsgLen; const char* sMsg = luaT_checkstring(L, 2, &iMsgLen); int iMaxWidth = INT_MAX; if(!lua_isnoneornil(L, 3)) iMaxWidth = static_cast(luaL_checkinteger(L, 3)); text_layout oDrawArea = pFont->get_text_dimensions(sMsg, iMsgLen, iMaxWidth); lua_pushinteger(L, oDrawArea.end_x); lua_pushinteger(L, oDrawArea.end_y); lua_pushinteger(L, oDrawArea.row_count); return 3; } static int l_font_draw(lua_State *L) { font* pFont = luaT_testuserdata(L); render_target* pCanvas = nullptr; if(!lua_isnoneornil(L, 2)) { pCanvas = luaT_testuserdata(L, 2); } size_t iMsgLen; const char* sMsg = luaT_checkstring(L, 3, &iMsgLen); int iX = static_cast(luaL_checkinteger(L, 4)); int iY = static_cast(luaL_checkinteger(L, 5)); text_alignment eAlign = text_alignment::center; if(!lua_isnoneornil(L, 8)) { const char* sAlign = luaL_checkstring(L, 8); if(std::strcmp(sAlign, "right") == 0) { eAlign = text_alignment::right; } else if(std::strcmp(sAlign, "left") == 0) { eAlign = text_alignment::left; } else if(std::strcmp(sAlign, "center") == 0 || std::strcmp(sAlign, "centre") == 0 || std::strcmp(sAlign, "middle") == 0) { eAlign = text_alignment::center; } else { return luaL_error(L, "Invalid alignment: \"%s\"", sAlign); } } text_layout oDrawArea = pFont->get_text_dimensions(sMsg, iMsgLen); if(!lua_isnoneornil(L, 7)) { int iW = static_cast(luaL_checkinteger(L, 6)); int iH = static_cast(luaL_checkinteger(L, 7)); if(iW > oDrawArea.end_x && eAlign != text_alignment::left) { iX += (iW - oDrawArea.end_x) / ((eAlign == text_alignment::center) ? 2 : 1); } if(iH > oDrawArea.end_y) { iY += (iH - oDrawArea.end_y) / 2; } } if(pCanvas != nullptr) { pFont->draw_text(pCanvas, sMsg, iMsgLen, iX, iY); } lua_pushinteger(L, iY + oDrawArea.end_y); lua_pushinteger(L, iX + oDrawArea.end_x); return 2; } static int l_font_draw_wrapped(lua_State *L) { font* pFont = luaT_testuserdata(L); render_target* pCanvas = nullptr; if(!lua_isnoneornil(L, 2)) { pCanvas = luaT_testuserdata(L, 2); } size_t iMsgLen; const char* sMsg = luaT_checkstring(L, 3, &iMsgLen); int iX = static_cast(luaL_checkinteger(L, 4)); int iY = static_cast(luaL_checkinteger(L, 5)); int iW = static_cast(luaL_checkinteger(L, 6)); text_alignment eAlign = text_alignment::left; if(!lua_isnoneornil(L, 7)) { const char* sAlign = luaL_checkstring(L, 7); if(std::strcmp(sAlign, "right") == 0) { eAlign = text_alignment::right; } else if(std::strcmp(sAlign, "left") == 0) { eAlign = text_alignment::left; } else if(std::strcmp(sAlign, "center") == 0 || std::strcmp(sAlign, "centre") == 0 || std::strcmp(sAlign, "middle") == 0) { eAlign = text_alignment::center; } else { return luaL_error(L, "Invalid alignment: \"%s\"", sAlign); } } int iMaxRows = INT_MAX; if(!lua_isnoneornil(L, 8)) { iMaxRows = static_cast(luaL_checkinteger(L, 8)); } int iSkipRows = 0; if(!lua_isnoneornil(L, 9)) { iSkipRows = static_cast(luaL_checkinteger(L, 9)); } text_layout oDrawArea = pFont->draw_text_wrapped(pCanvas, sMsg, iMsgLen, iX, iY, iW, iMaxRows, iSkipRows, eAlign); lua_pushinteger(L, oDrawArea.end_y); lua_pushinteger(L, oDrawArea.end_x); lua_pushinteger(L, oDrawArea.row_count); return 3; } static int l_font_draw_tooltip(lua_State *L) { font* pFont = luaT_testuserdata(L); render_target* pCanvas = luaT_testuserdata(L, 2); size_t iMsgLen; const char* sMsg = luaT_checkstring(L, 3, &iMsgLen); int iX = static_cast(luaL_checkinteger(L, 4)); int iY = static_cast(luaL_checkinteger(L, 5)); int iScreenWidth = pCanvas->get_width(); int iW = 200; // (for now) hardcoded width of tooltips uint32_t iBlack = pCanvas->map_colour(0x00, 0x00, 0x00); uint32_t iWhite = pCanvas->map_colour(0xFF, 0xFF, 0xFF); text_layout oArea = pFont->draw_text_wrapped(nullptr, sMsg, iMsgLen, iX + 2, iY + 1, iW - 4, INT_MAX, 0); int iLastX = iX + oArea.width + 3; int iFirstY = iY - (oArea.end_y - iY) - 1; int iXOffset = iLastX > iScreenWidth ? iScreenWidth - iLastX : 0; int iYOffset = iFirstY < 0 ? -iFirstY : 0; pCanvas->fill_rect(iBlack, iX + iXOffset, iFirstY + iYOffset, oArea.width + 3, oArea.end_y - iY + 2); pCanvas->fill_rect(iWhite, iX + iXOffset + 1, iFirstY + 1 + iYOffset, oArea.width + 1, oArea.end_y - iY); pFont->draw_text_wrapped(pCanvas, sMsg, iMsgLen, iX + 2 + iXOffset, iFirstY + 1 + iYOffset, iW - 4); lua_pushinteger(L, oArea.end_y); return 1; } static int l_layers_new(lua_State *L) { layers* pLayers = luaT_stdnew(L, luaT_environindex, false); for(int i = 0; i < 13; ++i) pLayers->layer_contents[i] = 0; return 1; } static int l_layers_get(lua_State *L) { layers* pLayers = luaT_testuserdata(L); lua_Integer iLayer = luaL_checkinteger(L, 2); if(0 <= iLayer && iLayer < 13) lua_pushinteger(L, pLayers->layer_contents[iLayer]); else lua_pushnil(L); return 1; } static int l_layers_set(lua_State *L) { layers* pLayers = luaT_testuserdata(L); lua_Integer iLayer = luaL_checkinteger(L, 2); uint8_t iValue = static_cast(luaL_checkinteger(L, 3)); if(0 <= iLayer && iLayer < 13) pLayers->layer_contents[iLayer] = iValue; return 0; } static int l_layers_persist(lua_State *L) { layers* pLayers = luaT_testuserdata(L); lua_settop(L, 2); lua_insert(L, 1); lua_persist_writer* pWriter = (lua_persist_writer*)lua_touserdata(L, 1); int iNumLayers = 13; for( ; iNumLayers >= 1; --iNumLayers) { if(pLayers->layer_contents[iNumLayers - 1] != 0) break; } pWriter->write_uint(iNumLayers); pWriter->write_byte_stream(pLayers->layer_contents, iNumLayers); return 0; } static int l_layers_depersist(lua_State *L) { layers* pLayers = luaT_testuserdata(L); lua_settop(L, 2); lua_insert(L, 1); lua_persist_reader* pReader = (lua_persist_reader*)lua_touserdata(L, 1); std::memset(pLayers->layer_contents, 0, sizeof(pLayers->layer_contents)); int iNumLayers; if(!pReader->read_uint(iNumLayers)) return 0; if(iNumLayers > 13) { if(!pReader->read_byte_stream(pLayers->layer_contents, 13)) return 0; if(!pReader->read_byte_stream(nullptr, iNumLayers - 13)) return 0; } else { if(!pReader->read_byte_stream(pLayers->layer_contents, iNumLayers)) return 0; } return 0; } static int l_cursor_new(lua_State *L) { luaT_stdnew(L, luaT_environindex, false); return 1; } static int l_cursor_load(lua_State *L) { cursor* pCursor = luaT_testuserdata(L); sprite_sheet* pSheet = luaT_testuserdata(L, 2); if(pCursor->create_from_sprite(pSheet, static_cast(luaL_checkinteger(L, 3)), static_cast(luaL_optinteger(L, 4, 0)), static_cast(luaL_optinteger(L, 5, 0)))) { lua_settop(L, 1); return 1; } else { lua_pushboolean(L, 0); return 1; } } static int l_cursor_use(lua_State *L) { cursor* pCursor = luaT_testuserdata(L); render_target* pCanvas = luaT_testuserdata(L, 2); pCursor->use(pCanvas); return 0; } static int l_cursor_position(lua_State *L) { render_target* pCanvas = luaT_testuserdata(L, 1, luaT_upvalueindex(1)); lua_pushboolean(L, cursor::set_position(pCanvas, static_cast(luaL_checkinteger(L, 2)), static_cast(luaL_checkinteger(L, 3))) ? 1 : 0); return 1; } /** Construct the helper structure for making a #THRenderTarget. */ static render_target_creation_params l_surface_creation_params(lua_State *L, int iArgStart) { render_target_creation_params oParams; oParams.width = static_cast(luaL_checkinteger(L, iArgStart)); oParams.height = static_cast(luaL_checkinteger(L, iArgStart + 1)); oParams.fullscreen = false; oParams.present_immediate = false; // Parse string arguments, looking for matching parameter names. for(int iArg = iArgStart + 2, iArgCount = lua_gettop(L); iArg <= iArgCount; ++iArg) { const char* sOption = luaL_checkstring(L, iArg); if(sOption[0] == 0) continue; if (std::strcmp(sOption, "fullscreen") == 0) oParams.fullscreen = true; if (std::strcmp(sOption, "present immediate") == 0) oParams.present_immediate = true; } return oParams; } static int l_surface_new(lua_State *L) { lua_remove(L, 1); // Value inserted by __call render_target_creation_params oParams = l_surface_creation_params(L, 1); render_target* pCanvas = luaT_stdnew(L); if(pCanvas->create(&oParams)) return 1; lua_pushnil(L); lua_pushstring(L, pCanvas->get_last_error()); return 2; } static int l_surface_update(lua_State *L) { render_target* pCanvas = luaT_testuserdata(L); render_target_creation_params oParams = l_surface_creation_params(L, 2); if(pCanvas->update(&oParams)) { lua_pushnil(L); return 1; } lua_pushstring(L, pCanvas->get_last_error()); return 1; } static int l_surface_destroy(lua_State *L) { render_target* pCanvas = luaT_testuserdata(L); pCanvas->end_frame(); pCanvas->destroy(); return 1; } static int l_surface_fill_black(lua_State *L) { render_target* pCanvas = luaT_testuserdata(L); lua_settop(L, 1); if(pCanvas->fill_black()) return 1; lua_pushnil(L); lua_pushstring(L, pCanvas->get_last_error()); return 2; } static int l_surface_start_frame(lua_State *L) { render_target* pCanvas = luaT_testuserdata(L); lua_settop(L, 1); if(pCanvas->start_frame()) return 1; lua_pushnil(L); lua_pushstring(L, pCanvas->get_last_error()); return 2; } static int l_surface_end_frame(lua_State *L) { render_target* pCanvas = luaT_testuserdata(L); lua_settop(L, 1); if(pCanvas->end_frame()) return 1; lua_pushnil(L); lua_pushstring(L, pCanvas->get_last_error()); return 2; } static int l_surface_nonoverlapping(lua_State *L) { render_target* pCanvas = luaT_testuserdata(L); if(lua_isnone(L, 2) || lua_toboolean(L, 2) != 0) pCanvas->start_nonoverlapping_draws(); else pCanvas->finish_nonoverlapping_draws(); lua_settop(L, 1); return 1; } static int l_surface_set_blue_filter_active(lua_State *L) { render_target* pCanvas = luaT_testuserdata(L); pCanvas->set_blue_filter_active((lua_isnoneornil(L, 2) != 0) ? false : (lua_toboolean(L, 2) != 0)); return 1; } static int l_surface_map(lua_State *L) { render_target* pCanvas = luaT_testuserdata(L); lua_pushnumber(L, (lua_Number)pCanvas->map_colour( (Uint8)luaL_checkinteger(L, 2), (Uint8)luaL_checkinteger(L, 3), (Uint8)luaL_checkinteger(L, 4))); return 1; } static int l_surface_rect(lua_State *L) { render_target* pCanvas = luaT_testuserdata(L); if(pCanvas->fill_rect(static_cast(luaL_checkinteger(L, 2)), static_cast(luaL_checkinteger(L, 3)), static_cast(luaL_checkinteger(L, 4)), static_cast(luaL_checkinteger(L, 5)), static_cast(luaL_checkinteger(L, 6)))) { lua_settop(L, 1); return 1; } lua_pushnil(L); lua_pushstring(L, pCanvas->get_last_error()); return 2; } static int l_surface_screenshot(lua_State *L) { render_target* pCanvas = luaT_testuserdata(L); const char *sFile = luaL_checkstring(L, 2); if(pCanvas->take_screenshot(sFile)) { lua_settop(L, 1); return 1; } lua_pushnil(L); lua_pushstring(L, pCanvas->get_last_error()); return 2; } static int l_surface_get_clip(lua_State *L) { render_target* pCanvas = luaT_testuserdata(L); clip_rect rcClip; pCanvas->get_clip_rect(&rcClip); lua_pushinteger(L, rcClip.x); lua_pushinteger(L, rcClip.y); lua_pushinteger(L, rcClip.w); lua_pushinteger(L, rcClip.h); return 4; } static int l_surface_set_clip(lua_State *L) { render_target* pCanvas = luaT_testuserdata(L); clip_rect rcClip; rcClip.x = static_cast(luaL_checkinteger(L, 2)); rcClip.y = static_cast(luaL_checkinteger(L, 3)); rcClip.w = static_cast(luaL_checkinteger(L, 4)); rcClip.h = static_cast(luaL_checkinteger(L, 5)); if(lua_toboolean(L, 6) != 0) { clip_rect rcExistingClip; pCanvas->get_clip_rect(&rcExistingClip); clip_rect_intersection(rcClip, rcExistingClip); } pCanvas->set_clip_rect(&rcClip); lua_settop(L, 1); return 1; } static int l_surface_scale(lua_State *L) { render_target* pCanvas = luaT_testuserdata(L); scaled_items eToScale = scaled_items::none; if(lua_isnoneornil(L, 3)) { eToScale = scaled_items::all; } else { size_t iLength; const char* sOption = lua_tolstring(L, 3, &iLength); if(sOption && iLength >= 6 && std::memcmp(sOption, "bitmap", 6) == 0) { eToScale = scaled_items::bitmaps; } else luaL_error(L, "Expected \"bitmap\" as 2nd argument"); } lua_pushboolean(L, pCanvas->set_scale_factor(static_cast( luaL_checknumber(L, 2)), eToScale) ? 1 : 0); return 1; } static int l_surface_set_caption(lua_State *L) { render_target* pCanvas = luaT_testuserdata(L); pCanvas->set_caption(luaL_checkstring(L, 2)); lua_settop(L, 1); return 1; } static int l_surface_get_renderer_details(lua_State *L) { render_target* pCanvas = luaT_testuserdata(L); lua_pushstring(L, pCanvas->get_renderer_details()); return 1; } // Lua to THRenderTarget->setWindowGrab static int l_surface_set_capture_mouse(lua_State *L) { render_target* pCanvas = luaT_testuserdata(L); pCanvas->set_window_grab((lua_isnoneornil(L, 2) != 0) ? false : (lua_toboolean(L, 2) != 0)); return 0; } static int l_line_new(lua_State *L) { luaT_stdnew(L); return 1; } static int l_move_to(lua_State *L) { line* pLine = luaT_testuserdata(L); pLine->move_to(luaL_optnumber(L, 2, 0), luaL_optnumber(L, 3, 0)); lua_settop(L, 1); return 1; } static int l_line_to(lua_State *L) { line* pLine = luaT_testuserdata(L); pLine->line_to(luaL_optnumber(L, 2, 0), luaL_optnumber(L, 3, 0)); lua_settop(L, 1); return 1; } static int l_set_width(lua_State *L) { line* pLine = luaT_testuserdata(L); pLine->set_width(luaL_optnumber(L, 2, 1)); lua_settop(L, 1); return 1; } static int l_set_colour(lua_State *L) { line* pLine = luaT_testuserdata(L); pLine->set_colour(static_cast(luaL_optinteger(L, 2, 0)), static_cast(luaL_optinteger(L, 3, 0)), static_cast(luaL_optinteger(L, 4, 0)), static_cast(luaL_optinteger(L, 5, 255))); lua_settop(L, 1); return 1; } static int l_line_draw(lua_State *L) { line* pLine = luaT_testuserdata(L); render_target* pCanvas = luaT_testuserdata(L, 2); pLine->draw(pCanvas, static_cast(luaL_optinteger(L, 3, 0)), static_cast(luaL_optinteger(L, 4, 0))); lua_settop(L, 1); return 1; } static int l_line_persist(lua_State *L) { line* pLine = luaT_testuserdata(L); lua_settop(L, 2); lua_insert(L, 1); lua_persist_writer* pWriter = (lua_persist_writer*)lua_touserdata(L, 1); pLine->persist(pWriter); return 0; } static int l_line_depersist(lua_State *L) { line* pLine = luaT_testuserdata(L); lua_settop(L, 2); lua_insert(L, 1); lua_persist_reader* pReader = (lua_persist_reader*)lua_touserdata(L, 1); pLine->depersist(pReader); return 0; } void lua_register_gfx(const lua_register_state *pState) { // Palette luaT_class(palette, l_palette_new, "palette", lua_metatable::palette); luaT_setfunction(l_palette_load, "load"); luaT_setfunction(l_palette_set_entry, "setEntry"); luaT_endclass(); // Raw bitmap luaT_class(raw_bitmap, l_rawbitmap_new, "bitmap", lua_metatable::bitmap); luaT_setfunction(l_rawbitmap_load, "load", lua_metatable::surface); luaT_setfunction(l_rawbitmap_set_pal, "setPalette", lua_metatable::palette); luaT_setfunction(l_rawbitmap_draw, "draw", lua_metatable::surface); luaT_endclass(); // Sprite sheet luaT_class(sprite_sheet, l_spritesheet_new, "sheet", lua_metatable::sheet); luaT_setmetamethod(l_spritesheet_count, "len"); luaT_setfunction(l_spritesheet_load, "load", lua_metatable::surface); luaT_setfunction(l_spritesheet_set_pal, "setPalette", lua_metatable::palette); luaT_setfunction(l_spritesheet_size, "size"); luaT_setfunction(l_spritesheet_draw, "draw", lua_metatable::surface); luaT_setfunction(l_spritesheet_hittest, "hitTest"); luaT_setfunction(l_spritesheet_isvisible, "isVisible"); luaT_endclass(); // Font // Also adapt the font proxy meta table (font_proxy_mt) in graphics.lua. luaT_class(font, l_font_new, "font", lua_metatable::font); luaT_setfunction(l_font_get_size, "sizeOf"); luaT_setfunction(l_font_draw, "draw", lua_metatable::surface); luaT_setfunction(l_font_draw_wrapped, "drawWrapped", lua_metatable::surface); luaT_setfunction(l_font_draw_tooltip, "drawTooltip", lua_metatable::surface); luaT_endclass(); // BitmapFont luaT_class(bitmap_font, l_bitmap_font_new, "bitmap_font", lua_metatable::bitmap_font); luaT_superclass(lua_metatable::font); luaT_setfunction(l_bitmap_font_set_spritesheet, "setSheet", lua_metatable::sheet); luaT_setfunction(l_bitmap_font_get_spritesheet, "getSheet", lua_metatable::sheet); luaT_setfunction(l_bitmap_font_set_sep, "setSeparation"); luaT_endclass(); #ifdef CORSIX_TH_USE_FREETYPE2 // FreeTypeFont luaT_class(freetype_font, l_freetype_font_new, "freetype_font", lua_metatable::freetype_font); luaT_superclass(lua_metatable::font); luaT_setfunction(l_freetype_font_set_spritesheet, "setSheet", lua_metatable::sheet); luaT_setfunction(l_freetype_font_set_face, "setFace"); luaT_setfunction(l_freetype_font_get_copyright, "getCopyrightNotice"); luaT_setfunction(l_freetype_font_clear_cache, "clearCache"); luaT_endclass(); #endif // Layers luaT_class(layers, l_layers_new, "layers", lua_metatable::layers); luaT_setmetamethod(l_layers_get, "index"); luaT_setmetamethod(l_layers_set, "newindex"); luaT_setmetamethod(l_layers_persist, "persist"); luaT_setmetamethod(l_layers_depersist, "depersist"); luaT_endclass(); // Cursor luaT_class(cursor, l_cursor_new, "cursor", lua_metatable::cursor); luaT_setfunction(l_cursor_load, "load", lua_metatable::sheet); luaT_setfunction(l_cursor_use, "use", lua_metatable::surface); luaT_setfunction(l_cursor_position, "setPosition", lua_metatable::surface); luaT_endclass(); // Surface luaT_class(render_target, l_surface_new, "surface", lua_metatable::surface); luaT_setfunction(l_surface_update, "update"); luaT_setfunction(l_surface_destroy, "destroy"); luaT_setfunction(l_surface_fill_black, "fillBlack"); luaT_setfunction(l_surface_start_frame, "startFrame"); luaT_setfunction(l_surface_end_frame, "endFrame"); luaT_setfunction(l_surface_nonoverlapping, "nonOverlapping"); luaT_setfunction(l_surface_map, "mapRGB"); luaT_setfunction(l_surface_set_blue_filter_active, "setBlueFilterActive"); luaT_setfunction(l_surface_rect, "drawRect"); luaT_setfunction(l_surface_get_clip, "getClip"); luaT_setfunction(l_surface_set_clip, "setClip"); luaT_setfunction(l_surface_screenshot, "takeScreenshot"); luaT_setfunction(l_surface_scale, "scale"); luaT_setfunction(l_surface_set_caption, "setCaption"); luaT_setfunction(l_surface_get_renderer_details, "getRendererDetails"); luaT_setfunction(l_surface_set_capture_mouse, "setCaptureMouse"); luaT_endclass(); // Line luaT_class(line, l_line_new, "line", lua_metatable::line); luaT_setfunction(l_move_to, "moveTo"); luaT_setfunction(l_line_to, "lineTo"); luaT_setfunction(l_set_width, "setWidth"); luaT_setfunction(l_set_colour, "setColour"); luaT_setfunction(l_line_draw, "draw", lua_metatable::surface); luaT_setmetamethod(l_line_persist, "persist"); luaT_setmetamethod(l_line_depersist, "depersist"); luaT_endclass(); } CorsixTH-0.63/CorsixTH/Src/th_lua_internal.h000066400000000000000000000111351347163623700207350ustar00rootroot00000000000000/* Copyright (c) 2010 Peter "Corsix" Cawley 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. */ #ifndef CORSIX_TH_TH_LUA_INTERNAL_H_ #define CORSIX_TH_TH_LUA_INTERNAL_H_ #include "config.h" #include "th_lua.h" enum class lua_metatable { map, palette, sheet, font, bitmap_font, #ifdef CORSIX_TH_USE_FREETYPE2 freetype_font, #endif layers, anims, anim, pathfinder, surface, bitmap, cursor, lfs_ext, sound_archive, sound_fx, movie, string, window_base, sprite_list, string_proxy, line, count }; struct lua_register_state { lua_State *L; int metatables[static_cast(lua_metatable::count)]; int main_table; int top; }; void luaT_setclosure(const lua_register_state *pState, lua_CFunction fn, size_t iUps); template void luaT_setclosure(const lua_register_state *pState, lua_CFunction fn, size_t iUps, lua_metatable eMetatable1, Args... args) { lua_pushvalue(pState->L, pState->metatables[static_cast(eMetatable1)]); luaT_setclosure(pState, fn, iUps + 1, args...); } template void luaT_setclosure(const lua_register_state *pState, lua_CFunction fn, size_t iUps, const char* str, Args... args) { lua_pushstring(pState->L, str); luaT_setclosure(pState, fn, iUps + 1, args...); } #define luaT_class(typnam, new_fn, name, mt) { \ const char * sCurrentClassName = name; \ int iCurrentClassMT = pState->metatables[static_cast(mt)]; \ lua_settop(pState->L, pState->top); \ /* Make metatable the environment for registered functions */ \ lua_pushvalue(pState->L, iCurrentClassMT); \ lua_replace(pState->L, luaT_environindex); \ /* Set the __gc metamethod to C++ destructor */ \ luaT_pushcclosure(pState->L, luaT_stdgc, 0); \ lua_setfield(pState->L, iCurrentClassMT, "__gc"); \ /* Set the depersist size */ \ lua_pushinteger(pState->L, sizeof(typnam)); \ lua_setfield(pState->L, iCurrentClassMT, "__depersist_size"); \ /* Create the methods table; call it -> new instance */ \ luaT_pushcclosuretable(pState->L, new_fn, 0); \ /* Set __class_name on the methods metatable */ \ lua_getmetatable(pState->L, -1); \ lua_pushstring(pState->L, sCurrentClassName); \ lua_setfield(pState->L, -2, "__class_name"); \ lua_pop(pState->L, 1); \ /* Set __index to the methods table */ \ lua_pushvalue(pState->L, -1); \ lua_setfield(pState->L, iCurrentClassMT, "__index") #define luaT_superclass(super_mt) \ /* Set __index on the methods metatable to the superclass methods */ \ lua_getmetatable(pState->L, -1); \ lua_getfield(pState->L, pState->metatables[static_cast(super_mt)], "__index"); \ lua_setfield(pState->L, -2, "__index"); \ lua_pop(pState->L, 1); \ /* Set metatable[1] to super_mt */ \ lua_pushvalue(pState->L, pState->metatables[static_cast(super_mt)]); \ lua_rawseti(pState->L, iCurrentClassMT, 1) #define luaT_endclass() \ lua_setfield(pState->L, pState->main_table, sCurrentClassName); } #define luaT_setmetamethod(fn, name, ...) \ luaT_setclosure(pState, fn, 0, ## __VA_ARGS__); \ lua_setfield(pState->L, iCurrentClassMT, "__" name) #define luaT_setfunction(fn, name, ...) \ luaT_setclosure(pState, fn, 0, ## __VA_ARGS__); \ lua_setfield(pState->L, -2, name) /** * Add a named constant to the lua interface. * @param name (string literal) Name of the constant. * @param value (tested with int) Value of the constant. */ #define luaT_setconstant(name, value) \ luaT_push(pState->L, value); \ lua_setfield(pState->L, -2, name) #endif CorsixTH-0.63/CorsixTH/Src/th_lua_lfs_ext.cpp000066400000000000000000000057471347163623700211340ustar00rootroot00000000000000/* Copyright (c) 2010 Peter "Corsix" Cawley Copyright (c) 2014 Stephen E. Baker 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. */ #include "th_lua_internal.h" #include "config.h" #ifdef CORSIX_TH_USE_WIN32_SDK #include #endif class lfs_ext {}; static int l_lfs_ext_new(lua_State *L) { luaT_stdnew(L, luaT_environindex, true); return 1; } #ifdef _WIN32 #ifdef CORSIX_TH_USE_WIN32_SDK static int l_volume_list(lua_State *L) { /* Windows, using the Win32 API. */ DWORD iDriveMask = GetLogicalDrives(); int iNDrives = 0; char cDrive; lua_settop(L, 0); lua_newtable(L); for (cDrive = 'A'; cDrive <= 'Z'; ++cDrive) { if (iDriveMask & (1 << (cDrive - 'A'))) { char sName[4] = { cDrive, ':', '\\', 0 }; if (GetDriveTypeA(sName) > DRIVE_NO_ROOT_DIR) { lua_pushlstring(L, sName, 2); lua_rawseti(L, 1, ++iNDrives); } } } return 1; } #else static int l_volume_list(lua_State *L) { /* Windows, without the Win32 API. */ int iNDrives = 0; char cDrive; lua_settop(L, 0); lua_newtable(L); lua_getfield(L, luaT_upvalueindex(1), "attributes"); for (cDrive = 'A'; cDrive <= 'Z'; ++cDrive) { lua_pushvalue(L, 2); lua_pushfstring(L, "%c:\\", cDrive); lua_pushliteral(L, "mode"); lua_call(L, 2, 1); if (lua_toboolean(L, 3) != 0) { lua_pushfstring(L, "%c:", cDrive); lua_rawseti(L, 1, ++iNDrives); } lua_pop(L, 1); } return 1; } #endif #else static int l_volume_list(lua_State *L) { /* Non-Windows systems. Assume that / is the root of the filesystem. */ lua_settop(L, 0); lua_newtable(L); lua_pushliteral(L, "/"); lua_rawseti(L, 1, 1); return 1; } #endif void lua_register_lfs_ext(const lua_register_state *pState) { luaT_class(lfs_ext, l_lfs_ext_new, "lfsExt", lua_metatable::lfs_ext); luaT_setfunction(l_volume_list, "volumes"); luaT_endclass(); } CorsixTH-0.63/CorsixTH/Src/th_lua_map.cpp000066400000000000000000001077651347163623700202500ustar00rootroot00000000000000/* Copyright (c) 2010 Peter "Corsix" Cawley 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. */ #include "th_lua_internal.h" #include "th_map.h" #include "th_pathfind.h" #include #include #include static const int player_max = 4; static int l_map_new(lua_State *L) { luaT_stdnew(L, luaT_environindex, true); return 1; } static int l_map_set_sheet(lua_State *L) { level_map* pMap = luaT_testuserdata(L); sprite_sheet* pSheet = luaT_testuserdata(L, 2); lua_settop(L, 2); pMap->set_block_sheet(pSheet); luaT_setenvfield(L, 1, "sprites"); return 1; } static int l_map_persist(lua_State *L) { level_map* pMap = luaT_testuserdata(L); lua_settop(L, 2); lua_insert(L, 1); pMap->persist((lua_persist_writer*)lua_touserdata(L, 1)); return 0; } static int l_map_depersist(lua_State *L) { level_map* pMap = luaT_testuserdata(L); lua_settop(L, 2); lua_insert(L, 1); lua_persist_reader* pReader = (lua_persist_reader*)lua_touserdata(L, 1); pMap->depersist(pReader); luaT_getenvfield(L, 2, "sprites"); pMap->set_block_sheet((sprite_sheet*)lua_touserdata(L, -1)); lua_pop(L, 1); return 0; } static void l_map_load_obj_cb(void *pL, int iX, int iY, object_type eTHOB, uint8_t iFlags) { lua_State *L = reinterpret_cast(pL); lua_createtable(L, 4, 0); lua_pushinteger(L, 1 + (lua_Integer)iX); lua_rawseti(L, -2, 1); lua_pushinteger(L, 1 + (lua_Integer)iY); lua_rawseti(L, -2, 2); lua_pushinteger(L, (lua_Integer)eTHOB); lua_rawseti(L, -2, 3); lua_pushinteger(L, (lua_Integer)iFlags); lua_rawseti(L, -2, 4); lua_rawseti(L, 3, static_cast(lua_objlen(L, 3)) + 1); } static int l_map_load(lua_State *L) { level_map* pMap = luaT_testuserdata(L); size_t iDataLen; const uint8_t* pData = luaT_checkfile(L, 2, &iDataLen); lua_settop(L, 2); lua_newtable(L); if(pMap->load_from_th_file(pData, iDataLen, l_map_load_obj_cb, (void*)L)) lua_pushboolean(L, 1); else lua_pushboolean(L, 0); lua_insert(L, -2); return 2; } static int l_map_loadblank(lua_State *L) { level_map* pMap = luaT_testuserdata(L); if(pMap->load_blank()) lua_pushboolean(L, 1); else lua_pushboolean(L, 0); lua_newtable(L); return 2; } static int l_map_save(lua_State *L) { level_map* pMap = luaT_testuserdata(L); std::string filename(luaL_checkstring(L, 2)); pMap->save(filename); return 0; } static animation* l_map_updateblueprint_getnextanim(lua_State *L, int& iIndex) { animation *pAnim; lua_rawgeti(L, 11, iIndex); if(lua_type(L, -1) == LUA_TNIL) { lua_pop(L, 1); pAnim = luaT_new(L, animation); lua_pushvalue(L, luaT_upvalueindex(2)); lua_setmetatable(L, -2); lua_createtable(L, 0, 2); lua_pushvalue(L, 1); lua_setfield(L, -2, "map"); lua_pushvalue(L, 12); lua_setfield(L, -2, "animator"); lua_setfenv(L, -2); lua_rawseti(L, 11, iIndex); } else { pAnim = luaT_testuserdata(L, -1, luaT_upvalueindex(2)); lua_pop(L, 1); } ++iIndex; return pAnim; } static uint16_t l_check_temp(lua_State *L, int iArg) { lua_Number n = luaL_checknumber(L, iArg); if(n < static_cast(0) || static_cast(1) < n) luaL_argerror(L, iArg, "temperature (number in [0,1])"); return static_cast(n * static_cast(65535)); } static int l_map_settemperaturedisplay(lua_State *L) { level_map* pMap = luaT_testuserdata(L); lua_Integer iTD = luaL_checkinteger(L, 2); temperature_theme temperatureDisplay; switch(iTD) { case 1: temperatureDisplay = temperature_theme::red; break; case 2: temperatureDisplay = temperature_theme::multi_colour; break; case 3: temperatureDisplay = temperature_theme::yellow_red; break; default: return luaL_argerror(L, 2, "TemperatureDisplay index out of bounds"); } pMap->set_temperature_display(temperatureDisplay); return 1; } static int l_map_updatetemperature(lua_State *L) { level_map* pMap = luaT_testuserdata(L); uint16_t iAir = l_check_temp(L, 2); uint16_t iRadiator = l_check_temp(L, 3); pMap->update_temperatures(iAir, iRadiator); lua_settop(L, 1); return 1; } static int l_map_gettemperature(lua_State *L) { level_map* pMap = luaT_testuserdata(L); int iX = static_cast(luaL_checkinteger(L, 2)) - 1; int iY = static_cast(luaL_checkinteger(L, 3)) - 1; const map_tile* pNode = pMap->get_tile(iX, iY); uint16_t iTemp = pMap->get_tile_temperature(pNode); lua_pushnumber(L, static_cast(iTemp) / static_cast(65535)); return 1; } /** * Is the tile position valid for a new room? * @param entire_invalid Entire blueprint is invalid (eg wrong position or too small). * @param pNode Tile to examine. * @param pMap The world map. * @param player_id The player to check for. * @return Whether the tile position is valid for a new room. */ static inline bool is_valid( bool entire_invalid, const map_tile *pNode, const level_map* pMap, int player_id) { return !entire_invalid && !pNode->flags.room && pNode->flags.buildable && (player_id == 0 || pMap->get_tile_owner(pNode) == player_id); } static int l_map_updateblueprint(lua_State *L) { // NB: This function can be implemented in Lua, but is implemented in C for // efficiency. const unsigned short iFloorTileGood = 24 + (thdf_alpha_50 << 8); const unsigned short iFloorTileGoodCenter = 37 + (thdf_alpha_50 << 8); const unsigned short iFloorTileBad = 67 + (thdf_alpha_50 << 8); const unsigned int iWallAnimTopCorner = 124; const unsigned int iWallAnim = 120; level_map* pMap = luaT_testuserdata(L); int iOldX = static_cast(luaL_checkinteger(L, 2)) - 1; int iOldY = static_cast(luaL_checkinteger(L, 3)) - 1; int iOldW = static_cast(luaL_checkinteger(L, 4)); int iOldH = static_cast(luaL_checkinteger(L, 5)); int iNewX = static_cast(luaL_checkinteger(L, 6)) - 1; int iNewY = static_cast(luaL_checkinteger(L, 7)) - 1; int iNewW = static_cast(luaL_checkinteger(L, 8)); int iNewH = static_cast(luaL_checkinteger(L, 9)); int player_id = static_cast(luaL_checkinteger(L, 10)); luaL_checktype(L, 11, LUA_TTABLE); // Animation list animation_manager* pAnims = luaT_testuserdata(L, 12, luaT_upvalueindex(1)); bool entire_invalid = lua_toboolean(L, 13) != 0; bool valid = !entire_invalid; if(iOldX < 0 || iOldY < 0 || (iOldX + iOldW) > pMap->get_width() || (iOldY + iOldH) > pMap->get_height()) luaL_argerror(L, 2, "Old rectangle is out of bounds"); if(iNewX < 0 || iNewY < 0 || (iNewX + iNewW) >= pMap->get_width() || (iNewY + iNewH) >= pMap->get_height()) luaL_argerror(L, 6, "New rectangle is out of bounds"); // Clear blueprint flag from previous selected floor tiles (copying it to the passable flag). for(int iY = iOldY; iY < iOldY + iOldH; ++iY) { for(int iX = iOldX; iX < iOldX + iOldW; ++iX) { map_tile *pNode = pMap->get_tile_unchecked(iX, iY); pNode->iBlock[3] = 0; pNode->flags.passable |= pNode->flags.passable_if_not_for_blueprint; pNode->flags.passable_if_not_for_blueprint = false; } } // Add blueprint flag to new floor tiles. for(int iY = iNewY; iY < iNewY + iNewH; ++iY) { for(int iX = iNewX; iX < iNewX + iNewW; ++iX) { map_tile *pNode = pMap->get_tile_unchecked(iX, iY); if(is_valid(entire_invalid, pNode, pMap, player_id)) pNode->iBlock[3] = iFloorTileGood; else { pNode->iBlock[3] = iFloorTileBad; valid = false; } pNode->flags.passable_if_not_for_blueprint = pNode->flags.passable; } } // Set center floor tiles if(iNewW >= 2 && iNewH >= 2) { int iCenterX = iNewX + (iNewW - 2) / 2; int iCenterY = iNewY + (iNewH - 2) / 2; map_tile *pNode = pMap->get_tile_unchecked(iCenterX, iCenterY); if(pNode->iBlock[3] == iFloorTileGood) pNode->iBlock[3] = iFloorTileGoodCenter + 2; pNode = pMap->get_tile_unchecked(iCenterX + 1, iCenterY); if(pNode->iBlock[3] == iFloorTileGood) pNode->iBlock[3] = iFloorTileGoodCenter + 1; pNode = pMap->get_tile_unchecked(iCenterX, iCenterY + 1); if(pNode->iBlock[3] == iFloorTileGood) pNode->iBlock[3] = iFloorTileGoodCenter + 0; pNode = pMap->get_tile_unchecked(iCenterX + 1, iCenterY + 1); if(pNode->iBlock[3] == iFloorTileGood) pNode->iBlock[3] = iFloorTileGoodCenter + 3; } // Set wall animations int iNextAnim = 1; animation *pAnim = l_map_updateblueprint_getnextanim(L, iNextAnim); map_tile *pNode = pMap->get_tile_unchecked(iNewX, iNewY); pAnim->set_animation(pAnims, iWallAnimTopCorner); pAnim->set_flags(thdf_list_bottom | (is_valid(entire_invalid, pNode, pMap, player_id) ? 0 : thdf_alt_palette)); pAnim->attach_to_tile(pNode, 0); for(int iX = iNewX; iX < iNewX + iNewW; ++iX) { if(iX != iNewX) { pAnim = l_map_updateblueprint_getnextanim(L, iNextAnim); pNode = pMap->get_tile_unchecked(iX, iNewY); pAnim->set_animation(pAnims, iWallAnim); pAnim->set_flags(thdf_list_bottom | (is_valid(entire_invalid, pNode, pMap, player_id) ? 0 : thdf_alt_palette)); pAnim->attach_to_tile(pNode, 0); pAnim->set_position(0, 0); } pAnim = l_map_updateblueprint_getnextanim(L, iNextAnim); pNode = pMap->get_tile_unchecked(iX, iNewY + iNewH - 1); pAnim->set_animation(pAnims, iWallAnim); pAnim->set_flags(thdf_list_bottom | (is_valid(entire_invalid, pNode, pMap, player_id) ? 0 : thdf_alt_palette)); pNode = pMap->get_tile_unchecked(iX, iNewY + iNewH); pAnim->attach_to_tile(pNode, 0); pAnim->set_position(0, -1); } for(int iY = iNewY; iY < iNewY + iNewH; ++iY) { if(iY != iNewY) { pAnim = l_map_updateblueprint_getnextanim(L, iNextAnim); pNode = pMap->get_tile_unchecked(iNewX, iY); pAnim->set_animation(pAnims, iWallAnim); pAnim->set_flags(thdf_list_bottom | thdf_flip_horizontal | (is_valid(entire_invalid, pNode, pMap, player_id) ? 0 : thdf_alt_palette)); pAnim->attach_to_tile(pNode, 0); pAnim->set_position(2, 0); } pAnim = l_map_updateblueprint_getnextanim(L, iNextAnim); pNode = pMap->get_tile_unchecked(iNewX + iNewW - 1, iY); pAnim->set_animation(pAnims, iWallAnim); pAnim->set_flags(thdf_list_bottom | thdf_flip_horizontal | (is_valid(entire_invalid, pNode, pMap, player_id) ? 0 : thdf_alt_palette)); pNode = pMap->get_tile_unchecked(iNewX + iNewW, iY); pAnim->attach_to_tile(pNode, 0); pAnim->set_position(2, -1); } // Clear away extra animations int iAnimCount = (int)lua_objlen(L, 11); if(iAnimCount >= iNextAnim) { for(int i = iNextAnim; i <= iAnimCount; ++i) { pAnim = l_map_updateblueprint_getnextanim(L, iNextAnim); pAnim->remove_from_tile(); lua_pushnil(L); lua_rawseti(L, 11, i); } } lua_pushboolean(L, valid ? 1 : 0); return 1; } static int l_map_getsize(lua_State *L) { level_map* pMap = luaT_testuserdata(L); lua_pushinteger(L, pMap->get_width()); lua_pushinteger(L, pMap->get_height()); return 2; } static int l_map_get_player_count(lua_State *L) { level_map* pMap = luaT_testuserdata(L); lua_pushinteger(L, pMap->get_player_count()); return 1; } static int l_map_set_player_count(lua_State *L) { level_map* pMap = luaT_testuserdata(L); int count = static_cast(luaL_checkinteger(L, 2)); try { pMap->set_player_count(count); } catch (std::out_of_range) { return luaL_error(L, "Player count out of range %d", count); } return 0; } static int l_map_get_player_camera(lua_State *L) { level_map* pMap = luaT_testuserdata(L); int iX, iY; int iPlayer = static_cast(luaL_optinteger(L, 2, 1)); bool bGood = pMap->get_player_camera_tile(iPlayer - 1, &iX, &iY); if(!bGood) return luaL_error(L, "Player index out of range: %d", iPlayer); lua_pushinteger(L, iX + 1); lua_pushinteger(L, iY + 1); return 2; } static int l_map_set_player_camera(lua_State *L) { level_map* pMap = luaT_testuserdata(L); int iX = static_cast(luaL_checkinteger(L, 2) - 1); int iY = static_cast(luaL_checkinteger(L, 3) - 1); int iPlayer = static_cast(luaL_optinteger(L, 4, 1)); if (iPlayer < 1 || iPlayer > player_max) return luaL_error(L, "Player index out of range: %i", iPlayer); pMap->set_player_camera_tile(iPlayer - 1, iX, iY); return 0; } static int l_map_get_player_heliport(lua_State *L) { level_map* pMap = luaT_testuserdata(L); int iX, iY; int iPlayer = static_cast(luaL_optinteger(L, 2, 1)); bool bGood = pMap->get_player_heliport_tile(iPlayer - 1, &iX, &iY); if(!bGood) return luaL_error(L, "Player index out of range: %d", iPlayer); lua_pushinteger(L, iX + 1); lua_pushinteger(L, iY + 1); return 2; } static int l_map_set_player_heliport(lua_State *L) { level_map* pMap = luaT_testuserdata(L); int iX = static_cast(luaL_checkinteger(L, 2) - 1); int iY = static_cast(luaL_checkinteger(L, 3) - 1); int iPlayer = static_cast(luaL_optinteger(L, 4, 1)); if (iPlayer < 1 || iPlayer > player_max) return luaL_error(L, "Player index out of range: %i", iPlayer); pMap->set_player_heliport_tile(iPlayer - 1, iX, iY); return 0; } static int l_map_getcell(lua_State *L) { level_map* pMap = luaT_testuserdata(L); int iX = static_cast(luaL_checkinteger(L, 2) - 1); // Lua arrays start at 1 - pretend int iY = static_cast(luaL_checkinteger(L, 3) - 1); // the map does too. map_tile* pNode = pMap->get_tile(iX, iY); if(pNode == nullptr) { return luaL_argerror(L, 2, lua_pushfstring(L, "Map co-ordinates out " "of bounds (%d, %d)", iX + 1, iY + 1)); } if(lua_isnoneornil(L, 4)) { lua_pushinteger(L, pNode->iBlock[0]); lua_pushinteger(L, pNode->iBlock[1]); lua_pushinteger(L, pNode->iBlock[2]); lua_pushinteger(L, pNode->iBlock[3]); return 4; } else { lua_Integer iLayer = luaL_checkinteger(L, 4) - 1; if(iLayer < 0 || iLayer >= 4) return luaL_argerror(L, 4, "Layer index is out of bounds (1-4)"); lua_pushinteger(L, pNode->iBlock[iLayer]); return 1; } } /** Recognized tile flags by Lua. */ static const std::map lua_tile_flag_map = { {"passable", map_tile_flags::key::passable_mask}, {"hospital", map_tile_flags::key::hospital_mask}, {"buildable", map_tile_flags::key::buildable_mask}, {"room", map_tile_flags::key::room_mask}, {"doorWest", map_tile_flags::key::door_west_mask}, {"doorNorth", map_tile_flags::key::door_north_mask}, {"tallWest", map_tile_flags::key::tall_west_mask}, {"tallNorth", map_tile_flags::key::tall_north_mask}, {"travelNorth", map_tile_flags::key::can_travel_n_mask}, {"travelEast", map_tile_flags::key::can_travel_e_mask}, {"travelSouth", map_tile_flags::key::can_travel_s_mask}, {"travelWest", map_tile_flags::key::can_travel_w_mask}, {"doNotIdle", map_tile_flags::key::do_not_idle_mask}, {"buildableNorth", map_tile_flags::key::buildable_n_mask}, {"buildableEast", map_tile_flags::key::buildable_e_mask}, {"buildableSouth", map_tile_flags::key::buildable_s_mask}, {"buildableWest", map_tile_flags::key::buildable_w_mask}, }; /** * Add the current value of the \a flag in the \a tile to the output. * @param L Lua context. * @param tile Tile to inspect. * @param flag Flag of the tile to check (and report). * @param name Name of the flag in Lua code. */ static inline void add_cellflag(lua_State *L, const map_tile *tile, map_tile_flags::key flag, const std::string &name) { lua_pushlstring(L, name.c_str(), name.size()); lua_pushboolean(L, tile->flags[flag] ? 1 : 0); lua_settable(L, 4); } /** * Add the current value of a tile field to the output. * @param L Lua context. * @param value Value of the tile field to add. * @param name Name of the field in Lua code. */ static inline void add_cellint(lua_State *L, int value, const std::string &name) { lua_pushlstring(L, name.c_str(), name.size()); lua_pushinteger(L, value); lua_settable(L, 4); } /** * Get the value of all cell flags at a position. * @param L Lua context. * @return Number of results of the call. */ static int l_map_getcellflags(lua_State *L) { level_map* pMap = luaT_testuserdata(L); int iX = static_cast(luaL_checkinteger(L, 2) - 1); // Lua arrays start at 1 - pretend int iY = static_cast(luaL_checkinteger(L, 3) - 1); // the map does too. map_tile* pNode = pMap->get_tile(iX, iY); if(pNode == nullptr) return luaL_argerror(L, 2, "Map co-ordinates out of bounds"); if(lua_type(L, 4) != LUA_TTABLE) { lua_settop(L, 3); lua_createtable(L, 0, 1); } else { lua_settop(L, 4); } // Fill Lua table with the flags and numbers of the tile. for (auto val : lua_tile_flag_map) { add_cellflag(L, pNode, val.second, val.first); } add_cellint(L, pNode->iRoomId, "roomId"); add_cellint(L, pNode->iParcelId, "parcelId"); add_cellint(L, pMap->get_tile_owner(pNode), "owner"); add_cellint(L, static_cast(pNode->objects.empty() ? object_type::no_object : pNode->objects.front()), "thob"); return 1; } /* because all the thobs are not retrieved when the map is loaded in c lua objects use the afterLoad function to be registered after a load, if the object list would not be cleared it would result in duplication of thobs in the object list. */ static int l_map_erase_thobs(lua_State *L) { level_map* pMap = luaT_testuserdata(L); int iX = static_cast(luaL_checkinteger(L, 2) - 1); // Lua arrays start at 1 - pretend int iY = static_cast(luaL_checkinteger(L, 3) - 1); // the map does too. map_tile* pNode = pMap->get_tile(iX, iY); if(pNode == nullptr) return luaL_argerror(L, 2, "Map co-ordinates out of bounds"); pNode->objects.clear(); return 1; } static int l_map_remove_cell_thob(lua_State *L) { level_map* pMap = luaT_testuserdata(L); int iX = static_cast(luaL_checkinteger(L, 2) - 1); // Lua arrays start at 1 - pretend int iY = static_cast(luaL_checkinteger(L, 3) - 1); // the map does too. map_tile* pNode = pMap->get_tile(iX, iY); if(pNode == nullptr) return luaL_argerror(L, 2, "Map co-ordinates out of bounds"); auto thob = static_cast(luaL_checkinteger(L, 4)); for(auto iter = pNode->objects.begin(); iter != pNode->objects.end(); iter++) { if(*iter == thob) { pNode->objects.erase(iter); break; } } return 1; } static int l_map_setcellflags(lua_State *L) { level_map* pMap = luaT_testuserdata(L); int iX = static_cast(luaL_checkinteger(L, 2) - 1); // Lua arrays start at 1 - pretend int iY = static_cast(luaL_checkinteger(L, 3) - 1); // the map does too. map_tile* pNode = pMap->get_tile(iX, iY); if(pNode == nullptr) return luaL_argerror(L, 2, "Map co-ordinates out of bounds"); luaL_checktype(L, 4, LUA_TTABLE); lua_settop(L, 4); lua_pushnil(L); while(lua_next(L, 4)) { if(lua_type(L, 5) == LUA_TSTRING) { const char *field = lua_tostring(L, 5); auto iter = lua_tile_flag_map.find(field); if(iter != lua_tile_flag_map.end()) { if (lua_toboolean(L, 6) == 0) pNode->flags[(*iter).second] = false; else pNode->flags[(*iter).second] = true; } else if (std::strcmp(field, "thob") == 0) { auto thob = static_cast(lua_tointeger(L, 6)); pNode->objects.push_back(thob); } else if(std::strcmp(field, "parcelId") == 0) { pNode->iParcelId = static_cast(lua_tointeger(L, 6)); } else if(std::strcmp(field, "roomId") == 0) { pNode->iRoomId = static_cast(lua_tointeger(L,6)); } else { luaL_error(L, "Invalid flag \'%s\'", field); } } lua_settop(L, 5); } return 0; } static int l_map_setwallflags(lua_State *L) { level_map* pMap = luaT_testuserdata(L); pMap->set_all_wall_draw_flags((uint8_t)luaL_checkinteger(L, 2)); lua_settop(L, 1); return 1; } static int l_map_setcell(lua_State *L) { level_map* pMap = luaT_testuserdata(L); int iX = static_cast(luaL_checkinteger(L, 2) - 1); // Lua arrays start at 1 - pretend int iY = static_cast(luaL_checkinteger(L, 3) - 1); // the map does too. map_tile* pNode = pMap->get_tile(iX, iY); if(pNode == nullptr) return luaL_argerror(L, 2, "Map co-ordinates out of bounds"); if(lua_gettop(L) >= 7) { pNode->iBlock[0] = (uint16_t)luaL_checkinteger(L, 4); pNode->iBlock[1] = (uint16_t)luaL_checkinteger(L, 5); pNode->iBlock[2] = (uint16_t)luaL_checkinteger(L, 6); pNode->iBlock[3] = (uint16_t)luaL_checkinteger(L, 7); } else { lua_Integer iLayer = luaL_checkinteger(L, 4) - 1; if(iLayer < 0 || iLayer >= 4) return luaL_argerror(L, 4, "Layer index is out of bounds (1-4)"); uint16_t iBlock = static_cast(luaL_checkinteger(L, 5)); pNode->iBlock[iLayer] = iBlock; } lua_settop(L, 1); return 1; } static int l_map_updateshadows(lua_State *L) { level_map* pMap = luaT_testuserdata(L); pMap->update_shadows(); lua_settop(L, 1); return 1; } static int l_map_updatepathfinding(lua_State *L) { level_map* pMap = luaT_testuserdata(L); pMap->update_pathfinding(); lua_settop(L, 1); return 1; } static int l_map_mark_room(lua_State *L) { level_map* pMap = luaT_testuserdata(L); int iX_ = static_cast(luaL_checkinteger(L, 2) - 1); int iY_ = static_cast(luaL_checkinteger(L, 3) - 1); int iW = static_cast(luaL_checkinteger(L, 4)); int iH = static_cast(luaL_checkinteger(L, 5)); uint16_t iTile = static_cast(luaL_checkinteger(L, 6)); uint16_t iRoomId = static_cast(luaL_optinteger(L, 7, 0)); if(iX_ < 0 || iY_ < 0 || (iX_ + iW) > pMap->get_width() || (iY_ + iH) > pMap->get_height()) luaL_argerror(L, 2, "Rectangle is out of bounds"); for(int iY = iY_; iY < iY_ + iH; ++iY) { for(int iX = iX_; iX < iX_ + iW; ++iX) { map_tile *pNode = pMap->get_tile_unchecked(iX, iY); pNode->iBlock[0] = iTile; pNode->iBlock[3] = 0; pNode->flags.room = true; pNode->flags.passable |= pNode->flags.passable_if_not_for_blueprint; pNode->flags.passable_if_not_for_blueprint = false; pNode->iRoomId = iRoomId; } } pMap->update_pathfinding(); pMap->update_shadows(); lua_settop(L, 1); return 1; } static int l_map_unmark_room(lua_State *L) { level_map* pMap = luaT_testuserdata(L); int iX_ = static_cast(luaL_checkinteger(L, 2) - 1); int iY_ = static_cast(luaL_checkinteger(L, 3) - 1); int iW = static_cast(luaL_checkinteger(L, 4)); int iH = static_cast(luaL_checkinteger(L, 5)); if(iX_ < 0 || iY_ < 0 || (iX_ + iW) > pMap->get_width() || (iY_ + iH) > pMap->get_height()) luaL_argerror(L, 2, "Rectangle is out of bounds"); for(int iY = iY_; iY < iY_ + iH; ++iY) { for(int iX = iX_; iX < iX_ + iW; ++iX) { map_tile *pNode = pMap->get_tile_unchecked(iX, iY); pNode->iBlock[0] = pMap->get_original_tile_unchecked(iX, iY)->iBlock[0]; pNode->flags.room = false; pNode->iRoomId = 0; } } pMap->update_pathfinding(); pMap->update_shadows(); lua_settop(L, 1); return 1; } static int l_map_draw(lua_State *L) { level_map* pMap = luaT_testuserdata(L); render_target* pCanvas = luaT_testuserdata(L, 2); pMap->draw(pCanvas, static_cast(luaL_checkinteger(L, 3)), static_cast(luaL_checkinteger(L, 4)), static_cast(luaL_checkinteger(L, 5)), static_cast(luaL_checkinteger(L, 6)), static_cast(luaL_optinteger(L, 7, 0)), static_cast(luaL_optinteger(L, 8, 0))); lua_settop(L, 1); return 1; } static int l_map_hittest(lua_State *L) { level_map* pMap = luaT_testuserdata(L); drawable* pObject = pMap->hit_test(static_cast(luaL_checkinteger(L, 2)), static_cast(luaL_checkinteger(L, 3))); if(pObject == nullptr) return 0; lua_rawgeti(L, luaT_upvalueindex(1), 1); lua_pushlightuserdata(L, pObject); lua_gettable(L, -2); return 1; } static int l_map_get_parcel_tilecount(lua_State *L) { level_map* pMap = luaT_testuserdata(L); int iParcel = static_cast(luaL_checkinteger(L, 2)); lua_Integer iCount = pMap->get_parcel_tile_count(iParcel); lua_pushinteger(L, iCount); return 1; } static int l_map_get_parcel_count(lua_State *L) { level_map* pMap = luaT_testuserdata(L); lua_pushinteger(L, pMap->get_parcel_count()); return 1; } static int l_map_set_parcel_owner(lua_State *L) { level_map* pMap = luaT_testuserdata(L); int parcelId = static_cast(luaL_checkinteger(L, 2)); int player = static_cast(luaL_checkinteger(L, 3)); if(lua_type(L, 4) != LUA_TTABLE) { lua_settop(L, 3); lua_newtable(L); } else { lua_settop(L, 4); } std::vector> vSplitTiles = pMap->set_parcel_owner(parcelId, player); for (std::vector>::size_type i = 0; i != vSplitTiles.size(); i++) { lua_pushinteger(L, i + 1); lua_createtable(L, 0, 2); lua_pushinteger(L, 1); lua_pushinteger(L, vSplitTiles[i].first + 1); lua_settable(L, 6); lua_pushinteger(L, 2); lua_pushinteger(L, vSplitTiles[i].second + 1); lua_settable(L, 6); lua_settable(L, 4); } return 1; } static int l_map_get_parcel_owner(lua_State *L) { level_map* pMap = luaT_testuserdata(L); lua_pushinteger(L, pMap->get_parcel_owner(static_cast(luaL_checkinteger(L, 2)))); return 1; } static int l_map_is_parcel_purchasable(lua_State *L) { level_map* pMap = luaT_testuserdata(L); lua_pushboolean(L, pMap->is_parcel_purchasable(static_cast(luaL_checkinteger(L, 2)), static_cast(luaL_checkinteger(L, 3))) ? 1 : 0); return 1; } /* Compute the fraction of corridor tiles with litter, of the parcels owned by the given player. */ static int l_map_get_litter_fraction(lua_State *L) { level_map* pMap = luaT_testuserdata(L); int owner = static_cast(luaL_checkinteger(L, 2)); if (owner == 0) { lua_pushnumber(L, 0.0); // Outside has no litter. return 1; } double tile_count = 0; double litter_count = 0; for (int x = 0; x < pMap->get_width(); x++) { for (int y = 0; y < pMap->get_height(); y++) { const map_tile* pNode = pMap->get_tile_unchecked(x, y); if (pNode->iParcelId == 0 || owner != pMap->get_parcel_owner(pNode->iParcelId) || pNode->iRoomId != 0) { continue; } tile_count++; for(auto iter = pNode->objects.begin(); iter != pNode->objects.end(); iter++) { if(*iter == object_type::litter) { litter_count++; break; } } } } double fraction = (tile_count == 0) ? 0.0 : litter_count / tile_count; lua_pushnumber(L, fraction); return 1; } static int l_path_new(lua_State *L) { luaT_stdnew(L, luaT_environindex, true); return 1; } static int l_path_set_map(lua_State *L) { pathfinder* pPathfinder = luaT_testuserdata(L); level_map* pMap = luaT_testuserdata(L, 2); lua_settop(L, 2); pPathfinder->set_default_map(pMap); luaT_setenvfield(L, 1, "map"); return 1; } static int l_path_persist(lua_State *L) { pathfinder* pPathfinder = luaT_testuserdata(L); lua_settop(L, 2); lua_insert(L, 1); pPathfinder->persist((lua_persist_writer*)lua_touserdata(L, 1)); return 0; } static int l_path_depersist(lua_State *L) { pathfinder* pPathfinder = luaT_testuserdata(L); lua_settop(L, 2); lua_insert(L, 1); lua_persist_reader* pReader = (lua_persist_reader*)lua_touserdata(L, 1); pPathfinder->depersist(pReader); luaT_getenvfield(L, 2, "map"); pPathfinder->set_default_map(reinterpret_cast(lua_touserdata(L, -1))); return 0; } static int l_path_is_reachable_from_hospital(lua_State *L) { pathfinder* pPathfinder = luaT_testuserdata(L); if(pPathfinder->find_path_to_hospital(nullptr, static_cast(luaL_checkinteger(L, 2) - 1), static_cast(luaL_checkinteger(L, 3) - 1))) { lua_pushboolean(L, 1); int iX, iY; pPathfinder->get_path_end(&iX, &iY); lua_pushinteger(L, iX + 1); lua_pushinteger(L, iY + 1); return 3; } else { lua_pushboolean(L, 0); return 1; } } static int l_path_distance(lua_State *L) { pathfinder* pPathfinder = luaT_testuserdata(L); if(pPathfinder->find_path(nullptr, static_cast(luaL_checkinteger(L, 2)) - 1, static_cast(luaL_checkinteger(L, 3)) - 1, static_cast(luaL_checkinteger(L, 4)) - 1, static_cast(luaL_checkinteger(L, 5)) - 1)) { lua_pushinteger(L, pPathfinder->get_path_length()); } else { lua_pushboolean(L, 0); } return 1; } static int l_path_path(lua_State *L) { pathfinder* pPathfinder = luaT_testuserdata(L); pPathfinder->find_path(nullptr, static_cast(luaL_checkinteger(L, 2)) - 1, static_cast(luaL_checkinteger(L, 3)) - 1, static_cast(luaL_checkinteger(L, 4)) - 1, static_cast(luaL_checkinteger(L, 5)) - 1); pPathfinder->push_result(L); return 2; } static int l_path_idle(lua_State *L) { pathfinder* pPathfinder = luaT_testuserdata(L); if(!pPathfinder->find_idle_tile(nullptr, static_cast(luaL_checkinteger(L, 2)) - 1, static_cast(luaL_checkinteger(L, 3)) - 1, static_cast(luaL_optinteger(L, 4, 0)))) { return 0; } int iX, iY; pPathfinder->get_path_end(&iX, &iY); lua_pushinteger(L, iX + 1); lua_pushinteger(L, iY + 1); return 2; } static int l_path_visit(lua_State *L) { pathfinder* pPathfinder = luaT_testuserdata(L); luaL_checktype(L, 6, LUA_TFUNCTION); lua_pushboolean(L, pPathfinder->visit_objects(nullptr, static_cast(luaL_checkinteger(L, 2)) - 1, static_cast(luaL_checkinteger(L, 3)) - 1, static_cast(luaL_checkinteger(L, 4)), static_cast(luaL_checkinteger(L, 5)), L, 6, luaL_checkinteger(L, 4) == 0 ? true : false) ? 1 : 0); return 1; } void lua_register_map(const lua_register_state *pState) { // Map luaT_class(level_map, l_map_new, "map", lua_metatable::map); luaT_setmetamethod(l_map_persist, "persist", lua_metatable::anim); luaT_setmetamethod(l_map_depersist, "depersist", lua_metatable::anim); luaT_setfunction(l_map_load, "load"); luaT_setfunction(l_map_loadblank, "loadBlank"); luaT_setfunction(l_map_save, "save"); luaT_setfunction(l_map_getsize, "size"); luaT_setfunction(l_map_get_player_count, "getPlayerCount"); luaT_setfunction(l_map_set_player_count, "setPlayerCount"); luaT_setfunction(l_map_get_player_camera, "getCameraTile"); luaT_setfunction(l_map_set_player_camera, "setCameraTile"); luaT_setfunction(l_map_get_player_heliport, "getHeliportTile"); luaT_setfunction(l_map_set_player_heliport, "setHeliportTile"); luaT_setfunction(l_map_getcell, "getCell"); luaT_setfunction(l_map_gettemperature, "getCellTemperature"); luaT_setfunction(l_map_getcellflags, "getCellFlags"); luaT_setfunction(l_map_setcellflags, "setCellFlags"); luaT_setfunction(l_map_setcell, "setCell"); luaT_setfunction(l_map_setwallflags, "setWallDrawFlags"); luaT_setfunction(l_map_settemperaturedisplay, "setTemperatureDisplay"); luaT_setfunction(l_map_updatetemperature, "updateTemperatures"); luaT_setfunction(l_map_updateblueprint, "updateRoomBlueprint", lua_metatable::anims, lua_metatable::anim); luaT_setfunction(l_map_updateshadows, "updateShadows"); luaT_setfunction(l_map_updatepathfinding, "updatePathfinding"); luaT_setfunction(l_map_mark_room, "markRoom"); luaT_setfunction(l_map_unmark_room, "unmarkRoom"); luaT_setfunction(l_map_set_sheet, "setSheet", lua_metatable::sheet); luaT_setfunction(l_map_draw, "draw", lua_metatable::surface); luaT_setfunction(l_map_hittest, "hitTestObjects", lua_metatable::anim); luaT_setfunction(l_map_get_parcel_tilecount, "getParcelTileCount"); luaT_setfunction(l_map_get_parcel_count, "getPlotCount"); luaT_setfunction(l_map_set_parcel_owner, "setPlotOwner"); luaT_setfunction(l_map_get_parcel_owner, "getPlotOwner"); luaT_setfunction(l_map_is_parcel_purchasable, "isParcelPurchasable"); luaT_setfunction(l_map_erase_thobs, "eraseObjectTypes"); luaT_setfunction(l_map_remove_cell_thob, "removeObjectType"); luaT_setfunction(l_map_get_litter_fraction, "getLitterFraction"); luaT_endclass(); // Pathfinder luaT_class(pathfinder, l_path_new, "pathfinder", lua_metatable::pathfinder); luaT_setmetamethod(l_path_persist, "persist"); luaT_setmetamethod(l_path_depersist, "depersist"); luaT_setfunction(l_path_distance, "findDistance"); luaT_setfunction(l_path_is_reachable_from_hospital, "isReachableFromHospital"); luaT_setfunction(l_path_path, "findPath"); luaT_setfunction(l_path_idle, "findIdleTile"); luaT_setfunction(l_path_visit, "findObject"); luaT_setfunction(l_path_set_map, "setMap", lua_metatable::map); luaT_endclass(); } CorsixTH-0.63/CorsixTH/Src/th_lua_movie.cpp000066400000000000000000000113721347163623700205760ustar00rootroot00000000000000/* Copyright (c) 2012 Stephen Baker 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. */ #include "th_lua_internal.h" #include "th_movie.h" #include "th_gfx.h" static int l_movie_new(lua_State *L) { luaT_stdnew(L, luaT_environindex, true); return 1; } static int l_movie_set_renderer(lua_State *L) { movie_player *pMovie = luaT_testuserdata(L); render_target *pRenderTarget = luaT_testuserdata(L, 2); pMovie->set_renderer(pRenderTarget->get_renderer()); return 0; } static int l_movie_enabled(lua_State *L) { movie_player *pMovie = luaT_testuserdata(L); lua_pushboolean(L, pMovie->movies_enabled()); return 1; } static int l_movie_load(lua_State *L) { bool loaded; const char* warning; movie_player *pMovie = luaT_testuserdata(L); const char* filepath = lua_tolstring(L, 2, nullptr); pMovie->clear_last_error(); loaded = pMovie->load(filepath); warning = pMovie->get_last_error(); lua_pushboolean(L, loaded); lua_pushstring(L, warning); return 2; } static int l_movie_unload(lua_State *L) { movie_player *pMovie = luaT_testuserdata(L); pMovie->unload(); return 0; } static int l_movie_play(lua_State *L) { const char* warning; movie_player *pMovie = luaT_testuserdata(L); pMovie->clear_last_error(); pMovie->play( static_cast(luaL_checkinteger(L, 2))); warning = pMovie->get_last_error(); lua_pushstring(L, warning); return 1; } static int l_movie_stop(lua_State *L) { movie_player *pVideo = luaT_testuserdata(L); pVideo->stop(); return 0; } static int l_movie_get_native_height(lua_State *L) { movie_player *pMovie = luaT_testuserdata(L); lua_pushinteger(L, pMovie->get_native_height()); return 1; } static int l_movie_get_native_width(lua_State *L) { movie_player *pMovie = luaT_testuserdata(L); lua_pushinteger(L, pMovie->get_native_width()); return 1; } static int l_movie_has_audio_track(lua_State *L) { movie_player *pMovie = luaT_testuserdata(L); lua_pushboolean(L, pMovie->has_audio_track()); return 1; } static int l_movie_refresh(lua_State *L) { movie_player *pMovie = luaT_testuserdata(L); pMovie->refresh(SDL_Rect{ static_cast(luaL_checkinteger(L, 2)), static_cast(luaL_checkinteger(L, 3)), static_cast(luaL_checkinteger(L, 4)), static_cast(luaL_checkinteger(L, 5)) }); return 0; } static int l_movie_allocate_picture_buffer(lua_State *L) { movie_player *pMovie = luaT_testuserdata(L); pMovie->allocate_picture_buffer(); return 0; } static int l_movie_deallocate_picture_buffer(lua_State *L) { movie_player *pMovie = luaT_testuserdata(L); pMovie->deallocate_picture_buffer(); return 0; } void lua_register_movie(const lua_register_state *pState) { luaT_class(movie_player, l_movie_new, "moviePlayer", lua_metatable::movie); luaT_setfunction(l_movie_set_renderer, "setRenderer", lua_metatable::surface); luaT_setfunction(l_movie_enabled, "getEnabled"); luaT_setfunction(l_movie_load, "load"); luaT_setfunction(l_movie_unload, "unload"); luaT_setfunction(l_movie_play, "play"); luaT_setfunction(l_movie_stop, "stop"); luaT_setfunction(l_movie_get_native_height, "getNativeHeight"); luaT_setfunction(l_movie_get_native_width, "getNativeWidth"); luaT_setfunction(l_movie_has_audio_track, "hasAudioTrack"); luaT_setfunction(l_movie_refresh, "refresh"); luaT_setfunction(l_movie_allocate_picture_buffer, "allocatePictureBuffer"); luaT_setfunction(l_movie_deallocate_picture_buffer, "deallocatePictureBuffer"); luaT_endclass(); } CorsixTH-0.63/CorsixTH/Src/th_lua_sound.cpp000066400000000000000000000247731347163623700206200ustar00rootroot00000000000000/* Copyright (c) 2010 Peter "Corsix" Cawley 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. */ #include "th_lua_internal.h" #include "th_sound.h" #include "th_lua.h" #include "lua_sdl.h" #include #include #include static int played_sound_callback_ids[1000]; static int played_sound_callback_index = 0; static std::map map_sound_timers; static int l_soundarc_new(lua_State *L) { luaT_stdnew(L, luaT_environindex, true); return 1; } static int l_soundarc_load(lua_State *L) { sound_archive* pArchive = luaT_testuserdata(L); size_t iDataLen; const uint8_t* pData = luaT_checkfile(L, 2, &iDataLen); if(pArchive->load_from_th_file(pData, iDataLen)) lua_pushboolean(L, 1); else lua_pushboolean(L, 0); return 1; } static int l_soundarc_count(lua_State *L) { sound_archive* pArchive = luaT_testuserdata(L); lua_pushnumber(L, (lua_Number)pArchive->get_number_of_sounds()); return 1; } /** * Perform case-insensitive string compare. * @param s1 First string to compare. * @param s2 Second string to compare. * @return Negative number when \a s1 should be before \a s2, zero if both * string are equal, else a positive number. */ static int ignorecase_cmp(const char *s1, const char *s2) { while(*s1 && *s2) { if (std::tolower(*s1) != std::tolower(*s2)) break; s1++; s2++; } return std::tolower(*s1) - std::tolower(*s2); } static size_t l_soundarc_checkidx(lua_State *L, int iArg, sound_archive* pArchive) { if(lua_isnumber(L, iArg)) { size_t iIndex = (size_t)lua_tonumber(L, iArg); if(iIndex >= pArchive->get_number_of_sounds()) { lua_pushnil(L); lua_pushfstring(L, "Sound index out of " "bounds (%f is not in range [0, %d])", lua_tonumber(L, iArg), static_cast(pArchive->get_number_of_sounds()) - 1); return pArchive->get_number_of_sounds(); } return iIndex; } const char* sName = luaL_checkstring(L, iArg); lua_getfenv(L, 1); lua_pushvalue(L, iArg); lua_rawget(L, -2); if(lua_type(L, -1) == LUA_TLIGHTUSERDATA) { size_t iIndex = (size_t)lua_topointer(L, -1); lua_pop(L, 2); return iIndex; } lua_pop(L, 2); size_t iCount = pArchive->get_number_of_sounds(); for(size_t i = 0; i < iCount; ++i) { if(ignorecase_cmp(sName, pArchive->get_sound_name(i)) == 0) { lua_getfenv(L, 1); lua_pushvalue(L, iArg); lua_pushlightuserdata(L, (void*)i); lua_settable(L, -3); lua_pop(L, 1); return i; } } lua_pushnil(L); lua_pushliteral(L, "File not found in sound archive: "); lua_pushvalue(L, iArg); lua_concat(L, 2); return pArchive->get_number_of_sounds(); } static int l_soundarc_sound_name(lua_State *L) { sound_archive* pArchive = luaT_testuserdata(L); size_t iIndex = l_soundarc_checkidx(L, 2, pArchive); if(iIndex == pArchive->get_number_of_sounds()) return 2; lua_pushstring(L, pArchive->get_sound_name(iIndex)); return 1; } static int l_soundarc_duration(lua_State *L) { sound_archive* pArchive = luaT_testuserdata(L); size_t iIndex = l_soundarc_checkidx(L, 2, pArchive); if(iIndex == pArchive->get_number_of_sounds()) return 2; size_t iDuration = pArchive->get_sound_duration(iIndex); lua_pushnumber(L, static_cast(iDuration) / static_cast(1000)); return 1; } static int l_soundarc_data(lua_State *L) { sound_archive* pArchive = luaT_testuserdata(L); size_t iIndex = l_soundarc_checkidx(L, 2, pArchive); if(iIndex == pArchive->get_number_of_sounds()) return 2; SDL_RWops *pRWops = pArchive->load_sound(iIndex); if(!pRWops) return 0; size_t iLength = SDL_RWseek(pRWops, 0, SEEK_END); SDL_RWseek(pRWops, 0, SEEK_SET); // There is a potential leak of pRWops if either of these Lua calls cause // a memory error, but it isn't very likely, and this a debugging function // anyway, so it isn't very important. void *pBuffer = lua_newuserdata(L, iLength); lua_pushlstring(L, (const char*)pBuffer, SDL_RWread(pRWops, pBuffer, 1, iLength)); SDL_RWclose(pRWops); return 1; } static int l_soundarc_sound_exists(lua_State *L) { sound_archive* pArchive = luaT_testuserdata(L); size_t iIndex = l_soundarc_checkidx(L, 2, pArchive); if(iIndex == pArchive->get_number_of_sounds()) lua_pushboolean(L, 0); else lua_pushboolean(L, 1); return 1; } static int l_soundfx_new(lua_State *L) { luaT_stdnew(L, luaT_environindex, true); return 1; } static int l_soundfx_set_archive(lua_State *L) { sound_player *pEffects = luaT_testuserdata(L); sound_archive *pArchive = luaT_testuserdata(L, 2); pEffects->populate_from(pArchive); lua_settop(L, 2); luaT_setenvfield(L, 1, "archive"); return 1; } static int l_soundfx_set_sound_volume(lua_State *L) { sound_player *pEffects = luaT_testuserdata(L); pEffects->set_sound_effect_volume(luaL_checknumber(L, 2)); return 1; } static int l_soundfx_set_sound_effects_on(lua_State *L) { sound_player *pEffects = luaT_testuserdata(L); pEffects->set_sound_effects_enabled(lua_toboolean(L, 2) != 0); return 1; } static Uint32 played_sound_callback(Uint32 interval, void* param) { SDL_Event e; e.type = SDL_USEREVENT_SOUND_OVER; e.user.data1 = param; int iSoundID = *(static_cast(param)); SDL_RemoveTimer(map_sound_timers[iSoundID]); map_sound_timers.erase(iSoundID); SDL_PushEvent(&e); return interval; } static int l_soundfx_play(lua_State *L) { sound_player *pEffects = luaT_testuserdata(L); lua_settop(L, 7); lua_getfenv(L, 1); lua_pushliteral(L, "archive"); lua_rawget(L,8); sound_archive *pArchive = (sound_archive*)lua_touserdata(L, 9); if(pArchive == nullptr) { return 0; } // l_soundarc_checkidx requires the archive at the bottom of the stack lua_replace(L, 1); size_t iIndex = l_soundarc_checkidx(L, 2, pArchive); if(iIndex == pArchive->get_number_of_sounds()) return 2; if(lua_isnil(L, 4)) { pEffects->play(iIndex, luaL_checknumber(L, 3)); } else { pEffects->play_at(iIndex, luaL_checknumber(L, 3), static_cast(luaL_checkinteger(L, 4)), static_cast(luaL_checkinteger(L, 5))); } //SDL SOUND_OVER Callback Timer: //6: unusedPlayedCallbackID if(!lua_isnil(L, 6)) { //7: Callback delay int iPlayedCallbackDelay = 0; //ms if(!lua_isnil(L, 7)) iPlayedCallbackDelay = static_cast(luaL_checknumber(L, 7)); if(played_sound_callback_index == sizeof(played_sound_callback_ids)) played_sound_callback_index = 0; played_sound_callback_ids[played_sound_callback_index] = static_cast(luaL_checkinteger(L, 6)); size_t interval = pArchive->get_sound_duration(iIndex) + iPlayedCallbackDelay; SDL_TimerID timersID = SDL_AddTimer(static_cast(interval), played_sound_callback, &(played_sound_callback_ids[played_sound_callback_index])); map_sound_timers.insert(std::pair(played_sound_callback_ids[played_sound_callback_index], timersID)); played_sound_callback_index++; } lua_pushboolean(L, 1); return 1; } static int l_soundfx_set_camera(lua_State *L) { sound_player *pEffects = luaT_testuserdata(L); pEffects->set_camera(static_cast(luaL_checkinteger(L, 2)), static_cast(luaL_checkinteger(L, 3)), static_cast(luaL_checkinteger(L, 4))); return 0; } static int l_soundfx_reserve_channel(lua_State *L) { int iChannel; sound_player *pEffects = luaT_testuserdata(L); iChannel = pEffects->reserve_channel(); lua_pushinteger(L, iChannel); return 1; } static int l_soundfx_release_channel(lua_State *L) { sound_player *pEffects = luaT_testuserdata(L); pEffects->release_channel(static_cast(luaL_checkinteger(L, 2))); return 1; } void lua_register_sound(const lua_register_state *pState) { // Sound Archive luaT_class(sound_archive, l_soundarc_new, "soundArchive", lua_metatable::sound_archive); luaT_setmetamethod(l_soundarc_count, "len"); luaT_setfunction(l_soundarc_load, "load"); luaT_setfunction(l_soundarc_sound_name, "getFilename"); // Bad name, doesn't represent a file luaT_setfunction(l_soundarc_duration, "getDuration"); luaT_setfunction(l_soundarc_data, "getFileData"); // Bad name, doesn't represent a file luaT_setfunction(l_soundarc_sound_exists, "soundExists"); luaT_endclass(); // Sound Effects luaT_class(sound_player, l_soundfx_new, "soundEffects", lua_metatable::sound_fx); luaT_setfunction(l_soundfx_set_archive, "setSoundArchive", lua_metatable::sound_archive); luaT_setfunction(l_soundfx_play, "play"); luaT_setfunction(l_soundfx_set_sound_volume, "setSoundVolume"); luaT_setfunction(l_soundfx_set_sound_effects_on, "setSoundEffectsOn"); luaT_setfunction(l_soundfx_set_camera, "setCamera"); luaT_setfunction(l_soundfx_reserve_channel, "reserveChannel"); luaT_setfunction(l_soundfx_release_channel, "releaseChannel"); luaT_endclass(); } CorsixTH-0.63/CorsixTH/Src/th_lua_strings.cpp000066400000000000000000000532251347163623700211530ustar00rootroot00000000000000/* Copyright (c) 2010 Peter "Corsix" Cawley 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. */ #include "th_lua_internal.h" #include "persist_lua.h" #include /* This file implements a string proxy system. A string proxy is a userdata which behaves like a string or a table, but records how it was made, and is serialised as this list of instructions, rather than as the resulting value. The application for this lies in persisting localised strings, as the language in use at depersist-time may be different to the one in use at persist-time. First note that such a proxy must be a userdata (in order to have custom persistance behaviour and a full complement of metamethods). At the same time, there is no C data which the userdata needs to hold, so the C part of the userdata can be empty. The Lua part of the userdata needs to hold the current proxied value and the instructions for recreating the value. When the proxied value is a table, then in addition, the Lua part of the userdata needs to store a cache of proxies for its children to avoid the situation of regularly creating new proxies for children. Due to how the persistance library deals with userdata, the Lua parts of these userdata cannot be held in the userdata's environment table, so instead the idiom of inside-out objects needs to be used. The principle idea of inside-out objects is that environment(obj).field becomes metatable(obj).field[obj] with the field table having weak values. Unfortunately, this causes weak table cycles, which are not handled well in Lua 5.1 (L5.2 uses ephemeron tables which fix this). Hence the Value and Cache weak tables are stored in the registry table, and the ReconstructInfo is stored as the userdata environment. */ class string_proxy {}; // We need 2 lightuserdata keys for naming the weak tables in the registry, // which we get by having 2 bytes of dummy global variables. static uint8_t weak_table_keys[2] = {0}; static inline void aux_push_weak_table(lua_State *L, int iIndex) { lua_pushlightuserdata(L, &weak_table_keys[iIndex]); lua_rawget(L, LUA_REGISTRYINDEX); } // Replace the value at the top of the stack with a userdata proxy static int l_str_new_aux(lua_State *L) { luaT_stdnew(L); aux_push_weak_table(L, 0); lua_pushvalue(L, -2); lua_pushvalue(L, -4); lua_rawset(L, -3); lua_pop(L, 1); lua_replace(L, -2); return 1; } // Create a new root-level userdata proxy static int l_str_new(lua_State *L) { // Pack extra arguments into a table int iNArgs = lua_gettop(L); lua_createtable(L, iNArgs - 2, 0); lua_replace(L, 1); // Value inserted by __call for(int i = iNArgs; i >= 3; --i) lua_rawseti(L, 1, i - 2); // Make proxy luaL_checkany(L, 2); l_str_new_aux(L); // Save extra arguments as reconstruction information lua_insert(L, 1); lua_setfenv(L, 1); return 1; } // Helper function to make an array in Lua static void aux_mk_table(lua_State *L, int nliterals, int nvalues, ...) { lua_createtable(L, nliterals + nvalues, 0); va_list args; va_start(args, nvalues); for(int i = 1; i <= nliterals; ++i) { const char *sStr = va_arg(args, const char*); lua_pushstring(L, sStr); lua_rawseti(L, -2, i); } for(int i = nliterals + 1; i <= nliterals + nvalues; ++i) { int iValue = va_arg(args, int); if(0 > iValue && iValue > LUA_REGISTRYINDEX) --iValue; lua_pushvalue(L, iValue); lua_rawseti(L, -2, i); } va_end(args); } // Helper function which pushes onto the stack a random key from the table // (previously) on the top of the stack. static void aux_push_random_key(lua_State *L) { int iNKeys = 0; lua_newtable(L); lua_getglobal(L, "pairs"); lua_pushvalue(L, -3); lua_call(L, 1, 3); while(true) { lua_pushvalue(L, -3); lua_pushvalue(L, -3); lua_pushvalue(L, -3); lua_remove(L, -4); lua_call(L, 2, 1); if(lua_isnil(L, -1)) break; ++iNKeys; lua_pushvalue(L, -1); lua_rawseti(L, -5, iNKeys); } lua_pop(L, 3); lua_getglobal(L, "math"); lua_getfield(L, -1, "random"); lua_pushinteger(L, 1); lua_pushinteger(L, iNKeys); lua_call(L, 2, 1); lua_gettable(L, -3); lua_replace(L, -3); lua_pop(L, 1); } // __index metamethod handler. // For proxied tables, return proxies of children, preferably cached // For proxied strings, return methods static int l_str_index(lua_State *L) { // Look up cached value, and return it if present aux_push_weak_table(L, 1); lua_pushvalue(L, 1); lua_gettable(L, 3); lua_replace(L, 3); lua_pushvalue(L, 2); lua_rawget(L, 3); if(!lua_isnil(L, 4)) return 1; lua_pop(L, 1); // Fetch the proxied value aux_push_weak_table(L, 0); lua_pushvalue(L, 1); lua_rawget(L, 4); lua_replace(L, 4); // Handle string methods if(lua_type(L, 4) == LUA_TSTRING) { lua_rawgeti(L, luaT_environindex, 4); lua_pushvalue(L, 2); lua_gettable(L, 5); return 1; } // Handle __random, as it shouldn't be cached if(lua_type(L, 2) == LUA_TSTRING) { size_t iLen; const char* sKey = lua_tolstring(L, 2, &iLen); if(iLen == 8 && std::strcmp(sKey, "__random") == 0) { aux_push_random_key(L); lua_replace(L, 2); lua_settop(L, 2); return l_str_index(L); } } // Fetch desired value lua_pushvalue(L, 2); lua_gettable(L, 4); lua_replace(L, 4); // Create new userdata proxy l_str_new_aux(L); aux_mk_table(L, 0, 2, 1, 2); lua_setfenv(L, 4); // Save to cache and return lua_pushvalue(L, 2); lua_pushvalue(L, 4); lua_rawset(L, 3); return 1; } // __newindex metamethod handler static int l_str_newindex(lua_State *L) { return luaL_error(L, "String tables are read-only"); } // Generic string method handler // The name of the method is stored at upvalue 1 static int l_str_func(lua_State *L) { int iArgCount = lua_gettop(L); lua_checkstack(L, iArgCount + 10); int iUserdataCount = 0; // Construct the resulting value aux_push_weak_table(L, 0); for(int i = 1; i <= iArgCount; ++i) { lua_pushvalue(L, i); if(lua_type(L, i) == LUA_TUSERDATA) { lua_rawget(L, iArgCount + 1); ++iUserdataCount; } } lua_pushvalue(L, luaT_upvalueindex(1)); lua_gettable(L, iArgCount + 2); lua_replace(L, iArgCount + 1); lua_call(L, iArgCount, 1); // Trivial case of result not depending upon any proxies if(iUserdataCount == 0) return 1; // Wrap result in a proxy l_str_new_aux(L); // Create and save reconstruction information lua_createtable(L, iArgCount + 1, 0); lua_pushvalue(L, luaT_upvalueindex(1)); lua_rawseti(L, -2, 1); for(int i = 1; i <= iArgCount; ++i) { lua_pushvalue(L, i); lua_rawseti(L, -2, i + 1); } lua_setfenv(L, -2); return 1; } // __concat metamethod handler // Simple (but inefficient) handling by converting concat into format static int l_str_concat(lua_State *L) { int iParent = (lua_type(L, 1) == LUA_TUSERDATA) ? 1 : 2; lua_getfield(L, iParent, "format"); lua_insert(L, 1); lua_pushliteral(L, "%s%s"); lua_insert(L, 2); lua_call(L, 3, 1); return 1; } // pairs() metamethod handler static int l_str_pairs(lua_State *L) { lua_settop(L, 1); lua_getfield(L, luaT_environindex, "__next"); lua_pushvalue(L, 1); lua_pushnil(L); return 3; } // ipairs() metamethod handler static int l_str_ipairs(lua_State *L) { lua_settop(L, 1); lua_getfield(L, luaT_environindex, "__inext"); lua_pushvalue(L, 1); lua_pushinteger(L, 0); return 3; } // pairs() iterator function static int l_str_next(lua_State *L) { luaL_checktype(L, 1, LUA_TUSERDATA); lua_settop(L, 2); // Fetch proxied value aux_push_weak_table(L, 0); lua_pushvalue(L, 1); lua_rawget(L, 3); // Remove layer of proxying done in Lua // NB: Assumes that pairs(t) returns 3 values: next, t, nil // In our case, the returned t should be the raw (unproxied) one lua_getglobal(L, "pairs"); lua_replace(L, 3); lua_call(L, 1, 2); // Get the next key lua_pushvalue(L, 2); lua_call(L, 2, 1); if(lua_isnil(L, -1)) return 0; // Get the (proxied) value which goes with the key lua_pushvalue(L, -1); lua_gettable(L, 1); return 2; } // __len metamethod handler static int l_str_len(lua_State *L) { luaL_checktype(L, 1, LUA_TUSERDATA); // Fetch proxied value aux_push_weak_table(L, 0); lua_pushvalue(L, 1); lua_gettable(L, -2); // String tables are proxied in Lua, and Lua tables do not honour __len // so use ipairs to get the unproxied table to call __len on. if(lua_type(L, -1) == LUA_TTABLE) { lua_getglobal(L, "ipairs"); lua_insert(L, -2); lua_call(L, 1, 2); lua_replace(L, -2); } lua_pushinteger(L, (lua_Integer)lua_objlen(L, -1)); return 1; } // ipairs() iterator function static int l_str_inext(lua_State *L) { lua_Integer n = luaL_checkinteger(L, 2) + 1; lua_settop(L, 1); l_str_len(L); lua_Integer len = lua_tointeger(L, -1); if(n > len) return 0; // Fetch proxied value lua_settop(L, 2); lua_pushvalue(L, 1); lua_gettable(L, 2); // Return new N and the proxied value which goes it lua_pushinteger(L, n); lua_pushinteger(L, n); lua_gettable(L, 1); return 2; } // tostring() metamethod handler for debugging / diagnostics static int l_str_tostring(lua_State *L) { // Convert the proxy to a string, recursively calling tostring() lua_settop(L, 1); aux_push_weak_table(L, 0); lua_pushvalue(L, 1); lua_rawget(L, 2); if(lua_isnil(L, 3)) lua_pop(L, 2); else { lua_replace(L, 1); lua_pop(L, 1); } lua_getglobal(L, "tostring"); lua_insert(L, 1); lua_call(L, 1, 1); // Prepend a nice message indicating that proxying is being done lua_pushliteral(L, " Current value:"); lua_insert(L, 1); lua_concat(L, 2); return 1; } // __call metamethod handler // Required to support the compatibility hack for calling _S static int l_str_call(lua_State *L) { luaL_checkany(L, 1); // Fetch the proxied value aux_push_weak_table(L, 0); lua_pushvalue(L, 1); lua_rawget(L, -2); // Forward the call onto the proxied value lua_replace(L, 1); lua_pop(L, 1); lua_call(L, lua_gettop(L) - 1, LUA_MULTRET); return lua_gettop(L); } // __lt (less-than) metamethod handler // Provided so that a list of localised strings can be sorted, which is used // to create nice user-interface listing of strings. Note that this will mean // that persist->change language->depersist will result in a "random" ordering // of the resulting list, but this is generally acceptable. static int l_str_lt(lua_State *L) { luaL_checkany(L, 1); luaL_checkany(L, 2); lua_settop(L, 2); aux_push_weak_table(L, 0); lua_pushvalue(L, 1); lua_rawget(L, 3); lua_pushvalue(L, 2); lua_rawget(L, 3); lua_pushboolean(L, lua_lessthan(L, 4, 5)); return 1; } // __persist metamethod handler static int l_str_persist(lua_State *L) { lua_settop(L, 2); lua_insert(L, 1); lua_persist_writer *pWriter = (lua_persist_writer*)lua_touserdata(L, 1); // Recreation instructions are stored in the environment, which is written // automatically. For compatibility, we write a simple boolean. lua_pushboolean(L, 1); pWriter->write_stack_object(3); lua_getfenv(L, 2); // If there were no instructions (i.e. for the root object) then write the // value as well. if(lua_objlen(L, -1) == 0) { lua_pop(L, 2); aux_push_weak_table(L, 0); lua_pushvalue(L, 2); lua_rawget(L, 3); pWriter->write_stack_object(4); } return 0; } // __depersist metamethod handler static int l_str_depersist(lua_State *L) { lua_settop(L, 2); lua_insert(L, 1); lua_persist_reader *pReader = (lua_persist_reader*)lua_touserdata(L, 1); // Read the instructions for re-creating the value if(!pReader->read_stack_object()) return 0; if(lua_type(L, 3) == LUA_TBOOLEAN && lua_toboolean(L, 3) == 1) { // The current code uses a boolean marker to indicate that the // instructions were stored in the environment. Replace the marker // with them. lua_getfenv(L, 2); lua_replace(L, 3); } else { // Older versions of the code wrote the instructions here, or nil for // no instructions. Convert nil to the empty table, and store the // instructions as the userdata's environment. if(lua_type(L, 3) == LUA_TNIL) { lua_newtable(L); lua_replace(L, 3); } lua_pushvalue(L, 3); lua_setfenv(L, 2); } // Prepare t, k for saving the value aux_push_weak_table(L, 0); lua_pushvalue(L, 2); if(lua_objlen(L, 3) == 0) { // No instructions provided, so read the value itself if(!pReader->read_stack_object()) return 0; } else { // The instructions are a table of values; unpack them and replace // proxies with their values. bool bIsIndexOperation = false; int iCount = (int)lua_objlen(L, 3); lua_checkstack(L, iCount + 1); for(int i = 1; i <= iCount; ++i) { lua_rawgeti(L, 3, i); if(lua_type(L, -1) == LUA_TUSERDATA) { if(i == 1) bIsIndexOperation = true; lua_rawget(L, 4); } } if(iCount == 2 && bIsIndexOperation) { // If there were two values, and the first was a proxy, then the // instruction is to perform a table lookup. lua_gettable(L, -2); lua_replace(L, -2); } else { // Otherwise, the first value was a method or method name. if(lua_type(L, 6) != LUA_TFUNCTION) { lua_pushvalue(L, 6); lua_gettable(L, 7); lua_replace(L, 6); } lua_call(L, iCount - 1, 1); } } // Save the value lua_rawset(L, 4); return 0; } const char* luaT_checkstring(lua_State *L, int idx, size_t* pLength) { if(lua_isuserdata(L, idx)) { aux_push_weak_table(L, 0); bool bRel = (0 > idx && idx > LUA_REGISTRYINDEX); lua_pushvalue(L, bRel ? (idx - 1) : idx); lua_rawget(L, -2); lua_replace(L, bRel ? (idx - 2) : idx); lua_pop(L, 1); } return luaL_checklstring(L, idx, pLength); } static int l_str_reload_actual(lua_State *L) { // Reload a single string proxy // Stack: reload_cache proxy_to_reload L; // Create Value, and Cache weak tables for inside-out objects. for(int i = 0; i <= 1; ++i) { lua_pushlightuserdata(L, &weak_table_keys[i]); lua_newtable(L); lua_createtable(L, 0, 1); lua_pushliteral(L, "__mode"); lua_pushliteral(L, "k"); lua_rawset(L, -3); if(i == 1) { // Have the cache weak table automatically create caches on demand lua_pushliteral(L, "__index"); lua_createtable(L, 0, 1); lua_pushliteral(L, "__mode"); lua_pushliteral(L, "kv"); lua_rawset(L, -3); luaT_pushcclosure(L, l_mk_cache, 1); lua_rawset(L, -3); } lua_setmetatable(L, -2); lua_rawset(L, LUA_REGISTRYINDEX); } // Give the Value weak table a friendly name for Lua code to use lua_pushliteral(L, "StringProxyValues"); lua_pushlightuserdata(L, &weak_table_keys[0]); lua_rawget(L, LUA_REGISTRYINDEX); lua_rawset(L, LUA_REGISTRYINDEX); luaT_class(string_proxy, l_str_new, "stringProxy", lua_metatable::string_proxy); // As we overwrite __index, move methods to lua_metatable::string_proxy[4] lua_getfield(L, pState->metatables[static_cast(lua_metatable::string_proxy)], "__index"); lua_rawseti(L, pState->metatables[static_cast(lua_metatable::string_proxy)], 4); luaT_setmetamethod(l_str_index, "index"); luaT_setmetamethod(l_str_newindex, "newindex"); luaT_setmetamethod(l_str_concat, "concat"); luaT_setmetamethod(l_str_len, "len"); luaT_setmetamethod(l_str_tostring, "tostring"); luaT_setmetamethod(l_str_persist, "persist"); luaT_setmetamethod(l_str_depersist, "depersist"); luaT_setmetamethod(l_str_call, "call"); luaT_setmetamethod(l_str_lt, "lt"); luaT_setmetamethod(l_str_pairs, "pairs"); luaT_setmetamethod(l_str_ipairs, "ipairs"); luaT_setmetamethod(l_str_next, "next"); luaT_setmetamethod(l_str_inext, "inext"); luaT_setfunction(l_str_func, "format", "format"); luaT_setfunction(l_str_func, "lower", "lower"); luaT_setfunction(l_str_func, "rep", "rep"); luaT_setfunction(l_str_func, "reverse", "reverse"); luaT_setfunction(l_str_func, "upper", "upper"); luaT_setfunction(l_str_unwrap, "_unwrap"); luaT_setfunction(l_str_reload, "reload"); luaT_endclass(); } CorsixTH-0.63/CorsixTH/Src/th_lua_ui.cpp000066400000000000000000000156631347163623700201030ustar00rootroot00000000000000/* Copyright (c) 2010 Peter "Corsix" Cawley 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. */ #include "th_lua_internal.h" #include "th_gfx.h" #include "th_map.h" #include class abstract_window {}; static int l_abstract_window_new(lua_State *L) { return luaL_error(L, "windowBase can only be used a base class - " " do not create a windowBase directly."); } static uint8_t range_scale(uint16_t low, uint16_t high, uint16_t val, uint16_t start, uint16_t end) { return static_cast(std::max(start + (end - start) * (val - low) / (high - low), 0xFF)); } static int l_town_map_draw(lua_State *L) { luaL_checktype(L, 1, LUA_TTABLE); level_map* pMap = luaT_testuserdata(L, 2); render_target *pCanvas = luaT_testuserdata(L, 3); int iCanvasXBase = static_cast(luaL_checkinteger(L, 4)); int iCanvasYBase = static_cast(luaL_checkinteger(L, 5)); bool bShowHeat = lua_toboolean(L, 6) != 0; uint32_t iColourMyHosp = pCanvas->map_colour(0, 0, 70); uint32_t iColourWall = pCanvas->map_colour(255, 255, 255); uint32_t iColourDoor = pCanvas->map_colour(200, 200, 200); uint32_t iColourPurchasable = pCanvas->map_colour(255, 0, 0); const map_tile *pNode = pMap->get_tile_unchecked(0, 0); const map_tile *pOriginalNode = pMap->get_original_tile_unchecked(0, 0); int iCanvasY = iCanvasYBase + 3; int iMapWidth = pMap->get_width(); for(int iY = 0; iY < pMap->get_height(); ++iY, iCanvasY += 3) { int iCanvasX = iCanvasXBase; for(int iX = 0; iX < iMapWidth; ++iX, ++pNode, ++pOriginalNode, iCanvasX += 3) { if(pOriginalNode->flags.hospital) { uint32_t iColour = iColourMyHosp; if(!(pNode->flags.hospital)) { // TODO: Replace 1 with player number if(pMap->is_parcel_purchasable(pNode->iParcelId, 1)) iColour = iColourPurchasable; else goto dont_paint_tile; } else if(bShowHeat) { uint16_t iTemp = pMap->get_tile_temperature(pNode); if(iTemp < 5200) // Less than 4 degrees iTemp = 0; else if(iTemp > 32767) // More than 25 degrees iTemp = 255; else // NB: 108 == (32767 - 5200) / 255 iTemp = static_cast((iTemp - 5200) / 108); const uint16_t minOkTemp = 140; const uint16_t maxOkTemp = 180; uint8_t iR = 0; uint8_t iG = 0; uint8_t iB = 0; switch(pMap->get_temperature_display()) { case temperature_theme::multi_colour: iB = 70; if(iTemp < minOkTemp) { iB = range_scale(0, minOkTemp - 1, iTemp, 200, 60); } else if(iTemp < maxOkTemp) { iG = range_scale(minOkTemp, maxOkTemp - 1, iTemp, 140, 224); } else { iR = range_scale(maxOkTemp, 255, iTemp, 224, 255); } break; case temperature_theme::yellow_red: if(iTemp < minOkTemp) { // Below 11 degrees iR = range_scale(0, minOkTemp - 1, iTemp, 100, 213); iG = range_scale(0, minOkTemp - 1, iTemp, 80, 180); } else { iR = range_scale(minOkTemp, 255, iTemp, 223, 235); iG = range_scale(minOkTemp, 255, iTemp, 184, 104); iB = range_scale(minOkTemp, 255, iTemp, 0, 53); } break; case temperature_theme::red: iR = static_cast(iTemp); iB = 70; break; } iColour = pCanvas->map_colour(iR, iG, iB); } pCanvas->fill_rect(iColour, iCanvasX, iCanvasY, 3, 3); } dont_paint_tile: #define IsWall(blk) ((82 <= ((blk) & 0xFF)) && (((blk) & 0xFF) <= 164)) #define IsWallDrawn(n) pMap->get_tile_owner(pNode) != 0 ? \ IsWall(pNode->iBlock[n]) : IsWall(pOriginalNode->iBlock[n]) if(IsWallDrawn(1)) { pCanvas->fill_rect(iColourWall, iCanvasX, iCanvasY, 3, 1); // Draw entrance door auto l = (pNode - 1)->objects; if(!l.empty() && l.front() == object_type::entrance_right_door) { if (pNode->flags.hospital) { pCanvas->fill_rect(iColourDoor, iCanvasX-6, iCanvasY-2, 9, 3); } else { pCanvas->fill_rect(iColourDoor, iCanvasX-6, iCanvasY, 9, 3); } } } if(IsWallDrawn(2)) { pCanvas->fill_rect(iColourWall, iCanvasX, iCanvasY, 1, 3); // Draw entrance door auto l = (pNode - iMapWidth)->objects; if(!l.empty() && l.front() == object_type::entrance_right_door) { if (pNode->flags.hospital) { pCanvas->fill_rect(iColourDoor, iCanvasX-2, iCanvasY-6, 3, 9); } else { pCanvas->fill_rect(iColourDoor, iCanvasX, iCanvasY-6, 3, 9); } } } #undef IsWallDrawn #undef IsWall } } return 0; } void lua_register_ui(const lua_register_state *pState) { // WindowBase luaT_class(abstract_window, l_abstract_window_new, "windowHelpers", lua_metatable::window_base); luaT_setfunction(l_town_map_draw, "townMapDraw", lua_metatable::map, lua_metatable::surface); luaT_endclass(); } CorsixTH-0.63/CorsixTH/Src/th_map.cpp000066400000000000000000001736371347163623700174100ustar00rootroot00000000000000/* Copyright (c) 2009 Peter "Corsix" Cawley 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. */ #include "config.h" #include "th_map.h" #include "th_map_overlays.h" #include "th_gfx.h" #include "run_length_encoder.h" #include #include #include #include #include #include #include #include map_tile_flags& map_tile_flags::operator=(uint32_t raw) { passable = (raw & static_cast(map_tile_flags::key::passable_mask)) != 0; can_travel_n = (raw & static_cast(map_tile_flags::key::can_travel_n_mask)) != 0; can_travel_e = (raw & static_cast(map_tile_flags::key::can_travel_e_mask)) != 0; can_travel_s = (raw & static_cast(map_tile_flags::key::can_travel_s_mask)) != 0; can_travel_w = (raw & static_cast(map_tile_flags::key::can_travel_w_mask)) != 0; hospital = (raw & static_cast(map_tile_flags::key::hospital_mask)) != 0; buildable = (raw & static_cast(map_tile_flags::key::buildable_mask)) != 0; passable_if_not_for_blueprint = (raw & static_cast(map_tile_flags::key::passable_if_not_for_blueprint_mask)) != 0; room = (raw & static_cast(map_tile_flags::key::room_mask)) != 0; shadow_half = (raw & static_cast(map_tile_flags::key::shadow_half_mask)) != 0; shadow_full = (raw & static_cast(map_tile_flags::key::shadow_full_mask)) != 0; shadow_wall = (raw & static_cast(map_tile_flags::key::shadow_wall_mask)) != 0; door_north = (raw & static_cast(map_tile_flags::key::door_north_mask)) != 0; door_west = (raw & static_cast(map_tile_flags::key::door_west_mask)) != 0; do_not_idle = (raw & static_cast(map_tile_flags::key::do_not_idle_mask)) != 0; tall_north = (raw & static_cast(map_tile_flags::key::tall_north_mask)) != 0; tall_west = (raw & static_cast(map_tile_flags::key::tall_west_mask)) != 0; buildable_n = (raw & static_cast(map_tile_flags::key::buildable_n_mask)) != 0; buildable_e = (raw & static_cast(map_tile_flags::key::buildable_e_mask)) != 0; buildable_s = (raw & static_cast(map_tile_flags::key::buildable_s_mask)) != 0; buildable_w = (raw & static_cast(map_tile_flags::key::buildable_w_mask)) != 0; return *this; } bool& map_tile_flags::operator[](map_tile_flags::key key) { switch(key) { case map_tile_flags::key::passable_mask: return passable; case map_tile_flags::key::can_travel_n_mask: return can_travel_n; case map_tile_flags::key::can_travel_e_mask: return can_travel_e; case map_tile_flags::key::can_travel_s_mask: return can_travel_s; case map_tile_flags::key::can_travel_w_mask: return can_travel_w; case map_tile_flags::key::hospital_mask: return hospital; case map_tile_flags::key::buildable_mask: return buildable; case map_tile_flags::key::passable_if_not_for_blueprint_mask: return passable_if_not_for_blueprint; case map_tile_flags::key::room_mask: return room; case map_tile_flags::key::shadow_half_mask: return shadow_half; case map_tile_flags::key::shadow_full_mask: return shadow_full; case map_tile_flags::key::shadow_wall_mask: return shadow_wall; case map_tile_flags::key::door_north_mask: return door_north; case map_tile_flags::key::door_west_mask: return door_west; case map_tile_flags::key::do_not_idle_mask: return do_not_idle; case map_tile_flags::key::tall_north_mask: return tall_north; case map_tile_flags::key::tall_west_mask: return tall_west; case map_tile_flags::key::buildable_n_mask: return buildable_n; case map_tile_flags::key::buildable_e_mask: return buildable_e; case map_tile_flags::key::buildable_s_mask: return buildable_s; case map_tile_flags::key::buildable_w_mask: return buildable_w; default: throw std::out_of_range("map tile flag is invalid"); } } const bool& map_tile_flags::operator[](map_tile_flags::key key) const { switch(key) { case map_tile_flags::key::passable_mask: return passable; case map_tile_flags::key::can_travel_n_mask: return can_travel_n; case map_tile_flags::key::can_travel_e_mask: return can_travel_e; case map_tile_flags::key::can_travel_s_mask: return can_travel_s; case map_tile_flags::key::can_travel_w_mask: return can_travel_w; case map_tile_flags::key::hospital_mask: return hospital; case map_tile_flags::key::buildable_mask: return buildable; case map_tile_flags::key::passable_if_not_for_blueprint_mask: return passable_if_not_for_blueprint; case map_tile_flags::key::room_mask: return room; case map_tile_flags::key::shadow_half_mask: return shadow_half; case map_tile_flags::key::shadow_full_mask: return shadow_full; case map_tile_flags::key::shadow_wall_mask: return shadow_wall; case map_tile_flags::key::door_north_mask: return door_north; case map_tile_flags::key::door_west_mask: return door_west; case map_tile_flags::key::do_not_idle_mask: return do_not_idle; case map_tile_flags::key::tall_north_mask: return tall_north; case map_tile_flags::key::tall_west_mask: return tall_west; case map_tile_flags::key::buildable_n_mask: return buildable_n; case map_tile_flags::key::buildable_e_mask: return buildable_e; case map_tile_flags::key::buildable_s_mask: return buildable_s; case map_tile_flags::key::buildable_w_mask: return buildable_w; default: throw std::out_of_range("map tile flag is invalid"); } } map_tile_flags::operator uint32_t() const { uint32_t raw = 0; if(passable) { raw |= static_cast(map_tile_flags::key::passable_mask); } if(can_travel_n) { raw |= static_cast(map_tile_flags::key::can_travel_n_mask); } if(can_travel_e) { raw |= static_cast(map_tile_flags::key::can_travel_e_mask); } if(can_travel_s) { raw |= static_cast(map_tile_flags::key::can_travel_s_mask); } if(can_travel_w) { raw |= static_cast(map_tile_flags::key::can_travel_w_mask); } if(hospital) { raw |= static_cast(map_tile_flags::key::hospital_mask); } if(buildable) { raw |= static_cast(map_tile_flags::key::buildable_mask); } if(passable_if_not_for_blueprint) { raw |= static_cast(map_tile_flags::key::passable_if_not_for_blueprint_mask); } if(room) { raw |= static_cast(map_tile_flags::key::room_mask); } if(shadow_half) { raw |= static_cast(map_tile_flags::key::shadow_half_mask); } if(shadow_full) { raw |= static_cast(map_tile_flags::key::shadow_full_mask); } if(shadow_wall) { raw |= static_cast(map_tile_flags::key::shadow_wall_mask); } if(door_north) { raw |= static_cast(map_tile_flags::key::door_north_mask); } if(door_west) { raw |= static_cast(map_tile_flags::key::door_west_mask); } if(do_not_idle) { raw |= static_cast(map_tile_flags::key::do_not_idle_mask); } if(tall_north) { raw |= static_cast(map_tile_flags::key::tall_north_mask); } if(tall_west) { raw |= static_cast(map_tile_flags::key::tall_west_mask); } if(buildable_n) { raw |= static_cast(map_tile_flags::key::buildable_n_mask); } if(buildable_e) { raw |= static_cast(map_tile_flags::key::buildable_e_mask); } if(buildable_s) { raw |= static_cast(map_tile_flags::key::buildable_s_mask); } if(buildable_w) { raw |= static_cast(map_tile_flags::key::buildable_w_mask); } return raw; } map_tile::map_tile() : iParcelId(0), iRoomId(0), objects() { iBlock[0] = 0; iBlock[1] = 0; iBlock[2] = 0; iBlock[3] = 0; aiTemperature[0] = aiTemperature[1] = 8192; flags = {}; } map_tile::~map_tile() { } level_map::level_map() { width = 0; height = 0; player_count = 0; current_temperature_index = 0; current_temperature_theme = temperature_theme::red; parcel_count = 0; cells = nullptr; original_cells = nullptr; blocks = nullptr; overlay = nullptr; owns_overlay = false; plot_owner = nullptr; parcel_tile_counts = nullptr; parcel_adjacency_matrix = nullptr; purchasable_matrix = nullptr; } level_map::~level_map() { set_overlay(nullptr, false); delete[] cells; delete[] original_cells; delete[] plot_owner; delete[] parcel_tile_counts; delete[] parcel_adjacency_matrix; delete[] purchasable_matrix; } void level_map::set_overlay(map_overlay *pOverlay, bool bTakeOwnership) { if(overlay && owns_overlay) delete overlay; overlay = pOverlay; owns_overlay = bTakeOwnership; } bool level_map::set_size(int iWidth, int iHeight) { if(iWidth <= 0 || iHeight <= 0) return false; delete[] cells; delete[] original_cells; delete[] parcel_adjacency_matrix; delete[] purchasable_matrix; width = iWidth; height = iHeight; cells = nullptr; cells = new (std::nothrow) map_tile[iWidth * iHeight]; original_cells = nullptr; original_cells = new (std::nothrow) map_tile[iWidth * iHeight]; parcel_adjacency_matrix = nullptr; purchasable_matrix = nullptr; if(cells == nullptr || original_cells == nullptr) { delete[] cells; delete[] original_cells; original_cells = nullptr; cells = nullptr; width = 0; height = 0; return false; } return true; } // NB: http://connection-endpoint.de/th-format-specification/ // gives a (slightly) incorrect array, which is why it differs from this one. static const uint8_t gs_iTHMapBlockLUT[256] = { 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, 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2A, 0x2B, 0x2C, 0x2D, 0x2E, 0x2F, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3A, 0x3B, 0x3C, 0x3D, 0x3E, 0x3F, 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4A, 0x4B, 0x4C, 0x4D, 0x4E, 0x4F, 0x50, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5A, 0x5B, 0x5C, 0x5D, 0x5E, 0x5F, 0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x6A, 0x6B, 0x6C, 0x6D, 0x6E, 0x6F, 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79, 0x7A, 0x7B, 0x7C, 0x7D, 0x7E, 0x7F, 0x80, 0x81, 0x84, 0x85, 0x88, 0x89, 0x8C, 0x8D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x8E, 0x8F, 0x00, 0x00, 0x00, 0x00, 0x8E, 0x8F, 0xD5, 0xD6, 0x9C, 0xCC, 0xCD, 0xCE, 0xCF, 0xD0, 0xD1, 0xD2, 0xD3, 0xD4, 0xB3, 0xAF, 0xB0, 0xB1, 0xB2, 0xB3, 0xB4, 0xB5, 0xB6, 0xB7, 0xB8, 0xB9, 0xB3, 0xB3, 0xB4, 0xB4, 0xBA, 0xBB, 0xBC, 0xBD, 0xBE, 0xBF, 0xC0, 0xC1, 0xC2, 0xC3, 0xC4, 0xC5, 0xC6, 0xC7, 0xC8, 0xC9, 0xCA, 0xCB, 0x00, 0x82, 0x83, 0x86, 0x87, 0x8A, 0x8B, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, 0x98, 0x99, 0x9A, 0x9B, 0x00, 0x9D, 0x9E, 0x9F, 0xA0, 0xA1, 0xA2, 0xA3, 0xA4, 0xD7, 0xD8, 0xD9, 0xDA, 0xDB, 0xDC, 0xDD, 0xDE, 0xDF, 0xE0, 0xE1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; void level_map::read_tile_index(const uint8_t* pData, int& iX, int &iY) const { unsigned int iIndex = static_cast(pData[1]); iIndex = iIndex * 0x100 + static_cast(pData[0]); iX = iIndex % width; iY = iIndex / width; } void level_map::write_tile_index(uint8_t* pData, int iX, int iY) const { uint16_t iIndex = static_cast(iY * width + iX); pData[0] = static_cast(iIndex & 0xFF); pData[1] = static_cast(iIndex >> 8); } bool level_map::load_blank() { if(!set_size(128, 128)) return false; player_count = 1; initial_camera_x[0] = initial_camera_y[0] = 63; heliport_x[0] = heliport_y[0] = 0; parcel_count = 1; delete[] plot_owner; delete[] parcel_tile_counts; plot_owner = nullptr; parcel_tile_counts = nullptr; map_tile *pNode = cells; map_tile *pOriginalNode = original_cells; for(int iY = 0; iY < 128; ++iY) { for(int iX = 0; iX < 128; ++iX, ++pNode, ++pOriginalNode) { pNode->iBlock[0] = static_cast(2 + (iX % 2)); } } plot_owner = new int[1]; plot_owner[0] = 0; parcel_tile_counts = new int[1]; parcel_tile_counts[0] = 128 * 128; return true; } bool level_map::load_from_th_file(const uint8_t* pData, size_t iDataLength, map_load_object_callback_fn fnObjectCallback, void* pCallbackToken) { if(iDataLength < 163948 || !set_size(128, 128)) return false; player_count = pData[0]; for(int i = 0; i < player_count; ++i) { read_tile_index(pData + 163876 + (i % 4) * 2, initial_camera_x[i], initial_camera_y[i]); read_tile_index(pData + 163884 + (i % 4) * 2, heliport_x[i], heliport_y[i]); } parcel_count = 0; delete[] plot_owner; delete[] parcel_tile_counts; plot_owner = nullptr; parcel_tile_counts = nullptr; map_tile *pNode = cells; map_tile *pOriginalNode = original_cells; const uint16_t *pParcel = reinterpret_cast(pData + 131106); pData += 34; pNode->objects.clear(); for(int iY = 0; iY < 128; ++iY) { for(int iX = 0; iX < 128; ++iX, ++pNode, ++pOriginalNode, pData += 8, ++pParcel) { uint8_t iBaseTile = gs_iTHMapBlockLUT[pData[2]]; pNode->flags.can_travel_n = true; pNode->flags.can_travel_e = true; pNode->flags.can_travel_s = true; pNode->flags.can_travel_w = true; if(iX == 0) pNode->flags.can_travel_w = false; else if(iX == 127) pNode->flags.can_travel_e = false; if(iY == 0) pNode->flags.can_travel_n = false; else if(iY == 127) pNode->flags.can_travel_s = false; pNode->iBlock[0] = iBaseTile; #define IsDividerWall(x) (((x) >> 1) == 70) if(pData[3] == 0 || IsDividerWall(pData[3])) { // Tiles 71, 72 and 73 (pond foliage) are used as floor tiles, // but are too tall to be floor tiles, so move them to a wall, // and replace the floor with something similar (pond base). if(71 <= iBaseTile && iBaseTile <= 73) { pNode->iBlock[1] = iBaseTile; pNode->iBlock[0] = iBaseTile = 69; } else pNode->iBlock[1] = 0; } else { pNode->iBlock[1] = gs_iTHMapBlockLUT[pData[3]]; pNode->flags.can_travel_n = false; if(iY != 0) { pNode[-128].flags.can_travel_s = false; } } if(pData[4] == 0 || IsDividerWall(pData[4])) pNode->iBlock[2] = 0; else { pNode->iBlock[2] = gs_iTHMapBlockLUT[pData[4]]; pNode->flags.can_travel_w = false; if(iX != 0) { pNode[-1].flags.can_travel_e = false; } } pNode->iRoomId = 0; pNode->iParcelId = *pParcel; if(*pParcel >= parcel_count) parcel_count = *pParcel + 1; if(!(pData[5] & 1)) { pNode->flags.passable = true; if(!(pData[7] & 16)) { pNode->flags.hospital = true; if(!(pData[5] & 2)) { pNode->flags.buildable = true; } if(!(pData[5] & 4) || pData[1] == 0) { pNode->flags.buildable_n = true; } if(!(pData[5] & 8) || pData[1] == 0) { pNode->flags.buildable_e = true; } if(!(pData[5] & 16) || pData[1] == 0) { pNode->flags.buildable_s = true; } if(!(pData[5] & 32) || pData[1] == 0) { pNode->flags.buildable_w = true; } } } *pOriginalNode = *pNode; if(IsDividerWall(pData[3])) pOriginalNode->iBlock[1] = gs_iTHMapBlockLUT[pData[3]]; if(IsDividerWall(pData[4])) pOriginalNode->iBlock[2] = gs_iTHMapBlockLUT[pData[4]]; #undef IsDividerWall if(pData[1] != 0 && fnObjectCallback != nullptr) { fnObjectCallback(pCallbackToken, iX, iY, (object_type)pData[1], pData[0]); } } } plot_owner = new int[parcel_count]; plot_owner[0] = 0; for(int i = 1; i < parcel_count; ++i) plot_owner[i] = 1; update_shadows(); parcel_tile_counts = new int[parcel_count]; parcel_tile_counts[0] = 0; for(int i = 1; i < parcel_count; ++i) parcel_tile_counts[i] = count_parcel_tiles(i); return true; } void level_map::save(std::string filename) { uint8_t aBuffer[256] = {0}; int iBufferNext = 0; std::ofstream os(filename, std::ios_base::trunc | std::ios_base::binary); // Header aBuffer[0] = static_cast(player_count); // TODO: Determine correct contents for the next 33 bytes os.write(reinterpret_cast(aBuffer), 34); uint8_t aReverseBlockLUT[256] = {0}; for(int i = 0; i < 256; ++i) { aReverseBlockLUT[gs_iTHMapBlockLUT[i]] = static_cast(i); } aReverseBlockLUT[0] = 0; for(map_tile *pNode = cells, *pLimitNode = pNode + width * height; pNode != pLimitNode; ++pNode) { // TODO: Nicer system for saving object data aBuffer[iBufferNext++] = pNode->flags.tall_west ? 1 : 0; aBuffer[iBufferNext++] = static_cast(pNode->objects.empty() ? object_type::no_object : pNode->objects.front()); // Blocks aBuffer[iBufferNext++] = aReverseBlockLUT[pNode->iBlock[0] & 0xFF]; aBuffer[iBufferNext++] = aReverseBlockLUT[pNode->iBlock[1] & 0xFF]; aBuffer[iBufferNext++] = aReverseBlockLUT[pNode->iBlock[2] & 0xFF]; // Flags (TODO: Set a few more flag bits?) uint8_t iFlags = 63; if(pNode->flags.passable) iFlags ^= 1; if(pNode->flags.buildable) iFlags ^= 2; if(pNode->flags.buildable_n) iFlags ^= 4; if(pNode->flags.buildable_e) iFlags ^= 8; if(pNode->flags.buildable_s) iFlags ^= 16; if(pNode->flags.buildable_w) iFlags ^= 32; aBuffer[iBufferNext++] = iFlags; aBuffer[iBufferNext++] = 0; iFlags = 16; if(pNode->flags.hospital) iFlags ^= 16; aBuffer[iBufferNext++] = iFlags; if(iBufferNext == sizeof(aBuffer)) { os.write(reinterpret_cast(aBuffer), sizeof(aBuffer)); iBufferNext = 0; } } for(map_tile *pNode = cells, *pLimitNode = pNode + width * height; pNode != pLimitNode; ++pNode) { aBuffer[iBufferNext++] = static_cast(pNode->iParcelId & 0xFF); aBuffer[iBufferNext++] = static_cast(pNode->iParcelId >> 8); if(iBufferNext == sizeof(aBuffer)) { os.write(reinterpret_cast(aBuffer), sizeof(aBuffer)); iBufferNext = 0; } } // TODO: What are these two bytes? aBuffer[iBufferNext++] = 3; aBuffer[iBufferNext++] = 0; os.write(reinterpret_cast(aBuffer), iBufferNext); iBufferNext = 0; std::memset(aBuffer, 0, 56); for(int i = 0; i < player_count; ++i) { write_tile_index(aBuffer + iBufferNext, initial_camera_x[i], initial_camera_y[i]); write_tile_index(aBuffer + iBufferNext + 8, heliport_x[i], heliport_y[i]); iBufferNext += 2; } os.write(reinterpret_cast(aBuffer), 16); std::memset(aBuffer, 0, 16); // TODO: What are these 56 bytes? os.write(reinterpret_cast(aBuffer), 56); os.close(); } //! Add or remove divider wall for the given tile /*! If the given 'pNode' has an indoor border to another parcel in the 'delta' direction: * A divider wall is added in the layer specified by 'block' if the owners of the two parcels are not the same, or * A divider wall is removed if the owners are the same and 'iParcelId' is involved. \return True if a border was removed, false otherwise */ static bool addRemoveDividerWalls(level_map* pMap, map_tile* pNode, const map_tile* pOriginalNode, int iXY, int delta, int block, int iParcelId) { if (iXY > 0 && pOriginalNode->flags.hospital && pOriginalNode[-delta].flags.hospital && pNode->iParcelId != pNode[-delta].iParcelId) { int iOwner = pMap->get_parcel_owner(pNode->iParcelId); int iOtherOwner = pMap->get_parcel_owner(pNode[-delta].iParcelId); if (iOwner != iOtherOwner) { pNode->iBlock[block] = block + (iOwner ? 143 : 141); } else if (pNode->iParcelId == iParcelId || pNode[-delta].iParcelId == iParcelId) { pNode->iBlock[block] = 0; return true; } } return false; } std::vector> level_map::set_parcel_owner(int iParcelId, int iOwner) { std::vector> vSplitTiles; if(iParcelId <= 0 || parcel_count <= iParcelId || iOwner < 0) return vSplitTiles; plot_owner[iParcelId] = iOwner; map_tile *pNode = cells; const map_tile *pOriginalNode = original_cells; for(int iY = 0; iY < 128; ++iY) { for(int iX = 0; iX < 128; ++iX, ++pNode, ++pOriginalNode) { if(pNode->iParcelId == iParcelId) { if(iOwner != 0) { pNode->iBlock[0] = pOriginalNode->iBlock[0]; pNode->iBlock[1] = pOriginalNode->iBlock[1]; pNode->iBlock[2] = pOriginalNode->iBlock[2]; pNode->flags = pOriginalNode->flags; } else { // Nicely mown grass pattern pNode->iBlock[0] = static_cast(((iX & 1) << 1) + 1); pNode->iBlock[1] = 0; pNode->iBlock[2] = 0; pNode->flags = {}; // Random decoration if(((iX | iY) & 0x7) == 0) { int iWhich = (iX ^ iY) % 9; pNode->iBlock[1] = static_cast(192 + iWhich); } } } if (addRemoveDividerWalls(this, pNode, pOriginalNode, iX, 1, 2, iParcelId)) { vSplitTiles.push_back(std::make_pair(iX, iY)); } if (addRemoveDividerWalls(this, pNode, pOriginalNode, iY, 128, 1, iParcelId)) { vSplitTiles.push_back(std::make_pair(iX, iY)); } } } update_pathfinding(); update_shadows(); update_purchase_matrix(); return vSplitTiles; } void level_map::make_adjacency_matrix() { if(parcel_adjacency_matrix != nullptr) return; parcel_adjacency_matrix = new bool[parcel_count * parcel_count]; for(int i = 0; i < parcel_count; ++i) { for(int j = 0; j < parcel_count; ++j) { parcel_adjacency_matrix[i * parcel_count + j] = (i == j); } } const map_tile *pOriginalNode = original_cells; for(int iY = 0; iY < 128; ++iY) { for(int iX = 0; iX < 128; ++iX, ++pOriginalNode) { #define TEST_ADJ(xy, delta) if(xy > 0 && \ pOriginalNode->iParcelId != pOriginalNode[-delta].iParcelId && \ pOriginalNode->flags.passable && pOriginalNode[-delta].flags.passable)\ parcel_adjacency_matrix[pOriginalNode->iParcelId * parcel_count\ + pOriginalNode[-delta].iParcelId] = true, \ parcel_adjacency_matrix[pOriginalNode->iParcelId + \ pOriginalNode[-delta].iParcelId * parcel_count] = true TEST_ADJ(iX, 1); TEST_ADJ(iY, 128); #undef TEST_ADJ } } } void level_map::make_purchase_matrix() { if(purchasable_matrix != nullptr) return; // Already made purchasable_matrix = new bool[4 * parcel_count]; update_purchase_matrix(); } void level_map::update_purchase_matrix() { if(purchasable_matrix == nullptr) return; // Nothing to update for(int iPlayer = 1; iPlayer <= 4; ++iPlayer) { for(int iParcel = 0; iParcel < parcel_count; ++iParcel) { bool bPurchasable = false; if(iParcel != 0 && plot_owner[iParcel] == 0) { for(int iParcel2 = 0; iParcel2 < parcel_count; ++iParcel2) { if((plot_owner[iParcel2] == iPlayer) || (iParcel2 == 0)) { if(are_parcels_adjacent(iParcel, iParcel2)) { bPurchasable = true; break; } } } } purchasable_matrix[iParcel * 4 + iPlayer - 1] = bPurchasable; } } } bool level_map::are_parcels_adjacent(int iParcel1, int iParcel2) { if(0 <= iParcel1 && iParcel1 < parcel_count && 0 <= iParcel2 && iParcel2 < parcel_count) { make_adjacency_matrix(); return parcel_adjacency_matrix[iParcel1 * parcel_count + iParcel2]; } return false; } bool level_map::is_parcel_purchasable(int iParcelId, int iPlayer) { if(0 <= iParcelId && iParcelId < parcel_count && 1 <= iPlayer && iPlayer <= 4) { make_purchase_matrix(); return purchasable_matrix[iParcelId * 4 + iPlayer - 1]; } return false; } void level_map::set_player_count(int count) { if (count < 1 || count > 4) throw std::out_of_range("Player count must be between 1 and 4"); player_count = count; } bool level_map::get_player_camera_tile(int iPlayer, int* pX, int* pY) const { if(iPlayer < 0 || iPlayer >= get_player_count()) { if(pX) *pX = 0; if(pY) *pY = 0; return false; } if(pX) *pX = initial_camera_x[iPlayer]; if(pY) *pY = initial_camera_y[iPlayer]; return true; } bool level_map::get_player_heliport_tile(int iPlayer, int* pX, int* pY) const { if(iPlayer < 0 || iPlayer >= get_player_count()) { if(pX) *pX = 0; if(pY) *pY = 0; return false; } if(pX) *pX = heliport_x[iPlayer]; if(pY) *pY = heliport_y[iPlayer]; return true; } void level_map::set_player_camera_tile(int iPlayer, int iX, int iY) { if(0 <= iPlayer && iPlayer < get_player_count()) { initial_camera_x[iPlayer] = iX; initial_camera_y[iPlayer] = iY; } } void level_map::set_player_heliport_tile(int iPlayer, int iX, int iY) { if(0 <= iPlayer && iPlayer < get_player_count()) { heliport_x[iPlayer] = iX; heliport_y[iPlayer] = iY; } } int level_map::get_parcel_tile_count(int iParcelId) const { if(iParcelId < 1 || iParcelId >= parcel_count) { return 0; } return parcel_tile_counts[iParcelId]; } int level_map::count_parcel_tiles(int iParcelId) const { int iTiles = 0; for(int iY = 0; iY < height; ++iY) { for(int iX = 0; iX < width; ++iX) { const map_tile* pNode = get_tile_unchecked(iX, iY); if(pNode->iParcelId == iParcelId) iTiles++; } } return iTiles; } map_tile* level_map::get_tile(int iX, int iY) { if(0 <= iX && iX < width && 0 <= iY && iY < height) return get_tile_unchecked(iX, iY); else return nullptr; } const map_tile* level_map::get_tile(int iX, int iY) const { if(0 <= iX && iX < width && 0 <= iY && iY < height) return get_tile_unchecked(iX, iY); else return nullptr; } const map_tile* level_map::get_original_tile(int iX, int iY) const { if(0 <= iX && iX < width && 0 <= iY && iY < height) return get_original_tile_unchecked(iX, iY); else return nullptr; } map_tile* level_map::get_tile_unchecked(int iX, int iY) { return cells + iY * width + iX; } const map_tile* level_map::get_tile_unchecked(int iX, int iY) const { return cells + iY * width + iX; } const map_tile* level_map::get_original_tile_unchecked(int iX, int iY) const { return original_cells + iY * width + iX; } void level_map::set_block_sheet(sprite_sheet* pSheet) { blocks = pSheet; } void level_map::set_all_wall_draw_flags(uint8_t iFlags) { uint16_t iBlockOr = static_cast(iFlags << 8); map_tile *pNode = cells; for(int i = 0; i < width * height; ++i, ++pNode) { pNode->iBlock[1] = static_cast((pNode->iBlock[1] & 0xFF) | iBlockOr); pNode->iBlock[2] = static_cast((pNode->iBlock[2] & 0xFF) | iBlockOr); } } // Definition is in th_gfx.h so this should move void clip_rect_intersection(clip_rect& rcClip,const clip_rect& rcIntersect) { // The intersection of the rectangles is the higher of the lower bounds and the lower of the higher bounds, clamped to a zero size. clip_rect::x_y_type maxX = static_cast(std::min(rcClip.x + rcClip.w, rcIntersect.x + rcIntersect.w)); clip_rect::x_y_type maxY = static_cast(std::min(rcClip.y + rcClip.h, rcIntersect.y + rcIntersect.h)); rcClip.x = std::max(rcClip.x, rcIntersect.x); rcClip.y = std::max(rcClip.y, rcIntersect.y); rcClip.w = maxX - rcClip.x; rcClip.h = maxY - rcClip.y; // Make sure that we clamp the values to 0. if (rcClip.w <= 0) { rcClip.w = rcClip.h = 0; } else if (rcClip.h <= 0) { rcClip.w = rcClip.h = 0; } } void level_map::draw(render_target* pCanvas, int iScreenX, int iScreenY, int iWidth, int iHeight, int iCanvasX, int iCanvasY) const { /* The map is drawn in two passes, with each pass done one scanline at a time (a scanline is a list of tiles with the same screen Y co-ordinate). The first pass does floor tiles, as the entire floor needs to be painted below anything else (for example, see the walking north through a door animation, which needs to paint over the floor of the scanline below the animation). On the second pass, walls and entities are drawn, with the order controlled such that entites appear in the right order relative to the walls around them. For each scanline, the following is done: 1st pass: 1) For each tile, left to right, the floor tile (layer 0) 2nd pass: 1) For each tile, right to left, the north wall, then the early entities 2) For each tile, left to right, the west wall, then the late entities */ if(blocks == nullptr || cells == nullptr) return; clip_rect rcClip; rcClip.x = static_cast(iCanvasX); rcClip.y = static_cast(iCanvasY); rcClip.w = static_cast(iWidth); rcClip.h = static_cast(iHeight); pCanvas->set_clip_rect(&rcClip); // 1st pass pCanvas->start_nonoverlapping_draws(); for(map_tile_iterator itrNode1(this, iScreenX, iScreenY, iWidth, iHeight); itrNode1; ++itrNode1) { unsigned int iH = 32; unsigned int iBlock = itrNode1->iBlock[0]; blocks->get_sprite_size(iBlock & 0xFF, nullptr, &iH); blocks->draw_sprite(pCanvas, iBlock & 0xFF, itrNode1.tile_x_position_on_screen() + iCanvasX - 32, itrNode1.tile_y_position_on_screen() + iCanvasY - iH + 32, iBlock >> 8); } pCanvas->finish_nonoverlapping_draws(); bool bFirst = true; map_scanline_iterator formerIterator; // 2nd pass for(map_tile_iterator itrNode2(this, iScreenX, iScreenY, iWidth, iHeight); itrNode2; ++itrNode2) { if(itrNode2->flags.shadow_full) { blocks->draw_sprite(pCanvas, 74, itrNode2.tile_x_position_on_screen() + iCanvasX - 32, itrNode2.tile_y_position_on_screen() + iCanvasY, thdf_alpha_75); } else if(itrNode2->flags.shadow_half) { blocks->draw_sprite(pCanvas, 75, itrNode2.tile_x_position_on_screen() + iCanvasX - 32, itrNode2.tile_y_position_on_screen() + iCanvasY, thdf_alpha_75); } if(!itrNode2.is_last_on_scanline()) continue; for(map_scanline_iterator itrNode(itrNode2, map_scanline_iterator_direction::backward, iCanvasX, iCanvasY); itrNode; ++itrNode) { unsigned int iH; unsigned int iBlock = itrNode->iBlock[1]; if(iBlock != 0 && blocks->get_sprite_size(iBlock & 0xFF, nullptr, &iH) && iH > 0) { blocks->draw_sprite(pCanvas, iBlock & 0xFF, itrNode.x() - 32, itrNode.y() - iH + 32, iBlock >> 8); if(itrNode->flags.shadow_wall) { clip_rect rcOldClip, rcNewClip; pCanvas->get_clip_rect(&rcOldClip); rcNewClip.x = static_cast(itrNode.x() - 32); rcNewClip.y = static_cast(itrNode.y() - iH + 32 + 4); rcNewClip.w = static_cast(64); rcNewClip.h = static_cast(86 - 4); clip_rect_intersection(rcNewClip, rcOldClip); pCanvas->set_clip_rect(&rcNewClip); blocks->draw_sprite(pCanvas, 156, itrNode.x() - 32, itrNode.y() - 56, thdf_alpha_75); pCanvas->set_clip_rect(&rcOldClip); } } drawable *pItem = (drawable*)(itrNode->oEarlyEntities.next); while(pItem) { pItem->draw_fn(pItem, pCanvas, itrNode.x(), itrNode.y()); pItem = (drawable*)(pItem->next); } } map_scanline_iterator itrNode(itrNode2, map_scanline_iterator_direction::forward, iCanvasX, iCanvasY); if(!bFirst) { //since the scanline count from one THMapScanlineIterator to another can differ //synchronization between the current iterator and the former one is neeeded if(itrNode.x() < -64) ++itrNode; while(formerIterator.x() < itrNode.x()) ++formerIterator; } bool bPreviousTileNeedsRedraw = false; for(; itrNode; ++itrNode) { bool bNeedsRedraw = false; unsigned int iH; unsigned int iBlock = itrNode->iBlock[2]; if(iBlock != 0 && blocks->get_sprite_size(iBlock & 0xFF, nullptr, &iH) && iH > 0) { blocks->draw_sprite(pCanvas, iBlock & 0xFF, itrNode.x() - 32, itrNode.y() - iH + 32, iBlock >> 8); } iBlock = itrNode->iBlock[3]; if(iBlock != 0 && blocks->get_sprite_size(iBlock & 0xFF, nullptr, &iH) && iH > 0) { blocks->draw_sprite(pCanvas, iBlock & 0xFF, itrNode.x() - 32, itrNode.y() - iH + 32, iBlock >> 8); } iBlock = itrNode->iBlock[1]; if(iBlock != 0 && blocks->get_sprite_size(iBlock & 0xFF, nullptr, &iH) && iH > 0) bNeedsRedraw = true; if(itrNode->oEarlyEntities.next) bNeedsRedraw = true; bool bRedrawAnimations = false; drawable *pItem = (drawable*)(itrNode->next); while(pItem) { pItem->draw_fn(pItem, pCanvas, itrNode.x(), itrNode.y()); if(pItem->is_multiple_frame_animation_fn(pItem)) bRedrawAnimations = true; if(pItem->get_drawing_layer() == 1) bNeedsRedraw = true; pItem = (drawable*)(pItem->next); } //if the current tile contained a multiple frame animation (e.g. a doctor walking) //check to see if in the tile to its left and above it there are items that need to //be redrawn (i.e. in the tile to its left side objects to the south of the tile and //in the tile above it side objects to the east of the tile). if(bRedrawAnimations && !bFirst) { bool bTileNeedsRedraw = bPreviousTileNeedsRedraw; //check if an object in the adjacent tile to the left of the current tile needs to be redrawn //and if necessary draw it pItem = (drawable*)(formerIterator.get_previous_tile()->next); while(pItem) { if (pItem->get_drawing_layer() == 9) { pItem->draw_fn(pItem, pCanvas, formerIterator.x() - 64, formerIterator.y()); bTileNeedsRedraw = true; } pItem = (drawable*)(pItem->next); } //check if an object in the adjacent tile above the current tile needs to be redrawn //and if necessary draw it pItem = formerIterator ? (drawable*)(formerIterator->next) : nullptr; while(pItem) { if(pItem->get_drawing_layer() == 8) pItem->draw_fn(pItem, pCanvas, formerIterator.x(), formerIterator.y()); pItem = (drawable*)(pItem->next); } //if an object was redrawn in the tile to the left of the current tile //or if the tile below it had an object in the north side or a wall to the north //redraw that tile if(bTileNeedsRedraw) { //redraw the north wall unsigned int iBlock = itrNode.get_previous_tile()->iBlock[1]; if(iBlock != 0 && blocks->get_sprite_size(iBlock & 0xFF, nullptr, &iH) && iH > 0) { blocks->draw_sprite(pCanvas, iBlock & 0xFF, itrNode.x() - 96, itrNode.y() - iH + 32, iBlock >> 8); if(itrNode.get_previous_tile()->flags.shadow_wall) { clip_rect rcOldClip, rcNewClip; pCanvas->get_clip_rect(&rcOldClip); rcNewClip.x = static_cast(itrNode.x() - 96); rcNewClip.y = static_cast(itrNode.y() - iH + 32 + 4); rcNewClip.w = static_cast(64); rcNewClip.h = static_cast(86 - 4); clip_rect_intersection(rcNewClip, rcOldClip); pCanvas->set_clip_rect(&rcNewClip); blocks->draw_sprite(pCanvas, 156, itrNode.x() - 96, itrNode.y() - 56, thdf_alpha_75); pCanvas->set_clip_rect(&rcOldClip); } } pItem = (drawable*)(itrNode.get_previous_tile()->oEarlyEntities.next); while(pItem) { pItem->draw_fn(pItem, pCanvas, itrNode.x() - 64, itrNode.y()); pItem = (drawable*)(pItem->next); } pItem = (drawable*)(itrNode.get_previous_tile())->next; for(; pItem; pItem = (drawable*)(pItem->next)) pItem->draw_fn(pItem, pCanvas, itrNode.x() - 64, itrNode.y()); } } bPreviousTileNeedsRedraw = bNeedsRedraw; if (!bFirst) ++formerIterator; } formerIterator = itrNode; bFirst = false; } if(overlay) { for(map_tile_iterator itrNode(this, iScreenX, iScreenY, iWidth, iHeight); itrNode; ++itrNode) { overlay->draw_cell(pCanvas, itrNode.tile_x_position_on_screen() + iCanvasX - 32, itrNode.tile_y_position_on_screen() + iCanvasY, this, itrNode.tile_x(), itrNode.tile_y()); } } pCanvas->set_clip_rect(nullptr); } drawable* level_map::hit_test(int iTestX, int iTestY) const { // This function needs to hitTest each drawable object, in the reverse // order to that in which they would be drawn. if(blocks == nullptr || cells == nullptr) return nullptr; for(map_tile_iterator itrNode2(this, iTestX, iTestY, 1, 1, map_scanline_iterator_direction::backward); itrNode2; ++itrNode2) { if(!itrNode2.is_last_on_scanline()) continue; for(map_scanline_iterator itrNode(itrNode2, map_scanline_iterator_direction::backward); itrNode; ++itrNode) { if(itrNode->next != nullptr) { drawable* pResult = hit_test_drawables(itrNode->next, itrNode.x(), itrNode.y(), 0, 0); if(pResult) return pResult; } } for(map_scanline_iterator itrNode(itrNode2, map_scanline_iterator_direction::forward); itrNode; ++itrNode) { if(itrNode->oEarlyEntities.next != nullptr) { drawable* pResult = hit_test_drawables(itrNode->oEarlyEntities.next, itrNode.x(), itrNode.y(), 0, 0); if(pResult) return pResult; } } } return nullptr; } drawable* level_map::hit_test_drawables(link_list* pListStart, int iXs, int iYs, int iTestX, int iTestY) const { link_list* pListEnd = pListStart; while(pListEnd->next) pListEnd = pListEnd->next; drawable* pList = (drawable*)pListEnd; while(true) { if(pList->hit_test_fn(pList, iXs, iYs, iTestX, iTestY)) return pList; if(pList == pListStart) return nullptr; else pList = (drawable*)pList->prev; } } int level_map::get_tile_owner(const map_tile* pNode) const { return plot_owner[pNode->iParcelId]; } int level_map::get_parcel_owner(int iParcel) const { if(0 <= iParcel && iParcel < parcel_count) return plot_owner[iParcel]; else return 0; } uint16_t level_map::get_tile_temperature(const map_tile* pNode) const { return pNode->aiTemperature[current_temperature_index]; } void level_map::set_temperature_display(temperature_theme eTempDisplay) { current_temperature_theme = eTempDisplay; } uint32_t level_map::thermal_neighbour(uint32_t &iNeighbourSum, bool canTravel, std::ptrdiff_t relative_idx, map_tile* pNode, int prevTemp) const { int iNeighbourCount = 0; map_tile* pNeighbour = pNode + relative_idx; // Ensure the neighbour is within the map bounds map_tile* pLimitNode = cells + width * height; if (pNeighbour < cells || pNeighbour >= pLimitNode) { return 0; } if (canTravel) { iNeighbourCount += 4; iNeighbourSum += pNeighbour->aiTemperature[prevTemp] * 4; } else { bool bObjectPresent = false; int iHospital1 = pNeighbour->flags.hospital; int iHospital2 = pNode->flags.hospital; if (iHospital1 == iHospital2) { if (pNeighbour->flags.room == pNode->flags.room) { bObjectPresent = true; } } if (bObjectPresent) { iNeighbourCount += 4; iNeighbourSum += pNeighbour->aiTemperature[prevTemp] * 4; } else { iNeighbourCount += 1; iNeighbourSum += pNeighbour->aiTemperature[prevTemp]; } } return iNeighbourCount; } void level_map::update_temperatures(uint16_t iAirTemperature, uint16_t iRadiatorTemperature) { if(iRadiatorTemperature < iAirTemperature) { iRadiatorTemperature = iAirTemperature; } const int iPrevTemp = current_temperature_index; current_temperature_index ^= 1; const int iNewTemp = current_temperature_index; map_tile* pLimitNode = cells + width * height; for(map_tile *pNode = cells; pNode != pLimitNode; ++pNode) { // Get average temperature of neighbour cells uint32_t iNeighbourSum = 0; uint32_t iNeighbourCount = 0; iNeighbourCount += thermal_neighbour(iNeighbourSum, pNode->flags.can_travel_n, -width, pNode, iPrevTemp); iNeighbourCount += thermal_neighbour(iNeighbourSum, pNode->flags.can_travel_s, width, pNode, iPrevTemp); iNeighbourCount += thermal_neighbour(iNeighbourSum, pNode->flags.can_travel_e, 1, pNode, iPrevTemp); iNeighbourCount += thermal_neighbour(iNeighbourSum, pNode->flags.can_travel_w, -1, pNode, iPrevTemp); #define MERGE2(src, other, ratio) (src) = static_cast( \ (static_cast(src) * ((ratio) - 1) + (other)) / (ratio)) #define MERGE(other, ratio) \ MERGE2(pNode->aiTemperature[iNewTemp], other, ratio) uint32_t iRadiatorNumber = 0; // Merge 1% against air temperature // or 50% against radiator temperature // or generally dissipate 0.1% of temperature. uint32_t iMergeTemp = 0; double iMergeRatio = 100; if(pNode->flags.hospital) { for(auto thob : pNode->objects) { if(thob == object_type::radiator) { iRadiatorNumber++; } } if(iRadiatorNumber > 0) { iMergeTemp = iRadiatorTemperature; iMergeRatio = 2 - (iRadiatorNumber - 1) * 0.5; } else { iMergeRatio = 1000; } } else { iMergeTemp = iAirTemperature; } // Diffuse 25% with neighbours pNode->aiTemperature[iNewTemp] = pNode->aiTemperature[iPrevTemp]; if(iNeighbourCount != 0) { MERGE(iNeighbourSum / iNeighbourCount, 4 - (iRadiatorNumber > 0 ? (iRadiatorNumber - 1) * 1.5 : 0)); } MERGE(iMergeTemp, iMergeRatio); #undef MERGE #undef MERGE2 } } void level_map::update_pathfinding() { map_tile *pNode = cells; for(int iY = 0; iY < 128; ++iY) { for(int iX = 0; iX < 128; ++iX, ++pNode) { pNode->flags.can_travel_n = true; pNode->flags.can_travel_e = true; pNode->flags.can_travel_s = true; pNode->flags.can_travel_w = true; if(iX == 0) pNode->flags.can_travel_w = false; else if(iX == 127) pNode->flags.can_travel_e = false; if(iY == 0) pNode->flags.can_travel_n = false; else if(iY == 127) pNode->flags.can_travel_s = false; if(pNode->iBlock[1] & 0xFF) { pNode->flags.can_travel_n = false; if(iY != 0) { pNode[-128].flags.can_travel_s = false; } } if(pNode->iBlock[2] & 0xFF) { pNode->flags.can_travel_w = false; if(iX != 0) { pNode[-1].flags.can_travel_e = false; } } } } } //! For shadow casting, a tile is considered to have a wall on a direction //! if it has a door in that direction, or the block is from the hardcoded //! range of wall-like blocks. static inline bool is_wall(map_tile *tile, size_t block, bool flag) { return flag || (82 <= (tile->iBlock[block] & 0xFF) && (tile->iBlock[block] & 0xFF) <= 164); } void level_map::update_shadows() { map_tile *pNode = cells; for(int iY = 0; iY < 128; ++iY) { for(int iX = 0; iX < 128; ++iX, ++pNode) { pNode->flags.shadow_full = false; pNode->flags.shadow_half = false; pNode->flags.shadow_wall = false; if(is_wall(pNode, 2, pNode->flags.tall_west)) { pNode->flags.shadow_half = true; if(is_wall(pNode, 1, pNode->flags.tall_north)) { pNode->flags.shadow_wall = true; } else if(iY != 0) { map_tile *pNeighbour = pNode - 128; pNeighbour->flags.shadow_full = true; if(iX != 0 && !is_wall(pNeighbour, 2, pNode->flags.tall_west)) { // Wrap the shadow around a corner (no need to continue // all the way along the wall, as the shadow would be // occluded by the wall. If Debug->Transparent Walls is // toggled on, then this optimisation becomes very // visible, but it's a debug option, so it doesn't // matter). pNeighbour[-1].flags.shadow_full = true; } } } } } #undef IsWall } void level_map::persist(lua_persist_writer *pWriter) const { lua_State *L = pWriter->get_stack(); integer_run_length_encoder oEncoder; uint32_t iVersion = 4; pWriter->write_uint(iVersion); pWriter->write_uint(player_count); for(int i = 0; i < player_count; ++i) { pWriter->write_uint(initial_camera_x[i]); pWriter->write_uint(initial_camera_y[i]); pWriter->write_uint(heliport_x[i]); pWriter->write_uint(heliport_y[i]); } pWriter->write_uint(parcel_count); for(int i = 0; i < parcel_count; ++i) { pWriter->write_uint(plot_owner[i]); } for(int i = 0; i < parcel_count; ++i) { pWriter->write_uint(parcel_tile_counts[i]); } pWriter->write_uint(width); pWriter->write_uint(height); pWriter->write_uint(current_temperature_index); oEncoder.initialise(6); for(map_tile *pNode = cells, *pLimitNode = cells + width * height; pNode != pLimitNode; ++pNode) { oEncoder.write(pNode->iBlock[0]); oEncoder.write(pNode->iBlock[1]); oEncoder.write(pNode->iBlock[2]); oEncoder.write(pNode->iBlock[3]); oEncoder.write(pNode->iParcelId); oEncoder.write(pNode->iRoomId); // Flags include THOB values, and other things which do not work // well with run-length encoding. pWriter->write_uint(static_cast(pNode->flags)); pWriter->write_uint(pNode->aiTemperature[0]); pWriter->write_uint(pNode->aiTemperature[1]); lua_rawgeti(L, luaT_upvalueindex(1), 2); lua_pushlightuserdata(L, pNode->next); lua_rawget(L, -2); pWriter->write_stack_object(-1); lua_pop(L, 1); lua_pushlightuserdata(L, pNode->oEarlyEntities.next); lua_rawget(L, -2); pWriter->write_stack_object(-1); lua_pop(L, 2); } oEncoder.finish(); oEncoder.pump_output(pWriter); oEncoder.initialise(5); for(map_tile *pNode = original_cells, *pLimitNode = original_cells + width * height; pNode != pLimitNode; ++pNode) { oEncoder.write(pNode->iBlock[0]); oEncoder.write(pNode->iBlock[1]); oEncoder.write(pNode->iBlock[2]); oEncoder.write(pNode->iParcelId); oEncoder.write(static_cast(pNode->flags)); } oEncoder.finish(); oEncoder.pump_output(pWriter); } void level_map::depersist(lua_persist_reader *pReader) { new (this) level_map; // Call constructor lua_State *L = pReader->get_stack(); int iWidth, iHeight; integer_run_length_decoder oDecoder; uint32_t iVersion; if(!pReader->read_uint(iVersion)) return; if(iVersion != 4) { if(iVersion < 2 || iVersion == 128) { luaL_error(L, "TODO: Write code to load map data from earlier " "savegame versions (if really necessary)."); } else if(iVersion > 4) { luaL_error(L, "Cannot load savegame from a newer version."); } } if(!pReader->read_uint(player_count)) return; for(int i = 0; i < player_count; ++i) { if(!pReader->read_uint(initial_camera_x[i])) return; if(!pReader->read_uint(initial_camera_y[i])) return; if(!pReader->read_uint(heliport_x[i])) return; if(!pReader->read_uint(heliport_y[i])) return; } if(!pReader->read_uint(parcel_count)) return; delete[] plot_owner; plot_owner = new int[parcel_count]; for(int i = 0; i < parcel_count; ++i) { if(!pReader->read_uint(plot_owner[i])) return; } delete[] parcel_tile_counts; parcel_tile_counts = new int[parcel_count]; parcel_tile_counts[0] = 0; if(iVersion >= 3) { for(int i = 0; i < parcel_count; ++i) { if(!pReader->read_uint(parcel_tile_counts[i])) return; } } if(!pReader->read_uint(iWidth) || !pReader->read_uint(iHeight)) return; if(!set_size(iWidth, iHeight)) { pReader->set_error("Unable to set size while depersisting map"); return; } if(iVersion >= 4) { if(!pReader->read_uint(current_temperature_index)) return; } for(map_tile *pNode = cells, *pLimitNode = cells + width * height; pNode != pLimitNode; ++pNode) { uint32_t f; if(!pReader->read_uint(f)) return; pNode->flags = f; if(iVersion >= 4) { if(!pReader->read_uint(pNode->aiTemperature[0]) || !pReader->read_uint(pNode->aiTemperature[1])) return; } if(!pReader->read_stack_object()) return; pNode->next = (link_list*)lua_touserdata(L, -1); if(pNode->next) { if(pNode->next->prev != nullptr) std::fprintf(stderr, "Warning: THMap linked-lists are corrupted.\n"); pNode->next->prev = pNode; } lua_pop(L, 1); if(!pReader->read_stack_object()) return; pNode->oEarlyEntities.next = (link_list*)lua_touserdata(L, -1); if(pNode->oEarlyEntities.next) { if(pNode->oEarlyEntities.next->prev != nullptr) std::fprintf(stderr, "Warning: THMap linked-lists are corrupted.\n"); pNode->oEarlyEntities.next->prev = &pNode->oEarlyEntities; } lua_pop(L, 1); } oDecoder.initialise(6, pReader); for(map_tile *pNode = cells, *pLimitNode = cells + width * height; pNode != pLimitNode; ++pNode) { pNode->iBlock[0] = static_cast(oDecoder.read()); pNode->iBlock[1] = static_cast(oDecoder.read()); pNode->iBlock[2] = static_cast(oDecoder.read()); pNode->iBlock[3] = static_cast(oDecoder.read()); pNode->iParcelId = static_cast(oDecoder.read()); pNode->iRoomId = static_cast(oDecoder.read()); } oDecoder.initialise(5, pReader); for(map_tile *pNode = original_cells, *pLimitNode = original_cells + width * height; pNode != pLimitNode; ++pNode) { pNode->iBlock[0] = static_cast(oDecoder.read()); pNode->iBlock[1] = static_cast(oDecoder.read()); pNode->iBlock[2] = static_cast(oDecoder.read()); pNode->iParcelId = static_cast(oDecoder.read()); pNode->flags = oDecoder.read(); } if(iVersion < 3) { for(int i = 1; i < parcel_count; ++i) parcel_tile_counts[i] = get_parcel_tile_count(i); } } map_tile_iterator::map_tile_iterator() : tile(nullptr) , container(nullptr) , screen_offset_x(0) , screen_offset_y(0) , screen_width(0) , screen_height(0) { } map_tile_iterator::map_tile_iterator(const level_map* pMap, int iScreenX, int iScreenY, int iWidth, int iHeight, map_scanline_iterator_direction eScanlineDirection) : container(pMap) , screen_offset_x(iScreenX) , screen_offset_y(iScreenY) , screen_width(iWidth) , screen_height(iHeight) , scanline_count(0) , direction(eScanlineDirection) { if(direction == map_scanline_iterator_direction::forward) { base_x = 0; base_y = (iScreenY - 32) / 16; if(base_y < 0) base_y = 0; else if(base_y >= container->get_height()) { base_x = base_y - container->get_height() + 1; base_y = container->get_height() - 1; if(base_x >= container->get_width()) base_x = container->get_width() - 1; } } else { base_x = container->get_width() - 1; base_y = container->get_height() - 1; } world_x = base_x; world_y = base_y; advance_until_visible(); } map_tile_iterator& map_tile_iterator::operator ++ () { --world_y; ++world_x; advance_until_visible(); return *this; } void map_tile_iterator::advance_until_visible() { tile = nullptr; while(true) { x_relative_to_screen = world_x; y_relative_to_screen = world_y; container->world_to_screen(x_relative_to_screen, y_relative_to_screen); x_relative_to_screen -= screen_offset_x; y_relative_to_screen -= screen_offset_y; if(direction == map_scanline_iterator_direction::forward ? y_relative_to_screen >= screen_height + margin_bottom : y_relative_to_screen < -margin_top) { return; } if(direction == map_scanline_iterator_direction::forward ? (y_relative_to_screen > -margin_top) : (y_relative_to_screen < screen_height + margin_bottom)) { while(world_y >= 0 && world_x < container->get_width()) { if(x_relative_to_screen < -margin_left) { // Nothing to do } else if(x_relative_to_screen < screen_width + margin_right) { ++scanline_count; tile = container->get_tile_unchecked(world_x, world_y); return; } else break; --world_y; ++world_x; x_relative_to_screen += 64; } } scanline_count = 0; if(direction == map_scanline_iterator_direction::forward) { if(base_y == container->get_height() - 1) { if(++base_x == container->get_width()) break; } else ++base_y; } else { if(base_x == 0) { if(base_y == 0) break; else --base_y; } else --base_x; } world_x = base_x; world_y = base_y; } } bool map_tile_iterator::is_last_on_scanline() const { return world_y <= 0 || world_x + 1 >= container->get_width() || x_relative_to_screen + 64 >= screen_width + margin_right; } map_scanline_iterator::map_scanline_iterator() : tile_step(0) , x_step(0) , steps_taken(0) { } map_scanline_iterator::map_scanline_iterator(const map_tile_iterator& itrNodes, map_scanline_iterator_direction eDirection, int iXOffset, int iYOffset) : tile_step((static_cast(eDirection) - 1) * (1 - itrNodes.container->get_width())) , x_step((static_cast(eDirection) - 1) * 64) , steps_taken(0) { if(eDirection == map_scanline_iterator_direction::backward) { tile = itrNodes.tile; x_relative_to_screen = itrNodes.tile_x_position_on_screen(); } else { tile = itrNodes.tile - tile_step * (itrNodes.scanline_count - 1); x_relative_to_screen = itrNodes.tile_x_position_on_screen() - x_step * (itrNodes.scanline_count - 1); } x_relative_to_screen += iXOffset; y_relative_to_screen = itrNodes.tile_y_position_on_screen() + iYOffset; end_tile = tile + tile_step * itrNodes.scanline_count; first_tile = tile; } map_scanline_iterator& map_scanline_iterator::operator ++ () { tile += tile_step; x_relative_to_screen += x_step; steps_taken++; return *this; } //copies the members of the given THMapScanlineIterator and resets the tile member to the //first element. map_scanline_iterator map_scanline_iterator::operator= (const map_scanline_iterator &iterator) { tile = iterator.first_tile; end_tile = iterator.end_tile; x_relative_to_screen = iterator.x_relative_to_screen - iterator.steps_taken * iterator.x_step; y_relative_to_screen = iterator.y_relative_to_screen; x_step = iterator.x_step; tile_step = iterator.tile_step; return *this; } CorsixTH-0.63/CorsixTH/Src/th_map.h000066400000000000000000000517761347163623700170540ustar00rootroot00000000000000/* Copyright (c) 2009 Peter "Corsix" Cawley 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. */ #ifndef CORSIX_TH_TH_MAP_H_ #define CORSIX_TH_TH_MAP_H_ #include "th_gfx.h" #include #include /* Object type enumeration uses same values as original TH does. See game string table section 39 for proof. Section 1 also has names in this order. */ enum class object_type : uint8_t { no_object = 0, desk = 1, cabinet = 2, door = 3, bench = 4, table = 5, // Not in game chair = 6, drinks_machine = 7, bed = 8, inflator = 9, pool_table = 10, reception_desk = 11, b_table = 12, // Not in game? cardio = 13, scanner = 14, scanner_console = 15, screen = 16, litter_bomb = 17, couch = 18, sofa = 19, crash = 20, // The trolley in general diagnosis tv = 21, ultrascan = 22, dna_fixer = 23, cast_remover = 24, hair_restorer = 25, slicer = 26, xray = 27, radiation_shield = 28, xray_viewer = 29, op_table = 30, lamp = 31, // Not in game? sink = 32, op_sink1 = 33, op_sink2 = 34, surgeon_screen = 35, lecture_chair = 36, projector = 37, // 38 is unused pharmacy = 39, computer = 40, chemical_mixer = 41, blood_machine = 42, extinguisher = 43, radiator = 44, plant = 45, electro = 46, jelly_vat = 47, hell = 48, // 49 is unused bin = 50, loo = 51, double_door1 = 52, double_door2 = 53, decon_shower = 54, autopsy = 55, bookcase = 56, video_game = 57, entrance_left_door = 58, entrance_right_door = 59, skeleton = 60, comfy_chair = 61, litter = 62, helicopter = 63, rathole = 64, // 65 through 255 are unused }; //! Map flags and object type //! The point of storing the object type here is to allow pathfinding code //! to use object types as pathfinding goals. struct map_tile_flags { enum class key : uint32_t { passable_mask = 1 << 0, can_travel_n_mask = 1 << 1, can_travel_e_mask = 1 << 2, can_travel_s_mask = 1 << 3, can_travel_w_mask = 1 << 4, hospital_mask = 1 << 5, buildable_mask = 1 << 6, passable_if_not_for_blueprint_mask = 1 << 7, room_mask = 1 << 8, shadow_half_mask = 1 << 9, shadow_full_mask = 1 << 10, shadow_wall_mask = 1 << 11, door_north_mask = 1 << 12, door_west_mask = 1 << 13, do_not_idle_mask = 1 << 14, tall_north_mask = 1 << 15, tall_west_mask = 1 << 16, buildable_n_mask = 1 << 17, buildable_e_mask = 1 << 18, buildable_s_mask = 1 << 19, buildable_w_mask = 1 << 20, }; bool passable; //!< Pathfinding: Can walk on this tile bool can_travel_n; //!< Pathfinding: Can walk to the north bool can_travel_e; //!< Pathfinding: Can walk to the east bool can_travel_s; //!< Pathfinding: Can walk to the south bool can_travel_w; //!< Pathfinding: Can walk to the west bool hospital; //!< World: Tile is inside a hospital building bool buildable; //!< Player: Can build on this tile bool passable_if_not_for_blueprint; bool room; //!< World: Tile is inside a room bool shadow_half; //!< Rendering: Put block 75 over floor bool shadow_full; //!< Rendering: Put block 74 over floor bool shadow_wall; //!< Rendering: Put block 156 over east wall bool door_north; //!< World: Door on north wall of tile bool door_west; //!< World: Door on west wall of tile bool do_not_idle; //!< World: Humanoids should not idle on tile bool tall_north; //!< Shadows: Wall-like object on north wall bool tall_west; //!< Shadows: Wall-like object on west wall bool buildable_n; //!< Can build on the north side of the tile bool buildable_e; //!< Can build on the east side of the tile bool buildable_s; //!< Can build on the south side of the tile bool buildable_w; //!< Can build on the west side of the tile //! Convert the given uint32_t reprentation of the map_tile flags //! to a map_tile_flags instance. map_tile_flags& operator =(uint32_t raw); //! Get/set the flag with the given key bool& operator[] (map_tile_flags::key key); //! Get the flag with the given key const bool& operator[](map_tile_flags::key key) const; //! Convert map_tile_flags into it's uint32_t representation operator uint32_t() const; }; enum class temperature_theme { red, //!< Default warmth colouring (red gradients) multi_colour, //!< Different colours (blue, green, red) yellow_red //!< Gradients of yellow, orange, and red }; struct map_tile : public link_list { map_tile(); ~map_tile(); // Linked list for entities rendered at this tile // THLinkList::pPrev (will always be nullptr) // THLinkList::pNext //! Linked list for entities rendered in an early (right-to-left) pass link_list oEarlyEntities; //! Block tiles for rendering //! For each tile, the lower byte is the index in the sprite sheet, and the //! upper byte is for the drawing flags. //! Layer 0 is for the floor //! Layer 1 is for the north wall //! Layer 2 is for the west wall //! Layer 3 is for the UI //! NB: In Lua, layers are numbered 1 - 4 rather than 0 - 3 uint16_t iBlock[4]; //! Parcels (plots) of land have an ID, with each tile in the plot having //! that ID. Parcel 0 is the outside. uint16_t iParcelId; //! Rooms have an ID, with room #0 being the corridor (and the outside). uint16_t iRoomId; //! A value between 0 (extreme cold) and 65535 (extreme heat) representing //! the temperature of the tile. To allow efficient calculation of a tile's //! heat based on the previous tick's heat of the surrounding tiles, the //! previous temperature is also stored, with the array indices switching //! every tick. uint16_t aiTemperature[2]; //! Flags for information and object type map_tile_flags flags; //! objects in this tile std::list objects; }; class sprite_sheet; //! Prototype for object callbacks from THMap::loadFromTHFile /*! The callback function will receive 5 arguments: * The opaque pointer passed to THMap::loadFromTHFile (pCallbackToken). * The tile X/Y position of the object. * The object type. * The object flags present in the map data. The meaning of this value is left unspecified. */ typedef void (*map_load_object_callback_fn)(void*, int, int, object_type, uint8_t); class map_overlay; class level_map { public: level_map(); ~level_map(); bool set_size(int iWidth, int iHeight); bool load_blank(); bool load_from_th_file(const uint8_t* pData, size_t iDataLength, map_load_object_callback_fn fnObjectCallback, void* pCallbackToken); void save(std::string filename); //! Set the sprite sheet to be used for drawing the map /*! The sprites for map floor tiles, wall tiles, and map decorators all come from the given sheet. */ void set_block_sheet(sprite_sheet* pSheet); //! Set the draw flags on all wall blocks /*! This is typically called with THDF_Alpha50 to draw walls transparently, or with 0 to draw them opaque again. */ void set_all_wall_draw_flags(uint8_t iFlags); void update_pathfinding(); void update_shadows(); void set_temperature_display(temperature_theme eTempDisplay); inline temperature_theme get_temperature_display() const {return current_temperature_theme;} void update_temperatures(uint16_t iAirTemperature, uint16_t iRadiatorTemperature); //! Get the map width (in tiles) inline int get_width() const {return width;} //! Get the map height (in tiles) inline int get_height() const {return height;} //! Get the number of plots of land in this map inline int get_parcel_count() const {return parcel_count - 1;} inline int get_player_count() const {return player_count;} void set_player_count(int count); bool get_player_camera_tile(int iPlayer, int* pX, int* pY) const; bool get_player_heliport_tile(int iPlayer, int* pX, int* pY) const; void set_player_camera_tile(int iPlayer, int iX, int iY); void set_player_heliport_tile(int iPlayer, int iX, int iY); //! Get the number of tiles inside a given parcel int get_parcel_tile_count(int iParcelId) const; //! Change the owner of a particular parcel /*! \param iParcelId The parcel of land to change ownership of. Should be an integer between 1 and getParcelCount() inclusive (parcel 0 is the outside, and should never have its ownership changed). \param iOwner The number of the player who should own the parcel, or zero if no player should own the parcel. \return vSplitTiles A vector that contains tile coordinates where iParcelId is adjacent to another part of the hospital. */ std::vector> set_parcel_owner(int iParcelId, int iOwner); //! Get the owner of a particular parcel of land /*! \param iParcelId An integer between 0 and getParcelCount() inclusive. \return 0 if the parcel is unowned, otherwise the number of the owning player. */ int get_parcel_owner(int iParcelId) const; //! Query if two parcels are directly connected /*! \param iParcel1 An integer between 0 and getParcelCount() inclusive. \param iParcel2 An integer between 0 and getParcelCount() inclusive. \return true if there is a path between the two parcels which does not go into any other parcels. false otherwise. */ bool are_parcels_adjacent(int iParcel1, int iParcel2); //! Query if a given player is in a position to purchase a given parcel /*! \param iParcelId The parcel of land to query. Should be an integer between 1 and getParcelCount() inclusive. \param iPlayer The number of the player to perform the query on behalf of. Should be a strictly positive integer. \return true if the parcel has a door to the outside, or is directly connected to a parcel already owned by the given player. false otherwise. */ bool is_parcel_purchasable(int iParcelId, int iPlayer); //! Draw the map (and any attached animations) /*! Draws the world pixel rectangle (iScreenX, iScreenY, iWidth, iHeight) to the rectangle (iCanvasX, iCanvasY, iWidth, iHeight) on pCanvas. Note that world pixel co-ordinates are also known as absolute screen co-ordinates - they are not world (tile) co-ordinates, nor (relative) screen co-ordinates. */ void draw(render_target* pCanvas, int iScreenX, int iScreenY, int iWidth, int iHeight, int iCanvasX, int iCanvasY) const; //! Perform a hit-test against the animations attached to the map /*! If there is an animation at world pixel co-ordinates (iTestX, iTestY), then it is returned. Otherwise nullptr is returned. To perform a hit-test using world (tile) co-ordinates, get the tile itself and query the top 8 bits of map_tile::flags, or traverse the tile's animation lists. */ drawable* hit_test(int iTestX, int iTestY) const; // When using the unchecked versions, the map co-ordinates MUST be valid. // When using the normal versions, nullptr is returned for invalid co-ords. map_tile* get_tile(int iX, int iY); const map_tile* get_tile(int iX, int iY) const; const map_tile* get_original_tile(int iX, int iY) const; map_tile* get_tile_unchecked(int iX, int iY); const map_tile* get_tile_unchecked(int iX, int iY) const; const map_tile* get_original_tile_unchecked(int iX, int iY) const; uint16_t get_tile_temperature(const map_tile* pNode) const; int get_tile_owner(const map_tile* pNode) const; //! Convert world (tile) co-ordinates to absolute screen co-ordinates template static inline void world_to_screen(T& x, T& y) { T x_(x); x = (T)32 * (x_ - y); y = (T)16 * (x_ + y); } //! Convert absolute screen co-ordinates to world (tile) co-ordinates template static inline void screen_to_world(T& x, T& y) { T x_(x); x = y / (T)32 + x_ / (T)64; y = y / (T)32 - x_ / (T)64; } void persist(lua_persist_writer *pWriter) const; void depersist(lua_persist_reader *pReader); void set_overlay(map_overlay *pOverlay, bool bTakeOwnership); private: drawable* hit_test_drawables(link_list* pListStart, int iXs, int iYs, int iTestX, int iTestY) const; void read_tile_index(const uint8_t* pData, int& iX, int &iY) const; void write_tile_index(uint8_t* pData, int iX, int iY) const; //! Calculate a weighted impact of a neighbour tile on the temperature of the current tile. //! \param iNeighbourSum Incremented by the temperature of the tile multiplied by the weight of the connection. //! \param canTravel A tile flag indicating whether travel between this tile and it's neighbour is allowed. //! \param relative_idx The index of the neighbour tile, relative to this tile into cells. //! \param pNode A pointer to the current tile being tested. //! \param prevTemp The array index into map_tile::temperature that currently stores the temperature of the tile (prior to this calculation). //! \return The weight of the connection, 0 if there is no neighbour, 1 through walls, and 4 through air. uint32_t thermal_neighbour(uint32_t &iNeighbourSum, bool canTravel, std::ptrdiff_t relative_idx, map_tile* pNode, int prevTemp) const; //! Create the adjacency matrix if it doesn't already exist void make_adjacency_matrix(); //! Create the purchasability matrix if it doesn't already exist void make_purchase_matrix(); //! If it exists, update the purchasability matrix. void update_purchase_matrix(); int count_parcel_tiles(int iParcelId) const; map_tile* cells; map_tile* original_cells; // Cells at map load time, before any changes sprite_sheet* blocks; map_overlay* overlay; bool owns_overlay; int* plot_owner; // 0 for unowned, 1 for player 1, etc. int width; int height; int player_count; int initial_camera_x[4]; int initial_camera_y[4]; int heliport_x[4]; int heliport_y[4]; int parcel_count; int current_temperature_index; temperature_theme current_temperature_theme; int* parcel_tile_counts; // 2D symmetric array giving true if there is a path between two parcels // which doesn't go into any other parcels. bool* parcel_adjacency_matrix; // 4 by N matrix giving true if player can purchase parcel. bool* purchasable_matrix; }; enum class map_scanline_iterator_direction { forward = 2, backward = 0, }; //! Utility class for iterating over map tiles within a screen rectangle /*! To easily iterate over the map tiles which might draw something within a certain rectangle of screen space, an instance of this class can be used. By default, it iterates by scanline, top-to-bottom, and then left-to-right within each scanline. Alternatively, by passing ScanlineBackward to the constructor, it will iterate bottom-to-top. Within a scanline, to visit tiles right-to-left, wait until isLastOnScanline() returns true, then use an instance of THMapScanlineIterator. */ class map_tile_iterator { public: map_tile_iterator(); /*! @arg pMap The map whose tiles should be iterated @arg iScreenX The X co-ordinate of the top-left corner of the screen-space rectangle to iterate. @arg iScreenY The Y co-ordinate of the top-left corner of the screen-space rectangle to iterate. @arg iWidth The width of the screen-space rectangle to iterate. @arg iHeight The width of the screen-space rectangle to iterate. @arg eScanlineDirection The direction in which to iterate scanlines; forward for top-to-bottom, backward for bottom-to-top. */ map_tile_iterator(const level_map*pMap, int iScreenX, int iScreenY, int iWidth, int iHeight, map_scanline_iterator_direction eScanlineDirection = map_scanline_iterator_direction::forward); //! Returns false iff the iterator has exhausted its tiles inline operator bool () const {return tile != nullptr;} //! Advances the iterator to the next tile inline map_tile_iterator& operator ++ (); //! Accessor for the current tile inline const map_tile* operator -> () const {return tile;} //! Get the X position of the tile relative to the top-left corner of the screen-space rectangle inline int tile_x_position_on_screen() const {return x_relative_to_screen;} //! Get the Y position of the tile relative to the top-left corner of the screen-space rectangle inline int tile_y_position_on_screen() const {return y_relative_to_screen;} inline int tile_x() const {return world_x;} inline int tile_y() const {return world_y;} inline const level_map *get_map() {return container;} inline const map_tile *get_map_tile() {return tile;} inline int get_scanline_count() { return scanline_count;} inline int get_tile_step() {return (static_cast(direction) - 1) * (1 - container->get_width());} //! Returns true iff the next tile will be on a different scanline /*! To visit a scanline in right-to-left order, or to revisit a scanline, wait until this method returns true, then use a THMapScanlineIterator. */ inline bool is_last_on_scanline() const; private: // Maximum extents of the visible parts of a tile (pixel distances relative // to the top-most corner of an isometric cell) // If set too low, things will disappear when near the screen edge // If set too high, rendering will slow down static const int margin_top = 150; static const int margin_left = 110; static const int margin_right = 110; static const int margin_bottom = 150; friend class map_scanline_iterator; const map_tile* tile; const level_map* container; // TODO: Consider removing these, they are trivial to calculate int x_relative_to_screen; int y_relative_to_screen; const int screen_offset_x; const int screen_offset_y; const int screen_width; const int screen_height; int base_x; int base_y; int world_x; int world_y; int scanline_count; map_scanline_iterator_direction direction; void advance_until_visible(); }; //! Utility class for re-iterating a scanline visited by a map_tile_iterator class map_scanline_iterator { public: map_scanline_iterator(); /*! @arg itrNodes A tile iterator which has reached the end of a scanline @arg eDirection The direction in which to iterate the scanline; forward for left-to-right, backward for right-to-left. @arg iXOffset If given, values returned by x() will be offset by this. @arg iYOffset If given, values returned by y() will be offset by this. */ map_scanline_iterator(const map_tile_iterator& itrNodes, map_scanline_iterator_direction eDirection, int iXOffset = 0, int iYOffset = 0); inline operator bool () const {return tile != end_tile;} inline map_scanline_iterator& operator ++ (); inline const map_tile* operator -> () const {return tile;} inline int x() const {return x_relative_to_screen;} inline int y() const {return y_relative_to_screen;} inline const map_tile* get_next_tile() {return tile + tile_step;} inline const map_tile* get_previous_tile() { return tile - tile_step;} map_scanline_iterator operator= (const map_scanline_iterator &iterator); inline const map_tile* get_tile() {return tile;} private: const map_tile* tile; const map_tile* first_tile; const map_tile* end_tile; int tile_step; int x_step; int x_relative_to_screen; int y_relative_to_screen; int steps_taken; }; #endif // CORSIX_TH_TH_MAP_H_ CorsixTH-0.63/CorsixTH/Src/th_map_overlays.cpp000066400000000000000000000146201347163623700213160ustar00rootroot00000000000000/* Copyright (c) 2010 Peter "Corsix" Cawley 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. */ #include "th_map_overlays.h" #include "th_gfx.h" #include "th_map.h" #include map_overlay_pair::map_overlay_pair() { first = nullptr; second = nullptr; owns_first = false; owns_second = false; } map_overlay_pair::~map_overlay_pair() { set_first(nullptr, false); set_second(nullptr, false); } void map_overlay_pair::set_first(map_overlay* pOverlay, bool bTakeOwnership) { if(first && owns_first) delete first; first = pOverlay; owns_first = bTakeOwnership; } void map_overlay_pair::set_second(map_overlay* pOverlay, bool bTakeOwnership) { if(second && owns_second) delete second; second = pOverlay; owns_second = bTakeOwnership; } void map_overlay_pair::draw_cell(render_target* pCanvas, int iCanvasX, int iCanvasY, const level_map* pMap, int iNodeX, int iNodeY) { if(first) first->draw_cell(pCanvas, iCanvasX, iCanvasY, pMap, iNodeX, iNodeY); if(second) second->draw_cell(pCanvas, iCanvasX, iCanvasY, pMap, iNodeX, iNodeY); } map_text_overlay::map_text_overlay() { background_sprite = 0; } void map_text_overlay::set_background_sprite(size_t iSprite) { background_sprite = iSprite; } void map_text_overlay::draw_cell(render_target* pCanvas, int iCanvasX, int iCanvasY, const level_map* pMap, int iNodeX, int iNodeY) { if(sprites && background_sprite) { sprites->draw_sprite(pCanvas, background_sprite, iCanvasX, iCanvasY, 0); } if(font) { draw_text(pCanvas, iCanvasX, iCanvasY, get_text(pMap, iNodeX, iNodeY)); } } const std::string map_positions_overlay::get_text(const level_map* pMap, int iNodeX, int iNodeY) { std::ostringstream str; str << iNodeX + 1 << ',' << iNodeY + 1; return str.str(); } map_typical_overlay::map_typical_overlay() { sprites = nullptr; font = nullptr; owns_sprites = false; owns_font = false; } map_typical_overlay::~map_typical_overlay() { set_sprites(nullptr, false); set_font(nullptr, false); } void map_flags_overlay::draw_cell(render_target* pCanvas, int iCanvasX, int iCanvasY, const level_map* pMap, int iNodeX, int iNodeY) { const map_tile *pNode = pMap->get_tile(iNodeX, iNodeY); if(!pNode) return; if(sprites) { if(pNode->flags.passable) sprites->draw_sprite(pCanvas, 3, iCanvasX, iCanvasY, 0); if(pNode->flags.hospital) sprites->draw_sprite(pCanvas, 8, iCanvasX, iCanvasY, 0); if(pNode->flags.buildable) sprites->draw_sprite(pCanvas, 9, iCanvasX, iCanvasY, 0); if(pNode->flags.can_travel_n && pMap->get_tile(iNodeX, iNodeY - 1)->flags.passable) { sprites->draw_sprite(pCanvas, 4, iCanvasX, iCanvasY, 0); } if(pNode->flags.can_travel_e && pMap->get_tile(iNodeX + 1, iNodeY)->flags.passable) { sprites->draw_sprite(pCanvas, 5, iCanvasX, iCanvasY, 0); } if(pNode->flags.can_travel_s && pMap->get_tile(iNodeX, iNodeY + 1)->flags.passable) { sprites->draw_sprite(pCanvas, 6, iCanvasX, iCanvasY, 0); } if(pNode->flags.can_travel_w && pMap->get_tile(iNodeX - 1, iNodeY)->flags.passable) { sprites->draw_sprite(pCanvas, 7, iCanvasX, iCanvasY, 0); } } if(font) { if(!pNode->objects.empty()) { std::ostringstream str; str << 'T' << static_cast(pNode->objects.front()); draw_text(pCanvas, iCanvasX, iCanvasY - 8, str.str()); } if(pNode->iRoomId) { std::ostringstream str; str << 'R' << static_cast(pNode->iRoomId); draw_text(pCanvas, iCanvasX, iCanvasY + 8, str.str()); } } } void map_parcels_overlay::draw_cell(render_target* pCanvas, int iCanvasX, int iCanvasY, const level_map* pMap, int iNodeX, int iNodeY) { const map_tile *pNode = pMap->get_tile(iNodeX, iNodeY); if(!pNode) return; if(font) draw_text(pCanvas, iCanvasX, iCanvasY, std::to_string((int)pNode->iParcelId)); if(sprites) { uint16_t iParcel = pNode->iParcelId; #define DIR(dx, dy, sprite) \ pNode = pMap->get_tile(iNodeX + dx, iNodeY + dy); \ if(!pNode || pNode->iParcelId != iParcel) \ sprites->draw_sprite(pCanvas, sprite, iCanvasX, iCanvasY, 0) DIR( 0, -1, 18); DIR( 1, 0, 19); DIR( 0, 1, 20); DIR(-1, 0, 21); #undef DIR } } void map_typical_overlay::draw_text(render_target* pCanvas, int iX, int iY, std::string str) { text_layout oArea = font->get_text_dimensions(str.c_str(), str.length()); font->draw_text(pCanvas, str.c_str(), str.length(), iX + (64 - oArea.end_x) / 2, iY + (32 - oArea.end_y) / 2); } void map_typical_overlay::set_sprites(sprite_sheet* pSheet, bool bTakeOwnership) { if(sprites && owns_sprites) delete sprites; sprites = pSheet; owns_sprites = bTakeOwnership; } void map_typical_overlay::set_font(::font* font, bool take_ownership) { if(this->font && owns_font) delete this->font; this->font = font; owns_font = take_ownership; } CorsixTH-0.63/CorsixTH/Src/th_map_overlays.h000066400000000000000000000065631347163623700207720ustar00rootroot00000000000000/* Copyright (c) 2010 Peter "Corsix" Cawley 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. */ #ifndef CORSIX_TH_TH_MAP_OVERLAYS_H_ #define CORSIX_TH_TH_MAP_OVERLAYS_H_ #include #include class font; class level_map; class render_target; class sprite_sheet; class map_overlay { public: virtual ~map_overlay() = default; virtual void draw_cell(render_target* pCanvas, int iCanvasX, int iCanvasY, const level_map* pMap, int iNodeX, int iNodeY) = 0; }; class map_overlay_pair : public map_overlay { public: map_overlay_pair(); virtual ~map_overlay_pair(); void set_first(map_overlay* pOverlay, bool bTakeOwnership); void set_second(map_overlay* pOverlay, bool bTakeOwnership); void draw_cell(render_target* pCanvas, int iCanvasX, int iCanvasY, const level_map* pMap, int iNodeX, int iNodeY) override; private: map_overlay *first, *second; bool owns_first, owns_second; }; class map_typical_overlay : public map_overlay { public: map_typical_overlay(); virtual ~map_typical_overlay(); void set_sprites(sprite_sheet* pSheet, bool bTakeOwnership); void set_font(::font* font, bool take_ownership); protected: void draw_text(render_target* pCanvas, int iX, int iY, std::string str); sprite_sheet* sprites; ::font* font; private: bool owns_sprites; bool owns_font; }; class map_text_overlay : public map_typical_overlay { public: map_text_overlay(); virtual ~map_text_overlay() = default; virtual void draw_cell(render_target* pCanvas, int iCanvasX, int iCanvasY, const level_map* pMap, int iNodeX, int iNodeY); void set_background_sprite(size_t iSprite); virtual const std::string get_text(const level_map* pMap, int iNodeX, int iNodeY) = 0; private: size_t background_sprite; }; class map_positions_overlay final : public map_text_overlay { public: const std::string get_text(const level_map* pMap, int iNodeX, int iNodeY) override; }; class map_flags_overlay final : public map_typical_overlay { public: void draw_cell(render_target* pCanvas, int iCanvasX, int iCanvasY, const level_map* pMap, int iNodeX, int iNodeY) override; }; class map_parcels_overlay final : public map_typical_overlay { public: void draw_cell(render_target* pCanvas, int iCanvasX, int iCanvasY, const level_map* pMap, int iNodeX, int iNodeY) override; }; #endif CorsixTH-0.63/CorsixTH/Src/th_movie.cpp000066400000000000000000000756351347163623700177510ustar00rootroot00000000000000/* Copyright (c) 2012 Stephen Baker 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. */ #include "th_movie.h" #include "config.h" #include "lua_sdl.h" #if (defined(CORSIX_TH_USE_FFMPEG) || defined(CORSIX_TH_USE_LIBAV)) && defined(CORSIX_TH_USE_SDL_MIXER) #include "th_gfx.h" extern "C" { #include #include #include #include #include #if (defined(CORSIX_TH_USE_LIBAV) && LIBAVUTIL_VERSION_INT >= AV_VERSION_INT(54, 6, 0)) || \ (defined(CORSIX_TH_USE_FFMPEG) && LIBAVUTIL_VERSION_INT >= AV_VERSION_INT(51, 63, 100)) #include #endif } #include #include #include #include #if (defined(CORSIX_TH_USE_LIBAV) && LIBAVCODEC_VERSION_INT < AV_VERSION_INT(57, 7, 0)) || \ (defined(CORSIX_TH_USE_FFMPEG) && LIBAVCODEC_VERSION_INT < AV_VERSION_INT(57, 12, 100)) #define av_packet_unref av_free_packet #endif #if (defined(CORSIX_TH_USE_LIBAV) && LIBAVCODEC_VERSION_INT < AV_VERSION_INT(55, 28, 1)) || \ (defined(CORSIX_TH_USE_FFMPEG) && LIBAVCODEC_VERSION_INT < AV_VERSION_INT(55, 45, 101)) #define av_frame_alloc avcodec_alloc_frame #define av_frame_unref avcodec_get_frame_defaults #define av_frame_free avcodec_free_frame #endif #if (defined(CORSIX_TH_USE_LIBAV) && LIBAVCODEC_VERSION_INT < AV_VERSION_INT(55, 52, 0)) || \ (defined(CORSIX_TH_USE_FFMPEG) && LIBAVCODEC_VERSION_INT < AV_VERSION_INT(55, 63, 100)) void avcodec_free_context(AVCodecContext** ctx) { avcodec_close(*ctx); av_free(*ctx); } #endif static void th_movie_audio_callback(int iChannel, void *pStream, int iStreamSize, void *pUserData) { movie_player *pMovie = (movie_player *)pUserData; pMovie->copy_audio_to_stream((uint8_t*)pStream, iStreamSize); } movie_picture::movie_picture(): buffer(nullptr), pixel_format(AV_PIX_FMT_RGB24), mutex{} {} movie_picture::~movie_picture() { av_freep(&buffer); } void movie_picture::allocate(int iWidth, int iHeight) { width = iWidth; height = iHeight; av_freep(&buffer); #if (defined(CORSIX_TH_USE_LIBAV) && LIBAVUTIL_VERSION_INT >= AV_VERSION_INT(54, 6, 0)) || \ (defined(CORSIX_TH_USE_FFMPEG) && LIBAVUTIL_VERSION_INT >= AV_VERSION_INT(51, 63, 100)) int numBytes = av_image_get_buffer_size(pixel_format, width, height, 1); #else int numBytes = avpicture_get_size(pixel_format, width, height); #endif buffer = static_cast(av_mallocz(numBytes)); } void movie_picture::deallocate() { av_freep(&buffer); } movie_picture_buffer::movie_picture_buffer(): aborting(false), allocated(false), picture_count(0), read_index(0), write_index(0), sws_context(nullptr), texture(nullptr), mutex{}, cond{} { } movie_picture_buffer::~movie_picture_buffer() { sws_freeContext(sws_context); if (texture) { SDL_DestroyTexture(texture); texture = nullptr; } } void movie_picture_buffer::abort() { aborting = true; std::lock_guard lock(mutex); cond.notify_all(); } void movie_picture_buffer::reset() { aborting = false; } void movie_picture_buffer::allocate(SDL_Renderer *pRenderer, int iWidth, int iHeight) { if (texture) { SDL_DestroyTexture(texture); std::cerr << "movie_player overlay should be deallocated before being allocated!\n"; } texture = SDL_CreateTexture(pRenderer, SDL_PIXELFORMAT_RGB24, SDL_TEXTUREACCESS_STREAMING, iWidth, iHeight); if (texture == nullptr) { std::cerr << "Problem creating overlay: " << SDL_GetError() << "\n"; return; } for(int i = 0; i < picture_buffer_size; i++) { picture_queue[i].allocate(iWidth, iHeight); } // Do not change write_index, it's used by the other thread. // read_index is only used in this thread. read_index = write_index; std::lock_guard lock(mutex); picture_count = 0; allocated = true; cond.notify_one(); } void movie_picture_buffer::deallocate() { { std::lock_guard lock(mutex); allocated = false; } for(int i = 0; i < picture_buffer_size; i++) { std::lock_guard pictureLock(picture_queue[i].mutex); picture_queue[i].deallocate(); } if (texture) { SDL_DestroyTexture(texture); texture = nullptr; } } bool movie_picture_buffer::advance() { if(empty()) { return false; } read_index++; if(read_index == picture_buffer_size) { read_index = 0; } std::lock_guard lock(mutex); picture_count--; cond.notify_one(); return true; } void movie_picture_buffer::draw(SDL_Renderer *pRenderer, const SDL_Rect &dstrect) { if(!empty()) { auto cur_pic = &(picture_queue[read_index]); std::lock_guard pictureLock(cur_pic->mutex); if (cur_pic->buffer) { SDL_UpdateTexture(texture, nullptr, cur_pic->buffer, cur_pic->width * 3); int iError = SDL_RenderCopy(pRenderer, texture, nullptr, &dstrect); if (iError < 0) { std::cerr << "Error displaying movie frame: " << SDL_GetError() << "\n"; } } } } double movie_picture_buffer::get_next_pts() { double nextPts; std::lock_guard lock(mutex); if(!allocated || picture_count < 2) { nextPts = 0; } else { nextPts = picture_queue[(read_index + 1) % picture_buffer_size].pts; } return nextPts; } bool movie_picture_buffer::empty() { std::lock_guard lock(mutex); return (!allocated || picture_count == 0); } bool movie_picture_buffer::full() { std::lock_guard lock(mutex); return unsafe_full(); } bool movie_picture_buffer::unsafe_full() { return (!allocated || picture_count == picture_buffer_size); } int movie_picture_buffer::write(AVFrame* pFrame, double dPts) { movie_picture* pMoviePicture = nullptr; std::unique_lock picBufLock(mutex); while(unsafe_full() && !aborting) { cond.wait(picBufLock); } picBufLock.unlock(); if(aborting) { return -1; } pMoviePicture = &picture_queue[write_index]; std::unique_lock pictureLock(pMoviePicture->mutex); if(pMoviePicture->buffer) { sws_context = sws_getCachedContext(sws_context, pFrame->width, pFrame->height, (AVPixelFormat)pFrame->format, pMoviePicture->width, pMoviePicture->height, pMoviePicture->pixel_format, SWS_BICUBIC, nullptr, nullptr, nullptr); if(sws_context == nullptr) { std::cerr << "Failed to initialize SwsContext\n"; return 1; } /* Allocate a new frame and buffer for the destination RGB24 data. */ AVFrame *pFrameRGB = av_frame_alloc(); #if (defined(CORSIX_TH_USE_LIBAV) && LIBAVUTIL_VERSION_INT >= AV_VERSION_INT(54, 6, 0)) || \ (defined(CORSIX_TH_USE_FFMPEG) && LIBAVUTIL_VERSION_INT >= AV_VERSION_INT(51, 63, 100)) av_image_fill_arrays(pFrameRGB->data, pFrameRGB->linesize, pMoviePicture->buffer, pMoviePicture->pixel_format, pMoviePicture->width, pMoviePicture->height, 1); #else avpicture_fill((AVPicture *)pFrameRGB, pMoviePicture->buffer, pMoviePicture->pixel_format, pMoviePicture->width, pMoviePicture->height); #endif /* Rescale the frame data and convert it to RGB24. */ sws_scale(sws_context, pFrame->data, pFrame->linesize, 0, pFrame->height, pFrameRGB->data, pFrameRGB->linesize); av_frame_free(&pFrameRGB); pMoviePicture->pts = dPts; pictureLock.unlock(); write_index++; if(write_index == picture_buffer_size) { write_index = 0; } picBufLock.lock(); picture_count++; picBufLock.unlock(); } return 0; } av_packet_queue::av_packet_queue(): first_packet(nullptr), last_packet(nullptr), count(0), mutex{}, cond{} { } av_packet_queue::~av_packet_queue() { } int av_packet_queue::get_count() const { return count; } void av_packet_queue::push(AVPacket *pPacket) { #if (defined(CORSIX_TH_USE_LIBAV) && LIBAVCODEC_VERSION_INT < AV_VERSION_INT(57, 8, 0)) || \ (defined(CORSIX_TH_USE_FFMPEG) && LIBAVCODEC_VERSION_INT < AV_VERSION_INT(57, 12, 100)) if(av_dup_packet(pPacket) < 0) { throw -1; } #endif AVPacketList* pNode = (AVPacketList*)av_malloc(sizeof(AVPacketList)); pNode->pkt = *pPacket; pNode->next = nullptr; std::lock_guard lock(mutex); if(last_packet == nullptr) { first_packet = pNode; } else { last_packet->next = pNode; } last_packet = pNode; count++; cond.notify_one(); } AVPacket* av_packet_queue::pull(bool fBlock) { std::unique_lock lock(mutex); AVPacketList* pNode = first_packet; if(pNode == nullptr && fBlock) { cond.wait(lock); pNode = first_packet; } AVPacket *pPacket; if(pNode == nullptr) { pPacket = nullptr; } else { first_packet = pNode->next; if(first_packet == nullptr) { last_packet = nullptr; } count--; pPacket = (AVPacket*)av_malloc(sizeof(AVPacket)); *pPacket = pNode->pkt; av_free(pNode); } return pPacket; } void av_packet_queue::release() { std::lock_guard lock(mutex); cond.notify_all(); } movie_player::movie_player(): renderer(nullptr), last_error(), format_context(nullptr), video_codec_context(nullptr), audio_codec_context(nullptr), video_queue(nullptr), audio_queue(nullptr), movie_picture_buffer(new ::movie_picture_buffer()), audio_resample_context(nullptr), audio_buffer_size(0), audio_buffer_max_size(0), audio_packet(nullptr), audio_frame(nullptr), empty_audio_chunk(nullptr), audio_channel(-1), stream_thread{}, video_thread{}, decoding_audio_mutex{} { #if defined(CORSIX_TH_USE_LIBAV) || \ (defined(CORSIX_TH_USE_FFMPEG) && LIBAVCODEC_VERSION_INT < AV_VERSION_INT(58, 9, 100)) av_register_all(); #endif flush_packet = (AVPacket*)av_malloc(sizeof(AVPacket)); av_init_packet(flush_packet); flush_packet->data = (uint8_t *)"FLUSH"; flush_packet->size = 5; audio_chunk_buffer = (uint8_t*)std::calloc(audio_chunk_buffer_capacity, sizeof(uint8_t)); } movie_player::~movie_player() { unload(); av_packet_unref(flush_packet); av_free(flush_packet); free(audio_chunk_buffer); delete movie_picture_buffer; } void movie_player::set_renderer(SDL_Renderer *pRenderer) { renderer = pRenderer; } bool movie_player::movies_enabled() const { return true; } bool movie_player::load(const char* szFilepath) { int iError = 0; AVCodec* m_pVideoCodec; AVCodec* m_pAudioCodec; unload(); //Unload any currently loaded video to free memory aborting = false; iError = avformat_open_input(&format_context, szFilepath, nullptr, nullptr); if(iError < 0) { av_strerror(iError, error_buffer, movie_error_buffer_capacity); last_error = std::string(error_buffer); return false; } iError = avformat_find_stream_info(format_context, nullptr); if(iError < 0) { av_strerror(iError, error_buffer, movie_error_buffer_capacity); last_error = std::string(error_buffer); return false; } video_stream_index = av_find_best_stream(format_context, AVMEDIA_TYPE_VIDEO, -1, -1, &m_pVideoCodec, 0); if (video_stream_index < 0) { av_strerror(video_stream_index, error_buffer, movie_error_buffer_capacity); last_error = std::string(error_buffer); return false; } video_codec_context = get_codec_context_for_stream(m_pVideoCodec, format_context->streams[video_stream_index]); avcodec_open2(video_codec_context, m_pVideoCodec, nullptr); audio_stream_index = av_find_best_stream(format_context, AVMEDIA_TYPE_AUDIO, -1, -1, &m_pAudioCodec, 0); if(audio_stream_index >= 0) { audio_codec_context = get_codec_context_for_stream(m_pAudioCodec, format_context->streams[audio_stream_index]); avcodec_open2(audio_codec_context, m_pAudioCodec, nullptr); } return true; } AVCodecContext* movie_player::get_codec_context_for_stream(AVCodec* codec, AVStream* stream) const { #if (defined(CORSIX_TH_USE_LIBAV) && LIBAVCODEC_VERSION_INT >= AV_VERSION_INT(57, 14, 0)) || \ (defined(CORSIX_TH_USE_FFMPEG) && LIBAVCODEC_VERSION_INT >= AV_VERSION_INT(57, 33, 100)) AVCodecContext* ctx = avcodec_alloc_context3(codec); avcodec_parameters_to_context(ctx, stream->codecpar); return ctx; #else return stream->codec; #endif } void movie_player::unload() { aborting = true; if(audio_queue) { audio_queue->release(); } if(video_queue) { video_queue->release(); } movie_picture_buffer->abort(); if(stream_thread.joinable()) { stream_thread.join(); } if(video_thread.joinable()) { video_thread.join(); } //wait until after other threads are closed to clear the packet queues //so we don't free something being used. if(audio_queue) { while(audio_queue->get_count() > 0) { AVPacket* p = audio_queue->pull(false); av_packet_unref(p); av_free(p); } delete audio_queue; audio_queue = nullptr; } if(video_queue) { while(video_queue->get_count() > 0) { AVPacket* p = video_queue->pull(false); av_packet_unref(p); av_free(p); } delete video_queue; video_queue = nullptr; } movie_picture_buffer->deallocate(); #if (defined(CORSIX_TH_USE_LIBAV) && LIBAVCODEC_VERSION_INT >= AV_VERSION_INT(57, 14, 0)) || \ (defined(CORSIX_TH_USE_FFMPEG) && LIBAVCODEC_VERSION_INT >= AV_VERSION_INT(57, 33, 100)) if(video_codec_context) { avcodec_free_context(&video_codec_context); video_codec_context = nullptr; } #endif if(audio_channel >= 0) { Mix_UnregisterAllEffects(audio_channel); Mix_HaltChannel(audio_channel); Mix_FreeChunk(empty_audio_chunk); audio_channel = -1; } std::lock_guard audioLock(decoding_audio_mutex); if(audio_buffer_max_size > 0) { av_free(audio_buffer); audio_buffer_max_size = 0; } #if (defined(CORSIX_TH_USE_LIBAV) && LIBAVCODEC_VERSION_INT >= AV_VERSION_INT(57, 14, 0)) || \ (defined(CORSIX_TH_USE_FFMPEG) && LIBAVCODEC_VERSION_INT >= AV_VERSION_INT(57, 33, 100)) if(audio_codec_context) { avcodec_free_context(&audio_codec_context); audio_codec_context = nullptr; } #endif av_frame_free(&audio_frame); #ifdef CORSIX_TH_USE_FFMPEG swr_free(&audio_resample_context); #elif defined(CORSIX_TH_USE_LIBAV) // avresample_free doesn't skip nullptr on it's own. if (audio_resample_context != nullptr) { avresample_free(&audio_resample_context); audio_resample_context = nullptr; } #endif if(audio_packet) { audio_packet->data = audio_packet_data; audio_packet->size = audio_packet_size; av_packet_unref(audio_packet); av_free(audio_packet); audio_packet = nullptr; audio_packet_data = nullptr; audio_packet_size = 0; } if(format_context) { avformat_close_input(&format_context); } } void movie_player::play(int iChannel) { if(!renderer) { last_error = std::string("Cannot play before setting the renderer"); return; } video_queue = new av_packet_queue(); movie_picture_buffer->reset(); movie_picture_buffer->allocate(renderer, video_codec_context->width, video_codec_context->height); audio_packet = nullptr; audio_packet_size = 0; audio_packet_data = nullptr; audio_buffer_size = 0; audio_buffer_index = 0; audio_buffer_max_size = 0; audio_queue = new av_packet_queue(); current_sync_pts = 0; current_sync_pts_system_time = SDL_GetTicks(); if(audio_stream_index >= 0) { Mix_QuerySpec(&mixer_frequency, nullptr, &mixer_channels); #ifdef CORSIX_TH_USE_FFMPEG audio_resample_context = swr_alloc_set_opts( audio_resample_context, mixer_channels==1?AV_CH_LAYOUT_MONO:AV_CH_LAYOUT_STEREO, AV_SAMPLE_FMT_S16, mixer_frequency, audio_codec_context->channel_layout, audio_codec_context->sample_fmt, audio_codec_context->sample_rate, 0, nullptr); swr_init(audio_resample_context); #elif defined(CORSIX_TH_USE_LIBAV) audio_resample_context = avresample_alloc_context(); av_opt_set_int(audio_resample_context, "in_channel_layout", audio_codec_context->channel_layout, 0); av_opt_set_int(audio_resample_context, "out_channel_layout", mixer_channels == 1 ? AV_CH_LAYOUT_MONO : AV_CH_LAYOUT_STEREO, 0); av_opt_set_int(audio_resample_context, "in_sample_rate", audio_codec_context->sample_rate, 0); av_opt_set_int(audio_resample_context, "out_sample_rate", mixer_frequency, 0); av_opt_set_int(audio_resample_context, "in_sample_fmt", audio_codec_context->sample_fmt, 0); av_opt_set_int(audio_resample_context, "out_sample_fmt", AV_SAMPLE_FMT_S16, 0); avresample_open(audio_resample_context); #endif empty_audio_chunk = Mix_QuickLoad_RAW(audio_chunk_buffer, audio_chunk_buffer_capacity); audio_channel = Mix_PlayChannel(iChannel, empty_audio_chunk, -1); if(audio_channel < 0) { audio_channel = -1; last_error = std::string(Mix_GetError()); Mix_FreeChunk(empty_audio_chunk); } else { Mix_RegisterEffect(audio_channel, th_movie_audio_callback, nullptr, this); } } stream_thread = std::thread(&movie_player::read_streams, this); video_thread = std::thread(&movie_player::run_video, this); } void movie_player::stop() { aborting = true; } int movie_player::get_native_height() const { int iHeight = 0; if(video_codec_context) { iHeight = video_codec_context->height; } return iHeight; } int movie_player::get_native_width() const { int iWidth = 0; if(video_codec_context) { iWidth = video_codec_context->width; } return iWidth; } bool movie_player::has_audio_track() const { return (audio_stream_index >= 0); } const char* movie_player::get_last_error() const { return last_error.c_str(); } void movie_player::clear_last_error() { last_error.clear(); } void movie_player::refresh(const SDL_Rect &destination_rect) { SDL_Rect dest_rect; dest_rect = SDL_Rect{ destination_rect.x, destination_rect.y, destination_rect.w, destination_rect.h }; if(!movie_picture_buffer->empty()) { double dCurTime = SDL_GetTicks() - current_sync_pts_system_time + current_sync_pts * 1000.0; double dNextPts = movie_picture_buffer->get_next_pts(); if(dNextPts > 0 && dNextPts * 1000.0 <= dCurTime) { movie_picture_buffer->advance(); } movie_picture_buffer->draw(renderer, dest_rect); } } void movie_player::allocate_picture_buffer() { if(!video_codec_context) { return; } movie_picture_buffer->allocate(renderer, get_native_width(), get_native_height()); } void movie_player::deallocate_picture_buffer() { movie_picture_buffer->deallocate(); } void movie_player::read_streams() { AVPacket packet; int iError; while(!aborting) { iError = av_read_frame(format_context, &packet); if(iError < 0) { if(iError == AVERROR_EOF || format_context->pb->error || format_context->pb->eof_reached) { break; } } else { if(packet.stream_index == video_stream_index) { video_queue->push(&packet); } else if (packet.stream_index == audio_stream_index) { audio_queue->push(&packet); } else { av_packet_unref(&packet); } } } while(!aborting) { if(video_queue->get_count() == 0 && audio_queue->get_count() == 0 && movie_picture_buffer->get_next_pts() == 0) { break; } std::this_thread::sleep_for(std::chrono::milliseconds(10)); } SDL_Event endEvent; endEvent.type = SDL_USEREVENT_MOVIE_OVER; SDL_PushEvent(&endEvent); aborting = true; } void movie_player::run_video() { AVFrame *pFrame = av_frame_alloc(); double dClockPts; int iError; while(!aborting) { av_frame_unref(pFrame); #ifdef CORSIX_TH_MOVIE_USE_SEND_PACKET_API iError = get_frame(video_stream_index, pFrame); if (iError == AVERROR_EOF) { break; } else if (iError < 0) { std::cerr << "Unexpected error " << iError << " while decoding video packet" << std::endl; break; } #else iError = get_video_frame(pFrame); if(iError < 0) { break; } else if(iError == 0) { continue; } #endif dClockPts = get_presentation_time_for_frame(pFrame, video_stream_index); iError = movie_picture_buffer->write(pFrame, dClockPts); if(iError < 0) { break; } } avcodec_flush_buffers(video_codec_context); av_frame_free(&pFrame); } double movie_player::get_presentation_time_for_frame(AVFrame* frame, int streamIndex) const { int64_t pts; #ifdef CORSIX_TH_USE_LIBAV pts = frame->pts; if (pts == AV_NOPTS_VALUE) { pts = frame->pkt_dts; } #else #if LIBAVCODEC_VERSION_INT < AV_VERSION_INT(54, 18, 100) pts = *(int64_t*)av_opt_ptr(avcodec_get_frame_class(), frame, "best_effort_timestamp"); #elif LIBAVCODEC_VERSION_INT < AV_VERSION_INT(58, 18, 100) pts = av_frame_get_best_effort_timestamp(frame); #else pts = frame->best_effort_timestamp; #endif //LIBAVCODEC_VERSION_INT #endif //CORSIX_T_USE_LIBAV if (pts == AV_NOPTS_VALUE) { pts = 0; } return pts * av_q2d(format_context->streams[streamIndex]->time_base); } #ifdef CORSIX_TH_MOVIE_USE_SEND_PACKET_API int movie_player::get_frame(int stream, AVFrame* pFrame) { int iError = AVERROR(EAGAIN); AVCodecContext* ctx; av_packet_queue* pq; if (stream == video_stream_index) { ctx = video_codec_context; pq = video_queue; } else if (stream == audio_stream_index) { ctx = audio_codec_context; pq = audio_queue; } else { throw std::invalid_argument("Invalid value provided for stream"); } while (iError == AVERROR(EAGAIN)) { iError = avcodec_receive_frame(ctx, pFrame); if (iError == AVERROR(EAGAIN)) { AVPacket* pkt = pq->pull(true); int res = avcodec_send_packet(ctx, pkt); if (pkt != nullptr) { av_packet_unref(pkt); av_free(pkt); } if (res == AVERROR(EAGAIN)) { throw std::runtime_error("avcodec_receive_frame and avcodec_send_packet should not return EAGAIN at the same time"); } } } return iError; } #else int movie_player::get_video_frame(AVFrame *pFrame) { int iGotPicture = 0; int iError; AVPacket *pPacket = video_queue->pull(true); if(pPacket == nullptr) { return -1; } if(pPacket->data == flush_packet->data) { //TODO: Flush return 0; } iError = avcodec_decode_video2(video_codec_context, pFrame, &iGotPicture, pPacket); av_packet_unref(pPacket); av_free(pPacket); if(iError < 0) { return 0; } if(iGotPicture) { iError = 1; return iError; } return 0; } #endif void movie_player::copy_audio_to_stream(uint8_t *pbStream, int iStreamSize) { std::lock_guard audioLock(decoding_audio_mutex); bool fFirst = true; while(iStreamSize > 0 && !aborting) { if(audio_buffer_index >= audio_buffer_size) { int iAudioSize = decode_audio_frame(fFirst); fFirst = false; if(iAudioSize <= 0) { std::memset(audio_buffer, 0, audio_buffer_size); } else { audio_buffer_size = iAudioSize; } audio_buffer_index = 0; } int iCopyLength = audio_buffer_size - audio_buffer_index; if(iCopyLength > iStreamSize) { iCopyLength = iStreamSize; } std::memcpy(pbStream, (uint8_t *)audio_buffer + audio_buffer_index, iCopyLength); iStreamSize -= iCopyLength; pbStream += iCopyLength; audio_buffer_index += iCopyLength; } } int movie_player::decode_audio_frame(bool fFirst) { #ifdef CORSIX_TH_MOVIE_USE_SEND_PACKET_API if (!audio_frame) { audio_frame = av_frame_alloc(); } else { av_frame_unref(audio_frame); } int iError = get_frame(audio_stream_index, audio_frame); if (iError == AVERROR_EOF) { return 0; } else if (iError < 0) { std::cerr << "Unexpected error " << iError << " while decoding audio packet" << std::endl; return 0; } double dClockPts = get_presentation_time_for_frame(audio_frame, audio_stream_index); current_sync_pts = dClockPts; current_sync_pts_system_time = SDL_GetTicks(); #else int iGotFrame = 0; bool fNewPacket = false; bool fFlushComplete = false; while(!iGotFrame && !aborting) { if(!audio_packet || audio_packet->size == 0) { if(audio_packet) { audio_packet->data = audio_packet_data; audio_packet->size = audio_packet_size; av_packet_unref(audio_packet); av_free(audio_packet); audio_packet = nullptr; } audio_packet = audio_queue->pull(true); if(aborting) { break; } audio_packet_data = audio_packet->data; audio_packet_size = audio_packet->size; if(audio_packet == nullptr) { fNewPacket = false; return -1; } fNewPacket = true; if(audio_packet->data == flush_packet->data) { avcodec_flush_buffers(audio_codec_context); fFlushComplete = false; } } if(fFirst) { int64_t iStreamPts = audio_packet->pts; if(iStreamPts != AV_NOPTS_VALUE) { //There is a time_base in audio_codec_context too, but that one is wrong. double dClockPts = iStreamPts * av_q2d(format_context->streams[audio_stream_index]->time_base); current_sync_pts = dClockPts; current_sync_pts_system_time = SDL_GetTicks(); } fFirst = false; } while(audio_packet->size > 0 || (!audio_packet->data && fNewPacket)) { if(!audio_frame) { audio_frame = av_frame_alloc(); } else { av_frame_unref(audio_frame); } if(fFlushComplete) { break; } fNewPacket = false; int iBytesConsumed = avcodec_decode_audio4(audio_codec_context, audio_frame, &iGotFrame, audio_packet); if(iBytesConsumed < 0) { audio_packet->size = 0; break; } audio_packet->data += iBytesConsumed; audio_packet->size -= iBytesConsumed; if(!iGotFrame) { if(audio_packet->data && (audio_codec_context->codec->capabilities & CODEC_CAP_DELAY)) { fFlushComplete = true; } } } } #endif //over-estimate output samples int iOutSamples = (int)av_rescale_rnd(audio_frame->nb_samples, mixer_frequency, audio_codec_context->sample_rate, AV_ROUND_UP); int iSampleSize = av_get_bytes_per_sample(AV_SAMPLE_FMT_S16) * iOutSamples * mixer_channels; if(iSampleSize > audio_buffer_max_size) { if(audio_buffer_max_size > 0) { av_free(audio_buffer); } audio_buffer = (uint8_t*)av_malloc(iSampleSize); audio_buffer_max_size = iSampleSize; } #ifdef CORSIX_TH_USE_FFMPEG swr_convert(audio_resample_context, &audio_buffer, iOutSamples, (const uint8_t**)&audio_frame->data[0], audio_frame->nb_samples); #elif defined(CORSIX_TH_USE_LIBAV) avresample_convert(audio_resample_context, &audio_buffer, 0, iOutSamples, (uint8_t**)&audio_frame->data[0], 0, audio_frame->nb_samples); #endif return iSampleSize; } #else //CORSIX_TH_USE_FFMPEG || CORSIX_TH_USE_LIBAV movie_player::movie_player() {} movie_player::~movie_player() {} void movie_player::set_renderer(SDL_Renderer *renderer) {} bool movie_player::movies_enabled() const { return false; } bool movie_player::load(const char* file_path) { return true; } void movie_player::unload() {} void movie_player::play(int iChannel) { SDL_Event endEvent; endEvent.type = SDL_USEREVENT_MOVIE_OVER; SDL_PushEvent(&endEvent); } void movie_player::stop() {} int movie_player::get_native_height() const { return 0; } int movie_player::get_native_width() const { return 0; } bool movie_player::has_audio_track() const { return false; } const char* movie_player::get_last_error() const { return nullptr; } void movie_player::clear_last_error() {} void movie_player::refresh(const SDL_Rect &destination_rect) {} void movie_player::allocate_picture_buffer() {} void movie_player::deallocate_picture_buffer() {} void movie_player::read_streams() {} void movie_player::run_video() {} void movie_player::copy_audio_to_stream(uint8_t *stream, int length) {} #endif //CORSIX_TH_USE_FFMPEG CorsixTH-0.63/CorsixTH/Src/th_movie.h000066400000000000000000000363461347163623700174120ustar00rootroot00000000000000/* Copyright (c) 2012 Stephen Baker 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. */ #ifndef TH_VIDEO_H #define TH_VIDEO_H #include #include #include #include #include #include #include "SDL.h" #include "config.h" #if (defined(CORSIX_TH_USE_FFMPEG) || defined(CORSIX_TH_USE_LIBAV)) && defined(CORSIX_TH_USE_SDL_MIXER) #include "SDL_mixer.h" extern "C" { #ifndef INT64_C #define INT64_C(c) (c ## LL) #define UINT64_C(c) (c ## ULL) #endif #include #include #include #ifdef CORSIX_TH_USE_FFMPEG #include #elif defined(CORSIX_TH_USE_LIBAV) #include #endif } #if (defined(CORSIX_TH_USE_FFMEPG) && LIBAVUTIL_VERSION_INT < AV_VERSION_INT(51, 74, 100)) || \ (defined(CORSIX_TH_USE_LIBAV) && LIBAVUTIL_VERSION_INT < AV_VERSION_INT(51, 42, 0)) #define AVPixelFormat PixelFormat #define AV_PIX_FMT_RBG24 PIX_FMT_RGB24 #endif #if (defined(CORSIX_TH_USE_LIBAV) && LIBAVCODEC_VERSION_INT >= AV_VERSION_INT(57, 16, 0)) || \ (defined(CORSIX_TH_USE_FFMPEG) && LIBAVCODEC_VERSION_INT >= AV_VERSION_INT(57, 37, 100)) #define CORSIX_TH_MOVIE_USE_SEND_PACKET_API #endif //! \brief A picture in movie_picture_buffer //! //! Stores the picture from a frame in the movie from the time that it is //! processed until it should be drawn. class movie_picture { public: movie_picture(); ~movie_picture(); //! Allocate the buffer to hold a picture of the given size void allocate(int iWidth, int iHeight); //! Delete the buffer void deallocate(); uint8_t* buffer; ///< Pixel data in #m_pixelFormat const AVPixelFormat pixel_format; ///< The format of pixels to output int width; ///< Picture width int height; ///< Picture height double pts; ///< Presentation time stamp std::mutex mutex; ///< Mutex protecting this picture }; //! A buffer for holding movie pictures and drawing them to the renderer class movie_picture_buffer { public: movie_picture_buffer(); ~movie_picture_buffer(); //NB: The following functions are called by the main program thread //! Indicate that processing should stop and the movie aborted void abort(); //! Resume after having aborted void reset(); //! Ready the picture buffer for a new renderer or new picture dimensions //! by allocating each movie_picture in the queue, resetting the read //! index and allocating a new texture. //! //! \remark Must be run on the program's graphics thread void allocate(SDL_Renderer *pRenderer, int iWidth, int iHeight); //! Destroy the associated texture and deallocate each of the //! movie_pictures in the queue so that the program can release //! the renderer //! //! \remark Must be run on the program's graphics thread void deallocate(); //! Advance the read index bool advance(); //! Draw the movie_picture at the current read index //! //! \param pRenderer The renderer to draw the picture to //! \param dstrect The rectangle on the renderer to draw to //! //! \remark Must be run on the program's graphics thread void draw(SDL_Renderer *pRenderer, const SDL_Rect &dstrect); //! Get the next presentation time stamp double get_next_pts(); //! Return whether there are any pictures left to draw in the picture queue //! //! \remark If the movie_picture_buffer is not allocated it cannot be read from //! or written to. Consequently it is both full and empty. bool empty(); //NB: These functions are called by a second thread //! Return whether there is space to add any more frame data to the queue //! //! \remark If the movie_picture_buffer is not allocated it cannot be read from //! or written to. Consequently it is both full and empty. bool full(); //! Write the given frame (and presentation time stamp) to the picture //! queue //! //! \retval 0 Success //! \retval -1 Abort is in progress //! \retval 1 An error writing the frame int write(AVFrame* pFrame, double dPts); private: //! Return whether there is space to add any more frame data to the queue //! //! \remark Requires external locking bool unsafe_full(); static const size_t picture_buffer_size = 4; ///< The number of elements to allocate in the picture queue std::atomic aborting; ///< Whether we are in the process of aborting bool allocated; ///< Whether the picture buffer has been allocated (and hasn't since been deallocated) int picture_count; ///< The number of elements currently written to the picture queue int read_index; ///< The position in the picture queue to be read next int write_index; ///< The position in the picture queue to be written to next SwsContext* sws_context; ///< The context for software scaling and pixel conversion when writing to the picture queue SDL_Texture *texture; ///< The (potentially hardware) texture to draw the picture to. In OpenGL this should only be accessed on the main thread std::mutex mutex; ///< A mutex for restricting access to the picture buffer to a single thread std::condition_variable cond; ///< A condition for indicating access to the picture buffer movie_picture picture_queue[picture_buffer_size]; ///< The picture queue, a looping FIFO queue of movie_pictures }; //! The AVPacketQueue is a thread safe queue of movie packets class av_packet_queue { public: //! Construct a new empty packet queue av_packet_queue(); //! Destroy the packet queue. //! //! \remarks Does not free the included packets. The packet queue should be //! flushed before it is destroyed. ~av_packet_queue(); //! Push a new packet on the back of the queue void push(AVPacket *packet); //! Pull the packet from the front of the queue //! //! \param block Whether to block if the queue is empty or immediately //! return a nullptr AVPacket* pull(bool block); //! Return the number of packets in the queue int get_count() const; //! Release a blocking pull without writing a new packet to the queue. void release(); private: AVPacketList *first_packet; ///< The packet at the front of the queue AVPacketList *last_packet; ///< The packet at the end of the queue int count; ///< The number of packets in the queue std::mutex mutex; ///< A mutex restricting access to the packet queue to a single thread std::condition_variable cond; ///< A condition to wait on for signaling the packet queue }; #endif //CORSIX_TH_USE_FFMPEG || CORSIX_TH_USE_LIBAV //! Movie player for CorsixTH //! //! The movie player is designed to be preinitialized and used for multiple //! movies. After initializing the movie player, call movie_player::set_renderer //! to assign the current SDL renderer to the movie player. Then movie_player::load //! the desired movie and finally movie_player::play it. class movie_player { public: //! Construct a new movie_player movie_player(); //! Destroy the movie_player ~movie_player(); //! Assign the renderer on which to draw the movie void set_renderer(SDL_Renderer *pRenderer); //! Return whether movies were compiled into CorsixTH bool movies_enabled() const; //! Load the movie with the given file name bool load(const char* szFilepath); //! Unload and free the currently loaded movie. //! //! \remark This is called by load before loading a new movie so it is //! unnecessary to explicitly call this method. There is no harm either. void unload(); //! Play the currently loaded movie //! //! \param iChannel The audio channel to use void play(int iChannel); //! Stop the currently playing movie void stop(); //! Return the original height of the movie int get_native_height() const; //! Return the original width of the movie int get_native_width() const; //! Return whether the movie has an audio stream bool has_audio_track() const; //! Return a text description of the last error encountered const char* get_last_error() const; //! Clear the last error so that if there is no more errors before the next //! call to movie_player::get_last_error() it will return an empty string. void clear_last_error(); //! Draw the next frame if it is time to do so //! //! \param destination_rect The location and dimensions in the renderer on //! which to draw the movie void refresh(const SDL_Rect &destination_rect); //! Deallocate the picture buffer and free any resources associated with it. //! //! \remark This destroys the textures and other resources that may lock //! the renderer from being deleted. If the target changes you would call //! this, then free and switch renderers in the outside program, then call //! movie_player::set_renderer and finally movie_player::allocate_picture_buffer. //! \remark Up to the size of the picture buffer frames may be lost during //! this process. void deallocate_picture_buffer(); //! Allocate the picture buffer for the current renderer void allocate_picture_buffer(); //! Read packets from the movie and allocate them to the appropriate stream //! packet queues. Signal if we have reached the end of the movie. //! //! \remark This should not be called externally. It is public as it is the //! entry point of a thread. void read_streams(); //! Read video frames from the video packet queue and write them to the //! picture queue. //! //! \remark This should not be called externally. It is public as it is the //! entry point of a thread. void run_video(); //! Read audio from the audio packet queue, and copy it into the audio //! buffer for playback void copy_audio_to_stream(uint8_t *pbStream, int iStreamSize); private: #if (defined(CORSIX_TH_USE_FFMPEG) || defined(CORSIX_TH_USE_LIBAV)) && defined(CORSIX_TH_USE_SDL_MIXER) static const size_t movie_error_buffer_capacity = 128; ///< Buffer to hold last error description static const size_t audio_chunk_buffer_capacity = 1024; ///< Buffer for audio playback //! Get the AVCodecContext associated with a given stream AVCodecContext* get_codec_context_for_stream(AVCodec* codec, AVStream* stream) const; //! Get the time the given frame should be played (from the start of the stream) //! //! \param frame The video or audio frame //! \param streamIndex The position of the stream in m_pFormatContexts streams array double get_presentation_time_for_frame(AVFrame* frame, int streamIndex) const; //! Decode audio from the movie into a format suitable for playback int decode_audio_frame(bool fFirst); #ifdef CORSIX_TH_MOVIE_USE_SEND_PACKET_API //! Convert packet data into frames //! //! \param stream The index of the stream to get the frame for //! \param pFrame An empty frame which gets populated by the data in the //! packet queue. //! \returns FFMPEG result of avcodec_recieve_frame int get_frame(int stream, AVFrame* pFrame); #else //! Convert video packet data into a frame. //! //! \param pFrame An empty frame which gets populated by the data in the //! video packet queue. //! \returns 1 if the frame was received, 0 if it was not, and < 0 on error int get_video_frame(AVFrame *pFrame); #endif SDL_Renderer *renderer; ///< The renderer to draw to //! A description of the last error std::string last_error; //! A buffer for passing to ffmpeg to get error details char error_buffer[movie_error_buffer_capacity]; // TODO: Should be atomic bool aborting; ///< Indicate that we are in process of aborting playback std::mutex decoding_audio_mutex; ///< Synchronize access to #m_pAudioBuffer AVFormatContext* format_context; ///< Information related to the loaded movie and all of its streams int video_stream_index; ///< The index of the video stream int audio_stream_index; ///< The index of the audio stream AVCodecContext *video_codec_context; ///< The video codec and information related to video AVCodecContext *audio_codec_context; ///< The audio codec and information related to audio //queues for transferring data between threads av_packet_queue *video_queue; ///< Packets from the video stream av_packet_queue *audio_queue; ///< Packets from the audio stream ::movie_picture_buffer *movie_picture_buffer; ///< Buffer of processed video //clock sync parameters int current_sync_pts_system_time; ///< System time matching #m_iCurSyncPts double current_sync_pts; ///< The current presentation time stamp (from the audio stream) #ifdef CORSIX_TH_USE_FFMPEG SwrContext* audio_resample_context; ///< Context for resampling audio for playback with ffmpeg #elif defined(CORSIX_TH_USE_LIBAV) AVAudioResampleContext* audio_resample_context; ///< Context for resampling audio for playback with libav #endif int audio_buffer_size; ///< The current size of audio data in #m_pbAudioBuffer int audio_buffer_index; ///< The current position for writing in #m_pbAudioBuffer int audio_buffer_max_size; ///< The capacity of #m_pbAudioBuffer (allocated size) uint8_t* audio_buffer; ///< An audio buffer for playback AVPacket* audio_packet; ///< The current audio packet being decoded (audio frames don't necessarily line up with packets) int audio_packet_size; ///< The size of #m_pbAudioPacketData uint8_t *audio_packet_data; ///< Original data for #m_pAudioPacket, kept so that it can be freed after the packet is processed AVFrame* audio_frame; ///< The frame we are decoding audio into Mix_Chunk* empty_audio_chunk; ///< Empty chunk needed for SDL_mixer uint8_t* audio_chunk_buffer; ///< 0'd out buffer for the SDL_Mixer chunk int audio_channel; ///< The channel to play audio on, -1 for none int mixer_channels; ///< How many channels to play on (1 - mono, 2 - stereo) int mixer_frequency; ///< The frequency of audio expected by SDL_Mixer AVPacket* flush_packet; ///< A representative packet indicating a flush is required. std::thread stream_thread; ///< The thread responsible for reading the movie streams std::thread video_thread; ///< The thread responsible for decoding the video stream #endif //CORSIX_TH_USE_FFMPEG || CORSIX_TH_USE_LIBAV }; #endif // TH_VIDEO_H CorsixTH-0.63/CorsixTH/Src/th_pathfind.cpp000066400000000000000000000447631347163623700204250ustar00rootroot00000000000000/* Copyright (c) 2009 Peter "Corsix" Cawley 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. */ #include "config.h" #include "th_pathfind.h" #include "persist_lua.h" #include "lua.hpp" #include #include #include #include abstract_pathfinder::abstract_pathfinder(pathfinder *pf) : parent(pf) { } path_node *abstract_pathfinder::init(const level_map *pMap, int iStartX, int iStartY) { int iWidth = pMap->get_width(); parent->destination = nullptr; parent->allocate_node_cache(iWidth, pMap->get_height()); path_node *pNode = parent->nodes + iStartY * iWidth + iStartX; pNode->prev = nullptr; pNode->distance = 0; pNode->guess = guess_distance(pNode); parent->dirty_node_list[0] = pNode; parent->dirty_node_count = 1; parent->open_heap.clear(); return pNode; } /*! No need to check for the node being on the map edge, as the N/E/S/W flags are set as to prevent travelling off the map (as well as to prevent walking through walls). */ bool abstract_pathfinder::search_neighbours(path_node *pNode, map_tile_flags flags, int iWidth) { if(flags.can_travel_w) if(try_node(pNode, flags, pNode - 1, travel_direction::west)) return true; if(flags.can_travel_e) if (try_node(pNode, flags, pNode + 1, travel_direction::east)) return true; if(flags.can_travel_n) if (try_node(pNode, flags, pNode - iWidth, travel_direction::north)) return true; if(flags.can_travel_s) if (try_node(pNode, flags, pNode + iWidth, travel_direction::south)) return true; return false; } void abstract_pathfinder::record_neighbour_if_passable(path_node *pNode, map_tile_flags neighbour_flags, bool passable, path_node *pNeighbour) { if(neighbour_flags.passable || !passable) { if(pNeighbour->prev == pNeighbour) { pNeighbour->prev = pNode; pNeighbour->distance = pNode->distance + 1; pNeighbour->guess = guess_distance(pNeighbour); parent->dirty_node_list[parent->dirty_node_count++] = pNeighbour; parent->push_to_open_heap(pNeighbour); } else if(pNode->distance + 1 < pNeighbour->distance) { pNeighbour->prev = pNode; pNeighbour->distance = pNode->distance + 1; /* guess doesn't change, and already in the dirty list */ parent->open_heap_promote(pNeighbour); } } } int basic_pathfinder::guess_distance(path_node *pNode) { // As diagonal movement is not allowed, the minimum distance between two // points is the sum of the distance in X and the distance in Y. return abs(pNode->x - destination_x) + abs(pNode->y - destination_y); } bool basic_pathfinder::try_node(path_node *pNode, map_tile_flags flags, path_node *pNeighbour, travel_direction direction) { map_tile_flags neighbour_flags = map->get_tile_unchecked(pNeighbour->x, pNeighbour->y)->flags; record_neighbour_if_passable(pNode, neighbour_flags, flags.passable, pNeighbour); return false; } bool basic_pathfinder::find_path(const level_map *pMap, int iStartX, int iStartY, int iEndX, int iEndY) { if(pMap == nullptr) pMap = parent->default_map; if(pMap == nullptr || pMap->get_tile(iEndX, iEndY) == nullptr || !pMap->get_tile_unchecked(iEndX, iEndY)->flags.passable) { parent->destination = nullptr; return false; } map = pMap; destination_x = iEndX; destination_y = iEndY; path_node *pNode = init(pMap, iStartX, iStartY); int iWidth = pMap->get_width(); path_node *pTarget = parent->nodes + iEndY * iWidth + iEndX; while(true) { if(pNode == pTarget) { parent->destination = pTarget; return true; } map_tile_flags flags = pMap->get_tile_unchecked(pNode->x, pNode->y)->flags; if (search_neighbours(pNode, flags, iWidth)) return true; if (parent->open_heap.empty()) { parent->destination = nullptr; break; } else { pNode = parent->pop_from_open_heap(); } } return false; } int hospital_finder::guess_distance(path_node *pNode) { return 0; } bool hospital_finder::try_node(path_node *pNode, map_tile_flags flags, path_node *pNeighbour, travel_direction direction) { map_tile_flags neighbour_flags = map->get_tile_unchecked(pNeighbour->x, pNeighbour->y)->flags; record_neighbour_if_passable(pNode, neighbour_flags, flags.passable, pNeighbour); return false; } bool hospital_finder::find_path_to_hospital(const level_map *pMap, int iStartX, int iStartY) { if(pMap == nullptr) pMap = parent->default_map; if(pMap == nullptr || pMap->get_tile(iStartX, iStartY) == nullptr || !pMap->get_tile_unchecked(iStartX, iStartY)->flags.passable) { parent->destination = nullptr; return false; } map = pMap; path_node *pNode = init(pMap, iStartX, iStartY); int iWidth = pMap->get_width(); while(true) { map_tile_flags flags = pMap->get_tile_unchecked(pNode->x, pNode->y)->flags; if(flags.hospital) { parent->destination = pNode; return true; } if (search_neighbours(pNode, flags, iWidth)) return true; if (parent->open_heap.empty()) { parent->destination = nullptr; break; } else { pNode = parent->pop_from_open_heap(); } } return false; } int idle_tile_finder::guess_distance(path_node *pNode) { return 0; } bool idle_tile_finder::try_node(path_node *pNode, map_tile_flags flags, path_node *pNeighbour, travel_direction direction) { map_tile_flags neighbour_flags = map->get_tile_unchecked(pNeighbour->x, pNeighbour->y)->flags; /* When finding an idle tile, do not navigate through doors */ switch(direction) { case travel_direction::north: if(!flags.door_north) record_neighbour_if_passable(pNode, neighbour_flags, flags.passable, pNeighbour); break; case travel_direction::east: if(!neighbour_flags.door_west) record_neighbour_if_passable(pNode, neighbour_flags, flags.passable, pNeighbour); break; case travel_direction::south: if(!neighbour_flags.door_north) record_neighbour_if_passable(pNode, neighbour_flags, flags.passable, pNeighbour); break; case travel_direction::west: if(!flags.door_west) record_neighbour_if_passable(pNode, neighbour_flags, flags.passable, pNeighbour); break; } /* Identify the neighbour in the open list nearest to the start */ if(pNeighbour->prev != pNeighbour && pNeighbour->open_idx != -1) { int iDX = pNeighbour->x - start_x; int iDY = pNeighbour->y - start_y; double fDistance = sqrt((double)(iDX * iDX + iDY * iDY)); if(best_next_node == nullptr || fDistance < best_distance) { best_next_node = pNeighbour; best_distance = fDistance; } } return false; } bool idle_tile_finder::find_idle_tile(const level_map *pMap, int iStartX, int iStartY, int iN) { if(pMap == nullptr) pMap = parent->default_map; if(pMap == nullptr) { parent->destination = nullptr; return false; } start_x = iStartX; start_y = iStartY; map = pMap; path_node *pNode = init(pMap, iStartX, iStartY); int iWidth = pMap->get_width(); path_node *pPossibleResult = nullptr; while(true) { pNode->open_idx = -1; map_tile_flags flags = pMap->get_tile_unchecked(pNode->x, pNode->y)->flags; if(!flags.do_not_idle && flags.passable && flags.hospital) { if(iN == 0) { parent->destination = pNode; return true; } else { pPossibleResult = pNode; --iN; } } best_next_node = nullptr; best_distance = 0.0; if (search_neighbours(pNode, flags, iWidth)) return true; if (parent->open_heap.empty()) { parent->destination = nullptr; break; } if(best_next_node) { // Promote the best neighbour to the front of the open list // This causes sequential iN to give neighbouring results for most iN best_next_node->guess = -best_next_node->distance; parent->open_heap_promote(best_next_node); } pNode = parent->pop_from_open_heap(); } if(pPossibleResult) { parent->destination = pPossibleResult; return true; } return false; } int object_visitor::guess_distance(path_node *pNode) { return 0; } bool object_visitor::try_node(path_node *pNode, map_tile_flags flags, path_node *pNeighbour, travel_direction direction) { int iObjectNumber = 0; const map_tile *pMapNode = map->get_tile_unchecked(pNeighbour->x, pNeighbour->y); map_tile_flags neighbour_flags = map->get_tile_unchecked(pNeighbour->x, pNeighbour->y)->flags; for(auto thob : pMapNode->objects) { if(thob == target) iObjectNumber++; } if(target_any_object_type) iObjectNumber = 1; bool bSucces = false; for(int i = 0; i < iObjectNumber; i++) { /* call the given Lua function, passing four arguments: */ /* The x and y position of the object (Lua tile co-ords) */ /* The direction which was last travelled in to reach (x,y); */ /* 0 (north), 1 (east), 2 (south), 3 (west) */ /* The distance to the object from the search starting point */ lua_pushvalue(L, visit_function_index); lua_pushinteger(L, pNeighbour->x + 1); lua_pushinteger(L, pNeighbour->y + 1); lua_pushinteger(L, static_cast(direction)); lua_pushinteger(L, pNode->distance); lua_call(L, 4, 1); if(lua_toboolean(L, -1) != 0) { bSucces = true; } lua_pop(L, 1); } if(bSucces) return true; if(pNode->distance < max_distance) { switch(direction) { case travel_direction::north: if(!flags.door_north) record_neighbour_if_passable(pNode, neighbour_flags, flags.passable, pNeighbour); break; case travel_direction::east: if(!neighbour_flags.door_west) record_neighbour_if_passable(pNode, neighbour_flags, flags.passable, pNeighbour); break; case travel_direction::south: if(!neighbour_flags.door_north) record_neighbour_if_passable(pNode, neighbour_flags, flags.passable, pNeighbour); break; case travel_direction::west: if(!flags.door_west) record_neighbour_if_passable(pNode, neighbour_flags, flags.passable, pNeighbour); break; } } return false; } bool object_visitor::visit_objects(const level_map *pMap, int iStartX, int iStartY, object_type eTHOB, int iMaxDistance, lua_State *L, int iVisitFunction, bool anyObjectType) { if(pMap == nullptr) pMap = parent->default_map; if(pMap == nullptr) { parent->destination = nullptr; return false; } this->L = L; visit_function_index = iVisitFunction; max_distance = iMaxDistance; target_any_object_type = anyObjectType; target = eTHOB; map = pMap; path_node *pNode = init(pMap, iStartX, iStartY); int iWidth = pMap->get_width(); while(true) { map_tile_flags flags = pMap->get_tile_unchecked(pNode->x, pNode->y)->flags; if (search_neighbours(pNode, flags, iWidth)) return true; if (parent->open_heap.empty()) { parent->destination = nullptr; break; } else { pNode = parent->pop_from_open_heap(); } } return false; } pathfinder::pathfinder() : basic_pathfinder(this), hospital_finder(this), idle_tile_finder(this), object_visitor(this), open_heap() { nodes = nullptr; dirty_node_list = nullptr; destination = nullptr; default_map = nullptr; node_cache_width = 0; node_cache_height = 0; dirty_node_count = 0; } pathfinder::~pathfinder() { delete[] nodes; delete[] dirty_node_list; } void pathfinder::set_default_map(const level_map *pMap) { default_map = pMap; } void pathfinder::allocate_node_cache(int iWidth, int iHeight) { if(node_cache_width != iWidth || node_cache_height != iHeight) { delete[] nodes; nodes = new path_node[iWidth * iHeight]; path_node *pNode = nodes; for(int iY = 0; iY < iHeight; ++iY) { for(int iX = 0; iX < iWidth; ++iX, ++pNode) { pNode->prev = pNode; pNode->x = iX; pNode->y = iY; // Other fields are undefined as the node is not part of a // path, and thus can be left uninitialised. } } delete[] dirty_node_list; dirty_node_list = new path_node*[iWidth * iHeight]; node_cache_width = iWidth; node_cache_height = iHeight; } else { for(int i = 0; i < dirty_node_count; ++i) { dirty_node_list[i]->prev = dirty_node_list[i]; // Other fields are undefined as the node is not part of a path, // and thus can keep their old values. } } dirty_node_count = 0; } int pathfinder::get_path_length() const { if(destination != nullptr) return destination->distance; else return -1; } bool pathfinder::get_path_end(int* pX, int* pY) const { if(destination == nullptr) { if(pX) *pX = -1; if(pY) *pY = -1; return false; } if(pX) *pX = destination->x; if(pY) *pY = destination->y; return true; } void pathfinder::push_result(lua_State *L) const { lua_checkstack(L, 3); if(destination == nullptr) { lua_pushnil(L); lua_pushliteral(L, "no path"); return; } int iLength = destination->distance; lua_createtable(L, iLength + 1, 0); lua_createtable(L, iLength + 1, 0); for(const path_node* pNode = destination; pNode; pNode = pNode->prev) { lua_pushinteger(L, pNode->x + 1); lua_rawseti(L, -3, pNode->distance + 1); lua_pushinteger(L, pNode->y + 1); lua_rawseti(L, -2, pNode->distance + 1); } } void pathfinder::push_to_open_heap(path_node* pNode) { pNode->open_idx = open_heap.size(); open_heap.push_back(pNode); open_heap_promote(pNode); } void pathfinder::open_heap_promote(path_node* pNode) { int i = pNode->open_idx; while(i > 0) { int parent = (i - 1) / 2; path_node *pParent = open_heap[parent]; if(pParent->value() <= pNode->value()) break; pParent->open_idx = i; open_heap[i] = pParent; open_heap[parent] = pNode; i = parent; } pNode->open_idx = i; } path_node* pathfinder::pop_from_open_heap() { path_node *pResult = open_heap[0]; path_node *pNode = open_heap.back(); open_heap.pop_back(); if (open_heap.empty()) { return pResult; } open_heap[0] = pNode; int i = 0; int min = 0; int left = i * 2 + 1; const int value = pNode->value(); while(left < open_heap.size()) { min = i; const int right = (i + 1) * 2; int minvalue = value; path_node *pSwap = nullptr; path_node *pTest = open_heap[left]; if(pTest->value() < minvalue) min = left, minvalue = pTest->value(), pSwap = pTest; if(right < open_heap.size()) { pTest = open_heap[right]; if(pTest->value() < minvalue) min = right, pSwap = pTest; } if(min == i) break; pSwap->open_idx = i; open_heap[i] = pSwap; open_heap[min] = pNode; i = min; left = i * 2 + 1; } pNode->open_idx = min; return pResult; } void pathfinder::persist(lua_persist_writer *pWriter) const { if(destination == nullptr) { pWriter->write_uint(0); return; } pWriter->write_uint(get_path_length() + 1); pWriter->write_uint(node_cache_width); pWriter->write_uint(node_cache_height); for(const path_node* pNode = destination; pNode; pNode = pNode->prev) { pWriter->write_uint(pNode->x); pWriter->write_uint(pNode->y); } } void pathfinder::depersist(lua_persist_reader *pReader) { new (this) pathfinder; // Call constructor int iLength; if(!pReader->read_uint(iLength)) return; if(iLength == 0) return; int iWidth, iHeight; if(!pReader->read_uint(iWidth) || !pReader->read_uint(iHeight)) return; allocate_node_cache(iWidth, iHeight); int iX, iY; if(!pReader->read_uint(iX) || !pReader->read_uint(iY)) return; path_node *pNode = nodes + iY * iWidth + iX; destination = pNode; for(int i = 0; i <= iLength - 2; ++i) { if(!pReader->read_uint(iX) || !pReader->read_uint(iY)) return; path_node *pPrevNode = nodes + iY * iWidth + iX; pNode->distance = iLength - 1 - i; pNode->prev = pPrevNode; dirty_node_list[dirty_node_count++] = pNode; pNode = pPrevNode; } pNode->distance = 0; pNode->prev = nullptr; dirty_node_list[dirty_node_count++] = pNode; } CorsixTH-0.63/CorsixTH/Src/th_pathfind.h000066400000000000000000000232651347163623700200640ustar00rootroot00000000000000/* Copyright (c) 2009 Peter "Corsix" Cawley 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. */ #ifndef CORSIX_TH_TH_PATHFIND_H_ #define CORSIX_TH_TH_PATHFIND_H_ #include "th_map.h" class lua_persist_reader; class lua_persist_writer; class pathfinder; /** Directions of movement. */ enum class travel_direction { north = 0, ///< Move to the north. east = 1, ///< Move to the east. south = 2, ///< Move to the south. west = 3 ///< Move to the west. }; /** Node in the path finder routines. */ struct path_node { //! Pointer to the previous node in the path to this cell. /*! Points to nullptr if this is the first cell in the path, or points to itself if it is not part of a path. */ const path_node* prev; //! X-position of this cell (constant) int x; //! Y-position of this cell (constant) int y; //! Current shortest distance to this cell /*! Defined as prev->distance + 1 (or 0 if prev == nullptr). Value is undefined if not part of a path. */ int distance; //! Minimum distance from this cell to the goal /*! Value is only dependant upon the cell position and the goal position, and is undefined if not part of a path. */ int guess; //! Index of this cell in the open heap /*! If the cell is not in the open heap, then this value is undefined. */ int open_idx; //! Total cost of this node. /*! @return Total cost of the node, traveled distance and guess to the destination. */ inline int value() const { return distance + guess; } }; /** Base class of the path finders. */ class abstract_pathfinder { public: abstract_pathfinder(pathfinder *pf); virtual ~abstract_pathfinder() = default; //! Initialize the path finder. /*! @param pMap Map to search on. @param iStartX X coordinate of the start position. @param iStarty Y coordinate of the start position. @return The initial node to expand. */ path_node *init(const level_map *pMap, int iStartX, int iStarty); //! Expand the \a pNode to its neighbours. /*! @param pNode Node to expand. @param iFlags Flags of the node. @param iWidth Width of the map. @return Whether the search is done. */ bool search_neighbours(path_node *pNode, map_tile_flags flags, int iWidth); void record_neighbour_if_passable(path_node *pNode, map_tile_flags neighbour_flags, bool passable, path_node *pNeighbour); //! Guess distance to the destination for \a pNode. /*! @param pNode Node to fill. */ virtual int guess_distance(path_node *pNode) = 0; //! Try the \a pNeighbour node. /*! @param pNode Source node. @param flags Flags of the node. @param pNeighbour Neighbour of \a pNode to try. @param direction Direction of travel. @return Whether the search is done. */ virtual bool try_node(path_node *pNode, map_tile_flags flags, path_node *pNeighbour, travel_direction direction) = 0; protected: pathfinder *parent; ///< Path finder parent object, containing shared data. const level_map *map; ///< Map being searched. }; class basic_pathfinder : public abstract_pathfinder { public: basic_pathfinder(pathfinder *pf) : abstract_pathfinder(pf) { } int guess_distance(path_node *pNode) override; bool try_node(path_node *pNode, map_tile_flags flags, path_node *pNeighbour, travel_direction direction) override; bool find_path(const level_map *pMap, int iStartX, int iStartY, int iEndX, int iEndY); int destination_x; ///< X coordinate of the destination of the path. int destination_y; ///< Y coordinate of the destination of the path. }; class hospital_finder : public abstract_pathfinder { public: hospital_finder(pathfinder *pf) : abstract_pathfinder(pf) { } int guess_distance(path_node *pNode) override; bool try_node(path_node *pNode, map_tile_flags flags, path_node *pNeighbour, travel_direction direction) override; bool find_path_to_hospital(const level_map *pMap, int iStartX, int iStartY); }; class idle_tile_finder : public abstract_pathfinder { public: idle_tile_finder(pathfinder *pf) : abstract_pathfinder(pf) { } int guess_distance(path_node *pNode) override; bool try_node(path_node *pNode, map_tile_flags flags, path_node *pNeighbour, travel_direction direction) override; bool find_idle_tile(const level_map *pMap, int iStartX, int iStartY, int iN); path_node *best_next_node; double best_distance; int start_x; ///< X coordinate of the start position. int start_y; ///< Y coordinate of the start position. }; class object_visitor : public abstract_pathfinder { public: object_visitor(pathfinder *pf) : abstract_pathfinder(pf) { } int guess_distance(path_node *pNode) override; bool try_node(path_node *pNode, map_tile_flags flags, path_node *pNeighbour, travel_direction direction) override; bool visit_objects(const level_map *pMap, int iStartX, int iStartY, object_type eTHOB, int iMaxDistance, lua_State *L, int iVisitFunction, bool anyObjectType); lua_State *L; int visit_function_index; int max_distance; bool target_any_object_type; object_type target; }; //! Finds paths through maps /*! A pathfinder is used for finding a path through a map. A single pathfinder instance is not reentrant, but separate instances are. Users of the class should call find_path() to test if there is a path between two points on a map, and then use get_path_length() and/or push_result() to get the actual path. Internally, the A* search algorithm is used. The open set is implemented as a heap in open_heap, and there is no explicit closed set. For each cell of the map, a path_node structure is created (and cached between searches if the map size is constant), which holds information about said map cell in the current search. The algorithm is implemented in such a way that most path find operations do not need to allocate (or free) any memory. */ class pathfinder { public: pathfinder(); ~pathfinder(); void set_default_map(const level_map *pMap); inline bool find_path(const level_map *pMap, int iStartX, int iStartY, int iEndX, int iEndY) { return basic_pathfinder.find_path(pMap, iStartX, iStartY, iEndX, iEndY); } inline bool find_idle_tile(const level_map *pMap, int iStartX, int iStartY, int iN) { return idle_tile_finder.find_idle_tile(pMap, iStartX, iStartY, iN); } inline bool find_path_to_hospital(const level_map *pMap, int iStartX, int iStartY) { return hospital_finder.find_path_to_hospital(pMap, iStartX, iStartY); } inline bool visit_objects(const level_map *pMap, int iStartX, int iStartY, object_type eTHOB, int iMaxDistance, lua_State *L, int iVisitFunction, bool anyObjectType) { return object_visitor.visit_objects( pMap, iStartX, iStartY, eTHOB, iMaxDistance, L, iVisitFunction, anyObjectType); } int get_path_length() const; bool get_path_end(int* pX, int* pY) const; void push_result(lua_State *L) const; void persist(lua_persist_writer *pWriter) const; void depersist(lua_persist_reader *pReader); //! Allocate node cache for all tiles of the map. /*! @param iWidth Width of the map. @param iHeight Height of the map. */ void allocate_node_cache(int iWidth, int iHeight); path_node* pop_from_open_heap(); void push_to_open_heap(path_node* pNode); void open_heap_promote(path_node* pNode); const level_map *default_map; //! 2D array of nodes, one for each map cell path_node *nodes; //! Array of "dirty" nodes which need to be reset before the next path find /*! This array is always large enough to hold every single node, and #dirty_node_count holds the number of items currently in the array. */ path_node **dirty_node_list; //! Heap of not yet evaluated nodes as a 0-based array /*! This array conforms to the conditions: value(i) <= value(i * 2 + 1) value(i) <= value(i * 2 + 2) This causes the array to be a minimum binary heap. */ std::vector open_heap; path_node *destination; int node_cache_width; int node_cache_height; int dirty_node_count; private: ::basic_pathfinder basic_pathfinder; ::hospital_finder hospital_finder; ::idle_tile_finder idle_tile_finder; ::object_visitor object_visitor; }; #endif // CORSIX_TH_TH_PATHFIND_H_ CorsixTH-0.63/CorsixTH/Src/th_sound.cpp000066400000000000000000000235721347163623700177530ustar00rootroot00000000000000/* Copyright (c) 2009 Peter "Corsix" Cawley 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. */ #include "config.h" #include "th_sound.h" #include #include #include sound_archive::sound_archive() { sound_files = nullptr; data = nullptr; } sound_archive::~sound_archive() { delete[] data; } namespace { /** * Convert 4 bytes representing uint32 in little endian representation into a * uint32. * * @param bytes A pointer to the first of 4 sequential bytes in memory making * up the uint32. */ uint32_t bytes_to_uint32_le(const uint8_t* bytes) { uint32_t res = bytes[3]; res <<= 8; res |= bytes[2]; res <<= 8; res |= bytes[1]; res <<= 8; res |= bytes[0]; return res; } } // namespace bool sound_archive::load_from_th_file(const uint8_t* pData, size_t iDataLength) { if(iDataLength < sizeof(uint32_t) + sizeof(sound_dat_file_header)) return false; uint32_t iHeaderPosition = bytes_to_uint32_le(pData + iDataLength - sizeof(uint32_t)); if(static_cast(iHeaderPosition) >= iDataLength - sizeof(sound_dat_file_header)) return false; header = *reinterpret_cast(pData + iHeaderPosition); delete[] data; data = new (std::nothrow) uint8_t[iDataLength]; if(data == nullptr) return false; std::memcpy(data, pData, iDataLength); sound_files = reinterpret_cast(data + header.table_position); sound_file_count = header.table_length / sizeof(sound_dat_sound_info); return true; } size_t sound_archive::get_number_of_sounds() const { return sound_file_count; } const char* sound_archive::get_sound_name(size_t iIndex) const { if(iIndex >= sound_file_count) return nullptr; return sound_files[iIndex].sound_name; } #define FOURCC(c1, c2, c3, c4) \ ( static_cast(static_cast(c1) << 0) \ | static_cast(static_cast(c2) << 8) \ | static_cast(static_cast(c3) << 16) \ | static_cast(static_cast(c4) << 24) ) size_t sound_archive::get_sound_duration(size_t iIndex) { SDL_RWops *pFile = load_sound(iIndex); if(!pFile) return 0; uint16_t iWaveAudioFormat = 0; uint16_t iWaveChannelCount = 0; uint32_t iWaveSampleRate = 0; uint32_t iWaveByteRate = 0; uint16_t iWaveBlockAlign = 0; uint16_t iWaveBitsPerSample = 0; uint32_t iWaveDataLength = 0; // This is a very crude RIFF parser, but it does the job. uint32_t iFourCC; uint32_t iChunkLength; for(;;) { if(SDL_RWread(pFile, &iFourCC, 4, 1) != 1) break; if(SDL_RWread(pFile, &iChunkLength, 4, 1) != 1) break; if(iFourCC == FOURCC('R','I','F','F') || iFourCC == FOURCC('L','I','S','T')) { if(iChunkLength >= 4) { if(SDL_RWread(pFile, &iFourCC, 4, 1) != 1) break; else continue; } } if(iFourCC == FOURCC('f','m','t',' ') && iChunkLength >= 16) { if(SDL_RWread(pFile, &iWaveAudioFormat, 2, 1) != 1) break; if(SDL_RWread(pFile, &iWaveChannelCount, 2, 1) != 1) break; if(SDL_RWread(pFile, &iWaveSampleRate, 4, 1) != 1) break; if(SDL_RWread(pFile, &iWaveByteRate, 4, 1) != 1) break; if(SDL_RWread(pFile, &iWaveBlockAlign, 2, 1) != 1) break; if(SDL_RWread(pFile, &iWaveBitsPerSample, 2, 1) != 1) break; iChunkLength -= 16; } //Finally: if(iFourCC == FOURCC('d','a','t','a')) { iWaveDataLength = iChunkLength; break; } if(SDL_RWseek(pFile, iChunkLength + (iChunkLength & 1), RW_SEEK_CUR) == -1) { break; } } SDL_RWclose(pFile); if(iWaveAudioFormat != 1 || iWaveChannelCount == 0 || iWaveSampleRate == 0 || iWaveDataLength == 0 || iWaveBitsPerSample == 0) { return 0; } #define mul64(a, b) (static_cast(a) * static_cast(b)) return static_cast(mul64(iWaveDataLength, 8000) / mul64(mul64(iWaveBitsPerSample, iWaveChannelCount), iWaveSampleRate)); #undef mul64 } #undef FOURCC SDL_RWops* sound_archive::load_sound(size_t iIndex) { if(iIndex >= sound_file_count) return nullptr; sound_dat_sound_info *pFile = sound_files + iIndex; return SDL_RWFromConstMem(data + pFile->position, pFile->length); } #ifdef CORSIX_TH_USE_SDL_MIXER sound_player* sound_player::singleton = nullptr; sound_player::sound_player() { sounds = nullptr; sound_count = 0; singleton = this; camera_x = 0; camera_y = 0; camera_radius = 1.0; master_volume = 1.0; sound_effect_volume = 0.5; positionless_volume = MIX_MAX_VOLUME; sound_effects_enabled = true; #define NUM_CHANNELS 32 #if NUM_CHANNELS >= 32 available_channels_bitmap = ~0; Mix_AllocateChannels(32); #else channels_in_use_bitmap = (1 << NUM_CHANNELS) - 1; Mix_AllocateChannels(NUM_CHANNELS); #endif #undef NUM_CHANNELS Mix_ChannelFinished(on_channel_finished); } sound_player::~sound_player() { populate_from(nullptr); if(singleton == this) singleton = nullptr; } void sound_player::on_channel_finished(int iChannel) { sound_player *pThis = get_singleton(); if(pThis == nullptr) return; pThis->release_channel(iChannel); } sound_player* sound_player::get_singleton() { return singleton; } void sound_player::populate_from(sound_archive *pArchive) { for(size_t i = 0; i < sound_count; ++i) { Mix_FreeChunk(sounds[i]); } delete[] sounds; sounds = nullptr; sound_count = 0; if(pArchive == nullptr) return; sounds = new Mix_Chunk*[pArchive->get_number_of_sounds()]; for(; sound_count < pArchive->get_number_of_sounds(); ++sound_count) { sounds[sound_count] = nullptr; SDL_RWops *pRwop = pArchive->load_sound(sound_count); if(pRwop) { sounds[sound_count] = Mix_LoadWAV_RW(pRwop, 1); if(sounds[sound_count]) Mix_VolumeChunk(sounds[sound_count], MIX_MAX_VOLUME); } } } void sound_player::play(size_t iIndex, double dVolume) { if(available_channels_bitmap == 0 || iIndex >= sound_count || !sounds[iIndex]) return; play_raw(iIndex, (int)(positionless_volume * dVolume)); } void sound_player::play_at(size_t iIndex, int iX, int iY) { if(sound_effects_enabled) play_at(iIndex, sound_effect_volume, iX, iY); } void sound_player::play_at(size_t iIndex, double dVolume, int iX, int iY) { if(available_channels_bitmap == 0 || iIndex >= sound_count || !sounds[iIndex]) return; double fDX = (double)(iX - camera_x); double fDY = (double)(iY - camera_y); double fDistance = sqrt(fDX * fDX + fDY * fDY); if(fDistance > camera_radius) return; fDistance = fDistance / camera_radius; double fVolume = master_volume * (1.0 - fDistance * 0.8) * (double)MIX_MAX_VOLUME * dVolume; play_raw(iIndex, (int)(fVolume + 0.5)); } void sound_player::set_sound_effect_volume(double dVolume) { sound_effect_volume = dVolume; } void sound_player::set_sound_effects_enabled(bool bOn) { sound_effects_enabled = bOn; } int sound_player::reserve_channel() { // NB: Callers ensure that m_iChannelStatus != 0 int iChannel = 0; for(; (available_channels_bitmap & (1 << iChannel)) == 0; ++iChannel) {} available_channels_bitmap &=~ (1 << iChannel); return iChannel; } void sound_player::release_channel(int iChannel) { available_channels_bitmap |= (1 << iChannel); } void sound_player::play_raw(size_t iIndex, int iVolume) { int iChannel = reserve_channel(); Mix_Volume(iChannel, iVolume); Mix_PlayChannelTimed(iChannel, sounds[iIndex], 0, -1); } void sound_player::set_camera(int iX, int iY, int iRadius) { camera_x = iX; camera_y = iY; camera_radius = (double)iRadius; if(camera_radius < 0.001) camera_radius = 0.001; } #else // CORSIX_TH_USE_SDL_MIXER sound_effect_player::sound_effect_player() {} sound_effect_player::~sound_effect_player() {} sound_effect_player* sound_effect_player::get_singleton() {return nullptr;} void sound_effect_player::set_sound_archive(THSoundArchive *pArchive) {} void sound_effect_player::play(size_t iIndex, double dVolume) {} void sound_effect_player::play_at(size_t iIndex, int iX, int iY) {} void sound_effect_player::play_at(size_t iIndex, double dVolume, int iX, int iY) {} int sound_effect_player::reserve_channel() { return 0; } void sound_effect_player::release_channel(int iChannel) {} void sound_effect_player::set_camera(int iX, int iY, int iRadius) {} void sound_effect_player::set_sound_effect_volume(double dVolume) {} void sound_effect_player::set_sound_effects_enabled(bool iOn) {} #endif // CORSIX_TH_USE_SDL_MIXER CorsixTH-0.63/CorsixTH/Src/th_sound.h000066400000000000000000000076621347163623700174220ustar00rootroot00000000000000/* Copyright (c) 2009 Peter "Corsix" Cawley 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. */ #ifndef CORSIX_TH_TH_SOUND_H_ #define CORSIX_TH_TH_SOUND_H_ #include #ifdef CORSIX_TH_USE_SDL_MIXER #include #endif //! Utility class for accessing Theme Hospital's SOUND-0.DAT class sound_archive { public: sound_archive(); ~sound_archive(); bool load_from_th_file(const uint8_t* pData, size_t iDataLength); //! Returns the number of sounds present in the archive size_t get_number_of_sounds() const; //! Gets the name of the sound at a given index const char *get_sound_name(size_t iIndex) const; //! Gets the duration (in miliseconds) of the sound at a given index size_t get_sound_duration(size_t iIndex); //! Opens the sound at a given index into an SDL_RWops structure /*! The caller is responsible for closing/freeing the result. */ SDL_RWops* load_sound(size_t iIndex); private: #if CORSIX_TH_USE_PACK_PRAGMAS #pragma pack(push) #pragma pack(1) #endif struct sound_dat_file_header { uint8_t unknown1[50]; uint32_t table_position; uint32_t unknown2; uint32_t table_length; uint32_t table_position2; uint8_t unknown3[112]; uint32_t table_position3; uint32_t table_length2; uint8_t unknown4[48]; } CORSIX_TH_PACKED_FLAGS; struct sound_dat_sound_info { char sound_name[18]; uint32_t position; uint32_t unknown1; uint32_t length; uint16_t unknown2; } CORSIX_TH_PACKED_FLAGS; #if CORSIX_TH_USE_PACK_PRAGMAS #pragma pack(pop) #endif // TODO: header is only used in one function, should not be class variable. sound_dat_file_header header; sound_dat_sound_info* sound_files; uint8_t* data; size_t sound_file_count; }; class sound_player { public: sound_player(); ~sound_player(); static sound_player* get_singleton(); void populate_from(sound_archive *pArchive); void play(size_t iIndex, double dVolume); void play_at(size_t iIndex, int iX, int iY); void play_at(size_t iIndex, double dVolume, int iX, int iY); void set_sound_effect_volume(double dVolume); void set_sound_effects_enabled(bool bOn); void set_camera(int iX, int iY, int iRadius); int reserve_channel(); void release_channel(int iChannel); private: #ifdef CORSIX_TH_USE_SDL_MIXER static sound_player* singleton; static void on_channel_finished(int iChannel); inline void play_raw(size_t iIndex, int iVolume); Mix_Chunk **sounds; size_t sound_count; uint32_t available_channels_bitmap; ///< The bit index corresponding to a channel is 1 if the channel is available and 0 if it is reserved or in use. int camera_x; int camera_y; double camera_radius; double master_volume; double sound_effect_volume; int positionless_volume; bool sound_effects_enabled; #endif // CORSIX_TH_USE_SDL_MIXER }; #endif // CORSIX_TH_TH_SOUND_H_ CorsixTH-0.63/CorsixTH/Src/xmi2mid.cpp000066400000000000000000000262141347163623700174750ustar00rootroot00000000000000/* Copyright (c) 2009 Peter "Corsix" Cawley 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. */ #include "config.h" #ifdef CORSIX_TH_USE_SDL_MIXER #include #include #include #include #include /*! Utility class for reading or writing to memory as if it were a file. */ class memory_buffer { public: memory_buffer() : data(nullptr), pointer(nullptr), data_end(nullptr), buffer_end(nullptr) { } memory_buffer(const uint8_t* pData, size_t iLength) { data = pointer = (char*)pData; data_end = data + iLength; buffer_end = nullptr; } ~memory_buffer() { if(buffer_end != nullptr) delete[] data; } uint8_t* take_data(size_t *pLength) { if(pLength) *pLength = data_end - data; uint8_t* pResult = (unsigned char*)data; data = pointer = data_end = buffer_end = nullptr; return pResult; } size_t tell() const { return pointer - data; } bool seek(size_t position) { if(data + position > data_end) { if(!resize_buffer(position)) return false; } pointer = data + position; return true; } bool skip(int distance) { if(distance < 0) { if(pointer + distance < data) return false; } return seek(pointer - data + distance); } bool scan_to(const void* pData, size_t iLength) { for(; pointer + iLength <= data_end; ++pointer) { if(std::memcmp(pointer, pData, iLength) == 0) return true; } return false; } const char* get_pointer() const { return pointer; } template bool read(T& value) { return read(&value, 1); } template bool read(T* values, size_t count) { if(pointer + sizeof(T) * count > data_end) return false; std::memcpy(values, pointer, sizeof(T) * count); pointer += sizeof(T) * count; return true; } unsigned int read_big_endian_uint24() { uint8_t iByte0, iByte1, iByte2; if(read(iByte0) && read(iByte1) && read(iByte2)) return (((iByte0 << 8) | iByte1) << 8) | iByte2; else return 0; } unsigned int read_variable_length_uint() { unsigned int iValue = 0; uint8_t iByte; for(int i = 0; i < 4; ++i) { if(!read(iByte)) return false; iValue = (iValue << 7) | static_cast(iByte & 0x7F); if((iByte & 0x80) == 0) break; } return iValue; } template bool write(const T& value) { return write(&value, 1); } template bool write(const T* values, size_t count) { if(!skip(static_cast(sizeof(T) * count))) return false; std::memcpy(pointer - sizeof(T) * count, values, sizeof(T) * count); return true; } bool write_big_endian_uint16(uint16_t iValue) { return write(byte_swap(iValue)); } bool write_big_endian_uint32(uint32_t iValue) { return write(byte_swap(iValue)); } bool write_variable_length_uint(unsigned int iValue) { int iByteCount = 1; unsigned int iBuffer = iValue & 0x7F; for(; iValue >>= 7; ++iByteCount) { iBuffer = (iBuffer << 8) | 0x80 | (iValue & 0x7F); } for(int i = 0; i < iByteCount; ++i) { uint8_t iByte = iBuffer & 0xFF; if(!write(iByte)) return false; iBuffer >>= 8; } return true; } bool is_end_of_buffer() const { return pointer == data_end; } private: template static T byte_swap(T value) { T swapped = 0; for(int i = 0; i < static_cast(sizeof(T)) * 8; i += 8) { swapped = static_cast(swapped | ((value >> i) & 0xFF) << (sizeof(T) * 8 - 8 - i)); } return swapped; } bool resize_buffer(size_t size) { if(data + size <= buffer_end) { data_end = data + size; return true; } char *pNewData = new (std::nothrow) char[size * 2]; if(pNewData == nullptr) return false; size_t iOldLength = data_end - data; if (iOldLength > 0) { std::memcpy(pNewData, data, size > iOldLength ? iOldLength : size); } pointer = pointer - data + pNewData; if(buffer_end != nullptr) delete[] data; data = pNewData; data_end = pNewData + size; buffer_end = pNewData + size * 2; return true; } char *data, *pointer, *data_end, *buffer_end; }; struct midi_token { int time; unsigned int buffer_length; const char *buffer; uint8_t type; uint8_t data; }; static bool operator < (const midi_token& oLeft, const midi_token& oRight) { return oLeft.time < oRight.time; } struct midi_token_list : std::vector { midi_token* append(int iTime, uint8_t iType) { push_back(midi_token()); midi_token* pToken = &back(); pToken->time = iTime; pToken->type = iType; return pToken; } }; uint8_t* transcode_xmi_to_midi(const unsigned char* xmi_data, size_t xmi_length, size_t* midi_length) { if (xmi_data == nullptr) { return nullptr; } memory_buffer bufInput(xmi_data, xmi_length); if(!bufInput.scan_to("EVNT", 4) || !bufInput.skip(8)) return nullptr; midi_token_list lstTokens; midi_token* pToken; int iTokenTime = 0; int iTempo = 500000; bool bTempoSet = false; bool bEnd = false; uint8_t iTokenType, iExtendedType; while(!bufInput.is_end_of_buffer() && !bEnd) { while(true) { if(!bufInput.read(iTokenType)) return nullptr; if(iTokenType & 0x80) break; else iTokenTime += static_cast(iTokenType) * 3; } pToken = lstTokens.append(iTokenTime, iTokenType); pToken->buffer = bufInput.get_pointer() + 1; switch(iTokenType & 0xF0) { case 0xC0: case 0xD0: if(!bufInput.read(pToken->data)) return nullptr; pToken->buffer = nullptr; break; case 0x80: case 0xA0: case 0xB0: case 0xE0: if(!bufInput.read(pToken->data)) return nullptr; if(!bufInput.skip(1)) return nullptr; break; case 0x90: if(!bufInput.read(iExtendedType)) return nullptr; pToken->data = iExtendedType; if(!bufInput.skip(1)) return nullptr; pToken = lstTokens.append(iTokenTime + bufInput.read_variable_length_uint() * 3, iTokenType); pToken->data = iExtendedType; pToken->buffer = "\0"; break; case 0xF0: iExtendedType = 0; if(iTokenType == 0xFF) { if(!bufInput.read(iExtendedType)) return nullptr; if(iExtendedType == 0x2F) bEnd = true; else if(iExtendedType == 0x51) { if(!bTempoSet) { bufInput.skip(1); iTempo = bufInput.read_big_endian_uint24() * 3; bTempoSet = true; bufInput.skip(-4); } else { lstTokens.pop_back(); if(!bufInput.skip(bufInput.read_variable_length_uint())) return nullptr; break; } } } pToken->data = iExtendedType; pToken->buffer_length = bufInput.read_variable_length_uint(); pToken->buffer = bufInput.get_pointer(); if(!bufInput.skip(pToken->buffer_length)) return nullptr; break; } } if(lstTokens.empty()) return nullptr; memory_buffer bufOutput; if(!bufOutput.write("MThd\0\0\0\x06\0\0\0\x01", 12)) return nullptr; if(!bufOutput.write_big_endian_uint16(static_cast((iTempo * 3) / 25000))) return nullptr; if(!bufOutput.write("MTrk\xBA\xAD\xF0\x0D", 8)) return nullptr; std::sort(lstTokens.begin(), lstTokens.end()); iTokenTime = 0; iTokenType = 0; bEnd = false; for(midi_token_list::iterator itr = lstTokens.begin(), itrEnd = lstTokens.end(); itr != itrEnd && !bEnd; ++itr) { if(!bufOutput.write_variable_length_uint(itr->time - iTokenTime)) return nullptr; iTokenTime = itr->time; if(itr->type >= 0xF0) { if(!bufOutput.write(iTokenType = itr->type)) return nullptr; if(iTokenType == 0xFF) { if(!bufOutput.write(itr->data)) return nullptr; if(itr->data == 0x2F) bEnd = true; } if(!bufOutput.write_variable_length_uint(itr->buffer_length)) return nullptr; if(!bufOutput.write(itr->buffer, itr->buffer_length)) return nullptr; } else { if(itr->type != iTokenType) { if(!bufOutput.write(iTokenType = itr->type)) return nullptr; } if(!bufOutput.write(itr->data)) return nullptr; if(itr->buffer) { if(!bufOutput.write(itr->buffer, 1)) return nullptr; } } } uint32_t iLength = static_cast(bufOutput.tell() - 22); bufOutput.seek(18); bufOutput.write_big_endian_uint32(iLength); return bufOutput.take_data(midi_length); } #endif CorsixTH-0.63/CorsixTH/Src/xmi2mid.h000066400000000000000000000032511347163623700171360ustar00rootroot00000000000000/* Copyright (c) 2009 Peter "Corsix" Cawley 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. */ #ifndef CORSIX_TH_XMI2MID_H_ #define CORSIX_TH_XMI2MID_H_ #include "config.h" #ifdef CORSIX_TH_USE_SDL_MIXER uint8_t* transcode_xmi_to_midi(const unsigned char* xmi_data, size_t xmi_length, size_t* midi_length); #else // CORSIX_TH_USE_SDL_MIXER inline uint8_t* transcode_xmi_to_midi(const unsigned char* xmi_data, size_t xmi_length, size_t* midi_length) { // When SDL_mixer isn't being used, there is no need to transocde XMI to // MIDI, so the function always fails. return nullptr; } #endif // CORSIX_TH_USE_SDL_MIXER #endif // CORSIX_TH_XMI2MID_H_ CorsixTH-0.63/CorsixTH/SrcUnshared/000077500000000000000000000000001347163623700171055ustar00rootroot00000000000000CorsixTH-0.63/CorsixTH/SrcUnshared/main.cpp000066400000000000000000000073211347163623700205400ustar00rootroot00000000000000/* Copyright (c) 2009 Peter "Corsix" Cawley 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. */ #include "config.h" #include "../Src/main.h" #include "../Src/bootstrap.h" #include #include #ifdef CORSIX_TH_USE_SDL_MIXER #include #endif // Template magic for checking type equality template struct types_equal{ enum{ result = -1, }; }; template struct types_equal{ enum{ result = 1, }; }; static void cleanup(lua_State* L) { #ifdef CORSIX_TH_USE_SDL_MIXER while(Mix_QuerySpec(nullptr, nullptr, nullptr)) { Mix_CloseAudio(); } #endif SDL_Quit(); lua_close(L); } //! Program entry point /*! Prepares a Lua state for, and catches errors from, lua_main(). By executing in Lua mode as soon as possible, errors can be nicely caught sooner, hence this function does as little as possible and leaves the rest for lua_main(). */ int main(int argc, char** argv) { struct compile_time_lua_check { // Lua 5.1, not 5.0, is required int lua_5_point_1_required[LUA_VERSION_NUM >= 501 ? 1 : -1]; // Lua numbers must be doubles so that the mantissa has at least // 32 bits (floats only have 24 bits) int number_is_double[types_equal::result]; }; bool bRun = true; while(bRun) { lua_State *L = NULL; L = luaL_newstate(); if(L == NULL) { fprintf(stderr, "Fatal error starting CorsixTH: " "Cannot open Lua state.\n"); return 0; } lua_atpanic(L, lua_panic); luaL_openlibs(L); lua_settop(L, 0); lua_pushcfunction(L, lua_stacktrace); lua_pushcfunction(L, lua_main); // Move command line parameters onto the Lua stack lua_checkstack(L, argc); for(int i = 0; i < argc; ++i) { lua_pushstring(L, argv[i]); } if(lua_pcall(L, argc, 0, 1) != 0) { const char* err = lua_tostring(L, -1); if(err != NULL) { fprintf(stderr, "%s\n", err); } else { fprintf(stderr, "An error has occurred in CorsixTH:\n" "Uncaught non-string Lua error\n"); } lua_pushcfunction(L, bootstrap_lua_error_report); lua_insert(L, -2); if(lua_pcall(L, 1, 0, 0) != 0) { fprintf(stderr, "%s\n", lua_tostring(L, -1)); } } lua_getfield(L, LUA_REGISTRYINDEX, "_RESTART"); bRun = lua_toboolean(L, -1) != 0; cleanup(L); if(bRun) { printf("\n\nRestarting...\n\n\n"); } } return 0; } CorsixTH-0.63/CorsixTH/com.corsixth.CorsixTH.appdata.xml000066400000000000000000000076451347163623700231550ustar00rootroot00000000000000 com.corsixth.CorsixTH.desktop CC0 BSD-3-Clause AND MIT CorsixTH Open source clone of Theme Hospital

CorsixTH aims to reimplement the game engine of Theme Hospital, and be able to load the original game data files. This means that you will need a purchased copy of Theme Hospital, or a copy of the demo, in order to use CorsixTH. After most of the original engine has been reimplemented in open source code, the project will serve as a base from which extensions and improvements to the original game can be made.

  • To play CorsixTH, you will need either the Demo: https://th.corsix.org/Demo.zip
  • or the full game of Theme Hospital, available for example at: https://www.gog.com/game/theme_hospital
corsix-th http://corsixth.com/wp-content/uploads/2016/04/screenshot9-1024x640.jpg http://corsixth.com/wp-content/uploads/2016/04/screenshot0-1024x640.jpg https://camo.githubusercontent.com/1b82352e0f0eac03a6927af7e9d7bbad8c380f93/687474703a2f2f692e696d6775722e636f6d2f714856363055692e706e67 intense none none none none none none none none none none mild none none none none none none moderate none none none none none none none none CorsixTH developers http://corsixth.com https://github.com/CorsixTH/CorsixTH/issues http://forums.corsixth.com/index.php/board,11.0.html https://github.com/CorsixTH/CorsixTH/wiki
CorsixTH-0.63/CorsixTH/com.corsixth.CorsixTH.desktop000066400000000000000000000004071347163623700224020ustar00rootroot00000000000000[Desktop Entry] Name=CorsixTH Exec=corsix-th Comment=Open source clone of Theme Hospital Comment[de]=Ein Klon von Theme Hospital Icon=corsix-th Type=Application Terminal=false StartupNotify=false Categories=Game;Simulation; Keywords=hospital;simulation;bullfrog; CorsixTH-0.63/CorsixTH/corsix-th.6000066400000000000000000000065021347163623700166760ustar00rootroot00000000000000.\" Copyright (c) 2018 Stephen "TheCycoONE" Baker .\" .\" 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. .\" .\" This manpage is written in mdoc(7). .\" Language reference: https://man.openbsd.org/mdoc.7 .Dd August 22, 2018 .Dt CORSIX-TH 6 .Os .Sh NAME .Nm corsix-th .Nd "An" open source implementation "of" Theme Hospital .Sh SYNOPSIS .Nm .Op Fl -bitmap-dir Ns = Ns Ar path .Op Fl -config-file Ns = Ns Ar path .Op Fl -connect-lua-dbgp .Op Fl -dump=strings .Op Fl -interpreter Ns = Ns Ar path .Op Fl -load Ns = Ns Ar savegame .Op Fl -lua-dir Ns = Ns Ar path .Sh DESCRIPTION CorsixTH is a reimplementation of the 1997 Bullfrog business simulation game Theme Hospital. As well as faithfully recreating the original, CorsixTH adds support for modern operating systems, high resolution displays, and much more. A purchased copy of Theme Hospital, or the Theme Hospital demo is required to use CorsixTH. .Pp For more information visit .Sm off .Lk https://corsixth.com \&. .Sm on .Sh OPTIONS .Bl -tag -width 6n .It Fl -bitmap-dir Ns = Ns Ar directory Use .Ar directory for loading in game bitmaps. .It Fl -config-file Ns = Ns Ar path Use the specified config file instead of the default one. .It Fl -connect-lua-dbgp Connect to a Lua DBGp server. .It Fl -dump=strings Dumps all of the game strings to the config directory. .It Fl -interpreter Ns = Ns Ar path Run the lua bootstrap file at .Ar path \&. This is the option you would use to point corsix-th to the CorsixTH.lua in a local git checkout. .It Fl -load Ns = Ns Ar savegame Load the specified .Ar savegame file from the Saves folder. .Ar savegame must include the .sav extension. .It Fl -lua-dir Ns = Ns Ar directory Use .Ar directory for loading the game engine lua scripts. .El .Sh FILES .Bl -tag -width 6n .It Pa $XDG_CONFIG_HOME/CorsixTH/config.txt Configuration file. .It Pa $XDG_CONFIG_HOME/CorsixTH/gamelog.txt Log of the last run. Necessary for bug reporting. .It Pa $XDG_CONFIG_HOME/CorsixTH/Levels/ Custom levels. The map editor saves maps in this directory. .It Pa $XDG_CONFIG_HOME/CorsixTH/Saves/ Savegame directory. .It Pa $XDG_CONFIG_HOME/CorsixTH/Screenshots/ Screenshot directory. .El .Sh COPYRIGHT Copyright CorsixTH contributors. CorsixTH is available under the MIT license. .Pp For the full license text see: .Lk https://raw.githubusercontent.com/CorsixTH/CorsixTH/v0.62/LICENSE.txt CorsixTH-0.63/CorsixTH/resource.h000066400000000000000000000006621347163623700166700ustar00rootroot00000000000000//{{NO_DEPENDENCIES}} // Microsoft Visual C++ generated include file. // Used by CorsixTH.rc // #define IDI_CORSIXTH 103 // Next default values for new objects // #ifdef APSTUDIO_INVOKED #ifndef APSTUDIO_READONLY_SYMBOLS #define _APS_NEXT_RESOURCE_VALUE 104 #define _APS_NEXT_COMMAND_VALUE 40002 #define _APS_NEXT_CONTROL_VALUE 1001 #define _APS_NEXT_SYMED_VALUE 101 #endif #endif CorsixTH-0.63/CorsixTH/run-corsix-th-dev.sh.in000077500000000000000000000001561347163623700211300ustar00rootroot00000000000000#!/bin/sh "@CMAKE_CURRENT_BINARY_DIR@/corsix-th" --interpreter="@CMAKE_SOURCE_DIR@/CorsixTH/CorsixTH.lua" $@ CorsixTH-0.63/CorsixTH/run-corsix-th-dev.sh.in.apple000077500000000000000000000002111347163623700222200ustar00rootroot00000000000000#!/bin/sh "@CMAKE_CURRENT_BINARY_DIR@/CorsixTH.app/Contents/MacOS/CorsixTH" --interpreter="@CMAKE_SOURCE_DIR@/CorsixTH/CorsixTH.lua" $@ CorsixTH-0.63/DoxyGen/000077500000000000000000000000001347163623700145365ustar00rootroot00000000000000CorsixTH-0.63/DoxyGen/animview.doxygen.in000066400000000000000000003027661347163623700203770ustar00rootroot00000000000000# Doxyfile 1.8.6 # This file describes the settings to be used by the documentation system # doxygen (www.doxygen.org) for a project. # # All text after a double hash (##) is considered a comment and is placed in # front of the TAG it is preceding. # # All text after a single hash (#) is considered a comment and will be ignored. # The format is: # TAG = value [value, ...] # For lists, items can also be appended using: # TAG += value [value, ...] # Values that contain spaces should be placed between quotes (\" \"). #--------------------------------------------------------------------------- # Project related configuration options #--------------------------------------------------------------------------- # This tag specifies the encoding used for all characters in the config file # that follow. The default is UTF-8 which is also the encoding used for all text # before the first occurrence of this tag. Doxygen uses libiconv (or the iconv # built into libc) for the transcoding. See http://www.gnu.org/software/libiconv # for the list of possible encodings. # The default value is: UTF-8. DOXYFILE_ENCODING = UTF-8 # The PROJECT_NAME tag is a single word (or a sequence of words surrounded by # double-quotes, unless you are using Doxywizard) that should identify the # project for which the documentation is generated. This name is used in the # title of most generated pages and in a few other places. # The default value is: My Project. PROJECT_NAME = "Anim View" # The PROJECT_NUMBER tag can be used to enter a project or revision number. This # could be handy for archiving the generated documentation or if some version # control system is used. PROJECT_NUMBER = # Using the PROJECT_BRIEF tag one can provide an optional one line description # for a project that appears at the top of each page and should give viewer a # quick idea about the purpose of the project. Keep the description short. PROJECT_BRIEF = "TH Animation Viewer" # With the PROJECT_LOGO tag one can specify an logo or icon that is included in # the documentation. The maximum height of the logo should not exceed 55 pixels # and the maximum width should not exceed 200 pixels. Doxygen will copy the logo # to the output directory. PROJECT_LOGO = # The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute) path # into which the generated documentation will be written. If a relative path is # entered, it will be relative to the location where doxygen was started. If # left blank the current directory will be used. OUTPUT_DIRECTORY = animview # If the CREATE_SUBDIRS tag is set to YES, then doxygen will create 4096 sub- # directories (in 2 levels) under the output directory of each output format and # will distribute the generated files over these directories. Enabling this # option can be useful when feeding doxygen a huge amount of source files, where # putting all generated files in the same directory would otherwise causes # performance problems for the file system. # The default value is: NO. CREATE_SUBDIRS = NO # The OUTPUT_LANGUAGE tag is used to specify the language in which all # documentation generated by doxygen is written. Doxygen will use this # information to generate all constant output in the proper language. # Possible values are: Afrikaans, Arabic, Armenian, Brazilian, Catalan, Chinese, # Chinese-Traditional, Croatian, Czech, Danish, Dutch, English (United States), # Esperanto, Farsi (Persian), Finnish, French, German, Greek, Hungarian, # Indonesian, Italian, Japanese, Japanese-en (Japanese with English messages), # Korean, Korean-en (Korean with English messages), Latvian, Lithuanian, # Macedonian, Norwegian, Persian (Farsi), Polish, Portuguese, Romanian, Russian, # Serbian, Serbian-Cyrillic, Slovak, Slovene, Spanish, Swedish, Turkish, # Ukrainian and Vietnamese. # The default value is: English. OUTPUT_LANGUAGE = English # If the BRIEF_MEMBER_DESC tag is set to YES doxygen will include brief member # descriptions after the members that are listed in the file and class # documentation (similar to Javadoc). Set to NO to disable this. # The default value is: YES. BRIEF_MEMBER_DESC = YES # If the REPEAT_BRIEF tag is set to YES doxygen will prepend the brief # description of a member or function before the detailed description # # Note: If both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the # brief descriptions will be completely suppressed. # The default value is: YES. REPEAT_BRIEF = YES # This tag implements a quasi-intelligent brief description abbreviator that is # used to form the text in various listings. Each string in this list, if found # as the leading text of the brief description, will be stripped from the text # and the result, after processing the whole list, is used as the annotated # text. Otherwise, the brief description is used as-is. If left blank, the # following values are used ($name is automatically replaced with the name of # the entity):The $name class, The $name widget, The $name file, is, provides, # specifies, contains, represents, a, an and the. ABBREVIATE_BRIEF = # If the ALWAYS_DETAILED_SEC and REPEAT_BRIEF tags are both set to YES then # doxygen will generate a detailed section even if there is only a brief # description. # The default value is: NO. ALWAYS_DETAILED_SEC = NO # If the INLINE_INHERITED_MEMB tag is set to YES, doxygen will show all # inherited members of a class in the documentation of that class as if those # members were ordinary class members. Constructors, destructors and assignment # operators of the base classes will not be shown. # The default value is: NO. INLINE_INHERITED_MEMB = NO # If the FULL_PATH_NAMES tag is set to YES doxygen will prepend the full path # before files name in the file list and in the header files. If set to NO the # shortest path that makes the file name unique will be used # The default value is: YES. FULL_PATH_NAMES = NO # The STRIP_FROM_PATH tag can be used to strip a user-defined part of the path. # Stripping is only done if one of the specified strings matches the left-hand # part of the path. The tag can be used to show relative paths in the file list. # If left blank the directory from which doxygen is run is used as the path to # strip. # # Note that you can specify absolute paths here, but also relative paths, which # will be relative from the directory where doxygen is started. # This tag requires that the tag FULL_PATH_NAMES is set to YES. STRIP_FROM_PATH = # The STRIP_FROM_INC_PATH tag can be used to strip a user-defined part of the # path mentioned in the documentation of a class, which tells the reader which # header file to include in order to use a class. If left blank only the name of # the header file containing the class definition is used. Otherwise one should # specify the list of include paths that are normally passed to the compiler # using the -I flag. STRIP_FROM_INC_PATH = # If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter (but # less readable) file names. This can be useful is your file systems doesn't # support long names like on DOS, Mac, or CD-ROM. # The default value is: NO. SHORT_NAMES = NO # If the JAVADOC_AUTOBRIEF tag is set to YES then doxygen will interpret the # first line (until the first dot) of a Javadoc-style comment as the brief # description. If set to NO, the Javadoc-style will behave just like regular Qt- # style comments (thus requiring an explicit @brief command for a brief # description.) # The default value is: NO. JAVADOC_AUTOBRIEF = NO # If the QT_AUTOBRIEF tag is set to YES then doxygen will interpret the first # line (until the first dot) of a Qt-style comment as the brief description. If # set to NO, the Qt-style will behave just like regular Qt-style comments (thus # requiring an explicit \brief command for a brief description.) # The default value is: NO. QT_AUTOBRIEF = NO # The MULTILINE_CPP_IS_BRIEF tag can be set to YES to make doxygen treat a # multi-line C++ special comment block (i.e. a block of //! or /// comments) as # a brief description. This used to be the default behavior. The new default is # to treat a multi-line C++ comment block as a detailed description. Set this # tag to YES if you prefer the old behavior instead. # # Note that setting this tag to YES also means that rational rose comments are # not recognized any more. # The default value is: NO. MULTILINE_CPP_IS_BRIEF = NO # If the INHERIT_DOCS tag is set to YES then an undocumented member inherits the # documentation from any documented member that it re-implements. # The default value is: YES. INHERIT_DOCS = YES # If the SEPARATE_MEMBER_PAGES tag is set to YES, then doxygen will produce a # new page for each member. If set to NO, the documentation of a member will be # part of the file/class/namespace that contains it. # The default value is: NO. SEPARATE_MEMBER_PAGES = NO # The TAB_SIZE tag can be used to set the number of spaces in a tab. Doxygen # uses this value to replace tabs by spaces in code fragments. # Minimum value: 1, maximum value: 16, default value: 4. TAB_SIZE = 4 # This tag can be used to specify a number of aliases that act as commands in # the documentation. An alias has the form: # name=value # For example adding # "sideeffect=@par Side Effects:\n" # will allow you to put the command \sideeffect (or @sideeffect) in the # documentation, which will result in a user-defined paragraph with heading # "Side Effects:". You can put \n's in the value part of an alias to insert # newlines. ALIASES = # This tag can be used to specify a number of word-keyword mappings (TCL only). # A mapping has the form "name=value". For example adding "class=itcl::class" # will allow you to use the command class in the itcl::class meaning. TCL_SUBST = # Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C sources # only. Doxygen will then generate output that is more tailored for C. For # instance, some of the names that are used will be different. The list of all # members will be omitted, etc. # The default value is: NO. OPTIMIZE_OUTPUT_FOR_C = NO # Set the OPTIMIZE_OUTPUT_JAVA tag to YES if your project consists of Java or # Python sources only. Doxygen will then generate output that is more tailored # for that language. For instance, namespaces will be presented as packages, # qualified scopes will look different, etc. # The default value is: NO. OPTIMIZE_OUTPUT_JAVA = NO # Set the OPTIMIZE_FOR_FORTRAN tag to YES if your project consists of Fortran # sources. Doxygen will then generate output that is tailored for Fortran. # The default value is: NO. OPTIMIZE_FOR_FORTRAN = NO # Set the OPTIMIZE_OUTPUT_VHDL tag to YES if your project consists of VHDL # sources. Doxygen will then generate output that is tailored for VHDL. # The default value is: NO. OPTIMIZE_OUTPUT_VHDL = NO # Doxygen selects the parser to use depending on the extension of the files it # parses. With this tag you can assign which parser to use for a given # extension. Doxygen has a built-in mapping, but you can override or extend it # using this tag. The format is ext=language, where ext is a file extension, and # language is one of the parsers supported by doxygen: IDL, Java, Javascript, # C#, C, C++, D, PHP, Objective-C, Python, Fortran, VHDL. For instance to make # doxygen treat .inc files as Fortran files (default is PHP), and .f files as C # (default is Fortran), use: inc=Fortran f=C. # # Note For files without extension you can use no_extension as a placeholder. # # Note that for custom extensions you also need to set FILE_PATTERNS otherwise # the files are not read by doxygen. EXTENSION_MAPPING = # If the MARKDOWN_SUPPORT tag is enabled then doxygen pre-processes all comments # according to the Markdown format, which allows for more readable # documentation. See http://daringfireball.net/projects/markdown/ for details. # The output of markdown processing is further processed by doxygen, so you can # mix doxygen, HTML, and XML commands with Markdown formatting. Disable only in # case of backward compatibilities issues. # The default value is: YES. MARKDOWN_SUPPORT = YES # When enabled doxygen tries to link words that correspond to documented # classes, or namespaces to their corresponding documentation. Such a link can # be prevented in individual cases by by putting a % sign in front of the word # or globally by setting AUTOLINK_SUPPORT to NO. # The default value is: YES. AUTOLINK_SUPPORT = YES # If you use STL classes (i.e. std::string, std::vector, etc.) but do not want # to include (a tag file for) the STL sources as input, then you should set this # tag to YES in order to let doxygen match functions declarations and # definitions whose arguments contain STL classes (e.g. func(std::string); # versus func(std::string) {}). This also make the inheritance and collaboration # diagrams that involve STL classes more complete and accurate. # The default value is: NO. BUILTIN_STL_SUPPORT = NO # If you use Microsoft's C++/CLI language, you should set this option to YES to # enable parsing support. # The default value is: NO. CPP_CLI_SUPPORT = NO # Set the SIP_SUPPORT tag to YES if your project consists of sip (see: # http://www.riverbankcomputing.co.uk/software/sip/intro) sources only. Doxygen # will parse them like normal C++ but will assume all classes use public instead # of private inheritance when no explicit protection keyword is present. # The default value is: NO. SIP_SUPPORT = NO # For Microsoft's IDL there are propget and propput attributes to indicate # getter and setter methods for a property. Setting this option to YES will make # doxygen to replace the get and set methods by a property in the documentation. # This will only work if the methods are indeed getting or setting a simple # type. If this is not the case, or you want to show the methods anyway, you # should set this option to NO. # The default value is: YES. IDL_PROPERTY_SUPPORT = YES # If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC # tag is set to YES, then doxygen will reuse the documentation of the first # member in the group (if any) for the other members of the group. By default # all members of a group must be documented explicitly. # The default value is: NO. DISTRIBUTE_GROUP_DOC = NO # Set the SUBGROUPING tag to YES to allow class member groups of the same type # (for instance a group of public functions) to be put as a subgroup of that # type (e.g. under the Public Functions section). Set it to NO to prevent # subgrouping. Alternatively, this can be done per class using the # \nosubgrouping command. # The default value is: YES. SUBGROUPING = YES # When the INLINE_GROUPED_CLASSES tag is set to YES, classes, structs and unions # are shown inside the group in which they are included (e.g. using \ingroup) # instead of on a separate page (for HTML and Man pages) or section (for LaTeX # and RTF). # # Note that this feature does not work in combination with # SEPARATE_MEMBER_PAGES. # The default value is: NO. INLINE_GROUPED_CLASSES = NO # When the INLINE_SIMPLE_STRUCTS tag is set to YES, structs, classes, and unions # with only public data fields or simple typedef fields will be shown inline in # the documentation of the scope in which they are defined (i.e. file, # namespace, or group documentation), provided this scope is documented. If set # to NO, structs, classes, and unions are shown on a separate page (for HTML and # Man pages) or section (for LaTeX and RTF). # The default value is: NO. INLINE_SIMPLE_STRUCTS = NO # When TYPEDEF_HIDES_STRUCT tag is enabled, a typedef of a struct, union, or # enum is documented as struct, union, or enum with the name of the typedef. So # typedef struct TypeS {} TypeT, will appear in the documentation as a struct # with name TypeT. When disabled the typedef will appear as a member of a file, # namespace, or class. And the struct will be named TypeS. This can typically be # useful for C code in case the coding convention dictates that all compound # types are typedef'ed and only the typedef is referenced, never the tag name. # The default value is: NO. TYPEDEF_HIDES_STRUCT = NO # The size of the symbol lookup cache can be set using LOOKUP_CACHE_SIZE. This # cache is used to resolve symbols given their name and scope. Since this can be # an expensive process and often the same symbol appears multiple times in the # code, doxygen keeps a cache of pre-resolved symbols. If the cache is too small # doxygen will become slower. If the cache is too large, memory is wasted. The # cache size is given by this formula: 2^(16+LOOKUP_CACHE_SIZE). The valid range # is 0..9, the default is 0, corresponding to a cache size of 2^16=65536 # symbols. At the end of a run doxygen will report the cache usage and suggest # the optimal cache size from a speed point of view. # Minimum value: 0, maximum value: 9, default value: 0. LOOKUP_CACHE_SIZE = 0 #--------------------------------------------------------------------------- # Build related configuration options #--------------------------------------------------------------------------- # If the EXTRACT_ALL tag is set to YES doxygen will assume all entities in # documentation are documented, even if no documentation was available. Private # class members and static file members will be hidden unless the # EXTRACT_PRIVATE respectively EXTRACT_STATIC tags are set to YES. # Note: This will also disable the warnings about undocumented members that are # normally produced when WARNINGS is set to YES. # The default value is: NO. EXTRACT_ALL = YES # If the EXTRACT_PRIVATE tag is set to YES all private members of a class will # be included in the documentation. # The default value is: NO. EXTRACT_PRIVATE = NO # If the EXTRACT_PACKAGE tag is set to YES all members with package or internal # scope will be included in the documentation. # The default value is: NO. EXTRACT_PACKAGE = NO # If the EXTRACT_STATIC tag is set to YES all static members of a file will be # included in the documentation. # The default value is: NO. EXTRACT_STATIC = NO # If the EXTRACT_LOCAL_CLASSES tag is set to YES classes (and structs) defined # locally in source files will be included in the documentation. If set to NO # only classes defined in header files are included. Does not have any effect # for Java sources. # The default value is: YES. EXTRACT_LOCAL_CLASSES = YES # This flag is only useful for Objective-C code. When set to YES local methods, # which are defined in the implementation section but not in the interface are # included in the documentation. If set to NO only methods in the interface are # included. # The default value is: NO. EXTRACT_LOCAL_METHODS = NO # If this flag is set to YES, the members of anonymous namespaces will be # extracted and appear in the documentation as a namespace called # 'anonymous_namespace{file}', where file will be replaced with the base name of # the file that contains the anonymous namespace. By default anonymous namespace # are hidden. # The default value is: NO. EXTRACT_ANON_NSPACES = NO # If the HIDE_UNDOC_MEMBERS tag is set to YES, doxygen will hide all # undocumented members inside documented classes or files. If set to NO these # members will be included in the various overviews, but no documentation # section is generated. This option has no effect if EXTRACT_ALL is enabled. # The default value is: NO. HIDE_UNDOC_MEMBERS = NO # If the HIDE_UNDOC_CLASSES tag is set to YES, doxygen will hide all # undocumented classes that are normally visible in the class hierarchy. If set # to NO these classes will be included in the various overviews. This option has # no effect if EXTRACT_ALL is enabled. # The default value is: NO. HIDE_UNDOC_CLASSES = NO # If the HIDE_FRIEND_COMPOUNDS tag is set to YES, doxygen will hide all friend # (class|struct|union) declarations. If set to NO these declarations will be # included in the documentation. # The default value is: NO. HIDE_FRIEND_COMPOUNDS = NO # If the HIDE_IN_BODY_DOCS tag is set to YES, doxygen will hide any # documentation blocks found inside the body of a function. If set to NO these # blocks will be appended to the function's detailed documentation block. # The default value is: NO. HIDE_IN_BODY_DOCS = NO # The INTERNAL_DOCS tag determines if documentation that is typed after a # \internal command is included. If the tag is set to NO then the documentation # will be excluded. Set it to YES to include the internal documentation. # The default value is: NO. INTERNAL_DOCS = NO # If the CASE_SENSE_NAMES tag is set to NO then doxygen will only generate file # names in lower-case letters. If set to YES upper-case letters are also # allowed. This is useful if you have classes or files whose names only differ # in case and if your file system supports case sensitive file names. Windows # and Mac users are advised to set this option to NO. # The default value is: system dependent. CASE_SENSE_NAMES = YES # If the HIDE_SCOPE_NAMES tag is set to NO then doxygen will show members with # their full class and namespace scopes in the documentation. If set to YES the # scope will be hidden. # The default value is: NO. HIDE_SCOPE_NAMES = NO # If the SHOW_INCLUDE_FILES tag is set to YES then doxygen will put a list of # the files that are included by a file in the documentation of that file. # The default value is: YES. SHOW_INCLUDE_FILES = YES # If the SHOW_GROUPED_MEMB_INC tag is set to YES then Doxygen will add for each # grouped member an include statement to the documentation, telling the reader # which file to include in order to use the member. # The default value is: NO. SHOW_GROUPED_MEMB_INC = NO # If the FORCE_LOCAL_INCLUDES tag is set to YES then doxygen will list include # files with double quotes in the documentation rather than with sharp brackets. # The default value is: NO. FORCE_LOCAL_INCLUDES = NO # If the INLINE_INFO tag is set to YES then a tag [inline] is inserted in the # documentation for inline members. # The default value is: YES. INLINE_INFO = YES # If the SORT_MEMBER_DOCS tag is set to YES then doxygen will sort the # (detailed) documentation of file and class members alphabetically by member # name. If set to NO the members will appear in declaration order. # The default value is: YES. SORT_MEMBER_DOCS = YES # If the SORT_BRIEF_DOCS tag is set to YES then doxygen will sort the brief # descriptions of file, namespace and class members alphabetically by member # name. If set to NO the members will appear in declaration order. Note that # this will also influence the order of the classes in the class list. # The default value is: NO. SORT_BRIEF_DOCS = NO # If the SORT_MEMBERS_CTORS_1ST tag is set to YES then doxygen will sort the # (brief and detailed) documentation of class members so that constructors and # destructors are listed first. If set to NO the constructors will appear in the # respective orders defined by SORT_BRIEF_DOCS and SORT_MEMBER_DOCS. # Note: If SORT_BRIEF_DOCS is set to NO this option is ignored for sorting brief # member documentation. # Note: If SORT_MEMBER_DOCS is set to NO this option is ignored for sorting # detailed member documentation. # The default value is: NO. SORT_MEMBERS_CTORS_1ST = NO # If the SORT_GROUP_NAMES tag is set to YES then doxygen will sort the hierarchy # of group names into alphabetical order. If set to NO the group names will # appear in their defined order. # The default value is: NO. SORT_GROUP_NAMES = NO # If the SORT_BY_SCOPE_NAME tag is set to YES, the class list will be sorted by # fully-qualified names, including namespaces. If set to NO, the class list will # be sorted only by class name, not including the namespace part. # Note: This option is not very useful if HIDE_SCOPE_NAMES is set to YES. # Note: This option applies only to the class list, not to the alphabetical # list. # The default value is: NO. SORT_BY_SCOPE_NAME = NO # If the STRICT_PROTO_MATCHING option is enabled and doxygen fails to do proper # type resolution of all parameters of a function it will reject a match between # the prototype and the implementation of a member function even if there is # only one candidate or it is obvious which candidate to choose by doing a # simple string match. By disabling STRICT_PROTO_MATCHING doxygen will still # accept a match between prototype and implementation in such cases. # The default value is: NO. STRICT_PROTO_MATCHING = NO # The GENERATE_TODOLIST tag can be used to enable ( YES) or disable ( NO) the # todo list. This list is created by putting \todo commands in the # documentation. # The default value is: YES. GENERATE_TODOLIST = YES # The GENERATE_TESTLIST tag can be used to enable ( YES) or disable ( NO) the # test list. This list is created by putting \test commands in the # documentation. # The default value is: YES. GENERATE_TESTLIST = YES # The GENERATE_BUGLIST tag can be used to enable ( YES) or disable ( NO) the bug # list. This list is created by putting \bug commands in the documentation. # The default value is: YES. GENERATE_BUGLIST = YES # The GENERATE_DEPRECATEDLIST tag can be used to enable ( YES) or disable ( NO) # the deprecated list. This list is created by putting \deprecated commands in # the documentation. # The default value is: YES. GENERATE_DEPRECATEDLIST= YES # The ENABLED_SECTIONS tag can be used to enable conditional documentation # sections, marked by \if ... \endif and \cond # ... \endcond blocks. ENABLED_SECTIONS = # The MAX_INITIALIZER_LINES tag determines the maximum number of lines that the # initial value of a variable or macro / define can have for it to appear in the # documentation. If the initializer consists of more lines than specified here # it will be hidden. Use a value of 0 to hide initializers completely. The # appearance of the value of individual variables and macros / defines can be # controlled using \showinitializer or \hideinitializer command in the # documentation regardless of this setting. # Minimum value: 0, maximum value: 10000, default value: 30. MAX_INITIALIZER_LINES = 30 # Set the SHOW_USED_FILES tag to NO to disable the list of files generated at # the bottom of the documentation of classes and structs. If set to YES the list # will mention the files that were used to generate the documentation. # The default value is: YES. SHOW_USED_FILES = YES # Set the SHOW_FILES tag to NO to disable the generation of the Files page. This # will remove the Files entry from the Quick Index and from the Folder Tree View # (if specified). # The default value is: YES. SHOW_FILES = YES # Set the SHOW_NAMESPACES tag to NO to disable the generation of the Namespaces # page. This will remove the Namespaces entry from the Quick Index and from the # Folder Tree View (if specified). # The default value is: YES. SHOW_NAMESPACES = YES # The FILE_VERSION_FILTER tag can be used to specify a program or script that # doxygen should invoke to get the current version for each file (typically from # the version control system). Doxygen will invoke the program by executing (via # popen()) the command command input-file, where command is the value of the # FILE_VERSION_FILTER tag, and input-file is the name of an input file provided # by doxygen. Whatever the program writes to standard output is used as the file # version. For an example see the documentation. FILE_VERSION_FILTER = # The LAYOUT_FILE tag can be used to specify a layout file which will be parsed # by doxygen. The layout file controls the global structure of the generated # output files in an output format independent way. To create the layout file # that represents doxygen's defaults, run doxygen with the -l option. You can # optionally specify a file name after the option, if omitted DoxygenLayout.xml # will be used as the name of the layout file. # # Note that if you run doxygen from a directory containing a file called # DoxygenLayout.xml, doxygen will parse it automatically even if the LAYOUT_FILE # tag is left empty. LAYOUT_FILE = # The CITE_BIB_FILES tag can be used to specify one or more bib files containing # the reference definitions. This must be a list of .bib files. The .bib # extension is automatically appended if omitted. This requires the bibtex tool # to be installed. See also http://en.wikipedia.org/wiki/BibTeX for more info. # For LaTeX the style of the bibliography can be controlled using # LATEX_BIB_STYLE. To use this feature you need bibtex and perl available in the # search path. Do not use file names with spaces, bibtex cannot handle them. See # also \cite for info how to create references. CITE_BIB_FILES = #--------------------------------------------------------------------------- # Configuration options related to warning and progress messages #--------------------------------------------------------------------------- # The QUIET tag can be used to turn on/off the messages that are generated to # standard output by doxygen. If QUIET is set to YES this implies that the # messages are off. # The default value is: NO. QUIET = YES # The WARNINGS tag can be used to turn on/off the warning messages that are # generated to standard error ( stderr) by doxygen. If WARNINGS is set to YES # this implies that the warnings are on. # # Tip: Turn warnings on while writing the documentation. # The default value is: YES. WARNINGS = YES # If the WARN_IF_UNDOCUMENTED tag is set to YES, then doxygen will generate # warnings for undocumented members. If EXTRACT_ALL is set to YES then this flag # will automatically be disabled. # The default value is: YES. WARN_IF_UNDOCUMENTED = YES # If the WARN_IF_DOC_ERROR tag is set to YES, doxygen will generate warnings for # potential errors in the documentation, such as not documenting some parameters # in a documented function, or documenting parameters that don't exist or using # markup commands wrongly. # The default value is: YES. WARN_IF_DOC_ERROR = YES # This WARN_NO_PARAMDOC option can be enabled to get warnings for functions that # are documented, but have no documentation for their parameters or return # value. If set to NO doxygen will only warn about wrong or incomplete parameter # documentation, but not about the absence of documentation. # The default value is: NO. WARN_NO_PARAMDOC = NO # The WARN_FORMAT tag determines the format of the warning messages that doxygen # can produce. The string should contain the $file, $line, and $text tags, which # will be replaced by the file and line number from which the warning originated # and the warning text. Optionally the format may contain $version, which will # be replaced by the version of the file (if it could be obtained via # FILE_VERSION_FILTER) # The default value is: $file:$line: $text. WARN_FORMAT = "$file:$line: $text" # The WARN_LOGFILE tag can be used to specify a file to which warning and error # messages should be written. If left blank the output is written to standard # error (stderr). WARN_LOGFILE = #--------------------------------------------------------------------------- # Configuration options related to the input files #--------------------------------------------------------------------------- # The INPUT tag is used to specify the files and/or directories that contain # documented source files. You may enter file names like myfile.cpp or # directories like /usr/src/myproject. Separate the files or directories with # spaces. # Note: If this tag is empty the current directory is searched. INPUT = "@CMAKE_SOURCE_DIR@/AnimView" # This tag can be used to specify the character encoding of the source files # that doxygen parses. Internally doxygen uses the UTF-8 encoding. Doxygen uses # libiconv (or the iconv built into libc) for the transcoding. See the libiconv # documentation (see: http://www.gnu.org/software/libiconv) for the list of # possible encodings. # The default value is: UTF-8. INPUT_ENCODING = UTF-8 # If the value of the INPUT tag contains directories, you can use the # FILE_PATTERNS tag to specify one or more wildcard patterns (like *.cpp and # *.h) to filter out the source-files in the directories. If left blank the # following patterns are tested:*.c, *.cc, *.cxx, *.cpp, *.c++, *.java, *.ii, # *.ixx, *.ipp, *.i++, *.inl, *.idl, *.ddl, *.odl, *.h, *.hh, *.hxx, *.hpp, # *.h++, *.cs, *.d, *.php, *.php4, *.php5, *.phtml, *.inc, *.m, *.markdown, # *.md, *.mm, *.dox, *.py, *.f90, *.f, *.for, *.tcl, *.vhd, *.vhdl, *.ucf, # *.qsf, *.as and *.js. FILE_PATTERNS = # The RECURSIVE tag can be used to specify whether or not subdirectories should # be searched for input files as well. # The default value is: NO. RECURSIVE = YES # The EXCLUDE tag can be used to specify files and/or directories that should be # excluded from the INPUT source files. This way you can easily exclude a # subdirectory from a directory tree whose root is specified with the INPUT tag. # # Note that relative paths are relative to the directory from which doxygen is # run. EXCLUDE = # The EXCLUDE_SYMLINKS tag can be used to select whether or not files or # directories that are symbolic links (a Unix file system feature) are excluded # from the input. # The default value is: NO. EXCLUDE_SYMLINKS = NO # If the value of the INPUT tag contains directories, you can use the # EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude # certain files from those directories. # # Note that the wildcards are matched against the file with absolute path, so to # exclude all test directories for example use the pattern */test/* EXCLUDE_PATTERNS = # The EXCLUDE_SYMBOLS tag can be used to specify one or more symbol names # (namespaces, classes, functions, etc.) that should be excluded from the # output. The symbol name can be a fully qualified name, a word, or if the # wildcard * is used, a substring. Examples: ANamespace, AClass, # AClass::ANamespace, ANamespace::*Test # # Note that the wildcards are matched against the file with absolute path, so to # exclude all test directories use the pattern */test/* EXCLUDE_SYMBOLS = # The EXAMPLE_PATH tag can be used to specify one or more files or directories # that contain example code fragments that are included (see the \include # command). EXAMPLE_PATH = # If the value of the EXAMPLE_PATH tag contains directories, you can use the # EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp and # *.h) to filter out the source-files in the directories. If left blank all # files are included. EXAMPLE_PATTERNS = # If the EXAMPLE_RECURSIVE tag is set to YES then subdirectories will be # searched for input files to be used with the \include or \dontinclude commands # irrespective of the value of the RECURSIVE tag. # The default value is: NO. EXAMPLE_RECURSIVE = NO # The IMAGE_PATH tag can be used to specify one or more files or directories # that contain images that are to be included in the documentation (see the # \image command). IMAGE_PATH = # The INPUT_FILTER tag can be used to specify a program that doxygen should # invoke to filter for each input file. Doxygen will invoke the filter program # by executing (via popen()) the command: # # # # where is the value of the INPUT_FILTER tag, and is the # name of an input file. Doxygen will then use the output that the filter # program writes to standard output. If FILTER_PATTERNS is specified, this tag # will be ignored. # # Note that the filter must not add or remove lines; it is applied before the # code is scanned, but not when the output code is generated. If lines are added # or removed, the anchors will not be placed correctly. INPUT_FILTER = # The FILTER_PATTERNS tag can be used to specify filters on a per file pattern # basis. Doxygen will compare the file name with each pattern and apply the # filter if there is a match. The filters are a list of the form: pattern=filter # (like *.cpp=my_cpp_filter). See INPUT_FILTER for further information on how # filters are used. If the FILTER_PATTERNS tag is empty or if none of the # patterns match the file name, INPUT_FILTER is applied. FILTER_PATTERNS = # If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using # INPUT_FILTER ) will also be used to filter the input files that are used for # producing the source files to browse (i.e. when SOURCE_BROWSER is set to YES). # The default value is: NO. FILTER_SOURCE_FILES = NO # The FILTER_SOURCE_PATTERNS tag can be used to specify source filters per file # pattern. A pattern will override the setting for FILTER_PATTERN (if any) and # it is also possible to disable source filtering for a specific pattern using # *.ext= (so without naming a filter). # This tag requires that the tag FILTER_SOURCE_FILES is set to YES. FILTER_SOURCE_PATTERNS = # If the USE_MDFILE_AS_MAINPAGE tag refers to the name of a markdown file that # is part of the input, its contents will be placed on the main page # (index.html). This can be useful if you have a project on for instance GitHub # and want to reuse the introduction page also for the doxygen output. USE_MDFILE_AS_MAINPAGE = #--------------------------------------------------------------------------- # Configuration options related to source browsing #--------------------------------------------------------------------------- # If the SOURCE_BROWSER tag is set to YES then a list of source files will be # generated. Documented entities will be cross-referenced with these sources. # # Note: To get rid of all source code in the generated output, make sure that # also VERBATIM_HEADERS is set to NO. # The default value is: NO. SOURCE_BROWSER = NO # Setting the INLINE_SOURCES tag to YES will include the body of functions, # classes and enums directly into the documentation. # The default value is: NO. INLINE_SOURCES = NO # Setting the STRIP_CODE_COMMENTS tag to YES will instruct doxygen to hide any # special comment blocks from generated source code fragments. Normal C, C++ and # Fortran comments will always remain visible. # The default value is: YES. STRIP_CODE_COMMENTS = YES # If the REFERENCED_BY_RELATION tag is set to YES then for each documented # function all documented functions referencing it will be listed. # The default value is: NO. REFERENCED_BY_RELATION = NO # If the REFERENCES_RELATION tag is set to YES then for each documented function # all documented entities called/used by that function will be listed. # The default value is: NO. REFERENCES_RELATION = NO # If the REFERENCES_LINK_SOURCE tag is set to YES and SOURCE_BROWSER tag is set # to YES, then the hyperlinks from functions in REFERENCES_RELATION and # REFERENCED_BY_RELATION lists will link to the source code. Otherwise they will # link to the documentation. # The default value is: YES. REFERENCES_LINK_SOURCE = YES # If SOURCE_TOOLTIPS is enabled (the default) then hovering a hyperlink in the # source code will show a tooltip with additional information such as prototype, # brief description and links to the definition and documentation. Since this # will make the HTML file larger and loading of large files a bit slower, you # can opt to disable this feature. # The default value is: YES. # This tag requires that the tag SOURCE_BROWSER is set to YES. SOURCE_TOOLTIPS = YES # If the USE_HTAGS tag is set to YES then the references to source code will # point to the HTML generated by the htags(1) tool instead of doxygen built-in # source browser. The htags tool is part of GNU's global source tagging system # (see http://www.gnu.org/software/global/global.html). You will need version # 4.8.6 or higher. # # To use it do the following: # - Install the latest version of global # - Enable SOURCE_BROWSER and USE_HTAGS in the config file # - Make sure the INPUT points to the root of the source tree # - Run doxygen as normal # # Doxygen will invoke htags (and that will in turn invoke gtags), so these # tools must be available from the command line (i.e. in the search path). # # The result: instead of the source browser generated by doxygen, the links to # source code will now point to the output of htags. # The default value is: NO. # This tag requires that the tag SOURCE_BROWSER is set to YES. USE_HTAGS = NO # If the VERBATIM_HEADERS tag is set the YES then doxygen will generate a # verbatim copy of the header file for each class for which an include is # specified. Set to NO to disable this. # See also: Section \class. # The default value is: YES. VERBATIM_HEADERS = YES #--------------------------------------------------------------------------- # Configuration options related to the alphabetical class index #--------------------------------------------------------------------------- # If the ALPHABETICAL_INDEX tag is set to YES, an alphabetical index of all # compounds will be generated. Enable this if the project contains a lot of # classes, structs, unions or interfaces. # The default value is: YES. ALPHABETICAL_INDEX = YES # The COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns in # which the alphabetical index list will be split. # Minimum value: 1, maximum value: 20, default value: 5. # This tag requires that the tag ALPHABETICAL_INDEX is set to YES. COLS_IN_ALPHA_INDEX = 5 # In case all classes in a project start with a common prefix, all classes will # be put under the same header in the alphabetical index. The IGNORE_PREFIX tag # can be used to specify a prefix (or a list of prefixes) that should be ignored # while generating the index headers. # This tag requires that the tag ALPHABETICAL_INDEX is set to YES. IGNORE_PREFIX = #--------------------------------------------------------------------------- # Configuration options related to the HTML output #--------------------------------------------------------------------------- # If the GENERATE_HTML tag is set to YES doxygen will generate HTML output # The default value is: YES. GENERATE_HTML = YES # The HTML_OUTPUT tag is used to specify where the HTML docs will be put. If a # relative path is entered the value of OUTPUT_DIRECTORY will be put in front of # it. # The default directory is: html. # This tag requires that the tag GENERATE_HTML is set to YES. HTML_OUTPUT = html # The HTML_FILE_EXTENSION tag can be used to specify the file extension for each # generated HTML page (for example: .htm, .php, .asp). # The default value is: .html. # This tag requires that the tag GENERATE_HTML is set to YES. HTML_FILE_EXTENSION = .html # The HTML_HEADER tag can be used to specify a user-defined HTML header file for # each generated HTML page. If the tag is left blank doxygen will generate a # standard header. # # To get valid HTML the header file that includes any scripts and style sheets # that doxygen needs, which is dependent on the configuration options used (e.g. # the setting GENERATE_TREEVIEW). It is highly recommended to start with a # default header using # doxygen -w html new_header.html new_footer.html new_stylesheet.css # YourConfigFile # and then modify the file new_header.html. See also section "Doxygen usage" # for information on how to generate the default header that doxygen normally # uses. # Note: The header is subject to change so you typically have to regenerate the # default header when upgrading to a newer version of doxygen. For a description # of the possible markers and block names see the documentation. # This tag requires that the tag GENERATE_HTML is set to YES. HTML_HEADER = # The HTML_FOOTER tag can be used to specify a user-defined HTML footer for each # generated HTML page. If the tag is left blank doxygen will generate a standard # footer. See HTML_HEADER for more information on how to generate a default # footer and what special commands can be used inside the footer. See also # section "Doxygen usage" for information on how to generate the default footer # that doxygen normally uses. # This tag requires that the tag GENERATE_HTML is set to YES. HTML_FOOTER = # The HTML_STYLESHEET tag can be used to specify a user-defined cascading style # sheet that is used by each HTML page. It can be used to fine-tune the look of # the HTML output. If left blank doxygen will generate a default style sheet. # See also section "Doxygen usage" for information on how to generate the style # sheet that doxygen normally uses. # Note: It is recommended to use HTML_EXTRA_STYLESHEET instead of this tag, as # it is more robust and this tag (HTML_STYLESHEET) will in the future become # obsolete. # This tag requires that the tag GENERATE_HTML is set to YES. HTML_STYLESHEET = # The HTML_EXTRA_STYLESHEET tag can be used to specify an additional user- # defined cascading style sheet that is included after the standard style sheets # created by doxygen. Using this option one can overrule certain style aspects. # This is preferred over using HTML_STYLESHEET since it does not replace the # standard style sheet and is therefor more robust against future updates. # Doxygen will copy the style sheet file to the output directory. For an example # see the documentation. # This tag requires that the tag GENERATE_HTML is set to YES. HTML_EXTRA_STYLESHEET = # The HTML_EXTRA_FILES tag can be used to specify one or more extra images or # other source files which should be copied to the HTML output directory. Note # that these files will be copied to the base HTML output directory. Use the # $relpath^ marker in the HTML_HEADER and/or HTML_FOOTER files to load these # files. In the HTML_STYLESHEET file, use the file name only. Also note that the # files will be copied as-is; there are no commands or markers available. # This tag requires that the tag GENERATE_HTML is set to YES. HTML_EXTRA_FILES = # The HTML_COLORSTYLE_HUE tag controls the color of the HTML output. Doxygen # will adjust the colors in the stylesheet and background images according to # this color. Hue is specified as an angle on a colorwheel, see # http://en.wikipedia.org/wiki/Hue for more information. For instance the value # 0 represents red, 60 is yellow, 120 is green, 180 is cyan, 240 is blue, 300 # purple, and 360 is red again. # Minimum value: 0, maximum value: 359, default value: 220. # This tag requires that the tag GENERATE_HTML is set to YES. HTML_COLORSTYLE_HUE = 220 # The HTML_COLORSTYLE_SAT tag controls the purity (or saturation) of the colors # in the HTML output. For a value of 0 the output will use grayscales only. A # value of 255 will produce the most vivid colors. # Minimum value: 0, maximum value: 255, default value: 100. # This tag requires that the tag GENERATE_HTML is set to YES. HTML_COLORSTYLE_SAT = 100 # The HTML_COLORSTYLE_GAMMA tag controls the gamma correction applied to the # luminance component of the colors in the HTML output. Values below 100 # gradually make the output lighter, whereas values above 100 make the output # darker. The value divided by 100 is the actual gamma applied, so 80 represents # a gamma of 0.8, The value 220 represents a gamma of 2.2, and 100 does not # change the gamma. # Minimum value: 40, maximum value: 240, default value: 80. # This tag requires that the tag GENERATE_HTML is set to YES. HTML_COLORSTYLE_GAMMA = 80 # If the HTML_TIMESTAMP tag is set to YES then the footer of each generated HTML # page will contain the date and time when the page was generated. Setting this # to NO can help when comparing the output of multiple runs. # The default value is: YES. # This tag requires that the tag GENERATE_HTML is set to YES. HTML_TIMESTAMP = YES # If the HTML_DYNAMIC_SECTIONS tag is set to YES then the generated HTML # documentation will contain sections that can be hidden and shown after the # page has loaded. # The default value is: NO. # This tag requires that the tag GENERATE_HTML is set to YES. HTML_DYNAMIC_SECTIONS = NO # With HTML_INDEX_NUM_ENTRIES one can control the preferred number of entries # shown in the various tree structured indices initially; the user can expand # and collapse entries dynamically later on. Doxygen will expand the tree to # such a level that at most the specified number of entries are visible (unless # a fully collapsed tree already exceeds this amount). So setting the number of # entries 1 will produce a full collapsed tree by default. 0 is a special value # representing an infinite number of entries and will result in a full expanded # tree by default. # Minimum value: 0, maximum value: 9999, default value: 100. # This tag requires that the tag GENERATE_HTML is set to YES. HTML_INDEX_NUM_ENTRIES = 100 # If the GENERATE_DOCSET tag is set to YES, additional index files will be # generated that can be used as input for Apple's Xcode 3 integrated development # environment (see: http://developer.apple.com/tools/xcode/), introduced with # OSX 10.5 (Leopard). To create a documentation set, doxygen will generate a # Makefile in the HTML output directory. Running make will produce the docset in # that directory and running make install will install the docset in # ~/Library/Developer/Shared/Documentation/DocSets so that Xcode will find it at # startup. See http://developer.apple.com/tools/creatingdocsetswithdoxygen.html # for more information. # The default value is: NO. # This tag requires that the tag GENERATE_HTML is set to YES. GENERATE_DOCSET = NO # This tag determines the name of the docset feed. A documentation feed provides # an umbrella under which multiple documentation sets from a single provider # (such as a company or product suite) can be grouped. # The default value is: Doxygen generated docs. # This tag requires that the tag GENERATE_DOCSET is set to YES. DOCSET_FEEDNAME = "Doxygen generated docs" # This tag specifies a string that should uniquely identify the documentation # set bundle. This should be a reverse domain-name style string, e.g. # com.mycompany.MyDocSet. Doxygen will append .docset to the name. # The default value is: org.doxygen.Project. # This tag requires that the tag GENERATE_DOCSET is set to YES. DOCSET_BUNDLE_ID = org.doxygen.Project # The DOCSET_PUBLISHER_ID tag specifies a string that should uniquely identify # the documentation publisher. This should be a reverse domain-name style # string, e.g. com.mycompany.MyDocSet.documentation. # The default value is: org.doxygen.Publisher. # This tag requires that the tag GENERATE_DOCSET is set to YES. DOCSET_PUBLISHER_ID = org.doxygen.Publisher # The DOCSET_PUBLISHER_NAME tag identifies the documentation publisher. # The default value is: Publisher. # This tag requires that the tag GENERATE_DOCSET is set to YES. DOCSET_PUBLISHER_NAME = Publisher # If the GENERATE_HTMLHELP tag is set to YES then doxygen generates three # additional HTML index files: index.hhp, index.hhc, and index.hhk. The # index.hhp is a project file that can be read by Microsoft's HTML Help Workshop # (see: http://www.microsoft.com/en-us/download/details.aspx?id=21138) on # Windows. # # The HTML Help Workshop contains a compiler that can convert all HTML output # generated by doxygen into a single compiled HTML file (.chm). Compiled HTML # files are now used as the Windows 98 help format, and will replace the old # Windows help format (.hlp) on all Windows platforms in the future. Compressed # HTML files also contain an index, a table of contents, and you can search for # words in the documentation. The HTML workshop also contains a viewer for # compressed HTML files. # The default value is: NO. # This tag requires that the tag GENERATE_HTML is set to YES. GENERATE_HTMLHELP = NO # The CHM_FILE tag can be used to specify the file name of the resulting .chm # file. You can add a path in front of the file if the result should not be # written to the html output directory. # This tag requires that the tag GENERATE_HTMLHELP is set to YES. CHM_FILE = # The HHC_LOCATION tag can be used to specify the location (absolute path # including file name) of the HTML help compiler ( hhc.exe). If non-empty # doxygen will try to run the HTML help compiler on the generated index.hhp. # The file has to be specified with full path. # This tag requires that the tag GENERATE_HTMLHELP is set to YES. HHC_LOCATION = # The GENERATE_CHI flag controls if a separate .chi index file is generated ( # YES) or that it should be included in the master .chm file ( NO). # The default value is: NO. # This tag requires that the tag GENERATE_HTMLHELP is set to YES. GENERATE_CHI = NO # The CHM_INDEX_ENCODING is used to encode HtmlHelp index ( hhk), content ( hhc) # and project file content. # This tag requires that the tag GENERATE_HTMLHELP is set to YES. CHM_INDEX_ENCODING = # The BINARY_TOC flag controls whether a binary table of contents is generated ( # YES) or a normal table of contents ( NO) in the .chm file. # The default value is: NO. # This tag requires that the tag GENERATE_HTMLHELP is set to YES. BINARY_TOC = NO # The TOC_EXPAND flag can be set to YES to add extra items for group members to # the table of contents of the HTML help documentation and to the tree view. # The default value is: NO. # This tag requires that the tag GENERATE_HTMLHELP is set to YES. TOC_EXPAND = NO # If the GENERATE_QHP tag is set to YES and both QHP_NAMESPACE and # QHP_VIRTUAL_FOLDER are set, an additional index file will be generated that # can be used as input for Qt's qhelpgenerator to generate a Qt Compressed Help # (.qch) of the generated HTML documentation. # The default value is: NO. # This tag requires that the tag GENERATE_HTML is set to YES. GENERATE_QHP = NO # If the QHG_LOCATION tag is specified, the QCH_FILE tag can be used to specify # the file name of the resulting .qch file. The path specified is relative to # the HTML output folder. # This tag requires that the tag GENERATE_QHP is set to YES. QCH_FILE = # The QHP_NAMESPACE tag specifies the namespace to use when generating Qt Help # Project output. For more information please see Qt Help Project / Namespace # (see: http://qt-project.org/doc/qt-4.8/qthelpproject.html#namespace). # The default value is: org.doxygen.Project. # This tag requires that the tag GENERATE_QHP is set to YES. QHP_NAMESPACE = org.doxygen.Project # The QHP_VIRTUAL_FOLDER tag specifies the namespace to use when generating Qt # Help Project output. For more information please see Qt Help Project / Virtual # Folders (see: http://qt-project.org/doc/qt-4.8/qthelpproject.html#virtual- # folders). # The default value is: doc. # This tag requires that the tag GENERATE_QHP is set to YES. QHP_VIRTUAL_FOLDER = doc # If the QHP_CUST_FILTER_NAME tag is set, it specifies the name of a custom # filter to add. For more information please see Qt Help Project / Custom # Filters (see: http://qt-project.org/doc/qt-4.8/qthelpproject.html#custom- # filters). # This tag requires that the tag GENERATE_QHP is set to YES. QHP_CUST_FILTER_NAME = # The QHP_CUST_FILTER_ATTRS tag specifies the list of the attributes of the # custom filter to add. For more information please see Qt Help Project / Custom # Filters (see: http://qt-project.org/doc/qt-4.8/qthelpproject.html#custom- # filters). # This tag requires that the tag GENERATE_QHP is set to YES. QHP_CUST_FILTER_ATTRS = # The QHP_SECT_FILTER_ATTRS tag specifies the list of the attributes this # project's filter section matches. Qt Help Project / Filter Attributes (see: # http://qt-project.org/doc/qt-4.8/qthelpproject.html#filter-attributes). # This tag requires that the tag GENERATE_QHP is set to YES. QHP_SECT_FILTER_ATTRS = # The QHG_LOCATION tag can be used to specify the location of Qt's # qhelpgenerator. If non-empty doxygen will try to run qhelpgenerator on the # generated .qhp file. # This tag requires that the tag GENERATE_QHP is set to YES. QHG_LOCATION = # If the GENERATE_ECLIPSEHELP tag is set to YES, additional index files will be # generated, together with the HTML files, they form an Eclipse help plugin. To # install this plugin and make it available under the help contents menu in # Eclipse, the contents of the directory containing the HTML and XML files needs # to be copied into the plugins directory of eclipse. The name of the directory # within the plugins directory should be the same as the ECLIPSE_DOC_ID value. # After copying Eclipse needs to be restarted before the help appears. # The default value is: NO. # This tag requires that the tag GENERATE_HTML is set to YES. GENERATE_ECLIPSEHELP = NO # A unique identifier for the Eclipse help plugin. When installing the plugin # the directory name containing the HTML and XML files should also have this # name. Each documentation set should have its own identifier. # The default value is: org.doxygen.Project. # This tag requires that the tag GENERATE_ECLIPSEHELP is set to YES. ECLIPSE_DOC_ID = org.doxygen.Project # If you want full control over the layout of the generated HTML pages it might # be necessary to disable the index and replace it with your own. The # DISABLE_INDEX tag can be used to turn on/off the condensed index (tabs) at top # of each HTML page. A value of NO enables the index and the value YES disables # it. Since the tabs in the index contain the same information as the navigation # tree, you can set this option to YES if you also set GENERATE_TREEVIEW to YES. # The default value is: NO. # This tag requires that the tag GENERATE_HTML is set to YES. DISABLE_INDEX = NO # The GENERATE_TREEVIEW tag is used to specify whether a tree-like index # structure should be generated to display hierarchical information. If the tag # value is set to YES, a side panel will be generated containing a tree-like # index structure (just like the one that is generated for HTML Help). For this # to work a browser that supports JavaScript, DHTML, CSS and frames is required # (i.e. any modern browser). Windows users are probably better off using the # HTML help feature. Via custom stylesheets (see HTML_EXTRA_STYLESHEET) one can # further fine-tune the look of the index. As an example, the default style # sheet generated by doxygen has an example that shows how to put an image at # the root of the tree instead of the PROJECT_NAME. Since the tree basically has # the same information as the tab index, you could consider setting # DISABLE_INDEX to YES when enabling this option. # The default value is: NO. # This tag requires that the tag GENERATE_HTML is set to YES. GENERATE_TREEVIEW = NO # The ENUM_VALUES_PER_LINE tag can be used to set the number of enum values that # doxygen will group on one line in the generated HTML documentation. # # Note that a value of 0 will completely suppress the enum values from appearing # in the overview section. # Minimum value: 0, maximum value: 20, default value: 4. # This tag requires that the tag GENERATE_HTML is set to YES. ENUM_VALUES_PER_LINE = 4 # If the treeview is enabled (see GENERATE_TREEVIEW) then this tag can be used # to set the initial width (in pixels) of the frame in which the tree is shown. # Minimum value: 0, maximum value: 1500, default value: 250. # This tag requires that the tag GENERATE_HTML is set to YES. TREEVIEW_WIDTH = 250 # When the EXT_LINKS_IN_WINDOW option is set to YES doxygen will open links to # external symbols imported via tag files in a separate window. # The default value is: NO. # This tag requires that the tag GENERATE_HTML is set to YES. EXT_LINKS_IN_WINDOW = NO # Use this tag to change the font size of LaTeX formulas included as images in # the HTML documentation. When you change the font size after a successful # doxygen run you need to manually remove any form_*.png images from the HTML # output directory to force them to be regenerated. # Minimum value: 8, maximum value: 50, default value: 10. # This tag requires that the tag GENERATE_HTML is set to YES. FORMULA_FONTSIZE = 10 # Use the FORMULA_TRANPARENT tag to determine whether or not the images # generated for formulas are transparent PNGs. Transparent PNGs are not # supported properly for IE 6.0, but are supported on all modern browsers. # # Note that when changing this option you need to delete any form_*.png files in # the HTML output directory before the changes have effect. # The default value is: YES. # This tag requires that the tag GENERATE_HTML is set to YES. FORMULA_TRANSPARENT = YES # Enable the USE_MATHJAX option to render LaTeX formulas using MathJax (see # http://www.mathjax.org) which uses client side Javascript for the rendering # instead of using prerendered bitmaps. Use this if you do not have LaTeX # installed or if you want to formulas look prettier in the HTML output. When # enabled you may also need to install MathJax separately and configure the path # to it using the MATHJAX_RELPATH option. # The default value is: NO. # This tag requires that the tag GENERATE_HTML is set to YES. USE_MATHJAX = NO # When MathJax is enabled you can set the default output format to be used for # the MathJax output. See the MathJax site (see: # http://docs.mathjax.org/en/latest/output.html) for more details. # Possible values are: HTML-CSS (which is slower, but has the best # compatibility), NativeMML (i.e. MathML) and SVG. # The default value is: HTML-CSS. # This tag requires that the tag USE_MATHJAX is set to YES. MATHJAX_FORMAT = HTML-CSS # When MathJax is enabled you need to specify the location relative to the HTML # output directory using the MATHJAX_RELPATH option. The destination directory # should contain the MathJax.js script. For instance, if the mathjax directory # is located at the same level as the HTML output directory, then # MATHJAX_RELPATH should be ../mathjax. The default value points to the MathJax # Content Delivery Network so you can quickly see the result without installing # MathJax. However, it is strongly recommended to install a local copy of # MathJax from http://www.mathjax.org before deployment. # The default value is: http://cdn.mathjax.org/mathjax/latest. # This tag requires that the tag USE_MATHJAX is set to YES. MATHJAX_RELPATH = http://cdn.mathjax.org/mathjax/latest # The MATHJAX_EXTENSIONS tag can be used to specify one or more MathJax # extension names that should be enabled during MathJax rendering. For example # MATHJAX_EXTENSIONS = TeX/AMSmath TeX/AMSsymbols # This tag requires that the tag USE_MATHJAX is set to YES. MATHJAX_EXTENSIONS = # The MATHJAX_CODEFILE tag can be used to specify a file with javascript pieces # of code that will be used on startup of the MathJax code. See the MathJax site # (see: http://docs.mathjax.org/en/latest/output.html) for more details. For an # example see the documentation. # This tag requires that the tag USE_MATHJAX is set to YES. MATHJAX_CODEFILE = # When the SEARCHENGINE tag is enabled doxygen will generate a search box for # the HTML output. The underlying search engine uses javascript and DHTML and # should work on any modern browser. Note that when using HTML help # (GENERATE_HTMLHELP), Qt help (GENERATE_QHP), or docsets (GENERATE_DOCSET) # there is already a search function so this one should typically be disabled. # For large projects the javascript based search engine can be slow, then # enabling SERVER_BASED_SEARCH may provide a better solution. It is possible to # search using the keyboard; to jump to the search box use + S # (what the is depends on the OS and browser, but it is typically # , /